From f487f8a4e034ba1dff131ea016967dc5fa03308a Mon Sep 17 00:00:00 2001
From: "S.Listl" <S.Listl@slistl-nb.aditosoftware.local>
Date: Tue, 28 Apr 2020 11:06:21 +0200
Subject: [PATCH 001/184] 1055717 - Workflow processes documentation

---
 .../CreateActivity_workflowService.aod        |  1 +
 .../documentation.adoc                        |  3 +++
 .../CreateNotification_workflowService.aod    |  1 +
 .../documentation.adoc                        |  3 +++
 .../SendEmail_workflowService.aod             |  1 +
 .../documentation.adoc                        |  3 +++
 .../SetAttribute_workflowService.aod          |  1 +
 .../documentation.adoc                        |  3 +++
 .../UpdateOffer_workflowService.aod           |  1 +
 .../documentation.adoc                        |  3 +++
 process/workflowRoles_rest/documentation.adoc |  3 +++
 process/workflowRoles_rest/process.js         | 19 +++++++------
 .../workflowRoles_rest/workflowRoles_rest.aod |  1 +
 .../documentation.adoc                        |  3 +++
 .../workflowServiceTaskParams_rest.aod        |  1 +
 .../documentation.adoc                        |  3 +++
 process/workflowServiceTasks_rest/process.js  |  4 +--
 .../workflowServiceTasks_rest.aod             |  1 +
 process/workflowUsers_rest/documentation.adoc |  3 +++
 process/workflowUsers_rest/process.js         | 27 +++++++++++--------
 .../workflowUsers_rest/workflowUsers_rest.aod |  1 +
 21 files changed, 65 insertions(+), 21 deletions(-)
 create mode 100644 process/CreateActivity_workflowService/documentation.adoc
 create mode 100644 process/CreateNotification_workflowService/documentation.adoc
 create mode 100644 process/SendEmail_workflowService/documentation.adoc
 create mode 100644 process/SetAttribute_workflowService/documentation.adoc
 create mode 100644 process/UpdateOffer_workflowService/documentation.adoc
 create mode 100644 process/workflowRoles_rest/documentation.adoc
 create mode 100644 process/workflowServiceTaskParams_rest/documentation.adoc
 create mode 100644 process/workflowServiceTasks_rest/documentation.adoc
 create mode 100644 process/workflowUsers_rest/documentation.adoc

diff --git a/process/CreateActivity_workflowService/CreateActivity_workflowService.aod b/process/CreateActivity_workflowService/CreateActivity_workflowService.aod
index 1c0a3458bb3..917f286c18c 100644
--- a/process/CreateActivity_workflowService/CreateActivity_workflowService.aod
+++ b/process/CreateActivity_workflowService/CreateActivity_workflowService.aod
@@ -3,6 +3,7 @@
   <name>CreateActivity_workflowService</name>
   <title>Create activity</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
+  <documentation>%aditoprj%/process/CreateActivity_workflowService/documentation.adoc</documentation>
   <process>%aditoprj%/process/CreateActivity_workflowService/process.js</process>
   <alias>Data_alias</alias>
   <variants>
diff --git a/process/CreateActivity_workflowService/documentation.adoc b/process/CreateActivity_workflowService/documentation.adoc
new file mode 100644
index 00000000000..c7aefa99449
--- /dev/null
+++ b/process/CreateActivity_workflowService/documentation.adoc
@@ -0,0 +1,3 @@
+= CreateActivity_workflowService
+
+The service task can be used to create a new activity with the given parameter data.
\ No newline at end of file
diff --git a/process/CreateNotification_workflowService/CreateNotification_workflowService.aod b/process/CreateNotification_workflowService/CreateNotification_workflowService.aod
index 15076d30377..079aa45c03a 100644
--- a/process/CreateNotification_workflowService/CreateNotification_workflowService.aod
+++ b/process/CreateNotification_workflowService/CreateNotification_workflowService.aod
@@ -3,6 +3,7 @@
   <name>CreateNotification_workflowService</name>
   <title>Create notification</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
+  <documentation>%aditoprj%/process/CreateNotification_workflowService/documentation.adoc</documentation>
   <process>%aditoprj%/process/CreateNotification_workflowService/process.js</process>
   <variants>
     <element>WORKFLOW</element>
diff --git a/process/CreateNotification_workflowService/documentation.adoc b/process/CreateNotification_workflowService/documentation.adoc
new file mode 100644
index 00000000000..ec49a2843f5
--- /dev/null
+++ b/process/CreateNotification_workflowService/documentation.adoc
@@ -0,0 +1,3 @@
+= CreateNotification_workflowService
+
+This service task creates a notification for the given user with the given title and description.
\ No newline at end of file
diff --git a/process/SendEmail_workflowService/SendEmail_workflowService.aod b/process/SendEmail_workflowService/SendEmail_workflowService.aod
index 3805be07dfc..28ebfa538d5 100644
--- a/process/SendEmail_workflowService/SendEmail_workflowService.aod
+++ b/process/SendEmail_workflowService/SendEmail_workflowService.aod
@@ -3,6 +3,7 @@
   <name>SendEmail_workflowService</name>
   <title>Send email</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
+  <documentation>%aditoprj%/process/SendEmail_workflowService/documentation.adoc</documentation>
   <process>%aditoprj%/process/SendEmail_workflowService/process.js</process>
   <alias>Data_alias</alias>
   <variants>
diff --git a/process/SendEmail_workflowService/documentation.adoc b/process/SendEmail_workflowService/documentation.adoc
new file mode 100644
index 00000000000..f69f13c363e
--- /dev/null
+++ b/process/SendEmail_workflowService/documentation.adoc
@@ -0,0 +1,3 @@
+= SendEmail_workflowService
+
+A service task for sending an email from the server to the configured recipient using a document template.
\ No newline at end of file
diff --git a/process/SetAttribute_workflowService/SetAttribute_workflowService.aod b/process/SetAttribute_workflowService/SetAttribute_workflowService.aod
index 9d4e32046bc..4929460f801 100644
--- a/process/SetAttribute_workflowService/SetAttribute_workflowService.aod
+++ b/process/SetAttribute_workflowService/SetAttribute_workflowService.aod
@@ -3,6 +3,7 @@
   <name>SetAttribute_workflowService</name>
   <title>Set attribute</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
+  <documentation>%aditoprj%/process/SetAttribute_workflowService/documentation.adoc</documentation>
   <process>%aditoprj%/process/SetAttribute_workflowService/process.js</process>
   <alias>Data_alias</alias>
   <variants>
diff --git a/process/SetAttribute_workflowService/documentation.adoc b/process/SetAttribute_workflowService/documentation.adoc
new file mode 100644
index 00000000000..ecc5dfcd140
--- /dev/null
+++ b/process/SetAttribute_workflowService/documentation.adoc
@@ -0,0 +1,3 @@
+= SetAttribute_workflowService
+
+Can be used to create a new attributeRelation.
\ No newline at end of file
diff --git a/process/UpdateOffer_workflowService/UpdateOffer_workflowService.aod b/process/UpdateOffer_workflowService/UpdateOffer_workflowService.aod
index 9770a01efb9..6afa7117eb9 100644
--- a/process/UpdateOffer_workflowService/UpdateOffer_workflowService.aod
+++ b/process/UpdateOffer_workflowService/UpdateOffer_workflowService.aod
@@ -3,6 +3,7 @@
   <name>UpdateOffer_workflowService</name>
   <title>Update offer</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
+  <documentation>%aditoprj%/process/UpdateOffer_workflowService/documentation.adoc</documentation>
   <process>%aditoprj%/process/UpdateOffer_workflowService/process.js</process>
   <alias>Data_alias</alias>
   <variants>
diff --git a/process/UpdateOffer_workflowService/documentation.adoc b/process/UpdateOffer_workflowService/documentation.adoc
new file mode 100644
index 00000000000..3f802fe3972
--- /dev/null
+++ b/process/UpdateOffer_workflowService/documentation.adoc
@@ -0,0 +1,3 @@
+= UpdateOffer_workflowService
+
+Sets the status of an offer.
\ No newline at end of file
diff --git a/process/workflowRoles_rest/documentation.adoc b/process/workflowRoles_rest/documentation.adoc
new file mode 100644
index 00000000000..4505a43a7e3
--- /dev/null
+++ b/process/workflowRoles_rest/documentation.adoc
@@ -0,0 +1,3 @@
+= workflowRoles_rest
+
+This webservice provides a list of the user roles for the workflow modeler application, the roles can be filtered by setting the correct headers.
\ No newline at end of file
diff --git a/process/workflowRoles_rest/process.js b/process/workflowRoles_rest/process.js
index 07b379e4fd8..dd60527468b 100644
--- a/process/workflowRoles_rest/process.js
+++ b/process/workflowRoles_rest/process.js
@@ -3,21 +3,22 @@ import("system.tools");
 
 function restget (pRequest)
 {
-    let request = JSON.parse(pRequest);
-    let header = request.header;
-    let roleIds = header.Ids && JSON.parse(header.Ids);
-    let userId = header.Userid;
+    var request = JSON.parse(pRequest);
+    var header = request.header;
+    var roleIds = header.Ids && JSON.parse(header.Ids);
+    var userId = header.Userid;
     
     if (userId)
     {
+        //if a userId is present, get only the roles of that user
         let user = tools.getUserByAttribute(tools.NAME, userId);
         roleIds = user ? user[tools.ROLENAMES].slice() : [];
     }
     
-    let roles = tools.getAllRoles([tools.ROLE_PROJECT, tools.ROLE_CUSTOM], false);
+    var roles = tools.getAllRoles([tools.ROLE_PROJECT, tools.ROLE_CUSTOM], false);
     roles = Object.keys(roles).map(function (role)
     {
-        let [title, type, desc, id] = roles[role];
+        var [title, type, desc, id] = roles[role];
         return {
             name : title,
             id : id,
@@ -25,7 +26,8 @@ function restget (pRequest)
         };
     });
     
-    let filter = {
+    //object for handling filtering
+    var filter = {
         EQUAL : "equal",
         IGNORECASE : "ignoreCase",
         IN : "in",
@@ -67,13 +69,14 @@ function restget (pRequest)
         }
     };
     
+    //add the filters of the request to the filter object
     filter.addIfSet("id", header.Id, filter.EQUAL);
     filter.addIfSet("id", roleIds, filter.IN);
     filter.addIfSet("name", header.Name, filter.EQUAL);
     filter.addIfSet("name", header.Namelike, filter.LIKE);
     filter.addIfSet("name", header.Namelikeignorecase, filter.LIKEIGNORECASE);
     
-    roles = roles.filter(filter.check, filter);
+    roles = roles.filter(filter.check, filter); //do the filtering
     
     request.response.body = JSON.stringify(roles);
 
diff --git a/process/workflowRoles_rest/workflowRoles_rest.aod b/process/workflowRoles_rest/workflowRoles_rest.aod
index 6f2ffed6317..4f15d52de42 100644
--- a/process/workflowRoles_rest/workflowRoles_rest.aod
+++ b/process/workflowRoles_rest/workflowRoles_rest.aod
@@ -2,6 +2,7 @@
 <process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
   <name>workflowRoles_rest</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
+  <documentation>%aditoprj%/process/workflowRoles_rest/documentation.adoc</documentation>
   <process>%aditoprj%/process/workflowRoles_rest/process.js</process>
   <publishAsWebservice v="true" />
   <style>REST</style>
diff --git a/process/workflowServiceTaskParams_rest/documentation.adoc b/process/workflowServiceTaskParams_rest/documentation.adoc
new file mode 100644
index 00000000000..1559728f993
--- /dev/null
+++ b/process/workflowServiceTaskParams_rest/documentation.adoc
@@ -0,0 +1,3 @@
+= workflowServiceTaskParams_rest
+
+The webservice takes the service task name as header and gives back the parameters of that service task that can be used to configure it in the modeler.
\ No newline at end of file
diff --git a/process/workflowServiceTaskParams_rest/workflowServiceTaskParams_rest.aod b/process/workflowServiceTaskParams_rest/workflowServiceTaskParams_rest.aod
index 266ba1f462a..7922e7f73b3 100644
--- a/process/workflowServiceTaskParams_rest/workflowServiceTaskParams_rest.aod
+++ b/process/workflowServiceTaskParams_rest/workflowServiceTaskParams_rest.aod
@@ -2,6 +2,7 @@
 <process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
   <name>workflowServiceTaskParams_rest</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
+  <documentation>%aditoprj%/process/workflowServiceTaskParams_rest/documentation.adoc</documentation>
   <process>%aditoprj%/process/workflowServiceTaskParams_rest/process.js</process>
   <publishAsWebservice v="true" />
   <style>REST</style>
diff --git a/process/workflowServiceTasks_rest/documentation.adoc b/process/workflowServiceTasks_rest/documentation.adoc
new file mode 100644
index 00000000000..e180e390c23
--- /dev/null
+++ b/process/workflowServiceTasks_rest/documentation.adoc
@@ -0,0 +1,3 @@
+= workflowServiceTasks_rest
+
+Provides a list of service tasks for the workflow modeler.
\ No newline at end of file
diff --git a/process/workflowServiceTasks_rest/process.js b/process/workflowServiceTasks_rest/process.js
index 967a59c5b8e..2da45ade353 100644
--- a/process/workflowServiceTasks_rest/process.js
+++ b/process/workflowServiceTasks_rest/process.js
@@ -4,9 +4,9 @@ import("system.process");
 
 function restget (pRequest)
 {
-    let request = JSON.parse(pRequest);
+    var request = JSON.parse(pRequest);
     
-    let serviceTasks = project.getDataModels(project.DATAMODEL_KIND_PROCESS)
+    var serviceTasks = project.getDataModels(project.DATAMODEL_KIND_PROCESS)
     .filter(function (row)
     {
         return /.+_workflowService$/.test(row[0]);
diff --git a/process/workflowServiceTasks_rest/workflowServiceTasks_rest.aod b/process/workflowServiceTasks_rest/workflowServiceTasks_rest.aod
index db543d1d50d..ea3dfbea15a 100644
--- a/process/workflowServiceTasks_rest/workflowServiceTasks_rest.aod
+++ b/process/workflowServiceTasks_rest/workflowServiceTasks_rest.aod
@@ -2,6 +2,7 @@
 <process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
   <name>workflowServiceTasks_rest</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
+  <documentation>%aditoprj%/process/workflowServiceTasks_rest/documentation.adoc</documentation>
   <process>%aditoprj%/process/workflowServiceTasks_rest/process.js</process>
   <publishAsWebservice v="true" />
   <style>REST</style>
diff --git a/process/workflowUsers_rest/documentation.adoc b/process/workflowUsers_rest/documentation.adoc
new file mode 100644
index 00000000000..63c68a38f11
--- /dev/null
+++ b/process/workflowUsers_rest/documentation.adoc
@@ -0,0 +1,3 @@
+= workflowUsers_rest
+
+This webservice is used by the identity management in the workflow modeler so that users can be assigned to user tasks there.
\ No newline at end of file
diff --git a/process/workflowUsers_rest/process.js b/process/workflowUsers_rest/process.js
index 6f33fd3573c..99246ce894b 100644
--- a/process/workflowUsers_rest/process.js
+++ b/process/workflowUsers_rest/process.js
@@ -10,14 +10,14 @@ function restget (pRequest)
     //minimum required length of the search pattern
     const MIN_SEARCHLENGTH = 0;
 
-    let request = JSON.parse(pRequest);
-    let header = request.header;
-    let userFilter = header.Userfilter 
+    var request = JSON.parse(pRequest);
+    var header = request.header;
+    var userFilter = header.Userfilter 
         ? JSON.parse(header.Userfilter)
         : {};
     
     //object that helps with filtering, it provides functions for adding conditions to the object and for checking the conditions
-    let filter = {
+    var filter = {
         EQUAL : "equal",
         IGNORECASE : "ignoreCase",
         IN : "in",
@@ -64,6 +64,7 @@ function restget (pRequest)
         }
     };
     
+    //put all filters of the request into the filter object
     filter.addIfSet("id", userFilter.id, filter.EQUAL);
     filter.addIfSet("id", userFilter.ids && JSON.parse(userFilter.ids), filter.IN);
     filter.addIfSet("id", userFilter.idIgnoreCase, filter.IGNORECASE);
@@ -87,17 +88,21 @@ function restget (pRequest)
 
     return JSON.stringify(request);
 
+    /**
+     * Loads the users depending on the filter and search value. There is an own parameter for the search value, because it is not handled the
+     * same way as the other filters.
+     */
     function _getUsers (pSearch)
     {
+        //empty result if the search value does not have the minimal required length
         if (pSearch !== undefined && pSearch.trim() < MIN_SEARCHLENGTH)
             return [];
         
-        //separate words by spaces
-        let patterns = pSearch && pSearch.replace("%", "", "g").toUpperCase().split(/\s/).filter(function (pat) {return pat;})
-        
+        //if the search value contains spaces, it will be split into individual words, every word must be found
+        var patterns = pSearch && text.replaceAll(pSearch, {"%" : ""}).toUpperCase().split(/\s/).filter(function (pat) {return pat;})
         
-        let allUsers = tools.getUsersByAttribute(tools.ISACTIVE, ["true"], tools.PROFILE_DEFAULT);
-        let resultUsers = [];
+        var allUsers = tools.getUsersByAttribute(tools.ISACTIVE, ["true"], tools.PROFILE_DEFAULT);
+        var resultUsers = [];
 
         for (let i = 0, l = allUsers.length; i < l; i++)
         {
@@ -119,7 +124,7 @@ function restget (pRequest)
                 privileges : [],
                 searchRating : rating
             };
-            if (filter.check(user) && rating !== 0)
+            if (rating !== 0 && filter.check(user))
                 resultUsers.push(user);
         }
         
@@ -133,7 +138,7 @@ function restget (pRequest)
     }
 
     /**
-     * checks if the pattern is contained in the name
+     * Checks if the patterns are contained in the name and how good the result is.
      * 
      * @return {Number} higher number -> better result, 0 if no match
      */
diff --git a/process/workflowUsers_rest/workflowUsers_rest.aod b/process/workflowUsers_rest/workflowUsers_rest.aod
index 06a7396d8da..6669992f8a6 100644
--- a/process/workflowUsers_rest/workflowUsers_rest.aod
+++ b/process/workflowUsers_rest/workflowUsers_rest.aod
@@ -2,6 +2,7 @@
 <process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
   <name>workflowUsers_rest</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
+  <documentation>%aditoprj%/process/workflowUsers_rest/documentation.adoc</documentation>
   <process>%aditoprj%/process/workflowUsers_rest/process.js</process>
   <publishAsWebservice v="true" />
   <style>REST</style>
-- 
GitLab


From cb3fa1199e78f1de5fd1b58279a256624fdd32b4 Mon Sep 17 00:00:00 2001
From: "S.Listl" <S.Listl@slistl-nb.aditosoftware.local>
Date: Thu, 7 May 2020 11:16:47 +0200
Subject: [PATCH 002/184] AttributeRelation refactored to make sure uids don't
 change

---
 .../AttributeRelation_entity.aod              |  13 +
 .../ab_attributerelationid/valueProcess.js    |   7 +
 .../displaysimplename_param/valueProcess.js   |   3 +
 .../gettheme_param/valueProcess.js            |   3 +
 .../gettree_param/valueProcess.js             |   3 +
 .../showempty_param/valueProcess.js           |   3 +
 .../entityfields/uid/valueProcess.js          |   9 +-
 .../recordcontainers/jdito/contentProcess.js  | 419 +++++++++---------
 .../recordcontainers/jdito/onInsert.js        |   2 +-
 .../recordcontainers/jdito/onUpdate.js        |  51 +--
 entity/Attribute_entity/Attribute_entity.aod  |   1 -
 .../Attribute_entity/afterOperatingState.js   |   5 -
 12 files changed, 278 insertions(+), 241 deletions(-)
 create mode 100644 entity/AttributeRelation_entity/entityfields/ab_attributerelationid/valueProcess.js
 create mode 100644 entity/AttributeRelation_entity/entityfields/displaysimplename_param/valueProcess.js
 create mode 100644 entity/AttributeRelation_entity/entityfields/gettheme_param/valueProcess.js
 create mode 100644 entity/AttributeRelation_entity/entityfields/gettree_param/valueProcess.js
 create mode 100644 entity/AttributeRelation_entity/entityfields/showempty_param/valueProcess.js
 delete mode 100644 entity/Attribute_entity/afterOperatingState.js

diff --git a/entity/AttributeRelation_entity/AttributeRelation_entity.aod b/entity/AttributeRelation_entity/AttributeRelation_entity.aod
index 9b293dd144d..f57675a893d 100644
--- a/entity/AttributeRelation_entity/AttributeRelation_entity.aod
+++ b/entity/AttributeRelation_entity/AttributeRelation_entity.aod
@@ -22,11 +22,13 @@
     <entityParameter>
       <name>ObjectType_param</name>
       <expose v="true" />
+      <mandatory v="true" />
       <description>PARAMETER</description>
     </entityParameter>
     <entityParameter>
       <name>ObjectRowId_param</name>
       <expose v="true" />
+      <mandatory v="true" />
       <description>PARAMETER</description>
     </entityParameter>
     <entityProvider>
@@ -156,6 +158,7 @@
     </entityConsumer>
     <entityParameter>
       <name>GetTree_param</name>
+      <valueProcess>%aditoprj%/entity/AttributeRelation_entity/entityfields/gettree_param/valueProcess.js</valueProcess>
       <expose v="true" />
       <description>PARAMETER</description>
     </entityParameter>
@@ -261,6 +264,7 @@
     </entityField>
     <entityParameter>
       <name>DisplaySimpleName_param</name>
+      <valueProcess>%aditoprj%/entity/AttributeRelation_entity/entityfields/displaysimplename_param/valueProcess.js</valueProcess>
       <expose v="true" />
       <description>PARAMETER</description>
     </entityParameter>
@@ -271,6 +275,7 @@
     </entityParameter>
     <entityParameter>
       <name>ShowEmpty_param</name>
+      <valueProcess>%aditoprj%/entity/AttributeRelation_entity/entityfields/showempty_param/valueProcess.js</valueProcess>
       <expose v="true" />
       <documentation>%aditoprj%/entity/AttributeRelation_entity/entityfields/showempty_param/documentation.adoc</documentation>
     </entityParameter>
@@ -293,6 +298,7 @@
     </entityParameter>
     <entityParameter>
       <name>GetTheme_param</name>
+      <valueProcess>%aditoprj%/entity/AttributeRelation_entity/entityfields/gettheme_param/valueProcess.js</valueProcess>
       <expose v="true" />
     </entityParameter>
     <entityField>
@@ -333,6 +339,10 @@
     <entityProvider>
       <name>ThemeProvider</name>
     </entityProvider>
+    <entityField>
+      <name>AB_ATTRIBUTERELATIONID</name>
+      <valueProcess>%aditoprj%/entity/AttributeRelation_entity/entityfields/ab_attributerelationid/valueProcess.js</valueProcess>
+    </entityField>
   </entityFields>
   <recordContainers>
     <jDitoRecordContainer>
@@ -346,6 +356,9 @@
         <jDitoRecordFieldMapping>
           <name>UID.value</name>
         </jDitoRecordFieldMapping>
+        <jDitoRecordFieldMapping>
+          <name>AB_ATTRIBUTERELATIONID.value</name>
+        </jDitoRecordFieldMapping>
         <jDitoRecordFieldMapping>
           <name>PARENT_ID.value</name>
         </jDitoRecordFieldMapping>
diff --git a/entity/AttributeRelation_entity/entityfields/ab_attributerelationid/valueProcess.js b/entity/AttributeRelation_entity/entityfields/ab_attributerelationid/valueProcess.js
new file mode 100644
index 00000000000..e11e370a0bf
--- /dev/null
+++ b/entity/AttributeRelation_entity/entityfields/ab_attributerelationid/valueProcess.js
@@ -0,0 +1,7 @@
+import("system.util");
+import("system.neon");
+import("system.vars");
+import("system.result");
+
+if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && vars.get("$this.value") == null)
+    result.string(util.getNewUUID());
\ No newline at end of file
diff --git a/entity/AttributeRelation_entity/entityfields/displaysimplename_param/valueProcess.js b/entity/AttributeRelation_entity/entityfields/displaysimplename_param/valueProcess.js
new file mode 100644
index 00000000000..e0f3ec47e2b
--- /dev/null
+++ b/entity/AttributeRelation_entity/entityfields/displaysimplename_param/valueProcess.js
@@ -0,0 +1,3 @@
+import("system.result");
+
+result.string(false);
\ No newline at end of file
diff --git a/entity/AttributeRelation_entity/entityfields/gettheme_param/valueProcess.js b/entity/AttributeRelation_entity/entityfields/gettheme_param/valueProcess.js
new file mode 100644
index 00000000000..e0f3ec47e2b
--- /dev/null
+++ b/entity/AttributeRelation_entity/entityfields/gettheme_param/valueProcess.js
@@ -0,0 +1,3 @@
+import("system.result");
+
+result.string(false);
\ No newline at end of file
diff --git a/entity/AttributeRelation_entity/entityfields/gettree_param/valueProcess.js b/entity/AttributeRelation_entity/entityfields/gettree_param/valueProcess.js
new file mode 100644
index 00000000000..e0f3ec47e2b
--- /dev/null
+++ b/entity/AttributeRelation_entity/entityfields/gettree_param/valueProcess.js
@@ -0,0 +1,3 @@
+import("system.result");
+
+result.string(false);
\ No newline at end of file
diff --git a/entity/AttributeRelation_entity/entityfields/showempty_param/valueProcess.js b/entity/AttributeRelation_entity/entityfields/showempty_param/valueProcess.js
new file mode 100644
index 00000000000..e0f3ec47e2b
--- /dev/null
+++ b/entity/AttributeRelation_entity/entityfields/showempty_param/valueProcess.js
@@ -0,0 +1,3 @@
+import("system.result");
+
+result.string(false);
\ No newline at end of file
diff --git a/entity/AttributeRelation_entity/entityfields/uid/valueProcess.js b/entity/AttributeRelation_entity/entityfields/uid/valueProcess.js
index a319d00c1f4..bc7ce9f825d 100644
--- a/entity/AttributeRelation_entity/entityfields/uid/valueProcess.js
+++ b/entity/AttributeRelation_entity/entityfields/uid/valueProcess.js
@@ -3,5 +3,10 @@ import("system.result");
 import("system.neon");
 import("system.util");
 
-if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && vars.get("$this.value") == null)
-    result.string("," + util.getNewUUID()); // set "," to mark this as new generated UUID
\ No newline at end of file
+if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW)
+{
+    if (vars.getString("$param.ShowEmpty_param") == "true")
+        result.string(JSON.stringify([vars.get("$field.AB_ATTRIBUTERELATIONID"), vars.get("$field.AB_ATTRIBUTE_ID")]));
+    else
+        result.string(vars.get("$field.AB_ATTRIBUTERELATIONID"));
+}
\ No newline at end of file
diff --git a/entity/AttributeRelation_entity/recordcontainers/jdito/contentProcess.js b/entity/AttributeRelation_entity/recordcontainers/jdito/contentProcess.js
index 7b1e0391013..75671ac47d2 100644
--- a/entity/AttributeRelation_entity/recordcontainers/jdito/contentProcess.js
+++ b/entity/AttributeRelation_entity/recordcontainers/jdito/contentProcess.js
@@ -7,251 +7,256 @@ import("system.db");
 import("Attribute_lib");
 import("Sql_lib");
 
-var objectType = vars.exists("$param.ObjectType_param") && vars.get("$param.ObjectType_param");
-var objectRowId = vars.exists("$param.ObjectRowId_param") && vars.get("$param.ObjectRowId_param");
+var idvalues = vars.exists("$local.idvalues") ? vars.get("$local.idvalues") : null;
+var getTree = !idvalues && vars.getString("$param.GetTree_param") == "true";
+var loadFullAttributeName = vars.getString("$param.DisplaySimpleName_param") != "true";
 
-var idvalues = vars.exists("$local.idvalues") && vars.get("$local.idvalues");
-
-var getTree = vars.exists("$param.GetTree_param") && vars.getString("$param.GetTree_param") == "true";
-var getTheme = vars.exists("$param.IsTheme_param") && vars.getString("$param.IsTheme_param") == "true";
-var showEmpty = vars.exists("$param.ShowEmpty_param") && vars.getString("$param.ShowEmpty_param") == "true";
-var displaySimpleName = vars.exists("$param.DisplaySimpleName_param") && vars.getString("$param.DisplaySimpleName_param") == "true";
-
-var defaultFields = [
-    "AB_ATTRIBUTERELATIONID",
-    "AB_ATTRIBUTE.AB_ATTRIBUTEID", 
-    "AB_ATTRIBUTE.ATTRIBUTE_PARENT_ID", 
-    "AB_ATTRIBUTE.ATTRIBUTE_TYPE", 
-    "AB_ATTRIBUTE.ATTRIBUTE_NAME", 
-    "AB_ATTRIBUTE.DROPDOWNDEFINITION", 
-    "COMBOVAL.ATTRIBUTE_NAME",
-    "AB_ATTRIBUTERELATION.DATE_NEW",
-    "AB_ATTRIBUTERELATION.USER_NEW",
-    "AB_ATTRIBUTERELATION.DATE_EDIT",
-    "AB_ATTRIBUTERELATION.USER_EDIT",
-    "AB_ATTRIBUTE.DROPDOWNFILTER"
-];
-
-//these fields hold the attributeRelation value, depending on the attribute type
-var valueFields = AttributeTypeUtil.getAllDatabaseFields();
-var attributeSql = newSelect(defaultFields.concat(valueFields))
-                    .from("AB_ATTRIBUTE")
-                    .orderBy("AB_ATTRIBUTE.SORTING asc")
-                    .where(); // go into where mode
-
-var possibleAttributes;
+var typeWhitelist, typeBlacklist;
+if (vars.getString("$param.GetTheme_param") == "true")
+    typeWhitelist = [$AttributeTypes.THEME.toString()];
+else
+    typeBlacklist = [$AttributeTypes.THEME.toString()];
+    
+var loadEmptyAttributes = vars.getString("$param.ShowEmpty_param") == "true";
+var filteredAttributeIds = vars.exists("$param.FilteredAttributeIds_param") && vars.get("$param.FilteredAttributeIds_param");
+if (filteredAttributeIds)
+    filteredAttributeIds = JSON.parse(filteredAttributeIds);
+var objectRowId = vars.get("$param.ObjectRowId_param");
+var objectType = vars.get("$param.ObjectType_param");
 
-if (idvalues)
-{
-    let attrId = idvalues.length === 1 && idvalues[0].split(",")[1];
-    if (!attrId)
-        showEmpty = false;
+var attributeQueryMaker = {
+    defaultQueryFields : [
+        "AB_ATTRIBUTERELATIONID",
+        "AB_ATTRIBUTE.AB_ATTRIBUTEID", 
+        "AB_ATTRIBUTE.ATTRIBUTE_PARENT_ID", 
+        "AB_ATTRIBUTE.ATTRIBUTE_TYPE", 
+        "AB_ATTRIBUTE.ATTRIBUTE_NAME", 
+        "AB_ATTRIBUTE.DROPDOWNDEFINITION", 
+        "COMBOVAL.ATTRIBUTE_NAME",
+        "AB_ATTRIBUTERELATION.DATE_NEW",
+        "AB_ATTRIBUTERELATION.USER_NEW",
+        "AB_ATTRIBUTERELATION.DATE_EDIT",
+        "AB_ATTRIBUTERELATION.USER_EDIT",
+        "AB_ATTRIBUTE.DROPDOWNFILTER"
+    ],
+    valueQueryFields : AttributeTypeUtil.getAllDatabaseFields(),
     
-    if (showEmpty)
-        attributeSql.and("AB_ATTRIBUTE.AB_ATTRIBUTEID", attrId);
-    else
+    getConditionForIdValues : function (pIdValues, pLoadEmptyAttributes)
     {
-        attributeSql.andIfSet("AB_ATTRIBUTERELATION.AB_ATTRIBUTERELATIONID", idvalues.map(function(pId) 
+        var idCondition = newWhere();
+        
+        if (pLoadEmptyAttributes)
         {
-            return pId[0] == "," ? pId.split(",")[1] : pId;
-        }), SqlBuilder.IN());
-        objectRowId = null;
-    }
-    getTree = false;
-}
-else if (showEmpty || objectRowId)
-{
-    if (getTheme)
-        attributeSql.and("AB_ATTRIBUTE.ATTRIBUTE_TYPE", $AttributeTypes.THEME);
-    else
-        attributeSql.and("AB_ATTRIBUTE.ATTRIBUTE_TYPE", $AttributeTypes.THEME, SqlBuilder.NOT_EQUAL());
-    
-    if (showEmpty)
-    {
-        possibleAttributes = AttributeUtil.getPossibleAttributes(objectType);
-        let filtered = vars.exists("$param.FilteredAttributeIds_param") && vars.getString("$param.FilteredAttributeIds_param");
+            pIdValues.forEach(function (id)
+            {
+                var [attributeRelationId, attributeId] = JSON.parse(id);
+                idCondition.or("AB_ATTRIBUTERELATION.AB_ATTRIBUTERELATIONID", attributeRelationId);
+                idCondition.or(newWhere("AB_ATTRIBUTERELATION.AB_ATTRIBUTERELATIONID is null")
+                    .and("AB_ATTRIBUTE.AB_ATTRIBUTEID", attributeId));
+            });
+        }
+        else
+            idCondition.andIfSet("AB_ATTRIBUTERELATION.AB_ATTRIBUTERELATIONID", pIdValues, SqlBuilder.IN());
         
-        attributeSql.andIfSet("AB_ATTRIBUTE.AB_ATTRIBUTEID", possibleAttributes, SqlBuilder.IN());
-    }
-    if (vars.get("$param.FilteredAttributeIds_param"))
+        return idCondition;
+    },
+    getConditionForLinkedObject : function (pObjectType, pLoadEmptyAttributes, pAttributeIds, pTypeBlacklist, pTypeWhitelist)
     {
-        let filteredIds = JSON.parse(vars.getString("$param.FilteredAttributeIds_param"));
+        var attributeCondition = newWhereIfSet("AB_ATTRIBUTE.ATTRIBUTE_TYPE", pTypeBlacklist, SqlBuilder.NOT_IN());
+        attributeCondition.andIfSet("AB_ATTRIBUTE.ATTRIBUTE_TYPE", pTypeWhitelist, SqlBuilder.IN());
 
-        let filteredIdChildren = AttributeUtil.getAllChildren(filteredIds);
+        if (pLoadEmptyAttributes)
+            attributeCondition.andIfSet("AB_ATTRIBUTE.AB_ATTRIBUTEID", AttributeUtil.getPossibleAttributes(pObjectType), SqlBuilder.IN());
         
-        let filteredCondition = newWhere();
+        if (pAttributeIds)
+        {
+            let attributeChildren = AttributeUtil.getAllChildren(pAttributeIds);
+            let attributeIdCondition = newWhere();
+
+            if (attributeChildren.length > 0)
+            {
+                attributeIdCondition.and("AB_ATTRIBUTE.AB_ATTRIBUTEID", attributeChildren, SqlBuilder.IN())
+                attributeIdCondition.and("AB_ATTRIBUTE.ATTRIBUTE_TYPE", $AttributeTypes.COMBOVALUE, SqlBuilder.NOT_EQUAL());
+            }
+
+            // return nothing if filteredAttributeIds is an empty array. (--> and 1=2)
+            if (!attributeIdCondition.hasCondition())
+                return null;
+            attributeCondition.and(attributeIdCondition);
+        }
+        return attributeCondition;
+    },
+    
+    getAttributeQuery : function (pIdValues, pObjectRowId, pObjectType, pLoadEmptyAttributes, pAttributeIds, pTypeBlacklist, pTypeWhitelist)
+    {
+        var attributeQuery = newSelect(this.defaultQueryFields.concat(this.valueQueryFields))
+            .from("AB_ATTRIBUTE")
+            .orderBy("AB_ATTRIBUTE.SORTING asc");
         
-        if (filteredIdChildren.length > 0)
+        if (pIdValues)
+            attributeQuery.where(this.getConditionForIdValues(pIdValues, pLoadEmptyAttributes));
+        else if (pObjectRowId)
         {
-            filteredCondition.and("AB_ATTRIBUTE.AB_ATTRIBUTEID", filteredIdChildren, SqlBuilder.IN())
-                             .and("AB_ATTRIBUTE.ATTRIBUTE_TYPE", $AttributeTypes.COMBOVALUE, SqlBuilder.NOT_EQUAL());
+            let condition = this.getConditionForLinkedObject(pObjectType, pLoadEmptyAttributes, pAttributeIds, pTypeBlacklist, pTypeWhitelist);
+            if (condition === null)
+                return null;
+            attributeQuery.where(condition);
         }
         
-        // return nothing if filteredAttributeIds is an empty array. (--> and 1=2)
-        if (filteredCondition.hasCondition())
-            attributeSql.and(filteredCondition);
-        else
-            attributeSql.and("1=2");
-    }
-}
+        var attributeRelationCond = newWhere("AB_ATTRIBUTERELATION.AB_ATTRIBUTE_ID = AB_ATTRIBUTE.AB_ATTRIBUTEID"); //condition for the joined values (for AttributeRelation)
 
-var attributeRelationCond = newWhere("AB_ATTRIBUTERELATION.AB_ATTRIBUTE_ID = AB_ATTRIBUTE.AB_ATTRIBUTEID"); //condition for the joined values (for AttributeRelation)
-
-if (objectRowId)
-{
-    attributeRelationCond.and("AB_ATTRIBUTERELATION.OBJECT_ROWID", objectRowId);
-    if (objectType)
-        attributeRelationCond.and("AB_ATTRIBUTERELATION.OBJECT_TYPE", objectType);
-}
+        if (!pIdValues && pObjectRowId)
+        {
+            attributeRelationCond.and("AB_ATTRIBUTERELATION.OBJECT_ROWID", pObjectRowId);
+            attributeRelationCond.andIfSet("AB_ATTRIBUTERELATION.OBJECT_TYPE", pObjectType);
+        }
 
+        if (pLoadEmptyAttributes)
+            attributeQuery.leftJoin("AB_ATTRIBUTERELATION", attributeRelationCond);
+        else
+            attributeQuery.join("AB_ATTRIBUTERELATION", attributeRelationCond);
 
-    
-if (showEmpty)
-    attributeSql.leftJoin("AB_ATTRIBUTERELATION", attributeRelationCond);
-else
-    attributeSql.join("AB_ATTRIBUTERELATION", attributeRelationCond);
+        attributeQuery.leftJoin("AB_ATTRIBUTE", "COMBOVAL.AB_ATTRIBUTEID = " + $AttributeTypes.COMBO.databaseField, "COMBOVAL");
+        
+        return attributeQuery;
+    }
+}
 
-attributeSql.leftJoin("AB_ATTRIBUTE", "COMBOVAL.AB_ATTRIBUTEID = " + $AttributeTypes.COMBO.databaseField, "COMBOVAL")
+var attributeQuery = attributeQueryMaker.getAttributeQuery(idvalues, objectRowId, objectType, loadEmptyAttributes, filteredAttributeIds, typeBlacklist, typeWhitelist);
+var attributeRelations = attributeQuery != null ? attributeQuery.table(false) : [];
 
 //Builds an object containing the minimal counts of the attributes, this is required for
 //checking if an attribute is used not often enough or just often enough. When this is the case,
 //deletion of this attributeRelation will be prohibited.
-var minCountInsurance = {};
-if (getTree)
-{
-    if (!possibleAttributes)
-        possibleAttributes = AttributeUtil.getPossibleAttributes(objectType);
+var minCountInsurance = {
+    minCounts : {},
+    usageCounts : {},
     
-    let minUsages = newSelect("AB_ATTRIBUTE_ID, MIN_COUNT")
-                        .from("AB_ATTRIBUTEUSAGE")
-                        .whereIfSet("AB_ATTRIBUTEUSAGE.AB_ATTRIBUTE_ID", possibleAttributes, SqlBuilder.IN())
-                        .and("AB_ATTRIBUTEUSAGE.OBJECT_TYPE", objectType)
-                        .table(true);
-
-    minUsages.forEach(function (usage)
+    loadMinCounts : function (pObjectType)
     {
-        this[usage[0]] = {
-            count : 0,
-            min : usage[1]
-        };
-    }, minCountInsurance);
-}
+        
+        var minUsages = newSelect("AB_ATTRIBUTE_ID, MIN_COUNT")
+            .from("AB_ATTRIBUTEUSAGE")
+            .whereIfSet("AB_ATTRIBUTEUSAGE.AB_ATTRIBUTE_ID", Object.keys(this.usageCounts), SqlBuilder.IN())
+            .and("AB_ATTRIBUTEUSAGE.OBJECT_TYPE", pObjectType)
+            .table(true);
 
-var attrRelations = attributeSql.table(true).map(
-    function (row) 
-    {
-        var [attrRelId, attrId, attrParentId, attrType, attrName, dropDownDef, comboViewVal, dateNew, userNew, dateEdit, userEdit, dropDownFilter] = row;
-        attrName = translate.text(attrName);
-        attrType = attrType.trim();
-        if (!getTree && !displaySimpleName && attrParentId)
+        minUsages.forEach(function ([attributeId, minCount])
         {
-            let parentName = AttributeUtil.getFullAttributeName(attrParentId);
-            attrName = (parentName ? parentName + " / " : "") + attrName;
-        }
-        var value = row[AttributeTypeUtil.getTypeColumnIndex(attrType) + defaultFields.length];
-        var viewValue;
-        if (attrType == $AttributeTypes.COMBO)
-            viewValue = translate.text(comboViewVal);
-        else 
-            viewValue = AttributeTypeUtil.getAttributeViewValue(attrType, value, dropDownDef);
+            this.minCounts[attributeId] = minCount;
+        }, this);
+    },
+    incrUsageCount : function (pAttributeId)
+    {
+        if (pAttributeId in this.usageCounts)
+            this.usageCounts[pAttributeId]++;
+        else
+            this.usageCounts[pAttributeId] = 1;
+    },
+    attributeNotDeletable : function (pAttributeId)
+    {
+        return this.minCounts[pAttributeId] >= this.usageCounts[pAttributeId];
+    }
+};
 
-        if (attrId in minCountInsurance)
-            minCountInsurance[attrId].count++;
-        
-        //TODO: what should be the uid if showEmpty is true?
-        //                                    V-- set "," to mark this as new generated UUID
-        return [
-            attrRelId || util.getNewUUID() + "," + attrId, 
-            attrParentId, 
-            value, 
-            viewValue, 
-            attrId, 
-            attrName, 
-            "", 
-            attrType.trim(), 
-            dateNew, 
-            userNew, 
-            dateEdit, 
-            userEdit,
-            value,
-            viewValue,
-            dropDownDef,
-            dropDownFilter
-        ];
+attributeRelations = attributeRelations.map(function (row) 
+{
+    var [attrRelId, attrId, attrParentId, attrType, attrName, dropDownDef, comboViewVal, dateNew, userNew, dateEdit, userEdit, dropDownFilter] = row;
+    attrName = translate.text(attrName);
+    attrType = attrType.trim();
+    if (!getTree && loadFullAttributeName && attrParentId)
+    {
+        let parentName = AttributeUtil.getFullAttributeName(attrParentId);
+        attrName = (parentName ? parentName + " / " : "") + attrName;
     }
-);
+    var value = row[AttributeTypeUtil.getTypeColumnIndex(attrType) + attributeQueryMaker.defaultQueryFields.length];
+    var viewValue;
+    if (attrType == $AttributeTypes.COMBO)
+        viewValue = translate.text(comboViewVal);
+    else 
+        viewValue = AttributeTypeUtil.getAttributeViewValue(attrType, value, dropDownDef);
 
- _protectMinCountAttributes(attrRelations, minCountInsurance);
+    minCountInsurance.incrUsageCount(attrId);
+
+    //if loadEmptyAttributes is true, the id is contains the attributeRelation id and the attribute id.
+    //in case there is no attributeRelation, a random id is used
+    return [
+        loadEmptyAttributes ? JSON.stringify([attrRelId || util.getNewUUID(), attrId]) : attrRelId,
+        attrRelId,
+        attrParentId, 
+        value,
+        viewValue, 
+        attrId, 
+        attrName, 
+        "", //protected
+        attrType.trim(), 
+        dateNew, 
+        userNew, 
+        dateEdit, 
+        userEdit,
+        value,
+        viewValue,
+        dropDownDef,
+        dropDownFilter
+    ];
+});
+
+minCountInsurance.loadMinCounts(objectType);
+attributeRelations.forEach(function (attributeRelation)
+{
+    var attrId = attributeRelation[4];
+    if (minCountInsurance.attributeNotDeletable(attrId))
+        attributeRelation[7] = "true";
+});
 
-//object of attribute ids to avoid duplicates (more than one attribute can have the same parent)
-var attrCatalog = {}; 
 if (getTree)
-    attrRelations = _buildAttributeTree(attrRelations);
+    attributeRelations = _buildAttributeTree(attributeRelations);
 
-result.object(attrRelations);
+result.object(attributeRelations);
 
 /*
  * loads the parents for a tree
  */
 function _buildAttributeTree (pAttrRelations)
 {
-    var parentAttributes = [];
-    _fetchParentAttributes(pAttrRelations.map(function (row) {return row[1]}), parentAttributes);
-    return TreeUtils.sortArrayForTree(parentAttributes, 0, 1).concat(pAttrRelations);
-}
+    //object of attribute ids to avoid duplicates (more than one attribute can have the same parent)
+    var attrCatalog = {}; 
 
-/*
- * recursive function that loads all superordinate attributes for the tree
- */
-function _fetchParentAttributes (pAttributeIds, pParentAttributes)
-{
-    var attributeCond = newSelect("AB_ATTRIBUTEID, ATTRIBUTE_PARENT_ID, ATTRIBUTE_NAME")
-                            .from("AB_ATTRIBUTE")
-                            .where()
-    var nextIds = [];
-    pAttributeIds.forEach(function (id)
-    {
-        if (!(id in this))
-            attributeCond.andIfSet("AB_ATTRIBUTE.AB_ATTRIBUTEID", id);
-    }, attrCatalog);
+    var parentAttributes = [];
+    _fetchParentAttributes(pAttrRelations.map(function (row) {return row[2]}), parentAttributes);
+    return TreeUtils.sortArrayForTree(parentAttributes, 0, 2).concat(pAttrRelations);
     
-    attributeCond.table(true)
-        .forEach(function ([attrId, parentId, attrName])
-            {
-                this[attrId] = true; //make entry in attrCatalog to avoid duplicates
-                if (parentId)
-                    nextIds.push(parentId);
-                
-                pParentAttributes.push([
-                    attrId, 
-                    parentId, 
-                    "", 
-                    "", 
-                    "", 
-                    translate.text(attrName),  //translate attribute name
-                    "true", 
-                    "", 
-                    "", 
-                    "", 
-                    "", 
-                    "",
-                    "",
-                    "",
-                    "",
-                    "",
-                ]);
-            }, attrCatalog);
-            
-    if (nextIds.length)
-        _fetchParentAttributes(nextIds, pParentAttributes);
-}
-
-function _protectMinCountAttributes (pAttrRelations, pMinCountInsurance)
-{
-    for (let i = 0; i < pAttrRelations.length; i++)
+    /*
+     * recursive function that loads all superordinate attributes for the tree
+     */
+    function _fetchParentAttributes (pAttributeIds, pParentAttributes)
     {
-        let attrId = pAttrRelations[i][4];
-        if (attrId in pMinCountInsurance && pMinCountInsurance[attrId].min >= pMinCountInsurance[attrId].count)
-            pAttrRelations[i][6] = "true";
+        var attributeCond = newSelect("AB_ATTRIBUTEID, ATTRIBUTE_PARENT_ID, ATTRIBUTE_NAME")
+                                .from("AB_ATTRIBUTE")
+                                .where()
+        var nextIds = [];
+        pAttributeIds.forEach(function (id)
+        {
+            if (!(id in this))
+                attributeCond.orIfSet("AB_ATTRIBUTE.AB_ATTRIBUTEID", id);
+        }, attrCatalog);
+
+        attributeCond.table(true)
+            .forEach(function ([attrId, parentId, attrName])
+                {
+                    this[attrId] = true; //make entry in attrCatalog to avoid duplicates
+                    if (parentId)
+                        nextIds.push(parentId);
+
+                    pParentAttributes.push([
+                        attrId, "", parentId, "", "", "", //0-5
+                        translate.text(attrName),  //translate attribute name
+                        "true", //7
+                        "", "", "", "", "", "", "", "", "" //8-16
+                    ]);
+                }, attrCatalog);
+
+        if (nextIds.length)
+            _fetchParentAttributes(nextIds, pParentAttributes);
     }
-}
\ No newline at end of file
+}
diff --git a/entity/AttributeRelation_entity/recordcontainers/jdito/onInsert.js b/entity/AttributeRelation_entity/recordcontainers/jdito/onInsert.js
index 4a307bcf23d..43c5873d91a 100644
--- a/entity/AttributeRelation_entity/recordcontainers/jdito/onInsert.js
+++ b/entity/AttributeRelation_entity/recordcontainers/jdito/onInsert.js
@@ -17,7 +17,7 @@ var columns = [
 var rowdata = vars.get("$local.rowdata");
 var uid = rowdata["UID.value"];
 var values = [
-    uid[0] == "," ? uid.substr(1) : uid, // if first char is "," it is a newly generated UUID
+    rowdata["AB_ATTRIBUTERELATIONID.value"],
     rowdata["AB_ATTRIBUTE_ID.value"],
     vars.get("$param.ObjectRowId_param"),
     vars.get("$param.ObjectType_param"),
diff --git a/entity/AttributeRelation_entity/recordcontainers/jdito/onUpdate.js b/entity/AttributeRelation_entity/recordcontainers/jdito/onUpdate.js
index 293c5955a52..3078607f9c5 100644
--- a/entity/AttributeRelation_entity/recordcontainers/jdito/onUpdate.js
+++ b/entity/AttributeRelation_entity/recordcontainers/jdito/onUpdate.js
@@ -8,31 +8,11 @@ import("Attribute_lib");
 var rowdata = vars.get("$local.rowdata");
 var attributeId = rowdata["AB_ATTRIBUTE_ID.value"]
 var type = AttributeUtil.getAttributeType(attributeId);
-var uid = vars.get("$local.uid").split(",");
+var attributeRelationId = vars.getString("$param.ShowEmpty_param") == "true"
+    ? JSON.parse(vars.get("$local.uid"))[0]
+    : vars.get("$local.uid");
 
-// if first char is "," it is a newly generated UUID
-if (uid.length === 1)
-{
-    var fieldValues = {
-        "AB_ATTRIBUTE_ID" : attributeId,
-        "DATE_EDIT" : rowdata["DATE_EDIT.value"],
-        "USER_EDIT" : rowdata["USER_EDIT.value"]
-    };
-
-    var dbFields = AttributeTypeUtil.getAllDatabaseFields();
-    dbFields.forEach(function (row)
-    {
-        fieldValues[row] = ""; //set every field but the correct value field to null
-    });
-    
-    fieldValues[AttributeTypeUtil.getDatabaseField(type)] = AttributeTypeUtil.useLookup(type) 
-        ? rowdata["VALUE_LOOKUP.value"] 
-        : rowdata["VALUE.value"];
-
-    newWhere("AB_ATTRIBUTERELATION.AB_ATTRIBUTERELATIONID", "$local.uid")
-        .updateFields(fieldValues);
-}
-else
+if (vars.getString("$param.ShowEmpty_param") == "true" && !rowdata["AB_ATTRIBUTERELATIONID.value"])
 {
     var columns = [
         "AB_ATTRIBUTERELATIONID",
@@ -44,7 +24,7 @@ else
     ];
     
     var values = [
-        uid[0], // if first char is "," it is a newly generated UUID
+        attributeRelationId,
         attributeId,
         vars.get("$param.ObjectRowId_param"),
         vars.get("$param.ObjectType_param"),
@@ -62,6 +42,27 @@ else
     }
     db.insertData("AB_ATTRIBUTERELATION", columns, null, values);
 }
+else
+{
+    var fieldValues = {
+        "AB_ATTRIBUTE_ID" : attributeId,
+        "DATE_EDIT" : rowdata["DATE_EDIT.value"],
+        "USER_EDIT" : rowdata["USER_EDIT.value"]
+    };
+
+    var dbFields = AttributeTypeUtil.getAllDatabaseFields();
+    dbFields.forEach(function (row)
+    {
+        fieldValues[row] = ""; //set every field but the correct value field to null
+    });
+    
+    fieldValues[AttributeTypeUtil.getDatabaseField(type)] = AttributeTypeUtil.useLookup(type) 
+        ? rowdata["VALUE_LOOKUP.value"] 
+        : rowdata["VALUE.value"];
+    
+    newWhere("AB_ATTRIBUTERELATION.AB_ATTRIBUTERELATIONID", attributeRelationId)
+        .updateFields(fieldValues);
+}
 
 if (vars.get("$param.ObjectType_param") == "Person")
     DataPrivacyUtils.notifyNeedDataPrivacyUpdate(vars.get("$param.ObjectRowId_param"), vars.get("$param.ShowDsgvoMessage_param"));
\ No newline at end of file
diff --git a/entity/Attribute_entity/Attribute_entity.aod b/entity/Attribute_entity/Attribute_entity.aod
index d8ffe836b1d..8f0a4a35b9b 100644
--- a/entity/Attribute_entity/Attribute_entity.aod
+++ b/entity/Attribute_entity/Attribute_entity.aod
@@ -7,7 +7,6 @@
   <contentTitleProcess>%aditoprj%/entity/Attribute_entity/contentTitleProcess.js</contentTitleProcess>
   <afterUiInit>%aditoprj%/entity/Attribute_entity/afterUiInit.js</afterUiInit>
   <onValidation>%aditoprj%/entity/Attribute_entity/onValidation.js</onValidation>
-  <afterOperatingState>%aditoprj%/entity/Attribute_entity/afterOperatingState.js</afterOperatingState>
   <iconId>VAADIN:TAG</iconId>
   <titlePlural>Attributes</titlePlural>
   <recordContainer>jdito</recordContainer>
diff --git a/entity/Attribute_entity/afterOperatingState.js b/entity/Attribute_entity/afterOperatingState.js
deleted file mode 100644
index 084c14a53af..00000000000
--- a/entity/Attribute_entity/afterOperatingState.js
+++ /dev/null
@@ -1,5 +0,0 @@
-import("system.vars");
-import("system.neon");
-
-if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_VIEW && vars.get("$param.ParentIdPreset_param"))
-    neon.refreshAll();
\ No newline at end of file
-- 
GitLab


From c40fce66a62b4aebaed77aeee9751d02cdf92b23 Mon Sep 17 00:00:00 2001
From: Martin Bilda <m.bilda@adito.de>
Date: Tue, 7 Jul 2020 07:20:29 +0200
Subject: [PATCH 003/184] =?UTF-8?q?#Prototyp=20f=C3=BCr=20MSTeams=20Anbind?=
 =?UTF-8?q?ung?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../Data_alias/basic/2020.2.1/changelog.xml   |   5 +
 .../basic/2020.2.1/create_MST_TEAM.xml        |  18 +
 .../create_asys_notificationcontents.xml      |   4 +-
 aliasDefinition/Data_alias/Data_alias.aod     | 927 ++----------------
 entity/Activity_entity/Activity_entity.aod    |  37 +-
 .../createnewchatactivity/onActionProcess.js  |   6 +
 .../createnewchatactivity/stateProcess.js     |  23 +
 entity/Document_entity/Document_entity.aod    |  12 +
 .../synchronizedocuments/onActionProcess.js   |  16 +
 .../synchronizedocuments/stateProcess.js      |  24 +
 .../MSTChooseTeam_entity.aod                  |  60 ++
 .../allarchivedteams/dropDownProcess.js       |   9 +
 .../entityfields/allteams/dropDownProcess.js  |  18 +
 .../recordcontainers/jdito/contentProcess.js  |   9 +
 .../recordcontainers/jdito/onInsert.js        |  78 ++
 entity/MSTTeam2_entity/MSTTeam2_entity.aod    |  43 +
 .../recordcontainers/jdito/contentProcess.js  |  12 +
 .../MSTTeamChannel_entity.aod                 |  58 ++
 .../entityfields/channelname/valueProcess.js  |   6 +
 .../entityfields/description/valueProcess.js  |   6 +
 .../recordcontainers/jdito/contentProcess.js  |   9 +
 .../recordcontainers/jdito/onInsert.js        |  18 +
 .../MSTTeamChat_entity/MSTTeamChat_entity.aod |  84 ++
 .../allchannels/dropDownProcess.js            |  24 +
 .../entityfields/allchannels/valueProcess.js  |   0
 .../children/messages_param/valueProcess.js   |  24 +
 .../loadnewmessages/onActionProcess.js        |   9 +
 .../loadnewmessages/stateProcess.js           |  19 +
 .../recordcontainers/jdito/contentProcess.js  |   9 +
 .../recordcontainers/jdito/onInsert.js        |   3 +
 .../MSTTeamDocument_entity.aod                |  58 ++
 .../allchannels/dropDownProcess.js            |  26 +
 .../entityfields/documents/dropDownProcess.js |  30 +
 .../recordcontainers/jdito/contentProcess.js  |   9 +
 .../recordcontainers/jdito/onInsert.js        |  38 +
 .../MSTTeamMember_entity.aod                  |  74 ++
 .../mailsofextern/dropDownProcess.js          |   6 +
 .../upnsofmembers/dropDownProcess.js          |   6 +
 .../recordcontainers/jdito/contentProcess.js  |   9 +
 .../recordcontainers/jdito/onInsert.js        |  57 ++
 entity/MSTTeam_entity/MSTTeam_entity.aod      | 141 +++
 .../entityfields/description/valueProcess.js  |   6 +
 .../mailsofextern/dropDownProcess.js          |   6 +
 .../objectrowid_param/valueProcess.js         |   4 +
 .../children/objecttype_param/valueProcess.js |   3 +
 .../entityfields/obect_rowid/valueProcess.js  |   6 +
 .../entityfields/teamname/valueProcess.js     |   6 +
 .../upnsofmembers/dropDownProcess.js          |   6 +
 .../upnsofowners/dropDownProcess.js           |   6 +
 .../upnsofownersoriginal/dropDownProcess.js   |  17 +
 .../recordcontainers/jdito/contentProcess.js  |   9 +
 .../recordcontainers/jdito/onInsert.js        |  91 ++
 .../MSTTeamsMessage_entity.aod                |  74 ++
 .../loadnewmessages/onActionProcess.js        |  26 +
 .../recordcontainers/jdito/contentProcess.js  |  30 +
 entity/Member_entity/Member_entity.aod        |  84 ++
 .../entityfields/assignedteam/valueProcess.js |  38 +
 .../children/addapp/onActionProcess.js        |  17 +
 .../children/addapp/stateProcess.js           |  29 +
 .../children/addnewmember/onActionProcess.js  |  11 +
 .../children/addnewmember/stateProcess.js     |  23 +
 .../changetomsteam/onActionProcess.js         |   3 +
 .../children/changetomsteam/stateProcess.js   |  23 +
 .../children/chooseteam/onActionProcess.js    |   8 +
 .../children/chooseteam/stateProcess.js       |  11 +
 .../children/createchannel/onActionProcess.js |  12 +
 .../children/createchannel/stateProcess.js    |  23 +
 .../children/createteam/onActionProcess.js    |  32 +
 .../children/createteam/stateProcess.js       |  11 +
 .../children/deleteteam/onActionProcess.js    |  30 +
 .../children/deleteteam/stateProcess.js       |  25 +
 .../children/restoreteam/onActionProcess.js   |  28 +
 .../children/restoreteam/stateProcess.js      |  23 +
 .../Salesproject_entity.aod                   |  58 ++
 .../entityfields/addapp/onActionProcess.js    |  12 +
 .../entityfields/addapp/stateProcess.js       |  10 +
 .../entityfields/addmember/onActionProcess.js |  11 +
 .../entityfields/addmember/stateProcess.js    |  10 +
 .../createchannel/onActionProcess.js          |  10 +
 .../createchannel/stateProcess.js             |  10 +
 .../createteam/onActionProcess.js             |  20 +
 .../entityfields/createteam/stateProcess.js   |  11 +
 .../deleteteam/onActionProcess.js             |  10 +
 .../entityfields/deleteteam/stateProcess.js   |  11 +
 .../restoreteam/onActionProcess.js            |  10 +
 .../entityfields/restoreteam/stateProcess.js  |  10 +
 .../recordcontainers/db/onDBUpdate.js         |  16 +
 .../SingleObject_entity.aod                   |  44 +
 neonContext/MSTChooseTeam/MSTChooseTeam.aod   |  13 +
 neonContext/MSTTeam/MSTTeam.aod               |  13 +
 neonContext/MSTTeamChannel/MSTTeamChannel.aod |  13 +
 neonContext/MSTTeamChat/MSTTeamChat.aod       |  13 +
 .../MSTTeamDocument/MSTTeamDocument.aod       |  13 +
 neonContext/MSTTeamMember/MSTTeamMember.aod   |  13 +
 .../MSTTeamsMessage/MSTTeamsMessage.aod       |  13 +
 neonContext/Salesproject/Salesproject.aod     |   4 +
 .../ActivityFilter_view.aod                   |   1 +
 .../DocumentFilter_view.aod                   |   1 +
 .../MSTChooseTeamEdit_view.aod                |  49 +
 .../MSTTeamChannelEdit_view.aod               |  10 +
 .../MSTTeamChannelEdit_view2.aod              |  29 +
 .../MSTTeamChatEdit_view.aod                  |  41 +
 .../MSTTeamDocumentEdit_view.aod              |  34 +
 .../MSTTeamEdit_view/MSTTeamEdit_view.aod     |  48 +
 .../MSTTeamMemberEdit_view.aod                |  36 +
 .../MSTTeamsMessageFilter_view.aod            |  30 +
 .../MemberFilter_view/MemberFilter_view.aod   |  38 +-
 .../SalesprojectMSTeams_view.aod              |  36 +
 .../SalesprojectMain_view.aod                 |  12 +-
 .../_test_clientProcess.aod                   |   2 +
 process/_test_clientProcess/wsdl.wsdl         |   0
 process/mstws/mstws.aod                       |  13 +
 process/mstws/process.js                      |  53 +
 113 files changed, 2589 insertions(+), 937 deletions(-)
 create mode 100644 .liquibase/Data_alias/basic/2020.2.1/changelog.xml
 create mode 100644 .liquibase/Data_alias/basic/2020.2.1/create_MST_TEAM.xml
 create mode 100644 entity/Activity_entity/entityfields/msteams/children/createnewchatactivity/onActionProcess.js
 create mode 100644 entity/Activity_entity/entityfields/msteams/children/createnewchatactivity/stateProcess.js
 create mode 100644 entity/Document_entity/entityfields/msteam/children/synchronizedocuments/onActionProcess.js
 create mode 100644 entity/Document_entity/entityfields/msteam/children/synchronizedocuments/stateProcess.js
 create mode 100644 entity/MSTChooseTeam_entity/MSTChooseTeam_entity.aod
 create mode 100644 entity/MSTChooseTeam_entity/entityfields/allarchivedteams/dropDownProcess.js
 create mode 100644 entity/MSTChooseTeam_entity/entityfields/allteams/dropDownProcess.js
 create mode 100644 entity/MSTChooseTeam_entity/recordcontainers/jdito/contentProcess.js
 create mode 100644 entity/MSTChooseTeam_entity/recordcontainers/jdito/onInsert.js
 create mode 100644 entity/MSTTeam2_entity/MSTTeam2_entity.aod
 create mode 100644 entity/MSTTeam2_entity/recordcontainers/jdito/contentProcess.js
 create mode 100644 entity/MSTTeamChannel_entity/MSTTeamChannel_entity.aod
 create mode 100644 entity/MSTTeamChannel_entity/entityfields/channelname/valueProcess.js
 create mode 100644 entity/MSTTeamChannel_entity/entityfields/description/valueProcess.js
 create mode 100644 entity/MSTTeamChannel_entity/recordcontainers/jdito/contentProcess.js
 create mode 100644 entity/MSTTeamChannel_entity/recordcontainers/jdito/onInsert.js
 create mode 100644 entity/MSTTeamChat_entity/MSTTeamChat_entity.aod
 create mode 100644 entity/MSTTeamChat_entity/entityfields/allchannels/dropDownProcess.js
 create mode 100644 entity/MSTTeamChat_entity/entityfields/allchannels/valueProcess.js
 create mode 100644 entity/MSTTeamChat_entity/entityfields/consumer/children/messages_param/valueProcess.js
 create mode 100644 entity/MSTTeamChat_entity/entityfields/loadnewmessages/onActionProcess.js
 create mode 100644 entity/MSTTeamChat_entity/entityfields/loadnewmessages/stateProcess.js
 create mode 100644 entity/MSTTeamChat_entity/recordcontainers/jdito/contentProcess.js
 create mode 100644 entity/MSTTeamChat_entity/recordcontainers/jdito/onInsert.js
 create mode 100644 entity/MSTTeamDocument_entity/MSTTeamDocument_entity.aod
 create mode 100644 entity/MSTTeamDocument_entity/entityfields/allchannels/dropDownProcess.js
 create mode 100644 entity/MSTTeamDocument_entity/entityfields/documents/dropDownProcess.js
 create mode 100644 entity/MSTTeamDocument_entity/recordcontainers/jdito/contentProcess.js
 create mode 100644 entity/MSTTeamDocument_entity/recordcontainers/jdito/onInsert.js
 create mode 100644 entity/MSTTeamMember_entity/MSTTeamMember_entity.aod
 create mode 100644 entity/MSTTeamMember_entity/entityfields/mailsofextern/dropDownProcess.js
 create mode 100644 entity/MSTTeamMember_entity/entityfields/upnsofmembers/dropDownProcess.js
 create mode 100644 entity/MSTTeamMember_entity/recordcontainers/jdito/contentProcess.js
 create mode 100644 entity/MSTTeamMember_entity/recordcontainers/jdito/onInsert.js
 create mode 100644 entity/MSTTeam_entity/MSTTeam_entity.aod
 create mode 100644 entity/MSTTeam_entity/entityfields/description/valueProcess.js
 create mode 100644 entity/MSTTeam_entity/entityfields/mailsofextern/dropDownProcess.js
 create mode 100644 entity/MSTTeam_entity/entityfields/membercomsumer/children/objectrowid_param/valueProcess.js
 create mode 100644 entity/MSTTeam_entity/entityfields/membercomsumer/children/objecttype_param/valueProcess.js
 create mode 100644 entity/MSTTeam_entity/entityfields/obect_rowid/valueProcess.js
 create mode 100644 entity/MSTTeam_entity/entityfields/teamname/valueProcess.js
 create mode 100644 entity/MSTTeam_entity/entityfields/upnsofmembers/dropDownProcess.js
 create mode 100644 entity/MSTTeam_entity/entityfields/upnsofowners/dropDownProcess.js
 create mode 100644 entity/MSTTeam_entity/entityfields/upnsofownersoriginal/dropDownProcess.js
 create mode 100644 entity/MSTTeam_entity/recordcontainers/jdito/contentProcess.js
 create mode 100644 entity/MSTTeam_entity/recordcontainers/jdito/onInsert.js
 create mode 100644 entity/MSTTeamsMessage_entity/MSTTeamsMessage_entity.aod
 create mode 100644 entity/MSTTeamsMessage_entity/entityfields/msteam/children/loadnewmessages/onActionProcess.js
 create mode 100644 entity/MSTTeamsMessage_entity/recordcontainers/jdito/contentProcess.js
 create mode 100644 entity/Member_entity/entityfields/assignedteam/valueProcess.js
 create mode 100644 entity/Member_entity/entityfields/msteamsactiongroup/children/addapp/onActionProcess.js
 create mode 100644 entity/Member_entity/entityfields/msteamsactiongroup/children/addapp/stateProcess.js
 create mode 100644 entity/Member_entity/entityfields/msteamsactiongroup/children/addnewmember/onActionProcess.js
 create mode 100644 entity/Member_entity/entityfields/msteamsactiongroup/children/addnewmember/stateProcess.js
 create mode 100644 entity/Member_entity/entityfields/msteamsactiongroup/children/changetomsteam/onActionProcess.js
 create mode 100644 entity/Member_entity/entityfields/msteamsactiongroup/children/changetomsteam/stateProcess.js
 create mode 100644 entity/Member_entity/entityfields/msteamsactiongroup/children/chooseteam/onActionProcess.js
 create mode 100644 entity/Member_entity/entityfields/msteamsactiongroup/children/chooseteam/stateProcess.js
 create mode 100644 entity/Member_entity/entityfields/msteamsactiongroup/children/createchannel/onActionProcess.js
 create mode 100644 entity/Member_entity/entityfields/msteamsactiongroup/children/createchannel/stateProcess.js
 create mode 100644 entity/Member_entity/entityfields/msteamsactiongroup/children/createteam/onActionProcess.js
 create mode 100644 entity/Member_entity/entityfields/msteamsactiongroup/children/createteam/stateProcess.js
 create mode 100644 entity/Member_entity/entityfields/msteamsactiongroup/children/deleteteam/onActionProcess.js
 create mode 100644 entity/Member_entity/entityfields/msteamsactiongroup/children/deleteteam/stateProcess.js
 create mode 100644 entity/Member_entity/entityfields/msteamsactiongroup/children/restoreteam/onActionProcess.js
 create mode 100644 entity/Member_entity/entityfields/msteamsactiongroup/children/restoreteam/stateProcess.js
 create mode 100644 entity/Salesproject_entity/entityfields/addapp/onActionProcess.js
 create mode 100644 entity/Salesproject_entity/entityfields/addapp/stateProcess.js
 create mode 100644 entity/Salesproject_entity/entityfields/addmember/onActionProcess.js
 create mode 100644 entity/Salesproject_entity/entityfields/addmember/stateProcess.js
 create mode 100644 entity/Salesproject_entity/entityfields/createchannel/onActionProcess.js
 create mode 100644 entity/Salesproject_entity/entityfields/createchannel/stateProcess.js
 create mode 100644 entity/Salesproject_entity/entityfields/createteam/onActionProcess.js
 create mode 100644 entity/Salesproject_entity/entityfields/createteam/stateProcess.js
 create mode 100644 entity/Salesproject_entity/entityfields/deleteteam/onActionProcess.js
 create mode 100644 entity/Salesproject_entity/entityfields/deleteteam/stateProcess.js
 create mode 100644 entity/Salesproject_entity/entityfields/restoreteam/onActionProcess.js
 create mode 100644 entity/Salesproject_entity/entityfields/restoreteam/stateProcess.js
 create mode 100644 entity/SingleObject_entity/SingleObject_entity.aod
 create mode 100644 neonContext/MSTChooseTeam/MSTChooseTeam.aod
 create mode 100644 neonContext/MSTTeam/MSTTeam.aod
 create mode 100644 neonContext/MSTTeamChannel/MSTTeamChannel.aod
 create mode 100644 neonContext/MSTTeamChat/MSTTeamChat.aod
 create mode 100644 neonContext/MSTTeamDocument/MSTTeamDocument.aod
 create mode 100644 neonContext/MSTTeamMember/MSTTeamMember.aod
 create mode 100644 neonContext/MSTTeamsMessage/MSTTeamsMessage.aod
 create mode 100644 neonView/MSTChooseTeamEdit_view/MSTChooseTeamEdit_view.aod
 create mode 100644 neonView/MSTTeamChannelEdit_view/MSTTeamChannelEdit_view.aod
 create mode 100644 neonView/MSTTeamChannelEdit_view2/MSTTeamChannelEdit_view2.aod
 create mode 100644 neonView/MSTTeamChatEdit_view/MSTTeamChatEdit_view.aod
 create mode 100644 neonView/MSTTeamDocumentEdit_view/MSTTeamDocumentEdit_view.aod
 create mode 100644 neonView/MSTTeamEdit_view/MSTTeamEdit_view.aod
 create mode 100644 neonView/MSTTeamMemberEdit_view/MSTTeamMemberEdit_view.aod
 create mode 100644 neonView/MSTTeamsMessageFilter_view/MSTTeamsMessageFilter_view.aod
 create mode 100644 neonView/SalesprojectMSTeams_view/SalesprojectMSTeams_view.aod
 create mode 100644 process/_test_clientProcess/wsdl.wsdl
 create mode 100644 process/mstws/mstws.aod
 create mode 100644 process/mstws/process.js

diff --git a/.liquibase/Data_alias/basic/2020.2.1/changelog.xml b/.liquibase/Data_alias/basic/2020.2.1/changelog.xml
new file mode 100644
index 00000000000..7a6f495d3a7
--- /dev/null
+++ b/.liquibase/Data_alias/basic/2020.2.1/changelog.xml
@@ -0,0 +1,5 @@
+<?xml version="1.1" encoding="UTF-8" standalone="no"?>
+<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
+                   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd">
+    <include file="create_MST_TEAM.xml" relativeToChangelogFile="true"/>
+</databaseChangeLog>
diff --git a/.liquibase/Data_alias/basic/2020.2.1/create_MST_TEAM.xml b/.liquibase/Data_alias/basic/2020.2.1/create_MST_TEAM.xml
new file mode 100644
index 00000000000..1181ee7b3a2
--- /dev/null
+++ b/.liquibase/Data_alias/basic/2020.2.1/create_MST_TEAM.xml
@@ -0,0 +1,18 @@
+<?xml version="1.1" encoding="UTF-8" standalone="no"?>
+<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
+                   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd">
+<changeSet author="m.bilda" id="3d4f843d-9c5d-46b1-9475-9527d45a65b6">
+	<createTable tableName="MST_TEAM">
+		<column name="MST_ID" type="CHAR(36)">
+			<constraints primaryKey="true" primaryKeyName="PK_MST_TEAM_MST_ID"/>
+		</column>   
+                <column name="MST_TEAMID" type="CHAR(36)"/>
+                <column name="TEAMNAME" type="NVARCHAR(255)"/>
+                <column name="GENERAL_CHANNELID" type="CHAR(48)"/>
+                <column name="OBJECT_ROWID" type="CHAR(36)"/>
+                <column name="IS_ARCHIVED" type="TINYINT"/>
+                <column name="SERVICE_URL" type="NVARCHAR(255)"/>
+                <column name="FINAL_DELETE_DATE" type="TIMESTAMP"/>
+	</createTable>      
+</changeSet>
+</databaseChangeLog>
diff --git a/.liquibase/_____SYSTEMALIAS/basic/init/struct/create_asys_notificationcontents.xml b/.liquibase/_____SYSTEMALIAS/basic/init/struct/create_asys_notificationcontents.xml
index d045c993887..8da1987f7f3 100644
--- a/.liquibase/_____SYSTEMALIAS/basic/init/struct/create_asys_notificationcontents.xml
+++ b/.liquibase/_____SYSTEMALIAS/basic/init/struct/create_asys_notificationcontents.xml
@@ -7,11 +7,11 @@
         </column>
         <column name="BACKPACK" type="CLOB"/>
         <column name="CAPTION" type="VARCHAR(512)"/>
-        <column name="CREATIONDATE" type="BIGINT"/>
+        <column name="CREATEDATE" type="TIMESTAMP"/>
+        <column name="DELETEDATE" type="TIMESTAMP"/>
         <column name="DESCRIPTION" type="VARCHAR(1023)"/>
         <column name="FORCEDPRIORITY" type="VARCHAR(15)"/>
         <column name="ICON_INFO" type="VARCHAR(1023)"/>
-        <column name="LIFETIME" type="BIGINT"/>
         <column name="LINK_INFO" type="VARCHAR(1023)"/>
         <column name="ORIGINATORNAME" type="VARCHAR(63)"/>
         <column name="RECIPIENTUSERIDS" type="CLOB"/>
diff --git a/aliasDefinition/Data_alias/Data_alias.aod b/aliasDefinition/Data_alias/Data_alias.aod
index 06901c17a5e..9f5df436ed9 100644
--- a/aliasDefinition/Data_alias/Data_alias.aod
+++ b/aliasDefinition/Data_alias/Data_alias.aod
@@ -14,7 +14,6 @@
             <idColumn>ORGANISATIONID</idColumn>
             <idGeneratorType v="0" />
             <idGeneratorInterval v="1" />
-            <documentation>%aditoprj%/aliasDefinition/Data_alias/aliasdefinitionsub/entitygroup/entities/organisation/documentation.adoc</documentation>
             <title></title>
             <description></description>
             <auditSyncConfig>
@@ -230,7 +229,6 @@
             <idColumn>CONTACTID</idColumn>
             <idGeneratorType v="0" />
             <idGeneratorInterval v="1" />
-            <documentation>%aditoprj%/aliasDefinition/Data_alias/aliasdefinitionsub/entitygroup/entities/contact/documentation.adoc</documentation>
             <title></title>
             <description></description>
             <auditSyncConfig>
@@ -263,7 +261,7 @@
                   <customJDitoProperty>
                     <name>translate4Log</name>
                     <global v="false" />
-                    <property>%aditoprj%/aliasDefinition/Data_alias/aliasdefinitionsub/entitygroup/entities/contact/entityfields/isolanguage/customproperties/translate4log/property.js</property>
+                    <property>%aditoprj%/aliasDefinition/Data_alias/aliasdefinitionsub/entitygroup/entities/contact/entityfields/language/customproperties/translate4log/property.js</property>
                   </customJDitoProperty>
                 </customProperties>
               </entityFieldDb>
@@ -518,7 +516,6 @@
             <idColumn>PERSONID</idColumn>
             <idGeneratorType v="0" />
             <idGeneratorInterval v="1" />
-            <documentation>%aditoprj%/aliasDefinition/Data_alias/aliasdefinitionsub/entitygroup/entities/person/documentation.adoc</documentation>
             <title></title>
             <description></description>
             <auditSyncConfig>
@@ -800,7 +797,6 @@
             <idColumn>ADDRESSID</idColumn>
             <idGeneratorType v="0" />
             <idGeneratorInterval v="1" />
-            <documentation>%aditoprj%/aliasDefinition/Data_alias/aliasdefinitionsub/entitygroup/entities/address/documentation.adoc</documentation>
             <title></title>
             <description></description>
             <auditSyncConfig>
@@ -1151,7 +1147,6 @@
             <idColumn>COMMUNICATIONID</idColumn>
             <idGeneratorType v="0" />
             <idGeneratorInterval v="1" />
-            <documentation>%aditoprj%/aliasDefinition/Data_alias/aliasdefinitionsub/entitygroup/entities/communication/documentation.adoc</documentation>
             <title></title>
             <description></description>
             <auditSyncConfig>
@@ -1332,7 +1327,6 @@
             <idColumn>CONTRACTID</idColumn>
             <idGeneratorType v="0" />
             <idGeneratorInterval v="1" />
-            <documentation>%aditoprj%/aliasDefinition/Data_alias/aliasdefinitionsub/entitygroup/entities/contract/documentation.adoc</documentation>
             <title></title>
             <description></description>
             <auditSyncConfig>
@@ -1496,13 +1490,6 @@
                     <property v="true" />
                   </customBooleanProperty>
                 </customProperties>
-                <dependencies>
-                  <entityDependency>
-                    <name>f3ac610e-e9a7-4806-bab1-eeab4de8969b</name>
-                    <entityName>CONTACT</entityName>
-                    <fieldName>CONTACTID</fieldName>
-                  </entityDependency>
-                </dependencies>
               </entityFieldDb>
               <entityFieldDb>
                 <name>CONTRACTSTART</name>
@@ -1552,7 +1539,6 @@
             <idColumn>PRODUCTID</idColumn>
             <idGeneratorType v="0" />
             <idGeneratorInterval v="1" />
-            <documentation>%aditoprj%/aliasDefinition/Data_alias/aliasdefinitionsub/entitygroup/entities/product/documentation.adoc</documentation>
             <title></title>
             <description></description>
             <auditSyncConfig>
@@ -1686,7 +1672,7 @@
                 <name>GROUPCODEID</name>
                 <dbName></dbName>
                 <primaryKey v="false" />
-                <columnType v="12" />
+                <columnType v="1" />
                 <size v="36" />
                 <scale v="0" />
                 <notNull v="false" />
@@ -1746,19 +1732,11 @@
                     <global v="false" />
                     <property v="true" />
                   </customBooleanProperty>
-                  <customJDitoProperty>
+                  <customStringProperty>
                     <name>translate4Log</name>
                     <global v="false" />
-                    <property>%aditoprj%/aliasDefinition/Data_alias/aliasdefinitionsub/entitygroup/entities/product/entityfields/contact_id/customproperties/translate4log/property.js</property>
-                  </customJDitoProperty>
+                  </customStringProperty>
                 </customProperties>
-                <dependencies>
-                  <entityDependency>
-                    <name>8d17eacc-3169-4a36-9eab-9c0ba2dabab6</name>
-                    <entityName>CONTACT</entityName>
-                    <fieldName>CONTACTID</fieldName>
-                  </entityDependency>
-                </dependencies>
               </entityFieldDb>
               <entityFieldDb>
                 <name>DATE_EDIT</name>
@@ -1838,7 +1816,6 @@
             <idColumn>PROD2PRODID</idColumn>
             <idGeneratorType v="0" />
             <idGeneratorInterval v="1" />
-            <documentation>%aditoprj%/aliasDefinition/Data_alias/aliasdefinitionsub/entitygroup/entities/prod2prod/documentation.adoc</documentation>
             <title></title>
             <description></description>
             <auditSyncConfig>
@@ -1985,7 +1962,6 @@
             <idColumn>PRODUCTPRICEID</idColumn>
             <idGeneratorType v="0" />
             <idGeneratorInterval v="1" />
-            <documentation>%aditoprj%/aliasDefinition/Data_alias/aliasdefinitionsub/entitygroup/entities/productprice/documentation.adoc</documentation>
             <title></title>
             <description></description>
             <auditSyncConfig>
@@ -2187,19 +2163,7 @@
                     <global v="false" />
                     <property v="true" />
                   </customBooleanProperty>
-                  <customJDitoProperty>
-                    <name>translate4Log</name>
-                    <global v="false" />
-                    <property>%aditoprj%/aliasDefinition/Data_alias/aliasdefinitionsub/entitygroup/entities/productprice/entityfields/contact_id/customproperties/translate4log/property.js</property>
-                  </customJDitoProperty>
                 </customProperties>
-                <dependencies>
-                  <entityDependency>
-                    <name>a8b943c0-cdd0-4be3-a23d-6daffa1c996e</name>
-                    <entityName>CONTACT</entityName>
-                    <fieldName>CONTACTID</fieldName>
-                  </entityDependency>
-                </dependencies>
               </entityFieldDb>
               <entityFieldDb>
                 <name>VALID_FROM</name>
@@ -2242,7 +2206,6 @@
             <idColumn>STOCKID</idColumn>
             <idGeneratorType v="0" />
             <idGeneratorInterval v="1" />
-            <documentation>%aditoprj%/aliasDefinition/Data_alias/aliasdefinitionsub/entitygroup/entities/stock/documentation.adoc</documentation>
             <title></title>
             <description></description>
             <auditSyncConfig>
@@ -2402,7 +2365,6 @@
             <idColumn>ISO2</idColumn>
             <idGeneratorType v="0" />
             <idGeneratorInterval v="1" />
-            <documentation>%aditoprj%/aliasDefinition/Data_alias/aliasdefinitionsub/entitygroup/entities/ab_countryinfo/documentation.adoc</documentation>
             <title></title>
             <description></description>
             <auditSyncConfig>
@@ -2581,7 +2543,6 @@
             <idColumn>OFFERID</idColumn>
             <idGeneratorType v="0" />
             <idGeneratorInterval v="1" />
-            <documentation>%aditoprj%/aliasDefinition/Data_alias/aliasdefinitionsub/entitygroup/entities/offer/documentation.adoc</documentation>
             <title></title>
             <description></description>
             <auditSyncConfig>
@@ -2765,13 +2726,6 @@
                     <property>%aditoprj%/aliasDefinition/Data_alias/aliasdefinitionsub/entitygroup/entities/offer/entityfields/contact_id/customproperties/translate4log/property.js</property>
                   </customJDitoProperty>
                 </customProperties>
-                <dependencies>
-                  <entityDependency>
-                    <name>77e369c9-c809-404d-bb2a-95cd1b8dd62e</name>
-                    <entityName>CONTACT</entityName>
-                    <fieldName>CONTACTID</fieldName>
-                  </entityDependency>
-                </dependencies>
               </entityFieldDb>
               <entityFieldDb>
                 <name>NET</name>
@@ -3088,7 +3042,6 @@
             <idColumn>OFFERITEMID</idColumn>
             <idGeneratorType v="0" />
             <idGeneratorInterval v="1" />
-            <documentation>%aditoprj%/aliasDefinition/Data_alias/aliasdefinitionsub/entitygroup/entities/offeritem/documentation.adoc</documentation>
             <title></title>
             <description></description>
             <auditSyncConfig>
@@ -3209,13 +3162,6 @@
                     <property>OFFER</property>
                   </customStringProperty>
                 </customProperties>
-                <dependencies>
-                  <entityDependency>
-                    <name>49169abb-4334-4c58-8668-0fd5e9b1df24</name>
-                    <entityName>OFFER</entityName>
-                    <fieldName>OFFERID</fieldName>
-                  </entityDependency>
-                </dependencies>
               </entityFieldDb>
               <entityFieldDb>
                 <name>OFFERITEMID</name>
@@ -3249,13 +3195,6 @@
                     <property v="true" />
                   </customBooleanProperty>
                 </customProperties>
-                <dependencies>
-                  <entityDependency>
-                    <name>7e57f7d7-3902-4c0f-be04-62fd61bf6154</name>
-                    <entityName>PRODUCT</entityName>
-                    <fieldName>PRODUCTID</fieldName>
-                  </entityDependency>
-                </dependencies>
               </entityFieldDb>
               <entityFieldDb>
                 <name>DISCOUNT</name>
@@ -3436,7 +3375,6 @@
             <idColumn>SALESPROJECTID</idColumn>
             <idGeneratorType v="0" />
             <idGeneratorInterval v="1" />
-            <documentation>%aditoprj%/aliasDefinition/Data_alias/aliasdefinitionsub/entitygroup/entities/salesproject/documentation.adoc</documentation>
             <title></title>
             <description></description>
             <auditSyncConfig>
@@ -3610,13 +3548,6 @@
                     <property>%aditoprj%/aliasDefinition/Data_alias/aliasdefinitionsub/entitygroup/entities/salesproject/entityfields/contact_id/customproperties/translate4log/property.js</property>
                   </customJDitoProperty>
                 </customProperties>
-                <dependencies>
-                  <entityDependency>
-                    <name>0a2f3157-9427-4a62-aa98-2baed6aecba6</name>
-                    <entityName>CONTACT</entityName>
-                    <fieldName>CONTACTID</fieldName>
-                  </entityDependency>
-                </dependencies>
               </entityFieldDb>
               <entityFieldDb>
                 <name>PROJECTTITLE</name>
@@ -3724,7 +3655,6 @@
             <idColumn>TIMETRACKINGID</idColumn>
             <idGeneratorType v="0" />
             <idGeneratorInterval v="1" />
-            <documentation>%aditoprj%/aliasDefinition/Data_alias/aliasdefinitionsub/entitygroup/entities/timetracking/documentation.adoc</documentation>
             <title></title>
             <description></description>
             <auditSyncConfig>
@@ -3791,13 +3721,6 @@
                     <property v="true" />
                   </customBooleanProperty>
                 </customProperties>
-                <dependencies>
-                  <entityDependency>
-                    <name>b59a9e9a-ab55-4b1c-bc62-fa4d930dc36d</name>
-                    <entityName>CONTACT</entityName>
-                    <fieldName>CONTACTID</fieldName>
-                  </entityDependency>
-                </dependencies>
               </entityFieldDb>
               <entityFieldDb>
                 <name>INFO</name>
@@ -3877,7 +3800,6 @@
             <idColumn>ACTIVITYID</idColumn>
             <idGeneratorType v="0" />
             <idGeneratorInterval v="1" />
-            <documentation>%aditoprj%/aliasDefinition/Data_alias/aliasdefinitionsub/entitygroup/entities/activity/documentation.adoc</documentation>
             <title></title>
             <description></description>
             <auditSyncConfig>
@@ -4364,13 +4286,6 @@
                     <property>%aditoprj%/aliasDefinition/Data_alias/aliasdefinitionsub/entitygroup/entities/salesorder/entityfields/contact_id/customproperties/translate4log/property.js</property>
                   </customJDitoProperty>
                 </customProperties>
-                <dependencies>
-                  <entityDependency>
-                    <name>8ccaf66c-44a2-4a80-a821-99b356b782ec</name>
-                    <entityName>CONTACT</entityName>
-                    <fieldName>CONTACTID</fieldName>
-                  </entityDependency>
-                </dependencies>
               </entityFieldDb>
               <entityFieldDb>
                 <name>NET</name>
@@ -4432,13 +4347,6 @@
                     <property>%aditoprj%/aliasDefinition/Data_alias/aliasdefinitionsub/entitygroup/entities/salesorder/entityfields/offer_id/customproperties/translate4log/property.js</property>
                   </customJDitoProperty>
                 </customProperties>
-                <dependencies>
-                  <entityDependency>
-                    <name>dca4dcc4-625b-4d29-a525-60496815c93a</name>
-                    <entityName>OFFER</entityName>
-                    <fieldName>OFFERID</fieldName>
-                  </entityDependency>
-                </dependencies>
               </entityFieldDb>
               <entityFieldDb>
                 <name>ISOLANGUAGE</name>
@@ -4601,9 +4509,9 @@
                 <name>UNPAID</name>
                 <dbName></dbName>
                 <primaryKey v="false" />
-                <columnType v="3" />
-                <size v="14" />
-                <scale v="2" />
+                <columnType v="4" />
+                <size v="10" />
+                <scale v="0" />
                 <notNull v="false" />
                 <isUnique v="false" />
                 <index v="false" />
@@ -4787,9 +4695,9 @@
                 <name>PAID</name>
                 <dbName></dbName>
                 <primaryKey v="false" />
-                <columnType v="3" />
-                <size v="14" />
-                <scale v="2" />
+                <columnType v="4" />
+                <size v="10" />
+                <scale v="0" />
                 <notNull v="false" />
                 <isUnique v="false" />
                 <index v="false" />
@@ -4983,13 +4891,6 @@
                     <global v="false" />
                   </customJDitoProperty>
                 </customProperties>
-                <dependencies>
-                  <entityDependency>
-                    <name>493ddfe2-9dde-4214-98d7-0ce557a68d4e</name>
-                    <entityName>PRODUCT</entityName>
-                    <fieldName>PRODUCTID</fieldName>
-                  </entityDependency>
-                </dependencies>
               </entityFieldDb>
               <entityFieldDb>
                 <name>DISCOUNT</name>
@@ -5131,13 +5032,6 @@
                     <property>SALESORDER</property>
                   </customStringProperty>
                 </customProperties>
-                <dependencies>
-                  <entityDependency>
-                    <name>8c51f477-536d-4a3e-ac92-7257b2b46742</name>
-                    <entityName>SALESORDER</entityName>
-                    <fieldName>SALESORDERID</fieldName>
-                  </entityDependency>
-                </dependencies>
               </entityFieldDb>
               <entityFieldDb>
                 <name>ASSIGNEDTO</name>
@@ -5224,7 +5118,6 @@
             <idColumn>TASKID</idColumn>
             <idGeneratorType v="0" />
             <idGeneratorInterval v="1" />
-            <documentation>%aditoprj%/aliasDefinition/Data_alias/aliasdefinitionsub/entitygroup/entities/task/documentation.adoc</documentation>
             <title></title>
             <description></description>
             <auditSyncConfig>
@@ -5308,13 +5201,6 @@
                     <property>%aditoprj%/aliasDefinition/Data_alias/aliasdefinitionsub/entitygroup/entities/task/entityfields/editor_contact_id/customproperties/translate4log/property.js</property>
                   </customJDitoProperty>
                 </customProperties>
-                <dependencies>
-                  <entityDependency>
-                    <name>f3b9dcbf-aee9-4436-9310-c03fb232ee32</name>
-                    <entityName>CONTACT</entityName>
-                    <fieldName>CONTACTID</fieldName>
-                  </entityDependency>
-                </dependencies>
               </entityFieldDb>
               <entityFieldDb>
                 <name>TASKID</name>
@@ -5402,13 +5288,6 @@
                     <property>%aditoprj%/aliasDefinition/Data_alias/aliasdefinitionsub/entitygroup/entities/task/entityfields/requestor_contact_id/customproperties/translate4log/property.js</property>
                   </customJDitoProperty>
                 </customProperties>
-                <dependencies>
-                  <entityDependency>
-                    <name>d5ba5511-466e-480c-adb8-e1391eba8180</name>
-                    <entityName>CONTACT</entityName>
-                    <fieldName>CONTACTID</fieldName>
-                  </entityDependency>
-                </dependencies>
               </entityFieldDb>
               <entityFieldDb>
                 <name>SUBJECT</name>
@@ -5718,7 +5597,6 @@
             <idColumn>AB_ATTRIBUTEUSAGEID</idColumn>
             <idGeneratorType v="0" />
             <idGeneratorInterval v="1" />
-            <documentation>%aditoprj%/aliasDefinition/Data_alias/aliasdefinitionsub/entitygroup/entities/ab_attributeusage/documentation.adoc</documentation>
             <title></title>
             <description></description>
             <auditSyncConfig>
@@ -5836,7 +5714,6 @@
             <idColumn>AB_ATTRIBUTEID</idColumn>
             <idGeneratorType v="0" />
             <idGeneratorInterval v="1" />
-            <documentation>%aditoprj%/aliasDefinition/Data_alias/aliasdefinitionsub/entitygroup/entities/ab_attribute/documentation.adoc</documentation>
             <title></title>
             <description></description>
             <auditSyncConfig>
@@ -5935,7 +5812,7 @@
                 <notNull v="false" />
                 <isUnique v="false" />
                 <index v="true" />
-                <documentation>%aditoprj%/aliasDefinition/Data_alias/aliasdefinitionsub/entitygroup/entities/ab_attribute/entityfields/attribute_parent_id/documentation.adoc</documentation>
+                <documentation></documentation>
                 <title>Superordinate Attribute</title>
                 <description></description>
                 <customProperties>
@@ -6031,7 +5908,6 @@
             <idColumn>AB_ATTRIBUTERELATIONID</idColumn>
             <idGeneratorType v="0" />
             <idGeneratorInterval v="1" />
-            <documentation>%aditoprj%/aliasDefinition/Data_alias/aliasdefinitionsub/entitygroup/entities/ab_attributerelation/documentation.adoc</documentation>
             <title></title>
             <description></description>
             <auditSyncConfig>
@@ -6355,13 +6231,6 @@
                     <property v="true" />
                   </customBooleanProperty>
                 </customProperties>
-                <dependencies>
-                  <entityDependency>
-                    <name>f83509a9-7882-446e-ba31-c176b577ea43</name>
-                    <entityName>ACTIVITY</entityName>
-                    <fieldName>ACTIVITYID</fieldName>
-                  </entityDependency>
-                </dependencies>
               </entityFieldDb>
               <entityFieldDb>
                 <name>OBJECT_TYPE</name>
@@ -6607,7 +6476,6 @@
             <idColumn>ISO3</idColumn>
             <idGeneratorType v="0" />
             <idGeneratorInterval v="1" />
-            <documentation>%aditoprj%/aliasDefinition/Data_alias/aliasdefinitionsub/entitygroup/entities/ab_language/documentation.adoc</documentation>
             <title></title>
             <description></description>
             <auditSyncConfig>
@@ -7069,7 +6937,7 @@
             <idColumn>TASKLINKID</idColumn>
             <idGeneratorType v="0" />
             <idGeneratorInterval v="1" />
-            <documentation>%aditoprj%/aliasDefinition/Data_alias/aliasdefinitionsub/entitygroup/entities/tasklink/documentation.adoc</documentation>
+            <documentation></documentation>
             <title></title>
             <description></description>
             <auditSyncConfig>
@@ -7157,13 +7025,6 @@
                     <property v="true" />
                   </customBooleanProperty>
                 </customProperties>
-                <dependencies>
-                  <entityDependency>
-                    <name>a03028c0-df78-4449-8781-04f811c8076c</name>
-                    <entityName>TASK</entityName>
-                    <fieldName>TASKID</fieldName>
-                  </entityDependency>
-                </dependencies>
               </entityFieldDb>
             </entityFields>
           </entityDb>
@@ -7326,7 +7187,7 @@
             <idColumn>SALUTATIONID</idColumn>
             <idGeneratorType v="0" />
             <idGeneratorInterval v="1" />
-            <documentation>%aditoprj%/aliasDefinition/Data_alias/aliasdefinitionsub/entitygroup/entities/salutation/documentation.adoc</documentation>
+            <documentation></documentation>
             <title></title>
             <description></description>
             <auditSyncConfig>
@@ -7500,6 +7361,7 @@
             <idColumn></idColumn>
             <idGeneratorType v="1" />
             <idGeneratorInterval v="1" />
+            <documentation></documentation>
             <title></title>
             <description></description>
             <auditSyncConfig>
@@ -7813,6 +7675,7 @@
             <idColumn>ID</idColumn>
             <idGeneratorType v="1" />
             <idGeneratorInterval v="1" />
+            <documentation></documentation>
             <title></title>
             <description></description>
             <auditSyncConfig>
@@ -7908,7 +7771,7 @@
             <dbName></dbName>
             <idGeneratorType v="0" />
             <idGeneratorInterval v="1" />
-            <documentation>%aditoprj%/aliasDefinition/Data_alias/aliasdefinitionsub/entitygroup/entities/ab_loghistory/documentation.adoc</documentation>
+            <documentation></documentation>
             <title></title>
             <description></description>
             <auditSyncConfig>
@@ -8040,7 +7903,7 @@
             <idColumn>SALESPROJECT_MILESTONEID</idColumn>
             <idGeneratorType v="0" />
             <idGeneratorInterval v="1" />
-            <documentation>%aditoprj%/aliasDefinition/Data_alias/aliasdefinitionsub/entitygroup/entities/salesproject_milestone/documentation.adoc</documentation>
+            <documentation></documentation>
             <title></title>
             <description></description>
             <auditSyncConfig>
@@ -8093,13 +7956,6 @@
                     <property v="true" />
                   </customBooleanProperty>
                 </customProperties>
-                <dependencies>
-                  <entityDependency>
-                    <name>8b4e2e45-4e16-43e9-a231-709853522a8b</name>
-                    <entityName>SALESPROJECT</entityName>
-                    <fieldName>SALESPROJECTID</fieldName>
-                  </entityDependency>
-                </dependencies>
               </entityFieldDb>
               <entityFieldDb>
                 <name>DATE_END</name>
@@ -8186,7 +8042,7 @@
             <idColumn>CAMPAIGNPARTICIPANTID</idColumn>
             <idGeneratorType v="0" />
             <idGeneratorInterval v="1" />
-            <documentation>%aditoprj%/aliasDefinition/Data_alias/aliasdefinitionsub/entitygroup/entities/campaignparticipant/documentation.adoc</documentation>
+            <documentation></documentation>
             <title></title>
             <description></description>
             <auditSyncConfig>
@@ -8211,13 +8067,6 @@
                 <documentation></documentation>
                 <title></title>
                 <description></description>
-                <dependencies>
-                  <entityDependency>
-                    <name>8b82a111-3ca0-4382-bd70-e4507f805b7e</name>
-                    <entityName>CAMPAIGN</entityName>
-                    <fieldName>CAMPAIGNID</fieldName>
-                  </entityDependency>
-                </dependencies>
               </entityFieldDb>
               <entityFieldDb>
                 <name>CAMPAIGNPARTICIPANTID</name>
@@ -8260,13 +8109,6 @@
                 <documentation></documentation>
                 <title></title>
                 <description></description>
-                <dependencies>
-                  <entityDependency>
-                    <name>cfb5cc49-d342-48aa-8006-8c42e9090ff7</name>
-                    <entityName>CONTACT</entityName>
-                    <fieldName>CONTACTID</fieldName>
-                  </entityDependency>
-                </dependencies>
               </entityFieldDb>
               <entityFieldDb>
                 <name>DATE_NEW</name>
@@ -8323,13 +8165,6 @@
                 <documentation></documentation>
                 <title></title>
                 <description></description>
-                <dependencies>
-                  <entityDependency>
-                    <name>88fd6b78-4ace-4f03-80ee-d16a73c5e0eb</name>
-                    <entityName>CAMPAIGNSTEP</entityName>
-                    <fieldName>CAMPAIGNSTEPID</fieldName>
-                  </entityDependency>
-                </dependencies>
               </entityFieldDb>
             </entityFields>
           </entityDb>
@@ -8339,7 +8174,7 @@
             <idColumn>DOCUMENTTEMPLATEID</idColumn>
             <idGeneratorType v="0" />
             <idGeneratorInterval v="1" />
-            <documentation>%aditoprj%/aliasDefinition/Data_alias/aliasdefinitionsub/entitygroup/entities/documenttemplate/documentation.adoc</documentation>
+            <documentation></documentation>
             <title></title>
             <description></description>
             <auditSyncConfig>
@@ -8513,7 +8348,7 @@
             <idColumn>DOCUMENTTEMPLATELINKID</idColumn>
             <idGeneratorType v="0" />
             <idGeneratorInterval v="1" />
-            <documentation>%aditoprj%/aliasDefinition/Data_alias/aliasdefinitionsub/entitygroup/entities/documenttemplatelink/documentation.adoc</documentation>
+            <documentation></documentation>
             <title></title>
             <description></description>
             <auditSyncConfig>
@@ -8631,7 +8466,7 @@
             <idColumn>CAMPAIGNID</idColumn>
             <idGeneratorType v="0" />
             <idGeneratorInterval v="1" />
-            <documentation>%aditoprj%/aliasDefinition/Data_alias/aliasdefinitionsub/entitygroup/entities/campaign/documentation.adoc</documentation>
+            <documentation></documentation>
             <title></title>
             <description></description>
             <auditSyncConfig>
@@ -8684,13 +8519,6 @@
                 <documentation></documentation>
                 <title></title>
                 <description></description>
-                <dependencies>
-                  <entityDependency>
-                    <name>09fa1bdb-24f2-42a2-a577-d098bfba2f1b</name>
-                    <entityName>CONTACT</entityName>
-                    <fieldName>CONTACTID</fieldName>
-                  </entityDependency>
-                </dependencies>
               </entityFieldDb>
               <entityFieldDb>
                 <name>DATE_NEW</name>
@@ -8798,7 +8626,7 @@
             <idColumn>CAMPAIGNSTEPID</idColumn>
             <idGeneratorType v="0" />
             <idGeneratorInterval v="1" />
-            <documentation>%aditoprj%/aliasDefinition/Data_alias/aliasdefinitionsub/entitygroup/entities/campaignstep/documentation.adoc</documentation>
+            <documentation></documentation>
             <title></title>
             <description></description>
             <auditSyncConfig>
@@ -8823,13 +8651,6 @@
                 <documentation></documentation>
                 <title></title>
                 <description></description>
-                <dependencies>
-                  <entityDependency>
-                    <name>490118eb-5bac-4398-b80c-19e1dd2a1935</name>
-                    <entityName>CAMPAIGN</entityName>
-                    <fieldName>CAMPAIGNID</fieldName>
-                  </entityDependency>
-                </dependencies>
               </entityFieldDb>
               <entityFieldDb>
                 <name>DATE_EDIT</name>
@@ -8928,13 +8749,6 @@
                 <documentation></documentation>
                 <title></title>
                 <description></description>
-                <dependencies>
-                  <entityDependency>
-                    <name>9acfbd74-b640-4124-8acf-734af78f579b</name>
-                    <entityName>CONTACT</entityName>
-                    <fieldName>CONTACTID</fieldName>
-                  </entityDependency>
-                </dependencies>
               </entityFieldDb>
               <entityFieldDb>
                 <name>SORTING</name>
@@ -9056,7 +8870,7 @@
             <idColumn>CAMPAIGNPARTICIPANTLOGID</idColumn>
             <idGeneratorType v="0" />
             <idGeneratorInterval v="1" />
-            <documentation>%aditoprj%/aliasDefinition/Data_alias/aliasdefinitionsub/entitygroup/entities/campaignparticipantlog/documentation.adoc</documentation>
+            <documentation></documentation>
             <title></title>
             <description></description>
             <auditSyncConfig>
@@ -9081,13 +8895,6 @@
                 <documentation></documentation>
                 <title></title>
                 <description></description>
-                <dependencies>
-                  <entityDependency>
-                    <name>ea37a467-733c-47d7-bcad-72b99bd1f65c</name>
-                    <entityName>CAMPAIGN</entityName>
-                    <fieldName>CAMPAIGNID</fieldName>
-                  </entityDependency>
-                </dependencies>
               </entityFieldDb>
               <entityFieldDb>
                 <name>DATE_EDIT</name>
@@ -9116,13 +8923,6 @@
                 <documentation></documentation>
                 <title></title>
                 <description></description>
-                <dependencies>
-                  <entityDependency>
-                    <name>ce9a4c12-5021-4c4a-bbbf-7829f09555f3</name>
-                    <entityName>CAMPAIGNPARTICIPANT</entityName>
-                    <fieldName>CAMPAIGNPARTICIPANTID</fieldName>
-                  </entityDependency>
-                </dependencies>
               </entityFieldDb>
               <entityFieldDb>
                 <name>DATE_NEW</name>
@@ -9193,13 +8993,6 @@
                 <documentation></documentation>
                 <title></title>
                 <description></description>
-                <dependencies>
-                  <entityDependency>
-                    <name>99531847-67e5-4a87-bbfe-40873e85921e</name>
-                    <entityName>CAMPAIGNSTEP</entityName>
-                    <fieldName>CAMPAIGNSTEPID</fieldName>
-                  </entityDependency>
-                </dependencies>
               </entityFieldDb>
               <entityFieldDb>
                 <name>PREVIOUS_CAMPAIGNSTEP_ID</name>
@@ -9214,13 +9007,6 @@
                 <documentation></documentation>
                 <title></title>
                 <description></description>
-                <dependencies>
-                  <entityDependency>
-                    <name>afb04c8c-469e-4a89-a330-1ea9624d42bd</name>
-                    <entityName>CAMPAIGNSTEP</entityName>
-                    <fieldName>CAMPAIGNSTEPID</fieldName>
-                  </entityDependency>
-                </dependencies>
               </entityFieldDb>
             </entityFields>
           </entityDb>
@@ -9230,7 +9016,7 @@
             <idColumn>CAMPAIGNCOSTID</idColumn>
             <idGeneratorType v="0" />
             <idGeneratorInterval v="1" />
-            <documentation>%aditoprj%/aliasDefinition/Data_alias/aliasdefinitionsub/entitygroup/entities/campaigncost/documentation.adoc</documentation>
+            <documentation></documentation>
             <title></title>
             <description></description>
             <auditSyncConfig>
@@ -9255,13 +9041,6 @@
                 <documentation></documentation>
                 <title></title>
                 <description></description>
-                <dependencies>
-                  <entityDependency>
-                    <name>c2fd8b9c-4e2a-4290-8e5f-f5da327ad424</name>
-                    <entityName>CAMPAIGN</entityName>
-                    <fieldName>CAMPAIGNID</fieldName>
-                  </entityDependency>
-                </dependencies>
               </entityFieldDb>
               <entityFieldDb>
                 <name>DATE_EDIT</name>
@@ -9374,13 +9153,6 @@
                 <documentation></documentation>
                 <title></title>
                 <description></description>
-                <dependencies>
-                  <entityDependency>
-                    <name>972341d8-bfda-4a2b-82a6-39470c475af4</name>
-                    <entityName>CAMPAIGNSTEP</entityName>
-                    <fieldName>CAMPAIGNSTEPID</fieldName>
-                  </entityDependency>
-                </dependencies>
               </entityFieldDb>
             </entityFields>
           </entityDb>
@@ -9390,7 +9162,7 @@
             <idColumn>CLASSIFICATIONTYPEID</idColumn>
             <idGeneratorType v="0" />
             <idGeneratorInterval v="1" />
-            <documentation>%aditoprj%/aliasDefinition/Data_alias/aliasdefinitionsub/entitygroup/entities/classificationtype/documentation.adoc</documentation>
+            <documentation></documentation>
             <title></title>
             <description></description>
             <auditSyncConfig>
@@ -9466,7 +9238,7 @@
             <idColumn>CLASSIFICATIONID</idColumn>
             <idGeneratorType v="0" />
             <idGeneratorInterval v="1" />
-            <documentation>%aditoprj%/aliasDefinition/Data_alias/aliasdefinitionsub/entitygroup/entities/classification/documentation.adoc</documentation>
+            <documentation></documentation>
             <title></title>
             <description></description>
             <auditSyncConfig>
@@ -9491,13 +9263,6 @@
                 <documentation></documentation>
                 <title></title>
                 <description></description>
-                <dependencies>
-                  <entityDependency>
-                    <name>99de8b6e-5e34-4c5a-99d1-51c12bcaa99c</name>
-                    <entityName>CLASSIFICATIONTYPE</entityName>
-                    <fieldName>CLASSIFICATIONTYPEID</fieldName>
-                  </entityDependency>
-                </dependencies>
               </entityFieldDb>
               <entityFieldDb>
                 <name>OBJECT_ROWID</name>
@@ -9512,13 +9277,6 @@
                 <documentation></documentation>
                 <title></title>
                 <description></description>
-                <dependencies>
-                  <entityDependency>
-                    <name>1f1c15ab-7784-4e17-a59f-33eee8bdd766</name>
-                    <entityName>OBJECTMEMBER</entityName>
-                    <fieldName>OBJECT_ROWID</fieldName>
-                  </entityDependency>
-                </dependencies>
               </entityFieldDb>
               <entityFieldDb>
                 <name>CLASSIFICATIONSCORE_ID</name>
@@ -9533,13 +9291,6 @@
                 <documentation></documentation>
                 <title></title>
                 <description></description>
-                <dependencies>
-                  <entityDependency>
-                    <name>aeeb4a24-4e92-4f78-a98c-3c423678000a</name>
-                    <entityName>CLASSIFICATIONSCORE</entityName>
-                    <fieldName>CLASSIFICATIONSCOREID</fieldName>
-                  </entityDependency>
-                </dependencies>
               </entityFieldDb>
               <entityFieldDb>
                 <name>CLASSIFICATIONID</name>
@@ -9577,7 +9328,7 @@
             <idColumn>CLASSIFICATIONSCOREID</idColumn>
             <idGeneratorType v="0" />
             <idGeneratorInterval v="1" />
-            <documentation>%aditoprj%/aliasDefinition/Data_alias/aliasdefinitionsub/entitygroup/entities/classificationscore/documentation.adoc</documentation>
+            <documentation></documentation>
             <title></title>
             <description></description>
             <auditSyncConfig>
@@ -9658,13 +9409,6 @@
                 <documentation></documentation>
                 <title></title>
                 <description></description>
-                <dependencies>
-                  <entityDependency>
-                    <name>d9eb29b7-a77c-4b72-b98e-13a87bedfc2b</name>
-                    <entityName>CLASSIFICATIONTYPE</entityName>
-                    <fieldName>CLASSIFICATIONTYPE</fieldName>
-                  </entityDependency>
-                </dependencies>
               </entityFieldDb>
             </entityFields>
           </entityDb>
@@ -9674,7 +9418,7 @@
             <idColumn>FORECASTID</idColumn>
             <idGeneratorType v="0" />
             <idGeneratorInterval v="1" />
-            <documentation>%aditoprj%/aliasDefinition/Data_alias/aliasdefinitionsub/entitygroup/entities/forecast/documentation.adoc</documentation>
+            <documentation></documentation>
             <title></title>
             <description></description>
             <auditSyncConfig>
@@ -9699,13 +9443,6 @@
                 <documentation></documentation>
                 <title></title>
                 <description></description>
-                <dependencies>
-                  <entityDependency>
-                    <name>a1759554-192b-49fa-b6a8-b982115f71ab</name>
-                    <entityName>OBJECTMEMBER</entityName>
-                    <fieldName>OBJECT_ROWID</fieldName>
-                  </entityDependency>
-                </dependencies>
               </entityFieldDb>
               <entityFieldDb>
                 <name>GROUPCODE</name>
@@ -9799,7 +9536,7 @@
             <idColumn>COMPETITIONID</idColumn>
             <idGeneratorType v="0" />
             <idGeneratorInterval v="1" />
-            <documentation>%aditoprj%/aliasDefinition/Data_alias/aliasdefinitionsub/entitygroup/entities/competition/documentation.adoc</documentation>
+            <documentation></documentation>
             <title></title>
             <description></description>
             <auditSyncConfig>
@@ -9866,13 +9603,6 @@
                 <documentation></documentation>
                 <title></title>
                 <description></description>
-                <dependencies>
-                  <entityDependency>
-                    <name>b2a38bff-3d1a-45e4-b940-1c01af46e2c1</name>
-                    <entityName>CONTACT</entityName>
-                    <fieldName>CONTACTID</fieldName>
-                  </entityDependency>
-                </dependencies>
               </entityFieldDb>
               <entityFieldDb>
                 <name>COMPETITIONID</name>
@@ -9952,7 +9682,7 @@
             <idColumn>COMMRESTRICTIONID</idColumn>
             <idGeneratorType v="0" />
             <idGeneratorInterval v="1" />
-            <documentation>%aditoprj%/aliasDefinition/Data_alias/aliasdefinitionsub/entitygroup/entities/commrestriction/documentation.adoc</documentation>
+            <documentation></documentation>
             <title></title>
             <description></description>
             <auditSyncConfig>
@@ -10033,13 +9763,6 @@
                 <documentation></documentation>
                 <title></title>
                 <description></description>
-                <dependencies>
-                  <entityDependency>
-                    <name>02f366e1-7356-4bd7-9b78-dd49b763a2e1</name>
-                    <entityName>CONTACT</entityName>
-                    <fieldName>CONTACTID</fieldName>
-                  </entityDependency>
-                </dependencies>
               </entityFieldDb>
               <entityFieldDb>
                 <name>REASON</name>
@@ -10063,7 +9786,7 @@
             <idColumn>BULKMAILID</idColumn>
             <idGeneratorType v="0" />
             <idGeneratorInterval v="1" />
-            <documentation>%aditoprj%/aliasDefinition/Data_alias/aliasdefinitionsub/entitygroup/entities/bulkmail/documentation.adoc</documentation>
+            <documentation></documentation>
             <title></title>
             <description></description>
             <auditSyncConfig>
@@ -10085,7 +9808,7 @@
                 <notNull v="false" />
                 <isUnique v="false" />
                 <index v="true" />
-                <documentation>%aditoprj%/aliasDefinition/Data_alias/aliasdefinitionsub/entitygroup/entities/bulkmail/entityfields/documenttemplate_id/documentation.adoc</documentation>
+                <documentation></documentation>
                 <title>Document Template</title>
                 <description></description>
                 <customProperties>
@@ -10100,13 +9823,6 @@
                     <property>%aditoprj%/aliasDefinition/Data_alias/aliasdefinitionsub/entitygroup/entities/bulkmail/entityfields/documenttemplate_id/customproperties/translate4log/property.js</property>
                   </customJDitoProperty>
                 </customProperties>
-                <dependencies>
-                  <entityDependency>
-                    <name>ce13c1b7-2a63-4275-9e2e-c51078d972ef</name>
-                    <entityName>DOCUMENTTEMPLATE</entityName>
-                    <fieldName>DOCUMENTTEMPLATEID</fieldName>
-                  </entityDependency>
-                </dependencies>
               </entityFieldDb>
               <entityFieldDb>
                 <name>BULKMAILID</name>
@@ -10284,7 +10000,7 @@
             <idColumn>BULKMAILRECIPIENTID</idColumn>
             <idGeneratorType v="0" />
             <idGeneratorInterval v="1" />
-            <documentation>%aditoprj%/aliasDefinition/Data_alias/aliasdefinitionsub/entitygroup/entities/bulkmailrecipient/documentation.adoc</documentation>
+            <documentation></documentation>
             <title></title>
             <description></description>
             <auditSyncConfig>
@@ -10323,13 +10039,6 @@
                 <documentation></documentation>
                 <title></title>
                 <description></description>
-                <dependencies>
-                  <entityDependency>
-                    <name>bdcbf4b9-6bed-496d-80cf-7ec7d081e7fa</name>
-                    <entityName>BULKMAIL</entityName>
-                    <fieldName>BULKMAILID</fieldName>
-                  </entityDependency>
-                </dependencies>
               </entityFieldDb>
               <entityFieldDb>
                 <name>BULKMAILRECIPIENTID</name>
@@ -10358,13 +10067,6 @@
                 <documentation></documentation>
                 <title></title>
                 <description></description>
-                <dependencies>
-                  <entityDependency>
-                    <name>637b1a29-8f20-436d-9f5b-26c650941fb0</name>
-                    <entityName>CONTACT</entityName>
-                    <fieldName>CONTACTID</fieldName>
-                  </entityDependency>
-                </dependencies>
               </entityFieldDb>
               <entityFieldDb>
                 <name>SENTDATE</name>
@@ -10416,7 +10118,7 @@
             <idColumn>TICKETID</idColumn>
             <idGeneratorType v="0" />
             <idGeneratorInterval v="1" />
-            <documentation>%aditoprj%/aliasDefinition/Data_alias/aliasdefinitionsub/entitygroup/entities/ticket/documentation.adoc</documentation>
+            <documentation></documentation>
             <title></title>
             <description></description>
             <auditSyncConfig>
@@ -10469,13 +10171,6 @@
                 <documentation></documentation>
                 <title></title>
                 <description></description>
-                <dependencies>
-                  <entityDependency>
-                    <name>9f25a871-5d9b-480c-8ac2-12a26f557d7f</name>
-                    <entityName>TASK</entityName>
-                    <fieldName>TASKID</fieldName>
-                  </entityDependency>
-                </dependencies>
               </entityFieldDb>
               <entityFieldDb>
                 <name>TICKETTYPE</name>
@@ -10566,13 +10261,6 @@
                 <documentation></documentation>
                 <title></title>
                 <description></description>
-                <dependencies>
-                  <entityDependency>
-                    <name>de3799fa-b558-4dc3-8eff-3a9468c098d7</name>
-                    <entityName>CONTACT</entityName>
-                    <fieldName>CONTACTID</fieldName>
-                  </entityDependency>
-                </dependencies>
               </entityFieldDb>
               <entityFieldDb>
                 <name>DATE_NEW</name>
@@ -10680,8 +10368,9 @@
             <idColumn>DESCRIPTIONTRANSLATIONID</idColumn>
             <idGeneratorType v="0" />
             <idGeneratorInterval v="1" />
-            <documentation>%aditoprj%/aliasDefinition/Data_alias/aliasdefinitionsub/entitygroup/entities/descriptiontranslation/documentation.adoc</documentation>
+            <documentation></documentation>
             <title></title>
+            <description></description>
             <auditSyncConfig>
               <name>auditSyncConfig</name>
               <auditMode v="0" />
@@ -10704,13 +10393,6 @@
                 <documentation></documentation>
                 <title></title>
                 <description></description>
-                <dependencies>
-                  <entityDependency>
-                    <name>0397ff2a-4405-4c41-8122-5f38167625be</name>
-                    <entityName>OBJECTMEMBER</entityName>
-                    <fieldName>OBJECT_ROWID</fieldName>
-                  </entityDependency>
-                </dependencies>
               </entityFieldDb>
               <entityFieldDb>
                 <name>DESCRIPTIONTRANSLATIONID</name>
@@ -10764,7 +10446,7 @@
                 <notNull v="false" />
                 <isUnique v="false" />
                 <index v="false" />
-                <documentation>%aditoprj%/aliasDefinition/Data_alias/aliasdefinitionsub/entitygroup/entities/descriptiontranslation/entityfields/lang/documentation.adoc</documentation>
+                <documentation></documentation>
                 <title></title>
                 <description></description>
               </entityFieldDb>
@@ -10776,7 +10458,7 @@
             <idColumn>AB_UNLINKEDMAILID</idColumn>
             <idGeneratorType v="0" />
             <idGeneratorInterval v="1" />
-            <documentation>%aditoprj%/aliasDefinition/Data_alias/aliasdefinitionsub/entitygroup/entities/ab_unlinkedmail/documentation.adoc</documentation>
+            <documentation></documentation>
             <title></title>
             <description></description>
             <auditSyncConfig>
@@ -10936,8 +10618,9 @@
             <idColumn>AB_CTILOGID</idColumn>
             <idGeneratorType v="0" />
             <idGeneratorInterval v="1" />
-            <documentation>%aditoprj%/aliasDefinition/Data_alias/aliasdefinitionsub/entitygroup/entities/ab_ctilog/documentation.adoc</documentation>
+            <documentation></documentation>
             <title></title>
+            <description></description>
             <auditSyncConfig>
               <name>auditSyncConfig</name>
               <auditMode v="0" />
@@ -11162,13 +10845,6 @@
                 <documentation></documentation>
                 <title></title>
                 <description></description>
-                <dependencies>
-                  <entityDependency>
-                    <name>74635747-d666-4886-9354-3173f8c8983a</name>
-                    <entityName>CONTACT</entityName>
-                    <fieldName>CONTACTID</fieldName>
-                  </entityDependency>
-                </dependencies>
               </entityFieldDb>
             </entityFields>
           </entityDb>
@@ -11178,7 +10854,7 @@
             <idColumn>LETTERRECIPIENTID</idColumn>
             <idGeneratorType v="0" />
             <idGeneratorInterval v="1" />
-            <documentation>%aditoprj%/aliasDefinition/Data_alias/aliasdefinitionsub/entitygroup/entities/letterrecipient/documentation.adoc</documentation>
+            <documentation></documentation>
             <title></title>
             <description></description>
             <auditSyncConfig>
@@ -11203,13 +10879,6 @@
                 <documentation></documentation>
                 <title></title>
                 <description></description>
-                <dependencies>
-                  <entityDependency>
-                    <name>44c3a8d3-b40e-4151-ad86-2024c255c348</name>
-                    <entityName>SERIALLETTER</entityName>
-                    <fieldName>SERIALLETTERID</fieldName>
-                  </entityDependency>
-                </dependencies>
               </entityFieldDb>
               <entityFieldDb>
                 <name>LETTERRECIPIENTID</name>
@@ -11238,13 +10907,6 @@
                 <documentation></documentation>
                 <title></title>
                 <description></description>
-                <dependencies>
-                  <entityDependency>
-                    <name>c965c60a-3d92-407e-a27a-0a638760d2b3</name>
-                    <entityName>CONTACT</entityName>
-                    <fieldName>CONTACTID</fieldName>
-                  </entityDependency>
-                </dependencies>
               </entityFieldDb>
             </entityFields>
           </entityDb>
@@ -11254,7 +10916,7 @@
             <idColumn>SERIALLETTERID</idColumn>
             <idGeneratorType v="0" />
             <idGeneratorInterval v="1" />
-            <documentation>%aditoprj%/aliasDefinition/Data_alias/aliasdefinitionsub/entitygroup/entities/serialletter/documentation.adoc</documentation>
+            <documentation></documentation>
             <title></title>
             <description></description>
             <auditSyncConfig>
@@ -11460,7 +11122,7 @@
             <idColumn>SALESPROJECT_TOUCHPOINTID</idColumn>
             <idGeneratorType v="0" />
             <idGeneratorInterval v="1" />
-            <documentation>%aditoprj%/aliasDefinition/Data_alias/aliasdefinitionsub/entitygroup/entities/salesproject_touchpoint/documentation.adoc</documentation>
+            <documentation></documentation>
             <title></title>
             <description></description>
             <auditSyncConfig>
@@ -11541,13 +11203,6 @@
                 <documentation></documentation>
                 <title></title>
                 <description></description>
-                <dependencies>
-                  <entityDependency>
-                    <name>e432f140-04db-464f-84a1-620c58709a26</name>
-                    <entityName>SALESPROJECT_MILESTONE</entityName>
-                    <fieldName>SALESPROJECT_ID</fieldName>
-                  </entityDependency>
-                </dependencies>
               </entityFieldDb>
             </entityFields>
           </entityDb>
@@ -11908,13 +11563,6 @@
                 <documentation></documentation>
                 <title></title>
                 <description></description>
-                <dependencies>
-                  <entityDependency>
-                    <name>9b123a17-2f41-49f8-9492-f386ece46f7c</name>
-                    <entityName>DUPLICATESCANNER</entityName>
-                    <fieldName>ID</fieldName>
-                  </entityDependency>
-                </dependencies>
               </entityFieldDb>
               <entityFieldDb>
                 <name>DATE_NEW</name>
@@ -11994,7 +11642,7 @@
             <idColumn>LEADLOGID</idColumn>
             <idGeneratorType v="0" />
             <idGeneratorInterval v="1" />
-            <documentation>%aditoprj%/aliasDefinition/Data_alias/aliasdefinitionsub/entitygroup/entities/leadlog/documentation.adoc</documentation>
+            <documentation></documentation>
             <title></title>
             <description></description>
             <auditSyncConfig>
@@ -12131,13 +11779,6 @@
                 <documentation></documentation>
                 <title></title>
                 <description></description>
-                <dependencies>
-                  <entityDependency>
-                    <name>1dcb1dbc-9294-43a2-b7a7-0cbc66a151e7</name>
-                    <entityName>LEADIMPORT</entityName>
-                    <fieldName>LEADIMPORTID</fieldName>
-                  </entityDependency>
-                </dependencies>
               </entityFieldDb>
               <entityFieldDb>
                 <name>USER_EDIT</name>
@@ -12671,7 +12312,7 @@
             <idColumn>LEADIMPORTID</idColumn>
             <idGeneratorType v="0" />
             <idGeneratorInterval v="1" />
-            <documentation>%aditoprj%/aliasDefinition/Data_alias/aliasdefinitionsub/entitygroup/entities/leadimport/documentation.adoc</documentation>
+            <documentation></documentation>
             <title></title>
             <description></description>
             <auditSyncConfig>
@@ -13010,13 +12651,6 @@
                 <documentation></documentation>
                 <title></title>
                 <description></description>
-                <dependencies>
-                  <entityDependency>
-                    <name>e8d3b2fc-6c20-4fcb-96fe-f38fc461a25b</name>
-                    <entityName>LEADIMPORT</entityName>
-                    <fieldName>LEADIMPORTID</fieldName>
-                  </entityDependency>
-                </dependencies>
               </entityFieldDb>
               <entityFieldDb>
                 <name>USER_EDIT</name>
@@ -13040,7 +12674,7 @@
             <idColumn>LEADID</idColumn>
             <idGeneratorType v="0" />
             <idGeneratorInterval v="1" />
-            <documentation>%aditoprj%/aliasDefinition/Data_alias/aliasdefinitionsub/entitygroup/entities/lead/documentation.adoc</documentation>
+            <documentation></documentation>
             <title></title>
             <description></description>
             <auditSyncConfig>
@@ -13303,13 +12937,6 @@
                 <documentation></documentation>
                 <title></title>
                 <description></description>
-                <dependencies>
-                  <entityDependency>
-                    <name>14ab15d3-99fc-4c58-9c4a-c2ec404e5c67</name>
-                    <entityName>LEADIMPORT</entityName>
-                    <fieldName>LEADIMPORTID</fieldName>
-                  </entityDependency>
-                </dependencies>
               </entityFieldDb>
               <entityFieldDb>
                 <name>BUILDINGNO</name>
@@ -13478,13 +13105,6 @@
                 <documentation></documentation>
                 <title></title>
                 <description></description>
-                <dependencies>
-                  <entityDependency>
-                    <name>b3823998-cf9c-4fa1-914c-6158945e9863</name>
-                    <entityName>PERSON</entityName>
-                    <fieldName>PERSONID</fieldName>
-                  </entityDependency>
-                </dependencies>
               </entityFieldDb>
               <entityFieldDb>
                 <name>ADDRESS</name>
@@ -13639,13 +13259,6 @@
                 <documentation></documentation>
                 <title></title>
                 <description></description>
-                <dependencies>
-                  <entityDependency>
-                    <name>abfbfb1e-678a-409b-a5cb-a87c8332478f</name>
-                    <entityName>ORGANISATION</entityName>
-                    <fieldName>ORGANISATIONID</fieldName>
-                  </entityDependency>
-                </dependencies>
               </entityFieldDb>
               <entityFieldDb>
                 <name>LEADID</name>
@@ -13953,20 +13566,6 @@
                 <title></title>
                 <description></description>
               </entityFieldDb>
-              <entityFieldDb>
-                <name>VARIABLES</name>
-                <dbName></dbName>
-                <primaryKey v="false" />
-                <columnType v="12" />
-                <size v="512" />
-                <scale v="0" />
-                <notNull v="false" />
-                <isUnique v="false" />
-                <index v="false" />
-                <documentation></documentation>
-                <title></title>
-                <description></description>
-              </entityFieldDb>
             </entityFields>
           </entityDb>
           <entityDb>
@@ -13975,7 +13574,7 @@
             <idColumn>EXPORTTEMPLATEPLACEOFUSEID</idColumn>
             <idGeneratorType v="0" />
             <idGeneratorInterval v="1" />
-            <documentation>%aditoprj%/aliasDefinition/Data_alias/aliasdefinitionsub/entitygroup/entities/exporttemplateplaceofuse/documentation.adoc</documentation>
+            <documentation></documentation>
             <title></title>
             <description></description>
             <auditSyncConfig>
@@ -14044,7 +13643,7 @@
             <idColumn>DOCUMENTTEMPLATEPLACEOFUSEID</idColumn>
             <idGeneratorType v="0" />
             <idGeneratorInterval v="1" />
-            <documentation>%aditoprj%/aliasDefinition/Data_alias/aliasdefinitionsub/entitygroup/entities/documenttemplateplaceofuse/documentation.adoc</documentation>
+            <documentation></documentation>
             <title></title>
             <description></description>
             <auditSyncConfig>
@@ -14069,13 +13668,6 @@
                 <documentation></documentation>
                 <title></title>
                 <description></description>
-                <dependencies>
-                  <entityDependency>
-                    <name>14bbdba4-88c2-4cf3-aaa6-71328e590968</name>
-                    <entityName>DOCUMENTTEMPLATE</entityName>
-                    <fieldName>DOCUMENTTEMPLATEID</fieldName>
-                  </entityDependency>
-                </dependencies>
               </entityFieldDb>
               <entityFieldDb>
                 <name>PLACEOFUSE</name>
@@ -14113,7 +13705,7 @@
             <idColumn>EXPORTTEMPLATEID</idColumn>
             <idGeneratorType v="0" />
             <idGeneratorInterval v="1" />
-            <documentation>%aditoprj%/aliasDefinition/Data_alias/aliasdefinitionsub/entitygroup/entities/exporttemplate/documentation.adoc</documentation>
+            <documentation></documentation>
             <title></title>
             <description></description>
             <auditSyncConfig>
@@ -14167,6 +13759,20 @@
                 <title></title>
                 <description></description>
               </entityFieldDb>
+              <entityFieldDb>
+                <name>SEPARATOR</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="12" />
+                <size v="36" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
               <entityFieldDb>
                 <name>EXPORTTEMPLATEID</name>
                 <dbName></dbName>
@@ -14237,48 +13843,6 @@
                 <title></title>
                 <description></description>
               </entityFieldDb>
-              <entityFieldDb>
-                <name>FIELDSEPARATOR</name>
-                <dbName></dbName>
-                <primaryKey v="false" />
-                <columnType v="12" />
-                <size v="36" />
-                <scale v="0" />
-                <notNull v="false" />
-                <isUnique v="false" />
-                <index v="false" />
-                <documentation></documentation>
-                <title></title>
-                <description></description>
-              </entityFieldDb>
-              <entityFieldDb>
-                <name>SENTENCESEPARATOR</name>
-                <dbName></dbName>
-                <primaryKey v="false" />
-                <columnType v="12" />
-                <size v="36" />
-                <scale v="0" />
-                <notNull v="false" />
-                <isUnique v="false" />
-                <index v="false" />
-                <documentation></documentation>
-                <title></title>
-                <description></description>
-              </entityFieldDb>
-              <entityFieldDb>
-                <name>FIELDDELIMITER</name>
-                <dbName></dbName>
-                <primaryKey v="false" />
-                <columnType v="12" />
-                <size v="36" />
-                <scale v="0" />
-                <notNull v="false" />
-                <isUnique v="false" />
-                <index v="false" />
-                <documentation></documentation>
-                <title></title>
-                <description></description>
-              </entityFieldDb>
             </entityFields>
           </entityDb>
           <entityDb>
@@ -14287,7 +13851,7 @@
             <idColumn>EXPORTTEMPLATEFIELDID</idColumn>
             <idGeneratorType v="0" />
             <idGeneratorInterval v="1" />
-            <documentation>%aditoprj%/aliasDefinition/Data_alias/aliasdefinitionsub/entitygroup/entities/exporttemplatefield/documentation.adoc</documentation>
+            <documentation></documentation>
             <title></title>
             <description></description>
             <auditSyncConfig>
@@ -14354,13 +13918,6 @@
                 <documentation></documentation>
                 <title></title>
                 <description></description>
-                <dependencies>
-                  <entityDependency>
-                    <name>b5bdf0af-cfed-4718-bcb6-9f8ff24842dd</name>
-                    <entityName>EXPORTTEMPLATE</entityName>
-                    <fieldName>EXPORTTEMPLATEID</fieldName>
-                  </entityDependency>
-                </dependencies>
               </entityFieldDb>
             </entityFields>
           </entityDb>
@@ -14370,7 +13927,7 @@
             <idColumn>EXPORTTEMPLATESELECTIONID</idColumn>
             <idGeneratorType v="0" />
             <idGeneratorInterval v="1" />
-            <documentation>%aditoprj%/aliasDefinition/Data_alias/aliasdefinitionsub/entitygroup/entities/exporttemplateselection/documentation.adoc</documentation>
+            <documentation></documentation>
             <title></title>
             <description></description>
             <auditSyncConfig>
@@ -14593,360 +14150,6 @@
               </entityFieldDb>
             </entityFields>
           </entityDb>
-          <entityDb>
-            <name>VISITRECOMMENDATION</name>
-            <dbName></dbName>
-            <idColumn>VISITRECOMMENDATIONID</idColumn>
-            <idGeneratorType v="0" />
-            <idGeneratorInterval v="1" />
-            <documentation></documentation>
-            <title></title>
-            <description></description>
-            <auditSyncConfig>
-              <name>auditSyncConfig</name>
-              <auditMode v="0" />
-              <syncActive v="false" />
-              <syncComplete v="true" />
-              <syncDirection v="1" />
-              <syncIds></syncIds>
-            </auditSyncConfig>
-            <entityFields>
-              <entityFieldDb>
-                <name>DUE_DATE</name>
-                <dbName></dbName>
-                <primaryKey v="false" />
-                <columnType v="93" />
-                <size v="29" />
-                <scale v="9" />
-                <notNull v="false" />
-                <isUnique v="false" />
-                <index v="false" />
-                <documentation></documentation>
-                <title></title>
-                <description></description>
-              </entityFieldDb>
-              <entityFieldDb>
-                <name>SOURCE</name>
-                <dbName></dbName>
-                <primaryKey v="false" />
-                <columnType v="12" />
-                <size v="255" />
-                <scale v="0" />
-                <notNull v="false" />
-                <isUnique v="false" />
-                <index v="false" />
-                <documentation></documentation>
-                <title></title>
-                <description></description>
-              </entityFieldDb>
-              <entityFieldDb>
-                <name>VISITRECOMMENDATIONID</name>
-                <dbName></dbName>
-                <primaryKey v="true" />
-                <columnType v="1" />
-                <size v="36" />
-                <scale v="0" />
-                <notNull v="true" />
-                <isUnique v="true" />
-                <index v="true" />
-                <documentation></documentation>
-                <title></title>
-                <description></description>
-              </entityFieldDb>
-              <entityFieldDb>
-                <name>CONTACT_ID</name>
-                <dbName></dbName>
-                <primaryKey v="false" />
-                <columnType v="1" />
-                <size v="36" />
-                <scale v="0" />
-                <notNull v="false" />
-                <isUnique v="false" />
-                <index v="false" />
-                <documentation></documentation>
-                <title></title>
-                <description></description>
-              </entityFieldDb>
-              <entityFieldDb>
-                <name>PRIORITY</name>
-                <dbName></dbName>
-                <primaryKey v="false" />
-                <columnType v="1" />
-                <size v="36" />
-                <scale v="0" />
-                <notNull v="false" />
-                <isUnique v="false" />
-                <index v="false" />
-                <documentation></documentation>
-                <title></title>
-                <description></description>
-              </entityFieldDb>
-              <entityFieldDb>
-                <name>INFO</name>
-                <dbName></dbName>
-                <primaryKey v="false" />
-                <columnType v="2005" />
-                <size v="2147483647" />
-                <scale v="0" />
-                <notNull v="false" />
-                <isUnique v="false" />
-                <index v="false" />
-                <documentation></documentation>
-                <title></title>
-                <description></description>
-              </entityFieldDb>
-            </entityFields>
-          </entityDb>
-          <entityDb>
-            <name>VISITPLANEMPLOYEEWEEK</name>
-            <dbName></dbName>
-            <idColumn>VISITPLANEMPLOYEEWEEKID</idColumn>
-            <idGeneratorType v="0" />
-            <idGeneratorInterval v="1" />
-            <documentation></documentation>
-            <title></title>
-            <description></description>
-            <auditSyncConfig>
-              <name>auditSyncConfig</name>
-              <auditMode v="0" />
-              <syncActive v="false" />
-              <syncComplete v="true" />
-              <syncDirection v="1" />
-              <syncIds></syncIds>
-            </auditSyncConfig>
-            <entityFields>
-              <entityFieldDb>
-                <name>VISITPLANEMPLOYEEWEEKID</name>
-                <dbName></dbName>
-                <primaryKey v="true" />
-                <columnType v="1" />
-                <size v="36" />
-                <scale v="0" />
-                <notNull v="true" />
-                <isUnique v="true" />
-                <index v="true" />
-                <documentation></documentation>
-                <title></title>
-                <description></description>
-              </entityFieldDb>
-              <entityFieldDb>
-                <name>CONTACT_ID</name>
-                <dbName></dbName>
-                <primaryKey v="false" />
-                <columnType v="1" />
-                <size v="36" />
-                <scale v="0" />
-                <notNull v="false" />
-                <isUnique v="false" />
-                <index v="false" />
-                <documentation></documentation>
-                <title></title>
-                <description></description>
-              </entityFieldDb>
-              <entityFieldDb>
-                <name>VISITPLAN_WEEK</name>
-                <dbName></dbName>
-                <primaryKey v="false" />
-                <columnType v="4" />
-                <size v="10" />
-                <scale v="0" />
-                <notNull v="false" />
-                <isUnique v="false" />
-                <index v="false" />
-                <documentation></documentation>
-                <title></title>
-                <description></description>
-              </entityFieldDb>
-              <entityFieldDb>
-                <name>INFO</name>
-                <dbName></dbName>
-                <primaryKey v="false" />
-                <columnType v="2005" />
-                <size v="2147483647" />
-                <scale v="0" />
-                <notNull v="false" />
-                <isUnique v="false" />
-                <index v="false" />
-                <documentation></documentation>
-                <title></title>
-                <description></description>
-              </entityFieldDb>
-              <entityFieldDb>
-                <name>VISITPLAN_YEAR</name>
-                <dbName></dbName>
-                <primaryKey v="false" />
-                <columnType v="4" />
-                <size v="10" />
-                <scale v="0" />
-                <notNull v="false" />
-                <isUnique v="false" />
-                <index v="false" />
-                <documentation></documentation>
-                <title></title>
-                <description></description>
-              </entityFieldDb>
-            </entityFields>
-          </entityDb>
-          <entityDb>
-            <name>VISITPLANENTRY</name>
-            <dbName></dbName>
-            <idColumn>VISITPLANENTRYID</idColumn>
-            <idGeneratorType v="0" />
-            <idGeneratorInterval v="1" />
-            <documentation></documentation>
-            <title></title>
-            <description></description>
-            <auditSyncConfig>
-              <name>auditSyncConfig</name>
-              <auditMode v="0" />
-              <syncActive v="false" />
-              <syncComplete v="true" />
-              <syncDirection v="1" />
-              <syncIds></syncIds>
-            </auditSyncConfig>
-            <entityFields>
-              <entityFieldDb>
-                <name>STATUS</name>
-                <dbName></dbName>
-                <primaryKey v="false" />
-                <columnType v="1" />
-                <size v="36" />
-                <scale v="0" />
-                <notNull v="false" />
-                <isUnique v="false" />
-                <index v="false" />
-                <documentation></documentation>
-                <title></title>
-                <description></description>
-              </entityFieldDb>
-              <entityFieldDb>
-                <name>END_TIME</name>
-                <dbName></dbName>
-                <primaryKey v="false" />
-                <columnType v="92" />
-                <size v="8" />
-                <scale v="0" />
-                <notNull v="false" />
-                <isUnique v="false" />
-                <index v="false" />
-                <documentation></documentation>
-                <title></title>
-                <description></description>
-              </entityFieldDb>
-              <entityFieldDb>
-                <name>BEGIN_TIME</name>
-                <dbName></dbName>
-                <primaryKey v="false" />
-                <columnType v="92" />
-                <size v="8" />
-                <scale v="0" />
-                <notNull v="false" />
-                <isUnique v="false" />
-                <index v="false" />
-                <documentation></documentation>
-                <title></title>
-                <description></description>
-              </entityFieldDb>
-              <entityFieldDb>
-                <name>VISITPLANEMPLOYEEWEEK_ID</name>
-                <dbName></dbName>
-                <primaryKey v="false" />
-                <columnType v="1" />
-                <size v="36" />
-                <scale v="0" />
-                <notNull v="false" />
-                <isUnique v="false" />
-                <index v="false" />
-                <documentation></documentation>
-                <title></title>
-                <description></description>
-              </entityFieldDb>
-              <entityFieldDb>
-                <name>VISITRECOMMENDATION_ID</name>
-                <dbName></dbName>
-                <primaryKey v="false" />
-                <columnType v="1" />
-                <size v="36" />
-                <scale v="0" />
-                <notNull v="false" />
-                <isUnique v="false" />
-                <index v="false" />
-                <documentation></documentation>
-                <title></title>
-                <description></description>
-              </entityFieldDb>
-              <entityFieldDb>
-                <name>ORGANISATION_ID</name>
-                <dbName></dbName>
-                <primaryKey v="false" />
-                <columnType v="1" />
-                <size v="36" />
-                <scale v="0" />
-                <notNull v="false" />
-                <isUnique v="false" />
-                <index v="false" />
-                <documentation></documentation>
-                <title></title>
-                <description></description>
-              </entityFieldDb>
-              <entityFieldDb>
-                <name>VISITPLANENTRYID</name>
-                <dbName></dbName>
-                <primaryKey v="true" />
-                <columnType v="1" />
-                <size v="36" />
-                <scale v="0" />
-                <notNull v="true" />
-                <isUnique v="true" />
-                <index v="true" />
-                <documentation></documentation>
-                <title></title>
-                <description></description>
-              </entityFieldDb>
-              <entityFieldDb>
-                <name>APPOINTMENT_ID</name>
-                <dbName></dbName>
-                <primaryKey v="false" />
-                <columnType v="1" />
-                <size v="36" />
-                <scale v="0" />
-                <notNull v="false" />
-                <isUnique v="false" />
-                <index v="false" />
-                <documentation></documentation>
-                <title></title>
-                <description></description>
-              </entityFieldDb>
-              <entityFieldDb>
-                <name>ENTRYDATE</name>
-                <dbName></dbName>
-                <primaryKey v="false" />
-                <columnType v="91" />
-                <size v="10" />
-                <scale v="0" />
-                <notNull v="false" />
-                <isUnique v="false" />
-                <index v="false" />
-                <documentation></documentation>
-                <title></title>
-                <description></description>
-              </entityFieldDb>
-              <entityFieldDb>
-                <name>CONTACT_ID</name>
-                <dbName></dbName>
-                <primaryKey v="false" />
-                <columnType v="1" />
-                <size v="36" />
-                <scale v="0" />
-                <notNull v="false" />
-                <isUnique v="false" />
-                <index v="false" />
-                <documentation></documentation>
-                <title></title>
-                <description></description>
-              </entityFieldDb>
-            </entityFields>
-          </entityDb>
         </entities>
       </entityGroup>
     </aliasDefDb>
diff --git a/entity/Activity_entity/Activity_entity.aod b/entity/Activity_entity/Activity_entity.aod
index 0d0a112f0c5..97ca6191f20 100644
--- a/entity/Activity_entity/Activity_entity.aod
+++ b/entity/Activity_entity/Activity_entity.aod
@@ -51,7 +51,6 @@
       <consumer>KeywordCategories</consumer>
       <groupable v="true" />
       <mandatory v="true" />
-      <valueProcess>%aditoprj%/entity/Activity_entity/entityfields/category/valueProcess.js</valueProcess>
       <displayValueProcess>%aditoprj%/entity/Activity_entity/entityfields/category/displayValueProcess.js</displayValueProcess>
     </entityField>
     <entityField>
@@ -87,12 +86,6 @@
           <fieldName>Activities</fieldName>
           <isConsumer v="false" />
         </entityDependency>
-        <entityDependency>
-          <name>262fe53d-7358-40ff-8641-e08add14528a</name>
-          <entityName>Object_entity</entityName>
-          <fieldName>Activities</fieldName>
-          <isConsumer v="false" />
-        </entityDependency>
       </dependencies>
     </entityProvider>
     <entityField>
@@ -270,12 +263,6 @@
           <fieldName>Activities</fieldName>
           <isConsumer v="false" />
         </entityDependency>
-        <entityDependency>
-          <name>943c36a2-d378-44a1-b214-25e92244c8cb</name>
-          <entityName>UniversalFileProcessor_entity</entityName>
-          <fieldName>Activities</fieldName>
-          <isConsumer v="false" />
-        </entityDependency>
       </dependencies>
       <children>
         <entityParameter>
@@ -491,6 +478,7 @@
       <children>
         <entityParameter>
           <name>LinkedObjectId_param</name>
+          <valueProcess>%aditoprj%/entity/Activity_entity/entityfields/appointments/children/linkedobjectid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
     </entityConsumer>
@@ -571,7 +559,6 @@
     </entityField>
     <entityField>
       <name>bindata</name>
-      <title>data</title>
       <contentType>FILE</contentType>
       <stateProcess>%aditoprj%/entity/Activity_entity/entityfields/bindata/stateProcess.js</stateProcess>
       <onValueChange>%aditoprj%/entity/Activity_entity/entityfields/bindata/onValueChange.js</onValueChange>
@@ -595,27 +582,6 @@
         </entityParameter>
       </children>
     </entityConsumer>
-    <entityParameter>
-      <name>Category_param</name>
-      <expose v="true" />
-    </entityParameter>
-    <entityParameter>
-      <name>Entrydate_param</name>
-      <expose v="true" />
-    </entityParameter>
-    <entityParameter>
-      <name>VisitPlanEntryId_param</name>
-      <expose v="true" />
-    </entityParameter>
-    <entityParameter>
-      <name>ActivityIDs_param</name>
-      <expose v="true" />
-    </entityParameter>
-    <entityField>
-      <name>countLinks</name>
-      <title> number of connections</title>
-      <valueProcess>%aditoprj%/entity/Activity_entity/entityfields/countlinks/valueProcess.js</valueProcess>
-    </entityField>
   </entityFields>
   <recordContainers>
     <dbRecordContainer>
@@ -625,7 +591,6 @@
       <conditionProcess>%aditoprj%/entity/Activity_entity/recordcontainers/db/conditionProcess.js</conditionProcess>
       <orderClauseProcess>%aditoprj%/entity/Activity_entity/recordcontainers/db/orderClauseProcess.js</orderClauseProcess>
       <onDBInsert>%aditoprj%/entity/Activity_entity/recordcontainers/db/onDBInsert.js</onDBInsert>
-      <onDBUpdate>%aditoprj%/entity/Activity_entity/recordcontainers/db/onDBUpdate.js</onDBUpdate>
       <onDBDelete>%aditoprj%/entity/Activity_entity/recordcontainers/db/onDBDelete.js</onDBDelete>
       <linkInformation>
         <linkInformation>
diff --git a/entity/Activity_entity/entityfields/msteams/children/createnewchatactivity/onActionProcess.js b/entity/Activity_entity/entityfields/msteams/children/createnewchatactivity/onActionProcess.js
new file mode 100644
index 00000000000..6840e66a0bf
--- /dev/null
+++ b/entity/Activity_entity/entityfields/msteams/children/createnewchatactivity/onActionProcess.js
@@ -0,0 +1,6 @@
+import("system.vars");
+import("system.neon");
+
+neon.openContext("MSTTeamChat", null, null, neon.OPERATINGSTATE_NEW, {
+    "ROWID_param" : vars.get("$param.RowId_param")
+});
\ No newline at end of file
diff --git a/entity/Activity_entity/entityfields/msteams/children/createnewchatactivity/stateProcess.js b/entity/Activity_entity/entityfields/msteams/children/createnewchatactivity/stateProcess.js
new file mode 100644
index 00000000000..0b93d5c410b
--- /dev/null
+++ b/entity/Activity_entity/entityfields/msteams/children/createnewchatactivity/stateProcess.js
@@ -0,0 +1,23 @@
+import("system.vars");
+import("system.neon");
+import("system.result");
+import("Sql_lib");
+
+var teamId = newSelect("MST_TEAMID")
+    .from("MST_TEAM")
+    .where("MST_TEAM.OBJECT_ROWID", vars.get("$param.RowId_param"))
+    .cell();
+
+var isArchived = newSelect("IS_ARCHIVED")
+    .from("MST_TEAM")
+    .where("MST_TEAM.OBJECT_ROWID", vars.get("$param.RowId_param"))
+    .cell();
+    
+if (teamId == "" || isArchived == 1) 
+{
+    result.string(neon.COMPONENTSTATE_INVISIBLE);
+}
+else
+{
+    result.string(neon.COMPONENTSTATE_EDITABLE);
+}
\ No newline at end of file
diff --git a/entity/Document_entity/Document_entity.aod b/entity/Document_entity/Document_entity.aod
index fa1098dc639..15883a25940 100644
--- a/entity/Document_entity/Document_entity.aod
+++ b/entity/Document_entity/Document_entity.aod
@@ -343,6 +343,18 @@
         </entityParameter>
       </children>
     </entityProvider>
+    <entityActionGroup>
+      <name>MSTeam</name>
+      <children>
+        <entityActionField>
+          <name>synchronizeDocuments</name>
+          <title>Dateien synchronisieren</title>
+          <onActionProcess>%aditoprj%/entity/Document_entity/entityfields/msteam/children/synchronizedocuments/onActionProcess.js</onActionProcess>
+          <stateProcess>%aditoprj%/entity/Document_entity/entityfields/msteam/children/synchronizedocuments/stateProcess.js</stateProcess>
+          <tooltip>Synchronisiert die Dokumente der Datenbank mit den Dokumenten von MSTeams</tooltip>
+        </entityActionField>
+      </children>
+    </entityActionGroup>
   </entityFields>
   <recordContainers>
     <jDitoRecordContainer>
diff --git a/entity/Document_entity/entityfields/msteam/children/synchronizedocuments/onActionProcess.js b/entity/Document_entity/entityfields/msteam/children/synchronizedocuments/onActionProcess.js
new file mode 100644
index 00000000000..e9608493005
--- /dev/null
+++ b/entity/Document_entity/entityfields/msteam/children/synchronizedocuments/onActionProcess.js
@@ -0,0 +1,16 @@
+import("system.teams");
+import("system.vars");
+import("system.db");
+import("system.util")
+import("Sql_lib");
+import("system.net")
+
+var rowId = vars.get("$param.AssignmentRowId_param");
+
+neon.openContext("MSTTeamDocument", null, null, neon.OPERATINGSTATE_NEW, {
+    "ObjectRowId_param" : rowId,
+    "AssignmentName_param" : vars.get("$param.AssignmentName_param"),
+    "AssignmentTable_param" : vars.get("$param.AssignmentTable_param")
+});
+
+
diff --git a/entity/Document_entity/entityfields/msteam/children/synchronizedocuments/stateProcess.js b/entity/Document_entity/entityfields/msteam/children/synchronizedocuments/stateProcess.js
new file mode 100644
index 00000000000..7350dbf89fd
--- /dev/null
+++ b/entity/Document_entity/entityfields/msteam/children/synchronizedocuments/stateProcess.js
@@ -0,0 +1,24 @@
+import("system.vars");
+import("system.neon");
+import("system.result");
+import("Sql_lib");
+import("system.logging");
+
+var teamId = newSelect("MST_TEAMID", "Data_alias")
+    .from("MST_TEAM")
+    .where("MST_TEAM.OBJECT_ROWID", "$param.AssignmentRowId_param")
+    .cell();
+    
+var isArchived = newSelect("IS_ARCHIVED", "Data_alias")
+    .from("MST_TEAM")
+    .where("MST_TEAM.OBJECT_ROWID", "$param.AssignmentRowId_param")
+    .cell();
+    
+if (teamId == "" || isArchived == 1) 
+{
+    result.string(neon.COMPONENTSTATE_INVISIBLE);
+}
+else
+{
+    result.string(neon.COMPONENTSTATE_EDITABLE);
+}
\ No newline at end of file
diff --git a/entity/MSTChooseTeam_entity/MSTChooseTeam_entity.aod b/entity/MSTChooseTeam_entity/MSTChooseTeam_entity.aod
new file mode 100644
index 00000000000..fc249eca704
--- /dev/null
+++ b/entity/MSTChooseTeam_entity/MSTChooseTeam_entity.aod
@@ -0,0 +1,60 @@
+<?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.14" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.14">
+  <name>MSTChooseTeam_entity</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <recordContainer>jdito</recordContainer>
+  <entityFields>
+    <entityProvider>
+      <name>#PROVIDER</name>
+    </entityProvider>
+    <entityField>
+      <name>ALLTEAMS</name>
+      <title>All Teams</title>
+      <dropDownProcess>%aditoprj%/entity/MSTChooseTeam_entity/entityfields/allteams/dropDownProcess.js</dropDownProcess>
+      <selectionMode>SINGLE</selectionMode>
+    </entityField>
+    <entityField>
+      <name>UID</name>
+    </entityField>
+    <entityParameter>
+      <name>RowId_param</name>
+      <expose v="true" />
+    </entityParameter>
+    <entityField>
+      <name>ALLARCHIVEDTEAMS</name>
+      <title>allArchivedTeams</title>
+      <dropDownProcess>%aditoprj%/entity/MSTChooseTeam_entity/entityfields/allarchivedteams/dropDownProcess.js</dropDownProcess>
+    </entityField>
+    <entityField>
+      <name>SEARCHVALUE</name>
+      <title>Surchbegriff</title>
+      <tooltip>Inhalt dieses Feldes wird als Suche verwendet</tooltip>
+    </entityField>
+  </entityFields>
+  <recordContainers>
+    <jDitoRecordContainer>
+      <name>jdito</name>
+      <jDitoRecordAlias>Data_alias</jDitoRecordAlias>
+      <isPageable v="true" />
+      <contentProcess>%aditoprj%/entity/MSTChooseTeam_entity/recordcontainers/jdito/contentProcess.js</contentProcess>
+      <onInsert>%aditoprj%/entity/MSTChooseTeam_entity/recordcontainers/jdito/onInsert.js</onInsert>
+      <recordFieldMappings>
+        <jDitoRecordFieldMapping>
+          <name>ALLTEAMS.value</name>
+        </jDitoRecordFieldMapping>
+        <jDitoRecordFieldMapping>
+          <name>ALLTEAMS.displayValue</name>
+        </jDitoRecordFieldMapping>
+        <jDitoRecordFieldMapping>
+          <name>UID.value</name>
+        </jDitoRecordFieldMapping>
+        <jDitoRecordFieldMapping>
+          <name>ALLARCHIVEDTEAMS.displayValue</name>
+        </jDitoRecordFieldMapping>
+        <jDitoRecordFieldMapping>
+          <name>ALLARCHIVEDTEAMS.value</name>
+        </jDitoRecordFieldMapping>
+      </recordFieldMappings>
+    </jDitoRecordContainer>
+  </recordContainers>
+</entity>
diff --git a/entity/MSTChooseTeam_entity/entityfields/allarchivedteams/dropDownProcess.js b/entity/MSTChooseTeam_entity/entityfields/allarchivedteams/dropDownProcess.js
new file mode 100644
index 00000000000..2320b0c176b
--- /dev/null
+++ b/entity/MSTChooseTeam_entity/entityfields/allarchivedteams/dropDownProcess.js
@@ -0,0 +1,9 @@
+import("system.result");
+import("system.teams");
+
+
+var allArchivedTeams = teams.getAllArchivedTeams(null);
+
+
+if (allArchivedTeams)
+    result.object(allArchivedTeams);
\ No newline at end of file
diff --git a/entity/MSTChooseTeam_entity/entityfields/allteams/dropDownProcess.js b/entity/MSTChooseTeam_entity/entityfields/allteams/dropDownProcess.js
new file mode 100644
index 00000000000..c32b84a9577
--- /dev/null
+++ b/entity/MSTChooseTeam_entity/entityfields/allteams/dropDownProcess.js
@@ -0,0 +1,18 @@
+import("system.result");
+import("system.teams");
+import("system.vars");
+import("system.logging");
+
+var searchValue = vars.get("$field.SEARCHVALUE");
+var allTeams;
+if(searchValue)
+{
+    allTeams = teams.getAllTeams(searchValue);
+}
+else
+{
+    allTeams = teams.getAllTeams(null)
+}
+
+if (allTeams)
+    result.object(allTeams);
\ No newline at end of file
diff --git a/entity/MSTChooseTeam_entity/recordcontainers/jdito/contentProcess.js b/entity/MSTChooseTeam_entity/recordcontainers/jdito/contentProcess.js
new file mode 100644
index 00000000000..488d22d4b38
--- /dev/null
+++ b/entity/MSTChooseTeam_entity/recordcontainers/jdito/contentProcess.js
@@ -0,0 +1,9 @@
+import("system.result");
+import("system.vars");
+
+//TODO: This dummy implementation shouldn't be nescessary here. Remove this process eventually. #1051003
+var rows = [];
+if (vars.get("$local.idvalues"))
+    rows = vars.get("$local.idvalues").map(function (id) {return [id, "", "", "", ""];});
+
+result.object(rows);
\ No newline at end of file
diff --git a/entity/MSTChooseTeam_entity/recordcontainers/jdito/onInsert.js b/entity/MSTChooseTeam_entity/recordcontainers/jdito/onInsert.js
new file mode 100644
index 00000000000..041a32b69ab
--- /dev/null
+++ b/entity/MSTChooseTeam_entity/recordcontainers/jdito/onInsert.js
@@ -0,0 +1,78 @@
+import("system.teams");
+import("Sql_lib")
+import("system.logging");
+import("system.vars")
+import("system.teams");
+import("system.util");
+import("system.neon");
+
+var rowData = vars.get("$local.rowdata");
+
+var teamId = rowData["ALLTEAMS.value"];
+var teamName = rowData["ALLTEAMS.displayValue"]
+
+var archivedTeamId = rowData["ALLARCHIVEDTEAMS.value"];
+var archivedTeamName = rowData["ALLARCHIVEDTEAMS.displayValue"];
+
+if(teamId)
+{    
+    var channelId = teams.getGeneralChannelId(teamId);
+    
+    var serviceUrl = newSelect("SERVICE_URL")
+    .from("MST_TEAM")
+    .where("MST_TEAM.MST_TEAMID", teamId)
+    .cell();
+    
+    if(serviceUrl == null)
+    {
+        serviceUrl = "";
+    }
+    
+    new SqlBuilder().insertFields({
+    "MST_ID" : util.getNewUUID(),
+    "MST_TEAMID" : teamId,
+    "TEAMNAME" : teamName,
+    "GENERAL_CHANNELID" : channelId,
+    "OBJECT_ROWID" : vars.get("$param.RowId_param"),
+    "IS_ARCHIVED" : 0,
+    "SERVICE_URL" : serviceUrl
+}, "MST_TEAM");
+}
+else if(archivedTeamId)
+{
+    
+    teams.unarchiveTeamAndRestoreGroup(archivedTeamId)
+    
+    var channelId = teams.getGeneralChannelId(archivedTeamId);
+
+    
+    var serviceUrl = newSelect("SERVICE_URL")
+    .from("MST_TEAM")
+    .where("MST_TEAM.MST_TEAMID", archivedTeamId)
+    .cell();
+    
+    if(serviceUrl == null)
+    {
+        serviceUrl = "";
+    }
+    
+    newWhere("MST_TEAM.MST_TEAMID", archivedTeamId)
+   .updateFields({
+                  "IS_ARCHIVED" : "0",
+                  "FINAL_DELETE_DATE" : ""
+                  });
+        
+    new SqlBuilder().insertFields({
+    "MST_ID" : util.getNewUUID(),
+    "MST_TEAMID" : archivedTeamId,
+    "TEAMNAME" : archivedTeamName,
+    "GENERAL_CHANNELID" : channelId,
+    "OBJECT_ROWID" : vars.get("$param.RowId_param"),
+    "IS_ARCHIVED" : 0,
+    "SERVICE_URL" : serviceUrl
+}, "MST_TEAM");
+}
+
+neon.refreshAll();
+
+
diff --git a/entity/MSTTeam2_entity/MSTTeam2_entity.aod b/entity/MSTTeam2_entity/MSTTeam2_entity.aod
new file mode 100644
index 00000000000..5267111150c
--- /dev/null
+++ b/entity/MSTTeam2_entity/MSTTeam2_entity.aod
@@ -0,0 +1,43 @@
+<?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.14" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.14">
+  <name>MSTTeam2_entity</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <recordContainer>jdito</recordContainer>
+  <entityFields>
+    <entityProvider>
+      <name>#PROVIDER</name>
+    </entityProvider>
+    <entityField>
+      <name>MEMBERS</name>
+    </entityField>
+    <entityField>
+      <name>OWNER</name>
+      <selectionMode>MULTI</selectionMode>
+    </entityField>
+    <entityProvider>
+      <name>Members2</name>
+      <recordContainer>jdito</recordContainer>
+    </entityProvider>
+    <entityField>
+      <name>UID</name>
+    </entityField>
+  </entityFields>
+  <recordContainers>
+    <jDitoRecordContainer>
+      <name>jdito</name>
+      <jDitoRecordAlias>Data_alias</jDitoRecordAlias>
+      <contentProcess>%aditoprj%/entity/MSTTeam2_entity/recordcontainers/jdito/contentProcess.js</contentProcess>
+      <recordFieldMappings>
+        <jDitoRecordFieldMapping>
+          <name>UID.value</name>
+        </jDitoRecordFieldMapping>
+        <jDitoRecordFieldMapping>
+          <name>OWNER.value</name>
+        </jDitoRecordFieldMapping>
+        <jDitoRecordFieldMapping>
+          <name>MEMBERS.value</name>
+        </jDitoRecordFieldMapping>
+      </recordFieldMappings>
+    </jDitoRecordContainer>
+  </recordContainers>
+</entity>
diff --git a/entity/MSTTeam2_entity/recordcontainers/jdito/contentProcess.js b/entity/MSTTeam2_entity/recordcontainers/jdito/contentProcess.js
new file mode 100644
index 00000000000..06d65a53088
--- /dev/null
+++ b/entity/MSTTeam2_entity/recordcontainers/jdito/contentProcess.js
@@ -0,0 +1,12 @@
+import("system.result");
+import("system.teams");
+import("system.util");
+import("system.vars");
+
+var myDataArray = [];
+
+myDataArray.push([util.getNewUUID(), false, "mbilda@adito.de"]);
+myDataArray.push([util.getNewUUID(), false, "marco@mbsolution2.onmicrosoft.com"]);
+
+result.object(myDataArray);
+
diff --git a/entity/MSTTeamChannel_entity/MSTTeamChannel_entity.aod b/entity/MSTTeamChannel_entity/MSTTeamChannel_entity.aod
new file mode 100644
index 00000000000..924b711c221
--- /dev/null
+++ b/entity/MSTTeamChannel_entity/MSTTeamChannel_entity.aod
@@ -0,0 +1,58 @@
+<?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.14" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.14">
+  <name>MSTTeamChannel_entity</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <recordContainer>jdito</recordContainer>
+  <entityFields>
+    <entityProvider>
+      <name>#PROVIDER</name>
+    </entityProvider>
+    <entityField>
+      <name>DESCRIPTION</name>
+      <title>Channel Beschreibung</title>
+      <valueProcess>%aditoprj%/entity/MSTTeamChannel_entity/entityfields/description/valueProcess.js</valueProcess>
+    </entityField>
+    <entityField>
+      <name>CHANNELNAME</name>
+      <title>Channel Name</title>
+      <valueProcess>%aditoprj%/entity/MSTTeamChannel_entity/entityfields/channelname/valueProcess.js</valueProcess>
+    </entityField>
+    <entityField>
+      <name>UID</name>
+    </entityField>
+    <entityParameter>
+      <name>CHANNELNAME_param</name>
+      <expose v="true" />
+    </entityParameter>
+    <entityParameter>
+      <name>CHANNELDESC_param</name>
+      <expose v="true" />
+    </entityParameter>
+    <entityField>
+      <name>ROWID</name>
+    </entityField>
+    <entityParameter>
+      <name>ROWID_param</name>
+      <expose v="true" />
+    </entityParameter>
+  </entityFields>
+  <recordContainers>
+    <jDitoRecordContainer>
+      <name>jdito</name>
+      <jDitoRecordAlias>Data_alias</jDitoRecordAlias>
+      <contentProcess>%aditoprj%/entity/MSTTeamChannel_entity/recordcontainers/jdito/contentProcess.js</contentProcess>
+      <onInsert>%aditoprj%/entity/MSTTeamChannel_entity/recordcontainers/jdito/onInsert.js</onInsert>
+      <recordFieldMappings>
+        <jDitoRecordFieldMapping>
+          <name>CHANNELNAME.value</name>
+        </jDitoRecordFieldMapping>
+        <jDitoRecordFieldMapping>
+          <name>DESCRIPTION.value</name>
+        </jDitoRecordFieldMapping>
+        <jDitoRecordFieldMapping>
+          <name>UID.value</name>
+        </jDitoRecordFieldMapping>
+      </recordFieldMappings>
+    </jDitoRecordContainer>
+  </recordContainers>
+</entity>
diff --git a/entity/MSTTeamChannel_entity/entityfields/channelname/valueProcess.js b/entity/MSTTeamChannel_entity/entityfields/channelname/valueProcess.js
new file mode 100644
index 00000000000..487d909b0d9
--- /dev/null
+++ b/entity/MSTTeamChannel_entity/entityfields/channelname/valueProcess.js
@@ -0,0 +1,6 @@
+import("system.result");
+import("system.neon");
+import("system.vars");
+
+if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && vars.get("$param.CHANNELNAME_param") && vars.get("$this.value") == null)
+    result.string(vars.get("$param.CHANNELNAME_param"));
\ No newline at end of file
diff --git a/entity/MSTTeamChannel_entity/entityfields/description/valueProcess.js b/entity/MSTTeamChannel_entity/entityfields/description/valueProcess.js
new file mode 100644
index 00000000000..ea6333027ca
--- /dev/null
+++ b/entity/MSTTeamChannel_entity/entityfields/description/valueProcess.js
@@ -0,0 +1,6 @@
+import("system.result");
+import("system.neon");
+import("system.vars");
+
+if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && vars.get("$param.CHANNELDESC_param") && vars.get("$this.value") == null)
+    result.string(vars.get("$param.CHANNELDESC_param"));
\ No newline at end of file
diff --git a/entity/MSTTeamChannel_entity/recordcontainers/jdito/contentProcess.js b/entity/MSTTeamChannel_entity/recordcontainers/jdito/contentProcess.js
new file mode 100644
index 00000000000..a0ca9709897
--- /dev/null
+++ b/entity/MSTTeamChannel_entity/recordcontainers/jdito/contentProcess.js
@@ -0,0 +1,9 @@
+import("system.result");
+import("system.vars");
+
+//TODO: This dummy implementation shouldn't be nescessary here. Remove this process eventually. #1051003
+var rows = [];
+if (vars.get("$local.idvalues"))
+    rows = vars.get("$local.idvalues").map(function (id) {return [id, "", ""];});
+
+result.object(rows);
\ No newline at end of file
diff --git a/entity/MSTTeamChannel_entity/recordcontainers/jdito/onInsert.js b/entity/MSTTeamChannel_entity/recordcontainers/jdito/onInsert.js
new file mode 100644
index 00000000000..b43e3fa9728
--- /dev/null
+++ b/entity/MSTTeamChannel_entity/recordcontainers/jdito/onInsert.js
@@ -0,0 +1,18 @@
+import("system.teams");
+import("Sql_lib");
+import("system.vars");
+
+
+var rowData = vars.get("$local.rowdata");
+
+
+var teamId = newSelect("MST_TEAMID")
+    .from("MST_TEAM")
+    .where("MST_TEAM.OBJECT_ROWID", vars.get("$param.ROWID_param"))
+    .cell();
+    
+var channelName = rowData["CHANNELNAME.value"];
+var channelDescription = rowData["CHANNELDESC.value"];
+
+
+teams.createNewChannel(teamId, channelName, channelDescription);
diff --git a/entity/MSTTeamChat_entity/MSTTeamChat_entity.aod b/entity/MSTTeamChat_entity/MSTTeamChat_entity.aod
new file mode 100644
index 00000000000..f09ac0a9ade
--- /dev/null
+++ b/entity/MSTTeamChat_entity/MSTTeamChat_entity.aod
@@ -0,0 +1,84 @@
+<?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.14" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.14">
+  <name>MSTTeamChat_entity</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <recordContainer>jdito</recordContainer>
+  <entityFields>
+    <entityProvider>
+      <name>#PROVIDER</name>
+    </entityProvider>
+    <entityField>
+      <name>CREATED_DATE_TIME</name>
+    </entityField>
+    <entityField>
+      <name>MESSAGE</name>
+      <state>READONLY</state>
+    </entityField>
+    <entityField>
+      <name>FROM</name>
+    </entityField>
+    <entityField>
+      <name>UID</name>
+    </entityField>
+    <entityParameter>
+      <name>ROWID_param</name>
+      <expose v="true" />
+    </entityParameter>
+    <entityConsumer>
+      <name>Consumer</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>MSTTeamsMessage_entity</entityName>
+        <fieldName>Messages</fieldName>
+      </dependency>
+      <children>
+        <entityParameter>
+          <name>Messages_param</name>
+          <valueProcess>%aditoprj%/entity/MSTTeamChat_entity/entityfields/consumer/children/messages_param/valueProcess.js</valueProcess>
+        </entityParameter>
+      </children>
+    </entityConsumer>
+    <entityField>
+      <name>ALLCHANNELS</name>
+      <title>Alle Channel</title>
+      <mandatory v="true" />
+      <dropDownProcess>%aditoprj%/entity/MSTTeamChat_entity/entityfields/allchannels/dropDownProcess.js</dropDownProcess>
+      <valueProcess>%aditoprj%/entity/MSTTeamChat_entity/entityfields/allchannels/valueProcess.js</valueProcess>
+    </entityField>
+    <entityField>
+      <name>SEARCHVALUE</name>
+      <title>Suchbegriff (Case Sensitive)</title>
+    </entityField>
+    <entityActionField>
+      <name>LoadNewMessages</name>
+      <title>Lade neue Nachrichten</title>
+      <onActionProcess>%aditoprj%/entity/MSTTeamChat_entity/entityfields/loadnewmessages/onActionProcess.js</onActionProcess>
+      <stateProcess>%aditoprj%/entity/MSTTeamChat_entity/entityfields/loadnewmessages/stateProcess.js</stateProcess>
+    </entityActionField>
+    <entityField>
+      <name>NEWMESSAGES</name>
+    </entityField>
+  </entityFields>
+  <recordContainers>
+    <jDitoRecordContainer>
+      <name>jdito</name>
+      <jDitoRecordAlias>Data_alias</jDitoRecordAlias>
+      <contentProcess>%aditoprj%/entity/MSTTeamChat_entity/recordcontainers/jdito/contentProcess.js</contentProcess>
+      <onInsert>%aditoprj%/entity/MSTTeamChat_entity/recordcontainers/jdito/onInsert.js</onInsert>
+      <recordFieldMappings>
+        <jDitoRecordFieldMapping>
+          <name>UID.value</name>
+        </jDitoRecordFieldMapping>
+        <jDitoRecordFieldMapping>
+          <name>FROM.value</name>
+        </jDitoRecordFieldMapping>
+        <jDitoRecordFieldMapping>
+          <name>MESSAGE.value</name>
+        </jDitoRecordFieldMapping>
+        <jDitoRecordFieldMapping>
+          <name>CREATED_DATE_TIME.value</name>
+        </jDitoRecordFieldMapping>
+      </recordFieldMappings>
+    </jDitoRecordContainer>
+  </recordContainers>
+</entity>
diff --git a/entity/MSTTeamChat_entity/entityfields/allchannels/dropDownProcess.js b/entity/MSTTeamChat_entity/entityfields/allchannels/dropDownProcess.js
new file mode 100644
index 00000000000..bf5fb95d272
--- /dev/null
+++ b/entity/MSTTeamChat_entity/entityfields/allchannels/dropDownProcess.js
@@ -0,0 +1,24 @@
+import("system.result");
+import("system.teams");
+import("system.vars");
+import("Sql_lib");
+
+var searchValue = vars.get("$field.SEARCHVALUE");
+var allChannels;
+
+var teamId = newSelect("MST_TEAMID")
+    .from("MST_TEAM")
+    .where("MST_TEAM.OBJECT_ROWID", "$param.ROWID_param")
+    .cell();
+
+if(searchValue)
+{
+    allChannels = teams.getAllChannelsInTeam(teamId, searchValue);
+}
+else
+{
+    allChannels = teams.getAllChannelsInTeam(teamId, null)
+}
+
+if (allChannels)
+    result.object(allChannels);
\ No newline at end of file
diff --git a/entity/MSTTeamChat_entity/entityfields/allchannels/valueProcess.js b/entity/MSTTeamChat_entity/entityfields/allchannels/valueProcess.js
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/entity/MSTTeamChat_entity/entityfields/consumer/children/messages_param/valueProcess.js b/entity/MSTTeamChat_entity/entityfields/consumer/children/messages_param/valueProcess.js
new file mode 100644
index 00000000000..8e36993e162
--- /dev/null
+++ b/entity/MSTTeamChat_entity/entityfields/consumer/children/messages_param/valueProcess.js
@@ -0,0 +1,24 @@
+import("system.teams");
+import("system.vars");
+import("system.result");
+import("system.util");
+import("Sql_lib");
+            
+if(vars.get("$field.ALLCHANNELS"))
+{
+    var teamId = newSelect("MST_TEAMID")
+            .from("MST_TEAM")
+            .where("MST_TEAM.OBJECT_ROWID", "$param.ROWID_param")
+            .cell();
+            
+    var messages = teams.getChannelMessages(teamId, vars.get("$field.ALLCHANNELS"), 10)
+
+    result.string(messages);
+}
+
+if(vars.get("$field.NEWMESSAGES") == "true")
+{
+    vars.set("$field.NEWMESSAGES", "false");
+    var messages = teams.getNextChannelMessages(vars.get("$global.nextLink"));
+    result.string(messages);
+}
\ No newline at end of file
diff --git a/entity/MSTTeamChat_entity/entityfields/loadnewmessages/onActionProcess.js b/entity/MSTTeamChat_entity/entityfields/loadnewmessages/onActionProcess.js
new file mode 100644
index 00000000000..0f2f3a48446
--- /dev/null
+++ b/entity/MSTTeamChat_entity/entityfields/loadnewmessages/onActionProcess.js
@@ -0,0 +1,9 @@
+import("system.vars");
+
+vars.set("$field.NEWMESSAGES", "true");
+
+
+
+
+
+
diff --git a/entity/MSTTeamChat_entity/entityfields/loadnewmessages/stateProcess.js b/entity/MSTTeamChat_entity/entityfields/loadnewmessages/stateProcess.js
new file mode 100644
index 00000000000..e92007c6780
--- /dev/null
+++ b/entity/MSTTeamChat_entity/entityfields/loadnewmessages/stateProcess.js
@@ -0,0 +1,19 @@
+import("system.vars");
+import("system.neon");
+import("system.result");
+
+if(vars.exists("$global.nextLink"))
+{
+    if(vars.get("$global.nextLink") != "")
+    {
+        result.string(neon.COMPONENTSTATE_EDITABLE);
+    }
+    else
+    {
+        result.string(neon.COMPONENTSTATE_DISABLED);
+    }
+}
+else
+{
+    result.string(neon.COMPONENTSTATE_DISABLED);
+}
\ No newline at end of file
diff --git a/entity/MSTTeamChat_entity/recordcontainers/jdito/contentProcess.js b/entity/MSTTeamChat_entity/recordcontainers/jdito/contentProcess.js
new file mode 100644
index 00000000000..d1824307a60
--- /dev/null
+++ b/entity/MSTTeamChat_entity/recordcontainers/jdito/contentProcess.js
@@ -0,0 +1,9 @@
+import("system.result");
+import("system.vars");
+
+//TODO: This dummy implementation shouldn't be nescessary here. Remove this process eventually. #1051003
+var rows = [];
+if (vars.get("$local.idvalues"))
+    rows = vars.get("$local.idvalues").map(function (id) {return [id, "", "", ""];});
+
+result.object(rows);
\ No newline at end of file
diff --git a/entity/MSTTeamChat_entity/recordcontainers/jdito/onInsert.js b/entity/MSTTeamChat_entity/recordcontainers/jdito/onInsert.js
new file mode 100644
index 00000000000..954340e1c3b
--- /dev/null
+++ b/entity/MSTTeamChat_entity/recordcontainers/jdito/onInsert.js
@@ -0,0 +1,3 @@
+import("system.logging");
+
+logging.log("Erstelle eine neue Aktivität");
\ No newline at end of file
diff --git a/entity/MSTTeamDocument_entity/MSTTeamDocument_entity.aod b/entity/MSTTeamDocument_entity/MSTTeamDocument_entity.aod
new file mode 100644
index 00000000000..5b396445a13
--- /dev/null
+++ b/entity/MSTTeamDocument_entity/MSTTeamDocument_entity.aod
@@ -0,0 +1,58 @@
+<?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.14" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.14">
+  <name>MSTTeamDocument_entity</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <recordContainer>jdito</recordContainer>
+  <entityFields>
+    <entityProvider>
+      <name>#PROVIDER</name>
+    </entityProvider>
+    <entityField>
+      <name>DOCUMENTS</name>
+      <title>Dokumente</title>
+      <dropDownProcess>%aditoprj%/entity/MSTTeamDocument_entity/entityfields/documents/dropDownProcess.js</dropDownProcess>
+      <selectionMode>MULTI</selectionMode>
+    </entityField>
+    <entityField>
+      <name>ALLCHANNELS</name>
+      <title>Alle Channel</title>
+      <mandatory v="true" />
+      <dropDownProcess>%aditoprj%/entity/MSTTeamDocument_entity/entityfields/allchannels/dropDownProcess.js</dropDownProcess>
+    </entityField>
+    <entityParameter>
+      <name>ObjectRowId_param</name>
+      <expose v="true" />
+    </entityParameter>
+    <entityField>
+      <name>SEARCHVALUE</name>
+      <title>Suchbegriff (Case Sensitive)</title>
+    </entityField>
+    <entityField>
+      <name>UID</name>
+    </entityField>
+    <entityParameter>
+      <name>AssignmentTable_param</name>
+      <expose v="true" />
+    </entityParameter>
+    <entityParameter>
+      <name>AssignmentName_param</name>
+      <expose v="true" />
+    </entityParameter>
+  </entityFields>
+  <recordContainers>
+    <jDitoRecordContainer>
+      <name>jdito</name>
+      <jDitoRecordAlias>Data_alias</jDitoRecordAlias>
+      <contentProcess>%aditoprj%/entity/MSTTeamDocument_entity/recordcontainers/jdito/contentProcess.js</contentProcess>
+      <onInsert>%aditoprj%/entity/MSTTeamDocument_entity/recordcontainers/jdito/onInsert.js</onInsert>
+      <recordFieldMappings>
+        <jDitoRecordFieldMapping>
+          <name>UID.value</name>
+        </jDitoRecordFieldMapping>
+        <jDitoRecordFieldMapping>
+          <name>DOCUMENTS.value</name>
+        </jDitoRecordFieldMapping>
+      </recordFieldMappings>
+    </jDitoRecordContainer>
+  </recordContainers>
+</entity>
diff --git a/entity/MSTTeamDocument_entity/entityfields/allchannels/dropDownProcess.js b/entity/MSTTeamDocument_entity/entityfields/allchannels/dropDownProcess.js
new file mode 100644
index 00000000000..297dc97e992
--- /dev/null
+++ b/entity/MSTTeamDocument_entity/entityfields/allchannels/dropDownProcess.js
@@ -0,0 +1,26 @@
+import("system.result");
+import("system.teams");
+import("system.vars");
+import("system.logging");
+import("Sql_lib");
+
+var allChannels;
+
+var teamId = newSelect("MST_TEAMID")
+    .from("MST_TEAM")
+    .where("MST_TEAM.OBJECT_ROWID", vars.get("$param.ObjectRowId_param"))
+    .cell();
+
+var searchValue = vars.get("$field.SEARCHVALUE");
+
+if(searchValue)
+{
+    allChannels = teams.getAllChannelsInTeam(teamId, searchValue);
+}
+else
+{
+    allChannels = teams.getAllChannelsInTeam(teamId, null)
+}
+
+if (allChannels)
+    result.object(allChannels);
\ No newline at end of file
diff --git a/entity/MSTTeamDocument_entity/entityfields/documents/dropDownProcess.js b/entity/MSTTeamDocument_entity/entityfields/documents/dropDownProcess.js
new file mode 100644
index 00000000000..5fa658ec1ea
--- /dev/null
+++ b/entity/MSTTeamDocument_entity/entityfields/documents/dropDownProcess.js
@@ -0,0 +1,30 @@
+import("system.result");
+import("system.teams");
+import("system.vars");
+import("system.logging");
+import("Sql_lib");
+
+if(vars.get("$field.ALLCHANNELS"))
+{
+    var channelId = vars.get("$field.ALLCHANNELS");
+
+    var teamId = newSelect("MST_TEAMID")
+        .from("MST_TEAM")
+        .where("MST_TEAM.OBJECT_ROWID", vars.get("$param.ObjectRowId_param"))
+        .cell();
+
+    var allChannels = teams.getAllChannelsInTeam(teamId, null);
+
+    var documents = teams.getAllDocumentsOfChannel(teamId, allChannels[channelId])
+    var jsonDocuments = JSON.parse(documents);
+    
+    var resultString = [[jsonDocuments[0].downloadUrl, jsonDocuments[0].name]];
+//    for (var i = 0; i < jsonDocuments.length; i++)
+//    {
+//        resultString = resultString + "[" + jsonDocuments[i].downloadUrl + ", " + jsonDocuments[i].name + "]";
+//    }
+//    var upnsOfOwners = [["marco@mbsolutions2.onmicrosoft.com", "marco@mbsolutions2.onmicrosoft.com"], ["franz@mbsolutions2.onmicrosoft.com", "franz@mbsolutions2.onmicrosoft.com"], ["martin@mbsolutions2.onmicrosoft.com", "martin@mbsolutions2.onmicrosoft.com"]];
+
+//    resultString = resultString + "]";
+    result.object(resultString);
+}
\ No newline at end of file
diff --git a/entity/MSTTeamDocument_entity/recordcontainers/jdito/contentProcess.js b/entity/MSTTeamDocument_entity/recordcontainers/jdito/contentProcess.js
new file mode 100644
index 00000000000..af9ece7caa7
--- /dev/null
+++ b/entity/MSTTeamDocument_entity/recordcontainers/jdito/contentProcess.js
@@ -0,0 +1,9 @@
+import("system.result");
+import("system.vars");
+
+//TODO: This dummy implementation shouldn't be nescessary here. Remove this process eventually. #1051003
+var rows = [];
+if (vars.get("$local.idvalues"))
+    rows = vars.get("$local.idvalues").map(function (id) {return [id, ""];});
+
+result.object(rows);
\ No newline at end of file
diff --git a/entity/MSTTeamDocument_entity/recordcontainers/jdito/onInsert.js b/entity/MSTTeamDocument_entity/recordcontainers/jdito/onInsert.js
new file mode 100644
index 00000000000..52a04a021ef
--- /dev/null
+++ b/entity/MSTTeamDocument_entity/recordcontainers/jdito/onInsert.js
@@ -0,0 +1,38 @@
+import("system.teams");
+import("system.vars");
+import("system.db");
+import("system.util")
+import("Sql_lib");
+import("system.net")
+import("system.logging");
+import("system.neon");
+
+
+var rowData = vars.get("$local.rowdata");
+
+var documents = text.decodeMS(rowData["DOCUMENTS.value"]);
+
+for(var i=0; i<documents.length; i++)
+{
+    //hier muss überprüft werden ob es dieses Dokument schon in der Datenbank gibt!
+//   if(documents[i].alreadyExistInDB)
+//        break;
+    //Wenn es dieses noch nicht gibt, wird es in die DB gespeichert
+    var docName = "Präsentation 1.pptx";
+    var downloadUrl = documents;
+    
+    var file = net.getURLContent(downloadUrl, false, null, null, null, false);
+    
+    var assignmentTable = vars.get("$param.AssignmentTable_param");
+    var assignmentName = vars.get("$param.AssignmentName_param");
+    var assignmentRowId = vars.get("$param.ObjectRowId_param");
+    var alias = "_____SYSTEMALIAS";
+
+
+    var uid = db.insertBinary(assignmentTable, assignmentName, assignmentRowId, null, 
+            file, docName, "Hier können Sie nachträglich ihre Description ändern", "", alias, util.getNewUUID());    
+}
+
+neon.refreshAll();
+
+
diff --git a/entity/MSTTeamMember_entity/MSTTeamMember_entity.aod b/entity/MSTTeamMember_entity/MSTTeamMember_entity.aod
new file mode 100644
index 00000000000..65caeb26918
--- /dev/null
+++ b/entity/MSTTeamMember_entity/MSTTeamMember_entity.aod
@@ -0,0 +1,74 @@
+<?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.14" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.14">
+  <name>MSTTeamMember_entity</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <recordContainer>jdito</recordContainer>
+  <entityFields>
+    <entityProvider>
+      <name>#PROVIDER</name>
+    </entityProvider>
+    <entityField>
+      <name>UPNSOFMEMBERS</name>
+      <title>Members</title>
+      <dropDownProcess>%aditoprj%/entity/MSTTeamMember_entity/entityfields/upnsofmembers/dropDownProcess.js</dropDownProcess>
+      <selectionMode>MULTI</selectionMode>
+    </entityField>
+    <entityField>
+      <name>UID</name>
+    </entityField>
+    <entityField>
+      <name>ARETHESEOWNERS</name>
+      <title>Handelt es sich bei den Benutzer(n) um "Besitzer"?</title>
+      <contentType>BOOLEAN</contentType>
+    </entityField>
+    <entityParameter>
+      <name>ROWID_param</name>
+      <expose v="true" />
+    </entityParameter>
+    <entityField>
+      <name>MAILSOFEXTERN</name>
+      <title>Externe Benutzer</title>
+      <dropDownProcess>%aditoprj%/entity/MSTTeamMember_entity/entityfields/mailsofextern/dropDownProcess.js</dropDownProcess>
+      <selectionMode>MULTI</selectionMode>
+    </entityField>
+    <entityField>
+      <name>EXTERN</name>
+      <title>Nicht vorhandene externe Benutzer einladen?</title>
+      <contentType>BOOLEAN</contentType>
+    </entityField>
+    <entityParameter>
+      <name>UpnsOfMembers_param</name>
+      <expose v="true" />
+    </entityParameter>
+    <entityParameter>
+      <name>MailsOfExtern_param</name>
+      <expose v="true" />
+    </entityParameter>
+  </entityFields>
+  <recordContainers>
+    <jDitoRecordContainer>
+      <name>jdito</name>
+      <jDitoRecordAlias>Data_alias</jDitoRecordAlias>
+      <contentProcess>%aditoprj%/entity/MSTTeamMember_entity/recordcontainers/jdito/contentProcess.js</contentProcess>
+      <hasDependentRecords v="true" />
+      <onInsert>%aditoprj%/entity/MSTTeamMember_entity/recordcontainers/jdito/onInsert.js</onInsert>
+      <recordFieldMappings>
+        <jDitoRecordFieldMapping>
+          <name>UID.value</name>
+        </jDitoRecordFieldMapping>
+        <jDitoRecordFieldMapping>
+          <name>UPNSOFMEMBERS.value</name>
+        </jDitoRecordFieldMapping>
+        <jDitoRecordFieldMapping>
+          <name>ARETHESEOWNERS.value</name>
+        </jDitoRecordFieldMapping>
+        <jDitoRecordFieldMapping>
+          <name>MAILSOFEXTERN.value</name>
+        </jDitoRecordFieldMapping>
+        <jDitoRecordFieldMapping>
+          <name>EXTERN.value</name>
+        </jDitoRecordFieldMapping>
+      </recordFieldMappings>
+    </jDitoRecordContainer>
+  </recordContainers>
+</entity>
diff --git a/entity/MSTTeamMember_entity/entityfields/mailsofextern/dropDownProcess.js b/entity/MSTTeamMember_entity/entityfields/mailsofextern/dropDownProcess.js
new file mode 100644
index 00000000000..9aa7e9e18d0
--- /dev/null
+++ b/entity/MSTTeamMember_entity/entityfields/mailsofextern/dropDownProcess.js
@@ -0,0 +1,6 @@
+import("system.result");
+import("system.vars");
+
+var mails = vars.getString("$param.MailsOfExtern_param");
+if (mails)
+    result.object(JSON.parse(mails));
\ No newline at end of file
diff --git a/entity/MSTTeamMember_entity/entityfields/upnsofmembers/dropDownProcess.js b/entity/MSTTeamMember_entity/entityfields/upnsofmembers/dropDownProcess.js
new file mode 100644
index 00000000000..4f6ddbb607f
--- /dev/null
+++ b/entity/MSTTeamMember_entity/entityfields/upnsofmembers/dropDownProcess.js
@@ -0,0 +1,6 @@
+import("system.result");
+import("system.vars");
+
+var upns = vars.getString("$param.UpnsOfMembers_param");
+if (upns)
+    result.object(JSON.parse(upns));
\ No newline at end of file
diff --git a/entity/MSTTeamMember_entity/recordcontainers/jdito/contentProcess.js b/entity/MSTTeamMember_entity/recordcontainers/jdito/contentProcess.js
new file mode 100644
index 00000000000..488d22d4b38
--- /dev/null
+++ b/entity/MSTTeamMember_entity/recordcontainers/jdito/contentProcess.js
@@ -0,0 +1,9 @@
+import("system.result");
+import("system.vars");
+
+//TODO: This dummy implementation shouldn't be nescessary here. Remove this process eventually. #1051003
+var rows = [];
+if (vars.get("$local.idvalues"))
+    rows = vars.get("$local.idvalues").map(function (id) {return [id, "", "", "", ""];});
+
+result.object(rows);
\ No newline at end of file
diff --git a/entity/MSTTeamMember_entity/recordcontainers/jdito/onInsert.js b/entity/MSTTeamMember_entity/recordcontainers/jdito/onInsert.js
new file mode 100644
index 00000000000..0ffe832f7cd
--- /dev/null
+++ b/entity/MSTTeamMember_entity/recordcontainers/jdito/onInsert.js
@@ -0,0 +1,57 @@
+import("system.teams");
+import("Sql_lib");
+import("system.vars");
+import("system.question");
+
+var teamId = newSelect("MST_TEAMID")
+    .from("MST_TEAM")
+    .where("MST_TEAM.OBJECT_ROWID", vars.get("$param.ROWID_param"))
+    .cell();
+    
+var rowData = vars.get("$local.rowdata");
+
+var upnsOfMembers = text.decodeMS(rowData["UPNSOFMEMBERS.value"]);
+var areTheseOwners = rowData["ARETHESEOWNERS.value"];
+var mailsOfExtern = text.decodeMS(rowData["MAILSOFEXTERN.value"]);
+var sendInvitation = rowData["EXTERN.value"];
+var failedInternUsers;
+var failedExternUsers;
+
+if(upnsOfMembers != "")
+{
+    if(areTheseOwners == 1)
+    {
+        failedUsers = teams.addMembers(teamId, upnsOfMembers, true);
+        if(failedUsers != null)
+            {
+                question.showMessage(failedUsers, "FailedUsers");
+            }
+    }
+    else
+    {
+        failedUsers = teams.addMembers(teamId, upnsOfMembers, false);
+        if(failedUsers != null)
+            {
+                question.showMessage(failedUsers, "FailedUsers");
+            }
+    }
+}
+if(mailsOfExtern != "")
+{
+    if(sendInvitation == 1)
+    {
+        failedExternUsers = teams.addExternMembers(teamId, mailsOfExtern, true);
+        if(failedExternUsers != null)
+            {
+                question.showMessage(failedExternUsers, "FailedExternUsers");
+            }
+    }
+    else
+    {
+        failedExternUsers = teams.addExternMembers(teamId, mailsOfExtern, false);
+        if(failedExternUsers != null)
+            {
+                question.showMessage(failedExternUsers, "FailedExternUsers");
+            }
+    }
+}
diff --git a/entity/MSTTeam_entity/MSTTeam_entity.aod b/entity/MSTTeam_entity/MSTTeam_entity.aod
new file mode 100644
index 00000000000..7481608126b
--- /dev/null
+++ b/entity/MSTTeam_entity/MSTTeam_entity.aod
@@ -0,0 +1,141 @@
+<?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.14" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.14">
+  <name>MSTTeam_entity</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <recordContainer>jdito</recordContainer>
+  <entityFields>
+    <entityProvider>
+      <name>#PROVIDER</name>
+    </entityProvider>
+    <entityField>
+      <name>UID</name>
+    </entityField>
+    <entityField>
+      <name>TEAMNAME</name>
+      <title>Name</title>
+      <valueProcess>%aditoprj%/entity/MSTTeam_entity/entityfields/teamname/valueProcess.js</valueProcess>
+    </entityField>
+    <entityField>
+      <name>DESCRIPTION</name>
+      <title>Description</title>
+      <valueProcess>%aditoprj%/entity/MSTTeam_entity/entityfields/description/valueProcess.js</valueProcess>
+    </entityField>
+    <entityParameter>
+      <name>TeamName_param</name>
+      <expose v="true" />
+    </entityParameter>
+    <entityParameter>
+      <name>Description_param</name>
+      <expose v="true" />
+    </entityParameter>
+    <entityParameter>
+      <name>UpnsOfOwners_param</name>
+      <expose v="true" />
+    </entityParameter>
+    <entityParameter>
+      <name>UpnsOfMembers_param</name>
+      <expose v="true" />
+    </entityParameter>
+    <entityField>
+      <name>UPNSOFMEMBERS</name>
+      <title>Members</title>
+      <dropDownProcess>%aditoprj%/entity/MSTTeam_entity/entityfields/upnsofmembers/dropDownProcess.js</dropDownProcess>
+      <selectionMode>MULTI</selectionMode>
+    </entityField>
+    <entityField>
+      <name>UPNSOFOWNERS</name>
+      <title>Owners</title>
+      <dropDownProcess>%aditoprj%/entity/MSTTeam_entity/entityfields/upnsofowners/dropDownProcess.js</dropDownProcess>
+      <selectionMode>MULTI</selectionMode>
+    </entityField>
+    <entityParameter>
+      <name>RowId_param</name>
+      <expose v="true" />
+    </entityParameter>
+    <entityField>
+      <name>OBECT_ROWID</name>
+      <valueProcess>%aditoprj%/entity/MSTTeam_entity/entityfields/obect_rowid/valueProcess.js</valueProcess>
+    </entityField>
+    <entityParameter>
+      <name>ChannelName_param</name>
+      <expose v="true" />
+    </entityParameter>
+    <entityParameter>
+      <name>Mailnickname_param</name>
+      <expose v="true" />
+    </entityParameter>
+    <entityConsumer>
+      <name>MemberComsumer</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Member_entity</entityName>
+        <fieldName>TeamMemberProvider</fieldName>
+      </dependency>
+      <children>
+        <entityParameter>
+          <name>ObjectRowId_param</name>
+          <valueProcess>%aditoprj%/entity/MSTTeam_entity/entityfields/membercomsumer/children/objectrowid_param/valueProcess.js</valueProcess>
+        </entityParameter>
+        <entityParameter>
+          <name>ObjectType_param</name>
+          <valueProcess>%aditoprj%/entity/MSTTeam_entity/entityfields/membercomsumer/children/objecttype_param/valueProcess.js</valueProcess>
+        </entityParameter>
+      </children>
+    </entityConsumer>
+    <entityField>
+      <name>EXTERN</name>
+      <title>Nicht vorhandene externe Benutzer einladen?</title>
+      <contentType>BOOLEAN</contentType>
+    </entityField>
+    <entityField>
+      <name>MAILSOFEXTERN</name>
+      <title>Externe Benutzer</title>
+      <dropDownProcess>%aditoprj%/entity/MSTTeam_entity/entityfields/mailsofextern/dropDownProcess.js</dropDownProcess>
+      <selectionMode>MULTI</selectionMode>
+    </entityField>
+    <entityParameter>
+      <name>MailsOfExtern_param</name>
+      <expose v="true" />
+    </entityParameter>
+    <entityField>
+      <name>UPNSOFOWNERSORIGINAL</name>
+      <dropDownProcess>%aditoprj%/entity/MSTTeam_entity/entityfields/upnsofownersoriginal/dropDownProcess.js</dropDownProcess>
+      <selectionMode>MULTI</selectionMode>
+    </entityField>
+  </entityFields>
+  <recordContainers>
+    <jDitoRecordContainer>
+      <name>jdito</name>
+      <jDitoRecordAlias>Data_alias</jDitoRecordAlias>
+      <isPageable v="true" />
+      <contentProcess>%aditoprj%/entity/MSTTeam_entity/recordcontainers/jdito/contentProcess.js</contentProcess>
+      <onInsert>%aditoprj%/entity/MSTTeam_entity/recordcontainers/jdito/onInsert.js</onInsert>
+      <recordFieldMappings>
+        <jDitoRecordFieldMapping>
+          <name>UID.value</name>
+        </jDitoRecordFieldMapping>
+        <jDitoRecordFieldMapping>
+          <name>TEAMNAME.value</name>
+        </jDitoRecordFieldMapping>
+        <jDitoRecordFieldMapping>
+          <name>DESCRIPTION.value</name>
+        </jDitoRecordFieldMapping>
+        <jDitoRecordFieldMapping>
+          <name>OBECT_ROWID.value</name>
+        </jDitoRecordFieldMapping>
+        <jDitoRecordFieldMapping>
+          <name>UPNSOFMEMBERS.value</name>
+        </jDitoRecordFieldMapping>
+        <jDitoRecordFieldMapping>
+          <name>UPNSOFOWNERS.value</name>
+        </jDitoRecordFieldMapping>
+        <jDitoRecordFieldMapping>
+          <name>MAILSOFEXTERN.value</name>
+        </jDitoRecordFieldMapping>
+        <jDitoRecordFieldMapping>
+          <name>EXTERN.value</name>
+        </jDitoRecordFieldMapping>
+      </recordFieldMappings>
+    </jDitoRecordContainer>
+  </recordContainers>
+</entity>
diff --git a/entity/MSTTeam_entity/entityfields/description/valueProcess.js b/entity/MSTTeam_entity/entityfields/description/valueProcess.js
new file mode 100644
index 00000000000..561cefe7b56
--- /dev/null
+++ b/entity/MSTTeam_entity/entityfields/description/valueProcess.js
@@ -0,0 +1,6 @@
+import("system.result");
+import("system.neon");
+import("system.vars");
+
+if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && vars.get("$param.Description_param") && vars.get("$this.value") == null)
+    result.string(vars.get("$param.Description_param"));
\ No newline at end of file
diff --git a/entity/MSTTeam_entity/entityfields/mailsofextern/dropDownProcess.js b/entity/MSTTeam_entity/entityfields/mailsofextern/dropDownProcess.js
new file mode 100644
index 00000000000..9aa7e9e18d0
--- /dev/null
+++ b/entity/MSTTeam_entity/entityfields/mailsofextern/dropDownProcess.js
@@ -0,0 +1,6 @@
+import("system.result");
+import("system.vars");
+
+var mails = vars.getString("$param.MailsOfExtern_param");
+if (mails)
+    result.object(JSON.parse(mails));
\ No newline at end of file
diff --git a/entity/MSTTeam_entity/entityfields/membercomsumer/children/objectrowid_param/valueProcess.js b/entity/MSTTeam_entity/entityfields/membercomsumer/children/objectrowid_param/valueProcess.js
new file mode 100644
index 00000000000..90824419458
--- /dev/null
+++ b/entity/MSTTeam_entity/entityfields/membercomsumer/children/objectrowid_param/valueProcess.js
@@ -0,0 +1,4 @@
+import("system.result");
+import("system.vars");
+
+result.string(vars.get("$param.RowId_param"));
\ No newline at end of file
diff --git a/entity/MSTTeam_entity/entityfields/membercomsumer/children/objecttype_param/valueProcess.js b/entity/MSTTeam_entity/entityfields/membercomsumer/children/objecttype_param/valueProcess.js
new file mode 100644
index 00000000000..32bdd9f268d
--- /dev/null
+++ b/entity/MSTTeam_entity/entityfields/membercomsumer/children/objecttype_param/valueProcess.js
@@ -0,0 +1,3 @@
+import("system.result");
+
+result.string("Salesproject");
\ No newline at end of file
diff --git a/entity/MSTTeam_entity/entityfields/obect_rowid/valueProcess.js b/entity/MSTTeam_entity/entityfields/obect_rowid/valueProcess.js
new file mode 100644
index 00000000000..cf5cb63c330
--- /dev/null
+++ b/entity/MSTTeam_entity/entityfields/obect_rowid/valueProcess.js
@@ -0,0 +1,6 @@
+import("system.result");
+import("system.neon");
+import("system.vars");
+
+if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && vars.get("$param.RowId_param"))
+    result.string(vars.get("$param.RowId_param"));
\ No newline at end of file
diff --git a/entity/MSTTeam_entity/entityfields/teamname/valueProcess.js b/entity/MSTTeam_entity/entityfields/teamname/valueProcess.js
new file mode 100644
index 00000000000..31b659fe172
--- /dev/null
+++ b/entity/MSTTeam_entity/entityfields/teamname/valueProcess.js
@@ -0,0 +1,6 @@
+import("system.result");
+import("system.neon");
+import("system.vars");
+
+if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && vars.get("$param.TeamName_param") && vars.get("$this.value") == null)
+    result.string(vars.get("$param.TeamName_param"));
\ No newline at end of file
diff --git a/entity/MSTTeam_entity/entityfields/upnsofmembers/dropDownProcess.js b/entity/MSTTeam_entity/entityfields/upnsofmembers/dropDownProcess.js
new file mode 100644
index 00000000000..4f6ddbb607f
--- /dev/null
+++ b/entity/MSTTeam_entity/entityfields/upnsofmembers/dropDownProcess.js
@@ -0,0 +1,6 @@
+import("system.result");
+import("system.vars");
+
+var upns = vars.getString("$param.UpnsOfMembers_param");
+if (upns)
+    result.object(JSON.parse(upns));
\ No newline at end of file
diff --git a/entity/MSTTeam_entity/entityfields/upnsofowners/dropDownProcess.js b/entity/MSTTeam_entity/entityfields/upnsofowners/dropDownProcess.js
new file mode 100644
index 00000000000..92332745d43
--- /dev/null
+++ b/entity/MSTTeam_entity/entityfields/upnsofowners/dropDownProcess.js
@@ -0,0 +1,6 @@
+import("system.result");
+import("system.vars");
+
+var upns = vars.getString("$param.UpnsOfOwners_param");
+if (upns)
+    result.object(JSON.parse(upns));
\ No newline at end of file
diff --git a/entity/MSTTeam_entity/entityfields/upnsofownersoriginal/dropDownProcess.js b/entity/MSTTeam_entity/entityfields/upnsofownersoriginal/dropDownProcess.js
new file mode 100644
index 00000000000..1c0f1126dbe
--- /dev/null
+++ b/entity/MSTTeam_entity/entityfields/upnsofownersoriginal/dropDownProcess.js
@@ -0,0 +1,17 @@
+//import("system.entities");
+//import("system.result");
+//import("system.logging");
+//import("system.vars");
+//
+//var memberEntries = entities.createConfigForLoadingRows().entity("Member_entity").provider("TeamMemberProvider").addParameter("ObjectRowId_param", vars.get("$param.RowId_param")).addParameter("ObjectType_param", "Salesproject").fields(["CONTACT_ID", "PERSON_FULL_NAME"]);
+//
+//var members = entities.getRows(memberEntries);
+//
+//logging.log(members);
+//
+//members = members.map(function (member)
+//{
+//    return [member["CONTACT_ID"], member["PERSON_FULL_NAME"]];
+//})
+//
+//result.object(members);
diff --git a/entity/MSTTeam_entity/recordcontainers/jdito/contentProcess.js b/entity/MSTTeam_entity/recordcontainers/jdito/contentProcess.js
new file mode 100644
index 00000000000..6eb83082a7e
--- /dev/null
+++ b/entity/MSTTeam_entity/recordcontainers/jdito/contentProcess.js
@@ -0,0 +1,9 @@
+import("system.result");
+import("system.vars");
+
+//TODO: This dummy implementation shouldn't be nescessary here. Remove this process eventually. #1051003
+var rows = [];
+if (vars.get("$local.idvalues"))
+    rows = vars.get("$local.idvalues").map(function (id) {return [id, "", "", "", "", "", "", ""];});
+
+result.object(rows);
\ No newline at end of file
diff --git a/entity/MSTTeam_entity/recordcontainers/jdito/onInsert.js b/entity/MSTTeam_entity/recordcontainers/jdito/onInsert.js
new file mode 100644
index 00000000000..a98341bbe4c
--- /dev/null
+++ b/entity/MSTTeam_entity/recordcontainers/jdito/onInsert.js
@@ -0,0 +1,91 @@
+import("system.logging");
+import("Sql_lib");
+import("system.vars");
+import("system.teams");
+import("system.text");
+import("system.util");
+import("system.neon");
+
+var rowData = vars.get("$local.rowdata");
+var teamName = rowData["TEAMNAME.value"];
+var mailNickname = vars.get("$param.Mailnickname_param");
+
+var description = rowData["DESCRIPTION.value"];
+var upnsOfOwners = text.decodeMS(rowData["UPNSOFOWNERS.value"]);
+var upnsOfMembers = text.decodeMS(rowData["UPNSOFMEMBERS.value"]);
+var mailsOfExtern = text.decodeMS(rowData["MAILSOFEXTERN.value"]);
+var sendInvitation = rowData["EXTERN.value"];
+
+var users = [];
+
+for(var i = 0; i<upnsOfMembers.length(); i++)
+    {
+        var user = createInternalUserConfig(upnsOfMembers[i])
+        if(isOwner)
+        {
+            user.setOwner(isOwner);
+        }
+        
+        users.push(user);
+    }
+    
+    teams.addMembers(users);
+
+var teamData;
+if(upnsOfOwners)
+{
+    teamData = teams.createTeam(teamName, description, mailNickname, true, false, upnsOfOwners);
+}
+if(teamData)
+{
+    var failedUsers;
+    var failedExternUsers;
+    
+    if(upnsOfMembers != "")
+    {
+        failedUsers = teams.addMembers(teamData["teamId"], upnsOfMembers, false);
+        if(failedUsers != null)
+            {
+                question.showMessage(failedUsers, "FailedUsers");
+            }
+    }
+    
+    if(mailsOfExtern != "")
+    {
+        if(sendInvitation == 1)
+        {
+            failedExternUsers = teams.addExternMembers(teamData["teamId"], mailsOfExtern, true);
+            if(failedExternUsers != null)
+            {
+                question.showMessage(failedExternUsers, "FailedExternUsers");
+            }
+
+        }
+        else
+        {
+            failedExternUsers = teams.addExternMembers(teamData["teamId"], mailsOfExtern, false);
+            if(failedExternUsers != null)
+            {
+                question.showMessage(failedExternUsers, "FailedExternUsers");
+            }
+
+        }
+    }
+
+    var teamId = teamData["teamId"];
+    teamName = teamData["teamName"];
+    var channelId = teamData["generalChannelId"];
+    var webUrl = teamData["webUrl"]
+
+
+    new SqlBuilder().insertFields({
+        "MST_ID" : util.getNewUUID(),
+        "MST_TEAMID" : teamId,
+        "TEAMNAME" : teamName,
+        "GENERAL_CHANNELID" : channelId,
+        "OBJECT_ROWID" : vars.get("$param.RowId_param"),
+        "IS_ARCHIVED" : 0
+    }, "MST_TEAM");
+}
+
+neon.refreshAll();
diff --git a/entity/MSTTeamsMessage_entity/MSTTeamsMessage_entity.aod b/entity/MSTTeamsMessage_entity/MSTTeamsMessage_entity.aod
new file mode 100644
index 00000000000..cbfb921ec8c
--- /dev/null
+++ b/entity/MSTTeamsMessage_entity/MSTTeamsMessage_entity.aod
@@ -0,0 +1,74 @@
+<?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.14" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.14">
+  <name>MSTTeamsMessage_entity</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <recordContainer>jdito</recordContainer>
+  <entityFields>
+    <entityProvider>
+      <name>#PROVIDER</name>
+    </entityProvider>
+    <entityField>
+      <name>FROM</name>
+      <title>Author</title>
+    </entityField>
+    <entityField>
+      <name>MESSAGE</name>
+      <title>Nachricht</title>
+    </entityField>
+    <entityField>
+      <name>CREATED_DATE_TIME</name>
+      <title>Erstelldatum</title>
+    </entityField>
+    <entityProvider>
+      <name>Messages</name>
+      <recordContainer>jdito</recordContainer>
+      <dependencies>
+        <entityDependency>
+          <name>89048e4d-32bc-4531-9b45-b0c0d9de82b1</name>
+          <entityName>MSTTeamChat_entity</entityName>
+          <fieldName>Consumer</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+      </dependencies>
+    </entityProvider>
+    <entityField>
+      <name>UID</name>
+    </entityField>
+    <entityActionGroup>
+      <name>MSTeam</name>
+      <children>
+        <entityActionField>
+          <name>LoadNewMessages</name>
+          <title>Lade neue Nachrichten</title>
+          <onActionProcess>%aditoprj%/entity/MSTTeamsMessage_entity/entityfields/msteam/children/loadnewmessages/onActionProcess.js</onActionProcess>
+        </entityActionField>
+      </children>
+    </entityActionGroup>
+    <entityParameter>
+      <name>Messages_param</name>
+      <expose v="true" />
+    </entityParameter>
+  </entityFields>
+  <recordContainers>
+    <jDitoRecordContainer>
+      <name>jdito</name>
+      <jDitoRecordAlias>Data_alias</jDitoRecordAlias>
+      <contentProcess>%aditoprj%/entity/MSTTeamsMessage_entity/recordcontainers/jdito/contentProcess.js</contentProcess>
+      <title>Nachrichten</title>
+      <recordFieldMappings>
+        <jDitoRecordFieldMapping>
+          <name>UID.value</name>
+        </jDitoRecordFieldMapping>
+        <jDitoRecordFieldMapping>
+          <name>FROM.value</name>
+        </jDitoRecordFieldMapping>
+        <jDitoRecordFieldMapping>
+          <name>MESSAGE.value</name>
+        </jDitoRecordFieldMapping>
+        <jDitoRecordFieldMapping>
+          <name>CREATED_DATE_TIME.value</name>
+        </jDitoRecordFieldMapping>
+      </recordFieldMappings>
+    </jDitoRecordContainer>
+  </recordContainers>
+</entity>
diff --git a/entity/MSTTeamsMessage_entity/entityfields/msteam/children/loadnewmessages/onActionProcess.js b/entity/MSTTeamsMessage_entity/entityfields/msteam/children/loadnewmessages/onActionProcess.js
new file mode 100644
index 00000000000..c7682a930da
--- /dev/null
+++ b/entity/MSTTeamsMessage_entity/entityfields/msteam/children/loadnewmessages/onActionProcess.js
@@ -0,0 +1,26 @@
+import("system.teams");
+import("system.vars");
+import("system.logging");
+
+if(vars.get("$global.nextLink"))
+{
+   var messages = teams.getNextChannelMessages(vars.get("$global.nextLink"));
+   var jsonMessages = JSON.parse(messages);
+   
+   if(jsonMessages.nextLink)
+   {
+       vars.set("$global.nextLink", jsonMessages.nextLink)
+   }
+   
+   for(var i = 0; i<jsonMessages.messages.length; i++)
+   {
+       logging.log(jsonMessages.messages[i].author.userName + "; " + jsonMessages.messages[i].message.message + "; " + jsonMessages.messages[i].createdDateTime);
+   }
+
+}
+
+
+
+
+
+
diff --git a/entity/MSTTeamsMessage_entity/recordcontainers/jdito/contentProcess.js b/entity/MSTTeamsMessage_entity/recordcontainers/jdito/contentProcess.js
new file mode 100644
index 00000000000..1bae78e0753
--- /dev/null
+++ b/entity/MSTTeamsMessage_entity/recordcontainers/jdito/contentProcess.js
@@ -0,0 +1,30 @@
+import("system.result");
+import("system.util");
+import("system.vars");
+import("system.neon");
+
+if(vars.get("$param.Messages_param"))
+{    
+    var jsonMessages = JSON.parse(vars.get("$param.Messages_param"));
+
+    if(jsonMessages.nextLink != null)
+    {
+        vars.set("$global.nextLink", jsonMessages.nextLink);
+    }
+    else
+    {
+        vars.set("$global.nextLink", "");
+    }
+
+    var myDataArray = [];
+
+    for(var i = 0; i<jsonMessages.messages.length; i++)
+    {
+        myDataArray.push([util.getNewUUID(), jsonMessages.messages[i].author.userName, jsonMessages.messages[i].message.message, jsonMessages.messages[i].createdDateTime])
+    }
+    
+    neon.refreshAll();
+    
+    result.object(myDataArray);
+}
+
diff --git a/entity/Member_entity/Member_entity.aod b/entity/Member_entity/Member_entity.aod
index 8dbfb116d09..104bb57c838 100644
--- a/entity/Member_entity/Member_entity.aod
+++ b/entity/Member_entity/Member_entity.aod
@@ -199,6 +199,90 @@
       <contentType>IMAGE</contentType>
       <valueProcess>%aditoprj%/entity/Member_entity/entityfields/image/valueProcess.js</valueProcess>
     </entityField>
+    <entityActionGroup>
+      <name>MSTeamsActionGroup</name>
+      <title>MSTeamsActionGroup</title>
+      <children>
+        <entityActionField>
+          <name>createTeam</name>
+          <title>Team erstellen</title>
+          <onActionProcess>%aditoprj%/entity/Member_entity/entityfields/msteamsactiongroup/children/createteam/onActionProcess.js</onActionProcess>
+          <isSelectionAction v="false" />
+          <iconId>NEON:PLUS</iconId>
+          <state>EDITABLE</state>
+          <stateProcess>%aditoprj%/entity/Member_entity/entityfields/msteamsactiongroup/children/createteam/stateProcess.js</stateProcess>
+          <tooltip>Erstelle ein neues MicrosoftTeams Team</tooltip>
+        </entityActionField>
+        <entityActionField>
+          <name>chooseTeam</name>
+          <title>Team auswählen</title>
+          <onActionProcess>%aditoprj%/entity/Member_entity/entityfields/msteamsactiongroup/children/chooseteam/onActionProcess.js</onActionProcess>
+          <stateProcess>%aditoprj%/entity/Member_entity/entityfields/msteamsactiongroup/children/chooseteam/stateProcess.js</stateProcess>
+          <tooltip>Wähle ein bereits hinterlegtes Team</tooltip>
+        </entityActionField>
+        <entityActionField>
+          <name>deleteTeam</name>
+          <title>Team löschen</title>
+          <onActionProcess>%aditoprj%/entity/Member_entity/entityfields/msteamsactiongroup/children/deleteteam/onActionProcess.js</onActionProcess>
+          <iconId>NEON:TRASH</iconId>
+          <stateProcess>%aditoprj%/entity/Member_entity/entityfields/msteamsactiongroup/children/deleteteam/stateProcess.js</stateProcess>
+          <tooltip>Lösche das verknüpfte MSTeams Team</tooltip>
+        </entityActionField>
+        <entityActionField>
+          <name>createChannel</name>
+          <title>Channel erstellen</title>
+          <onActionProcess>%aditoprj%/entity/Member_entity/entityfields/msteamsactiongroup/children/createchannel/onActionProcess.js</onActionProcess>
+          <iconId>VAADIN:PLUS</iconId>
+          <stateProcess>%aditoprj%/entity/Member_entity/entityfields/msteamsactiongroup/children/createchannel/stateProcess.js</stateProcess>
+          <tooltip>Erstelle einen neuen Channel</tooltip>
+        </entityActionField>
+        <entityActionField>
+          <name>restoreTeam</name>
+          <title>Team wiederherstellen</title>
+          <onActionProcess>%aditoprj%/entity/Member_entity/entityfields/msteamsactiongroup/children/restoreteam/onActionProcess.js</onActionProcess>
+          <iconId>VAADIN:ARROW_BACKWARD</iconId>
+          <stateProcess>%aditoprj%/entity/Member_entity/entityfields/msteamsactiongroup/children/restoreteam/stateProcess.js</stateProcess>
+          <tooltip>Stelle das Team wieder her</tooltip>
+        </entityActionField>
+        <entityActionField>
+          <name>addApp</name>
+          <title>App hinzufügen</title>
+          <onActionProcess>%aditoprj%/entity/Member_entity/entityfields/msteamsactiongroup/children/addapp/onActionProcess.js</onActionProcess>
+          <stateProcess>%aditoprj%/entity/Member_entity/entityfields/msteamsactiongroup/children/addapp/stateProcess.js</stateProcess>
+          <tooltip>Fügt eine App zum Team hinzu</tooltip>
+        </entityActionField>
+        <entityActionField>
+          <name>addNewMember</name>
+          <title>Member hinzufügen</title>
+          <onActionProcess>%aditoprj%/entity/Member_entity/entityfields/msteamsactiongroup/children/addnewmember/onActionProcess.js</onActionProcess>
+          <stateProcess>%aditoprj%/entity/Member_entity/entityfields/msteamsactiongroup/children/addnewmember/stateProcess.js</stateProcess>
+          <tooltip>Fügt neue Member zum Team hinzu</tooltip>
+        </entityActionField>
+        <entityActionField>
+          <name>changeToMSTeam</name>
+          <title>Zum Team wechseln</title>
+          <onActionProcess>%aditoprj%/entity/Member_entity/entityfields/msteamsactiongroup/children/changetomsteam/onActionProcess.js</onActionProcess>
+          <stateProcess>%aditoprj%/entity/Member_entity/entityfields/msteamsactiongroup/children/changetomsteam/stateProcess.js</stateProcess>
+        </entityActionField>
+      </children>
+    </entityActionGroup>
+    <entityField>
+      <name>ASSIGNEDTEAM</name>
+      <title>Hinterlegtes Team</title>
+      <valueProcess>%aditoprj%/entity/Member_entity/entityfields/assignedteam/valueProcess.js</valueProcess>
+    </entityField>
+    <entityProvider>
+      <name>TeamMemberProvider</name>
+      <lookupIdfield>CONTACT_ID</lookupIdfield>
+      <dependencies>
+        <entityDependency>
+          <name>80ac002b-2d74-4cfb-a504-347f8abfd7eb</name>
+          <entityName>MSTTeam_entity</entityName>
+          <fieldName>MemberComsumer</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+      </dependencies>
+    </entityProvider>
   </entityFields>
   <recordContainers>
     <dbRecordContainer>
diff --git a/entity/Member_entity/entityfields/assignedteam/valueProcess.js b/entity/Member_entity/entityfields/assignedteam/valueProcess.js
new file mode 100644
index 00000000000..def1352e692
--- /dev/null
+++ b/entity/Member_entity/entityfields/assignedteam/valueProcess.js
@@ -0,0 +1,38 @@
+import("system.vars");
+import("system.neon");
+import("system.result");
+import("Sql_lib");
+    
+var saleprojectId = newSelect("OBJECT_ROWID")
+    .from("MST_TEAM")
+    .where("MST_TEAM.OBJECT_ROWID", "$param.ObjectRowId_param")
+    .cell();
+
+var isArchived = newSelect("IS_ARCHIVED")
+    .from("MST_TEAM")
+    .where("MST_TEAM.OBJECT_ROWID", "$param.ObjectRowId_param")
+    .cell();
+
+if(saleprojectId && isArchived == 0)
+{
+    var teamName = newSelect("TEAMNAME")
+    .from("MST_TEAM")
+    .where("MST_TEAM.OBJECT_ROWID", "$param.ObjectRowId_param")
+    .cell();
+    
+    result.string(teamName);
+}
+else if(saleprojectId && isArchived == 1)
+{
+    var teamName = newSelect("TEAMNAME")
+    .from("MST_TEAM")
+    .where("MST_TEAM.OBJECT_ROWID", "$param.ObjectRowId_param")
+    .cell();
+    
+    result.string("Es existiert ein archiviertes Team (" + teamName + ") zu diesem Projekt. Falls Sie dieses nochmal benötigen: Wählen Sie \"Team wiederherstellen\"");
+}
+else
+{
+    result.string("Es wurde noch kein Team zu diesem Projekt hinterlegt");
+}
+    
diff --git a/entity/Member_entity/entityfields/msteamsactiongroup/children/addapp/onActionProcess.js b/entity/Member_entity/entityfields/msteamsactiongroup/children/addapp/onActionProcess.js
new file mode 100644
index 00000000000..a7b5766ffee
--- /dev/null
+++ b/entity/Member_entity/entityfields/msteamsactiongroup/children/addapp/onActionProcess.js
@@ -0,0 +1,17 @@
+import("system.teams");
+import("Sql_lib");
+import("system.neon");
+
+
+var teamId = newSelect("MST_TEAMID")
+    .from("MST_TEAM")
+    .where("MST_TEAM.OBJECT_ROWID", "$param.ObjectRowId_param")
+    .cell();
+    
+//DAFÃœR MUSS ES EIN DESIGNER FELD GEBEN
+var appId = "27888276-ddc1-4e24-a07c-1023996fd892"
+    
+    
+teams.addAppToTeam(teamId, appId);
+
+neon.refreshAll();
\ No newline at end of file
diff --git a/entity/Member_entity/entityfields/msteamsactiongroup/children/addapp/stateProcess.js b/entity/Member_entity/entityfields/msteamsactiongroup/children/addapp/stateProcess.js
new file mode 100644
index 00000000000..4e1e6159f83
--- /dev/null
+++ b/entity/Member_entity/entityfields/msteamsactiongroup/children/addapp/stateProcess.js
@@ -0,0 +1,29 @@
+import("system.vars");
+import("system.neon");
+import("system.result");
+import("Sql_lib");
+
+var teamId = newSelect("MST_TEAMID")
+    .from("MST_TEAM")
+    .where("MST_TEAM.OBJECT_ROWID", "$param.ObjectRowId_param")
+    .cell();
+
+var isArchived = newSelect("IS_ARCHIVED")
+    .from("MST_TEAM")
+    .where("MST_TEAM.OBJECT_ROWID", "$param.ObjectRowId_param")
+    .cell();
+    
+var serviceUrl = newSelect("SERVICE_URL")
+    .from("MST_TEAM")
+    .where("MST_TEAM.OBJECT_ROWID", "$param.ObjectRowId_param")
+    .cell();
+
+    
+if (teamId == "" || isArchived == 1 || serviceUrl) 
+{
+    result.string(neon.COMPONENTSTATE_INVISIBLE);
+}
+else
+{
+    result.string(neon.COMPONENTSTATE_EDITABLE);
+}
\ No newline at end of file
diff --git a/entity/Member_entity/entityfields/msteamsactiongroup/children/addnewmember/onActionProcess.js b/entity/Member_entity/entityfields/msteamsactiongroup/children/addnewmember/onActionProcess.js
new file mode 100644
index 00000000000..fef435a8321
--- /dev/null
+++ b/entity/Member_entity/entityfields/msteamsactiongroup/children/addnewmember/onActionProcess.js
@@ -0,0 +1,11 @@
+import("system.neon");
+import("system.vars");
+
+var upnsOfMembers = [["lisa@mbsolutions2.onmicrosoft.com", "lisa@mbsolutions2.onmicrosoft.com"]];
+var mailsOfExtern = [["m.bilda@adito.de", "m.bilda@adito.de"]];
+
+neon.openContext("MSTTeamMember", null, null, neon.OPERATINGSTATE_NEW, {
+    "UpnsOfMembers_param" : JSON.stringify(upnsOfMembers),
+    "MailsOfExtern_param" : JSON.stringify(mailsOfExtern),
+    "ROWID_param" : vars.get("$param.ObjectRowId_param")
+});
diff --git a/entity/Member_entity/entityfields/msteamsactiongroup/children/addnewmember/stateProcess.js b/entity/Member_entity/entityfields/msteamsactiongroup/children/addnewmember/stateProcess.js
new file mode 100644
index 00000000000..f821050c044
--- /dev/null
+++ b/entity/Member_entity/entityfields/msteamsactiongroup/children/addnewmember/stateProcess.js
@@ -0,0 +1,23 @@
+import("system.vars");
+import("system.neon");
+import("system.result");
+import("Sql_lib");
+
+var teamId = newSelect("MST_TEAMID")
+    .from("MST_TEAM")
+    .where("MST_TEAM.OBJECT_ROWID", "$param.ObjectRowId_param")
+    .cell();
+
+var isArchived = newSelect("IS_ARCHIVED")
+    .from("MST_TEAM")
+    .where("MST_TEAM.OBJECT_ROWID", "$param.ObjectRowId_param")
+    .cell();
+    
+if (teamId == "" || isArchived == 1) 
+{
+    result.string(neon.COMPONENTSTATE_INVISIBLE);
+}
+else
+{
+    result.string(neon.COMPONENTSTATE_EDITABLE);
+}
\ No newline at end of file
diff --git a/entity/Member_entity/entityfields/msteamsactiongroup/children/changetomsteam/onActionProcess.js b/entity/Member_entity/entityfields/msteamsactiongroup/children/changetomsteam/onActionProcess.js
new file mode 100644
index 00000000000..c19bf006698
--- /dev/null
+++ b/entity/Member_entity/entityfields/msteamsactiongroup/children/changetomsteam/onActionProcess.js
@@ -0,0 +1,3 @@
+import("system.neon");
+
+neon.openUrl("https://teams.microsoft.com/l/team/19:0062b1c861df409391eaf0329b99db68%40thread.tacv2/conversations?groupId=c4c6a313-3d12-4941-900e-afc464755188&tenantId=bb59bb5b-90c7-41f9-85aa-f40da5c0c68a", true)
diff --git a/entity/Member_entity/entityfields/msteamsactiongroup/children/changetomsteam/stateProcess.js b/entity/Member_entity/entityfields/msteamsactiongroup/children/changetomsteam/stateProcess.js
new file mode 100644
index 00000000000..f821050c044
--- /dev/null
+++ b/entity/Member_entity/entityfields/msteamsactiongroup/children/changetomsteam/stateProcess.js
@@ -0,0 +1,23 @@
+import("system.vars");
+import("system.neon");
+import("system.result");
+import("Sql_lib");
+
+var teamId = newSelect("MST_TEAMID")
+    .from("MST_TEAM")
+    .where("MST_TEAM.OBJECT_ROWID", "$param.ObjectRowId_param")
+    .cell();
+
+var isArchived = newSelect("IS_ARCHIVED")
+    .from("MST_TEAM")
+    .where("MST_TEAM.OBJECT_ROWID", "$param.ObjectRowId_param")
+    .cell();
+    
+if (teamId == "" || isArchived == 1) 
+{
+    result.string(neon.COMPONENTSTATE_INVISIBLE);
+}
+else
+{
+    result.string(neon.COMPONENTSTATE_EDITABLE);
+}
\ No newline at end of file
diff --git a/entity/Member_entity/entityfields/msteamsactiongroup/children/chooseteam/onActionProcess.js b/entity/Member_entity/entityfields/msteamsactiongroup/children/chooseteam/onActionProcess.js
new file mode 100644
index 00000000000..c48327f1fee
--- /dev/null
+++ b/entity/Member_entity/entityfields/msteamsactiongroup/children/chooseteam/onActionProcess.js
@@ -0,0 +1,8 @@
+import("system.vars");
+import("system.neon");
+import("system.teams");
+import("system.logging");
+
+neon.openContext("MSTChooseTeam", null, null, neon.OPERATINGSTATE_NEW, {
+    "RowId_param" : vars.get("$param.ObjectRowId_param")
+});
\ No newline at end of file
diff --git a/entity/Member_entity/entityfields/msteamsactiongroup/children/chooseteam/stateProcess.js b/entity/Member_entity/entityfields/msteamsactiongroup/children/chooseteam/stateProcess.js
new file mode 100644
index 00000000000..29db7d098d9
--- /dev/null
+++ b/entity/Member_entity/entityfields/msteamsactiongroup/children/chooseteam/stateProcess.js
@@ -0,0 +1,11 @@
+import("system.vars");
+import("system.neon");
+import("system.result");
+import("Sql_lib");
+
+var teamId = newSelect("MST_TEAMID")
+    .from("MST_TEAM")
+    .where("MST_TEAM.OBJECT_ROWID", "$param.ObjectRowId_param")
+    .cell();
+    
+result.string(teamId != "" ? neon.COMPONENTSTATE_INVISIBLE : neon.COMPONENTSTATE_EDITABLE);
\ No newline at end of file
diff --git a/entity/Member_entity/entityfields/msteamsactiongroup/children/createchannel/onActionProcess.js b/entity/Member_entity/entityfields/msteamsactiongroup/children/createchannel/onActionProcess.js
new file mode 100644
index 00000000000..f72ee987fa0
--- /dev/null
+++ b/entity/Member_entity/entityfields/msteamsactiongroup/children/createchannel/onActionProcess.js
@@ -0,0 +1,12 @@
+import("system.neon");
+import("system.vars");
+    
+//Dafür muss es Designer Felder geben
+var channelName = "ADITO xRM";
+var channelDesc = "Das ist ein Zweitchannel, um genauer über bestimmte Themen zu diskutieren";
+
+neon.openContext("MSTTeamChannel", null, null, neon.OPERATINGSTATE_NEW,  {
+    "CHANNELNAME_param" : channelName,
+    "CHANNELDESC_param" : channelDesc,
+    "ROWID_param" : vars.get("$param.ObjectRowId_param")
+});
diff --git a/entity/Member_entity/entityfields/msteamsactiongroup/children/createchannel/stateProcess.js b/entity/Member_entity/entityfields/msteamsactiongroup/children/createchannel/stateProcess.js
new file mode 100644
index 00000000000..0c1128cf098
--- /dev/null
+++ b/entity/Member_entity/entityfields/msteamsactiongroup/children/createchannel/stateProcess.js
@@ -0,0 +1,23 @@
+import("system.vars");
+import("system.neon");
+import("system.result");
+import("Sql_lib");
+
+var teamId = newSelect("MST_TEAMID")
+    .from("MST_TEAM")
+    .where("MST_TEAM.OBJECT_ROWID", "$param.ObjectRowId_param")
+    .cell();
+    
+var isArchived = newSelect("IS_ARCHIVED")
+    .from("MST_TEAM")
+    .where("MST_TEAM.OBJECT_ROWID", "$param.ObjectRowId_param")
+    .cell();
+    
+if (teamId == "" || isArchived == 1) 
+{
+    result.string(neon.COMPONENTSTATE_INVISIBLE);
+}
+else
+{
+    result.string(neon.COMPONENTSTATE_EDITABLE);
+}
\ No newline at end of file
diff --git a/entity/Member_entity/entityfields/msteamsactiongroup/children/createteam/onActionProcess.js b/entity/Member_entity/entityfields/msteamsactiongroup/children/createteam/onActionProcess.js
new file mode 100644
index 00000000000..05de2e36656
--- /dev/null
+++ b/entity/Member_entity/entityfields/msteamsactiongroup/children/createteam/onActionProcess.js
@@ -0,0 +1,32 @@
+import("system.vars");
+import("system.neon");
+import("system.teams");
+import("Sql_lib");
+
+var rowId = vars.get("$param.ObjectRowId_param");
+
+var teamName = newSelect("PROJECTTITLE")
+    .from("SALESPROJECT")
+    .where("SALESPROJECT.SALESPROJECTID", rowId)
+    .cell();
+    
+var description = newSelect("INFO")
+    .from("SALESPROJECT")
+    .where("SALESPROJECT.SALESPROJECTID", rowId)
+    .cell();
+    
+var mailNickname = teamName.replace(/ /g, "");
+
+var upnsOfOwners = [["marco@mbsolutions2.onmicrosoft.com", "marco@mbsolutions2.onmicrosoft.com"], ["franz@mbsolutions2.onmicrosoft.com", "franz@mbsolutions2.onmicrosoft.com"], ["martin@mbsolutions2.onmicrosoft.com", "martin@mbsolutions2.onmicrosoft.com"]];
+var upnsOfMembers = [["marco@mbsolutions2.onmicrosoft.com", "marco@mbsolutions2.onmicrosoft.com"], ["franz@mbsolutions2.onmicrosoft.com", "franz@mbsolutions2.onmicrosoft.com"], ["martin@mbsolutions2.onmicrosoft.com", "martin@mbsolutions2.onmicrosoft.com"]];
+var mailsOfExtern = [["m.bilda@adito.de", "m.bilda@adito.de"]];
+
+neon.openContext("MSTTeam", null, null, neon.OPERATINGSTATE_NEW, {
+    "RowId_param" : rowId,
+    "TeamName_param" : teamName,
+    "Description_param" : description,   
+    "Mailnickname_param" : mailNickname,    
+    "UpnsOfOwners_param" : JSON.stringify(upnsOfOwners),
+    "UpnsOfMembers_param" : JSON.stringify(upnsOfMembers),
+    "MailsOfExtern_param" : JSON.stringify(mailsOfExtern)
+});
\ No newline at end of file
diff --git a/entity/Member_entity/entityfields/msteamsactiongroup/children/createteam/stateProcess.js b/entity/Member_entity/entityfields/msteamsactiongroup/children/createteam/stateProcess.js
new file mode 100644
index 00000000000..c01cdd16766
--- /dev/null
+++ b/entity/Member_entity/entityfields/msteamsactiongroup/children/createteam/stateProcess.js
@@ -0,0 +1,11 @@
+import("system.vars");
+import("system.neon");
+import("system.result");
+import("Sql_lib");
+
+var teamId = newSelect("MST_TEAMID")
+    .from("MST_TEAM")
+    .where("MST_TEAM.OBJECT_ROWID", "$param.ObjectRowId_param")
+    .cell();
+
+result.string(teamId != "" ? neon.COMPONENTSTATE_INVISIBLE : neon.COMPONENTSTATE_EDITABLE);
\ No newline at end of file
diff --git a/entity/Member_entity/entityfields/msteamsactiongroup/children/deleteteam/onActionProcess.js b/entity/Member_entity/entityfields/msteamsactiongroup/children/deleteteam/onActionProcess.js
new file mode 100644
index 00000000000..84ac82f4f89
--- /dev/null
+++ b/entity/Member_entity/entityfields/msteamsactiongroup/children/deleteteam/onActionProcess.js
@@ -0,0 +1,30 @@
+import("system.teams");
+import("Sql_lib");
+import("system.datetime")
+
+
+var teamId = newSelect("MST_TEAMID")
+    .from("MST_TEAM")
+    .where("MST_TEAM.OBJECT_ROWID", "$param.ObjectRowId_param")
+    .cell();
+    
+    
+//Hat dieses Team mehrere Projekte??
+var teamIds = newSelect("MST_TEAMID")
+    .from("MST_TEAM")
+    .where("MST_TEAM.MST_TEAMID", teamId).arrayRow();
+    
+teams.archiveTeamAndDeleteGroup(teamId);
+
+for(var i = 0; i<teamIds.length; i++)
+    {
+        var finalDeleteDate = datetime.date() + (datetime.ONE_DAY * 30);
+    
+        newWhere("MST_TEAM.MST_TEAMID", teamIds[i])
+           .updateFields({
+                          "IS_ARCHIVED" : "1",
+                          "FINAL_DELETE_DATE" : finalDeleteDate
+                          });
+    }
+
+
diff --git a/entity/Member_entity/entityfields/msteamsactiongroup/children/deleteteam/stateProcess.js b/entity/Member_entity/entityfields/msteamsactiongroup/children/deleteteam/stateProcess.js
new file mode 100644
index 00000000000..b17a7492239
--- /dev/null
+++ b/entity/Member_entity/entityfields/msteamsactiongroup/children/deleteteam/stateProcess.js
@@ -0,0 +1,25 @@
+import("system.vars");
+import("system.neon");
+import("system.result");
+import("Sql_lib");
+
+var teamId = newSelect("MST_TEAMID")
+    .from("MST_TEAM")
+    .where("MST_TEAM.OBJECT_ROWID", "$param.ObjectRowId_param")
+    .cell();
+    
+var isArchived = newSelect("IS_ARCHIVED")
+    .from("MST_TEAM")
+    .where("MST_TEAM.OBJECT_ROWID", "$param.ObjectRowId_param")
+    .cell();
+    
+if (teamId == "" || isArchived == 1) 
+{
+    result.string(neon.COMPONENTSTATE_INVISIBLE);
+}
+else
+{
+result.string(neon.COMPONENTSTATE_EDITABLE);
+}
+
+neon.refreshAll();
\ No newline at end of file
diff --git a/entity/Member_entity/entityfields/msteamsactiongroup/children/restoreteam/onActionProcess.js b/entity/Member_entity/entityfields/msteamsactiongroup/children/restoreteam/onActionProcess.js
new file mode 100644
index 00000000000..dc58a876d04
--- /dev/null
+++ b/entity/Member_entity/entityfields/msteamsactiongroup/children/restoreteam/onActionProcess.js
@@ -0,0 +1,28 @@
+import("system.teams");
+import("Sql_lib");
+import("system.neon");
+
+
+var teamId = newSelect("MST_TEAMID")
+    .from("MST_TEAM")
+    .where("MST_TEAM.OBJECT_ROWID", "$param.ObjectRowId_param")
+    .cell();
+
+//Hat dieses Team mehrere Projekte??
+var teamIds = newSelect("MST_TEAMID")
+    .from("MST_TEAM")
+    .where("MST_TEAM.MST_TEAMID", teamId).arrayRow();
+    
+teams.unarchiveTeamAndRestoreGroup(teamId);
+
+for(var i = 0; i<teamIds.length; i++)
+    {            
+        newWhere("MST_TEAM.MST_TEAMID", teamIds[i])
+            .updateFields({
+                  "IS_ARCHIVED" : "0",
+                  "FINAL_DELETE_DATE" : ""
+                  });
+    }
+    
+    
+neon.refreshAll();
\ No newline at end of file
diff --git a/entity/Member_entity/entityfields/msteamsactiongroup/children/restoreteam/stateProcess.js b/entity/Member_entity/entityfields/msteamsactiongroup/children/restoreteam/stateProcess.js
new file mode 100644
index 00000000000..05f5e33fb61
--- /dev/null
+++ b/entity/Member_entity/entityfields/msteamsactiongroup/children/restoreteam/stateProcess.js
@@ -0,0 +1,23 @@
+import("system.vars");
+import("system.neon");
+import("system.result");
+import("Sql_lib");
+
+var teamId = newSelect("MST_TEAMID")
+    .from("MST_TEAM")
+    .where("MST_TEAM.OBJECT_ROWID", "$param.ObjectRowId_param")
+    .cell();
+
+var isArchived = newSelect("IS_ARCHIVED")
+    .from("MST_TEAM")
+    .where("MST_TEAM.OBJECT_ROWID", "$param.ObjectRowId_param")
+    .cell();
+    
+if (teamId == "" || isArchived == 0) 
+{
+    result.string(neon.COMPONENTSTATE_INVISIBLE);
+}
+else
+{
+    result.string(neon.COMPONENTSTATE_EDITABLE);
+}
\ No newline at end of file
diff --git a/entity/Salesproject_entity/Salesproject_entity.aod b/entity/Salesproject_entity/Salesproject_entity.aod
index 33c8be5fa86..ff47a2cfb20 100644
--- a/entity/Salesproject_entity/Salesproject_entity.aod
+++ b/entity/Salesproject_entity/Salesproject_entity.aod
@@ -749,6 +749,64 @@
       <iconId>VAADIN:PLAY</iconId>
       <stateProcess>%aditoprj%/entity/Salesproject_entity/entityfields/startworkflow/stateProcess.js</stateProcess>
     </entityActionField>
+    <entityActionField>
+      <name>createTeam</name>
+      <title>Team erstellen</title>
+      <onActionProcess>%aditoprj%/entity/Salesproject_entity/entityfields/createteam/onActionProcess.js</onActionProcess>
+      <iconId>NEON:PLUS</iconId>
+      <stateProcess>%aditoprj%/entity/Salesproject_entity/entityfields/createteam/stateProcess.js</stateProcess>
+      <tooltip>Erstelle ein neues MicrosoftTeams Team</tooltip>
+    </entityActionField>
+    <entityActionField>
+      <name>deleteTeam</name>
+      <title>Team löschen</title>
+      <onActionProcess>%aditoprj%/entity/Salesproject_entity/entityfields/deleteteam/onActionProcess.js</onActionProcess>
+      <iconId>NEON:TRASH</iconId>
+      <stateProcess>%aditoprj%/entity/Salesproject_entity/entityfields/deleteteam/stateProcess.js</stateProcess>
+      <tooltip>Lösche das verknüpfte MSTeams Team</tooltip>
+    </entityActionField>
+    <entityActionField>
+      <name>createChannel</name>
+      <title>Channel erstellen</title>
+      <onActionProcess>%aditoprj%/entity/Salesproject_entity/entityfields/createchannel/onActionProcess.js</onActionProcess>
+      <iconId>VAADIN:PLUS</iconId>
+      <stateProcess>%aditoprj%/entity/Salesproject_entity/entityfields/createchannel/stateProcess.js</stateProcess>
+      <tooltip>Erstelle einen neuen Channel</tooltip>
+    </entityActionField>
+    <entityActionField>
+      <name>addMember</name>
+      <title>Member hinzufügen</title>
+      <onActionProcess>%aditoprj%/entity/Salesproject_entity/entityfields/addmember/onActionProcess.js</onActionProcess>
+      <iconId>NEON:GROUP_APPOINTMENT</iconId>
+      <stateProcess>%aditoprj%/entity/Salesproject_entity/entityfields/addmember/stateProcess.js</stateProcess>
+      <tooltip>Füge neue Member hinzu</tooltip>
+    </entityActionField>
+    <entityActionField>
+      <name>addApp</name>
+      <title>App hinzufügen</title>
+      <onActionProcess>%aditoprj%/entity/Salesproject_entity/entityfields/addapp/onActionProcess.js</onActionProcess>
+      <iconId>NEON:PUZZLE</iconId>
+      <stateProcess>%aditoprj%/entity/Salesproject_entity/entityfields/addapp/stateProcess.js</stateProcess>
+      <tooltip>Fügt eine App zu einem Team hinzu</tooltip>
+    </entityActionField>
+    <entityActionField>
+      <name>restoreTeam</name>
+      <title>Team wiederherstellen</title>
+      <onActionProcess>%aditoprj%/entity/Salesproject_entity/entityfields/restoreteam/onActionProcess.js</onActionProcess>
+      <iconId>VAADIN:ARROW_BACKWARD</iconId>
+      <stateProcess>%aditoprj%/entity/Salesproject_entity/entityfields/restoreteam/stateProcess.js</stateProcess>
+      <tooltip>Stellt das Team wieder her</tooltip>
+    </entityActionField>
+    <entityField>
+      <name>ALLTEAMS</name>
+      <title>allTeams</title>
+      <selectionMode>MULTI</selectionMode>
+    </entityField>
+    <entityActionField>
+      <name>chooseTeam</name>
+      <title>chooseTeam</title>
+      <tooltip>Wähle ein bereits vorhandenes Team aus</tooltip>
+    </entityActionField>
   </entityFields>
   <recordContainers>
     <dbRecordContainer>
diff --git a/entity/Salesproject_entity/entityfields/addapp/onActionProcess.js b/entity/Salesproject_entity/entityfields/addapp/onActionProcess.js
new file mode 100644
index 00000000000..aa485d9bd79
--- /dev/null
+++ b/entity/Salesproject_entity/entityfields/addapp/onActionProcess.js
@@ -0,0 +1,12 @@
+import("system.teams");
+import("Sql_lib");
+
+
+var teamId = newSelect("MST_TEAMID")
+    .from("MST_TEAM")
+    .where("MST_TEAM.OBJECT_ROWID", "$field.OBJECT_ROWID")
+    .cell();
+    
+var appId = "768e1918-bc98-4646-8517-f77225feaa78"
+    
+teams.addAppToTeam(teamId, appId)
\ No newline at end of file
diff --git a/entity/Salesproject_entity/entityfields/addapp/stateProcess.js b/entity/Salesproject_entity/entityfields/addapp/stateProcess.js
new file mode 100644
index 00000000000..08b41286f0a
--- /dev/null
+++ b/entity/Salesproject_entity/entityfields/addapp/stateProcess.js
@@ -0,0 +1,10 @@
+//import("system.vars");
+//import("system.neon");
+//import("system.result");
+//import("Sql_lib");
+//
+//var teamId = newSelect("MST_TEAMID")
+//    .from("MST_TEAM")
+//    .where("MST_TEAM.OBJECT_ROWID", "$field.OBJECT_ROWID")
+//    .cell();
+//result.string(teamId == "" ? neon.COMPONENTSTATE_DISABLED : neon.COMPONENTSTATE_EDITABLE);
\ No newline at end of file
diff --git a/entity/Salesproject_entity/entityfields/addmember/onActionProcess.js b/entity/Salesproject_entity/entityfields/addmember/onActionProcess.js
new file mode 100644
index 00000000000..8ee059c24b8
--- /dev/null
+++ b/entity/Salesproject_entity/entityfields/addmember/onActionProcess.js
@@ -0,0 +1,11 @@
+import("system.teams");
+import("Sql_lib")
+
+var teamId = newSelect("MST_TEAMID")
+    .from("MST_TEAM")
+    .where("MST_TEAM.OBJECT_ROWID", "$field.OBJECT_ROWID")
+    .cell();
+
+var mailsOfMembers = ["m.bilda@adito.de", "sebastian@mbsolutions2.onmicrosoft.com"];
+
+teams.addNewMembers(teamId, mailsOfMembers)
\ No newline at end of file
diff --git a/entity/Salesproject_entity/entityfields/addmember/stateProcess.js b/entity/Salesproject_entity/entityfields/addmember/stateProcess.js
new file mode 100644
index 00000000000..08b41286f0a
--- /dev/null
+++ b/entity/Salesproject_entity/entityfields/addmember/stateProcess.js
@@ -0,0 +1,10 @@
+//import("system.vars");
+//import("system.neon");
+//import("system.result");
+//import("Sql_lib");
+//
+//var teamId = newSelect("MST_TEAMID")
+//    .from("MST_TEAM")
+//    .where("MST_TEAM.OBJECT_ROWID", "$field.OBJECT_ROWID")
+//    .cell();
+//result.string(teamId == "" ? neon.COMPONENTSTATE_DISABLED : neon.COMPONENTSTATE_EDITABLE);
\ No newline at end of file
diff --git a/entity/Salesproject_entity/entityfields/createchannel/onActionProcess.js b/entity/Salesproject_entity/entityfields/createchannel/onActionProcess.js
new file mode 100644
index 00000000000..4cf0d82b0fa
--- /dev/null
+++ b/entity/Salesproject_entity/entityfields/createchannel/onActionProcess.js
@@ -0,0 +1,10 @@
+import("system.teams");
+import("Sql_lib");
+
+
+var teamId = newSelect("MST_TEAMID")
+    .from("MST_TEAM")
+    .where("MST_TEAM.OBJECT_ROWID", "$field.OBJECT_ROWID")
+    .cell();
+
+teams.createNewChannel(teamId, "ADITO-xRM", "Ein Zweitchannel, um genauer über xRM zu diskutieren")
\ No newline at end of file
diff --git a/entity/Salesproject_entity/entityfields/createchannel/stateProcess.js b/entity/Salesproject_entity/entityfields/createchannel/stateProcess.js
new file mode 100644
index 00000000000..08b41286f0a
--- /dev/null
+++ b/entity/Salesproject_entity/entityfields/createchannel/stateProcess.js
@@ -0,0 +1,10 @@
+//import("system.vars");
+//import("system.neon");
+//import("system.result");
+//import("Sql_lib");
+//
+//var teamId = newSelect("MST_TEAMID")
+//    .from("MST_TEAM")
+//    .where("MST_TEAM.OBJECT_ROWID", "$field.OBJECT_ROWID")
+//    .cell();
+//result.string(teamId == "" ? neon.COMPONENTSTATE_DISABLED : neon.COMPONENTSTATE_EDITABLE);
\ No newline at end of file
diff --git a/entity/Salesproject_entity/entityfields/createteam/onActionProcess.js b/entity/Salesproject_entity/entityfields/createteam/onActionProcess.js
new file mode 100644
index 00000000000..caf03e2eda1
--- /dev/null
+++ b/entity/Salesproject_entity/entityfields/createteam/onActionProcess.js
@@ -0,0 +1,20 @@
+import("system.vars");
+import("system.neon");
+import("system.teams");
+import("system.logging");
+
+var rowId = vars.get("$field.OBJECT_ROWID");
+logging.log(rowId)
+var teamName = "Buchner Neuprojekt";
+var description = "Das Buchner Neuprojekt ist das erste Projekt, dass mit der Anbindung an MSTeams arbeitet um diese zu perfektionieren";
+var mailNickname = "buchnerNeuprojekt";
+var mailsOfOwners = [["marco@mbsolutions2.onmicrosoft.com", "marco@mbsolutions2.onmicrosoft.com"]];
+var mailsOfMembers = [["franz@mbsolutions2.onmicrosoft.com", "franz@mbsolutions2.onmicrosoft.com"], ["martin@mbsolutions2.onmicrosoft.com", "martin@mbsolutions2.onmicrosoft.com"]];
+
+neon.openContext("MSTTeam", null, null, neon.OPERATINGSTATE_NEW, {
+    "TeamName_param" : teamName,
+    "Description_param" : description,
+    "MailsOfOwners_param" : JSON.stringify(mailsOfOwners),
+    "MailsOfMembers_param" : JSON.stringify(mailsOfMembers),
+    "RowId_param" : rowId
+});
\ No newline at end of file
diff --git a/entity/Salesproject_entity/entityfields/createteam/stateProcess.js b/entity/Salesproject_entity/entityfields/createteam/stateProcess.js
new file mode 100644
index 00000000000..769332ea05d
--- /dev/null
+++ b/entity/Salesproject_entity/entityfields/createteam/stateProcess.js
@@ -0,0 +1,11 @@
+//import("system.vars");
+//import("system.neon");
+//import("system.result");
+//import("Sql_lib");
+//
+//var teamId = newSelect("MST_TEAMID")
+//    .from("MST_TEAM")
+//    .where("MST_TEAM.OBJECT_ROWID", "$field.OBJECT_ROWID")
+//    .cell();
+//    
+//result.string(teamId != "" ? neon.COMPONENTSTATE_DISABLED : neon.COMPONENTSTATE_EDITABLE);
\ No newline at end of file
diff --git a/entity/Salesproject_entity/entityfields/deleteteam/onActionProcess.js b/entity/Salesproject_entity/entityfields/deleteteam/onActionProcess.js
new file mode 100644
index 00000000000..811af52a53f
--- /dev/null
+++ b/entity/Salesproject_entity/entityfields/deleteteam/onActionProcess.js
@@ -0,0 +1,10 @@
+import("system.teams");
+import("Sql_lib");
+
+
+var teamId = newSelect("MST_TEAMID")
+    .from("MST_TEAM")
+    .where("MST_TEAM.OBJECT_ROWID", "$field.OBJECT_ROWID")
+    .cell();
+
+teams.archiveTeamAndDeleteGroup(teamId);
\ No newline at end of file
diff --git a/entity/Salesproject_entity/entityfields/deleteteam/stateProcess.js b/entity/Salesproject_entity/entityfields/deleteteam/stateProcess.js
new file mode 100644
index 00000000000..1ffcd6ff42b
--- /dev/null
+++ b/entity/Salesproject_entity/entityfields/deleteteam/stateProcess.js
@@ -0,0 +1,11 @@
+//import("system.vars");
+//import("system.neon");
+//import("system.result");
+//import("Sql_lib");
+//
+//var teamId = newSelect("MST_TEAMID")
+//    .from("MST_TEAM")
+//    .where("MST_TEAM.OBJECT_ROWID", "$field.OBJECT_ROWID")
+//    .cell();
+//    
+//result.string(teamId == "" ? neon.COMPONENTSTATE_DISABLED : neon.COMPONENTSTATE_EDITABLE);
\ No newline at end of file
diff --git a/entity/Salesproject_entity/entityfields/restoreteam/onActionProcess.js b/entity/Salesproject_entity/entityfields/restoreteam/onActionProcess.js
new file mode 100644
index 00000000000..06870ce60f2
--- /dev/null
+++ b/entity/Salesproject_entity/entityfields/restoreteam/onActionProcess.js
@@ -0,0 +1,10 @@
+import("system.teams");
+import("Sql_lib");
+
+
+var teamId = newSelect("MST_TEAMID")
+    .from("MST_TEAM")
+    .where("MST_TEAM.OBJECT_ROWID", "$field.OBJECT_ROWID")
+    .cell();
+
+teams.unarchiveTeamAndRestoreGroup(teamId);
\ No newline at end of file
diff --git a/entity/Salesproject_entity/entityfields/restoreteam/stateProcess.js b/entity/Salesproject_entity/entityfields/restoreteam/stateProcess.js
new file mode 100644
index 00000000000..08b41286f0a
--- /dev/null
+++ b/entity/Salesproject_entity/entityfields/restoreteam/stateProcess.js
@@ -0,0 +1,10 @@
+//import("system.vars");
+//import("system.neon");
+//import("system.result");
+//import("Sql_lib");
+//
+//var teamId = newSelect("MST_TEAMID")
+//    .from("MST_TEAM")
+//    .where("MST_TEAM.OBJECT_ROWID", "$field.OBJECT_ROWID")
+//    .cell();
+//result.string(teamId == "" ? neon.COMPONENTSTATE_DISABLED : neon.COMPONENTSTATE_EDITABLE);
\ No newline at end of file
diff --git a/entity/Salesproject_entity/recordcontainers/db/onDBUpdate.js b/entity/Salesproject_entity/recordcontainers/db/onDBUpdate.js
index 351ca78b95f..d11c2d44208 100644
--- a/entity/Salesproject_entity/recordcontainers/db/onDBUpdate.js
+++ b/entity/Salesproject_entity/recordcontainers/db/onDBUpdate.js
@@ -9,6 +9,7 @@ import("system.db");
 import("system.question");
 import("KeywordRegistry_basic");
 import("Keyword_lib");
+import("system.teams");
 
 var needToUpdateForecast = null;
 var rowdata = vars.get("$local.rowdata");
@@ -97,6 +98,21 @@ vars.get("$local.changed").forEach(function(fieldName) {
     }
 });
 
+var serviceUrl = newSelect("SERVICE_URL")
+    .from("MST_TEAM")
+    .where("MST_TEAM.OBJECT_ROWID", "$field.SALESPROJECTID")
+    .cell();
+
+    var channelId = newSelect("GENERAL_CHANNELID")
+    .from("MST_TEAM")
+    .where("MST_TEAM.OBJECT_ROWID", "$field.SALESPROJECTID")
+    .cell();
+    
+    if(serviceUrl)
+    {
+        teams.sendNotification(serviceUrl, channelId, "Etwas hat sich im Projekt "+ vars.get("$field.PROJECTTITLE") +" geaendert")
+    }
+
 if (needToUpdateForecast)
     Salesproject.notifyToUpdateForecast();
 
diff --git a/entity/SingleObject_entity/SingleObject_entity.aod b/entity/SingleObject_entity/SingleObject_entity.aod
new file mode 100644
index 00000000000..f471932a1d6
--- /dev/null
+++ b/entity/SingleObject_entity/SingleObject_entity.aod
@@ -0,0 +1,44 @@
+<?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.14" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.14">
+  <name>SingleObject_entity</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <recordContainer>jdito</recordContainer>
+  <entityFields>
+    <entityProvider>
+      <name>#PROVIDER</name>
+    </entityProvider>
+    <entityField>
+      <name>TARGET_CONTEXT</name>
+      <valueProcess>%aditoprj%/entity/SingleObject_entity/entityfields/target_context/valueProcess.js</valueProcess>
+    </entityField>
+    <entityField>
+      <name>UID</name>
+      <valueProcess>%aditoprj%/entity/SingleObject_entity/entityfields/uid/valueProcess.js</valueProcess>
+    </entityField>
+    <entityParameter>
+      <name>TargetContext_param</name>
+      <expose v="true" />
+      <mandatory v="true" />
+    </entityParameter>
+    <entityParameter>
+      <name>TargetId_param</name>
+      <expose v="true" />
+      <mandatory v="true" />
+    </entityParameter>
+    <entityProvider>
+      <name>OneObject</name>
+      <targetContextField>TARGET_CONTEXT</targetContextField>
+      <targetIdField>UID</targetIdField>
+    </entityProvider>
+  </entityFields>
+  <recordContainers>
+    <jDitoRecordContainer>
+      <name>jdito</name>
+      <recordFieldMappings>
+        <jDitoRecordFieldMapping>
+          <name>UID.value</name>
+        </jDitoRecordFieldMapping>
+      </recordFieldMappings>
+    </jDitoRecordContainer>
+  </recordContainers>
+</entity>
diff --git a/neonContext/MSTChooseTeam/MSTChooseTeam.aod b/neonContext/MSTChooseTeam/MSTChooseTeam.aod
new file mode 100644
index 00000000000..c28f7a58024
--- /dev/null
+++ b/neonContext/MSTChooseTeam/MSTChooseTeam.aod
@@ -0,0 +1,13 @@
+<?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>MSTChooseTeam</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <editView>MSTChooseTeamEdit_view</editView>
+  <entity>MSTChooseTeam_entity</entity>
+  <references>
+    <neonViewReference>
+      <name>0c4e977f-1ce1-4782-9a7f-7cabd557c9fc</name>
+      <view>MSTChooseTeamEdit_view</view>
+    </neonViewReference>
+  </references>
+</neonContext>
diff --git a/neonContext/MSTTeam/MSTTeam.aod b/neonContext/MSTTeam/MSTTeam.aod
new file mode 100644
index 00000000000..532d9326d4d
--- /dev/null
+++ b/neonContext/MSTTeam/MSTTeam.aod
@@ -0,0 +1,13 @@
+<?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>MSTTeam</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <editView>MSTTeamEdit_view</editView>
+  <entity>MSTTeam_entity</entity>
+  <references>
+    <neonViewReference>
+      <name>357c290b-bf6a-4628-a6d9-f81a97ea843e</name>
+      <view>MSTTeamEdit_view</view>
+    </neonViewReference>
+  </references>
+</neonContext>
diff --git a/neonContext/MSTTeamChannel/MSTTeamChannel.aod b/neonContext/MSTTeamChannel/MSTTeamChannel.aod
new file mode 100644
index 00000000000..504bccc581a
--- /dev/null
+++ b/neonContext/MSTTeamChannel/MSTTeamChannel.aod
@@ -0,0 +1,13 @@
+<?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>MSTTeamChannel</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <editView>MSTTeamChannelEdit_view2</editView>
+  <entity>MSTTeamChannel_entity</entity>
+  <references>
+    <neonViewReference>
+      <name>754bf641-381f-4b16-adf6-19960eb7b8d2</name>
+      <view>MSTTeamChannelEdit_view2</view>
+    </neonViewReference>
+  </references>
+</neonContext>
diff --git a/neonContext/MSTTeamChat/MSTTeamChat.aod b/neonContext/MSTTeamChat/MSTTeamChat.aod
new file mode 100644
index 00000000000..3d99ac8581d
--- /dev/null
+++ b/neonContext/MSTTeamChat/MSTTeamChat.aod
@@ -0,0 +1,13 @@
+<?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>MSTTeamChat</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <editView>MSTTeamChatEdit_view</editView>
+  <entity>MSTTeamChat_entity</entity>
+  <references>
+    <neonViewReference>
+      <name>1a157c6c-7db9-4a2a-9e62-7d149b146bde</name>
+      <view>MSTTeamChatEdit_view</view>
+    </neonViewReference>
+  </references>
+</neonContext>
diff --git a/neonContext/MSTTeamDocument/MSTTeamDocument.aod b/neonContext/MSTTeamDocument/MSTTeamDocument.aod
new file mode 100644
index 00000000000..4f372aaa930
--- /dev/null
+++ b/neonContext/MSTTeamDocument/MSTTeamDocument.aod
@@ -0,0 +1,13 @@
+<?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>MSTTeamDocument</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <editView>MSTTeamDocumentEdit_view</editView>
+  <entity>MSTTeamDocument_entity</entity>
+  <references>
+    <neonViewReference>
+      <name>167cee11-55bd-4988-838b-d9c784da01e2</name>
+      <view>MSTTeamDocumentEdit_view</view>
+    </neonViewReference>
+  </references>
+</neonContext>
diff --git a/neonContext/MSTTeamMember/MSTTeamMember.aod b/neonContext/MSTTeamMember/MSTTeamMember.aod
new file mode 100644
index 00000000000..a482314b45d
--- /dev/null
+++ b/neonContext/MSTTeamMember/MSTTeamMember.aod
@@ -0,0 +1,13 @@
+<?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>MSTTeamMember</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <editView>MSTTeamMemberEdit_view</editView>
+  <entity>MSTTeamMember_entity</entity>
+  <references>
+    <neonViewReference>
+      <name>5e760ac4-fea0-4283-a0bf-d6d5f0f1c003</name>
+      <view>MSTTeamMemberEdit_view</view>
+    </neonViewReference>
+  </references>
+</neonContext>
diff --git a/neonContext/MSTTeamsMessage/MSTTeamsMessage.aod b/neonContext/MSTTeamsMessage/MSTTeamsMessage.aod
new file mode 100644
index 00000000000..51c8b4d1581
--- /dev/null
+++ b/neonContext/MSTTeamsMessage/MSTTeamsMessage.aod
@@ -0,0 +1,13 @@
+<?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>MSTTeamsMessage</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <filterView>MSTTeamsMessageFilter_view</filterView>
+  <entity>MSTTeamsMessage_entity</entity>
+  <references>
+    <neonViewReference>
+      <name>db5e4380-458f-438a-8945-b8b8463e81d4</name>
+      <view>MSTTeamsMessageFilter_view</view>
+    </neonViewReference>
+  </references>
+</neonContext>
diff --git a/neonContext/Salesproject/Salesproject.aod b/neonContext/Salesproject/Salesproject.aod
index 70d024650c8..8f8820b5fc4 100644
--- a/neonContext/Salesproject/Salesproject.aod
+++ b/neonContext/Salesproject/Salesproject.aod
@@ -87,5 +87,9 @@
       <name>50993084-896d-4d90-9f5e-cd84d3a4dce5</name>
       <view>SalesprojectMultiEdit_view</view>
     </neonViewReference>
+    <neonViewReference>
+      <name>a3ed00af-e0cc-4c1b-9c49-5d411e129a93</name>
+      <view>SalesprojectMSTeams_view</view>
+    </neonViewReference>
   </references>
 </neonContext>
diff --git a/neonView/ActivityFilter_view/ActivityFilter_view.aod b/neonView/ActivityFilter_view/ActivityFilter_view.aod
index 09f94a720fa..742325d49db 100644
--- a/neonView/ActivityFilter_view/ActivityFilter_view.aod
+++ b/neonView/ActivityFilter_view/ActivityFilter_view.aod
@@ -50,6 +50,7 @@
   <children>
     <timelineViewTemplate>
       <name>ActivitiesTimeline</name>
+      <favoriteActionGroup1>MSTeams</favoriteActionGroup1>
       <dateField>entryDateDateFormat</dateField>
       <titleField>SUBJECT_DETAILS</titleField>
       <descriptionField>INFO</descriptionField>
diff --git a/neonView/DocumentFilter_view/DocumentFilter_view.aod b/neonView/DocumentFilter_view/DocumentFilter_view.aod
index 3da41e270af..c1287b68b4c 100644
--- a/neonView/DocumentFilter_view/DocumentFilter_view.aod
+++ b/neonView/DocumentFilter_view/DocumentFilter_view.aod
@@ -24,6 +24,7 @@
     <tableViewTemplate>
       <name>Documents</name>
       <favoriteActionGroup1>Document_actions</favoriteActionGroup1>
+      <favoriteActionGroup2>MSTeam</favoriteActionGroup2>
       <iconField>PREVIEW_IMAGE</iconField>
       <titleField>NAME</titleField>
       <subtitleField>TYPE</subtitleField>
diff --git a/neonView/MSTChooseTeamEdit_view/MSTChooseTeamEdit_view.aod b/neonView/MSTChooseTeamEdit_view/MSTChooseTeamEdit_view.aod
new file mode 100644
index 00000000000..f7d1e012d76
--- /dev/null
+++ b/neonView/MSTChooseTeamEdit_view/MSTChooseTeamEdit_view.aod
@@ -0,0 +1,49 @@
+<?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>MSTChooseTeamEdit_view</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <size>SMALL</size>
+  <layout>
+    <boxLayout>
+      <name>layout</name>
+    </boxLayout>
+  </layout>
+  <children>
+    <genericViewTemplate>
+      <name>SearchValue</name>
+      <editMode v="true" />
+      <entityField>#ENTITY</entityField>
+      <title>Suchbegriff</title>
+      <fields>
+        <entityFieldLink>
+          <name>8adb648c-4485-4803-a922-67bee5922ec0</name>
+          <entityField>SEARCHVALUE</entityField>
+        </entityFieldLink>
+      </fields>
+    </genericViewTemplate>
+    <genericViewTemplate>
+      <name>allTeams</name>
+      <editMode v="true" />
+      <entityField>#ENTITY</entityField>
+      <title>Alle Teams</title>
+      <fields>
+        <entityFieldLink>
+          <name>6a7121eb-ed35-4a4e-a26b-899233ea0b15</name>
+          <entityField>ALLTEAMS</entityField>
+        </entityFieldLink>
+      </fields>
+    </genericViewTemplate>
+    <genericViewTemplate>
+      <name>allArchivedTeams</name>
+      <editMode v="true" />
+      <entityField>#ENTITY</entityField>
+      <title>Alle archivierten Teams</title>
+      <fields>
+        <entityFieldLink>
+          <name>e17470f5-f8a7-42ce-ab2c-048015784740</name>
+          <entityField>ALLARCHIVEDTEAMS</entityField>
+        </entityFieldLink>
+      </fields>
+    </genericViewTemplate>
+  </children>
+</neonView>
diff --git a/neonView/MSTTeamChannelEdit_view/MSTTeamChannelEdit_view.aod b/neonView/MSTTeamChannelEdit_view/MSTTeamChannelEdit_view.aod
new file mode 100644
index 00000000000..360a058b7da
--- /dev/null
+++ b/neonView/MSTTeamChannelEdit_view/MSTTeamChannelEdit_view.aod
@@ -0,0 +1,10 @@
+<?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>MSTTeamChannelEdit_view</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <layout>
+    <noneLayout>
+      <name>layout</name>
+    </noneLayout>
+  </layout>
+</neonView>
diff --git a/neonView/MSTTeamChannelEdit_view2/MSTTeamChannelEdit_view2.aod b/neonView/MSTTeamChannelEdit_view2/MSTTeamChannelEdit_view2.aod
new file mode 100644
index 00000000000..6ffd2def37d
--- /dev/null
+++ b/neonView/MSTTeamChannelEdit_view2/MSTTeamChannelEdit_view2.aod
@@ -0,0 +1,29 @@
+<?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>MSTTeamChannelEdit_view2</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <size>SMALL</size>
+  <layout>
+    <noneLayout>
+      <name>layout</name>
+    </noneLayout>
+  </layout>
+  <children>
+    <genericViewTemplate>
+      <name>Generic</name>
+      <editMode v="true" />
+      <entityField>#ENTITY</entityField>
+      <title>Neuer Channel</title>
+      <fields>
+        <entityFieldLink>
+          <name>2b7a105d-ecc0-48e9-9e67-c6d5e84417b7</name>
+          <entityField>CHANNELNAME</entityField>
+        </entityFieldLink>
+        <entityFieldLink>
+          <name>93c89d65-776d-42d4-822f-30d87225b725</name>
+          <entityField>DESCRIPTION</entityField>
+        </entityFieldLink>
+      </fields>
+    </genericViewTemplate>
+  </children>
+</neonView>
diff --git a/neonView/MSTTeamChatEdit_view/MSTTeamChatEdit_view.aod b/neonView/MSTTeamChatEdit_view/MSTTeamChatEdit_view.aod
new file mode 100644
index 00000000000..bdc013d2ee0
--- /dev/null
+++ b/neonView/MSTTeamChatEdit_view/MSTTeamChatEdit_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>MSTTeamChatEdit_view</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <size>NORMAL</size>
+  <layout>
+    <boxLayout>
+      <name>layout</name>
+    </boxLayout>
+  </layout>
+  <children>
+    <genericViewTemplate>
+      <name>AllChannel</name>
+      <editMode v="true" />
+      <entityField>#ENTITY</entityField>
+      <title>Alle Channel</title>
+      <fields>
+        <entityFieldLink>
+          <name>d3cc6ea3-00b5-4da5-9a58-a0e18aaff8da</name>
+          <entityField>SEARCHVALUE</entityField>
+        </entityFieldLink>
+        <entityFieldLink>
+          <name>9e188c23-3060-4f5c-bb67-8dce3ef5f93f</name>
+          <entityField>ALLCHANNELS</entityField>
+        </entityFieldLink>
+      </fields>
+    </genericViewTemplate>
+    <neonViewReference>
+      <name>6c47a973-ef7c-4165-addb-427c1cce9540</name>
+      <entityField>Consumer</entityField>
+      <view>MSTTeamsMessageFilter_view</view>
+    </neonViewReference>
+    <actionsViewTemplate>
+      <name>LoadNewMessages</name>
+      <actions>
+        <element>LoadNewMessages</element>
+      </actions>
+      <entityField>#ENTITY</entityField>
+    </actionsViewTemplate>
+  </children>
+</neonView>
diff --git a/neonView/MSTTeamDocumentEdit_view/MSTTeamDocumentEdit_view.aod b/neonView/MSTTeamDocumentEdit_view/MSTTeamDocumentEdit_view.aod
new file mode 100644
index 00000000000..85e283d46c4
--- /dev/null
+++ b/neonView/MSTTeamDocumentEdit_view/MSTTeamDocumentEdit_view.aod
@@ -0,0 +1,34 @@
+<?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>MSTTeamDocumentEdit_view</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <size>SMALL</size>
+  <isOverlay v="false" />
+  <layout>
+    <noneLayout>
+      <name>layout</name>
+    </noneLayout>
+  </layout>
+  <children>
+    <genericViewTemplate>
+      <name>Documents</name>
+      <editMode v="true" />
+      <entityField>#ENTITY</entityField>
+      <title>Dokumente</title>
+      <fields>
+        <entityFieldLink>
+          <name>2c2c923f-0e45-417f-950e-14826bc8fcbe</name>
+          <entityField>SEARCHVALUE</entityField>
+        </entityFieldLink>
+        <entityFieldLink>
+          <name>c42b1c0b-de04-400e-9068-1be2568a0d5f</name>
+          <entityField>ALLCHANNELS</entityField>
+        </entityFieldLink>
+        <entityFieldLink>
+          <name>9a0986dd-68b2-422e-b9b3-27d35640b44b</name>
+          <entityField>DOCUMENTS</entityField>
+        </entityFieldLink>
+      </fields>
+    </genericViewTemplate>
+  </children>
+</neonView>
diff --git a/neonView/MSTTeamEdit_view/MSTTeamEdit_view.aod b/neonView/MSTTeamEdit_view/MSTTeamEdit_view.aod
new file mode 100644
index 00000000000..ee182311b99
--- /dev/null
+++ b/neonView/MSTTeamEdit_view/MSTTeamEdit_view.aod
@@ -0,0 +1,48 @@
+<?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>MSTTeamEdit_view</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <size>SMALL</size>
+  <layout>
+    <noneLayout>
+      <name>layout</name>
+    </noneLayout>
+  </layout>
+  <children>
+    <genericViewTemplate>
+      <name>Generic</name>
+      <editMode v="true" />
+      <entityField>#ENTITY</entityField>
+      <fields>
+        <entityFieldLink>
+          <name>b69c563c-6230-4bb5-b543-236e0fdc791c</name>
+          <entityField>TEAMNAME</entityField>
+        </entityFieldLink>
+        <entityFieldLink>
+          <name>31897309-cbb5-421b-a96b-bada6c95b72f</name>
+          <entityField>DESCRIPTION</entityField>
+        </entityFieldLink>
+        <entityFieldLink>
+          <name>a35da883-d23e-4afc-a0a5-ce7e90ec3b2d</name>
+          <entityField>UPNSOFOWNERS</entityField>
+        </entityFieldLink>
+        <entityFieldLink>
+          <name>001a17e9-1bb9-418d-a3ad-284fa95463ad</name>
+          <entityField>UPNSOFMEMBERS</entityField>
+        </entityFieldLink>
+        <entityFieldLink>
+          <name>8cf04e8d-6424-4de4-bfc1-d524de11ecb2</name>
+          <entityField>MAILSOFEXTERN</entityField>
+        </entityFieldLink>
+        <entityFieldLink>
+          <name>19803dfd-60fa-4981-ac86-9565e0ff6eea</name>
+          <entityField>EXTERN</entityField>
+        </entityFieldLink>
+        <entityFieldLink>
+          <name>356e3124-065f-4872-a23e-31c069a4ce8c</name>
+          <entityField>UPNSOFOWNERSORIGINAL</entityField>
+        </entityFieldLink>
+      </fields>
+    </genericViewTemplate>
+  </children>
+</neonView>
diff --git a/neonView/MSTTeamMemberEdit_view/MSTTeamMemberEdit_view.aod b/neonView/MSTTeamMemberEdit_view/MSTTeamMemberEdit_view.aod
new file mode 100644
index 00000000000..b225944fe7c
--- /dev/null
+++ b/neonView/MSTTeamMemberEdit_view/MSTTeamMemberEdit_view.aod
@@ -0,0 +1,36 @@
+<?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>MSTTeamMemberEdit_view</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <size>SMALL</size>
+  <layout>
+    <noneLayout>
+      <name>layout</name>
+    </noneLayout>
+  </layout>
+  <children>
+    <genericViewTemplate>
+      <name>Generic</name>
+      <editMode v="true" />
+      <entityField>#ENTITY</entityField>
+      <fields>
+        <entityFieldLink>
+          <name>0c013cb6-6a74-47c1-9e5c-8e23f1ce917a</name>
+          <entityField>UPNSOFMEMBERS</entityField>
+        </entityFieldLink>
+        <entityFieldLink>
+          <name>54cf4c2d-6c18-4c0f-ae52-32c1f7337cd7</name>
+          <entityField>ARETHESEOWNERS</entityField>
+        </entityFieldLink>
+        <entityFieldLink>
+          <name>75b97952-da9a-4a5c-9bbf-6cec3774541b</name>
+          <entityField>MAILSOFEXTERN</entityField>
+        </entityFieldLink>
+        <entityFieldLink>
+          <name>ab1ed6fe-5a68-4728-9d90-698636c93ce8</name>
+          <entityField>EXTERN</entityField>
+        </entityFieldLink>
+      </fields>
+    </genericViewTemplate>
+  </children>
+</neonView>
diff --git a/neonView/MSTTeamsMessageFilter_view/MSTTeamsMessageFilter_view.aod b/neonView/MSTTeamsMessageFilter_view/MSTTeamsMessageFilter_view.aod
new file mode 100644
index 00000000000..fbcca9d1e67
--- /dev/null
+++ b/neonView/MSTTeamsMessageFilter_view/MSTTeamsMessageFilter_view.aod
@@ -0,0 +1,30 @@
+<?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>MSTTeamsMessageFilter_view</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <layout>
+    <noneLayout>
+      <name>layout</name>
+    </noneLayout>
+  </layout>
+  <children>
+    <tableViewTemplate>
+      <name>Table</name>
+      <entityField>#ENTITY</entityField>
+      <columns>
+        <neonTableColumn>
+          <name>5db624ad-16d0-4374-be55-1a423fcddefc</name>
+          <entityField>FROM</entityField>
+        </neonTableColumn>
+        <neonTableColumn>
+          <name>bc343936-a59c-4eb0-b056-c8dc35303385</name>
+          <entityField>MESSAGE</entityField>
+        </neonTableColumn>
+        <neonTableColumn>
+          <name>89e753a1-4917-4493-b1c3-3c9d7884b217</name>
+          <entityField>CREATED_DATE_TIME</entityField>
+        </neonTableColumn>
+      </columns>
+    </tableViewTemplate>
+  </children>
+</neonView>
diff --git a/neonView/MemberFilter_view/MemberFilter_view.aod b/neonView/MemberFilter_view/MemberFilter_view.aod
index c432d26441e..6aa71af982f 100644
--- a/neonView/MemberFilter_view/MemberFilter_view.aod
+++ b/neonView/MemberFilter_view/MemberFilter_view.aod
@@ -4,9 +4,9 @@
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <filterable v="true" />
   <layout>
-    <groupLayout>
+    <boxLayout>
       <name>layout</name>
-    </groupLayout>
+    </boxLayout>
   </layout>
   <children>
     <tableViewTemplate>
@@ -47,39 +47,5 @@
         </neonTableColumn>
       </columns>
     </tableViewTemplate>
-    <treeTableViewTemplate>
-      <name>Treetable</name>
-      <entityField>#ENTITY</entityField>
-      <columns>
-        <neonTreeTableColumn>
-          <name>88973b9d-09af-4d67-8b25-ea6b456314a2</name>
-          <entityField>IMAGE</entityField>
-        </neonTreeTableColumn>
-        <neonTreeTableColumn>
-          <name>d84b10a1-593a-4c2f-ba35-4fb80c362850</name>
-          <entityField>PERSON_FULL_NAME</entityField>
-        </neonTreeTableColumn>
-        <neonTreeTableColumn>
-          <name>22eb0efc-61b3-48fe-989d-2dd4e70ea780</name>
-          <entityField>ORGANISATION_NAME</entityField>
-        </neonTreeTableColumn>
-        <neonTreeTableColumn>
-          <name>7d5b671c-af93-416c-b774-bd2bc671f048</name>
-          <entityField>DEPARTMENT</entityField>
-        </neonTreeTableColumn>
-        <neonTreeTableColumn>
-          <name>06451ab6-4d94-40eb-8ac1-466259ad35fb</name>
-          <entityField>CONTACTROLE</entityField>
-        </neonTreeTableColumn>
-        <neonTreeTableColumn>
-          <name>87770e60-967b-4411-9eb3-0397fda4663e</name>
-          <entityField>POSITION</entityField>
-        </neonTreeTableColumn>
-        <neonTreeTableColumn>
-          <name>2dc17972-2e5a-424a-b069-2b8f04b35f6c</name>
-          <entityField>MEMBERROLE</entityField>
-        </neonTreeTableColumn>
-      </columns>
-    </treeTableViewTemplate>
   </children>
 </neonView>
diff --git a/neonView/SalesprojectMSTeams_view/SalesprojectMSTeams_view.aod b/neonView/SalesprojectMSTeams_view/SalesprojectMSTeams_view.aod
new file mode 100644
index 00000000000..e24067db06a
--- /dev/null
+++ b/neonView/SalesprojectMSTeams_view/SalesprojectMSTeams_view.aod
@@ -0,0 +1,36 @@
+<?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>SalesprojectMSTeams_view</name>
+  <title>MSTeams</title>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <layout>
+    <drawerLayout>
+      <name>layout</name>
+      <fixedDrawer v="false" />
+    </drawerLayout>
+  </layout>
+  <children>
+    <dynamicFormViewTemplate>
+      <name>actuallTeam</name>
+      <editMode v="true" />
+      <entityField>#ENTITY</entityField>
+    </dynamicFormViewTemplate>
+    <actionsViewTemplate>
+      <name>MSTeamsActions</name>
+      <actions>
+        <element>createTeam</element>
+        <element>deleteTeam</element>
+        <element>createChannel</element>
+        <element>addMember</element>
+        <element>addApp</element>
+        <element>restoreTeam</element>
+      </actions>
+      <entityField>#ENTITY</entityField>
+      <title>MSTeamsActions</title>
+    </actionsViewTemplate>
+    <tableViewTemplate>
+      <name>TeamsTable</name>
+      <entityField>#ENTITY</entityField>
+    </tableViewTemplate>
+  </children>
+</neonView>
diff --git a/neonView/SalesprojectMain_view/SalesprojectMain_view.aod b/neonView/SalesprojectMain_view/SalesprojectMain_view.aod
index 51150b360d3..f122e6f32e2 100644
--- a/neonView/SalesprojectMain_view/SalesprojectMain_view.aod
+++ b/neonView/SalesprojectMain_view/SalesprojectMain_view.aod
@@ -5,7 +5,7 @@
   <layout>
     <masterSlaveLayout>
       <name>layout</name>
-      <master>04b5a305-b2a6-481a-83a5-1d94bee08143</master>
+      <master>eaee3a77-a3d8-4f0c-969a-da232b0c9537</master>
     </masterSlaveLayout>
   </layout>
   <children>
@@ -29,6 +29,11 @@
       <entityField>#ENTITY</entityField>
       <view>SalesprojectMemberActivity_view</view>
     </neonViewReference>
+    <neonViewReference>
+      <name>b04b60a7-4296-4dd7-ae94-3c68b4def6a4</name>
+      <entityField>#ENTITY</entityField>
+      <view>SalesprojectMSTeams_view</view>
+    </neonViewReference>
     <neonViewReference>
       <name>67659a20-068f-4522-ad33-2c35e29f929a</name>
       <entityField>#ENTITY</entityField>
@@ -64,5 +69,10 @@
       <entityField>LogHistories</entityField>
       <view>LogHistoryFilter_view</view>
     </neonViewReference>
+    <neonViewReference>
+      <name>eaee3a77-a3d8-4f0c-969a-da232b0c9537</name>
+      <entityField>#ENTITY</entityField>
+      <view>SalesprojectPreview_view</view>
+    </neonViewReference>
   </children>
 </neonView>
diff --git a/process/_test_clientProcess/_test_clientProcess.aod b/process/_test_clientProcess/_test_clientProcess.aod
index 65d4b557987..d003fb54e12 100644
--- a/process/_test_clientProcess/_test_clientProcess.aod
+++ b/process/_test_clientProcess/_test_clientProcess.aod
@@ -5,6 +5,8 @@
   <documentation>%aditoprj%/process/_test_clientProcess/documentation.adoc</documentation>
   <process>%aditoprj%/process/_test_clientProcess/process.js</process>
   <publishAsWebservice v="true" />
+  <wsdl>%aditoprj%/process/_test_clientProcess/wsdl.wsdl</wsdl>
+  <loginTypeId>internal.none</loginTypeId>
   <alias>Data_alias</alias>
   <variants>
     <element>EXECUTABLE</element>
diff --git a/process/_test_clientProcess/wsdl.wsdl b/process/_test_clientProcess/wsdl.wsdl
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/process/mstws/mstws.aod b/process/mstws/mstws.aod
new file mode 100644
index 00000000000..0c7c1773bc8
--- /dev/null
+++ b/process/mstws/mstws.aod
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+  <name>mstws</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <process>%aditoprj%/process/mstws/process.js</process>
+  <publishAsWebservice v="true" />
+  <style>REST</style>
+  <restAcceptedMimeType>application/json</restAcceptedMimeType>
+  <restDeliveredMimeType>application/json</restDeliveredMimeType>
+  <loginTypeId>internal.none</loginTypeId>
+  <publishAsClientWebservice v="true" />
+  <alias>Data_alias</alias>
+</process>
diff --git a/process/mstws/process.js b/process/mstws/process.js
new file mode 100644
index 00000000000..8057882a27f
--- /dev/null
+++ b/process/mstws/process.js
@@ -0,0 +1,53 @@
+import("system.teams");
+import("system.logging");
+import("system.util");
+import("Sql_lib");
+
+function restpost(pRequestAsJson)
+{
+    //Umformen, dass man den Body des Requests als JsonFormat Base64 decodiert hat
+    var jsonRequest = JSON.parse(pRequestAsJson);
+    logging.log(jsonRequest);
+    var body = jsonRequest.body;
+    var decodedBody = util.decodeBase64String(body);
+    var jsonBody = JSON.parse(decodedBody);
+    
+    //Nötig, falls dies der InitialRequest ist
+    var eventType = jsonBody.channelData.eventType;
+    var teamId = jsonBody.channelData.team.aadGroupId;
+    var who = jsonBody.recipient.name;
+    var serviceUrl = jsonBody.serviceUrl;
+    
+    //Wenn dies der InitalRequest ist (dieser erfolgt, wenn die APP hinzugefügt wird), speichere die ServiceUrl in die DB
+    if(eventType == "teamMemberAdded" && who == "AditoBot")
+    {
+        newWhere("MST_TEAM.MST_TEAMID", teamId)
+            .updateFields({"SERVICE_URL" : serviceUrl});
+    }
+    //Sollte jemand die APP manuell wieder entfernen, gibt es einen "AbschiedsRequest", lösche die ServiceUrl aus der DB
+    if(eventType == "teamMemberRemoved" && who == "AditoBot")
+    {    
+       newWhere("MST_TEAM.MST_TEAMID", teamId)
+            .updateFields({"SERVICE_URL" : ""});
+    }
+    
+    //_____________________________________________________________
+    //Hier gelandet: Request ist eine Nachricht
+    
+    var type = jsonBody.type;
+    if(type != "message") //Wenn Request keine Message war dann ignorieren
+        return pRequestAsJson;
+    
+    var text = jsonBody.text;
+    var from = jsonBody.from.name;
+    
+    //Testzwecke (nachträglich entfernen)
+    logging.log(text);
+    logging.log(from);
+    
+    //Da alle Aufgaben, wie zum Beispiel: Ticket erstellen, Aufgabe erstellen usw. in JDiTO erledigt werden können,
+    // wird hier keine teams.Funktion benötigt
+    //Weitere Schritte: text aufsplittet anhand der Syntax und die einzelnen Kommandos umsetzen
+    
+    return pRequestAsJson;
+}
\ No newline at end of file
-- 
GitLab


From 4b38b4976ce84f16c10f17c52a67898d47c43e51 Mon Sep 17 00:00:00 2001
From: "M.Bilda" <m.bilda@adito.de>
Date: Thu, 9 Jul 2020 09:37:55 +0200
Subject: [PATCH 004/184] MSTeams Anbindung Prototyp

---
 entity/Person_entity/Person_entity.aod        | 10 ++++++++++
 .../addrecordaction/onActionProcess.js        |  7 +++++++
 .../MSTTeamEdit_view/MSTTeamEdit_view.aod     | 18 ++++++++++++++++++
 .../MemberFilter_view/MemberFilter_view.aod   |  1 +
 neonView/PersonEdit_view/PersonEdit_view.aod  | 19 +++++++++++++++++++
 .../_____PREFERENCES_PROJECT.aod              |  1 +
 6 files changed, 56 insertions(+)
 create mode 100644 entity/Person_entity/entityfields/testgroup/children/addrecordaction/onActionProcess.js

diff --git a/entity/Person_entity/Person_entity.aod b/entity/Person_entity/Person_entity.aod
index 446f310d7bc..f92fb6a6a71 100644
--- a/entity/Person_entity/Person_entity.aod
+++ b/entity/Person_entity/Person_entity.aod
@@ -1266,6 +1266,16 @@
         </entityParameter>
       </children>
     </entityProvider>
+    <entityActionGroup>
+      <name>TestGroup</name>
+      <children>
+        <entityActionField>
+          <name>addRecordAction</name>
+          <title>addRecord</title>
+          <onActionProcess>%aditoprj%/entity/Person_entity/entityfields/testgroup/children/addrecordaction/onActionProcess.js</onActionProcess>
+        </entityActionField>
+      </children>
+    </entityActionGroup>
   </entityFields>
   <recordContainers>
     <dbRecordContainer>
diff --git a/entity/Person_entity/entityfields/testgroup/children/addrecordaction/onActionProcess.js b/entity/Person_entity/entityfields/testgroup/children/addrecordaction/onActionProcess.js
new file mode 100644
index 00000000000..2161e0ef8cc
--- /dev/null
+++ b/entity/Person_entity/entityfields/testgroup/children/addrecordaction/onActionProcess.js
@@ -0,0 +1,7 @@
+import("system.neon");
+
+var test = {
+                "AddressSearch" : "response.address"
+            };
+
+neon.addRecord("Documents", test)
\ No newline at end of file
diff --git a/neonView/MSTTeamEdit_view/MSTTeamEdit_view.aod b/neonView/MSTTeamEdit_view/MSTTeamEdit_view.aod
index ee182311b99..fa7fb240fe7 100644
--- a/neonView/MSTTeamEdit_view/MSTTeamEdit_view.aod
+++ b/neonView/MSTTeamEdit_view/MSTTeamEdit_view.aod
@@ -44,5 +44,23 @@
         </entityFieldLink>
       </fields>
     </genericViewTemplate>
+    <titledListViewTemplate>
+      <name>asdf</name>
+      <entityField>#ENTITY</entityField>
+      <columns>
+        <neonTitledListTableColumn>
+          <name>e6ac0add-846d-47e9-be74-478848406bb9</name>
+          <entityField>MAILSOFEXTERN</entityField>
+        </neonTitledListTableColumn>
+        <neonTitledListTableColumn>
+          <name>a9b05950-bed2-4a5d-a608-ae58bc0b23ac</name>
+          <entityField>UPNSOFMEMBERS</entityField>
+        </neonTitledListTableColumn>
+        <neonTitledListTableColumn>
+          <name>e3081201-52ee-4d09-9039-8228769d189c</name>
+          <entityField>DESCRIPTION</entityField>
+        </neonTitledListTableColumn>
+      </columns>
+    </titledListViewTemplate>
   </children>
 </neonView>
diff --git a/neonView/MemberFilter_view/MemberFilter_view.aod b/neonView/MemberFilter_view/MemberFilter_view.aod
index 6aa71af982f..2018c671b14 100644
--- a/neonView/MemberFilter_view/MemberFilter_view.aod
+++ b/neonView/MemberFilter_view/MemberFilter_view.aod
@@ -11,6 +11,7 @@
   <children>
     <tableViewTemplate>
       <name>Members</name>
+      <favoriteActionGroup1>MSTeamsActionGroup</favoriteActionGroup1>
       <iconField>IMAGE</iconField>
       <titleField>PERSON_FULL_NAME</titleField>
       <subtitleField>CONTACTROLE</subtitleField>
diff --git a/neonView/PersonEdit_view/PersonEdit_view.aod b/neonView/PersonEdit_view/PersonEdit_view.aod
index c31dd51b7ff..a89480fa864 100644
--- a/neonView/PersonEdit_view/PersonEdit_view.aod
+++ b/neonView/PersonEdit_view/PersonEdit_view.aod
@@ -91,5 +91,24 @@
       <entityField>Attributes</entityField>
       <view>AttributeRelationMultiEdit_view</view>
     </neonViewReference>
+    <actionsViewTemplate>
+      <name>asdf</name>
+      <actions>
+        <element>TestGroup</element>
+      </actions>
+      <entityField>#ENTITY</entityField>
+    </actionsViewTemplate>
+    <genericViewTemplate>
+      <name>ihu</name>
+      <editMode v="true" />
+      <entityField>#ENTITY</entityField>
+      <title>hui</title>
+      <fields>
+        <entityFieldLink>
+          <name>e6d21257-2eef-4de2-8d5f-a8a0fd3188a9</name>
+          <entityField>FIRSTNAME</entityField>
+        </entityFieldLink>
+      </fields>
+    </genericViewTemplate>
   </children>
 </neonView>
diff --git a/preferences/_____PREFERENCES_PROJECT/_____PREFERENCES_PROJECT.aod b/preferences/_____PREFERENCES_PROJECT/_____PREFERENCES_PROJECT.aod
index cb973daa809..7f1ff585157 100644
--- a/preferences/_____PREFERENCES_PROJECT/_____PREFERENCES_PROJECT.aod
+++ b/preferences/_____PREFERENCES_PROJECT/_____PREFERENCES_PROJECT.aod
@@ -40,6 +40,7 @@
   <indexsearchIncrementingIndexerEnabled v="true" />
   <indexsearchIncrementingIndexerInterval v="1000" />
   <indexsearchIncrementingIndexerBunchSize v="250" />
+  <userdirectoryAlias>_____SYSTEMALIAS</userdirectoryAlias>
   <mailBridgeMailserver>
     <mailbridgeMailserver>
       <name>abfa63d1-a47e-41f6-a87d-138bf04adc1e</name>
-- 
GitLab


From aa3c9284c8909ea876a58249451bb560c52cb027 Mon Sep 17 00:00:00 2001
From: "S.Listl" <S.Listl@SLISTL.aditosoftware.local>
Date: Thu, 9 Jul 2020 15:24:35 +0200
Subject: [PATCH 005/184] 1060809 MS Teams

---
 .liquibase/Data_alias/changelog.xml           |   2 +-
 aliasDefinition/Data_alias/Data_alias.aod     | 132 ++++++++++++++++++
 .../BulkMailAddRecipients_entity.aod          |  28 +++-
 .../BulkMailTesting_entity.aod                |  28 +++-
 .../CampaignAddParticipants_entity.aod        |   4 -
 entity/Email_entity/Email_entity.aod          |  28 +++-
 .../ExportTemplateSelection_entity.aod        |  29 +++-
 entity/Letter_entity/Letter_entity.aod        |  28 +++-
 .../MSTChooseTeam_entity.aod                  |  37 ++---
 .../allarchivedteams/dropDownProcess.js       |   9 --
 .../entityfields/allteams/dropDownProcess.js  |  18 ---
 .../recordcontainers/jdito/contentProcess.js  |   2 +-
 .../recordcontainers/jdito/onInsert.js        |  66 ++-------
 .../MSTTeamAddMembers_entity.aod              |  44 ++++++
 .../salesprojectid_param/valueProcess.js      |   4 +
 .../recordcontainers/jdito/contentProcess.js  |   9 ++
 .../MSTTeamMember_entity.aod                  |  85 +++++++----
 .../entityfields/isextern/valueProcess.js     |   7 +
 .../mailsofextern/dropDownProcess.js          |   6 -
 .../objectrowid_param/valueProcess.js         |   4 +
 .../role_or_invite/dropDownProcess.js         |  21 +++
 .../upnsofmembers/dropDownProcess.js          |   6 -
 .../recordcontainers/jdito/contentProcess.js  |  22 ++-
 entity/MSTTeam_entity/MSTTeam_entity.aod      |  97 +++++--------
 entity/MSTTeam_entity/contentTitleProcess.js  |   4 +
 .../mailsofextern/dropDownProcess.js          |   6 -
 .../entityfields/obect_rowid/valueProcess.js  |   6 -
 .../children/mstteamid_param/valueProcess.js  |   4 +
 .../salesprojectid_param/valueProcess.js      |   4 +
 .../upnsofmembers/dropDownProcess.js          |   6 -
 .../upnsofowners/dropDownProcess.js           |   6 -
 .../upnsofownersoriginal/dropDownProcess.js   |  17 ---
 .../recordcontainers/jdito/contentProcess.js  |  34 ++++-
 .../recordcontainers/jdito/onInsert.js        |   3 -
 entity/Member_entity/Member_entity.aod        |  89 ++++++------
 entity/Member_entity/contentTitleProcess.js   |   4 +
 .../entityfields/assignedteam/valueProcess.js |  38 -----
 .../children/addapp/stateProcess.js           |   2 +-
 .../children/addnewmember/onActionProcess.js  |   9 +-
 .../children/addnewmember/stateProcess.js     |   2 +-
 .../changetomsteam/onActionProcess.js         |   4 +-
 .../children/changetomsteam/stateProcess.js   |   2 +-
 .../children/chooseteam/onActionProcess.js    |   2 +-
 .../children/chooseteam/stateProcess.js       |   2 +-
 .../children/createchannel/onActionProcess.js |  12 --
 .../children/createchannel/stateProcess.js    |  23 ---
 .../children/createteam/onActionProcess.js    |  24 +---
 .../children/createteam/stateProcess.js       |   2 +-
 .../children/deleteteam/onActionProcess.js    |  25 ++--
 .../children/deleteteam/stateProcess.js       |   2 +-
 .../children/restoreteam/stateProcess.js      |   2 +-
 .../Salesproject_entity.aod                   |  68 ++-------
 .../entityfields/addapp/onActionProcess.js    |  12 --
 .../entityfields/addapp/stateProcess.js       |  10 --
 .../entityfields/addmember/onActionProcess.js |  11 --
 .../entityfields/addmember/stateProcess.js    |  10 --
 .../createchannel/onActionProcess.js          |  10 --
 .../createchannel/stateProcess.js             |  10 --
 .../createteam/onActionProcess.js             |  20 ---
 .../entityfields/createteam/stateProcess.js   |  11 --
 .../deleteteam/onActionProcess.js             |  10 --
 .../entityfields/deleteteam/stateProcess.js   |  11 --
 .../restoreteam/onActionProcess.js            |  10 --
 .../entityfields/restoreteam/stateProcess.js  |  10 --
 .../mst_team_id.displayvalue/expression.js    |   3 +
 .../SerialLetterAddRecipients_entity.aod      |  28 +++-
 neonContext/MSTTeam/MSTTeam.aod               |   5 +
 .../MSTTeamAddMembers/MSTTeamAddMembers.aod   |  14 ++
 neonContext/MSTTeamMember/MSTTeamMember.aod   |   4 +
 neonContext/Member/Member.aod                 |   5 +
 neonContext/Salesproject/Salesproject.aod     |   4 -
 .../MSTChooseTeamEdit_view.aod                |  30 +---
 .../MSTTeamAddMembersEdit_view.aod            |  18 +++
 .../MSTTeamEdit_view/MSTTeamEdit_view.aod     |  54 ++-----
 .../MSTTeamMemberMultiEdit_view.aod           |  26 ++++
 .../MSTTeamPreview_view.aod                   |  20 +++
 .../MemberFilter_view/MemberFilter_view.aod   |   3 +-
 .../MemberLookup_view/MemberLookup_view.aod   |  30 ++++
 .../SalesprojectMSTeams_view.aod              |  36 -----
 .../SalesprojectMain_view.aod                 |   5 -
 .../SalesprojectPreview_view.aod              |   4 +
 81 files changed, 791 insertions(+), 751 deletions(-)
 delete mode 100644 entity/MSTChooseTeam_entity/entityfields/allarchivedteams/dropDownProcess.js
 delete mode 100644 entity/MSTChooseTeam_entity/entityfields/allteams/dropDownProcess.js
 create mode 100644 entity/MSTTeamAddMembers_entity/MSTTeamAddMembers_entity.aod
 create mode 100644 entity/MSTTeamAddMembers_entity/entityfields/members/children/salesprojectid_param/valueProcess.js
 create mode 100644 entity/MSTTeamAddMembers_entity/recordcontainers/jdito/contentProcess.js
 create mode 100644 entity/MSTTeamMember_entity/entityfields/isextern/valueProcess.js
 delete mode 100644 entity/MSTTeamMember_entity/entityfields/mailsofextern/dropDownProcess.js
 create mode 100644 entity/MSTTeamMember_entity/entityfields/projectmembers/children/objectrowid_param/valueProcess.js
 create mode 100644 entity/MSTTeamMember_entity/entityfields/role_or_invite/dropDownProcess.js
 delete mode 100644 entity/MSTTeamMember_entity/entityfields/upnsofmembers/dropDownProcess.js
 create mode 100644 entity/MSTTeam_entity/contentTitleProcess.js
 delete mode 100644 entity/MSTTeam_entity/entityfields/mailsofextern/dropDownProcess.js
 delete mode 100644 entity/MSTTeam_entity/entityfields/obect_rowid/valueProcess.js
 create mode 100644 entity/MSTTeam_entity/entityfields/teammembers/children/mstteamid_param/valueProcess.js
 create mode 100644 entity/MSTTeam_entity/entityfields/teammembers/children/salesprojectid_param/valueProcess.js
 delete mode 100644 entity/MSTTeam_entity/entityfields/upnsofmembers/dropDownProcess.js
 delete mode 100644 entity/MSTTeam_entity/entityfields/upnsofowners/dropDownProcess.js
 delete mode 100644 entity/MSTTeam_entity/entityfields/upnsofownersoriginal/dropDownProcess.js
 create mode 100644 entity/Member_entity/contentTitleProcess.js
 delete mode 100644 entity/Member_entity/entityfields/assignedteam/valueProcess.js
 delete mode 100644 entity/Member_entity/entityfields/msteamsactiongroup/children/createchannel/onActionProcess.js
 delete mode 100644 entity/Member_entity/entityfields/msteamsactiongroup/children/createchannel/stateProcess.js
 delete mode 100644 entity/Salesproject_entity/entityfields/addapp/onActionProcess.js
 delete mode 100644 entity/Salesproject_entity/entityfields/addapp/stateProcess.js
 delete mode 100644 entity/Salesproject_entity/entityfields/addmember/onActionProcess.js
 delete mode 100644 entity/Salesproject_entity/entityfields/addmember/stateProcess.js
 delete mode 100644 entity/Salesproject_entity/entityfields/createchannel/onActionProcess.js
 delete mode 100644 entity/Salesproject_entity/entityfields/createchannel/stateProcess.js
 delete mode 100644 entity/Salesproject_entity/entityfields/createteam/onActionProcess.js
 delete mode 100644 entity/Salesproject_entity/entityfields/createteam/stateProcess.js
 delete mode 100644 entity/Salesproject_entity/entityfields/deleteteam/onActionProcess.js
 delete mode 100644 entity/Salesproject_entity/entityfields/deleteteam/stateProcess.js
 delete mode 100644 entity/Salesproject_entity/entityfields/restoreteam/onActionProcess.js
 delete mode 100644 entity/Salesproject_entity/entityfields/restoreteam/stateProcess.js
 create mode 100644 entity/Salesproject_entity/recordcontainers/db/recordfieldmappings/mst_team_id.displayvalue/expression.js
 create mode 100644 neonContext/MSTTeamAddMembers/MSTTeamAddMembers.aod
 create mode 100644 neonView/MSTTeamAddMembersEdit_view/MSTTeamAddMembersEdit_view.aod
 create mode 100644 neonView/MSTTeamMemberMultiEdit_view/MSTTeamMemberMultiEdit_view.aod
 create mode 100644 neonView/MSTTeamPreview_view/MSTTeamPreview_view.aod
 create mode 100644 neonView/MemberLookup_view/MemberLookup_view.aod
 delete mode 100644 neonView/SalesprojectMSTeams_view/SalesprojectMSTeams_view.aod

diff --git a/.liquibase/Data_alias/changelog.xml b/.liquibase/Data_alias/changelog.xml
index 50c63b65a63..9f811a4e282 100644
--- a/.liquibase/Data_alias/changelog.xml
+++ b/.liquibase/Data_alias/changelog.xml
@@ -15,5 +15,5 @@
     <include relativeToChangelogFile="true" file="basic/2020.1.1/changelog.xml"/>
     
     <!--enable this only when you definetly want to overwrite the existing data with demo records:--> 
-    <!--<include relativeToChangelogFile="true" file="basic/_demoData/changelog.xml" context="example"/>-->
+    <include relativeToChangelogFile="true" file="basic/_demoData/changelog.xml" context="example"/>
 </databaseChangeLog>
\ No newline at end of file
diff --git a/aliasDefinition/Data_alias/Data_alias.aod b/aliasDefinition/Data_alias/Data_alias.aod
index 9f5df436ed9..427ce28a0ce 100644
--- a/aliasDefinition/Data_alias/Data_alias.aod
+++ b/aliasDefinition/Data_alias/Data_alias.aod
@@ -3647,6 +3647,20 @@
                   </customStringProperty>
                 </customProperties>
               </entityFieldDb>
+              <entityFieldDb>
+                <name>MST_TEAM_ID</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="1" />
+                <size v="36" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
             </entityFields>
           </entityDb>
           <entityDb>
@@ -14150,6 +14164,124 @@
               </entityFieldDb>
             </entityFields>
           </entityDb>
+          <entityDb>
+            <name>MST_TEAM</name>
+            <dbName></dbName>
+            <idColumn>MST_TEAMID</idColumn>
+            <idGeneratorType v="0" />
+            <idGeneratorInterval v="1" />
+            <documentation></documentation>
+            <title></title>
+            <description></description>
+            <auditSyncConfig>
+              <name>auditSyncConfig</name>
+              <auditMode v="0" />
+              <syncActive v="false" />
+              <syncComplete v="true" />
+              <syncDirection v="1" />
+              <syncIds></syncIds>
+            </auditSyncConfig>
+            <entityFields>
+              <entityFieldDb>
+                <name>OBJECT_ROWID</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="1" />
+                <size v="36" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>MST_TEAMID</name>
+                <dbName></dbName>
+                <primaryKey v="true" />
+                <columnType v="1" />
+                <size v="36" />
+                <scale v="0" />
+                <notNull v="true" />
+                <isUnique v="true" />
+                <index v="true" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>IS_ARCHIVED</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="5" />
+                <size v="5" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>SERVICE_URL</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="12" />
+                <size v="255" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>TEAMNAME</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="12" />
+                <size v="255" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>GENERAL_CHANNELID</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="1" />
+                <size v="48" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>WEB_URL</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="12" />
+                <size v="255" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+            </entityFields>
+          </entityDb>
         </entities>
       </entityGroup>
     </aliasDefDb>
diff --git a/entity/BulkMailAddRecipients_entity/BulkMailAddRecipients_entity.aod b/entity/BulkMailAddRecipients_entity/BulkMailAddRecipients_entity.aod
index e75ed952327..ff7e67f3d3d 100644
--- a/entity/BulkMailAddRecipients_entity/BulkMailAddRecipients_entity.aod
+++ b/entity/BulkMailAddRecipients_entity/BulkMailAddRecipients_entity.aod
@@ -60,9 +60,29 @@
     </entityField>
   </entityFields>
   <recordContainers>
-    <datalessRecordContainer>
-      <name>datalessConfig</name>
-      <alias>Data_alias</alias>
-    </datalessRecordContainer>
+    <jDitoRecordContainer>
+      <name>jdito</name>
+      <jDitoRecordAlias>Data_alias</jDitoRecordAlias>
+      <isPageable v="true" />
+      <contentProcess>%aditoprj%/entity/MSTChooseTeam_entity/recordcontainers/jdito/contentProcess.js</contentProcess>
+      <onInsert>%aditoprj%/entity/MSTChooseTeam_entity/recordcontainers/jdito/onInsert.js</onInsert>
+      <recordFieldMappings>
+        <jDitoRecordFieldMapping>
+          <name>ALLTEAMS.value</name>
+        </jDitoRecordFieldMapping>
+        <jDitoRecordFieldMapping>
+          <name>ALLTEAMS.displayValue</name>
+        </jDitoRecordFieldMapping>
+        <jDitoRecordFieldMapping>
+          <name>UID.value</name>
+        </jDitoRecordFieldMapping>
+        <jDitoRecordFieldMapping>
+          <name>ALLARCHIVEDTEAMS.displayValue</name>
+        </jDitoRecordFieldMapping>
+        <jDitoRecordFieldMapping>
+          <name>ALLARCHIVEDTEAMS.value</name>
+        </jDitoRecordFieldMapping>
+      </recordFieldMappings>
+    </jDitoRecordContainer>
   </recordContainers>
 </entity>
diff --git a/entity/BulkMailTesting_entity/BulkMailTesting_entity.aod b/entity/BulkMailTesting_entity/BulkMailTesting_entity.aod
index 70e8a0f2629..d67a06830c8 100644
--- a/entity/BulkMailTesting_entity/BulkMailTesting_entity.aod
+++ b/entity/BulkMailTesting_entity/BulkMailTesting_entity.aod
@@ -58,9 +58,29 @@
     </entityActionField>
   </entityFields>
   <recordContainers>
-    <datalessRecordContainer>
-      <name>datalessRecordContainer</name>
-      <alias>Data_alias</alias>
-    </datalessRecordContainer>
+    <jDitoRecordContainer>
+      <name>jdito</name>
+      <jDitoRecordAlias>Data_alias</jDitoRecordAlias>
+      <isPageable v="true" />
+      <contentProcess>%aditoprj%/entity/MSTChooseTeam_entity/recordcontainers/jdito/contentProcess.js</contentProcess>
+      <onInsert>%aditoprj%/entity/MSTChooseTeam_entity/recordcontainers/jdito/onInsert.js</onInsert>
+      <recordFieldMappings>
+        <jDitoRecordFieldMapping>
+          <name>ALLTEAMS.value</name>
+        </jDitoRecordFieldMapping>
+        <jDitoRecordFieldMapping>
+          <name>ALLTEAMS.displayValue</name>
+        </jDitoRecordFieldMapping>
+        <jDitoRecordFieldMapping>
+          <name>UID.value</name>
+        </jDitoRecordFieldMapping>
+        <jDitoRecordFieldMapping>
+          <name>ALLARCHIVEDTEAMS.displayValue</name>
+        </jDitoRecordFieldMapping>
+        <jDitoRecordFieldMapping>
+          <name>ALLARCHIVEDTEAMS.value</name>
+        </jDitoRecordFieldMapping>
+      </recordFieldMappings>
+    </jDitoRecordContainer>
   </recordContainers>
 </entity>
diff --git a/entity/CampaignAddParticipants_entity/CampaignAddParticipants_entity.aod b/entity/CampaignAddParticipants_entity/CampaignAddParticipants_entity.aod
index 427c1e2626f..fcaefe8fd53 100644
--- a/entity/CampaignAddParticipants_entity/CampaignAddParticipants_entity.aod
+++ b/entity/CampaignAddParticipants_entity/CampaignAddParticipants_entity.aod
@@ -151,9 +151,5 @@
         </jDitoRecordFieldMapping>
       </recordFieldMappings>
     </jDitoRecordContainer>
-    <datalessRecordContainer>
-      <name>datalessConfig</name>
-      <alias>Data_alias</alias>
-    </datalessRecordContainer>
   </recordContainers>
 </entity>
diff --git a/entity/Email_entity/Email_entity.aod b/entity/Email_entity/Email_entity.aod
index 670910b8441..b552eda49fa 100644
--- a/entity/Email_entity/Email_entity.aod
+++ b/entity/Email_entity/Email_entity.aod
@@ -126,9 +126,29 @@
     </entityActionField>
   </entityFields>
   <recordContainers>
-    <datalessRecordContainer>
-      <name>datalessRecordContainer</name>
-      <alias>Data_alias</alias>
-    </datalessRecordContainer>
+    <jDitoRecordContainer>
+      <name>jdito</name>
+      <jDitoRecordAlias>Data_alias</jDitoRecordAlias>
+      <isPageable v="true" />
+      <contentProcess>%aditoprj%/entity/MSTChooseTeam_entity/recordcontainers/jdito/contentProcess.js</contentProcess>
+      <onInsert>%aditoprj%/entity/MSTChooseTeam_entity/recordcontainers/jdito/onInsert.js</onInsert>
+      <recordFieldMappings>
+        <jDitoRecordFieldMapping>
+          <name>ALLTEAMS.value</name>
+        </jDitoRecordFieldMapping>
+        <jDitoRecordFieldMapping>
+          <name>ALLTEAMS.displayValue</name>
+        </jDitoRecordFieldMapping>
+        <jDitoRecordFieldMapping>
+          <name>UID.value</name>
+        </jDitoRecordFieldMapping>
+        <jDitoRecordFieldMapping>
+          <name>ALLARCHIVEDTEAMS.displayValue</name>
+        </jDitoRecordFieldMapping>
+        <jDitoRecordFieldMapping>
+          <name>ALLARCHIVEDTEAMS.value</name>
+        </jDitoRecordFieldMapping>
+      </recordFieldMappings>
+    </jDitoRecordContainer>
   </recordContainers>
 </entity>
diff --git a/entity/ExportTemplateSelection_entity/ExportTemplateSelection_entity.aod b/entity/ExportTemplateSelection_entity/ExportTemplateSelection_entity.aod
index de7cb9ab35c..ff6e122d10b 100644
--- a/entity/ExportTemplateSelection_entity/ExportTemplateSelection_entity.aod
+++ b/entity/ExportTemplateSelection_entity/ExportTemplateSelection_entity.aod
@@ -77,10 +77,31 @@
       <stateProcess>%aditoprj%/entity/ExportTemplateSelection_entity/entityfields/safeandexport/stateProcess.js</stateProcess>
     </entityActionField>
   </entityFields>
+  
   <recordContainers>
-    <datalessRecordContainer>
-      <name>datalessRecordContainer</name>
-      <alias>Data_alias</alias>
-    </datalessRecordContainer>
+    <jDitoRecordContainer>
+      <name>jdito</name>
+      <jDitoRecordAlias>Data_alias</jDitoRecordAlias>
+      <isPageable v="true" />
+      <contentProcess>%aditoprj%/entity/MSTChooseTeam_entity/recordcontainers/jdito/contentProcess.js</contentProcess>
+      <onInsert>%aditoprj%/entity/MSTChooseTeam_entity/recordcontainers/jdito/onInsert.js</onInsert>
+      <recordFieldMappings>
+        <jDitoRecordFieldMapping>
+          <name>ALLTEAMS.value</name>
+        </jDitoRecordFieldMapping>
+        <jDitoRecordFieldMapping>
+          <name>ALLTEAMS.displayValue</name>
+        </jDitoRecordFieldMapping>
+        <jDitoRecordFieldMapping>
+          <name>UID.value</name>
+        </jDitoRecordFieldMapping>
+        <jDitoRecordFieldMapping>
+          <name>ALLARCHIVEDTEAMS.displayValue</name>
+        </jDitoRecordFieldMapping>
+        <jDitoRecordFieldMapping>
+          <name>ALLARCHIVEDTEAMS.value</name>
+        </jDitoRecordFieldMapping>
+      </recordFieldMappings>
+    </jDitoRecordContainer>
   </recordContainers>
 </entity>
diff --git a/entity/Letter_entity/Letter_entity.aod b/entity/Letter_entity/Letter_entity.aod
index 8bab19f92a2..2d818196d6e 100644
--- a/entity/Letter_entity/Letter_entity.aod
+++ b/entity/Letter_entity/Letter_entity.aod
@@ -74,9 +74,29 @@
     </entityActionField>
   </entityFields>
   <recordContainers>
-    <datalessRecordContainer>
-      <name>datalessConfig</name>
-      <alias>Data_alias</alias>
-    </datalessRecordContainer>
+    <jDitoRecordContainer>
+      <name>jdito</name>
+      <jDitoRecordAlias>Data_alias</jDitoRecordAlias>
+      <isPageable v="true" />
+      <contentProcess>%aditoprj%/entity/MSTChooseTeam_entity/recordcontainers/jdito/contentProcess.js</contentProcess>
+      <onInsert>%aditoprj%/entity/MSTChooseTeam_entity/recordcontainers/jdito/onInsert.js</onInsert>
+      <recordFieldMappings>
+        <jDitoRecordFieldMapping>
+          <name>ALLTEAMS.value</name>
+        </jDitoRecordFieldMapping>
+        <jDitoRecordFieldMapping>
+          <name>ALLTEAMS.displayValue</name>
+        </jDitoRecordFieldMapping>
+        <jDitoRecordFieldMapping>
+          <name>UID.value</name>
+        </jDitoRecordFieldMapping>
+        <jDitoRecordFieldMapping>
+          <name>ALLARCHIVEDTEAMS.displayValue</name>
+        </jDitoRecordFieldMapping>
+        <jDitoRecordFieldMapping>
+          <name>ALLARCHIVEDTEAMS.value</name>
+        </jDitoRecordFieldMapping>
+      </recordFieldMappings>
+    </jDitoRecordContainer>
   </recordContainers>
 </entity>
diff --git a/entity/MSTChooseTeam_entity/MSTChooseTeam_entity.aod b/entity/MSTChooseTeam_entity/MSTChooseTeam_entity.aod
index fc249eca704..6079bbe7b73 100644
--- a/entity/MSTChooseTeam_entity/MSTChooseTeam_entity.aod
+++ b/entity/MSTChooseTeam_entity/MSTChooseTeam_entity.aod
@@ -8,28 +8,26 @@
       <name>#PROVIDER</name>
     </entityProvider>
     <entityField>
-      <name>ALLTEAMS</name>
-      <title>All Teams</title>
-      <dropDownProcess>%aditoprj%/entity/MSTChooseTeam_entity/entityfields/allteams/dropDownProcess.js</dropDownProcess>
+      <name>MST_TEAM</name>
+      <title>Team</title>
+      <consumer>Teams</consumer>
       <selectionMode>SINGLE</selectionMode>
     </entityField>
     <entityField>
       <name>UID</name>
     </entityField>
     <entityParameter>
-      <name>RowId_param</name>
+      <name>SalesprojectId_param</name>
       <expose v="true" />
     </entityParameter>
-    <entityField>
-      <name>ALLARCHIVEDTEAMS</name>
-      <title>allArchivedTeams</title>
-      <dropDownProcess>%aditoprj%/entity/MSTChooseTeam_entity/entityfields/allarchivedteams/dropDownProcess.js</dropDownProcess>
-    </entityField>
-    <entityField>
-      <name>SEARCHVALUE</name>
-      <title>Surchbegriff</title>
-      <tooltip>Inhalt dieses Feldes wird als Suche verwendet</tooltip>
-    </entityField>
+    <entityConsumer>
+      <name>Teams</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>MSTTeam_entity</entityName>
+        <fieldName>#PROVIDER</fieldName>
+      </dependency>
+    </entityConsumer>
   </entityFields>
   <recordContainers>
     <jDitoRecordContainer>
@@ -39,20 +37,11 @@
       <contentProcess>%aditoprj%/entity/MSTChooseTeam_entity/recordcontainers/jdito/contentProcess.js</contentProcess>
       <onInsert>%aditoprj%/entity/MSTChooseTeam_entity/recordcontainers/jdito/onInsert.js</onInsert>
       <recordFieldMappings>
-        <jDitoRecordFieldMapping>
-          <name>ALLTEAMS.value</name>
-        </jDitoRecordFieldMapping>
-        <jDitoRecordFieldMapping>
-          <name>ALLTEAMS.displayValue</name>
-        </jDitoRecordFieldMapping>
         <jDitoRecordFieldMapping>
           <name>UID.value</name>
         </jDitoRecordFieldMapping>
         <jDitoRecordFieldMapping>
-          <name>ALLARCHIVEDTEAMS.displayValue</name>
-        </jDitoRecordFieldMapping>
-        <jDitoRecordFieldMapping>
-          <name>ALLARCHIVEDTEAMS.value</name>
+          <name>MST_TEAM.value</name>
         </jDitoRecordFieldMapping>
       </recordFieldMappings>
     </jDitoRecordContainer>
diff --git a/entity/MSTChooseTeam_entity/entityfields/allarchivedteams/dropDownProcess.js b/entity/MSTChooseTeam_entity/entityfields/allarchivedteams/dropDownProcess.js
deleted file mode 100644
index 2320b0c176b..00000000000
--- a/entity/MSTChooseTeam_entity/entityfields/allarchivedteams/dropDownProcess.js
+++ /dev/null
@@ -1,9 +0,0 @@
-import("system.result");
-import("system.teams");
-
-
-var allArchivedTeams = teams.getAllArchivedTeams(null);
-
-
-if (allArchivedTeams)
-    result.object(allArchivedTeams);
\ No newline at end of file
diff --git a/entity/MSTChooseTeam_entity/entityfields/allteams/dropDownProcess.js b/entity/MSTChooseTeam_entity/entityfields/allteams/dropDownProcess.js
deleted file mode 100644
index c32b84a9577..00000000000
--- a/entity/MSTChooseTeam_entity/entityfields/allteams/dropDownProcess.js
+++ /dev/null
@@ -1,18 +0,0 @@
-import("system.result");
-import("system.teams");
-import("system.vars");
-import("system.logging");
-
-var searchValue = vars.get("$field.SEARCHVALUE");
-var allTeams;
-if(searchValue)
-{
-    allTeams = teams.getAllTeams(searchValue);
-}
-else
-{
-    allTeams = teams.getAllTeams(null)
-}
-
-if (allTeams)
-    result.object(allTeams);
\ No newline at end of file
diff --git a/entity/MSTChooseTeam_entity/recordcontainers/jdito/contentProcess.js b/entity/MSTChooseTeam_entity/recordcontainers/jdito/contentProcess.js
index 488d22d4b38..af9ece7caa7 100644
--- a/entity/MSTChooseTeam_entity/recordcontainers/jdito/contentProcess.js
+++ b/entity/MSTChooseTeam_entity/recordcontainers/jdito/contentProcess.js
@@ -4,6 +4,6 @@ import("system.vars");
 //TODO: This dummy implementation shouldn't be nescessary here. Remove this process eventually. #1051003
 var rows = [];
 if (vars.get("$local.idvalues"))
-    rows = vars.get("$local.idvalues").map(function (id) {return [id, "", "", "", ""];});
+    rows = vars.get("$local.idvalues").map(function (id) {return [id, ""];});
 
 result.object(rows);
\ No newline at end of file
diff --git a/entity/MSTChooseTeam_entity/recordcontainers/jdito/onInsert.js b/entity/MSTChooseTeam_entity/recordcontainers/jdito/onInsert.js
index 041a32b69ab..47e89f66de5 100644
--- a/entity/MSTChooseTeam_entity/recordcontainers/jdito/onInsert.js
+++ b/entity/MSTChooseTeam_entity/recordcontainers/jdito/onInsert.js
@@ -8,70 +8,32 @@ import("system.neon");
 
 var rowData = vars.get("$local.rowdata");
 
-var teamId = rowData["ALLTEAMS.value"];
-var teamName = rowData["ALLTEAMS.displayValue"]
+var teamIdAndName = rowData["MST_TEAM.value"];
 
-var archivedTeamId = rowData["ALLARCHIVEDTEAMS.value"];
-var archivedTeamName = rowData["ALLARCHIVEDTEAMS.displayValue"];
-
-if(teamId)
+if(teamIdAndName)
 {    
+    var [teamId, teamName] = JSON.parse(teamIdAndName);
     var channelId = teams.getGeneralChannelId(teamId);
     
-    var serviceUrl = newSelect("SERVICE_URL")
+    var mstTeamId = newSelect("MST_TEAMID")
     .from("MST_TEAM")
     .where("MST_TEAM.MST_TEAMID", teamId)
     .cell();
     
-    if(serviceUrl == null)
+    if (!mstTeamId)
     {
-        serviceUrl = "";
+        new SqlBuilder().insertFields({
+            "MST_TEAMID" : teamId,
+            "TEAMNAME" : teamName,
+            "GENERAL_CHANNELID" : channelId,
+            "IS_ARCHIVED" : 0
+        }, "MST_TEAM");
     }
-    
-    new SqlBuilder().insertFields({
-    "MST_ID" : util.getNewUUID(),
-    "MST_TEAMID" : teamId,
-    "TEAMNAME" : teamName,
-    "GENERAL_CHANNELID" : channelId,
-    "OBJECT_ROWID" : vars.get("$param.RowId_param"),
-    "IS_ARCHIVED" : 0,
-    "SERVICE_URL" : serviceUrl
-}, "MST_TEAM");
+    newWhere("SALESPROJECT.SALESPROJECTID", "$param.SalesprojectId_param").updateFields({
+        "MST_TEAM_ID" : teamId
+    });
 }
-else if(archivedTeamId)
-{
-    
-    teams.unarchiveTeamAndRestoreGroup(archivedTeamId)
-    
-    var channelId = teams.getGeneralChannelId(archivedTeamId);
 
-    
-    var serviceUrl = newSelect("SERVICE_URL")
-    .from("MST_TEAM")
-    .where("MST_TEAM.MST_TEAMID", archivedTeamId)
-    .cell();
-    
-    if(serviceUrl == null)
-    {
-        serviceUrl = "";
-    }
-    
-    newWhere("MST_TEAM.MST_TEAMID", archivedTeamId)
-   .updateFields({
-                  "IS_ARCHIVED" : "0",
-                  "FINAL_DELETE_DATE" : ""
-                  });
-        
-    new SqlBuilder().insertFields({
-    "MST_ID" : util.getNewUUID(),
-    "MST_TEAMID" : archivedTeamId,
-    "TEAMNAME" : archivedTeamName,
-    "GENERAL_CHANNELID" : channelId,
-    "OBJECT_ROWID" : vars.get("$param.RowId_param"),
-    "IS_ARCHIVED" : 0,
-    "SERVICE_URL" : serviceUrl
-}, "MST_TEAM");
-}
 
 neon.refreshAll();
 
diff --git a/entity/MSTTeamAddMembers_entity/MSTTeamAddMembers_entity.aod b/entity/MSTTeamAddMembers_entity/MSTTeamAddMembers_entity.aod
new file mode 100644
index 00000000000..1a1c93f66ca
--- /dev/null
+++ b/entity/MSTTeamAddMembers_entity/MSTTeamAddMembers_entity.aod
@@ -0,0 +1,44 @@
+<?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.14" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.14">
+  <name>MSTTeamAddMembers_entity</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <title>Add members</title>
+  <recordContainer>jdito</recordContainer>
+  <entityFields>
+    <entityProvider>
+      <name>#PROVIDER</name>
+    </entityProvider>
+    <entityField>
+      <name>UID</name>
+    </entityField>
+    <entityConsumer>
+      <name>Members</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>MSTTeamMember_entity</entityName>
+        <fieldName>#PROVIDER</fieldName>
+      </dependency>
+      <children>
+        <entityParameter>
+          <name>SalesprojectId_param</name>
+          <valueProcess>%aditoprj%/entity/MSTTeamAddMembers_entity/entityfields/members/children/salesprojectid_param/valueProcess.js</valueProcess>
+        </entityParameter>
+      </children>
+    </entityConsumer>
+    <entityParameter>
+      <name>SalesprojectId_param</name>
+      <expose v="true" />
+    </entityParameter>
+  </entityFields>
+  <recordContainers>
+    <jDitoRecordContainer>
+      <name>jdito</name>
+      <contentProcess>%aditoprj%/entity/MSTTeamAddMembers_entity/recordcontainers/jdito/contentProcess.js</contentProcess>
+      <recordFieldMappings>
+        <jDitoRecordFieldMapping>
+          <name>UID.value</name>
+        </jDitoRecordFieldMapping>
+      </recordFieldMappings>
+    </jDitoRecordContainer>
+  </recordContainers>
+</entity>
diff --git a/entity/MSTTeamAddMembers_entity/entityfields/members/children/salesprojectid_param/valueProcess.js b/entity/MSTTeamAddMembers_entity/entityfields/members/children/salesprojectid_param/valueProcess.js
new file mode 100644
index 00000000000..86e1d8c1c0f
--- /dev/null
+++ b/entity/MSTTeamAddMembers_entity/entityfields/members/children/salesprojectid_param/valueProcess.js
@@ -0,0 +1,4 @@
+import("system.vars");
+import("system.result");
+
+result.string(vars.get("$param.SalesprojectId_param"));
\ No newline at end of file
diff --git a/entity/MSTTeamAddMembers_entity/recordcontainers/jdito/contentProcess.js b/entity/MSTTeamAddMembers_entity/recordcontainers/jdito/contentProcess.js
new file mode 100644
index 00000000000..e197aca8b77
--- /dev/null
+++ b/entity/MSTTeamAddMembers_entity/recordcontainers/jdito/contentProcess.js
@@ -0,0 +1,9 @@
+import("system.result");
+import("system.vars");
+
+//TODO: This dummy implementation shouldn't be nescessary here. Remove this process eventually. #1051003
+var rows = [];
+if (vars.get("$local.idvalues"))
+    rows = vars.get("$local.idvalues").map(function (id) {return [id];});
+
+result.object(rows);
\ No newline at end of file
diff --git a/entity/MSTTeamMember_entity/MSTTeamMember_entity.aod b/entity/MSTTeamMember_entity/MSTTeamMember_entity.aod
index 65caeb26918..40379d111b5 100644
--- a/entity/MSTTeamMember_entity/MSTTeamMember_entity.aod
+++ b/entity/MSTTeamMember_entity/MSTTeamMember_entity.aod
@@ -6,36 +6,27 @@
   <entityFields>
     <entityProvider>
       <name>#PROVIDER</name>
+      <dependencies>
+        <entityDependency>
+          <name>335d30c4-7beb-4dcb-8a0f-de85108530a9</name>
+          <entityName>MSTTeamAddMembers_entity</entityName>
+          <fieldName>Members</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+      </dependencies>
     </entityProvider>
     <entityField>
-      <name>UPNSOFMEMBERS</name>
+      <name>MEMBER</name>
       <title>Members</title>
-      <dropDownProcess>%aditoprj%/entity/MSTTeamMember_entity/entityfields/upnsofmembers/dropDownProcess.js</dropDownProcess>
-      <selectionMode>MULTI</selectionMode>
+      <consumer>ProjectMembers</consumer>
     </entityField>
     <entityField>
       <name>UID</name>
     </entityField>
-    <entityField>
-      <name>ARETHESEOWNERS</name>
-      <title>Handelt es sich bei den Benutzer(n) um "Besitzer"?</title>
-      <contentType>BOOLEAN</contentType>
-    </entityField>
     <entityParameter>
       <name>ROWID_param</name>
       <expose v="true" />
     </entityParameter>
-    <entityField>
-      <name>MAILSOFEXTERN</name>
-      <title>Externe Benutzer</title>
-      <dropDownProcess>%aditoprj%/entity/MSTTeamMember_entity/entityfields/mailsofextern/dropDownProcess.js</dropDownProcess>
-      <selectionMode>MULTI</selectionMode>
-    </entityField>
-    <entityField>
-      <name>EXTERN</name>
-      <title>Nicht vorhandene externe Benutzer einladen?</title>
-      <contentType>BOOLEAN</contentType>
-    </entityField>
     <entityParameter>
       <name>UpnsOfMembers_param</name>
       <expose v="true" />
@@ -44,6 +35,51 @@
       <name>MailsOfExtern_param</name>
       <expose v="true" />
     </entityParameter>
+    <entityParameter>
+      <name>SalesprojectId_param</name>
+      <expose v="true" />
+    </entityParameter>
+    <entityConsumer>
+      <name>ProjectMembers</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Member_entity</entityName>
+        <fieldName>TeamMemberProvider</fieldName>
+      </dependency>
+      <children>
+        <entityParameter>
+          <name>ObjectRowId_param</name>
+          <valueProcess>%aditoprj%/entity/MSTTeamMember_entity/entityfields/projectmembers/children/objectrowid_param/valueProcess.js</valueProcess>
+        </entityParameter>
+      </children>
+    </entityConsumer>
+    <entityField>
+      <name>ROLE_OR_INVITE</name>
+      <mandatory v="true" />
+      <dropDownProcess>%aditoprj%/entity/MSTTeamMember_entity/entityfields/role_or_invite/dropDownProcess.js</dropDownProcess>
+    </entityField>
+    <entityField>
+      <name>ISEXTERN</name>
+      <valueProcess>%aditoprj%/entity/MSTTeamMember_entity/entityfields/isextern/valueProcess.js</valueProcess>
+    </entityField>
+    <entityField>
+      <name>MEMBERNAME</name>
+    </entityField>
+    <entityParameter>
+      <name>MSTTeamId_param</name>
+      <expose v="true" />
+    </entityParameter>
+    <entityProvider>
+      <name>MembersOfTeam</name>
+      <dependencies>
+        <entityDependency>
+          <name>37854fde-c4ae-4f56-82df-14385717f82e</name>
+          <entityName>MSTTeam_entity</entityName>
+          <fieldName>TeamMembers</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+      </dependencies>
+    </entityProvider>
   </entityFields>
   <recordContainers>
     <jDitoRecordContainer>
@@ -57,16 +93,7 @@
           <name>UID.value</name>
         </jDitoRecordFieldMapping>
         <jDitoRecordFieldMapping>
-          <name>UPNSOFMEMBERS.value</name>
-        </jDitoRecordFieldMapping>
-        <jDitoRecordFieldMapping>
-          <name>ARETHESEOWNERS.value</name>
-        </jDitoRecordFieldMapping>
-        <jDitoRecordFieldMapping>
-          <name>MAILSOFEXTERN.value</name>
-        </jDitoRecordFieldMapping>
-        <jDitoRecordFieldMapping>
-          <name>EXTERN.value</name>
+          <name>MEMBERNAME.value</name>
         </jDitoRecordFieldMapping>
       </recordFieldMappings>
     </jDitoRecordContainer>
diff --git a/entity/MSTTeamMember_entity/entityfields/isextern/valueProcess.js b/entity/MSTTeamMember_entity/entityfields/isextern/valueProcess.js
new file mode 100644
index 00000000000..f83ff5382e6
--- /dev/null
+++ b/entity/MSTTeamMember_entity/entityfields/isextern/valueProcess.js
@@ -0,0 +1,7 @@
+import("Employee_lib");
+import("system.vars");
+import("system.result");
+
+var member = vars.get("$field.MEMBER");
+if (member)
+    result.string(!EmployeeUtils.isUser(member));
\ No newline at end of file
diff --git a/entity/MSTTeamMember_entity/entityfields/mailsofextern/dropDownProcess.js b/entity/MSTTeamMember_entity/entityfields/mailsofextern/dropDownProcess.js
deleted file mode 100644
index 9aa7e9e18d0..00000000000
--- a/entity/MSTTeamMember_entity/entityfields/mailsofextern/dropDownProcess.js
+++ /dev/null
@@ -1,6 +0,0 @@
-import("system.result");
-import("system.vars");
-
-var mails = vars.getString("$param.MailsOfExtern_param");
-if (mails)
-    result.object(JSON.parse(mails));
\ No newline at end of file
diff --git a/entity/MSTTeamMember_entity/entityfields/projectmembers/children/objectrowid_param/valueProcess.js b/entity/MSTTeamMember_entity/entityfields/projectmembers/children/objectrowid_param/valueProcess.js
new file mode 100644
index 00000000000..86e1d8c1c0f
--- /dev/null
+++ b/entity/MSTTeamMember_entity/entityfields/projectmembers/children/objectrowid_param/valueProcess.js
@@ -0,0 +1,4 @@
+import("system.vars");
+import("system.result");
+
+result.string(vars.get("$param.SalesprojectId_param"));
\ No newline at end of file
diff --git a/entity/MSTTeamMember_entity/entityfields/role_or_invite/dropDownProcess.js b/entity/MSTTeamMember_entity/entityfields/role_or_invite/dropDownProcess.js
new file mode 100644
index 00000000000..8f7cbef15d5
--- /dev/null
+++ b/entity/MSTTeamMember_entity/entityfields/role_or_invite/dropDownProcess.js
@@ -0,0 +1,21 @@
+import("system.translate");
+import("system.vars");
+import("system.result");
+
+var isExtern = vars.get("$field.ISEXTERN");
+var res = [];
+if (isExtern == "true")
+{
+    res = [
+        ["invite", translate.text("Invite")],
+        ["notInvite", translate.text("Don't invite")]
+    ];
+}
+else if (isExtern == "false")
+{
+    res = [
+        ["isOwner", translate.text("Owner")],
+        ["isMember", translate.text("Member")]
+    ]
+}
+result.object(res);
\ No newline at end of file
diff --git a/entity/MSTTeamMember_entity/entityfields/upnsofmembers/dropDownProcess.js b/entity/MSTTeamMember_entity/entityfields/upnsofmembers/dropDownProcess.js
deleted file mode 100644
index 4f6ddbb607f..00000000000
--- a/entity/MSTTeamMember_entity/entityfields/upnsofmembers/dropDownProcess.js
+++ /dev/null
@@ -1,6 +0,0 @@
-import("system.result");
-import("system.vars");
-
-var upns = vars.getString("$param.UpnsOfMembers_param");
-if (upns)
-    result.object(JSON.parse(upns));
\ No newline at end of file
diff --git a/entity/MSTTeamMember_entity/recordcontainers/jdito/contentProcess.js b/entity/MSTTeamMember_entity/recordcontainers/jdito/contentProcess.js
index 488d22d4b38..e053d9286a0 100644
--- a/entity/MSTTeamMember_entity/recordcontainers/jdito/contentProcess.js
+++ b/entity/MSTTeamMember_entity/recordcontainers/jdito/contentProcess.js
@@ -1,9 +1,23 @@
 import("system.result");
 import("system.vars");
 
-//TODO: This dummy implementation shouldn't be nescessary here. Remove this process eventually. #1051003
-var rows = [];
+var teamId = vars.get("$param.MSTTeamId_param");
+var allMembers = teams.getAllMembers(teamId);
+var memberArray = [];
+
 if (vars.get("$local.idvalues"))
-    rows = vars.get("$local.idvalues").map(function (id) {return [id, "", "", "", ""];});
+{
+    memberArray = vars.get("$local.idvalues").map(function (memberId) 
+    {
+        return [memberId, allMembers[memberId]];
+    });   
+}
+else
+{
+    for (let memberId in allMembers)
+    {
+        memberArray.push([memberId, allMembers[memberId]]);
+    }
+}
 
-result.object(rows);
\ No newline at end of file
+result.object(memberArray);
\ No newline at end of file
diff --git a/entity/MSTTeam_entity/MSTTeam_entity.aod b/entity/MSTTeam_entity/MSTTeam_entity.aod
index 7481608126b..ef6acef77cd 100644
--- a/entity/MSTTeam_entity/MSTTeam_entity.aod
+++ b/entity/MSTTeam_entity/MSTTeam_entity.aod
@@ -2,10 +2,20 @@
 <entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.14" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.14">
   <name>MSTTeam_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
+  <contentTitleProcess>%aditoprj%/entity/MSTTeam_entity/contentTitleProcess.js</contentTitleProcess>
   <recordContainer>jdito</recordContainer>
   <entityFields>
     <entityProvider>
       <name>#PROVIDER</name>
+      <lookupIdfield>TEAMID_AND_NAME</lookupIdfield>
+      <dependencies>
+        <entityDependency>
+          <name>31745153-bc31-4529-a6dc-0cddfd2c5b7c</name>
+          <entityName>MSTChooseTeam_entity</entityName>
+          <fieldName>Teams</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+      </dependencies>
     </entityProvider>
     <entityField>
       <name>UID</name>
@@ -18,6 +28,7 @@
     <entityField>
       <name>DESCRIPTION</name>
       <title>Description</title>
+      <contentType>LONG_TEXT</contentType>
       <valueProcess>%aditoprj%/entity/MSTTeam_entity/entityfields/description/valueProcess.js</valueProcess>
     </entityField>
     <entityParameter>
@@ -29,35 +40,7 @@
       <expose v="true" />
     </entityParameter>
     <entityParameter>
-      <name>UpnsOfOwners_param</name>
-      <expose v="true" />
-    </entityParameter>
-    <entityParameter>
-      <name>UpnsOfMembers_param</name>
-      <expose v="true" />
-    </entityParameter>
-    <entityField>
-      <name>UPNSOFMEMBERS</name>
-      <title>Members</title>
-      <dropDownProcess>%aditoprj%/entity/MSTTeam_entity/entityfields/upnsofmembers/dropDownProcess.js</dropDownProcess>
-      <selectionMode>MULTI</selectionMode>
-    </entityField>
-    <entityField>
-      <name>UPNSOFOWNERS</name>
-      <title>Owners</title>
-      <dropDownProcess>%aditoprj%/entity/MSTTeam_entity/entityfields/upnsofowners/dropDownProcess.js</dropDownProcess>
-      <selectionMode>MULTI</selectionMode>
-    </entityField>
-    <entityParameter>
-      <name>RowId_param</name>
-      <expose v="true" />
-    </entityParameter>
-    <entityField>
-      <name>OBECT_ROWID</name>
-      <valueProcess>%aditoprj%/entity/MSTTeam_entity/entityfields/obect_rowid/valueProcess.js</valueProcess>
-    </entityField>
-    <entityParameter>
-      <name>ChannelName_param</name>
+      <name>SalesprojectId_param</name>
       <expose v="true" />
     </entityParameter>
     <entityParameter>
@@ -82,32 +65,34 @@
         </entityParameter>
       </children>
     </entityConsumer>
+    <entityConsumer>
+      <name>TeamMembers</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>MSTTeamMember_entity</entityName>
+        <fieldName>MembersOfTeam</fieldName>
+      </dependency>
+      <children>
+        <entityParameter>
+          <name>SalesprojectId_param</name>
+          <valueProcess>%aditoprj%/entity/MSTTeam_entity/entityfields/teammembers/children/salesprojectid_param/valueProcess.js</valueProcess>
+        </entityParameter>
+        <entityParameter>
+          <name>MSTTeamId_param</name>
+          <valueProcess>%aditoprj%/entity/MSTTeam_entity/entityfields/teammembers/children/mstteamid_param/valueProcess.js</valueProcess>
+        </entityParameter>
+      </children>
+    </entityConsumer>
     <entityField>
-      <name>EXTERN</name>
-      <title>Nicht vorhandene externe Benutzer einladen?</title>
-      <contentType>BOOLEAN</contentType>
-    </entityField>
-    <entityField>
-      <name>MAILSOFEXTERN</name>
-      <title>Externe Benutzer</title>
-      <dropDownProcess>%aditoprj%/entity/MSTTeam_entity/entityfields/mailsofextern/dropDownProcess.js</dropDownProcess>
-      <selectionMode>MULTI</selectionMode>
-    </entityField>
-    <entityParameter>
-      <name>MailsOfExtern_param</name>
-      <expose v="true" />
-    </entityParameter>
-    <entityField>
-      <name>UPNSOFOWNERSORIGINAL</name>
-      <dropDownProcess>%aditoprj%/entity/MSTTeam_entity/entityfields/upnsofownersoriginal/dropDownProcess.js</dropDownProcess>
-      <selectionMode>MULTI</selectionMode>
+      <name>TEAMID_AND_NAME</name>
     </entityField>
   </entityFields>
   <recordContainers>
     <jDitoRecordContainer>
       <name>jdito</name>
       <jDitoRecordAlias>Data_alias</jDitoRecordAlias>
-      <isPageable v="true" />
+      <isFilterable v="true" />
+      <isRequireContainerFiltering v="true" />
       <contentProcess>%aditoprj%/entity/MSTTeam_entity/recordcontainers/jdito/contentProcess.js</contentProcess>
       <onInsert>%aditoprj%/entity/MSTTeam_entity/recordcontainers/jdito/onInsert.js</onInsert>
       <recordFieldMappings>
@@ -118,22 +103,10 @@
           <name>TEAMNAME.value</name>
         </jDitoRecordFieldMapping>
         <jDitoRecordFieldMapping>
-          <name>DESCRIPTION.value</name>
-        </jDitoRecordFieldMapping>
-        <jDitoRecordFieldMapping>
-          <name>OBECT_ROWID.value</name>
-        </jDitoRecordFieldMapping>
-        <jDitoRecordFieldMapping>
-          <name>UPNSOFMEMBERS.value</name>
+          <name>TEAMID_AND_NAME.value</name>
         </jDitoRecordFieldMapping>
         <jDitoRecordFieldMapping>
-          <name>UPNSOFOWNERS.value</name>
-        </jDitoRecordFieldMapping>
-        <jDitoRecordFieldMapping>
-          <name>MAILSOFEXTERN.value</name>
-        </jDitoRecordFieldMapping>
-        <jDitoRecordFieldMapping>
-          <name>EXTERN.value</name>
+          <name>DESCRIPTION.value</name>
         </jDitoRecordFieldMapping>
       </recordFieldMappings>
     </jDitoRecordContainer>
diff --git a/entity/MSTTeam_entity/contentTitleProcess.js b/entity/MSTTeam_entity/contentTitleProcess.js
new file mode 100644
index 00000000000..ada1bccad1d
--- /dev/null
+++ b/entity/MSTTeam_entity/contentTitleProcess.js
@@ -0,0 +1,4 @@
+import("system.vars");
+import("system.result");
+
+result.string(vars.get("$field.TEAMNAME"));
\ No newline at end of file
diff --git a/entity/MSTTeam_entity/entityfields/mailsofextern/dropDownProcess.js b/entity/MSTTeam_entity/entityfields/mailsofextern/dropDownProcess.js
deleted file mode 100644
index 9aa7e9e18d0..00000000000
--- a/entity/MSTTeam_entity/entityfields/mailsofextern/dropDownProcess.js
+++ /dev/null
@@ -1,6 +0,0 @@
-import("system.result");
-import("system.vars");
-
-var mails = vars.getString("$param.MailsOfExtern_param");
-if (mails)
-    result.object(JSON.parse(mails));
\ No newline at end of file
diff --git a/entity/MSTTeam_entity/entityfields/obect_rowid/valueProcess.js b/entity/MSTTeam_entity/entityfields/obect_rowid/valueProcess.js
deleted file mode 100644
index cf5cb63c330..00000000000
--- a/entity/MSTTeam_entity/entityfields/obect_rowid/valueProcess.js
+++ /dev/null
@@ -1,6 +0,0 @@
-import("system.result");
-import("system.neon");
-import("system.vars");
-
-if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && vars.get("$param.RowId_param"))
-    result.string(vars.get("$param.RowId_param"));
\ No newline at end of file
diff --git a/entity/MSTTeam_entity/entityfields/teammembers/children/mstteamid_param/valueProcess.js b/entity/MSTTeam_entity/entityfields/teammembers/children/mstteamid_param/valueProcess.js
new file mode 100644
index 00000000000..16c85500b53
--- /dev/null
+++ b/entity/MSTTeam_entity/entityfields/teammembers/children/mstteamid_param/valueProcess.js
@@ -0,0 +1,4 @@
+import("system.vars");
+import("system.result");
+
+result.string(vars.get("$field.UID"));
\ No newline at end of file
diff --git a/entity/MSTTeam_entity/entityfields/teammembers/children/salesprojectid_param/valueProcess.js b/entity/MSTTeam_entity/entityfields/teammembers/children/salesprojectid_param/valueProcess.js
new file mode 100644
index 00000000000..86e1d8c1c0f
--- /dev/null
+++ b/entity/MSTTeam_entity/entityfields/teammembers/children/salesprojectid_param/valueProcess.js
@@ -0,0 +1,4 @@
+import("system.vars");
+import("system.result");
+
+result.string(vars.get("$param.SalesprojectId_param"));
\ No newline at end of file
diff --git a/entity/MSTTeam_entity/entityfields/upnsofmembers/dropDownProcess.js b/entity/MSTTeam_entity/entityfields/upnsofmembers/dropDownProcess.js
deleted file mode 100644
index 4f6ddbb607f..00000000000
--- a/entity/MSTTeam_entity/entityfields/upnsofmembers/dropDownProcess.js
+++ /dev/null
@@ -1,6 +0,0 @@
-import("system.result");
-import("system.vars");
-
-var upns = vars.getString("$param.UpnsOfMembers_param");
-if (upns)
-    result.object(JSON.parse(upns));
\ No newline at end of file
diff --git a/entity/MSTTeam_entity/entityfields/upnsofowners/dropDownProcess.js b/entity/MSTTeam_entity/entityfields/upnsofowners/dropDownProcess.js
deleted file mode 100644
index 92332745d43..00000000000
--- a/entity/MSTTeam_entity/entityfields/upnsofowners/dropDownProcess.js
+++ /dev/null
@@ -1,6 +0,0 @@
-import("system.result");
-import("system.vars");
-
-var upns = vars.getString("$param.UpnsOfOwners_param");
-if (upns)
-    result.object(JSON.parse(upns));
\ No newline at end of file
diff --git a/entity/MSTTeam_entity/entityfields/upnsofownersoriginal/dropDownProcess.js b/entity/MSTTeam_entity/entityfields/upnsofownersoriginal/dropDownProcess.js
deleted file mode 100644
index 1c0f1126dbe..00000000000
--- a/entity/MSTTeam_entity/entityfields/upnsofownersoriginal/dropDownProcess.js
+++ /dev/null
@@ -1,17 +0,0 @@
-//import("system.entities");
-//import("system.result");
-//import("system.logging");
-//import("system.vars");
-//
-//var memberEntries = entities.createConfigForLoadingRows().entity("Member_entity").provider("TeamMemberProvider").addParameter("ObjectRowId_param", vars.get("$param.RowId_param")).addParameter("ObjectType_param", "Salesproject").fields(["CONTACT_ID", "PERSON_FULL_NAME"]);
-//
-//var members = entities.getRows(memberEntries);
-//
-//logging.log(members);
-//
-//members = members.map(function (member)
-//{
-//    return [member["CONTACT_ID"], member["PERSON_FULL_NAME"]];
-//})
-//
-//result.object(members);
diff --git a/entity/MSTTeam_entity/recordcontainers/jdito/contentProcess.js b/entity/MSTTeam_entity/recordcontainers/jdito/contentProcess.js
index 6eb83082a7e..9a7d5c85c9e 100644
--- a/entity/MSTTeam_entity/recordcontainers/jdito/contentProcess.js
+++ b/entity/MSTTeam_entity/recordcontainers/jdito/contentProcess.js
@@ -1,9 +1,35 @@
+import("system.teams");
 import("system.result");
 import("system.vars");
+import("JditoFilter_lib");
+
+var searchValue = null;
+JditoFilterUtils.filterRecords(["$$$LOOKUPFIELD$$$"], [["dummy"]], vars.get("$local.filter").filter, {
+    "$$$LOOKUPFIELD$$$" : function (recordValue, filterValue)
+    {
+        searchValue = filterValue;
+        return true;
+    }
+});
+
+var allTeams = teams.getAllTeams(searchValue || null);
+var teamsArray = [];
 
-//TODO: This dummy implementation shouldn't be nescessary here. Remove this process eventually. #1051003
-var rows = [];
 if (vars.get("$local.idvalues"))
-    rows = vars.get("$local.idvalues").map(function (id) {return [id, "", "", "", "", "", "", ""];});
+{
+    teamsArray = vars.get("$local.idvalues").map(function (teamId) 
+    {
+        var idAndName = JSON.stringify([teamId, allTeams[teamId]]);
+        return [teamId, allTeams[teamId], idAndName, ""];
+    });   
+}
+else
+{
+    for (let teamId in allTeams)
+    {
+        var idAndName = JSON.stringify([teamId, allTeams[teamId]]);
+        teamsArray.push([teamId, allTeams[teamId], idAndName, ""]);
+    }
+}
 
-result.object(rows);
\ No newline at end of file
+result.object(teamsArray);
\ No newline at end of file
diff --git a/entity/MSTTeam_entity/recordcontainers/jdito/onInsert.js b/entity/MSTTeam_entity/recordcontainers/jdito/onInsert.js
index a98341bbe4c..3e9acef9832 100644
--- a/entity/MSTTeam_entity/recordcontainers/jdito/onInsert.js
+++ b/entity/MSTTeam_entity/recordcontainers/jdito/onInsert.js
@@ -12,9 +12,6 @@ var mailNickname = vars.get("$param.Mailnickname_param");
 
 var description = rowData["DESCRIPTION.value"];
 var upnsOfOwners = text.decodeMS(rowData["UPNSOFOWNERS.value"]);
-var upnsOfMembers = text.decodeMS(rowData["UPNSOFMEMBERS.value"]);
-var mailsOfExtern = text.decodeMS(rowData["MAILSOFEXTERN.value"]);
-var sendInvitation = rowData["EXTERN.value"];
 
 var users = [];
 
diff --git a/entity/Member_entity/Member_entity.aod b/entity/Member_entity/Member_entity.aod
index 104bb57c838..ba4cb276acc 100644
--- a/entity/Member_entity/Member_entity.aod
+++ b/entity/Member_entity/Member_entity.aod
@@ -4,6 +4,7 @@
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <documentation>%aditoprj%/entity/Member_entity/documentation.adoc</documentation>
   <title>${SALESPROJECT_MEMBER}</title>
+  <contentTitleProcess>%aditoprj%/entity/Member_entity/contentTitleProcess.js</contentTitleProcess>
   <iconId>VAADIN:FILE_SOUND</iconId>
   <titlePlural>${SALESPROJECT_MEMBER}</titlePlural>
   <recordContainer>db</recordContainer>
@@ -201,11 +202,11 @@
     </entityField>
     <entityActionGroup>
       <name>MSTeamsActionGroup</name>
-      <title>MSTeamsActionGroup</title>
+      <title>MS Teams</title>
       <children>
         <entityActionField>
           <name>createTeam</name>
-          <title>Team erstellen</title>
+          <title>Create Teams group</title>
           <onActionProcess>%aditoprj%/entity/Member_entity/entityfields/msteamsactiongroup/children/createteam/onActionProcess.js</onActionProcess>
           <isSelectionAction v="false" />
           <iconId>NEON:PLUS</iconId>
@@ -214,63 +215,59 @@
           <tooltip>Erstelle ein neues MicrosoftTeams Team</tooltip>
         </entityActionField>
         <entityActionField>
-          <name>chooseTeam</name>
-          <title>Team auswählen</title>
-          <onActionProcess>%aditoprj%/entity/Member_entity/entityfields/msteamsactiongroup/children/chooseteam/onActionProcess.js</onActionProcess>
-          <stateProcess>%aditoprj%/entity/Member_entity/entityfields/msteamsactiongroup/children/chooseteam/stateProcess.js</stateProcess>
-          <tooltip>Wähle ein bereits hinterlegtes Team</tooltip>
+          <name>addNewMember</name>
+          <title>Add members</title>
+          <onActionProcess>%aditoprj%/entity/Member_entity/entityfields/msteamsactiongroup/children/addnewmember/onActionProcess.js</onActionProcess>
+          <iconId>VAADIN:USER</iconId>
+          <stateProcess>%aditoprj%/entity/Member_entity/entityfields/msteamsactiongroup/children/addnewmember/stateProcess.js</stateProcess>
+          <tooltip>Fügt neue Member zum Team hinzu</tooltip>
         </entityActionField>
         <entityActionField>
-          <name>deleteTeam</name>
-          <title>Team löschen</title>
-          <onActionProcess>%aditoprj%/entity/Member_entity/entityfields/msteamsactiongroup/children/deleteteam/onActionProcess.js</onActionProcess>
-          <iconId>NEON:TRASH</iconId>
-          <stateProcess>%aditoprj%/entity/Member_entity/entityfields/msteamsactiongroup/children/deleteteam/stateProcess.js</stateProcess>
-          <tooltip>Lösche das verknüpfte MSTeams Team</tooltip>
+          <name>deleteMember</name>
+          <title>Delete members</title>
+          <iconId>VAADIN:USER</iconId>
         </entityActionField>
         <entityActionField>
-          <name>createChannel</name>
-          <title>Channel erstellen</title>
-          <onActionProcess>%aditoprj%/entity/Member_entity/entityfields/msteamsactiongroup/children/createchannel/onActionProcess.js</onActionProcess>
-          <iconId>VAADIN:PLUS</iconId>
-          <stateProcess>%aditoprj%/entity/Member_entity/entityfields/msteamsactiongroup/children/createchannel/stateProcess.js</stateProcess>
-          <tooltip>Erstelle einen neuen Channel</tooltip>
+          <name>addApp</name>
+          <title>Add app</title>
+          <onActionProcess>%aditoprj%/entity/Member_entity/entityfields/msteamsactiongroup/children/addapp/onActionProcess.js</onActionProcess>
+          <iconId>VAADIN:MOBILE</iconId>
+          <stateProcess>%aditoprj%/entity/Member_entity/entityfields/msteamsactiongroup/children/addapp/stateProcess.js</stateProcess>
+          <tooltip>Fügt eine App zum Team hinzu</tooltip>
+        </entityActionField>
+        <entityActionField>
+          <name>chooseTeam</name>
+          <title>Choose Teams group</title>
+          <onActionProcess>%aditoprj%/entity/Member_entity/entityfields/msteamsactiongroup/children/chooseteam/onActionProcess.js</onActionProcess>
+          <iconId>NEON:GROUP_APPOINTMENT</iconId>
+          <stateProcess>%aditoprj%/entity/Member_entity/entityfields/msteamsactiongroup/children/chooseteam/stateProcess.js</stateProcess>
+          <tooltip>Wähle ein bereits hinterlegtes Team</tooltip>
         </entityActionField>
         <entityActionField>
           <name>restoreTeam</name>
-          <title>Team wiederherstellen</title>
+          <title>Restore Teams group</title>
           <onActionProcess>%aditoprj%/entity/Member_entity/entityfields/msteamsactiongroup/children/restoreteam/onActionProcess.js</onActionProcess>
           <iconId>VAADIN:ARROW_BACKWARD</iconId>
           <stateProcess>%aditoprj%/entity/Member_entity/entityfields/msteamsactiongroup/children/restoreteam/stateProcess.js</stateProcess>
           <tooltip>Stelle das Team wieder her</tooltip>
         </entityActionField>
-        <entityActionField>
-          <name>addApp</name>
-          <title>App hinzufügen</title>
-          <onActionProcess>%aditoprj%/entity/Member_entity/entityfields/msteamsactiongroup/children/addapp/onActionProcess.js</onActionProcess>
-          <stateProcess>%aditoprj%/entity/Member_entity/entityfields/msteamsactiongroup/children/addapp/stateProcess.js</stateProcess>
-          <tooltip>Fügt eine App zum Team hinzu</tooltip>
-        </entityActionField>
-        <entityActionField>
-          <name>addNewMember</name>
-          <title>Member hinzufügen</title>
-          <onActionProcess>%aditoprj%/entity/Member_entity/entityfields/msteamsactiongroup/children/addnewmember/onActionProcess.js</onActionProcess>
-          <stateProcess>%aditoprj%/entity/Member_entity/entityfields/msteamsactiongroup/children/addnewmember/stateProcess.js</stateProcess>
-          <tooltip>Fügt neue Member zum Team hinzu</tooltip>
-        </entityActionField>
         <entityActionField>
           <name>changeToMSTeam</name>
-          <title>Zum Team wechseln</title>
+          <title>Open Teams</title>
           <onActionProcess>%aditoprj%/entity/Member_entity/entityfields/msteamsactiongroup/children/changetomsteam/onActionProcess.js</onActionProcess>
+          <iconId>VAADIN:EXTERNAL_LINK</iconId>
           <stateProcess>%aditoprj%/entity/Member_entity/entityfields/msteamsactiongroup/children/changetomsteam/stateProcess.js</stateProcess>
         </entityActionField>
+        <entityActionField>
+          <name>deleteTeam</name>
+          <title>Delete Teams group</title>
+          <onActionProcess>%aditoprj%/entity/Member_entity/entityfields/msteamsactiongroup/children/deleteteam/onActionProcess.js</onActionProcess>
+          <iconId>NEON:TRASH</iconId>
+          <stateProcess>%aditoprj%/entity/Member_entity/entityfields/msteamsactiongroup/children/deleteteam/stateProcess.js</stateProcess>
+          <tooltip>Lösche das verknüpfte MSTeams Team</tooltip>
+        </entityActionField>
       </children>
     </entityActionGroup>
-    <entityField>
-      <name>ASSIGNEDTEAM</name>
-      <title>Hinterlegtes Team</title>
-      <valueProcess>%aditoprj%/entity/Member_entity/entityfields/assignedteam/valueProcess.js</valueProcess>
-    </entityField>
     <entityProvider>
       <name>TeamMemberProvider</name>
       <lookupIdfield>CONTACT_ID</lookupIdfield>
@@ -281,6 +278,12 @@
           <fieldName>MemberComsumer</fieldName>
           <isConsumer v="false" />
         </entityDependency>
+        <entityDependency>
+          <name>373a0c5c-dff5-4a6d-9a1f-68d7b73804ce</name>
+          <entityName>MSTTeamMember_entity</entityName>
+          <fieldName>ProjectMembers</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
       </dependencies>
     </entityProvider>
   </entityFields>
@@ -324,6 +327,8 @@
         <dbRecordFieldMapping>
           <name>ORGANISATION_NAME.value</name>
           <recordfield>ORGANISATION.NAME</recordfield>
+          <isFilterable v="true" />
+          <isLookupFilter v="true" />
         </dbRecordFieldMapping>
         <dbRecordFieldMapping>
           <name>ORG_ORGID.value</name>
@@ -332,10 +337,14 @@
         <dbRecordFieldMapping>
           <name>PERSON_FIRSTNAME.value</name>
           <recordfield>PERSON.FIRSTNAME</recordfield>
+          <isFilterable v="true" />
+          <isLookupFilter v="true" />
         </dbRecordFieldMapping>
         <dbRecordFieldMapping>
           <name>PERSON_LASTNAME.value</name>
           <recordfield>PERSON.LASTNAME</recordfield>
+          <isFilterable v="true" />
+          <isLookupFilter v="true" />
         </dbRecordFieldMapping>
         <dbRecordFieldMapping>
           <name>PERSON_PERSID.value</name>
diff --git a/entity/Member_entity/contentTitleProcess.js b/entity/Member_entity/contentTitleProcess.js
new file mode 100644
index 00000000000..e2e9200a479
--- /dev/null
+++ b/entity/Member_entity/contentTitleProcess.js
@@ -0,0 +1,4 @@
+import("system.vars");
+import("system.result");
+
+result.string(vars.get("$field.PERSON_FULL_NAME"));
\ No newline at end of file
diff --git a/entity/Member_entity/entityfields/assignedteam/valueProcess.js b/entity/Member_entity/entityfields/assignedteam/valueProcess.js
deleted file mode 100644
index def1352e692..00000000000
--- a/entity/Member_entity/entityfields/assignedteam/valueProcess.js
+++ /dev/null
@@ -1,38 +0,0 @@
-import("system.vars");
-import("system.neon");
-import("system.result");
-import("Sql_lib");
-    
-var saleprojectId = newSelect("OBJECT_ROWID")
-    .from("MST_TEAM")
-    .where("MST_TEAM.OBJECT_ROWID", "$param.ObjectRowId_param")
-    .cell();
-
-var isArchived = newSelect("IS_ARCHIVED")
-    .from("MST_TEAM")
-    .where("MST_TEAM.OBJECT_ROWID", "$param.ObjectRowId_param")
-    .cell();
-
-if(saleprojectId && isArchived == 0)
-{
-    var teamName = newSelect("TEAMNAME")
-    .from("MST_TEAM")
-    .where("MST_TEAM.OBJECT_ROWID", "$param.ObjectRowId_param")
-    .cell();
-    
-    result.string(teamName);
-}
-else if(saleprojectId && isArchived == 1)
-{
-    var teamName = newSelect("TEAMNAME")
-    .from("MST_TEAM")
-    .where("MST_TEAM.OBJECT_ROWID", "$param.ObjectRowId_param")
-    .cell();
-    
-    result.string("Es existiert ein archiviertes Team (" + teamName + ") zu diesem Projekt. Falls Sie dieses nochmal benötigen: Wählen Sie \"Team wiederherstellen\"");
-}
-else
-{
-    result.string("Es wurde noch kein Team zu diesem Projekt hinterlegt");
-}
-    
diff --git a/entity/Member_entity/entityfields/msteamsactiongroup/children/addapp/stateProcess.js b/entity/Member_entity/entityfields/msteamsactiongroup/children/addapp/stateProcess.js
index 4e1e6159f83..63fdd66eafb 100644
--- a/entity/Member_entity/entityfields/msteamsactiongroup/children/addapp/stateProcess.js
+++ b/entity/Member_entity/entityfields/msteamsactiongroup/children/addapp/stateProcess.js
@@ -21,7 +21,7 @@ var serviceUrl = newSelect("SERVICE_URL")
     
 if (teamId == "" || isArchived == 1 || serviceUrl) 
 {
-    result.string(neon.COMPONENTSTATE_INVISIBLE);
+    result.string(neon.COMPONENTSTATE_DISABLED);
 }
 else
 {
diff --git a/entity/Member_entity/entityfields/msteamsactiongroup/children/addnewmember/onActionProcess.js b/entity/Member_entity/entityfields/msteamsactiongroup/children/addnewmember/onActionProcess.js
index fef435a8321..80a2305605c 100644
--- a/entity/Member_entity/entityfields/msteamsactiongroup/children/addnewmember/onActionProcess.js
+++ b/entity/Member_entity/entityfields/msteamsactiongroup/children/addnewmember/onActionProcess.js
@@ -1,11 +1,6 @@
 import("system.neon");
 import("system.vars");
 
-var upnsOfMembers = [["lisa@mbsolutions2.onmicrosoft.com", "lisa@mbsolutions2.onmicrosoft.com"]];
-var mailsOfExtern = [["m.bilda@adito.de", "m.bilda@adito.de"]];
-
-neon.openContext("MSTTeamMember", null, null, neon.OPERATINGSTATE_NEW, {
-    "UpnsOfMembers_param" : JSON.stringify(upnsOfMembers),
-    "MailsOfExtern_param" : JSON.stringify(mailsOfExtern),
-    "ROWID_param" : vars.get("$param.ObjectRowId_param")
+neon.openContext("MSTTeamAddMembers", null, null, neon.OPERATINGSTATE_NEW, {
+    "SalesprojectId_param" : vars.get("$field.OBJECT_ROWID")
 });
diff --git a/entity/Member_entity/entityfields/msteamsactiongroup/children/addnewmember/stateProcess.js b/entity/Member_entity/entityfields/msteamsactiongroup/children/addnewmember/stateProcess.js
index f821050c044..caeb254eb7d 100644
--- a/entity/Member_entity/entityfields/msteamsactiongroup/children/addnewmember/stateProcess.js
+++ b/entity/Member_entity/entityfields/msteamsactiongroup/children/addnewmember/stateProcess.js
@@ -15,7 +15,7 @@ var isArchived = newSelect("IS_ARCHIVED")
     
 if (teamId == "" || isArchived == 1) 
 {
-    result.string(neon.COMPONENTSTATE_INVISIBLE);
+    result.string(neon.COMPONENTSTATE_DISABLED);
 }
 else
 {
diff --git a/entity/Member_entity/entityfields/msteamsactiongroup/children/changetomsteam/onActionProcess.js b/entity/Member_entity/entityfields/msteamsactiongroup/children/changetomsteam/onActionProcess.js
index c19bf006698..144584dfb46 100644
--- a/entity/Member_entity/entityfields/msteamsactiongroup/children/changetomsteam/onActionProcess.js
+++ b/entity/Member_entity/entityfields/msteamsactiongroup/children/changetomsteam/onActionProcess.js
@@ -1,3 +1,5 @@
 import("system.neon");
 
-neon.openUrl("https://teams.microsoft.com/l/team/19:0062b1c861df409391eaf0329b99db68%40thread.tacv2/conversations?groupId=c4c6a313-3d12-4941-900e-afc464755188&tenantId=bb59bb5b-90c7-41f9-85aa-f40da5c0c68a", true)
+var url = "https://teams.microsoft.com/l/team/19:0062b1c861df409391eaf0329b99db68%40thread.tacv2/conversations?groupId=c4c6a313-3d12-4941-900e-afc464755188&tenantId=bb59bb5b-90c7-41f9-85aa-f40da5c0c68a";
+
+neon.openUrl(url, true)
diff --git a/entity/Member_entity/entityfields/msteamsactiongroup/children/changetomsteam/stateProcess.js b/entity/Member_entity/entityfields/msteamsactiongroup/children/changetomsteam/stateProcess.js
index f821050c044..caeb254eb7d 100644
--- a/entity/Member_entity/entityfields/msteamsactiongroup/children/changetomsteam/stateProcess.js
+++ b/entity/Member_entity/entityfields/msteamsactiongroup/children/changetomsteam/stateProcess.js
@@ -15,7 +15,7 @@ var isArchived = newSelect("IS_ARCHIVED")
     
 if (teamId == "" || isArchived == 1) 
 {
-    result.string(neon.COMPONENTSTATE_INVISIBLE);
+    result.string(neon.COMPONENTSTATE_DISABLED);
 }
 else
 {
diff --git a/entity/Member_entity/entityfields/msteamsactiongroup/children/chooseteam/onActionProcess.js b/entity/Member_entity/entityfields/msteamsactiongroup/children/chooseteam/onActionProcess.js
index c48327f1fee..0583cd17a0e 100644
--- a/entity/Member_entity/entityfields/msteamsactiongroup/children/chooseteam/onActionProcess.js
+++ b/entity/Member_entity/entityfields/msteamsactiongroup/children/chooseteam/onActionProcess.js
@@ -4,5 +4,5 @@ import("system.teams");
 import("system.logging");
 
 neon.openContext("MSTChooseTeam", null, null, neon.OPERATINGSTATE_NEW, {
-    "RowId_param" : vars.get("$param.ObjectRowId_param")
+    "SalesprojectId_param" : vars.get("$field.OBJECT_ROWID")
 });
\ No newline at end of file
diff --git a/entity/Member_entity/entityfields/msteamsactiongroup/children/chooseteam/stateProcess.js b/entity/Member_entity/entityfields/msteamsactiongroup/children/chooseteam/stateProcess.js
index 29db7d098d9..5b3ec6b0fb2 100644
--- a/entity/Member_entity/entityfields/msteamsactiongroup/children/chooseteam/stateProcess.js
+++ b/entity/Member_entity/entityfields/msteamsactiongroup/children/chooseteam/stateProcess.js
@@ -8,4 +8,4 @@ var teamId = newSelect("MST_TEAMID")
     .where("MST_TEAM.OBJECT_ROWID", "$param.ObjectRowId_param")
     .cell();
     
-result.string(teamId != "" ? neon.COMPONENTSTATE_INVISIBLE : neon.COMPONENTSTATE_EDITABLE);
\ No newline at end of file
+result.string(teamId != "" ? neon.COMPONENTSTATE_DISABLED : neon.COMPONENTSTATE_EDITABLE);
\ No newline at end of file
diff --git a/entity/Member_entity/entityfields/msteamsactiongroup/children/createchannel/onActionProcess.js b/entity/Member_entity/entityfields/msteamsactiongroup/children/createchannel/onActionProcess.js
deleted file mode 100644
index f72ee987fa0..00000000000
--- a/entity/Member_entity/entityfields/msteamsactiongroup/children/createchannel/onActionProcess.js
+++ /dev/null
@@ -1,12 +0,0 @@
-import("system.neon");
-import("system.vars");
-    
-//Dafür muss es Designer Felder geben
-var channelName = "ADITO xRM";
-var channelDesc = "Das ist ein Zweitchannel, um genauer über bestimmte Themen zu diskutieren";
-
-neon.openContext("MSTTeamChannel", null, null, neon.OPERATINGSTATE_NEW,  {
-    "CHANNELNAME_param" : channelName,
-    "CHANNELDESC_param" : channelDesc,
-    "ROWID_param" : vars.get("$param.ObjectRowId_param")
-});
diff --git a/entity/Member_entity/entityfields/msteamsactiongroup/children/createchannel/stateProcess.js b/entity/Member_entity/entityfields/msteamsactiongroup/children/createchannel/stateProcess.js
deleted file mode 100644
index 0c1128cf098..00000000000
--- a/entity/Member_entity/entityfields/msteamsactiongroup/children/createchannel/stateProcess.js
+++ /dev/null
@@ -1,23 +0,0 @@
-import("system.vars");
-import("system.neon");
-import("system.result");
-import("Sql_lib");
-
-var teamId = newSelect("MST_TEAMID")
-    .from("MST_TEAM")
-    .where("MST_TEAM.OBJECT_ROWID", "$param.ObjectRowId_param")
-    .cell();
-    
-var isArchived = newSelect("IS_ARCHIVED")
-    .from("MST_TEAM")
-    .where("MST_TEAM.OBJECT_ROWID", "$param.ObjectRowId_param")
-    .cell();
-    
-if (teamId == "" || isArchived == 1) 
-{
-    result.string(neon.COMPONENTSTATE_INVISIBLE);
-}
-else
-{
-    result.string(neon.COMPONENTSTATE_EDITABLE);
-}
\ No newline at end of file
diff --git a/entity/Member_entity/entityfields/msteamsactiongroup/children/createteam/onActionProcess.js b/entity/Member_entity/entityfields/msteamsactiongroup/children/createteam/onActionProcess.js
index 05de2e36656..8798621d425 100644
--- a/entity/Member_entity/entityfields/msteamsactiongroup/children/createteam/onActionProcess.js
+++ b/entity/Member_entity/entityfields/msteamsactiongroup/children/createteam/onActionProcess.js
@@ -5,28 +5,16 @@ import("Sql_lib");
 
 var rowId = vars.get("$param.ObjectRowId_param");
 
-var teamName = newSelect("PROJECTTITLE")
+var [teamName, description] = newSelect("PROJECTTITLE, INFO")
     .from("SALESPROJECT")
     .where("SALESPROJECT.SALESPROJECTID", rowId)
-    .cell();
-    
-var description = newSelect("INFO")
-    .from("SALESPROJECT")
-    .where("SALESPROJECT.SALESPROJECTID", rowId)
-    .cell();
-    
-var mailNickname = teamName.replace(/ /g, "");
-
-var upnsOfOwners = [["marco@mbsolutions2.onmicrosoft.com", "marco@mbsolutions2.onmicrosoft.com"], ["franz@mbsolutions2.onmicrosoft.com", "franz@mbsolutions2.onmicrosoft.com"], ["martin@mbsolutions2.onmicrosoft.com", "martin@mbsolutions2.onmicrosoft.com"]];
-var upnsOfMembers = [["marco@mbsolutions2.onmicrosoft.com", "marco@mbsolutions2.onmicrosoft.com"], ["franz@mbsolutions2.onmicrosoft.com", "franz@mbsolutions2.onmicrosoft.com"], ["martin@mbsolutions2.onmicrosoft.com", "martin@mbsolutions2.onmicrosoft.com"]];
-var mailsOfExtern = [["m.bilda@adito.de", "m.bilda@adito.de"]];
+    .arrayRow();
+ 
+var mailNickname = teamName.replace(/\s/g, "");
 
 neon.openContext("MSTTeam", null, null, neon.OPERATINGSTATE_NEW, {
-    "RowId_param" : rowId,
+    "SalesprojectId_param" : rowId,
     "TeamName_param" : teamName,
     "Description_param" : description,   
-    "Mailnickname_param" : mailNickname,    
-    "UpnsOfOwners_param" : JSON.stringify(upnsOfOwners),
-    "UpnsOfMembers_param" : JSON.stringify(upnsOfMembers),
-    "MailsOfExtern_param" : JSON.stringify(mailsOfExtern)
+    "Mailnickname_param" : mailNickname
 });
\ No newline at end of file
diff --git a/entity/Member_entity/entityfields/msteamsactiongroup/children/createteam/stateProcess.js b/entity/Member_entity/entityfields/msteamsactiongroup/children/createteam/stateProcess.js
index c01cdd16766..12b3c6edaaa 100644
--- a/entity/Member_entity/entityfields/msteamsactiongroup/children/createteam/stateProcess.js
+++ b/entity/Member_entity/entityfields/msteamsactiongroup/children/createteam/stateProcess.js
@@ -8,4 +8,4 @@ var teamId = newSelect("MST_TEAMID")
     .where("MST_TEAM.OBJECT_ROWID", "$param.ObjectRowId_param")
     .cell();
 
-result.string(teamId != "" ? neon.COMPONENTSTATE_INVISIBLE : neon.COMPONENTSTATE_EDITABLE);
\ No newline at end of file
+result.string(teamId != "" ? neon.COMPONENTSTATE_DISABLED : neon.COMPONENTSTATE_EDITABLE);
\ No newline at end of file
diff --git a/entity/Member_entity/entityfields/msteamsactiongroup/children/deleteteam/onActionProcess.js b/entity/Member_entity/entityfields/msteamsactiongroup/children/deleteteam/onActionProcess.js
index 84ac82f4f89..7e196630c9a 100644
--- a/entity/Member_entity/entityfields/msteamsactiongroup/children/deleteteam/onActionProcess.js
+++ b/entity/Member_entity/entityfields/msteamsactiongroup/children/deleteteam/onActionProcess.js
@@ -12,19 +12,20 @@ var teamId = newSelect("MST_TEAMID")
 //Hat dieses Team mehrere Projekte??
 var teamIds = newSelect("MST_TEAMID")
     .from("MST_TEAM")
-    .where("MST_TEAM.MST_TEAMID", teamId).arrayRow();
+    .where("MST_TEAM.MST_TEAMID", teamId)
+    .arrayColumn();
     
-teams.archiveTeamAndDeleteGroup(teamId);
+teams.archiveTeam(teamId);
 
-for(var i = 0; i<teamIds.length; i++)
-    {
-        var finalDeleteDate = datetime.date() + (datetime.ONE_DAY * 30);
-    
-        newWhere("MST_TEAM.MST_TEAMID", teamIds[i])
-           .updateFields({
-                          "IS_ARCHIVED" : "1",
-                          "FINAL_DELETE_DATE" : finalDeleteDate
-                          });
-    }
+for (var i = 0; i<teamIds.length; i++)
+{
+    var finalDeleteDate = datetime.date() + (datetime.ONE_DAY * 30);
+
+    newWhere("MST_TEAM.MST_TEAMID", teamIds[i])
+       .updateFields({
+                      "IS_ARCHIVED" : "1",
+                      "FINAL_DELETE_DATE" : finalDeleteDate
+                      });
+}
 
 
diff --git a/entity/Member_entity/entityfields/msteamsactiongroup/children/deleteteam/stateProcess.js b/entity/Member_entity/entityfields/msteamsactiongroup/children/deleteteam/stateProcess.js
index b17a7492239..da3e32752f3 100644
--- a/entity/Member_entity/entityfields/msteamsactiongroup/children/deleteteam/stateProcess.js
+++ b/entity/Member_entity/entityfields/msteamsactiongroup/children/deleteteam/stateProcess.js
@@ -15,7 +15,7 @@ var isArchived = newSelect("IS_ARCHIVED")
     
 if (teamId == "" || isArchived == 1) 
 {
-    result.string(neon.COMPONENTSTATE_INVISIBLE);
+    result.string(neon.COMPONENTSTATE_DISABLED);
 }
 else
 {
diff --git a/entity/Member_entity/entityfields/msteamsactiongroup/children/restoreteam/stateProcess.js b/entity/Member_entity/entityfields/msteamsactiongroup/children/restoreteam/stateProcess.js
index 05f5e33fb61..a677c8bdded 100644
--- a/entity/Member_entity/entityfields/msteamsactiongroup/children/restoreteam/stateProcess.js
+++ b/entity/Member_entity/entityfields/msteamsactiongroup/children/restoreteam/stateProcess.js
@@ -15,7 +15,7 @@ var isArchived = newSelect("IS_ARCHIVED")
     
 if (teamId == "" || isArchived == 0) 
 {
-    result.string(neon.COMPONENTSTATE_INVISIBLE);
+    result.string(neon.COMPONENTSTATE_DISABLED);
 }
 else
 {
diff --git a/entity/Salesproject_entity/Salesproject_entity.aod b/entity/Salesproject_entity/Salesproject_entity.aod
index ff47a2cfb20..962583325a4 100644
--- a/entity/Salesproject_entity/Salesproject_entity.aod
+++ b/entity/Salesproject_entity/Salesproject_entity.aod
@@ -749,64 +749,12 @@
       <iconId>VAADIN:PLAY</iconId>
       <stateProcess>%aditoprj%/entity/Salesproject_entity/entityfields/startworkflow/stateProcess.js</stateProcess>
     </entityActionField>
-    <entityActionField>
-      <name>createTeam</name>
-      <title>Team erstellen</title>
-      <onActionProcess>%aditoprj%/entity/Salesproject_entity/entityfields/createteam/onActionProcess.js</onActionProcess>
-      <iconId>NEON:PLUS</iconId>
-      <stateProcess>%aditoprj%/entity/Salesproject_entity/entityfields/createteam/stateProcess.js</stateProcess>
-      <tooltip>Erstelle ein neues MicrosoftTeams Team</tooltip>
-    </entityActionField>
-    <entityActionField>
-      <name>deleteTeam</name>
-      <title>Team löschen</title>
-      <onActionProcess>%aditoprj%/entity/Salesproject_entity/entityfields/deleteteam/onActionProcess.js</onActionProcess>
-      <iconId>NEON:TRASH</iconId>
-      <stateProcess>%aditoprj%/entity/Salesproject_entity/entityfields/deleteteam/stateProcess.js</stateProcess>
-      <tooltip>Lösche das verknüpfte MSTeams Team</tooltip>
-    </entityActionField>
-    <entityActionField>
-      <name>createChannel</name>
-      <title>Channel erstellen</title>
-      <onActionProcess>%aditoprj%/entity/Salesproject_entity/entityfields/createchannel/onActionProcess.js</onActionProcess>
-      <iconId>VAADIN:PLUS</iconId>
-      <stateProcess>%aditoprj%/entity/Salesproject_entity/entityfields/createchannel/stateProcess.js</stateProcess>
-      <tooltip>Erstelle einen neuen Channel</tooltip>
-    </entityActionField>
-    <entityActionField>
-      <name>addMember</name>
-      <title>Member hinzufügen</title>
-      <onActionProcess>%aditoprj%/entity/Salesproject_entity/entityfields/addmember/onActionProcess.js</onActionProcess>
-      <iconId>NEON:GROUP_APPOINTMENT</iconId>
-      <stateProcess>%aditoprj%/entity/Salesproject_entity/entityfields/addmember/stateProcess.js</stateProcess>
-      <tooltip>Füge neue Member hinzu</tooltip>
-    </entityActionField>
-    <entityActionField>
-      <name>addApp</name>
-      <title>App hinzufügen</title>
-      <onActionProcess>%aditoprj%/entity/Salesproject_entity/entityfields/addapp/onActionProcess.js</onActionProcess>
-      <iconId>NEON:PUZZLE</iconId>
-      <stateProcess>%aditoprj%/entity/Salesproject_entity/entityfields/addapp/stateProcess.js</stateProcess>
-      <tooltip>Fügt eine App zu einem Team hinzu</tooltip>
-    </entityActionField>
-    <entityActionField>
-      <name>restoreTeam</name>
-      <title>Team wiederherstellen</title>
-      <onActionProcess>%aditoprj%/entity/Salesproject_entity/entityfields/restoreteam/onActionProcess.js</onActionProcess>
-      <iconId>VAADIN:ARROW_BACKWARD</iconId>
-      <stateProcess>%aditoprj%/entity/Salesproject_entity/entityfields/restoreteam/stateProcess.js</stateProcess>
-      <tooltip>Stellt das Team wieder her</tooltip>
-    </entityActionField>
     <entityField>
-      <name>ALLTEAMS</name>
-      <title>allTeams</title>
-      <selectionMode>MULTI</selectionMode>
+      <name>MST_TEAM_ID</name>
+      <title>Teams group</title>
+      <linkedContext>MSTTeam</linkedContext>
+      <state>READONLY</state>
     </entityField>
-    <entityActionField>
-      <name>chooseTeam</name>
-      <title>chooseTeam</title>
-      <tooltip>Wähle ein bereits vorhandenes Team aus</tooltip>
-    </entityActionField>
   </entityFields>
   <recordContainers>
     <dbRecordContainer>
@@ -934,6 +882,14 @@
           <isFilterable v="true" />
           <isLookupFilter v="true" />
         </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>MST_TEAM_ID.value</name>
+          <recordfield>SALESPROJECT.MST_TEAM_ID</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>MST_TEAM_ID.displayValue</name>
+          <expression>%aditoprj%/entity/Salesproject_entity/recordcontainers/db/recordfieldmappings/mst_team_id.displayvalue/expression.js</expression>
+        </dbRecordFieldMapping>
       </recordFieldMappings>
       <filterExtensions>
         <filterExtensionSet>
diff --git a/entity/Salesproject_entity/entityfields/addapp/onActionProcess.js b/entity/Salesproject_entity/entityfields/addapp/onActionProcess.js
deleted file mode 100644
index aa485d9bd79..00000000000
--- a/entity/Salesproject_entity/entityfields/addapp/onActionProcess.js
+++ /dev/null
@@ -1,12 +0,0 @@
-import("system.teams");
-import("Sql_lib");
-
-
-var teamId = newSelect("MST_TEAMID")
-    .from("MST_TEAM")
-    .where("MST_TEAM.OBJECT_ROWID", "$field.OBJECT_ROWID")
-    .cell();
-    
-var appId = "768e1918-bc98-4646-8517-f77225feaa78"
-    
-teams.addAppToTeam(teamId, appId)
\ No newline at end of file
diff --git a/entity/Salesproject_entity/entityfields/addapp/stateProcess.js b/entity/Salesproject_entity/entityfields/addapp/stateProcess.js
deleted file mode 100644
index 08b41286f0a..00000000000
--- a/entity/Salesproject_entity/entityfields/addapp/stateProcess.js
+++ /dev/null
@@ -1,10 +0,0 @@
-//import("system.vars");
-//import("system.neon");
-//import("system.result");
-//import("Sql_lib");
-//
-//var teamId = newSelect("MST_TEAMID")
-//    .from("MST_TEAM")
-//    .where("MST_TEAM.OBJECT_ROWID", "$field.OBJECT_ROWID")
-//    .cell();
-//result.string(teamId == "" ? neon.COMPONENTSTATE_DISABLED : neon.COMPONENTSTATE_EDITABLE);
\ No newline at end of file
diff --git a/entity/Salesproject_entity/entityfields/addmember/onActionProcess.js b/entity/Salesproject_entity/entityfields/addmember/onActionProcess.js
deleted file mode 100644
index 8ee059c24b8..00000000000
--- a/entity/Salesproject_entity/entityfields/addmember/onActionProcess.js
+++ /dev/null
@@ -1,11 +0,0 @@
-import("system.teams");
-import("Sql_lib")
-
-var teamId = newSelect("MST_TEAMID")
-    .from("MST_TEAM")
-    .where("MST_TEAM.OBJECT_ROWID", "$field.OBJECT_ROWID")
-    .cell();
-
-var mailsOfMembers = ["m.bilda@adito.de", "sebastian@mbsolutions2.onmicrosoft.com"];
-
-teams.addNewMembers(teamId, mailsOfMembers)
\ No newline at end of file
diff --git a/entity/Salesproject_entity/entityfields/addmember/stateProcess.js b/entity/Salesproject_entity/entityfields/addmember/stateProcess.js
deleted file mode 100644
index 08b41286f0a..00000000000
--- a/entity/Salesproject_entity/entityfields/addmember/stateProcess.js
+++ /dev/null
@@ -1,10 +0,0 @@
-//import("system.vars");
-//import("system.neon");
-//import("system.result");
-//import("Sql_lib");
-//
-//var teamId = newSelect("MST_TEAMID")
-//    .from("MST_TEAM")
-//    .where("MST_TEAM.OBJECT_ROWID", "$field.OBJECT_ROWID")
-//    .cell();
-//result.string(teamId == "" ? neon.COMPONENTSTATE_DISABLED : neon.COMPONENTSTATE_EDITABLE);
\ No newline at end of file
diff --git a/entity/Salesproject_entity/entityfields/createchannel/onActionProcess.js b/entity/Salesproject_entity/entityfields/createchannel/onActionProcess.js
deleted file mode 100644
index 4cf0d82b0fa..00000000000
--- a/entity/Salesproject_entity/entityfields/createchannel/onActionProcess.js
+++ /dev/null
@@ -1,10 +0,0 @@
-import("system.teams");
-import("Sql_lib");
-
-
-var teamId = newSelect("MST_TEAMID")
-    .from("MST_TEAM")
-    .where("MST_TEAM.OBJECT_ROWID", "$field.OBJECT_ROWID")
-    .cell();
-
-teams.createNewChannel(teamId, "ADITO-xRM", "Ein Zweitchannel, um genauer über xRM zu diskutieren")
\ No newline at end of file
diff --git a/entity/Salesproject_entity/entityfields/createchannel/stateProcess.js b/entity/Salesproject_entity/entityfields/createchannel/stateProcess.js
deleted file mode 100644
index 08b41286f0a..00000000000
--- a/entity/Salesproject_entity/entityfields/createchannel/stateProcess.js
+++ /dev/null
@@ -1,10 +0,0 @@
-//import("system.vars");
-//import("system.neon");
-//import("system.result");
-//import("Sql_lib");
-//
-//var teamId = newSelect("MST_TEAMID")
-//    .from("MST_TEAM")
-//    .where("MST_TEAM.OBJECT_ROWID", "$field.OBJECT_ROWID")
-//    .cell();
-//result.string(teamId == "" ? neon.COMPONENTSTATE_DISABLED : neon.COMPONENTSTATE_EDITABLE);
\ No newline at end of file
diff --git a/entity/Salesproject_entity/entityfields/createteam/onActionProcess.js b/entity/Salesproject_entity/entityfields/createteam/onActionProcess.js
deleted file mode 100644
index caf03e2eda1..00000000000
--- a/entity/Salesproject_entity/entityfields/createteam/onActionProcess.js
+++ /dev/null
@@ -1,20 +0,0 @@
-import("system.vars");
-import("system.neon");
-import("system.teams");
-import("system.logging");
-
-var rowId = vars.get("$field.OBJECT_ROWID");
-logging.log(rowId)
-var teamName = "Buchner Neuprojekt";
-var description = "Das Buchner Neuprojekt ist das erste Projekt, dass mit der Anbindung an MSTeams arbeitet um diese zu perfektionieren";
-var mailNickname = "buchnerNeuprojekt";
-var mailsOfOwners = [["marco@mbsolutions2.onmicrosoft.com", "marco@mbsolutions2.onmicrosoft.com"]];
-var mailsOfMembers = [["franz@mbsolutions2.onmicrosoft.com", "franz@mbsolutions2.onmicrosoft.com"], ["martin@mbsolutions2.onmicrosoft.com", "martin@mbsolutions2.onmicrosoft.com"]];
-
-neon.openContext("MSTTeam", null, null, neon.OPERATINGSTATE_NEW, {
-    "TeamName_param" : teamName,
-    "Description_param" : description,
-    "MailsOfOwners_param" : JSON.stringify(mailsOfOwners),
-    "MailsOfMembers_param" : JSON.stringify(mailsOfMembers),
-    "RowId_param" : rowId
-});
\ No newline at end of file
diff --git a/entity/Salesproject_entity/entityfields/createteam/stateProcess.js b/entity/Salesproject_entity/entityfields/createteam/stateProcess.js
deleted file mode 100644
index 769332ea05d..00000000000
--- a/entity/Salesproject_entity/entityfields/createteam/stateProcess.js
+++ /dev/null
@@ -1,11 +0,0 @@
-//import("system.vars");
-//import("system.neon");
-//import("system.result");
-//import("Sql_lib");
-//
-//var teamId = newSelect("MST_TEAMID")
-//    .from("MST_TEAM")
-//    .where("MST_TEAM.OBJECT_ROWID", "$field.OBJECT_ROWID")
-//    .cell();
-//    
-//result.string(teamId != "" ? neon.COMPONENTSTATE_DISABLED : neon.COMPONENTSTATE_EDITABLE);
\ No newline at end of file
diff --git a/entity/Salesproject_entity/entityfields/deleteteam/onActionProcess.js b/entity/Salesproject_entity/entityfields/deleteteam/onActionProcess.js
deleted file mode 100644
index 811af52a53f..00000000000
--- a/entity/Salesproject_entity/entityfields/deleteteam/onActionProcess.js
+++ /dev/null
@@ -1,10 +0,0 @@
-import("system.teams");
-import("Sql_lib");
-
-
-var teamId = newSelect("MST_TEAMID")
-    .from("MST_TEAM")
-    .where("MST_TEAM.OBJECT_ROWID", "$field.OBJECT_ROWID")
-    .cell();
-
-teams.archiveTeamAndDeleteGroup(teamId);
\ No newline at end of file
diff --git a/entity/Salesproject_entity/entityfields/deleteteam/stateProcess.js b/entity/Salesproject_entity/entityfields/deleteteam/stateProcess.js
deleted file mode 100644
index 1ffcd6ff42b..00000000000
--- a/entity/Salesproject_entity/entityfields/deleteteam/stateProcess.js
+++ /dev/null
@@ -1,11 +0,0 @@
-//import("system.vars");
-//import("system.neon");
-//import("system.result");
-//import("Sql_lib");
-//
-//var teamId = newSelect("MST_TEAMID")
-//    .from("MST_TEAM")
-//    .where("MST_TEAM.OBJECT_ROWID", "$field.OBJECT_ROWID")
-//    .cell();
-//    
-//result.string(teamId == "" ? neon.COMPONENTSTATE_DISABLED : neon.COMPONENTSTATE_EDITABLE);
\ No newline at end of file
diff --git a/entity/Salesproject_entity/entityfields/restoreteam/onActionProcess.js b/entity/Salesproject_entity/entityfields/restoreteam/onActionProcess.js
deleted file mode 100644
index 06870ce60f2..00000000000
--- a/entity/Salesproject_entity/entityfields/restoreteam/onActionProcess.js
+++ /dev/null
@@ -1,10 +0,0 @@
-import("system.teams");
-import("Sql_lib");
-
-
-var teamId = newSelect("MST_TEAMID")
-    .from("MST_TEAM")
-    .where("MST_TEAM.OBJECT_ROWID", "$field.OBJECT_ROWID")
-    .cell();
-
-teams.unarchiveTeamAndRestoreGroup(teamId);
\ No newline at end of file
diff --git a/entity/Salesproject_entity/entityfields/restoreteam/stateProcess.js b/entity/Salesproject_entity/entityfields/restoreteam/stateProcess.js
deleted file mode 100644
index 08b41286f0a..00000000000
--- a/entity/Salesproject_entity/entityfields/restoreteam/stateProcess.js
+++ /dev/null
@@ -1,10 +0,0 @@
-//import("system.vars");
-//import("system.neon");
-//import("system.result");
-//import("Sql_lib");
-//
-//var teamId = newSelect("MST_TEAMID")
-//    .from("MST_TEAM")
-//    .where("MST_TEAM.OBJECT_ROWID", "$field.OBJECT_ROWID")
-//    .cell();
-//result.string(teamId == "" ? neon.COMPONENTSTATE_DISABLED : neon.COMPONENTSTATE_EDITABLE);
\ No newline at end of file
diff --git a/entity/Salesproject_entity/recordcontainers/db/recordfieldmappings/mst_team_id.displayvalue/expression.js b/entity/Salesproject_entity/recordcontainers/db/recordfieldmappings/mst_team_id.displayvalue/expression.js
new file mode 100644
index 00000000000..adc9b83fdd0
--- /dev/null
+++ b/entity/Salesproject_entity/recordcontainers/db/recordfieldmappings/mst_team_id.displayvalue/expression.js
@@ -0,0 +1,3 @@
+import("system.result");
+
+result.string("select TEAMNAME from MST_TEAM where MST_TEAM.MST_TEAMID = SALESPROJECT.MST_TEAM_ID");
\ No newline at end of file
diff --git a/entity/SerialLetterAddRecipients_entity/SerialLetterAddRecipients_entity.aod b/entity/SerialLetterAddRecipients_entity/SerialLetterAddRecipients_entity.aod
index cfcb2ee7353..b4a130f61cf 100644
--- a/entity/SerialLetterAddRecipients_entity/SerialLetterAddRecipients_entity.aod
+++ b/entity/SerialLetterAddRecipients_entity/SerialLetterAddRecipients_entity.aod
@@ -56,9 +56,29 @@
     </entityField>
   </entityFields>
   <recordContainers>
-    <datalessRecordContainer>
-      <name>datalessRecordContainer</name>
-      <alias>Data_alias</alias>
-    </datalessRecordContainer>
+    <jDitoRecordContainer>
+      <name>jdito</name>
+      <jDitoRecordAlias>Data_alias</jDitoRecordAlias>
+      <isPageable v="true" />
+      <contentProcess>%aditoprj%/entity/MSTChooseTeam_entity/recordcontainers/jdito/contentProcess.js</contentProcess>
+      <onInsert>%aditoprj%/entity/MSTChooseTeam_entity/recordcontainers/jdito/onInsert.js</onInsert>
+      <recordFieldMappings>
+        <jDitoRecordFieldMapping>
+          <name>ALLTEAMS.value</name>
+        </jDitoRecordFieldMapping>
+        <jDitoRecordFieldMapping>
+          <name>ALLTEAMS.displayValue</name>
+        </jDitoRecordFieldMapping>
+        <jDitoRecordFieldMapping>
+          <name>UID.value</name>
+        </jDitoRecordFieldMapping>
+        <jDitoRecordFieldMapping>
+          <name>ALLARCHIVEDTEAMS.displayValue</name>
+        </jDitoRecordFieldMapping>
+        <jDitoRecordFieldMapping>
+          <name>ALLARCHIVEDTEAMS.value</name>
+        </jDitoRecordFieldMapping>
+      </recordFieldMappings>
+    </jDitoRecordContainer>
   </recordContainers>
 </entity>
diff --git a/neonContext/MSTTeam/MSTTeam.aod b/neonContext/MSTTeam/MSTTeam.aod
index 532d9326d4d..dfbc6c73f30 100644
--- a/neonContext/MSTTeam/MSTTeam.aod
+++ b/neonContext/MSTTeam/MSTTeam.aod
@@ -3,11 +3,16 @@
   <name>MSTTeam</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <editView>MSTTeamEdit_view</editView>
+  <previewView>MSTTeamPreview_view</previewView>
   <entity>MSTTeam_entity</entity>
   <references>
     <neonViewReference>
       <name>357c290b-bf6a-4628-a6d9-f81a97ea843e</name>
       <view>MSTTeamEdit_view</view>
     </neonViewReference>
+    <neonViewReference>
+      <name>c13c234d-ee98-4a26-b7b1-8ee3a3829284</name>
+      <view>MSTTeamPreview_view</view>
+    </neonViewReference>
   </references>
 </neonContext>
diff --git a/neonContext/MSTTeamAddMembers/MSTTeamAddMembers.aod b/neonContext/MSTTeamAddMembers/MSTTeamAddMembers.aod
new file mode 100644
index 00000000000..f065c15a8f9
--- /dev/null
+++ b/neonContext/MSTTeamAddMembers/MSTTeamAddMembers.aod
@@ -0,0 +1,14 @@
+<?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>MSTTeamAddMembers</name>
+  <title>Add members</title>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <editView>MSTTeamAddMembersEdit_view</editView>
+  <entity>MSTTeamAddMembers_entity</entity>
+  <references>
+    <neonViewReference>
+      <name>9974f15a-7f2a-41fb-afbe-9e946c857f60</name>
+      <view>MSTTeamAddMembersEdit_view</view>
+    </neonViewReference>
+  </references>
+</neonContext>
diff --git a/neonContext/MSTTeamMember/MSTTeamMember.aod b/neonContext/MSTTeamMember/MSTTeamMember.aod
index a482314b45d..776c9d9bfab 100644
--- a/neonContext/MSTTeamMember/MSTTeamMember.aod
+++ b/neonContext/MSTTeamMember/MSTTeamMember.aod
@@ -9,5 +9,9 @@
       <name>5e760ac4-fea0-4283-a0bf-d6d5f0f1c003</name>
       <view>MSTTeamMemberEdit_view</view>
     </neonViewReference>
+    <neonViewReference>
+      <name>61588d12-3c0d-4181-93ae-90d7ad50ed6b</name>
+      <view>MSTTeamMemberMultiEdit_view</view>
+    </neonViewReference>
   </references>
 </neonContext>
diff --git a/neonContext/Member/Member.aod b/neonContext/Member/Member.aod
index f1747c11e2e..664965d770c 100644
--- a/neonContext/Member/Member.aod
+++ b/neonContext/Member/Member.aod
@@ -4,6 +4,7 @@
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <filterView>MemberFilter_view</filterView>
   <editView>MemberEdit_view</editView>
+  <lookupView>MemberLookup_view</lookupView>
   <entity>Member_entity</entity>
   <references>
     <neonViewReference>
@@ -18,5 +19,9 @@
       <name>61eb4778-61aa-4419-8c8b-5ad69d86a4bb</name>
       <view>MemberDrawer_view</view>
     </neonViewReference>
+    <neonViewReference>
+      <name>9a36b4d9-5861-442b-84f3-8662e8069740</name>
+      <view>MemberLookup_view</view>
+    </neonViewReference>
   </references>
 </neonContext>
diff --git a/neonContext/Salesproject/Salesproject.aod b/neonContext/Salesproject/Salesproject.aod
index 8f8820b5fc4..70d024650c8 100644
--- a/neonContext/Salesproject/Salesproject.aod
+++ b/neonContext/Salesproject/Salesproject.aod
@@ -87,9 +87,5 @@
       <name>50993084-896d-4d90-9f5e-cd84d3a4dce5</name>
       <view>SalesprojectMultiEdit_view</view>
     </neonViewReference>
-    <neonViewReference>
-      <name>a3ed00af-e0cc-4c1b-9c49-5d411e129a93</name>
-      <view>SalesprojectMSTeams_view</view>
-    </neonViewReference>
   </references>
 </neonContext>
diff --git a/neonView/MSTChooseTeamEdit_view/MSTChooseTeamEdit_view.aod b/neonView/MSTChooseTeamEdit_view/MSTChooseTeamEdit_view.aod
index f7d1e012d76..bae0a1ab12f 100644
--- a/neonView/MSTChooseTeamEdit_view/MSTChooseTeamEdit_view.aod
+++ b/neonView/MSTChooseTeamEdit_view/MSTChooseTeamEdit_view.aod
@@ -10,38 +10,14 @@
   </layout>
   <children>
     <genericViewTemplate>
-      <name>SearchValue</name>
-      <editMode v="true" />
-      <entityField>#ENTITY</entityField>
-      <title>Suchbegriff</title>
-      <fields>
-        <entityFieldLink>
-          <name>8adb648c-4485-4803-a922-67bee5922ec0</name>
-          <entityField>SEARCHVALUE</entityField>
-        </entityFieldLink>
-      </fields>
-    </genericViewTemplate>
-    <genericViewTemplate>
-      <name>allTeams</name>
+      <name>Team</name>
       <editMode v="true" />
       <entityField>#ENTITY</entityField>
       <title>Alle Teams</title>
       <fields>
         <entityFieldLink>
-          <name>6a7121eb-ed35-4a4e-a26b-899233ea0b15</name>
-          <entityField>ALLTEAMS</entityField>
-        </entityFieldLink>
-      </fields>
-    </genericViewTemplate>
-    <genericViewTemplate>
-      <name>allArchivedTeams</name>
-      <editMode v="true" />
-      <entityField>#ENTITY</entityField>
-      <title>Alle archivierten Teams</title>
-      <fields>
-        <entityFieldLink>
-          <name>e17470f5-f8a7-42ce-ab2c-048015784740</name>
-          <entityField>ALLARCHIVEDTEAMS</entityField>
+          <name>ec6b987e-4f7a-405b-8248-56625c92d3a5</name>
+          <entityField>MST_TEAM</entityField>
         </entityFieldLink>
       </fields>
     </genericViewTemplate>
diff --git a/neonView/MSTTeamAddMembersEdit_view/MSTTeamAddMembersEdit_view.aod b/neonView/MSTTeamAddMembersEdit_view/MSTTeamAddMembersEdit_view.aod
new file mode 100644
index 00000000000..90b0562af47
--- /dev/null
+++ b/neonView/MSTTeamAddMembersEdit_view/MSTTeamAddMembersEdit_view.aod
@@ -0,0 +1,18 @@
+<?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>MSTTeamAddMembersEdit_view</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <size>SMALL</size>
+  <layout>
+    <boxLayout>
+      <name>layout</name>
+    </boxLayout>
+  </layout>
+  <children>
+    <neonViewReference>
+      <name>8de10b28-e1aa-46d9-9ac3-73cff46619fb</name>
+      <entityField>Members</entityField>
+      <view>MSTTeamMemberMultiEdit_view</view>
+    </neonViewReference>
+  </children>
+</neonView>
diff --git a/neonView/MSTTeamEdit_view/MSTTeamEdit_view.aod b/neonView/MSTTeamEdit_view/MSTTeamEdit_view.aod
index fa7fb240fe7..7c20b7f45bf 100644
--- a/neonView/MSTTeamEdit_view/MSTTeamEdit_view.aod
+++ b/neonView/MSTTeamEdit_view/MSTTeamEdit_view.aod
@@ -10,7 +10,7 @@
   </layout>
   <children>
     <genericViewTemplate>
-      <name>Generic</name>
+      <name>Teamname</name>
       <editMode v="true" />
       <entityField>#ENTITY</entityField>
       <fields>
@@ -18,49 +18,23 @@
           <name>b69c563c-6230-4bb5-b543-236e0fdc791c</name>
           <entityField>TEAMNAME</entityField>
         </entityFieldLink>
+      </fields>
+    </genericViewTemplate>
+    <neonViewReference>
+      <name>702fea38-849e-43c3-82e5-06e7c1251c7f</name>
+      <entityField>TeamMembers</entityField>
+      <view>MSTTeamMemberMultiEdit_view</view>
+    </neonViewReference>
+    <genericViewTemplate>
+      <name>Description</name>
+      <editMode v="true" />
+      <entityField>#ENTITY</entityField>
+      <fields>
         <entityFieldLink>
-          <name>31897309-cbb5-421b-a96b-bada6c95b72f</name>
+          <name>0490e1b0-59e9-410d-9da7-c1f50abaa15f</name>
           <entityField>DESCRIPTION</entityField>
         </entityFieldLink>
-        <entityFieldLink>
-          <name>a35da883-d23e-4afc-a0a5-ce7e90ec3b2d</name>
-          <entityField>UPNSOFOWNERS</entityField>
-        </entityFieldLink>
-        <entityFieldLink>
-          <name>001a17e9-1bb9-418d-a3ad-284fa95463ad</name>
-          <entityField>UPNSOFMEMBERS</entityField>
-        </entityFieldLink>
-        <entityFieldLink>
-          <name>8cf04e8d-6424-4de4-bfc1-d524de11ecb2</name>
-          <entityField>MAILSOFEXTERN</entityField>
-        </entityFieldLink>
-        <entityFieldLink>
-          <name>19803dfd-60fa-4981-ac86-9565e0ff6eea</name>
-          <entityField>EXTERN</entityField>
-        </entityFieldLink>
-        <entityFieldLink>
-          <name>356e3124-065f-4872-a23e-31c069a4ce8c</name>
-          <entityField>UPNSOFOWNERSORIGINAL</entityField>
-        </entityFieldLink>
       </fields>
     </genericViewTemplate>
-    <titledListViewTemplate>
-      <name>asdf</name>
-      <entityField>#ENTITY</entityField>
-      <columns>
-        <neonTitledListTableColumn>
-          <name>e6ac0add-846d-47e9-be74-478848406bb9</name>
-          <entityField>MAILSOFEXTERN</entityField>
-        </neonTitledListTableColumn>
-        <neonTitledListTableColumn>
-          <name>a9b05950-bed2-4a5d-a608-ae58bc0b23ac</name>
-          <entityField>UPNSOFMEMBERS</entityField>
-        </neonTitledListTableColumn>
-        <neonTitledListTableColumn>
-          <name>e3081201-52ee-4d09-9039-8228769d189c</name>
-          <entityField>DESCRIPTION</entityField>
-        </neonTitledListTableColumn>
-      </columns>
-    </titledListViewTemplate>
   </children>
 </neonView>
diff --git a/neonView/MSTTeamMemberMultiEdit_view/MSTTeamMemberMultiEdit_view.aod b/neonView/MSTTeamMemberMultiEdit_view/MSTTeamMemberMultiEdit_view.aod
new file mode 100644
index 00000000000..a47c1df5f30
--- /dev/null
+++ b/neonView/MSTTeamMemberMultiEdit_view/MSTTeamMemberMultiEdit_view.aod
@@ -0,0 +1,26 @@
+<?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>MSTTeamMemberMultiEdit_view</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <layout>
+    <boxLayout>
+      <name>layout</name>
+    </boxLayout>
+  </layout>
+  <children>
+    <genericMultipleViewTemplate>
+      <name>GenericMultiple</name>
+      <entityField>#ENTITY</entityField>
+      <columns>
+        <neonGenericMultipleTableColumn>
+          <name>a01d6a4e-1ac4-426c-a891-890bd3e9a4d0</name>
+          <entityField>MEMBER</entityField>
+        </neonGenericMultipleTableColumn>
+        <neonGenericMultipleTableColumn>
+          <name>dade9a5b-2398-4303-8cae-6c7d0077e43d</name>
+          <entityField>ROLE_OR_INVITE</entityField>
+        </neonGenericMultipleTableColumn>
+      </columns>
+    </genericMultipleViewTemplate>
+  </children>
+</neonView>
diff --git a/neonView/MSTTeamPreview_view/MSTTeamPreview_view.aod b/neonView/MSTTeamPreview_view/MSTTeamPreview_view.aod
new file mode 100644
index 00000000000..e6877ceb903
--- /dev/null
+++ b/neonView/MSTTeamPreview_view/MSTTeamPreview_view.aod
@@ -0,0 +1,20 @@
+<?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>MSTTeamPreview_view</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <layout>
+    <headerFooterLayout>
+      <name>layout</name>
+      <header>Card</header>
+    </headerFooterLayout>
+  </layout>
+  <children>
+    <cardViewTemplate>
+      <name>Card</name>
+      <titleField>TEAMNAME</titleField>
+      <descriptionField>DESCRIPTION</descriptionField>
+      <entityField>#ENTITY</entityField>
+      <isEditable v="false" />
+    </cardViewTemplate>
+  </children>
+</neonView>
diff --git a/neonView/MemberFilter_view/MemberFilter_view.aod b/neonView/MemberFilter_view/MemberFilter_view.aod
index 2018c671b14..d9e51a55383 100644
--- a/neonView/MemberFilter_view/MemberFilter_view.aod
+++ b/neonView/MemberFilter_view/MemberFilter_view.aod
@@ -11,7 +11,8 @@
   <children>
     <tableViewTemplate>
       <name>Members</name>
-      <favoriteActionGroup1>MSTeamsActionGroup</favoriteActionGroup1>
+      <favoriteActionGroup1></favoriteActionGroup1>
+      <favoriteActionGroup2>MSTeamsActionGroup</favoriteActionGroup2>
       <iconField>IMAGE</iconField>
       <titleField>PERSON_FULL_NAME</titleField>
       <subtitleField>CONTACTROLE</subtitleField>
diff --git a/neonView/MemberLookup_view/MemberLookup_view.aod b/neonView/MemberLookup_view/MemberLookup_view.aod
new file mode 100644
index 00000000000..f3b89eca1f3
--- /dev/null
+++ b/neonView/MemberLookup_view/MemberLookup_view.aod
@@ -0,0 +1,30 @@
+<?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>MemberLookup_view</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <layout>
+    <boxLayout>
+      <name>layout</name>
+    </boxLayout>
+  </layout>
+  <children>
+    <tableViewTemplate>
+      <name>Table</name>
+      <entityField>#ENTITY</entityField>
+      <columns>
+        <neonTableColumn>
+          <name>e3a82f5d-2eee-43bc-8140-e995b23481df</name>
+          <entityField>IMAGE</entityField>
+        </neonTableColumn>
+        <neonTableColumn>
+          <name>1ecfa8b4-05a7-43c8-ac1d-ba4afe8acde0</name>
+          <entityField>PERSON_FULL_NAME</entityField>
+        </neonTableColumn>
+        <neonTableColumn>
+          <name>5819e0e0-cd6d-4259-b64d-b0ce016f7892</name>
+          <entityField>ORGANISATION_NAME</entityField>
+        </neonTableColumn>
+      </columns>
+    </tableViewTemplate>
+  </children>
+</neonView>
diff --git a/neonView/SalesprojectMSTeams_view/SalesprojectMSTeams_view.aod b/neonView/SalesprojectMSTeams_view/SalesprojectMSTeams_view.aod
deleted file mode 100644
index e24067db06a..00000000000
--- a/neonView/SalesprojectMSTeams_view/SalesprojectMSTeams_view.aod
+++ /dev/null
@@ -1,36 +0,0 @@
-<?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>SalesprojectMSTeams_view</name>
-  <title>MSTeams</title>
-  <majorModelMode>DISTRIBUTED</majorModelMode>
-  <layout>
-    <drawerLayout>
-      <name>layout</name>
-      <fixedDrawer v="false" />
-    </drawerLayout>
-  </layout>
-  <children>
-    <dynamicFormViewTemplate>
-      <name>actuallTeam</name>
-      <editMode v="true" />
-      <entityField>#ENTITY</entityField>
-    </dynamicFormViewTemplate>
-    <actionsViewTemplate>
-      <name>MSTeamsActions</name>
-      <actions>
-        <element>createTeam</element>
-        <element>deleteTeam</element>
-        <element>createChannel</element>
-        <element>addMember</element>
-        <element>addApp</element>
-        <element>restoreTeam</element>
-      </actions>
-      <entityField>#ENTITY</entityField>
-      <title>MSTeamsActions</title>
-    </actionsViewTemplate>
-    <tableViewTemplate>
-      <name>TeamsTable</name>
-      <entityField>#ENTITY</entityField>
-    </tableViewTemplate>
-  </children>
-</neonView>
diff --git a/neonView/SalesprojectMain_view/SalesprojectMain_view.aod b/neonView/SalesprojectMain_view/SalesprojectMain_view.aod
index f122e6f32e2..57d0c606e3e 100644
--- a/neonView/SalesprojectMain_view/SalesprojectMain_view.aod
+++ b/neonView/SalesprojectMain_view/SalesprojectMain_view.aod
@@ -29,11 +29,6 @@
       <entityField>#ENTITY</entityField>
       <view>SalesprojectMemberActivity_view</view>
     </neonViewReference>
-    <neonViewReference>
-      <name>b04b60a7-4296-4dd7-ae94-3c68b4def6a4</name>
-      <entityField>#ENTITY</entityField>
-      <view>SalesprojectMSTeams_view</view>
-    </neonViewReference>
     <neonViewReference>
       <name>67659a20-068f-4522-ad33-2c35e29f929a</name>
       <entityField>#ENTITY</entityField>
diff --git a/neonView/SalesprojectPreview_view/SalesprojectPreview_view.aod b/neonView/SalesprojectPreview_view/SalesprojectPreview_view.aod
index 393660ef8a3..f60df349937 100644
--- a/neonView/SalesprojectPreview_view/SalesprojectPreview_view.aod
+++ b/neonView/SalesprojectPreview_view/SalesprojectPreview_view.aod
@@ -61,6 +61,10 @@
           <name>bf7ecf7a-3d7f-4ec8-867a-c10ced346343</name>
           <entityField>TIMETRACKINGSUM</entityField>
         </entityFieldLink>
+        <entityFieldLink>
+          <name>9379bf8c-32a3-4255-92db-5336e9b2c948</name>
+          <entityField>MST_TEAM_ID</entityField>
+        </entityFieldLink>
       </fields>
     </genericViewTemplate>
     <genericViewTemplate>
-- 
GitLab


From cf8f128dfcfeb12d1ab5735c913f816ae7a5baae Mon Sep 17 00:00:00 2001
From: "S.Listl" <S.Listl@SLISTL.aditosoftware.local>
Date: Tue, 14 Jul 2020 16:01:49 +0200
Subject: [PATCH 006/184] 1060809 Teams import messages as Activity

---
 entity/Activity_entity/Activity_entity.aod    | 10 +++
 .../importfromteams/onActionProcess.js        |  6 ++
 .../recordcontainers/jdito/onInsert.js        |  2 -
 .../MSTTeamActivityImport_entity.aod          | 71 +++++++++++++++++++
 .../children/teamid_param/valueProcess.js     |  5 ++
 .../children/channel_param/valueProcess.js    |  4 ++
 .../children/teamid_param/valueProcess.js     |  5 ++
 .../entityfields/team_id/valueProcess.js      |  9 +++
 .../recordcontainers/jdito/contentProcess.js  |  9 +++
 .../MSTTeamChannel_entity.aod                 | 40 +++++------
 .../contentTitleProcess.js                    |  4 ++
 .../entityfields/channelname/valueProcess.js  |  6 --
 .../entityfields/description/valueProcess.js  |  6 --
 .../recordcontainers/jdito/contentProcess.js  | 32 +++++++--
 .../recordcontainers/jdito/onInsert.js        | 18 -----
 .../recordcontainers/jdito/onInsert.js        |  3 +-
 .../recordcontainers/jdito/onInsert.js        |  2 -
 .../MSTTeamsMessage_entity.aod                | 28 +++++---
 .../loadoldermessages/onActionProcess.js      |  6 ++
 .../loadnewmessages/onActionProcess.js        | 26 -------
 .../recordcontainers/jdito/contentProcess.js  | 51 ++++++++-----
 .../children/deleteteam/stateProcess.js       |  2 -
 .../MSTTeamActivityImport.aod                 | 13 ++++
 neonContext/MSTTeamChannel/MSTTeamChannel.aod |  7 --
 .../ActivityFilter_view.aod                   |  1 +
 .../MSTTeamActivityImportEdit_view.aod}       | 24 +++----
 .../MSTTeamsMessageFilter_view.aod            | 16 +++--
 27 files changed, 261 insertions(+), 145 deletions(-)
 create mode 100644 entity/Activity_entity/entityfields/mst_teamactions/children/importfromteams/onActionProcess.js
 create mode 100644 entity/MSTTeamActivityImport_entity/MSTTeamActivityImport_entity.aod
 create mode 100644 entity/MSTTeamActivityImport_entity/entityfields/channels/children/teamid_param/valueProcess.js
 create mode 100644 entity/MSTTeamActivityImport_entity/entityfields/messages/children/channel_param/valueProcess.js
 create mode 100644 entity/MSTTeamActivityImport_entity/entityfields/messages/children/teamid_param/valueProcess.js
 create mode 100644 entity/MSTTeamActivityImport_entity/entityfields/team_id/valueProcess.js
 create mode 100644 entity/MSTTeamActivityImport_entity/recordcontainers/jdito/contentProcess.js
 create mode 100644 entity/MSTTeamChannel_entity/contentTitleProcess.js
 delete mode 100644 entity/MSTTeamChannel_entity/entityfields/channelname/valueProcess.js
 delete mode 100644 entity/MSTTeamChannel_entity/entityfields/description/valueProcess.js
 delete mode 100644 entity/MSTTeamChannel_entity/recordcontainers/jdito/onInsert.js
 create mode 100644 entity/MSTTeamsMessage_entity/entityfields/loadoldermessages/onActionProcess.js
 delete mode 100644 entity/MSTTeamsMessage_entity/entityfields/msteam/children/loadnewmessages/onActionProcess.js
 create mode 100644 neonContext/MSTTeamActivityImport/MSTTeamActivityImport.aod
 rename neonView/{MSTTeamChannelEdit_view2/MSTTeamChannelEdit_view2.aod => MSTTeamActivityImportEdit_view/MSTTeamActivityImportEdit_view.aod} (57%)

diff --git a/entity/Activity_entity/Activity_entity.aod b/entity/Activity_entity/Activity_entity.aod
index 97ca6191f20..2d7ba6ac6f4 100644
--- a/entity/Activity_entity/Activity_entity.aod
+++ b/entity/Activity_entity/Activity_entity.aod
@@ -582,6 +582,16 @@
         </entityParameter>
       </children>
     </entityConsumer>
+    <entityActionGroup>
+      <name>MST_TeamActions</name>
+      <children>
+        <entityActionField>
+          <name>importFromTeams</name>
+          <title>Import from Teams</title>
+          <onActionProcess>%aditoprj%/entity/Activity_entity/entityfields/mst_teamactions/children/importfromteams/onActionProcess.js</onActionProcess>
+        </entityActionField>
+      </children>
+    </entityActionGroup>
   </entityFields>
   <recordContainers>
     <dbRecordContainer>
diff --git a/entity/Activity_entity/entityfields/mst_teamactions/children/importfromteams/onActionProcess.js b/entity/Activity_entity/entityfields/mst_teamactions/children/importfromteams/onActionProcess.js
new file mode 100644
index 00000000000..3610fc446b7
--- /dev/null
+++ b/entity/Activity_entity/entityfields/mst_teamactions/children/importfromteams/onActionProcess.js
@@ -0,0 +1,6 @@
+import("system.vars");
+import("system.neon");
+
+neon.openContext("MSTTeamActivityImport", null, null, neon.OPERATINGSTATE_NEW, {
+    "RowId_param" : vars.get("$param.RowId_param")
+});
\ No newline at end of file
diff --git a/entity/MSTChooseTeam_entity/recordcontainers/jdito/onInsert.js b/entity/MSTChooseTeam_entity/recordcontainers/jdito/onInsert.js
index 47e89f66de5..21cd422946c 100644
--- a/entity/MSTChooseTeam_entity/recordcontainers/jdito/onInsert.js
+++ b/entity/MSTChooseTeam_entity/recordcontainers/jdito/onInsert.js
@@ -35,6 +35,4 @@ if(teamIdAndName)
 }
 
 
-neon.refreshAll();
-
 
diff --git a/entity/MSTTeamActivityImport_entity/MSTTeamActivityImport_entity.aod b/entity/MSTTeamActivityImport_entity/MSTTeamActivityImport_entity.aod
new file mode 100644
index 00000000000..a952bdad14e
--- /dev/null
+++ b/entity/MSTTeamActivityImport_entity/MSTTeamActivityImport_entity.aod
@@ -0,0 +1,71 @@
+<?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.14" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.14">
+  <name>MSTTeamActivityImport_entity</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <recordContainer>jdito</recordContainer>
+  <entityFields>
+    <entityProvider>
+      <name>#PROVIDER</name>
+    </entityProvider>
+    <entityField>
+      <name>UID</name>
+    </entityField>
+    <entityConsumer>
+      <name>Messages</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>MSTTeamsMessage_entity</entityName>
+        <fieldName>Messages</fieldName>
+      </dependency>
+      <children>
+        <entityParameter>
+          <name>Channel_param</name>
+          <valueProcess>%aditoprj%/entity/MSTTeamActivityImport_entity/entityfields/messages/children/channel_param/valueProcess.js</valueProcess>
+        </entityParameter>
+        <entityParameter>
+          <name>TeamId_param</name>
+          <valueProcess>%aditoprj%/entity/MSTTeamActivityImport_entity/entityfields/messages/children/teamid_param/valueProcess.js</valueProcess>
+        </entityParameter>
+      </children>
+    </entityConsumer>
+    <entityField>
+      <name>CHANNEL_ID</name>
+      <title>Channel</title>
+      <consumer>Channels</consumer>
+    </entityField>
+    <entityParameter>
+      <name>RowId_param</name>
+      <expose v="true" />
+    </entityParameter>
+    <entityField>
+      <name>TEAM_ID</name>
+      <valueProcess>%aditoprj%/entity/MSTTeamActivityImport_entity/entityfields/team_id/valueProcess.js</valueProcess>
+    </entityField>
+    <entityConsumer>
+      <name>Channels</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>MSTTeamChannel_entity</entityName>
+        <fieldName>ChannelsForTeam</fieldName>
+      </dependency>
+      <children>
+        <entityParameter>
+          <name>TeamId_param</name>
+          <valueProcess>%aditoprj%/entity/MSTTeamActivityImport_entity/entityfields/channels/children/teamid_param/valueProcess.js</valueProcess>
+        </entityParameter>
+      </children>
+    </entityConsumer>
+  </entityFields>
+  <recordContainers>
+    <jDitoRecordContainer>
+      <name>jdito</name>
+      <jDitoRecordAlias>Data_alias</jDitoRecordAlias>
+      <contentProcess>%aditoprj%/entity/MSTTeamActivityImport_entity/recordcontainers/jdito/contentProcess.js</contentProcess>
+      <recordFieldMappings>
+        <jDitoRecordFieldMapping>
+          <name>UID.value</name>
+        </jDitoRecordFieldMapping>
+      </recordFieldMappings>
+    </jDitoRecordContainer>
+  </recordContainers>
+</entity>
diff --git a/entity/MSTTeamActivityImport_entity/entityfields/channels/children/teamid_param/valueProcess.js b/entity/MSTTeamActivityImport_entity/entityfields/channels/children/teamid_param/valueProcess.js
new file mode 100644
index 00000000000..9b96bab31a3
--- /dev/null
+++ b/entity/MSTTeamActivityImport_entity/entityfields/channels/children/teamid_param/valueProcess.js
@@ -0,0 +1,5 @@
+import("system.result");
+import("system.vars");
+
+result.string("9290a0c1-fab2-4fcc-8a7a-37f3154f67a1");
+//result.string(vars.get("$field.TEAM_ID"));
\ No newline at end of file
diff --git a/entity/MSTTeamActivityImport_entity/entityfields/messages/children/channel_param/valueProcess.js b/entity/MSTTeamActivityImport_entity/entityfields/messages/children/channel_param/valueProcess.js
new file mode 100644
index 00000000000..2385cda828f
--- /dev/null
+++ b/entity/MSTTeamActivityImport_entity/entityfields/messages/children/channel_param/valueProcess.js
@@ -0,0 +1,4 @@
+import("system.vars");
+import("system.result");
+
+result.string(vars.get("$field.CHANNEL_ID"));
\ No newline at end of file
diff --git a/entity/MSTTeamActivityImport_entity/entityfields/messages/children/teamid_param/valueProcess.js b/entity/MSTTeamActivityImport_entity/entityfields/messages/children/teamid_param/valueProcess.js
new file mode 100644
index 00000000000..bdaa415f859
--- /dev/null
+++ b/entity/MSTTeamActivityImport_entity/entityfields/messages/children/teamid_param/valueProcess.js
@@ -0,0 +1,5 @@
+import("system.vars");
+import("system.result");
+
+result.string("9290a0c1-fab2-4fcc-8a7a-37f3154f67a1");
+//result.string(vars.get("$field.TEAM_ID"));
\ No newline at end of file
diff --git a/entity/MSTTeamActivityImport_entity/entityfields/team_id/valueProcess.js b/entity/MSTTeamActivityImport_entity/entityfields/team_id/valueProcess.js
new file mode 100644
index 00000000000..87cf4c45576
--- /dev/null
+++ b/entity/MSTTeamActivityImport_entity/entityfields/team_id/valueProcess.js
@@ -0,0 +1,9 @@
+import("system.result");
+import("Sql_lib");
+
+var teamId = newSelect("MST_TEAMID")
+    .from("MST_TEAM")
+    .where("MST_TEAM.OBJECT_ROWID", "$param.RowId_param")
+    .cell();
+    
+result.string(teamId);
\ No newline at end of file
diff --git a/entity/MSTTeamActivityImport_entity/recordcontainers/jdito/contentProcess.js b/entity/MSTTeamActivityImport_entity/recordcontainers/jdito/contentProcess.js
new file mode 100644
index 00000000000..e197aca8b77
--- /dev/null
+++ b/entity/MSTTeamActivityImport_entity/recordcontainers/jdito/contentProcess.js
@@ -0,0 +1,9 @@
+import("system.result");
+import("system.vars");
+
+//TODO: This dummy implementation shouldn't be nescessary here. Remove this process eventually. #1051003
+var rows = [];
+if (vars.get("$local.idvalues"))
+    rows = vars.get("$local.idvalues").map(function (id) {return [id];});
+
+result.object(rows);
\ No newline at end of file
diff --git a/entity/MSTTeamChannel_entity/MSTTeamChannel_entity.aod b/entity/MSTTeamChannel_entity/MSTTeamChannel_entity.aod
index 924b711c221..b2f7ff1993c 100644
--- a/entity/MSTTeamChannel_entity/MSTTeamChannel_entity.aod
+++ b/entity/MSTTeamChannel_entity/MSTTeamChannel_entity.aod
@@ -2,38 +2,34 @@
 <entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.14" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.14">
   <name>MSTTeamChannel_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
+  <contentTitleProcess>%aditoprj%/entity/MSTTeamChannel_entity/contentTitleProcess.js</contentTitleProcess>
   <recordContainer>jdito</recordContainer>
   <entityFields>
     <entityProvider>
       <name>#PROVIDER</name>
     </entityProvider>
-    <entityField>
-      <name>DESCRIPTION</name>
-      <title>Channel Beschreibung</title>
-      <valueProcess>%aditoprj%/entity/MSTTeamChannel_entity/entityfields/description/valueProcess.js</valueProcess>
-    </entityField>
     <entityField>
       <name>CHANNELNAME</name>
       <title>Channel Name</title>
-      <valueProcess>%aditoprj%/entity/MSTTeamChannel_entity/entityfields/channelname/valueProcess.js</valueProcess>
     </entityField>
     <entityField>
       <name>UID</name>
     </entityField>
+    <entityProvider>
+      <name>ChannelsForTeam</name>
+      <dependencies>
+        <entityDependency>
+          <name>a784ee43-b2ef-4d55-a092-9c7f822905fa</name>
+          <entityName>MSTTeamActivityImport_entity</entityName>
+          <fieldName>Channels</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+      </dependencies>
+    </entityProvider>
     <entityParameter>
-      <name>CHANNELNAME_param</name>
-      <expose v="true" />
-    </entityParameter>
-    <entityParameter>
-      <name>CHANNELDESC_param</name>
-      <expose v="true" />
-    </entityParameter>
-    <entityField>
-      <name>ROWID</name>
-    </entityField>
-    <entityParameter>
-      <name>ROWID_param</name>
+      <name>TeamId_param</name>
       <expose v="true" />
+      <mandatory v="true" />
     </entityParameter>
   </entityFields>
   <recordContainers>
@@ -41,16 +37,12 @@
       <name>jdito</name>
       <jDitoRecordAlias>Data_alias</jDitoRecordAlias>
       <contentProcess>%aditoprj%/entity/MSTTeamChannel_entity/recordcontainers/jdito/contentProcess.js</contentProcess>
-      <onInsert>%aditoprj%/entity/MSTTeamChannel_entity/recordcontainers/jdito/onInsert.js</onInsert>
       <recordFieldMappings>
         <jDitoRecordFieldMapping>
-          <name>CHANNELNAME.value</name>
-        </jDitoRecordFieldMapping>
-        <jDitoRecordFieldMapping>
-          <name>DESCRIPTION.value</name>
+          <name>UID.value</name>
         </jDitoRecordFieldMapping>
         <jDitoRecordFieldMapping>
-          <name>UID.value</name>
+          <name>CHANNELNAME.value</name>
         </jDitoRecordFieldMapping>
       </recordFieldMappings>
     </jDitoRecordContainer>
diff --git a/entity/MSTTeamChannel_entity/contentTitleProcess.js b/entity/MSTTeamChannel_entity/contentTitleProcess.js
new file mode 100644
index 00000000000..678b5f5e997
--- /dev/null
+++ b/entity/MSTTeamChannel_entity/contentTitleProcess.js
@@ -0,0 +1,4 @@
+import("system.vars");
+import("system.result");
+
+result.string(vars.get("$field.CHANNELNAME"));
\ No newline at end of file
diff --git a/entity/MSTTeamChannel_entity/entityfields/channelname/valueProcess.js b/entity/MSTTeamChannel_entity/entityfields/channelname/valueProcess.js
deleted file mode 100644
index 487d909b0d9..00000000000
--- a/entity/MSTTeamChannel_entity/entityfields/channelname/valueProcess.js
+++ /dev/null
@@ -1,6 +0,0 @@
-import("system.result");
-import("system.neon");
-import("system.vars");
-
-if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && vars.get("$param.CHANNELNAME_param") && vars.get("$this.value") == null)
-    result.string(vars.get("$param.CHANNELNAME_param"));
\ No newline at end of file
diff --git a/entity/MSTTeamChannel_entity/entityfields/description/valueProcess.js b/entity/MSTTeamChannel_entity/entityfields/description/valueProcess.js
deleted file mode 100644
index ea6333027ca..00000000000
--- a/entity/MSTTeamChannel_entity/entityfields/description/valueProcess.js
+++ /dev/null
@@ -1,6 +0,0 @@
-import("system.result");
-import("system.neon");
-import("system.vars");
-
-if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && vars.get("$param.CHANNELDESC_param") && vars.get("$this.value") == null)
-    result.string(vars.get("$param.CHANNELDESC_param"));
\ No newline at end of file
diff --git a/entity/MSTTeamChannel_entity/recordcontainers/jdito/contentProcess.js b/entity/MSTTeamChannel_entity/recordcontainers/jdito/contentProcess.js
index a0ca9709897..e687b04b480 100644
--- a/entity/MSTTeamChannel_entity/recordcontainers/jdito/contentProcess.js
+++ b/entity/MSTTeamChannel_entity/recordcontainers/jdito/contentProcess.js
@@ -1,9 +1,33 @@
+import("system.teams");
 import("system.result");
 import("system.vars");
+import("JditoFilter_lib");
+
+var searchValue = null;
+JditoFilterUtils.filterRecords(["$$$LOOKUPFIELD$$$"], [["dummy"]], vars.get("$local.filter").filter, {
+    "$$$LOOKUPFIELD$$$" : function (recordValue, filterValue)
+    {
+        searchValue = filterValue;
+        return true;
+    }
+});
+
+var allChannels = teams.getAllChannels(vars.get("$param.TeamId_param"), searchValue || null);
+var channels = [];
 
-//TODO: This dummy implementation shouldn't be nescessary here. Remove this process eventually. #1051003
-var rows = [];
 if (vars.get("$local.idvalues"))
-    rows = vars.get("$local.idvalues").map(function (id) {return [id, "", ""];});
+{
+    channels = vars.get("$local.idvalues").map(function (channelId) 
+    {
+        return [channelId, allChannels[channelId]];
+    });   
+}
+else
+{
+    for (let channelId in allChannels)
+    {
+        channels.push([channelId, allChannels[channelId]]);
+    }
+}
 
-result.object(rows);
\ No newline at end of file
+result.object(channels);
\ No newline at end of file
diff --git a/entity/MSTTeamChannel_entity/recordcontainers/jdito/onInsert.js b/entity/MSTTeamChannel_entity/recordcontainers/jdito/onInsert.js
deleted file mode 100644
index b43e3fa9728..00000000000
--- a/entity/MSTTeamChannel_entity/recordcontainers/jdito/onInsert.js
+++ /dev/null
@@ -1,18 +0,0 @@
-import("system.teams");
-import("Sql_lib");
-import("system.vars");
-
-
-var rowData = vars.get("$local.rowdata");
-
-
-var teamId = newSelect("MST_TEAMID")
-    .from("MST_TEAM")
-    .where("MST_TEAM.OBJECT_ROWID", vars.get("$param.ROWID_param"))
-    .cell();
-    
-var channelName = rowData["CHANNELNAME.value"];
-var channelDescription = rowData["CHANNELDESC.value"];
-
-
-teams.createNewChannel(teamId, channelName, channelDescription);
diff --git a/entity/MSTTeamDocument_entity/recordcontainers/jdito/onInsert.js b/entity/MSTTeamDocument_entity/recordcontainers/jdito/onInsert.js
index 52a04a021ef..6bd9ad9deff 100644
--- a/entity/MSTTeamDocument_entity/recordcontainers/jdito/onInsert.js
+++ b/entity/MSTTeamDocument_entity/recordcontainers/jdito/onInsert.js
@@ -1,3 +1,4 @@
+import("system.text");
 import("system.teams");
 import("system.vars");
 import("system.db");
@@ -33,6 +34,4 @@ for(var i=0; i<documents.length; i++)
             file, docName, "Hier können Sie nachträglich ihre Description ändern", "", alias, util.getNewUUID());    
 }
 
-neon.refreshAll();
-
 
diff --git a/entity/MSTTeam_entity/recordcontainers/jdito/onInsert.js b/entity/MSTTeam_entity/recordcontainers/jdito/onInsert.js
index 3e9acef9832..1c888474dd6 100644
--- a/entity/MSTTeam_entity/recordcontainers/jdito/onInsert.js
+++ b/entity/MSTTeam_entity/recordcontainers/jdito/onInsert.js
@@ -84,5 +84,3 @@ if(teamData)
         "IS_ARCHIVED" : 0
     }, "MST_TEAM");
 }
-
-neon.refreshAll();
diff --git a/entity/MSTTeamsMessage_entity/MSTTeamsMessage_entity.aod b/entity/MSTTeamsMessage_entity/MSTTeamsMessage_entity.aod
index cbfb921ec8c..4e720cc38ed 100644
--- a/entity/MSTTeamsMessage_entity/MSTTeamsMessage_entity.aod
+++ b/entity/MSTTeamsMessage_entity/MSTTeamsMessage_entity.aod
@@ -18,6 +18,7 @@
     <entityField>
       <name>CREATED_DATE_TIME</name>
       <title>Erstelldatum</title>
+      <contentType>DATE</contentType>
     </entityField>
     <entityProvider>
       <name>Messages</name>
@@ -29,25 +30,30 @@
           <fieldName>Consumer</fieldName>
           <isConsumer v="false" />
         </entityDependency>
+        <entityDependency>
+          <name>c79dc4f8-df40-47ba-9baa-b6a64c00f46c</name>
+          <entityName>MSTTeamActivityImport_entity</entityName>
+          <fieldName>Messages</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
       </dependencies>
     </entityProvider>
     <entityField>
       <name>UID</name>
     </entityField>
-    <entityActionGroup>
-      <name>MSTeam</name>
-      <children>
-        <entityActionField>
-          <name>LoadNewMessages</name>
-          <title>Lade neue Nachrichten</title>
-          <onActionProcess>%aditoprj%/entity/MSTTeamsMessage_entity/entityfields/msteam/children/loadnewmessages/onActionProcess.js</onActionProcess>
-        </entityActionField>
-      </children>
-    </entityActionGroup>
     <entityParameter>
-      <name>Messages_param</name>
+      <name>Channel_param</name>
+      <expose v="true" />
+    </entityParameter>
+    <entityParameter>
+      <name>TeamId_param</name>
       <expose v="true" />
     </entityParameter>
+    <entityActionField>
+      <name>LoadOlderMessages</name>
+      <title>Lade neue Nachrichten</title>
+      <onActionProcess>%aditoprj%/entity/MSTTeamsMessage_entity/entityfields/loadoldermessages/onActionProcess.js</onActionProcess>
+    </entityActionField>
   </entityFields>
   <recordContainers>
     <jDitoRecordContainer>
diff --git a/entity/MSTTeamsMessage_entity/entityfields/loadoldermessages/onActionProcess.js b/entity/MSTTeamsMessage_entity/entityfields/loadoldermessages/onActionProcess.js
new file mode 100644
index 00000000000..c7eb3376dab
--- /dev/null
+++ b/entity/MSTTeamsMessage_entity/entityfields/loadoldermessages/onActionProcess.js
@@ -0,0 +1,6 @@
+import("system.neon");
+import("system.vars");
+
+vars.set("$context.loadNextMessages", true);
+
+neon.refreshAll();
\ No newline at end of file
diff --git a/entity/MSTTeamsMessage_entity/entityfields/msteam/children/loadnewmessages/onActionProcess.js b/entity/MSTTeamsMessage_entity/entityfields/msteam/children/loadnewmessages/onActionProcess.js
deleted file mode 100644
index c7682a930da..00000000000
--- a/entity/MSTTeamsMessage_entity/entityfields/msteam/children/loadnewmessages/onActionProcess.js
+++ /dev/null
@@ -1,26 +0,0 @@
-import("system.teams");
-import("system.vars");
-import("system.logging");
-
-if(vars.get("$global.nextLink"))
-{
-   var messages = teams.getNextChannelMessages(vars.get("$global.nextLink"));
-   var jsonMessages = JSON.parse(messages);
-   
-   if(jsonMessages.nextLink)
-   {
-       vars.set("$global.nextLink", jsonMessages.nextLink)
-   }
-   
-   for(var i = 0; i<jsonMessages.messages.length; i++)
-   {
-       logging.log(jsonMessages.messages[i].author.userName + "; " + jsonMessages.messages[i].message.message + "; " + jsonMessages.messages[i].createdDateTime);
-   }
-
-}
-
-
-
-
-
-
diff --git a/entity/MSTTeamsMessage_entity/recordcontainers/jdito/contentProcess.js b/entity/MSTTeamsMessage_entity/recordcontainers/jdito/contentProcess.js
index 1bae78e0753..aceecd801c8 100644
--- a/entity/MSTTeamsMessage_entity/recordcontainers/jdito/contentProcess.js
+++ b/entity/MSTTeamsMessage_entity/recordcontainers/jdito/contentProcess.js
@@ -1,30 +1,43 @@
+import("Sql_lib");
+import("system.teams");
 import("system.result");
 import("system.util");
 import("system.vars");
 import("system.neon");
 
-if(vars.get("$param.Messages_param"))
-{    
-    var jsonMessages = JSON.parse(vars.get("$param.Messages_param"));
+var loadNextMessages = vars.exists("$context.loadNextMessages") && vars.get("$context.loadNextMessages");
+var channelMessages;
+var messages = [];
 
-    if(jsonMessages.nextLink != null)
+if (loadNextMessages)
+{
+    var nextLink = vars.exists("$context.nextLink") ? vars.get("$context.nextLink") : null;
+    if(nextLink)
     {
-        vars.set("$global.nextLink", jsonMessages.nextLink);
+       channelMessages = teams.getNextChannelMessages(nextLink);
+       channelMessages = JSON.parse(channelMessages);
+       messages = channelMessages.messages;
+       vars.set("$context.nextLink", channelMessages.nextLink || null);
     }
-    else
-    {
-        vars.set("$global.nextLink", "");
-    }
-
-    var myDataArray = [];
-
-    for(var i = 0; i<jsonMessages.messages.length; i++)
-    {
-        myDataArray.push([util.getNewUUID(), jsonMessages.messages[i].author.userName, jsonMessages.messages[i].message.message, jsonMessages.messages[i].createdDateTime])
-    }
-    
-    neon.refreshAll();
+    vars.set("$context.loadNextMessages", false);
+}
+else if (vars.get("$param.TeamId_param") && vars.get("$param.Channel_param"))
+{
+    channelMessages = teams.getChannelMessages(vars.get("$param.TeamId_param"), vars.get("$param.Channel_param"), 10);
+    channelMessages = JSON.parse(channelMessages);
+    messages = channelMessages.messages;
     
-    result.object(myDataArray);
+    vars.set("$context.nextLink", channelMessages.nextLink || null);
 }
 
+messages = messages.map(function (message)
+{
+    return [
+        util.getNewUUID(), 
+        message.author.userName, 
+        message.message.message, 
+        Date.parse(message.createdDateTime).toString()
+    ];
+});
+
+result.object(messages);
diff --git a/entity/Member_entity/entityfields/msteamsactiongroup/children/deleteteam/stateProcess.js b/entity/Member_entity/entityfields/msteamsactiongroup/children/deleteteam/stateProcess.js
index da3e32752f3..9bc72a1c164 100644
--- a/entity/Member_entity/entityfields/msteamsactiongroup/children/deleteteam/stateProcess.js
+++ b/entity/Member_entity/entityfields/msteamsactiongroup/children/deleteteam/stateProcess.js
@@ -21,5 +21,3 @@ else
 {
 result.string(neon.COMPONENTSTATE_EDITABLE);
 }
-
-neon.refreshAll();
\ No newline at end of file
diff --git a/neonContext/MSTTeamActivityImport/MSTTeamActivityImport.aod b/neonContext/MSTTeamActivityImport/MSTTeamActivityImport.aod
new file mode 100644
index 00000000000..98fc89b31df
--- /dev/null
+++ b/neonContext/MSTTeamActivityImport/MSTTeamActivityImport.aod
@@ -0,0 +1,13 @@
+<?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>MSTTeamActivityImport</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <editView>MSTTeamActivityImportEdit_view</editView>
+  <entity>MSTTeamActivityImport_entity</entity>
+  <references>
+    <neonViewReference>
+      <name>05e9f542-dd4f-4895-9d0d-d38d57c62735</name>
+      <view>MSTTeamActivityImportEdit_view</view>
+    </neonViewReference>
+  </references>
+</neonContext>
diff --git a/neonContext/MSTTeamChannel/MSTTeamChannel.aod b/neonContext/MSTTeamChannel/MSTTeamChannel.aod
index 504bccc581a..7c2dceb7f03 100644
--- a/neonContext/MSTTeamChannel/MSTTeamChannel.aod
+++ b/neonContext/MSTTeamChannel/MSTTeamChannel.aod
@@ -2,12 +2,5 @@
 <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>MSTTeamChannel</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
-  <editView>MSTTeamChannelEdit_view2</editView>
   <entity>MSTTeamChannel_entity</entity>
-  <references>
-    <neonViewReference>
-      <name>754bf641-381f-4b16-adf6-19960eb7b8d2</name>
-      <view>MSTTeamChannelEdit_view2</view>
-    </neonViewReference>
-  </references>
 </neonContext>
diff --git a/neonView/ActivityFilter_view/ActivityFilter_view.aod b/neonView/ActivityFilter_view/ActivityFilter_view.aod
index 742325d49db..abe9f6833d9 100644
--- a/neonView/ActivityFilter_view/ActivityFilter_view.aod
+++ b/neonView/ActivityFilter_view/ActivityFilter_view.aod
@@ -60,6 +60,7 @@
     </timelineViewTemplate>
     <tableViewTemplate>
       <name>ActivitiesTable</name>
+      <favoriteActionGroup2>MST_TeamActions</favoriteActionGroup2>
       <iconField>#IMAGE</iconField>
       <titleField>SUBJECT</titleField>
       <subtitleField>ENTRYDATE</subtitleField>
diff --git a/neonView/MSTTeamChannelEdit_view2/MSTTeamChannelEdit_view2.aod b/neonView/MSTTeamActivityImportEdit_view/MSTTeamActivityImportEdit_view.aod
similarity index 57%
rename from neonView/MSTTeamChannelEdit_view2/MSTTeamChannelEdit_view2.aod
rename to neonView/MSTTeamActivityImportEdit_view/MSTTeamActivityImportEdit_view.aod
index 6ffd2def37d..076d6f1ebf4 100644
--- a/neonView/MSTTeamChannelEdit_view2/MSTTeamChannelEdit_view2.aod
+++ b/neonView/MSTTeamActivityImportEdit_view/MSTTeamActivityImportEdit_view.aod
@@ -1,29 +1,29 @@
 <?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>MSTTeamChannelEdit_view2</name>
+  <name>MSTTeamActivityImportEdit_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
-  <size>SMALL</size>
+  <isOverlay v="true" />
   <layout>
-    <noneLayout>
+    <boxLayout>
       <name>layout</name>
-    </noneLayout>
+    </boxLayout>
   </layout>
   <children>
     <genericViewTemplate>
-      <name>Generic</name>
+      <name>ChannelSelection</name>
       <editMode v="true" />
       <entityField>#ENTITY</entityField>
-      <title>Neuer Channel</title>
       <fields>
         <entityFieldLink>
-          <name>2b7a105d-ecc0-48e9-9e67-c6d5e84417b7</name>
-          <entityField>CHANNELNAME</entityField>
-        </entityFieldLink>
-        <entityFieldLink>
-          <name>93c89d65-776d-42d4-822f-30d87225b725</name>
-          <entityField>DESCRIPTION</entityField>
+          <name>099e61f6-6cb8-4390-8b79-8943640bce9f</name>
+          <entityField>CHANNEL_ID</entityField>
         </entityFieldLink>
       </fields>
     </genericViewTemplate>
+    <neonViewReference>
+      <name>e486a1bb-5deb-432a-aa28-c3872f0f88fc</name>
+      <entityField>Messages</entityField>
+      <view>MSTTeamsMessageFilter_view</view>
+    </neonViewReference>
   </children>
 </neonView>
diff --git a/neonView/MSTTeamsMessageFilter_view/MSTTeamsMessageFilter_view.aod b/neonView/MSTTeamsMessageFilter_view/MSTTeamsMessageFilter_view.aod
index fbcca9d1e67..54a5bd52208 100644
--- a/neonView/MSTTeamsMessageFilter_view/MSTTeamsMessageFilter_view.aod
+++ b/neonView/MSTTeamsMessageFilter_view/MSTTeamsMessageFilter_view.aod
@@ -10,21 +10,29 @@
   <children>
     <tableViewTemplate>
       <name>Table</name>
+      <hideActions v="true" />
       <entityField>#ENTITY</entityField>
       <columns>
         <neonTableColumn>
           <name>5db624ad-16d0-4374-be55-1a423fcddefc</name>
           <entityField>FROM</entityField>
         </neonTableColumn>
-        <neonTableColumn>
-          <name>bc343936-a59c-4eb0-b056-c8dc35303385</name>
-          <entityField>MESSAGE</entityField>
-        </neonTableColumn>
         <neonTableColumn>
           <name>89e753a1-4917-4493-b1c3-3c9d7884b217</name>
           <entityField>CREATED_DATE_TIME</entityField>
         </neonTableColumn>
+        <neonTableColumn>
+          <name>bc343936-a59c-4eb0-b056-c8dc35303385</name>
+          <entityField>MESSAGE</entityField>
+        </neonTableColumn>
       </columns>
     </tableViewTemplate>
+    <actionsViewTemplate>
+      <name>LoadNextAction</name>
+      <actions>
+        <element>LoadOlderMessages</element>
+      </actions>
+      <entityField>#ENTITY</entityField>
+    </actionsViewTemplate>
   </children>
 </neonView>
-- 
GitLab


From 60bc7417431e344b4243fdc4cb5873b0a1e00013 Mon Sep 17 00:00:00 2001
From: "M.Bilda" <m.bilda@adito.de>
Date: Fri, 17 Jul 2020 11:43:42 +0200
Subject: [PATCH 007/184] 1060809 - state Process added; addApp-Process added

---
 aliasDefinition/Data_alias/Data_alias.aod     | 30 ++++++++++++++-----
 entity/Activity_entity/Activity_entity.aod    |  1 +
 .../mst_teamactions/stateProcess.js           | 14 +++++++++
 entity/Member_entity/Member_entity.aod        |  3 +-
 .../children/addapp/onActionProcess.js        | 18 +++++------
 .../changetomsteam/onActionProcess.js         |  7 ++++-
 .../children/restoreteam/onActionProcess.js   | 22 +++++++-------
 .../msteamsactiongroup/stateProcess.js        | 14 +++++++++
 8 files changed, 76 insertions(+), 33 deletions(-)
 create mode 100644 entity/Activity_entity/entityfields/mst_teamactions/stateProcess.js
 create mode 100644 entity/Member_entity/entityfields/msteamsactiongroup/stateProcess.js

diff --git a/aliasDefinition/Data_alias/Data_alias.aod b/aliasDefinition/Data_alias/Data_alias.aod
index 427ce28a0ce..8aa42253a1f 100644
--- a/aliasDefinition/Data_alias/Data_alias.aod
+++ b/aliasDefinition/Data_alias/Data_alias.aod
@@ -14199,13 +14199,13 @@
               <entityFieldDb>
                 <name>MST_TEAMID</name>
                 <dbName></dbName>
-                <primaryKey v="true" />
+                <primaryKey v="false" />
                 <columnType v="1" />
                 <size v="36" />
                 <scale v="0" />
-                <notNull v="true" />
-                <isUnique v="true" />
-                <index v="true" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
                 <documentation></documentation>
                 <title></title>
                 <description></description>
@@ -14267,12 +14267,12 @@
                 <description></description>
               </entityFieldDb>
               <entityFieldDb>
-                <name>WEB_URL</name>
+                <name>FINAL_DELETE_DATE</name>
                 <dbName></dbName>
                 <primaryKey v="false" />
-                <columnType v="12" />
-                <size v="255" />
-                <scale v="0" />
+                <columnType v="93" />
+                <size v="29" />
+                <scale v="9" />
                 <notNull v="false" />
                 <isUnique v="false" />
                 <index v="false" />
@@ -14280,6 +14280,20 @@
                 <title></title>
                 <description></description>
               </entityFieldDb>
+              <entityFieldDb>
+                <name>MST_ID</name>
+                <dbName></dbName>
+                <primaryKey v="true" />
+                <columnType v="1" />
+                <size v="36" />
+                <scale v="0" />
+                <notNull v="true" />
+                <isUnique v="true" />
+                <index v="true" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
             </entityFields>
           </entityDb>
         </entities>
diff --git a/entity/Activity_entity/Activity_entity.aod b/entity/Activity_entity/Activity_entity.aod
index 2d7ba6ac6f4..374162a2f44 100644
--- a/entity/Activity_entity/Activity_entity.aod
+++ b/entity/Activity_entity/Activity_entity.aod
@@ -584,6 +584,7 @@
     </entityConsumer>
     <entityActionGroup>
       <name>MST_TeamActions</name>
+      <stateProcess>%aditoprj%/entity/Activity_entity/entityfields/mst_teamactions/stateProcess.js</stateProcess>
       <children>
         <entityActionField>
           <name>importFromTeams</name>
diff --git a/entity/Activity_entity/entityfields/mst_teamactions/stateProcess.js b/entity/Activity_entity/entityfields/mst_teamactions/stateProcess.js
new file mode 100644
index 00000000000..15e4ead9122
--- /dev/null
+++ b/entity/Activity_entity/entityfields/mst_teamactions/stateProcess.js
@@ -0,0 +1,14 @@
+import("system.neon");
+import("system.result");
+import("system.project");
+
+var isTeamsEnabled = project.getInstanceConfigValue(teamsIsEnabled, null);
+
+if(isTeamsEnabled)
+{
+    result.string(neon.COMPONENTSTATE_EDITABLE);
+}
+else
+{
+    result.string(neon.COMPONENTSTATE_DISABLED);
+}
\ No newline at end of file
diff --git a/entity/Member_entity/Member_entity.aod b/entity/Member_entity/Member_entity.aod
index ba4cb276acc..b09487acaec 100644
--- a/entity/Member_entity/Member_entity.aod
+++ b/entity/Member_entity/Member_entity.aod
@@ -203,6 +203,7 @@
     <entityActionGroup>
       <name>MSTeamsActionGroup</name>
       <title>MS Teams</title>
+      <stateProcess>%aditoprj%/entity/Member_entity/entityfields/msteamsactiongroup/stateProcess.js</stateProcess>
       <children>
         <entityActionField>
           <name>createTeam</name>
@@ -233,7 +234,7 @@
           <onActionProcess>%aditoprj%/entity/Member_entity/entityfields/msteamsactiongroup/children/addapp/onActionProcess.js</onActionProcess>
           <iconId>VAADIN:MOBILE</iconId>
           <stateProcess>%aditoprj%/entity/Member_entity/entityfields/msteamsactiongroup/children/addapp/stateProcess.js</stateProcess>
-          <tooltip>Fügt eine App zum Team hinzu</tooltip>
+          <tooltip>Adds the MST ADITO App to the MSTTeam</tooltip>
         </entityActionField>
         <entityActionField>
           <name>chooseTeam</name>
diff --git a/entity/Member_entity/entityfields/msteamsactiongroup/children/addapp/onActionProcess.js b/entity/Member_entity/entityfields/msteamsactiongroup/children/addapp/onActionProcess.js
index a7b5766ffee..3fd67199f22 100644
--- a/entity/Member_entity/entityfields/msteamsactiongroup/children/addapp/onActionProcess.js
+++ b/entity/Member_entity/entityfields/msteamsactiongroup/children/addapp/onActionProcess.js
@@ -1,17 +1,13 @@
 import("system.teams");
 import("Sql_lib");
-import("system.neon");
+import("system.project");
+import("system.logging");
 
 
-var teamId = newSelect("MST_TEAMID")
-    .from("MST_TEAM")
-    .where("MST_TEAM.OBJECT_ROWID", "$param.ObjectRowId_param")
+var teamId = newSelect("MST_TEAM_ID")
+    .from("SALEPROJECT")
+    .where("SALESPORJECT.SALESPROJECTID", "$param.ObjectRowId_param")
     .cell();
     
-//DAFÃœR MUSS ES EIN DESIGNER FELD GEBEN
-var appId = "27888276-ddc1-4e24-a07c-1023996fd892"
-    
-    
-teams.addAppToTeam(teamId, appId);
-
-neon.refreshAll();
\ No newline at end of file
+var appId = project.getInstanceConfigValue("teamsAppId", null);
+teams.addApp(teamId, appId)
\ No newline at end of file
diff --git a/entity/Member_entity/entityfields/msteamsactiongroup/children/changetomsteam/onActionProcess.js b/entity/Member_entity/entityfields/msteamsactiongroup/children/changetomsteam/onActionProcess.js
index 144584dfb46..d58faeca5c3 100644
--- a/entity/Member_entity/entityfields/msteamsactiongroup/children/changetomsteam/onActionProcess.js
+++ b/entity/Member_entity/entityfields/msteamsactiongroup/children/changetomsteam/onActionProcess.js
@@ -1,5 +1,10 @@
+import("Sql_lib");
+import("system.vars");
 import("system.neon");
 
-var url = "https://teams.microsoft.com/l/team/19:0062b1c861df409391eaf0329b99db68%40thread.tacv2/conversations?groupId=c4c6a313-3d12-4941-900e-afc464755188&tenantId=bb59bb5b-90c7-41f9-85aa-f40da5c0c68a";
+var webUrl = newSelect("WEB_URL")
+    .from("MST_TEAM")
+    .where("MST_TEAM.OBJECT_ROWID", vars.get("$field.OBJECT_ROWID"))
+    .cell();
 
 neon.openUrl(url, true)
diff --git a/entity/Member_entity/entityfields/msteamsactiongroup/children/restoreteam/onActionProcess.js b/entity/Member_entity/entityfields/msteamsactiongroup/children/restoreteam/onActionProcess.js
index dc58a876d04..b67caa38262 100644
--- a/entity/Member_entity/entityfields/msteamsactiongroup/children/restoreteam/onActionProcess.js
+++ b/entity/Member_entity/entityfields/msteamsactiongroup/children/restoreteam/onActionProcess.js
@@ -1,3 +1,4 @@
+import("system.vars");
 import("system.teams");
 import("Sql_lib");
 import("system.neon");
@@ -5,7 +6,7 @@ import("system.neon");
 
 var teamId = newSelect("MST_TEAMID")
     .from("MST_TEAM")
-    .where("MST_TEAM.OBJECT_ROWID", "$param.ObjectRowId_param")
+    .where("MST_TEAM.OBJECT_ROWID", vars.get("$field.OBJECT_ROWID"))
     .cell();
 
 //Hat dieses Team mehrere Projekte??
@@ -13,16 +14,13 @@ var teamIds = newSelect("MST_TEAMID")
     .from("MST_TEAM")
     .where("MST_TEAM.MST_TEAMID", teamId).arrayRow();
     
-teams.unarchiveTeamAndRestoreGroup(teamId);
+teams.unarchiveTeam(teamId);
 
 for(var i = 0; i<teamIds.length; i++)
-    {            
-        newWhere("MST_TEAM.MST_TEAMID", teamIds[i])
-            .updateFields({
-                  "IS_ARCHIVED" : "0",
-                  "FINAL_DELETE_DATE" : ""
-                  });
-    }
-    
-    
-neon.refreshAll();
\ No newline at end of file
+{            
+    newWhere("MST_TEAM.MST_TEAMID", teamIds[i])
+        .updateFields({
+              "IS_ARCHIVED" : "0",
+              "FINAL_DELETE_DATE" : ""
+              });
+}
\ No newline at end of file
diff --git a/entity/Member_entity/entityfields/msteamsactiongroup/stateProcess.js b/entity/Member_entity/entityfields/msteamsactiongroup/stateProcess.js
new file mode 100644
index 00000000000..15e4ead9122
--- /dev/null
+++ b/entity/Member_entity/entityfields/msteamsactiongroup/stateProcess.js
@@ -0,0 +1,14 @@
+import("system.neon");
+import("system.result");
+import("system.project");
+
+var isTeamsEnabled = project.getInstanceConfigValue(teamsIsEnabled, null);
+
+if(isTeamsEnabled)
+{
+    result.string(neon.COMPONENTSTATE_EDITABLE);
+}
+else
+{
+    result.string(neon.COMPONENTSTATE_DISABLED);
+}
\ No newline at end of file
-- 
GitLab


From b14085465978c6ee3734c2f614f74fdc849ea927 Mon Sep 17 00:00:00 2001
From: "S.Listl" <S.Listl@SLISTL.aditosoftware.local>
Date: Wed, 22 Jul 2020 16:27:38 +0200
Subject: [PATCH 008/184] #1060809 MS Teams integration

---
 .../2020.2.1/add_salesproject_MST_TEAM_ID.xml |   9 ++
 .../Data_alias/basic/2020.2.1/changelog.xml   |   1 +
 .../basic/2020.2.1/create_MST_TEAM.xml        |   7 +-
 .liquibase/Data_alias/changelog.xml           |   3 +-
 aliasDefinition/Data_alias/Data_alias.aod     | 146 ------------------
 .../mst_teamactions/stateProcess.js           |   4 +-
 .../MSTTeamAddMembers_entity.aod              |  14 ++
 .../entityfields/mst_team_id/valueProcess.js  |   7 +
 .../entityfields/mst_teamname/valueProcess.js |   7 +
 .../recordcontainers/jdito/contentProcess.js  |   2 +-
 .../recordcontainers/jdito/onInsert.js        |  43 ++++++
 .../MSTTeamMember_entity.aod                  |  10 +-
 .../member/displayValueProcess.js             |   5 +
 .../entityfields/member/stateProcess.js       |   5 +
 .../role_or_invite/mandatoryProcess.js        |   4 +
 .../role_or_invite/stateProcess.js            |   5 +
 .../recordcontainers/jdito/contentProcess.js  |   7 +-
 .../recordcontainers/jdito/onDelete.js        |   1 +
 .../recordcontainers/jdito/onInsert.js        |  59 +------
 entity/MSTTeam_entity/MSTTeam_entity.aod      |  23 +--
 .../entityfields/description/stateProcess.js  |   5 +
 .../children/objecttype_param/valueProcess.js |   3 -
 .../children/mstteamid_param/valueProcess.js  |   4 +-
 .../entityfields/teamname/stateProcess.js     |   5 +
 .../recordcontainers/jdito/onInsert.js        | 120 +++++++-------
 .../recordcontainers/jdito/onUpdate.js        |  54 +++++++
 entity/Member_entity/Member_entity.aod        |  18 ++-
 .../children/addapp/stateProcess.js           |  20 +--
 .../children/addnewmember/stateProcess.js     |   9 +-
 .../changetomsteam/onActionProcess.js         |   7 +-
 .../children/changetomsteam/stateProcess.js   |   9 +-
 .../children/chooseteam/stateProcess.js       |  11 +-
 .../children/createteam/stateProcess.js       |  11 +-
 .../children/deletemember/stateProcess.js     |  20 +++
 .../children/deleteteam/stateProcess.js       |  15 +-
 .../children/editteam/onActionProcess.js      |   9 ++
 .../children/restoreteam/stateProcess.js      |   9 +-
 .../msteamsactiongroup/stateProcess.js        |   4 +-
 .../Salesproject_entity.aod                   |   4 +
 .../mst_teamid_param}/valueProcess.js         |   2 +-
 neonContext/MSTTeam/MSTTeam.aod               |   4 +
 neonContext/MSTTeamMember/MSTTeamMember.aod   |   4 +
 .../MSTTeamAddMembersEdit_view.aod            |  10 ++
 .../MSTTeamEditMembers_view.aod               |  28 ++++
 .../MSTTeamMemberList_view.aod                |  25 +++
 .../MSTTeamPreview_view.aod                   |   5 +
 process/Employee_lib/process.js               |   8 +-
 47 files changed, 414 insertions(+), 371 deletions(-)
 create mode 100644 .liquibase/Data_alias/basic/2020.2.1/add_salesproject_MST_TEAM_ID.xml
 create mode 100644 entity/MSTTeamAddMembers_entity/entityfields/mst_team_id/valueProcess.js
 create mode 100644 entity/MSTTeamAddMembers_entity/entityfields/mst_teamname/valueProcess.js
 create mode 100644 entity/MSTTeamAddMembers_entity/recordcontainers/jdito/onInsert.js
 create mode 100644 entity/MSTTeamMember_entity/entityfields/member/displayValueProcess.js
 create mode 100644 entity/MSTTeamMember_entity/entityfields/member/stateProcess.js
 create mode 100644 entity/MSTTeamMember_entity/entityfields/role_or_invite/mandatoryProcess.js
 create mode 100644 entity/MSTTeamMember_entity/entityfields/role_or_invite/stateProcess.js
 create mode 100644 entity/MSTTeamMember_entity/recordcontainers/jdito/onDelete.js
 create mode 100644 entity/MSTTeam_entity/entityfields/description/stateProcess.js
 delete mode 100644 entity/MSTTeam_entity/entityfields/membercomsumer/children/objecttype_param/valueProcess.js
 create mode 100644 entity/MSTTeam_entity/entityfields/teamname/stateProcess.js
 create mode 100644 entity/MSTTeam_entity/recordcontainers/jdito/onUpdate.js
 create mode 100644 entity/Member_entity/entityfields/msteamsactiongroup/children/deletemember/stateProcess.js
 create mode 100644 entity/Member_entity/entityfields/msteamsactiongroup/children/editteam/onActionProcess.js
 rename entity/{MSTTeam_entity/entityfields/membercomsumer/children/objectrowid_param => Salesproject_entity/entityfields/members/children/mst_teamid_param}/valueProcess.js (51%)
 create mode 100644 neonView/MSTTeamEditMembers_view/MSTTeamEditMembers_view.aod
 create mode 100644 neonView/MSTTeamMemberList_view/MSTTeamMemberList_view.aod

diff --git a/.liquibase/Data_alias/basic/2020.2.1/add_salesproject_MST_TEAM_ID.xml b/.liquibase/Data_alias/basic/2020.2.1/add_salesproject_MST_TEAM_ID.xml
new file mode 100644
index 00000000000..58cc0adab61
--- /dev/null
+++ b/.liquibase/Data_alias/basic/2020.2.1/add_salesproject_MST_TEAM_ID.xml
@@ -0,0 +1,9 @@
+<?xml version="1.1" encoding="UTF-8" standalone="no"?>
+<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
+                   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd">
+    <changeSet author="s.listl" id="b1fc1530-37c8-46b2-a96f-21e3a6deeed1">
+        <addColumn tableName="SALESPROJECT">
+            <column name="MST_TEAM_ID" type="CHAR(36)"/>
+        </addColumn>
+    </changeSet>
+</databaseChangeLog>
diff --git a/.liquibase/Data_alias/basic/2020.2.1/changelog.xml b/.liquibase/Data_alias/basic/2020.2.1/changelog.xml
index 7a6f495d3a7..3b995a276a0 100644
--- a/.liquibase/Data_alias/basic/2020.2.1/changelog.xml
+++ b/.liquibase/Data_alias/basic/2020.2.1/changelog.xml
@@ -2,4 +2,5 @@
 <databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
                    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd">
     <include file="create_MST_TEAM.xml" relativeToChangelogFile="true"/>
+    <include file="add_salesproject_MST_TEAM_ID.xml" relativeToChangelogFile="true"/>
 </databaseChangeLog>
diff --git a/.liquibase/Data_alias/basic/2020.2.1/create_MST_TEAM.xml b/.liquibase/Data_alias/basic/2020.2.1/create_MST_TEAM.xml
index 1181ee7b3a2..48a4387dde9 100644
--- a/.liquibase/Data_alias/basic/2020.2.1/create_MST_TEAM.xml
+++ b/.liquibase/Data_alias/basic/2020.2.1/create_MST_TEAM.xml
@@ -3,16 +3,15 @@
                    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd">
 <changeSet author="m.bilda" id="3d4f843d-9c5d-46b1-9475-9527d45a65b6">
 	<createTable tableName="MST_TEAM">
-		<column name="MST_ID" type="CHAR(36)">
-			<constraints primaryKey="true" primaryKeyName="PK_MST_TEAM_MST_ID"/>
+		<column name="MST_TEAMID" type="CHAR(36)">
+			<constraints primaryKey="true" primaryKeyName="PK_MST_TEAM_MST_TEAMID"/>
 		</column>   
-                <column name="MST_TEAMID" type="CHAR(36)"/>
                 <column name="TEAMNAME" type="NVARCHAR(255)"/>
                 <column name="GENERAL_CHANNELID" type="CHAR(48)"/>
                 <column name="OBJECT_ROWID" type="CHAR(36)"/>
                 <column name="IS_ARCHIVED" type="TINYINT"/>
                 <column name="SERVICE_URL" type="NVARCHAR(255)"/>
-                <column name="FINAL_DELETE_DATE" type="TIMESTAMP"/>
+                <column name="WEB_URL" type="NVARCHAR(500)"/>
 	</createTable>      
 </changeSet>
 </databaseChangeLog>
diff --git a/.liquibase/Data_alias/changelog.xml b/.liquibase/Data_alias/changelog.xml
index 925dfaab9bf..0c689b4cb33 100644
--- a/.liquibase/Data_alias/changelog.xml
+++ b/.liquibase/Data_alias/changelog.xml
@@ -13,7 +13,8 @@
     <include relativeToChangelogFile="true" file="basic/2020.0.3/changelog.xml"/>
     <include relativeToChangelogFile="true" file="basic/2020.1.0/changelog.xml"/>
     <include relativeToChangelogFile="true" file="basic/2020.1.1/changelog.xml"/>
-    <include relativeToChangelogFile="true" file="basic/2020.1.2/changelog.xml"/>
+    <!--<include relativeToChangelogFile="true" file="basic/2020.1.2/changelog.xml"/>-->
+    <include relativeToChangelogFile="true" file="basic/2020.2.1/changelog.xml"/>
     
     <!--enable this only when you definetly want to overwrite the existing data with demo records:--> 
     <include relativeToChangelogFile="true" file="basic/_demoData/changelog.xml" context="example"/>
diff --git a/aliasDefinition/Data_alias/Data_alias.aod b/aliasDefinition/Data_alias/Data_alias.aod
index 9d086537bef..c7037b6dddf 100644
--- a/aliasDefinition/Data_alias/Data_alias.aod
+++ b/aliasDefinition/Data_alias/Data_alias.aod
@@ -3647,20 +3647,6 @@
                   </customStringProperty>
                 </customProperties>
               </entityFieldDb>
-              <entityFieldDb>
-                <name>MST_TEAM_ID</name>
-                <dbName></dbName>
-                <primaryKey v="false" />
-                <columnType v="1" />
-                <size v="36" />
-                <scale v="0" />
-                <notNull v="false" />
-                <isUnique v="false" />
-                <index v="false" />
-                <documentation></documentation>
-                <title></title>
-                <description></description>
-              </entityFieldDb>
             </entityFields>
           </entityDb>
           <entityDb>
@@ -14164,138 +14150,6 @@
               </entityFieldDb>
             </entityFields>
           </entityDb>
-          <entityDb>
-            <name>MST_TEAM</name>
-            <dbName></dbName>
-            <idColumn>MST_TEAMID</idColumn>
-            <idGeneratorType v="0" />
-            <idGeneratorInterval v="1" />
-            <documentation></documentation>
-            <title></title>
-            <description></description>
-            <auditSyncConfig>
-              <name>auditSyncConfig</name>
-              <auditMode v="0" />
-              <syncActive v="false" />
-              <syncComplete v="true" />
-              <syncDirection v="1" />
-              <syncIds></syncIds>
-            </auditSyncConfig>
-            <entityFields>
-              <entityFieldDb>
-                <name>OBJECT_ROWID</name>
-                <dbName></dbName>
-                <primaryKey v="false" />
-                <columnType v="1" />
-                <size v="36" />
-                <scale v="0" />
-                <notNull v="false" />
-                <isUnique v="false" />
-                <index v="false" />
-                <documentation></documentation>
-                <title></title>
-                <description></description>
-              </entityFieldDb>
-              <entityFieldDb>
-                <name>MST_TEAMID</name>
-                <dbName></dbName>
-                <primaryKey v="false" />
-                <columnType v="1" />
-                <size v="36" />
-                <scale v="0" />
-                <notNull v="false" />
-                <isUnique v="false" />
-                <index v="false" />
-                <documentation></documentation>
-                <title></title>
-                <description></description>
-              </entityFieldDb>
-              <entityFieldDb>
-                <name>IS_ARCHIVED</name>
-                <dbName></dbName>
-                <primaryKey v="false" />
-                <columnType v="5" />
-                <size v="5" />
-                <scale v="0" />
-                <notNull v="false" />
-                <isUnique v="false" />
-                <index v="false" />
-                <documentation></documentation>
-                <title></title>
-                <description></description>
-              </entityFieldDb>
-              <entityFieldDb>
-                <name>SERVICE_URL</name>
-                <dbName></dbName>
-                <primaryKey v="false" />
-                <columnType v="12" />
-                <size v="255" />
-                <scale v="0" />
-                <notNull v="false" />
-                <isUnique v="false" />
-                <index v="false" />
-                <documentation></documentation>
-                <title></title>
-                <description></description>
-              </entityFieldDb>
-              <entityFieldDb>
-                <name>TEAMNAME</name>
-                <dbName></dbName>
-                <primaryKey v="false" />
-                <columnType v="12" />
-                <size v="255" />
-                <scale v="0" />
-                <notNull v="false" />
-                <isUnique v="false" />
-                <index v="false" />
-                <documentation></documentation>
-                <title></title>
-                <description></description>
-              </entityFieldDb>
-              <entityFieldDb>
-                <name>GENERAL_CHANNELID</name>
-                <dbName></dbName>
-                <primaryKey v="false" />
-                <columnType v="1" />
-                <size v="48" />
-                <scale v="0" />
-                <notNull v="false" />
-                <isUnique v="false" />
-                <index v="false" />
-                <documentation></documentation>
-                <title></title>
-                <description></description>
-              </entityFieldDb>
-              <entityFieldDb>
-                <name>FINAL_DELETE_DATE</name>
-                <dbName></dbName>
-                <primaryKey v="false" />
-                <columnType v="93" />
-                <size v="29" />
-                <scale v="9" />
-                <notNull v="false" />
-                <isUnique v="false" />
-                <index v="false" />
-                <documentation></documentation>
-                <title></title>
-                <description></description>
-              </entityFieldDb>
-              <entityFieldDb>
-                <name>MST_ID</name>
-                <dbName></dbName>
-                <primaryKey v="true" />
-                <columnType v="1" />
-                <size v="36" />
-                <scale v="0" />
-                <notNull v="true" />
-                <isUnique v="true" />
-                <index v="true" />
-                <documentation></documentation>
-                <title></title>
-                <description></description>
-              </entityFieldDb>
-            </entityFields>
-          </entityDb>
         </entities>
       </entityGroup>
     </aliasDefDb>
diff --git a/entity/Activity_entity/entityfields/mst_teamactions/stateProcess.js b/entity/Activity_entity/entityfields/mst_teamactions/stateProcess.js
index 15e4ead9122..44ae892f222 100644
--- a/entity/Activity_entity/entityfields/mst_teamactions/stateProcess.js
+++ b/entity/Activity_entity/entityfields/mst_teamactions/stateProcess.js
@@ -2,9 +2,9 @@ import("system.neon");
 import("system.result");
 import("system.project");
 
-var isTeamsEnabled = project.getInstanceConfigValue(teamsIsEnabled, null);
+var isTeamsEnabled = project.getInstanceConfigValue("teamsEnabled", null);
 
-if(isTeamsEnabled)
+if (isTeamsEnabled == "true")
 {
     result.string(neon.COMPONENTSTATE_EDITABLE);
 }
diff --git a/entity/MSTTeamAddMembers_entity/MSTTeamAddMembers_entity.aod b/entity/MSTTeamAddMembers_entity/MSTTeamAddMembers_entity.aod
index 1a1c93f66ca..791fc678cf4 100644
--- a/entity/MSTTeamAddMembers_entity/MSTTeamAddMembers_entity.aod
+++ b/entity/MSTTeamAddMembers_entity/MSTTeamAddMembers_entity.aod
@@ -29,15 +29,29 @@
       <name>SalesprojectId_param</name>
       <expose v="true" />
     </entityParameter>
+    <entityField>
+      <name>MST_TEAMNAME</name>
+      <title>Team name</title>
+      <valueProcess>%aditoprj%/entity/MSTTeamAddMembers_entity/entityfields/mst_teamname/valueProcess.js</valueProcess>
+    </entityField>
+    <entityField>
+      <name>MST_TEAM_ID</name>
+      <valueProcess>%aditoprj%/entity/MSTTeamAddMembers_entity/entityfields/mst_team_id/valueProcess.js</valueProcess>
+    </entityField>
   </entityFields>
   <recordContainers>
     <jDitoRecordContainer>
       <name>jdito</name>
+      <jDitoRecordAlias>Data_alias</jDitoRecordAlias>
       <contentProcess>%aditoprj%/entity/MSTTeamAddMembers_entity/recordcontainers/jdito/contentProcess.js</contentProcess>
+      <onInsert>%aditoprj%/entity/MSTTeamAddMembers_entity/recordcontainers/jdito/onInsert.js</onInsert>
       <recordFieldMappings>
         <jDitoRecordFieldMapping>
           <name>UID.value</name>
         </jDitoRecordFieldMapping>
+        <jDitoRecordFieldMapping>
+          <name>MST_TEAM_ID.value</name>
+        </jDitoRecordFieldMapping>
       </recordFieldMappings>
     </jDitoRecordContainer>
   </recordContainers>
diff --git a/entity/MSTTeamAddMembers_entity/entityfields/mst_team_id/valueProcess.js b/entity/MSTTeamAddMembers_entity/entityfields/mst_team_id/valueProcess.js
new file mode 100644
index 00000000000..3db681dd8d2
--- /dev/null
+++ b/entity/MSTTeamAddMembers_entity/entityfields/mst_team_id/valueProcess.js
@@ -0,0 +1,7 @@
+import("system.result");
+import("Sql_lib");
+
+result.string(newSelect("MST_TEAM_ID")
+    .from("SALESPROJECT")
+    .where("SALESPROJECT.SALESPROJECTID", "$param.SalesprojectId_param")
+    .cell());
\ No newline at end of file
diff --git a/entity/MSTTeamAddMembers_entity/entityfields/mst_teamname/valueProcess.js b/entity/MSTTeamAddMembers_entity/entityfields/mst_teamname/valueProcess.js
new file mode 100644
index 00000000000..7945448b1d2
--- /dev/null
+++ b/entity/MSTTeamAddMembers_entity/entityfields/mst_teamname/valueProcess.js
@@ -0,0 +1,7 @@
+import("system.result");
+import("Sql_lib");
+
+result.string(newSelect("TEAMNAME")
+    .from("MST_TEAM")
+    .where("MST_TEAM.MST_TEAMID", "$field.MST_TEAM_ID")
+    .cell());
\ No newline at end of file
diff --git a/entity/MSTTeamAddMembers_entity/recordcontainers/jdito/contentProcess.js b/entity/MSTTeamAddMembers_entity/recordcontainers/jdito/contentProcess.js
index e197aca8b77..af9ece7caa7 100644
--- a/entity/MSTTeamAddMembers_entity/recordcontainers/jdito/contentProcess.js
+++ b/entity/MSTTeamAddMembers_entity/recordcontainers/jdito/contentProcess.js
@@ -4,6 +4,6 @@ import("system.vars");
 //TODO: This dummy implementation shouldn't be nescessary here. Remove this process eventually. #1051003
 var rows = [];
 if (vars.get("$local.idvalues"))
-    rows = vars.get("$local.idvalues").map(function (id) {return [id];});
+    rows = vars.get("$local.idvalues").map(function (id) {return [id, ""];});
 
 result.object(rows);
\ No newline at end of file
diff --git a/entity/MSTTeamAddMembers_entity/recordcontainers/jdito/onInsert.js b/entity/MSTTeamAddMembers_entity/recordcontainers/jdito/onInsert.js
new file mode 100644
index 00000000000..584fbcf9708
--- /dev/null
+++ b/entity/MSTTeamAddMembers_entity/recordcontainers/jdito/onInsert.js
@@ -0,0 +1,43 @@
+import("Communication_lib");
+import("Sql_lib");
+import("system.vars");
+import("system.teams");
+import("system.tools");
+import("Employee_lib");
+
+var rowdata = vars.get("$local.rowdata");
+var teamId = rowdata["MST_TEAM_ID.value"];
+var teamMembers = vars.get("$field.Members.insertedRows");
+
+var internalMembers = [];
+var externalMembers = [];
+teamMembers.forEach(function (teamMember)
+{
+    var memberUser = EmployeeUtils.getUserByContactId(teamMember.MEMBER);
+    if (!memberUser)
+    {
+        var memberEmail = CommUtil.getStandardMail(teamMember.MEMBER);
+        if (memberEmail)
+        {
+            externalMembers.push(
+                teams.createExternalUserConfig(memberEmail)
+                    .sendInvitation(teamMember.ROLE_OR_INVITE == "invite")
+            );
+        }
+        return;
+    }
+    var memberAzureId = memberUser[tools.PARAMS][tools.TEAMS_AZUREID];
+    var memberUpn = memberUser[tools.PARAMS][tools.TEAMS_AZUREUPN];
+    if (!memberAzureId && memberUpn)
+        memberAzureId = teams.getInternalAzureId(memberUpn);
+    if (memberAzureId)
+    {
+        internalMembers.push(teams.createInternalUserConfig(memberAzureId).setOwner(teamMember.ROLE_OR_INVITE == "isOwner"));
+    }
+});
+
+if (internalMembers.length !== 0)
+    teams.addInternalMembers(teamId, internalMembers);
+
+if (externalMembers.length !== 0)
+    teams.addExternalMembers(teamId, externalMembers);
\ No newline at end of file
diff --git a/entity/MSTTeamMember_entity/MSTTeamMember_entity.aod b/entity/MSTTeamMember_entity/MSTTeamMember_entity.aod
index 40379d111b5..7981f828883 100644
--- a/entity/MSTTeamMember_entity/MSTTeamMember_entity.aod
+++ b/entity/MSTTeamMember_entity/MSTTeamMember_entity.aod
@@ -19,6 +19,8 @@
       <name>MEMBER</name>
       <title>Members</title>
       <consumer>ProjectMembers</consumer>
+      <stateProcess>%aditoprj%/entity/MSTTeamMember_entity/entityfields/member/stateProcess.js</stateProcess>
+      <displayValueProcess>%aditoprj%/entity/MSTTeamMember_entity/entityfields/member/displayValueProcess.js</displayValueProcess>
     </entityField>
     <entityField>
       <name>UID</name>
@@ -55,8 +57,9 @@
     </entityConsumer>
     <entityField>
       <name>ROLE_OR_INVITE</name>
-      <mandatory v="true" />
+      <mandatoryProcess>%aditoprj%/entity/MSTTeamMember_entity/entityfields/role_or_invite/mandatoryProcess.js</mandatoryProcess>
       <dropDownProcess>%aditoprj%/entity/MSTTeamMember_entity/entityfields/role_or_invite/dropDownProcess.js</dropDownProcess>
+      <stateProcess>%aditoprj%/entity/MSTTeamMember_entity/entityfields/role_or_invite/stateProcess.js</stateProcess>
     </entityField>
     <entityField>
       <name>ISEXTERN</name>
@@ -71,6 +74,7 @@
     </entityParameter>
     <entityProvider>
       <name>MembersOfTeam</name>
+      <titlePlural>Team members</titlePlural>
       <dependencies>
         <entityDependency>
           <name>37854fde-c4ae-4f56-82df-14385717f82e</name>
@@ -88,6 +92,7 @@
       <contentProcess>%aditoprj%/entity/MSTTeamMember_entity/recordcontainers/jdito/contentProcess.js</contentProcess>
       <hasDependentRecords v="true" />
       <onInsert>%aditoprj%/entity/MSTTeamMember_entity/recordcontainers/jdito/onInsert.js</onInsert>
+      <onDelete>%aditoprj%/entity/MSTTeamMember_entity/recordcontainers/jdito/onDelete.js</onDelete>
       <recordFieldMappings>
         <jDitoRecordFieldMapping>
           <name>UID.value</name>
@@ -95,6 +100,9 @@
         <jDitoRecordFieldMapping>
           <name>MEMBERNAME.value</name>
         </jDitoRecordFieldMapping>
+        <jDitoRecordFieldMapping>
+          <name>MEMBER.displayValue</name>
+        </jDitoRecordFieldMapping>
       </recordFieldMappings>
     </jDitoRecordContainer>
   </recordContainers>
diff --git a/entity/MSTTeamMember_entity/entityfields/member/displayValueProcess.js b/entity/MSTTeamMember_entity/entityfields/member/displayValueProcess.js
new file mode 100644
index 00000000000..7100366cb2e
--- /dev/null
+++ b/entity/MSTTeamMember_entity/entityfields/member/displayValueProcess.js
@@ -0,0 +1,5 @@
+import("system.result");
+import("system.vars");
+
+if (vars.get("$field.MEMBERNAME"))
+    result.string(vars.get("$field.MEMBERNAME"));
\ No newline at end of file
diff --git a/entity/MSTTeamMember_entity/entityfields/member/stateProcess.js b/entity/MSTTeamMember_entity/entityfields/member/stateProcess.js
new file mode 100644
index 00000000000..53c48b1aa60
--- /dev/null
+++ b/entity/MSTTeamMember_entity/entityfields/member/stateProcess.js
@@ -0,0 +1,5 @@
+import("system.result");
+import("system.neon");
+import("system.vars");
+
+result.string(vars.get("$field.MEMBERNAME") ? neon.COMPONENTSTATE_READONLY : neon.COMPONENTSTATE_EDITABLE);
\ No newline at end of file
diff --git a/entity/MSTTeamMember_entity/entityfields/role_or_invite/mandatoryProcess.js b/entity/MSTTeamMember_entity/entityfields/role_or_invite/mandatoryProcess.js
new file mode 100644
index 00000000000..8be1684334b
--- /dev/null
+++ b/entity/MSTTeamMember_entity/entityfields/role_or_invite/mandatoryProcess.js
@@ -0,0 +1,4 @@
+import("system.result");
+import("system.vars");
+
+result.string(!vars.get("$field.MEMBERNAME"));
\ No newline at end of file
diff --git a/entity/MSTTeamMember_entity/entityfields/role_or_invite/stateProcess.js b/entity/MSTTeamMember_entity/entityfields/role_or_invite/stateProcess.js
new file mode 100644
index 00000000000..8d5def7b923
--- /dev/null
+++ b/entity/MSTTeamMember_entity/entityfields/role_or_invite/stateProcess.js
@@ -0,0 +1,5 @@
+import("system.result");
+import("system.vars");
+import("system.neon");
+
+result.string(vars.get("$field.MEMBERNAME") ? neon.COMPONENTSTATE_INVISIBLE : neon.COMPONENTSTATE_EDITABLE);
\ No newline at end of file
diff --git a/entity/MSTTeamMember_entity/recordcontainers/jdito/contentProcess.js b/entity/MSTTeamMember_entity/recordcontainers/jdito/contentProcess.js
index e053d9286a0..421591be234 100644
--- a/entity/MSTTeamMember_entity/recordcontainers/jdito/contentProcess.js
+++ b/entity/MSTTeamMember_entity/recordcontainers/jdito/contentProcess.js
@@ -1,22 +1,23 @@
+import("system.teams");
 import("system.result");
 import("system.vars");
 
 var teamId = vars.get("$param.MSTTeamId_param");
-var allMembers = teams.getAllMembers(teamId);
+var allMembers = teamId ? teams.getAllMembers(teamId) : {};
 var memberArray = [];
 
 if (vars.get("$local.idvalues"))
 {
     memberArray = vars.get("$local.idvalues").map(function (memberId) 
     {
-        return [memberId, allMembers[memberId]];
+        return [memberId, allMembers[memberId], allMembers[memberId]];
     });   
 }
 else
 {
     for (let memberId in allMembers)
     {
-        memberArray.push([memberId, allMembers[memberId]]);
+        memberArray.push([memberId, allMembers[memberId], allMembers[memberId]]);
     }
 }
 
diff --git a/entity/MSTTeamMember_entity/recordcontainers/jdito/onDelete.js b/entity/MSTTeamMember_entity/recordcontainers/jdito/onDelete.js
new file mode 100644
index 00000000000..d2ca20dd991
--- /dev/null
+++ b/entity/MSTTeamMember_entity/recordcontainers/jdito/onDelete.js
@@ -0,0 +1 @@
+var e = "e";
\ No newline at end of file
diff --git a/entity/MSTTeamMember_entity/recordcontainers/jdito/onInsert.js b/entity/MSTTeamMember_entity/recordcontainers/jdito/onInsert.js
index 0ffe832f7cd..c776217e340 100644
--- a/entity/MSTTeamMember_entity/recordcontainers/jdito/onInsert.js
+++ b/entity/MSTTeamMember_entity/recordcontainers/jdito/onInsert.js
@@ -1,57 +1,2 @@
-import("system.teams");
-import("Sql_lib");
-import("system.vars");
-import("system.question");
-
-var teamId = newSelect("MST_TEAMID")
-    .from("MST_TEAM")
-    .where("MST_TEAM.OBJECT_ROWID", vars.get("$param.ROWID_param"))
-    .cell();
-    
-var rowData = vars.get("$local.rowdata");
-
-var upnsOfMembers = text.decodeMS(rowData["UPNSOFMEMBERS.value"]);
-var areTheseOwners = rowData["ARETHESEOWNERS.value"];
-var mailsOfExtern = text.decodeMS(rowData["MAILSOFEXTERN.value"]);
-var sendInvitation = rowData["EXTERN.value"];
-var failedInternUsers;
-var failedExternUsers;
-
-if(upnsOfMembers != "")
-{
-    if(areTheseOwners == 1)
-    {
-        failedUsers = teams.addMembers(teamId, upnsOfMembers, true);
-        if(failedUsers != null)
-            {
-                question.showMessage(failedUsers, "FailedUsers");
-            }
-    }
-    else
-    {
-        failedUsers = teams.addMembers(teamId, upnsOfMembers, false);
-        if(failedUsers != null)
-            {
-                question.showMessage(failedUsers, "FailedUsers");
-            }
-    }
-}
-if(mailsOfExtern != "")
-{
-    if(sendInvitation == 1)
-    {
-        failedExternUsers = teams.addExternMembers(teamId, mailsOfExtern, true);
-        if(failedExternUsers != null)
-            {
-                question.showMessage(failedExternUsers, "FailedExternUsers");
-            }
-    }
-    else
-    {
-        failedExternUsers = teams.addExternMembers(teamId, mailsOfExtern, false);
-        if(failedExternUsers != null)
-            {
-                question.showMessage(failedExternUsers, "FailedExternUsers");
-            }
-    }
-}
+//inserting is done in the MSTTeam_entity
+var dummy = "dummy";
\ No newline at end of file
diff --git a/entity/MSTTeam_entity/MSTTeam_entity.aod b/entity/MSTTeam_entity/MSTTeam_entity.aod
index ef6acef77cd..07657f65968 100644
--- a/entity/MSTTeam_entity/MSTTeam_entity.aod
+++ b/entity/MSTTeam_entity/MSTTeam_entity.aod
@@ -2,6 +2,9 @@
 <entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.14" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.14">
   <name>MSTTeam_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
+  <siblings>
+    <element>Salesproject_entity</element>
+  </siblings>
   <contentTitleProcess>%aditoprj%/entity/MSTTeam_entity/contentTitleProcess.js</contentTitleProcess>
   <recordContainer>jdito</recordContainer>
   <entityFields>
@@ -23,6 +26,7 @@
     <entityField>
       <name>TEAMNAME</name>
       <title>Name</title>
+      <stateProcess>%aditoprj%/entity/MSTTeam_entity/entityfields/teamname/stateProcess.js</stateProcess>
       <valueProcess>%aditoprj%/entity/MSTTeam_entity/entityfields/teamname/valueProcess.js</valueProcess>
     </entityField>
     <entityField>
@@ -47,24 +51,6 @@
       <name>Mailnickname_param</name>
       <expose v="true" />
     </entityParameter>
-    <entityConsumer>
-      <name>MemberComsumer</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Member_entity</entityName>
-        <fieldName>TeamMemberProvider</fieldName>
-      </dependency>
-      <children>
-        <entityParameter>
-          <name>ObjectRowId_param</name>
-          <valueProcess>%aditoprj%/entity/MSTTeam_entity/entityfields/membercomsumer/children/objectrowid_param/valueProcess.js</valueProcess>
-        </entityParameter>
-        <entityParameter>
-          <name>ObjectType_param</name>
-          <valueProcess>%aditoprj%/entity/MSTTeam_entity/entityfields/membercomsumer/children/objecttype_param/valueProcess.js</valueProcess>
-        </entityParameter>
-      </children>
-    </entityConsumer>
     <entityConsumer>
       <name>TeamMembers</name>
       <dependency>
@@ -95,6 +81,7 @@
       <isRequireContainerFiltering v="true" />
       <contentProcess>%aditoprj%/entity/MSTTeam_entity/recordcontainers/jdito/contentProcess.js</contentProcess>
       <onInsert>%aditoprj%/entity/MSTTeam_entity/recordcontainers/jdito/onInsert.js</onInsert>
+      <onUpdate>%aditoprj%/entity/MSTTeam_entity/recordcontainers/jdito/onUpdate.js</onUpdate>
       <recordFieldMappings>
         <jDitoRecordFieldMapping>
           <name>UID.value</name>
diff --git a/entity/MSTTeam_entity/entityfields/description/stateProcess.js b/entity/MSTTeam_entity/entityfields/description/stateProcess.js
new file mode 100644
index 00000000000..18f779e6910
--- /dev/null
+++ b/entity/MSTTeam_entity/entityfields/description/stateProcess.js
@@ -0,0 +1,5 @@
+import("system.result");
+import("system.vars");
+import("system.neon");
+
+result.string(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW ? neon.COMPONENTSTATE_EDITABLE : neon.COMPONENTSTATE_READONLY);
\ No newline at end of file
diff --git a/entity/MSTTeam_entity/entityfields/membercomsumer/children/objecttype_param/valueProcess.js b/entity/MSTTeam_entity/entityfields/membercomsumer/children/objecttype_param/valueProcess.js
deleted file mode 100644
index 32bdd9f268d..00000000000
--- a/entity/MSTTeam_entity/entityfields/membercomsumer/children/objecttype_param/valueProcess.js
+++ /dev/null
@@ -1,3 +0,0 @@
-import("system.result");
-
-result.string("Salesproject");
\ No newline at end of file
diff --git a/entity/MSTTeam_entity/entityfields/teammembers/children/mstteamid_param/valueProcess.js b/entity/MSTTeam_entity/entityfields/teammembers/children/mstteamid_param/valueProcess.js
index 16c85500b53..7b7daa293fe 100644
--- a/entity/MSTTeam_entity/entityfields/teammembers/children/mstteamid_param/valueProcess.js
+++ b/entity/MSTTeam_entity/entityfields/teammembers/children/mstteamid_param/valueProcess.js
@@ -1,4 +1,6 @@
 import("system.vars");
 import("system.result");
+import("system.neon");
 
-result.string(vars.get("$field.UID"));
\ No newline at end of file
+if (vars.get("$sys.recordstate") != neon.OPERATINGSTATE_NEW && vars.get("$field.TEAMID_AND_NAME"))
+    result.string(vars.get("$field.UID"));
\ No newline at end of file
diff --git a/entity/MSTTeam_entity/entityfields/teamname/stateProcess.js b/entity/MSTTeam_entity/entityfields/teamname/stateProcess.js
new file mode 100644
index 00000000000..18f779e6910
--- /dev/null
+++ b/entity/MSTTeam_entity/entityfields/teamname/stateProcess.js
@@ -0,0 +1,5 @@
+import("system.result");
+import("system.vars");
+import("system.neon");
+
+result.string(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW ? neon.COMPONENTSTATE_EDITABLE : neon.COMPONENTSTATE_READONLY);
\ No newline at end of file
diff --git a/entity/MSTTeam_entity/recordcontainers/jdito/onInsert.js b/entity/MSTTeam_entity/recordcontainers/jdito/onInsert.js
index 1c888474dd6..9e9c547d317 100644
--- a/entity/MSTTeam_entity/recordcontainers/jdito/onInsert.js
+++ b/entity/MSTTeam_entity/recordcontainers/jdito/onInsert.js
@@ -1,86 +1,72 @@
-import("system.logging");
+import("Communication_lib");
 import("Sql_lib");
 import("system.vars");
 import("system.teams");
-import("system.text");
-import("system.util");
-import("system.neon");
+import("system.tools");
+import("Employee_lib");
 
 var rowData = vars.get("$local.rowdata");
 var teamName = rowData["TEAMNAME.value"];
-var mailNickname = vars.get("$param.Mailnickname_param");
-
 var description = rowData["DESCRIPTION.value"];
-var upnsOfOwners = text.decodeMS(rowData["UPNSOFOWNERS.value"]);
-
-var users = [];
+var teamMembers = vars.get("$field.TeamMembers.insertedRows");
 
-for(var i = 0; i<upnsOfMembers.length(); i++)
+var ownerIds = [];
+var internalMembers = [];
+var externalMembers = [];
+teamMembers.forEach(function (teamMember)
+{
+    var memberUser = EmployeeUtils.getUserByContactId(teamMember.MEMBER);
+    if (!memberUser)
     {
-        var user = createInternalUserConfig(upnsOfMembers[i])
-        if(isOwner)
+        var memberEmail = CommUtil.getStandardMail(teamMember.MEMBER);
+        if (memberEmail)
         {
-            user.setOwner(isOwner);
+            externalMembers.push(
+                teams.createExternalUserConfig(memberEmail)
+                    .sendInvitation(teamMember.ROLE_OR_INVITE == "invite")
+            );
         }
-        
-        users.push(user);
+        return;
     }
-    
-    teams.addMembers(users);
-
-var teamData;
-if(upnsOfOwners)
-{
-    teamData = teams.createTeam(teamName, description, mailNickname, true, false, upnsOfOwners);
-}
-if(teamData)
-{
-    var failedUsers;
-    var failedExternUsers;
-    
-    if(upnsOfMembers != "")
+    var memberAzureId = memberUser[tools.PARAMS][tools.TEAMS_AZUREID];
+    var memberUpn = memberUser[tools.PARAMS][tools.TEAMS_AZUREUPN];
+    if (!memberAzureId && memberUpn)
+        memberAzureId = teams.getInternalAzureId(memberUpn);
+    if (memberAzureId)
     {
-        failedUsers = teams.addMembers(teamData["teamId"], upnsOfMembers, false);
-        if(failedUsers != null)
-            {
-                question.showMessage(failedUsers, "FailedUsers");
-            }
+        if (teamMember.ROLE_OR_INVITE == "isOwner")
+            ownerIds.push(memberAzureId);
+        else
+            internalMembers.push(teams.createInternalUserConfig(memberAzureId));
     }
-    
-    if(mailsOfExtern != "")
-    {
-        if(sendInvitation == 1)
-        {
-            failedExternUsers = teams.addExternMembers(teamData["teamId"], mailsOfExtern, true);
-            if(failedExternUsers != null)
-            {
-                question.showMessage(failedExternUsers, "FailedExternUsers");
-            }
+});
 
-        }
-        else
-        {
-            failedExternUsers = teams.addExternMembers(teamData["teamId"], mailsOfExtern, false);
-            if(failedExternUsers != null)
-            {
-                question.showMessage(failedExternUsers, "FailedExternUsers");
-            }
+//mailNickName = teamName in camel case
+var mailNickName = teamName.replace(/(?:^\w|[A-Z]|\b\w|\s+)/g, function(match, index) 
+{
+    if (+match === 0) return ""; // or if (/\s+/.test(match)) for white spaces
+    return index === 0 ? match.toLowerCase() : match.toUpperCase();
+});
 
-        }
-    }
+var groupConfig = teams.createGroupConfig(teamName, mailNickName, ownerIds);
+if (description)
+    groupConfig.setDescription(description);
+var teamConfig = teams.createTeamConfig();
+
+var mstTeam = teams.createTeam(groupConfig, teamConfig);
+
+if (internalMembers.length !== 0)
+    teams.addInternalMembers(mstTeam.teamId, internalMembers);
 
-    var teamId = teamData["teamId"];
-    teamName = teamData["teamName"];
-    var channelId = teamData["generalChannelId"];
-    var webUrl = teamData["webUrl"]
+if (externalMembers.length !== 0)
+    teams.addExternalMembers(mstTeam.teamId, externalMembers);
 
+new SqlBuilder().insertFields({
+    "MST_TEAMID" : mstTeam.teamId,
+    "TEAMNAME" : mstTeam.teamName,
+    "GENERAL_CHANNELID" : mstTeam.generalChannelId,
+    "IS_ARCHIVED" : 0
+}, "MST_TEAM");
 
-    new SqlBuilder().insertFields({
-        "MST_ID" : util.getNewUUID(),
-        "MST_TEAMID" : teamId,
-        "TEAMNAME" : teamName,
-        "GENERAL_CHANNELID" : channelId,
-        "OBJECT_ROWID" : vars.get("$param.RowId_param"),
-        "IS_ARCHIVED" : 0
-    }, "MST_TEAM");
-}
+newWhere("SALESPROJECT.SALESPROJECTID", "$param.SalesprojectId_param")
+    .updateFields({"MST_TEAM_ID" : mstTeam.teamId});
\ No newline at end of file
diff --git a/entity/MSTTeam_entity/recordcontainers/jdito/onUpdate.js b/entity/MSTTeam_entity/recordcontainers/jdito/onUpdate.js
new file mode 100644
index 00000000000..f00f1817d78
--- /dev/null
+++ b/entity/MSTTeam_entity/recordcontainers/jdito/onUpdate.js
@@ -0,0 +1,54 @@
+import("Communication_lib");
+import("Sql_lib");
+import("system.vars");
+import("system.teams");
+import("system.tools");
+import("Employee_lib");
+
+var rowData = vars.get("$local.rowdata");
+var teamId = rowData["UID.value"];
+var teamName = rowData["TEAMNAME.value"];
+var description = rowData["DESCRIPTION.value"];
+var insertedTeamMembers = vars.get("$field.TeamMembers.insertedRows");
+var deletedTeamMembers = vars.get("$field.TeamMembers.deletedRows");
+
+var internalMembers = [];
+var externalMembers = [];
+insertedTeamMembers.forEach(function (teamMember)
+{
+    var memberUser = EmployeeUtils.getUserByContactId(teamMember.MEMBER);
+    if (!memberUser)
+    {
+        var memberEmail = CommUtil.getStandardMail(teamMember.MEMBER);
+        if (memberEmail)
+        {
+            externalMembers.push(
+                teams.createExternalUserConfig(memberEmail)
+                    .sendInvitation(teamMember.ROLE_OR_INVITE == "invite")
+            );
+        }
+        return;
+    }
+    var memberAzureId = memberUser[tools.PARAMS][tools.TEAMS_AZUREID];
+    var memberUpn = memberUser[tools.PARAMS][tools.TEAMS_AZUREUPN];
+    if (!memberAzureId && memberUpn)
+        memberAzureId = teams.getInternalAzureId(memberUpn);
+    if (memberAzureId)
+    {
+        internalMembers.push(teams.createInternalUserConfig(memberAzureId).setOwner(teamMember.ROLE_OR_INVITE == "isOwner"));
+    }
+});
+
+if (internalMembers.length !== 0)
+    teams.addInternalMembers(teamId, internalMembers);
+
+if (externalMembers.length !== 0)
+    teams.addExternalMembers(teamId, externalMembers);
+
+var removeMembers = deletedTeamMembers.map(function (member)
+{
+    return teams.createInternalUserConfig(member["#UID"]);
+});
+
+if (removeMembers.length !== 0)
+    teams.removeInternalMembers(teamId, removeMembers);
\ No newline at end of file
diff --git a/entity/Member_entity/Member_entity.aod b/entity/Member_entity/Member_entity.aod
index b09487acaec..f3d8bec1a1e 100644
--- a/entity/Member_entity/Member_entity.aod
+++ b/entity/Member_entity/Member_entity.aod
@@ -4,6 +4,7 @@
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <documentation>%aditoprj%/entity/Member_entity/documentation.adoc</documentation>
   <title>${SALESPROJECT_MEMBER}</title>
+  <siblings />
   <contentTitleProcess>%aditoprj%/entity/Member_entity/contentTitleProcess.js</contentTitleProcess>
   <iconId>VAADIN:FILE_SOUND</iconId>
   <titlePlural>${SALESPROJECT_MEMBER}</titlePlural>
@@ -215,6 +216,12 @@
           <stateProcess>%aditoprj%/entity/Member_entity/entityfields/msteamsactiongroup/children/createteam/stateProcess.js</stateProcess>
           <tooltip>Erstelle ein neues MicrosoftTeams Team</tooltip>
         </entityActionField>
+        <entityActionField>
+          <name>editTeam</name>
+          <title>Edit Teams Group</title>
+          <onActionProcess>%aditoprj%/entity/Member_entity/entityfields/msteamsactiongroup/children/editteam/onActionProcess.js</onActionProcess>
+          <iconId>NEON:PENCIL</iconId>
+        </entityActionField>
         <entityActionField>
           <name>addNewMember</name>
           <title>Add members</title>
@@ -227,6 +234,7 @@
           <name>deleteMember</name>
           <title>Delete members</title>
           <iconId>VAADIN:USER</iconId>
+          <stateProcess>%aditoprj%/entity/Member_entity/entityfields/msteamsactiongroup/children/deletemember/stateProcess.js</stateProcess>
         </entityActionField>
         <entityActionField>
           <name>addApp</name>
@@ -273,12 +281,6 @@
       <name>TeamMemberProvider</name>
       <lookupIdfield>CONTACT_ID</lookupIdfield>
       <dependencies>
-        <entityDependency>
-          <name>80ac002b-2d74-4cfb-a504-347f8abfd7eb</name>
-          <entityName>MSTTeam_entity</entityName>
-          <fieldName>MemberComsumer</fieldName>
-          <isConsumer v="false" />
-        </entityDependency>
         <entityDependency>
           <name>373a0c5c-dff5-4a6d-9a1f-68d7b73804ce</name>
           <entityName>MSTTeamMember_entity</entityName>
@@ -287,6 +289,10 @@
         </entityDependency>
       </dependencies>
     </entityProvider>
+    <entityParameter>
+      <name>MST_TeamId_param</name>
+      <expose v="true" />
+    </entityParameter>
   </entityFields>
   <recordContainers>
     <dbRecordContainer>
diff --git a/entity/Member_entity/entityfields/msteamsactiongroup/children/addapp/stateProcess.js b/entity/Member_entity/entityfields/msteamsactiongroup/children/addapp/stateProcess.js
index 63fdd66eafb..0bcfd015460 100644
--- a/entity/Member_entity/entityfields/msteamsactiongroup/children/addapp/stateProcess.js
+++ b/entity/Member_entity/entityfields/msteamsactiongroup/children/addapp/stateProcess.js
@@ -3,20 +3,16 @@ import("system.neon");
 import("system.result");
 import("Sql_lib");
 
-var teamId = newSelect("MST_TEAMID")
-    .from("MST_TEAM")
-    .where("MST_TEAM.OBJECT_ROWID", "$param.ObjectRowId_param")
-    .cell();
+var teamId = vars.exists("$param.MST_TeamId_param") ? vars.get("$param.MST_TeamId_param") : null;
 
-var isArchived = newSelect("IS_ARCHIVED")
-    .from("MST_TEAM")
-    .where("MST_TEAM.OBJECT_ROWID", "$param.ObjectRowId_param")
-    .cell();
-    
-var serviceUrl = newSelect("SERVICE_URL")
+var isArchived, serviceUrl;
+var teamData = newSelect("IS_ARCHIVED, SERVICE_URL")
     .from("MST_TEAM")
-    .where("MST_TEAM.OBJECT_ROWID", "$param.ObjectRowId_param")
-    .cell();
+    .whereIfSet("MST_TEAM.MST_TEAMID", teamId)
+    .arrayRow(true);
+
+if (teamData)
+    [isArchived, serviceUrl] = teamData;
 
     
 if (teamId == "" || isArchived == 1 || serviceUrl) 
diff --git a/entity/Member_entity/entityfields/msteamsactiongroup/children/addnewmember/stateProcess.js b/entity/Member_entity/entityfields/msteamsactiongroup/children/addnewmember/stateProcess.js
index caeb254eb7d..90deb206fd1 100644
--- a/entity/Member_entity/entityfields/msteamsactiongroup/children/addnewmember/stateProcess.js
+++ b/entity/Member_entity/entityfields/msteamsactiongroup/children/addnewmember/stateProcess.js
@@ -3,15 +3,12 @@ import("system.neon");
 import("system.result");
 import("Sql_lib");
 
-var teamId = newSelect("MST_TEAMID")
-    .from("MST_TEAM")
-    .where("MST_TEAM.OBJECT_ROWID", "$param.ObjectRowId_param")
-    .cell();
+var teamId = vars.exists("$param.MST_TeamId_param") ? vars.get("$param.MST_TeamId_param") : null;
 
 var isArchived = newSelect("IS_ARCHIVED")
     .from("MST_TEAM")
-    .where("MST_TEAM.OBJECT_ROWID", "$param.ObjectRowId_param")
-    .cell();
+    .whereIfSet("MST_TEAM.MST_TEAMID", teamId)
+    .cell(true);
     
 if (teamId == "" || isArchived == 1) 
 {
diff --git a/entity/Member_entity/entityfields/msteamsactiongroup/children/changetomsteam/onActionProcess.js b/entity/Member_entity/entityfields/msteamsactiongroup/children/changetomsteam/onActionProcess.js
index d58faeca5c3..8359835837a 100644
--- a/entity/Member_entity/entityfields/msteamsactiongroup/children/changetomsteam/onActionProcess.js
+++ b/entity/Member_entity/entityfields/msteamsactiongroup/children/changetomsteam/onActionProcess.js
@@ -4,7 +4,8 @@ import("system.neon");
 
 var webUrl = newSelect("WEB_URL")
     .from("MST_TEAM")
-    .where("MST_TEAM.OBJECT_ROWID", vars.get("$field.OBJECT_ROWID"))
-    .cell();
+    .whereIfSet("MST_TEAM.MST_TEAMID", "$param.MST_TeamId_param")
+    .cell(true);
 
-neon.openUrl(url, true)
+if (webUrl)
+    neon.openUrl(webUrl, true);
diff --git a/entity/Member_entity/entityfields/msteamsactiongroup/children/changetomsteam/stateProcess.js b/entity/Member_entity/entityfields/msteamsactiongroup/children/changetomsteam/stateProcess.js
index caeb254eb7d..90deb206fd1 100644
--- a/entity/Member_entity/entityfields/msteamsactiongroup/children/changetomsteam/stateProcess.js
+++ b/entity/Member_entity/entityfields/msteamsactiongroup/children/changetomsteam/stateProcess.js
@@ -3,15 +3,12 @@ import("system.neon");
 import("system.result");
 import("Sql_lib");
 
-var teamId = newSelect("MST_TEAMID")
-    .from("MST_TEAM")
-    .where("MST_TEAM.OBJECT_ROWID", "$param.ObjectRowId_param")
-    .cell();
+var teamId = vars.exists("$param.MST_TeamId_param") ? vars.get("$param.MST_TeamId_param") : null;
 
 var isArchived = newSelect("IS_ARCHIVED")
     .from("MST_TEAM")
-    .where("MST_TEAM.OBJECT_ROWID", "$param.ObjectRowId_param")
-    .cell();
+    .whereIfSet("MST_TEAM.MST_TEAMID", teamId)
+    .cell(true);
     
 if (teamId == "" || isArchived == 1) 
 {
diff --git a/entity/Member_entity/entityfields/msteamsactiongroup/children/chooseteam/stateProcess.js b/entity/Member_entity/entityfields/msteamsactiongroup/children/chooseteam/stateProcess.js
index 5b3ec6b0fb2..c2d3d1fee36 100644
--- a/entity/Member_entity/entityfields/msteamsactiongroup/children/chooseteam/stateProcess.js
+++ b/entity/Member_entity/entityfields/msteamsactiongroup/children/chooseteam/stateProcess.js
@@ -1,11 +1,8 @@
 import("system.vars");
 import("system.neon");
 import("system.result");
-import("Sql_lib");
 
-var teamId = newSelect("MST_TEAMID")
-    .from("MST_TEAM")
-    .where("MST_TEAM.OBJECT_ROWID", "$param.ObjectRowId_param")
-    .cell();
-    
-result.string(teamId != "" ? neon.COMPONENTSTATE_DISABLED : neon.COMPONENTSTATE_EDITABLE);
\ No newline at end of file
+result.string(vars.exists("$param.MST_TeamId_param") && vars.get("$param.MST_TeamId_param") 
+    ? neon.COMPONENTSTATE_DISABLED 
+    : neon.COMPONENTSTATE_EDITABLE
+);
\ No newline at end of file
diff --git a/entity/Member_entity/entityfields/msteamsactiongroup/children/createteam/stateProcess.js b/entity/Member_entity/entityfields/msteamsactiongroup/children/createteam/stateProcess.js
index 12b3c6edaaa..c2d3d1fee36 100644
--- a/entity/Member_entity/entityfields/msteamsactiongroup/children/createteam/stateProcess.js
+++ b/entity/Member_entity/entityfields/msteamsactiongroup/children/createteam/stateProcess.js
@@ -1,11 +1,8 @@
 import("system.vars");
 import("system.neon");
 import("system.result");
-import("Sql_lib");
 
-var teamId = newSelect("MST_TEAMID")
-    .from("MST_TEAM")
-    .where("MST_TEAM.OBJECT_ROWID", "$param.ObjectRowId_param")
-    .cell();
-
-result.string(teamId != "" ? neon.COMPONENTSTATE_DISABLED : neon.COMPONENTSTATE_EDITABLE);
\ No newline at end of file
+result.string(vars.exists("$param.MST_TeamId_param") && vars.get("$param.MST_TeamId_param") 
+    ? neon.COMPONENTSTATE_DISABLED 
+    : neon.COMPONENTSTATE_EDITABLE
+);
\ No newline at end of file
diff --git a/entity/Member_entity/entityfields/msteamsactiongroup/children/deletemember/stateProcess.js b/entity/Member_entity/entityfields/msteamsactiongroup/children/deletemember/stateProcess.js
new file mode 100644
index 00000000000..90deb206fd1
--- /dev/null
+++ b/entity/Member_entity/entityfields/msteamsactiongroup/children/deletemember/stateProcess.js
@@ -0,0 +1,20 @@
+import("system.vars");
+import("system.neon");
+import("system.result");
+import("Sql_lib");
+
+var teamId = vars.exists("$param.MST_TeamId_param") ? vars.get("$param.MST_TeamId_param") : null;
+
+var isArchived = newSelect("IS_ARCHIVED")
+    .from("MST_TEAM")
+    .whereIfSet("MST_TEAM.MST_TEAMID", teamId)
+    .cell(true);
+    
+if (teamId == "" || isArchived == 1) 
+{
+    result.string(neon.COMPONENTSTATE_DISABLED);
+}
+else
+{
+    result.string(neon.COMPONENTSTATE_EDITABLE);
+}
\ No newline at end of file
diff --git a/entity/Member_entity/entityfields/msteamsactiongroup/children/deleteteam/stateProcess.js b/entity/Member_entity/entityfields/msteamsactiongroup/children/deleteteam/stateProcess.js
index 9bc72a1c164..90deb206fd1 100644
--- a/entity/Member_entity/entityfields/msteamsactiongroup/children/deleteteam/stateProcess.js
+++ b/entity/Member_entity/entityfields/msteamsactiongroup/children/deleteteam/stateProcess.js
@@ -3,15 +3,12 @@ import("system.neon");
 import("system.result");
 import("Sql_lib");
 
-var teamId = newSelect("MST_TEAMID")
-    .from("MST_TEAM")
-    .where("MST_TEAM.OBJECT_ROWID", "$param.ObjectRowId_param")
-    .cell();
-    
+var teamId = vars.exists("$param.MST_TeamId_param") ? vars.get("$param.MST_TeamId_param") : null;
+
 var isArchived = newSelect("IS_ARCHIVED")
     .from("MST_TEAM")
-    .where("MST_TEAM.OBJECT_ROWID", "$param.ObjectRowId_param")
-    .cell();
+    .whereIfSet("MST_TEAM.MST_TEAMID", teamId)
+    .cell(true);
     
 if (teamId == "" || isArchived == 1) 
 {
@@ -19,5 +16,5 @@ if (teamId == "" || isArchived == 1)
 }
 else
 {
-result.string(neon.COMPONENTSTATE_EDITABLE);
-}
+    result.string(neon.COMPONENTSTATE_EDITABLE);
+}
\ No newline at end of file
diff --git a/entity/Member_entity/entityfields/msteamsactiongroup/children/editteam/onActionProcess.js b/entity/Member_entity/entityfields/msteamsactiongroup/children/editteam/onActionProcess.js
new file mode 100644
index 00000000000..7e7282b01af
--- /dev/null
+++ b/entity/Member_entity/entityfields/msteamsactiongroup/children/editteam/onActionProcess.js
@@ -0,0 +1,9 @@
+import("system.vars");
+import("system.neon");
+
+var rowId = vars.get("$param.ObjectRowId_param");
+var teamId = vars.get("$param.MST_TeamId_param");
+
+neon.openContext("MSTTeam", "MSTTeamEditMembers_view", [teamId], neon.OPERATINGSTATE_EDIT, {
+    "SalesprojectId_param" : rowId
+});
\ No newline at end of file
diff --git a/entity/Member_entity/entityfields/msteamsactiongroup/children/restoreteam/stateProcess.js b/entity/Member_entity/entityfields/msteamsactiongroup/children/restoreteam/stateProcess.js
index a677c8bdded..724a77951db 100644
--- a/entity/Member_entity/entityfields/msteamsactiongroup/children/restoreteam/stateProcess.js
+++ b/entity/Member_entity/entityfields/msteamsactiongroup/children/restoreteam/stateProcess.js
@@ -3,15 +3,12 @@ import("system.neon");
 import("system.result");
 import("Sql_lib");
 
-var teamId = newSelect("MST_TEAMID")
-    .from("MST_TEAM")
-    .where("MST_TEAM.OBJECT_ROWID", "$param.ObjectRowId_param")
-    .cell();
+var teamId = vars.exists("$param.MST_TeamId_param") ? vars.get("$param.MST_TeamId_param") : null;
 
 var isArchived = newSelect("IS_ARCHIVED")
     .from("MST_TEAM")
-    .where("MST_TEAM.OBJECT_ROWID", "$param.ObjectRowId_param")
-    .cell();
+    .whereIfSet("MST_TEAM.MST_TEAMID", teamId)
+    .cell(true);
     
 if (teamId == "" || isArchived == 0) 
 {
diff --git a/entity/Member_entity/entityfields/msteamsactiongroup/stateProcess.js b/entity/Member_entity/entityfields/msteamsactiongroup/stateProcess.js
index 15e4ead9122..44ae892f222 100644
--- a/entity/Member_entity/entityfields/msteamsactiongroup/stateProcess.js
+++ b/entity/Member_entity/entityfields/msteamsactiongroup/stateProcess.js
@@ -2,9 +2,9 @@ import("system.neon");
 import("system.result");
 import("system.project");
 
-var isTeamsEnabled = project.getInstanceConfigValue(teamsIsEnabled, null);
+var isTeamsEnabled = project.getInstanceConfigValue("teamsEnabled", null);
 
-if(isTeamsEnabled)
+if (isTeamsEnabled == "true")
 {
     result.string(neon.COMPONENTSTATE_EDITABLE);
 }
diff --git a/entity/Salesproject_entity/Salesproject_entity.aod b/entity/Salesproject_entity/Salesproject_entity.aod
index 9eb593cb398..8dbbbb12297 100644
--- a/entity/Salesproject_entity/Salesproject_entity.aod
+++ b/entity/Salesproject_entity/Salesproject_entity.aod
@@ -269,6 +269,10 @@
           <valueProcess>%aditoprj%/entity/Salesproject_entity/entityfields/members/children/objecttype_param/valueProcess.js</valueProcess>
           <expose v="true" />
         </entityParameter>
+        <entityParameter>
+          <name>MST_TeamId_param</name>
+          <valueProcess>%aditoprj%/entity/Salesproject_entity/entityfields/members/children/mst_teamid_param/valueProcess.js</valueProcess>
+        </entityParameter>
       </children>
     </entityConsumer>
     <entityActionField>
diff --git a/entity/MSTTeam_entity/entityfields/membercomsumer/children/objectrowid_param/valueProcess.js b/entity/Salesproject_entity/entityfields/members/children/mst_teamid_param/valueProcess.js
similarity index 51%
rename from entity/MSTTeam_entity/entityfields/membercomsumer/children/objectrowid_param/valueProcess.js
rename to entity/Salesproject_entity/entityfields/members/children/mst_teamid_param/valueProcess.js
index 90824419458..5abe4091396 100644
--- a/entity/MSTTeam_entity/entityfields/membercomsumer/children/objectrowid_param/valueProcess.js
+++ b/entity/Salesproject_entity/entityfields/members/children/mst_teamid_param/valueProcess.js
@@ -1,4 +1,4 @@
 import("system.result");
 import("system.vars");
 
-result.string(vars.get("$param.RowId_param"));
\ No newline at end of file
+result.string(vars.get("$field.MST_TEAM_ID"));
\ No newline at end of file
diff --git a/neonContext/MSTTeam/MSTTeam.aod b/neonContext/MSTTeam/MSTTeam.aod
index dfbc6c73f30..7f715ccd447 100644
--- a/neonContext/MSTTeam/MSTTeam.aod
+++ b/neonContext/MSTTeam/MSTTeam.aod
@@ -14,5 +14,9 @@
       <name>c13c234d-ee98-4a26-b7b1-8ee3a3829284</name>
       <view>MSTTeamPreview_view</view>
     </neonViewReference>
+    <neonViewReference>
+      <name>b1e14c73-f48f-43a7-a459-2aa0172d015b</name>
+      <view>MSTTeamEditMembers_view</view>
+    </neonViewReference>
   </references>
 </neonContext>
diff --git a/neonContext/MSTTeamMember/MSTTeamMember.aod b/neonContext/MSTTeamMember/MSTTeamMember.aod
index 776c9d9bfab..66b94ef39e0 100644
--- a/neonContext/MSTTeamMember/MSTTeamMember.aod
+++ b/neonContext/MSTTeamMember/MSTTeamMember.aod
@@ -13,5 +13,9 @@
       <name>61588d12-3c0d-4181-93ae-90d7ad50ed6b</name>
       <view>MSTTeamMemberMultiEdit_view</view>
     </neonViewReference>
+    <neonViewReference>
+      <name>b740066a-2d33-4bc4-ba5f-3e4a68418575</name>
+      <view>MSTTeamMemberList_view</view>
+    </neonViewReference>
   </references>
 </neonContext>
diff --git a/neonView/MSTTeamAddMembersEdit_view/MSTTeamAddMembersEdit_view.aod b/neonView/MSTTeamAddMembersEdit_view/MSTTeamAddMembersEdit_view.aod
index 90b0562af47..265bfecca82 100644
--- a/neonView/MSTTeamAddMembersEdit_view/MSTTeamAddMembersEdit_view.aod
+++ b/neonView/MSTTeamAddMembersEdit_view/MSTTeamAddMembersEdit_view.aod
@@ -9,6 +9,16 @@
     </boxLayout>
   </layout>
   <children>
+    <genericViewTemplate>
+      <name>TeamName</name>
+      <entityField>#ENTITY</entityField>
+      <fields>
+        <entityFieldLink>
+          <name>4d4e4438-63d7-463b-ba87-1b07c8fb046c</name>
+          <entityField>MST_TEAMNAME</entityField>
+        </entityFieldLink>
+      </fields>
+    </genericViewTemplate>
     <neonViewReference>
       <name>8de10b28-e1aa-46d9-9ac3-73cff46619fb</name>
       <entityField>Members</entityField>
diff --git a/neonView/MSTTeamEditMembers_view/MSTTeamEditMembers_view.aod b/neonView/MSTTeamEditMembers_view/MSTTeamEditMembers_view.aod
new file mode 100644
index 00000000000..37d7d19c886
--- /dev/null
+++ b/neonView/MSTTeamEditMembers_view/MSTTeamEditMembers_view.aod
@@ -0,0 +1,28 @@
+<?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>MSTTeamEditMembers_view</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <size>SMALL</size>
+  <layout>
+    <boxLayout>
+      <name>layout</name>
+    </boxLayout>
+  </layout>
+  <children>
+    <genericViewTemplate>
+      <name>Teamname</name>
+      <entityField>#ENTITY</entityField>
+      <fields>
+        <entityFieldLink>
+          <name>b17446e0-ad87-4098-8bd2-de716a8e12ae</name>
+          <entityField>TEAMNAME</entityField>
+        </entityFieldLink>
+      </fields>
+    </genericViewTemplate>
+    <neonViewReference>
+      <name>189bbef9-e646-416a-835f-6348199dbd24</name>
+      <entityField>TeamMembers</entityField>
+      <view>MSTTeamMemberMultiEdit_view</view>
+    </neonViewReference>
+  </children>
+</neonView>
diff --git a/neonView/MSTTeamMemberList_view/MSTTeamMemberList_view.aod b/neonView/MSTTeamMemberList_view/MSTTeamMemberList_view.aod
new file mode 100644
index 00000000000..c6b2cf1b3eb
--- /dev/null
+++ b/neonView/MSTTeamMemberList_view/MSTTeamMemberList_view.aod
@@ -0,0 +1,25 @@
+<?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>MSTTeamMemberList_view</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <layout>
+    <boxLayout>
+      <name>layout</name>
+    </boxLayout>
+  </layout>
+  <children>
+    <titledListViewTemplate>
+      <name>List</name>
+      <entityField>#ENTITY</entityField>
+      <isDeletable v="false" />
+      <isEditable v="false" />
+      <isCreatable v="false" />
+      <columns>
+        <neonTitledListTableColumn>
+          <name>20efb592-e94f-4f2c-87b5-fea410c4c28a</name>
+          <entityField>MEMBERNAME</entityField>
+        </neonTitledListTableColumn>
+      </columns>
+    </titledListViewTemplate>
+  </children>
+</neonView>
diff --git a/neonView/MSTTeamPreview_view/MSTTeamPreview_view.aod b/neonView/MSTTeamPreview_view/MSTTeamPreview_view.aod
index e6877ceb903..11a12506b15 100644
--- a/neonView/MSTTeamPreview_view/MSTTeamPreview_view.aod
+++ b/neonView/MSTTeamPreview_view/MSTTeamPreview_view.aod
@@ -16,5 +16,10 @@
       <entityField>#ENTITY</entityField>
       <isEditable v="false" />
     </cardViewTemplate>
+    <neonViewReference>
+      <name>b8eda051-1e6f-4c8f-8ef2-2b14d95d90c8</name>
+      <entityField>TeamMembers</entityField>
+      <view>MSTTeamMemberList_view</view>
+    </neonViewReference>
   </children>
 </neonView>
diff --git a/process/Employee_lib/process.js b/process/Employee_lib/process.js
index 5a89f59926f..ee52c6b5765 100644
--- a/process/Employee_lib/process.js
+++ b/process/Employee_lib/process.js
@@ -143,6 +143,10 @@ EmployeeUtils.hasRelations = function (pContactId)
  */
 EmployeeUtils.isUser = function (pContactId)
 {
-    var user = tools.getUserByAttribute(tools.CONTACTID, pContactId);
-    return user != null;
+    return EmployeeUtils.getUserByContactId(pContactId) != null;
+}
+
+EmployeeUtils.getUserByContactId = function (pContactId)
+{
+    return tools.getUserByAttribute(tools.CONTACTID, pContactId);
 }
\ No newline at end of file
-- 
GitLab


From 4e7a711ec2ccf22813e4bfc2a14bd0b1f68755c4 Mon Sep 17 00:00:00 2001
From: "M.Bilda" <m.bilda@adito.de>
Date: Fri, 17 Jul 2020 12:51:17 +0200
Subject: [PATCH 009/184] 1060809 - changed stateProcess to invisable

---
 .../entityfields/mst_teamactions/stateProcess.js                | 2 +-
 .../entityfields/msteamsactiongroup/stateProcess.js             | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/entity/Activity_entity/entityfields/mst_teamactions/stateProcess.js b/entity/Activity_entity/entityfields/mst_teamactions/stateProcess.js
index 44ae892f222..dcb3c04ef9b 100644
--- a/entity/Activity_entity/entityfields/mst_teamactions/stateProcess.js
+++ b/entity/Activity_entity/entityfields/mst_teamactions/stateProcess.js
@@ -10,5 +10,5 @@ if (isTeamsEnabled == "true")
 }
 else
 {
-    result.string(neon.COMPONENTSTATE_DISABLED);
+    result.string(neon.COMPONENTSTATE_INVISIBLE);
 }
\ No newline at end of file
diff --git a/entity/Member_entity/entityfields/msteamsactiongroup/stateProcess.js b/entity/Member_entity/entityfields/msteamsactiongroup/stateProcess.js
index 44ae892f222..dcb3c04ef9b 100644
--- a/entity/Member_entity/entityfields/msteamsactiongroup/stateProcess.js
+++ b/entity/Member_entity/entityfields/msteamsactiongroup/stateProcess.js
@@ -10,5 +10,5 @@ if (isTeamsEnabled == "true")
 }
 else
 {
-    result.string(neon.COMPONENTSTATE_DISABLED);
+    result.string(neon.COMPONENTSTATE_INVISIBLE);
 }
\ No newline at end of file
-- 
GitLab


From 453fdfbe8f5fd1817462eff47c860d6721ae37bb Mon Sep 17 00:00:00 2001
From: "M.Bilda" <m.bilda@adito.de>
Date: Fri, 17 Jul 2020 12:58:18 +0200
Subject: [PATCH 010/184] 1060809 - changed StateProcess

---
 .../Activity_entity/entityfields/mst_teamactions/stateProcess.js | 1 +
 1 file changed, 1 insertion(+)

diff --git a/entity/Activity_entity/entityfields/mst_teamactions/stateProcess.js b/entity/Activity_entity/entityfields/mst_teamactions/stateProcess.js
index dcb3c04ef9b..5442a044cca 100644
--- a/entity/Activity_entity/entityfields/mst_teamactions/stateProcess.js
+++ b/entity/Activity_entity/entityfields/mst_teamactions/stateProcess.js
@@ -11,4 +11,5 @@ if (isTeamsEnabled == "true")
 else
 {
     result.string(neon.COMPONENTSTATE_INVISIBLE);
+    result.string(neon.COMPONENTSTATE_INVISIBLE);
 }
\ No newline at end of file
-- 
GitLab


From d628a762c254ff7e84b6b9a7e054e9c515face24 Mon Sep 17 00:00:00 2001
From: "M.Bilda" <m.bilda@adito.de>
Date: Thu, 23 Jul 2020 08:09:21 +0200
Subject: [PATCH 011/184] 1060809 - added WebUrl to Database

---
 aliasDefinition/Data_alias/Data_alias.aod     | 132 ++++++++++++++++++
 .../recordcontainers/jdito/onInsert.js        |   3 +-
 2 files changed, 134 insertions(+), 1 deletion(-)

diff --git a/aliasDefinition/Data_alias/Data_alias.aod b/aliasDefinition/Data_alias/Data_alias.aod
index c7037b6dddf..48617b00935 100644
--- a/aliasDefinition/Data_alias/Data_alias.aod
+++ b/aliasDefinition/Data_alias/Data_alias.aod
@@ -3647,6 +3647,20 @@
                   </customStringProperty>
                 </customProperties>
               </entityFieldDb>
+              <entityFieldDb>
+                <name>MST_TEAM_ID</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="1" />
+                <size v="36" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
             </entityFields>
           </entityDb>
           <entityDb>
@@ -14150,6 +14164,124 @@
               </entityFieldDb>
             </entityFields>
           </entityDb>
+          <entityDb>
+            <name>MST_TEAM</name>
+            <dbName></dbName>
+            <idColumn>MST_TEAMID</idColumn>
+            <idGeneratorType v="0" />
+            <idGeneratorInterval v="1" />
+            <documentation></documentation>
+            <title></title>
+            <description></description>
+            <auditSyncConfig>
+              <name>auditSyncConfig</name>
+              <auditMode v="0" />
+              <syncActive v="false" />
+              <syncComplete v="true" />
+              <syncDirection v="1" />
+              <syncIds></syncIds>
+            </auditSyncConfig>
+            <entityFields>
+              <entityFieldDb>
+                <name>OBJECT_ROWID</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="1" />
+                <size v="36" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>MST_TEAMID</name>
+                <dbName></dbName>
+                <primaryKey v="true" />
+                <columnType v="1" />
+                <size v="36" />
+                <scale v="0" />
+                <notNull v="true" />
+                <isUnique v="true" />
+                <index v="true" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>IS_ARCHIVED</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="5" />
+                <size v="5" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>SERVICE_URL</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="12" />
+                <size v="255" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>TEAMNAME</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="12" />
+                <size v="255" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>GENERAL_CHANNELID</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="1" />
+                <size v="48" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>WEB_URL</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="12" />
+                <size v="500" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+            </entityFields>
+          </entityDb>
         </entities>
       </entityGroup>
     </aliasDefDb>
diff --git a/entity/MSTTeam_entity/recordcontainers/jdito/onInsert.js b/entity/MSTTeam_entity/recordcontainers/jdito/onInsert.js
index 9e9c547d317..ed2b033b329 100644
--- a/entity/MSTTeam_entity/recordcontainers/jdito/onInsert.js
+++ b/entity/MSTTeam_entity/recordcontainers/jdito/onInsert.js
@@ -65,7 +65,8 @@ new SqlBuilder().insertFields({
     "MST_TEAMID" : mstTeam.teamId,
     "TEAMNAME" : mstTeam.teamName,
     "GENERAL_CHANNELID" : mstTeam.generalChannelId,
-    "IS_ARCHIVED" : 0
+    "IS_ARCHIVED" : 0,
+    "WEB_URL" : mstTeam.webUrl
 }, "MST_TEAM");
 
 newWhere("SALESPROJECT.SALESPROJECTID", "$param.SalesprojectId_param")
-- 
GitLab


From 39971d02d510c9912dbd4c75cf9f7fa0701b0add Mon Sep 17 00:00:00 2001
From: "M.Bilda" <m.bilda@adito.de>
Date: Thu, 23 Jul 2020 09:04:06 +0200
Subject: [PATCH 012/184] 1060809 - addApp onActionProcess; changed Saleproject
 onUpdate Process

---
 entity/Member_entity/Member_entity.aod        |  1 +
 .../children/addapp/onActionProcess.js        |  9 ++++-----
 .../children/editteam/stateProcess.js         | 20 +++++++++++++++++++
 .../recordcontainers/db/onDBUpdate.js         |  4 ++--
 process/mstws/process.js                      |  8 ++++----
 5 files changed, 31 insertions(+), 11 deletions(-)
 create mode 100644 entity/Member_entity/entityfields/msteamsactiongroup/children/editteam/stateProcess.js

diff --git a/entity/Member_entity/Member_entity.aod b/entity/Member_entity/Member_entity.aod
index f3d8bec1a1e..a89ad712faa 100644
--- a/entity/Member_entity/Member_entity.aod
+++ b/entity/Member_entity/Member_entity.aod
@@ -221,6 +221,7 @@
           <title>Edit Teams Group</title>
           <onActionProcess>%aditoprj%/entity/Member_entity/entityfields/msteamsactiongroup/children/editteam/onActionProcess.js</onActionProcess>
           <iconId>NEON:PENCIL</iconId>
+          <stateProcess>%aditoprj%/entity/Member_entity/entityfields/msteamsactiongroup/children/editteam/stateProcess.js</stateProcess>
         </entityActionField>
         <entityActionField>
           <name>addNewMember</name>
diff --git a/entity/Member_entity/entityfields/msteamsactiongroup/children/addapp/onActionProcess.js b/entity/Member_entity/entityfields/msteamsactiongroup/children/addapp/onActionProcess.js
index 3fd67199f22..3d6b006adc0 100644
--- a/entity/Member_entity/entityfields/msteamsactiongroup/children/addapp/onActionProcess.js
+++ b/entity/Member_entity/entityfields/msteamsactiongroup/children/addapp/onActionProcess.js
@@ -1,13 +1,12 @@
 import("system.teams");
 import("Sql_lib");
 import("system.project");
-import("system.logging");
-
 
 var teamId = newSelect("MST_TEAM_ID")
-    .from("SALEPROJECT")
-    .where("SALESPORJECT.SALESPROJECTID", "$param.ObjectRowId_param")
+    .from("SALESPROJECT")
+    .where("SALESPROJECT.SALESPROJECTID", "$param.ObjectRowId_param")
     .cell();
     
 var appId = project.getInstanceConfigValue("teamsAppId", null);
-teams.addApp(teamId, appId)
\ No newline at end of file
+if(appId != null)
+    teams.addApp(teamId, appId)
\ No newline at end of file
diff --git a/entity/Member_entity/entityfields/msteamsactiongroup/children/editteam/stateProcess.js b/entity/Member_entity/entityfields/msteamsactiongroup/children/editteam/stateProcess.js
new file mode 100644
index 00000000000..90deb206fd1
--- /dev/null
+++ b/entity/Member_entity/entityfields/msteamsactiongroup/children/editteam/stateProcess.js
@@ -0,0 +1,20 @@
+import("system.vars");
+import("system.neon");
+import("system.result");
+import("Sql_lib");
+
+var teamId = vars.exists("$param.MST_TeamId_param") ? vars.get("$param.MST_TeamId_param") : null;
+
+var isArchived = newSelect("IS_ARCHIVED")
+    .from("MST_TEAM")
+    .whereIfSet("MST_TEAM.MST_TEAMID", teamId)
+    .cell(true);
+    
+if (teamId == "" || isArchived == 1) 
+{
+    result.string(neon.COMPONENTSTATE_DISABLED);
+}
+else
+{
+    result.string(neon.COMPONENTSTATE_EDITABLE);
+}
\ No newline at end of file
diff --git a/entity/Salesproject_entity/recordcontainers/db/onDBUpdate.js b/entity/Salesproject_entity/recordcontainers/db/onDBUpdate.js
index d11c2d44208..ccbc8268c32 100644
--- a/entity/Salesproject_entity/recordcontainers/db/onDBUpdate.js
+++ b/entity/Salesproject_entity/recordcontainers/db/onDBUpdate.js
@@ -100,12 +100,12 @@ vars.get("$local.changed").forEach(function(fieldName) {
 
 var serviceUrl = newSelect("SERVICE_URL")
     .from("MST_TEAM")
-    .where("MST_TEAM.OBJECT_ROWID", "$field.SALESPROJECTID")
+    .where("MST_TEAM.MST_TEAMID", "$field.MST_TEAM_ID")
     .cell();
 
     var channelId = newSelect("GENERAL_CHANNELID")
     .from("MST_TEAM")
-    .where("MST_TEAM.OBJECT_ROWID", "$field.SALESPROJECTID")
+    .where("MST_TEAM.MST_TEAMID", "$field.MST_TEAM_ID")
     .cell();
     
     if(serviceUrl)
diff --git a/process/mstws/process.js b/process/mstws/process.js
index 8057882a27f..09a50633a5b 100644
--- a/process/mstws/process.js
+++ b/process/mstws/process.js
@@ -19,13 +19,13 @@ function restpost(pRequestAsJson)
     var serviceUrl = jsonBody.serviceUrl;
     
     //Wenn dies der InitalRequest ist (dieser erfolgt, wenn die APP hinzugefügt wird), speichere die ServiceUrl in die DB
-    if(eventType == "teamMemberAdded" && who == "AditoBot")
+    if(eventType == "teamMemberAdded" && who == "ADITO Bot")
     {
         newWhere("MST_TEAM.MST_TEAMID", teamId)
             .updateFields({"SERVICE_URL" : serviceUrl});
     }
     //Sollte jemand die APP manuell wieder entfernen, gibt es einen "AbschiedsRequest", lösche die ServiceUrl aus der DB
-    if(eventType == "teamMemberRemoved" && who == "AditoBot")
+    if(eventType == "teamMemberRemoved" && who == "ADITO Bot")
     {    
        newWhere("MST_TEAM.MST_TEAMID", teamId)
             .updateFields({"SERVICE_URL" : ""});
@@ -38,11 +38,11 @@ function restpost(pRequestAsJson)
     if(type != "message") //Wenn Request keine Message war dann ignorieren
         return pRequestAsJson;
     
-    var text = jsonBody.text;
+    var message = jsonBody.text;
     var from = jsonBody.from.name;
     
     //Testzwecke (nachträglich entfernen)
-    logging.log(text);
+    logging.log(message);
     logging.log(from);
     
     //Da alle Aufgaben, wie zum Beispiel: Ticket erstellen, Aufgabe erstellen usw. in JDiTO erledigt werden können,
-- 
GitLab


From 70e425c69f96a9fa3d34719ec76d4ff836bedea5 Mon Sep 17 00:00:00 2001
From: "S.Listl" <S.Listl@SLISTL.aditosoftware.local>
Date: Thu, 23 Jul 2020 12:03:13 +0200
Subject: [PATCH 013/184] #1060809 MS Teams actions

---
 .../MSTChooseTeam_entity.aod                  |  1 -
 .../recordcontainers/jdito/onInsert.js        |  6 +--
 entity/MSTTeam2_entity/MSTTeam2_entity.aod    | 43 -------------------
 .../recordcontainers/jdito/contentProcess.js  | 12 ------
 .../member/displayValueProcess.js             |  7 ++-
 .../recordcontainers/jdito/onDelete.js        |  1 +
 entity/MSTTeam_entity/MSTTeam_entity.aod      | 14 ++++++
 .../isarchived/dropDownProcess.js             |  7 +++
 .../entityfields/teammembers/stateProcess.js  |  5 +++
 entity/MSTTeam_entity/grantDeleteProcess.js   |  4 ++
 entity/MSTTeam_entity/grantUpdateProcess.js   |  4 ++
 .../recordcontainers/jdito/contentProcess.js  | 42 ++++++++++++++++--
 .../recordcontainers/jdito/onDelete.js        |  8 ++++
 entity/Member_entity/Member_entity.aod        |  2 +
 .../children/addapp/onActionProcess.js        | 11 ++---
 .../children/addnewmember/stateProcess.js     | 40 ++++++++---------
 .../children/chooseteam/onActionProcess.js    |  2 +-
 .../children/deletemember/stateProcess.js     | 40 ++++++++---------
 .../children/deleteteam/onActionProcess.js    | 36 ++++------------
 .../children/restoreteam/onActionProcess.js   | 29 ++++---------
 .../Salesproject_entity.aod                   |  3 ++
 .../mst_team_id/displayValueProcess.js        |  7 +++
 .../entityfields/mst_team_id/stateProcess.js  |  5 +++
 .../MSTTeamPreview_view.aod                   | 13 ++++++
 24 files changed, 182 insertions(+), 160 deletions(-)
 delete mode 100644 entity/MSTTeam2_entity/MSTTeam2_entity.aod
 delete mode 100644 entity/MSTTeam2_entity/recordcontainers/jdito/contentProcess.js
 create mode 100644 entity/MSTTeam_entity/entityfields/isarchived/dropDownProcess.js
 create mode 100644 entity/MSTTeam_entity/entityfields/teammembers/stateProcess.js
 create mode 100644 entity/MSTTeam_entity/grantDeleteProcess.js
 create mode 100644 entity/MSTTeam_entity/grantUpdateProcess.js
 create mode 100644 entity/MSTTeam_entity/recordcontainers/jdito/onDelete.js
 create mode 100644 entity/Salesproject_entity/entityfields/mst_team_id/displayValueProcess.js
 create mode 100644 entity/Salesproject_entity/entityfields/mst_team_id/stateProcess.js

diff --git a/entity/MSTChooseTeam_entity/MSTChooseTeam_entity.aod b/entity/MSTChooseTeam_entity/MSTChooseTeam_entity.aod
index 6079bbe7b73..0857d6c94d4 100644
--- a/entity/MSTChooseTeam_entity/MSTChooseTeam_entity.aod
+++ b/entity/MSTChooseTeam_entity/MSTChooseTeam_entity.aod
@@ -33,7 +33,6 @@
     <jDitoRecordContainer>
       <name>jdito</name>
       <jDitoRecordAlias>Data_alias</jDitoRecordAlias>
-      <isPageable v="true" />
       <contentProcess>%aditoprj%/entity/MSTChooseTeam_entity/recordcontainers/jdito/contentProcess.js</contentProcess>
       <onInsert>%aditoprj%/entity/MSTChooseTeam_entity/recordcontainers/jdito/onInsert.js</onInsert>
       <recordFieldMappings>
diff --git a/entity/MSTChooseTeam_entity/recordcontainers/jdito/onInsert.js b/entity/MSTChooseTeam_entity/recordcontainers/jdito/onInsert.js
index 21cd422946c..2d238645284 100644
--- a/entity/MSTChooseTeam_entity/recordcontainers/jdito/onInsert.js
+++ b/entity/MSTChooseTeam_entity/recordcontainers/jdito/onInsert.js
@@ -16,9 +16,9 @@ if(teamIdAndName)
     var channelId = teams.getGeneralChannelId(teamId);
     
     var mstTeamId = newSelect("MST_TEAMID")
-    .from("MST_TEAM")
-    .where("MST_TEAM.MST_TEAMID", teamId)
-    .cell();
+        .from("MST_TEAM")
+        .where("MST_TEAM.MST_TEAMID", teamId)
+        .cell();
     
     if (!mstTeamId)
     {
diff --git a/entity/MSTTeam2_entity/MSTTeam2_entity.aod b/entity/MSTTeam2_entity/MSTTeam2_entity.aod
deleted file mode 100644
index 5267111150c..00000000000
--- a/entity/MSTTeam2_entity/MSTTeam2_entity.aod
+++ /dev/null
@@ -1,43 +0,0 @@
-<?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.14" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.14">
-  <name>MSTTeam2_entity</name>
-  <majorModelMode>DISTRIBUTED</majorModelMode>
-  <recordContainer>jdito</recordContainer>
-  <entityFields>
-    <entityProvider>
-      <name>#PROVIDER</name>
-    </entityProvider>
-    <entityField>
-      <name>MEMBERS</name>
-    </entityField>
-    <entityField>
-      <name>OWNER</name>
-      <selectionMode>MULTI</selectionMode>
-    </entityField>
-    <entityProvider>
-      <name>Members2</name>
-      <recordContainer>jdito</recordContainer>
-    </entityProvider>
-    <entityField>
-      <name>UID</name>
-    </entityField>
-  </entityFields>
-  <recordContainers>
-    <jDitoRecordContainer>
-      <name>jdito</name>
-      <jDitoRecordAlias>Data_alias</jDitoRecordAlias>
-      <contentProcess>%aditoprj%/entity/MSTTeam2_entity/recordcontainers/jdito/contentProcess.js</contentProcess>
-      <recordFieldMappings>
-        <jDitoRecordFieldMapping>
-          <name>UID.value</name>
-        </jDitoRecordFieldMapping>
-        <jDitoRecordFieldMapping>
-          <name>OWNER.value</name>
-        </jDitoRecordFieldMapping>
-        <jDitoRecordFieldMapping>
-          <name>MEMBERS.value</name>
-        </jDitoRecordFieldMapping>
-      </recordFieldMappings>
-    </jDitoRecordContainer>
-  </recordContainers>
-</entity>
diff --git a/entity/MSTTeam2_entity/recordcontainers/jdito/contentProcess.js b/entity/MSTTeam2_entity/recordcontainers/jdito/contentProcess.js
deleted file mode 100644
index 06d65a53088..00000000000
--- a/entity/MSTTeam2_entity/recordcontainers/jdito/contentProcess.js
+++ /dev/null
@@ -1,12 +0,0 @@
-import("system.result");
-import("system.teams");
-import("system.util");
-import("system.vars");
-
-var myDataArray = [];
-
-myDataArray.push([util.getNewUUID(), false, "mbilda@adito.de"]);
-myDataArray.push([util.getNewUUID(), false, "marco@mbsolution2.onmicrosoft.com"]);
-
-result.object(myDataArray);
-
diff --git a/entity/MSTTeamMember_entity/entityfields/member/displayValueProcess.js b/entity/MSTTeamMember_entity/entityfields/member/displayValueProcess.js
index 7100366cb2e..524ecbbf750 100644
--- a/entity/MSTTeamMember_entity/entityfields/member/displayValueProcess.js
+++ b/entity/MSTTeamMember_entity/entityfields/member/displayValueProcess.js
@@ -1,5 +1,10 @@
 import("system.result");
 import("system.vars");
+import("Contact_lib");
 
 if (vars.get("$field.MEMBERNAME"))
-    result.string(vars.get("$field.MEMBERNAME"));
\ No newline at end of file
+    result.string(vars.get("$field.MEMBERNAME"));
+else 
+{
+    result.string(ContactUtils.getTitleByContactId(vars.get("$field.MEMBER")));
+}
\ No newline at end of file
diff --git a/entity/MSTTeamMember_entity/recordcontainers/jdito/onDelete.js b/entity/MSTTeamMember_entity/recordcontainers/jdito/onDelete.js
index d2ca20dd991..03dee90e18e 100644
--- a/entity/MSTTeamMember_entity/recordcontainers/jdito/onDelete.js
+++ b/entity/MSTTeamMember_entity/recordcontainers/jdito/onDelete.js
@@ -1 +1,2 @@
+//deletion is done in the MSTTeam_entity
 var e = "e";
\ No newline at end of file
diff --git a/entity/MSTTeam_entity/MSTTeam_entity.aod b/entity/MSTTeam_entity/MSTTeam_entity.aod
index 07657f65968..20de4a24fd9 100644
--- a/entity/MSTTeam_entity/MSTTeam_entity.aod
+++ b/entity/MSTTeam_entity/MSTTeam_entity.aod
@@ -4,7 +4,10 @@
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <siblings>
     <element>Salesproject_entity</element>
+    <element>Member_entity</element>
   </siblings>
+  <grantUpdateProcess>%aditoprj%/entity/MSTTeam_entity/grantUpdateProcess.js</grantUpdateProcess>
+  <grantDeleteProcess>%aditoprj%/entity/MSTTeam_entity/grantDeleteProcess.js</grantDeleteProcess>
   <contentTitleProcess>%aditoprj%/entity/MSTTeam_entity/contentTitleProcess.js</contentTitleProcess>
   <recordContainer>jdito</recordContainer>
   <entityFields>
@@ -26,6 +29,7 @@
     <entityField>
       <name>TEAMNAME</name>
       <title>Name</title>
+      <mandatory v="true" />
       <stateProcess>%aditoprj%/entity/MSTTeam_entity/entityfields/teamname/stateProcess.js</stateProcess>
       <valueProcess>%aditoprj%/entity/MSTTeam_entity/entityfields/teamname/valueProcess.js</valueProcess>
     </entityField>
@@ -53,6 +57,7 @@
     </entityParameter>
     <entityConsumer>
       <name>TeamMembers</name>
+      <stateProcess>%aditoprj%/entity/MSTTeam_entity/entityfields/teammembers/stateProcess.js</stateProcess>
       <dependency>
         <name>dependency</name>
         <entityName>MSTTeamMember_entity</entityName>
@@ -72,6 +77,11 @@
     <entityField>
       <name>TEAMID_AND_NAME</name>
     </entityField>
+    <entityField>
+      <name>ISARCHIVED</name>
+      <title>Archived</title>
+      <dropDownProcess>%aditoprj%/entity/MSTTeam_entity/entityfields/isarchived/dropDownProcess.js</dropDownProcess>
+    </entityField>
   </entityFields>
   <recordContainers>
     <jDitoRecordContainer>
@@ -82,6 +92,7 @@
       <contentProcess>%aditoprj%/entity/MSTTeam_entity/recordcontainers/jdito/contentProcess.js</contentProcess>
       <onInsert>%aditoprj%/entity/MSTTeam_entity/recordcontainers/jdito/onInsert.js</onInsert>
       <onUpdate>%aditoprj%/entity/MSTTeam_entity/recordcontainers/jdito/onUpdate.js</onUpdate>
+      <onDelete>%aditoprj%/entity/MSTTeam_entity/recordcontainers/jdito/onDelete.js</onDelete>
       <recordFieldMappings>
         <jDitoRecordFieldMapping>
           <name>UID.value</name>
@@ -95,6 +106,9 @@
         <jDitoRecordFieldMapping>
           <name>DESCRIPTION.value</name>
         </jDitoRecordFieldMapping>
+        <jDitoRecordFieldMapping>
+          <name>ISARCHIVED.value</name>
+        </jDitoRecordFieldMapping>
       </recordFieldMappings>
     </jDitoRecordContainer>
   </recordContainers>
diff --git a/entity/MSTTeam_entity/entityfields/isarchived/dropDownProcess.js b/entity/MSTTeam_entity/entityfields/isarchived/dropDownProcess.js
new file mode 100644
index 00000000000..f77d640ef1d
--- /dev/null
+++ b/entity/MSTTeam_entity/entityfields/isarchived/dropDownProcess.js
@@ -0,0 +1,7 @@
+import("system.result");
+import("system.translate");
+
+result.object([
+    ["true", translate.text("Yes")],
+    ["false", translate.text("No")]
+]);
\ No newline at end of file
diff --git a/entity/MSTTeam_entity/entityfields/teammembers/stateProcess.js b/entity/MSTTeam_entity/entityfields/teammembers/stateProcess.js
new file mode 100644
index 00000000000..9f48c47fee7
--- /dev/null
+++ b/entity/MSTTeam_entity/entityfields/teammembers/stateProcess.js
@@ -0,0 +1,5 @@
+import("system.result");
+import("system.vars");
+import("system.neon");
+
+result.string(vars.get("$field.ISARCHIVED") == "true" ? neon.COMPONENTSTATE_INVISIBLE : neon.COMPONENTSTATE_EDITABLE);
\ No newline at end of file
diff --git a/entity/MSTTeam_entity/grantDeleteProcess.js b/entity/MSTTeam_entity/grantDeleteProcess.js
new file mode 100644
index 00000000000..5ecf6e451e5
--- /dev/null
+++ b/entity/MSTTeam_entity/grantDeleteProcess.js
@@ -0,0 +1,4 @@
+import("system.result");
+import("system.vars");
+
+result.string(vars.get("$field.ISARCHIVED") != "true");
\ No newline at end of file
diff --git a/entity/MSTTeam_entity/grantUpdateProcess.js b/entity/MSTTeam_entity/grantUpdateProcess.js
new file mode 100644
index 00000000000..5ecf6e451e5
--- /dev/null
+++ b/entity/MSTTeam_entity/grantUpdateProcess.js
@@ -0,0 +1,4 @@
+import("system.result");
+import("system.vars");
+
+result.string(vars.get("$field.ISARCHIVED") != "true");
\ No newline at end of file
diff --git a/entity/MSTTeam_entity/recordcontainers/jdito/contentProcess.js b/entity/MSTTeam_entity/recordcontainers/jdito/contentProcess.js
index 9a7d5c85c9e..8bfa01a4579 100644
--- a/entity/MSTTeam_entity/recordcontainers/jdito/contentProcess.js
+++ b/entity/MSTTeam_entity/recordcontainers/jdito/contentProcess.js
@@ -17,10 +17,40 @@ var teamsArray = [];
 
 if (vars.get("$local.idvalues"))
 {
+    var teamInfoLoader = {
+        normalTeams : allTeams,
+        archivedTeams : null,
+        getTeamInfo : function (pTeamId)
+        {
+            if (pTeamId in this.normalTeams)
+            {
+                return {
+                    name : this.normalTeams[pTeamId],
+                    isArchived : false
+                };
+            }
+            
+            if (this.archivedTeams == null)
+                this.archivedTeams = teams.getAllArchivedTeams(null);
+            
+            return {
+                name : this.archivedTeams[pTeamId] || "",
+                isArchived : pTeamId in this.archivedTeams
+            };
+        }
+    };
+    
     teamsArray = vars.get("$local.idvalues").map(function (teamId) 
     {
-        var idAndName = JSON.stringify([teamId, allTeams[teamId]]);
-        return [teamId, allTeams[teamId], idAndName, ""];
+        var teamInfo = teamInfoLoader.getTeamInfo(teamId);
+        var idAndName = JSON.stringify([teamId, teamInfo.name]);
+        return [
+            teamId, 
+            teamInfo.name, 
+            idAndName, 
+            "", 
+            teamInfo.isArchived
+        ];
     });   
 }
 else
@@ -28,7 +58,13 @@ else
     for (let teamId in allTeams)
     {
         var idAndName = JSON.stringify([teamId, allTeams[teamId]]);
-        teamsArray.push([teamId, allTeams[teamId], idAndName, ""]);
+        teamsArray.push([
+            teamId, 
+            allTeams[teamId], 
+            idAndName, 
+            "", 
+            false
+        ]);
     }
 }
 
diff --git a/entity/MSTTeam_entity/recordcontainers/jdito/onDelete.js b/entity/MSTTeam_entity/recordcontainers/jdito/onDelete.js
new file mode 100644
index 00000000000..ed8e457d4a8
--- /dev/null
+++ b/entity/MSTTeam_entity/recordcontainers/jdito/onDelete.js
@@ -0,0 +1,8 @@
+import("system.vars");
+import("system.teams");
+import("Sql_lib");
+
+var teamId = vars.get("$field.UID");
+teams.archiveTeam(teamId);
+newWhere("MST_TEAM.MST_TEAMID", teamId)
+   .updateFields({"IS_ARCHIVED" : "1"});
\ No newline at end of file
diff --git a/entity/Member_entity/Member_entity.aod b/entity/Member_entity/Member_entity.aod
index a89ad712faa..f7e8a3c0a24 100644
--- a/entity/Member_entity/Member_entity.aod
+++ b/entity/Member_entity/Member_entity.aod
@@ -228,6 +228,7 @@
           <title>Add members</title>
           <onActionProcess>%aditoprj%/entity/Member_entity/entityfields/msteamsactiongroup/children/addnewmember/onActionProcess.js</onActionProcess>
           <iconId>VAADIN:USER</iconId>
+          <state>INVISIBLE</state>
           <stateProcess>%aditoprj%/entity/Member_entity/entityfields/msteamsactiongroup/children/addnewmember/stateProcess.js</stateProcess>
           <tooltip>Fügt neue Member zum Team hinzu</tooltip>
         </entityActionField>
@@ -235,6 +236,7 @@
           <name>deleteMember</name>
           <title>Delete members</title>
           <iconId>VAADIN:USER</iconId>
+          <state>INVISIBLE</state>
           <stateProcess>%aditoprj%/entity/Member_entity/entityfields/msteamsactiongroup/children/deletemember/stateProcess.js</stateProcess>
         </entityActionField>
         <entityActionField>
diff --git a/entity/Member_entity/entityfields/msteamsactiongroup/children/addapp/onActionProcess.js b/entity/Member_entity/entityfields/msteamsactiongroup/children/addapp/onActionProcess.js
index 3d6b006adc0..9ec4d7bd685 100644
--- a/entity/Member_entity/entityfields/msteamsactiongroup/children/addapp/onActionProcess.js
+++ b/entity/Member_entity/entityfields/msteamsactiongroup/children/addapp/onActionProcess.js
@@ -1,12 +1,7 @@
 import("system.teams");
-import("Sql_lib");
 import("system.project");
+import("system.vars");
 
-var teamId = newSelect("MST_TEAM_ID")
-    .from("SALESPROJECT")
-    .where("SALESPROJECT.SALESPROJECTID", "$param.ObjectRowId_param")
-    .cell();
-    
 var appId = project.getInstanceConfigValue("teamsAppId", null);
-if(appId != null)
-    teams.addApp(teamId, appId)
\ No newline at end of file
+if (appId != null)
+    teams.addApp(vars.get("$param.MST_TeamId_param"), appId);
\ No newline at end of file
diff --git a/entity/Member_entity/entityfields/msteamsactiongroup/children/addnewmember/stateProcess.js b/entity/Member_entity/entityfields/msteamsactiongroup/children/addnewmember/stateProcess.js
index 90deb206fd1..3927f9c0557 100644
--- a/entity/Member_entity/entityfields/msteamsactiongroup/children/addnewmember/stateProcess.js
+++ b/entity/Member_entity/entityfields/msteamsactiongroup/children/addnewmember/stateProcess.js
@@ -1,20 +1,20 @@
-import("system.vars");
-import("system.neon");
-import("system.result");
-import("Sql_lib");
-
-var teamId = vars.exists("$param.MST_TeamId_param") ? vars.get("$param.MST_TeamId_param") : null;
-
-var isArchived = newSelect("IS_ARCHIVED")
-    .from("MST_TEAM")
-    .whereIfSet("MST_TEAM.MST_TEAMID", teamId)
-    .cell(true);
-    
-if (teamId == "" || isArchived == 1) 
-{
-    result.string(neon.COMPONENTSTATE_DISABLED);
-}
-else
-{
-    result.string(neon.COMPONENTSTATE_EDITABLE);
-}
\ No newline at end of file
+//import("system.vars");
+//import("system.neon");
+//import("system.result");
+//import("Sql_lib");
+//
+//var teamId = vars.exists("$param.MST_TeamId_param") ? vars.get("$param.MST_TeamId_param") : null;
+//
+//var isArchived = newSelect("IS_ARCHIVED")
+//    .from("MST_TEAM")
+//    .whereIfSet("MST_TEAM.MST_TEAMID", teamId)
+//    .cell(true);
+//    
+//if (teamId == "" || isArchived == 1) 
+//{
+//    result.string(neon.COMPONENTSTATE_DISABLED);
+//}
+//else
+//{
+//    result.string(neon.COMPONENTSTATE_EDITABLE);
+//}
\ No newline at end of file
diff --git a/entity/Member_entity/entityfields/msteamsactiongroup/children/chooseteam/onActionProcess.js b/entity/Member_entity/entityfields/msteamsactiongroup/children/chooseteam/onActionProcess.js
index 0583cd17a0e..2f2ae94d38c 100644
--- a/entity/Member_entity/entityfields/msteamsactiongroup/children/chooseteam/onActionProcess.js
+++ b/entity/Member_entity/entityfields/msteamsactiongroup/children/chooseteam/onActionProcess.js
@@ -4,5 +4,5 @@ import("system.teams");
 import("system.logging");
 
 neon.openContext("MSTChooseTeam", null, null, neon.OPERATINGSTATE_NEW, {
-    "SalesprojectId_param" : vars.get("$field.OBJECT_ROWID")
+    "SalesprojectId_param" : vars.get("$param.ObjectRowId_param")
 });
\ No newline at end of file
diff --git a/entity/Member_entity/entityfields/msteamsactiongroup/children/deletemember/stateProcess.js b/entity/Member_entity/entityfields/msteamsactiongroup/children/deletemember/stateProcess.js
index 90deb206fd1..3927f9c0557 100644
--- a/entity/Member_entity/entityfields/msteamsactiongroup/children/deletemember/stateProcess.js
+++ b/entity/Member_entity/entityfields/msteamsactiongroup/children/deletemember/stateProcess.js
@@ -1,20 +1,20 @@
-import("system.vars");
-import("system.neon");
-import("system.result");
-import("Sql_lib");
-
-var teamId = vars.exists("$param.MST_TeamId_param") ? vars.get("$param.MST_TeamId_param") : null;
-
-var isArchived = newSelect("IS_ARCHIVED")
-    .from("MST_TEAM")
-    .whereIfSet("MST_TEAM.MST_TEAMID", teamId)
-    .cell(true);
-    
-if (teamId == "" || isArchived == 1) 
-{
-    result.string(neon.COMPONENTSTATE_DISABLED);
-}
-else
-{
-    result.string(neon.COMPONENTSTATE_EDITABLE);
-}
\ No newline at end of file
+//import("system.vars");
+//import("system.neon");
+//import("system.result");
+//import("Sql_lib");
+//
+//var teamId = vars.exists("$param.MST_TeamId_param") ? vars.get("$param.MST_TeamId_param") : null;
+//
+//var isArchived = newSelect("IS_ARCHIVED")
+//    .from("MST_TEAM")
+//    .whereIfSet("MST_TEAM.MST_TEAMID", teamId)
+//    .cell(true);
+//    
+//if (teamId == "" || isArchived == 1) 
+//{
+//    result.string(neon.COMPONENTSTATE_DISABLED);
+//}
+//else
+//{
+//    result.string(neon.COMPONENTSTATE_EDITABLE);
+//}
\ No newline at end of file
diff --git a/entity/Member_entity/entityfields/msteamsactiongroup/children/deleteteam/onActionProcess.js b/entity/Member_entity/entityfields/msteamsactiongroup/children/deleteteam/onActionProcess.js
index 7e196630c9a..d4fd1f58184 100644
--- a/entity/Member_entity/entityfields/msteamsactiongroup/children/deleteteam/onActionProcess.js
+++ b/entity/Member_entity/entityfields/msteamsactiongroup/children/deleteteam/onActionProcess.js
@@ -1,31 +1,13 @@
 import("system.teams");
 import("Sql_lib");
-import("system.datetime")
+import("system.vars");
+import("system.neon");
 
-
-var teamId = newSelect("MST_TEAMID")
-    .from("MST_TEAM")
-    .where("MST_TEAM.OBJECT_ROWID", "$param.ObjectRowId_param")
-    .cell();
-    
-    
-//Hat dieses Team mehrere Projekte??
-var teamIds = newSelect("MST_TEAMID")
-    .from("MST_TEAM")
-    .where("MST_TEAM.MST_TEAMID", teamId)
-    .arrayColumn();
-    
-teams.archiveTeam(teamId);
-
-for (var i = 0; i<teamIds.length; i++)
+var teamId = vars.get("$param.MST_TeamId_param");
+if (teamId)
 {
-    var finalDeleteDate = datetime.date() + (datetime.ONE_DAY * 30);
-
-    newWhere("MST_TEAM.MST_TEAMID", teamIds[i])
-       .updateFields({
-                      "IS_ARCHIVED" : "1",
-                      "FINAL_DELETE_DATE" : finalDeleteDate
-                      });
-}
-
-
+    teams.archiveTeam(teamId);
+    newWhere("MST_TEAM.MST_TEAMID", teamId)
+       .updateFields({"IS_ARCHIVED" : "1"});
+    neon.refreshAll();
+}
\ No newline at end of file
diff --git a/entity/Member_entity/entityfields/msteamsactiongroup/children/restoreteam/onActionProcess.js b/entity/Member_entity/entityfields/msteamsactiongroup/children/restoreteam/onActionProcess.js
index b67caa38262..0333cfcd2cc 100644
--- a/entity/Member_entity/entityfields/msteamsactiongroup/children/restoreteam/onActionProcess.js
+++ b/entity/Member_entity/entityfields/msteamsactiongroup/children/restoreteam/onActionProcess.js
@@ -1,26 +1,13 @@
-import("system.vars");
 import("system.teams");
 import("Sql_lib");
+import("system.vars");
 import("system.neon");
 
-
-var teamId = newSelect("MST_TEAMID")
-    .from("MST_TEAM")
-    .where("MST_TEAM.OBJECT_ROWID", vars.get("$field.OBJECT_ROWID"))
-    .cell();
-
-//Hat dieses Team mehrere Projekte??
-var teamIds = newSelect("MST_TEAMID")
-    .from("MST_TEAM")
-    .where("MST_TEAM.MST_TEAMID", teamId).arrayRow();
-    
-teams.unarchiveTeam(teamId);
-
-for(var i = 0; i<teamIds.length; i++)
-{            
-    newWhere("MST_TEAM.MST_TEAMID", teamIds[i])
-        .updateFields({
-              "IS_ARCHIVED" : "0",
-              "FINAL_DELETE_DATE" : ""
-              });
+var teamId = vars.get("$param.MST_TeamId_param");
+if (teamId)
+{
+    teams.unarchiveTeam(teamId);
+    newWhere("MST_TEAM.MST_TEAMID", teamId)
+       .updateFields({"IS_ARCHIVED" : "0"});
+    neon.refreshAll();
 }
\ No newline at end of file
diff --git a/entity/Salesproject_entity/Salesproject_entity.aod b/entity/Salesproject_entity/Salesproject_entity.aod
index 8dbbbb12297..a185c389fad 100644
--- a/entity/Salesproject_entity/Salesproject_entity.aod
+++ b/entity/Salesproject_entity/Salesproject_entity.aod
@@ -6,6 +6,7 @@
   <title>Sales Project</title>
   <siblings>
     <element>SalesprojectMilestone_entity</element>
+    <element>Member_entity</element>
   </siblings>
   <grantDeleteProcess>%aditoprj%/entity/Salesproject_entity/grantDeleteProcess.js</grantDeleteProcess>
   <contentTitleProcess>%aditoprj%/entity/Salesproject_entity/contentTitleProcess.js</contentTitleProcess>
@@ -758,6 +759,8 @@
       <title>Teams group</title>
       <linkedContext>MSTTeam</linkedContext>
       <state>READONLY</state>
+      <stateProcess>%aditoprj%/entity/Salesproject_entity/entityfields/mst_team_id/stateProcess.js</stateProcess>
+      <displayValueProcess>%aditoprj%/entity/Salesproject_entity/entityfields/mst_team_id/displayValueProcess.js</displayValueProcess>
     </entityField>
     <entityField>
       <name>COUNT</name>
diff --git a/entity/Salesproject_entity/entityfields/mst_team_id/displayValueProcess.js b/entity/Salesproject_entity/entityfields/mst_team_id/displayValueProcess.js
new file mode 100644
index 00000000000..daf9387bb01
--- /dev/null
+++ b/entity/Salesproject_entity/entityfields/mst_team_id/displayValueProcess.js
@@ -0,0 +1,7 @@
+import("system.result");
+import("Sql_lib");
+
+result.string(newSelect("TEAMNAME")
+    .from("MST_TEAM")
+    .whereIfSet("MST_TEAM.MST_TEAMID", "$field.MST_TEAM_ID")
+    .cell(true));
\ No newline at end of file
diff --git a/entity/Salesproject_entity/entityfields/mst_team_id/stateProcess.js b/entity/Salesproject_entity/entityfields/mst_team_id/stateProcess.js
new file mode 100644
index 00000000000..ddf69aa437e
--- /dev/null
+++ b/entity/Salesproject_entity/entityfields/mst_team_id/stateProcess.js
@@ -0,0 +1,5 @@
+import("system.result");
+import("system.vars");
+import("system.neon");
+
+result.string(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_EDIT ? neon.COMPONENTSTATE_INVISIBLE : neon.COMPONENTSTATE_READONLY);
\ No newline at end of file
diff --git a/neonView/MSTTeamPreview_view/MSTTeamPreview_view.aod b/neonView/MSTTeamPreview_view/MSTTeamPreview_view.aod
index 11a12506b15..5932326dc88 100644
--- a/neonView/MSTTeamPreview_view/MSTTeamPreview_view.aod
+++ b/neonView/MSTTeamPreview_view/MSTTeamPreview_view.aod
@@ -16,6 +16,19 @@
       <entityField>#ENTITY</entityField>
       <isEditable v="false" />
     </cardViewTemplate>
+    <genericViewTemplate>
+      <name>Info</name>
+      <showDrawer v="true" />
+      <drawerCaption>Details</drawerCaption>
+      <entityField>#ENTITY</entityField>
+      <isEditable v="false" />
+      <fields>
+        <entityFieldLink>
+          <name>2a40804f-ea89-4345-b075-a6eef5fe9961</name>
+          <entityField>ISARCHIVED</entityField>
+        </entityFieldLink>
+      </fields>
+    </genericViewTemplate>
     <neonViewReference>
       <name>b8eda051-1e6f-4c8f-8ef2-2b14d95d90c8</name>
       <entityField>TeamMembers</entityField>
-- 
GitLab


From fc6a2b82f3f22c5898609acc56081fa613acea01 Mon Sep 17 00:00:00 2001
From: "S.Listl" <S.Listl@SLISTL.aditosoftware.local>
Date: Wed, 29 Jul 2020 11:55:23 +0200
Subject: [PATCH 014/184] 1060809 MS Teams document and message import

---
 entity/Activity_entity/Activity_entity.aod    |  1 +
 entity/Document_entity/Document_entity.aod    | 18 ++++++++--
 .../synchronizedocuments/onActionProcess.js   | 11 ++----
 .../synchronizedocuments/stateProcess.js      | 21 +++---------
 .../entityfields/msteam/stateProcess.js       |  7 ++++
 .../MSTTeamActivityImport_entity.aod          | 15 ++++++++
 .../children/teamid_param/valueProcess.js     |  3 +-
 .../loadnextmessages/onActionProcess.js       |  5 +++
 .../children/loadnext_param/valueProcess.js   |  4 +++
 .../children/teamid_param/valueProcess.js     |  3 +-
 .../entityfields/team_id/valueProcess.js      |  8 ++---
 .../recordcontainers/jdito/onInsert.js        |  0
 .../MSTTeamChannel_entity.aod                 | 12 +++++++
 .../MSTTeamDocument_entity.aod                | 31 ++++++++++++-----
 .../allchannels/dropDownProcess.js            | 26 --------------
 .../children/teamid_param/valueProcess.js     |  4 +++
 .../entityfields/documents/dropDownProcess.js | 34 +++++++------------
 .../recordcontainers/jdito/onInsert.js        | 20 +++--------
 .../MSTTeamsMessage_entity.aod                | 10 +++---
 .../loadnext_param/documentation.adoc         |  3 ++
 .../loadoldermessages/onActionProcess.js      |  6 ----
 .../recordcontainers/jdito/contentProcess.js  | 10 +++---
 .../Salesproject_entity.aod                   |  4 +++
 .../children/mstteamid_param/valueProcess.js  |  4 +++
 .../MSTTeamActivityImportEdit_view.aod        | 12 +++++--
 .../MSTTeamDocumentEdit_view.aod              |  8 ++---
 .../MSTTeamsMessageFilter_view.aod            |  7 ----
 27 files changed, 149 insertions(+), 138 deletions(-)
 create mode 100644 entity/Document_entity/entityfields/msteam/stateProcess.js
 create mode 100644 entity/MSTTeamActivityImport_entity/entityfields/loadnextmessages/onActionProcess.js
 create mode 100644 entity/MSTTeamActivityImport_entity/entityfields/messages/children/loadnext_param/valueProcess.js
 create mode 100644 entity/MSTTeamActivityImport_entity/recordcontainers/jdito/onInsert.js
 delete mode 100644 entity/MSTTeamDocument_entity/entityfields/allchannels/dropDownProcess.js
 create mode 100644 entity/MSTTeamDocument_entity/entityfields/channels/children/teamid_param/valueProcess.js
 create mode 100644 entity/MSTTeamsMessage_entity/entityfields/loadnext_param/documentation.adoc
 delete mode 100644 entity/MSTTeamsMessage_entity/entityfields/loadoldermessages/onActionProcess.js
 create mode 100644 entity/Salesproject_entity/entityfields/documents/children/mstteamid_param/valueProcess.js

diff --git a/entity/Activity_entity/Activity_entity.aod b/entity/Activity_entity/Activity_entity.aod
index dfa81e67e6a..7f288315562 100644
--- a/entity/Activity_entity/Activity_entity.aod
+++ b/entity/Activity_entity/Activity_entity.aod
@@ -592,6 +592,7 @@
     </entityConsumer>
     <entityActionGroup>
       <name>MST_TeamActions</name>
+      <title>MS Teams</title>
       <stateProcess>%aditoprj%/entity/Activity_entity/entityfields/mst_teamactions/stateProcess.js</stateProcess>
       <children>
         <entityActionField>
diff --git a/entity/Document_entity/Document_entity.aod b/entity/Document_entity/Document_entity.aod
index 15883a25940..ece972eadd5 100644
--- a/entity/Document_entity/Document_entity.aod
+++ b/entity/Document_entity/Document_entity.aod
@@ -314,6 +314,10 @@
           <name>DisallowCreate_param</name>
           <expose v="false" />
         </entityParameter>
+        <entityParameter>
+          <name>MSTTeamId_param</name>
+          <expose v="false" />
+        </entityParameter>
       </children>
     </entityProvider>
     <entityParameter>
@@ -341,20 +345,30 @@
           <valueProcess>%aditoprj%/entity/Document_entity/entityfields/singledocument/children/disallowcreate_param/valueProcess.js</valueProcess>
           <expose v="false" />
         </entityParameter>
+        <entityParameter>
+          <name>MSTTeamId_param</name>
+          <expose v="false" />
+        </entityParameter>
       </children>
     </entityProvider>
     <entityActionGroup>
       <name>MSTeam</name>
+      <title>MS Teams</title>
+      <stateProcess>%aditoprj%/entity/Document_entity/entityfields/msteam/stateProcess.js</stateProcess>
       <children>
         <entityActionField>
           <name>synchronizeDocuments</name>
-          <title>Dateien synchronisieren</title>
+          <title>Synchronize documents</title>
           <onActionProcess>%aditoprj%/entity/Document_entity/entityfields/msteam/children/synchronizedocuments/onActionProcess.js</onActionProcess>
+          <iconId>VAADIN:REFRESH</iconId>
           <stateProcess>%aditoprj%/entity/Document_entity/entityfields/msteam/children/synchronizedocuments/stateProcess.js</stateProcess>
-          <tooltip>Synchronisiert die Dokumente der Datenbank mit den Dokumenten von MSTeams</tooltip>
         </entityActionField>
       </children>
     </entityActionGroup>
+    <entityParameter>
+      <name>MSTTeamId_param</name>
+      <expose v="true" />
+    </entityParameter>
   </entityFields>
   <recordContainers>
     <jDitoRecordContainer>
diff --git a/entity/Document_entity/entityfields/msteam/children/synchronizedocuments/onActionProcess.js b/entity/Document_entity/entityfields/msteam/children/synchronizedocuments/onActionProcess.js
index e9608493005..97975318752 100644
--- a/entity/Document_entity/entityfields/msteam/children/synchronizedocuments/onActionProcess.js
+++ b/entity/Document_entity/entityfields/msteam/children/synchronizedocuments/onActionProcess.js
@@ -1,14 +1,9 @@
-import("system.teams");
+import("system.neon");
 import("system.vars");
-import("system.db");
-import("system.util")
-import("Sql_lib");
-import("system.net")
-
-var rowId = vars.get("$param.AssignmentRowId_param");
 
 neon.openContext("MSTTeamDocument", null, null, neon.OPERATINGSTATE_NEW, {
-    "ObjectRowId_param" : rowId,
+    "MSTTeamId_param" : vars.get("$param.MSTTeamId_param"),
+    "ObjectRowId_param" : vars.get("$param.AssignmentRowId_param"),
     "AssignmentName_param" : vars.get("$param.AssignmentName_param"),
     "AssignmentTable_param" : vars.get("$param.AssignmentTable_param")
 });
diff --git a/entity/Document_entity/entityfields/msteam/children/synchronizedocuments/stateProcess.js b/entity/Document_entity/entityfields/msteam/children/synchronizedocuments/stateProcess.js
index 7350dbf89fd..38e484f314e 100644
--- a/entity/Document_entity/entityfields/msteam/children/synchronizedocuments/stateProcess.js
+++ b/entity/Document_entity/entityfields/msteam/children/synchronizedocuments/stateProcess.js
@@ -2,23 +2,10 @@ import("system.vars");
 import("system.neon");
 import("system.result");
 import("Sql_lib");
-import("system.logging");
 
-var teamId = newSelect("MST_TEAMID", "Data_alias")
-    .from("MST_TEAM")
-    .where("MST_TEAM.OBJECT_ROWID", "$param.AssignmentRowId_param")
-    .cell();
-    
 var isArchived = newSelect("IS_ARCHIVED", "Data_alias")
     .from("MST_TEAM")
-    .where("MST_TEAM.OBJECT_ROWID", "$param.AssignmentRowId_param")
-    .cell();
-    
-if (teamId == "" || isArchived == 1) 
-{
-    result.string(neon.COMPONENTSTATE_INVISIBLE);
-}
-else
-{
-    result.string(neon.COMPONENTSTATE_EDITABLE);
-}
\ No newline at end of file
+    .where("MST_TEAM.MST_TEAMID", "$param.MSTTeamId_param")
+    .cell() == "1";
+
+result.string(isArchived ? neon.COMPONENTSTATE_DISABLED : neon.COMPONENTSTATE_EDITABLE);
\ No newline at end of file
diff --git a/entity/Document_entity/entityfields/msteam/stateProcess.js b/entity/Document_entity/entityfields/msteam/stateProcess.js
new file mode 100644
index 00000000000..cd16b069466
--- /dev/null
+++ b/entity/Document_entity/entityfields/msteam/stateProcess.js
@@ -0,0 +1,7 @@
+import("system.neon");
+import("system.result");
+import("system.vars");
+
+result.string(vars.exists("$param.MSTTeamId_param") && vars.get("$param.MSTTeamId_param")
+    ? neon.COMPONENTSTATE_EDITABLE
+    : neon.COMPONENTSTATE_INVISIBLE);
\ No newline at end of file
diff --git a/entity/MSTTeamActivityImport_entity/MSTTeamActivityImport_entity.aod b/entity/MSTTeamActivityImport_entity/MSTTeamActivityImport_entity.aod
index a952bdad14e..4cc35c57b22 100644
--- a/entity/MSTTeamActivityImport_entity/MSTTeamActivityImport_entity.aod
+++ b/entity/MSTTeamActivityImport_entity/MSTTeamActivityImport_entity.aod
@@ -12,6 +12,7 @@
     </entityField>
     <entityConsumer>
       <name>Messages</name>
+      <selectionMode>MULTI</selectionMode>
       <dependency>
         <name>dependency</name>
         <entityName>MSTTeamsMessage_entity</entityName>
@@ -26,6 +27,10 @@
           <name>TeamId_param</name>
           <valueProcess>%aditoprj%/entity/MSTTeamActivityImport_entity/entityfields/messages/children/teamid_param/valueProcess.js</valueProcess>
         </entityParameter>
+        <entityParameter>
+          <name>LoadNext_param</name>
+          <valueProcess>%aditoprj%/entity/MSTTeamActivityImport_entity/entityfields/messages/children/loadnext_param/valueProcess.js</valueProcess>
+        </entityParameter>
       </children>
     </entityConsumer>
     <entityField>
@@ -55,12 +60,22 @@
         </entityParameter>
       </children>
     </entityConsumer>
+    <entityActionField>
+      <name>loadNextMessages</name>
+      <title>Load older messages</title>
+      <onActionProcess>%aditoprj%/entity/MSTTeamActivityImport_entity/entityfields/loadnextmessages/onActionProcess.js</onActionProcess>
+      <iconId>VAADIN:CLOCK</iconId>
+    </entityActionField>
+    <entityField>
+      <name>LOAD_ID</name>
+    </entityField>
   </entityFields>
   <recordContainers>
     <jDitoRecordContainer>
       <name>jdito</name>
       <jDitoRecordAlias>Data_alias</jDitoRecordAlias>
       <contentProcess>%aditoprj%/entity/MSTTeamActivityImport_entity/recordcontainers/jdito/contentProcess.js</contentProcess>
+      <onInsert>%aditoprj%/entity/MSTTeamActivityImport_entity/recordcontainers/jdito/onInsert.js</onInsert>
       <recordFieldMappings>
         <jDitoRecordFieldMapping>
           <name>UID.value</name>
diff --git a/entity/MSTTeamActivityImport_entity/entityfields/channels/children/teamid_param/valueProcess.js b/entity/MSTTeamActivityImport_entity/entityfields/channels/children/teamid_param/valueProcess.js
index 9b96bab31a3..e6f0ee80bb8 100644
--- a/entity/MSTTeamActivityImport_entity/entityfields/channels/children/teamid_param/valueProcess.js
+++ b/entity/MSTTeamActivityImport_entity/entityfields/channels/children/teamid_param/valueProcess.js
@@ -1,5 +1,4 @@
 import("system.result");
 import("system.vars");
 
-result.string("9290a0c1-fab2-4fcc-8a7a-37f3154f67a1");
-//result.string(vars.get("$field.TEAM_ID"));
\ No newline at end of file
+result.string(vars.get("$field.TEAM_ID"));
\ No newline at end of file
diff --git a/entity/MSTTeamActivityImport_entity/entityfields/loadnextmessages/onActionProcess.js b/entity/MSTTeamActivityImport_entity/entityfields/loadnextmessages/onActionProcess.js
new file mode 100644
index 00000000000..05f69f965eb
--- /dev/null
+++ b/entity/MSTTeamActivityImport_entity/entityfields/loadnextmessages/onActionProcess.js
@@ -0,0 +1,5 @@
+import("system.neon");
+import("system.util");
+
+//set a new random ID to reload the messages consumer
+neon.setFieldValue("$field.LOAD_ID", util.getNewUUID());
\ No newline at end of file
diff --git a/entity/MSTTeamActivityImport_entity/entityfields/messages/children/loadnext_param/valueProcess.js b/entity/MSTTeamActivityImport_entity/entityfields/messages/children/loadnext_param/valueProcess.js
new file mode 100644
index 00000000000..f83604cf167
--- /dev/null
+++ b/entity/MSTTeamActivityImport_entity/entityfields/messages/children/loadnext_param/valueProcess.js
@@ -0,0 +1,4 @@
+import("system.result");
+import("system.vars");
+
+result.string(vars.get("$field.LOAD_ID"));
\ No newline at end of file
diff --git a/entity/MSTTeamActivityImport_entity/entityfields/messages/children/teamid_param/valueProcess.js b/entity/MSTTeamActivityImport_entity/entityfields/messages/children/teamid_param/valueProcess.js
index bdaa415f859..9eed4861845 100644
--- a/entity/MSTTeamActivityImport_entity/entityfields/messages/children/teamid_param/valueProcess.js
+++ b/entity/MSTTeamActivityImport_entity/entityfields/messages/children/teamid_param/valueProcess.js
@@ -1,5 +1,4 @@
 import("system.vars");
 import("system.result");
 
-result.string("9290a0c1-fab2-4fcc-8a7a-37f3154f67a1");
-//result.string(vars.get("$field.TEAM_ID"));
\ No newline at end of file
+result.string(vars.get("$field.TEAM_ID"));
\ No newline at end of file
diff --git a/entity/MSTTeamActivityImport_entity/entityfields/team_id/valueProcess.js b/entity/MSTTeamActivityImport_entity/entityfields/team_id/valueProcess.js
index 87cf4c45576..6fa5f68e8e8 100644
--- a/entity/MSTTeamActivityImport_entity/entityfields/team_id/valueProcess.js
+++ b/entity/MSTTeamActivityImport_entity/entityfields/team_id/valueProcess.js
@@ -1,9 +1,9 @@
 import("system.result");
 import("Sql_lib");
 
-var teamId = newSelect("MST_TEAMID")
-    .from("MST_TEAM")
-    .where("MST_TEAM.OBJECT_ROWID", "$param.RowId_param")
+var teamId = newSelect("MST_TEAM_ID")
+    .from("SALESPROJECT")
+    .where("SALESPROJECT.SALESPROJECTID", "$param.RowId_param")
     .cell();
-    
+
 result.string(teamId);
\ No newline at end of file
diff --git a/entity/MSTTeamActivityImport_entity/recordcontainers/jdito/onInsert.js b/entity/MSTTeamActivityImport_entity/recordcontainers/jdito/onInsert.js
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/entity/MSTTeamChannel_entity/MSTTeamChannel_entity.aod b/entity/MSTTeamChannel_entity/MSTTeamChannel_entity.aod
index b2f7ff1993c..eea930f8279 100644
--- a/entity/MSTTeamChannel_entity/MSTTeamChannel_entity.aod
+++ b/entity/MSTTeamChannel_entity/MSTTeamChannel_entity.aod
@@ -31,6 +31,18 @@
       <expose v="true" />
       <mandatory v="true" />
     </entityParameter>
+    <entityProvider>
+      <name>ChannelsByName</name>
+      <lookupIdfield>CHANNELNAME</lookupIdfield>
+      <dependencies>
+        <entityDependency>
+          <name>3dfb5be2-d956-4e8a-9aec-4c80b81e0527</name>
+          <entityName>MSTTeamDocument_entity</entityName>
+          <fieldName>Channels</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+      </dependencies>
+    </entityProvider>
   </entityFields>
   <recordContainers>
     <jDitoRecordContainer>
diff --git a/entity/MSTTeamDocument_entity/MSTTeamDocument_entity.aod b/entity/MSTTeamDocument_entity/MSTTeamDocument_entity.aod
index 5b396445a13..3d91cecf1cf 100644
--- a/entity/MSTTeamDocument_entity/MSTTeamDocument_entity.aod
+++ b/entity/MSTTeamDocument_entity/MSTTeamDocument_entity.aod
@@ -9,24 +9,20 @@
     </entityProvider>
     <entityField>
       <name>DOCUMENTS</name>
-      <title>Dokumente</title>
+      <title>Documents</title>
       <dropDownProcess>%aditoprj%/entity/MSTTeamDocument_entity/entityfields/documents/dropDownProcess.js</dropDownProcess>
       <selectionMode>MULTI</selectionMode>
     </entityField>
     <entityField>
-      <name>ALLCHANNELS</name>
-      <title>Alle Channel</title>
+      <name>CHANNEL</name>
+      <title>Channel</title>
+      <consumer>Channels</consumer>
       <mandatory v="true" />
-      <dropDownProcess>%aditoprj%/entity/MSTTeamDocument_entity/entityfields/allchannels/dropDownProcess.js</dropDownProcess>
     </entityField>
     <entityParameter>
       <name>ObjectRowId_param</name>
       <expose v="true" />
     </entityParameter>
-    <entityField>
-      <name>SEARCHVALUE</name>
-      <title>Suchbegriff (Case Sensitive)</title>
-    </entityField>
     <entityField>
       <name>UID</name>
     </entityField>
@@ -38,6 +34,25 @@
       <name>AssignmentName_param</name>
       <expose v="true" />
     </entityParameter>
+    <entityConsumer>
+      <name>Channels</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>MSTTeamChannel_entity</entityName>
+        <fieldName>ChannelsByName</fieldName>
+      </dependency>
+      <children>
+        <entityParameter>
+          <name>TeamId_param</name>
+          <valueProcess>%aditoprj%/entity/MSTTeamDocument_entity/entityfields/channels/children/teamid_param/valueProcess.js</valueProcess>
+        </entityParameter>
+      </children>
+    </entityConsumer>
+    <entityParameter>
+      <name>MSTTeamId_param</name>
+      <expose v="true" />
+      <mandatory v="true" />
+    </entityParameter>
   </entityFields>
   <recordContainers>
     <jDitoRecordContainer>
diff --git a/entity/MSTTeamDocument_entity/entityfields/allchannels/dropDownProcess.js b/entity/MSTTeamDocument_entity/entityfields/allchannels/dropDownProcess.js
deleted file mode 100644
index 297dc97e992..00000000000
--- a/entity/MSTTeamDocument_entity/entityfields/allchannels/dropDownProcess.js
+++ /dev/null
@@ -1,26 +0,0 @@
-import("system.result");
-import("system.teams");
-import("system.vars");
-import("system.logging");
-import("Sql_lib");
-
-var allChannels;
-
-var teamId = newSelect("MST_TEAMID")
-    .from("MST_TEAM")
-    .where("MST_TEAM.OBJECT_ROWID", vars.get("$param.ObjectRowId_param"))
-    .cell();
-
-var searchValue = vars.get("$field.SEARCHVALUE");
-
-if(searchValue)
-{
-    allChannels = teams.getAllChannelsInTeam(teamId, searchValue);
-}
-else
-{
-    allChannels = teams.getAllChannelsInTeam(teamId, null)
-}
-
-if (allChannels)
-    result.object(allChannels);
\ No newline at end of file
diff --git a/entity/MSTTeamDocument_entity/entityfields/channels/children/teamid_param/valueProcess.js b/entity/MSTTeamDocument_entity/entityfields/channels/children/teamid_param/valueProcess.js
new file mode 100644
index 00000000000..9036fa97785
--- /dev/null
+++ b/entity/MSTTeamDocument_entity/entityfields/channels/children/teamid_param/valueProcess.js
@@ -0,0 +1,4 @@
+import("system.result");
+import("system.vars");
+
+result.string(vars.get("$param.MSTTeamId_param"));
\ No newline at end of file
diff --git a/entity/MSTTeamDocument_entity/entityfields/documents/dropDownProcess.js b/entity/MSTTeamDocument_entity/entityfields/documents/dropDownProcess.js
index 5fa658ec1ea..d46e42f287a 100644
--- a/entity/MSTTeamDocument_entity/entityfields/documents/dropDownProcess.js
+++ b/entity/MSTTeamDocument_entity/entityfields/documents/dropDownProcess.js
@@ -4,27 +4,17 @@ import("system.vars");
 import("system.logging");
 import("Sql_lib");
 
-if(vars.get("$field.ALLCHANNELS"))
+var channelName = vars.get("$field.CHANNEL");
+if (channelName)
 {
-    var channelId = vars.get("$field.ALLCHANNELS");
-
-    var teamId = newSelect("MST_TEAMID")
-        .from("MST_TEAM")
-        .where("MST_TEAM.OBJECT_ROWID", vars.get("$param.ObjectRowId_param"))
-        .cell();
-
-    var allChannels = teams.getAllChannelsInTeam(teamId, null);
-
-    var documents = teams.getAllDocumentsOfChannel(teamId, allChannels[channelId])
-    var jsonDocuments = JSON.parse(documents);
+    var teamId = vars.get("$param.MSTTeamId_param");
     
-    var resultString = [[jsonDocuments[0].downloadUrl, jsonDocuments[0].name]];
-//    for (var i = 0; i < jsonDocuments.length; i++)
-//    {
-//        resultString = resultString + "[" + jsonDocuments[i].downloadUrl + ", " + jsonDocuments[i].name + "]";
-//    }
-//    var upnsOfOwners = [["marco@mbsolutions2.onmicrosoft.com", "marco@mbsolutions2.onmicrosoft.com"], ["franz@mbsolutions2.onmicrosoft.com", "franz@mbsolutions2.onmicrosoft.com"], ["martin@mbsolutions2.onmicrosoft.com", "martin@mbsolutions2.onmicrosoft.com"]];
-
-//    resultString = resultString + "]";
-    result.object(resultString);
-}
\ No newline at end of file
+    var documents = teams.getAllDocuments(teamId, channelName);
+    documents = documents.map(function (document)
+    {
+        return [JSON.stringify([document.downloadUrl, document.name]), document.name];
+    });
+    result.object(documents);
+}
+else
+    result.object([]);
\ No newline at end of file
diff --git a/entity/MSTTeamDocument_entity/recordcontainers/jdito/onInsert.js b/entity/MSTTeamDocument_entity/recordcontainers/jdito/onInsert.js
index 6bd9ad9deff..d97ac448ef7 100644
--- a/entity/MSTTeamDocument_entity/recordcontainers/jdito/onInsert.js
+++ b/entity/MSTTeamDocument_entity/recordcontainers/jdito/onInsert.js
@@ -8,30 +8,20 @@ import("system.net")
 import("system.logging");
 import("system.neon");
 
-
 var rowData = vars.get("$local.rowdata");
-
 var documents = text.decodeMS(rowData["DOCUMENTS.value"]);
 
-for(var i=0; i<documents.length; i++)
+documents.forEach(function (document)
 {
-    //hier muss überprüft werden ob es dieses Dokument schon in der Datenbank gibt!
-//   if(documents[i].alreadyExistInDB)
-//        break;
-    //Wenn es dieses noch nicht gibt, wird es in die DB gespeichert
-    var docName = "Präsentation 1.pptx";
-    var downloadUrl = documents;
-    
+    var [downloadUrl, documentName] = JSON.parse(document);
     var file = net.getURLContent(downloadUrl, false, null, null, null, false);
     
     var assignmentTable = vars.get("$param.AssignmentTable_param");
     var assignmentName = vars.get("$param.AssignmentName_param");
     var assignmentRowId = vars.get("$param.ObjectRowId_param");
-    var alias = "_____SYSTEMALIAS";
-
+    var alias = SqlUtils.getBinariesAlias();
 
     var uid = db.insertBinary(assignmentTable, assignmentName, assignmentRowId, null, 
-            file, docName, "Hier können Sie nachträglich ihre Description ändern", "", alias, util.getNewUUID());    
-}
-
+            file, documentName, "", "", alias, util.getNewUUID());    
+});
 
diff --git a/entity/MSTTeamsMessage_entity/MSTTeamsMessage_entity.aod b/entity/MSTTeamsMessage_entity/MSTTeamsMessage_entity.aod
index 4e720cc38ed..0b3fde18fc1 100644
--- a/entity/MSTTeamsMessage_entity/MSTTeamsMessage_entity.aod
+++ b/entity/MSTTeamsMessage_entity/MSTTeamsMessage_entity.aod
@@ -49,11 +49,11 @@
       <name>TeamId_param</name>
       <expose v="true" />
     </entityParameter>
-    <entityActionField>
-      <name>LoadOlderMessages</name>
-      <title>Lade neue Nachrichten</title>
-      <onActionProcess>%aditoprj%/entity/MSTTeamsMessage_entity/entityfields/loadoldermessages/onActionProcess.js</onActionProcess>
-    </entityActionField>
+    <entityParameter>
+      <name>LoadNext_param</name>
+      <expose v="true" />
+      <documentation>%aditoprj%/entity/MSTTeamsMessage_entity/entityfields/loadnext_param/documentation.adoc</documentation>
+    </entityParameter>
   </entityFields>
   <recordContainers>
     <jDitoRecordContainer>
diff --git a/entity/MSTTeamsMessage_entity/entityfields/loadnext_param/documentation.adoc b/entity/MSTTeamsMessage_entity/entityfields/loadnext_param/documentation.adoc
new file mode 100644
index 00000000000..c5debf74124
--- /dev/null
+++ b/entity/MSTTeamsMessage_entity/entityfields/loadnext_param/documentation.adoc
@@ -0,0 +1,3 @@
+= LoadNext_param
+
+A random UID to trigger a refresh
\ No newline at end of file
diff --git a/entity/MSTTeamsMessage_entity/entityfields/loadoldermessages/onActionProcess.js b/entity/MSTTeamsMessage_entity/entityfields/loadoldermessages/onActionProcess.js
deleted file mode 100644
index c7eb3376dab..00000000000
--- a/entity/MSTTeamsMessage_entity/entityfields/loadoldermessages/onActionProcess.js
+++ /dev/null
@@ -1,6 +0,0 @@
-import("system.neon");
-import("system.vars");
-
-vars.set("$context.loadNextMessages", true);
-
-neon.refreshAll();
\ No newline at end of file
diff --git a/entity/MSTTeamsMessage_entity/recordcontainers/jdito/contentProcess.js b/entity/MSTTeamsMessage_entity/recordcontainers/jdito/contentProcess.js
index aceecd801c8..d8c0bad8a65 100644
--- a/entity/MSTTeamsMessage_entity/recordcontainers/jdito/contentProcess.js
+++ b/entity/MSTTeamsMessage_entity/recordcontainers/jdito/contentProcess.js
@@ -5,7 +5,8 @@ import("system.util");
 import("system.vars");
 import("system.neon");
 
-var loadNextMessages = vars.exists("$context.loadNextMessages") && vars.get("$context.loadNextMessages");
+var loadNextMessages = vars.exists("$param.LoadNext_param") && vars.get("$param.LoadNext_param");
+var messageAmount = 10;
 var channelMessages;
 var messages = [];
 
@@ -14,17 +15,14 @@ if (loadNextMessages)
     var nextLink = vars.exists("$context.nextLink") ? vars.get("$context.nextLink") : null;
     if(nextLink)
     {
-       channelMessages = teams.getNextChannelMessages(nextLink);
-       channelMessages = JSON.parse(channelMessages);
+       channelMessages = teams.getNextChannelMessages(nextLink, messageAmount);
        messages = channelMessages.messages;
        vars.set("$context.nextLink", channelMessages.nextLink || null);
     }
-    vars.set("$context.loadNextMessages", false);
 }
 else if (vars.get("$param.TeamId_param") && vars.get("$param.Channel_param"))
 {
-    channelMessages = teams.getChannelMessages(vars.get("$param.TeamId_param"), vars.get("$param.Channel_param"), 10);
-    channelMessages = JSON.parse(channelMessages);
+    channelMessages = teams.getChannelMessages(vars.get("$param.TeamId_param"), vars.get("$param.Channel_param"), messageAmount);
     messages = channelMessages.messages;
     
     vars.set("$context.nextLink", channelMessages.nextLink || null);
diff --git a/entity/Salesproject_entity/Salesproject_entity.aod b/entity/Salesproject_entity/Salesproject_entity.aod
index a185c389fad..30cccf06899 100644
--- a/entity/Salesproject_entity/Salesproject_entity.aod
+++ b/entity/Salesproject_entity/Salesproject_entity.aod
@@ -339,6 +339,10 @@
           <name>AssignmentTable_param</name>
           <valueProcess>%aditoprj%/entity/Salesproject_entity/entityfields/documents/children/assignmenttable_param/valueProcess.js</valueProcess>
         </entityParameter>
+        <entityParameter>
+          <name>MSTTeamId_param</name>
+          <valueProcess>%aditoprj%/entity/Salesproject_entity/entityfields/documents/children/mstteamid_param/valueProcess.js</valueProcess>
+        </entityParameter>
       </children>
     </entityConsumer>
     <entityConsumer>
diff --git a/entity/Salesproject_entity/entityfields/documents/children/mstteamid_param/valueProcess.js b/entity/Salesproject_entity/entityfields/documents/children/mstteamid_param/valueProcess.js
new file mode 100644
index 00000000000..8be21737ac0
--- /dev/null
+++ b/entity/Salesproject_entity/entityfields/documents/children/mstteamid_param/valueProcess.js
@@ -0,0 +1,4 @@
+import("system.vars");
+import("system.result");
+
+result.string(vars.get("$field.MST_TEAM_ID"));
\ No newline at end of file
diff --git a/neonView/MSTTeamActivityImportEdit_view/MSTTeamActivityImportEdit_view.aod b/neonView/MSTTeamActivityImportEdit_view/MSTTeamActivityImportEdit_view.aod
index 076d6f1ebf4..6f2f174e004 100644
--- a/neonView/MSTTeamActivityImportEdit_view/MSTTeamActivityImportEdit_view.aod
+++ b/neonView/MSTTeamActivityImportEdit_view/MSTTeamActivityImportEdit_view.aod
@@ -2,11 +2,12 @@
 <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>MSTTeamActivityImportEdit_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
+  <size>NORMAL</size>
   <isOverlay v="true" />
   <layout>
-    <boxLayout>
+    <noneLayout>
       <name>layout</name>
-    </boxLayout>
+    </noneLayout>
   </layout>
   <children>
     <genericViewTemplate>
@@ -25,5 +26,12 @@
       <entityField>Messages</entityField>
       <view>MSTTeamsMessageFilter_view</view>
     </neonViewReference>
+    <actionsViewTemplate>
+      <name>Actions</name>
+      <actions>
+        <element>loadNextMessages</element>
+      </actions>
+      <entityField>#ENTITY</entityField>
+    </actionsViewTemplate>
   </children>
 </neonView>
diff --git a/neonView/MSTTeamDocumentEdit_view/MSTTeamDocumentEdit_view.aod b/neonView/MSTTeamDocumentEdit_view/MSTTeamDocumentEdit_view.aod
index 85e283d46c4..9ebd3c2e3de 100644
--- a/neonView/MSTTeamDocumentEdit_view/MSTTeamDocumentEdit_view.aod
+++ b/neonView/MSTTeamDocumentEdit_view/MSTTeamDocumentEdit_view.aod
@@ -17,12 +17,8 @@
       <title>Dokumente</title>
       <fields>
         <entityFieldLink>
-          <name>2c2c923f-0e45-417f-950e-14826bc8fcbe</name>
-          <entityField>SEARCHVALUE</entityField>
-        </entityFieldLink>
-        <entityFieldLink>
-          <name>c42b1c0b-de04-400e-9068-1be2568a0d5f</name>
-          <entityField>ALLCHANNELS</entityField>
+          <name>6b122227-6e23-4f25-b66c-05f90e991005</name>
+          <entityField>CHANNEL</entityField>
         </entityFieldLink>
         <entityFieldLink>
           <name>9a0986dd-68b2-422e-b9b3-27d35640b44b</name>
diff --git a/neonView/MSTTeamsMessageFilter_view/MSTTeamsMessageFilter_view.aod b/neonView/MSTTeamsMessageFilter_view/MSTTeamsMessageFilter_view.aod
index 54a5bd52208..eb7a7c33ae5 100644
--- a/neonView/MSTTeamsMessageFilter_view/MSTTeamsMessageFilter_view.aod
+++ b/neonView/MSTTeamsMessageFilter_view/MSTTeamsMessageFilter_view.aod
@@ -27,12 +27,5 @@
         </neonTableColumn>
       </columns>
     </tableViewTemplate>
-    <actionsViewTemplate>
-      <name>LoadNextAction</name>
-      <actions>
-        <element>LoadOlderMessages</element>
-      </actions>
-      <entityField>#ENTITY</entityField>
-    </actionsViewTemplate>
   </children>
 </neonView>
-- 
GitLab


From ce70c11567cc8c263769ea2ec920c9dee410ce47 Mon Sep 17 00:00:00 2001
From: "M.Bilda" <m.bilda@adito.de>
Date: Mon, 17 Aug 2020 09:26:35 +0200
Subject: [PATCH 015/184] 1060809 - added function getWebUrl for choosen Teams

---
 .../MSTChooseTeam_entity/recordcontainers/jdito/onInsert.js   | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/entity/MSTChooseTeam_entity/recordcontainers/jdito/onInsert.js b/entity/MSTChooseTeam_entity/recordcontainers/jdito/onInsert.js
index 2d238645284..f119fef1e7a 100644
--- a/entity/MSTChooseTeam_entity/recordcontainers/jdito/onInsert.js
+++ b/entity/MSTChooseTeam_entity/recordcontainers/jdito/onInsert.js
@@ -14,6 +14,7 @@ if(teamIdAndName)
 {    
     var [teamId, teamName] = JSON.parse(teamIdAndName);
     var channelId = teams.getGeneralChannelId(teamId);
+    var webUrl = teams.getWebUrl(teamId);
     
     var mstTeamId = newSelect("MST_TEAMID")
         .from("MST_TEAM")
@@ -26,7 +27,8 @@ if(teamIdAndName)
             "MST_TEAMID" : teamId,
             "TEAMNAME" : teamName,
             "GENERAL_CHANNELID" : channelId,
-            "IS_ARCHIVED" : 0
+            "IS_ARCHIVED" : 0,
+            "WEB_URL" : webUrl
         }, "MST_TEAM");
     }
     newWhere("SALESPROJECT.SALESPROJECTID", "$param.SalesprojectId_param").updateFields({
-- 
GitLab


From 11227a0d81a5353da668831667f43852388dd3a7 Mon Sep 17 00:00:00 2001
From: "S.Listl" <s.listl@adito.de>
Date: Mon, 17 Aug 2020 11:47:53 +0200
Subject: [PATCH 016/184] #1060809 MST remove deleted teams serverProcess, bot
 webservice

---
 .../recordcontainers/jdito/onUpdate.js        |  4 ++-
 .../mstws.aod => mstBot_rest/mstBot_rest.aod} |  4 +--
 process/{mstws => mstBot_rest}/process.js     | 30 +++++++++++++++++++
 .../removeMSTTeams_serverProcess/process.js   | 21 +++++++++++++
 .../removeMSTTeams_serverProcess.aod          | 10 +++++++
 5 files changed, 66 insertions(+), 3 deletions(-)
 rename process/{mstws/mstws.aod => mstBot_rest/mstBot_rest.aod} (87%)
 rename process/{mstws => mstBot_rest}/process.js (73%)
 create mode 100644 process/removeMSTTeams_serverProcess/process.js
 create mode 100644 process/removeMSTTeams_serverProcess/removeMSTTeams_serverProcess.aod

diff --git a/entity/MSTTeam_entity/recordcontainers/jdito/onUpdate.js b/entity/MSTTeam_entity/recordcontainers/jdito/onUpdate.js
index f00f1817d78..2554384b37e 100644
--- a/entity/MSTTeam_entity/recordcontainers/jdito/onUpdate.js
+++ b/entity/MSTTeam_entity/recordcontainers/jdito/onUpdate.js
@@ -45,9 +45,11 @@ if (internalMembers.length !== 0)
 if (externalMembers.length !== 0)
     teams.addExternalMembers(teamId, externalMembers);
 
+var owners = teams.getAllOwners(teamId);
 var removeMembers = deletedTeamMembers.map(function (member)
 {
-    return teams.createInternalUserConfig(member["#UID"]);
+    var isOwner = member["#UID"] in owners;
+    return teams.createInternalUserConfig(member["#UID"]).setOwner(isOwner);
 });
 
 if (removeMembers.length !== 0)
diff --git a/process/mstws/mstws.aod b/process/mstBot_rest/mstBot_rest.aod
similarity index 87%
rename from process/mstws/mstws.aod
rename to process/mstBot_rest/mstBot_rest.aod
index 0c7c1773bc8..dd88fc1a4c1 100644
--- a/process/mstws/mstws.aod
+++ b/process/mstBot_rest/mstBot_rest.aod
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
-  <name>mstws</name>
+  <name>mstBot_rest</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
-  <process>%aditoprj%/process/mstws/process.js</process>
+  <process>%aditoprj%/process/mstBot_rest/process.js</process>
   <publishAsWebservice v="true" />
   <style>REST</style>
   <restAcceptedMimeType>application/json</restAcceptedMimeType>
diff --git a/process/mstws/process.js b/process/mstBot_rest/process.js
similarity index 73%
rename from process/mstws/process.js
rename to process/mstBot_rest/process.js
index 09a50633a5b..b6156a72377 100644
--- a/process/mstws/process.js
+++ b/process/mstBot_rest/process.js
@@ -1,5 +1,6 @@
 import("system.teams");
 import("system.logging");
+import("system.text");
 import("system.util");
 import("Sql_lib");
 
@@ -23,12 +24,14 @@ function restpost(pRequestAsJson)
     {
         newWhere("MST_TEAM.MST_TEAMID", teamId)
             .updateFields({"SERVICE_URL" : serviceUrl});
+        return pRequestAsJson;
     }
     //Sollte jemand die APP manuell wieder entfernen, gibt es einen "AbschiedsRequest", lösche die ServiceUrl aus der DB
     if(eventType == "teamMemberRemoved" && who == "ADITO Bot")
     {    
        newWhere("MST_TEAM.MST_TEAMID", teamId)
             .updateFields({"SERVICE_URL" : ""});
+        return pRequestAsJson;
     }
     
     //_____________________________________________________________
@@ -49,5 +52,32 @@ function restpost(pRequestAsJson)
     // wird hier keine teams.Funktion benötigt
     //Weitere Schritte: text aufsplittet anhand der Syntax und die einzelnen Kommandos umsetzen
     
+    var plainMessage = text.html2text(pHTML);
+    
+    var splitMessage = plainMessage.split("/");
+    if (splitMessage.length !== 2)
+        return pRequestAsJson;
+    
+    var command = splitMessage[1].split(/\s+?/);
+    var parameters = {};
+    command.slice(1).forEach(function (param)
+    {
+        param = param.split("=");
+        if (param.length !== 2)
+            return;
+        parameters[param[0]] = param[1];
+    });
+    command = command[0];
+    
+    
+    switch (command)
+    {
+        case "addTask":
+            var fieldValues = {};
+            if ("editor" in parameters)
+                //TODO: insert task
+            
+    }
+    
     return pRequestAsJson;
 }
\ No newline at end of file
diff --git a/process/removeMSTTeams_serverProcess/process.js b/process/removeMSTTeams_serverProcess/process.js
new file mode 100644
index 00000000000..83b19e678d4
--- /dev/null
+++ b/process/removeMSTTeams_serverProcess/process.js
@@ -0,0 +1,21 @@
+import("system.teams");
+import("Sql_lib");
+
+var archivedTeams = teams.getAllArchivedTeams(null);
+var dbArchivedTeams = newSelect("MST_TEAMID")
+    .from("MST_TEAM")
+    .where("MST_TEAM.IS_ARCHIVED", "1")
+    .arrayColumn();
+
+var teamIdsToDelete = dbArchivedTeams.filter(function (teamId)
+{
+    return !(teamId in archivedTeams);
+});
+
+if (teamIdsToDelete.length > 0)
+{
+    newWhere("MST_TEAM.MST_TEAMID", teamIdsToDelete, SqlBuilder.IN())
+        .deleteData();
+    newWhere("SALESPROJECT.MST_TEAM_ID", teamIdsToDelete, SqlBuilder.IN())
+        .updateFields({"MST_TEAM_ID": ""});
+}
\ No newline at end of file
diff --git a/process/removeMSTTeams_serverProcess/removeMSTTeams_serverProcess.aod b/process/removeMSTTeams_serverProcess/removeMSTTeams_serverProcess.aod
new file mode 100644
index 00000000000..f8b67e0fdd0
--- /dev/null
+++ b/process/removeMSTTeams_serverProcess/removeMSTTeams_serverProcess.aod
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+  <name>removeMSTTeams_serverProcess</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <process>%aditoprj%/process/removeMSTTeams_serverProcess/process.js</process>
+  <alias>Data_alias</alias>
+  <variants>
+    <element>EXECUTABLE</element>
+  </variants>
+</process>
-- 
GitLab


From bcd877953ffaac50144c2e1a7b52d52f13ee3ced Mon Sep 17 00:00:00 2001
From: Tobias Feldmann <t.feldmann@adito.de>
Date: Wed, 19 Aug 2020 16:38:49 +0200
Subject: [PATCH 017/184] ORGANISATION_REPORT_DATA Field in Organisation_entity
 was calculated unnecessarily

---
 .../entityfields/organisation_report_data/valueProcess.js | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/entity/Organisation_entity/entityfields/organisation_report_data/valueProcess.js b/entity/Organisation_entity/entityfields/organisation_report_data/valueProcess.js
index 873ef5f7989..0088b85da11 100644
--- a/entity/Organisation_entity/entityfields/organisation_report_data/valueProcess.js
+++ b/entity/Organisation_entity/entityfields/organisation_report_data/valueProcess.js
@@ -1,13 +1,13 @@
-import("system.logging");
 import("system.vars");
 import("system.result");
 import("system.neon");
 import("Organisation_lib");
 
 var presentationMode = vars.get("$sys.presentationmode");
-if (presentationMode != neon.CONTEXT_PRESENTATIONMODE_EDIT) {
-    var reportData = OrgUtils.buildOrgReport(vars.get("$field.ORGANISATIONID"), vars.get("$field.CONTACTID"))
-
+var opState = vars.get("$sys.operatingstate");
+if (opState == neon.OPERATINGSTATE_VIEW && presentationMode == neon.CONTEXT_PRESENTATIONMODE_FULL ) 
+{
+    var reportData = OrgUtils.buildOrgReport(vars.get("$field.ORGANISATIONID"), vars.get("$field.CONTACTID"));
     if (reportData != null) {
         result.string(reportData[1]);
     }
-- 
GitLab


From eaee30a5d935d4cb042c25f678a33ac443a44523 Mon Sep 17 00:00:00 2001
From: "S.Listl" <s.listl@adito.de>
Date: Thu, 20 Aug 2020 14:12:22 +0200
Subject: [PATCH 018/184] mstBot_rest webservice

---
 process/mstBot_rest/process.js | 32 ++++++++++++++++++++++----------
 1 file changed, 22 insertions(+), 10 deletions(-)

diff --git a/process/mstBot_rest/process.js b/process/mstBot_rest/process.js
index b6156a72377..1b362801118 100644
--- a/process/mstBot_rest/process.js
+++ b/process/mstBot_rest/process.js
@@ -1,8 +1,11 @@
+import("system.datetime");
 import("system.teams");
 import("system.logging");
 import("system.text");
 import("system.util");
 import("Sql_lib");
+import("KeywordRegistry_basic");
+import("Date_lib");
 
 function restpost(pRequestAsJson)
 {
@@ -54,11 +57,11 @@ function restpost(pRequestAsJson)
     
     var plainMessage = text.html2text(pHTML);
     
-    var splitMessage = plainMessage.split("/");
-    if (splitMessage.length !== 2)
+    var messageParts = plainMessage.split("/");
+    if (messageParts.length !== 2)
         return pRequestAsJson;
     
-    var command = splitMessage[1].split(/\s+?/);
+    var command = messageParts[1].split(/\s+?/);
     var parameters = {};
     command.slice(1).forEach(function (param)
     {
@@ -69,14 +72,23 @@ function restpost(pRequestAsJson)
     });
     command = command[0];
     
-    
-    switch (command)
+    if (command == "addTask" && parameters.editor && parameters.subject)
     {
-        case "addTask":
-            var fieldValues = {};
-            if ("editor" in parameters)
-                //TODO: insert task
-            
+        var currentDate = datetime.date();
+        var fieldValues = {
+            "KIND": $KeywordRegistry.taskType$task(),
+            "START_DATE": currentDate,
+            "MATURITY_DATE": Duration.ofDays(7).getDateWithDurationAdded(currentDate).getTime(),
+            "PRIORITY": $KeywordRegistry.taskPriority$low(),
+            "STATUS": $KeywordRegistry.taskStatus$new(),
+            "SUBJECT": parameters.subject,
+            "REQUESTOR_CONTACT_ID": "",
+            "PROGRESS": $KeywordRegistry.taskProgress$0()
+        };
+        if ("editor" in parameters)
+            fieldValues["EDITOR_CONTACT_ID"] = ""; //TODO: find out contactid
+
+        new SqlBuilder.insertFields(fieldValues, "TASK", "TASKID");
     }
     
     return pRequestAsJson;
-- 
GitLab


From b398231ea6c3ddf9b5ca13e86eca61ffce7106a4 Mon Sep 17 00:00:00 2001
From: "S.Listl" <s.listl@adito.de>
Date: Tue, 25 Aug 2020 12:37:48 +0000
Subject: [PATCH 019/184] AnyContact_entity missing provider re-added

(cherry picked from commit 23b680404c70c3368b9a1350b5fd806f4794c185)
---
 .../AnyContact_entity/AnyContact_entity.aod   | 22 +++++++++++++++++++
 1 file changed, 22 insertions(+)

diff --git a/entity/AnyContact_entity/AnyContact_entity.aod b/entity/AnyContact_entity/AnyContact_entity.aod
index 1fa8e83a7e7..65c0aee1508 100644
--- a/entity/AnyContact_entity/AnyContact_entity.aod
+++ b/entity/AnyContact_entity/AnyContact_entity.aod
@@ -80,6 +80,28 @@
         </entityDependency>
       </dependencies>
     </entityProvider>
+    <entityProvider>
+      <name>ContactsByIds</name>
+      <documentation>%aditoprj%/entity/AnyContact_entity/entityfields/contactsbyids/documentation.adoc</documentation>
+      <dependencies>
+        <entityDependency>
+          <name>0206f7a8-fd58-47e8-8b7a-5ff4531e56fb</name>
+          <entityName>QuickEntry_entity</entityName>
+          <fieldName>OrgAndPersDuplicates</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+      </dependencies>
+      <children>
+        <entityParameter>
+          <name>ContactId_param</name>
+          <expose v="false" />
+        </entityParameter>
+      </children>
+    </entityProvider>
+    <entityParameter>
+      <name>ContactIds_param</name>
+      <expose v="true" />
+    </entityParameter>
     <entityField>
       <name>ADDRESS_ID</name>
       <title>standard address</title>
-- 
GitLab


From 527ac66584077c3bb34250d1d117e7cdb8588d66 Mon Sep 17 00:00:00 2001
From: "s.pongratz" <s.pongratz@adito.de>
Date: Thu, 9 Jul 2020 11:35:52 +0000
Subject: [PATCH 020/184] =?UTF-8?q?#1061243-Bugfix=5FL=C3=B6schenAllerDate?=
 =?UTF-8?q?ns=C3=A4tze=20Verwendung=20des=20Alias?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

(cherry picked from commit 2e142812a5e95755ab31ef586f89dcb8bbfca7f5)
---
 .../entityfields/leadimportreset/onActionProcess.js             | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/entity/Leadimport_entity/entityfields/leadimportreset/onActionProcess.js b/entity/Leadimport_entity/entityfields/leadimportreset/onActionProcess.js
index c7b4f0fdf76..e3ab27e0a12 100644
--- a/entity/Leadimport_entity/entityfields/leadimportreset/onActionProcess.js
+++ b/entity/Leadimport_entity/entityfields/leadimportreset/onActionProcess.js
@@ -46,7 +46,7 @@ function _deleteData (pTableName, pleadimportId, pdateADayBefor)
 {
     let uTableName = pTableName.charAt(0);
     newWhere(pTableName + "." + pTableName + "ID", 
-        newSelect(pTableName + "." + pTableName + "ID")
+        newSelect(uTableName + "." + pTableName + "ID")
         .from(pTableName, uTableName)
         .join("LEADLOG", "LEADLOG.DATE_NEW = " + uTableName + ".DATE_NEW")
         .where(uTableName + ".USER_NEW = LEADLOG.USER_NEW")
-- 
GitLab


From 78f69353a38aa579a0f3c23939119071b6427075 Mon Sep 17 00:00:00 2001
From: Johannes Goderbauer <j.goderbauer@adito.de>
Date: Tue, 1 Sep 2020 05:59:28 +0000
Subject: [PATCH 021/184] =?UTF-8?q?Merge=20branch=20'#1056853-Unverkn?=
 =?UTF-8?q?=C3=BCpfteMails=5FAktivit=C3=A4tenFilter'=20into=20'2020.1.3'?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

#1056853-UnverknüpfteMails_AktivitätenFilter Fehlender Import

See merge request xrm/basic!343

(cherry picked from commit 778d579e331cc15fe67aabb8767e678cb1b4796b)

cfed9679 #1056853-UnverknüpfteMails_AktivitätenFilter Fehlender Import
---
 .../db/filterextensions/isunlinked/filterValuesProcess.js        | 1 +
 1 file changed, 1 insertion(+)

diff --git a/entity/Activity_entity/recordcontainers/db/filterextensions/isunlinked/filterValuesProcess.js b/entity/Activity_entity/recordcontainers/db/filterextensions/isunlinked/filterValuesProcess.js
index 056eacc69de..2c7036f92c8 100644
--- a/entity/Activity_entity/recordcontainers/db/filterextensions/isunlinked/filterValuesProcess.js
+++ b/entity/Activity_entity/recordcontainers/db/filterextensions/isunlinked/filterValuesProcess.js
@@ -1,3 +1,4 @@
 import("system.result");
+import("system.translate");
 
 result.object([["true", translate.text("Yes")], ["false", translate.text("No")]]);
\ No newline at end of file
-- 
GitLab


From e97a1c55d8ed53f8e555878cb5aa79ab87c00cb7 Mon Sep 17 00:00:00 2001
From: Sebastian Listl <s.listl@adito.de>
Date: Tue, 1 Sep 2020 16:05:36 +0200
Subject: [PATCH 022/184] #1064484 MSTeams entities renamed

---
 .../MSTChooseTeam_entity.aod                  |  1 +
 .../MSTTeamMember_entity.aod                  |  7 ++-----
 .../MSTeamsActivityImport_entity.aod}         | 21 ++++++++++---------
 .../children/teamid_param/valueProcess.js     |  0
 .../loadnextmessages/onActionProcess.js       |  0
 .../children/channel_param/valueProcess.js    |  0
 .../children/loadnext_param/valueProcess.js   |  0
 .../children/teamid_param/valueProcess.js     |  0
 .../entityfields/team_id/valueProcess.js      |  0
 .../recordcontainers/jdito/contentProcess.js  |  0
 .../recordcontainers/jdito/onInsert.js        |  0
 .../MSTeamsAddMembers_entity.aod}             | 13 ++++++------
 .../salesprojectid_param/valueProcess.js      |  0
 .../entityfields/mst_team_id/valueProcess.js  |  0
 .../entityfields/mst_teamname/valueProcess.js |  0
 .../recordcontainers/jdito/contentProcess.js  |  0
 .../recordcontainers/jdito/onInsert.js        |  0
 .../MSTeamsChannel_entity.aod}                | 11 +++++-----
 .../contentTitleProcess.js                    |  0
 .../recordcontainers/jdito/contentProcess.js  |  0
 .../MSTeamsChat_entity.aod}                   | 17 ++++++++-------
 .../allchannels/dropDownProcess.js            |  0
 .../entityfields/allchannels/valueProcess.js  |  0
 .../children/messages_param/valueProcess.js   |  0
 .../loadnewmessages/onActionProcess.js        |  0
 .../loadnewmessages/stateProcess.js           |  0
 .../recordcontainers/jdito/contentProcess.js  |  0
 .../recordcontainers/jdito/onInsert.js        |  0
 .../MSTeamsDocument_entity.aod}               | 13 ++++++------
 .../children/teamid_param/valueProcess.js     |  0
 .../entityfields/documents/dropDownProcess.js |  0
 .../recordcontainers/jdito/contentProcess.js  |  0
 .../recordcontainers/jdito/onInsert.js        |  0
 .../MSTeamsMessage_entity.aod}                |  5 +++--
 .../loadnext_param/documentation.adoc         |  0
 .../recordcontainers/jdito/contentProcess.js  |  0
 .../Salesproject_entity.aod                   |  1 +
 .../MSTeamsActivityImport.aod}                |  8 +++----
 .../MSTeamsAddMembers.aod}                    |  8 +++----
 .../MSTeamsChannel.aod}                       |  4 ++--
 .../MSTeamsChat.aod}                          |  8 +++----
 .../MSTeamsDocument.aod}                      |  8 +++----
 .../MSTeamsMessage.aod}                       |  8 +++----
 .../MSTeamsActivityImportEdit_view.aod}       |  4 ++--
 .../MSTeamsAddMembersEdit_view.aod}           |  2 +-
 .../MSTeamsChatEdit_view.aod}                 |  4 ++--
 .../MSTeamsDocumentEdit_view.aod}             |  2 +-
 .../MSTeamsMessageFilter_view.aod}            |  2 +-
 process/MSTeams_lib/MSTeams_lib.aod           |  9 ++++++++
 process/MSTeams_lib/process.js                |  3 +++
 50 files changed, 88 insertions(+), 71 deletions(-)
 rename entity/{MSTTeamActivityImport_entity/MSTTeamActivityImport_entity.aod => MSTeamsActivityImport_entity/MSTeamsActivityImport_entity.aod} (81%)
 rename entity/{MSTTeamActivityImport_entity => MSTeamsActivityImport_entity}/entityfields/channels/children/teamid_param/valueProcess.js (100%)
 rename entity/{MSTTeamActivityImport_entity => MSTeamsActivityImport_entity}/entityfields/loadnextmessages/onActionProcess.js (100%)
 rename entity/{MSTTeamActivityImport_entity => MSTeamsActivityImport_entity}/entityfields/messages/children/channel_param/valueProcess.js (100%)
 rename entity/{MSTTeamActivityImport_entity => MSTeamsActivityImport_entity}/entityfields/messages/children/loadnext_param/valueProcess.js (100%)
 rename entity/{MSTTeamActivityImport_entity => MSTeamsActivityImport_entity}/entityfields/messages/children/teamid_param/valueProcess.js (100%)
 rename entity/{MSTTeamActivityImport_entity => MSTeamsActivityImport_entity}/entityfields/team_id/valueProcess.js (100%)
 rename entity/{MSTTeamActivityImport_entity => MSTeamsActivityImport_entity}/recordcontainers/jdito/contentProcess.js (100%)
 rename entity/{MSTTeamActivityImport_entity => MSTeamsActivityImport_entity}/recordcontainers/jdito/onInsert.js (100%)
 rename entity/{MSTTeamAddMembers_entity/MSTTeamAddMembers_entity.aod => MSTeamsAddMembers_entity/MSTeamsAddMembers_entity.aod} (83%)
 rename entity/{MSTTeamAddMembers_entity => MSTeamsAddMembers_entity}/entityfields/members/children/salesprojectid_param/valueProcess.js (100%)
 rename entity/{MSTTeamAddMembers_entity => MSTeamsAddMembers_entity}/entityfields/mst_team_id/valueProcess.js (100%)
 rename entity/{MSTTeamAddMembers_entity => MSTeamsAddMembers_entity}/entityfields/mst_teamname/valueProcess.js (100%)
 rename entity/{MSTTeamAddMembers_entity => MSTeamsAddMembers_entity}/recordcontainers/jdito/contentProcess.js (100%)
 rename entity/{MSTTeamAddMembers_entity => MSTeamsAddMembers_entity}/recordcontainers/jdito/onInsert.js (100%)
 rename entity/{MSTTeamChannel_entity/MSTTeamChannel_entity.aod => MSTeamsChannel_entity/MSTeamsChannel_entity.aod} (86%)
 rename entity/{MSTTeamChannel_entity => MSTeamsChannel_entity}/contentTitleProcess.js (100%)
 rename entity/{MSTTeamChannel_entity => MSTeamsChannel_entity}/recordcontainers/jdito/contentProcess.js (100%)
 rename entity/{MSTTeamChat_entity/MSTTeamChat_entity.aod => MSTeamsChat_entity/MSTeamsChat_entity.aod} (84%)
 rename entity/{MSTTeamChat_entity => MSTeamsChat_entity}/entityfields/allchannels/dropDownProcess.js (100%)
 rename entity/{MSTTeamChat_entity => MSTeamsChat_entity}/entityfields/allchannels/valueProcess.js (100%)
 rename entity/{MSTTeamChat_entity => MSTeamsChat_entity}/entityfields/consumer/children/messages_param/valueProcess.js (100%)
 rename entity/{MSTTeamChat_entity => MSTeamsChat_entity}/entityfields/loadnewmessages/onActionProcess.js (100%)
 rename entity/{MSTTeamChat_entity => MSTeamsChat_entity}/entityfields/loadnewmessages/stateProcess.js (100%)
 rename entity/{MSTTeamChat_entity => MSTeamsChat_entity}/recordcontainers/jdito/contentProcess.js (100%)
 rename entity/{MSTTeamChat_entity => MSTeamsChat_entity}/recordcontainers/jdito/onInsert.js (100%)
 rename entity/{MSTTeamDocument_entity/MSTTeamDocument_entity.aod => MSTeamsDocument_entity/MSTeamsDocument_entity.aod} (86%)
 rename entity/{MSTTeamDocument_entity => MSTeamsDocument_entity}/entityfields/channels/children/teamid_param/valueProcess.js (100%)
 rename entity/{MSTTeamDocument_entity => MSTeamsDocument_entity}/entityfields/documents/dropDownProcess.js (100%)
 rename entity/{MSTTeamDocument_entity => MSTeamsDocument_entity}/recordcontainers/jdito/contentProcess.js (100%)
 rename entity/{MSTTeamDocument_entity => MSTeamsDocument_entity}/recordcontainers/jdito/onInsert.js (100%)
 rename entity/{MSTTeamsMessage_entity/MSTTeamsMessage_entity.aod => MSTeamsMessage_entity/MSTeamsMessage_entity.aod} (95%)
 rename entity/{MSTTeamsMessage_entity => MSTeamsMessage_entity}/entityfields/loadnext_param/documentation.adoc (100%)
 rename entity/{MSTTeamsMessage_entity => MSTeamsMessage_entity}/recordcontainers/jdito/contentProcess.js (100%)
 rename neonContext/{MSTTeamActivityImport/MSTTeamActivityImport.aod => MSTeamsActivityImport/MSTeamsActivityImport.aod} (70%)
 rename neonContext/{MSTTeamAddMembers/MSTTeamAddMembers.aod => MSTeamsAddMembers/MSTeamsAddMembers.aod} (73%)
 rename neonContext/{MSTTeamChannel/MSTTeamChannel.aod => MSTeamsChannel/MSTeamsChannel.aod} (81%)
 rename neonContext/{MSTTeamChat/MSTTeamChat.aod => MSTeamsChat/MSTeamsChat.aod} (75%)
 rename neonContext/{MSTTeamDocument/MSTTeamDocument.aod => MSTeamsDocument/MSTeamsDocument.aod} (73%)
 rename neonContext/{MSTTeamsMessage/MSTTeamsMessage.aod => MSTeamsMessage/MSTeamsMessage.aod} (72%)
 rename neonView/{MSTTeamActivityImportEdit_view/MSTTeamActivityImportEdit_view.aod => MSTeamsActivityImportEdit_view/MSTeamsActivityImportEdit_view.aod} (92%)
 rename neonView/{MSTTeamAddMembersEdit_view/MSTTeamAddMembersEdit_view.aod => MSTeamsAddMembersEdit_view/MSTeamsAddMembersEdit_view.aod} (95%)
 rename neonView/{MSTTeamChatEdit_view/MSTTeamChatEdit_view.aod => MSTeamsChatEdit_view/MSTeamsChatEdit_view.aod} (94%)
 rename neonView/{MSTTeamDocumentEdit_view/MSTTeamDocumentEdit_view.aod => MSTeamsDocumentEdit_view/MSTeamsDocumentEdit_view.aod} (96%)
 rename neonView/{MSTTeamsMessageFilter_view/MSTTeamsMessageFilter_view.aod => MSTeamsMessageFilter_view/MSTeamsMessageFilter_view.aod} (96%)
 create mode 100644 process/MSTeams_lib/MSTeams_lib.aod
 create mode 100644 process/MSTeams_lib/process.js

diff --git a/entity/MSTChooseTeam_entity/MSTChooseTeam_entity.aod b/entity/MSTChooseTeam_entity/MSTChooseTeam_entity.aod
index 0857d6c94d4..cdad103f047 100644
--- a/entity/MSTChooseTeam_entity/MSTChooseTeam_entity.aod
+++ b/entity/MSTChooseTeam_entity/MSTChooseTeam_entity.aod
@@ -2,6 +2,7 @@
 <entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.14" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.14">
   <name>MSTChooseTeam_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
+  <siblings />
   <recordContainer>jdito</recordContainer>
   <entityFields>
     <entityProvider>
diff --git a/entity/MSTTeamMember_entity/MSTTeamMember_entity.aod b/entity/MSTTeamMember_entity/MSTTeamMember_entity.aod
index 7981f828883..a70f06da972 100644
--- a/entity/MSTTeamMember_entity/MSTTeamMember_entity.aod
+++ b/entity/MSTTeamMember_entity/MSTTeamMember_entity.aod
@@ -2,6 +2,7 @@
 <entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.14" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.14">
   <name>MSTTeamMember_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
+  <siblings />
   <recordContainer>jdito</recordContainer>
   <entityFields>
     <entityProvider>
@@ -9,7 +10,7 @@
       <dependencies>
         <entityDependency>
           <name>335d30c4-7beb-4dcb-8a0f-de85108530a9</name>
-          <entityName>MSTTeamAddMembers_entity</entityName>
+          <entityName>MSTeamsAddMembers_entity</entityName>
           <fieldName>Members</fieldName>
           <isConsumer v="false" />
         </entityDependency>
@@ -25,10 +26,6 @@
     <entityField>
       <name>UID</name>
     </entityField>
-    <entityParameter>
-      <name>ROWID_param</name>
-      <expose v="true" />
-    </entityParameter>
     <entityParameter>
       <name>UpnsOfMembers_param</name>
       <expose v="true" />
diff --git a/entity/MSTTeamActivityImport_entity/MSTTeamActivityImport_entity.aod b/entity/MSTeamsActivityImport_entity/MSTeamsActivityImport_entity.aod
similarity index 81%
rename from entity/MSTTeamActivityImport_entity/MSTTeamActivityImport_entity.aod
rename to entity/MSTeamsActivityImport_entity/MSTeamsActivityImport_entity.aod
index 4cc35c57b22..cc1786851fb 100644
--- a/entity/MSTTeamActivityImport_entity/MSTTeamActivityImport_entity.aod
+++ b/entity/MSTeamsActivityImport_entity/MSTeamsActivityImport_entity.aod
@@ -1,7 +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.14" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.14">
-  <name>MSTTeamActivityImport_entity</name>
+  <name>MSTeamsActivityImport_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
+  <siblings />
   <recordContainer>jdito</recordContainer>
   <entityFields>
     <entityProvider>
@@ -21,15 +22,15 @@
       <children>
         <entityParameter>
           <name>Channel_param</name>
-          <valueProcess>%aditoprj%/entity/MSTTeamActivityImport_entity/entityfields/messages/children/channel_param/valueProcess.js</valueProcess>
+          <valueProcess>%aditoprj%/entity/MSTeamsActivityImport_entity/entityfields/messages/children/channel_param/valueProcess.js</valueProcess>
         </entityParameter>
         <entityParameter>
           <name>TeamId_param</name>
-          <valueProcess>%aditoprj%/entity/MSTTeamActivityImport_entity/entityfields/messages/children/teamid_param/valueProcess.js</valueProcess>
+          <valueProcess>%aditoprj%/entity/MSTeamsActivityImport_entity/entityfields/messages/children/teamid_param/valueProcess.js</valueProcess>
         </entityParameter>
         <entityParameter>
           <name>LoadNext_param</name>
-          <valueProcess>%aditoprj%/entity/MSTTeamActivityImport_entity/entityfields/messages/children/loadnext_param/valueProcess.js</valueProcess>
+          <valueProcess>%aditoprj%/entity/MSTeamsActivityImport_entity/entityfields/messages/children/loadnext_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
     </entityConsumer>
@@ -44,26 +45,26 @@
     </entityParameter>
     <entityField>
       <name>TEAM_ID</name>
-      <valueProcess>%aditoprj%/entity/MSTTeamActivityImport_entity/entityfields/team_id/valueProcess.js</valueProcess>
+      <valueProcess>%aditoprj%/entity/MSTeamsActivityImport_entity/entityfields/team_id/valueProcess.js</valueProcess>
     </entityField>
     <entityConsumer>
       <name>Channels</name>
       <dependency>
         <name>dependency</name>
-        <entityName>MSTTeamChannel_entity</entityName>
+        <entityName>MSTeamsChannel_entity</entityName>
         <fieldName>ChannelsForTeam</fieldName>
       </dependency>
       <children>
         <entityParameter>
           <name>TeamId_param</name>
-          <valueProcess>%aditoprj%/entity/MSTTeamActivityImport_entity/entityfields/channels/children/teamid_param/valueProcess.js</valueProcess>
+          <valueProcess>%aditoprj%/entity/MSTeamsActivityImport_entity/entityfields/channels/children/teamid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
     </entityConsumer>
     <entityActionField>
       <name>loadNextMessages</name>
       <title>Load older messages</title>
-      <onActionProcess>%aditoprj%/entity/MSTTeamActivityImport_entity/entityfields/loadnextmessages/onActionProcess.js</onActionProcess>
+      <onActionProcess>%aditoprj%/entity/MSTeamsActivityImport_entity/entityfields/loadnextmessages/onActionProcess.js</onActionProcess>
       <iconId>VAADIN:CLOCK</iconId>
     </entityActionField>
     <entityField>
@@ -74,8 +75,8 @@
     <jDitoRecordContainer>
       <name>jdito</name>
       <jDitoRecordAlias>Data_alias</jDitoRecordAlias>
-      <contentProcess>%aditoprj%/entity/MSTTeamActivityImport_entity/recordcontainers/jdito/contentProcess.js</contentProcess>
-      <onInsert>%aditoprj%/entity/MSTTeamActivityImport_entity/recordcontainers/jdito/onInsert.js</onInsert>
+      <contentProcess>%aditoprj%/entity/MSTeamsActivityImport_entity/recordcontainers/jdito/contentProcess.js</contentProcess>
+      <onInsert>%aditoprj%/entity/MSTeamsActivityImport_entity/recordcontainers/jdito/onInsert.js</onInsert>
       <recordFieldMappings>
         <jDitoRecordFieldMapping>
           <name>UID.value</name>
diff --git a/entity/MSTTeamActivityImport_entity/entityfields/channels/children/teamid_param/valueProcess.js b/entity/MSTeamsActivityImport_entity/entityfields/channels/children/teamid_param/valueProcess.js
similarity index 100%
rename from entity/MSTTeamActivityImport_entity/entityfields/channels/children/teamid_param/valueProcess.js
rename to entity/MSTeamsActivityImport_entity/entityfields/channels/children/teamid_param/valueProcess.js
diff --git a/entity/MSTTeamActivityImport_entity/entityfields/loadnextmessages/onActionProcess.js b/entity/MSTeamsActivityImport_entity/entityfields/loadnextmessages/onActionProcess.js
similarity index 100%
rename from entity/MSTTeamActivityImport_entity/entityfields/loadnextmessages/onActionProcess.js
rename to entity/MSTeamsActivityImport_entity/entityfields/loadnextmessages/onActionProcess.js
diff --git a/entity/MSTTeamActivityImport_entity/entityfields/messages/children/channel_param/valueProcess.js b/entity/MSTeamsActivityImport_entity/entityfields/messages/children/channel_param/valueProcess.js
similarity index 100%
rename from entity/MSTTeamActivityImport_entity/entityfields/messages/children/channel_param/valueProcess.js
rename to entity/MSTeamsActivityImport_entity/entityfields/messages/children/channel_param/valueProcess.js
diff --git a/entity/MSTTeamActivityImport_entity/entityfields/messages/children/loadnext_param/valueProcess.js b/entity/MSTeamsActivityImport_entity/entityfields/messages/children/loadnext_param/valueProcess.js
similarity index 100%
rename from entity/MSTTeamActivityImport_entity/entityfields/messages/children/loadnext_param/valueProcess.js
rename to entity/MSTeamsActivityImport_entity/entityfields/messages/children/loadnext_param/valueProcess.js
diff --git a/entity/MSTTeamActivityImport_entity/entityfields/messages/children/teamid_param/valueProcess.js b/entity/MSTeamsActivityImport_entity/entityfields/messages/children/teamid_param/valueProcess.js
similarity index 100%
rename from entity/MSTTeamActivityImport_entity/entityfields/messages/children/teamid_param/valueProcess.js
rename to entity/MSTeamsActivityImport_entity/entityfields/messages/children/teamid_param/valueProcess.js
diff --git a/entity/MSTTeamActivityImport_entity/entityfields/team_id/valueProcess.js b/entity/MSTeamsActivityImport_entity/entityfields/team_id/valueProcess.js
similarity index 100%
rename from entity/MSTTeamActivityImport_entity/entityfields/team_id/valueProcess.js
rename to entity/MSTeamsActivityImport_entity/entityfields/team_id/valueProcess.js
diff --git a/entity/MSTTeamActivityImport_entity/recordcontainers/jdito/contentProcess.js b/entity/MSTeamsActivityImport_entity/recordcontainers/jdito/contentProcess.js
similarity index 100%
rename from entity/MSTTeamActivityImport_entity/recordcontainers/jdito/contentProcess.js
rename to entity/MSTeamsActivityImport_entity/recordcontainers/jdito/contentProcess.js
diff --git a/entity/MSTTeamActivityImport_entity/recordcontainers/jdito/onInsert.js b/entity/MSTeamsActivityImport_entity/recordcontainers/jdito/onInsert.js
similarity index 100%
rename from entity/MSTTeamActivityImport_entity/recordcontainers/jdito/onInsert.js
rename to entity/MSTeamsActivityImport_entity/recordcontainers/jdito/onInsert.js
diff --git a/entity/MSTTeamAddMembers_entity/MSTTeamAddMembers_entity.aod b/entity/MSTeamsAddMembers_entity/MSTeamsAddMembers_entity.aod
similarity index 83%
rename from entity/MSTTeamAddMembers_entity/MSTTeamAddMembers_entity.aod
rename to entity/MSTeamsAddMembers_entity/MSTeamsAddMembers_entity.aod
index 791fc678cf4..93e9c9f9fc0 100644
--- a/entity/MSTTeamAddMembers_entity/MSTTeamAddMembers_entity.aod
+++ b/entity/MSTeamsAddMembers_entity/MSTeamsAddMembers_entity.aod
@@ -1,8 +1,9 @@
 <?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.14" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.14">
-  <name>MSTTeamAddMembers_entity</name>
+  <name>MSTeamsAddMembers_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <title>Add members</title>
+  <siblings />
   <recordContainer>jdito</recordContainer>
   <entityFields>
     <entityProvider>
@@ -21,7 +22,7 @@
       <children>
         <entityParameter>
           <name>SalesprojectId_param</name>
-          <valueProcess>%aditoprj%/entity/MSTTeamAddMembers_entity/entityfields/members/children/salesprojectid_param/valueProcess.js</valueProcess>
+          <valueProcess>%aditoprj%/entity/MSTeamsAddMembers_entity/entityfields/members/children/salesprojectid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
     </entityConsumer>
@@ -32,19 +33,19 @@
     <entityField>
       <name>MST_TEAMNAME</name>
       <title>Team name</title>
-      <valueProcess>%aditoprj%/entity/MSTTeamAddMembers_entity/entityfields/mst_teamname/valueProcess.js</valueProcess>
+      <valueProcess>%aditoprj%/entity/MSTeamsAddMembers_entity/entityfields/mst_teamname/valueProcess.js</valueProcess>
     </entityField>
     <entityField>
       <name>MST_TEAM_ID</name>
-      <valueProcess>%aditoprj%/entity/MSTTeamAddMembers_entity/entityfields/mst_team_id/valueProcess.js</valueProcess>
+      <valueProcess>%aditoprj%/entity/MSTeamsAddMembers_entity/entityfields/mst_team_id/valueProcess.js</valueProcess>
     </entityField>
   </entityFields>
   <recordContainers>
     <jDitoRecordContainer>
       <name>jdito</name>
       <jDitoRecordAlias>Data_alias</jDitoRecordAlias>
-      <contentProcess>%aditoprj%/entity/MSTTeamAddMembers_entity/recordcontainers/jdito/contentProcess.js</contentProcess>
-      <onInsert>%aditoprj%/entity/MSTTeamAddMembers_entity/recordcontainers/jdito/onInsert.js</onInsert>
+      <contentProcess>%aditoprj%/entity/MSTeamsAddMembers_entity/recordcontainers/jdito/contentProcess.js</contentProcess>
+      <onInsert>%aditoprj%/entity/MSTeamsAddMembers_entity/recordcontainers/jdito/onInsert.js</onInsert>
       <recordFieldMappings>
         <jDitoRecordFieldMapping>
           <name>UID.value</name>
diff --git a/entity/MSTTeamAddMembers_entity/entityfields/members/children/salesprojectid_param/valueProcess.js b/entity/MSTeamsAddMembers_entity/entityfields/members/children/salesprojectid_param/valueProcess.js
similarity index 100%
rename from entity/MSTTeamAddMembers_entity/entityfields/members/children/salesprojectid_param/valueProcess.js
rename to entity/MSTeamsAddMembers_entity/entityfields/members/children/salesprojectid_param/valueProcess.js
diff --git a/entity/MSTTeamAddMembers_entity/entityfields/mst_team_id/valueProcess.js b/entity/MSTeamsAddMembers_entity/entityfields/mst_team_id/valueProcess.js
similarity index 100%
rename from entity/MSTTeamAddMembers_entity/entityfields/mst_team_id/valueProcess.js
rename to entity/MSTeamsAddMembers_entity/entityfields/mst_team_id/valueProcess.js
diff --git a/entity/MSTTeamAddMembers_entity/entityfields/mst_teamname/valueProcess.js b/entity/MSTeamsAddMembers_entity/entityfields/mst_teamname/valueProcess.js
similarity index 100%
rename from entity/MSTTeamAddMembers_entity/entityfields/mst_teamname/valueProcess.js
rename to entity/MSTeamsAddMembers_entity/entityfields/mst_teamname/valueProcess.js
diff --git a/entity/MSTTeamAddMembers_entity/recordcontainers/jdito/contentProcess.js b/entity/MSTeamsAddMembers_entity/recordcontainers/jdito/contentProcess.js
similarity index 100%
rename from entity/MSTTeamAddMembers_entity/recordcontainers/jdito/contentProcess.js
rename to entity/MSTeamsAddMembers_entity/recordcontainers/jdito/contentProcess.js
diff --git a/entity/MSTTeamAddMembers_entity/recordcontainers/jdito/onInsert.js b/entity/MSTeamsAddMembers_entity/recordcontainers/jdito/onInsert.js
similarity index 100%
rename from entity/MSTTeamAddMembers_entity/recordcontainers/jdito/onInsert.js
rename to entity/MSTeamsAddMembers_entity/recordcontainers/jdito/onInsert.js
diff --git a/entity/MSTTeamChannel_entity/MSTTeamChannel_entity.aod b/entity/MSTeamsChannel_entity/MSTeamsChannel_entity.aod
similarity index 86%
rename from entity/MSTTeamChannel_entity/MSTTeamChannel_entity.aod
rename to entity/MSTeamsChannel_entity/MSTeamsChannel_entity.aod
index eea930f8279..9094b5680a4 100644
--- a/entity/MSTTeamChannel_entity/MSTTeamChannel_entity.aod
+++ b/entity/MSTeamsChannel_entity/MSTeamsChannel_entity.aod
@@ -1,8 +1,9 @@
 <?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.14" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.14">
-  <name>MSTTeamChannel_entity</name>
+  <name>MSTeamsChannel_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
-  <contentTitleProcess>%aditoprj%/entity/MSTTeamChannel_entity/contentTitleProcess.js</contentTitleProcess>
+  <siblings />
+  <contentTitleProcess>%aditoprj%/entity/MSTeamsChannel_entity/contentTitleProcess.js</contentTitleProcess>
   <recordContainer>jdito</recordContainer>
   <entityFields>
     <entityProvider>
@@ -20,7 +21,7 @@
       <dependencies>
         <entityDependency>
           <name>a784ee43-b2ef-4d55-a092-9c7f822905fa</name>
-          <entityName>MSTTeamActivityImport_entity</entityName>
+          <entityName>MSTeamsActivityImport_entity</entityName>
           <fieldName>Channels</fieldName>
           <isConsumer v="false" />
         </entityDependency>
@@ -37,7 +38,7 @@
       <dependencies>
         <entityDependency>
           <name>3dfb5be2-d956-4e8a-9aec-4c80b81e0527</name>
-          <entityName>MSTTeamDocument_entity</entityName>
+          <entityName>MSTeamsDocument_entity</entityName>
           <fieldName>Channels</fieldName>
           <isConsumer v="false" />
         </entityDependency>
@@ -48,7 +49,7 @@
     <jDitoRecordContainer>
       <name>jdito</name>
       <jDitoRecordAlias>Data_alias</jDitoRecordAlias>
-      <contentProcess>%aditoprj%/entity/MSTTeamChannel_entity/recordcontainers/jdito/contentProcess.js</contentProcess>
+      <contentProcess>%aditoprj%/entity/MSTeamsChannel_entity/recordcontainers/jdito/contentProcess.js</contentProcess>
       <recordFieldMappings>
         <jDitoRecordFieldMapping>
           <name>UID.value</name>
diff --git a/entity/MSTTeamChannel_entity/contentTitleProcess.js b/entity/MSTeamsChannel_entity/contentTitleProcess.js
similarity index 100%
rename from entity/MSTTeamChannel_entity/contentTitleProcess.js
rename to entity/MSTeamsChannel_entity/contentTitleProcess.js
diff --git a/entity/MSTTeamChannel_entity/recordcontainers/jdito/contentProcess.js b/entity/MSTeamsChannel_entity/recordcontainers/jdito/contentProcess.js
similarity index 100%
rename from entity/MSTTeamChannel_entity/recordcontainers/jdito/contentProcess.js
rename to entity/MSTeamsChannel_entity/recordcontainers/jdito/contentProcess.js
diff --git a/entity/MSTTeamChat_entity/MSTTeamChat_entity.aod b/entity/MSTeamsChat_entity/MSTeamsChat_entity.aod
similarity index 84%
rename from entity/MSTTeamChat_entity/MSTTeamChat_entity.aod
rename to entity/MSTeamsChat_entity/MSTeamsChat_entity.aod
index f09ac0a9ade..55e602c74a3 100644
--- a/entity/MSTTeamChat_entity/MSTTeamChat_entity.aod
+++ b/entity/MSTeamsChat_entity/MSTeamsChat_entity.aod
@@ -1,7 +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.14" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.14">
-  <name>MSTTeamChat_entity</name>
+  <name>MSTeamsChat_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
+  <siblings />
   <recordContainer>jdito</recordContainer>
   <entityFields>
     <entityProvider>
@@ -34,7 +35,7 @@
       <children>
         <entityParameter>
           <name>Messages_param</name>
-          <valueProcess>%aditoprj%/entity/MSTTeamChat_entity/entityfields/consumer/children/messages_param/valueProcess.js</valueProcess>
+          <valueProcess>%aditoprj%/entity/MSTeamsChat_entity/entityfields/consumer/children/messages_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
     </entityConsumer>
@@ -42,8 +43,8 @@
       <name>ALLCHANNELS</name>
       <title>Alle Channel</title>
       <mandatory v="true" />
-      <dropDownProcess>%aditoprj%/entity/MSTTeamChat_entity/entityfields/allchannels/dropDownProcess.js</dropDownProcess>
-      <valueProcess>%aditoprj%/entity/MSTTeamChat_entity/entityfields/allchannels/valueProcess.js</valueProcess>
+      <dropDownProcess>%aditoprj%/entity/MSTeamsChat_entity/entityfields/allchannels/dropDownProcess.js</dropDownProcess>
+      <valueProcess>%aditoprj%/entity/MSTeamsChat_entity/entityfields/allchannels/valueProcess.js</valueProcess>
     </entityField>
     <entityField>
       <name>SEARCHVALUE</name>
@@ -52,8 +53,8 @@
     <entityActionField>
       <name>LoadNewMessages</name>
       <title>Lade neue Nachrichten</title>
-      <onActionProcess>%aditoprj%/entity/MSTTeamChat_entity/entityfields/loadnewmessages/onActionProcess.js</onActionProcess>
-      <stateProcess>%aditoprj%/entity/MSTTeamChat_entity/entityfields/loadnewmessages/stateProcess.js</stateProcess>
+      <onActionProcess>%aditoprj%/entity/MSTeamsChat_entity/entityfields/loadnewmessages/onActionProcess.js</onActionProcess>
+      <stateProcess>%aditoprj%/entity/MSTeamsChat_entity/entityfields/loadnewmessages/stateProcess.js</stateProcess>
     </entityActionField>
     <entityField>
       <name>NEWMESSAGES</name>
@@ -63,8 +64,8 @@
     <jDitoRecordContainer>
       <name>jdito</name>
       <jDitoRecordAlias>Data_alias</jDitoRecordAlias>
-      <contentProcess>%aditoprj%/entity/MSTTeamChat_entity/recordcontainers/jdito/contentProcess.js</contentProcess>
-      <onInsert>%aditoprj%/entity/MSTTeamChat_entity/recordcontainers/jdito/onInsert.js</onInsert>
+      <contentProcess>%aditoprj%/entity/MSTeamsChat_entity/recordcontainers/jdito/contentProcess.js</contentProcess>
+      <onInsert>%aditoprj%/entity/MSTeamsChat_entity/recordcontainers/jdito/onInsert.js</onInsert>
       <recordFieldMappings>
         <jDitoRecordFieldMapping>
           <name>UID.value</name>
diff --git a/entity/MSTTeamChat_entity/entityfields/allchannels/dropDownProcess.js b/entity/MSTeamsChat_entity/entityfields/allchannels/dropDownProcess.js
similarity index 100%
rename from entity/MSTTeamChat_entity/entityfields/allchannels/dropDownProcess.js
rename to entity/MSTeamsChat_entity/entityfields/allchannels/dropDownProcess.js
diff --git a/entity/MSTTeamChat_entity/entityfields/allchannels/valueProcess.js b/entity/MSTeamsChat_entity/entityfields/allchannels/valueProcess.js
similarity index 100%
rename from entity/MSTTeamChat_entity/entityfields/allchannels/valueProcess.js
rename to entity/MSTeamsChat_entity/entityfields/allchannels/valueProcess.js
diff --git a/entity/MSTTeamChat_entity/entityfields/consumer/children/messages_param/valueProcess.js b/entity/MSTeamsChat_entity/entityfields/consumer/children/messages_param/valueProcess.js
similarity index 100%
rename from entity/MSTTeamChat_entity/entityfields/consumer/children/messages_param/valueProcess.js
rename to entity/MSTeamsChat_entity/entityfields/consumer/children/messages_param/valueProcess.js
diff --git a/entity/MSTTeamChat_entity/entityfields/loadnewmessages/onActionProcess.js b/entity/MSTeamsChat_entity/entityfields/loadnewmessages/onActionProcess.js
similarity index 100%
rename from entity/MSTTeamChat_entity/entityfields/loadnewmessages/onActionProcess.js
rename to entity/MSTeamsChat_entity/entityfields/loadnewmessages/onActionProcess.js
diff --git a/entity/MSTTeamChat_entity/entityfields/loadnewmessages/stateProcess.js b/entity/MSTeamsChat_entity/entityfields/loadnewmessages/stateProcess.js
similarity index 100%
rename from entity/MSTTeamChat_entity/entityfields/loadnewmessages/stateProcess.js
rename to entity/MSTeamsChat_entity/entityfields/loadnewmessages/stateProcess.js
diff --git a/entity/MSTTeamChat_entity/recordcontainers/jdito/contentProcess.js b/entity/MSTeamsChat_entity/recordcontainers/jdito/contentProcess.js
similarity index 100%
rename from entity/MSTTeamChat_entity/recordcontainers/jdito/contentProcess.js
rename to entity/MSTeamsChat_entity/recordcontainers/jdito/contentProcess.js
diff --git a/entity/MSTTeamChat_entity/recordcontainers/jdito/onInsert.js b/entity/MSTeamsChat_entity/recordcontainers/jdito/onInsert.js
similarity index 100%
rename from entity/MSTTeamChat_entity/recordcontainers/jdito/onInsert.js
rename to entity/MSTeamsChat_entity/recordcontainers/jdito/onInsert.js
diff --git a/entity/MSTTeamDocument_entity/MSTTeamDocument_entity.aod b/entity/MSTeamsDocument_entity/MSTeamsDocument_entity.aod
similarity index 86%
rename from entity/MSTTeamDocument_entity/MSTTeamDocument_entity.aod
rename to entity/MSTeamsDocument_entity/MSTeamsDocument_entity.aod
index 3d91cecf1cf..b43879c6c71 100644
--- a/entity/MSTTeamDocument_entity/MSTTeamDocument_entity.aod
+++ b/entity/MSTeamsDocument_entity/MSTeamsDocument_entity.aod
@@ -1,7 +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.14" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.14">
-  <name>MSTTeamDocument_entity</name>
+  <name>MSTeamsDocument_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
+  <siblings />
   <recordContainer>jdito</recordContainer>
   <entityFields>
     <entityProvider>
@@ -10,7 +11,7 @@
     <entityField>
       <name>DOCUMENTS</name>
       <title>Documents</title>
-      <dropDownProcess>%aditoprj%/entity/MSTTeamDocument_entity/entityfields/documents/dropDownProcess.js</dropDownProcess>
+      <dropDownProcess>%aditoprj%/entity/MSTeamsDocument_entity/entityfields/documents/dropDownProcess.js</dropDownProcess>
       <selectionMode>MULTI</selectionMode>
     </entityField>
     <entityField>
@@ -38,13 +39,13 @@
       <name>Channels</name>
       <dependency>
         <name>dependency</name>
-        <entityName>MSTTeamChannel_entity</entityName>
+        <entityName>MSTeamsChannel_entity</entityName>
         <fieldName>ChannelsByName</fieldName>
       </dependency>
       <children>
         <entityParameter>
           <name>TeamId_param</name>
-          <valueProcess>%aditoprj%/entity/MSTTeamDocument_entity/entityfields/channels/children/teamid_param/valueProcess.js</valueProcess>
+          <valueProcess>%aditoprj%/entity/MSTeamsDocument_entity/entityfields/channels/children/teamid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
     </entityConsumer>
@@ -58,8 +59,8 @@
     <jDitoRecordContainer>
       <name>jdito</name>
       <jDitoRecordAlias>Data_alias</jDitoRecordAlias>
-      <contentProcess>%aditoprj%/entity/MSTTeamDocument_entity/recordcontainers/jdito/contentProcess.js</contentProcess>
-      <onInsert>%aditoprj%/entity/MSTTeamDocument_entity/recordcontainers/jdito/onInsert.js</onInsert>
+      <contentProcess>%aditoprj%/entity/MSTeamsDocument_entity/recordcontainers/jdito/contentProcess.js</contentProcess>
+      <onInsert>%aditoprj%/entity/MSTeamsDocument_entity/recordcontainers/jdito/onInsert.js</onInsert>
       <recordFieldMappings>
         <jDitoRecordFieldMapping>
           <name>UID.value</name>
diff --git a/entity/MSTTeamDocument_entity/entityfields/channels/children/teamid_param/valueProcess.js b/entity/MSTeamsDocument_entity/entityfields/channels/children/teamid_param/valueProcess.js
similarity index 100%
rename from entity/MSTTeamDocument_entity/entityfields/channels/children/teamid_param/valueProcess.js
rename to entity/MSTeamsDocument_entity/entityfields/channels/children/teamid_param/valueProcess.js
diff --git a/entity/MSTTeamDocument_entity/entityfields/documents/dropDownProcess.js b/entity/MSTeamsDocument_entity/entityfields/documents/dropDownProcess.js
similarity index 100%
rename from entity/MSTTeamDocument_entity/entityfields/documents/dropDownProcess.js
rename to entity/MSTeamsDocument_entity/entityfields/documents/dropDownProcess.js
diff --git a/entity/MSTTeamDocument_entity/recordcontainers/jdito/contentProcess.js b/entity/MSTeamsDocument_entity/recordcontainers/jdito/contentProcess.js
similarity index 100%
rename from entity/MSTTeamDocument_entity/recordcontainers/jdito/contentProcess.js
rename to entity/MSTeamsDocument_entity/recordcontainers/jdito/contentProcess.js
diff --git a/entity/MSTTeamDocument_entity/recordcontainers/jdito/onInsert.js b/entity/MSTeamsDocument_entity/recordcontainers/jdito/onInsert.js
similarity index 100%
rename from entity/MSTTeamDocument_entity/recordcontainers/jdito/onInsert.js
rename to entity/MSTeamsDocument_entity/recordcontainers/jdito/onInsert.js
diff --git a/entity/MSTTeamsMessage_entity/MSTTeamsMessage_entity.aod b/entity/MSTeamsMessage_entity/MSTeamsMessage_entity.aod
similarity index 95%
rename from entity/MSTTeamsMessage_entity/MSTTeamsMessage_entity.aod
rename to entity/MSTeamsMessage_entity/MSTeamsMessage_entity.aod
index 0b3fde18fc1..89751eb2b28 100644
--- a/entity/MSTTeamsMessage_entity/MSTTeamsMessage_entity.aod
+++ b/entity/MSTeamsMessage_entity/MSTeamsMessage_entity.aod
@@ -1,7 +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.14" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.14">
-  <name>MSTTeamsMessage_entity</name>
+  <name>MSTeamsMessage_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
+  <siblings />
   <recordContainer>jdito</recordContainer>
   <entityFields>
     <entityProvider>
@@ -32,7 +33,7 @@
         </entityDependency>
         <entityDependency>
           <name>c79dc4f8-df40-47ba-9baa-b6a64c00f46c</name>
-          <entityName>MSTTeamActivityImport_entity</entityName>
+          <entityName>MSTeamsActivityImport_entity</entityName>
           <fieldName>Messages</fieldName>
           <isConsumer v="false" />
         </entityDependency>
diff --git a/entity/MSTTeamsMessage_entity/entityfields/loadnext_param/documentation.adoc b/entity/MSTeamsMessage_entity/entityfields/loadnext_param/documentation.adoc
similarity index 100%
rename from entity/MSTTeamsMessage_entity/entityfields/loadnext_param/documentation.adoc
rename to entity/MSTeamsMessage_entity/entityfields/loadnext_param/documentation.adoc
diff --git a/entity/MSTTeamsMessage_entity/recordcontainers/jdito/contentProcess.js b/entity/MSTeamsMessage_entity/recordcontainers/jdito/contentProcess.js
similarity index 100%
rename from entity/MSTTeamsMessage_entity/recordcontainers/jdito/contentProcess.js
rename to entity/MSTeamsMessage_entity/recordcontainers/jdito/contentProcess.js
diff --git a/entity/Salesproject_entity/Salesproject_entity.aod b/entity/Salesproject_entity/Salesproject_entity.aod
index 30cccf06899..50f493b5f76 100644
--- a/entity/Salesproject_entity/Salesproject_entity.aod
+++ b/entity/Salesproject_entity/Salesproject_entity.aod
@@ -948,6 +948,7 @@
     <indexRecordContainer>
       <name>index</name>
       <configMode>INDEXGROUP_DEFINITION</configMode>
+      <searchIndexGroups />
       <indexRecordAlias>Data_alias</indexRecordAlias>
       <query>%aditoprj%/entity/Salesproject_entity/recordcontainers/index/query.js</query>
       <affectedTables>
diff --git a/neonContext/MSTTeamActivityImport/MSTTeamActivityImport.aod b/neonContext/MSTeamsActivityImport/MSTeamsActivityImport.aod
similarity index 70%
rename from neonContext/MSTTeamActivityImport/MSTTeamActivityImport.aod
rename to neonContext/MSTeamsActivityImport/MSTeamsActivityImport.aod
index 98fc89b31df..847aef4a0cd 100644
--- a/neonContext/MSTTeamActivityImport/MSTTeamActivityImport.aod
+++ b/neonContext/MSTeamsActivityImport/MSTeamsActivityImport.aod
@@ -1,13 +1,13 @@
 <?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>MSTTeamActivityImport</name>
+  <name>MSTeamsActivityImport</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
-  <editView>MSTTeamActivityImportEdit_view</editView>
-  <entity>MSTTeamActivityImport_entity</entity>
+  <editView>MSTeamsActivityImportEdit_view</editView>
+  <entity>MSTeamsActivityImport_entity</entity>
   <references>
     <neonViewReference>
       <name>05e9f542-dd4f-4895-9d0d-d38d57c62735</name>
-      <view>MSTTeamActivityImportEdit_view</view>
+      <view>MSTeamsActivityImportEdit_view</view>
     </neonViewReference>
   </references>
 </neonContext>
diff --git a/neonContext/MSTTeamAddMembers/MSTTeamAddMembers.aod b/neonContext/MSTeamsAddMembers/MSTeamsAddMembers.aod
similarity index 73%
rename from neonContext/MSTTeamAddMembers/MSTTeamAddMembers.aod
rename to neonContext/MSTeamsAddMembers/MSTeamsAddMembers.aod
index f065c15a8f9..8ba520c3890 100644
--- a/neonContext/MSTTeamAddMembers/MSTTeamAddMembers.aod
+++ b/neonContext/MSTeamsAddMembers/MSTeamsAddMembers.aod
@@ -1,14 +1,14 @@
 <?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>MSTTeamAddMembers</name>
+  <name>MSTeamsAddMembers</name>
   <title>Add members</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
-  <editView>MSTTeamAddMembersEdit_view</editView>
-  <entity>MSTTeamAddMembers_entity</entity>
+  <editView>MSTeamsAddMembersEdit_view</editView>
+  <entity>MSTeamsAddMembers_entity</entity>
   <references>
     <neonViewReference>
       <name>9974f15a-7f2a-41fb-afbe-9e946c857f60</name>
-      <view>MSTTeamAddMembersEdit_view</view>
+      <view>MSTeamsAddMembersEdit_view</view>
     </neonViewReference>
   </references>
 </neonContext>
diff --git a/neonContext/MSTTeamChannel/MSTTeamChannel.aod b/neonContext/MSTeamsChannel/MSTeamsChannel.aod
similarity index 81%
rename from neonContext/MSTTeamChannel/MSTTeamChannel.aod
rename to neonContext/MSTeamsChannel/MSTeamsChannel.aod
index 7c2dceb7f03..de18e7088f2 100644
--- a/neonContext/MSTTeamChannel/MSTTeamChannel.aod
+++ b/neonContext/MSTeamsChannel/MSTeamsChannel.aod
@@ -1,6 +1,6 @@
 <?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>MSTTeamChannel</name>
+  <name>MSTeamsChannel</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
-  <entity>MSTTeamChannel_entity</entity>
+  <entity>MSTeamsChannel_entity</entity>
 </neonContext>
diff --git a/neonContext/MSTTeamChat/MSTTeamChat.aod b/neonContext/MSTeamsChat/MSTeamsChat.aod
similarity index 75%
rename from neonContext/MSTTeamChat/MSTTeamChat.aod
rename to neonContext/MSTeamsChat/MSTeamsChat.aod
index 3d99ac8581d..144d3138459 100644
--- a/neonContext/MSTTeamChat/MSTTeamChat.aod
+++ b/neonContext/MSTeamsChat/MSTeamsChat.aod
@@ -1,13 +1,13 @@
 <?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>MSTTeamChat</name>
+  <name>MSTeamsChat</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
-  <editView>MSTTeamChatEdit_view</editView>
-  <entity>MSTTeamChat_entity</entity>
+  <editView>MSTeamsChatEdit_view</editView>
+  <entity>MSTeamsChat_entity</entity>
   <references>
     <neonViewReference>
       <name>1a157c6c-7db9-4a2a-9e62-7d149b146bde</name>
-      <view>MSTTeamChatEdit_view</view>
+      <view>MSTeamsChatEdit_view</view>
     </neonViewReference>
   </references>
 </neonContext>
diff --git a/neonContext/MSTTeamDocument/MSTTeamDocument.aod b/neonContext/MSTeamsDocument/MSTeamsDocument.aod
similarity index 73%
rename from neonContext/MSTTeamDocument/MSTTeamDocument.aod
rename to neonContext/MSTeamsDocument/MSTeamsDocument.aod
index 4f372aaa930..a7125b105f4 100644
--- a/neonContext/MSTTeamDocument/MSTTeamDocument.aod
+++ b/neonContext/MSTeamsDocument/MSTeamsDocument.aod
@@ -1,13 +1,13 @@
 <?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>MSTTeamDocument</name>
+  <name>MSTeamsDocument</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
-  <editView>MSTTeamDocumentEdit_view</editView>
-  <entity>MSTTeamDocument_entity</entity>
+  <editView>MSTeamsDocumentEdit_view</editView>
+  <entity>MSTeamsDocument_entity</entity>
   <references>
     <neonViewReference>
       <name>167cee11-55bd-4988-838b-d9c784da01e2</name>
-      <view>MSTTeamDocumentEdit_view</view>
+      <view>MSTeamsDocumentEdit_view</view>
     </neonViewReference>
   </references>
 </neonContext>
diff --git a/neonContext/MSTTeamsMessage/MSTTeamsMessage.aod b/neonContext/MSTeamsMessage/MSTeamsMessage.aod
similarity index 72%
rename from neonContext/MSTTeamsMessage/MSTTeamsMessage.aod
rename to neonContext/MSTeamsMessage/MSTeamsMessage.aod
index 51c8b4d1581..ecf21a7e768 100644
--- a/neonContext/MSTTeamsMessage/MSTTeamsMessage.aod
+++ b/neonContext/MSTeamsMessage/MSTeamsMessage.aod
@@ -1,13 +1,13 @@
 <?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>MSTTeamsMessage</name>
+  <name>MSTeamsMessage</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
-  <filterView>MSTTeamsMessageFilter_view</filterView>
-  <entity>MSTTeamsMessage_entity</entity>
+  <filterView>MSTeamsMessageFilter_view</filterView>
+  <entity>MSTeamsMessage_entity</entity>
   <references>
     <neonViewReference>
       <name>db5e4380-458f-438a-8945-b8b8463e81d4</name>
-      <view>MSTTeamsMessageFilter_view</view>
+      <view>MSTeamsMessageFilter_view</view>
     </neonViewReference>
   </references>
 </neonContext>
diff --git a/neonView/MSTTeamActivityImportEdit_view/MSTTeamActivityImportEdit_view.aod b/neonView/MSTeamsActivityImportEdit_view/MSTeamsActivityImportEdit_view.aod
similarity index 92%
rename from neonView/MSTTeamActivityImportEdit_view/MSTTeamActivityImportEdit_view.aod
rename to neonView/MSTeamsActivityImportEdit_view/MSTeamsActivityImportEdit_view.aod
index 6f2f174e004..a2f72666621 100644
--- a/neonView/MSTTeamActivityImportEdit_view/MSTTeamActivityImportEdit_view.aod
+++ b/neonView/MSTeamsActivityImportEdit_view/MSTeamsActivityImportEdit_view.aod
@@ -1,6 +1,6 @@
 <?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>MSTTeamActivityImportEdit_view</name>
+  <name>MSTeamsActivityImportEdit_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <size>NORMAL</size>
   <isOverlay v="true" />
@@ -24,7 +24,7 @@
     <neonViewReference>
       <name>e486a1bb-5deb-432a-aa28-c3872f0f88fc</name>
       <entityField>Messages</entityField>
-      <view>MSTTeamsMessageFilter_view</view>
+      <view>MSTeamsMessageFilter_view</view>
     </neonViewReference>
     <actionsViewTemplate>
       <name>Actions</name>
diff --git a/neonView/MSTTeamAddMembersEdit_view/MSTTeamAddMembersEdit_view.aod b/neonView/MSTeamsAddMembersEdit_view/MSTeamsAddMembersEdit_view.aod
similarity index 95%
rename from neonView/MSTTeamAddMembersEdit_view/MSTTeamAddMembersEdit_view.aod
rename to neonView/MSTeamsAddMembersEdit_view/MSTeamsAddMembersEdit_view.aod
index 265bfecca82..378bc712922 100644
--- a/neonView/MSTTeamAddMembersEdit_view/MSTTeamAddMembersEdit_view.aod
+++ b/neonView/MSTeamsAddMembersEdit_view/MSTeamsAddMembersEdit_view.aod
@@ -1,6 +1,6 @@
 <?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>MSTTeamAddMembersEdit_view</name>
+  <name>MSTeamsAddMembersEdit_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <size>SMALL</size>
   <layout>
diff --git a/neonView/MSTTeamChatEdit_view/MSTTeamChatEdit_view.aod b/neonView/MSTeamsChatEdit_view/MSTeamsChatEdit_view.aod
similarity index 94%
rename from neonView/MSTTeamChatEdit_view/MSTTeamChatEdit_view.aod
rename to neonView/MSTeamsChatEdit_view/MSTeamsChatEdit_view.aod
index bdc013d2ee0..9c48b08a6a9 100644
--- a/neonView/MSTTeamChatEdit_view/MSTTeamChatEdit_view.aod
+++ b/neonView/MSTeamsChatEdit_view/MSTeamsChatEdit_view.aod
@@ -1,6 +1,6 @@
 <?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>MSTTeamChatEdit_view</name>
+  <name>MSTeamsChatEdit_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <size>NORMAL</size>
   <layout>
@@ -28,7 +28,7 @@
     <neonViewReference>
       <name>6c47a973-ef7c-4165-addb-427c1cce9540</name>
       <entityField>Consumer</entityField>
-      <view>MSTTeamsMessageFilter_view</view>
+      <view>MSTeamsMessageFilter_view</view>
     </neonViewReference>
     <actionsViewTemplate>
       <name>LoadNewMessages</name>
diff --git a/neonView/MSTTeamDocumentEdit_view/MSTTeamDocumentEdit_view.aod b/neonView/MSTeamsDocumentEdit_view/MSTeamsDocumentEdit_view.aod
similarity index 96%
rename from neonView/MSTTeamDocumentEdit_view/MSTTeamDocumentEdit_view.aod
rename to neonView/MSTeamsDocumentEdit_view/MSTeamsDocumentEdit_view.aod
index 9ebd3c2e3de..058045a091b 100644
--- a/neonView/MSTTeamDocumentEdit_view/MSTTeamDocumentEdit_view.aod
+++ b/neonView/MSTeamsDocumentEdit_view/MSTeamsDocumentEdit_view.aod
@@ -1,6 +1,6 @@
 <?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>MSTTeamDocumentEdit_view</name>
+  <name>MSTeamsDocumentEdit_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <size>SMALL</size>
   <isOverlay v="false" />
diff --git a/neonView/MSTTeamsMessageFilter_view/MSTTeamsMessageFilter_view.aod b/neonView/MSTeamsMessageFilter_view/MSTeamsMessageFilter_view.aod
similarity index 96%
rename from neonView/MSTTeamsMessageFilter_view/MSTTeamsMessageFilter_view.aod
rename to neonView/MSTeamsMessageFilter_view/MSTeamsMessageFilter_view.aod
index eb7a7c33ae5..c9cae5e66e2 100644
--- a/neonView/MSTTeamsMessageFilter_view/MSTTeamsMessageFilter_view.aod
+++ b/neonView/MSTeamsMessageFilter_view/MSTeamsMessageFilter_view.aod
@@ -1,6 +1,6 @@
 <?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>MSTTeamsMessageFilter_view</name>
+  <name>MSTeamsMessageFilter_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
     <noneLayout>
diff --git a/process/MSTeams_lib/MSTeams_lib.aod b/process/MSTeams_lib/MSTeams_lib.aod
new file mode 100644
index 00000000000..b414a9e8a83
--- /dev/null
+++ b/process/MSTeams_lib/MSTeams_lib.aod
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+  <name>MSTeams_lib</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <process>%aditoprj%/process/MSTeams_lib/process.js</process>
+  <variants>
+    <element>LIBRARY</element>
+  </variants>
+</process>
diff --git a/process/MSTeams_lib/process.js b/process/MSTeams_lib/process.js
new file mode 100644
index 00000000000..bdb360e1231
--- /dev/null
+++ b/process/MSTeams_lib/process.js
@@ -0,0 +1,3 @@
+import("system.teams");
+
+function MSTeamsUtils () {}
\ No newline at end of file
-- 
GitLab


From 3e8ae3ad5c34c758136d4486f3ffa1d31ca92248 Mon Sep 17 00:00:00 2001
From: Sebastian Listl <s.listl@adito.de>
Date: Wed, 2 Sep 2020 15:43:48 +0200
Subject: [PATCH 023/184] #1064484 MS Teams changes

---
 .aditoprj/UUIDNameMap.txt                     | 102 ++++
 .../2019.1.4/Salesorder/update_Salesorder.xml |   2 +-
 .../2020.2.1/{ => MSTeams}/changelog.xml      |   2 +-
 .../{ => MSTeams}/create_MST_TEAM.xml         |   0
 .../2020.2.1/MSTeams/create_MST_TEAMLINK.xml  |  26 +
 .../2020.2.1/add_salesproject_MST_TEAM_ID.xml |   9 -
 .liquibase/Data_alias/changelog.xml           |   2 +-
 aliasDefinition/Data_alias/Data_alias.aod     | 528 ++++++++++++++++--
 .../MSTChooseTeam_entity.aod                  |   6 +-
 .../recordcontainers/jdito/onInsert.js        |  11 +-
 .../MSTTeamMember_entity.aod                  |  16 +-
 .../objectrowid_param/valueProcess.js         |   2 +-
 .../children/objecttype_param/valueProcess.js |   4 +
 entity/MSTTeam_entity/MSTTeam_entity.aod      |  28 +-
 .../objectrowid_param/valueProcess.js         |   4 +
 .../children/objecttype_param/valueProcess.js |   4 +
 .../salesprojectid_param/valueProcess.js      |   4 -
 .../recordcontainers/jdito/onInsert.js        |   4 +-
 .../MSTeamsAddMembers_entity.aod              |  20 +-
 .../objectrowid_param/valueProcess.js         |   4 +
 .../children/objecttype_param/valueProcess.js |   4 +
 .../salesprojectid_param/valueProcess.js      |   4 -
 .../MSTeamsChat_entity/MSTeamsChat_entity.aod |  85 ---
 .../allchannels/dropDownProcess.js            |  24 -
 .../entityfields/allchannels/valueProcess.js  |   0
 .../children/messages_param/valueProcess.js   |  24 -
 .../loadnewmessages/onActionProcess.js        |   9 -
 .../loadnewmessages/stateProcess.js           |  19 -
 .../recordcontainers/jdito/contentProcess.js  |   9 -
 .../recordcontainers/jdito/onInsert.js        |   3 -
 entity/Member_entity/Member_entity.aod        |  19 +-
 .../children/addapp/onActionProcess.js        |   2 +-
 .../children/addapp/stateProcess.js           |   2 +-
 .../children/addnewmember/onActionProcess.js  |   6 -
 .../children/addnewmember/stateProcess.js     |  20 -
 .../changetomsteam/onActionProcess.js         |   2 +-
 .../children/changetomsteam/stateProcess.js   |   2 +-
 .../children/chooseteam/stateProcess.js       |   2 +-
 .../children/createteam/onActionProcess.js    |  27 +-
 .../children/createteam/stateProcess.js       |   2 +-
 .../children/deletemember/stateProcess.js     |  20 -
 .../children/deleteteam/onActionProcess.js    |   2 +-
 .../children/deleteteam/stateProcess.js       |   2 +-
 .../children/editteam/onActionProcess.js      |   8 +-
 .../children/editteam/stateProcess.js         |   2 +-
 .../children/restoreteam/onActionProcess.js   |   2 +-
 .../children/restoreteam/stateProcess.js      |   2 +-
 .../msteamsactiongroup/stateProcess.js        |  15 +-
 .../mstteamid_param/valueProcess.js           |  15 +
 .../SalesprojectMilestone_entity.aod          |   2 +-
 .../SalesprojectSource_entity.aod             |   2 +-
 .../Salesproject_entity.aod                   |  25 +-
 .../valueProcess.js                           |   2 +-
 .../recordcontainers/db/fromClauseProcess.js  |   4 +-
 .../mst_team_id.displayvalue/expression.js    |   3 -
 .../MSTeamsAddMembers/MSTeamsAddMembers.aod   |  14 -
 neonContext/MSTeamsChat/MSTeamsChat.aod       |  13 -
 .../MSTeamsAddMembersEdit_view.aod            |  28 -
 .../MSTeamsChatEdit_view.aod                  |  41 --
 .../MemberFilter_view/MemberFilter_view.aod   |   2 +
 .../MemberLookup_view/MemberLookup_view.aod   |   2 +
 .../SalesprojectFilter_view.aod               |   3 +
 .../SalesprojectMain_view.aod                 |   5 -
 process/MSTeams_lib/process.js                |  44 +-
 64 files changed, 819 insertions(+), 482 deletions(-)
 create mode 100644 .aditoprj/UUIDNameMap.txt
 rename .liquibase/Data_alias/basic/2020.2.1/{ => MSTeams}/changelog.xml (83%)
 rename .liquibase/Data_alias/basic/2020.2.1/{ => MSTeams}/create_MST_TEAM.xml (100%)
 create mode 100644 .liquibase/Data_alias/basic/2020.2.1/MSTeams/create_MST_TEAMLINK.xml
 delete mode 100644 .liquibase/Data_alias/basic/2020.2.1/add_salesproject_MST_TEAM_ID.xml
 create mode 100644 entity/MSTTeamMember_entity/entityfields/projectmembers/children/objecttype_param/valueProcess.js
 create mode 100644 entity/MSTTeam_entity/entityfields/teammembers/children/objectrowid_param/valueProcess.js
 create mode 100644 entity/MSTTeam_entity/entityfields/teammembers/children/objecttype_param/valueProcess.js
 delete mode 100644 entity/MSTTeam_entity/entityfields/teammembers/children/salesprojectid_param/valueProcess.js
 create mode 100644 entity/MSTeamsAddMembers_entity/entityfields/members/children/objectrowid_param/valueProcess.js
 create mode 100644 entity/MSTeamsAddMembers_entity/entityfields/members/children/objecttype_param/valueProcess.js
 delete mode 100644 entity/MSTeamsAddMembers_entity/entityfields/members/children/salesprojectid_param/valueProcess.js
 delete mode 100644 entity/MSTeamsChat_entity/MSTeamsChat_entity.aod
 delete mode 100644 entity/MSTeamsChat_entity/entityfields/allchannels/dropDownProcess.js
 delete mode 100644 entity/MSTeamsChat_entity/entityfields/allchannels/valueProcess.js
 delete mode 100644 entity/MSTeamsChat_entity/entityfields/consumer/children/messages_param/valueProcess.js
 delete mode 100644 entity/MSTeamsChat_entity/entityfields/loadnewmessages/onActionProcess.js
 delete mode 100644 entity/MSTeamsChat_entity/entityfields/loadnewmessages/stateProcess.js
 delete mode 100644 entity/MSTeamsChat_entity/recordcontainers/jdito/contentProcess.js
 delete mode 100644 entity/MSTeamsChat_entity/recordcontainers/jdito/onInsert.js
 delete mode 100644 entity/Member_entity/entityfields/msteamsactiongroup/children/addnewmember/onActionProcess.js
 delete mode 100644 entity/Member_entity/entityfields/msteamsactiongroup/children/addnewmember/stateProcess.js
 delete mode 100644 entity/Member_entity/entityfields/msteamsactiongroup/children/deletemember/stateProcess.js
 create mode 100644 entity/Member_entity/entityfields/mstteamid_param/valueProcess.js
 rename entity/Salesproject_entity/entityfields/members/children/{mst_teamid_param => mstteamid_param}/valueProcess.js (100%)
 delete mode 100644 entity/Salesproject_entity/recordcontainers/db/recordfieldmappings/mst_team_id.displayvalue/expression.js
 delete mode 100644 neonContext/MSTeamsAddMembers/MSTeamsAddMembers.aod
 delete mode 100644 neonContext/MSTeamsChat/MSTeamsChat.aod
 delete mode 100644 neonView/MSTeamsAddMembersEdit_view/MSTeamsAddMembersEdit_view.aod
 delete mode 100644 neonView/MSTeamsChatEdit_view/MSTeamsChatEdit_view.aod

diff --git a/.aditoprj/UUIDNameMap.txt b/.aditoprj/UUIDNameMap.txt
new file mode 100644
index 00000000000..002f9103477
--- /dev/null
+++ b/.aditoprj/UUIDNameMap.txt
@@ -0,0 +1,102 @@
+*************************************************
+*                                               *
+* This is a generated file, please do not edit! *
+*                                               *
+*************************************************
+ 5
+ 6
+ 7
+ 8
+ 9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+1.0.0
+1598969268500
+#ENTITY
+#ENTITY
+#PROVIDER_FIELD
+#PROVIDER_FIELD
+#CONTENTTITLE
+#CONTENTTITLE
+#TITLE
+#TITLE
+#INDEX_GROUP
+#INDEX_GROUP
+#TARGETCONTEXT
+#TARGETCONTEXT
+INTERNAL_ADMINISTRATOR
+INTERNAL_ADMINISTRATOR
+INTERNAL_WEBSERVICE
+INTERNAL_WEBSERVICE
+#DESCRIPTION
+#DESCRIPTION
+INTERNAL_GROUPWARE
+INTERNAL_GROUPWARE
+INTERNAL_TECHNICAL
+INTERNAL_TECHNICAL
+#MAPPING
+#MAPPING
+#LOCATION
+#LOCATION
+#PROVIDER
+#PROVIDER
+INTERNAL_DESIGNER
+INTERNAL_DESIGNER
+#USERHELP
+#USERHELP
+#NONE
+#NONE
+#TARGETID
+#TARGETID
+#CONTENTDESCRIPTION
+#CONTENTDESCRIPTION
+#SORTING
+#SORTING
+#LOOKUPID
+#LOOKUPID
+#GROUPING
+#GROUPING
+#ICON
+#ICON
+INTERNAL_DASHBOARDSTOREADMIN
+INTERNAL_DASHBOARDSTOREADMIN
+#IMAGE
+#IMAGE
+#UID
+#UID
+INTERNAL_SNMP
+INTERNAL_SNMP
+#TARGETCONSUMER
+#TARGETCONSUMER
+INTERNAL_EVERYONE
+INTERNAL_EVERYONE
\ No newline at end of file
diff --git a/.liquibase/Data_alias/basic/2019.1.4/Salesorder/update_Salesorder.xml b/.liquibase/Data_alias/basic/2019.1.4/Salesorder/update_Salesorder.xml
index 61f8dee92bd..3a824531f8a 100644
--- a/.liquibase/Data_alias/basic/2019.1.4/Salesorder/update_Salesorder.xml
+++ b/.liquibase/Data_alias/basic/2019.1.4/Salesorder/update_Salesorder.xml
@@ -4,7 +4,7 @@
         
         <addColumn tableName="SALESORDER">
             <column name="OBJECT_TYPE" type="NVARCHAR(63)"/>
-            <column name="CANCELLATION " type="TINYINT"/>
+            <column name="CANCELLATION" type="TINYINT"/>
             <column name="UNPAID" type="INTEGER"/>
             <column name="PAID" type="INTEGER"/>
             <column name="PAYDUEDATE" type="DATETIME"/>
diff --git a/.liquibase/Data_alias/basic/2020.2.1/changelog.xml b/.liquibase/Data_alias/basic/2020.2.1/MSTeams/changelog.xml
similarity index 83%
rename from .liquibase/Data_alias/basic/2020.2.1/changelog.xml
rename to .liquibase/Data_alias/basic/2020.2.1/MSTeams/changelog.xml
index 3b995a276a0..d4e6ad9f3d5 100644
--- a/.liquibase/Data_alias/basic/2020.2.1/changelog.xml
+++ b/.liquibase/Data_alias/basic/2020.2.1/MSTeams/changelog.xml
@@ -2,5 +2,5 @@
 <databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
                    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd">
     <include file="create_MST_TEAM.xml" relativeToChangelogFile="true"/>
-    <include file="add_salesproject_MST_TEAM_ID.xml" relativeToChangelogFile="true"/>
+    <include file="create_MST_TEAMLINK.xml" relativeToChangelogFile="true"/>
 </databaseChangeLog>
diff --git a/.liquibase/Data_alias/basic/2020.2.1/create_MST_TEAM.xml b/.liquibase/Data_alias/basic/2020.2.1/MSTeams/create_MST_TEAM.xml
similarity index 100%
rename from .liquibase/Data_alias/basic/2020.2.1/create_MST_TEAM.xml
rename to .liquibase/Data_alias/basic/2020.2.1/MSTeams/create_MST_TEAM.xml
diff --git a/.liquibase/Data_alias/basic/2020.2.1/MSTeams/create_MST_TEAMLINK.xml b/.liquibase/Data_alias/basic/2020.2.1/MSTeams/create_MST_TEAMLINK.xml
new file mode 100644
index 00000000000..be14298d37a
--- /dev/null
+++ b/.liquibase/Data_alias/basic/2020.2.1/MSTeams/create_MST_TEAMLINK.xml
@@ -0,0 +1,26 @@
+<?xml version="1.1" encoding="UTF-8" standalone="no"?>
+<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
+                   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd">
+<changeSet author="s.listl" id="05c74217-459f-43ec-8e33-daee059cafd8">
+    <createTable tableName="MST_TEAMLINK">
+        <column name="MST_TEAMLINKID" type="CHAR(36)">
+            <constraints primaryKey="true" primaryKeyName="PK_MST_TEAMLINKID"/>
+        </column>   
+        <column name="MST_TEAM_ID" type="CHAR(36)">
+            <constraints nullable="false"/>
+        </column>
+        <column name="OBJECT_ROWID" type="CHAR(36)">
+            <constraints nullable="false"/>
+        </column>
+        <column name="OBJECT_TYPE" type="NVARCHAR(63)">
+            <constraints nullable="false"/>
+        </column>
+    </createTable>
+    <createIndex tableName="MST_TEAMLINK" indexName="IDX_MST_TEAMLINK_MST_TEAM_ID">
+        <column name="MST_TEAM_ID"/>
+    </createIndex>
+    <createIndex tableName="MST_TEAMLINK" indexName="IDX_MST_TEAMLINK_OBJECT_ROWID">
+        <column name="OBJECT_ROWID"/>
+    </createIndex>
+</changeSet>
+</databaseChangeLog>
diff --git a/.liquibase/Data_alias/basic/2020.2.1/add_salesproject_MST_TEAM_ID.xml b/.liquibase/Data_alias/basic/2020.2.1/add_salesproject_MST_TEAM_ID.xml
deleted file mode 100644
index 58cc0adab61..00000000000
--- a/.liquibase/Data_alias/basic/2020.2.1/add_salesproject_MST_TEAM_ID.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.1" encoding="UTF-8" standalone="no"?>
-<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
-                   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd">
-    <changeSet author="s.listl" id="b1fc1530-37c8-46b2-a96f-21e3a6deeed1">
-        <addColumn tableName="SALESPROJECT">
-            <column name="MST_TEAM_ID" type="CHAR(36)"/>
-        </addColumn>
-    </changeSet>
-</databaseChangeLog>
diff --git a/.liquibase/Data_alias/changelog.xml b/.liquibase/Data_alias/changelog.xml
index 0c689b4cb33..c8252044785 100644
--- a/.liquibase/Data_alias/changelog.xml
+++ b/.liquibase/Data_alias/changelog.xml
@@ -14,7 +14,7 @@
     <include relativeToChangelogFile="true" file="basic/2020.1.0/changelog.xml"/>
     <include relativeToChangelogFile="true" file="basic/2020.1.1/changelog.xml"/>
     <!--<include relativeToChangelogFile="true" file="basic/2020.1.2/changelog.xml"/>-->
-    <include relativeToChangelogFile="true" file="basic/2020.2.1/changelog.xml"/>
+    <include relativeToChangelogFile="true" file="basic/2020.2.1/MSTeams/changelog.xml"/>
     
     <!--enable this only when you definetly want to overwrite the existing data with demo records:--> 
     <include relativeToChangelogFile="true" file="basic/_demoData/changelog.xml" context="example"/>
diff --git a/aliasDefinition/Data_alias/Data_alias.aod b/aliasDefinition/Data_alias/Data_alias.aod
index 48617b00935..4000432b088 100644
--- a/aliasDefinition/Data_alias/Data_alias.aod
+++ b/aliasDefinition/Data_alias/Data_alias.aod
@@ -1672,7 +1672,7 @@
                 <name>GROUPCODEID</name>
                 <dbName></dbName>
                 <primaryKey v="false" />
-                <columnType v="1" />
+                <columnType v="12" />
                 <size v="36" />
                 <scale v="0" />
                 <notNull v="false" />
@@ -3647,20 +3647,6 @@
                   </customStringProperty>
                 </customProperties>
               </entityFieldDb>
-              <entityFieldDb>
-                <name>MST_TEAM_ID</name>
-                <dbName></dbName>
-                <primaryKey v="false" />
-                <columnType v="1" />
-                <size v="36" />
-                <scale v="0" />
-                <notNull v="false" />
-                <isUnique v="false" />
-                <index v="false" />
-                <documentation></documentation>
-                <title></title>
-                <description></description>
-              </entityFieldDb>
             </entityFields>
           </entityDb>
           <entityDb>
@@ -4523,9 +4509,9 @@
                 <name>UNPAID</name>
                 <dbName></dbName>
                 <primaryKey v="false" />
-                <columnType v="4" />
-                <size v="10" />
-                <scale v="0" />
+                <columnType v="3" />
+                <size v="14" />
+                <scale v="2" />
                 <notNull v="false" />
                 <isUnique v="false" />
                 <index v="false" />
@@ -4709,9 +4695,9 @@
                 <name>PAID</name>
                 <dbName></dbName>
                 <primaryKey v="false" />
-                <columnType v="4" />
-                <size v="10" />
-                <scale v="0" />
+                <columnType v="3" />
+                <size v="14" />
+                <scale v="2" />
                 <notNull v="false" />
                 <isUnique v="false" />
                 <index v="false" />
@@ -13580,6 +13566,20 @@
                 <title></title>
                 <description></description>
               </entityFieldDb>
+              <entityFieldDb>
+                <name>VARIABLES</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="12" />
+                <size v="512" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
             </entityFields>
           </entityDb>
           <entityDb>
@@ -13773,20 +13773,6 @@
                 <title></title>
                 <description></description>
               </entityFieldDb>
-              <entityFieldDb>
-                <name>SEPARATOR</name>
-                <dbName></dbName>
-                <primaryKey v="false" />
-                <columnType v="12" />
-                <size v="36" />
-                <scale v="0" />
-                <notNull v="false" />
-                <isUnique v="false" />
-                <index v="false" />
-                <documentation></documentation>
-                <title></title>
-                <description></description>
-              </entityFieldDb>
               <entityFieldDb>
                 <name>EXPORTTEMPLATEID</name>
                 <dbName></dbName>
@@ -13857,6 +13843,48 @@
                 <title></title>
                 <description></description>
               </entityFieldDb>
+              <entityFieldDb>
+                <name>FIELDSEPARATOR</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="12" />
+                <size v="36" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>FIELDDELIMITER</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="12" />
+                <size v="36" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>SENTENCESEPARATOR</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="12" />
+                <size v="36" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
             </entityFields>
           </entityDb>
           <entityDb>
@@ -14282,6 +14310,436 @@
               </entityFieldDb>
             </entityFields>
           </entityDb>
+          <entityDb>
+            <name>VISITRECOMMENDATION</name>
+            <dbName></dbName>
+            <idColumn>VISITRECOMMENDATIONID</idColumn>
+            <idGeneratorType v="0" />
+            <idGeneratorInterval v="1" />
+            <documentation></documentation>
+            <title></title>
+            <description></description>
+            <auditSyncConfig>
+              <name>auditSyncConfig</name>
+              <auditMode v="0" />
+              <syncActive v="false" />
+              <syncComplete v="true" />
+              <syncDirection v="1" />
+              <syncIds></syncIds>
+            </auditSyncConfig>
+            <entityFields>
+              <entityFieldDb>
+                <name>DUE_DATE</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="93" />
+                <size v="29" />
+                <scale v="9" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>SOURCE</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="12" />
+                <size v="255" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>VISITRECOMMENDATIONID</name>
+                <dbName></dbName>
+                <primaryKey v="true" />
+                <columnType v="1" />
+                <size v="36" />
+                <scale v="0" />
+                <notNull v="true" />
+                <isUnique v="true" />
+                <index v="true" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>CONTACT_ID</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="1" />
+                <size v="36" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>PRIORITY</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="1" />
+                <size v="36" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>INFO</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="2005" />
+                <size v="2147483647" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+            </entityFields>
+          </entityDb>
+          <entityDb>
+            <name>VISITPLANEMPLOYEEWEEK</name>
+            <dbName></dbName>
+            <idColumn>VISITPLANEMPLOYEEWEEKID</idColumn>
+            <idGeneratorType v="0" />
+            <idGeneratorInterval v="1" />
+            <documentation></documentation>
+            <title></title>
+            <description></description>
+            <auditSyncConfig>
+              <name>auditSyncConfig</name>
+              <auditMode v="0" />
+              <syncActive v="false" />
+              <syncComplete v="true" />
+              <syncDirection v="1" />
+              <syncIds></syncIds>
+            </auditSyncConfig>
+            <entityFields>
+              <entityFieldDb>
+                <name>VISITPLANEMPLOYEEWEEKID</name>
+                <dbName></dbName>
+                <primaryKey v="true" />
+                <columnType v="1" />
+                <size v="36" />
+                <scale v="0" />
+                <notNull v="true" />
+                <isUnique v="true" />
+                <index v="true" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>CONTACT_ID</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="1" />
+                <size v="36" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>VISITPLAN_WEEK</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="4" />
+                <size v="10" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>INFO</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="2005" />
+                <size v="2147483647" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>VISITPLAN_YEAR</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="4" />
+                <size v="10" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+            </entityFields>
+          </entityDb>
+          <entityDb>
+            <name>VISITPLANENTRY</name>
+            <dbName></dbName>
+            <idColumn>VISITPLANENTRYID</idColumn>
+            <idGeneratorType v="0" />
+            <idGeneratorInterval v="1" />
+            <documentation></documentation>
+            <title></title>
+            <description></description>
+            <auditSyncConfig>
+              <name>auditSyncConfig</name>
+              <auditMode v="0" />
+              <syncActive v="false" />
+              <syncComplete v="true" />
+              <syncDirection v="1" />
+              <syncIds></syncIds>
+            </auditSyncConfig>
+            <entityFields>
+              <entityFieldDb>
+                <name>STATUS</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="1" />
+                <size v="36" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>END_TIME</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="92" />
+                <size v="8" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>BEGIN_TIME</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="92" />
+                <size v="8" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>VISITPLANEMPLOYEEWEEK_ID</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="1" />
+                <size v="36" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>VISITRECOMMENDATION_ID</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="1" />
+                <size v="36" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>ORGANISATION_ID</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="1" />
+                <size v="36" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>VISITPLANENTRYID</name>
+                <dbName></dbName>
+                <primaryKey v="true" />
+                <columnType v="1" />
+                <size v="36" />
+                <scale v="0" />
+                <notNull v="true" />
+                <isUnique v="true" />
+                <index v="true" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>CONTACT_ID</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="1" />
+                <size v="36" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>APPOINTMENT_ID</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="1" />
+                <size v="36" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>ENTRYDATE</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="91" />
+                <size v="10" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+            </entityFields>
+          </entityDb>
+          <entityDb>
+            <name>MST_TEAMLINK</name>
+            <dbName></dbName>
+            <idColumn>MST_TEAMLINKID</idColumn>
+            <idGeneratorType v="0" />
+            <idGeneratorInterval v="1" />
+            <documentation></documentation>
+            <title></title>
+            <description></description>
+            <auditSyncConfig>
+              <name>auditSyncConfig</name>
+              <auditMode v="0" />
+              <syncActive v="false" />
+              <syncComplete v="true" />
+              <syncDirection v="1" />
+              <syncIds></syncIds>
+            </auditSyncConfig>
+            <entityFields>
+              <entityFieldDb>
+                <name>OBJECT_ROWID</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="1" />
+                <size v="36" />
+                <scale v="0" />
+                <notNull v="true" />
+                <isUnique v="false" />
+                <index v="true" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>MST_TEAM_ID</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="1" />
+                <size v="36" />
+                <scale v="0" />
+                <notNull v="true" />
+                <isUnique v="false" />
+                <index v="true" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>MST_TEAMLINKID</name>
+                <dbName></dbName>
+                <primaryKey v="true" />
+                <columnType v="1" />
+                <size v="36" />
+                <scale v="0" />
+                <notNull v="true" />
+                <isUnique v="true" />
+                <index v="true" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>OBJECT_TYPE</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="12" />
+                <size v="63" />
+                <scale v="0" />
+                <notNull v="true" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+            </entityFields>
+          </entityDb>
         </entities>
       </entityGroup>
     </aliasDefDb>
diff --git a/entity/MSTChooseTeam_entity/MSTChooseTeam_entity.aod b/entity/MSTChooseTeam_entity/MSTChooseTeam_entity.aod
index cdad103f047..0c9ea22f83a 100644
--- a/entity/MSTChooseTeam_entity/MSTChooseTeam_entity.aod
+++ b/entity/MSTChooseTeam_entity/MSTChooseTeam_entity.aod
@@ -18,7 +18,7 @@
       <name>UID</name>
     </entityField>
     <entityParameter>
-      <name>SalesprojectId_param</name>
+      <name>ObjectRowId_param</name>
       <expose v="true" />
     </entityParameter>
     <entityConsumer>
@@ -29,6 +29,10 @@
         <fieldName>#PROVIDER</fieldName>
       </dependency>
     </entityConsumer>
+    <entityParameter>
+      <name>ObjectType_param</name>
+      <expose v="true" />
+    </entityParameter>
   </entityFields>
   <recordContainers>
     <jDitoRecordContainer>
diff --git a/entity/MSTChooseTeam_entity/recordcontainers/jdito/onInsert.js b/entity/MSTChooseTeam_entity/recordcontainers/jdito/onInsert.js
index f119fef1e7a..66e2ebe9078 100644
--- a/entity/MSTChooseTeam_entity/recordcontainers/jdito/onInsert.js
+++ b/entity/MSTChooseTeam_entity/recordcontainers/jdito/onInsert.js
@@ -1,10 +1,10 @@
 import("system.teams");
 import("Sql_lib")
-import("system.logging");
 import("system.vars")
 import("system.teams");
 import("system.util");
 import("system.neon");
+import("MSTeams_lib");
 
 var rowData = vars.get("$local.rowdata");
 
@@ -31,10 +31,5 @@ if(teamIdAndName)
             "WEB_URL" : webUrl
         }, "MST_TEAM");
     }
-    newWhere("SALESPROJECT.SALESPROJECTID", "$param.SalesprojectId_param").updateFields({
-        "MST_TEAM_ID" : teamId
-    });
-}
-
-
-
+    MSTeamsUtils.createTeamLink(teamId, vars.get("$param.ObjectRowId_param"), vars.get("$param.ObjectType_param"));
+}
\ No newline at end of file
diff --git a/entity/MSTTeamMember_entity/MSTTeamMember_entity.aod b/entity/MSTTeamMember_entity/MSTTeamMember_entity.aod
index a70f06da972..57390700764 100644
--- a/entity/MSTTeamMember_entity/MSTTeamMember_entity.aod
+++ b/entity/MSTTeamMember_entity/MSTTeamMember_entity.aod
@@ -34,10 +34,6 @@
       <name>MailsOfExtern_param</name>
       <expose v="true" />
     </entityParameter>
-    <entityParameter>
-      <name>SalesprojectId_param</name>
-      <expose v="true" />
-    </entityParameter>
     <entityConsumer>
       <name>ProjectMembers</name>
       <dependency>
@@ -50,6 +46,10 @@
           <name>ObjectRowId_param</name>
           <valueProcess>%aditoprj%/entity/MSTTeamMember_entity/entityfields/projectmembers/children/objectrowid_param/valueProcess.js</valueProcess>
         </entityParameter>
+        <entityParameter>
+          <name>ObjectType_param</name>
+          <valueProcess>%aditoprj%/entity/MSTTeamMember_entity/entityfields/projectmembers/children/objecttype_param/valueProcess.js</valueProcess>
+        </entityParameter>
       </children>
     </entityConsumer>
     <entityField>
@@ -81,6 +81,14 @@
         </entityDependency>
       </dependencies>
     </entityProvider>
+    <entityParameter>
+      <name>ObjectRowId_param</name>
+      <expose v="true" />
+    </entityParameter>
+    <entityParameter>
+      <name>ObjectType_param</name>
+      <expose v="true" />
+    </entityParameter>
   </entityFields>
   <recordContainers>
     <jDitoRecordContainer>
diff --git a/entity/MSTTeamMember_entity/entityfields/projectmembers/children/objectrowid_param/valueProcess.js b/entity/MSTTeamMember_entity/entityfields/projectmembers/children/objectrowid_param/valueProcess.js
index 86e1d8c1c0f..dc0d70ccbe7 100644
--- a/entity/MSTTeamMember_entity/entityfields/projectmembers/children/objectrowid_param/valueProcess.js
+++ b/entity/MSTTeamMember_entity/entityfields/projectmembers/children/objectrowid_param/valueProcess.js
@@ -1,4 +1,4 @@
 import("system.vars");
 import("system.result");
 
-result.string(vars.get("$param.SalesprojectId_param"));
\ No newline at end of file
+result.string(vars.get("$param.ObjectRowId_param"));
\ No newline at end of file
diff --git a/entity/MSTTeamMember_entity/entityfields/projectmembers/children/objecttype_param/valueProcess.js b/entity/MSTTeamMember_entity/entityfields/projectmembers/children/objecttype_param/valueProcess.js
new file mode 100644
index 00000000000..95c8514f3bb
--- /dev/null
+++ b/entity/MSTTeamMember_entity/entityfields/projectmembers/children/objecttype_param/valueProcess.js
@@ -0,0 +1,4 @@
+import("system.vars");
+import("system.result");
+
+result.string(vars.get("$param.ObjectType_param"));
\ No newline at end of file
diff --git a/entity/MSTTeam_entity/MSTTeam_entity.aod b/entity/MSTTeam_entity/MSTTeam_entity.aod
index 20de4a24fd9..510b2585b53 100644
--- a/entity/MSTTeam_entity/MSTTeam_entity.aod
+++ b/entity/MSTTeam_entity/MSTTeam_entity.aod
@@ -47,14 +47,6 @@
       <name>Description_param</name>
       <expose v="true" />
     </entityParameter>
-    <entityParameter>
-      <name>SalesprojectId_param</name>
-      <expose v="true" />
-    </entityParameter>
-    <entityParameter>
-      <name>Mailnickname_param</name>
-      <expose v="true" />
-    </entityParameter>
     <entityConsumer>
       <name>TeamMembers</name>
       <stateProcess>%aditoprj%/entity/MSTTeam_entity/entityfields/teammembers/stateProcess.js</stateProcess>
@@ -64,14 +56,18 @@
         <fieldName>MembersOfTeam</fieldName>
       </dependency>
       <children>
-        <entityParameter>
-          <name>SalesprojectId_param</name>
-          <valueProcess>%aditoprj%/entity/MSTTeam_entity/entityfields/teammembers/children/salesprojectid_param/valueProcess.js</valueProcess>
-        </entityParameter>
         <entityParameter>
           <name>MSTTeamId_param</name>
           <valueProcess>%aditoprj%/entity/MSTTeam_entity/entityfields/teammembers/children/mstteamid_param/valueProcess.js</valueProcess>
         </entityParameter>
+        <entityParameter>
+          <name>ObjectRowId_param</name>
+          <valueProcess>%aditoprj%/entity/MSTTeam_entity/entityfields/teammembers/children/objectrowid_param/valueProcess.js</valueProcess>
+        </entityParameter>
+        <entityParameter>
+          <name>ObjectType_param</name>
+          <valueProcess>%aditoprj%/entity/MSTTeam_entity/entityfields/teammembers/children/objecttype_param/valueProcess.js</valueProcess>
+        </entityParameter>
       </children>
     </entityConsumer>
     <entityField>
@@ -82,6 +78,14 @@
       <title>Archived</title>
       <dropDownProcess>%aditoprj%/entity/MSTTeam_entity/entityfields/isarchived/dropDownProcess.js</dropDownProcess>
     </entityField>
+    <entityParameter>
+      <name>ObjectRowId_param</name>
+      <expose v="true" />
+    </entityParameter>
+    <entityParameter>
+      <name>ObjectType_param</name>
+      <expose v="true" />
+    </entityParameter>
   </entityFields>
   <recordContainers>
     <jDitoRecordContainer>
diff --git a/entity/MSTTeam_entity/entityfields/teammembers/children/objectrowid_param/valueProcess.js b/entity/MSTTeam_entity/entityfields/teammembers/children/objectrowid_param/valueProcess.js
new file mode 100644
index 00000000000..dc0d70ccbe7
--- /dev/null
+++ b/entity/MSTTeam_entity/entityfields/teammembers/children/objectrowid_param/valueProcess.js
@@ -0,0 +1,4 @@
+import("system.vars");
+import("system.result");
+
+result.string(vars.get("$param.ObjectRowId_param"));
\ No newline at end of file
diff --git a/entity/MSTTeam_entity/entityfields/teammembers/children/objecttype_param/valueProcess.js b/entity/MSTTeam_entity/entityfields/teammembers/children/objecttype_param/valueProcess.js
new file mode 100644
index 00000000000..95c8514f3bb
--- /dev/null
+++ b/entity/MSTTeam_entity/entityfields/teammembers/children/objecttype_param/valueProcess.js
@@ -0,0 +1,4 @@
+import("system.vars");
+import("system.result");
+
+result.string(vars.get("$param.ObjectType_param"));
\ No newline at end of file
diff --git a/entity/MSTTeam_entity/entityfields/teammembers/children/salesprojectid_param/valueProcess.js b/entity/MSTTeam_entity/entityfields/teammembers/children/salesprojectid_param/valueProcess.js
deleted file mode 100644
index 86e1d8c1c0f..00000000000
--- a/entity/MSTTeam_entity/entityfields/teammembers/children/salesprojectid_param/valueProcess.js
+++ /dev/null
@@ -1,4 +0,0 @@
-import("system.vars");
-import("system.result");
-
-result.string(vars.get("$param.SalesprojectId_param"));
\ No newline at end of file
diff --git a/entity/MSTTeam_entity/recordcontainers/jdito/onInsert.js b/entity/MSTTeam_entity/recordcontainers/jdito/onInsert.js
index ed2b033b329..e2f64e547b2 100644
--- a/entity/MSTTeam_entity/recordcontainers/jdito/onInsert.js
+++ b/entity/MSTTeam_entity/recordcontainers/jdito/onInsert.js
@@ -4,6 +4,7 @@ import("system.vars");
 import("system.teams");
 import("system.tools");
 import("Employee_lib");
+import("MSTeams_lib");
 
 var rowData = vars.get("$local.rowdata");
 var teamName = rowData["TEAMNAME.value"];
@@ -69,5 +70,4 @@ new SqlBuilder().insertFields({
     "WEB_URL" : mstTeam.webUrl
 }, "MST_TEAM");
 
-newWhere("SALESPROJECT.SALESPROJECTID", "$param.SalesprojectId_param")
-    .updateFields({"MST_TEAM_ID" : mstTeam.teamId});
\ No newline at end of file
+MSTeamsUtils.createTeamLink(mstTeam.teamId, vars.get("$param.ObjectRowId_param"), vars.get("$param.ObjectType_param"));
\ No newline at end of file
diff --git a/entity/MSTeamsAddMembers_entity/MSTeamsAddMembers_entity.aod b/entity/MSTeamsAddMembers_entity/MSTeamsAddMembers_entity.aod
index 93e9c9f9fc0..2497bfbb52a 100644
--- a/entity/MSTeamsAddMembers_entity/MSTeamsAddMembers_entity.aod
+++ b/entity/MSTeamsAddMembers_entity/MSTeamsAddMembers_entity.aod
@@ -21,15 +21,15 @@
       </dependency>
       <children>
         <entityParameter>
-          <name>SalesprojectId_param</name>
-          <valueProcess>%aditoprj%/entity/MSTeamsAddMembers_entity/entityfields/members/children/salesprojectid_param/valueProcess.js</valueProcess>
+          <name>ObjectRowId_param</name>
+          <valueProcess>%aditoprj%/entity/MSTeamsAddMembers_entity/entityfields/members/children/objectrowid_param/valueProcess.js</valueProcess>
+        </entityParameter>
+        <entityParameter>
+          <name>ObjectType_param</name>
+          <valueProcess>%aditoprj%/entity/MSTeamsAddMembers_entity/entityfields/members/children/objecttype_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
     </entityConsumer>
-    <entityParameter>
-      <name>SalesprojectId_param</name>
-      <expose v="true" />
-    </entityParameter>
     <entityField>
       <name>MST_TEAMNAME</name>
       <title>Team name</title>
@@ -39,6 +39,14 @@
       <name>MST_TEAM_ID</name>
       <valueProcess>%aditoprj%/entity/MSTeamsAddMembers_entity/entityfields/mst_team_id/valueProcess.js</valueProcess>
     </entityField>
+    <entityParameter>
+      <name>ObjectRowId_param</name>
+      <expose v="true" />
+    </entityParameter>
+    <entityParameter>
+      <name>ObjectType_param</name>
+      <expose v="true" />
+    </entityParameter>
   </entityFields>
   <recordContainers>
     <jDitoRecordContainer>
diff --git a/entity/MSTeamsAddMembers_entity/entityfields/members/children/objectrowid_param/valueProcess.js b/entity/MSTeamsAddMembers_entity/entityfields/members/children/objectrowid_param/valueProcess.js
new file mode 100644
index 00000000000..dc0d70ccbe7
--- /dev/null
+++ b/entity/MSTeamsAddMembers_entity/entityfields/members/children/objectrowid_param/valueProcess.js
@@ -0,0 +1,4 @@
+import("system.vars");
+import("system.result");
+
+result.string(vars.get("$param.ObjectRowId_param"));
\ No newline at end of file
diff --git a/entity/MSTeamsAddMembers_entity/entityfields/members/children/objecttype_param/valueProcess.js b/entity/MSTeamsAddMembers_entity/entityfields/members/children/objecttype_param/valueProcess.js
new file mode 100644
index 00000000000..95c8514f3bb
--- /dev/null
+++ b/entity/MSTeamsAddMembers_entity/entityfields/members/children/objecttype_param/valueProcess.js
@@ -0,0 +1,4 @@
+import("system.vars");
+import("system.result");
+
+result.string(vars.get("$param.ObjectType_param"));
\ No newline at end of file
diff --git a/entity/MSTeamsAddMembers_entity/entityfields/members/children/salesprojectid_param/valueProcess.js b/entity/MSTeamsAddMembers_entity/entityfields/members/children/salesprojectid_param/valueProcess.js
deleted file mode 100644
index 86e1d8c1c0f..00000000000
--- a/entity/MSTeamsAddMembers_entity/entityfields/members/children/salesprojectid_param/valueProcess.js
+++ /dev/null
@@ -1,4 +0,0 @@
-import("system.vars");
-import("system.result");
-
-result.string(vars.get("$param.SalesprojectId_param"));
\ No newline at end of file
diff --git a/entity/MSTeamsChat_entity/MSTeamsChat_entity.aod b/entity/MSTeamsChat_entity/MSTeamsChat_entity.aod
deleted file mode 100644
index 55e602c74a3..00000000000
--- a/entity/MSTeamsChat_entity/MSTeamsChat_entity.aod
+++ /dev/null
@@ -1,85 +0,0 @@
-<?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.14" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.14">
-  <name>MSTeamsChat_entity</name>
-  <majorModelMode>DISTRIBUTED</majorModelMode>
-  <siblings />
-  <recordContainer>jdito</recordContainer>
-  <entityFields>
-    <entityProvider>
-      <name>#PROVIDER</name>
-    </entityProvider>
-    <entityField>
-      <name>CREATED_DATE_TIME</name>
-    </entityField>
-    <entityField>
-      <name>MESSAGE</name>
-      <state>READONLY</state>
-    </entityField>
-    <entityField>
-      <name>FROM</name>
-    </entityField>
-    <entityField>
-      <name>UID</name>
-    </entityField>
-    <entityParameter>
-      <name>ROWID_param</name>
-      <expose v="true" />
-    </entityParameter>
-    <entityConsumer>
-      <name>Consumer</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>MSTTeamsMessage_entity</entityName>
-        <fieldName>Messages</fieldName>
-      </dependency>
-      <children>
-        <entityParameter>
-          <name>Messages_param</name>
-          <valueProcess>%aditoprj%/entity/MSTeamsChat_entity/entityfields/consumer/children/messages_param/valueProcess.js</valueProcess>
-        </entityParameter>
-      </children>
-    </entityConsumer>
-    <entityField>
-      <name>ALLCHANNELS</name>
-      <title>Alle Channel</title>
-      <mandatory v="true" />
-      <dropDownProcess>%aditoprj%/entity/MSTeamsChat_entity/entityfields/allchannels/dropDownProcess.js</dropDownProcess>
-      <valueProcess>%aditoprj%/entity/MSTeamsChat_entity/entityfields/allchannels/valueProcess.js</valueProcess>
-    </entityField>
-    <entityField>
-      <name>SEARCHVALUE</name>
-      <title>Suchbegriff (Case Sensitive)</title>
-    </entityField>
-    <entityActionField>
-      <name>LoadNewMessages</name>
-      <title>Lade neue Nachrichten</title>
-      <onActionProcess>%aditoprj%/entity/MSTeamsChat_entity/entityfields/loadnewmessages/onActionProcess.js</onActionProcess>
-      <stateProcess>%aditoprj%/entity/MSTeamsChat_entity/entityfields/loadnewmessages/stateProcess.js</stateProcess>
-    </entityActionField>
-    <entityField>
-      <name>NEWMESSAGES</name>
-    </entityField>
-  </entityFields>
-  <recordContainers>
-    <jDitoRecordContainer>
-      <name>jdito</name>
-      <jDitoRecordAlias>Data_alias</jDitoRecordAlias>
-      <contentProcess>%aditoprj%/entity/MSTeamsChat_entity/recordcontainers/jdito/contentProcess.js</contentProcess>
-      <onInsert>%aditoprj%/entity/MSTeamsChat_entity/recordcontainers/jdito/onInsert.js</onInsert>
-      <recordFieldMappings>
-        <jDitoRecordFieldMapping>
-          <name>UID.value</name>
-        </jDitoRecordFieldMapping>
-        <jDitoRecordFieldMapping>
-          <name>FROM.value</name>
-        </jDitoRecordFieldMapping>
-        <jDitoRecordFieldMapping>
-          <name>MESSAGE.value</name>
-        </jDitoRecordFieldMapping>
-        <jDitoRecordFieldMapping>
-          <name>CREATED_DATE_TIME.value</name>
-        </jDitoRecordFieldMapping>
-      </recordFieldMappings>
-    </jDitoRecordContainer>
-  </recordContainers>
-</entity>
diff --git a/entity/MSTeamsChat_entity/entityfields/allchannels/dropDownProcess.js b/entity/MSTeamsChat_entity/entityfields/allchannels/dropDownProcess.js
deleted file mode 100644
index bf5fb95d272..00000000000
--- a/entity/MSTeamsChat_entity/entityfields/allchannels/dropDownProcess.js
+++ /dev/null
@@ -1,24 +0,0 @@
-import("system.result");
-import("system.teams");
-import("system.vars");
-import("Sql_lib");
-
-var searchValue = vars.get("$field.SEARCHVALUE");
-var allChannels;
-
-var teamId = newSelect("MST_TEAMID")
-    .from("MST_TEAM")
-    .where("MST_TEAM.OBJECT_ROWID", "$param.ROWID_param")
-    .cell();
-
-if(searchValue)
-{
-    allChannels = teams.getAllChannelsInTeam(teamId, searchValue);
-}
-else
-{
-    allChannels = teams.getAllChannelsInTeam(teamId, null)
-}
-
-if (allChannels)
-    result.object(allChannels);
\ No newline at end of file
diff --git a/entity/MSTeamsChat_entity/entityfields/allchannels/valueProcess.js b/entity/MSTeamsChat_entity/entityfields/allchannels/valueProcess.js
deleted file mode 100644
index e69de29bb2d..00000000000
diff --git a/entity/MSTeamsChat_entity/entityfields/consumer/children/messages_param/valueProcess.js b/entity/MSTeamsChat_entity/entityfields/consumer/children/messages_param/valueProcess.js
deleted file mode 100644
index 8e36993e162..00000000000
--- a/entity/MSTeamsChat_entity/entityfields/consumer/children/messages_param/valueProcess.js
+++ /dev/null
@@ -1,24 +0,0 @@
-import("system.teams");
-import("system.vars");
-import("system.result");
-import("system.util");
-import("Sql_lib");
-            
-if(vars.get("$field.ALLCHANNELS"))
-{
-    var teamId = newSelect("MST_TEAMID")
-            .from("MST_TEAM")
-            .where("MST_TEAM.OBJECT_ROWID", "$param.ROWID_param")
-            .cell();
-            
-    var messages = teams.getChannelMessages(teamId, vars.get("$field.ALLCHANNELS"), 10)
-
-    result.string(messages);
-}
-
-if(vars.get("$field.NEWMESSAGES") == "true")
-{
-    vars.set("$field.NEWMESSAGES", "false");
-    var messages = teams.getNextChannelMessages(vars.get("$global.nextLink"));
-    result.string(messages);
-}
\ No newline at end of file
diff --git a/entity/MSTeamsChat_entity/entityfields/loadnewmessages/onActionProcess.js b/entity/MSTeamsChat_entity/entityfields/loadnewmessages/onActionProcess.js
deleted file mode 100644
index 0f2f3a48446..00000000000
--- a/entity/MSTeamsChat_entity/entityfields/loadnewmessages/onActionProcess.js
+++ /dev/null
@@ -1,9 +0,0 @@
-import("system.vars");
-
-vars.set("$field.NEWMESSAGES", "true");
-
-
-
-
-
-
diff --git a/entity/MSTeamsChat_entity/entityfields/loadnewmessages/stateProcess.js b/entity/MSTeamsChat_entity/entityfields/loadnewmessages/stateProcess.js
deleted file mode 100644
index e92007c6780..00000000000
--- a/entity/MSTeamsChat_entity/entityfields/loadnewmessages/stateProcess.js
+++ /dev/null
@@ -1,19 +0,0 @@
-import("system.vars");
-import("system.neon");
-import("system.result");
-
-if(vars.exists("$global.nextLink"))
-{
-    if(vars.get("$global.nextLink") != "")
-    {
-        result.string(neon.COMPONENTSTATE_EDITABLE);
-    }
-    else
-    {
-        result.string(neon.COMPONENTSTATE_DISABLED);
-    }
-}
-else
-{
-    result.string(neon.COMPONENTSTATE_DISABLED);
-}
\ No newline at end of file
diff --git a/entity/MSTeamsChat_entity/recordcontainers/jdito/contentProcess.js b/entity/MSTeamsChat_entity/recordcontainers/jdito/contentProcess.js
deleted file mode 100644
index d1824307a60..00000000000
--- a/entity/MSTeamsChat_entity/recordcontainers/jdito/contentProcess.js
+++ /dev/null
@@ -1,9 +0,0 @@
-import("system.result");
-import("system.vars");
-
-//TODO: This dummy implementation shouldn't be nescessary here. Remove this process eventually. #1051003
-var rows = [];
-if (vars.get("$local.idvalues"))
-    rows = vars.get("$local.idvalues").map(function (id) {return [id, "", "", ""];});
-
-result.object(rows);
\ No newline at end of file
diff --git a/entity/MSTeamsChat_entity/recordcontainers/jdito/onInsert.js b/entity/MSTeamsChat_entity/recordcontainers/jdito/onInsert.js
deleted file mode 100644
index 954340e1c3b..00000000000
--- a/entity/MSTeamsChat_entity/recordcontainers/jdito/onInsert.js
+++ /dev/null
@@ -1,3 +0,0 @@
-import("system.logging");
-
-logging.log("Erstelle eine neue Aktivität");
\ No newline at end of file
diff --git a/entity/Member_entity/Member_entity.aod b/entity/Member_entity/Member_entity.aod
index f7e8a3c0a24..5b76c88fab6 100644
--- a/entity/Member_entity/Member_entity.aod
+++ b/entity/Member_entity/Member_entity.aod
@@ -223,22 +223,6 @@
           <iconId>NEON:PENCIL</iconId>
           <stateProcess>%aditoprj%/entity/Member_entity/entityfields/msteamsactiongroup/children/editteam/stateProcess.js</stateProcess>
         </entityActionField>
-        <entityActionField>
-          <name>addNewMember</name>
-          <title>Add members</title>
-          <onActionProcess>%aditoprj%/entity/Member_entity/entityfields/msteamsactiongroup/children/addnewmember/onActionProcess.js</onActionProcess>
-          <iconId>VAADIN:USER</iconId>
-          <state>INVISIBLE</state>
-          <stateProcess>%aditoprj%/entity/Member_entity/entityfields/msteamsactiongroup/children/addnewmember/stateProcess.js</stateProcess>
-          <tooltip>Fügt neue Member zum Team hinzu</tooltip>
-        </entityActionField>
-        <entityActionField>
-          <name>deleteMember</name>
-          <title>Delete members</title>
-          <iconId>VAADIN:USER</iconId>
-          <state>INVISIBLE</state>
-          <stateProcess>%aditoprj%/entity/Member_entity/entityfields/msteamsactiongroup/children/deletemember/stateProcess.js</stateProcess>
-        </entityActionField>
         <entityActionField>
           <name>addApp</name>
           <title>Add app</title>
@@ -293,7 +277,8 @@
       </dependencies>
     </entityProvider>
     <entityParameter>
-      <name>MST_TeamId_param</name>
+      <name>MSTTeamId_param</name>
+      <valueProcess>%aditoprj%/entity/Member_entity/entityfields/mstteamid_param/valueProcess.js</valueProcess>
       <expose v="true" />
     </entityParameter>
   </entityFields>
diff --git a/entity/Member_entity/entityfields/msteamsactiongroup/children/addapp/onActionProcess.js b/entity/Member_entity/entityfields/msteamsactiongroup/children/addapp/onActionProcess.js
index 9ec4d7bd685..826e42316f9 100644
--- a/entity/Member_entity/entityfields/msteamsactiongroup/children/addapp/onActionProcess.js
+++ b/entity/Member_entity/entityfields/msteamsactiongroup/children/addapp/onActionProcess.js
@@ -4,4 +4,4 @@ import("system.vars");
 
 var appId = project.getInstanceConfigValue("teamsAppId", null);
 if (appId != null)
-    teams.addApp(vars.get("$param.MST_TeamId_param"), appId);
\ No newline at end of file
+    teams.addApp(vars.get("$param.MSTTeamId_param"), appId);
\ No newline at end of file
diff --git a/entity/Member_entity/entityfields/msteamsactiongroup/children/addapp/stateProcess.js b/entity/Member_entity/entityfields/msteamsactiongroup/children/addapp/stateProcess.js
index 0bcfd015460..2446336fdb5 100644
--- a/entity/Member_entity/entityfields/msteamsactiongroup/children/addapp/stateProcess.js
+++ b/entity/Member_entity/entityfields/msteamsactiongroup/children/addapp/stateProcess.js
@@ -3,7 +3,7 @@ import("system.neon");
 import("system.result");
 import("Sql_lib");
 
-var teamId = vars.exists("$param.MST_TeamId_param") ? vars.get("$param.MST_TeamId_param") : null;
+var teamId = vars.exists("$param.MSTTeamId_param") ? vars.get("$param.MSTTeamId_param") : null;
 
 var isArchived, serviceUrl;
 var teamData = newSelect("IS_ARCHIVED, SERVICE_URL")
diff --git a/entity/Member_entity/entityfields/msteamsactiongroup/children/addnewmember/onActionProcess.js b/entity/Member_entity/entityfields/msteamsactiongroup/children/addnewmember/onActionProcess.js
deleted file mode 100644
index 80a2305605c..00000000000
--- a/entity/Member_entity/entityfields/msteamsactiongroup/children/addnewmember/onActionProcess.js
+++ /dev/null
@@ -1,6 +0,0 @@
-import("system.neon");
-import("system.vars");
-
-neon.openContext("MSTTeamAddMembers", null, null, neon.OPERATINGSTATE_NEW, {
-    "SalesprojectId_param" : vars.get("$field.OBJECT_ROWID")
-});
diff --git a/entity/Member_entity/entityfields/msteamsactiongroup/children/addnewmember/stateProcess.js b/entity/Member_entity/entityfields/msteamsactiongroup/children/addnewmember/stateProcess.js
deleted file mode 100644
index 3927f9c0557..00000000000
--- a/entity/Member_entity/entityfields/msteamsactiongroup/children/addnewmember/stateProcess.js
+++ /dev/null
@@ -1,20 +0,0 @@
-//import("system.vars");
-//import("system.neon");
-//import("system.result");
-//import("Sql_lib");
-//
-//var teamId = vars.exists("$param.MST_TeamId_param") ? vars.get("$param.MST_TeamId_param") : null;
-//
-//var isArchived = newSelect("IS_ARCHIVED")
-//    .from("MST_TEAM")
-//    .whereIfSet("MST_TEAM.MST_TEAMID", teamId)
-//    .cell(true);
-//    
-//if (teamId == "" || isArchived == 1) 
-//{
-//    result.string(neon.COMPONENTSTATE_DISABLED);
-//}
-//else
-//{
-//    result.string(neon.COMPONENTSTATE_EDITABLE);
-//}
\ No newline at end of file
diff --git a/entity/Member_entity/entityfields/msteamsactiongroup/children/changetomsteam/onActionProcess.js b/entity/Member_entity/entityfields/msteamsactiongroup/children/changetomsteam/onActionProcess.js
index 8359835837a..19f20d51a62 100644
--- a/entity/Member_entity/entityfields/msteamsactiongroup/children/changetomsteam/onActionProcess.js
+++ b/entity/Member_entity/entityfields/msteamsactiongroup/children/changetomsteam/onActionProcess.js
@@ -4,7 +4,7 @@ import("system.neon");
 
 var webUrl = newSelect("WEB_URL")
     .from("MST_TEAM")
-    .whereIfSet("MST_TEAM.MST_TEAMID", "$param.MST_TeamId_param")
+    .whereIfSet("MST_TEAM.MST_TEAMID", "$param.MSTTeamId_param")
     .cell(true);
 
 if (webUrl)
diff --git a/entity/Member_entity/entityfields/msteamsactiongroup/children/changetomsteam/stateProcess.js b/entity/Member_entity/entityfields/msteamsactiongroup/children/changetomsteam/stateProcess.js
index 90deb206fd1..5a91fdde73f 100644
--- a/entity/Member_entity/entityfields/msteamsactiongroup/children/changetomsteam/stateProcess.js
+++ b/entity/Member_entity/entityfields/msteamsactiongroup/children/changetomsteam/stateProcess.js
@@ -3,7 +3,7 @@ import("system.neon");
 import("system.result");
 import("Sql_lib");
 
-var teamId = vars.exists("$param.MST_TeamId_param") ? vars.get("$param.MST_TeamId_param") : null;
+var teamId = vars.exists("$param.MSTTeamId_param") ? vars.get("$param.MSTTeamId_param") : null;
 
 var isArchived = newSelect("IS_ARCHIVED")
     .from("MST_TEAM")
diff --git a/entity/Member_entity/entityfields/msteamsactiongroup/children/chooseteam/stateProcess.js b/entity/Member_entity/entityfields/msteamsactiongroup/children/chooseteam/stateProcess.js
index c2d3d1fee36..82ce3fae3fb 100644
--- a/entity/Member_entity/entityfields/msteamsactiongroup/children/chooseteam/stateProcess.js
+++ b/entity/Member_entity/entityfields/msteamsactiongroup/children/chooseteam/stateProcess.js
@@ -2,7 +2,7 @@ import("system.vars");
 import("system.neon");
 import("system.result");
 
-result.string(vars.exists("$param.MST_TeamId_param") && vars.get("$param.MST_TeamId_param") 
+result.string(vars.exists("$param.MSTTeamId_param") && vars.get("$param.MSTTeamId_param") 
     ? neon.COMPONENTSTATE_DISABLED 
     : neon.COMPONENTSTATE_EDITABLE
 );
\ No newline at end of file
diff --git a/entity/Member_entity/entityfields/msteamsactiongroup/children/createteam/onActionProcess.js b/entity/Member_entity/entityfields/msteamsactiongroup/children/createteam/onActionProcess.js
index 8798621d425..cb23d1d3c0b 100644
--- a/entity/Member_entity/entityfields/msteamsactiongroup/children/createteam/onActionProcess.js
+++ b/entity/Member_entity/entityfields/msteamsactiongroup/children/createteam/onActionProcess.js
@@ -4,17 +4,20 @@ import("system.teams");
 import("Sql_lib");
 
 var rowId = vars.get("$param.ObjectRowId_param");
+var objectType = vars.get("$param.ObjectType_param");
+var params = {
+    "ObjectRowId_param": rowId,
+    "ObjectType_param": objectType
+};
 
-var [teamName, description] = newSelect("PROJECTTITLE, INFO")
-    .from("SALESPROJECT")
-    .where("SALESPROJECT.SALESPROJECTID", rowId)
-    .arrayRow();
- 
-var mailNickname = teamName.replace(/\s/g, "");
+if (objectType === "Salesproject")
+{
+    var [teamName, description] = newSelect("PROJECTTITLE, INFO")
+        .from("SALESPROJECT")
+        .where("SALESPROJECT.SALESPROJECTID", rowId)
+        .arrayRow();
+    params["TeamName_param"] = teamName;
+    params["Description_param"] = description;
+}
 
-neon.openContext("MSTTeam", null, null, neon.OPERATINGSTATE_NEW, {
-    "SalesprojectId_param" : rowId,
-    "TeamName_param" : teamName,
-    "Description_param" : description,   
-    "Mailnickname_param" : mailNickname
-});
\ No newline at end of file
+neon.openContext("MSTTeam", null, null, neon.OPERATINGSTATE_NEW, params);
\ No newline at end of file
diff --git a/entity/Member_entity/entityfields/msteamsactiongroup/children/createteam/stateProcess.js b/entity/Member_entity/entityfields/msteamsactiongroup/children/createteam/stateProcess.js
index c2d3d1fee36..82ce3fae3fb 100644
--- a/entity/Member_entity/entityfields/msteamsactiongroup/children/createteam/stateProcess.js
+++ b/entity/Member_entity/entityfields/msteamsactiongroup/children/createteam/stateProcess.js
@@ -2,7 +2,7 @@ import("system.vars");
 import("system.neon");
 import("system.result");
 
-result.string(vars.exists("$param.MST_TeamId_param") && vars.get("$param.MST_TeamId_param") 
+result.string(vars.exists("$param.MSTTeamId_param") && vars.get("$param.MSTTeamId_param") 
     ? neon.COMPONENTSTATE_DISABLED 
     : neon.COMPONENTSTATE_EDITABLE
 );
\ No newline at end of file
diff --git a/entity/Member_entity/entityfields/msteamsactiongroup/children/deletemember/stateProcess.js b/entity/Member_entity/entityfields/msteamsactiongroup/children/deletemember/stateProcess.js
deleted file mode 100644
index 3927f9c0557..00000000000
--- a/entity/Member_entity/entityfields/msteamsactiongroup/children/deletemember/stateProcess.js
+++ /dev/null
@@ -1,20 +0,0 @@
-//import("system.vars");
-//import("system.neon");
-//import("system.result");
-//import("Sql_lib");
-//
-//var teamId = vars.exists("$param.MST_TeamId_param") ? vars.get("$param.MST_TeamId_param") : null;
-//
-//var isArchived = newSelect("IS_ARCHIVED")
-//    .from("MST_TEAM")
-//    .whereIfSet("MST_TEAM.MST_TEAMID", teamId)
-//    .cell(true);
-//    
-//if (teamId == "" || isArchived == 1) 
-//{
-//    result.string(neon.COMPONENTSTATE_DISABLED);
-//}
-//else
-//{
-//    result.string(neon.COMPONENTSTATE_EDITABLE);
-//}
\ No newline at end of file
diff --git a/entity/Member_entity/entityfields/msteamsactiongroup/children/deleteteam/onActionProcess.js b/entity/Member_entity/entityfields/msteamsactiongroup/children/deleteteam/onActionProcess.js
index d4fd1f58184..02a6be4eecf 100644
--- a/entity/Member_entity/entityfields/msteamsactiongroup/children/deleteteam/onActionProcess.js
+++ b/entity/Member_entity/entityfields/msteamsactiongroup/children/deleteteam/onActionProcess.js
@@ -3,7 +3,7 @@ import("Sql_lib");
 import("system.vars");
 import("system.neon");
 
-var teamId = vars.get("$param.MST_TeamId_param");
+var teamId = vars.get("$param.MSTTeamId_param");
 if (teamId)
 {
     teams.archiveTeam(teamId);
diff --git a/entity/Member_entity/entityfields/msteamsactiongroup/children/deleteteam/stateProcess.js b/entity/Member_entity/entityfields/msteamsactiongroup/children/deleteteam/stateProcess.js
index 90deb206fd1..5a91fdde73f 100644
--- a/entity/Member_entity/entityfields/msteamsactiongroup/children/deleteteam/stateProcess.js
+++ b/entity/Member_entity/entityfields/msteamsactiongroup/children/deleteteam/stateProcess.js
@@ -3,7 +3,7 @@ import("system.neon");
 import("system.result");
 import("Sql_lib");
 
-var teamId = vars.exists("$param.MST_TeamId_param") ? vars.get("$param.MST_TeamId_param") : null;
+var teamId = vars.exists("$param.MSTTeamId_param") ? vars.get("$param.MSTTeamId_param") : null;
 
 var isArchived = newSelect("IS_ARCHIVED")
     .from("MST_TEAM")
diff --git a/entity/Member_entity/entityfields/msteamsactiongroup/children/editteam/onActionProcess.js b/entity/Member_entity/entityfields/msteamsactiongroup/children/editteam/onActionProcess.js
index 7e7282b01af..8f072bc03d0 100644
--- a/entity/Member_entity/entityfields/msteamsactiongroup/children/editteam/onActionProcess.js
+++ b/entity/Member_entity/entityfields/msteamsactiongroup/children/editteam/onActionProcess.js
@@ -1,9 +1,7 @@
 import("system.vars");
 import("system.neon");
 
-var rowId = vars.get("$param.ObjectRowId_param");
-var teamId = vars.get("$param.MST_TeamId_param");
-
-neon.openContext("MSTTeam", "MSTTeamEditMembers_view", [teamId], neon.OPERATINGSTATE_EDIT, {
-    "SalesprojectId_param" : rowId
+neon.openContext("MSTTeam", "MSTTeamEditMembers_view", [vars.get("$param.MSTTeamId_param")], neon.OPERATINGSTATE_EDIT, {
+    "ObjectRowId_param": vars.get("$param.ObjectRowId_param"),
+    "ObjectType_param": vars.get("$param.ObjectType_param")
 });
\ No newline at end of file
diff --git a/entity/Member_entity/entityfields/msteamsactiongroup/children/editteam/stateProcess.js b/entity/Member_entity/entityfields/msteamsactiongroup/children/editteam/stateProcess.js
index 90deb206fd1..5a91fdde73f 100644
--- a/entity/Member_entity/entityfields/msteamsactiongroup/children/editteam/stateProcess.js
+++ b/entity/Member_entity/entityfields/msteamsactiongroup/children/editteam/stateProcess.js
@@ -3,7 +3,7 @@ import("system.neon");
 import("system.result");
 import("Sql_lib");
 
-var teamId = vars.exists("$param.MST_TeamId_param") ? vars.get("$param.MST_TeamId_param") : null;
+var teamId = vars.exists("$param.MSTTeamId_param") ? vars.get("$param.MSTTeamId_param") : null;
 
 var isArchived = newSelect("IS_ARCHIVED")
     .from("MST_TEAM")
diff --git a/entity/Member_entity/entityfields/msteamsactiongroup/children/restoreteam/onActionProcess.js b/entity/Member_entity/entityfields/msteamsactiongroup/children/restoreteam/onActionProcess.js
index 0333cfcd2cc..6a3f91dd328 100644
--- a/entity/Member_entity/entityfields/msteamsactiongroup/children/restoreteam/onActionProcess.js
+++ b/entity/Member_entity/entityfields/msteamsactiongroup/children/restoreteam/onActionProcess.js
@@ -3,7 +3,7 @@ import("Sql_lib");
 import("system.vars");
 import("system.neon");
 
-var teamId = vars.get("$param.MST_TeamId_param");
+var teamId = vars.get("$param.MSTTeamId_param");
 if (teamId)
 {
     teams.unarchiveTeam(teamId);
diff --git a/entity/Member_entity/entityfields/msteamsactiongroup/children/restoreteam/stateProcess.js b/entity/Member_entity/entityfields/msteamsactiongroup/children/restoreteam/stateProcess.js
index 724a77951db..97ff04f9a94 100644
--- a/entity/Member_entity/entityfields/msteamsactiongroup/children/restoreteam/stateProcess.js
+++ b/entity/Member_entity/entityfields/msteamsactiongroup/children/restoreteam/stateProcess.js
@@ -3,7 +3,7 @@ import("system.neon");
 import("system.result");
 import("Sql_lib");
 
-var teamId = vars.exists("$param.MST_TeamId_param") ? vars.get("$param.MST_TeamId_param") : null;
+var teamId = vars.exists("$param.MSTTeamId_param") ? vars.get("$param.MSTTeamId_param") : null;
 
 var isArchived = newSelect("IS_ARCHIVED")
     .from("MST_TEAM")
diff --git a/entity/Member_entity/entityfields/msteamsactiongroup/stateProcess.js b/entity/Member_entity/entityfields/msteamsactiongroup/stateProcess.js
index dcb3c04ef9b..c05618702e3 100644
--- a/entity/Member_entity/entityfields/msteamsactiongroup/stateProcess.js
+++ b/entity/Member_entity/entityfields/msteamsactiongroup/stateProcess.js
@@ -1,14 +1,7 @@
+import("system.vars");
 import("system.neon");
 import("system.result");
-import("system.project");
+import("MSTeams_lib");
 
-var isTeamsEnabled = project.getInstanceConfigValue("teamsEnabled", null);
-
-if (isTeamsEnabled == "true")
-{
-    result.string(neon.COMPONENTSTATE_EDITABLE);
-}
-else
-{
-    result.string(neon.COMPONENTSTATE_INVISIBLE);
-}
\ No newline at end of file
+var isTeamsEnabled = vars.get("$param.EnableMSTeams_param") == "true" && MSTeamsUtils.isTeamsEnabled();
+result.string(isTeamsEnabled ? neon.COMPONENTSTATE_EDITABLE : neon.COMPONENTSTATE_INVISIBLE);
\ No newline at end of file
diff --git a/entity/Member_entity/entityfields/mstteamid_param/valueProcess.js b/entity/Member_entity/entityfields/mstteamid_param/valueProcess.js
new file mode 100644
index 00000000000..d949390036f
--- /dev/null
+++ b/entity/Member_entity/entityfields/mstteamid_param/valueProcess.js
@@ -0,0 +1,15 @@
+import("system.vars");
+import("system.result");
+import("Sql_lib");
+import("MSTeams_lib");
+
+var objectType = vars.get("$param.ObjectType_param");
+if (objectType in MSTeamsUtils.getTeamLinkContexts())
+{
+    var teamId = newSelect("MST_TEAM_ID")
+        .from("MST_TEAMLINK")
+        .where("MST_TEAMLINK.OBJECT_ROWID", "$param.ObjectRowId_param")
+        .and("MST_TEAMLINK.OBJECT_TYPE", objectType)
+        .cell();
+    result.string(teamId);
+}
\ No newline at end of file
diff --git a/entity/SalesprojectMilestone_entity/SalesprojectMilestone_entity.aod b/entity/SalesprojectMilestone_entity/SalesprojectMilestone_entity.aod
index 9c1a6676b9a..ab8b7b82dbc 100644
--- a/entity/SalesprojectMilestone_entity/SalesprojectMilestone_entity.aod
+++ b/entity/SalesprojectMilestone_entity/SalesprojectMilestone_entity.aod
@@ -61,7 +61,7 @@
       <recordContainer>db</recordContainer>
       <children>
         <entityParameter>
-          <name>SalesprojectId_param</name>
+          <name>ObjectRowId_param</name>
           <expose v="true" />
         </entityParameter>
         <entityParameter>
diff --git a/entity/SalesprojectSource_entity/SalesprojectSource_entity.aod b/entity/SalesprojectSource_entity/SalesprojectSource_entity.aod
index 7480acbbffe..1684133b262 100644
--- a/entity/SalesprojectSource_entity/SalesprojectSource_entity.aod
+++ b/entity/SalesprojectSource_entity/SalesprojectSource_entity.aod
@@ -24,7 +24,7 @@
       </dependencies>
       <children>
         <entityParameter>
-          <name>SalesprojectId_param</name>
+          <name>ObjectRowId_param</name>
           <expose v="true" />
         </entityParameter>
       </children>
diff --git a/entity/Salesproject_entity/Salesproject_entity.aod b/entity/Salesproject_entity/Salesproject_entity.aod
index 50f493b5f76..c5167cdac22 100644
--- a/entity/Salesproject_entity/Salesproject_entity.aod
+++ b/entity/Salesproject_entity/Salesproject_entity.aod
@@ -271,8 +271,8 @@
           <expose v="true" />
         </entityParameter>
         <entityParameter>
-          <name>MST_TeamId_param</name>
-          <valueProcess>%aditoprj%/entity/Salesproject_entity/entityfields/members/children/mst_teamid_param/valueProcess.js</valueProcess>
+          <name>MSTTeamId_param</name>
+          <valueProcess>%aditoprj%/entity/Salesproject_entity/entityfields/members/children/mstteamid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
     </entityConsumer>
@@ -789,19 +789,26 @@
       <onDBDelete>%aditoprj%/entity/Salesproject_entity/recordcontainers/db/onDBDelete.js</onDBDelete>
       <linkInformation>
         <linkInformation>
-          <name>02eb2f4c-3b85-409f-ac13-c8b26804da44</name>
+          <name>8431afcb-b0f3-4498-9e2c-d343bc6b4dd3</name>
           <tableName>SALESPROJECT</tableName>
           <primaryKey>SALESPROJECTID</primaryKey>
           <isUIDTable v="true" />
           <readonly v="false" />
         </linkInformation>
         <linkInformation>
-          <name>485af2f8-d91d-442f-89c7-c44915dda990</name>
+          <name>cf76b9a8-55fc-41e9-918c-f06ce3c86e3c</name>
           <tableName>ORGANISATION</tableName>
           <primaryKey>ORGANISATIONID</primaryKey>
           <isUIDTable v="false" />
           <readonly v="true" />
         </linkInformation>
+        <linkInformation>
+          <name>44fba381-e477-4a92-ba82-fc22c3d98c23</name>
+          <tableName>MST_TEAM</tableName>
+          <primaryKey>MST_TEAMID</primaryKey>
+          <isUIDTable v="false" />
+          <readonly v="true" />
+        </linkInformation>
       </linkInformation>
       <recordFieldMappings>
         <dbRecordFieldMapping>
@@ -905,11 +912,7 @@
         </dbRecordFieldMapping>
         <dbRecordFieldMapping>
           <name>MST_TEAM_ID.value</name>
-          <recordfield>SALESPROJECT.MST_TEAM_ID</recordfield>
-        </dbRecordFieldMapping>
-        <dbRecordFieldMapping>
-          <name>MST_TEAM_ID.displayValue</name>
-          <expression>%aditoprj%/entity/Salesproject_entity/recordcontainers/db/recordfieldmappings/mst_team_id.displayvalue/expression.js</expression>
+          <recordfield>MST_TEAM.MST_TEAMID</recordfield>
         </dbRecordFieldMapping>
         <dbRecordFieldMapping>
           <name>COUNT.value</name>
@@ -920,6 +923,10 @@
           <recordfield>SALESPROJECT.SALESPROJECTID</recordfield>
           <aggregateType>COUNT</aggregateType>
         </aggregateFieldDbMapping>
+        <dbRecordFieldMapping>
+          <name>MST_TEAM_ID.displayValue</name>
+          <recordfield>MST_TEAM.TEAMNAME</recordfield>
+        </dbRecordFieldMapping>
       </recordFieldMappings>
       <filterExtensions>
         <filterExtensionSet>
diff --git a/entity/Salesproject_entity/entityfields/members/children/mst_teamid_param/valueProcess.js b/entity/Salesproject_entity/entityfields/members/children/mstteamid_param/valueProcess.js
similarity index 100%
rename from entity/Salesproject_entity/entityfields/members/children/mst_teamid_param/valueProcess.js
rename to entity/Salesproject_entity/entityfields/members/children/mstteamid_param/valueProcess.js
index 5abe4091396..8be21737ac0 100644
--- a/entity/Salesproject_entity/entityfields/members/children/mst_teamid_param/valueProcess.js
+++ b/entity/Salesproject_entity/entityfields/members/children/mstteamid_param/valueProcess.js
@@ -1,4 +1,4 @@
-import("system.result");
 import("system.vars");
+import("system.result");
 
 result.string(vars.get("$field.MST_TEAM_ID"));
\ No newline at end of file
diff --git a/entity/Salesproject_entity/recordcontainers/db/fromClauseProcess.js b/entity/Salesproject_entity/recordcontainers/db/fromClauseProcess.js
index 3537c33492c..4291674d827 100644
--- a/entity/Salesproject_entity/recordcontainers/db/fromClauseProcess.js
+++ b/entity/Salesproject_entity/recordcontainers/db/fromClauseProcess.js
@@ -3,4 +3,6 @@ import("system.result");
 
 result.string("SALESPROJECT \n\
     left join CONTACT on (SALESPROJECT.CONTACT_ID = CONTACT.CONTACTID) \n\
-    left join ORGANISATION on (CONTACT.ORGANISATION_ID = ORGANISATION.ORGANISATIONID)");
\ No newline at end of file
+    left join ORGANISATION on (CONTACT.ORGANISATION_ID = ORGANISATION.ORGANISATIONID)\n\
+    left join MST_TEAMLINK on (SALESPROJECT.SALESPROJECTID = MST_TEAMLINK.OBJECT_ROWID and MST_TEAMLINK.OBJECT_TYPE = 'Salesproject')\n\
+    left join MST_TEAM on (MST_TEAM.MST_TEAMID = MST_TEAMLINK.MST_TEAM_ID)");
\ No newline at end of file
diff --git a/entity/Salesproject_entity/recordcontainers/db/recordfieldmappings/mst_team_id.displayvalue/expression.js b/entity/Salesproject_entity/recordcontainers/db/recordfieldmappings/mst_team_id.displayvalue/expression.js
deleted file mode 100644
index adc9b83fdd0..00000000000
--- a/entity/Salesproject_entity/recordcontainers/db/recordfieldmappings/mst_team_id.displayvalue/expression.js
+++ /dev/null
@@ -1,3 +0,0 @@
-import("system.result");
-
-result.string("select TEAMNAME from MST_TEAM where MST_TEAM.MST_TEAMID = SALESPROJECT.MST_TEAM_ID");
\ No newline at end of file
diff --git a/neonContext/MSTeamsAddMembers/MSTeamsAddMembers.aod b/neonContext/MSTeamsAddMembers/MSTeamsAddMembers.aod
deleted file mode 100644
index 8ba520c3890..00000000000
--- a/neonContext/MSTeamsAddMembers/MSTeamsAddMembers.aod
+++ /dev/null
@@ -1,14 +0,0 @@
-<?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>MSTeamsAddMembers</name>
-  <title>Add members</title>
-  <majorModelMode>DISTRIBUTED</majorModelMode>
-  <editView>MSTeamsAddMembersEdit_view</editView>
-  <entity>MSTeamsAddMembers_entity</entity>
-  <references>
-    <neonViewReference>
-      <name>9974f15a-7f2a-41fb-afbe-9e946c857f60</name>
-      <view>MSTeamsAddMembersEdit_view</view>
-    </neonViewReference>
-  </references>
-</neonContext>
diff --git a/neonContext/MSTeamsChat/MSTeamsChat.aod b/neonContext/MSTeamsChat/MSTeamsChat.aod
deleted file mode 100644
index 144d3138459..00000000000
--- a/neonContext/MSTeamsChat/MSTeamsChat.aod
+++ /dev/null
@@ -1,13 +0,0 @@
-<?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>MSTeamsChat</name>
-  <majorModelMode>DISTRIBUTED</majorModelMode>
-  <editView>MSTeamsChatEdit_view</editView>
-  <entity>MSTeamsChat_entity</entity>
-  <references>
-    <neonViewReference>
-      <name>1a157c6c-7db9-4a2a-9e62-7d149b146bde</name>
-      <view>MSTeamsChatEdit_view</view>
-    </neonViewReference>
-  </references>
-</neonContext>
diff --git a/neonView/MSTeamsAddMembersEdit_view/MSTeamsAddMembersEdit_view.aod b/neonView/MSTeamsAddMembersEdit_view/MSTeamsAddMembersEdit_view.aod
deleted file mode 100644
index 378bc712922..00000000000
--- a/neonView/MSTeamsAddMembersEdit_view/MSTeamsAddMembersEdit_view.aod
+++ /dev/null
@@ -1,28 +0,0 @@
-<?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>MSTeamsAddMembersEdit_view</name>
-  <majorModelMode>DISTRIBUTED</majorModelMode>
-  <size>SMALL</size>
-  <layout>
-    <boxLayout>
-      <name>layout</name>
-    </boxLayout>
-  </layout>
-  <children>
-    <genericViewTemplate>
-      <name>TeamName</name>
-      <entityField>#ENTITY</entityField>
-      <fields>
-        <entityFieldLink>
-          <name>4d4e4438-63d7-463b-ba87-1b07c8fb046c</name>
-          <entityField>MST_TEAMNAME</entityField>
-        </entityFieldLink>
-      </fields>
-    </genericViewTemplate>
-    <neonViewReference>
-      <name>8de10b28-e1aa-46d9-9ac3-73cff46619fb</name>
-      <entityField>Members</entityField>
-      <view>MSTTeamMemberMultiEdit_view</view>
-    </neonViewReference>
-  </children>
-</neonView>
diff --git a/neonView/MSTeamsChatEdit_view/MSTeamsChatEdit_view.aod b/neonView/MSTeamsChatEdit_view/MSTeamsChatEdit_view.aod
deleted file mode 100644
index 9c48b08a6a9..00000000000
--- a/neonView/MSTeamsChatEdit_view/MSTeamsChatEdit_view.aod
+++ /dev/null
@@ -1,41 +0,0 @@
-<?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>MSTeamsChatEdit_view</name>
-  <majorModelMode>DISTRIBUTED</majorModelMode>
-  <size>NORMAL</size>
-  <layout>
-    <boxLayout>
-      <name>layout</name>
-    </boxLayout>
-  </layout>
-  <children>
-    <genericViewTemplate>
-      <name>AllChannel</name>
-      <editMode v="true" />
-      <entityField>#ENTITY</entityField>
-      <title>Alle Channel</title>
-      <fields>
-        <entityFieldLink>
-          <name>d3cc6ea3-00b5-4da5-9a58-a0e18aaff8da</name>
-          <entityField>SEARCHVALUE</entityField>
-        </entityFieldLink>
-        <entityFieldLink>
-          <name>9e188c23-3060-4f5c-bb67-8dce3ef5f93f</name>
-          <entityField>ALLCHANNELS</entityField>
-        </entityFieldLink>
-      </fields>
-    </genericViewTemplate>
-    <neonViewReference>
-      <name>6c47a973-ef7c-4165-addb-427c1cce9540</name>
-      <entityField>Consumer</entityField>
-      <view>MSTeamsMessageFilter_view</view>
-    </neonViewReference>
-    <actionsViewTemplate>
-      <name>LoadNewMessages</name>
-      <actions>
-        <element>LoadNewMessages</element>
-      </actions>
-      <entityField>#ENTITY</entityField>
-    </actionsViewTemplate>
-  </children>
-</neonView>
diff --git a/neonView/MemberFilter_view/MemberFilter_view.aod b/neonView/MemberFilter_view/MemberFilter_view.aod
index d9e51a55383..35d9b432b67 100644
--- a/neonView/MemberFilter_view/MemberFilter_view.aod
+++ b/neonView/MemberFilter_view/MemberFilter_view.aod
@@ -18,6 +18,8 @@
       <subtitleField>CONTACTROLE</subtitleField>
       <descriptionField>ORGANISATION_NAME</descriptionField>
       <entityField>#ENTITY</entityField>
+      <linkedColumns />
+      <fixedFilterFields />
       <columns>
         <neonTableColumn>
           <name>8b6b6eeb-6246-414f-95f6-453b71e4a9db</name>
diff --git a/neonView/MemberLookup_view/MemberLookup_view.aod b/neonView/MemberLookup_view/MemberLookup_view.aod
index f3b89eca1f3..705d1bde99d 100644
--- a/neonView/MemberLookup_view/MemberLookup_view.aod
+++ b/neonView/MemberLookup_view/MemberLookup_view.aod
@@ -11,6 +11,8 @@
     <tableViewTemplate>
       <name>Table</name>
       <entityField>#ENTITY</entityField>
+      <linkedColumns />
+      <fixedFilterFields />
       <columns>
         <neonTableColumn>
           <name>e3a82f5d-2eee-43bc-8140-e995b23481df</name>
diff --git a/neonView/SalesprojectFilter_view/SalesprojectFilter_view.aod b/neonView/SalesprojectFilter_view/SalesprojectFilter_view.aod
index 6bfac93548e..e33726ea532 100644
--- a/neonView/SalesprojectFilter_view/SalesprojectFilter_view.aod
+++ b/neonView/SalesprojectFilter_view/SalesprojectFilter_view.aod
@@ -59,6 +59,7 @@
       <linkedColumns>
         <element>PROJECTTITLE</element>
       </linkedColumns>
+      <fixedFilterFields />
       <title></title>
       <columns>
         <neonTableColumn>
@@ -101,6 +102,8 @@
       <linkedColumns>
         <element>PROJECTTITLE</element>
       </linkedColumns>
+      <defaultGroupFields />
+      <fixedFilterFields />
       <columns>
         <neonTreeTableColumn>
           <name>c3c8cd94-5bb4-46bb-a61b-fec67fcc4841</name>
diff --git a/neonView/SalesprojectMain_view/SalesprojectMain_view.aod b/neonView/SalesprojectMain_view/SalesprojectMain_view.aod
index 57d0c606e3e..d6b9bf5e3aa 100644
--- a/neonView/SalesprojectMain_view/SalesprojectMain_view.aod
+++ b/neonView/SalesprojectMain_view/SalesprojectMain_view.aod
@@ -9,11 +9,6 @@
     </masterSlaveLayout>
   </layout>
   <children>
-    <neonViewReference>
-      <name>04b5a305-b2a6-481a-83a5-1d94bee08143</name>
-      <entityField>#ENTITY</entityField>
-      <view>SalesprojectPreview_view</view>
-    </neonViewReference>
     <neonViewReference>
       <name>673a34c7-5781-4c72-b0c8-944f1e5de9c6</name>
       <entityField>#ENTITY</entityField>
diff --git a/process/MSTeams_lib/process.js b/process/MSTeams_lib/process.js
index bdb360e1231..69abf0969b8 100644
--- a/process/MSTeams_lib/process.js
+++ b/process/MSTeams_lib/process.js
@@ -1,3 +1,45 @@
+import("Sql_lib");
 import("system.teams");
+import("system.project");
 
-function MSTeamsUtils () {}
\ No newline at end of file
+function MSTeamsUtils () {}
+
+MSTeamsUtils.isTeamsEnabled = function ()
+{
+    return project.getInstanceConfigValue("teamsEnabled", "false") == "true";
+}
+
+MSTeamsUtils.getTeamLinkContexts = function ()
+{
+    return {
+        "Salesproject": {singleLinkPerObject: true}
+    };
+}
+
+MSTeamsUtils.createTeamLink = function (pTeamId, pRowId, pObjectType)
+{
+    var currentTeamLinkId;
+    //if singleLinkPerObject is true, only one team link can be created for the given objectRowId
+    if (MSTeamsUtils.getTeamLinkContexts()[pObjectType].singleLinkPerObject)
+    {
+        currentTeamLinkId = newSelect("MST_TEAMLINKID")
+            .from("MST_TEAMLINK")
+            .where("MST_TEAMLINK.OBJECT_ROWID", pRowId)
+            .and("MST_TEAMLINK.OBJECT_TYPE", pObjectType)
+            .cell();
+    }
+    if (currentTeamLinkId)
+    {
+        newWhere("MST_TEAMLINK.MST_TEAMLINKID", currentTeamLinkId).updateFields({
+            "MST_TEAM_ID": pTeamId
+        });
+    }
+    else
+    {
+        new SqlBuilder().insertFields({
+            "MST_TEAM_ID": pTeamId,
+            "OBJECT_ROWID": pRowId,
+            "OBJECT_TYPE": pObjectType
+        }, "MST_TEAMLINK", "MST_TEAMLINKID");
+    }
+}
\ No newline at end of file
-- 
GitLab


From d701bed9b953599fa8311195239b08e01a5443e3 Mon Sep 17 00:00:00 2001
From: Sebastian Listl <s.listl@adito.de>
Date: Fri, 4 Sep 2020 11:06:02 +0200
Subject: [PATCH 024/184] #1064484 Teams integration optimized

---
 entity/Activity_entity/Activity_entity.aod    |  6 ++--
 .../importfromteams/onActionProcess.js        |  6 ----
 .../mst_teamactions/stateProcess.js           | 15 ---------
 .../importfromteams/onActionProcess.js        |  7 +++++
 .../msteamsactions/stateProcess.js            |  7 +++++
 .../MSTTeamMember_entity.aod                  | 31 +++++++++++++------
 .../displayValueProcess.js                    |  2 +-
 .../{member => contact_id}/stateProcess.js    |  0
 .../entityfields/invite/dropDownProcess.js    |  7 +++++
 .../entityfields/invite/mandatoryProcess.js   |  4 +++
 .../entityfields/invite/stateProcess.js       |  5 +++
 .../entityfields/isextern/valueProcess.js     |  2 +-
 .../entityfields/isowner/dropDownProcess.js   |  7 +++++
 .../entityfields/isowner/mandatoryProcess.js  |  4 +++
 .../entityfields/isowner/stateProcess.js      |  5 +++
 .../role_or_invite/dropDownProcess.js         | 21 -------------
 .../role_or_invite/stateProcess.js            |  5 ---
 .../recordcontainers/jdito/contentProcess.js  |  5 +--
 entity/MSTTeam_entity/MSTTeam_entity.aod      | 16 ++++++++++
 entity/MSTTeam_entity/afterUiInit.js          | 20 ++++++++++++
 .../children/teamid_param/valueProcess.js}    |  4 +--
 .../entityfields/teammembers/onValidation.js  | 11 +++++++
 .../recordcontainers/jdito/onInsert.js        |  8 ++---
 .../recordcontainers/jdito/onUpdate.js        |  8 ++---
 .../MSTeamsActivityImport_entity.aod          |  6 +++-
 .../entityfields/team_id/valueProcess.js      |  7 +----
 .../MSTeamsChannel_entity.aod                 |  8 +++++
 entity/Member_entity/Member_entity.aod        |  8 +++++
 .../mstteamid_param/valueProcess.js           |  9 +-----
 .../Salesproject_entity.aod                   |  4 +++
 .../enablemsteams_param/valueProcess.js       |  3 ++
 neonContext/MSTeamsChannel/MSTeamsChannel.aod |  6 ++++
 .../MSTTeamEdit_view/MSTTeamEdit_view.aod     | 15 +++------
 .../MSTTeamMemberMultiEdit_view.aod           | 14 ++++++---
 .../MSTTeamPreview_view.aod                   |  5 +++
 .../MSTeamsChannelList_view.aod               | 25 +++++++++++++++
 process/Entity_lib/process.js                 |  8 ++---
 process/MSTeams_lib/process.js                | 19 ++++++++++++
 38 files changed, 234 insertions(+), 109 deletions(-)
 delete mode 100644 entity/Activity_entity/entityfields/mst_teamactions/children/importfromteams/onActionProcess.js
 delete mode 100644 entity/Activity_entity/entityfields/mst_teamactions/stateProcess.js
 create mode 100644 entity/Activity_entity/entityfields/msteamsactions/children/importfromteams/onActionProcess.js
 create mode 100644 entity/Activity_entity/entityfields/msteamsactions/stateProcess.js
 rename entity/MSTTeamMember_entity/entityfields/{member => contact_id}/displayValueProcess.js (92%)
 rename entity/MSTTeamMember_entity/entityfields/{member => contact_id}/stateProcess.js (100%)
 create mode 100644 entity/MSTTeamMember_entity/entityfields/invite/dropDownProcess.js
 create mode 100644 entity/MSTTeamMember_entity/entityfields/invite/mandatoryProcess.js
 create mode 100644 entity/MSTTeamMember_entity/entityfields/invite/stateProcess.js
 create mode 100644 entity/MSTTeamMember_entity/entityfields/isowner/dropDownProcess.js
 create mode 100644 entity/MSTTeamMember_entity/entityfields/isowner/mandatoryProcess.js
 create mode 100644 entity/MSTTeamMember_entity/entityfields/isowner/stateProcess.js
 delete mode 100644 entity/MSTTeamMember_entity/entityfields/role_or_invite/dropDownProcess.js
 delete mode 100644 entity/MSTTeamMember_entity/entityfields/role_or_invite/stateProcess.js
 create mode 100644 entity/MSTTeam_entity/afterUiInit.js
 rename entity/{MSTTeamMember_entity/entityfields/role_or_invite/mandatoryProcess.js => MSTTeam_entity/entityfields/channels/children/teamid_param/valueProcess.js} (51%)
 create mode 100644 entity/MSTTeam_entity/entityfields/teammembers/onValidation.js
 create mode 100644 entity/Salesproject_entity/entityfields/members/children/enablemsteams_param/valueProcess.js
 create mode 100644 neonView/MSTeamsChannelList_view/MSTeamsChannelList_view.aod

diff --git a/entity/Activity_entity/Activity_entity.aod b/entity/Activity_entity/Activity_entity.aod
index 7f288315562..a4390983dd2 100644
--- a/entity/Activity_entity/Activity_entity.aod
+++ b/entity/Activity_entity/Activity_entity.aod
@@ -591,14 +591,14 @@
       </children>
     </entityConsumer>
     <entityActionGroup>
-      <name>MST_TeamActions</name>
+      <name>MSTeamsActions</name>
       <title>MS Teams</title>
-      <stateProcess>%aditoprj%/entity/Activity_entity/entityfields/mst_teamactions/stateProcess.js</stateProcess>
+      <stateProcess>%aditoprj%/entity/Activity_entity/entityfields/msteamsactions/stateProcess.js</stateProcess>
       <children>
         <entityActionField>
           <name>importFromTeams</name>
           <title>Import from Teams</title>
-          <onActionProcess>%aditoprj%/entity/Activity_entity/entityfields/mst_teamactions/children/importfromteams/onActionProcess.js</onActionProcess>
+          <onActionProcess>%aditoprj%/entity/Activity_entity/entityfields/msteamsactions/children/importfromteams/onActionProcess.js</onActionProcess>
         </entityActionField>
       </children>
     </entityActionGroup>
diff --git a/entity/Activity_entity/entityfields/mst_teamactions/children/importfromteams/onActionProcess.js b/entity/Activity_entity/entityfields/mst_teamactions/children/importfromteams/onActionProcess.js
deleted file mode 100644
index 3610fc446b7..00000000000
--- a/entity/Activity_entity/entityfields/mst_teamactions/children/importfromteams/onActionProcess.js
+++ /dev/null
@@ -1,6 +0,0 @@
-import("system.vars");
-import("system.neon");
-
-neon.openContext("MSTTeamActivityImport", null, null, neon.OPERATINGSTATE_NEW, {
-    "RowId_param" : vars.get("$param.RowId_param")
-});
\ No newline at end of file
diff --git a/entity/Activity_entity/entityfields/mst_teamactions/stateProcess.js b/entity/Activity_entity/entityfields/mst_teamactions/stateProcess.js
deleted file mode 100644
index 5442a044cca..00000000000
--- a/entity/Activity_entity/entityfields/mst_teamactions/stateProcess.js
+++ /dev/null
@@ -1,15 +0,0 @@
-import("system.neon");
-import("system.result");
-import("system.project");
-
-var isTeamsEnabled = project.getInstanceConfigValue("teamsEnabled", null);
-
-if (isTeamsEnabled == "true")
-{
-    result.string(neon.COMPONENTSTATE_EDITABLE);
-}
-else
-{
-    result.string(neon.COMPONENTSTATE_INVISIBLE);
-    result.string(neon.COMPONENTSTATE_INVISIBLE);
-}
\ No newline at end of file
diff --git a/entity/Activity_entity/entityfields/msteamsactions/children/importfromteams/onActionProcess.js b/entity/Activity_entity/entityfields/msteamsactions/children/importfromteams/onActionProcess.js
new file mode 100644
index 00000000000..781ff2f24f2
--- /dev/null
+++ b/entity/Activity_entity/entityfields/msteamsactions/children/importfromteams/onActionProcess.js
@@ -0,0 +1,7 @@
+import("system.vars");
+import("system.neon");
+
+neon.openContext("MSTeamsActivityImport", null, null, neon.OPERATINGSTATE_NEW, {
+    "ObjectRowId_param" : vars.get("$param.RowId_param"),
+    "ObjectType_param": vars.get("$param.ObjectId_param")
+});
\ No newline at end of file
diff --git a/entity/Activity_entity/entityfields/msteamsactions/stateProcess.js b/entity/Activity_entity/entityfields/msteamsactions/stateProcess.js
new file mode 100644
index 00000000000..c05618702e3
--- /dev/null
+++ b/entity/Activity_entity/entityfields/msteamsactions/stateProcess.js
@@ -0,0 +1,7 @@
+import("system.vars");
+import("system.neon");
+import("system.result");
+import("MSTeams_lib");
+
+var isTeamsEnabled = vars.get("$param.EnableMSTeams_param") == "true" && MSTeamsUtils.isTeamsEnabled();
+result.string(isTeamsEnabled ? neon.COMPONENTSTATE_EDITABLE : neon.COMPONENTSTATE_INVISIBLE);
\ No newline at end of file
diff --git a/entity/MSTTeamMember_entity/MSTTeamMember_entity.aod b/entity/MSTTeamMember_entity/MSTTeamMember_entity.aod
index 57390700764..94ab56ff9a8 100644
--- a/entity/MSTTeamMember_entity/MSTTeamMember_entity.aod
+++ b/entity/MSTTeamMember_entity/MSTTeamMember_entity.aod
@@ -17,11 +17,11 @@
       </dependencies>
     </entityProvider>
     <entityField>
-      <name>MEMBER</name>
+      <name>CONTACT_ID</name>
       <title>Members</title>
       <consumer>ProjectMembers</consumer>
-      <stateProcess>%aditoprj%/entity/MSTTeamMember_entity/entityfields/member/stateProcess.js</stateProcess>
-      <displayValueProcess>%aditoprj%/entity/MSTTeamMember_entity/entityfields/member/displayValueProcess.js</displayValueProcess>
+      <stateProcess>%aditoprj%/entity/MSTTeamMember_entity/entityfields/contact_id/stateProcess.js</stateProcess>
+      <displayValueProcess>%aditoprj%/entity/MSTTeamMember_entity/entityfields/contact_id/displayValueProcess.js</displayValueProcess>
     </entityField>
     <entityField>
       <name>UID</name>
@@ -52,12 +52,6 @@
         </entityParameter>
       </children>
     </entityConsumer>
-    <entityField>
-      <name>ROLE_OR_INVITE</name>
-      <mandatoryProcess>%aditoprj%/entity/MSTTeamMember_entity/entityfields/role_or_invite/mandatoryProcess.js</mandatoryProcess>
-      <dropDownProcess>%aditoprj%/entity/MSTTeamMember_entity/entityfields/role_or_invite/dropDownProcess.js</dropDownProcess>
-      <stateProcess>%aditoprj%/entity/MSTTeamMember_entity/entityfields/role_or_invite/stateProcess.js</stateProcess>
-    </entityField>
     <entityField>
       <name>ISEXTERN</name>
       <valueProcess>%aditoprj%/entity/MSTTeamMember_entity/entityfields/isextern/valueProcess.js</valueProcess>
@@ -89,6 +83,20 @@
       <name>ObjectType_param</name>
       <expose v="true" />
     </entityParameter>
+    <entityField>
+      <name>ISOWNER</name>
+      <title>Role</title>
+      <mandatoryProcess>%aditoprj%/entity/MSTTeamMember_entity/entityfields/isowner/mandatoryProcess.js</mandatoryProcess>
+      <dropDownProcess>%aditoprj%/entity/MSTTeamMember_entity/entityfields/isowner/dropDownProcess.js</dropDownProcess>
+      <stateProcess>%aditoprj%/entity/MSTTeamMember_entity/entityfields/isowner/stateProcess.js</stateProcess>
+    </entityField>
+    <entityField>
+      <name>INVITE</name>
+      <title>Invitation</title>
+      <mandatoryProcess>%aditoprj%/entity/MSTTeamMember_entity/entityfields/invite/mandatoryProcess.js</mandatoryProcess>
+      <dropDownProcess>%aditoprj%/entity/MSTTeamMember_entity/entityfields/invite/dropDownProcess.js</dropDownProcess>
+      <stateProcess>%aditoprj%/entity/MSTTeamMember_entity/entityfields/invite/stateProcess.js</stateProcess>
+    </entityField>
   </entityFields>
   <recordContainers>
     <jDitoRecordContainer>
@@ -106,7 +114,10 @@
           <name>MEMBERNAME.value</name>
         </jDitoRecordFieldMapping>
         <jDitoRecordFieldMapping>
-          <name>MEMBER.displayValue</name>
+          <name>ISOWNER.value</name>
+        </jDitoRecordFieldMapping>
+        <jDitoRecordFieldMapping>
+          <name>CONTACT_ID.displayValue</name>
         </jDitoRecordFieldMapping>
       </recordFieldMappings>
     </jDitoRecordContainer>
diff --git a/entity/MSTTeamMember_entity/entityfields/member/displayValueProcess.js b/entity/MSTTeamMember_entity/entityfields/contact_id/displayValueProcess.js
similarity index 92%
rename from entity/MSTTeamMember_entity/entityfields/member/displayValueProcess.js
rename to entity/MSTTeamMember_entity/entityfields/contact_id/displayValueProcess.js
index 524ecbbf750..e038c4ba360 100644
--- a/entity/MSTTeamMember_entity/entityfields/member/displayValueProcess.js
+++ b/entity/MSTTeamMember_entity/entityfields/contact_id/displayValueProcess.js
@@ -6,5 +6,5 @@ if (vars.get("$field.MEMBERNAME"))
     result.string(vars.get("$field.MEMBERNAME"));
 else 
 {
-    result.string(ContactUtils.getTitleByContactId(vars.get("$field.MEMBER")));
+    result.string(ContactUtils.getTitleByContactId(vars.get("$field.CONTACT_ID")));
 }
\ No newline at end of file
diff --git a/entity/MSTTeamMember_entity/entityfields/member/stateProcess.js b/entity/MSTTeamMember_entity/entityfields/contact_id/stateProcess.js
similarity index 100%
rename from entity/MSTTeamMember_entity/entityfields/member/stateProcess.js
rename to entity/MSTTeamMember_entity/entityfields/contact_id/stateProcess.js
diff --git a/entity/MSTTeamMember_entity/entityfields/invite/dropDownProcess.js b/entity/MSTTeamMember_entity/entityfields/invite/dropDownProcess.js
new file mode 100644
index 00000000000..0a4ec38e3c7
--- /dev/null
+++ b/entity/MSTTeamMember_entity/entityfields/invite/dropDownProcess.js
@@ -0,0 +1,7 @@
+import("system.result");
+import("system.translate");
+
+result.object([
+    ["true", translate.text("Invite")],
+    ["false", translate.text("Don't invite")]
+]);
\ No newline at end of file
diff --git a/entity/MSTTeamMember_entity/entityfields/invite/mandatoryProcess.js b/entity/MSTTeamMember_entity/entityfields/invite/mandatoryProcess.js
new file mode 100644
index 00000000000..5d086208537
--- /dev/null
+++ b/entity/MSTTeamMember_entity/entityfields/invite/mandatoryProcess.js
@@ -0,0 +1,4 @@
+import("system.result");
+import("system.vars");
+
+result.string(!vars.get("$field.MEMBERNAME") && vars.get("$field.ISEXTERN") == "true");
\ No newline at end of file
diff --git a/entity/MSTTeamMember_entity/entityfields/invite/stateProcess.js b/entity/MSTTeamMember_entity/entityfields/invite/stateProcess.js
new file mode 100644
index 00000000000..37feecaa37d
--- /dev/null
+++ b/entity/MSTTeamMember_entity/entityfields/invite/stateProcess.js
@@ -0,0 +1,5 @@
+import("system.result");
+import("system.vars");
+import("system.neon");
+
+result.string(vars.get("$field.MEMBERNAME") || vars.get("$field.ISEXTERN") != "true" ? neon.COMPONENTSTATE_INVISIBLE : neon.COMPONENTSTATE_EDITABLE);
\ No newline at end of file
diff --git a/entity/MSTTeamMember_entity/entityfields/isextern/valueProcess.js b/entity/MSTTeamMember_entity/entityfields/isextern/valueProcess.js
index f83ff5382e6..bb888295a8a 100644
--- a/entity/MSTTeamMember_entity/entityfields/isextern/valueProcess.js
+++ b/entity/MSTTeamMember_entity/entityfields/isextern/valueProcess.js
@@ -2,6 +2,6 @@ import("Employee_lib");
 import("system.vars");
 import("system.result");
 
-var member = vars.get("$field.MEMBER");
+var member = vars.get("$field.CONTACT_ID");
 if (member)
     result.string(!EmployeeUtils.isUser(member));
\ No newline at end of file
diff --git a/entity/MSTTeamMember_entity/entityfields/isowner/dropDownProcess.js b/entity/MSTTeamMember_entity/entityfields/isowner/dropDownProcess.js
new file mode 100644
index 00000000000..3b9d6a7266f
--- /dev/null
+++ b/entity/MSTTeamMember_entity/entityfields/isowner/dropDownProcess.js
@@ -0,0 +1,7 @@
+import("system.result");
+import("system.translate");
+
+result.object([
+    ["true", translate.text("Owner")],
+    ["false", translate.text("Member")]
+]);
\ No newline at end of file
diff --git a/entity/MSTTeamMember_entity/entityfields/isowner/mandatoryProcess.js b/entity/MSTTeamMember_entity/entityfields/isowner/mandatoryProcess.js
new file mode 100644
index 00000000000..56edc5e4c6b
--- /dev/null
+++ b/entity/MSTTeamMember_entity/entityfields/isowner/mandatoryProcess.js
@@ -0,0 +1,4 @@
+import("system.result");
+import("system.vars");
+
+result.string(!vars.get("$field.MEMBERNAME") && vars.get("$field.ISEXTERN") != "true");
\ No newline at end of file
diff --git a/entity/MSTTeamMember_entity/entityfields/isowner/stateProcess.js b/entity/MSTTeamMember_entity/entityfields/isowner/stateProcess.js
new file mode 100644
index 00000000000..025c6018279
--- /dev/null
+++ b/entity/MSTTeamMember_entity/entityfields/isowner/stateProcess.js
@@ -0,0 +1,5 @@
+import("system.result");
+import("system.vars");
+import("system.neon");
+
+result.string(vars.get("$field.MEMBERNAME") || vars.get("$field.ISEXTERN") == "true" ? neon.COMPONENTSTATE_INVISIBLE : neon.COMPONENTSTATE_EDITABLE);
\ No newline at end of file
diff --git a/entity/MSTTeamMember_entity/entityfields/role_or_invite/dropDownProcess.js b/entity/MSTTeamMember_entity/entityfields/role_or_invite/dropDownProcess.js
deleted file mode 100644
index 8f7cbef15d5..00000000000
--- a/entity/MSTTeamMember_entity/entityfields/role_or_invite/dropDownProcess.js
+++ /dev/null
@@ -1,21 +0,0 @@
-import("system.translate");
-import("system.vars");
-import("system.result");
-
-var isExtern = vars.get("$field.ISEXTERN");
-var res = [];
-if (isExtern == "true")
-{
-    res = [
-        ["invite", translate.text("Invite")],
-        ["notInvite", translate.text("Don't invite")]
-    ];
-}
-else if (isExtern == "false")
-{
-    res = [
-        ["isOwner", translate.text("Owner")],
-        ["isMember", translate.text("Member")]
-    ]
-}
-result.object(res);
\ No newline at end of file
diff --git a/entity/MSTTeamMember_entity/entityfields/role_or_invite/stateProcess.js b/entity/MSTTeamMember_entity/entityfields/role_or_invite/stateProcess.js
deleted file mode 100644
index 8d5def7b923..00000000000
--- a/entity/MSTTeamMember_entity/entityfields/role_or_invite/stateProcess.js
+++ /dev/null
@@ -1,5 +0,0 @@
-import("system.result");
-import("system.vars");
-import("system.neon");
-
-result.string(vars.get("$field.MEMBERNAME") ? neon.COMPONENTSTATE_INVISIBLE : neon.COMPONENTSTATE_EDITABLE);
\ No newline at end of file
diff --git a/entity/MSTTeamMember_entity/recordcontainers/jdito/contentProcess.js b/entity/MSTTeamMember_entity/recordcontainers/jdito/contentProcess.js
index 421591be234..0e47ff74551 100644
--- a/entity/MSTTeamMember_entity/recordcontainers/jdito/contentProcess.js
+++ b/entity/MSTTeamMember_entity/recordcontainers/jdito/contentProcess.js
@@ -4,20 +4,21 @@ import("system.vars");
 
 var teamId = vars.get("$param.MSTTeamId_param");
 var allMembers = teamId ? teams.getAllMembers(teamId) : {};
+var owners = teamId ? teams.getAllOwners(teamId) : {};
 var memberArray = [];
 
 if (vars.get("$local.idvalues"))
 {
     memberArray = vars.get("$local.idvalues").map(function (memberId) 
     {
-        return [memberId, allMembers[memberId], allMembers[memberId]];
+        return [memberId, allMembers[memberId], memberId in owners, allMembers[memberId]];
     });   
 }
 else
 {
     for (let memberId in allMembers)
     {
-        memberArray.push([memberId, allMembers[memberId], allMembers[memberId]]);
+        memberArray.push([memberId, allMembers[memberId], memberId in owners, allMembers[memberId]]);
     }
 }
 
diff --git a/entity/MSTTeam_entity/MSTTeam_entity.aod b/entity/MSTTeam_entity/MSTTeam_entity.aod
index 510b2585b53..fbd8d90278c 100644
--- a/entity/MSTTeam_entity/MSTTeam_entity.aod
+++ b/entity/MSTTeam_entity/MSTTeam_entity.aod
@@ -9,6 +9,7 @@
   <grantUpdateProcess>%aditoprj%/entity/MSTTeam_entity/grantUpdateProcess.js</grantUpdateProcess>
   <grantDeleteProcess>%aditoprj%/entity/MSTTeam_entity/grantDeleteProcess.js</grantDeleteProcess>
   <contentTitleProcess>%aditoprj%/entity/MSTTeam_entity/contentTitleProcess.js</contentTitleProcess>
+  <afterUiInit>%aditoprj%/entity/MSTTeam_entity/afterUiInit.js</afterUiInit>
   <recordContainer>jdito</recordContainer>
   <entityFields>
     <entityProvider>
@@ -50,6 +51,7 @@
     <entityConsumer>
       <name>TeamMembers</name>
       <stateProcess>%aditoprj%/entity/MSTTeam_entity/entityfields/teammembers/stateProcess.js</stateProcess>
+      <onValidation>%aditoprj%/entity/MSTTeam_entity/entityfields/teammembers/onValidation.js</onValidation>
       <dependency>
         <name>dependency</name>
         <entityName>MSTTeamMember_entity</entityName>
@@ -86,6 +88,20 @@
       <name>ObjectType_param</name>
       <expose v="true" />
     </entityParameter>
+    <entityConsumer>
+      <name>Channels</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>MSTeamsChannel_entity</entityName>
+        <fieldName>ChannelsForTeam</fieldName>
+      </dependency>
+      <children>
+        <entityParameter>
+          <name>TeamId_param</name>
+          <valueProcess>%aditoprj%/entity/MSTTeam_entity/entityfields/channels/children/teamid_param/valueProcess.js</valueProcess>
+        </entityParameter>
+      </children>
+    </entityConsumer>
   </entityFields>
   <recordContainers>
     <jDitoRecordContainer>
diff --git a/entity/MSTTeam_entity/afterUiInit.js b/entity/MSTTeam_entity/afterUiInit.js
new file mode 100644
index 00000000000..018d0a4733e
--- /dev/null
+++ b/entity/MSTTeam_entity/afterUiInit.js
@@ -0,0 +1,20 @@
+import("system.entities");
+import("system.vars");
+import("system.neon");
+
+if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW)
+{
+    var memberLoadConfig = entities.createConfigForLoadingRows()
+        .fields(["CONTACT_ID"])
+        .entity("Member_entity")
+        .provider("Links")
+        .addParameter("ObjectRowId_param", vars.get("$param.ObjectRowId_param"))
+        .addParameter("ObjectType_param", vars.get("$param.ObjectType_param"));
+        
+    entities.getRows(memberLoadConfig).forEach(function (member)
+    {
+        neon.addRecord("TeamMembers", {
+            "CONTACT_ID": member["CONTACT_ID"]
+        });
+    })
+}
\ No newline at end of file
diff --git a/entity/MSTTeamMember_entity/entityfields/role_or_invite/mandatoryProcess.js b/entity/MSTTeam_entity/entityfields/channels/children/teamid_param/valueProcess.js
similarity index 51%
rename from entity/MSTTeamMember_entity/entityfields/role_or_invite/mandatoryProcess.js
rename to entity/MSTTeam_entity/entityfields/channels/children/teamid_param/valueProcess.js
index 8be1684334b..16c85500b53 100644
--- a/entity/MSTTeamMember_entity/entityfields/role_or_invite/mandatoryProcess.js
+++ b/entity/MSTTeam_entity/entityfields/channels/children/teamid_param/valueProcess.js
@@ -1,4 +1,4 @@
-import("system.result");
 import("system.vars");
+import("system.result");
 
-result.string(!vars.get("$field.MEMBERNAME"));
\ No newline at end of file
+result.string(vars.get("$field.UID"));
\ No newline at end of file
diff --git a/entity/MSTTeam_entity/entityfields/teammembers/onValidation.js b/entity/MSTTeam_entity/entityfields/teammembers/onValidation.js
new file mode 100644
index 00000000000..7bc2769a9fb
--- /dev/null
+++ b/entity/MSTTeam_entity/entityfields/teammembers/onValidation.js
@@ -0,0 +1,11 @@
+import("Entity_lib");
+import("system.result");
+import("system.translate");
+
+var members = EntityConsumerRowsHelper.getCurrentConsumerRows("TeamMembers", ["ISOWNER"]);
+var hasOwner = members.some(function (member)
+{
+    return member["ISOWNER"] == "true";
+});
+if (!hasOwner)
+    result.string(translate.text("The team must have at least one owner"));
\ No newline at end of file
diff --git a/entity/MSTTeam_entity/recordcontainers/jdito/onInsert.js b/entity/MSTTeam_entity/recordcontainers/jdito/onInsert.js
index e2f64e547b2..007fa7bf9a2 100644
--- a/entity/MSTTeam_entity/recordcontainers/jdito/onInsert.js
+++ b/entity/MSTTeam_entity/recordcontainers/jdito/onInsert.js
@@ -16,15 +16,15 @@ var internalMembers = [];
 var externalMembers = [];
 teamMembers.forEach(function (teamMember)
 {
-    var memberUser = EmployeeUtils.getUserByContactId(teamMember.MEMBER);
+    var memberUser = EmployeeUtils.getUserByContactId(teamMember["CONTACT_ID"]);
     if (!memberUser)
     {
-        var memberEmail = CommUtil.getStandardMail(teamMember.MEMBER);
+        var memberEmail = CommUtil.getStandardMail(teamMember["CONTACT_ID"]);
         if (memberEmail)
         {
             externalMembers.push(
                 teams.createExternalUserConfig(memberEmail)
-                    .sendInvitation(teamMember.ROLE_OR_INVITE == "invite")
+                    .sendInvitation(teamMember["INVITE"] == "true")
             );
         }
         return;
@@ -35,7 +35,7 @@ teamMembers.forEach(function (teamMember)
         memberAzureId = teams.getInternalAzureId(memberUpn);
     if (memberAzureId)
     {
-        if (teamMember.ROLE_OR_INVITE == "isOwner")
+        if (teamMember["ISOWNER"] == "true")
             ownerIds.push(memberAzureId);
         else
             internalMembers.push(teams.createInternalUserConfig(memberAzureId));
diff --git a/entity/MSTTeam_entity/recordcontainers/jdito/onUpdate.js b/entity/MSTTeam_entity/recordcontainers/jdito/onUpdate.js
index 2554384b37e..f645523963b 100644
--- a/entity/MSTTeam_entity/recordcontainers/jdito/onUpdate.js
+++ b/entity/MSTTeam_entity/recordcontainers/jdito/onUpdate.js
@@ -16,15 +16,15 @@ var internalMembers = [];
 var externalMembers = [];
 insertedTeamMembers.forEach(function (teamMember)
 {
-    var memberUser = EmployeeUtils.getUserByContactId(teamMember.MEMBER);
+    var memberUser = EmployeeUtils.getUserByContactId(teamMember["CONTACT_ID"]);
     if (!memberUser)
     {
-        var memberEmail = CommUtil.getStandardMail(teamMember.MEMBER);
+        var memberEmail = CommUtil.getStandardMail(teamMember["CONTACT_ID"]);
         if (memberEmail)
         {
             externalMembers.push(
                 teams.createExternalUserConfig(memberEmail)
-                    .sendInvitation(teamMember.ROLE_OR_INVITE == "invite")
+                    .sendInvitation(teamMember["INVITE"] == "true")
             );
         }
         return;
@@ -35,7 +35,7 @@ insertedTeamMembers.forEach(function (teamMember)
         memberAzureId = teams.getInternalAzureId(memberUpn);
     if (memberAzureId)
     {
-        internalMembers.push(teams.createInternalUserConfig(memberAzureId).setOwner(teamMember.ROLE_OR_INVITE == "isOwner"));
+        internalMembers.push(teams.createInternalUserConfig(memberAzureId).setOwner(teamMember["ISOWNER"] == "true"));
     }
 });
 
diff --git a/entity/MSTeamsActivityImport_entity/MSTeamsActivityImport_entity.aod b/entity/MSTeamsActivityImport_entity/MSTeamsActivityImport_entity.aod
index cc1786851fb..6ae1fbc483d 100644
--- a/entity/MSTeamsActivityImport_entity/MSTeamsActivityImport_entity.aod
+++ b/entity/MSTeamsActivityImport_entity/MSTeamsActivityImport_entity.aod
@@ -40,7 +40,7 @@
       <consumer>Channels</consumer>
     </entityField>
     <entityParameter>
-      <name>RowId_param</name>
+      <name>ObjectRowId_param</name>
       <expose v="true" />
     </entityParameter>
     <entityField>
@@ -70,6 +70,10 @@
     <entityField>
       <name>LOAD_ID</name>
     </entityField>
+    <entityParameter>
+      <name>ObjectType_param</name>
+      <expose v="true" />
+    </entityParameter>
   </entityFields>
   <recordContainers>
     <jDitoRecordContainer>
diff --git a/entity/MSTeamsActivityImport_entity/entityfields/team_id/valueProcess.js b/entity/MSTeamsActivityImport_entity/entityfields/team_id/valueProcess.js
index 6fa5f68e8e8..1f7366af28d 100644
--- a/entity/MSTeamsActivityImport_entity/entityfields/team_id/valueProcess.js
+++ b/entity/MSTeamsActivityImport_entity/entityfields/team_id/valueProcess.js
@@ -1,9 +1,4 @@
 import("system.result");
 import("Sql_lib");
 
-var teamId = newSelect("MST_TEAM_ID")
-    .from("SALESPROJECT")
-    .where("SALESPROJECT.SALESPROJECTID", "$param.RowId_param")
-    .cell();
-
-result.string(teamId);
\ No newline at end of file
+result.string(MSTeamsUtils.getLinkedTeam(vars.get("$param.ObjectRowId_param"), vars.get("$param.ObjectType_param")) || "");
\ No newline at end of file
diff --git a/entity/MSTeamsChannel_entity/MSTeamsChannel_entity.aod b/entity/MSTeamsChannel_entity/MSTeamsChannel_entity.aod
index 9094b5680a4..f54a35bd2af 100644
--- a/entity/MSTeamsChannel_entity/MSTeamsChannel_entity.aod
+++ b/entity/MSTeamsChannel_entity/MSTeamsChannel_entity.aod
@@ -2,8 +2,10 @@
 <entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.14" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.14">
   <name>MSTeamsChannel_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
+  <title>Channel</title>
   <siblings />
   <contentTitleProcess>%aditoprj%/entity/MSTeamsChannel_entity/contentTitleProcess.js</contentTitleProcess>
+  <titlePlural>Channels</titlePlural>
   <recordContainer>jdito</recordContainer>
   <entityFields>
     <entityProvider>
@@ -25,6 +27,12 @@
           <fieldName>Channels</fieldName>
           <isConsumer v="false" />
         </entityDependency>
+        <entityDependency>
+          <name>c2b60ab3-3edd-4571-b9aa-766826f561fd</name>
+          <entityName>MSTTeam_entity</entityName>
+          <fieldName>Channels</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
       </dependencies>
     </entityProvider>
     <entityParameter>
diff --git a/entity/Member_entity/Member_entity.aod b/entity/Member_entity/Member_entity.aod
index 5b76c88fab6..cd7c674e6b5 100644
--- a/entity/Member_entity/Member_entity.aod
+++ b/entity/Member_entity/Member_entity.aod
@@ -281,6 +281,14 @@
       <valueProcess>%aditoprj%/entity/Member_entity/entityfields/mstteamid_param/valueProcess.js</valueProcess>
       <expose v="true" />
     </entityParameter>
+    <entityField>
+      <name>MST_MEMBERROLE</name>
+      <title>Teams role</title>
+    </entityField>
+    <entityParameter>
+      <name>EnableMSTeams_param</name>
+      <expose v="true" />
+    </entityParameter>
   </entityFields>
   <recordContainers>
     <dbRecordContainer>
diff --git a/entity/Member_entity/entityfields/mstteamid_param/valueProcess.js b/entity/Member_entity/entityfields/mstteamid_param/valueProcess.js
index d949390036f..566da0b330d 100644
--- a/entity/Member_entity/entityfields/mstteamid_param/valueProcess.js
+++ b/entity/Member_entity/entityfields/mstteamid_param/valueProcess.js
@@ -5,11 +5,4 @@ import("MSTeams_lib");
 
 var objectType = vars.get("$param.ObjectType_param");
 if (objectType in MSTeamsUtils.getTeamLinkContexts())
-{
-    var teamId = newSelect("MST_TEAM_ID")
-        .from("MST_TEAMLINK")
-        .where("MST_TEAMLINK.OBJECT_ROWID", "$param.ObjectRowId_param")
-        .and("MST_TEAMLINK.OBJECT_TYPE", objectType)
-        .cell();
-    result.string(teamId);
-}
\ No newline at end of file
+    result.string(MSTeamsUtils.getLinkedTeam(vars.get("$param.ObjectRowId_param"), objectType) || "");
\ No newline at end of file
diff --git a/entity/Salesproject_entity/Salesproject_entity.aod b/entity/Salesproject_entity/Salesproject_entity.aod
index c5167cdac22..c26b0305707 100644
--- a/entity/Salesproject_entity/Salesproject_entity.aod
+++ b/entity/Salesproject_entity/Salesproject_entity.aod
@@ -274,6 +274,10 @@
           <name>MSTTeamId_param</name>
           <valueProcess>%aditoprj%/entity/Salesproject_entity/entityfields/members/children/mstteamid_param/valueProcess.js</valueProcess>
         </entityParameter>
+        <entityParameter>
+          <name>EnableMSTeams_param</name>
+          <valueProcess>%aditoprj%/entity/Salesproject_entity/entityfields/members/children/enablemsteams_param/valueProcess.js</valueProcess>
+        </entityParameter>
       </children>
     </entityConsumer>
     <entityActionField>
diff --git a/entity/Salesproject_entity/entityfields/members/children/enablemsteams_param/valueProcess.js b/entity/Salesproject_entity/entityfields/members/children/enablemsteams_param/valueProcess.js
new file mode 100644
index 00000000000..40effa01784
--- /dev/null
+++ b/entity/Salesproject_entity/entityfields/members/children/enablemsteams_param/valueProcess.js
@@ -0,0 +1,3 @@
+import("system.result");
+
+result.string(true);
\ No newline at end of file
diff --git a/neonContext/MSTeamsChannel/MSTeamsChannel.aod b/neonContext/MSTeamsChannel/MSTeamsChannel.aod
index de18e7088f2..f8986b6e986 100644
--- a/neonContext/MSTeamsChannel/MSTeamsChannel.aod
+++ b/neonContext/MSTeamsChannel/MSTeamsChannel.aod
@@ -3,4 +3,10 @@
   <name>MSTeamsChannel</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <entity>MSTeamsChannel_entity</entity>
+  <references>
+    <neonViewReference>
+      <name>01e5e126-8d14-4dec-a468-0de13b920900</name>
+      <view>MSTeamsChannelList_view</view>
+    </neonViewReference>
+  </references>
 </neonContext>
diff --git a/neonView/MSTTeamEdit_view/MSTTeamEdit_view.aod b/neonView/MSTTeamEdit_view/MSTTeamEdit_view.aod
index 7c20b7f45bf..404d59d6478 100644
--- a/neonView/MSTTeamEdit_view/MSTTeamEdit_view.aod
+++ b/neonView/MSTTeamEdit_view/MSTTeamEdit_view.aod
@@ -18,6 +18,10 @@
           <name>b69c563c-6230-4bb5-b543-236e0fdc791c</name>
           <entityField>TEAMNAME</entityField>
         </entityFieldLink>
+        <entityFieldLink>
+          <name>258beab2-60c4-4639-a343-3ac67c82dd5a</name>
+          <entityField>DESCRIPTION</entityField>
+        </entityFieldLink>
       </fields>
     </genericViewTemplate>
     <neonViewReference>
@@ -25,16 +29,5 @@
       <entityField>TeamMembers</entityField>
       <view>MSTTeamMemberMultiEdit_view</view>
     </neonViewReference>
-    <genericViewTemplate>
-      <name>Description</name>
-      <editMode v="true" />
-      <entityField>#ENTITY</entityField>
-      <fields>
-        <entityFieldLink>
-          <name>0490e1b0-59e9-410d-9da7-c1f50abaa15f</name>
-          <entityField>DESCRIPTION</entityField>
-        </entityFieldLink>
-      </fields>
-    </genericViewTemplate>
   </children>
 </neonView>
diff --git a/neonView/MSTTeamMemberMultiEdit_view/MSTTeamMemberMultiEdit_view.aod b/neonView/MSTTeamMemberMultiEdit_view/MSTTeamMemberMultiEdit_view.aod
index a47c1df5f30..27b9c4b7bdf 100644
--- a/neonView/MSTTeamMemberMultiEdit_view/MSTTeamMemberMultiEdit_view.aod
+++ b/neonView/MSTTeamMemberMultiEdit_view/MSTTeamMemberMultiEdit_view.aod
@@ -3,9 +3,9 @@
   <name>MSTTeamMemberMultiEdit_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
-    <boxLayout>
+    <noneLayout>
       <name>layout</name>
-    </boxLayout>
+    </noneLayout>
   </layout>
   <children>
     <genericMultipleViewTemplate>
@@ -14,11 +14,15 @@
       <columns>
         <neonGenericMultipleTableColumn>
           <name>a01d6a4e-1ac4-426c-a891-890bd3e9a4d0</name>
-          <entityField>MEMBER</entityField>
+          <entityField>CONTACT_ID</entityField>
         </neonGenericMultipleTableColumn>
         <neonGenericMultipleTableColumn>
-          <name>dade9a5b-2398-4303-8cae-6c7d0077e43d</name>
-          <entityField>ROLE_OR_INVITE</entityField>
+          <name>467ab169-f46a-4036-9e5e-5c480bd947a6</name>
+          <entityField>ISOWNER</entityField>
+        </neonGenericMultipleTableColumn>
+        <neonGenericMultipleTableColumn>
+          <name>b85c25c8-09dd-4f9a-b0b4-31c0b8a8f12c</name>
+          <entityField>INVITE</entityField>
         </neonGenericMultipleTableColumn>
       </columns>
     </genericMultipleViewTemplate>
diff --git a/neonView/MSTTeamPreview_view/MSTTeamPreview_view.aod b/neonView/MSTTeamPreview_view/MSTTeamPreview_view.aod
index 5932326dc88..d543b83e6b1 100644
--- a/neonView/MSTTeamPreview_view/MSTTeamPreview_view.aod
+++ b/neonView/MSTTeamPreview_view/MSTTeamPreview_view.aod
@@ -34,5 +34,10 @@
       <entityField>TeamMembers</entityField>
       <view>MSTTeamMemberList_view</view>
     </neonViewReference>
+    <neonViewReference>
+      <name>500dd7ba-366e-4b01-9d28-ebe4672c7380</name>
+      <entityField>Channels</entityField>
+      <view>MSTeamsChannelList_view</view>
+    </neonViewReference>
   </children>
 </neonView>
diff --git a/neonView/MSTeamsChannelList_view/MSTeamsChannelList_view.aod b/neonView/MSTeamsChannelList_view/MSTeamsChannelList_view.aod
new file mode 100644
index 00000000000..514bf2098ee
--- /dev/null
+++ b/neonView/MSTeamsChannelList_view/MSTeamsChannelList_view.aod
@@ -0,0 +1,25 @@
+<?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>MSTeamsChannelList_view</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <layout>
+    <noneLayout>
+      <name>layout</name>
+    </noneLayout>
+  </layout>
+  <children>
+    <titledListViewTemplate>
+      <name>ChannelList</name>
+      <entityField>#ENTITY</entityField>
+      <isDeletable v="false" />
+      <isEditable v="false" />
+      <isCreatable v="false" />
+      <columns>
+        <neonTitledListTableColumn>
+          <name>04b88bd4-22f4-4640-a4ff-26d90bc48437</name>
+          <entityField>CHANNELNAME</entityField>
+        </neonTitledListTableColumn>
+      </columns>
+    </titledListViewTemplate>
+  </children>
+</neonView>
diff --git a/process/Entity_lib/process.js b/process/Entity_lib/process.js
index 93360446bcf..81364bced0d 100644
--- a/process/Entity_lib/process.js
+++ b/process/Entity_lib/process.js
@@ -481,11 +481,11 @@ EntityConsumerRowsHelper.prototype.changeRows = function (pRowsToChange)
     pRowsToChange.forEach(function (changedRow)
     {
         changeCatalog[changedRow[this._uidField]] = changedRow;
-    });
+    }, this);
     this._rows = this._rows.map(function (row)
     {
         return row[this._uidField] in changeCatalog ? changeCatalog[row[this._uidField]] : row;
-    });
+    }, this);
     return this;
 }
 
@@ -501,11 +501,11 @@ EntityConsumerRowsHelper.prototype.removeRows = function (pRowsToRemove)
     pRowsToRemove.forEach(function (deletedRow)
     {
         deleteCatalog[deletedRow[this._uidField]] = true;
-    });
+    }, this);
     this._rows = this._rows.filter(function (row)
     {
         return !deleteCatalog[row[this._uidField]];
-    });
+    }, this);
     return this;
 }
 
diff --git a/process/MSTeams_lib/process.js b/process/MSTeams_lib/process.js
index 69abf0969b8..2f41a4e4660 100644
--- a/process/MSTeams_lib/process.js
+++ b/process/MSTeams_lib/process.js
@@ -42,4 +42,23 @@ MSTeamsUtils.createTeamLink = function (pTeamId, pRowId, pObjectType)
             "OBJECT_TYPE": pObjectType
         }, "MST_TEAMLINK", "MST_TEAMLINKID");
     }
+}
+
+MSTeamsUtils.getLinkedTeams = function (pRowId, pObjectType)
+{
+    return newSelect("MST_TEAM_ID")
+        .from("MST_TEAMLINK")
+        .where("MST_TEAMLINK.OBJECT_ROWID", pRowId)
+        .andIfSet("MST_TEAMLINK.OBJECT_TYPE", pObjectType)
+        .arrayColumn();
+}
+
+MSTeamsUtils.getLinkedTeam = function (pRowId, pObjectType)
+{
+    return MSTeamsUtils.getLinkedTeams(pRowId, pObjectType)[0] || null;
+}
+
+MSTeamsUtils.getTeamRoleSubSql = function (pTeamId, pContactIdField)
+{
+    
 }
\ No newline at end of file
-- 
GitLab


From c549d64bf000629af44e94badda019ed068a3361 Mon Sep 17 00:00:00 2001
From: Sebastian Listl <s.listl@adito.de>
Date: Fri, 4 Sep 2020 17:04:38 +0200
Subject: [PATCH 025/184] #1064484 Teams integration changes

---
 .../MSTTeamMember_entity.aod                  | 18 +++--
 .../contact_id/linkedContextProcess.js        |  5 ++
 .../entityfields/isowner/dropDownProcess.js   |  7 --
 .../entityfields/isowner/mandatoryProcess.js  |  4 -
 .../entityfields/isowner/stateProcess.js      |  5 --
 .../entityfields/role/displayValueProcess.js  | 10 +++
 .../entityfields/role/dropDownProcess.js      |  7 ++
 .../entityfields/role/mandatoryProcess.js     |  4 +
 .../entityfields/role/stateProcess.js         | 14 ++++
 .../recordcontainers/jdito/contentProcess.js  | 32 ++++----
 .../entityfields/teammembers/onValidation.js  |  4 +-
 entity/MSTTeam_entity/grantDeleteProcess.js   |  3 +-
 entity/MSTTeam_entity/grantUpdateProcess.js   |  3 +-
 .../recordcontainers/jdito/onInsert.js        |  2 +-
 .../recordcontainers/jdito/onUpdate.js        |  2 +-
 entity/Member_entity/Member_entity.aod        |  5 ++
 .../mst_memberrole/stateProcess.js            |  9 +++
 .../mst_memberrole.value/expression.js        |  5 ++
 .../MSTTeamMemberList_view.aod                | 10 ++-
 .../MSTTeamMemberMultiEdit_view.aod           |  2 +-
 .../MemberFilter_view/MemberFilter_view.aod   |  4 +
 process/MSTeams_lib/MSTeams_lib.aod           |  1 +
 process/MSTeams_lib/process.js                | 64 +++++++++++++++
 process/Sql_lib/process.js                    | 78 +++++++++++++++++++
 24 files changed, 254 insertions(+), 44 deletions(-)
 create mode 100644 entity/MSTTeamMember_entity/entityfields/contact_id/linkedContextProcess.js
 delete mode 100644 entity/MSTTeamMember_entity/entityfields/isowner/dropDownProcess.js
 delete mode 100644 entity/MSTTeamMember_entity/entityfields/isowner/mandatoryProcess.js
 delete mode 100644 entity/MSTTeamMember_entity/entityfields/isowner/stateProcess.js
 create mode 100644 entity/MSTTeamMember_entity/entityfields/role/displayValueProcess.js
 create mode 100644 entity/MSTTeamMember_entity/entityfields/role/dropDownProcess.js
 create mode 100644 entity/MSTTeamMember_entity/entityfields/role/mandatoryProcess.js
 create mode 100644 entity/MSTTeamMember_entity/entityfields/role/stateProcess.js
 create mode 100644 entity/Member_entity/entityfields/mst_memberrole/stateProcess.js
 create mode 100644 entity/Member_entity/recordcontainers/db/recordfieldmappings/mst_memberrole.value/expression.js

diff --git a/entity/MSTTeamMember_entity/MSTTeamMember_entity.aod b/entity/MSTTeamMember_entity/MSTTeamMember_entity.aod
index 94ab56ff9a8..d8655c46b72 100644
--- a/entity/MSTTeamMember_entity/MSTTeamMember_entity.aod
+++ b/entity/MSTTeamMember_entity/MSTTeamMember_entity.aod
@@ -20,6 +20,7 @@
       <name>CONTACT_ID</name>
       <title>Members</title>
       <consumer>ProjectMembers</consumer>
+      <linkedContextProcess>%aditoprj%/entity/MSTTeamMember_entity/entityfields/contact_id/linkedContextProcess.js</linkedContextProcess>
       <stateProcess>%aditoprj%/entity/MSTTeamMember_entity/entityfields/contact_id/stateProcess.js</stateProcess>
       <displayValueProcess>%aditoprj%/entity/MSTTeamMember_entity/entityfields/contact_id/displayValueProcess.js</displayValueProcess>
     </entityField>
@@ -84,11 +85,12 @@
       <expose v="true" />
     </entityParameter>
     <entityField>
-      <name>ISOWNER</name>
+      <name>ROLE</name>
       <title>Role</title>
-      <mandatoryProcess>%aditoprj%/entity/MSTTeamMember_entity/entityfields/isowner/mandatoryProcess.js</mandatoryProcess>
-      <dropDownProcess>%aditoprj%/entity/MSTTeamMember_entity/entityfields/isowner/dropDownProcess.js</dropDownProcess>
-      <stateProcess>%aditoprj%/entity/MSTTeamMember_entity/entityfields/isowner/stateProcess.js</stateProcess>
+      <mandatoryProcess>%aditoprj%/entity/MSTTeamMember_entity/entityfields/role/mandatoryProcess.js</mandatoryProcess>
+      <dropDownProcess>%aditoprj%/entity/MSTTeamMember_entity/entityfields/role/dropDownProcess.js</dropDownProcess>
+      <stateProcess>%aditoprj%/entity/MSTTeamMember_entity/entityfields/role/stateProcess.js</stateProcess>
+      <displayValueProcess>%aditoprj%/entity/MSTTeamMember_entity/entityfields/role/displayValueProcess.js</displayValueProcess>
     </entityField>
     <entityField>
       <name>INVITE</name>
@@ -114,11 +116,17 @@
           <name>MEMBERNAME.value</name>
         </jDitoRecordFieldMapping>
         <jDitoRecordFieldMapping>
-          <name>ISOWNER.value</name>
+          <name>ROLE.value</name>
+        </jDitoRecordFieldMapping>
+        <jDitoRecordFieldMapping>
+          <name>CONTACT_ID.value</name>
         </jDitoRecordFieldMapping>
         <jDitoRecordFieldMapping>
           <name>CONTACT_ID.displayValue</name>
         </jDitoRecordFieldMapping>
+        <jDitoRecordFieldMapping>
+          <name>ISEXTERN.value</name>
+        </jDitoRecordFieldMapping>
       </recordFieldMappings>
     </jDitoRecordContainer>
   </recordContainers>
diff --git a/entity/MSTTeamMember_entity/entityfields/contact_id/linkedContextProcess.js b/entity/MSTTeamMember_entity/entityfields/contact_id/linkedContextProcess.js
new file mode 100644
index 00000000000..c02451c808e
--- /dev/null
+++ b/entity/MSTTeamMember_entity/entityfields/contact_id/linkedContextProcess.js
@@ -0,0 +1,5 @@
+import("system.vars");
+import("system.result");
+
+if (vars.get("$field.CONTACT_ID"))
+    result.string("Person");
\ No newline at end of file
diff --git a/entity/MSTTeamMember_entity/entityfields/isowner/dropDownProcess.js b/entity/MSTTeamMember_entity/entityfields/isowner/dropDownProcess.js
deleted file mode 100644
index 3b9d6a7266f..00000000000
--- a/entity/MSTTeamMember_entity/entityfields/isowner/dropDownProcess.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import("system.result");
-import("system.translate");
-
-result.object([
-    ["true", translate.text("Owner")],
-    ["false", translate.text("Member")]
-]);
\ No newline at end of file
diff --git a/entity/MSTTeamMember_entity/entityfields/isowner/mandatoryProcess.js b/entity/MSTTeamMember_entity/entityfields/isowner/mandatoryProcess.js
deleted file mode 100644
index 56edc5e4c6b..00000000000
--- a/entity/MSTTeamMember_entity/entityfields/isowner/mandatoryProcess.js
+++ /dev/null
@@ -1,4 +0,0 @@
-import("system.result");
-import("system.vars");
-
-result.string(!vars.get("$field.MEMBERNAME") && vars.get("$field.ISEXTERN") != "true");
\ No newline at end of file
diff --git a/entity/MSTTeamMember_entity/entityfields/isowner/stateProcess.js b/entity/MSTTeamMember_entity/entityfields/isowner/stateProcess.js
deleted file mode 100644
index 025c6018279..00000000000
--- a/entity/MSTTeamMember_entity/entityfields/isowner/stateProcess.js
+++ /dev/null
@@ -1,5 +0,0 @@
-import("system.result");
-import("system.vars");
-import("system.neon");
-
-result.string(vars.get("$field.MEMBERNAME") || vars.get("$field.ISEXTERN") == "true" ? neon.COMPONENTSTATE_INVISIBLE : neon.COMPONENTSTATE_EDITABLE);
\ No newline at end of file
diff --git a/entity/MSTTeamMember_entity/entityfields/role/displayValueProcess.js b/entity/MSTTeamMember_entity/entityfields/role/displayValueProcess.js
new file mode 100644
index 00000000000..19bd5d6043b
--- /dev/null
+++ b/entity/MSTTeamMember_entity/entityfields/role/displayValueProcess.js
@@ -0,0 +1,10 @@
+import("system.result");
+import("system.translate");
+import("system.vars");
+
+var roles = {
+    "owner": translate.text("Owner"),
+    "member": translate.text("Member"),
+    "guest": translate.text("Guest")
+};
+result.string(roles[vars.get("$field.ROLE")] || "");
\ No newline at end of file
diff --git a/entity/MSTTeamMember_entity/entityfields/role/dropDownProcess.js b/entity/MSTTeamMember_entity/entityfields/role/dropDownProcess.js
new file mode 100644
index 00000000000..97558334115
--- /dev/null
+++ b/entity/MSTTeamMember_entity/entityfields/role/dropDownProcess.js
@@ -0,0 +1,7 @@
+import("system.result");
+import("system.translate");
+
+result.object([
+    ["owner", translate.text("Owner")],
+    ["member", translate.text("Member")]
+]);
\ No newline at end of file
diff --git a/entity/MSTTeamMember_entity/entityfields/role/mandatoryProcess.js b/entity/MSTTeamMember_entity/entityfields/role/mandatoryProcess.js
new file mode 100644
index 00000000000..5015e9937f4
--- /dev/null
+++ b/entity/MSTTeamMember_entity/entityfields/role/mandatoryProcess.js
@@ -0,0 +1,4 @@
+import("system.result");
+import("system.vars");
+
+result.string(vars.get("$field.ISEXTERN") != "true");
\ No newline at end of file
diff --git a/entity/MSTTeamMember_entity/entityfields/role/stateProcess.js b/entity/MSTTeamMember_entity/entityfields/role/stateProcess.js
new file mode 100644
index 00000000000..f947ad98892
--- /dev/null
+++ b/entity/MSTTeamMember_entity/entityfields/role/stateProcess.js
@@ -0,0 +1,14 @@
+import("system.result");
+import("system.vars");
+import("system.neon");
+
+var state = neon.COMPONENTSTATE_EDITABLE;
+if (vars.get("$field.ISEXTERN") == "true")
+{
+    if (!vars.get("$field.MEMBERNAME"))
+        state = neon.COMPONENTSTATE_INVISIBLE;
+    else
+        state = neon.COMPONENTSTATE_READONLY;
+}
+else 
+result.string(state);
\ No newline at end of file
diff --git a/entity/MSTTeamMember_entity/recordcontainers/jdito/contentProcess.js b/entity/MSTTeamMember_entity/recordcontainers/jdito/contentProcess.js
index 0e47ff74551..1212de7df64 100644
--- a/entity/MSTTeamMember_entity/recordcontainers/jdito/contentProcess.js
+++ b/entity/MSTTeamMember_entity/recordcontainers/jdito/contentProcess.js
@@ -1,25 +1,31 @@
 import("system.teams");
 import("system.result");
 import("system.vars");
+import("MSTeams_lib");
 
 var teamId = vars.get("$param.MSTTeamId_param");
 var allMembers = teamId ? teams.getAllMembers(teamId) : {};
+var memberIds = vars.get("$local.idvalues") || Object.keys(allMembers);
 var owners = teamId ? teams.getAllOwners(teamId) : {};
+var memberContactIds = MSTeamsUtils.getContactIdsByAzureIds(memberIds);
 var memberArray = [];
 
-if (vars.get("$local.idvalues"))
+memberArray = memberIds.map(function (memberId) 
 {
-    memberArray = vars.get("$local.idvalues").map(function (memberId) 
-    {
-        return [memberId, allMembers[memberId], memberId in owners, allMembers[memberId]];
-    });   
-}
-else
-{
-    for (let memberId in allMembers)
-    {
-        memberArray.push([memberId, allMembers[memberId], memberId in owners, allMembers[memberId]]);
-    }
-}
+    var role = "guest";
+    if (memberId in owners)
+        role = "owner";
+    else if (memberId in memberContactIds)
+        role = "member";
+    
+    return [
+        memberId, 
+        allMembers[memberId], 
+        role, 
+        memberContactIds[memberId],
+        allMembers[memberId],
+        memberId in memberContactIds
+    ];
+});   
 
 result.object(memberArray);
\ No newline at end of file
diff --git a/entity/MSTTeam_entity/entityfields/teammembers/onValidation.js b/entity/MSTTeam_entity/entityfields/teammembers/onValidation.js
index 7bc2769a9fb..0629031e507 100644
--- a/entity/MSTTeam_entity/entityfields/teammembers/onValidation.js
+++ b/entity/MSTTeam_entity/entityfields/teammembers/onValidation.js
@@ -2,10 +2,10 @@ import("Entity_lib");
 import("system.result");
 import("system.translate");
 
-var members = EntityConsumerRowsHelper.getCurrentConsumerRows("TeamMembers", ["ISOWNER"]);
+var members = EntityConsumerRowsHelper.getCurrentConsumerRows("TeamMembers", ["ROLE"]);
 var hasOwner = members.some(function (member)
 {
-    return member["ISOWNER"] == "true";
+    return member["ROLE"] == "owner";
 });
 if (!hasOwner)
     result.string(translate.text("The team must have at least one owner"));
\ No newline at end of file
diff --git a/entity/MSTTeam_entity/grantDeleteProcess.js b/entity/MSTTeam_entity/grantDeleteProcess.js
index 5ecf6e451e5..d23403ca44d 100644
--- a/entity/MSTTeam_entity/grantDeleteProcess.js
+++ b/entity/MSTTeam_entity/grantDeleteProcess.js
@@ -1,4 +1,5 @@
 import("system.result");
 import("system.vars");
+import("MSTeams_lib");
 
-result.string(vars.get("$field.ISARCHIVED") != "true");
\ No newline at end of file
+result.string(vars.get("$field.ISARCHIVED") != "true" && MSTeamsUtils.isUserTeamOwner(vars.get("$field.UID")));
\ No newline at end of file
diff --git a/entity/MSTTeam_entity/grantUpdateProcess.js b/entity/MSTTeam_entity/grantUpdateProcess.js
index 5ecf6e451e5..d23403ca44d 100644
--- a/entity/MSTTeam_entity/grantUpdateProcess.js
+++ b/entity/MSTTeam_entity/grantUpdateProcess.js
@@ -1,4 +1,5 @@
 import("system.result");
 import("system.vars");
+import("MSTeams_lib");
 
-result.string(vars.get("$field.ISARCHIVED") != "true");
\ No newline at end of file
+result.string(vars.get("$field.ISARCHIVED") != "true" && MSTeamsUtils.isUserTeamOwner(vars.get("$field.UID")));
\ No newline at end of file
diff --git a/entity/MSTTeam_entity/recordcontainers/jdito/onInsert.js b/entity/MSTTeam_entity/recordcontainers/jdito/onInsert.js
index 007fa7bf9a2..67814ad72f2 100644
--- a/entity/MSTTeam_entity/recordcontainers/jdito/onInsert.js
+++ b/entity/MSTTeam_entity/recordcontainers/jdito/onInsert.js
@@ -35,7 +35,7 @@ teamMembers.forEach(function (teamMember)
         memberAzureId = teams.getInternalAzureId(memberUpn);
     if (memberAzureId)
     {
-        if (teamMember["ISOWNER"] == "true")
+        if (teamMember["ROLE"] == "owner")
             ownerIds.push(memberAzureId);
         else
             internalMembers.push(teams.createInternalUserConfig(memberAzureId));
diff --git a/entity/MSTTeam_entity/recordcontainers/jdito/onUpdate.js b/entity/MSTTeam_entity/recordcontainers/jdito/onUpdate.js
index f645523963b..9219ab01d69 100644
--- a/entity/MSTTeam_entity/recordcontainers/jdito/onUpdate.js
+++ b/entity/MSTTeam_entity/recordcontainers/jdito/onUpdate.js
@@ -35,7 +35,7 @@ insertedTeamMembers.forEach(function (teamMember)
         memberAzureId = teams.getInternalAzureId(memberUpn);
     if (memberAzureId)
     {
-        internalMembers.push(teams.createInternalUserConfig(memberAzureId).setOwner(teamMember["ISOWNER"] == "true"));
+        internalMembers.push(teams.createInternalUserConfig(memberAzureId).setOwner(teamMember["ROLE"] == "owner"));
     }
 });
 
diff --git a/entity/Member_entity/Member_entity.aod b/entity/Member_entity/Member_entity.aod
index cd7c674e6b5..b79d4cca1bc 100644
--- a/entity/Member_entity/Member_entity.aod
+++ b/entity/Member_entity/Member_entity.aod
@@ -284,6 +284,7 @@
     <entityField>
       <name>MST_MEMBERROLE</name>
       <title>Teams role</title>
+      <stateProcess>%aditoprj%/entity/Member_entity/entityfields/mst_memberrole/stateProcess.js</stateProcess>
     </entityField>
     <entityParameter>
       <name>EnableMSTeams_param</name>
@@ -415,6 +416,10 @@
           <isFilterable v="true" />
           <isLookupFilter v="true" />
         </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>MST_MEMBERROLE.value</name>
+          <expression>%aditoprj%/entity/Member_entity/recordcontainers/db/recordfieldmappings/mst_memberrole.value/expression.js</expression>
+        </dbRecordFieldMapping>
       </recordFieldMappings>
     </dbRecordContainer>
   </recordContainers>
diff --git a/entity/Member_entity/entityfields/mst_memberrole/stateProcess.js b/entity/Member_entity/entityfields/mst_memberrole/stateProcess.js
new file mode 100644
index 00000000000..0d9f56400af
--- /dev/null
+++ b/entity/Member_entity/entityfields/mst_memberrole/stateProcess.js
@@ -0,0 +1,9 @@
+import("system.vars");
+import("system.neon");
+import("system.result");
+import("MSTeams_lib");
+
+result.string(MSTeamsUtils.isTeamsEnabled() && vars.get("$param.EnableMSTeams_param") == "true" 
+    ? neon.COMPONENTSTATE_READONLY 
+    : neon.COMPONENTSTATE_INVISIBLE
+);
\ No newline at end of file
diff --git a/entity/Member_entity/recordcontainers/db/recordfieldmappings/mst_memberrole.value/expression.js b/entity/Member_entity/recordcontainers/db/recordfieldmappings/mst_memberrole.value/expression.js
new file mode 100644
index 00000000000..2296cd85fe7
--- /dev/null
+++ b/entity/Member_entity/recordcontainers/db/recordfieldmappings/mst_memberrole.value/expression.js
@@ -0,0 +1,5 @@
+import("system.vars");
+import("system.result");
+import("MSTeams_lib");
+
+result.string(MSTeamsUtils.getTeamRoleSubSql(vars.get("$param.MSTTeamId_param"), "OBJECTMEMBER.CONTACT_ID"));
\ No newline at end of file
diff --git a/neonView/MSTTeamMemberList_view/MSTTeamMemberList_view.aod b/neonView/MSTTeamMemberList_view/MSTTeamMemberList_view.aod
index c6b2cf1b3eb..55a8b3dda3b 100644
--- a/neonView/MSTTeamMemberList_view/MSTTeamMemberList_view.aod
+++ b/neonView/MSTTeamMemberList_view/MSTTeamMemberList_view.aod
@@ -3,9 +3,9 @@
   <name>MSTTeamMemberList_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
-    <boxLayout>
+    <noneLayout>
       <name>layout</name>
-    </boxLayout>
+    </noneLayout>
   </layout>
   <children>
     <titledListViewTemplate>
@@ -15,9 +15,13 @@
       <isEditable v="false" />
       <isCreatable v="false" />
       <columns>
+        <neonTitledListTableColumn>
+          <name>ea5cdf04-7476-46f0-9df7-41d66e24acad</name>
+          <entityField>ROLE</entityField>
+        </neonTitledListTableColumn>
         <neonTitledListTableColumn>
           <name>20efb592-e94f-4f2c-87b5-fea410c4c28a</name>
-          <entityField>MEMBERNAME</entityField>
+          <entityField>CONTACT_ID</entityField>
         </neonTitledListTableColumn>
       </columns>
     </titledListViewTemplate>
diff --git a/neonView/MSTTeamMemberMultiEdit_view/MSTTeamMemberMultiEdit_view.aod b/neonView/MSTTeamMemberMultiEdit_view/MSTTeamMemberMultiEdit_view.aod
index 27b9c4b7bdf..7b50927fe8a 100644
--- a/neonView/MSTTeamMemberMultiEdit_view/MSTTeamMemberMultiEdit_view.aod
+++ b/neonView/MSTTeamMemberMultiEdit_view/MSTTeamMemberMultiEdit_view.aod
@@ -18,7 +18,7 @@
         </neonGenericMultipleTableColumn>
         <neonGenericMultipleTableColumn>
           <name>467ab169-f46a-4036-9e5e-5c480bd947a6</name>
-          <entityField>ISOWNER</entityField>
+          <entityField>ROLE</entityField>
         </neonGenericMultipleTableColumn>
         <neonGenericMultipleTableColumn>
           <name>b85c25c8-09dd-4f9a-b0b4-31c0b8a8f12c</name>
diff --git a/neonView/MemberFilter_view/MemberFilter_view.aod b/neonView/MemberFilter_view/MemberFilter_view.aod
index 35d9b432b67..0e32969791b 100644
--- a/neonView/MemberFilter_view/MemberFilter_view.aod
+++ b/neonView/MemberFilter_view/MemberFilter_view.aod
@@ -49,6 +49,10 @@
           <name>bea82980-0639-405a-ab3f-92e45f97090e</name>
           <entityField>MEMBERROLE</entityField>
         </neonTableColumn>
+        <neonTableColumn>
+          <name>2a1a3331-5374-4da0-b15d-ede11a691e0a</name>
+          <entityField>MST_MEMBERROLE</entityField>
+        </neonTableColumn>
       </columns>
     </tableViewTemplate>
   </children>
diff --git a/process/MSTeams_lib/MSTeams_lib.aod b/process/MSTeams_lib/MSTeams_lib.aod
index b414a9e8a83..466fb42fa29 100644
--- a/process/MSTeams_lib/MSTeams_lib.aod
+++ b/process/MSTeams_lib/MSTeams_lib.aod
@@ -3,6 +3,7 @@
   <name>MSTeams_lib</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <process>%aditoprj%/process/MSTeams_lib/process.js</process>
+  <alias>Data_alias</alias>
   <variants>
     <element>LIBRARY</element>
   </variants>
diff --git a/process/MSTeams_lib/process.js b/process/MSTeams_lib/process.js
index 2f41a4e4660..1cf1d4b8271 100644
--- a/process/MSTeams_lib/process.js
+++ b/process/MSTeams_lib/process.js
@@ -1,3 +1,6 @@
+import("Communication_lib");
+import("system.translate");
+import("system.tools");
 import("Sql_lib");
 import("system.teams");
 import("system.project");
@@ -58,7 +61,68 @@ MSTeamsUtils.getLinkedTeam = function (pRowId, pObjectType)
     return MSTeamsUtils.getLinkedTeams(pRowId, pObjectType)[0] || null;
 }
 
+MSTeamsUtils.getContactIdsByAzureIds = function (pAzureIds)
+{
+    if (pAzureIds.length === 0)
+        return {};
+    
+    var teamsUsers = tools.getUsersByAttribute(tools.TEAMS_AZUREID, pAzureIds);
+    var contactIdMap = {};
+    teamsUsers.forEach(function (user)
+    {
+        var azureId = user[tools.PARAMS][tools.TEAMS_AZUREID];
+        contactIdMap[azureId] = user[tools.PARAMS][tools.CONTACTID];
+    });
+    return contactIdMap;
+}
+
 MSTeamsUtils.getTeamRoleSubSql = function (pTeamId, pContactIdField)
 {
+    if (!pTeamId)
+        return "''";
+    
+    var ownerIds = Object.keys(teams.getAllOwners(pTeamId));
+    var ownerContactIds = MSTeamsUtils.getContactIdsByAzureIds(ownerIds);
+    ownerContactIds = _getObjectValues(ownerContactIds);
+    
+    var members = teams.getAllMembers(pTeamId);
+    var memberIds = Object.keys(members);
+    var memberContactIds = MSTeamsUtils.getContactIdsByAzureIds(memberIds);
+    memberContactIds = _getObjectValues(memberContactIds);
+    
+    if (ownerContactIds.length === 0 && memberContactIds.length === 0)
+        return "''";
+    
+    var caseWhen = SqlBuilder.caseStatement(true);
+    if (ownerContactIds.length !== 0)
+        caseWhen.when(pContactIdField, ownerContactIds, SqlBuilder.IN()).then(translate.text("Owner"));
+    if (memberContactIds.length !== 0)
+        caseWhen.when(pContactIdField, memberContactIds, SqlBuilder.IN()).then(translate.text("Member"));
+    
+    //the SqlBuilder.IN() can't be used here because of the sub-sql string for the email
+    caseWhen.when("(" + CommUtil.getStandardSubSqlMail() + ") in ('" + _getObjectValues(members).join("', '") + "')")
+        .then(translate.text("Guest")); 
+    
+    return caseWhen.elseValue("").toString();
+    
+    function _getObjectValues (pObject)
+    {
+        var values = [];
+        for (let key in pObject)
+            values.push(pObject[key]);
+        return values;
+    }
+}
+
+MSTeamsUtils.isUserTeamOwner = function (pTeamId, pUserId)
+{
+    var user;
+    if (!pUserId)
+        user = tools.getCurrentUser();
+    else
+        user = tools.getUserByAttribute(tools.NAME, pUserId);
     
+    if (!user)
+        return false;
+    return user[tools.PARAMS][tools.TEAMS_AZUREID] in teams.getAllOwners(pTeamId);
 }
\ No newline at end of file
diff --git a/process/Sql_lib/process.js b/process/Sql_lib/process.js
index 3039c1cf1cb..d9bffacae79 100644
--- a/process/Sql_lib/process.js
+++ b/process/Sql_lib/process.js
@@ -2970,6 +2970,84 @@ SqlBuilder.prototype.translate = function(pAlias)
     return SqlUtils.translateStatementWithQuotes(this.build(), pAlias);
 }
 
+/**
+ * @return {SqlBuilder._CaseStatement}
+ */
+SqlBuilder.caseStatement = function (pQuoteValues)
+{
+    return new SqlBuilder._CaseStatement(pQuoteValues);
+}
+
+/**
+ *
+ */
+SqlBuilder._CaseStatement = function (pQuoteValues)
+{
+    this._whenCondition = null;
+    this._whenThens = [];
+    this._elseValue = null;
+    this._quoteValues = pQuoteValues || false;
+    this._afterWhenMask = new SqlBuilder._CaseWhen(this);
+}
+
+/**
+ * @return {SqlBuilder._CaseWhen}
+ */
+SqlBuilder._CaseStatement.prototype.when = function (pFieldOrCond, pValue, pCondition, pFieldType)
+{
+    this._whenCondition = newWhere(pFieldOrCond, pValue, pCondition, pFieldType);
+    return this._afterWhenMask;
+}
+
+/**
+ *
+ */
+SqlBuilder._CaseStatement.prototype.elseValue = function (pValue)
+{
+    if (pValue != null && this._quoteValues)
+        pValue = "'" + pValue + "'";
+    this._elseValue = pValue;
+    return this;
+}
+
+/**
+ *
+ */
+SqlBuilder._CaseStatement.prototype.toString = function ()
+{
+    var caseStatement = "case";
+    this._whenThens.forEach(function (whenThen)
+    {
+        caseStatement += " when " + whenThen.condition + " then " + whenThen.thenValue;
+    });
+    if (this._elseValue)
+        caseStatement += " else " + this._elseValue;
+    caseStatement += " end";
+    
+    logging.log(caseStatement)
+    return caseStatement;
+}
+
+/**
+ *
+ */
+SqlBuilder._CaseWhen = function (pCaseStatement)
+{
+    this._caseStatement = pCaseStatement;
+}
+
+/**
+ * @return {SqlBuilder._CaseStatement}
+ */
+SqlBuilder._CaseWhen.prototype.then = function (pValue)
+{
+    var condition = this._caseStatement._whenCondition;
+    this._caseStatement._whenCondition = null;
+    if (this._caseStatement._quoteValues)
+        pValue = "'" + pValue + "'";
+    this._caseStatement._whenThens.push({condition: condition, thenValue: pValue});
+    return this._caseStatement;
+}
 
 /**
  *provides functions for masking sql functions
-- 
GitLab


From 5e8633ce5b8c679a860b0a8447ebf0e2c0727207 Mon Sep 17 00:00:00 2001
From: Sebastian Listl <s.listl@adito.de>
Date: Fri, 4 Sep 2020 17:52:24 +0200
Subject: [PATCH 026/184] #1064484 MST changes

---
 .aditoprj/UUIDNameMap.txt                      |  2 +-
 .../MSTTeamMember_entity.aod                   |  4 +++-
 .../children/objectrowid_param/valueProcess.js | 11 ++++++++++-
 .../entityfields/role/displayValueProcess.js   | 10 ----------
 .../entityfields/role/stateProcess.js          |  3 ++-
 .../recordcontainers/jdito/contentProcess.js   | 18 +++++++++++++-----
 entity/MSTTeam_entity/MSTTeam_entity.aod       |  1 +
 entity/MSTTeam_entity/afterSave.js             |  4 ++++
 entity/MSTTeam_entity/grantDeleteProcess.js    |  2 +-
 entity/MSTTeam_entity/grantUpdateProcess.js    |  2 +-
 .../children/deleteteam/stateProcess.js        |  3 ++-
 .../children/editteam/stateProcess.js          |  3 ++-
 process/Sql_lib/process.js                     |  1 -
 13 files changed, 40 insertions(+), 24 deletions(-)
 delete mode 100644 entity/MSTTeamMember_entity/entityfields/role/displayValueProcess.js
 create mode 100644 entity/MSTTeam_entity/afterSave.js

diff --git a/.aditoprj/UUIDNameMap.txt b/.aditoprj/UUIDNameMap.txt
index 002f9103477..70f701e0fe2 100644
--- a/.aditoprj/UUIDNameMap.txt
+++ b/.aditoprj/UUIDNameMap.txt
@@ -41,7 +41,7 @@
  40
  41
 1.0.0
-1598969268500
+1599146177805
 #ENTITY
 #ENTITY
 #PROVIDER_FIELD
diff --git a/entity/MSTTeamMember_entity/MSTTeamMember_entity.aod b/entity/MSTTeamMember_entity/MSTTeamMember_entity.aod
index d8655c46b72..4f0b86c6471 100644
--- a/entity/MSTTeamMember_entity/MSTTeamMember_entity.aod
+++ b/entity/MSTTeamMember_entity/MSTTeamMember_entity.aod
@@ -90,7 +90,6 @@
       <mandatoryProcess>%aditoprj%/entity/MSTTeamMember_entity/entityfields/role/mandatoryProcess.js</mandatoryProcess>
       <dropDownProcess>%aditoprj%/entity/MSTTeamMember_entity/entityfields/role/dropDownProcess.js</dropDownProcess>
       <stateProcess>%aditoprj%/entity/MSTTeamMember_entity/entityfields/role/stateProcess.js</stateProcess>
-      <displayValueProcess>%aditoprj%/entity/MSTTeamMember_entity/entityfields/role/displayValueProcess.js</displayValueProcess>
     </entityField>
     <entityField>
       <name>INVITE</name>
@@ -118,6 +117,9 @@
         <jDitoRecordFieldMapping>
           <name>ROLE.value</name>
         </jDitoRecordFieldMapping>
+        <jDitoRecordFieldMapping>
+          <name>ROLE.displayValue</name>
+        </jDitoRecordFieldMapping>
         <jDitoRecordFieldMapping>
           <name>CONTACT_ID.value</name>
         </jDitoRecordFieldMapping>
diff --git a/entity/MSTTeamMember_entity/entityfields/projectmembers/children/objectrowid_param/valueProcess.js b/entity/MSTTeamMember_entity/entityfields/projectmembers/children/objectrowid_param/valueProcess.js
index dc0d70ccbe7..f21aa5c2a73 100644
--- a/entity/MSTTeamMember_entity/entityfields/projectmembers/children/objectrowid_param/valueProcess.js
+++ b/entity/MSTTeamMember_entity/entityfields/projectmembers/children/objectrowid_param/valueProcess.js
@@ -1,4 +1,13 @@
 import("system.vars");
 import("system.result");
+import("Sql_lib");
 
-result.string(vars.get("$param.ObjectRowId_param"));
\ No newline at end of file
+var rowId = vars.get("$param.ObjectRowId_param");
+if (!rowId)
+{
+    rowId = newSelect("OBJECT_ROWID")
+        .from("MST_TEAMLINK")
+        .where("MST_TEAMLINK.MST_TEAM_ID", "$param.MSTTeamId_param")
+        .cell();
+}
+result.string(rowId);
\ No newline at end of file
diff --git a/entity/MSTTeamMember_entity/entityfields/role/displayValueProcess.js b/entity/MSTTeamMember_entity/entityfields/role/displayValueProcess.js
deleted file mode 100644
index 19bd5d6043b..00000000000
--- a/entity/MSTTeamMember_entity/entityfields/role/displayValueProcess.js
+++ /dev/null
@@ -1,10 +0,0 @@
-import("system.result");
-import("system.translate");
-import("system.vars");
-
-var roles = {
-    "owner": translate.text("Owner"),
-    "member": translate.text("Member"),
-    "guest": translate.text("Guest")
-};
-result.string(roles[vars.get("$field.ROLE")] || "");
\ No newline at end of file
diff --git a/entity/MSTTeamMember_entity/entityfields/role/stateProcess.js b/entity/MSTTeamMember_entity/entityfields/role/stateProcess.js
index f947ad98892..f76be28d47e 100644
--- a/entity/MSTTeamMember_entity/entityfields/role/stateProcess.js
+++ b/entity/MSTTeamMember_entity/entityfields/role/stateProcess.js
@@ -1,6 +1,7 @@
 import("system.result");
 import("system.vars");
 import("system.neon");
+import("system.logging")
 
 var state = neon.COMPONENTSTATE_EDITABLE;
 if (vars.get("$field.ISEXTERN") == "true")
@@ -10,5 +11,5 @@ if (vars.get("$field.ISEXTERN") == "true")
     else
         state = neon.COMPONENTSTATE_READONLY;
 }
-else 
+
 result.string(state);
\ No newline at end of file
diff --git a/entity/MSTTeamMember_entity/recordcontainers/jdito/contentProcess.js b/entity/MSTTeamMember_entity/recordcontainers/jdito/contentProcess.js
index 1212de7df64..11d1d65919c 100644
--- a/entity/MSTTeamMember_entity/recordcontainers/jdito/contentProcess.js
+++ b/entity/MSTTeamMember_entity/recordcontainers/jdito/contentProcess.js
@@ -13,18 +13,26 @@ var memberArray = [];
 memberArray = memberIds.map(function (memberId) 
 {
     var role = "guest";
+    var roleName = translate.text("Guest");
     if (memberId in owners)
+    {
         role = "owner";
+        roleName = translate.text("Owner");
+    }
     else if (memberId in memberContactIds)
+    {
         role = "member";
+        roleName = translate.text("Member");
+    }
     
     return [
         memberId, 
-        allMembers[memberId], 
-        role, 
-        memberContactIds[memberId],
-        allMembers[memberId],
-        memberId in memberContactIds
+        allMembers[memberId] || "", 
+        role,
+        roleName,
+        memberContactIds[memberId] || "",
+        allMembers[memberId] || "",
+        !(memberId in memberContactIds)
     ];
 });   
 
diff --git a/entity/MSTTeam_entity/MSTTeam_entity.aod b/entity/MSTTeam_entity/MSTTeam_entity.aod
index fbd8d90278c..37bae16ffca 100644
--- a/entity/MSTTeam_entity/MSTTeam_entity.aod
+++ b/entity/MSTTeam_entity/MSTTeam_entity.aod
@@ -10,6 +10,7 @@
   <grantDeleteProcess>%aditoprj%/entity/MSTTeam_entity/grantDeleteProcess.js</grantDeleteProcess>
   <contentTitleProcess>%aditoprj%/entity/MSTTeam_entity/contentTitleProcess.js</contentTitleProcess>
   <afterUiInit>%aditoprj%/entity/MSTTeam_entity/afterUiInit.js</afterUiInit>
+  <afterSave>%aditoprj%/entity/MSTTeam_entity/afterSave.js</afterSave>
   <recordContainer>jdito</recordContainer>
   <entityFields>
     <entityProvider>
diff --git a/entity/MSTTeam_entity/afterSave.js b/entity/MSTTeam_entity/afterSave.js
new file mode 100644
index 00000000000..eeeb0cbd2a4
--- /dev/null
+++ b/entity/MSTTeam_entity/afterSave.js
@@ -0,0 +1,4 @@
+import("system.neon");
+
+//TODO: this should not be necessary, check why the siblings don't work here
+neon.refreshAll();
\ No newline at end of file
diff --git a/entity/MSTTeam_entity/grantDeleteProcess.js b/entity/MSTTeam_entity/grantDeleteProcess.js
index d23403ca44d..3fad7d06d00 100644
--- a/entity/MSTTeam_entity/grantDeleteProcess.js
+++ b/entity/MSTTeam_entity/grantDeleteProcess.js
@@ -2,4 +2,4 @@ import("system.result");
 import("system.vars");
 import("MSTeams_lib");
 
-result.string(vars.get("$field.ISARCHIVED") != "true" && MSTeamsUtils.isUserTeamOwner(vars.get("$field.UID")));
\ No newline at end of file
+result.string(vars.get("$field.TEAMID_AND_NAME") && vars.get("$field.ISARCHIVED") != "true" && MSTeamsUtils.isUserTeamOwner(vars.get("$field.UID")));
\ No newline at end of file
diff --git a/entity/MSTTeam_entity/grantUpdateProcess.js b/entity/MSTTeam_entity/grantUpdateProcess.js
index d23403ca44d..3fad7d06d00 100644
--- a/entity/MSTTeam_entity/grantUpdateProcess.js
+++ b/entity/MSTTeam_entity/grantUpdateProcess.js
@@ -2,4 +2,4 @@ import("system.result");
 import("system.vars");
 import("MSTeams_lib");
 
-result.string(vars.get("$field.ISARCHIVED") != "true" && MSTeamsUtils.isUserTeamOwner(vars.get("$field.UID")));
\ No newline at end of file
+result.string(vars.get("$field.TEAMID_AND_NAME") && vars.get("$field.ISARCHIVED") != "true" && MSTeamsUtils.isUserTeamOwner(vars.get("$field.UID")));
\ No newline at end of file
diff --git a/entity/Member_entity/entityfields/msteamsactiongroup/children/deleteteam/stateProcess.js b/entity/Member_entity/entityfields/msteamsactiongroup/children/deleteteam/stateProcess.js
index 5a91fdde73f..d1432e9d7c5 100644
--- a/entity/Member_entity/entityfields/msteamsactiongroup/children/deleteteam/stateProcess.js
+++ b/entity/Member_entity/entityfields/msteamsactiongroup/children/deleteteam/stateProcess.js
@@ -2,6 +2,7 @@ import("system.vars");
 import("system.neon");
 import("system.result");
 import("Sql_lib");
+import("MSTeams_lib");
 
 var teamId = vars.exists("$param.MSTTeamId_param") ? vars.get("$param.MSTTeamId_param") : null;
 
@@ -10,7 +11,7 @@ var isArchived = newSelect("IS_ARCHIVED")
     .whereIfSet("MST_TEAM.MST_TEAMID", teamId)
     .cell(true);
     
-if (teamId == "" || isArchived == 1) 
+if (!teamId || isArchived == 1 || !MSTeamsUtils.isUserTeamOwner(teamId)) 
 {
     result.string(neon.COMPONENTSTATE_DISABLED);
 }
diff --git a/entity/Member_entity/entityfields/msteamsactiongroup/children/editteam/stateProcess.js b/entity/Member_entity/entityfields/msteamsactiongroup/children/editteam/stateProcess.js
index 5a91fdde73f..d1432e9d7c5 100644
--- a/entity/Member_entity/entityfields/msteamsactiongroup/children/editteam/stateProcess.js
+++ b/entity/Member_entity/entityfields/msteamsactiongroup/children/editteam/stateProcess.js
@@ -2,6 +2,7 @@ import("system.vars");
 import("system.neon");
 import("system.result");
 import("Sql_lib");
+import("MSTeams_lib");
 
 var teamId = vars.exists("$param.MSTTeamId_param") ? vars.get("$param.MSTTeamId_param") : null;
 
@@ -10,7 +11,7 @@ var isArchived = newSelect("IS_ARCHIVED")
     .whereIfSet("MST_TEAM.MST_TEAMID", teamId)
     .cell(true);
     
-if (teamId == "" || isArchived == 1) 
+if (!teamId || isArchived == 1 || !MSTeamsUtils.isUserTeamOwner(teamId)) 
 {
     result.string(neon.COMPONENTSTATE_DISABLED);
 }
diff --git a/process/Sql_lib/process.js b/process/Sql_lib/process.js
index d9bffacae79..e59d4ba8b1b 100644
--- a/process/Sql_lib/process.js
+++ b/process/Sql_lib/process.js
@@ -3024,7 +3024,6 @@ SqlBuilder._CaseStatement.prototype.toString = function ()
         caseStatement += " else " + this._elseValue;
     caseStatement += " end";
     
-    logging.log(caseStatement)
     return caseStatement;
 }
 
-- 
GitLab


From 74dc7403b1ee7e02e4e35b043a47c2fb53a009d3 Mon Sep 17 00:00:00 2001
From: "a.schindlbeck" <a.schindlbeck@adito.de>
Date: Mon, 14 Sep 2020 11:08:59 +0000
Subject: [PATCH 027/184] Calendar_lib: exchangeEmail Fix

(cherry picked from commit 8026e5e52db88fc59b24b36897c6f92f3dd96ddb)

(cherry picked from commit bed0d02e3e58c584835e4436f7faba2bbed5bde5)
---
 process/Calendar_lib/process.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/process/Calendar_lib/process.js b/process/Calendar_lib/process.js
index 7cc5df86754..13fb9288d31 100644
--- a/process/Calendar_lib/process.js
+++ b/process/Calendar_lib/process.js
@@ -108,7 +108,7 @@ CalendarUtil.getEffectiveCalendarIdFromUser = function(pUser)
     var email = userParams["email"];
     
     if(exchangeEmail)
-        return exhangeEmail;
+        return exchangeEmail;
     else if(calendarId)
         return calendarId;
     else if(email)
-- 
GitLab


From c396549c9086b12bffe0dbebc5427200aa3b7b70 Mon Sep 17 00:00:00 2001
From: "j.goderbauer" <j.goderbauer@adito.de>
Date: Tue, 15 Sep 2020 11:04:00 +0200
Subject: [PATCH 028/184] upgraded MS Teams datamodels

---
 entity/MSTChooseTeam_entity/MSTChooseTeam_entity.aod        | 6 +++++-
 entity/MSTTeamMember_entity/MSTTeamMember_entity.aod        | 6 +++++-
 entity/MSTTeam_entity/MSTTeam_entity.aod                    | 6 +++++-
 .../MSTeamsActivityImport_entity.aod                        | 6 +++++-
 .../MSTeamsAddMembers_entity/MSTeamsAddMembers_entity.aod   | 6 +++++-
 entity/MSTeamsChannel_entity/MSTeamsChannel_entity.aod      | 6 +++++-
 entity/MSTeamsDocument_entity/MSTeamsDocument_entity.aod    | 6 +++++-
 entity/MSTeamsMessage_entity/MSTeamsMessage_entity.aod      | 6 +++++-
 entity/SingleObject_entity/SingleObject_entity.aod          | 6 +++++-
 9 files changed, 45 insertions(+), 9 deletions(-)

diff --git a/entity/MSTChooseTeam_entity/MSTChooseTeam_entity.aod b/entity/MSTChooseTeam_entity/MSTChooseTeam_entity.aod
index 0c9ea22f83a..ea7e4183dcf 100644
--- a/entity/MSTChooseTeam_entity/MSTChooseTeam_entity.aod
+++ b/entity/MSTChooseTeam_entity/MSTChooseTeam_entity.aod
@@ -1,5 +1,5 @@
 <?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.14" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.14">
+<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>MSTChooseTeam_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <siblings />
@@ -33,6 +33,10 @@
       <name>ObjectType_param</name>
       <expose v="true" />
     </entityParameter>
+    <entityProvider>
+      <name>#PROVIDER_AGGREGATES</name>
+      <useAggregates v="true" />
+    </entityProvider>
   </entityFields>
   <recordContainers>
     <jDitoRecordContainer>
diff --git a/entity/MSTTeamMember_entity/MSTTeamMember_entity.aod b/entity/MSTTeamMember_entity/MSTTeamMember_entity.aod
index 4f0b86c6471..c05d6e59bd3 100644
--- a/entity/MSTTeamMember_entity/MSTTeamMember_entity.aod
+++ b/entity/MSTTeamMember_entity/MSTTeamMember_entity.aod
@@ -1,5 +1,5 @@
 <?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.14" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.14">
+<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>MSTTeamMember_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <siblings />
@@ -98,6 +98,10 @@
       <dropDownProcess>%aditoprj%/entity/MSTTeamMember_entity/entityfields/invite/dropDownProcess.js</dropDownProcess>
       <stateProcess>%aditoprj%/entity/MSTTeamMember_entity/entityfields/invite/stateProcess.js</stateProcess>
     </entityField>
+    <entityProvider>
+      <name>#PROVIDER_AGGREGATES</name>
+      <useAggregates v="true" />
+    </entityProvider>
   </entityFields>
   <recordContainers>
     <jDitoRecordContainer>
diff --git a/entity/MSTTeam_entity/MSTTeam_entity.aod b/entity/MSTTeam_entity/MSTTeam_entity.aod
index 37bae16ffca..f45825bd7d6 100644
--- a/entity/MSTTeam_entity/MSTTeam_entity.aod
+++ b/entity/MSTTeam_entity/MSTTeam_entity.aod
@@ -1,5 +1,5 @@
 <?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.14" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.14">
+<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>MSTTeam_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <siblings>
@@ -103,6 +103,10 @@
         </entityParameter>
       </children>
     </entityConsumer>
+    <entityProvider>
+      <name>#PROVIDER_AGGREGATES</name>
+      <useAggregates v="true" />
+    </entityProvider>
   </entityFields>
   <recordContainers>
     <jDitoRecordContainer>
diff --git a/entity/MSTeamsActivityImport_entity/MSTeamsActivityImport_entity.aod b/entity/MSTeamsActivityImport_entity/MSTeamsActivityImport_entity.aod
index 6ae1fbc483d..82434544226 100644
--- a/entity/MSTeamsActivityImport_entity/MSTeamsActivityImport_entity.aod
+++ b/entity/MSTeamsActivityImport_entity/MSTeamsActivityImport_entity.aod
@@ -1,5 +1,5 @@
 <?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.14" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.14">
+<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>MSTeamsActivityImport_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <siblings />
@@ -74,6 +74,10 @@
       <name>ObjectType_param</name>
       <expose v="true" />
     </entityParameter>
+    <entityProvider>
+      <name>#PROVIDER_AGGREGATES</name>
+      <useAggregates v="true" />
+    </entityProvider>
   </entityFields>
   <recordContainers>
     <jDitoRecordContainer>
diff --git a/entity/MSTeamsAddMembers_entity/MSTeamsAddMembers_entity.aod b/entity/MSTeamsAddMembers_entity/MSTeamsAddMembers_entity.aod
index 2497bfbb52a..d9be6c9f336 100644
--- a/entity/MSTeamsAddMembers_entity/MSTeamsAddMembers_entity.aod
+++ b/entity/MSTeamsAddMembers_entity/MSTeamsAddMembers_entity.aod
@@ -1,5 +1,5 @@
 <?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.14" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.14">
+<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>MSTeamsAddMembers_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <title>Add members</title>
@@ -47,6 +47,10 @@
       <name>ObjectType_param</name>
       <expose v="true" />
     </entityParameter>
+    <entityProvider>
+      <name>#PROVIDER_AGGREGATES</name>
+      <useAggregates v="true" />
+    </entityProvider>
   </entityFields>
   <recordContainers>
     <jDitoRecordContainer>
diff --git a/entity/MSTeamsChannel_entity/MSTeamsChannel_entity.aod b/entity/MSTeamsChannel_entity/MSTeamsChannel_entity.aod
index f54a35bd2af..0b7cae243a3 100644
--- a/entity/MSTeamsChannel_entity/MSTeamsChannel_entity.aod
+++ b/entity/MSTeamsChannel_entity/MSTeamsChannel_entity.aod
@@ -1,5 +1,5 @@
 <?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.14" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.14">
+<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>MSTeamsChannel_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <title>Channel</title>
@@ -52,6 +52,10 @@
         </entityDependency>
       </dependencies>
     </entityProvider>
+    <entityProvider>
+      <name>#PROVIDER_AGGREGATES</name>
+      <useAggregates v="true" />
+    </entityProvider>
   </entityFields>
   <recordContainers>
     <jDitoRecordContainer>
diff --git a/entity/MSTeamsDocument_entity/MSTeamsDocument_entity.aod b/entity/MSTeamsDocument_entity/MSTeamsDocument_entity.aod
index b43879c6c71..a3bac6db687 100644
--- a/entity/MSTeamsDocument_entity/MSTeamsDocument_entity.aod
+++ b/entity/MSTeamsDocument_entity/MSTeamsDocument_entity.aod
@@ -1,5 +1,5 @@
 <?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.14" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.14">
+<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>MSTeamsDocument_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <siblings />
@@ -54,6 +54,10 @@
       <expose v="true" />
       <mandatory v="true" />
     </entityParameter>
+    <entityProvider>
+      <name>#PROVIDER_AGGREGATES</name>
+      <useAggregates v="true" />
+    </entityProvider>
   </entityFields>
   <recordContainers>
     <jDitoRecordContainer>
diff --git a/entity/MSTeamsMessage_entity/MSTeamsMessage_entity.aod b/entity/MSTeamsMessage_entity/MSTeamsMessage_entity.aod
index 89751eb2b28..26f7ab7d0cb 100644
--- a/entity/MSTeamsMessage_entity/MSTeamsMessage_entity.aod
+++ b/entity/MSTeamsMessage_entity/MSTeamsMessage_entity.aod
@@ -1,5 +1,5 @@
 <?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.14" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.14">
+<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>MSTeamsMessage_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <siblings />
@@ -55,6 +55,10 @@
       <expose v="true" />
       <documentation>%aditoprj%/entity/MSTTeamsMessage_entity/entityfields/loadnext_param/documentation.adoc</documentation>
     </entityParameter>
+    <entityProvider>
+      <name>#PROVIDER_AGGREGATES</name>
+      <useAggregates v="true" />
+    </entityProvider>
   </entityFields>
   <recordContainers>
     <jDitoRecordContainer>
diff --git a/entity/SingleObject_entity/SingleObject_entity.aod b/entity/SingleObject_entity/SingleObject_entity.aod
index f471932a1d6..a810e79749d 100644
--- a/entity/SingleObject_entity/SingleObject_entity.aod
+++ b/entity/SingleObject_entity/SingleObject_entity.aod
@@ -1,5 +1,5 @@
 <?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.14" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.14">
+<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>SingleObject_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <recordContainer>jdito</recordContainer>
@@ -30,6 +30,10 @@
       <targetContextField>TARGET_CONTEXT</targetContextField>
       <targetIdField>UID</targetIdField>
     </entityProvider>
+    <entityProvider>
+      <name>#PROVIDER_AGGREGATES</name>
+      <useAggregates v="true" />
+    </entityProvider>
   </entityFields>
   <recordContainers>
     <jDitoRecordContainer>
-- 
GitLab


From de31ac6e71bee3e4676e2720fec6e2a5e5dbcc62 Mon Sep 17 00:00:00 2001
From: "j.goderbauer" <j.goderbauer@adito.de>
Date: Tue, 15 Sep 2020 11:07:00 +0200
Subject: [PATCH 029/184] fix merge errors

---
 .liquibase/Data_alias/changelog.xml                | 2 +-
 entity/Salesproject_entity/Salesproject_entity.aod | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/.liquibase/Data_alias/changelog.xml b/.liquibase/Data_alias/changelog.xml
index 485c35f91ac..b2fb83292f5 100644
--- a/.liquibase/Data_alias/changelog.xml
+++ b/.liquibase/Data_alias/changelog.xml
@@ -19,5 +19,5 @@
     <include relativeToChangelogFile="true" file="basic/2020.2.0/changelog.xml"/>
 
     <!--enable this only when you definetly want to overwrite the existing data with demo records:-->
-    <!--<include relativeToChangelogFile="true" file="basic/_demoData/changelog.xml" context="example"/>--
+    <!--<include relativeToChangelogFile="true" file="basic/_demoData/changelog.xml" context="example"/>-->
 </databaseChangeLog>
\ No newline at end of file
diff --git a/entity/Salesproject_entity/Salesproject_entity.aod b/entity/Salesproject_entity/Salesproject_entity.aod
index 84c89c142bd..a04269fdb7a 100644
--- a/entity/Salesproject_entity/Salesproject_entity.aod
+++ b/entity/Salesproject_entity/Salesproject_entity.aod
@@ -803,7 +803,7 @@
           <primaryKey>CLASSIFICATIONSTORAGEID</primaryKey>
           <isUIDTable v="false" />
           <readonly v="true" />
-        </linkInformation
+        </linkInformation>
         <linkInformation>
           <name>44fba381-e477-4a92-ba82-fc22c3d98c23</name>
           <tableName>MST_TEAM</tableName>
-- 
GitLab


From 3a8cb98aa0feb220a02f9e245fce1fe760b53bcb Mon Sep 17 00:00:00 2001
From: "j.goderbauer" <j.goderbauer@adito.de>
Date: Tue, 15 Sep 2020 11:15:24 +0200
Subject: [PATCH 030/184] Moved Liquibase files for MS Teams

---
 .../basic/{2020.2.1 => 2020.2.0}/MSTeams/changelog.xml           | 0
 .../basic/{2020.2.1 => 2020.2.0}/MSTeams/create_MST_TEAM.xml     | 0
 .../basic/{2020.2.1 => 2020.2.0}/MSTeams/create_MST_TEAMLINK.xml | 0
 .liquibase/Data_alias/basic/2020.2.0/changelog.xml               | 1 +
 .liquibase/Data_alias/changelog.xml                              | 1 -
 5 files changed, 1 insertion(+), 1 deletion(-)
 rename .liquibase/Data_alias/basic/{2020.2.1 => 2020.2.0}/MSTeams/changelog.xml (100%)
 rename .liquibase/Data_alias/basic/{2020.2.1 => 2020.2.0}/MSTeams/create_MST_TEAM.xml (100%)
 rename .liquibase/Data_alias/basic/{2020.2.1 => 2020.2.0}/MSTeams/create_MST_TEAMLINK.xml (100%)

diff --git a/.liquibase/Data_alias/basic/2020.2.1/MSTeams/changelog.xml b/.liquibase/Data_alias/basic/2020.2.0/MSTeams/changelog.xml
similarity index 100%
rename from .liquibase/Data_alias/basic/2020.2.1/MSTeams/changelog.xml
rename to .liquibase/Data_alias/basic/2020.2.0/MSTeams/changelog.xml
diff --git a/.liquibase/Data_alias/basic/2020.2.1/MSTeams/create_MST_TEAM.xml b/.liquibase/Data_alias/basic/2020.2.0/MSTeams/create_MST_TEAM.xml
similarity index 100%
rename from .liquibase/Data_alias/basic/2020.2.1/MSTeams/create_MST_TEAM.xml
rename to .liquibase/Data_alias/basic/2020.2.0/MSTeams/create_MST_TEAM.xml
diff --git a/.liquibase/Data_alias/basic/2020.2.1/MSTeams/create_MST_TEAMLINK.xml b/.liquibase/Data_alias/basic/2020.2.0/MSTeams/create_MST_TEAMLINK.xml
similarity index 100%
rename from .liquibase/Data_alias/basic/2020.2.1/MSTeams/create_MST_TEAMLINK.xml
rename to .liquibase/Data_alias/basic/2020.2.0/MSTeams/create_MST_TEAMLINK.xml
diff --git a/.liquibase/Data_alias/basic/2020.2.0/changelog.xml b/.liquibase/Data_alias/basic/2020.2.0/changelog.xml
index 52e4a7e0cd3..d14950e4699 100644
--- a/.liquibase/Data_alias/basic/2020.2.0/changelog.xml
+++ b/.liquibase/Data_alias/basic/2020.2.0/changelog.xml
@@ -10,4 +10,5 @@
     <include relativeToChangelogFile="true" file="alter_ComunicationMedium_IdDatatype.xml"/>
     <include relativeToChangelogFile="true" file="ReportDispatchImpl/add_DocumentTemplatePlaceOfUse.xml"/>
     <include relativeToChangelogFile="true" file="alter_VisitrecommendationpriorityDatatype.xml"/>
+    <include relativeToChangelogFile="true" file="MSTeams/changelog.xml"/>
 </databaseChangeLog>
diff --git a/.liquibase/Data_alias/changelog.xml b/.liquibase/Data_alias/changelog.xml
index b2fb83292f5..c3a1d3c5759 100644
--- a/.liquibase/Data_alias/changelog.xml
+++ b/.liquibase/Data_alias/changelog.xml
@@ -14,7 +14,6 @@
     <include relativeToChangelogFile="true" file="basic/2020.1.0/changelog.xml"/>
     <include relativeToChangelogFile="true" file="basic/2020.1.1/changelog.xml"/>
     <include relativeToChangelogFile="true" file="basic/2020.1.2/changelog.xml"/>
-    <include relativeToChangelogFile="true" file="basic/2020.2.1/MSTeams/changelog.xml"/>
     <include relativeToChangelogFile="true" file="basic/2020.1.3/changelog.xml"/>
     <include relativeToChangelogFile="true" file="basic/2020.2.0/changelog.xml"/>
 
-- 
GitLab


From 8c2d86be9575be583ba46cf6a07c6e688bc50ee7 Mon Sep 17 00:00:00 2001
From: "j.goderbauer" <j.goderbauer@adito.de>
Date: Tue, 15 Sep 2020 11:19:03 +0200
Subject: [PATCH 031/184] MS Teams: database refactoring

---
 .../2020.2.0/MSTeams/create_MST_TEAM.xml      |  1 -
 aliasDefinition/Data_alias/Data_alias.aod     | 46 +++++++------------
 2 files changed, 16 insertions(+), 31 deletions(-)

diff --git a/.liquibase/Data_alias/basic/2020.2.0/MSTeams/create_MST_TEAM.xml b/.liquibase/Data_alias/basic/2020.2.0/MSTeams/create_MST_TEAM.xml
index 48a4387dde9..3753f3db0c7 100644
--- a/.liquibase/Data_alias/basic/2020.2.0/MSTeams/create_MST_TEAM.xml
+++ b/.liquibase/Data_alias/basic/2020.2.0/MSTeams/create_MST_TEAM.xml
@@ -8,7 +8,6 @@
 		</column>   
                 <column name="TEAMNAME" type="NVARCHAR(255)"/>
                 <column name="GENERAL_CHANNELID" type="CHAR(48)"/>
-                <column name="OBJECT_ROWID" type="CHAR(36)"/>
                 <column name="IS_ARCHIVED" type="TINYINT"/>
                 <column name="SERVICE_URL" type="NVARCHAR(255)"/>
                 <column name="WEB_URL" type="NVARCHAR(500)"/>
diff --git a/aliasDefinition/Data_alias/Data_alias.aod b/aliasDefinition/Data_alias/Data_alias.aod
index fdce1bb8c09..097c01e9ccf 100644
--- a/aliasDefinition/Data_alias/Data_alias.aod
+++ b/aliasDefinition/Data_alias/Data_alias.aod
@@ -14217,20 +14217,6 @@
               <syncIds></syncIds>
             </auditSyncConfig>
             <entityFields>
-              <entityFieldDb>
-                <name>OBJECT_ROWID</name>
-                <dbName></dbName>
-                <primaryKey v="false" />
-                <columnType v="1" />
-                <size v="36" />
-                <scale v="0" />
-                <notNull v="false" />
-                <isUnique v="false" />
-                <index v="false" />
-                <documentation></documentation>
-                <title></title>
-                <description></description>
-              </entityFieldDb>
               <entityFieldDb>
                 <name>MST_TEAMID</name>
                 <dbName></dbName>
@@ -14622,7 +14608,7 @@
                 <scale v="0" />
                 <notNull v="false" />
                 <isUnique v="false" />
-                <index v="false" />
+                <index v="true" />
                 <documentation></documentation>
                 <title></title>
                 <description></description>
@@ -14655,6 +14641,20 @@
                 <title></title>
                 <description></description>
               </entityFieldDb>
+              <entityFieldDb>
+                <name>ORGANISATION_CONTACT_ID</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="1" />
+                <size v="36" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="true" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
             </entityFields>
           </entityDb>
           <entityDb>
@@ -14726,21 +14726,7 @@
                 <scale v="0" />
                 <notNull v="true" />
                 <isUnique v="false" />
-                <index v="true" />
-                <documentation></documentation>
-                <title></title>
-                <description></description>
-              </entityFieldDb>
-              <entityFieldDb>
-                <name>ORGANISATION_CONTACT_ID</name>
-                <dbName></dbName>
-                <primaryKey v="false" />
-                <columnType v="1" />
-                <size v="36" />
-                <scale v="0" />
-                <notNull v="false" />
-                <isUnique v="false" />
-                <index v="true" />
+                <index v="false" />
                 <documentation></documentation>
                 <title></title>
                 <description></description>
-- 
GitLab


From 96f75f66b85fe24f64a15ef6a1e09fed5a72de78 Mon Sep 17 00:00:00 2001
From: "j.goderbauer" <j.goderbauer@adito.de>
Date: Tue, 15 Sep 2020 12:42:54 +0200
Subject: [PATCH 032/184] MS-Teams: Bugfixing

---
 aliasDefinition/Data_alias/Data_alias.aod      | 12 +++++++++---
 .../recordcontainers/jdito/contentProcess.js   |  1 +
 entity/MSTTeam_entity/MSTTeam_entity.aod       |  4 ----
 entity/MSTTeam_entity/afterSave.js             |  4 ----
 .../MSTeamsActivityImport_entity.aod           |  3 ---
 .../entityfields/team_id/valueProcess.js       |  2 ++
 .../recordcontainers/jdito/onInsert.js         |  0
 entity/Member_entity/Member_entity.aod         | 18 +++++++++---------
 .../Salesproject_entity.aod                    |  3 ++-
 9 files changed, 23 insertions(+), 24 deletions(-)
 delete mode 100644 entity/MSTeamsActivityImport_entity/recordcontainers/jdito/onInsert.js

diff --git a/aliasDefinition/Data_alias/Data_alias.aod b/aliasDefinition/Data_alias/Data_alias.aod
index 097c01e9ccf..eeae4a15898 100644
--- a/aliasDefinition/Data_alias/Data_alias.aod
+++ b/aliasDefinition/Data_alias/Data_alias.aod
@@ -261,7 +261,7 @@
                   <customJDitoProperty>
                     <name>translate4Log</name>
                     <global v="false" />
-                    <property>%aditoprj%/aliasDefinition/Data_alias/aliasdefinitionsub/entitygroup/entities/contact/entityfields/language/customproperties/translate4log/property.js</property>
+                    <property>%aditoprj%/aliasDefinition/Data_alias/aliasdefinitionsub/entitygroup/entities/contact/entityfields/isolanguage/customproperties/translate4log/property.js</property>
                   </customJDitoProperty>
                 </customProperties>
               </entityFieldDb>
@@ -1760,10 +1760,11 @@
                     <global v="false" />
                     <property v="true" />
                   </customBooleanProperty>
-                  <customStringProperty>
+                  <customJDitoProperty>
                     <name>translate4Log</name>
                     <global v="false" />
-                  </customStringProperty>
+                    <property>%aditoprj%/aliasDefinition/Data_alias/aliasdefinitionsub/entitygroup/entities/product/entityfields/contact_id/customproperties/translate4log/property.js</property>
+                  </customJDitoProperty>
                 </customProperties>
               </entityFieldDb>
               <entityFieldDb>
@@ -2191,6 +2192,11 @@
                     <global v="false" />
                     <property v="true" />
                   </customBooleanProperty>
+                  <customJDitoProperty>
+                    <name>translate4Log</name>
+                    <global v="false" />
+                    <property>%aditoprj%/aliasDefinition/Data_alias/aliasdefinitionsub/entitygroup/entities/productprice/entityfields/contact_id/customproperties/translate4log/property.js</property>
+                  </customJDitoProperty>
                 </customProperties>
               </entityFieldDb>
               <entityFieldDb>
diff --git a/entity/MSTTeamMember_entity/recordcontainers/jdito/contentProcess.js b/entity/MSTTeamMember_entity/recordcontainers/jdito/contentProcess.js
index 11d1d65919c..3a44cd419e0 100644
--- a/entity/MSTTeamMember_entity/recordcontainers/jdito/contentProcess.js
+++ b/entity/MSTTeamMember_entity/recordcontainers/jdito/contentProcess.js
@@ -1,3 +1,4 @@
+import("system.translate");
 import("system.teams");
 import("system.result");
 import("system.vars");
diff --git a/entity/MSTTeam_entity/MSTTeam_entity.aod b/entity/MSTTeam_entity/MSTTeam_entity.aod
index f45825bd7d6..10735e065bf 100644
--- a/entity/MSTTeam_entity/MSTTeam_entity.aod
+++ b/entity/MSTTeam_entity/MSTTeam_entity.aod
@@ -2,10 +2,6 @@
 <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>MSTTeam_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
-  <siblings>
-    <element>Salesproject_entity</element>
-    <element>Member_entity</element>
-  </siblings>
   <grantUpdateProcess>%aditoprj%/entity/MSTTeam_entity/grantUpdateProcess.js</grantUpdateProcess>
   <grantDeleteProcess>%aditoprj%/entity/MSTTeam_entity/grantDeleteProcess.js</grantDeleteProcess>
   <contentTitleProcess>%aditoprj%/entity/MSTTeam_entity/contentTitleProcess.js</contentTitleProcess>
diff --git a/entity/MSTTeam_entity/afterSave.js b/entity/MSTTeam_entity/afterSave.js
index eeeb0cbd2a4..e69de29bb2d 100644
--- a/entity/MSTTeam_entity/afterSave.js
+++ b/entity/MSTTeam_entity/afterSave.js
@@ -1,4 +0,0 @@
-import("system.neon");
-
-//TODO: this should not be necessary, check why the siblings don't work here
-neon.refreshAll();
\ No newline at end of file
diff --git a/entity/MSTeamsActivityImport_entity/MSTeamsActivityImport_entity.aod b/entity/MSTeamsActivityImport_entity/MSTeamsActivityImport_entity.aod
index 82434544226..75900dda74e 100644
--- a/entity/MSTeamsActivityImport_entity/MSTeamsActivityImport_entity.aod
+++ b/entity/MSTeamsActivityImport_entity/MSTeamsActivityImport_entity.aod
@@ -16,8 +16,6 @@
       <selectionMode>MULTI</selectionMode>
       <dependency>
         <name>dependency</name>
-        <entityName>MSTTeamsMessage_entity</entityName>
-        <fieldName>Messages</fieldName>
       </dependency>
       <children>
         <entityParameter>
@@ -84,7 +82,6 @@
       <name>jdito</name>
       <jDitoRecordAlias>Data_alias</jDitoRecordAlias>
       <contentProcess>%aditoprj%/entity/MSTeamsActivityImport_entity/recordcontainers/jdito/contentProcess.js</contentProcess>
-      <onInsert>%aditoprj%/entity/MSTeamsActivityImport_entity/recordcontainers/jdito/onInsert.js</onInsert>
       <recordFieldMappings>
         <jDitoRecordFieldMapping>
           <name>UID.value</name>
diff --git a/entity/MSTeamsActivityImport_entity/entityfields/team_id/valueProcess.js b/entity/MSTeamsActivityImport_entity/entityfields/team_id/valueProcess.js
index 1f7366af28d..c431bd3ac3e 100644
--- a/entity/MSTeamsActivityImport_entity/entityfields/team_id/valueProcess.js
+++ b/entity/MSTeamsActivityImport_entity/entityfields/team_id/valueProcess.js
@@ -1,3 +1,5 @@
+import("system.vars");
+import("MSTeams_lib");
 import("system.result");
 import("Sql_lib");
 
diff --git a/entity/MSTeamsActivityImport_entity/recordcontainers/jdito/onInsert.js b/entity/MSTeamsActivityImport_entity/recordcontainers/jdito/onInsert.js
deleted file mode 100644
index e69de29bb2d..00000000000
diff --git a/entity/Member_entity/Member_entity.aod b/entity/Member_entity/Member_entity.aod
index fea67a119b7..47bf2599e3a 100644
--- a/entity/Member_entity/Member_entity.aod
+++ b/entity/Member_entity/Member_entity.aod
@@ -4,7 +4,9 @@
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <documentation>%aditoprj%/entity/Member_entity/documentation.adoc</documentation>
   <title>${SALESPROJECT_MEMBER}</title>
-  <siblings />
+  <siblings>
+    <element>MSTTeam_entity</element>
+  </siblings>
   <contentTitleProcess>%aditoprj%/entity/Member_entity/contentTitleProcess.js</contentTitleProcess>
   <iconId>VAADIN:FILE_SOUND</iconId>
   <titlePlural>${SALESPROJECT_MEMBER}</titlePlural>
@@ -182,6 +184,12 @@
           <fieldName>MemberConsumer</fieldName>
           <isConsumer v="false" />
         </entityDependency>
+        <entityDependency>
+          <name>d97ada32-2043-4ebb-a53b-1b468cf6ad39</name>
+          <entityName>Salesproject_entity</entityName>
+          <fieldName>Members</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
       </dependencies>
     </entityProvider>
     <entityField>
@@ -202,14 +210,6 @@
     <entityProvider>
       <name>WithDistrictResponsibles</name>
       <recordContainer>jdito</recordContainer>
-      <dependencies>
-        <entityDependency>
-          <name>6f90b6c6-118c-485e-9a41-365bdc325f9b</name>
-          <entityName>Salesproject_entity</entityName>
-          <fieldName>Members</fieldName>
-          <isConsumer v="false" />
-        </entityDependency>
-      </dependencies>
     </entityProvider>
     <entityField>
       <name>UID</name>
diff --git a/entity/Salesproject_entity/Salesproject_entity.aod b/entity/Salesproject_entity/Salesproject_entity.aod
index a04269fdb7a..b2cf87ec299 100644
--- a/entity/Salesproject_entity/Salesproject_entity.aod
+++ b/entity/Salesproject_entity/Salesproject_entity.aod
@@ -7,6 +7,7 @@
   <siblings>
     <element>SalesprojectMilestone_entity</element>
     <element>Member_entity</element>
+    <element>MSTTeam_entity</element>
   </siblings>
   <grantDeleteProcess>%aditoprj%/entity/Salesproject_entity/grantDeleteProcess.js</grantDeleteProcess>
   <contentTitleProcess>%aditoprj%/entity/Salesproject_entity/contentTitleProcess.js</contentTitleProcess>
@@ -258,7 +259,7 @@
       <dependency>
         <name>dependency</name>
         <entityName>Member_entity</entityName>
-        <fieldName>WithDistrictResponsibles</fieldName>
+        <fieldName>Links</fieldName>
       </dependency>
       <children>
         <entityParameter>
-- 
GitLab


From 05135b80f83fa931e490bc7a06c568d2d250fcd7 Mon Sep 17 00:00:00 2001
From: "M.Bilda" <m.bilda@adito.de>
Date: Wed, 16 Sep 2020 11:22:49 +0200
Subject: [PATCH 033/184] Added the SalesprojectCode to the mailnickname for
 MST; Added Documentation; Fixed a Bug in MST Webservice because false
 decoding;

---
 .../MSTChooseTeam_entity/MSTChooseTeam_entity.aod  |  1 +
 entity/MSTChooseTeam_entity/documentation.adoc     | 14 ++++++++++++++
 .../MSTTeamMember_entity/MSTTeamMember_entity.aod  |  2 ++
 entity/MSTTeamMember_entity/documentation.adoc     | 14 ++++++++++++++
 .../entityfields/membersofteam/documentation.adoc  |  3 +++
 entity/MSTTeam_entity/MSTTeam_entity.aod           |  7 ++++++-
 entity/MSTTeam_entity/afterSave.js                 |  0
 entity/MSTTeam_entity/documentation.adoc           | 14 ++++++++++++++
 .../recordcontainers/jdito/onInsert.js             |  1 +
 .../MSTeamsActivityImport_entity.aod               |  3 +++
 .../documentation.adoc                             | 12 ++++++++++++
 .../MSTeamsAddMembers_entity.aod                   |  1 +
 entity/MSTeamsAddMembers_entity/documentation.adoc | 14 ++++++++++++++
 .../MSTeamsChannel_entity.aod                      |  3 +++
 entity/MSTeamsChannel_entity/documentation.adoc    | 14 ++++++++++++++
 .../entityfields/channelsbyname/documentation.adoc |  3 +++
 .../channelsforteam/documentation.adoc             |  3 +++
 .../MSTeamsDocument_entity.aod                     |  1 +
 entity/MSTeamsDocument_entity/documentation.adoc   | 14 ++++++++++++++
 .../MSTeamsMessage_entity.aod                      |  4 ++--
 entity/MSTeamsMessage_entity/documentation.adoc    | 14 ++++++++++++++
 .../entityfields/messages/documentation.adoc       |  3 +++
 entity/Member_entity/Member_entity.aod             |  5 +++++
 .../children/createteam/onActionProcess.js         |  1 +
 entity/Salesproject_entity/Salesproject_entity.aod |  4 ++++
 .../salesprojectcode_param/valueProcess.js         |  4 ++++
 process/mstBot_rest/process.js                     |  7 +++----
 27 files changed, 159 insertions(+), 7 deletions(-)
 create mode 100644 entity/MSTChooseTeam_entity/documentation.adoc
 create mode 100644 entity/MSTTeamMember_entity/documentation.adoc
 create mode 100644 entity/MSTTeamMember_entity/entityfields/membersofteam/documentation.adoc
 delete mode 100644 entity/MSTTeam_entity/afterSave.js
 create mode 100644 entity/MSTTeam_entity/documentation.adoc
 create mode 100644 entity/MSTeamsActivityImport_entity/documentation.adoc
 create mode 100644 entity/MSTeamsAddMembers_entity/documentation.adoc
 create mode 100644 entity/MSTeamsChannel_entity/documentation.adoc
 create mode 100644 entity/MSTeamsChannel_entity/entityfields/channelsbyname/documentation.adoc
 create mode 100644 entity/MSTeamsChannel_entity/entityfields/channelsforteam/documentation.adoc
 create mode 100644 entity/MSTeamsDocument_entity/documentation.adoc
 create mode 100644 entity/MSTeamsMessage_entity/documentation.adoc
 create mode 100644 entity/MSTeamsMessage_entity/entityfields/messages/documentation.adoc
 create mode 100644 entity/Salesproject_entity/entityfields/members/children/salesprojectcode_param/valueProcess.js

diff --git a/entity/MSTChooseTeam_entity/MSTChooseTeam_entity.aod b/entity/MSTChooseTeam_entity/MSTChooseTeam_entity.aod
index ea7e4183dcf..3fe2e3f7e7f 100644
--- a/entity/MSTChooseTeam_entity/MSTChooseTeam_entity.aod
+++ b/entity/MSTChooseTeam_entity/MSTChooseTeam_entity.aod
@@ -2,6 +2,7 @@
 <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>MSTChooseTeam_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
+  <documentation>%aditoprj%/entity/MSTChooseTeam_entity/documentation.adoc</documentation>
   <siblings />
   <recordContainer>jdito</recordContainer>
   <entityFields>
diff --git a/entity/MSTChooseTeam_entity/documentation.adoc b/entity/MSTChooseTeam_entity/documentation.adoc
new file mode 100644
index 00000000000..9c7ade951f5
--- /dev/null
+++ b/entity/MSTChooseTeam_entity/documentation.adoc
@@ -0,0 +1,14 @@
+MSTChooseTeam
+============
+
+== Overview ==
+MSTChooseTeam is used to link any MST team to a sales project 
+
+== A MSTChooseTeam consists of some modules: ==
+- MSTChooseTeam itself
+
+== BestPractice ==
+
+== FAQ ==
+
+
diff --git a/entity/MSTTeamMember_entity/MSTTeamMember_entity.aod b/entity/MSTTeamMember_entity/MSTTeamMember_entity.aod
index c05d6e59bd3..5dfff61a5e6 100644
--- a/entity/MSTTeamMember_entity/MSTTeamMember_entity.aod
+++ b/entity/MSTTeamMember_entity/MSTTeamMember_entity.aod
@@ -2,6 +2,7 @@
 <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>MSTTeamMember_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
+  <documentation>%aditoprj%/entity/MSTTeamMember_entity/documentation.adoc</documentation>
   <siblings />
   <recordContainer>jdito</recordContainer>
   <entityFields>
@@ -66,6 +67,7 @@
     </entityParameter>
     <entityProvider>
       <name>MembersOfTeam</name>
+      <documentation>%aditoprj%/entity/MSTTeamMember_entity/entityfields/membersofteam/documentation.adoc</documentation>
       <titlePlural>Team members</titlePlural>
       <dependencies>
         <entityDependency>
diff --git a/entity/MSTTeamMember_entity/documentation.adoc b/entity/MSTTeamMember_entity/documentation.adoc
new file mode 100644
index 00000000000..31059321e3f
--- /dev/null
+++ b/entity/MSTTeamMember_entity/documentation.adoc
@@ -0,0 +1,14 @@
+MSTTeamMember
+============
+
+== Overview ==
+MSTTeamMember is used to get all members of a MST team
+
+== A MSTTeamMember consists of some modules: ==
+- MSTTeamMember itself
+
+== BestPractice ==
+
+== FAQ ==
+
+
diff --git a/entity/MSTTeamMember_entity/entityfields/membersofteam/documentation.adoc b/entity/MSTTeamMember_entity/entityfields/membersofteam/documentation.adoc
new file mode 100644
index 00000000000..f9cc1fa6dc8
--- /dev/null
+++ b/entity/MSTTeamMember_entity/entityfields/membersofteam/documentation.adoc
@@ -0,0 +1,3 @@
+Provider MembersOfTeam
+
+Provides the members of a team
\ No newline at end of file
diff --git a/entity/MSTTeam_entity/MSTTeam_entity.aod b/entity/MSTTeam_entity/MSTTeam_entity.aod
index 10735e065bf..4d7a5ff463e 100644
--- a/entity/MSTTeam_entity/MSTTeam_entity.aod
+++ b/entity/MSTTeam_entity/MSTTeam_entity.aod
@@ -2,11 +2,11 @@
 <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>MSTTeam_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
+  <documentation>%aditoprj%/entity/MSTTeam_entity/documentation.adoc</documentation>
   <grantUpdateProcess>%aditoprj%/entity/MSTTeam_entity/grantUpdateProcess.js</grantUpdateProcess>
   <grantDeleteProcess>%aditoprj%/entity/MSTTeam_entity/grantDeleteProcess.js</grantDeleteProcess>
   <contentTitleProcess>%aditoprj%/entity/MSTTeam_entity/contentTitleProcess.js</contentTitleProcess>
   <afterUiInit>%aditoprj%/entity/MSTTeam_entity/afterUiInit.js</afterUiInit>
-  <afterSave>%aditoprj%/entity/MSTTeam_entity/afterSave.js</afterSave>
   <recordContainer>jdito</recordContainer>
   <entityFields>
     <entityProvider>
@@ -103,6 +103,11 @@
       <name>#PROVIDER_AGGREGATES</name>
       <useAggregates v="true" />
     </entityProvider>
+    <entityParameter>
+      <name>SalesprojectCode_param</name>
+      <expose v="true" />
+      <description>PARAMETER</description>
+    </entityParameter>
   </entityFields>
   <recordContainers>
     <jDitoRecordContainer>
diff --git a/entity/MSTTeam_entity/afterSave.js b/entity/MSTTeam_entity/afterSave.js
deleted file mode 100644
index e69de29bb2d..00000000000
diff --git a/entity/MSTTeam_entity/documentation.adoc b/entity/MSTTeam_entity/documentation.adoc
new file mode 100644
index 00000000000..1d8ddac0f35
--- /dev/null
+++ b/entity/MSTTeam_entity/documentation.adoc
@@ -0,0 +1,14 @@
+MSTTeam
+============
+
+== Overview ==
+MSTTeam is used to display the linked team. create a team, edit a team
+
+== A MSTTeam consists of some modules: ==
+- MSTTeam itself
+
+== BestPractice ==
+
+== FAQ ==
+
+
diff --git a/entity/MSTTeam_entity/recordcontainers/jdito/onInsert.js b/entity/MSTTeam_entity/recordcontainers/jdito/onInsert.js
index 67814ad72f2..0f208a0331c 100644
--- a/entity/MSTTeam_entity/recordcontainers/jdito/onInsert.js
+++ b/entity/MSTTeam_entity/recordcontainers/jdito/onInsert.js
@@ -48,6 +48,7 @@ var mailNickName = teamName.replace(/(?:^\w|[A-Z]|\b\w|\s+)/g, function(match, i
     if (+match === 0) return ""; // or if (/\s+/.test(match)) for white spaces
     return index === 0 ? match.toLowerCase() : match.toUpperCase();
 });
+mailNickName = mailNickName + vars.get("$param.SalesprojectCode_param");
 
 var groupConfig = teams.createGroupConfig(teamName, mailNickName, ownerIds);
 if (description)
diff --git a/entity/MSTeamsActivityImport_entity/MSTeamsActivityImport_entity.aod b/entity/MSTeamsActivityImport_entity/MSTeamsActivityImport_entity.aod
index 75900dda74e..6a44b2a44c1 100644
--- a/entity/MSTeamsActivityImport_entity/MSTeamsActivityImport_entity.aod
+++ b/entity/MSTeamsActivityImport_entity/MSTeamsActivityImport_entity.aod
@@ -2,6 +2,7 @@
 <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>MSTeamsActivityImport_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
+  <documentation>%aditoprj%/entity/MSTeamsActivityImport_entity/documentation.adoc</documentation>
   <siblings />
   <recordContainer>jdito</recordContainer>
   <entityFields>
@@ -16,6 +17,8 @@
       <selectionMode>MULTI</selectionMode>
       <dependency>
         <name>dependency</name>
+        <entityName>MSTeamsMessage_entity</entityName>
+        <fieldName>Messages</fieldName>
       </dependency>
       <children>
         <entityParameter>
diff --git a/entity/MSTeamsActivityImport_entity/documentation.adoc b/entity/MSTeamsActivityImport_entity/documentation.adoc
new file mode 100644
index 00000000000..e9a7b4eaded
--- /dev/null
+++ b/entity/MSTeamsActivityImport_entity/documentation.adoc
@@ -0,0 +1,12 @@
+MSTTeamsActivityImport
+============
+
+== Overview ==
+MSTTeamsActivityImport is used to import messages from MST  
+
+== A MSTTeamsActivityImport consists of some modules: ==
+- MSTTeamsActivityImport itself
+
+== BestPractice ==
+
+== FAQ ==
\ No newline at end of file
diff --git a/entity/MSTeamsAddMembers_entity/MSTeamsAddMembers_entity.aod b/entity/MSTeamsAddMembers_entity/MSTeamsAddMembers_entity.aod
index d9be6c9f336..b3a788b7b01 100644
--- a/entity/MSTeamsAddMembers_entity/MSTeamsAddMembers_entity.aod
+++ b/entity/MSTeamsAddMembers_entity/MSTeamsAddMembers_entity.aod
@@ -2,6 +2,7 @@
 <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>MSTeamsAddMembers_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
+  <documentation>%aditoprj%/entity/MSTeamsAddMembers_entity/documentation.adoc</documentation>
   <title>Add members</title>
   <siblings />
   <recordContainer>jdito</recordContainer>
diff --git a/entity/MSTeamsAddMembers_entity/documentation.adoc b/entity/MSTeamsAddMembers_entity/documentation.adoc
new file mode 100644
index 00000000000..228acd4d940
--- /dev/null
+++ b/entity/MSTeamsAddMembers_entity/documentation.adoc
@@ -0,0 +1,14 @@
+MSTeamsAddMembers
+============
+
+== Overview ==
+MSTeamsAddMembers is used to add Members 
+
+== A MSTeamsAddMembers consists of some modules: ==
+- MSTeamsAddMembers itself
+
+== BestPractice ==
+
+== FAQ ==
+
+
diff --git a/entity/MSTeamsChannel_entity/MSTeamsChannel_entity.aod b/entity/MSTeamsChannel_entity/MSTeamsChannel_entity.aod
index 0b7cae243a3..819f857c1ae 100644
--- a/entity/MSTeamsChannel_entity/MSTeamsChannel_entity.aod
+++ b/entity/MSTeamsChannel_entity/MSTeamsChannel_entity.aod
@@ -2,6 +2,7 @@
 <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>MSTeamsChannel_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
+  <documentation>%aditoprj%/entity/MSTeamsChannel_entity/documentation.adoc</documentation>
   <title>Channel</title>
   <siblings />
   <contentTitleProcess>%aditoprj%/entity/MSTeamsChannel_entity/contentTitleProcess.js</contentTitleProcess>
@@ -20,6 +21,7 @@
     </entityField>
     <entityProvider>
       <name>ChannelsForTeam</name>
+      <documentation>%aditoprj%/entity/MSTeamsChannel_entity/entityfields/channelsforteam/documentation.adoc</documentation>
       <dependencies>
         <entityDependency>
           <name>a784ee43-b2ef-4d55-a092-9c7f822905fa</name>
@@ -43,6 +45,7 @@
     <entityProvider>
       <name>ChannelsByName</name>
       <lookupIdfield>CHANNELNAME</lookupIdfield>
+      <documentation>%aditoprj%/entity/MSTeamsChannel_entity/entityfields/channelsbyname/documentation.adoc</documentation>
       <dependencies>
         <entityDependency>
           <name>3dfb5be2-d956-4e8a-9aec-4c80b81e0527</name>
diff --git a/entity/MSTeamsChannel_entity/documentation.adoc b/entity/MSTeamsChannel_entity/documentation.adoc
new file mode 100644
index 00000000000..84851137bfe
--- /dev/null
+++ b/entity/MSTeamsChannel_entity/documentation.adoc
@@ -0,0 +1,14 @@
+MSTeamsChannel
+============
+
+== Overview ==
+MSTeamsChannel is used to get all channels of a MST Team 
+
+== A MSTeamsChannel consists of some modules: ==
+- MSTeamsChannel itself
+
+== BestPractice ==
+
+== FAQ ==
+
+
diff --git a/entity/MSTeamsChannel_entity/entityfields/channelsbyname/documentation.adoc b/entity/MSTeamsChannel_entity/entityfields/channelsbyname/documentation.adoc
new file mode 100644
index 00000000000..276b88812f2
--- /dev/null
+++ b/entity/MSTeamsChannel_entity/entityfields/channelsbyname/documentation.adoc
@@ -0,0 +1,3 @@
+Provider ChannelsByName
+
+Gets all channels by their names
\ No newline at end of file
diff --git a/entity/MSTeamsChannel_entity/entityfields/channelsforteam/documentation.adoc b/entity/MSTeamsChannel_entity/entityfields/channelsforteam/documentation.adoc
new file mode 100644
index 00000000000..c8c3ce9e562
--- /dev/null
+++ b/entity/MSTeamsChannel_entity/entityfields/channelsforteam/documentation.adoc
@@ -0,0 +1,3 @@
+Provider ChannelsForTeam
+
+Gets all channels for the specific team
\ No newline at end of file
diff --git a/entity/MSTeamsDocument_entity/MSTeamsDocument_entity.aod b/entity/MSTeamsDocument_entity/MSTeamsDocument_entity.aod
index a3bac6db687..9929c440ae7 100644
--- a/entity/MSTeamsDocument_entity/MSTeamsDocument_entity.aod
+++ b/entity/MSTeamsDocument_entity/MSTeamsDocument_entity.aod
@@ -2,6 +2,7 @@
 <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>MSTeamsDocument_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
+  <documentation>%aditoprj%/entity/MSTeamsDocument_entity/documentation.adoc</documentation>
   <siblings />
   <recordContainer>jdito</recordContainer>
   <entityFields>
diff --git a/entity/MSTeamsDocument_entity/documentation.adoc b/entity/MSTeamsDocument_entity/documentation.adoc
new file mode 100644
index 00000000000..e751b842c92
--- /dev/null
+++ b/entity/MSTeamsDocument_entity/documentation.adoc
@@ -0,0 +1,14 @@
+MSTeamsDocument
+============
+
+== Overview ==
+MSTeamsDocument is used to synchronize all MST Documents with ADITO 
+
+== A MSTeamsDocument consists of some modules: ==
+- MSTeamsDocument itself
+
+== BestPractice ==
+
+== FAQ ==
+
+
diff --git a/entity/MSTeamsMessage_entity/MSTeamsMessage_entity.aod b/entity/MSTeamsMessage_entity/MSTeamsMessage_entity.aod
index 26f7ab7d0cb..d4f61630a7e 100644
--- a/entity/MSTeamsMessage_entity/MSTeamsMessage_entity.aod
+++ b/entity/MSTeamsMessage_entity/MSTeamsMessage_entity.aod
@@ -2,7 +2,7 @@
 <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>MSTeamsMessage_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
-  <siblings />
+  <documentation>%aditoprj%/entity/MSTeamsMessage_entity/documentation.adoc</documentation>
   <recordContainer>jdito</recordContainer>
   <entityFields>
     <entityProvider>
@@ -23,6 +23,7 @@
     </entityField>
     <entityProvider>
       <name>Messages</name>
+      <documentation>%aditoprj%/entity/MSTeamsMessage_entity/entityfields/messages/documentation.adoc</documentation>
       <recordContainer>jdito</recordContainer>
       <dependencies>
         <entityDependency>
@@ -64,7 +65,6 @@
     <jDitoRecordContainer>
       <name>jdito</name>
       <jDitoRecordAlias>Data_alias</jDitoRecordAlias>
-      <contentProcess>%aditoprj%/entity/MSTTeamsMessage_entity/recordcontainers/jdito/contentProcess.js</contentProcess>
       <title>Nachrichten</title>
       <recordFieldMappings>
         <jDitoRecordFieldMapping>
diff --git a/entity/MSTeamsMessage_entity/documentation.adoc b/entity/MSTeamsMessage_entity/documentation.adoc
new file mode 100644
index 00000000000..739a9e5de3c
--- /dev/null
+++ b/entity/MSTeamsMessage_entity/documentation.adoc
@@ -0,0 +1,14 @@
+MSTeamsMessage
+============
+
+== Overview ==
+MSTeamsMessage is used to get the messages written in MST 
+
+== A MSTeamsMessage consists of some modules: ==
+- MSTeamsMessage itself
+
+== BestPractice ==
+
+== FAQ ==
+
+
diff --git a/entity/MSTeamsMessage_entity/entityfields/messages/documentation.adoc b/entity/MSTeamsMessage_entity/entityfields/messages/documentation.adoc
new file mode 100644
index 00000000000..6bcca7fb1e9
--- /dev/null
+++ b/entity/MSTeamsMessage_entity/entityfields/messages/documentation.adoc
@@ -0,0 +1,3 @@
+Provider Messages
+
+Provides the messages for other entities
\ No newline at end of file
diff --git a/entity/Member_entity/Member_entity.aod b/entity/Member_entity/Member_entity.aod
index 47bf2599e3a..854bfe8f3ec 100644
--- a/entity/Member_entity/Member_entity.aod
+++ b/entity/Member_entity/Member_entity.aod
@@ -304,6 +304,11 @@
       <name>EnableMSTeams_param</name>
       <expose v="true" />
     </entityParameter>
+    <entityParameter>
+      <name>SalesprojectCode_param</name>
+      <expose v="true" />
+      <description>PARAMETER</description>
+    </entityParameter>
   </entityFields>
   <recordContainers>
     <dbRecordContainer>
diff --git a/entity/Member_entity/entityfields/msteamsactiongroup/children/createteam/onActionProcess.js b/entity/Member_entity/entityfields/msteamsactiongroup/children/createteam/onActionProcess.js
index cb23d1d3c0b..611e6d39267 100644
--- a/entity/Member_entity/entityfields/msteamsactiongroup/children/createteam/onActionProcess.js
+++ b/entity/Member_entity/entityfields/msteamsactiongroup/children/createteam/onActionProcess.js
@@ -18,6 +18,7 @@ if (objectType === "Salesproject")
         .arrayRow();
     params["TeamName_param"] = teamName;
     params["Description_param"] = description;
+    params["SalesprojectCode_param"] = vars.get("$param.SalesprojectCode_param");
 }
 
 neon.openContext("MSTTeam", null, null, neon.OPERATINGSTATE_NEW, params);
\ No newline at end of file
diff --git a/entity/Salesproject_entity/Salesproject_entity.aod b/entity/Salesproject_entity/Salesproject_entity.aod
index b2cf87ec299..7dd6be49891 100644
--- a/entity/Salesproject_entity/Salesproject_entity.aod
+++ b/entity/Salesproject_entity/Salesproject_entity.aod
@@ -280,6 +280,10 @@
           <name>EnableMSTeams_param</name>
           <valueProcess>%aditoprj%/entity/Salesproject_entity/entityfields/members/children/enablemsteams_param/valueProcess.js</valueProcess>
         </entityParameter>
+        <entityParameter>
+          <name>SalesprojectCode_param</name>
+          <valueProcess>%aditoprj%/entity/Salesproject_entity/entityfields/members/children/salesprojectcode_param/valueProcess.js</valueProcess>
+        </entityParameter>
       </children>
     </entityConsumer>
     <entityActionField>
diff --git a/entity/Salesproject_entity/entityfields/members/children/salesprojectcode_param/valueProcess.js b/entity/Salesproject_entity/entityfields/members/children/salesprojectcode_param/valueProcess.js
new file mode 100644
index 00000000000..598d579e335
--- /dev/null
+++ b/entity/Salesproject_entity/entityfields/members/children/salesprojectcode_param/valueProcess.js
@@ -0,0 +1,4 @@
+import("system.result");
+import("system.vars");
+
+result.string(vars.get("$field.PROJECTCODE"));
\ No newline at end of file
diff --git a/process/mstBot_rest/process.js b/process/mstBot_rest/process.js
index 1b362801118..c93ca1c87aa 100644
--- a/process/mstBot_rest/process.js
+++ b/process/mstBot_rest/process.js
@@ -9,12 +9,11 @@ import("Date_lib");
 
 function restpost(pRequestAsJson)
 {
-    //Umformen, dass man den Body des Requests als JsonFormat Base64 decodiert hat
+     //Umformen, dass man den Body des Requests als JsonFormat Base64 decodiert hat
     var jsonRequest = JSON.parse(pRequestAsJson);
-    logging.log(jsonRequest);
     var body = jsonRequest.body;
-    var decodedBody = util.decodeBase64String(body);
-    var jsonBody = JSON.parse(decodedBody);
+    var jsonBody = JSON.parse(body);
+   
     
     //Nötig, falls dies der InitialRequest ist
     var eventType = jsonBody.channelData.eventType;
-- 
GitLab


From 8ab08a1d5100f0705b05527aa22301dcb6e817c1 Mon Sep 17 00:00:00 2001
From: "j.goderbauer" <j.goderbauer@adito.de>
Date: Wed, 16 Sep 2020 15:09:01 +0200
Subject: [PATCH 034/184] Member_entity: District and MSTeams: insert, edit,
 delete

---
 .../recordcontainers/db/conditionProcess.js     |  6 ++++--
 entity/Member_entity/Member_entity.aod          | 17 ++++++++++++++++-
 entity/Member_entity/documentation.adoc         | 13 ++++++++++++-
 .../entityfields/recordtype/documentation.adoc  |  1 +
 entity/Member_entity/grantDeleteProcess.js      |  5 +++++
 entity/Member_entity/grantUpdateProcess.js      |  5 +++++
 .../recordtype.value/expression.js              |  4 ++++
 .../recordcontainers/jdito/contentProcess.js    |  5 +++--
 .../recordcontainers/jdito/onDelete.js          | 16 ++++++++++++++++
 .../recordcontainers/jdito/onInsert.js          |  1 +
 .../recordcontainers/jdito/onUpdate.js          |  1 +
 .../Salesproject_entity/Salesproject_entity.aod |  2 +-
 neonContext/Member/Member.aod                   |  7 +++++++
 13 files changed, 76 insertions(+), 7 deletions(-)
 create mode 100644 entity/Member_entity/entityfields/recordtype/documentation.adoc
 create mode 100644 entity/Member_entity/grantDeleteProcess.js
 create mode 100644 entity/Member_entity/grantUpdateProcess.js
 create mode 100644 entity/Member_entity/recordcontainers/db/recordfieldmappings/recordtype.value/expression.js
 create mode 100644 entity/Member_entity/recordcontainers/jdito/onDelete.js
 create mode 100644 entity/Member_entity/recordcontainers/jdito/onInsert.js
 create mode 100644 entity/Member_entity/recordcontainers/jdito/onUpdate.js

diff --git a/entity/DistrictResponsible_entity/recordcontainers/db/conditionProcess.js b/entity/DistrictResponsible_entity/recordcontainers/db/conditionProcess.js
index 1942674d0c7..d6118964901 100644
--- a/entity/DistrictResponsible_entity/recordcontainers/db/conditionProcess.js
+++ b/entity/DistrictResponsible_entity/recordcontainers/db/conditionProcess.js
@@ -14,9 +14,11 @@ if (districtId)
 else if(orgUid) 
 {
     var orgDistrictIds = vars.get("$param.CollectedDistrictIds_param");
-    if (orgDistrictIds){
+    if (orgDistrictIds)
+    {
         orgDistrictIds = JSON.parse(orgDistrictIds);
-    cond.and("DISTRICTRESPONSIBLE.DISTRICT_ID", orgDistrictIds, SqlBuilder.IN());
+        if (orgDistrictIds.length > 0)
+            cond.and("DISTRICTRESPONSIBLE.DISTRICT_ID", orgDistrictIds, SqlBuilder.IN());
     }
 }
 
diff --git a/entity/Member_entity/Member_entity.aod b/entity/Member_entity/Member_entity.aod
index 854bfe8f3ec..b0538033f66 100644
--- a/entity/Member_entity/Member_entity.aod
+++ b/entity/Member_entity/Member_entity.aod
@@ -7,6 +7,8 @@
   <siblings>
     <element>MSTTeam_entity</element>
   </siblings>
+  <grantUpdateProcess>%aditoprj%/entity/Member_entity/grantUpdateProcess.js</grantUpdateProcess>
+  <grantDeleteProcess>%aditoprj%/entity/Member_entity/grantDeleteProcess.js</grantDeleteProcess>
   <contentTitleProcess>%aditoprj%/entity/Member_entity/contentTitleProcess.js</contentTitleProcess>
   <iconId>VAADIN:FILE_SOUND</iconId>
   <titlePlural>${SALESPROJECT_MEMBER}</titlePlural>
@@ -43,7 +45,6 @@
     <entityField>
       <name>ORGANISATION_NAME</name>
       <title>Company</title>
-      <state>READONLY</state>
     </entityField>
     <entityField>
       <name>ORG_ORGID</name>
@@ -304,6 +305,10 @@
       <name>EnableMSTeams_param</name>
       <expose v="true" />
     </entityParameter>
+    <entityField>
+      <name>recordType</name>
+      <documentation>%aditoprj%/entity/Member_entity/entityfields/recordtype/documentation.adoc</documentation>
+    </entityField>
     <entityParameter>
       <name>SalesprojectCode_param</name>
       <expose v="true" />
@@ -439,12 +444,19 @@
           <name>MST_MEMBERROLE.value</name>
           <expression>%aditoprj%/entity/Member_entity/recordcontainers/db/recordfieldmappings/mst_memberrole.value/expression.js</expression>
         </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>recordType.value</name>
+          <expression>%aditoprj%/entity/Member_entity/recordcontainers/db/recordfieldmappings/recordtype.value/expression.js</expression>
+        </dbRecordFieldMapping>
       </recordFieldMappings>
     </dbRecordContainer>
     <jDitoRecordContainer>
       <name>jdito</name>
       <jDitoRecordAlias>Data_alias</jDitoRecordAlias>
       <contentProcess>%aditoprj%/entity/Member_entity/recordcontainers/jdito/contentProcess.js</contentProcess>
+      <onInsert>%aditoprj%/entity/Member_entity/recordcontainers/jdito/onInsert.js</onInsert>
+      <onUpdate>%aditoprj%/entity/Member_entity/recordcontainers/jdito/onUpdate.js</onUpdate>
+      <onDelete>%aditoprj%/entity/Member_entity/recordcontainers/jdito/onDelete.js</onDelete>
       <recordFieldMappings>
         <jDitoRecordFieldMapping>
           <name>UID.value</name>
@@ -506,6 +518,9 @@
         <jDitoRecordFieldMapping>
           <name>TARGETCONTEXT.value</name>
         </jDitoRecordFieldMapping>
+        <jDitoRecordFieldMapping>
+          <name>recordType.value</name>
+        </jDitoRecordFieldMapping>
       </recordFieldMappings>
     </jDitoRecordContainer>
   </recordContainers>
diff --git a/entity/Member_entity/documentation.adoc b/entity/Member_entity/documentation.adoc
index 575b84d3290..3ad972dcc80 100644
--- a/entity/Member_entity/documentation.adoc
+++ b/entity/Member_entity/documentation.adoc
@@ -1,3 +1,14 @@
 = Member_entity
 
-Manages the project team in the sales project and in the campaign
\ No newline at end of file
+Manages the project team in the sales project and in the campaign
+
+This entity has two recordContainers:
+
+* db
+* jdito
+
+While for the must purposes the `db`-recordContainer is perfectly fine to use there is one case necessary for the `jdito`-recordContainer:
+
+Salesproject memebers are loaded via the ``-provider and therefor use the `jdito`-recodContainer. This recordContainer first collects the data from
+the `db`-rc and then loads additional memebers of the salesprojects district. The additional members are not modifyable, while those from the
+`db`-rc are.
\ No newline at end of file
diff --git a/entity/Member_entity/entityfields/recordtype/documentation.adoc b/entity/Member_entity/entityfields/recordtype/documentation.adoc
new file mode 100644
index 00000000000..3120dc65c22
--- /dev/null
+++ b/entity/Member_entity/entityfields/recordtype/documentation.adoc
@@ -0,0 +1 @@
+Field to differ between records from the OBJECTMEMBER-table and additional added district-members (only in the jdito-RecordContainer)
\ No newline at end of file
diff --git a/entity/Member_entity/grantDeleteProcess.js b/entity/Member_entity/grantDeleteProcess.js
new file mode 100644
index 00000000000..a494c8292d2
--- /dev/null
+++ b/entity/Member_entity/grantDeleteProcess.js
@@ -0,0 +1,5 @@
+import("system.vars");
+import("system.result");
+
+var res = vars.get("$field.recordType") != "DistrictResponsible";
+result.string(res);
\ No newline at end of file
diff --git a/entity/Member_entity/grantUpdateProcess.js b/entity/Member_entity/grantUpdateProcess.js
new file mode 100644
index 00000000000..a494c8292d2
--- /dev/null
+++ b/entity/Member_entity/grantUpdateProcess.js
@@ -0,0 +1,5 @@
+import("system.vars");
+import("system.result");
+
+var res = vars.get("$field.recordType") != "DistrictResponsible";
+result.string(res);
\ No newline at end of file
diff --git a/entity/Member_entity/recordcontainers/db/recordfieldmappings/recordtype.value/expression.js b/entity/Member_entity/recordcontainers/db/recordfieldmappings/recordtype.value/expression.js
new file mode 100644
index 00000000000..ecce98df0cb
--- /dev/null
+++ b/entity/Member_entity/recordcontainers/db/recordfieldmappings/recordtype.value/expression.js
@@ -0,0 +1,4 @@
+import("system.result");
+
+//this value only differs in the jdito recordContainer
+result.string("'ObjectMember'");
\ No newline at end of file
diff --git a/entity/Member_entity/recordcontainers/jdito/contentProcess.js b/entity/Member_entity/recordcontainers/jdito/contentProcess.js
index b678a96f2fa..7f4c73a178d 100644
--- a/entity/Member_entity/recordcontainers/jdito/contentProcess.js
+++ b/entity/Member_entity/recordcontainers/jdito/contentProcess.js
@@ -13,7 +13,8 @@ var memberLoadingConfig = entities.createConfigForLoadingRows()
                                     .addParameter("ObjectType_param", vars.get("$param.ObjectType_param"))
                                     .fields(["#UID", "CONTACT_ID", "CONTACTROLE", "DEPARTMENT", "ICON", "IMAGE", "MEMBERROLE", "OBJECT_ROWID", "OBJECT_TYPE",
                                                 "OBJECTMEMBERID", "ORG_ORGID", "ORGANISATION_NAME", "PERSON_FIRSTNAME", "PERSON_FULL_NAME", 
-                                                "PERSON_LASTNAME", "PERSON_PERSID", "PERSON_SALUTATION", "PERSON_TITLE", "POSITION", "TARGETCONTEXT"]);
+                                                "PERSON_LASTNAME", "PERSON_PERSID", "PERSON_SALUTATION", "PERSON_TITLE", "POSITION", "TARGETCONTEXT",
+                                                "recordType"]);
 
 if (idValues)
 {
@@ -58,7 +59,7 @@ memberRows = memberRows.map(function(row)
     return [row["#UID"], row["OBJECTMEMBERID"], row["CONTACT_ID"], row["CONTACTROLE"], row["DEPARTMENT"], row["ICON"], row["IMAGE"], row["MEMBERROLE"], row["OBJECT_ROWID"], 
                 row["OBJECT_TYPE"], row["ORG_ORGID"], row["ORGANISATION_NAME"], row["PERSON_FIRSTNAME"], 
                 row["PERSON_FULL_NAME"], row["PERSON_LASTNAME"], row["PERSON_PERSID"], row["PERSON_SALUTATION"], row["PERSON_TITLE"], 
-                row["POSITION"], row["TARGETCONTEXT"]];
+                row["POSITION"], row["TARGETCONTEXT"], row["recordType"]];
 });
 
 var responsibleUids = [];
diff --git a/entity/Member_entity/recordcontainers/jdito/onDelete.js b/entity/Member_entity/recordcontainers/jdito/onDelete.js
new file mode 100644
index 00000000000..91caa64d3c7
--- /dev/null
+++ b/entity/Member_entity/recordcontainers/jdito/onDelete.js
@@ -0,0 +1,16 @@
+import("system.vars");
+import("system.entities");
+
+//While there is no need to implement the insert or update process the delete process needs to be specified because the 
+//contexts viewmodeProvider for the editView only affect insert and update (delete has no view associated)
+//let's do the db-record container the job to remove the record (additional district records can never be removed):
+var rowData = vars.get("$local.rowdata");
+var memberId = rowData["OBJECTMEMBERID.value"];
+if (memberId)
+{
+    var config = entities.createConfigForDeletingRows().entity("Member_entity").uid(memberId);
+    entities.deleteRow(config);
+}
+else
+    throw new Error("Member_entity: Could not delete member entity because the given OBJECTMEMBERID was empty.");
+    
diff --git a/entity/Member_entity/recordcontainers/jdito/onInsert.js b/entity/Member_entity/recordcontainers/jdito/onInsert.js
new file mode 100644
index 00000000000..d86d21c9884
--- /dev/null
+++ b/entity/Member_entity/recordcontainers/jdito/onInsert.js
@@ -0,0 +1 @@
+//No insert code, because it is done in via the contexts viewmodeProvider for the editView
\ No newline at end of file
diff --git a/entity/Member_entity/recordcontainers/jdito/onUpdate.js b/entity/Member_entity/recordcontainers/jdito/onUpdate.js
new file mode 100644
index 00000000000..1e04d32962f
--- /dev/null
+++ b/entity/Member_entity/recordcontainers/jdito/onUpdate.js
@@ -0,0 +1 @@
+//No update code, because it is done in via the contexts viewmodeProvider for the editView
\ No newline at end of file
diff --git a/entity/Salesproject_entity/Salesproject_entity.aod b/entity/Salesproject_entity/Salesproject_entity.aod
index 7dd6be49891..412fcc0f202 100644
--- a/entity/Salesproject_entity/Salesproject_entity.aod
+++ b/entity/Salesproject_entity/Salesproject_entity.aod
@@ -259,7 +259,7 @@
       <dependency>
         <name>dependency</name>
         <entityName>Member_entity</entityName>
-        <fieldName>Links</fieldName>
+        <fieldName>WithDistrictResponsibles</fieldName>
       </dependency>
       <children>
         <entityParameter>
diff --git a/neonContext/Member/Member.aod b/neonContext/Member/Member.aod
index 664965d770c..a2915648a32 100644
--- a/neonContext/Member/Member.aod
+++ b/neonContext/Member/Member.aod
@@ -24,4 +24,11 @@
       <view>MemberLookup_view</view>
     </neonViewReference>
   </references>
+  <viewmodeProvider>
+    <staticContentEntry>
+      <name>editView</name>
+      <key>editView</key>
+      <value>Links</value>
+    </staticContentEntry>
+  </viewmodeProvider>
 </neonContext>
-- 
GitLab


From b2aef50b8cb1dcbcd6a74f6fce6e13f574622edb Mon Sep 17 00:00:00 2001
From: "j.goderbauer" <j.goderbauer@adito.de>
Date: Wed, 16 Sep 2020 15:45:27 +0200
Subject: [PATCH 035/184] MSTeams: Member: validation bugfixing

---
 .../MSTTeamMember_entity.aod                  |  4 ++--
 .../entityfields/invite/mandatoryProcess.js   |  4 ----
 .../entityfields/role/mandatoryProcess.js     |  4 ----
 entity/MSTTeamMember_entity/onValidation.js   | 21 +++++++++++++++++++
 .../recordcontainers/jdito/onUpdate.js        |  2 ++
 .../recordcontainers/jdito/onUpdate.js        | 11 ++++++++--
 6 files changed, 34 insertions(+), 12 deletions(-)
 delete mode 100644 entity/MSTTeamMember_entity/entityfields/invite/mandatoryProcess.js
 delete mode 100644 entity/MSTTeamMember_entity/entityfields/role/mandatoryProcess.js
 create mode 100644 entity/MSTTeamMember_entity/onValidation.js
 create mode 100644 entity/MSTTeamMember_entity/recordcontainers/jdito/onUpdate.js

diff --git a/entity/MSTTeamMember_entity/MSTTeamMember_entity.aod b/entity/MSTTeamMember_entity/MSTTeamMember_entity.aod
index 5dfff61a5e6..4847be9300d 100644
--- a/entity/MSTTeamMember_entity/MSTTeamMember_entity.aod
+++ b/entity/MSTTeamMember_entity/MSTTeamMember_entity.aod
@@ -4,6 +4,7 @@
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <documentation>%aditoprj%/entity/MSTTeamMember_entity/documentation.adoc</documentation>
   <siblings />
+  <onValidation>%aditoprj%/entity/MSTTeamMember_entity/onValidation.js</onValidation>
   <recordContainer>jdito</recordContainer>
   <entityFields>
     <entityProvider>
@@ -89,14 +90,12 @@
     <entityField>
       <name>ROLE</name>
       <title>Role</title>
-      <mandatoryProcess>%aditoprj%/entity/MSTTeamMember_entity/entityfields/role/mandatoryProcess.js</mandatoryProcess>
       <dropDownProcess>%aditoprj%/entity/MSTTeamMember_entity/entityfields/role/dropDownProcess.js</dropDownProcess>
       <stateProcess>%aditoprj%/entity/MSTTeamMember_entity/entityfields/role/stateProcess.js</stateProcess>
     </entityField>
     <entityField>
       <name>INVITE</name>
       <title>Invitation</title>
-      <mandatoryProcess>%aditoprj%/entity/MSTTeamMember_entity/entityfields/invite/mandatoryProcess.js</mandatoryProcess>
       <dropDownProcess>%aditoprj%/entity/MSTTeamMember_entity/entityfields/invite/dropDownProcess.js</dropDownProcess>
       <stateProcess>%aditoprj%/entity/MSTTeamMember_entity/entityfields/invite/stateProcess.js</stateProcess>
     </entityField>
@@ -112,6 +111,7 @@
       <contentProcess>%aditoprj%/entity/MSTTeamMember_entity/recordcontainers/jdito/contentProcess.js</contentProcess>
       <hasDependentRecords v="true" />
       <onInsert>%aditoprj%/entity/MSTTeamMember_entity/recordcontainers/jdito/onInsert.js</onInsert>
+      <onUpdate>%aditoprj%/entity/MSTTeamMember_entity/recordcontainers/jdito/onUpdate.js</onUpdate>
       <onDelete>%aditoprj%/entity/MSTTeamMember_entity/recordcontainers/jdito/onDelete.js</onDelete>
       <recordFieldMappings>
         <jDitoRecordFieldMapping>
diff --git a/entity/MSTTeamMember_entity/entityfields/invite/mandatoryProcess.js b/entity/MSTTeamMember_entity/entityfields/invite/mandatoryProcess.js
deleted file mode 100644
index 5d086208537..00000000000
--- a/entity/MSTTeamMember_entity/entityfields/invite/mandatoryProcess.js
+++ /dev/null
@@ -1,4 +0,0 @@
-import("system.result");
-import("system.vars");
-
-result.string(!vars.get("$field.MEMBERNAME") && vars.get("$field.ISEXTERN") == "true");
\ No newline at end of file
diff --git a/entity/MSTTeamMember_entity/entityfields/role/mandatoryProcess.js b/entity/MSTTeamMember_entity/entityfields/role/mandatoryProcess.js
deleted file mode 100644
index 5015e9937f4..00000000000
--- a/entity/MSTTeamMember_entity/entityfields/role/mandatoryProcess.js
+++ /dev/null
@@ -1,4 +0,0 @@
-import("system.result");
-import("system.vars");
-
-result.string(vars.get("$field.ISEXTERN") != "true");
\ No newline at end of file
diff --git a/entity/MSTTeamMember_entity/onValidation.js b/entity/MSTTeamMember_entity/onValidation.js
new file mode 100644
index 00000000000..9db830c5c67
--- /dev/null
+++ b/entity/MSTTeamMember_entity/onValidation.js
@@ -0,0 +1,21 @@
+import("system.translate");
+import("system.result");
+import("system.vars");
+
+var isExtern = vars.getString("$field.ISEXTERN") == "true";
+var res;
+
+if (vars.get("$field.CONTACT_ID"))
+{
+    if (isExtern && !vars.get("$field.INVITE"))
+    {
+        res = translate.withArguments("Required value for %0 is missing", [vars.get("$property.INVITE.title")]);
+    }
+    else if(!isExtern && !vars.get("$field.ROLE"))
+    {
+        res = translate.withArguments("Required value for %0 is missing", [vars.get("$property.ROLE.title")]);
+    }
+}
+
+if (res)
+    result.string(res);
\ No newline at end of file
diff --git a/entity/MSTTeamMember_entity/recordcontainers/jdito/onUpdate.js b/entity/MSTTeamMember_entity/recordcontainers/jdito/onUpdate.js
new file mode 100644
index 00000000000..1df92b6ad9e
--- /dev/null
+++ b/entity/MSTTeamMember_entity/recordcontainers/jdito/onUpdate.js
@@ -0,0 +1,2 @@
+//updating is done in the MSTTeam_entity
+var dummy = "dummy";
\ No newline at end of file
diff --git a/entity/MSTTeam_entity/recordcontainers/jdito/onUpdate.js b/entity/MSTTeam_entity/recordcontainers/jdito/onUpdate.js
index 9219ab01d69..07569b024b8 100644
--- a/entity/MSTTeam_entity/recordcontainers/jdito/onUpdate.js
+++ b/entity/MSTTeam_entity/recordcontainers/jdito/onUpdate.js
@@ -10,12 +10,12 @@ var teamId = rowData["UID.value"];
 var teamName = rowData["TEAMNAME.value"];
 var description = rowData["DESCRIPTION.value"];
 var insertedTeamMembers = vars.get("$field.TeamMembers.insertedRows");
+var changedTeamMembers = vars.get("$field.TeamMembers.changedRows");
 var deletedTeamMembers = vars.get("$field.TeamMembers.deletedRows");
 
 var internalMembers = [];
 var externalMembers = [];
-insertedTeamMembers.forEach(function (teamMember)
-{
+insertedTeamMembers.forEach(function (teamMember){
     var memberUser = EmployeeUtils.getUserByContactId(teamMember["CONTACT_ID"]);
     if (!memberUser)
     {
@@ -45,6 +45,13 @@ if (internalMembers.length !== 0)
 if (externalMembers.length !== 0)
     teams.addExternalMembers(teamId, externalMembers);
 
+changedTeamMembers.forEach(function (teamMember){
+    var memberUser = EmployeeUtils.getUserByContactId(teamMember["CONTACT_ID"]);
+    
+    //teams.changeRole(teamId, );
+});
+
+
 var owners = teams.getAllOwners(teamId);
 var removeMembers = deletedTeamMembers.map(function (member)
 {
-- 
GitLab


From 64dda83e150af2097f4895f75d2248b55462e1f4 Mon Sep 17 00:00:00 2001
From: "j.goderbauer" <j.goderbauer@adito.de>
Date: Wed, 16 Sep 2020 16:07:34 +0200
Subject: [PATCH 036/184] MSTeams: Member: change role for internal member

---
 .../recordcontainers/jdito/onUpdate.js        | 33 +++++++++++++------
 1 file changed, 23 insertions(+), 10 deletions(-)

diff --git a/entity/MSTTeam_entity/recordcontainers/jdito/onUpdate.js b/entity/MSTTeam_entity/recordcontainers/jdito/onUpdate.js
index 07569b024b8..f55e08ec25b 100644
--- a/entity/MSTTeam_entity/recordcontainers/jdito/onUpdate.js
+++ b/entity/MSTTeam_entity/recordcontainers/jdito/onUpdate.js
@@ -29,14 +29,9 @@ insertedTeamMembers.forEach(function (teamMember){
         }
         return;
     }
-    var memberAzureId = memberUser[tools.PARAMS][tools.TEAMS_AZUREID];
-    var memberUpn = memberUser[tools.PARAMS][tools.TEAMS_AZUREUPN];
-    if (!memberAzureId && memberUpn)
-        memberAzureId = teams.getInternalAzureId(memberUpn);
-    if (memberAzureId)
-    {
-        internalMembers.push(teams.createInternalUserConfig(memberAzureId).setOwner(teamMember["ROLE"] == "owner"));
-    }
+    var internalUserConfigToAdd = _getTeamsInternalUserConfig(memberUser, teamMember["ROLE"] == "owner");
+    if (internalUserConfigToAdd)
+        internalMembers.push(internalUserConfigToAdd);
 });
 
 if (internalMembers.length !== 0)
@@ -47,8 +42,13 @@ if (externalMembers.length !== 0)
 
 changedTeamMembers.forEach(function (teamMember){
     var memberUser = EmployeeUtils.getUserByContactId(teamMember["CONTACT_ID"]);
+    if (!memberUser)
+        return null;
     
-    //teams.changeRole(teamId, );
+    var internalUserConfigToChange = _getTeamsInternalUserConfig(memberUser, teamMember["ROLE"] == "owner");
+    if (internalUserConfigToChange)
+        teams.changeRole(teamId, internalUserConfigToChange);
+    return null;//prevent designer warning
 });
 
 
@@ -60,4 +60,17 @@ var removeMembers = deletedTeamMembers.map(function (member)
 });
 
 if (removeMembers.length !== 0)
-    teams.removeInternalMembers(teamId, removeMembers);
\ No newline at end of file
+    teams.removeInternalMembers(teamId, removeMembers);
+
+function _getTeamsInternalUserConfig(pUserObject, pAsOwner)
+{
+    var memberAzureId = pUserObject[tools.PARAMS][tools.TEAMS_AZUREID];
+    var memberUpn = pUserObject[tools.PARAMS][tools.TEAMS_AZUREUPN];
+    if (!memberAzureId && memberUpn)
+        memberAzureId = teams.getInternalAzureId(memberUpn);
+    if (memberAzureId)
+    {
+        return teams.createInternalUserConfig(memberAzureId).setOwner(pAsOwner);
+    }
+    return null;
+}
\ No newline at end of file
-- 
GitLab


From d84c7ec3f2525ade7324c170512be1930597dcef Mon Sep 17 00:00:00 2001
From: "j.goderbauer" <j.goderbauer@adito.de>
Date: Wed, 16 Sep 2020 16:21:25 +0200
Subject: [PATCH 037/184] MSTeams: disabling should hide all fields

---
 entity/Member_entity/Member_entity.aod        |  5 ---
 .../children/addapp/stateProcess.js           | 36 +++++++++++--------
 .../children/changetomsteam/stateProcess.js   | 30 +++++++++-------
 .../children/deleteteam/stateProcess.js       | 34 +++++++++++-------
 .../children/editteam/stateProcess.js         | 34 +++++++++++-------
 .../children/restoreteam/stateProcess.js      | 33 +++++++++++------
 .../Salesproject_entity.aod                   |  2 +-
 .../mst_team_id/displayValueProcess.js        | 16 ++++++---
 .../entityfields/mst_team_id/stateProcess.js  |  8 ++++-
 9 files changed, 125 insertions(+), 73 deletions(-)

diff --git a/entity/Member_entity/Member_entity.aod b/entity/Member_entity/Member_entity.aod
index b0538033f66..f30e99f773a 100644
--- a/entity/Member_entity/Member_entity.aod
+++ b/entity/Member_entity/Member_entity.aod
@@ -229,7 +229,6 @@
           <iconId>NEON:PLUS</iconId>
           <state>EDITABLE</state>
           <stateProcess>%aditoprj%/entity/Member_entity/entityfields/msteamsactiongroup/children/createteam/stateProcess.js</stateProcess>
-          <tooltip>Erstelle ein neues MicrosoftTeams Team</tooltip>
         </entityActionField>
         <entityActionField>
           <name>editTeam</name>
@@ -244,7 +243,6 @@
           <onActionProcess>%aditoprj%/entity/Member_entity/entityfields/msteamsactiongroup/children/addapp/onActionProcess.js</onActionProcess>
           <iconId>VAADIN:MOBILE</iconId>
           <stateProcess>%aditoprj%/entity/Member_entity/entityfields/msteamsactiongroup/children/addapp/stateProcess.js</stateProcess>
-          <tooltip>Adds the MST ADITO App to the MSTTeam</tooltip>
         </entityActionField>
         <entityActionField>
           <name>chooseTeam</name>
@@ -252,7 +250,6 @@
           <onActionProcess>%aditoprj%/entity/Member_entity/entityfields/msteamsactiongroup/children/chooseteam/onActionProcess.js</onActionProcess>
           <iconId>NEON:GROUP_APPOINTMENT</iconId>
           <stateProcess>%aditoprj%/entity/Member_entity/entityfields/msteamsactiongroup/children/chooseteam/stateProcess.js</stateProcess>
-          <tooltip>Wähle ein bereits hinterlegtes Team</tooltip>
         </entityActionField>
         <entityActionField>
           <name>restoreTeam</name>
@@ -260,7 +257,6 @@
           <onActionProcess>%aditoprj%/entity/Member_entity/entityfields/msteamsactiongroup/children/restoreteam/onActionProcess.js</onActionProcess>
           <iconId>VAADIN:ARROW_BACKWARD</iconId>
           <stateProcess>%aditoprj%/entity/Member_entity/entityfields/msteamsactiongroup/children/restoreteam/stateProcess.js</stateProcess>
-          <tooltip>Stelle das Team wieder her</tooltip>
         </entityActionField>
         <entityActionField>
           <name>changeToMSTeam</name>
@@ -275,7 +271,6 @@
           <onActionProcess>%aditoprj%/entity/Member_entity/entityfields/msteamsactiongroup/children/deleteteam/onActionProcess.js</onActionProcess>
           <iconId>NEON:TRASH</iconId>
           <stateProcess>%aditoprj%/entity/Member_entity/entityfields/msteamsactiongroup/children/deleteteam/stateProcess.js</stateProcess>
-          <tooltip>Lösche das verknüpfte MSTeams Team</tooltip>
         </entityActionField>
       </children>
     </entityActionGroup>
diff --git a/entity/Member_entity/entityfields/msteamsactiongroup/children/addapp/stateProcess.js b/entity/Member_entity/entityfields/msteamsactiongroup/children/addapp/stateProcess.js
index 2446336fdb5..8c22d355887 100644
--- a/entity/Member_entity/entityfields/msteamsactiongroup/children/addapp/stateProcess.js
+++ b/entity/Member_entity/entityfields/msteamsactiongroup/children/addapp/stateProcess.js
@@ -1,25 +1,31 @@
+import("MSTeams_lib");
 import("system.vars");
 import("system.neon");
 import("system.result");
 import("Sql_lib");
 
+var res = neon.COMPONENTSTATE_DISABLED;
 var teamId = vars.exists("$param.MSTTeamId_param") ? vars.get("$param.MSTTeamId_param") : null;
+if (teamId && MSTeamsUtils.isTeamsEnabled())
+{    
+    var isArchived, serviceUrl;
+    var teamData = newSelect("IS_ARCHIVED, SERVICE_URL")
+        .from("MST_TEAM")
+        .whereIfSet("MST_TEAM.MST_TEAMID", teamId)
+        .arrayRow(true);
 
-var isArchived, serviceUrl;
-var teamData = newSelect("IS_ARCHIVED, SERVICE_URL")
-    .from("MST_TEAM")
-    .whereIfSet("MST_TEAM.MST_TEAMID", teamId)
-    .arrayRow(true);
+    if (teamData)
+        [isArchived, serviceUrl] = teamData;
 
-if (teamData)
-    [isArchived, serviceUrl] = teamData;
 
-    
-if (teamId == "" || isArchived == 1 || serviceUrl) 
-{
-    result.string(neon.COMPONENTSTATE_DISABLED);
+    if (isArchived == 1 || serviceUrl) 
+    {
+        res = neon.COMPONENTSTATE_DISABLED;
+    }
+    else
+    {
+        res = neon.COMPONENTSTATE_EDITABLE;
+    }
 }
-else
-{
-    result.string(neon.COMPONENTSTATE_EDITABLE);
-}
\ No newline at end of file
+
+result.string(res);
\ No newline at end of file
diff --git a/entity/Member_entity/entityfields/msteamsactiongroup/children/changetomsteam/stateProcess.js b/entity/Member_entity/entityfields/msteamsactiongroup/children/changetomsteam/stateProcess.js
index 5a91fdde73f..43b7cdd5ead 100644
--- a/entity/Member_entity/entityfields/msteamsactiongroup/children/changetomsteam/stateProcess.js
+++ b/entity/Member_entity/entityfields/msteamsactiongroup/children/changetomsteam/stateProcess.js
@@ -1,20 +1,26 @@
+import("MSTeams_lib");
 import("system.vars");
 import("system.neon");
 import("system.result");
 import("Sql_lib");
 
+var res = neon.COMPONENTSTATE_DISABLED;
 var teamId = vars.exists("$param.MSTTeamId_param") ? vars.get("$param.MSTTeamId_param") : null;
-
-var isArchived = newSelect("IS_ARCHIVED")
-    .from("MST_TEAM")
-    .whereIfSet("MST_TEAM.MST_TEAMID", teamId)
-    .cell(true);
+if (teamId && MSTeamsUtils.isTeamsEnabled())
+{    
+    var isArchived = newSelect("IS_ARCHIVED")
+        .from("MST_TEAM")
+        .whereIfSet("MST_TEAM.MST_TEAMID", teamId)
+        .cell(true);
     
-if (teamId == "" || isArchived == 1) 
-{
-    result.string(neon.COMPONENTSTATE_DISABLED);
+    if (isArchived == 1) 
+    {
+        res = neon.COMPONENTSTATE_DISABLED;
+    }
+    else
+    {
+        res = neon.COMPONENTSTATE_EDITABLE;
+    }
 }
-else
-{
-    result.string(neon.COMPONENTSTATE_EDITABLE);
-}
\ No newline at end of file
+
+result.string(res);
\ No newline at end of file
diff --git a/entity/Member_entity/entityfields/msteamsactiongroup/children/deleteteam/stateProcess.js b/entity/Member_entity/entityfields/msteamsactiongroup/children/deleteteam/stateProcess.js
index d1432e9d7c5..ff7327ea214 100644
--- a/entity/Member_entity/entityfields/msteamsactiongroup/children/deleteteam/stateProcess.js
+++ b/entity/Member_entity/entityfields/msteamsactiongroup/children/deleteteam/stateProcess.js
@@ -1,21 +1,31 @@
+import("MSTeams_lib");
 import("system.vars");
 import("system.neon");
 import("system.result");
 import("Sql_lib");
-import("MSTeams_lib");
 
+var res = neon.COMPONENTSTATE_DISABLED;
 var teamId = vars.exists("$param.MSTTeamId_param") ? vars.get("$param.MSTTeamId_param") : null;
-
-var isArchived = newSelect("IS_ARCHIVED")
+if (teamId && MSTeamsUtils.isTeamsEnabled())
+{    
+    var isArchived, serviceUrl;
+    var teamData = newSelect("IS_ARCHIVED, SERVICE_URL")
     .from("MST_TEAM")
     .whereIfSet("MST_TEAM.MST_TEAMID", teamId)
-    .cell(true);
-    
-if (!teamId || isArchived == 1 || !MSTeamsUtils.isUserTeamOwner(teamId)) 
-{
-    result.string(neon.COMPONENTSTATE_DISABLED);
+    .arrayRow(true);
+
+    if (teamData)
+        [isArchived, serviceUrl] = teamData;
+
+
+    if (isArchived == 1 || serviceUrl || !MSTeamsUtils.isUserTeamOwner(teamId)) 
+    {
+        res = neon.COMPONENTSTATE_DISABLED;
+    }
+    else
+    {
+        res = neon.COMPONENTSTATE_EDITABLE;
+    }
 }
-else
-{
-    result.string(neon.COMPONENTSTATE_EDITABLE);
-}
\ No newline at end of file
+
+result.string(res);
\ No newline at end of file
diff --git a/entity/Member_entity/entityfields/msteamsactiongroup/children/editteam/stateProcess.js b/entity/Member_entity/entityfields/msteamsactiongroup/children/editteam/stateProcess.js
index d1432e9d7c5..19d44a29c7a 100644
--- a/entity/Member_entity/entityfields/msteamsactiongroup/children/editteam/stateProcess.js
+++ b/entity/Member_entity/entityfields/msteamsactiongroup/children/editteam/stateProcess.js
@@ -1,21 +1,31 @@
+import("MSTeams_lib");
 import("system.vars");
 import("system.neon");
 import("system.result");
 import("Sql_lib");
-import("MSTeams_lib");
 
+var res = neon.COMPONENTSTATE_DISABLED;
 var teamId = vars.exists("$param.MSTTeamId_param") ? vars.get("$param.MSTTeamId_param") : null;
-
-var isArchived = newSelect("IS_ARCHIVED")
+if (teamId && MSTeamsUtils.isTeamsEnabled())
+{    
+    var isArchived, serviceUrl;
+    var teamData = newSelect("IS_ARCHIVED, SERVICE_URL")
     .from("MST_TEAM")
     .whereIfSet("MST_TEAM.MST_TEAMID", teamId)
-    .cell(true);
-    
-if (!teamId || isArchived == 1 || !MSTeamsUtils.isUserTeamOwner(teamId)) 
-{
-    result.string(neon.COMPONENTSTATE_DISABLED);
+    .arrayRow(true);
+
+    if (teamData)
+        [isArchived, serviceUrl] = teamData;
+
+
+    if (isArchived == 1 || !MSTeamsUtils.isUserTeamOwner(teamId)) 
+    {
+        res = neon.COMPONENTSTATE_DISABLED;
+    }
+    else
+    {
+        res = neon.COMPONENTSTATE_EDITABLE;
+    }
 }
-else
-{
-    result.string(neon.COMPONENTSTATE_EDITABLE);
-}
\ No newline at end of file
+
+result.string(res);
\ No newline at end of file
diff --git a/entity/Member_entity/entityfields/msteamsactiongroup/children/restoreteam/stateProcess.js b/entity/Member_entity/entityfields/msteamsactiongroup/children/restoreteam/stateProcess.js
index 97ff04f9a94..f6f0a5da097 100644
--- a/entity/Member_entity/entityfields/msteamsactiongroup/children/restoreteam/stateProcess.js
+++ b/entity/Member_entity/entityfields/msteamsactiongroup/children/restoreteam/stateProcess.js
@@ -1,20 +1,31 @@
+import("MSTeams_lib");
 import("system.vars");
 import("system.neon");
 import("system.result");
 import("Sql_lib");
 
+var res = neon.COMPONENTSTATE_DISABLED;
 var teamId = vars.exists("$param.MSTTeamId_param") ? vars.get("$param.MSTTeamId_param") : null;
-
-var isArchived = newSelect("IS_ARCHIVED")
+if (teamId && MSTeamsUtils.isTeamsEnabled())
+{    
+    var isArchived, serviceUrl;
+    var teamData = newSelect("IS_ARCHIVED, SERVICE_URL")
     .from("MST_TEAM")
     .whereIfSet("MST_TEAM.MST_TEAMID", teamId)
-    .cell(true);
-    
-if (teamId == "" || isArchived == 0) 
-{
-    result.string(neon.COMPONENTSTATE_DISABLED);
+    .arrayRow(true);
+
+    if (teamData)
+        [isArchived, serviceUrl] = teamData;
+
+
+    if (isArchived == 0) 
+    {
+        res = neon.COMPONENTSTATE_DISABLED;
+    }
+    else
+    {
+        res = neon.COMPONENTSTATE_EDITABLE;
+    }
 }
-else
-{
-    result.string(neon.COMPONENTSTATE_EDITABLE);
-}
\ No newline at end of file
+
+result.string(res);
\ No newline at end of file
diff --git a/entity/Salesproject_entity/Salesproject_entity.aod b/entity/Salesproject_entity/Salesproject_entity.aod
index 412fcc0f202..1d915910da7 100644
--- a/entity/Salesproject_entity/Salesproject_entity.aod
+++ b/entity/Salesproject_entity/Salesproject_entity.aod
@@ -754,7 +754,7 @@
       <name>MST_TEAM_ID</name>
       <title>Teams group</title>
       <linkedContext>MSTTeam</linkedContext>
-      <state>READONLY</state>
+      <state>INVISIBLE</state>
       <stateProcess>%aditoprj%/entity/Salesproject_entity/entityfields/mst_team_id/stateProcess.js</stateProcess>
       <displayValueProcess>%aditoprj%/entity/Salesproject_entity/entityfields/mst_team_id/displayValueProcess.js</displayValueProcess>
     </entityField>
diff --git a/entity/Salesproject_entity/entityfields/mst_team_id/displayValueProcess.js b/entity/Salesproject_entity/entityfields/mst_team_id/displayValueProcess.js
index daf9387bb01..14271e09111 100644
--- a/entity/Salesproject_entity/entityfields/mst_team_id/displayValueProcess.js
+++ b/entity/Salesproject_entity/entityfields/mst_team_id/displayValueProcess.js
@@ -1,7 +1,15 @@
+import("MSTeams_lib");
 import("system.result");
 import("Sql_lib");
 
-result.string(newSelect("TEAMNAME")
-    .from("MST_TEAM")
-    .whereIfSet("MST_TEAM.MST_TEAMID", "$field.MST_TEAM_ID")
-    .cell(true));
\ No newline at end of file
+var res;
+
+if (MSTeamsUtils.isTeamsEnabled())
+    res = newSelect("TEAMNAME")
+        .from("MST_TEAM")
+        .whereIfSet("MST_TEAM.MST_TEAMID", "$field.MST_TEAM_ID")
+        .cell(true);
+else
+    res = "";
+
+result.string(res);
\ No newline at end of file
diff --git a/entity/Salesproject_entity/entityfields/mst_team_id/stateProcess.js b/entity/Salesproject_entity/entityfields/mst_team_id/stateProcess.js
index ddf69aa437e..0a84b37c599 100644
--- a/entity/Salesproject_entity/entityfields/mst_team_id/stateProcess.js
+++ b/entity/Salesproject_entity/entityfields/mst_team_id/stateProcess.js
@@ -1,5 +1,11 @@
+import("MSTeams_lib");
 import("system.result");
 import("system.vars");
 import("system.neon");
 
-result.string(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_EDIT ? neon.COMPONENTSTATE_INVISIBLE : neon.COMPONENTSTATE_READONLY);
\ No newline at end of file
+var res = neon.COMPONENTSTATE_INVISIBLE;
+var recordState = vars.get("$sys.recordstate");
+if (MSTeamsUtils.isTeamsEnabled() && recordState != neon.OPERATINGSTATE_NEW && recordState != neon.OPERATINGSTATE_EDIT)
+    res = neon.COMPONENTSTATE_READONLY;
+    
+result.string(res);
\ No newline at end of file
-- 
GitLab


From 8160879a26eae28b5bca0e635148d4ab83eddea0 Mon Sep 17 00:00:00 2001
From: "b.ulrich" <b.ulrich@adito.de>
Date: Thu, 8 Oct 2020 14:48:13 +0200
Subject: [PATCH 038/184] [Projekt: Entwicklung - Neon][TicketNr.:
 1065877][Mahnung - Tippfehler im Beleg]

---
 .../_____LANGUAGE_de/_____LANGUAGE_de.aod     |  4 +-
 report/Reminder_report/reportData.jrxml       | 54 +++++++++----------
 2 files changed, 29 insertions(+), 29 deletions(-)

diff --git a/language/_____LANGUAGE_de/_____LANGUAGE_de.aod b/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
index f2aba5d40f0..b5c2b894568 100644
--- a/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
+++ b/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
@@ -6548,7 +6548,7 @@
     </entry>
     <entry>
       <key>Order number</key>
-      <value>Belegsnummer</value>
+      <value>Belegnummer</value>
     </entry>
     <entry>
       <key>Permission Action</key>
@@ -6576,7 +6576,7 @@
     </entry>
     <entry>
       <key>Order date</key>
-      <value>Belegsdatum</value>
+      <value>Belegdatum</value>
     </entry>
     <entry>
       <key>Due date</key>
diff --git a/report/Reminder_report/reportData.jrxml b/report/Reminder_report/reportData.jrxml
index 5e0e92752af..0c3b01764e3 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="144"/>
+	<property name="ireport.y" value="339"/>
 	<parameter name="myAddr" class="java.lang.String"/>
 	<parameter name="Kontenabstimmung" class="java.lang.String"/>
 	<parameter name="Rech.-Nr" class="java.lang.String"/>
@@ -41,28 +41,28 @@
 				<textField>
 					<reportElement x="13" y="0" width="68" height="15" uuid="0a515534-8d2a-4e3e-9370-6cac4c65ef68"/>
 					<textElement>
-						<font  size="8"/>
+						<font size="8"/>
 					</textElement>
 					<textFieldExpression><![CDATA[$P{Ordernumber}]]></textFieldExpression>
 				</textField>
 				<textField>
 					<reportElement x="104" y="0" width="63" height="15" uuid="87fc2f40-ffdc-47d5-9fd8-7a8caf821114"/>
 					<textElement>
-						<font  size="8"/>
+						<font size="8"/>
 					</textElement>
 					<textFieldExpression><![CDATA[$P{Orderdate}]]></textFieldExpression>
 				</textField>
 				<textField>
-					<reportElement x="202" y="0" width="62" height="15" uuid="86eacb27-6bb5-4ce8-b8cf-c3f0993380ad"/>
+					<reportElement x="202" y="0" width="76" height="15" uuid="86eacb27-6bb5-4ce8-b8cf-c3f0993380ad"/>
 					<textElement>
-						<font  size="8"/>
+						<font size="8"/>
 					</textElement>
 					<textFieldExpression><![CDATA[$P{DueDate}]]></textFieldExpression>
 				</textField>
 				<textField>
 					<reportElement x="429" y="0" width="59" height="15" uuid="62a0909f-ef03-4242-969a-8a9532d1aa9a"/>
 					<textElement textAlignment="Right">
-						<font  size="8"/>
+						<font size="8"/>
 					</textElement>
 					<textFieldExpression><![CDATA[$P{Due}]]></textFieldExpression>
 				</textField>
@@ -72,58 +72,58 @@
 				<textField>
 					<reportElement x="104" y="36" width="64" height="15" uuid="ca4c366a-1954-4aee-91c4-05c093b04df5"/>
 					<textElement>
-						<font  size="8"/>
+						<font size="8"/>
 					</textElement>
 					<textFieldExpression><![CDATA[$F{ORDERDATE}]]></textFieldExpression>
 				</textField>
 				<textField>
 					<reportElement x="13" y="36" width="68" height="15" uuid="3fcb3ee0-fe4d-409e-8cb8-7a0e6ceca5ab"/>
 					<textElement>
-						<font  size="8"/>
+						<font size="8"/>
 					</textElement>
 					<textFieldExpression><![CDATA[$F{ORDERCODE}]]></textFieldExpression>
 				</textField>
 				<textField>
 					<reportElement x="202" y="36" width="62" height="15" uuid="b5e006cf-5d37-42a1-bf74-0b49d3a39b27"/>
 					<textElement>
-						<font  size="8"/>
+						<font size="8"/>
 					</textElement>
 					<textFieldExpression><![CDATA[$F{DUEDATE}]]></textFieldExpression>
 				</textField>
 				<textField>
 					<reportElement x="428" y="36" width="60" height="15" uuid="d57eeb7b-f517-4c85-a925-cdc3c1ea0830"/>
 					<textElement textAlignment="Right">
-						<font  size="8" isBold="true"/>
+						<font size="8" isBold="true"/>
 					</textElement>
 					<textFieldExpression><![CDATA[$F{OFFEN}]]></textFieldExpression>
 				</textField>
 				<textField>
-					<reportElement x="307" y="35" width="56" height="15" uuid="72a49ece-7fc0-4cd7-a00c-94580845d150"/>
+					<reportElement x="332" y="35" width="56" height="15" uuid="72a49ece-7fc0-4cd7-a00c-94580845d150"/>
 					<textElement textAlignment="Right">
-						<font  size="8"/>
+						<font size="8"/>
 					</textElement>
 					<textFieldExpression><![CDATA[$F{BRUTTO}]]></textFieldExpression>
 				</textField>
 				<textField>
-					<reportElement x="307" y="15" width="56" height="15" uuid="a991ccab-0b04-4550-bbd2-2033a5fad0f0"/>
+					<reportElement x="332" y="15" width="56" height="15" uuid="a991ccab-0b04-4550-bbd2-2033a5fad0f0"/>
 					<textElement textAlignment="Right">
-						<font  size="8"/>
+						<font size="8"/>
 					</textElement>
 					<textFieldExpression><![CDATA[$F{CURRENCY}]]></textFieldExpression>
 				</textField>
 				<textField>
 					<reportElement x="429" y="15" width="59" height="15" uuid="8e257160-536a-418a-b9df-80fa020268b8"/>
 					<textElement textAlignment="Right">
-						<font  size="8"/>
+						<font size="8"/>
 					</textElement>
 					<textFieldExpression><![CDATA[$F{CURRENCY}]]></textFieldExpression>
 				</textField>
 				<textField>
-					<reportElement x="326" y="0" width="62" height="15" uuid="000feb72-9b7d-42e6-ade9-8e12359c3eef"/>
+					<reportElement x="307" y="0" width="81" height="15" uuid="000feb72-9b7d-42e6-ade9-8e12359c3eef"/>
 					<textElement>
-						<font  size="8"/>
+						<font size="8"/>
 					</textElement>
-					<textFieldExpression><![CDATA[$R{Rech.-Betrag}]]></textFieldExpression>
+					<textFieldExpression><![CDATA[$R{Rechnungsbetrag}]]></textFieldExpression>
 				</textField>
 			</band>
 		</groupHeader>
@@ -140,7 +140,7 @@
 			<textField>
 				<reportElement x="13" y="88" width="527" height="20" forecolor="#000000" uuid="a47fa80c-6b70-4c8a-938d-3d44273b1ffb"/>
 				<textElement textAlignment="Center" verticalAlignment="Middle">
-					<font  size="8"/>
+					<font size="8"/>
 				</textElement>
 				<textFieldExpression><![CDATA[$P{Address}]]></textFieldExpression>
 			</textField>
@@ -157,35 +157,35 @@
 			<textField isStretchWithOverflow="true">
 				<reportElement x="13" y="122" width="152" height="20" uuid="c8514bfb-5e34-43f4-a256-7899cb58f0c1"/>
 				<textElement>
-					<font  size="8"/>
+					<font size="8"/>
 				</textElement>
 				<textFieldExpression><![CDATA[$P{ReminderAddress}]]></textFieldExpression>
 			</textField>
 			<textField>
 				<reportElement x="13" y="172" width="132" height="20" uuid="d21620a9-4a49-496e-80f6-db842f0b70a9"/>
 				<textElement>
-					<font  size="14" isBold="true"/>
+					<font size="14" isBold="true"/>
 				</textElement>
 				<textFieldExpression><![CDATA[$P{Reminder}]]></textFieldExpression>
 			</textField>
 			<textField pattern="dd.MM.yyyy">
 				<reportElement x="388" y="192" width="100" height="20" uuid="5141d92f-3325-445b-b616-90630c1648f7"/>
 				<textElement textAlignment="Right">
-					<font  size="8"/>
+					<font size="8"/>
 				</textElement>
 				<textFieldExpression><![CDATA[new java.util.Date()]]></textFieldExpression>
 			</textField>
 			<textField>
 				<reportElement x="13" y="232" width="294" height="20" uuid="3f7d1c4a-a326-436b-831d-5da9fd255bf0"/>
 				<textElement>
-					<font  size="8" isBold="true"/>
+					<font size="8" isBold="true"/>
 				</textElement>
 				<textFieldExpression><![CDATA[$F{DUNNINGTEXT}]]></textFieldExpression>
 			</textField>
 			<textField>
 				<reportElement x="13" y="212" width="214" height="20" uuid="52834aec-d107-4cc7-9662-1cdd73ba15c1"/>
 				<textElement>
-					<font  size="8" isBold="true"/>
+					<font size="8" isBold="true"/>
 				</textElement>
 				<textFieldExpression><![CDATA[$P{Dunninglevel} + " " + $F{DUNNINGLEVEL}]]></textFieldExpression>
 			</textField>
@@ -196,21 +196,21 @@
 			<textField pattern="EEEEE dd MMMMM yyyy">
 				<reportElement x="340" y="13" width="112" height="15" forecolor="#999999" uuid="26510f19-a203-4b34-8093-f6a9f7f6050e"/>
 				<textElement>
-					<font  size="8"/>
+					<font size="8"/>
 				</textElement>
 				<textFieldExpression><![CDATA[new java.util.Date()]]></textFieldExpression>
 			</textField>
 			<textField>
 				<reportElement x="452" y="13" width="48" height="15" forecolor="#999999" uuid="218ef560-390f-4807-b7f6-98e6f6162892"/>
 				<textElement textAlignment="Right">
-					<font  size="8"/>
+					<font size="8"/>
 				</textElement>
 				<textFieldExpression><![CDATA[$R{Seite}+" "+$V{PAGE_NUMBER}+" "+$R{von}]]></textFieldExpression>
 			</textField>
 			<textField evaluationTime="Report">
 				<reportElement x="500" y="13" width="40" height="15" forecolor="#999999" uuid="7ac354ed-0f8f-41fa-80a5-c2a0f74f7e09"/>
 				<textElement>
-					<font  size="8"/>
+					<font size="8"/>
 				</textElement>
 				<textFieldExpression><![CDATA[" " + $V{PAGE_NUMBER}]]></textFieldExpression>
 			</textField>
-- 
GitLab


From ed1ee0db2170fbbe8ffba633c7cdd18086b81090 Mon Sep 17 00:00:00 2001
From: "b.ulrich" <b.ulrich@adito.de>
Date: Mon, 12 Oct 2020 11:38:37 +0200
Subject: [PATCH 039/184] [Projekt: Entwicklung - Neon][TicketNr.:
 1064514][Dashlet: Sales-Trichter mit Filter "Status=offen" programmieren]

---
 .../SalesprojectAnalyses_view/SalesprojectAnalyses_view.aod     | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/neonView/SalesprojectAnalyses_view/SalesprojectAnalyses_view.aod b/neonView/SalesprojectAnalyses_view/SalesprojectAnalyses_view.aod
index 1228d3cc49b..67c3c736904 100644
--- a/neonView/SalesprojectAnalyses_view/SalesprojectAnalyses_view.aod
+++ b/neonView/SalesprojectAnalyses_view/SalesprojectAnalyses_view.aod
@@ -8,7 +8,7 @@
       <name>SalesprojectPhases</name>
       <title>Salesproject phases</title>
       <description>Shows how many sales projects are in the various sales phases</description>
-      <fragment>Salesproject/filter?search=eyJ0eXBlIjoiZ3JvdXAiLCJvcGVyYXRvciI6IkFORCIsImNoaWxkcyI6W3sidHlwZSI6InJvdyIsIm5hbWUiOiJQSEFTRSIsIm9wZXJhdG9yIjoiTk9UX0VRVUFMIiwidmFsdWUiOiJOZWdvdGlhdGlvbiIsImtleSI6IlNBTFBST0pQSEFTRU5FR08iLCJjb250ZW50dHlwZSI6IlRFWFQifV19&amp;axes=COUNT&amp;grouping=%23EXTENSION.Phase_filterExtention.Phase_filterExtention%23TEXT</fragment>
+      <fragment>Salesproject/filter?search=eyJ0eXBlIjoiZ3JvdXAiLCJvcGVyYXRvciI6IkFORCIsImNoaWxkcyI6W3sidHlwZSI6InJvdyIsIm5hbWUiOiJQSEFTRSIsIm9wZXJhdG9yIjoiTk9UX0VRVUFMIiwidmFsdWUiOiJOZWdvdGlhdGlvbiIsImtleSI6IlNBTFBST0pQSEFTRU5FR08iLCJjb250ZW50dHlwZSI6IlRFWFQifSx7InR5cGUiOiJyb3ciLCJuYW1lIjoiU1RBVFVTIiwib3BlcmF0b3IiOiJFUVVBTCIsInZhbHVlIjoiT2ZmZW4iLCJrZXkiOiJTQUxQUk9KU1RBVE9QRU4iLCJjb250ZW50dHlwZSI6IlRFWFQifV19&amp;axes=COUNT&amp;grouping=%23EXTENSION.Phase_filterExtention.Phase_filterExtention%23TEXT</fragment>
       <singleton v="true" />
       <storeRoles>
         <element>PROJECT_FieldStaff</element>
-- 
GitLab


From 9a44ff30aece6fcb2ce5680bad93287595c1c84e Mon Sep 17 00:00:00 2001
From: "b.ulrich" <b.ulrich@adito.de>
Date: Mon, 12 Oct 2020 13:46:13 +0200
Subject: [PATCH 040/184] [Projekt: Entwicklung - Neon][TicketNr.:
 1065877][Mahnung - Tippfehler im Beleg]

---
 language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod |  3 +++
 language/_____LANGUAGE_de/_____LANGUAGE_de.aod       |  4 ++++
 language/_____LANGUAGE_en/_____LANGUAGE_en.aod       |  3 +++
 report/Reminder_report/reportData.jrxml              | 10 +++++-----
 4 files changed, 15 insertions(+), 5 deletions(-)

diff --git a/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod b/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod
index 2853fb59787..ba8f537e452 100644
--- a/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod
+++ b/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod
@@ -7284,6 +7284,9 @@
     <entry>
       <key>Probability in %</key>
     </entry>
+    <entry>
+      <key>Outstanding Amount</key>
+    </entry>
   </keyValueMap>
   <font name="Dialog" style="0" size="11" />
   <sqlModels>
diff --git a/language/_____LANGUAGE_de/_____LANGUAGE_de.aod b/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
index b5c2b894568..698fcf15c81 100644
--- a/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
+++ b/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
@@ -9662,6 +9662,10 @@ Bitte Datumseingabe prüfen</value>
       <key>Probability in %</key>
       <value>Wahrscheinlichkeit in %</value>
     </entry>
+    <entry>
+      <key>Outstanding Amount</key>
+      <value>Offener Betrag</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 b09cc03cdef..7831ec4c963 100644
--- a/language/_____LANGUAGE_en/_____LANGUAGE_en.aod
+++ b/language/_____LANGUAGE_en/_____LANGUAGE_en.aod
@@ -7365,6 +7365,9 @@
     <entry>
       <key>Probability in %</key>
     </entry>
+    <entry>
+      <key>Outstanding Amount</key>
+    </entry>
   </keyValueMap>
   <font name="Dialog" style="0" size="11" />
 </language>
diff --git a/report/Reminder_report/reportData.jrxml b/report/Reminder_report/reportData.jrxml
index 0c3b01764e3..ca529152a3f 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="339"/>
+	<property name="ireport.y" value="57"/>
 	<parameter name="myAddr" class="java.lang.String"/>
 	<parameter name="Kontenabstimmung" class="java.lang.String"/>
 	<parameter name="Rech.-Nr" class="java.lang.String"/>
@@ -60,11 +60,11 @@
 					<textFieldExpression><![CDATA[$P{DueDate}]]></textFieldExpression>
 				</textField>
 				<textField>
-					<reportElement x="429" y="0" width="59" height="15" uuid="62a0909f-ef03-4242-969a-8a9532d1aa9a"/>
+					<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{Due}]]></textFieldExpression>
+					<textFieldExpression><![CDATA[$P{Outstanding Amount}]]></textFieldExpression>
 				</textField>
 				<line>
 					<reportElement x="13" y="33" width="527" height="1" uuid="d5108302-191f-4e27-8920-fcd330d335e8"/>
@@ -91,7 +91,7 @@
 					<textFieldExpression><![CDATA[$F{DUEDATE}]]></textFieldExpression>
 				</textField>
 				<textField>
-					<reportElement x="428" y="36" width="60" height="15" uuid="d57eeb7b-f517-4c85-a925-cdc3c1ea0830"/>
+					<reportElement x="451" y="36" width="60" height="15" uuid="d57eeb7b-f517-4c85-a925-cdc3c1ea0830"/>
 					<textElement textAlignment="Right">
 						<font size="8" isBold="true"/>
 					</textElement>
@@ -112,7 +112,7 @@
 					<textFieldExpression><![CDATA[$F{CURRENCY}]]></textFieldExpression>
 				</textField>
 				<textField>
-					<reportElement x="429" y="15" width="59" height="15" uuid="8e257160-536a-418a-b9df-80fa020268b8"/>
+					<reportElement x="452" y="15" width="59" height="15" uuid="8e257160-536a-418a-b9df-80fa020268b8"/>
 					<textElement textAlignment="Right">
 						<font size="8"/>
 					</textElement>
-- 
GitLab


From 98a71ca5cf9c142e6feb73e922ce3a4245d6bb13 Mon Sep 17 00:00:00 2001
From: Tobias Feldmann <t.feldmann@adito.de>
Date: Wed, 28 Oct 2020 14:23:34 +0100
Subject: [PATCH 041/184] Notification_entity DB-RC changed to pageable

---
 entity/Notification_entity/Notification_entity.aod | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/entity/Notification_entity/Notification_entity.aod b/entity/Notification_entity/Notification_entity.aod
index 8dead6bc118..cf3203213ac 100644
--- a/entity/Notification_entity/Notification_entity.aod
+++ b/entity/Notification_entity/Notification_entity.aod
@@ -175,8 +175,7 @@
     <dbRecordContainer>
       <name>db</name>
       <alias>_____SYSTEMALIAS</alias>
-      <maximumDbRows v="200" />
-      <isPageable v="false" />
+      <isPageable v="true" />
       <fromClauseProcess>%aditoprj%/entity/Notification_entity/recordcontainers/db/fromClauseProcess.js</fromClauseProcess>
       <conditionProcess>%aditoprj%/entity/Notification_entity/recordcontainers/db/conditionProcess.js</conditionProcess>
       <orderClauseProcess>%aditoprj%/entity/Notification_entity/recordcontainers/db/orderClauseProcess.js</orderClauseProcess>
-- 
GitLab


From 45ed77682851deb985484baa00698423fa9baafe Mon Sep 17 00:00:00 2001
From: Sebastian Listl <s.listl@adito.de>
Date: Thu, 29 Oct 2020 10:07:11 +0100
Subject: [PATCH 042/184] 1067997 Liquibase fix for MariaDB

---
 .../alter_DocumentTemplatePlaceOfUseDatatype.xml                | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.liquibase/Data_alias/basic/2020.1.2/AlterDatatypeOfKeyColumnsToChar/alter_DocumentTemplatePlaceOfUseDatatype.xml b/.liquibase/Data_alias/basic/2020.1.2/AlterDatatypeOfKeyColumnsToChar/alter_DocumentTemplatePlaceOfUseDatatype.xml
index 37249718641..a6e5c99db42 100644
--- a/.liquibase/Data_alias/basic/2020.1.2/AlterDatatypeOfKeyColumnsToChar/alter_DocumentTemplatePlaceOfUseDatatype.xml
+++ b/.liquibase/Data_alias/basic/2020.1.2/AlterDatatypeOfKeyColumnsToChar/alter_DocumentTemplatePlaceOfUseDatatype.xml
@@ -15,7 +15,7 @@
     
     <changeSet dbms="!derby" author="b.ulrich" id="85ba6a61-9318-4118-ac4c-e33730f6581d">
         <dropPrimaryKey tableName="DOCUMENTTEMPLATE" constraintName="PK_DOCUMENTTEMPLATE_DOCUMENTTEMPLATEID" dropIndex="true"/>
-        <dropNotNullConstraint tableName="DOCUMENTTEMPLATE" columnName="DOCUMENTTEMPLATEID"/>
+        <dropNotNullConstraint tableName="DOCUMENTTEMPLATE" columnName="DOCUMENTTEMPLATEID" columnDataType="VARCHAR(36)"/>
         <modifyDataType tableName="DOCUMENTTEMPLATE" columnName="DOCUMENTTEMPLATEID" newDataType="CHAR(36)"/>
         <addNotNullConstraint columnName="DOCUMENTTEMPLATEID" tableName="DOCUMENTTEMPLATE" columnDataType="CHAR(36)" validate="true"/>
         <addPrimaryKey tableName="DOCUMENTTEMPLATE" constraintName="PK_DOCUMENTTEMPLATE_DOCUMENTTEMPLATEID" columnNames="DOCUMENTTEMPLATEID"/>
-- 
GitLab


From d23d40b9a92ee6189dae202c4605c29f794e442d Mon Sep 17 00:00:00 2001
From: "M.Bilda" <m.bilda@adito.de>
Date: Thu, 29 Oct 2020 10:31:55 +0100
Subject: [PATCH 043/184] Rename Entity with _entity

---
 entity/Document_entity/Document_entity.aod    | 88 +++++++++----------
 .../UserhelpResources_entity.aod}             | 18 ++--
 .../documentation.adoc                        |  0
 .../assignmentrowid_param/valueProcess.js     |  0
 .../assignmenttable_param/valueProcess.js     |  0
 neonContext/Userhelp/Userhelp.aod             |  2 +-
 6 files changed, 54 insertions(+), 54 deletions(-)
 rename entity/{UserhelpResources/UserhelpResources.aod => UserhelpResources_entity/UserhelpResources_entity.aod} (70%)
 rename entity/{UserhelpResources => UserhelpResources_entity}/documentation.adoc (100%)
 rename entity/{UserhelpResources => UserhelpResources_entity}/entityfields/documents/children/assignmentrowid_param/valueProcess.js (100%)
 rename entity/{UserhelpResources => UserhelpResources_entity}/entityfields/documents/children/assignmenttable_param/valueProcess.js (100%)

diff --git a/entity/Document_entity/Document_entity.aod b/entity/Document_entity/Document_entity.aod
index 420157a3713..cba9173b17c 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/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 7775d3fd5a4..32f253d4116 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/neonContext/Userhelp/Userhelp.aod b/neonContext/Userhelp/Userhelp.aod
index 435de68c2c1..057b38dda49 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>
-- 
GitLab


From 713f11a1f22a3fb7ec7c646ba670005cdca3fab2 Mon Sep 17 00:00:00 2001
From: Sebastian Listl <s.listl@adito.de>
Date: Thu, 29 Oct 2020 17:23:28 +0100
Subject: [PATCH 044/184] 1067663 support for oracle db

---
 .../hascommrestriction.value/expression.js    |  4 ++--
 .../status.displayvalue/expression.js         | 11 +++-------
 .../targetcontext.value/expression.js         |  8 +++----
 .../activities/filterConditionProcess.js      | 11 +++++++---
 .../recordcontainers/jdito/onUpdate.js        |  6 ++---
 .../activities/filterConditionProcess.js      | 11 +++++++---
 .../targetcontext.value/expression.js         |  8 +++----
 .../activities/filterConditionProcess.js      | 11 +++++++---
 .../entityfields/product_id/onValueChange.js  |  2 +-
 .../groupQueryProcess.js                      |  3 ++-
 .../groupQueryProcess.js                      | 19 +++++++++-------
 .../recordcontainers/jdito/contentProcess.js  |  2 +-
 .../activities/filterConditionProcess.js      | 11 +++++++---
 .../recordcontainers/jdito/contentProcess.js  |  8 ++++++-
 .../groupQueryProcess.js                      | 22 +++++++++++--------
 .../activities/filterConditionProcess.js      | 11 +++++++---
 .../recordcontainers/jdito/contentProcess.js  | 12 +++++-----
 .../recordcontainers/jdito/contentProcess.js  |  2 +-
 process/Contact_lib/process.js                |  2 +-
 process/Context_lib/process.js                |  4 ++--
 process/Leadimport_lib/process.js             |  2 +-
 process/ObjectRelation_lib/process.js         |  1 +
 process/Offer_lib/process.js                  |  2 +-
 process/Sql_lib/process.js                    |  2 +-
 process/Turnover_lib/process.js               |  2 +-
 process/Workflow_lib/process.js               |  9 +++++---
 26 files changed, 112 insertions(+), 74 deletions(-)

diff --git a/entity/BulkMailRecipient_entity/recordcontainers/db/recordfieldmappings/hascommrestriction.value/expression.js b/entity/BulkMailRecipient_entity/recordcontainers/db/recordfieldmappings/hascommrestriction.value/expression.js
index 3020cb618cd..04cd6d4dc91 100644
--- a/entity/BulkMailRecipient_entity/recordcontainers/db/recordfieldmappings/hascommrestriction.value/expression.js
+++ b/entity/BulkMailRecipient_entity/recordcontainers/db/recordfieldmappings/hascommrestriction.value/expression.js
@@ -5,5 +5,5 @@ import("system.db");
 import("system.result");
 
 var commRestrictionCond = ContactUtils.getCommRestrictionCondition($KeywordRegistry.communicationMediumCampaign$mail());
-var sql = "case when (" + commRestrictionCond.toString() + ") then 'true' else 'false' end";
-result.string(sql);
+var sql = SqlBuilder.caseWhen(commRestrictionCond).thenString("true").elseString("false");
+result.string(sql.toString());
diff --git a/entity/BulkMailRecipient_entity/recordcontainers/db/recordfieldmappings/status.displayvalue/expression.js b/entity/BulkMailRecipient_entity/recordcontainers/db/recordfieldmappings/status.displayvalue/expression.js
index 115c35f85e4..49b6fefd592 100644
--- a/entity/BulkMailRecipient_entity/recordcontainers/db/recordfieldmappings/status.displayvalue/expression.js
+++ b/entity/BulkMailRecipient_entity/recordcontainers/db/recordfieldmappings/status.displayvalue/expression.js
@@ -1,17 +1,12 @@
 import("Sql_lib");
 import("Contact_lib");
 import("system.translate");
-import("system.db");
-import("Bulkmail_lib");
 import("system.result");
 import("Keyword_lib");
 import("KeywordRegistry_basic");
 
-var commRestrictionCond = ContactUtils.getCommRestrictionCondition($KeywordRegistry.communicationMediumCampaign$mail()).build();
+var commRestrictionCond = ContactUtils.getCommRestrictionCondition($KeywordRegistry.communicationMediumCampaign$mail());
 var keywordSql = KeywordUtils.getResolvedTitleSqlPart($KeywordRegistry.bulkMailRecipientStatus(), "BULKMAILRECIPIENT.STATUS");
 
-// TODO: is prepared possible?
-var sql = "case when (" + SqlUtils.translateStatementWithQuotes(commRestrictionCond)
-    + ") then '" + translate.text("Advertising ban")
-    + "' else (" + keywordSql + ") end";
-result.string(sql);
+var sql = SqlBuilder.caseWhen(commRestrictionCond).thenString(translate.text("Advertising ban")).elseValue(keywordSql);
+result.string(sql.toString());
diff --git a/entity/BulkMailRecipient_entity/recordcontainers/db/recordfieldmappings/targetcontext.value/expression.js b/entity/BulkMailRecipient_entity/recordcontainers/db/recordfieldmappings/targetcontext.value/expression.js
index 9bac722a3fa..5247fde75b3 100644
--- a/entity/BulkMailRecipient_entity/recordcontainers/db/recordfieldmappings/targetcontext.value/expression.js
+++ b/entity/BulkMailRecipient_entity/recordcontainers/db/recordfieldmappings/targetcontext.value/expression.js
@@ -1,7 +1,7 @@
+import("Sql_lib");
 import("Context_lib");
 import("system.result");
 
-// TODO: is prepared possible?
-result.string("case when PERSON_ID is null then '" + ContextUtils.getContextName("Organisation")
-    + "' when CONTACT.ORGANISATION_ID is not null and CONTACT.PERSON_ID is not null then '" + ContextUtils.getContextName("Person") 
-    + "' else '' end");
\ No newline at end of file
+var sql = SqlBuilder.caseWhen("PERSON_ID is null").thenString(ContextUtils.getContextName("Organisation"))
+    .when(newWhere("CONTACT.ORGANISATION_ID is not null").and("CONTACT.PERSON_ID is not null")).thenString(ContextUtils.getContextName("Person"))
+result.string(sql.toString());
\ No newline at end of file
diff --git a/entity/Campaign_entity/recordcontainers/db/recordfieldmappings/activities/filterConditionProcess.js b/entity/Campaign_entity/recordcontainers/db/recordfieldmappings/activities/filterConditionProcess.js
index fa780bd3a98..dd188aaf779 100644
--- a/entity/Campaign_entity/recordcontainers/db/recordfieldmappings/activities/filterConditionProcess.js
+++ b/entity/Campaign_entity/recordcontainers/db/recordfieldmappings/activities/filterConditionProcess.js
@@ -1,6 +1,11 @@
+import("Context_lib");
+import("Sql_lib");
 import("system.vars");
 import("system.result");
+//!LibFunction
+var cond = newWhere(null, newSelect("ACTIVITYLINK.OBJECT_ROWID").from("ACTIVITYLINK")
+    .join("ACTIVITY", newWhere("ACTIVITY.ACTIVITYID = ACTIVITYLINK.ACTIVITY_ID")
+        .and("ACTIVITYLINK.OBJECT_TYPE", ContextUtils.getCurrentContextId()))
+    .where(vars.get("$local.condition")), SqlBuilder.EXISTS());
 
-var from = "ACTIVITYLINK join ACTIVITY on ACTIVITY.ACTIVITYID = ACTIVITYLINK.ACTIVITY_ID and ACTIVITYLINK.OBJECT_TYPE = 'Campaign'";
-
-result.string("CAMPAIGNID in (select ACTIVITYLINK.OBJECT_ROWID from " + from + " where " + vars.get("$local.condition")+ ")");
\ No newline at end of file
+result.string(cond.toString());
\ No newline at end of file
diff --git a/entity/ClassificationAdmin_entity/recordcontainers/jdito/onUpdate.js b/entity/ClassificationAdmin_entity/recordcontainers/jdito/onUpdate.js
index 43a6304543f..ea803f184c5 100644
--- a/entity/ClassificationAdmin_entity/recordcontainers/jdito/onUpdate.js
+++ b/entity/ClassificationAdmin_entity/recordcontainers/jdito/onUpdate.js
@@ -178,7 +178,7 @@ function _update()
             }
         }
 
-        cond = newWhereIfSet("CLASSIFICATIONTYPE.CLASSIFICATIONTYPEID = '" + text.decodeMS(uid)[1] + "'");
+        cond = newWhereIfSet("CLASSIFICATIONTYPE.CLASSIFICATIONTYPEID", text.decodeMS(uid)[1]);
         columns.push("SCORETYPE");
         values.push(vars.get("$field.CLASSIFICATIONTYPEIDDISPLAYVALUE"));
         cond.updateData(true, table, columns, null, values);
@@ -195,13 +195,13 @@ function _update()
                                                 .where("CLASSIFICATIONGROUP.CLASSIFICATIONGROUPID", id)
                                                 .cell();
 
-        cond = newWhereIfSet("CLASSIFICATIONTYPE.CLASSIFICATIONGROUP_ID = '" + classificationGroupId + "'");
+        cond = newWhereIfSet("CLASSIFICATIONTYPE.CLASSIFICATIONGROUP_ID", classificationGroupId);
 
         var groupTable = "CLASSIFICATIONGROUP";
         var groupColumns = ["SORTING", "TITLE"];
         var groupName = rowdata["CLASSIFICATIONGROUP.value"] == classificationGroupId ? rowdata["CLASSIFICATIONGROUP.displayValue"] : rowdata["CLASSIFICATIONGROUP.value"];
         var groupValues = [vars.get("$field.SORTING"), groupName];
-        var groupCond = newWhereIfSet("CLASSIFICATIONGROUP.CLASSIFICATIONGROUPID = '" + classificationGroupId + "'");
+        var groupCond = newWhereIfSet("CLASSIFICATIONGROUP.CLASSIFICATIONGROUPID", classificationGroupId);
         groupCond.updateData(true, groupTable, groupColumns, null, groupValues);
     }
 }
\ No newline at end of file
diff --git a/entity/Contract_entity/recordcontainers/db/recordfieldmappings/activities/filterConditionProcess.js b/entity/Contract_entity/recordcontainers/db/recordfieldmappings/activities/filterConditionProcess.js
index c2197272407..dd188aaf779 100644
--- a/entity/Contract_entity/recordcontainers/db/recordfieldmappings/activities/filterConditionProcess.js
+++ b/entity/Contract_entity/recordcontainers/db/recordfieldmappings/activities/filterConditionProcess.js
@@ -1,6 +1,11 @@
+import("Context_lib");
+import("Sql_lib");
 import("system.vars");
 import("system.result");
+//!LibFunction
+var cond = newWhere(null, newSelect("ACTIVITYLINK.OBJECT_ROWID").from("ACTIVITYLINK")
+    .join("ACTIVITY", newWhere("ACTIVITY.ACTIVITYID = ACTIVITYLINK.ACTIVITY_ID")
+        .and("ACTIVITYLINK.OBJECT_TYPE", ContextUtils.getCurrentContextId()))
+    .where(vars.get("$local.condition")), SqlBuilder.EXISTS());
 
-var from = "ACTIVITYLINK join ACTIVITY on ACTIVITY.ACTIVITYID = ACTIVITYLINK.ACTIVITY_ID and ACTIVITYLINK.OBJECT_TYPE = 'Contract'";
-
-result.string("CONTRACTID in (select ACTIVITYLINK.OBJECT_ROWID from " + from + " where " + vars.get("$local.condition")+ ")");
\ No newline at end of file
+result.string(cond.toString());
\ No newline at end of file
diff --git a/entity/LetterRecipient_entity/recordcontainers/db/recordfieldmappings/targetcontext.value/expression.js b/entity/LetterRecipient_entity/recordcontainers/db/recordfieldmappings/targetcontext.value/expression.js
index 9bac722a3fa..b9a588dfe86 100644
--- a/entity/LetterRecipient_entity/recordcontainers/db/recordfieldmappings/targetcontext.value/expression.js
+++ b/entity/LetterRecipient_entity/recordcontainers/db/recordfieldmappings/targetcontext.value/expression.js
@@ -1,7 +1,7 @@
+import("Sql_lib");
 import("Context_lib");
 import("system.result");
 
-// TODO: is prepared possible?
-result.string("case when PERSON_ID is null then '" + ContextUtils.getContextName("Organisation")
-    + "' when CONTACT.ORGANISATION_ID is not null and CONTACT.PERSON_ID is not null then '" + ContextUtils.getContextName("Person") 
-    + "' else '' end");
\ No newline at end of file
+var sql = SqlBuilder.caseWhen("PERSON_ID is null").thenString(ContextUtils.getContextName("Organisation"))
+    .when(newWhere("CONTACT.ORGANISATION_ID is not null").and("CONTACT.PERSON_ID is not null")).thenString(ContextUtils.getContextName("Person"));
+result.string(sql.toString());
\ No newline at end of file
diff --git a/entity/Offer_entity/recordcontainers/db/recordfieldmappings/activities/filterConditionProcess.js b/entity/Offer_entity/recordcontainers/db/recordfieldmappings/activities/filterConditionProcess.js
index 9a3d0448054..dd188aaf779 100644
--- a/entity/Offer_entity/recordcontainers/db/recordfieldmappings/activities/filterConditionProcess.js
+++ b/entity/Offer_entity/recordcontainers/db/recordfieldmappings/activities/filterConditionProcess.js
@@ -1,6 +1,11 @@
+import("Context_lib");
+import("Sql_lib");
 import("system.vars");
 import("system.result");
+//!LibFunction
+var cond = newWhere(null, newSelect("ACTIVITYLINK.OBJECT_ROWID").from("ACTIVITYLINK")
+    .join("ACTIVITY", newWhere("ACTIVITY.ACTIVITYID = ACTIVITYLINK.ACTIVITY_ID")
+        .and("ACTIVITYLINK.OBJECT_TYPE", ContextUtils.getCurrentContextId()))
+    .where(vars.get("$local.condition")), SqlBuilder.EXISTS());
 
-var from = "ACTIVITYLINK join ACTIVITY on ACTIVITY.ACTIVITYID = ACTIVITYLINK.ACTIVITY_ID and ACTIVITYLINK.OBJECT_TYPE = 'Offer'";
-
-result.string("OFFERID in (select ACTIVITYLINK.OBJECT_ROWID from " + from + " where " + vars.get("$local.condition")+ ")");
\ No newline at end of file
+result.string(cond.toString());
\ No newline at end of file
diff --git a/entity/Offeritem_entity/entityfields/product_id/onValueChange.js b/entity/Offeritem_entity/entityfields/product_id/onValueChange.js
index 3a5de6feaba..8ff2c784424 100644
--- a/entity/Offeritem_entity/entityfields/product_id/onValueChange.js
+++ b/entity/Offeritem_entity/entityfields/product_id/onValueChange.js
@@ -21,7 +21,7 @@ if(pid != "")
     var productInfoSubSql = newSelect("DESCRIPTION")
         .from("DESCRIPTIONTRANSLATION")
         .whereIfSet("DESCRIPTIONTRANSLATION.OBJECT_ROWID", "$local.value")
-        .and("DESCRIPTIONTRANSLATION.OBJECT_TYPE = 'Product'")
+        .and("DESCRIPTIONTRANSLATION.OBJECT_TYPE", "Product")
         .andIfSet("DESCRIPTIONTRANSLATION.LANG", "$param.Language_param")
         .toString();
     var ProductDetails = ProductUtils.getProductDetails(pid, PriceListFilter, 
diff --git a/entity/Organisation_entity/recordcontainers/db/filterextensions/classificationgroup_filter/groupQueryProcess.js b/entity/Organisation_entity/recordcontainers/db/filterextensions/classificationgroup_filter/groupQueryProcess.js
index 768e6ca7501..aad0c1782f7 100644
--- a/entity/Organisation_entity/recordcontainers/db/filterextensions/classificationgroup_filter/groupQueryProcess.js
+++ b/entity/Organisation_entity/recordcontainers/db/filterextensions/classificationgroup_filter/groupQueryProcess.js
@@ -13,7 +13,8 @@ var name = vars.get("$local.name");
 var stmt = newSelect(isCount ? groupedColumns : columns)
     .from("ORGANISATION")
     .join("CONTACT", "ORGANISATIONID = ORGANISATION_ID  and PERSON_ID is null")
-    .leftJoin("CLASSIFICATIONSTORAGE", "CLASSIFICATIONSTORAGE.OBJECT_ROWID = CONTACT.CONTACTID and OBJECT_TYPE = 'Organisation'")
+    .leftJoin("CLASSIFICATIONSTORAGE", newWhere("CLASSIFICATIONSTORAGE.OBJECT_ROWID = CONTACT.CONTACTID")
+        .and("CLASSIFICATIONSTORAGE.OBJECT_TYPE", "Organisation"))
 
 if (condition)
 {
diff --git a/entity/Organisation_entity/recordcontainers/db/filterextensions/classificationtype_filter/groupQueryProcess.js b/entity/Organisation_entity/recordcontainers/db/filterextensions/classificationtype_filter/groupQueryProcess.js
index ccf8f498ce2..a4e9edc5b2c 100644
--- a/entity/Organisation_entity/recordcontainers/db/filterextensions/classificationtype_filter/groupQueryProcess.js
+++ b/entity/Organisation_entity/recordcontainers/db/filterextensions/classificationtype_filter/groupQueryProcess.js
@@ -11,15 +11,18 @@ var groupedColumns = vars.get("$local.groupedlist") // The coloumns, used for gr
 var order = vars.get("$local.order");               // The order of the result
 var classificationId = vars.get("$local.name");
 classificationId = classificationId.slice(classificationId.lastIndexOf(".") + 1, classificationId.length);
-var valuefield = "''"
-var stmt = "";
 
-stmt = newSelect(isCount ? "1" : columns)
+var sql = newSelect(isCount ? "1" : columns)
                     .from("ORGANISATION")
                     .join("CONTACT", "ORGANISATIONID = ORGANISATION_ID  and PERSON_ID is null")
-                    .leftJoin("CLASSIFICATION", "CLASSIFICATION.OBJECT_ROWID = CONTACT.CONTACTID and OBJECT_TYPE = 'Organisation' and CLASSIFICATION.CLASSIFICATIONTYPE_ID = '" + classificationId + "' ")
-                    .leftJoin("CLASSIFICATIONSCORE", "CLASSIFICATIONSCOREID = CLASSIFICATION.CLASSIFICATIONSCORE_ID " +  (condition != "  " ? " WHERE " + condition : ""))
-                    .groupBy(groupedColumns + (order != null && !isCount ? " ORDER BY " + order : ""))
-                    .toString();
+                    .leftJoin("CLASSIFICATION", newWhere("CLASSIFICATION.OBJECT_ROWID = CONTACT.CONTACTID")
+                        .and("CLASSIFICATION.OBJECT_TYPE", "Organisation")
+                        .and("CLASSIFICATION.CLASSIFICATIONTYPE_ID", classificationId))
+                    .leftJoin("CLASSIFICATIONSCORE", "CLASSIFICATIONSCOREID = CLASSIFICATION.CLASSIFICATIONSCORE_ID")
+                    .whereIfSet(condition.trim())
+                    .groupBy(groupedColumns);
 
-result.string(stmt);
\ No newline at end of file
+if (order != null && !isCount)
+    sql.orderBy(order);
+
+result.string(sql.toString());
\ No newline at end of file
diff --git a/entity/PermissionOverview_entity/recordcontainers/jdito/contentProcess.js b/entity/PermissionOverview_entity/recordcontainers/jdito/contentProcess.js
index 0a21aef128b..293144a2513 100644
--- a/entity/PermissionOverview_entity/recordcontainers/jdito/contentProcess.js
+++ b/entity/PermissionOverview_entity/recordcontainers/jdito/contentProcess.js
@@ -74,7 +74,7 @@ for each (var entry in rolesOrEntities) { // entry contains either a role or an
                                 .select("ASYS_PERMISSIONSETID")
                                 .from("ASYS_PERMISSIONSET")
                                 .where("ASYS_PERMISSIONSET.ASYS_PERMISSIONSET_ID", entityPermSetId)
-                                .and("ACCESSTYPE = 'R'")
+                                .and("ASYS_PERMISSIONSET.ACCESSTYPE", "R")
                                 .arrayColumn();
 
         currOverview = [entityPermSetId, entry, "VAADIN:CLOSE", "VAADIN:CLOSE", "VAADIN:CLOSE", "VAADIN:CLOSE", "VAADIN:CLOSE"];
diff --git a/entity/Product_entity/recordcontainers/db/recordfieldmappings/activities/filterConditionProcess.js b/entity/Product_entity/recordcontainers/db/recordfieldmappings/activities/filterConditionProcess.js
index b8141bc3b76..dd188aaf779 100644
--- a/entity/Product_entity/recordcontainers/db/recordfieldmappings/activities/filterConditionProcess.js
+++ b/entity/Product_entity/recordcontainers/db/recordfieldmappings/activities/filterConditionProcess.js
@@ -1,6 +1,11 @@
+import("Context_lib");
+import("Sql_lib");
 import("system.vars");
 import("system.result");
+//!LibFunction
+var cond = newWhere(null, newSelect("ACTIVITYLINK.OBJECT_ROWID").from("ACTIVITYLINK")
+    .join("ACTIVITY", newWhere("ACTIVITY.ACTIVITYID = ACTIVITYLINK.ACTIVITY_ID")
+        .and("ACTIVITYLINK.OBJECT_TYPE", ContextUtils.getCurrentContextId()))
+    .where(vars.get("$local.condition")), SqlBuilder.EXISTS());
 
-var from = "ACTIVITYLINK join ACTIVITY on ACTIVITY.ACTIVITYID = ACTIVITYLINK.ACTIVITY_ID and ACTIVITYLINK.OBJECT_TYPE = 'Product'";
-
-result.string("PRODUCTID in (select ACTIVITYLINK.OBJECT_ROWID from " + from + " where " + vars.get("$local.condition")+ ")");
\ No newline at end of file
+result.string(cond.toString());
\ No newline at end of file
diff --git a/entity/SalesprojectConversionRate_entity/recordcontainers/jdito/contentProcess.js b/entity/SalesprojectConversionRate_entity/recordcontainers/jdito/contentProcess.js
index 95781d32513..2f3dad2864f 100644
--- a/entity/SalesprojectConversionRate_entity/recordcontainers/jdito/contentProcess.js
+++ b/entity/SalesprojectConversionRate_entity/recordcontainers/jdito/contentProcess.js
@@ -37,7 +37,13 @@ if (filter != null)
             })).length > 0
         })[0];
         phasenFilter.operator = "OR";
-        let pre = newSelect("PRE.KEYID").from("AB_KEYWORD_ENTRY").join("AB_KEYWORD_ENTRY", "AB_KEYWORD_ENTRY.SORTING -1 = PRE.SORTING", "PRE").where("AB_KEYWORD_ENTRY.CONTAINER", $KeywordRegistry.salesprojectPhase()).and("PRE.CONTAINER = '" + $KeywordRegistry.salesprojectPhase() + "'").and("AB_KEYWORD_ENTRY.KEYID", phasenFilter.childs[0].value).cell()
+        let pre = newSelect("PRE.KEYID")
+            .from("AB_KEYWORD_ENTRY")
+            .join("AB_KEYWORD_ENTRY", "AB_KEYWORD_ENTRY.SORTING -1 = PRE.SORTING", "PRE")
+            .where("AB_KEYWORD_ENTRY.CONTAINER", $KeywordRegistry.salesprojectPhase())
+            .and(["AB_KEYWORD_ENTRY", "CONTAINER", "PRE"], $KeywordRegistry.salesprojectPhase())
+            .and("AB_KEYWORD_ENTRY.KEYID", phasenFilter.childs[0].value)
+            .cell()
         if (pre != "") {
             let temp = JSON.parse(JSON.stringify(phasenFilter.childs[0]));
             temp.value = temp.key  = pre;
diff --git a/entity/Salesproject_entity/recordcontainers/db/filterextensions/classificationtype_filter/groupQueryProcess.js b/entity/Salesproject_entity/recordcontainers/db/filterextensions/classificationtype_filter/groupQueryProcess.js
index 524e35692ad..cf3462e69dd 100644
--- a/entity/Salesproject_entity/recordcontainers/db/filterextensions/classificationtype_filter/groupQueryProcess.js
+++ b/entity/Salesproject_entity/recordcontainers/db/filterextensions/classificationtype_filter/groupQueryProcess.js
@@ -10,13 +10,17 @@ var groupedColumns = vars.get("$local.groupedlist") // The coloumns, used for gr
 var order = vars.get("$local.order");               // The order of the result
 var classificationId = vars.get("$local.name");
 classificationId = classificationId.slice(classificationId.lastIndexOf(".") + 1, classificationId.length);
-var valuefield = "''"
-var stmt = "";
 
-stmt = newSelect(isCount ? "1" : columns)
-                    .from("SALESPROJECT")
-                    .leftJoin("CLASSIFICATION", "CLASSIFICATION.OBJECT_ROWID = SALESPROJECT.SALESPROJECTID and CLASSIFICATION.OBJECT_TYPE = 'Salesproject' and CLASSIFICATION.CLASSIFICATIONTYPE_ID = '" + classificationId + "' ")
-                    .leftJoin("CLASSIFICATIONSCORE", "CLASSIFICATIONSCORE.CLASSIFICATIONSCOREID = CLASSIFICATION.CLASSIFICATIONSCORE_ID" +  (condition != "  " ? " WHERE " + condition : ""))
-                    .groupBy(groupedColumns + (order != null && !isCount ? " ORDER BY " + order : ""))
-                    .toString();
-result.string(stmt);
\ No newline at end of file
+var sql = newSelect(isCount ? "1" : columns)
+    .from("SALESPROJECT")
+    .leftJoin("CLASSIFICATION", newWhere("CLASSIFICATION.OBJECT_ROWID = SALESPROJECT.SALESPROJECTID")
+        .and("CLASSIFICATION.OBJECT_TYPE", "Salesproject")
+        .and("CLASSIFICATION.CLASSIFICATIONTYPE_ID", classificationId))
+    .leftJoin("CLASSIFICATIONSCORE", "CLASSIFICATIONSCORE.CLASSIFICATIONSCOREID = CLASSIFICATION.CLASSIFICATIONSCORE_ID")
+    .whereIfSet(condition.trim())
+    .groupBy(groupedColumns);
+
+if (order != null && !isCount)
+    sql.orderBy(order);
+                    
+result.string(sql.toString());
\ No newline at end of file
diff --git a/entity/Salesproject_entity/recordcontainers/db/recordfieldmappings/activities/filterConditionProcess.js b/entity/Salesproject_entity/recordcontainers/db/recordfieldmappings/activities/filterConditionProcess.js
index 3a8b1fd9f84..dd188aaf779 100644
--- a/entity/Salesproject_entity/recordcontainers/db/recordfieldmappings/activities/filterConditionProcess.js
+++ b/entity/Salesproject_entity/recordcontainers/db/recordfieldmappings/activities/filterConditionProcess.js
@@ -1,6 +1,11 @@
+import("Context_lib");
+import("Sql_lib");
 import("system.vars");
 import("system.result");
+//!LibFunction
+var cond = newWhere(null, newSelect("ACTIVITYLINK.OBJECT_ROWID").from("ACTIVITYLINK")
+    .join("ACTIVITY", newWhere("ACTIVITY.ACTIVITYID = ACTIVITYLINK.ACTIVITY_ID")
+        .and("ACTIVITYLINK.OBJECT_TYPE", ContextUtils.getCurrentContextId()))
+    .where(vars.get("$local.condition")), SqlBuilder.EXISTS());
 
-var from = "ACTIVITYLINK join ACTIVITY on ACTIVITY.ACTIVITYID = ACTIVITYLINK.ACTIVITY_ID and ACTIVITYLINK.OBJECT_TYPE = 'Salesproject'";
-
-result.string("SALESPROJECTID in (select ACTIVITYLINK.OBJECT_ROWID from " + from + " where " + vars.get("$local.condition")+ ")");
\ No newline at end of file
+result.string(cond.toString());
\ No newline at end of file
diff --git a/entity/VisitPlanEntry_entity/recordcontainers/jdito/contentProcess.js b/entity/VisitPlanEntry_entity/recordcontainers/jdito/contentProcess.js
index ce8bb62314f..ae8d3918edd 100644
--- a/entity/VisitPlanEntry_entity/recordcontainers/jdito/contentProcess.js
+++ b/entity/VisitPlanEntry_entity/recordcontainers/jdito/contentProcess.js
@@ -46,19 +46,19 @@ if(entryData.length > 0)
 {
     for(var i = 0; i < entryData.length; i++)
     {
-        var entryDateRaw, visitPlanEntryId, beginn_time, end_time, organisationContact_id, contact_id, status, visitplanemployeeweek_id, appointmentid;
-        [entryDateRaw, visitPlanEntryId, beginn_time, end_time, organisationContact_id, contact_id, status, visitplanemployeeweek_id, appointmentid] = entryData[i]
+        var entryDateRaw, visitPlanEntryId, beginTime, endTime, organisationContactId, contactId, status, visitplanEmployeeWeekId, appointmentid;
+        [entryDateRaw, visitPlanEntryId, beginTime, endTime, organisationContactId, contactId, status, visitplanEmployeeWeekId, appointmentid] = entryData[i]
         
-        var contactname = db.cell(PersUtils.getResolvingDisplaySubSql("'" + contact_id + "'"));
-        var orgname = OrganisationUtils.getNameByContactId(organisationContact_id);
+        var contactname = ContactUtils.getTitleByContactId(contactId);
+        var orgname = OrganisationUtils.getNameByContactId(organisationContactId);
         var parentName = translate.text(datetime.toDate(entryDateRaw, "EEEE"));
         entryDate = datetime.toDate(entryDateRaw, "dd.MM.yyyy");
 
         var statusDisplay = KeywordUtils.getViewValue($KeywordRegistry.visitPlanEntryStatus(), status)
         var alias = SqlUtils.getSystemAlias();
 
-        items.push([visitPlanEntryId, false, parentName + "#" + entryDate, "",  beginn_time
-            , end_time, organisationContact_id, orgname, contact_id, contactname, entryDateRaw, status, visitplanemployeeweek_id, appointmentid, statusDisplay]);
+        items.push([visitPlanEntryId, false, parentName + "#" + entryDate, "",  beginTime
+            , endTime, organisationContactId, orgname, contactId, contactname, entryDateRaw, status, visitplanEmployeeWeekId, appointmentid, statusDisplay]);
 
         if(!vars.get("$local.idvalues"))
         {
diff --git a/entity/VisitRecommendation_entity/recordcontainers/jdito/contentProcess.js b/entity/VisitRecommendation_entity/recordcontainers/jdito/contentProcess.js
index 7effd511c0a..42fecc4e3d1 100644
--- a/entity/VisitRecommendation_entity/recordcontainers/jdito/contentProcess.js
+++ b/entity/VisitRecommendation_entity/recordcontainers/jdito/contentProcess.js
@@ -271,7 +271,7 @@ function _getPrioByDueDateSubSql (pDueDateField, pPriorityField)
 {
     var currentDate = datetime.date();
     var sqlMasker = new SqlMaskingUtils();
-    
+    //!SqlBuilder
     var subSql = "case when " + pDueDateField + " < ? then '" + $KeywordRegistry.visitRecommendationPriority$critical()
         + "' when " + pDueDateField + " < ? then '" + $KeywordRegistry.visitRecommendationPriority$veryHigh()
         + "' when " + pDueDateField + " < ? then '" + $KeywordRegistry.visitRecommendationPriority$high()
diff --git a/process/Contact_lib/process.js b/process/Contact_lib/process.js
index 627ec11b149..1d8216d36f5 100644
--- a/process/Contact_lib/process.js
+++ b/process/Contact_lib/process.js
@@ -528,7 +528,7 @@ ContactUtils.getActiveCommRestrictionsSubselect = function()
                             .and(newWhere()
                                     .or("COMMRESTRICTION.CONTACT_ID = CONTACT.CONTACTID")
                                     .or("COMMRESTRICTION.CONTACT_ID", orgContactSubselect));
-
+        //!SqlBuilder
         parts.push("case when exists(" + subquery.toString() + ") then '" + pMedium[1] + "' else '' end");
     })
 
diff --git a/process/Context_lib/process.js b/process/Context_lib/process.js
index 31d60828432..f0e62195ad8 100644
--- a/process/Context_lib/process.js
+++ b/process/Context_lib/process.js
@@ -497,7 +497,7 @@ ContextUtils.getSelectMap  = function()
     return {
             "Organisation": ContextSelector.create("ORGANISATION", "CONTACT.CONTACTID", "ORGANISATION.NAME")
                                        .setJoinExpression("join CONTACT on ORGANISATION.ORGANISATIONID = CONTACT.ORGANISATION_ID and CONTACT.PERSON_ID is null")
-                                       .setCondition(newWhere("ORGANISATION.ORGANISATIONID != '0'"))
+                                       .setCondition(newWhere("ORGANISATION.ORGANISATIONID", "0", SqlBuilder.NOT_EQUAL()))
                                        .setSubContexts({
                                            "Person": [newSelect("CONTACTID").from("CONTACT").where("PERSON_ID is not null"), "CONTACT.ORGANISATION_ID", ["Offer", "Order", "Contract", "SupportTicket"]]
                                        })
@@ -608,7 +608,7 @@ ContextUtils.getSelectMap  = function()
 ContextUtils.getNameSubselectSql = function(pContextIdDbField, pRowIdDbField)
 {
     // TODO: prepared?
-    
+    //!SqlBuilder
     var select = "(case " + pContextIdDbField + " ";
 
     var selectMap = ContextUtils.getSelectMap ()
diff --git a/process/Leadimport_lib/process.js b/process/Leadimport_lib/process.js
index ea0f5c14c0b..de9d13b2c7b 100644
--- a/process/Leadimport_lib/process.js
+++ b/process/Leadimport_lib/process.js
@@ -794,7 +794,7 @@ LeadImportUtils.getLeadAttr = function(pImportDefID)
                     .from("AB_ATTRIBUTERELATION")
                     .join("AB_ATTRIBUTEUSAGE", "AB_ATTRIBUTEUSAGE.AB_ATTRIBUTE_ID = AB_ATTRIBUTERELATION.AB_ATTRIBUTE_ID")
                     .where("AB_ATTRIBUTERELATION.OBJECT_ROWID", pImportDefID)
-                    .and("AB_ATTRIBUTERELATION.OBJECT_TYPE = 'Leadimport'")
+                    .and("AB_ATTRIBUTERELATION.OBJECT_TYPE", "Leadimport")
                     .table()
     };
 }
diff --git a/process/ObjectRelation_lib/process.js b/process/ObjectRelation_lib/process.js
index 93063469bb2..c99e2322413 100644
--- a/process/ObjectRelation_lib/process.js
+++ b/process/ObjectRelation_lib/process.js
@@ -37,6 +37,7 @@ ObjectRelationUtils.getPossibleRelationTypes = function(pObjectTypes, pFullInfo,
     // only id and title:
     if (pFullInfo)
     {
+        //!SqlBuilder
         fields = fields.concat([
             "main.RELATION_TYPE",
             "case when type2.AB_OBJECTRELATIONTYPEID is null then 'same' \n\
diff --git a/process/Offer_lib/process.js b/process/Offer_lib/process.js
index 7c9504fa26d..f5a8cd0138d 100644
--- a/process/Offer_lib/process.js
+++ b/process/Offer_lib/process.js
@@ -502,7 +502,7 @@ OfferItemUtils.prototype.insertPartsList = function(pProductId, pAssignedTo, pCu
                             "( " + newSelect("DESCRIPTION")
                                 .from("DESCRIPTIONTRANSLATION")
                                 .where("DESCRIPTIONTRANSLATION.OBJECT_ROWID = PRODUCT.PRODUCTID")
-                                .and("DESCRIPTIONTRANSLATION.OBJECT_TYPE = 'Product'")
+                                .and("DESCRIPTIONTRANSLATION.OBJECT_TYPE", "Product")
                                 .and("DESCRIPTIONTRANSLATION.LANG", pLanguage)
                                 .toString() + ")"]]]]);
                                   
diff --git a/process/Sql_lib/process.js b/process/Sql_lib/process.js
index 35b87999459..49bcb6bfc96 100644
--- a/process/Sql_lib/process.js
+++ b/process/Sql_lib/process.js
@@ -3167,7 +3167,7 @@ SqlBuilder._CaseStatement.prototype.toString = function (pAlias)
     return db.translateStatement(this.build(), pAlias || db.getCurrentAlias());
 }
 
-SqlBuilder._CaseStatement.prototype.build = function ()
+SqlBuilder._CaseStatement.prototype.build = function (pParameters)
 {
     var caseStatement = ["case"];
     var preparedValues = [];
diff --git a/process/Turnover_lib/process.js b/process/Turnover_lib/process.js
index 14080be4ee9..e8f96a61314 100644
--- a/process/Turnover_lib/process.js
+++ b/process/Turnover_lib/process.js
@@ -34,7 +34,7 @@ TurnoverUtil.getTurnoverData = function (pMaxYear, pYearCount, pSalesprojectId)
     return newSelect("'" + turnoverCategory + "', year(SALESORDERDATE) yearNum, month(SALESORDERDATE) monthNum, SALESORDERITEM.DISCOUNT discount, SALESORDERITEM.VAT vat, SALESORDERITEM.PRICE price, sum(SALESORDERITEM.QUANTITY) quantity, SALESORDERITEM.GROUPCODEID prodGroup, (" + KeywordUtils.getResolvedTitleSqlPart($KeywordRegistry.productGroupcode(), "SALESORDERITEM.GROUPCODEID") + ") prodGroupName")
                     .from("SALESORDER")
                     .join("SALESORDERITEM", "SALESORDERITEM.SALESORDER_ID = SALESORDER.SALESORDERID")
-                    .where("SALESORDER.ORDERTYPE = 'ORDTYPEINVO'")
+                    .where("SALESORDER.ORDERTYPE", "ORDTYPEINVO")
                     .and("SALESORDER.ORDERSTATUS = 1")
                     .and("SALESORDER.CANCELLATION <> 1")
                     .and("SALESORDERITEM.OPTIONAL <> 1")
diff --git a/process/Workflow_lib/process.js b/process/Workflow_lib/process.js
index d8705a1e95f..38627a87e22 100644
--- a/process/Workflow_lib/process.js
+++ b/process/Workflow_lib/process.js
@@ -46,15 +46,18 @@ WorkflowUtils.openNewInstance = function (pVariables, pTargetIds, pTargetContext
 {
     if ((!pTargetIds || pTargetIds.length === 0) && pSelectionFilter)
         pTargetIds = [];
+    else if (!pTargetIds)
+        pTargetIds = [WorkflowVariables.TARGET_ID.getDefaultValue()];
     if (!pVariables)
         pVariables = {};
     
     Object.assign(pVariables, WorkflowVariables.getTargetVariables(pTargetIds, pTargetContext));
     
     neon.openContext("WorkflowLauncher", "WorkflowLauncherEdit_view", null, neon.OPERATINGSTATE_VIEW, {
-        "ProcessVariables_param" : JSON.stringify(pVariables),
-        "TargetContext_param" : pVariables[WorkflowVariables.TARGET_CONTEXT()],
-        "TargetFilter_param" : pSelectionFilter ? JSON.stringify(pSelectionFilter) : ""
+        "ProcessVariables_param": JSON.stringify(pVariables),
+        "TargetContext_param": pVariables[WorkflowVariables.TARGET_CONTEXT()],
+        "TargetFilter_param": pSelectionFilter ? JSON.stringify(pSelectionFilter) : "",
+        "Targets_param": JSON.stringify(pTargetIds)
     });
 }
 
-- 
GitLab


From 14f9afba31f607fe32565b57117250b4b82f4496 Mon Sep 17 00:00:00 2001
From: Tom Lutzenberger <t.lutzenberger@adito.de>
Date: Fri, 30 Oct 2020 08:17:53 +0000
Subject: [PATCH 045/184] #1065112 unit test

---
 .../KeywordAttribute_test.aod                 |   12 +
 process/KeywordAttribute_test/process.js      |  144 ++
 process/Keyword_test/Keyword_test.aod         |   12 +
 process/Keyword_test/process.js               |  143 ++
 process/SqlBuilder_test/SqlBuilder_test.aod   |   12 +
 process/SqlBuilder_test/process.js            | 1266 +++++++++++++++
 process/SqlLib_tests/process.js               | 1015 ------------
 .../SqlMaskingUtils_test.aod                  |   12 +
 process/SqlMaskingUtils_test/process.js       |  158 ++
 process/Sql_lib/documentation.adoc            |    4 +-
 .../Terminal_lib.aod}                         |    6 +-
 process/Terminal_lib/process.js               |  342 ++++
 process/UnitTest_lib/UnitTest_lib.aod         |    1 +
 process/UnitTest_lib/process.js               | 1374 ++++++++++++++---
 process/UnitTest_test/UnitTest_test.aod       |   12 +
 process/UnitTest_test/process.js              | 1141 ++++++++++++++
 process/Util_lib/process.js                   |   35 +-
 process/_all_test/_all_test.aod               |   12 +
 process/_all_test/process.js                  |   23 +
 19 files changed, 4531 insertions(+), 1193 deletions(-)
 create mode 100644 process/KeywordAttribute_test/KeywordAttribute_test.aod
 create mode 100644 process/KeywordAttribute_test/process.js
 create mode 100644 process/Keyword_test/Keyword_test.aod
 create mode 100644 process/Keyword_test/process.js
 create mode 100644 process/SqlBuilder_test/SqlBuilder_test.aod
 create mode 100644 process/SqlBuilder_test/process.js
 delete mode 100644 process/SqlLib_tests/process.js
 create mode 100644 process/SqlMaskingUtils_test/SqlMaskingUtils_test.aod
 create mode 100644 process/SqlMaskingUtils_test/process.js
 rename process/{SqlLib_tests/SqlLib_tests.aod => Terminal_lib/Terminal_lib.aod} (67%)
 create mode 100644 process/Terminal_lib/process.js
 create mode 100644 process/UnitTest_test/UnitTest_test.aod
 create mode 100644 process/UnitTest_test/process.js
 create mode 100644 process/_all_test/_all_test.aod
 create mode 100644 process/_all_test/process.js

diff --git a/process/KeywordAttribute_test/KeywordAttribute_test.aod b/process/KeywordAttribute_test/KeywordAttribute_test.aod
new file mode 100644
index 00000000000..5956980e85a
--- /dev/null
+++ b/process/KeywordAttribute_test/KeywordAttribute_test.aod
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+  <name>KeywordAttribute_test</name>
+  <title>[TEST] KeywordAttribute_lib</title>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <icon>VAADIN:CHECK_CIRCLE</icon>
+  <process>%aditoprj%/process/KeywordAttribute_test/process.js</process>
+  <alias>Data_alias</alias>
+  <variants>
+    <element>EXECUTABLE</element>
+  </variants>
+</process>
diff --git a/process/KeywordAttribute_test/process.js b/process/KeywordAttribute_test/process.js
new file mode 100644
index 00000000000..888e3a79bc3
--- /dev/null
+++ b/process/KeywordAttribute_test/process.js
@@ -0,0 +1,144 @@
+import("system.result");
+import("system.translate");
+import("system.vars");
+import("Keyword_lib");
+import("UnitTest_lib");
+import("Sql_lib");
+
+
+var constructor = new TestSuite("KeywordAttribute.constructor", [
+    new Test("should throw error if no data is found and no default value is defined",
+        function(pTester) {
+            var exception = new Error(translate.withArguments("no keyword attribute \"%0\" found in keyword container \"%1\"", ["contacts", "AddressType"]));
+            pTester.expectThat(function() {
+                new KeywordAttribute("AddressType", "contacts");
+            }).throwsException(exception).assert();
+        }
+    ),
+
+    new Test("should not throw error if no data is found but default value is defined",
+        function(pTester) {
+            pTester.expectThat(function() {
+                new KeywordAttribute("AddressType", "contact", "testDefault");
+            }).not().throwsException().assert();
+        }
+    ),
+]);
+
+
+var getValue = new TestSuite("KeywordAttribute.getValue", [
+    new Test("should throw error if attribute does not exist in container and no default value is defined",
+        function(pTester) {
+            var exception = new Error(translate.withArguments("no keyword attribute \"%0\" found in keyword container \"%1\"", ["asdf", "AddressType"]));
+
+            pTester.expectThat(function() {
+                var ka = new KeywordAttribute("AddressType", "asdf");
+                ka.getValue("abc");
+            }).throwsException(exception).assert();
+        }
+    ),
+        
+    new Test("should throw error if attribute is not assigned to keyword and no default value is defined",
+        function(pTester) {
+            var exception = new Error(translate.withArguments("no keyword attribute \"%0\" found in keyword \"%1\" from container \"%2\"", ["contact", "abc", "AddressType"]));
+
+            pTester.expectThat(function() {
+                var ka = new KeywordAttribute("AddressType", "contact");
+                ka.getValue("abc");
+            }).throwsException(exception).assert();
+        }
+    ),
+
+    new Test("should return default value if defined but attribute does not exist in container",
+        function(pTester) {
+            var ka = new KeywordAttribute("AddressType", "asdf", "testDefault");
+            var actualValue = ka.getValue("HOMEADDR");
+
+            pTester.expectThat(actualValue).equals("testDefault").assert();
+        }
+    ),
+
+    new Test("should return default value if defined and attribute exists in container but is not assigned to keyword",
+        function(pTester) {
+            var ka = new KeywordAttribute("AddressType", "contact", "testDefault");
+            var actualValue = ka.getValue("abc");
+
+            pTester.expectThat(actualValue).equals("testDefault").assert();
+        }
+    ),
+
+    new Test("should return keywords boolean value (actually a number)",
+        function(pTester) {
+            var ka = new KeywordAttribute("AddressType", "organisation");
+            var actualValue = ka.getValue("HOMEADDR");
+
+            pTester.expectThat(actualValue).isNumeric().assert();
+            pTester.expectThat(actualValue).equals("0").assert();
+        }
+    ),
+
+    new Test("should return keywords number value (actually a string)",
+        function(pTester) {
+            var ka = new KeywordAttribute("PaymentTerm", "dayNumber");
+            var actualValue = ka.getValue("PAYTERM30");
+
+            pTester.expectThat(actualValue).isNumeric().assert();
+            pTester.expectThat(actualValue).isString().assert();
+            pTester.expectThat(actualValue).equals("30.00").assert();
+        }
+    ),
+        
+    new Test("should return keywords char value (string)",
+        function(pTester) {
+            var ka = new KeywordAttribute("TaskStatus", "icon");
+            var actualValue = ka.getValue("ASSIGNED");
+
+            pTester.expectThat(actualValue).isString().assert();
+            pTester.expectThat(actualValue).equals("NEON:STATUS_ASSIGNED").assert();
+        }
+    ),
+        
+    new Test("should return keywords long char value (string)",
+        function(pTester) {
+            var ka = new KeywordAttribute("TicketType", "attributes");
+            var actualValue = ka.getValue("SUPPORTTICKET");
+
+            pTester.expectThat(actualValue).isString().assert();
+            pTester.expectThat(actualValue).equals('["ff8b1caf-cf30-4edb-b5ca-a9a219ba8399"]').assert();
+        }
+    ),
+]);
+
+
+var getSqlBuilderSelect = new TestSuite("KeywordAttribute.getSqlBuilderSelect", [
+    new Test("should return a SqlBuilder instance",
+        function(pTester) {
+            var ka = new KeywordAttribute("MemberRole", "Intern");
+            /** @type {SqlBuilder} */
+            var actualValue = ka.getSqlBuilderSelect();
+            
+            var expectQueryResult = [
+                "039fd6ae-b4ad-431e-86bf-59ed2f4df0a9",
+                "8cb1b843-713a-4193-aa50-9f5ca06820f8",
+                "9c421b0b-8529-4e07-9463-28d59fd027b6",
+                "b72294cd-3a46-4f71-ab93-72824f63f7f4",
+                "f78f229f-f809-4bd2-aca8-24e2f82fa220",
+            ];
+            var actualQueryResult = actualValue.orderBy("AB_KEYWORD_ATTRIBUTERELATION.AB_KEYWORD_ENTRY_ID").arrayColumn();
+
+            pTester.expectThat(actualValue).isInstanceOf("SqlBuilder").assert();
+            pTester.expectThat(actualQueryResult).equals(expectQueryResult).assert();
+        }
+    ),
+]);
+
+
+var tester = new Tester("Test KeywordAttribute_lib");
+tester.initCoverage(KeywordAttribute);
+tester.test(constructor);
+tester.test(getValue);
+tester.test(getSqlBuilderSelect);
+
+tester.summary();
+    
+result.object(tester.getResults());
diff --git a/process/Keyword_test/Keyword_test.aod b/process/Keyword_test/Keyword_test.aod
new file mode 100644
index 00000000000..e654f56663b
--- /dev/null
+++ b/process/Keyword_test/Keyword_test.aod
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+  <name>Keyword_test</name>
+  <title>[TEST] Keyword_lib</title>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <icon>VAADIN:CHECK_CIRCLE</icon>
+  <process>%aditoprj%/process/Keyword_test/process.js</process>
+  <alias>Data_alias</alias>
+  <variants>
+    <element>EXECUTABLE</element>
+  </variants>
+</process>
diff --git a/process/Keyword_test/process.js b/process/Keyword_test/process.js
new file mode 100644
index 00000000000..d1b1d910e9d
--- /dev/null
+++ b/process/Keyword_test/process.js
@@ -0,0 +1,143 @@
+import("system.result");
+import("system.translate");
+import("system.vars");
+import("Keyword_lib");
+import("UnitTest_lib");
+
+//this test will not work currently 
+//TODO: renable and fix the tests
+
+//var getContainerNames = new TestSuite("KeywordUtils.getContainerNames", [
+//    new Test("should return an alphabetically ascending ordered list of all keyword containers",
+//        function(pTester) {
+//            var actualValue = KeywordUtils.getContainerNames();
+//
+//            pTester.expectThat(actualValue).isArray().assert();
+//            pTester.expectThat(actualValue).hasMinLength(1).assert();
+//            pTester.expectThat(actualValue).elementAt(0).equals("ActivityCategory").assert();
+//            pTester.expectThat(actualValue).elementAt(-1).equals("YesNo").assert();
+//        }
+//    )
+//]);
+//
+//
+//var getCategoryNameById = new TestSuite("KeywordUtils.getCategoryNameById", [
+//    new Test("should return existing keyword category name for correct uuid",
+//        function(pTester) {
+//            var actualValue = KeywordUtils.getCategoryNameById("a55654b1-6a19-4d0c-b08d-cfbc12b5f7b0");
+//
+//            pTester.expectThat(actualValue).equals("MemberRole").assert();
+//        }
+//    ),
+//
+//    new Test("should return non-existing keyword category name for wrong uuid",
+//        function(pTester) {
+//            var actualValue = KeywordUtils.getCategoryNameById("a55654b1-6a19-4d0c-b08d-cfbc12b5f7b1");
+//
+//            pTester.expectThat(actualValue).equals("<unknown>").assert();
+//        }
+//    ),
+//
+//    new Test("should return non-existing keyword category name for missing uuid",
+//        function(pTester) {
+//            var actualValue = KeywordUtils.getCategoryNameById();
+//
+//            pTester.expectThat(actualValue).equals("<unknown>").assert();
+//        }
+//    ),
+//]);
+//
+//
+//var getCategoryIdByName = new TestSuite("KeywordUtils.getCategoryIdByName", [
+//    new Test("should return existing keyword uuid for correct category name",
+//        function(pTester) {
+//            var actualValue = KeywordUtils.getCategoryIdByName("MemberRole");
+//
+//            pTester.expectThat(actualValue).equals("a55654b1-6a19-4d0c-b08d-cfbc12b5f7b0").assert();
+//        }
+//    ),
+//
+//    new Test("should throw exception for wrong keyword category name",
+//        function(pTester) {
+//            var exception = new Error(translate.withArguments("no keyword category \"%0\" found", ["AddressTypes"]));
+//            pTester.expectThat(function() {
+//                KeywordUtils.getCategoryIdByName("AddressTypes");
+//            }).throwsException(exception).assert();
+//        }
+//    ),
+//
+//    new Test("should throw exception for missing keyword category name",
+//        function(pTester) {
+//            var exception = new Error(translate.withArguments("no keyword category \"%0\" found", [""]));
+//            pTester.expectThat(function() {
+//                KeywordUtils.getCategoryIdByName();
+//            }).throwsException(exception).assert();
+//        }
+//    ),
+//]);
+//
+//
+//var getEntryNamesAndIdsByContainer = new TestSuite("KeywordUtils.getEntryNamesAndIdsByContainer", [
+//    new Test("should return an array of all keywords and their ID's for given container",
+//        function(pTester) {
+//            var actualValue = KeywordUtils.getEntryNamesAndIdsByContainer("ActivityDirection");
+//
+//            pTester.expectThat(actualValue).isArray().assert();
+//            pTester.expectThat(actualValue).hasMinLength(1, {name: "array"}).assert();
+//            pTester.expectThat(actualValue).elementAt(0).isArray().assert();
+//            pTester.expectThat(actualValue).elementAt(0).hasLength(2).assert();
+//        }
+//    ),
+//
+//    new Test("should return an empty array for non-existent container",
+//        function(pTester) {
+//            var actualValue = KeywordUtils.getEntryNamesAndIdsByContainer("Asdf");
+//
+//            pTester.expectThat(actualValue).isArray().assert();
+//            pTester.expectThat(actualValue).hasLength(0, {name: "array"}).assert();
+//        }
+//    ),
+//]);
+//
+//
+//var exists = new TestSuite("KeywordUtils.exists", [
+//    new Test("should return a boolean indicating that a known keyword in a known container exists",
+//        function(pTester) {
+//            var actualValue = KeywordUtils.exists("VISIT", "ActivityCategory");
+//
+//            pTester.expectThat(actualValue).isBoolean().assert();
+//            pTester.expectThat(actualValue).equals(true, "known keyword exists in known container").assert();
+//        }
+//    ),
+//
+//    new Test("should return a boolean indicating that an unknown keyword in a known container does not exist",
+//        function(pTester) {
+//            var actualValue = KeywordUtils.exists("ASDF", "ActivityCategory");
+//
+//            pTester.expectThat(actualValue).isBoolean().assert();
+//            pTester.expectThat(actualValue).equals(false, "unknown keyword does not exist in known container").assert();
+//        }
+//    ),
+//
+//    new Test("should return a boolean indicating that a known keyword in an unknown container does not exist",
+//        function(pTester) {
+//            var actualValue = KeywordUtils.exists("VISIT", "Asdf");
+//
+//            pTester.expectThat(actualValue).isBoolean().assert();
+//            pTester.expectThat(actualValue).equals(false, "known keyword does not exist in unknown container").assert();
+//        }
+//    ),
+//]);
+//
+//
+//var tester = new Tester("Test Keyword_lib");
+//tester.initCoverage(KeywordUtils);
+//tester.test(getContainerNames);
+//tester.test(getCategoryNameById);
+//tester.test(getCategoryIdByName);
+//tester.test(getEntryNamesAndIdsByContainer);
+//tester.test(exists);
+//
+//tester.summary();
+//    
+//result.object(tester.getResults());
\ No newline at end of file
diff --git a/process/SqlBuilder_test/SqlBuilder_test.aod b/process/SqlBuilder_test/SqlBuilder_test.aod
new file mode 100644
index 00000000000..39922829116
--- /dev/null
+++ b/process/SqlBuilder_test/SqlBuilder_test.aod
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+  <name>SqlBuilder_test</name>
+  <title>[TEST] Sql_lib - SqlBuilder</title>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <icon>VAADIN:CHECK_CIRCLE</icon>
+  <process>%aditoprj%/process/SqlBuilder_test/process.js</process>
+  <alias>Data_alias</alias>
+  <variants>
+    <element>EXECUTABLE</element>
+  </variants>
+</process>
diff --git a/process/SqlBuilder_test/process.js b/process/SqlBuilder_test/process.js
new file mode 100644
index 00000000000..3ec9ec86ddb
--- /dev/null
+++ b/process/SqlBuilder_test/process.js
@@ -0,0 +1,1266 @@
+import("system.db");
+import("system.result");
+import("system.vars");
+import("system.translate");
+import("system.logging");
+import("system.SQLTYPES");
+import("Sql_lib");
+import("UnitTest_lib");
+
+//SqlBuilder-tests:
+var newSelectTests = new TestSuite("SqlLib.newSelect", [
+    new Test("newSelect with just a string should just use it as select",
+        function(pTester)
+        {
+            var actualValue = newSelect("MySuper, Field, String")
+
+            pTester.expectThat(actualValue).elementAt("_select").elementAt("_sqlStorage").equals("select MySuper, Field, String").assert();
+            pTester.expectThat(actualValue).elementAt("_select").elementAt("preparedValues").hasLength(0).assert();
+        }
+    ),
+
+    new Test("newSelect with just an array of strings should just use them concatenated as select",
+        function(pTester)
+        {
+            var actualValue = newSelect(["MySuper", "Field", "String"])
+
+            pTester.expectThat(actualValue).elementAt("_select").elementAt("_sqlStorage").equals("select MySuper, Field, String").assert();
+            pTester.expectThat(actualValue).elementAt("_select").elementAt("preparedValues").hasLength(0).assert();
+        }
+    ),
+
+    new Test("newSelect with just an SqlBuilder should use it as subselect",
+        function(pTester)
+        {
+            var actualValue = newSelect(new SqlBuilder().select("PERSONID").from("PERSON").where("PERSON.FIRSTNAME", "Fritz"))
+
+            pTester.expectThat(actualValue).elementAt("_select").elementAt("_sqlStorage").equals("select (select PERSONID from PERSON where PERSON.FIRSTNAME = ?)").assert();
+            pTester.expectThat(actualValue).elementAt("_select").elementAt("preparedValues").hasLength(1).assert();
+        }
+    ),
+
+    new Test("newSelect an array of Strings and SqlBuilders should add them all",
+        function(pTester)
+        {
+            var actualValue = newSelect(["MySuper", "Field", "String", new SqlBuilder().select("PERSONID").from("PERSON").where("PERSON.FIRSTNAME", "Fritz")])
+
+            pTester.expectThat(actualValue).elementAt("_select").elementAt("_sqlStorage").equals("select MySuper, Field, String, (select PERSONID from PERSON where PERSON.FIRSTNAME = ?)").assert();
+            pTester.expectThat(actualValue).elementAt("_select").elementAt("preparedValues").hasLength(1).assert();
+        }
+    ),
+]);
+
+
+var validAndUsageTests = new TestSuite("SqlLib.validAndUsage", [
+    new Test("and should just add simple strings as condition just as it is",
+        function(pTester)
+        {
+            var actualValue = new SqlBuilder()
+                                .where("PERSON.FIRSTNAME = 'Tim'") // NOTE: you should not do this as this does not add a real prepared statement with "?"
+                                .and("PERSON.LASTNAME = 'Admin'")
+
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("_sqlStorage").equals("PERSON.FIRSTNAME = 'Tim' and PERSON.LASTNAME = 'Admin'").assert();
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("preparedValues").hasLength(0).assert();
+        }
+    ),
+
+    new Test("and should add a condition if field and value are passed",
+        function(pTester)
+        {
+            var actualValue = new SqlBuilder()
+                                .where("PERSON.FIRSTNAME", "Tim")
+                                .and("PERSON.LASTNAME", "Admin")
+
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("_sqlStorage").equals("PERSON.FIRSTNAME = ? and PERSON.LASTNAME = ?").assert();
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("preparedValues").hasLength(2).assert();
+        }
+    ),
+
+    new Test("and should add a condition if value is an empty string",
+        function(pTester)
+        {
+            var actualValue = new SqlBuilder()
+                                .where("PERSON.FIRSTNAME", "")
+                                .and("PERSON.LASTNAME", "")
+
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("_sqlStorage").equals("PERSON.FIRSTNAME = ? and PERSON.LASTNAME = ?").assert();
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("preparedValues").hasLength(2).assert();
+        }
+    ),
+
+    new Test("and should add a condition if field and value as jdito-var are passed",
+        function(pTester)
+        {
+            vars.set("$global.TestUnitValueName", "Tim");
+            var actualValue = new SqlBuilder()
+                                .where("PERSON.FIRSTNAME", "$global.TestUnitValueName")
+
+            pTester.expectThat(actualValue.toString()).equals("( PERSON.FIRSTNAME = 'Tim' ) ").assert();
+        }
+    ),
+
+    new Test("$ should be escaped by a second $ and the string should therefore just be used as string and not as jdito variable",
+        function(pTester)
+        {
+            var actualValue = new SqlBuilder()
+                                .where("PERSON.FIRSTNAME", "$$mySuperString")
+
+            pTester.expectThat(actualValue.toString()).equals("( PERSON.FIRSTNAME = '$mySuperString' ) ").assert();
+        }
+    ),
+
+    new Test("and should add a condition if value is a jdito-var containing an empty string",
+        function(pTester)
+        {
+            vars.set("$global.TestingVarEmptyString", "");
+            var actualValue = new SqlBuilder()
+                                .where("PERSON.FIRSTNAME", "$global.TestingVarEmptyString")
+                                .and("PERSON.LASTNAME", "$global.TestingVarEmptyString")
+
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("_sqlStorage").equals("PERSON.FIRSTNAME = ? and PERSON.LASTNAME = ?").assert();
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("preparedValues").hasLength(2).assert();
+        }
+    ),
+
+    new Test("and should use the given condition pattern",
+        function(pTester)
+        {
+            var actualValue = new SqlBuilder()
+                                .where("PERSON.FIRSTNAME", "Tim", "# <> ?")
+                                .and("PERSON.LASTNAME", "Admin")
+
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("_sqlStorage").equals("PERSON.FIRSTNAME <> ? and PERSON.LASTNAME = ?").assert();
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("preparedValues").hasLength(2).assert();
+        }
+    ),
+
+    new Test("and should use the given SQLTYPE if provided",
+        function(pTester)
+        {
+            var actualValue = new SqlBuilder()
+                                .where("PERSON.FIRSTNAME", 6, null, SQLTYPES.INTEGER)
+                                .and("PERSON.LASTNAME", 7, undefined, SQLTYPES.INTEGER)
+                                .and("PERSON.LASTNAME", 8, "# <> ?", SQLTYPES.INTEGER)
+
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("_sqlStorage").equals("PERSON.FIRSTNAME = ? and PERSON.LASTNAME = ? and PERSON.LASTNAME <> ?").assert();
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("preparedValues").hasLength(3).assert();
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("preparedValues").elementAt(0).elementAt(1).equals(SQLTYPES.INTEGER).assert();
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("preparedValues").elementAt(1).elementAt(1).equals(SQLTYPES.INTEGER).assert();
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("preparedValues").elementAt(2).elementAt(1).equals(SQLTYPES.INTEGER).assert();
+        }
+    ),
+
+    new Test("and only with a prepared statement-array should just use it as it is",
+        function(pTester)
+        {
+            var actualValue = new SqlBuilder()
+                                .where([
+                                    "PERSON.FIRSTNAME = ?", [["Peter", 12]]
+                                ])
+                                .and([
+                                    "exists (select * FROM CONTACT where PERSON_ID = PERSONID)", []
+                                ])
+
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("_sqlStorage").equals(" ( PERSON.FIRSTNAME = ? )  and  ( exists (select * FROM CONTACT where PERSON_ID = PERSONID) ) ").assert();
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("preparedValues").hasLength(1).assert();
+        }
+    ),
+
+    new Test("and only with a SqlBulder object should just use the condition from it",
+        function(pTester)
+        {
+            var actualValue = new SqlBuilder()
+                                .where(new SqlBuilder()
+                                    .select("TEST")
+                                    .from("PERSON")
+                                    .where("PERSON.FIRSTNAME", "Tim")
+                                    .and("PERSON.LASTNAME", "Admin"))
+
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("_sqlStorage").equals(" ( PERSON.FIRSTNAME = ? and PERSON.LASTNAME = ? ) ").assert();
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("preparedValues").hasLength(2).assert();
+        }
+    ),
+
+    new Test("and with a builder as value and condition (field is null|undefined) should add the whole builder as subquery",
+        function(pTester)
+        {
+            var actualValue = new SqlBuilder()
+                                .where(null, new SqlBuilder()
+                                    .select("FIRSTNAME")
+                                    .from("PERSON")
+                                    .where("PERSON.FIRSTNAME", "Tim")
+                                    .and("PERSON.LASTNAME", "Admin"),
+                                    "exists ?")  // Note: you can use SqlBuilder.EXISTS() instead of  "exists ?"
+
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("_sqlStorage").equals("exists  ( select FIRSTNAME from PERSON where PERSON.FIRSTNAME = ? and PERSON.LASTNAME = ? ) ").assert();
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("preparedValues").hasLength(2).assert();
+        }
+    ),
+
+    new Test("and with a builder as value and field should add the whole builder as subquery with field = (subquery)",
+        function(pTester)
+        {
+            var actualValue = new SqlBuilder()
+                                .where("PERSON.FIRSTNAME", new SqlBuilder()
+                                    .select("FIRSTNAME")
+                                    .from("PERSON")
+                                    .where("PERSON.FIRSTNAME", "Tim")
+                                    .and("PERSON.LASTNAME", "Admin"))
+
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("_sqlStorage").equals("PERSON.FIRSTNAME =  ( select FIRSTNAME from PERSON where PERSON.FIRSTNAME = ? and PERSON.LASTNAME = ? ) ").assert();
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("preparedValues").hasLength(2).assert();
+        }
+    ),
+
+    new Test("and with a prepared statement-array as value and field is null|undefined should add the whole statement as subquery",
+        function(pTester)
+        {
+            var actualValue = new SqlBuilder()
+                                .where(null, ["select FIRSTNAME from PERSON.FIRSTNAME = ?", [["Peter", 12]]], "exists ?")
+                                .and(null, ["exists (select FIRSTNAME from PERSON.FIRSTNAME = ?)", [["Peter", 12]]]) // also without pCond it should work as the condition could be included in the prep statement
+
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("_sqlStorage").equals("exists  ( select FIRSTNAME from PERSON.FIRSTNAME = ? )  and  ( exists (select FIRSTNAME from PERSON.FIRSTNAME = ?) ) ").assert();
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("preparedValues").hasLength(2).assert();
+        }
+    ),
+
+    new Test("and with a prepared statement-array as value and field should add the whole statement as subquery with field = (subquery)",
+        function(pTester)
+        {
+            var actualValue = new SqlBuilder()
+                                .where("PERSON.FIRSTNAME", ["select FIRSTNAME from PERSON.FIRSTNAME = ?", [["Peter", 12]]])
+
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("_sqlStorage").equals("PERSON.FIRSTNAME =  ( select FIRSTNAME from PERSON.FIRSTNAME = ? ) ").assert();
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("preparedValues").hasLength(1).assert();
+        }
+    ),
+]);
+
+
+var validOrUsageTests = new TestSuite("SqlLib.validOrUsage", [
+    new Test("or should just add simple strings as condition just as it is",
+        function(pTester)
+        {
+            var actualValue = new SqlBuilder()
+                                .where("PERSON.FIRSTNAME = 'Tim'") // NOTE: you should not do this as this does not add a real prepared statement with "?"
+                                .or("PERSON.LASTNAME = 'Admin'")
+
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("_sqlStorage").equals("PERSON.FIRSTNAME = 'Tim' or PERSON.LASTNAME = 'Admin'").assert();
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("preparedValues").hasLength(0).assert();
+        }
+    ),
+
+    new Test("or should add a condition if field and value are passed",
+        function(pTester)
+        {
+            var actualValue = new SqlBuilder()
+                                .where("PERSON.FIRSTNAME", "Tim")
+                                .or("PERSON.LASTNAME", "Admin")
+
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("_sqlStorage").equals("PERSON.FIRSTNAME = ? or PERSON.LASTNAME = ?").assert();
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("preparedValues").hasLength(2).assert();
+        }
+    ),
+
+    new Test("or should use the given condition pattern",
+        function(pTester)
+        {
+            var actualValue = new SqlBuilder()
+                                .where("PERSON.FIRSTNAME", "Tim", "# <> ?")
+                                .or("PERSON.LASTNAME", "Admin")
+
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("_sqlStorage").equals("PERSON.FIRSTNAME <> ? or PERSON.LASTNAME = ?").assert();
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("preparedValues").hasLength(2).assert();
+        }
+    ),
+
+    new Test("or should use the given SQLTYPE if provided",
+        function(pTester)
+        {
+            var actualValue = new SqlBuilder()
+                                .where("PERSON.FIRSTNAME", 6, null, SQLTYPES.INTEGER)
+                                .or("PERSON.LASTNAME", 7, undefined, SQLTYPES.INTEGER)
+                                .or("PERSON.LASTNAME", 8, "# <> ?", SQLTYPES.INTEGER)
+
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("_sqlStorage").equals("PERSON.FIRSTNAME = ? or PERSON.LASTNAME = ? or PERSON.LASTNAME <> ?").assert();
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("preparedValues").hasLength(3).assert();
+        }
+    ),
+
+    new Test("or only with a prepared statement-array should just use it as it is",
+        function(pTester)
+        {
+            var actualValue = new SqlBuilder()
+                                .where([
+                                    "PERSON.FIRSTNAME = ?", [["Peter", 12]]
+                                ])
+                                .or([
+                                    "exists (select * FROM CONTACT where PERSON_ID = PERSONID)", []
+                                ])
+
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("_sqlStorage").equals(" ( PERSON.FIRSTNAME = ? )  or  ( exists (select * FROM CONTACT where PERSON_ID = PERSONID) ) ").assert();
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("preparedValues").hasLength(1).assert();
+        }
+    ),
+
+    new Test("or only with a SqlBulder object should just use the condition from it",
+        function(pTester)
+        {
+            var actualValue = new SqlBuilder()
+                                .where(new SqlBuilder()
+                                    .where("PERSON.FIRSTNAME", "Tim")
+                                    .or("PERSON.LASTNAME", "Admin"))
+
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("_sqlStorage").equals(" ( PERSON.FIRSTNAME = ? or PERSON.LASTNAME = ? ) ").assert();
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("preparedValues").hasLength(2).assert();
+        }
+    ),
+
+    new Test("or with a builder as value and condition (field is null|undefined) should add the whole builder as subquery",
+        function(pTester)
+        {
+            var actualValue = new SqlBuilder()
+                                .where(null, new SqlBuilder()
+                                    .select("FIRSTNAME")
+                                    .from("PERSON")
+                                    .where("PERSON.FIRSTNAME", "Tim")
+                                    .or("PERSON.LASTNAME", "Admin"),
+                                    "exists ?")
+
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("_sqlStorage").equals("exists  ( select FIRSTNAME from PERSON where PERSON.FIRSTNAME = ? or PERSON.LASTNAME = ? ) ").assert();
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("preparedValues").hasLength(2).assert();
+        }
+    ),
+
+    new Test("or with a builder as value and field should add the whole builder as subquery with field = (subquery)",
+        function(pTester)
+        {
+            var actualValue = new SqlBuilder()
+                                .where("PERSON.FIRSTNAME", new SqlBuilder()
+                                    .select("FIRSTNAME")
+                                    .from("PERSON")
+                                    .where("PERSON.FIRSTNAME", "Tim")
+                                    .or("PERSON.LASTNAME", "Admin"))
+
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("_sqlStorage").equals("PERSON.FIRSTNAME =  ( select FIRSTNAME from PERSON where PERSON.FIRSTNAME = ? or PERSON.LASTNAME = ? ) ").assert();
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("preparedValues").hasLength(2).assert();
+        }
+    ),
+
+    new Test("or with a prepared statement-array as value and field is null|undefined should add the whole statement as subquery",
+        function(pTester)
+        {
+            var actualValue = new SqlBuilder()
+                                .where(null, ["select FIRSTNAME from PERSON.FIRSTNAME = ?", [["Peter", 12]]], "exists ?")
+                                .or(null, ["exists (select FIRSTNAME from PERSON.FIRSTNAME = ?)", [["Peter", 12]]]) // also without pCond it should work as the condition could be included in the prep statement
+
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("_sqlStorage").equals("exists  ( select FIRSTNAME from PERSON.FIRSTNAME = ? )  or  ( exists (select FIRSTNAME from PERSON.FIRSTNAME = ?) ) ").assert();
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("preparedValues").hasLength(2).assert();
+        }
+    ),
+]);
+
+var combinedAndOrTests = new TestSuite("SqlLib.combinedAndOr", [
+    new Test("or combining two and",
+        function(pTester)
+        {
+            var actualValue = new SqlBuilder()
+                            .where("PERSON.FIRSTNAME", "Tim")
+                            .and("PERSON.LASTNAME", "Admin")
+                            .or(new SqlBuilder()
+                                    .where("PERSON.FIRSTNAME", "Peter")
+                                    .and("PERSON.LASTNAME", "Müller"))
+
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("_sqlStorage").equals("(PERSON.FIRSTNAME = ? and PERSON.LASTNAME = ?) or  ( PERSON.FIRSTNAME = ? and PERSON.LASTNAME = ? ) ").assert();
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("preparedValues").hasLength(4).assert();
+        }
+    ),
+
+    new Test("and combining two or",
+        function(pTester)
+        {
+            var actualValue = new SqlBuilder()
+                            .where(new SqlBuilder()
+                                    .where("PERSON.FIRSTNAME", "Tim")
+                                    .or("PERSON.LASTNAME", "Admin"))
+                            .and(new SqlBuilder()
+                                    .where("PERSON.FIRSTNAME", "Peter")
+                                    .or("PERSON.LASTNAME", "Müller"))
+
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("_sqlStorage").equals(" ( PERSON.FIRSTNAME = ? or PERSON.LASTNAME = ? )  and  ( PERSON.FIRSTNAME = ? or PERSON.LASTNAME = ? ) ").assert();
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("preparedValues").hasLength(4).assert();
+        }
+    ),
+
+    new Test("some and/or combinations in one select",
+        function(pTester)
+        {
+            var actualValue = new SqlBuilder()
+                            .where("PERSON.FIRSTNAME", "Tim")
+                            .or("PERSON.FIRSTNAME", "Franz")
+                            .and("PERSON.LASTNAME", "Admin")
+                            .and(new SqlBuilder()
+                                    .where("PERSON.FIRSTNAME", "Peter")
+                                    .or("PERSON.LASTNAME", "Müller"))
+                            .or("PERSON.FIRSTNAME", "Franz")
+                            .and("PERSON.FIRSTNAME", "Franz")
+                            .or(new SqlBuilder()
+                                    .where("PERSON.FIRSTNAME", "Peter")
+                                    .and("PERSON.LASTNAME", "Müller")
+                                    .and(new SqlBuilder()
+                                            .where("PERSON.FIRSTNAME", "Peter")
+                                            .or("PERSON.LASTNAME", "Müller")))
+
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("_sqlStorage").equals("PERSON.FIRSTNAME = ? or PERSON.FIRSTNAME = ? and PERSON.LASTNAME = ? and  ( PERSON.FIRSTNAME = ? or PERSON.LASTNAME = ? )  or (PERSON.FIRSTNAME = ?) and PERSON.FIRSTNAME = ? or  ( PERSON.FIRSTNAME = ? and PERSON.LASTNAME = ? and  ( PERSON.FIRSTNAME = ? or PERSON.LASTNAME = ? )  ) ").assert();
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("preparedValues").hasLength(11).assert();
+        }
+    ),
+]);
+
+
+var ifSetTests = new TestSuite("SqlLib.ifSet", [
+    new Test("simple and if set with all types of empty values.",
+        function(pTester)
+        {
+            var actualValue = new SqlBuilder()
+                            .whereIfSet("PERSON.LASTNAME", null)
+                            .andIfSet("PERSON.LASTNAME", undefined)
+
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("_sqlStorage").equals("", "no sql should be added").assert();
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("preparedValues").hasLength(0, "no params should be added").assert();
+        }
+    ),
+
+    new Test("jdito variable with null",
+        function(pTester)
+        {
+            vars.set("$global.TestingVarNull", null);
+
+            var actualValue = new SqlBuilder()
+                            .whereIfSet("PERSON.FIRSTNAME", "$global.TestingVarNull")
+
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("_sqlStorage").equals("", "no sql should be added").assert();
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("preparedValues").hasLength(0, "no params should be added").assert();
+        }
+    ),
+
+    new Test("empty simple conditions",
+        function(pTester)
+        {
+            var actualValue = new SqlBuilder()
+                            .whereIfSet("")
+                            .andIfSet(["", []])
+                            .andIfSet(new SqlBuilder())
+
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("_sqlStorage").equals("", "no sql should be added").assert();
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("preparedValues").hasLength(0, "no params should be added").assert();
+        }
+    ),
+
+    new Test("empty subqueries",
+        function(pTester)
+        {
+            var actualValue = new SqlBuilder()
+                            .whereIfSet("PERSON.FIRSTNAME", ["", []])
+                            .andIfSet("PERSON.LASTNAME", new SqlBuilder())
+
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("_sqlStorage").equals("", "no sql should be added").assert();
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("preparedValues").hasLength(0, "no params should be added").assert();
+        }
+    ),
+]);
+
+
+function cleanWrapperTests()
+{
+    try {
+        db.runStatement("drop table SQL_LIB_TEST_TABLE");
+    } catch(ex) {}
+
+    try {
+        db.deleteData("PERSON", "PERSONID in ('TEST-5', 'TEST-6')")
+    } catch(ex) {}
+
+}
+
+
+var dbWrapperTests = new TestSuite("SqlLib.dbWrapper", [
+    new Test("cell should load only one value",
+        function(pTester)
+        {
+            var builder = new SqlBuilder()
+                                .select("FIRSTNAME")
+                                .from("PERSON")
+                                .where("PERSON.PERSONID", "TEST-5")
+            var actualValue = builder.cell()
+
+            pTester.expectThat(actualValue).equals("Franz").assert();
+        }
+    ),
+
+    new Test("cell should just return '' if no condition set but pExecuteOnlyIfConditionExists is true",
+        function(pTester)
+        {
+            var builder = new SqlBuilder()
+                                .select("FIRSTNAME")
+                                .from("PERSON")
+            var actualValue = builder.cell(true)
+
+            pTester.expectThat(actualValue).equals("").assert();
+        }
+    ),
+
+    new Test("cell should return a value if no condition set and pExecuteOnlyIfConditionExists is false",
+        function(pTester)
+        {
+            var builder = new SqlBuilder()
+                                .select("FIRSTNAME")
+                                .from("PERSON");
+
+            var actualValue = builder.cell(false)
+
+            pTester.expectThat(actualValue).not().equals("").assert();
+            pTester.expectThat(actualValue).not().isNull().assert();
+            pTester.expectThat(actualValue).not().isUndefined().assert();
+        }
+    ),
+
+    new Test("array should load an array of values",
+        function(pTester)
+        {
+            var builder = new SqlBuilder()
+                                .select("FIRSTNAME, LASTNAME")
+                                .from("PERSON")
+                                .where("PERSON.PERSONID", "TEST-5");
+
+            var actualValue = builder.array(db.ROW);
+            pTester.expectThat(actualValue).elementAt(0).equals("Franz", {name: "firstname"}).assert();
+            pTester.expectThat(actualValue).elementAt(1).equals("Müller", {name: "lastname"}).assert();
+        }
+    ),
+
+    new Test("array should return an empty array if no condition set but pExecuteOnlyIfConditionExists is true",
+        function(pTester)
+        {
+            var builder = new SqlBuilder()
+                                .select("FIRSTNAME, LASTNAME")
+                                .from("PERSON")
+
+            var actualValue = builder.array(db.ROW, true);
+            pTester.expectThat(actualValue).hasLength(0).assert();
+        }
+    ),
+
+    new Test("array should return a non-empty array if no condition set and pExecuteOnlyIfConditionExists is false",
+        function(pTester)
+        {
+            var builder = new SqlBuilder()
+                                .select("FIRSTNAME, LASTNAME")
+                                .from("PERSON")
+
+            var actualValue = builder.array(db.ROW, false);
+            pTester.expectThat(actualValue).hasMinLength(1).assert();
+        }
+    ),
+
+    new Test("table should load an array of arrays with values",
+        function(pTester)
+        {
+            var builder = new SqlBuilder()
+                                .select("FIRSTNAME, LASTNAME")
+                                .from("PERSON")
+                                .where("PERSON.PERSONID", "TEST-5")
+                                .or("PERSON.PERSONID", "TEST-6")
+                                .orderBy("PERSONID asc");
+
+            var actualValue = builder.table();
+            pTester.expectThat(actualValue).elementAt(0).elementAt(0).equals("Franz", {name: "firstname"}).assert();
+            pTester.expectThat(actualValue).elementAt(0).elementAt(1).equals("Müller", {name: "lastname"}).assert();
+
+            pTester.expectThat(actualValue).elementAt(1).elementAt(0).equals("Marco", {name: "firstname"}).assert();
+            pTester.expectThat(actualValue).elementAt(1).elementAt(1).equals("Polo", {name: "lastname"}).assert();
+        }
+    ),
+
+    new Test("table should return an empty array if no condition set but pExecuteOnlyIfConditionExists is true",
+        function(pTester)
+        {
+            var builder = new SqlBuilder()
+                                .select("FIRSTNAME, LASTNAME")
+                                .from("PERSON");
+
+            var actualValue = builder.table(true);
+
+            pTester.expectThat(actualValue).hasLength(0).assert();
+        }
+    ),
+
+    new Test("table should return a non-empty array if no condition set and pExecuteOnlyIfConditionExists is false",
+        function(pTester)
+        {
+            var builder = new SqlBuilder()
+                                .select("FIRSTNAME, LASTNAME")
+                                .from("PERSON");
+
+            var actualValue = builder.table(false);
+            pTester.expectThat(actualValue).hasMinLength(1).assert();
+        }
+    ),
+
+    new Test("delete should delete the data and use the from and condition from the builder",
+        function(pTester)
+        {
+            db.deleteData("SQL_LIB_TEST_TABLE", "TESTID = 'TEST-7'");
+            db.insertData("SQL_LIB_TEST_TABLE", ["TESTID", "FIRSTNAME", "LASTNAME"], null, ["TEST-7", "Ludwig", "Fischer"]);
+
+            var builder = new SqlBuilder()
+                                .from("SQL_LIB_TEST_TABLE")
+                                .where("SQL_LIB_TEST_TABLE.TESTID", "TEST-7");
+
+            var actualValue = builder.deleteData();
+            pTester.expectThat(actualValue).equals(1).assert();
+        }
+    ),
+
+    new Test("delete should delete the data from the provided table and use the condition from the builder. It ignores .from if a table is given.",
+        function(pTester)
+        {
+            db.deleteData("SQL_LIB_TEST_TABLE", "TESTID = 'TEST-7'");
+            db.insertData("SQL_LIB_TEST_TABLE", ["TESTID", "FIRSTNAME", "LASTNAME"], null, ["TEST-7", "Ludwig", "Fischer"]);
+
+            var builder = new SqlBuilder()
+                                .from("PERSON")
+                                .where("SQL_LIB_TEST_TABLE.TESTID", "TEST-7");
+
+            var actualValue = builder.deleteData(false, "SQL_LIB_TEST_TABLE");
+            pTester.expectThat(actualValue).equals(1).assert();
+        }
+    ),
+
+    new Test("delete should delete ALL data from a table if the builder has no condition and pExecuteOnlyIfConditionExists is false",
+        function(pTester)
+        {
+            db.deleteData("SQL_LIB_TEST_TABLE", "TESTID in ('TEST-7', 'TEST-8')");
+            db.insertData("SQL_LIB_TEST_TABLE", ["TESTID", "FIRSTNAME", "LASTNAME"], null, ["TEST-7", "Ludwig", "Fischer"]);
+            db.insertData("SQL_LIB_TEST_TABLE", ["TESTID", "FIRSTNAME", "LASTNAME"], null, ["TEST-8", "Ludwig", "Fischer"]);
+
+            var builder = new SqlBuilder()
+                                .from("SQL_LIB_TEST_TABLE")
+
+            var actualValue = builder.deleteData(false);
+            pTester.expectThat(actualValue).equals(2).assert();
+        }
+    ),
+
+    new Test("delete should delete NO data from a table if the builder has no condition and pExecuteOnlyIfConditionExists is true",
+        function(pTester)
+        {
+            db.deleteData("SQL_LIB_TEST_TABLE", "TESTID in ('TEST-7', 'TEST-8')");
+            db.insertData("SQL_LIB_TEST_TABLE", ["TESTID", "FIRSTNAME", "LASTNAME"], null, ["TEST-7", "Ludwig", "Fischer"]);
+            db.insertData("SQL_LIB_TEST_TABLE", ["TESTID", "FIRSTNAME", "LASTNAME"], null, ["TEST-8", "Ludwig", "Fischer"]);
+
+            var builder = new SqlBuilder()
+                                .from("SQL_LIB_TEST_TABLE")
+
+            var actualValue = builder.deleteData(true);
+            pTester.expectThat(actualValue).equals(0).assert();
+        }
+    ),
+
+    new Test("update should update the data and use the from and condition from the builder",
+        function(pTester)
+        {
+            db.deleteData("SQL_LIB_TEST_TABLE", "TESTID = 'TEST-7'");
+            db.insertData("SQL_LIB_TEST_TABLE", ["TESTID", "FIRSTNAME", "LASTNAME"], null, ["TEST-7", "Ludwig", "Fischer"]);
+
+            var builder = new SqlBuilder()
+                                .from("SQL_LIB_TEST_TABLE")
+                                .where("SQL_LIB_TEST_TABLE.TESTID", "TEST-7");
+
+            builder.updateData(false, undefined, ["FIRSTNAME"], null, ["Fritz"]);
+
+            var actualValue = db.cell("select FIRSTNAME from SQL_LIB_TEST_TABLE where SQL_LIB_TEST_TABLE.TESTID = 'TEST-7'")
+
+            pTester.expectThat(actualValue).equals("Fritz").assert();
+        }
+    ),
+
+    new Test("update should update the data from the provided table and use the condition from the builder. It ignores .from if a table is given.",
+        function(pTester)
+        {
+            db.deleteData("SQL_LIB_TEST_TABLE", "TESTID = 'TEST-7'");
+            db.insertData("SQL_LIB_TEST_TABLE", ["TESTID", "FIRSTNAME", "LASTNAME"], null, ["TEST-7", "Ludwig", "Fischer"]);
+
+            var builder = new SqlBuilder()
+                                .from("PERSON")
+                                .where("SQL_LIB_TEST_TABLE.TESTID", "TEST-7");
+
+            builder.updateData(false, "SQL_LIB_TEST_TABLE", ["FIRSTNAME"], null, ["Fritz"]);
+
+            var actualValue = db.cell("select FIRSTNAME from SQL_LIB_TEST_TABLE where SQL_LIB_TEST_TABLE.TESTID = 'TEST-7'")
+
+            pTester.expectThat(actualValue).equals("Fritz").assert();
+        }
+    ),
+
+    new Test("update should update ALL data from a table if the builder has no condition and pExecuteOnlyIfConditionExists is false",
+        function(pTester)
+        {
+            db.deleteData("SQL_LIB_TEST_TABLE", "TESTID in ('TEST-7', 'TEST-8')");
+            db.insertData("SQL_LIB_TEST_TABLE", ["TESTID", "FIRSTNAME", "LASTNAME"], null, ["TEST-7", "Ludwig", "Fischer"]);
+            db.insertData("SQL_LIB_TEST_TABLE", ["TESTID", "FIRSTNAME", "LASTNAME"], null, ["TEST-8", "Franz", "Fischer"]);
+
+            var builder = new SqlBuilder()
+                                .from("SQL_LIB_TEST_TABLE")
+
+            builder.updateData(false, undefined, ["FIRSTNAME"], null, ["Fritz"]);
+
+            var actualValue1 = db.cell("select FIRSTNAME from SQL_LIB_TEST_TABLE where SQL_LIB_TEST_TABLE.TESTID = 'TEST-7'")
+            var actualValue2 = db.cell("select FIRSTNAME from SQL_LIB_TEST_TABLE where SQL_LIB_TEST_TABLE.TESTID = 'TEST-8'")
+
+            pTester.expectThat(actualValue1).equals("Fritz", "TEST-7 should have Firstname Fritz").assert();
+            pTester.expectThat(actualValue2).equals("Fritz", "TEST-8 should have Firstname Fritz").assert();
+        }
+    ),
+
+    new Test("update should update NO data from a table if the builder has no condition and pExecuteOnlyIfConditionExists is true",
+        function(pTester)
+        {
+            db.deleteData("SQL_LIB_TEST_TABLE", "TESTID in ('TEST-7', 'TEST-8')")
+            db.insertData("SQL_LIB_TEST_TABLE", ["TESTID", "FIRSTNAME", "LASTNAME"], null, ["TEST-7", "Ludwig", "Fischer"]);
+            db.insertData("SQL_LIB_TEST_TABLE", ["TESTID", "FIRSTNAME", "LASTNAME"], null, ["TEST-8", "Franz", "Fischer"]);
+
+            var builder = new SqlBuilder()
+                                .from("SQL_LIB_TEST_TABLE")
+
+            builder.updateData(true, undefined, ["FIRSTNAME"], null, ["Fritz"]);
+
+            var actualValue1 = db.cell("select FIRSTNAME from SQL_LIB_TEST_TABLE where SQL_LIB_TEST_TABLE.TESTID = 'TEST-7'")
+            var actualValue2 = db.cell("select FIRSTNAME from SQL_LIB_TEST_TABLE where SQL_LIB_TEST_TABLE.TESTID = 'TEST-8'")
+
+            pTester.expectThat(actualValue1).equals("Ludwig", "TEST-7 should have Firstname Ludwig").assert();
+            pTester.expectThat(actualValue2).equals("Franz", "TEST-8 should have Firstname Franz").assert();
+        }
+    ),
+], function preAll()
+{
+    // remove data which may exist if previous test-run failed and postAll was not executed
+    cleanWrapperTests();
+
+    // add table for save testing of deletes
+    db.runStatement("create table SQL_LIB_TEST_TABLE (TESTID varchar(36), FIRSTNAME varchar(100), LASTNAME varchar(100))");
+
+    // add test persons
+    db.insertData("PERSON", ["PERSONID", "FIRSTNAME", "LASTNAME", "USER_NEW", "DATE_NEW"], null, ["TEST-5", "Franz", "Müller", "testuser", vars.get("$sys.date")])
+    db.insertData("PERSON", ["PERSONID", "FIRSTNAME", "LASTNAME", "USER_NEW", "DATE_NEW"], null, ["TEST-6", "Marco", "Polo", "testuser", vars.get("$sys.date")])
+}, undefined, undefined, function postAll()
+{
+    cleanWrapperTests();
+})
+
+
+var mandatoryErrorTests = new TestSuite("SqlLib.mandatoryError", [
+// and
+    new Test("and without parameter should error",
+        function(pTester)
+        {
+            pTester.expectThat(function() {
+                new SqlBuilder().where().or();
+            }).throwsException(SqlBuilder._ERROR_NO_PARAMETER_PROVIDED()).assert();
+        }
+    ),
+
+    new Test("and with null as value should error",
+        function(pTester)
+        {
+            pTester.expectThat(function() {
+                new SqlBuilder().where().or("PERSON.FIRSTNAME", null);
+            }).throwsException(SqlBuilder._ERROR_VALUE_IS_MANDATORY()).assert();
+        }
+    ),
+
+    new Test("and with undefined as value should error",
+        function(pTester)
+        {
+            pTester.expectThat(function() {
+                new SqlBuilder().where().or("PERSON.FIRSTNAME", undefined);
+            }).throwsException(SqlBuilder._ERROR_VALUE_IS_MANDATORY()).assert();
+        }
+    ),
+
+    new Test("and with a jdito-var containing null should error",
+        function(pTester)
+        {
+            vars.set("$global.TestingVarNull", null);
+
+            pTester.expectThat(function() {
+                new SqlBuilder().where().or("PERSON.FIRSTNAME", "$global.TestingVarNull");
+            }).throwsException(SqlBuilder._ERROR_VALUE_IS_MANDATORY_JDITO_VAR()).assert();
+        }
+    ),
+
+    new Test("and with an empty sql-builder as subquery should error",
+        function(pTester)
+        {
+            pTester.expectThat(function() {
+                new SqlBuilder().where().or("PERSON.FIRSTNAME", new SqlBuilder());
+            }).throwsException(SqlBuilder._ERROR_VALUE_IS_MANDATORY()).assert();
+        }
+    ),
+
+    new Test("and with an empty prepared statement as subquery should error",
+        function(pTester)
+        {
+            pTester.expectThat(function() {
+                new SqlBuilder().where().or("PERSON.FIRSTNAME", ["", []]);
+            }).throwsException(SqlBuilder._ERROR_VALUE_IS_MANDATORY()).assert();
+        }
+    ),
+
+
+// or
+    new Test("or without parameter should error",
+        function(pTester)
+        {
+            pTester.expectThat(function() {
+                new SqlBuilder().where().or();
+            }).throwsException(SqlBuilder._ERROR_NO_PARAMETER_PROVIDED()).assert();
+        }
+    ),
+
+    new Test("or with null as value should error",
+        function(pTester)
+        {
+            pTester.expectThat(function() {
+                new SqlBuilder().where().or("PERSON.FIRSTNAME", null);
+            }).throwsException(SqlBuilder._ERROR_VALUE_IS_MANDATORY()).assert();
+        }
+    ),
+
+    new Test("or with undefined as value should error",
+        function(pTester)
+        {
+            pTester.expectThat(function() {
+                new SqlBuilder().where().or("PERSON.FIRSTNAME", undefined);
+            }).throwsException(SqlBuilder._ERROR_VALUE_IS_MANDATORY()).assert();
+        }
+    ),
+
+    new Test("or with a jdito-var containing null should error",
+        function(pTester)
+        {
+            vars.set("$global.TestingVarNull", null);
+
+            pTester.expectThat(function() {
+                new SqlBuilder().where().or("PERSON.FIRSTNAME", "$global.TestingVarNull");
+            }).throwsException(SqlBuilder._ERROR_VALUE_IS_MANDATORY_JDITO_VAR()).assert();
+        }
+    ),
+
+    new Test("or with an empty sql-builder as subquery should error",
+        function(pTester)
+        {
+            pTester.expectThat(function() {
+                new SqlBuilder().where().or("PERSON.FIRSTNAME", new SqlBuilder());
+            }).throwsException(SqlBuilder._ERROR_VALUE_IS_MANDATORY()).assert();
+        }
+    ),
+
+    new Test("or with an empty prepared statement as subquery should error",
+        function(pTester)
+        {
+            pTester.expectThat(function() {
+                new SqlBuilder().where().or("PERSON.FIRSTNAME", ["", []]);
+            }).throwsException(SqlBuilder._ERROR_VALUE_IS_MANDATORY()).assert();
+        }
+    ),
+]);
+
+
+var inStatementTests = new TestSuite("SqlLib.inStatement", [
+    new Test("simple and in",
+        function(pTester)
+        {
+            var actualValue = new SqlBuilder()
+                                .where("PERSON.LASTNAME", ["Franz", "Fritz"], SqlBuilder.IN()) // Note: you can use SqlBuilder.IN(), SqlBuilder.NOT_IN(), "# in ?", etc. as 3rd parameter
+                                .or("PERSON.LASTNAME", ["Peter", "Mayer"], SqlBuilder.IN());
+
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("_sqlStorage").equals(" ( PERSON.LASTNAME in  (?, ?)  )  or  ( PERSON.LASTNAME in  (?, ?)  ) ").assert();
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("preparedValues").hasLength(4).assert();
+        }
+    ),
+
+    new Test("simple and not in",
+        function(pTester)
+        {
+            var actualValue = new SqlBuilder()
+                                .where("PERSON.LASTNAME", ["Franz", "Fritz"], "# not in ?"); // Note: you can use SqlBuilder.IN(), SqlBuilder.NOT_IN(), "# in ?", etc. as 3rd parameter
+
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("_sqlStorage").equals(" ( PERSON.LASTNAME not in  (?, ?)  ) ").assert();
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("preparedValues").hasLength(2).assert();
+        }
+    ),
+
+    new Test("in with subquery",
+        function(pTester)
+        {
+            var actualValue = new SqlBuilder()
+                            .where("PERSON.FIRSTNAME", new SqlBuilder()
+                                                            .select("PERSON.FIRSTNAME")
+                                                            .from("PERSON")
+                                                            .where("PERSON.LASTNAME", "Fritz")
+                                                    , "# in ?"); // Note: you can use SqlBuilder.IN() instead of "# in ?"
+
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("_sqlStorage").equals("PERSON.FIRSTNAME in  ( select PERSON.FIRSTNAME from PERSON where PERSON.LASTNAME = ? ) ").assert();
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("preparedValues").hasLength(1).assert();
+        }
+    ),
+
+    new Test("in with prepared statement-array",
+        function(pTester)
+        {
+            var actualValue = new SqlBuilder()
+                            .where("PERSON.FIRSTNAME", ["select PERSON.FIRSTNAME from PERSON where PERSON.LASTNAME = ?", [["Fritz", SQLTYPES.VARCHAR]]]
+                                                    , "# in ?"); // Note: you can use SqlBuilder.IN() instead of "# in ?"
+
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("_sqlStorage").equals("PERSON.FIRSTNAME in  ( select PERSON.FIRSTNAME from PERSON where PERSON.LASTNAME = ? ) ").assert();
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("preparedValues").hasLength(1).assert();
+        }
+    ),
+
+    new Test("andIfSet should ignore empty array",
+        function(pTester)
+        {
+            var actualValue = new SqlBuilder()
+                                .whereIfSet("PERSON.LASTNAME", []);
+
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("_sqlStorage").equals("").assert();
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("preparedValues").hasLength(0).assert();
+        }
+    ),
+
+    new Test("and should error on an empty array",
+        function(pTester)
+        {
+            pTester.expectThat(function() {
+                new SqlBuilder().where("PERSON.LASTNAME", []);
+            }).throwsException(SqlBuilder._ERROR_VALUE_IS_MANDATORY()).assert();
+        }
+    ),
+]);
+
+
+var testConstantFunctions = new TestSuite("SqlLib.testConstantFunc", [
+    new Test("SqlBuilder.IN()",
+        function(pTester)
+        {
+            var actualValue = SqlBuilder.IN();
+            pTester.expectThat(actualValue).equals("# in ?").assert();
+        }
+    ),
+
+    new Test("SqlBuilder.NOT_IN()",
+        function(pTester)
+        {
+            var actualValue = SqlBuilder.NOT_IN();
+            pTester.expectThat(actualValue).equals("# not in ?").assert();
+        }
+    ),
+
+    new Test("SqlBuilder.EXISTS()",
+        function(pTester)
+        {
+            var actualValue = SqlBuilder.EXISTS();
+            pTester.expectThat(actualValue).equals("exists ?").assert();
+        }
+    ),
+]);
+
+
+var selectTests = new TestSuite("SqlLib.select", [
+    new Test("a sql-builder in a fields-array is translated to sql correctly",
+        function(pTester)
+        {
+            var countSubQuery = newSelect("count(*)")
+                                    .from("AB_ATTRIBUTEUSAGE")
+                                    .where("AB_ATTRIBUTEUSAGE.OBJECT_TYPE", "myType")
+                                    .and("AB_ATTRIBUTEUSAGE.AB_ATTRIBUTE_ID = AB_ATTRIBUTE.AB_ATTRIBUTEID");
+
+            var actualValue = new SqlBuilder()
+                .select(["AB_ATTRIBUTEID", "AB_ATTRIBUTEUSAGEID", countSubQuery])
+                .from("AB_ATTRIBUTE")
+
+            pTester.expectThat(actualValue).elementAt("_select").elementAt("_sqlStorage").equals("select AB_ATTRIBUTEID, AB_ATTRIBUTEUSAGEID, (select count(*) from AB_ATTRIBUTEUSAGE where AB_ATTRIBUTEUSAGE.OBJECT_TYPE = ? and AB_ATTRIBUTEUSAGE.AB_ATTRIBUTE_ID = AB_ATTRIBUTE.AB_ATTRIBUTEID)").assert();
+            pTester.expectThat(actualValue).elementAt("_select").elementAt("preparedValues").hasLength(1).assert();
+        }
+    ),
+
+    new Test("a sql-builder in from is used as subselect",
+        function(pTester)
+        {
+            var subQuery = newSelect("FIRSTNAME")
+                                    .from("PERSON")
+                                    .where("PERSON.LASTNAME", "Meier")
+
+            var actualValue = new SqlBuilder()
+                .select("*")
+                .from(subQuery)
+
+            pTester.expectThat(actualValue).elementAt("_from").elementAt("_sqlStorage").equals("from (select FIRSTNAME from PERSON where PERSON.LASTNAME = ?)").assert();
+            pTester.expectThat(actualValue).elementAt("_from").elementAt("preparedValues").hasLength(1).assert();
+        }
+    ),
+]);
+
+
+var joinTests = new TestSuite("SqlLib.join", [
+    new Test("SqlBuilder as on-condition should only add the conditon of the builder",
+        function(pTester)
+        {
+            var subQuery = newSelect("NAME")
+                                    .from("ORGANISATION")
+                                    .where("ORGANISATION.NAME", "Adito")
+
+            var actualValue = new SqlBuilder()
+                .select("*")
+                .from("PERSON")
+                .join("ORGANISATION", subQuery)
+
+            pTester.expectThat(actualValue).elementAt("_joins").elementAt(0).elementAt("_sqlStorage").equals("join ORGANISATION on ORGANISATION.NAME = ?").assert();
+            pTester.expectThat(actualValue).elementAt("_joins").elementAt(0).elementAt("preparedValues").hasLength(1).assert();
+        }
+    ),
+
+    new Test("SqlBuilder as table for join is added as subselect",
+        function(pTester)
+        {
+            var subQuery = newSelect("NAME")
+                                    .from("ORGANISATION")
+                                    .where("ORGANISATION.NAME", "Adito")
+
+            var actualValue = new SqlBuilder()
+                .select("*")
+                .from("PERSON")
+                .join(subQuery, "orgname.NAME = TABLE2.NAME", "orgname")
+
+            pTester.expectThat(actualValue).elementAt("_joins").elementAt(0).elementAt("_sqlStorage").equals("join (select NAME from ORGANISATION where ORGANISATION.NAME = ?) orgname on orgname.NAME = TABLE2.NAME").assert();
+            pTester.expectThat(actualValue).elementAt("_joins").elementAt(0).elementAt("preparedValues").hasLength(1).assert();
+        }
+    ),
+
+    new Test("just use a string also containing a condition as join without additional condition",
+        function(pTester)
+        {
+            var actualValue = new SqlBuilder()
+                .select("*")
+                .from("PERSON")
+                .join("TABLE1 on TABLE1.NAME = TABLE2.NAME")
+
+            pTester.expectThat(actualValue).elementAt("_joins").elementAt(0).elementAt("_sqlStorage").equals("join TABLE1 on TABLE1.NAME = TABLE2.NAME").assert();
+            pTester.expectThat(actualValue).elementAt("_joins").elementAt(0).elementAt("preparedValues").hasLength(0).assert();
+        }
+    ),
+]);
+
+
+var subqueryAsFieldTests = new TestSuite("SqlLib.subqueryAsField", [
+    new Test("Test if a Subselect as field works if pValue is provided. This should be added as subselect.",
+        function(pTester)
+        {
+            var subQuery = newSelect("NAME")
+                                    .from("ORGANISATION")
+                                    .where("ORGANISATION.ORGANISATIONID = CONTACT.ORGANISATION_ID")
+                                    .and("PERSON.FIRSTNAME", "val1") // test if the value is added at the correct place
+
+            var actualValue = new SqlBuilder().where(subQuery, "val2", "# = ?", SQLTYPES.VARCHAR)
+                                         .and("PERSON.FIRSTNAME", "val3");
+
+
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("_sqlStorage").equals(" ( ( select NAME from ORGANISATION where ORGANISATION.ORGANISATIONID = CONTACT.ORGANISATION_ID and PERSON.FIRSTNAME = ? ) = ? )  and PERSON.FIRSTNAME = ?").assert();
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("preparedValues").hasLength(3).assert();
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("preparedValues").elementAt(0).elementAt(0).equals("val1").assert();
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("preparedValues").elementAt(1).elementAt(0).equals("val2").assert();
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("preparedValues").elementAt(2).elementAt(0).equals("val3").assert();
+        }
+    ),
+
+    new Test("Test if a Subselect as field should error if no SQLTYPE is provided.",
+        function(pTester)
+        {
+            pTester.expectThat(function() {
+                var subQuery = newSelect("NAME")
+                                .from("ORGANISATION")
+                                .where("ORGANISATION.ORGANISATIONID = CONTACT.ORGANISATION_ID")
+                                .and("PERSON.FIRSTNAME", "val1") // test if the value is added at the correct place
+                new SqlBuilder().where(subQuery, "val2", "# = ?");
+            }).throwsException(SqlBuilder._ERROR_SUBSELECT_AS_FIELD_NO_FIELD_TYPE()).assert();
+        }
+    ),
+
+    new Test("Test if a Subselect as field should error if it is not a full select.",
+        function(pTester)
+        {
+            pTester.expectThat(function() {
+                var subQuery = newSelect("NAME")
+                                .where("ORGANISATION.ORGANISATIONID = CONTACT.ORGANISATION_ID")
+                                .and("PERSON.FIRSTNAME", "val1") // test if the value is added at the correct place
+
+                new SqlBuilder().where(subQuery, "val2", "# = ?", SQLTYPES.VARCHAR);
+            }).throwsException(SqlBuilder._ERROR_SUBSELECT_AS_FIELD_NOT_COMPLETE()).assert();
+        }
+    ),
+]);
+
+
+var conditionFormatTests = new TestSuite("SqlLib.conditionFormat", [
+    new Test("pCondition should not fail if # an ? exist in correct order",
+        function(pTester)
+        {
+            pTester.expectThat(function() {
+                new SqlBuilder()
+                    .where("PERSON.FIRSTNAME", "val1", "# = ?")
+                    .and("PERSON.FIRSTNAME", "val1", "asdf # fdsa=asdf ?fdas")
+                    ;
+            }).not().throwsException().assert();
+        }
+    ),
+
+    new Test("pCondition should not fail if # an ? exist in correct order and there are additional, escaped # and ?",
+        function(pTester)
+        {
+            pTester.expectThat(function() {
+                new SqlBuilder().where("PERSON.FIRSTNAME", "val1", "\\? # \\#= ?");
+            }).not().throwsException().assert();
+        }
+    ),
+
+    new Test("pCondition should not fail if only ? exists",
+        function(pTester)
+        {
+            pTester.expectThat(function() {
+                new SqlBuilder().where("PERSON.FIRSTNAME", "val1", "?")
+            }).not().throwsException().assert();
+        }
+    ),
+
+    new Test("pCondition should fail if more than one ? exists",
+        function(pTester)
+        {
+            pTester.expectThat(function() {
+                new SqlBuilder().where("PERSON.FIRSTNAME", "val1", "? test ?")
+            }).throwsException(SqlBuilder._ERROR_CONDITION_WRONG_FORMAT()).assert();
+        }
+    ),
+
+    new Test("pCondition should fail if more than one # exists",
+        function(pTester)
+        {
+            pTester.expectThat(function() {
+                new SqlBuilder().where("PERSON.FIRSTNAME", "val1", "# test #")
+            }).throwsException(SqlBuilder._ERROR_CONDITION_WRONG_FORMAT()).assert();
+        }
+    ),
+
+    new Test("pCondition should fail if # and ? are in wrong order",
+        function(pTester)
+        {
+            pTester.expectThat(function() {
+                new SqlBuilder().where("PERSON.FIRSTNAME", "val1", "? = #")
+            }).throwsException(SqlBuilder._ERROR_CONDITION_WRONG_FORMAT()).assert();
+        }
+    ),
+]);
+
+
+var subqueryAliasTests = new TestSuite("SqlLib.subqueryAlias", [
+    new Test("subselectAlias should be added for subquery in .select",
+        function(pTester)
+        {
+            var subQuery = newSelect("NAME")
+                                    .from("ORGANISATION")
+                                    .where("ORGANISATION.NAME", "Adito")
+                                    .subselectAlias("testAlias")
+
+            var actualValue = new SqlBuilder()
+                .select([subQuery, "FIRSTNAME"])
+                .from("PERSON")
+
+            pTester.expectThat(actualValue).elementAt("_select").elementAt("_sqlStorage").equals("select (select NAME from ORGANISATION where ORGANISATION.NAME = ?) testAlias, FIRSTNAME").assert();
+            pTester.expectThat(actualValue).elementAt("_select").elementAt("preparedValues").hasLength(1).assert();
+        }
+    ),
+
+    new Test("subselectAlias should be added for subquery in .from",
+        function(pTester)
+        {
+            var subQuery = newSelect("NAME")
+                                    .from("ORGANISATION")
+                                    .where("ORGANISATION.NAME", "Adito")
+                                    .subselectAlias("testAlias")
+
+            var actualValue = new SqlBuilder()
+                .from(subQuery)
+
+            pTester.expectThat(actualValue).elementAt("_from").elementAt("_sqlStorage").equals("from (select NAME from ORGANISATION where ORGANISATION.NAME = ?) testAlias").assert();
+            pTester.expectThat(actualValue).elementAt("_from").elementAt("preparedValues").hasLength(1).assert();
+        }
+    ),
+
+    new Test("subselectAlias should be overruled by the param in in .from",
+        function(pTester)
+        {
+            var subQuery = newSelect("NAME")
+                                    .from("ORGANISATION")
+                                    .where("ORGANISATION.NAME", "Adito")
+                                    .subselectAlias("testAlias")
+
+            var actualValue = new SqlBuilder()
+                .from(subQuery, "overwriteAlias")
+
+            pTester.expectThat(actualValue).elementAt("_from").elementAt("_sqlStorage").equals("from (select NAME from ORGANISATION where ORGANISATION.NAME = ?) overwriteAlias").assert();
+            pTester.expectThat(actualValue).elementAt("_from").elementAt("preparedValues").hasLength(1).assert();
+        }
+    ),
+
+    new Test("subselectAlias should be added for subquery in .join",
+        function(pTester)
+        {
+            var subQuery = newSelect("NAME, ORGANISATIONID")
+                                    .from("ORGANISATION")
+                                    .where("ORGANISATION.NAME", "Adito")
+                                    .subselectAlias("testAlias")
+
+            var actualValue = new SqlBuilder()
+                .from("CONTACT")
+                .join(subQuery, "testAlias.ORGANISATIONID = ORGANISATION_ID")
+                .join(subQuery, "testAlias.ORGANISATIONID = ORGANISATION_ID", "overwriteAlias")
+
+            pTester.expectThat(actualValue).elementAt("_joins").elementAt(0).elementAt("_sqlStorage").equals("join (select NAME, ORGANISATIONID from ORGANISATION where ORGANISATION.NAME = ?) testAlias on testAlias.ORGANISATIONID = ORGANISATION_ID").assert();
+            pTester.expectThat(actualValue).elementAt("_joins").elementAt(0).elementAt("preparedValues").hasLength(1).assert();
+
+            pTester.expectThat(actualValue).elementAt("_joins").elementAt(1).elementAt("_sqlStorage").equals("join (select NAME, ORGANISATIONID from ORGANISATION where ORGANISATION.NAME = ?) overwriteAlias on testAlias.ORGANISATIONID = ORGANISATION_ID").assert();
+            pTester.expectThat(actualValue).elementAt("_joins").elementAt(1).elementAt("preparedValues").hasLength(1).assert();
+        }
+    ),
+]);
+
+
+var tester = new Tester("Test SqlBuilder");
+tester.test(newSelectTests);
+tester.test(validAndUsageTests);
+tester.test(validOrUsageTests);
+tester.test(combinedAndOrTests);
+tester.test(ifSetTests);
+tester.test(dbWrapperTests);
+tester.test(mandatoryErrorTests);
+tester.test(inStatementTests);
+tester.test(testConstantFunctions);
+tester.test(selectTests);
+tester.test(joinTests);
+tester.test(subqueryAsFieldTests);
+tester.test(conditionFormatTests);
+tester.test(subqueryAliasTests);
+
+tester.summary();
+
+result.object(tester.getResults());
\ No newline at end of file
diff --git a/process/SqlLib_tests/process.js b/process/SqlLib_tests/process.js
deleted file mode 100644
index 924162e2a4e..00000000000
--- a/process/SqlLib_tests/process.js
+++ /dev/null
@@ -1,1015 +0,0 @@
-import("system.db");
-import("system.vars");
-import("system.translate");
-import("system.logging");
-import("system.SQLTYPES");
-import("Sql_lib");
-import("UnitTest_lib");
-
-var newSelectTests = new TestSuite([
-    ["newSelect with just a string schould just use it as select", function(pTester)
-    {
-        var actual = newSelect("MySuper, Field, String")
-
-        pTester.assert("select MySuper, Field, String", actual._select._sqlStorage, "prepared sql");
-        pTester.assert(0, actual._select.preparedValues.length, "number of params");
-    }],
-
-    ["newSelect with just an array of strings schould just use them concatenated as select", function(pTester)
-    {
-        var actual = newSelect(["MySuper", "Field", "String"])
-
-        pTester.assert("select MySuper, Field, String", actual._select._sqlStorage, "prepared sql");
-        pTester.assert(0, actual._select.preparedValues.length, "number of params");
-    }],
-
-    ["newSelect with just an SqlBuilder should use it as subselect", function(pTester)
-    {
-        var actual = newSelect(new SqlBuilder().select("PERSONID").from("PERSON").where("PERSON.FIRSTNAME", "Fritz"))
-
-        pTester.assert("select (select PERSONID from PERSON where PERSON.FIRSTNAME = ?)", actual._select._sqlStorage, "prepared sql");
-        pTester.assert(1, actual._select.preparedValues.length, "number of params");
-    }],
-
-    ["newSelect an array of Strings and SqlBuilders should add them all", function(pTester)
-    {
-        var actual = newSelect(["MySuper", "Field", "String", new SqlBuilder().select("PERSONID").from("PERSON").where("PERSON.FIRSTNAME", "Fritz")])
-
-        pTester.assert("select MySuper, Field, String, (select PERSONID from PERSON where PERSON.FIRSTNAME = ?)", actual._select._sqlStorage, "prepared sql");
-        pTester.assert(1, actual._select.preparedValues.length, "number of params");
-    }],
-]);
-
-var validAndUsageTests = new TestSuite([
-    ["and should just add simple strings as condition just as it is", function(pTester)
-    {
-        var actual = new SqlBuilder()
-                            .where("PERSON.FIRSTNAME = 'Tim'") // NOTE: you should not do this as this does not add a real prepared statement with "?"
-                            .and("PERSON.LASTNAME = 'Admin'")
-
-        pTester.assert("PERSON.FIRSTNAME = 'Tim' and PERSON.LASTNAME = 'Admin'", actual._where._sqlStorage, "prepared sql");
-        pTester.assert(0, actual._where.preparedValues.length, "number of params");
-    }],
-
-    ["and should add a condition if field and value are passed", function(pTester)
-    {
-        var actual = new SqlBuilder()
-                            .where("PERSON.FIRSTNAME", "Tim")
-                            .and("PERSON.LASTNAME", "Admin")
-                            
-        pTester.assert("PERSON.FIRSTNAME = ? and PERSON.LASTNAME = ?", actual._where._sqlStorage, "prepared sql");
-        pTester.assert(2, actual._where.preparedValues.length, "number of params");
-    }],
-
-    ["and should add a condition if value is an empty string", function(pTester)
-    {
-        var actual = new SqlBuilder()
-                            .where("PERSON.FIRSTNAME", "")
-                            .and("PERSON.LASTNAME", "")
-                            
-        pTester.assert("PERSON.FIRSTNAME = ? and PERSON.LASTNAME = ?", actual._where._sqlStorage, "prepared sql");
-        pTester.assert(2, actual._where.preparedValues.length, "number of params");
-    }],
-
-    ["and should add a condition if field and value as jdito-var are passed", function(pTester)
-    {
-        vars.set("$global.TestUnitValueName", "Tim");
-        var actual = new SqlBuilder()
-                            .where("PERSON.FIRSTNAME", "$global.TestUnitValueName")
-                            
-        pTester.assert("( PERSON.FIRSTNAME = 'Tim' ) ", actual.toString());
-    }],
-
-    ["$ should be escaped by a second $ and the string should therefore just be used as string and not as jdito variable", function(pTester)
-    {
-        var actual = new SqlBuilder()
-                            .where("PERSON.FIRSTNAME", "$$mySuperString")
-                            
-        pTester.assert("( PERSON.FIRSTNAME = '$mySuperString' ) ", actual.toString());
-    }],
-
-    ["and should add a condition if value is a jdito-var containing an empty string", function(pTester)
-    {
-        vars.set("$global.TestingVarEmptyString", "");
-        var actual = new SqlBuilder()
-                            .where("PERSON.FIRSTNAME", "$global.TestingVarEmptyString")
-                            .and("PERSON.LASTNAME", "$global.TestingVarEmptyString")
-                            
-        pTester.assert("PERSON.FIRSTNAME = ? and PERSON.LASTNAME = ?", actual._where._sqlStorage, "prepared sql");
-        pTester.assert(2, actual._where.preparedValues.length, "number of params");
-    }],
-
-    ["and should use the given condition pattern", function(pTester)
-    {
-        var actual = new SqlBuilder()
-                            .where("PERSON.FIRSTNAME", "Tim", "# <> ?")
-                            .and("PERSON.LASTNAME", "Admin")
-                            
-        pTester.assert("PERSON.FIRSTNAME <> ? and PERSON.LASTNAME = ?", actual._where._sqlStorage, "prepared sql");
-        pTester.assert(2, actual._where.preparedValues.length, "number of params");
-    }],
-
-    ["and should use the given SQLTYPE if provided", function(pTester)
-    {
-        var actual = new SqlBuilder()
-                            .where("PERSON.FIRSTNAME", 6, null, SQLTYPES.INTEGER)
-                            .and("PERSON.LASTNAME", 7, undefined, SQLTYPES.INTEGER)
-                            .and("PERSON.LASTNAME", 8, "# <> ?", SQLTYPES.INTEGER)
-        
-        pTester.assert("PERSON.FIRSTNAME = ? and PERSON.LASTNAME = ? and PERSON.LASTNAME <> ?", actual._where._sqlStorage, "prepared sql");
-        pTester.assert(3, actual._where.preparedValues.length, "number of params");
-        pTester.assert(SQLTYPES.INTEGER, actual._where.preparedValues[0][1], "sql type of param 1 is the provided type");
-        pTester.assert(SQLTYPES.INTEGER, actual._where.preparedValues[1][1], "sql type of param 2 is the provided type");
-        pTester.assert(SQLTYPES.INTEGER, actual._where.preparedValues[2][1], "sql type of param 3 is the provided type");
-    }],
-
-    ["and only with a prepared statement-array should just use it as it is", function(pTester)
-    {
-        var actual = new SqlBuilder()
-                            .where([
-                                "PERSON.FIRSTNAME = ?", [["Peter", 12]]
-                            ])
-                            .and([
-                                "exists (select * FROM CONTACT where PERSON_ID = PERSONID)", []
-                            ])
-                            
-        pTester.assert(" ( PERSON.FIRSTNAME = ? )  and  ( exists (select * FROM CONTACT where PERSON_ID = PERSONID) ) ", actual._where._sqlStorage, "prepared sql");
-        pTester.assert(1, actual._where.preparedValues.length, "number of params");
-    }],
-
-    ["and only with a SqlBulder object should just use the condition from it", function(pTester)
-    {
-        var actual = new SqlBuilder()
-                            .where(new SqlBuilder()
-                                .select("TEST")
-                                .from("PERSON")
-                                .where("PERSON.FIRSTNAME", "Tim")
-                                .and("PERSON.LASTNAME", "Admin"))
-                            
-        pTester.assert(" ( PERSON.FIRSTNAME = ? and PERSON.LASTNAME = ? ) ", actual._where._sqlStorage, "prepared sql");
-        pTester.assert(2, actual._where.preparedValues.length, "number of params");
-    }],
-
-    ["and with a builder as value and condition (field is null|undefined) should add the whole builder as subquery", function(pTester)
-    {
-        var actual = new SqlBuilder()
-                            .where(null, new SqlBuilder()
-                                .select("FIRSTNAME")
-                                .from("PERSON")
-                                .where("PERSON.FIRSTNAME", "Tim")
-                                .and("PERSON.LASTNAME", "Admin"),
-                                "exists ?")  // Note: you can use SqlBuilder.EXISTS() instead of  "exists ?"
-        
-        pTester.assert("exists  ( select FIRSTNAME from PERSON where PERSON.FIRSTNAME = ? and PERSON.LASTNAME = ? ) ", actual._where._sqlStorage, "prepared sql");
-        pTester.assert(2, actual._where.preparedValues.length, "number of params");
-    }],
-
-    ["and with a builder as value and field should add the whole builder as subquery with field = (subquery)", function(pTester)
-    {
-        var actual = new SqlBuilder()
-                            .where("PERSON.FIRSTNAME", new SqlBuilder()
-                                .select("FIRSTNAME")
-                                .from("PERSON")
-                                .where("PERSON.FIRSTNAME", "Tim")
-                                .and("PERSON.LASTNAME", "Admin"))
-        
-        pTester.assert("PERSON.FIRSTNAME =  ( select FIRSTNAME from PERSON where PERSON.FIRSTNAME = ? and PERSON.LASTNAME = ? ) ", actual._where._sqlStorage, "prepared sql");
-        pTester.assert(2, actual._where.preparedValues.length, "number of params");
-    }],
-
-    ["and with a prepared statement-array as value and field is null|undefined should add the whole statement as subquery", function(pTester)
-    {
-        var actual = new SqlBuilder()
-                            .where(null, ["select FIRSTNAME from PERSON.FIRSTNAME = ?", [["Peter", 12]]], "exists ?")
-                            .and(null, ["exists (select FIRSTNAME from PERSON.FIRSTNAME = ?)", [["Peter", 12]]]) // also without pCond it should work as the condition could be included in the prep statement
-        
-        pTester.assert("exists  ( select FIRSTNAME from PERSON.FIRSTNAME = ? )  and  ( exists (select FIRSTNAME from PERSON.FIRSTNAME = ?) ) ", actual._where._sqlStorage, "prepared sql");
-        pTester.assert(2, actual._where.preparedValues.length, "number of params");
-    }],
-
-    ["and with a prepared statement-array as value and field should add the whole statement as subquery with field = (subquery)", function(pTester)
-    {
-        var actual = new SqlBuilder()
-                            .where("PERSON.FIRSTNAME", ["select FIRSTNAME from PERSON.FIRSTNAME = ?", [["Peter", 12]]])
-        
-        pTester.assert("PERSON.FIRSTNAME =  ( select FIRSTNAME from PERSON.FIRSTNAME = ? ) ", actual._where._sqlStorage, "prepared sql");
-        pTester.assert(1, actual._where.preparedValues.length, "number of params");
-    }]
-]);
-
-var validOrUsageTests = new TestSuite([
-    ["or should just add simple strings as condition just as it is", function(pTester)
-    {
-        var actual = new SqlBuilder()
-                            .where("PERSON.FIRSTNAME = 'Tim'") // NOTE: you should not do this as this does not add a real prepared statement with "?"
-                            .or("PERSON.LASTNAME = 'Admin'")
-
-        pTester.assert("PERSON.FIRSTNAME = 'Tim' or PERSON.LASTNAME = 'Admin'", actual._where._sqlStorage, "prepared sql");
-        pTester.assert(0, actual._where.preparedValues.length, "number of params");
-    }],
-
-    ["or should add a condition if field and value are passed", function(pTester)
-    {
-        var actual = new SqlBuilder()
-                            .where("PERSON.FIRSTNAME", "Tim")
-                            .or("PERSON.LASTNAME", "Admin")
-                            
-        pTester.assert("PERSON.FIRSTNAME = ? or PERSON.LASTNAME = ?", actual._where._sqlStorage, "prepared sql");
-        pTester.assert(2, actual._where.preparedValues.length, "number of params");
-    }],
-
-    ["or should use the given condition pattern", function(pTester)
-    {
-        var actual = new SqlBuilder()
-                            .where("PERSON.FIRSTNAME", "Tim", "# <> ?")
-                            .or("PERSON.LASTNAME", "Admin")
-                            
-        pTester.assert("PERSON.FIRSTNAME <> ? or PERSON.LASTNAME = ?", actual._where._sqlStorage, "prepared sql");
-        pTester.assert(2, actual._where.preparedValues.length, "number of params");
-    }],
-
-    ["or should use the given SQLTYPE if provided", function(pTester)
-    {
-        var actual = new SqlBuilder()
-                            .where("PERSON.FIRSTNAME", 6, null, SQLTYPES.INTEGER)
-                            .or("PERSON.LASTNAME", 7, undefined, SQLTYPES.INTEGER)
-                            .or("PERSON.LASTNAME", 8, "# <> ?", SQLTYPES.INTEGER)
-                            
-        pTester.assert("PERSON.FIRSTNAME = ? or PERSON.LASTNAME = ? or PERSON.LASTNAME <> ?", actual._where._sqlStorage, "prepared sql");
-        pTester.assert(3, actual._where.preparedValues.length, "number of params");
-    }],
-
-    ["or only with a prepared statement-array should just use it as it is", function(pTester)
-    {
-        var actual = new SqlBuilder()
-                            .where([
-                                "PERSON.FIRSTNAME = ?", [["Peter", 12]]
-                            ])
-                            .or([
-                                "exists (select * FROM CONTACT where PERSON_ID = PERSONID)", []
-                            ])
-                            
-        pTester.assert(" ( PERSON.FIRSTNAME = ? )  or  ( exists (select * FROM CONTACT where PERSON_ID = PERSONID) ) ", actual._where._sqlStorage, "prepared sql");
-        pTester.assert(1, actual._where.preparedValues.length, "number of params");
-    }],
-
-    ["or only with a SqlBulder object should just use the condition from it", function(pTester)
-    {
-        var actual = new SqlBuilder()
-                            .where(new SqlBuilder()
-                                .where("PERSON.FIRSTNAME", "Tim")
-                                .or("PERSON.LASTNAME", "Admin"))
-                            
-        pTester.assert(" ( PERSON.FIRSTNAME = ? or PERSON.LASTNAME = ? ) ", actual._where._sqlStorage, "prepared sql");
-        pTester.assert(2, actual._where.preparedValues.length, "number of params");
-    }],
-
-    ["or with a builder as value and condition (field is null|undefined) should add the whole builder as subquery", function(pTester)
-    {
-        var actual = new SqlBuilder()
-                            .where(null, new SqlBuilder()
-                                .select("FIRSTNAME")
-                                .from("PERSON")
-                                .where("PERSON.FIRSTNAME", "Tim")
-                                .or("PERSON.LASTNAME", "Admin"),
-                                "exists ?")
-        
-        pTester.assert("exists  ( select FIRSTNAME from PERSON where PERSON.FIRSTNAME = ? or PERSON.LASTNAME = ? ) ", actual._where._sqlStorage, "prepared sql");
-        pTester.assert(2, actual._where.preparedValues.length, "number of params");
-    }],
-
-    ["or with a builder as value and field should add the whole builder as subquery with field = (subquery)", function(pTester)
-    {
-        var actual = new SqlBuilder()
-                            .where("PERSON.FIRSTNAME", new SqlBuilder()
-                                .select("FIRSTNAME")
-                                .from("PERSON")
-                                .where("PERSON.FIRSTNAME", "Tim")
-                                .or("PERSON.LASTNAME", "Admin"))
-        
-        pTester.assert("PERSON.FIRSTNAME =  ( select FIRSTNAME from PERSON where PERSON.FIRSTNAME = ? or PERSON.LASTNAME = ? ) ", actual._where._sqlStorage, "prepared sql");
-        pTester.assert(2, actual._where.preparedValues.length, "number of params");
-    }],
-
-    ["or with a prepared statement-array as value and field is null|undefined should add the whole statement as subquery", function(pTester)
-    {
-        var actual = new SqlBuilder()
-                            .where(null, ["select FIRSTNAME from PERSON.FIRSTNAME = ?", [["Peter", 12]]], "exists ?")
-                            .or(null, ["exists (select FIRSTNAME from PERSON.FIRSTNAME = ?)", [["Peter", 12]]]) // also without pCond it should work as the condition could be included in the prep statement
-        
-        pTester.assert("exists  ( select FIRSTNAME from PERSON.FIRSTNAME = ? )  or  ( exists (select FIRSTNAME from PERSON.FIRSTNAME = ?) ) ", actual._where._sqlStorage, "prepared sql");
-        pTester.assert(2, actual._where.preparedValues.length, "number of params");
-    }]
-]);
-
-var combinedAndOrTests = new TestSuite([
-    ["or combining two and", function(pTester)
-    {
-        var actual = new SqlBuilder()
-                        .where("PERSON.FIRSTNAME", "Tim")
-                        .and("PERSON.LASTNAME", "Admin")
-                        .or(new SqlBuilder()
-                                .where("PERSON.FIRSTNAME", "Peter")
-                                .and("PERSON.LASTNAME", "Müller"))
-        
-        pTester.assert("(PERSON.FIRSTNAME = ? and PERSON.LASTNAME = ?) or  ( PERSON.FIRSTNAME = ? and PERSON.LASTNAME = ? ) ", actual._where._sqlStorage, "prepared sql");
-        pTester.assert(4, actual._where.preparedValues.length, "number of params");
-    }],
-    
-    ["and combining two or", function(pTester)
-    {                 
-        var actual = new SqlBuilder()
-                        .where(new SqlBuilder()
-                                .where("PERSON.FIRSTNAME", "Tim")
-                                .or("PERSON.LASTNAME", "Admin"))
-                        .and(new SqlBuilder()
-                                .where("PERSON.FIRSTNAME", "Peter")
-                                .or("PERSON.LASTNAME", "Müller"))
-        
-        pTester.assert(" ( PERSON.FIRSTNAME = ? or PERSON.LASTNAME = ? )  and  ( PERSON.FIRSTNAME = ? or PERSON.LASTNAME = ? ) ", actual._where._sqlStorage, "prepared sql");
-        pTester.assert(4, actual._where.preparedValues.length, "number of params");
-    }],
-
-    ["some and/or combinations in one select", function(pTester)
-    {
-        var actual = new SqlBuilder()
-                        .where("PERSON.FIRSTNAME", "Tim")
-                        .or("PERSON.FIRSTNAME", "Franz")
-                        .and("PERSON.LASTNAME", "Admin")
-                        .and(new SqlBuilder()
-                                .where("PERSON.FIRSTNAME", "Peter")
-                                .or("PERSON.LASTNAME", "Müller"))
-                        .or("PERSON.FIRSTNAME", "Franz")
-                        .and("PERSON.FIRSTNAME", "Franz")
-                        .or(new SqlBuilder()
-                                .where("PERSON.FIRSTNAME", "Peter")
-                                .and("PERSON.LASTNAME", "Müller")
-                                .and(new SqlBuilder()
-                                        .where("PERSON.FIRSTNAME", "Peter")
-                                        .or("PERSON.LASTNAME", "Müller")))
-                        
-        pTester.assert("PERSON.FIRSTNAME = ? or PERSON.FIRSTNAME = ? and PERSON.LASTNAME = ? and  ( PERSON.FIRSTNAME = ? or PERSON.LASTNAME = ? )  or (PERSON.FIRSTNAME = ?) and PERSON.FIRSTNAME = ? or  ( PERSON.FIRSTNAME = ? and PERSON.LASTNAME = ? and  ( PERSON.FIRSTNAME = ? or PERSON.LASTNAME = ? )  ) ", actual._where._sqlStorage, "prepared sql");
-        pTester.assert(11, actual._where.preparedValues.length, "number of params");
-    }]
-]);
-
-var ifSetTests = new TestSuite([
-    ["simple and if set with all types of empty values.", function(pTester)
-    {
-        var actual = new SqlBuilder()
-                        .whereIfSet("PERSON.LASTNAME", null)
-                        .andIfSet("PERSON.LASTNAME", undefined)
-                        
-        pTester.assert("", actual._where._sqlStorage, "no sql should be added");
-        pTester.assert(0, actual._where.preparedValues.length, "no params should be added");
-    }],
-
-    ["jdito variable with null", function(pTester)
-    {
-        vars.set("$global.TestingVarNull", null);
-        
-        var actual = new SqlBuilder()
-                        .whereIfSet("PERSON.FIRSTNAME", "$global.TestingVarNull")
-                        
-        pTester.assert("", actual._where._sqlStorage, "no sql should be added");
-        pTester.assert(0, actual._where.preparedValues.length, "no params should be added");
-    }],
-
-    ["empty simple conditions", function(pTester)
-    {
-        var actual = new SqlBuilder()
-                        .whereIfSet("")
-                        .andIfSet(["", []])
-                        .andIfSet(new SqlBuilder())
-                        
-        pTester.assert("", actual._where._sqlStorage, "no sql should be added");
-        pTester.assert(0, actual._where.preparedValues.length, "no params should be added");
-    }],
-
-    ["empty subqueries", function(pTester)
-    {
-        var actual = new SqlBuilder()
-                        .whereIfSet("PERSON.FIRSTNAME", ["", []])
-                        .andIfSet("PERSON.LASTNAME", new SqlBuilder())
-                        
-        pTester.assert("", actual._where._sqlStorage, "no sql should be added");
-        pTester.assert(0, actual._where.preparedValues.length, "no params should be added");
-    }]
-]);
-
-function cleanWrapperTests()
-{
-    try {
-        db.runStatement("drop table SQL_LIB_TEST_TABLE");
-    } catch(ex) {}
-    
-    try {
-        db.deleteData("PERSON", "PERSONID in ('TEST-5', 'TEST-6')")
-    } catch(ex) {}
-    
-}
-
-var dbWrapperTests = new TestSuite([
-    ["cell should load only one value", function(pTester)
-    {
-        var builder = new SqlBuilder()
-                            .select("FIRSTNAME")
-                            .from("PERSON")
-                            .where("PERSON.PERSONID", "TEST-5")
-        pTester.assert("Franz", builder.cell());
-    }],
-
-    ["cell should just return '' if no condition set but pExecuteOnlyIfConditionExists is true", function(pTester)
-    {
-        var builder = new SqlBuilder()
-                            .select("FIRSTNAME")
-                            .from("PERSON")
-        pTester.assert("", builder.cell(true));
-    }],
-
-    ["cell should return a value if no condition set and pExecuteOnlyIfConditionExists is false", function(pTester)
-    {
-        var builder = new SqlBuilder()
-                            .select("FIRSTNAME")
-                            .from("PERSON");
-                            
-        var actual = builder.cell(false)
-        pTester.assert(true, actual !== "" && actual !== null && actual !== undefined);
-    }],
-
-    ["array should load an array of values", function(pTester)
-    {
-        var builder = new SqlBuilder()
-                            .select("FIRSTNAME, LASTNAME")
-                            .from("PERSON")
-                            .where("PERSON.PERSONID", "TEST-5");
-                            
-        var actual = builder.array(db.ROW);
-        pTester.assert("Franz", actual[0], "firstname should be 'Franz'");
-        pTester.assert("Müller", actual[1], "lastname should be 'Müller'");
-    }],
-
-    ["array should return an empty array if no condition set but pExecuteOnlyIfConditionExists is true", function(pTester)
-    {
-        var builder = new SqlBuilder()
-                            .select("FIRSTNAME, LASTNAME")
-                            .from("PERSON")
-                            
-        var actual = builder.array(db.ROW, true);
-        pTester.assert(0, actual.length);
-    }],
-
-    ["array should return a non-empty array if no condition set and pExecuteOnlyIfConditionExists is false", function(pTester)
-    {
-        var builder = new SqlBuilder()
-                            .select("FIRSTNAME, LASTNAME")
-                            .from("PERSON")
-                            
-        var actual = builder.array(db.ROW, false);
-        pTester.assert(true, actual.length > 0);
-    }],
- 
-    ["table should load an array of arrays with values", function(pTester)
-    {
-        var builder = new SqlBuilder()
-                            .select("FIRSTNAME, LASTNAME")
-                            .from("PERSON")
-                            .where("PERSON.PERSONID", "TEST-5")
-                            .or("PERSON.PERSONID", "TEST-6")
-                            .orderBy("PERSONID asc");
-                            
-        var actual = builder.table();
-        pTester.assert("Franz", actual[0][0], "firstname should be 'Franz'");
-        pTester.assert("Müller", actual[0][1], "lastname should be 'Müller'");
-        
-        pTester.assert("Marco", actual[1][0], "firstname should be 'Marco'");
-        pTester.assert("Polo", actual[1][1], "lastname should be 'Polo'");
-    }],
-
-    ["table should return an empty array if no condition set but pExecuteOnlyIfConditionExists is true", function(pTester)
-    {
-        var builder = new SqlBuilder()
-                            .select("FIRSTNAME, LASTNAME")
-                            .from("PERSON");
-                            
-        var actual = builder.table(true);
-        pTester.assert(0, actual.length);
-    }],
-
-    ["table should return a non-empty array if no condition set and pExecuteOnlyIfConditionExists is false", function(pTester)
-    {
-        var builder = new SqlBuilder()
-                            .select("FIRSTNAME, LASTNAME")
-                            .from("PERSON");
-                            
-        var actual = builder.table(false);
-        pTester.assert(true, actual.length > 0);
-    }],
-
-    ["delete should delete the data and use the from and condition from the builder", function(pTester)
-    {
-        db.deleteData("SQL_LIB_TEST_TABLE", "TESTID = 'TEST-7'");
-        db.insertData("SQL_LIB_TEST_TABLE", ["TESTID", "FIRSTNAME", "LASTNAME"], null, ["TEST-7", "Ludwig", "Fischer"]);
-        
-        var builder = new SqlBuilder()
-                            .from("SQL_LIB_TEST_TABLE")
-                            .where("SQL_LIB_TEST_TABLE.TESTID", "TEST-7");
-                            
-        var deletedRows = builder.deleteData();
-        pTester.assert(1, deletedRows);
-    }],
-
-    ["delete should delete the data from the provided table and use the condition from the builder. It ignores .from if a table is given.", function(pTester)
-    {
-        db.deleteData("SQL_LIB_TEST_TABLE", "TESTID = 'TEST-7'");
-        db.insertData("SQL_LIB_TEST_TABLE", ["TESTID", "FIRSTNAME", "LASTNAME"], null, ["TEST-7", "Ludwig", "Fischer"]);
-        
-        var builder = new SqlBuilder()
-                            .from("PERSON")
-                            .where("SQL_LIB_TEST_TABLE.TESTID", "TEST-7");
-                            
-        var deletedRows = builder.deleteData(false, "SQL_LIB_TEST_TABLE");
-        pTester.assert(1, deletedRows);
-    }],
-
-    ["delete should delete ALL data from a table if the builder has no condition and pExecuteOnlyIfConditionExists is false", function(pTester)
-    {
-        db.deleteData("SQL_LIB_TEST_TABLE", "TESTID in ('TEST-7', 'TEST-8')");
-        db.insertData("SQL_LIB_TEST_TABLE", ["TESTID", "FIRSTNAME", "LASTNAME"], null, ["TEST-7", "Ludwig", "Fischer"]);
-        db.insertData("SQL_LIB_TEST_TABLE", ["TESTID", "FIRSTNAME", "LASTNAME"], null, ["TEST-8", "Ludwig", "Fischer"]);
-        
-        var builder = new SqlBuilder()
-                            .from("SQL_LIB_TEST_TABLE")
-                            
-        var deletedRows = builder.deleteData(false);
-        pTester.assert(2, deletedRows);
-    }],
-
-    ["delete should delete NO data from a table if the builder has no condition and pExecuteOnlyIfConditionExists is true", function(pTester)
-    {
-        db.deleteData("SQL_LIB_TEST_TABLE", "TESTID in ('TEST-7', 'TEST-8')");
-        db.insertData("SQL_LIB_TEST_TABLE", ["TESTID", "FIRSTNAME", "LASTNAME"], null, ["TEST-7", "Ludwig", "Fischer"]);
-        db.insertData("SQL_LIB_TEST_TABLE", ["TESTID", "FIRSTNAME", "LASTNAME"], null, ["TEST-8", "Ludwig", "Fischer"]);
-        
-        var builder = new SqlBuilder()
-                            .from("SQL_LIB_TEST_TABLE")
-                            
-        var deletedRows = builder.deleteData(true);
-        pTester.assert(0, deletedRows);
-    }],
-
-    ["update should update the data and use the from and condition from the builder", function(pTester)
-    {
-        db.deleteData("SQL_LIB_TEST_TABLE", "TESTID = 'TEST-7'");
-        db.insertData("SQL_LIB_TEST_TABLE", ["TESTID", "FIRSTNAME", "LASTNAME"], null, ["TEST-7", "Ludwig", "Fischer"]);
-        
-        var builder = new SqlBuilder()
-                            .from("SQL_LIB_TEST_TABLE")
-                            .where("SQL_LIB_TEST_TABLE.TESTID", "TEST-7");
-                            
-        builder.updateData(false, undefined, ["FIRSTNAME"], null, ["Fritz"]);
-        
-        var actual = db.cell("select FIRSTNAME from SQL_LIB_TEST_TABLE where SQL_LIB_TEST_TABLE.TESTID = 'TEST-7'")
-        
-        pTester.assert("Fritz", actual);
-    }],
-
-    ["update should update the data from the provided table and use the condition from the builder. It ignores .from if a table is given.", function(pTester)
-    {
-        db.deleteData("SQL_LIB_TEST_TABLE", "TESTID = 'TEST-7'");
-        db.insertData("SQL_LIB_TEST_TABLE", ["TESTID", "FIRSTNAME", "LASTNAME"], null, ["TEST-7", "Ludwig", "Fischer"]);
-        
-        var builder = new SqlBuilder()
-                            .from("PERSON")
-                            .where("SQL_LIB_TEST_TABLE.TESTID", "TEST-7");
-                            
-        builder.updateData(false, "SQL_LIB_TEST_TABLE", ["FIRSTNAME"], null, ["Fritz"]);
-        
-        var actual = db.cell("select FIRSTNAME from SQL_LIB_TEST_TABLE where SQL_LIB_TEST_TABLE.TESTID = 'TEST-7'")
-        
-        pTester.assert("Fritz", actual);
-    }],
-
-    ["update should update ALL data from a table if the builder has no condition and pExecuteOnlyIfConditionExists is false", function(pTester)
-    {
-        db.deleteData("SQL_LIB_TEST_TABLE", "TESTID in ('TEST-7', 'TEST-8')");
-        db.insertData("SQL_LIB_TEST_TABLE", ["TESTID", "FIRSTNAME", "LASTNAME"], null, ["TEST-7", "Ludwig", "Fischer"]);
-        db.insertData("SQL_LIB_TEST_TABLE", ["TESTID", "FIRSTNAME", "LASTNAME"], null, ["TEST-8", "Franz", "Fischer"]);
-        
-        var builder = new SqlBuilder()
-                            .from("SQL_LIB_TEST_TABLE")
-                            
-        builder.updateData(false, undefined, ["FIRSTNAME"], null, ["Fritz"]);
-        
-        var actual1 = db.cell("select FIRSTNAME from SQL_LIB_TEST_TABLE where SQL_LIB_TEST_TABLE.TESTID = 'TEST-7'")
-        var actual2 = db.cell("select FIRSTNAME from SQL_LIB_TEST_TABLE where SQL_LIB_TEST_TABLE.TESTID = 'TEST-8'")
-        
-        pTester.assert("Fritz", actual1, "TEST-7 should have Firstname Fritz");        
-        pTester.assert("Fritz", actual2, "TEST-8 should have Firstname Fritz");
-    }],
-
-    ["update should update NO data from a table if the builder has no condition and pExecuteOnlyIfConditionExists is true", function(pTester)
-    {
-        db.deleteData("SQL_LIB_TEST_TABLE", "TESTID in ('TEST-7', 'TEST-8')")        
-        db.insertData("SQL_LIB_TEST_TABLE", ["TESTID", "FIRSTNAME", "LASTNAME"], null, ["TEST-7", "Ludwig", "Fischer"]);
-        db.insertData("SQL_LIB_TEST_TABLE", ["TESTID", "FIRSTNAME", "LASTNAME"], null, ["TEST-8", "Franz", "Fischer"]);
-        
-        var builder = new SqlBuilder()
-                            .from("SQL_LIB_TEST_TABLE")
-                            
-        builder.updateData(true, undefined, ["FIRSTNAME"], null, ["Fritz"]);
-        
-        var actual1 = db.cell("select FIRSTNAME from SQL_LIB_TEST_TABLE where SQL_LIB_TEST_TABLE.TESTID = 'TEST-7'")
-        var actual2 = db.cell("select FIRSTNAME from SQL_LIB_TEST_TABLE where SQL_LIB_TEST_TABLE.TESTID = 'TEST-8'")
-        
-        pTester.assert("Ludwig", actual1, "TEST-7 should have Firstname Ludwig");        
-        pTester.assert("Franz", actual2, "TEST-8 should have Firstname Franz");
-    }]
-], function preAll() 
-{
-    // remove data which may exist if previous test-run failed and postAll was not executed
-    cleanWrapperTests()
-    
-    // add table for save testing of deletes
-    db.runStatement("create table SQL_LIB_TEST_TABLE (TESTID varchar(36), FIRSTNAME varchar(100), LASTNAME varchar(100))");
-    
-    // add test persons
-    db.insertData("PERSON", ["PERSONID", "FIRSTNAME", "LASTNAME", "USER_NEW", "DATE_NEW"], null, ["TEST-5", "Franz", "Müller", "testuser", vars.get("$sys.date")])
-    db.insertData("PERSON", ["PERSONID", "FIRSTNAME", "LASTNAME", "USER_NEW", "DATE_NEW"], null, ["TEST-6", "Marco", "Polo", "testuser", vars.get("$sys.date")])
-}, undefined, undefined, function postAll()
-{
-    cleanWrapperTests()
-})
-
-var mandatoryErrorTests = new TestSuite([
-// and
-    ["and without parameter should error", function(pTester)
-    {
-        new SqlBuilder().where().or();
-    }, SqlBuilder._ERROR_NO_PARAMETER_PROVIDED()],
-
-    ["and with null as value should error", function(pTester)
-    {
-        new SqlBuilder().where().or("PERSON.FIRSTNAME", null);
-    }, SqlBuilder._ERROR_VALUE_IS_MANDATORY()],
-
-    ["and with undefined as value should error", function(pTester)
-    {
-        new SqlBuilder().where().or("PERSON.FIRSTNAME", undefined);
-    }, SqlBuilder._ERROR_VALUE_IS_MANDATORY()],
-
-    ["and with a jdito-var containing null should error", function(pTester)
-    {
-        vars.set("$global.TestingVarNull", null);
-        
-        new SqlBuilder().where().or("PERSON.FIRSTNAME", "$global.TestingVarNull");
-    }, SqlBuilder._ERROR_VALUE_IS_MANDATORY_JDITO_VAR()],
-
-    ["and with an empty sql-builder as subquery should error", function(pTester)
-    {        
-        new SqlBuilder().where().or("PERSON.FIRSTNAME", new SqlBuilder());
-    }, SqlBuilder._ERROR_VALUE_IS_MANDATORY()],
-
-    ["and with an empty prepared statement as subquery should error", function(pTester)
-    {        
-        new SqlBuilder().where().or("PERSON.FIRSTNAME", ["", []]);
-    }, SqlBuilder._ERROR_VALUE_IS_MANDATORY()],
-
-
-// or
-    ["or without parameter should error", function(pTester)
-    {
-        new SqlBuilder().where().or();
-    }, SqlBuilder._ERROR_NO_PARAMETER_PROVIDED()],
-
-    ["or with null as value should error", function(pTester)
-    {
-        new SqlBuilder().where().or("PERSON.FIRSTNAME", null);
-    }, SqlBuilder._ERROR_VALUE_IS_MANDATORY()],
-
-    ["or with undefined as value should error", function(pTester)
-    {
-        new SqlBuilder().where().or("PERSON.FIRSTNAME", undefined);
-    }, SqlBuilder._ERROR_VALUE_IS_MANDATORY()],
-
-    ["or with a jdito-var containing null should error", function(pTester)
-    {
-        vars.set("$global.TestingVarNull", null);
-        
-        new SqlBuilder().where().or("PERSON.FIRSTNAME", "$global.TestingVarNull");
-    }, SqlBuilder._ERROR_VALUE_IS_MANDATORY_JDITO_VAR()],
-
-    ["or with an empty sql-builder as subquery should error", function(pTester)
-    {        
-        new SqlBuilder().where().or("PERSON.FIRSTNAME", new SqlBuilder());
-    }, SqlBuilder._ERROR_VALUE_IS_MANDATORY()],
-
-    ["or with an empty prepared statement as subquery should error", function(pTester)
-    {        
-        new SqlBuilder().where().or("PERSON.FIRSTNAME", ["", []]);
-    }, SqlBuilder._ERROR_VALUE_IS_MANDATORY()],
-]);
-
-var inStatementTests = new TestSuite([
-    ["simple and in", function(pTester)
-    {
-        var actual = new SqlBuilder()
-                            .where("PERSON.LASTNAME", ["Franz", "Fritz"], SqlBuilder.IN()) // Note: you can use SqlBuilder.IN(), SqlBuilder.NOT_IN(), "# in ?", etc. as 3rd parameter
-                            .or("PERSON.LASTNAME", ["Peter", "Mayer"], SqlBuilder.IN());
-                            
-        pTester.assert(" ( PERSON.LASTNAME in  (?, ?)  )  or  ( PERSON.LASTNAME in  (?, ?)  ) ", actual._where._sqlStorage, "prepared sql");
-        pTester.assert(4, actual._where.preparedValues.length, "number of params");
-    }],
-
-    ["simple and not in", function(pTester)
-    {
-        var actual = new SqlBuilder()
-                            .where("PERSON.LASTNAME", ["Franz", "Fritz"], "# not in ?"); // Note: you can use SqlBuilder.IN(), SqlBuilder.NOT_IN(), "# in ?", etc. as 3rd parameter
-                            
-        pTester.assert(" ( PERSON.LASTNAME not in  (?, ?)  ) ", actual._where._sqlStorage, "prepared sql");
-        pTester.assert(2, actual._where.preparedValues.length, "number of params");
-    }],
-
-    ["in with subquery", function(pTester)
-    {
-        var actual = new SqlBuilder()
-                        .where("PERSON.FIRSTNAME", new SqlBuilder()
-                                                        .select("PERSON.FIRSTNAME")
-                                                        .from("PERSON")
-                                                        .where("PERSON.LASTNAME", "Fritz")
-                                                , "# in ?"); // Note: you can use SqlBuilder.IN() instead of "# in ?"
-                            
-        pTester.assert("PERSON.FIRSTNAME in  ( select PERSON.FIRSTNAME from PERSON where PERSON.LASTNAME = ? ) ", actual._where._sqlStorage, "prepared sql");
-        pTester.assert(1, actual._where.preparedValues.length, "number of params");
-    }],
-
-    ["in with prepared statement-array", function(pTester)
-    {
-        var actual = new SqlBuilder()
-                        .where("PERSON.FIRSTNAME", ["select PERSON.FIRSTNAME from PERSON where PERSON.LASTNAME = ?", [["Fritz", SQLTYPES.VARCHAR]]]
-                                                , "# in ?"); // Note: you can use SqlBuilder.IN() instead of "# in ?"
-                            
-        pTester.assert("PERSON.FIRSTNAME in  ( select PERSON.FIRSTNAME from PERSON where PERSON.LASTNAME = ? ) ", actual._where._sqlStorage, "prepared sql");
-        pTester.assert(1, actual._where.preparedValues.length, "number of params");
-    }],
-
-    ["andIfSet should ignore empty array", function(pTester)
-    {
-        var actual = new SqlBuilder()
-                            .whereIfSet("PERSON.LASTNAME", []);
-                            
-        pTester.assert("", actual._where._sqlStorage, "prepared sql should be empty");
-        pTester.assert(0, actual._where.preparedValues.length, "number of params should be 0");
-    }],
-
-    ["and should error on an empty array", function(pTester)
-    {
-        new SqlBuilder()
-                .where("PERSON.LASTNAME", []);
-    }, SqlBuilder._ERROR_VALUE_IS_MANDATORY()]
-]);
-
-var testConstantFunctions = new TestSuite([
-    ["SqlBuilder.IN()", function(pTester)
-    {
-        pTester.assert("# in ?", SqlBuilder.IN());
-    }],
-    
-    ["SqlBuilder.NOT_IN()", function(pTester)
-    {
-        pTester.assert("# not in ?", SqlBuilder.NOT_IN());
-    }],
-
-    ["SqlBuilder.EXISTS()", function(pTester)
-    {
-        pTester.assert("exists ?", SqlBuilder.EXISTS());
-    }]
-]);
-
-var selectTests = new TestSuite([
-    ["a sql-builder in a fields-array is translated to sql correctly", function(pTester)
-    {
-        var countSubQuery = newSelect("count(*)")
-                                .from("AB_ATTRIBUTEUSAGE")
-                                .where("AB_ATTRIBUTEUSAGE.OBJECT_TYPE", "myType")
-                                .and("AB_ATTRIBUTEUSAGE.AB_ATTRIBUTE_ID = AB_ATTRIBUTE.AB_ATTRIBUTEID");
-    
-        var actual = new SqlBuilder()
-            .select(["AB_ATTRIBUTEID", "AB_ATTRIBUTEUSAGEID", countSubQuery])
-            .from("AB_ATTRIBUTE")
-                        
-        pTester.assert("select AB_ATTRIBUTEID, AB_ATTRIBUTEUSAGEID, (select count(*) from AB_ATTRIBUTEUSAGE where AB_ATTRIBUTEUSAGE.OBJECT_TYPE = ? and AB_ATTRIBUTEUSAGE.AB_ATTRIBUTE_ID = AB_ATTRIBUTE.AB_ATTRIBUTEID)", actual._select._sqlStorage, "prepared select-sql");
-        pTester.assert(1, actual._select.preparedValues.length, "number of params");
-    }],
-
-    ["a sql-builder in from is used as subselect", function(pTester)
-    {
-        var subQuery = newSelect("FIRSTNAME")
-                                .from("PERSON")
-                                .where("PERSON.LASTNAME", "Meier")
-    
-        var actual = new SqlBuilder()
-            .select("*")
-            .from(subQuery)
-            
-        pTester.assert("from (select FIRSTNAME from PERSON where PERSON.LASTNAME = ?)", actual._from._sqlStorage, "prepared select-sql");
-        pTester.assert(1, actual._from.preparedValues.length, "number of params");
-    }]
-]);
-
-var joinTests = new TestSuite([
-    ["SqlBuilder as on-condition should only add the conditon of the builder", function(pTester)
-    {
-        var subQuery = newSelect("NAME")
-                                .from("ORGANISATION")
-                                .where("ORGANISATION.NAME", "Adito")
-    
-        var actual = new SqlBuilder()
-            .select("*")
-            .from("PERSON")
-            .join("ORGANISATION", subQuery)
-            
-        pTester.assert("join ORGANISATION on ORGANISATION.NAME = ?", actual._joins[0]._sqlStorage, "prepared select-sql");
-        pTester.assert(1, actual._joins[0].preparedValues.length, "number of params");
-    }],
-
-    ["SqlBuilder as table for join is added as subselect", function(pTester)
-    {
-        var subQuery = newSelect("NAME")
-                                .from("ORGANISATION")
-                                .where("ORGANISATION.NAME", "Adito")
-    
-        var actual = new SqlBuilder()
-            .select("*")
-            .from("PERSON")
-            .join(subQuery, "orgname.NAME = TABLE2.NAME", "orgname")
-            
-        pTester.assert("join (select NAME from ORGANISATION where ORGANISATION.NAME = ?) orgname on orgname.NAME = TABLE2.NAME", actual._joins[0]._sqlStorage, "prepared select-sql");
-        pTester.assert(1, actual._joins[0].preparedValues.length, "number of params");
-    }],
-
-    ["just use a string also containing a condition as join without additional condition", function(pTester)
-    {
-        var actual = new SqlBuilder()
-            .select("*")
-            .from("PERSON")
-            .join("TABLE1 on TABLE1.NAME = TABLE2.NAME")
-            
-        pTester.assert("join TABLE1 on TABLE1.NAME = TABLE2.NAME", actual._joins[0]._sqlStorage, "prepared select-sql");
-        pTester.assert(0, actual._joins[0].preparedValues.length, "number of params");
-    }]
-]);
-
-var subqueryAsFieldTests = new TestSuite([
-    ["Test if a Subselect as field works if pValue is provided. This should be added as subselect.", function(pTester)
-    {
-        var subQuery = newSelect("NAME")
-                                .from("ORGANISATION")
-                                .where("ORGANISATION.ORGANISATIONID = CONTACT.ORGANISATION_ID")
-                                .and("PERSON.FIRSTNAME", "val1") // test if the value is added at the correct place
-    
-        var actual = new SqlBuilder().where(subQuery, "val2", "# = ?", SQLTYPES.VARCHAR)
-                                     .and("PERSON.FIRSTNAME", "val3");
-                
-            
-        pTester.assert(" ( ( select NAME from ORGANISATION where ORGANISATION.ORGANISATIONID = CONTACT.ORGANISATION_ID and PERSON.FIRSTNAME = ? ) = ? )  and PERSON.FIRSTNAME = ?", actual._where._sqlStorage, "prepared select-sql");
-        pTester.assert(3, actual._where.preparedValues.length, "number of params");
-        pTester.assert("val1", actual._where.preparedValues[0][0], "param 1 is correct value");
-        pTester.assert("val2", actual._where.preparedValues[1][0], "param 2 is correct value");
-        pTester.assert("val3", actual._where.preparedValues[2][0], "param 3 is correct value");
-    }],
-
-    ["Test if a Subselect as field should error if no SQLTYPE is provided.", function(pTester)
-    {
-        var subQuery = newSelect("NAME")
-                                .from("ORGANISATION")
-                                .where("ORGANISATION.ORGANISATIONID = CONTACT.ORGANISATION_ID")
-                                .and("PERSON.FIRSTNAME", "val1") // test if the value is added at the correct place
-        new SqlBuilder().where(subQuery, "val2", "# = ?");
-    }, SqlBuilder._ERROR_SUBSELECT_AS_FIELD_NO_FIELD_TYPE()],
-
-    ["Test if a Subselect as field should error if it is not a full select.", function(pTester)
-    {
-        var subQuery = newSelect("NAME")
-                                .where("ORGANISATION.ORGANISATIONID = CONTACT.ORGANISATION_ID")
-                                .and("PERSON.FIRSTNAME", "val1") // test if the value is added at the correct place
-    
-        new SqlBuilder().where(subQuery, "val2", "# = ?", SQLTYPES.VARCHAR);
-    }, SqlBuilder._ERROR_SUBSELECT_AS_FIELD_NOT_COMPLETE()]
-]);
-
-var conditionFormatTests = new TestSuite([
-    ["pCondition should not fail if # an ? exist in correct order", function(pTester)
-    {
-        new SqlBuilder().where("PERSON.FIRSTNAME", "val1", "# = ?")
-                        .and("PERSON.FIRSTNAME", "val1", "asdf # fdsa=asdf ?fdas")
-    }],
-
-    ["pCondition should not fail if # an ? exist in correct order and there are additional, escaped # and ?", function(pTester)
-    {
-        new SqlBuilder().where("PERSON.FIRSTNAME", "val1", "\\? # \\#= ?");
-    }],
-
-    ["pCondition should not fail if only ? exists", function(pTester)
-    {
-        new SqlBuilder().where("PERSON.FIRSTNAME", "val1", "?")
-    }],
-
-    ["pCondition should fail if more than one ? exists", function(pTester)
-    {
-        new SqlBuilder().where("PERSON.FIRSTNAME", "val1", "? test ?")
-    }, SqlBuilder._ERROR_CONDITION_WRONG_FORMAT()],
-
-    ["pCondition should fail if more than one # exists", function(pTester)
-    {
-        new SqlBuilder().where("PERSON.FIRSTNAME", "val1", "# test #")
-    }, SqlBuilder._ERROR_CONDITION_WRONG_FORMAT()],
-
-    ["pCondition should fail if # and ? are in wrong order", function(pTester)
-    {
-        new SqlBuilder().where("PERSON.FIRSTNAME", "val1", "? = #")
-    }, SqlBuilder._ERROR_CONDITION_WRONG_FORMAT()]
-]);
-
-var subqueryAliasTests = new TestSuite([
-    ["subselectAlias should be added for subquery in .select", function(pTester)
-    {
-        var subQuery = newSelect("NAME")
-                                .from("ORGANISATION")
-                                .where("ORGANISATION.NAME", "Adito")
-                                .subselectAlias("testAlias")
-    
-        var actual = new SqlBuilder()
-            .select([subQuery, "FIRSTNAME"])
-            .from("PERSON")
-            
-        pTester.assert("select (select NAME from ORGANISATION where ORGANISATION.NAME = ?) testAlias, FIRSTNAME", actual._select._sqlStorage, "prepared select-sql");
-        pTester.assert(1, actual._select.preparedValues.length, "number of params");
-    }],
-
-    ["subselectAlias should be added for subquery in .from", function(pTester)
-    {
-        var subQuery = newSelect("NAME")
-                                .from("ORGANISATION")
-                                .where("ORGANISATION.NAME", "Adito")
-                                .subselectAlias("testAlias")
-    
-        var actual = new SqlBuilder()
-            .from(subQuery)
-            
-        pTester.assert("from (select NAME from ORGANISATION where ORGANISATION.NAME = ?) testAlias", actual._from._sqlStorage, "prepared select-sql");
-        pTester.assert(1, actual._from.preparedValues.length, "number of params");
-    }],
-
-    ["subselectAlias should be overruled by the param in in .from", function(pTester)
-    {
-        var subQuery = newSelect("NAME")
-                                .from("ORGANISATION")
-                                .where("ORGANISATION.NAME", "Adito")
-                                .subselectAlias("testAlias")
-    
-        var actual = new SqlBuilder()
-            .from(subQuery, "overwriteAlias")
-            
-        pTester.assert("from (select NAME from ORGANISATION where ORGANISATION.NAME = ?) overwriteAlias", actual._from._sqlStorage, "prepared select-sql");
-        pTester.assert(1, actual._from.preparedValues.length, "number of params");
-    }],
-
-    ["subselectAlias should be added for subquery in .join", function(pTester)
-    {
-        var subQuery = newSelect("NAME, ORGANISATIONID")
-                                .from("ORGANISATION")
-                                .where("ORGANISATION.NAME", "Adito")
-                                .subselectAlias("testAlias")
-    
-        var actual = new SqlBuilder()
-            .from("CONTACT")
-            .join(subQuery, "testAlias.ORGANISATIONID = ORGANISATION_ID")
-            .join(subQuery, "testAlias.ORGANISATIONID = ORGANISATION_ID", "overwriteAlias")
-            
-        pTester.assert("join (select NAME, ORGANISATIONID from ORGANISATION where ORGANISATION.NAME = ?) testAlias on testAlias.ORGANISATIONID = ORGANISATION_ID", actual._joins[0]._sqlStorage, "prepared select-sql join 1");
-        pTester.assert(1, actual._joins[0].preparedValues.length, "number of params join 1");
-        
-        pTester.assert("join (select NAME, ORGANISATIONID from ORGANISATION where ORGANISATION.NAME = ?) overwriteAlias on testAlias.ORGANISATIONID = ORGANISATION_ID", actual._joins[1]._sqlStorage, "prepared select-sql join 2");
-        pTester.assert(1, actual._joins[1].preparedValues.length, "number of params join 2");
-    }]
-])
-
-var tester = new Tester("Test SqlBuilder");
-tester.test(newSelectTests);
-tester.test(validAndUsageTests);
-tester.test(validOrUsageTests);
-tester.test(combinedAndOrTests);
-tester.test(ifSetTests);
-tester.test(dbWrapperTests);
-tester.test(mandatoryErrorTests);
-tester.test(inStatementTests);
-tester.test(testConstantFunctions);
-tester.test(selectTests);
-tester.test(joinTests);
-tester.test(subqueryAsFieldTests);
-tester.test(conditionFormatTests);
-tester.test(subqueryAliasTests);
-
-logging.log("-------------------------");
-tester.printResults();
diff --git a/process/SqlMaskingUtils_test/SqlMaskingUtils_test.aod b/process/SqlMaskingUtils_test/SqlMaskingUtils_test.aod
new file mode 100644
index 00000000000..8636a3707b1
--- /dev/null
+++ b/process/SqlMaskingUtils_test/SqlMaskingUtils_test.aod
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+  <name>SqlMaskingUtils_test</name>
+  <title>[TEST] Sql_lib - SqlMaskingUtils</title>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <icon>VAADIN:CHECK_CIRCLE</icon>
+  <process>%aditoprj%/process/SqlMaskingUtils_test/process.js</process>
+  <alias>Data_alias</alias>
+  <variants>
+    <element>EXECUTABLE</element>
+  </variants>
+</process>
diff --git a/process/SqlMaskingUtils_test/process.js b/process/SqlMaskingUtils_test/process.js
new file mode 100644
index 00000000000..533a1b32e94
--- /dev/null
+++ b/process/SqlMaskingUtils_test/process.js
@@ -0,0 +1,158 @@
+import("system.result");
+import("system.db");
+import("Sql_lib");
+import("UnitTest_lib");
+
+function _createDummyMaskingUtil(pDbType)
+{
+    var currentAlias = db.getCurrentAlias();
+    if (!currentAlias)
+        throw new Error("alias required for test is not set");
+    var currentAliasType = db.getDatabaseType(currentAlias);
+    if (!currentAliasType)
+        throw new Error("alias type required for test is not set");
+    var createdObject = new SqlMaskingUtils(currentAlias);
+    createdObject.dbType = pDbType;
+    return createdObject;
+}
+
+var constructorTest = new TestSuite("SqlMaskingUtils.constructor", [
+    new Test("constructor sets correct specified alias",
+        function(pTester)
+        {
+            var currentAlias = db.getCurrentAlias();
+            if (!currentAlias)
+                throw new Error("alias required for test is not set");
+            var createdObject = new SqlMaskingUtils(currentAlias);
+            pTester.expectThat(createdObject.alias).equals(currentAlias).assert();
+        }
+        ),
+    new Test("constructor sets correct default alias",
+        function(pTester)
+        {
+            var currentAlias = db.getCurrentAlias();
+            if (!currentAlias)
+                throw new Error("alias required for test is not set");
+            var createdObject = new SqlMaskingUtils();
+            pTester.expectThat(createdObject.alias).equals(currentAlias).assert();
+        }
+        ),
+    new Test("constructor sets correct alias type",
+        function(pTester)
+        {
+            var currentAlias = db.getCurrentAlias();
+            if (!currentAlias)
+                throw new Error("alias required for test is not set");
+            var currentAliasType = db.getDatabaseType(currentAlias);
+            if (!currentAliasType)
+                throw new Error("alias type required for test is not set");
+            var createdObject = new SqlMaskingUtils(currentAlias);
+            pTester.expectThat(createdObject.dbType).equals(currentAliasType).assert();
+        }
+        ),
+    new Test("overwrite constructors dbType with derby",
+     function(pTester)
+     {
+        var res = _createDummyMaskingUtil(db.DBTYPE_DERBY10);
+        pTester.expectThat(res.dbType).equals(db.DBTYPE_DERBY10).assert();
+        pTester.expectThat(res.alias).isNull().assert();
+     }
+     ),
+    new Test("overwrite constructors dbType with mariaDB",
+        function(pTester)
+        {
+            var res = _createDummyMaskingUtil(db.DBTYPE_MARIADB10);
+            pTester.expectThat(res.dbType).equals(db.DBTYPE_MARIADB10).assert();
+            pTester.expectThat(res.alias).isNull().assert();
+        }
+        ),
+    new Test("overwrite constructors dbType with mySql",
+        function(pTester)
+        {
+            var res = _createDummyMaskingUtil(db.DBTYPE_MYSQL4);
+            pTester.expectThat(res.dbType).equals(db.DBTYPE_MYSQL4).assert();
+            pTester.expectThat(res.alias).isNull().assert();
+        }
+        ),
+    new Test("overwrite constructors dbType with oracle-cluster",
+        function(pTester)
+        {
+            var res = _createDummyMaskingUtil(db.DBTYPE_ORACLE10_CLUSTER);
+            pTester.expectThat(res.dbType).equals(db.DBTYPE_ORACLE10_CLUSTER).assert();
+            pTester.expectThat(res.alias).isNull().assert();
+        }
+        ),
+    new Test("overwrite constructors dbType with oracle-oci",
+        function(pTester)
+        {
+            var res = _createDummyMaskingUtil(db.DBTYPE_ORACLE10_OCI);
+            pTester.expectThat(res.dbType).equals(db.DBTYPE_ORACLE10_OCI).assert();
+            pTester.expectThat(res.alias).isNull().assert();
+        }
+        ),
+    new Test("overwrite constructors dbType with oracle-thin",
+        function(pTester)
+        {
+            var res = _createDummyMaskingUtil(db.DBTYPE_ORACLE10_THIN);
+            pTester.expectThat(res.dbType).equals(db.DBTYPE_ORACLE10_THIN).assert();
+            pTester.expectThat(res.alias).isNull().assert();
+        }
+        ),
+    new Test("overwrite constructors dbType with postgresql",
+        function(pTester)
+        {
+            var res = _createDummyMaskingUtil(db.DBTYPE_POSTGRESQL8);
+            pTester.expectThat(res.dbType).equals(db.DBTYPE_POSTGRESQL8).assert();
+            pTester.expectThat(res.alias).isNull().assert();
+        }
+        ),
+    new Test("overwrite constructors dbType with ms sql",
+        function(pTester)
+        {
+            var res = _createDummyMaskingUtil(db.DBTYPE_SQLSERVER2000);
+            pTester.expectThat(res.dbType).equals(db.DBTYPE_SQLSERVER2000).assert();
+            pTester.expectThat(res.alias).isNull().assert();
+        }
+        )
+    ]);
+
+
+var getConcatSymbolTest = new TestSuite("SqlMaskingUtils.getConcatSymbol", [
+    new Test("getConcatSymbol returns a non empty string",
+        function(pTester)
+        {
+            var maskingHelper = _createDummyMaskingUtil(db.DBTYPE_SQLSERVER2000);
+            var res = maskingHelper.getConcatSymbol();
+            pTester.expectThat(res).not().isNull().assert();
+            pTester.expectThat(res).not().isUndefined().assert();
+            pTester.expectThat(res).isString().assert();
+            pTester.expectThat(res.length).isInteger().assert();
+            pTester.expectThat(res.length).isGreater(0).assert();
+        }
+        ),
+    new Test("+ for MS SQL",
+        function(pTester)
+        {
+            var maskingHelper = _createDummyMaskingUtil(db.DBTYPE_SQLSERVER2000);
+            var res = maskingHelper.getConcatSymbol();
+            pTester.expectThat(res.trim()).equals("+").assert();
+        }
+        ),
+    new Test("|| for Oracle",
+        function(pTester)
+        {
+            var maskingHelper = _createDummyMaskingUtil(db.DBTYPE_ORACLE10_THIN);
+            var res = maskingHelper.getConcatSymbol();
+            pTester.expectThat(res.trim()).equals("||").assert();
+        }
+        )
+    ]);
+
+var tester = new Tester("Test SqlMaskingUtils");
+tester.initCoverage(SqlMaskingUtils);
+tester.test(constructorTest);
+tester.test(getConcatSymbolTest);
+//TODO: add full test coverage
+tester.summary();
+
+result.object(tester.getResults());
\ No newline at end of file
diff --git a/process/Sql_lib/documentation.adoc b/process/Sql_lib/documentation.adoc
index 8b903c2155e..417d8aa237b 100644
--- a/process/Sql_lib/documentation.adoc
+++ b/process/Sql_lib/documentation.adoc
@@ -17,10 +17,10 @@ include::_default_attributes_EN.adoc[]
 
 This document describes the functionality and the usage of the SqlBuilder, which is included in the library *Sql_lib* of the ADITO xRM project (see "Projects" window, under process > libraries). The documentation may not contain all features of the SqlBuilder. It is supplemental to the documentation you find in the code itself: A usage will often be possible in an intuitive way, so just try coding using code completion and JSDoc, where all parameters are documented.
 
-You may also take a look at the library *SqlLib_tests* (also under process > libraries), as it contains many possible ways to use the SqlBuilder.
+You may also take a look at the library *Sql_test* (also under process > libraries), as it contains many possible ways to use the SqlBuilder.
 
 [NOTE]
-The tests included in the library SqlLib_tests use the UnitTest_lib for unit testing. You can use this functionality also in other contexts, according to your requirements.
+The tests included in the library Sql_test use the UnitTest_lib for unit testing. You can use this functionality also in other contexts, according to your requirements.
 
 == Benefits
 
diff --git a/process/SqlLib_tests/SqlLib_tests.aod b/process/Terminal_lib/Terminal_lib.aod
similarity index 67%
rename from process/SqlLib_tests/SqlLib_tests.aod
rename to process/Terminal_lib/Terminal_lib.aod
index 9f2866f8f91..9fa0811425e 100644
--- a/process/SqlLib_tests/SqlLib_tests.aod
+++ b/process/Terminal_lib/Terminal_lib.aod
@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
-  <name>SqlLib_tests</name>
+  <name>Terminal_lib</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
-  <process>%aditoprj%/process/SqlLib_tests/process.js</process>
-  <alias>Data_alias</alias>
+  <documentation>%aditoprj%/process/Terminal_lib/documentation.adoc</documentation>
+  <process>%aditoprj%/process/Terminal_lib/process.js</process>
   <variants>
     <element>LIBRARY</element>
   </variants>
diff --git a/process/Terminal_lib/process.js b/process/Terminal_lib/process.js
new file mode 100644
index 00000000000..13a0188495d
--- /dev/null
+++ b/process/Terminal_lib/process.js
@@ -0,0 +1,342 @@
+import("system.logging");
+import("Util_lib");
+
+
+/**
+ * This library gives you helpful colored output on the terminal
+ * You can use the predefined helper methods or use your own color- and format combinations
+ *
+ * @example
+ * var t = new Terminal();
+ * logging.log(t.success("It works!"));
+ * logging.log(t.color(t.fg.green).background(t.bg.red).output("I would never use green text on red background..."));
+ *
+ * @see https://en.wikipedia.org/wiki/ANSI_escape_code
+ * @class
+ */
+function Terminal()
+{
+    this.mod = {
+        reset : 0
+    };
+
+    this.fg = {
+        reset         : 39,
+        black         : 30,
+        red           : 31,
+        green         : 32,
+        yellow        : 33,
+        blue          : 34,
+        magenta       : 35,
+        cyan          : 36,
+        white         : 37,
+        brightBlack   : 90,
+        brightRed     : 91,
+        brightGreen   : 92,
+        brightYellow  : 93,
+        brightBlue    : 94,
+        brightMagenta : 95,
+        brightCyan    : 96,
+        brightWhite   : 97
+    };
+
+    this.bg = {
+        reset         : 49,
+        black         : 40,
+        red           : 41,
+        green         : 42,
+        yellow        : 43,
+        blue          : 44,
+        magenta       : 45,
+        cyan          : 46,
+        white         : 47,
+        brightBlack   : 100,
+        brightRed     : 101,
+        brightGreen   : 102,
+        brightYellow  : 103,
+        brightBlue    : 104,
+        brightMagenta : 105,
+        brightCyan    : 106,
+        brightWhite   : 107
+    };
+
+    this.formats = {
+        weightBold      : 1,
+        weightLight     : 2,
+        weightOff       : 22,
+        italic          : 3,
+        italicOff       : 23,
+        underline       : 4,
+        underlineDouble : 21,
+        underlineOff    : 24,
+        strike          : 9,
+        strikeOff       : 29
+    };
+
+    this._defaultConfig = {
+        colorText: this.fg.reset,
+        colorBackground: this.bg.reset,
+        bold: this.formats.weightOff,
+        italic: this.formats.italicOff,
+        underline: this.formats.underlineOff,
+        strike: this.formats.strikeOff
+    };
+
+    this.outputConfig = Utils.clone(this._defaultConfig);
+}
+
+
+/**
+ * Reset the output config by cloning and setting the default
+ *
+ * @return {void}
+ */
+Terminal.prototype._resetConfig = function ()
+{
+    this.outputConfig = Utils.clone(this._defaultConfig);
+}
+
+/**
+ * Set or reset the text color
+ *
+ * @param {int} pValue
+ * @return {Terminal}
+ */
+Terminal.prototype.color = function (pValue)
+{
+    this.outputConfig.colorText = this._contains(this.fg, pValue) ? pValue : this.fg.reset;
+    
+    return this;
+}
+
+/**
+ * Set or reset the background color
+ *
+ * @param {int} pValue
+ * @return {Terminal}
+ */
+Terminal.prototype.background = function (pValue)
+{
+    this.outputConfig.colorBackground = this._contains(this.bg, pValue) ? pValue : this.bg.reset;
+    
+    return this;
+}
+
+/**
+ * Set, unset or add a formatting to the output config
+ *
+ * @param {int} pValue
+ * @return {Terminal}
+ */
+Terminal.prototype.format = function (pValue)
+{    
+    var allowedWeightValues = [this.formats.weightBold, this.formats.weightLight, this.formats.weightOff];
+    this.outputConfig.bold = this._contains(allowedWeightValues, pValue) ? pValue : this.formats.weightOff;
+
+    var allowedItalicValues = [this.formats.italic, this.formats.italicOff];
+    this.outputConfig.italic = this._contains(allowedItalicValues, pValue) ? pValue : this.formats.italicOff;
+
+    var allowedUnderlineValues = [this.formats.underline, this.formats.underlineDouble, this.formats.underlineOff];
+    this.outputConfig.underline = this._contains(allowedUnderlineValues, pValue) ? pValue : this.formats.underlineOff;
+
+    var allowedStrikeValues = [this.formats.strike, this.formats.strikeOff];
+    this.outputConfig.strike = this._contains(allowedStrikeValues, pValue) ? pValue : this.formats.strikeOff;
+    
+    return this;
+}
+
+/**
+ * Returns a string wrapped in escape sequences according to previous formatting instructions
+ * Must be called after `.color()`, `.background()` and/or `.format()`.
+ *
+ * @param {String} pString the string to format
+ * @return {String}
+ */
+Terminal.prototype.output = function (pString)
+{
+    var output = "";
+    var seqValues = [];
+    
+    Object.keys(this.outputConfig).forEach(function(pKey) {
+        seqValues.push(this.outputConfig[pKey]);
+    }, this);
+    
+    output += this._generateSequence(seqValues);
+    output += pString;
+    output += this._generateSequence(this.mod.reset);
+    
+    this._resetConfig();
+    return output;
+}
+
+/**
+ * Returns the given string formatted as light-colored text
+ *
+ * @param {String} pString the string to format
+ * @return {String}
+ */
+Terminal.prototype.debug = function (pString)
+{
+    return this.color(this.fg.white).output(pString);
+}
+
+/**
+ * Returns the given string formatted as bold black text on green background
+ *
+ * @param {String} pString the string to format
+ * @return {String}
+ */
+Terminal.prototype.successBlock = function (pString)
+{
+    return this.color(this.fg.brightBlack).background(this.bg.green).format(this.formats.weightBold).output(pString);
+}
+
+/**
+ * Returns the given string formatted as bold green text
+ *
+ * @param {String} pString the string to format
+ * @return {String}
+ */
+Terminal.prototype.success = function (pString)
+{
+    return this.color(this.fg.green).format(this.formats.weightBold).output(pString);
+}
+
+/**
+ * Returns the given string formatted as bold black text on green background
+ *
+ * @param {String} pString the string to format
+ * @return {String}
+ */
+Terminal.prototype.successBlock = function (pString)
+{
+    return this.color(this.fg.brightBlack).background(this.bg.green).format(this.formats.weightBold).output(" " + pString + " ");
+}
+
+/**
+ * Returns the given string formatted as bold blue text
+ *
+ * @param {String} pString the string to format
+ * @return {String}
+ */
+Terminal.prototype.info = function (pString)
+{
+    return this.color(this.fg.blue).format(this.formats.weightBold).output(pString);
+}
+
+/**
+ * Returns the given string formatted as bold white text on blue background
+ *
+ * @param {String} pString the string to format
+ * @return {String}
+ */
+Terminal.prototype.infoBlock = function (pString)
+{
+    return this.color(this.fg.brightWhite).background(this.bg.blue).format(this.formats.weightBold).output(" " + pString + " ");
+}
+
+/**
+ * Returns the given string formatted as bold magenta text
+ *
+ * @param {String} pString the string to format
+ * @return {String}
+ */
+Terminal.prototype.important = function (pString)
+{
+    return this.color(this.fg.magenta).format(this.formats.weightBold).output(pString);
+}
+
+/**
+ * Returns the given string formatted as bold white text on magenta background
+ *
+ * @param {String} pString the string to format
+ * @return {String}
+ */
+Terminal.prototype.importantBlock = function (pString)
+{
+    return this.color(this.fg.brightWhite).background(this.bg.magenta).format(this.formats.weightBold).output(" " + pString + " ");
+}
+
+/**
+ * Returns the given string formatted as bold yellow text
+ *
+ * @param {String} pString the string to format
+ * @return {String}
+ */
+Terminal.prototype.warning = function (pString)
+{
+    return this.color(this.fg.yellow).format(this.formats.weightBold).output(pString);
+}
+
+/**
+ * Returns the given string formatted as bold black text on yellow background
+ *
+ * @param {String} pString the string to format
+ * @return {String}
+ */
+Terminal.prototype.warningBlock = function (pString)
+{
+    return this.color(this.fg.brightBlack).background(this.bg.yellow).format(this.formats.weightBold).output(" " + pString + " ");
+}
+
+/**
+ * Returns the given string formatted as bold red text
+ *
+ * @param {String} pString the string to format
+ * @return {String}
+ */
+Terminal.prototype.error = function (pString)
+{
+    return this.color(this.fg.red).format(this.formats.weightBold).output(pString);
+}
+
+/**
+ * Returns the given string formatted as bold white text on red background
+ *
+ * @param {String} pString the string to format
+ * @return {String}
+ */
+Terminal.prototype.errorBlock = function (pString)
+{
+    return this.color(this.fg.brightWhite).background(this.bg.red).format(this.formats.weightBold).output(" " + pString + " ");
+}
+
+/**
+ * Checks if a specific value is in a given array or object
+ *
+ * @param {(Array|Object)} pType
+ * @param {Any} pValue
+ * @return {Boolean}
+ */
+Terminal.prototype._contains = function (pType, pValue)
+{
+    var res = false;
+    
+    if(Array.isArray(pType)) {
+        res = pType.indexOf(pValue) !== -1;
+    } else {
+        Object.keys(pType).forEach(function(pKey) {
+            if(pType[pKey] === pValue) {
+                res = true;
+            }
+        }, this);
+    }
+
+    return res;
+}
+
+/**
+ * Generates and returns a terminal escape sequence
+ *
+ * @param {(int|int[])} pSequences A single or multiple escape sequence commands
+ */
+Terminal.prototype._generateSequence = function (pSequences)
+{
+    var seq = Array.isArray(pSequences) ? pSequences : [pSequences];
+    
+    seq = seq.filter(function(pElement) {
+        return Number.isInteger(parseFloat(pElement)) && isFinite(pElement);
+    });
+    
+    return "\033[" + seq.join(";") + "m";
+}
diff --git a/process/UnitTest_lib/UnitTest_lib.aod b/process/UnitTest_lib/UnitTest_lib.aod
index 225ac230384..a4499316765 100644
--- a/process/UnitTest_lib/UnitTest_lib.aod
+++ b/process/UnitTest_lib/UnitTest_lib.aod
@@ -2,6 +2,7 @@
 <process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
   <name>UnitTest_lib</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
+  <icon>VAADIN:CHECK_CIRCLE_O</icon>
   <process>%aditoprj%/process/UnitTest_lib/process.js</process>
   <alias>Data_alias</alias>
   <variants>
diff --git a/process/UnitTest_lib/process.js b/process/UnitTest_lib/process.js
index 0ce141d4828..382d37e0215 100644
--- a/process/UnitTest_lib/process.js
+++ b/process/UnitTest_lib/process.js
@@ -1,235 +1,1265 @@
 import("system.logging");
+import("Terminal_lib");
+import("Util_lib");
+
+/**
+ * @param {String} pName the name/description of the test
+ * @param {Function} pCallback the actual test callback to execute
+ * @param {Function} pDataProviderCallback an optional callback to deliver multiple datasets to the test
+ * @param {Boolean} pRerunOnError an optional flag indicating if a test should get rerun without try-catch if an error occurs (default: false)
+ *
+ * @class
+ */
+function Test(pName, pCallback, pDataProviderCallback, pRerunOnError)
+{
+    this.name = pName;
+    this.callback = pCallback;
+    this.dataProviderCallback = pDataProviderCallback || function() { return null; };
+    this.rerunOnError = !!pRerunOnError;
+}
 
 /**
  * A TestSuite combines several tests
- * @param {Array} pTests this is a n array of Tests in the following form:<br/>
- *                  [<br/>
- *                      ["Test description", function(pTester) <br/>
- *                          {<br/>
- *                              // the test which may use pTester.assert(...)<br/>
- *                          }, {Optional: an expected error}<br/>
- *                      ],<br/>
- *                      [...]<br/>
- *                  ]<br/>
+ *
+ * @param {String} pName name of the TestSuite
+ * @param {Array} pTests this is a n array of Tests
+ *
+ * @example
+ * var myTest = new TestSuite("MyObject.myTest", [
+ *     new Test("Test description",
+ *         function(pTester) {
+ *             var expectValue = 5;
+ *             var var actualValue = 20;
+ *             pTester.expectThat(actualValue).isGreater(expectValue).assert();
+ *         },
+ *     ),
+ *     new Test(...)
+ * ];
+
+ * @example
+ * // Using a DataProvider
+ * var myTest = new TestSuite("MyObject.myTest", [
+ *     new Test("Test description",
+ *         function(pTester, pDataProvider) {
+ *             var obj = new MyObject("Something");
+ *             var expectValue = pDataProvider[0];
+ *             var var actualValue = obj.getNumber();
+ *             pTester.expectThat(actualValue).isGreater(expectValue).assert();
+ *         },
+ *         function dataProvider() {
+ *             return [
+ *                 [0],
+ *                 [10],
+ *                 [100],
+ *             ];
+ *         },
+ *     ),
+ *     new Test(...)
+ * ];
+ *
  * @param {functionCallback} [pPreAll] a callback, called once before all tests
  * @param {functionCallback} [pPreTest] a callback, called once before each test
  * @param {functionCallback} [pPostTest] a callback, called once after each test
  * @param {functionCallback} [pPostAll] a callback, called once after all tests
- * 
+ *
+ * TODO: set callbacks via separate methods
+ *
  * @class
  */
-function TestSuite(pTests, pPreAll, pPreTest, pPostTest, pPostAll)
+function TestSuite(pName, pTests, pPreAll, pPreTest, pPostTest, pPostAll)
 {
+    this.name = pName;
     this.tests = pTests;
-    this.preAll = (pPreAll ? pPreAll : function() {});
-    this.preTest = (pPreTest ? pPreTest : function() {});
-    this.postTest = (pPostTest ? pPostTest : function() {});
-    this.postAll = (pPostAll ? pPostAll : function() {});
+    this.preAll = pPreAll || function() {};
+    this.preTest = pPreTest || function() {};
+    this.postTest = pPostTest || function() {};
+    this.postAll = pPostAll || function() {};
 }
 
 /**
- * The tester can test TestSuites.
- * It will be passed as paramter to each test.
- * 
+ * The tester runs TestSuites.
+ * It will be passed as parameter to each test.
+ *
  * @param {String} pCollectionName
+ *
+ * @example
+ * var myTest = new TestSuite("MyObject.myTest", [...]);
+ * var tester = new Tester("Test SqlBuilder", SqlBuilder);
+ * tester.test(myTest);
+ * // More test suites using tester.test()
+ * // ...
+ *
+ * tester.summary();
+ *
+ * @class
+ *
+ * TODO: Implement `isEmpty()`
+ * TODO: Implement `hasKey()`
+ * TODO: Implement `contains()`
+ * TODO: Implement `containsIgnoreCase()`
+ * TODO: Implement `isPrimitive()`
+ * TODO: Implement `matches()`
+ * TODO: Implement `matchesIgnoreCase()`
+ * TODO: Move multiple used code blocks into separate methods (like the logging output + reset)
+ * TODO: Use more getters, especially when implementing `elementAt()`
+ * TODO: Add examples to test methods
+ */
+function Tester(pCollectionName)
+{
+    this.collectionName = pCollectionName;
+    this.instanceName = undefined;
+    this.methods = [];
+    this.methodsCalled = [];
+
+    this.actualValue = undefined;
+    this.actualDisplayValue = undefined;
+    this.actualOriginalValue = undefined;
+    this.actualOriginalDisplayValue = undefined;
+    this.actualValueElementHierarchy = [];
+    this.expectedValue = undefined;
+    this.expectedDisplayValue = undefined;
+    this._assertDescription = "";
+    this._testResult = false;
+    this._useNegation = false;
+    this.dataProvider = undefined;
+    this.currentTestSuite = undefined;
+
+    this.testCount = 0;
+    this.successCount = 0;
+    this.failCount = 0;
+    this.startTime = new Date().getTime();
+    this.endTime = null;
+
+    this.t = new Terminal();
+    this.outputEnabled = true;
+    this.output = "";
+}
+
+/**
+ * Set the value to test
+ *
+ * @param {*} pValue
+ * @return {Tester}
+ */
+Tester.prototype.expectThat = function(pValue)
+{
+    this.actualValue = pValue;
+    this.actualDisplayValue = pValue;
+    this.actualOriginalValue = pValue;
+    this.actualOriginalDisplayValue = pValue;
+    this._useNegation = false;
+
+    return this;
+}
+
+/**
+ * Retrieve the result of the current test
+ *
+ * @return {Boolean}
+ */
+Tester.prototype.getTestResult = function()
+{
+    return this._useNegation ? !this._testResult : this._testResult;
+}
+
+/**
+ * Enable or disable the output
+ *
+ * @param {Boolean} pIsEnabled whether the output should be enabled or not
+ * @return {Tester}
+ */
+Tester.prototype.setOutputEnabled = function(pIsEnabled)
+{
+    this.outputEnabled = pIsEnabled;
+    return this;
+}
+
+/**
+ * Assert makes the test eventually pass or fail by looking at the result and writing into the output
+ *
+ * @return {void}
+ */
+Tester.prototype.assert = function()
+{
+    if(this.getTestResult() === true)
+    {
+        this.successCount++;
+        this._log("success", "\t\t\u2705 " + this._assertDescription);
+    }
+    else
+    {
+        this.failCount++;
+        this._log("error", "\t\t\u274C " + this._assertDescription);
+
+        if(this.actualDisplayValue !== undefined && this.expectedDisplayValue !== undefined)
+        {
+            this._log("warning", "\t\t\t expected: " + JSON.stringify(this.expectedDisplayValue, null, "\t"));
+            this._log("error", "\t\t\t actual:   " + JSON.stringify(this.actualDisplayValue, null, "\t"));
+        }
+    }
+}
+
+/**
+ * Activate test negation
+ *
+ * @return {Tester}
+ */
+Tester.prototype.not = function()
+{
+    this._useNegation = true;
+
+    return this;
+}
+
+/**
+ * Select a child element of `actualValue` to work with
+ *
+ * @param {(String|Number)} pKey the key of the child
+ * @return {Tester}
  * 
  * @example
- * var tester = new Tester("Test SqlBuilder");
- * tester.test(newSelectTests);
- * tester.test(validAndUsageTests);
- * tester.test(validOrUsageTests);
+ * // Grab first array element to test
+ * pTester.expectThat(actualValue).elementAt(0).equals("MyValue").assert();
  * 
- * logging.log("-------------------------");
- * tester.printResults();
+ * // Grab last array element to test
+ * pTester.expectThat(actualValue).elementAt(-1).equals("MyValue").assert();
  * 
- * @class
+ * // Grab object element to test
+ * pTester.expectThat(actualValue).elementAt("myKey").equals("MyValue").assert();
+ * 
+ * // Grab nested element in array/object structure to test, in this case `actualValue[5].myKey[2].someChild`
+ * pTester.expectThat(actualValue).elementAt(5).elementAt("myKey").elementAt(2).elementAt("someChild").equals("MyValue").assert();
  */
-function Tester(pCollectionName) 
+Tester.prototype.elementAt = function(pKey)
 {
-    this.collectionName = pCollectionName;
-    this.testResults = [];
+    if(!Array.isArray(this.actualValue) && !Utils.isObject(this.actualValue))
+    {
+        var error = new Error("actualValue must be array or object to use elementAt('" + pKey + "')");
+        error.name = "UnitTest_lib Error";
+        throw error;
+    }
+    
+    var key = Array.isArray(this.actualValue) && pKey === -1 ? this.actualValue.length - 1 : pKey;
     
-    // if no assert was called during a test, no test-message would be added. -> Add a success message that no error occoured.
-    this.currentTestHadAlreadyAssert = false;
+    this.actualValueElementHierarchy.push(key);
+    this.actualValue = this.actualValue[key];
+    this.actualDisplayValue = this.actualDisplayValue[key];
+
+    return this;
 }
 
 /**
- * generates a summary of the test results
- * 
- * @return {Obect}
+ * Test if a value is equal to a given value
+ *
+ * @param {*} pExpect the value to compare
+ * @param {(String|Object)} pCustomDescription an optional custom assert description or config object overwrite
+ * @return {Tester}
+ */
+Tester.prototype.equals = function(pExpect, pCustomDescription)
+{
+    this._setExpectValue(pExpect);
+
+    if(Utils.isObject(this.actualValue) || Utils.isObject(this.expectedValue))
+    {
+        this.expectedDisplayValue = JSON.stringify(this.actualValue);
+        this._testResult = Utils.isEqual(this.actualValue, this.expectedValue);
+        this._generateAssertDescription({custom: pCustomDescription, operator: "===", name: "Object value"});
+    }
+    else
+    {
+        this._testResult = this.actualValue === this.expectedValue;
+        this._generateAssertDescription({custom: pCustomDescription, operator: "==="});
+    }
+
+    return this;
+}
+
+/**
+ * Test if a value is greater than a given compare value
+ *
+ * @param {Number} pExpect the value to compare
+ * @param {(String|Object)} pCustomDescription an optional custom assert description or config object overwrite
+ * @return {Tester}
+ */
+Tester.prototype.isGreater = function(pExpect, pCustomDescription)
+{
+    this._setExpectValue(pExpect);
+    this._testResult = this.actualValue > this.expectedValue;
+
+    this._generateAssertDescription({custom: pCustomDescription, operator: ">"});
+
+    return this;
+}
+
+/**
+ * Test if a value is greater or equal than a given compare value
+ *
+ * @param {Number} pExpect the value to compare
+ * @param {(String|Object)} pCustomDescription an optional custom assert description or config object overwrite
+ * @return {Tester}
+ */
+Tester.prototype.isGreaterEqual = function(pExpect, pCustomDescription)
+{
+    this._setExpectValue(pExpect);
+    this._testResult = this.actualValue >= this.expectedValue;
+
+    this._generateAssertDescription({custom: pCustomDescription, operator: ">="});
+
+    return this;
+}
+
+/**
+ * Test if a value is lower than a given compare value
+ *
+ * @param {Number} pExpect the value to compare
+ * @param {(String|Object)} pCustomDescription an optional custom assert description or config object overwrite
+ * @return {Tester}
+ */
+Tester.prototype.isLower = function(pExpect, pCustomDescription)
+{
+    this._setExpectValue(pExpect);
+    this._testResult = this.actualValue < this.expectedValue;
+
+    this._generateAssertDescription({custom: pCustomDescription, operator: "<"});
+
+    return this;
+}
+
+/**
+ * Test if a value is lower or equal than a given compare value
+ *
+ * @param {Number} pExpect the value to compare
+ * @param {(String|Object)} pCustomDescription an optional custom assert description or config object overwrite
+ * @return {Tester}
+ */
+Tester.prototype.isLowerEqual = function(pExpect, pCustomDescription)
+{
+    this._setExpectValue(pExpect);
+    this._testResult = this.actualValue <= this.expectedValue;
+
+    this._generateAssertDescription({custom: pCustomDescription, operator: "<="});
+
+    return this;
+}
+
+/**
+ * Test if a value is a boolean
+ *
+ * @param {(String|Object)} pCustomDescription an optional custom assert description or config object overwrite
+ * @return {Tester}
+ */
+Tester.prototype.isBoolean = function(pCustomDescription)
+{
+    this._setExpectValue("boolean");
+    this._testResult = Utils.isBoolean(this.actualValue);
+    this.actualDisplayValue = typeof this.actualValue;
+
+    this._generateAssertDescription({custom: pCustomDescription, operator: "type is"});
+
+    return this;
+}
+
+/**
+ * Test if a value is a number
+ *
+ * @param {(String|Object)} pCustomDescription an optional custom assert description or config object overwrite
+ * @return {Tester}
+ */
+Tester.prototype.isNumber = function(pCustomDescription)
+{
+    this._setExpectValue("number");
+    this._testResult = Utils.isNumber(this.actualValue);
+    this.actualDisplayValue = typeof this.actualValue;
+
+    this._generateAssertDescription({custom: pCustomDescription, operator: "type is"});
+
+    return this;
+}
+
+/**
+ * Test if a value is numeric
+ *
+ * @param {(String|Object)} pCustomDescription an optional custom assert description or config object overwrite
+ * @return {Tester}
+ */
+Tester.prototype.isNumeric = function(pCustomDescription)
+{
+    this._setExpectValue("numeric");
+    this._testResult = Utils.isNumeric(this.actualValue);
+    this.actualDisplayValue = typeof this.actualValue;
+
+    this._generateAssertDescription({custom: pCustomDescription, operator: "is"});
+
+    return this;
+}
+
+/**
+ * Test if a value is NaN (not a number)
+ *
+ * @param {(String|Object)} pCustomDescription an optional custom assert description or config object overwrite
+ * @return {Tester}
+ */
+Tester.prototype.isNaN = function(pCustomDescription)
+{
+    this._setExpectValue("NaN");
+    this._testResult = Number.isNaN(this.actualValue);
+    this.actualDisplayValue = typeof this.actualValue;
+
+    this._generateAssertDescription({custom: pCustomDescription, operator: "type is"});
+
+    return this;
+}
+
+/**
+ * Test if a value is an integer
+ *
+ * @param {(String|Object)} pCustomDescription an optional custom assert description or config object overwrite
+ * @return {Tester}
+ */
+Tester.prototype.isInteger = function(pCustomDescription)
+{
+    this._setExpectValue("integer");
+    this._testResult = Utils.isInteger(this.actualValue);
+
+    this.actualDisplayValue = typeof this.actualValue;
+    this.expectedDisplayValue = "number";
+
+    this._generateAssertDescription({custom: pCustomDescription, operator: "is", expected: this.expectedValue});
+
+    return this;
+}
+
+/**
+ * Test if a value is a float
+ *
+ * @param {(String|Object)} pCustomDescription an optional custom assert description or config object overwrite
+ * @return {Tester}
+ */
+Tester.prototype.isFloat = function(pCustomDescription)
+{
+    this._setExpectValue("float");
+    this._testResult = Utils.isFloat(this.actualValue);
+
+    this.actualDisplayValue = typeof this.actualValue;
+    this.expectedDisplayValue = "number";
+
+    this._generateAssertDescription({custom: pCustomDescription, operator: "is", expected: this.expectedValue});
+
+    return this;
+}
+
+/**
+ * Test if a value is a string
+ *
+ * @param {(String|Object)} pCustomDescription an optional custom assert description or config object overwrite
+ * @return {Tester}
+ */
+Tester.prototype.isString = function(pCustomDescription)
+{
+    this._setExpectValue("string");
+    this._testResult = Utils.isString(this.actualValue);
+    this.actualDisplayValue = typeof this.actualValue;
+
+    this._generateAssertDescription({custom: pCustomDescription, operator: "type is"});
+
+    return this;
+}
+
+/**
+ * Test if a value is an array
+ *
+ * @param {(String|Object)} pCustomDescription an optional custom assert description or config object overwrite
+ * @return {Tester}
+ */
+Tester.prototype.isArray = function(pCustomDescription)
+{
+    this._setExpectValue("array");
+    this._testResult = Array.isArray(this.actualValue);
+    this.actualDisplayValue = typeof this.actualValue;
+
+    this._generateAssertDescription({custom: pCustomDescription, operator: "type is"});
+
+    return this;
+}
+
+/**
+ * Test if a value is an object
+ *
+ * @param {(String|Object)} pCustomDescription an optional custom assert description or config object overwrite
+ * @return {Tester}
+ */
+Tester.prototype.isObject = function(pCustomDescription)
+{
+    this._setExpectValue("object");
+    this._testResult = Utils.isObject(this.actualValue);
+    this.actualDisplayValue = typeof this.actualValue;
+
+    this._generateAssertDescription({custom: pCustomDescription, operator: "type is"});
+
+    return this;
+}
+
+/**
+ * Test if a value is a function
+ *
+ * @param {(String|Object)} pCustomDescription an optional custom assert description or config object overwrite
+ * @return {Tester}
+ */
+Tester.prototype.isFunction = function(pCustomDescription)
+{
+    this._setExpectValue("function");
+    this._testResult = Utils.isFunction(this.actualValue);
+    this.actualDisplayValue = typeof this.actualValue;
+
+    this._generateAssertDescription({custom: pCustomDescription, operator: "type is"});
+
+    return this;
+}
+
+/**
+ * Test if a value is null
+ *
+ * @param {(String|Object)} pCustomDescription an optional custom assert description or config object overwrite
+ * @return {Tester}
+ */
+Tester.prototype.isNull = function(pCustomDescription)
+{
+    this._setExpectValue("null");
+    this._testResult = this.actualValue === null;
+
+    this._generateAssertDescription({custom: pCustomDescription, operator: "is"});
+
+    return this;
+}
+
+/**
+ * Test if a value is undefined
+ *
+ * @param {(String|Object)} pCustomDescription an optional custom assert description or config object overwrite
+ * @return {Tester}
+ */
+Tester.prototype.isUndefined = function(pCustomDescription)
+{
+    this._setExpectValue("undefined");
+    this._testResult = this.actualValue === undefined || typeof this.actualValue === "undefined";
+
+    this._generateAssertDescription({custom: pCustomDescription, operator: "is"});
+
+    return this;
+}
+
+/**
+ * Test if a string value is lowercase
+ *
+ * An additional check of the opposite must be made to prevent strings with non-letter characters passing the test
+ *
+ * @param {(String|Object)} pCustomDescription an optional custom assert description or config object overwrite
+ * @return {Tester}
+ */
+Tester.prototype.isUpperCase = function(pCustomDescription)
+{
+    this._setExpectValue("uppercase");
+    this._testResult = Utils.isString(this.actualValue)
+                        && this.actualValue === this.actualValue.toUpperCase()
+                        && this.actualValue !== this.actualValue.toLowerCase()
+                        ;
+
+    this._generateAssertDescription({custom: pCustomDescription, operator: "is"});
+
+    return this;
+}
+
+/**
+ * Test if a string value is lowercase
+ *
+ * An additional check of the opposite must be made to prevent strings with non-letter characters passing the test
+ *
+ * @param {(String|Object)} pCustomDescription an optional custom assert description or config object overwrite
+ * @return {Tester}
+ */
+Tester.prototype.isLowerCase = function(pCustomDescription)
+{
+    this._setExpectValue("lowercase");
+    this._testResult = Utils.isString(this.actualValue)
+                        && this.actualValue === this.actualValue.toLowerCase()
+                        && this.actualValue !== this.actualValue.toUpperCase()
+                        ;
+
+    this._generateAssertDescription({custom: pCustomDescription, operator: "is"});
+
+    return this;
+}
+
+/**
+ * Test if a value starts with a given string
+ *
+ * An additional check of the opposite must be made to prevent strings with non-letter characters passing the test
+ *
+ * @param {Number} pExpect the expected string beginning
+ * @param {(String|Object)} pCustomDescription an optional custom assert description or config object overwrite
+ * @return {Tester}
+ */
+Tester.prototype.startsWith = function(pExpect, pCustomDescription)
+{
+    this._setExpectValue(pExpect);
+    this._testResult = Utils.isString(this.actualValue) && this.actualValue.startsWith(this.expectedValue);
+
+    this._generateAssertDescription({custom: pCustomDescription, operator: "starts with"});
+
+    return this;
+}
+
+/**
+ * Test if a value end with a given string
+ *
+ * An additional check of the opposite must be made to prevent strings with non-letter characters passing the test
+ *
+ * @param {Number} pExpect the expected string beginning
+ * @param {(String|Object)} pCustomDescription an optional custom assert description or config object overwrite
+ * @return {Tester}
+ */
+Tester.prototype.endsWith = function(pExpect, pCustomDescription)
+{
+    this._setExpectValue(pExpect);
+    this._testResult = Utils.isString(this.actualValue) && this.actualValue.endsWith(this.expectedValue);
+
+    this._generateAssertDescription({custom: pCustomDescription, operator: "ends with"});
+
+    return this;
+}
+
+/**
+ * Test if value is an instance of the expected "class"
+ *
+ * @param {Number} pExpect the expected instance name
+ * @param {(String|Object)} pCustomDescription an optional custom assert description or config object overwrite
+ * @return {Tester}
+ */
+Tester.prototype.isInstanceOf = function(pExpect, pCustomDescription)
+{
+    this._setExpectValue(pExpect);
+
+    // Checks the name of the constructor and runs a function to check the actual instance.
+    // To prevent security issues by using `eval()`, a double nested function was needed.
+    // The outer one to evaluate the code, the inner one to be able to pass an argument, that will be evaluated.
+    // TODO: Also check for isObject() before
+    this._testResult = Utils.isObject(this.actualValue)
+                        && this.actualValue.constructor.name === this.expectedValue
+                        && Function('"use strict"; return function(obj) {return obj instanceof ' + this.expectedValue + ';};')()(this.actualValue);
+    this.actualDisplayValue = this.actualValue.constructor.name;
+
+    this._generateAssertDescription({custom: pCustomDescription, operator: "is instance of"});
+
+    return this;
+}
+
+/**
+ * Test if value (array, string, object) has the expected length
+ *
+ * @param {Number} pExpect the expected length
+ * @param {(String|Object)} pCustomDescription an optional custom assert description or config object overwrite
+ * @return {Tester}
+ */
+Tester.prototype.hasLength = function(pExpect, pCustomDescription)
+{
+    this._setExpectValue(pExpect);
+
+    var length = this._getLength(this.actualValue);
+    this._testResult = length === this.expectedValue;
+    this.actualDisplayValue = length;
+
+    this._generateAssertDescription({custom: pCustomDescription, operator: "===", nameSuffix: ".length"});
+
+    return this;
+}
+
+/**
+ * Test if value (array, string, object) has a minimum expected length
+ *
+ * @param {Number} pExpect the expected length
+ * @param {(String|Object)} pCustomDescription an optional custom assert description or config object overwrite
+ * @return {Tester}
+ */
+Tester.prototype.hasMinLength = function(pExpect, pCustomDescription)
+{
+    this._setExpectValue(pExpect);
+
+    var length = this._getLength(this.actualValue);
+    this._testResult = length >= this.expectedValue;
+    this.actualDisplayValue = length;
+
+    this._generateAssertDescription({custom: pCustomDescription, operator: ">=", nameSuffix: ".length"});
+
+    return this;
+}
+
+/**
+ * Test if value (array, string, object) has a maximum expected length
+ *
+ * @param {Number} pExpect the expected length
+ * @param {(String|Object)} pCustomDescription an optional custom assert description or config object overwrite
+ * @return {Tester}
+ */
+Tester.prototype.hasMaxLength = function(pExpect, pCustomDescription)
+{
+    this._setExpectValue(pExpect);
+
+    var length = this._getLength(this.actualValue);
+    this._testResult = length <= this.expectedValue;
+    this.actualDisplayValue = length;
+
+    this._generateAssertDescription({custom: pCustomDescription, operator: "<=", nameSuffix: ".length"});
+
+    return this;
+}
+
+
+/**
+ * Test if a callback function throws an exception
+ *
+ * @param {Number} pExpect the expected error
+ * @param {(String|Object)} pCustomDescription an optional custom assert description or config object overwrite
+ * @return {Tester}
  */
-Tester.prototype.getSummary = function ()
+Tester.prototype.throwsException = function(pExpect, pCustomDescription)
 {
-    var summary = {
-        failures : 0,
-        successes : 0,
-        failedTests : [],
-        getMessage : function ()
+    this._setExpectValue(pExpect);
+    this._generateAssertDescription({custom: pCustomDescription, operator: "throws", expected: "exception", name: " "});
+
+    if(this._useNegation)
+    {
+        try
+        {
+            this.actualValue();
+        }
+        catch(e)
+        {
+            this._testResult = true; // Actually `false` and therefore failed, but must be `true` to make negation work
+            this.actualDisplayValue = e;
+            throw e;
+        }
+
+        this._testResult = false; // Actually `true` and therefore successful, but must be `false` to make negation work
+    }
+    else
+    {
+        try
         {
-            var message = "-------------------------\n"
-                + (this.failures ? "Test failure" : "Test success")
-                + "\n-------------------------\nTests performed: " + (this.successes + this.failures)
-                + "\nTests successful: " + this.successes
-                + "\nTests failed: " + this.failures;
-            if (this.failedTests.length)
+            this.actualValue();
+        }
+        catch(e)
+        {
+            this._testResult = e.toSource() === this.expectedValue.toSource();
+
+            if (!this._testResult)
             {
-                message += "\nFailures:";
-                this.failedTests.forEach(function (testName)
-                {
-                    message += "\n\t" + testName;
-                });
+                this.actualDisplayValue = e;
+                throw e;
             }
-            return message;
         }
     }
-    this.testResults.forEach(function ([testName,, successful])
-    {
-        if (successful)
-            summary.successes++;
+
+    return this;
+}
+
+/**
+ * Executes all tests in a TestSuite
+ *
+ * @param {TestSuite} pTestSuite the TestSuite which should be tested
+ * @return {void}
+ */
+Tester.prototype.test = function(pTestSuite)
+{
+    this.currentTestSuite = pTestSuite;
+    this._log("important", "\u2692 Suite: " + this.currentTestSuite.name);
+    this._registerMethodTestCall();
+
+    this.currentTestSuite.preAll(this);
+
+    this.currentTestSuite.tests.forEach(function(pTest) {
+        this._resetTest();
+
+        this.currentTestSuite.preTest(this);
+        this.dataProvider = pTest.dataProviderCallback();
+
+        if(Array.isArray(this.dataProvider) && this.dataProvider.length > 0)
+        {
+            this.dataProvider.forEach(function(pElement, pIndex) {
+                this._runTest(pTest, pIndex);
+            }, this);
+        }
         else
         {
-            summary.failures++;
-            summary.failedTests.push(testName);
+            this._runTest(pTest);
         }
+
+        this.currentTestSuite.postTest(this);
+    }, this);
+
+    this.currentTestSuite.postAll(this);
+}
+
+/**
+ * Calculate test duration
+ *
+ * Will we used in the results and summary output.
+ *
+ * @return {Number} the duration in milliseconds
+ */
+Tester.prototype.getDuration = function()
+{
+    if(this.endTime === null)
+    {
+        this.endTime = new Date().getTime();
+    }
+
+    return this.endTime - this.startTime;
+}
+
+/**
+ * Initializes test coverage by registering available and testable methods of given class
+ *
+ * @param {Object=} pInstanceName an optional class instance to make test coverage work
+ * @return {void}
+ */
+Tester.prototype.initCoverage = function(pInstanceName)
+{
+    if(pInstanceName !== undefined)
+    {
+        this.instanceName = pInstanceName;
+
+        var instanceMethods = Object.getOwnPropertyNames(this.instanceName.prototype).filter(function(property) {
+            return typeof this.instanceName.prototype[property] === 'function';
+        }, this);
+        var staticMethods = Object.getOwnPropertyNames(this.instanceName).filter(function(property) {
+            return typeof this.instanceName[property] === 'function';
+        }, this);
+
+        this.methods = instanceMethods.concat(staticMethods);
+    }
+}
+
+/**
+ * Get the results of current tester as object
+ *
+ * @return {Object} the test results
+ */
+Tester.prototype.getResults = function()
+{
+    return {
+        testCount: this.testCount,
+        assertCount: this.successCount + this.failCount,
+        successCount: this.successCount,
+        failCount: this.failCount,
+        duration: this.getDuration(),
+        coverage: this._getCoverageRate(),
+        methodsTotal: this.methods.length,
+        methodsCalled: this.methodsCalled.length
+    };
+}
+
+/**
+ * Output the summary for a single or multiple test suites to the server log
+ *
+ * The results of multiple tests get cumulated.
+ * There will be no log output if it has been disabled.
+ *
+ * @param {(Object|Object[])} pTestSuiteResults the test suite result(s) to log a summary for
+ * @return {void}
+ */
+Tester.prototype.summary = function(pTestSuiteResults)
+{
+    var testSuiteResults = pTestSuiteResults !== undefined && Array.isArray(pTestSuiteResults) ? pTestSuiteResults : [this.getResults()];
+    var divider = testSuiteResults.length > 1 ? "=" : "-";
+    var title = testSuiteResults.length > 1 ? "All Tests" : this.collectionName;
+
+    var testCount = 0;
+    var assertCount = 0;
+    var successCount = 0;
+    var failCount = 0;
+    var duration = 0;
+
+    testSuiteResults.forEach(function(pTestResult) {
+        testCount += pTestResult.testCount;
+        assertCount += pTestResult.assertCount;
+        successCount += pTestResult.successCount;
+        failCount += pTestResult.failCount;
+        duration += pTestResult.duration;
     });
-    return summary;
+
+    this._log("info", "\n" + title + " Summary:");
+    this._log("info", divider.repeat(32));
+    this._log("", "Total:    " + this.t.important(testCount + " Tests, " + assertCount + " Assertions"));
+    this._log("", "Passed:   " + (successCount === assertCount ? this.t.success(successCount) : this.t.warning(successCount)));
+    this._log("", "Failed:   " + (failCount === 0 ? this.t.success(failCount) : this.t.error(failCount)));
+    this._log("", "Time:     " + this.t.important(duration + "ms"));
+    this._log("", "Coverage: " + this._getCoverageOutput(testSuiteResults));
+    this._log("", "\n\n");
+
+    this._print();
 }
 
 /**
- * With assert you can test if a variable is the same like an expected value.<br/>
- * The test result is added to the Tester<br/>
+ * Write a certain message type to the output
+ *
+ * If the given message type is not valid/allowed, the output will be plain unformatted text.
+ *
+ * @param {String} pType the message type
+ * @param {String} pOutput the actual message
+ * @return {void}
  * 
- * Note: the values are compared by === so also the type is checked.<br/>
- * By using assert you can Test everything you want.<br/>
+ * @private
+ */
+Tester.prototype._log = function(pType, pOutput)
+{
+    var allowedTerminalMethods = ["debug", "success", "info", "error", "warning", "important"];
+
+    if(allowedTerminalMethods.indexOf(pType) !== -1)
+    {
+        this.output += "\n" + this.t[pType](pOutput);
+    }
+    else
+    {
+        this.output += "\n" + pOutput;
+    }
+}
+
+/**
+ * Set the value to test against
+ *
+ * @param {*} pValue
+ * @return {void}
  * 
- * @param {AnyValue} pExpect the expected value
- * @param {AnyValue} pActual the actual value
- * @param {String} [pTestDescription] this is an optional description. You should use it, if you have more than one .assert in your test.
+ * @private
  */
-Tester.prototype.assert = function (pExpect, pActual, pTestDescription)
+Tester.prototype._setExpectValue = function(pValue)
 {
-    this.currentTestHadAlreadyAssert = true;
-    
-    var res = pActual === pExpect;
+    this.expectedValue = pValue;
+    this.expectedDisplayValue = pValue;
+}
+
+/**
+ * Determine, whether an error is expected in the current test run
+ *
+ * @return {Boolean}
+ * 
+ * @private
+ */
+Tester.prototype._testExpectsError = function()
+{
+    return this.expectedValue instanceof Error;
+}
+
+/**
+ * Write the ouput to the log and reset the output to an empty string
+ *
+ * @return {Tester}
+ * 
+ * @private
+ */
+Tester.prototype._print = function()
+{
+    if(this.outputEnabled)
+    {
+        logging.log(this.output);
+    }
     
-    this.testResults.push([
-        this._currentTest,
-        pTestDescription,
-        res,
-        pExpect,
-        pActual
-    ]);
+    this.output = "";
+    return this;
 }
 
 /**
- * Executes all tests in a TestSuite
- * @param {TestSuite} pTestSuite the TestSuite which should be tested
+ * Generates and sets an assert description by given config object or simply set a given custom string
+ *
+ * It also handles using the correct operators when negation via `not()` is used
+ *
+ * @param {Object} pDescriptionConfig a config object
+ * @return {void}
+ * 
+ * @private
  */
-Tester.prototype.test = function (pTestSuite)
+Tester.prototype._generateAssertDescription = function(pDescriptionConfig)
 {
-    pTestSuite.preAll(this);
+    if(Utils.isString(pDescriptionConfig.custom))
+    {
+        this._assertDescription = pDescriptionConfig.custom;
+        return;
+    }
     
-    pTestSuite.tests.forEach(function(pTest) {
-        logging.log("Testing " + pTest[0]);
-        
-        this.currentTestHadAlreadyAssert = false;
-
-        this._currentTest = pTest[0];
-        pTestSuite.preTest(this);
-        
-        if (pTest.length >= 3)
+    Object.assign(pDescriptionConfig, pDescriptionConfig.custom);
+    var valueName = pDescriptionConfig.name || "value";
+    var valueNameSuffix = pDescriptionConfig.nameSuffix || "";
+    var operator = pDescriptionConfig.operator.trim();
+    var expectedValue = pDescriptionConfig.expected || this.expectedDisplayValue;
+    expectedValue = Utils.isString(expectedValue) ? "`" + expectedValue + "`" : expectedValue + "";
+
+    if(this._useNegation)
+    {
+        switch(operator)
         {
-            var errorThrowed = false;
-            
-            try {
-                pTest[1](this);
-            } catch (ex) {
-                errorThrowed = true;
-                
-                if (ex.toSource() == pTest[2].toSource())
-                {
-                    this.testResults.push([
-                        this._currentTest,
-                        "Expected error throwed",
-                        true,
-                        pTest[2].toSource(),
-                        ex.toSource()
-                    ]);
-
-                    // don't throw as it's expected and no detailed stacktrace is needed
-                }
-                else
-                {
-                    this.testResults.push([
-                        this._currentTest,
-                        "Expected error throwed",
-                        false,
-                        pTest[2].toSource(),
-                        ex.toSource()
-                    ]);
-                    
-                    logging.log("Expected error: " + pTest[2].toSource() + ", but wrong error occoured.\nRunning test again without try catch to get detailed error stack trace")
-                    
-                    pTestSuite.preTest(this);
-                    pTest[1](this);
-                    pTestSuite.postTest(this);
-                    return;
-                }
-            }
-            
-            if (!errorThrowed)
-            {
-                // if it didn't fail
-                this.testResults.push([
-                    this._currentTest,
-                    "Expected error throwed",
-                    false,
-                    pTest[2].toSource(),
-                    "no error"
-                ]);
-            }
+            case "===":
+                operator = "!==";
+                break;
+            case ">":
+                operator = "<=";
+                break;
+            case ">=":
+                operator = "<";
+                break;
+            case "<":
+                operator = ">=";
+                break;
+            case "<=":
+                operator = ">";
+                break;
+            case "is":
+            case "type is":
+            case "has":
+                operator += " not";
+                break;
+            case "is instance of":
+                operator += "is not instance of";
+                break;
+            case "starts with":
+            case "ends with":
+            case "throws":
+            default:
+                operator = "not " + operator;
+                break;
         }
-        else
+    }
+
+    this.actualValueElementHierarchy.forEach(function(pElement) {
+        valueName += typeof pElement === "number" ? "[" + pElement + "]" : "." + pElement;
+    }, this);
+    
+    var description = valueName + valueNameSuffix + " " + operator + " " + expectedValue;
+    this._assertDescription = description.trim();
+    this.actualValueElementHierarchy = [];
+}
+
+/**
+ * Reset test-related properties to their initial state
+ *
+ * This is done before every test run to prevent side-effects or expired/invalid data and states
+ *
+ * @return {Tester}
+ * 
+ * @private
+ */
+Tester.prototype._resetTest = function()
+{
+    this.actualValue = undefined;
+    this.actualDisplayValue = undefined;
+    this.actualOriginalValue = undefined;
+    this.actualOriginalDisplayValue = undefined;
+    this.actualValueElementHierarchy = [];
+    this.expectedValue = undefined;
+    this.expectedDisplayValue = undefined;
+    this._assertDescription = "";
+    this._testResult = false;
+    this._useNegation = false;
+
+    return this;
+}
+
+/**
+ * Get the length of a given value or undefined if it is not an array, object or string
+ *
+ * @param {(Array|Object|String)} pActualValue the value to get the length from
+ * @return {Number}
+ * 
+ * @private
+ */
+Tester.prototype._getLength = function(pActualValue)
+{
+    if(Array.isArray(pActualValue) || Utils.isString(pActualValue))
+    {
+        return pActualValue.length;
+    }
+    else if(Utils.isObject(pActualValue))
+    {
+        return Object.keys(pActualValue).length;
+    }
+
+    return undefined;
+}
+
+/**
+ * Get the percentage of test coverage
+ *
+ * Will we used in the results and summary output.
+ *
+ * @return {?Number} the duration in milliseconds
+ */
+Tester.prototype._getCoverageRate = function()
+{
+    if(this.methods.length === 0 && this.methodsCalled.length === 0)
+    {
+        return null;
+    }
+
+    if(this.methods.length === 0 || this.methodsCalled.length === 0)
+    {
+        return 0.00;
+    }
+
+    var coverage = (this.methodsCalled.length / this.methods.length) * 100;
+    coverage = Number.parseFloat(Number.parseFloat(coverage).toFixed(2));
+
+    return coverage > 100 ? 100.00 : coverage;
+}
+
+/**
+ * Register, which method of the given class has been called
+ *
+ * It takes the name of the TestSuite and splits it to get the class name and the method.
+ * Then, it checks if the class has such a method. It gets added to the call-list, if it has not been added yet.
+ * This is necessary to calculate the test coverage.
+ * All available class methods get registered beforehand and will be compared to this list later in `_getCoverageRate()`.
+ *
+ * @return {void}
+ * 
+ * @private
+ */
+Tester.prototype._registerMethodTestCall = function()
+{
+    if(this.instanceName !== undefined)
+    {
+        var callParts = this.currentTestSuite.name.split(".");
+
+        if(callParts[0] === this.instanceName.prototype.constructor.name && this.methods.indexOf(callParts[1]) !== -1)
         {
-            // run without try catch as no error expected
-            pTest[1](this);
+            if(this.methodsCalled.indexOf(callParts[1]) === -1)
+            {
+                this.methodsCalled.push(callParts[1]);
+            }
         }
-        
-        if (!this.currentTestHadAlreadyAssert && pTest.length < 3) // only add message if no error expected
-        {
-            this.testResults.push([
-                    this._currentTest,
-                    "Expected no error",
-                    true,
-                    "no error",
-                    "no error"
-                ]);
+    }
+}
+
+/**
+ * Renders the output for the test coverage
+ *
+ * The results of multiple tests get cumulated.
+ *
+ * @param {Object[]} pTestSuiteResults the test suite(s) to log a summary for
+ * @return {String} the test coverage output
+ */
+Tester.prototype._getCoverageOutput = function(pTestSuiteResults)
+{
+    var coverageOutput = this.t.debug("unknown");
+    var methodsTotal = 0;
+    var methodsCalled = 0;
+    var coverage = null;
+    var avgCoverage = null;
+    var coverageMethodCount = null;
+
+    pTestSuiteResults.forEach(function(pTestResult) {
+        methodsTotal += pTestResult.methodsTotal;
+        methodsCalled += pTestResult.methodsCalled;
+
+        if(pTestResult.coverage !== null) {
+            coverage += pTestResult.coverage;
         }
-            
-        pTestSuite.postTest(this);
-    }, this);
-    
-    pTestSuite.postAll(this);
+    });
+
+    if(coverage !== null)
+    {
+        avgCoverage = coverage / pTestSuiteResults.length;
+        coverageMethodCount = "(" + methodsCalled + "/" + methodsTotal + ")";
+    }
+
+    if(avgCoverage >= 80)
+    {
+        coverageOutput = this.t.success(avgCoverage + "% " + coverageMethodCount);
+    }
+    else if(avgCoverage >= 50)
+    {
+        coverageOutput = this.t.warning(avgCoverage + "% " + coverageMethodCount);
+    }
+    else if(avgCoverage > 0)
+    {
+        coverageOutput = this.t.error(avgCoverage + "% " + coverageMethodCount);
+    }
+
+    return coverageOutput;
 }
 
 /**
- * Prints the test results to the log
+ * Generates the title for the test about to run
+ *
+ * @param {Test} pTest the test to run
+ * @param {Number} pDataProviderIndex the current index of the data provider
+ * @return {void}
+ * 
+ * @private
  */
-Tester.prototype.printResults = function ()
+Tester.prototype._generateTestTitle = function(pTest, pDataProviderIndex)
 {
-    var lastTestDescription = "";
-    logging.log("Test results for \"" + this.collectionName + "\"")
-    this.testResults.forEach(function(pResult) {
-        
-        if (lastTestDescription != pResult[0])
+    if(pDataProviderIndex !== undefined)
+    {
+        var titleValues = [];
+
+        this.dataProvider[pDataProviderIndex].forEach(function(pElement) {
+            titleValues.push(pElement === undefined ? "undefined" : JSON.stringify(pElement));
+        });
+        this._log("", this.t.info("\t\u2699 Test: " + pTest.name) + this.t.debug(" (#" + (pDataProviderIndex + 1) + ": " + titleValues.join(" | ") + ")"));
+    }
+    else
+    {
+        this._log("info", "\t\u2699 Test: " + pTest.name);
+    }
+}
+
+/**
+ * Runs a single test iteration and handles errors
+ *
+ * @param {Test} pTest the test to run
+ * @param {Number} pDataProviderIndex the current index of the data provider
+ * @return {void}
+ * 
+ * @private
+ */
+Tester.prototype._runTest = function(pTest, pDataProviderIndex)
+{
+    this._generateTestTitle(pTest, pDataProviderIndex);
+    this.testCount++;
+
+    var dataProvider = pDataProviderIndex !== undefined ? this.dataProvider[pDataProviderIndex] : undefined;
+
+    try
+    {
+        pTest.callback(this, dataProvider);
+    }
+    catch (e)
+    {
+        this.assert();
+
+        // Expected, but wrong error
+        if (this._testExpectsError() && e.toSource() !== this.expectedValue.toSource())
         {
-            logging.log("Test \"" + pResult[0] + "\":");
+            this._log("error", "Wrong error occurred");
+            this._log("warning", "\t\t expected: " + this.expectedValue.toSource());
+            this._log("error", "\t\t actual:   " + e.toSource());
         }
-        
-        var message = (pResult[1] ? " - " + pResult[1] : " - Test result ") + ": " + (pResult[2] ? "success" : "fail\nexpected: " + JSON.stringify(pResult[3], null, "\t") + "\nactual: " + JSON.stringify(pResult[4], null, "\t"));
-        
-        logging.log(message);
-        lastTestDescription = pResult[0];
-    }, this);
-    logging.log(this.getSummary().getMessage());
-}
\ No newline at end of file
+        else
+        { // Unexpected error
+            this._log("error", "Unexpected error occurred");
+        }
+
+        var exception = logging.toLogString(e["rhinoException"] !== undefined ? e["rhinoException"] : e, true);
+        this._log("error", e.name + ":\n" + exception.replace(/\s+(at|\[->\])\s/g, "\n\t$1 "));
+        this._log("error", "jDito callstack:\n" + e.stack);
+
+        if(pTest.rerunOnError)
+        {
+            this._log("debug", "Rerun without try-catch to get detailed error stack trace");
+            this._print();
+
+            this.currentTestSuite.preTest(this);
+            pTest.callback(this, dataProvider);
+            this.currentTestSuite.postTest(this);
+        }
+    }
+}
diff --git a/process/UnitTest_test/UnitTest_test.aod b/process/UnitTest_test/UnitTest_test.aod
new file mode 100644
index 00000000000..095a395529b
--- /dev/null
+++ b/process/UnitTest_test/UnitTest_test.aod
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+  <name>UnitTest_test</name>
+  <title>[TEST] UnitTest_lib</title>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <icon>VAADIN:CHECK_CIRCLE</icon>
+  <process>%aditoprj%/process/UnitTest_test/process.js</process>
+  <alias>Data_alias</alias>
+  <variants>
+    <element>EXECUTABLE</element>
+  </variants>
+</process>
diff --git a/process/UnitTest_test/process.js b/process/UnitTest_test/process.js
new file mode 100644
index 00000000000..7d80b7995e4
--- /dev/null
+++ b/process/UnitTest_test/process.js
@@ -0,0 +1,1141 @@
+import("system.result");
+import("system.vars");
+import("Keyword_lib");
+import("UnitTest_lib");
+
+
+var equals = new TestSuite("Tester.equals", [
+    new Test("should test value equality",
+        function(pTester, pDataProvider) {
+            
+            var dummyTester = (new Tester("Test Dummy")).setOutputEnabled(false);
+            var expectValue = pDataProvider[0];
+            var actualValue = dummyTester.expectThat(pDataProvider[1]).equals(pDataProvider[2]).getTestResult();
+
+            pTester.expectThat(actualValue).equals(expectValue).assert();
+        },
+        function dataProvider() {
+            var num = 0;
+            var str = '0';
+            var objStr = new String('0');
+            var obj_1 = {a: 1, b: 2, c: 3};
+            var obj_2 = {x: null, y: "test", z: true};
+            
+            return [
+                [true,  num,     num],
+                [true,  str,     str],
+                [true,  true,    true],
+                [true,  objStr,  objStr],
+                [true,  obj_1,   obj_1],
+                [true,  obj_2,   obj_2],
+                [false, true,    false],
+                [false, obj_1,   obj_2],
+                [false, num,     objStr],
+                [false, num,     str],
+                [false, objStr,  str],
+                [false, null,    undefined],
+                [false, objStr,  null],
+                [false, objStr,  undefined],
+                [false, null,    "null"],
+            ];
+        }
+    )
+]);
+
+var isGreater = new TestSuite("Tester.isGreater", [
+    new Test("should test if value is greater than another",
+        function(pTester, pDataProvider) {
+            
+            var dummyTester = (new Tester("Test Dummy")).setOutputEnabled(false);
+            var expectValue = pDataProvider[0];
+            var actualValue = dummyTester.expectThat(pDataProvider[1]).isGreater(pDataProvider[2]).getTestResult();
+
+            pTester.expectThat(actualValue).equals(expectValue).assert();
+        },
+        function dataProvider() {
+            return [
+                [true,  1,    0],
+                [true,  100,  10],
+                [false, 3,    3],
+                [false, 0,    5],
+                [false, 1234, 5678],
+            ];
+        }
+    )
+]);
+
+var isGreaterEqual = new TestSuite("Tester.isGreaterEqual", [
+    new Test("should test if value is greater or equal than another",
+        function(pTester, pDataProvider) {
+            
+            var dummyTester = (new Tester("Test Dummy")).setOutputEnabled(false);
+            var expectValue = pDataProvider[0];
+            var actualValue = dummyTester.expectThat(pDataProvider[1]).isGreaterEqual(pDataProvider[2]).getTestResult();
+
+            pTester.expectThat(actualValue).equals(expectValue).assert();
+        },
+        function dataProvider() {
+            return [
+                [true,  1,    0],
+                [true,  101,  100],
+                [true,  3,    3],
+                [false, 0,    5],
+                [false, 1234, 5678],
+            ];
+        }
+    )
+]);
+
+var isLower = new TestSuite("Tester.isLower", [
+    new Test("should test if value is lower than another",
+        function(pTester, pDataProvider) {
+            
+            var dummyTester = (new Tester("Test Dummy")).setOutputEnabled(false);
+            var expectValue = pDataProvider[0];
+            var actualValue = dummyTester.expectThat(pDataProvider[1]).isLower(pDataProvider[2]).getTestResult();
+
+            pTester.expectThat(actualValue).equals(expectValue).assert();
+        },
+        function dataProvider() {
+            return [
+                [true,  0,    1],
+                [true,  10,   100],
+                [false, 3,    3],
+                [false, 5,    0],
+                [false, 5678, 1234],
+            ];
+        }
+    )
+]);
+
+var isLowerEqual = new TestSuite("Tester.isLowerEqual", [
+    new Test("should test if value is greater or equal than another",
+        function(pTester, pDataProvider) {
+            
+            var dummyTester = (new Tester("Test Dummy")).setOutputEnabled(false);
+            var expectValue = pDataProvider[0];
+            var actualValue = dummyTester.expectThat(pDataProvider[1]).isLowerEqual(pDataProvider[2]).getTestResult();
+
+            pTester.expectThat(actualValue).equals(expectValue).assert();
+        },
+        function dataProvider() {
+            return [
+                [true,  0,    1],
+                [true,  100,  101],
+                [true,  3,    3],
+                [false, 5,    0],
+                [false, 5678, 1234],
+            ];
+        }
+    )
+]);
+
+var isBoolean = new TestSuite("Tester.isBoolean", [
+    new Test("should test if value is a boolean",
+        function(pTester, pDataProvider) {
+            
+            var dummyTester = (new Tester("Test Dummy")).setOutputEnabled(false);
+            var expectValue = pDataProvider[0];
+            var actualValue = dummyTester.expectThat(pDataProvider[1]).isBoolean().getTestResult();
+
+            pTester.expectThat(actualValue).equals(expectValue).assert();
+        },
+        function dataProvider() {
+            return [
+                [true,  true],
+                [true,  false],
+                [false, "true"],
+                [false, "false"],
+                [false, ""],
+                [false, "0"],
+                [false, 0],
+                [false, new Object()],
+                [false, []],
+                [false, null],
+                [false, undefined],
+            ];
+        }
+    )
+]);
+
+var isNumber = new TestSuite("Tester.isNumber", [
+    new Test("should test if value is a number",
+        function(pTester, pDataProvider) {
+            
+            var dummyTester = (new Tester("Test Dummy")).setOutputEnabled(false);
+            var expectValue = pDataProvider[0];
+            var actualValue = dummyTester.expectThat(pDataProvider[1]).isNumber().getTestResult();
+
+            pTester.expectThat(actualValue).equals(expectValue).assert();
+        },
+        function dataProvider() {
+            return [
+                [true,  0],
+                [true,  100],
+                [true,  33.33333],
+                [true,  0xFFFFFF],
+                [true,  0777], // Octal
+                //[true,  0o777], // New octal format since ECMAScript 2015
+                //[true,  0b11111111], // Seems like binary numbers are not supported
+                [true,  2e6], // Exponentiation
+                [true,  0.1e2], // Exponentiation
+                [true,  +Infinity],
+                [true,  -Infinity],
+                [true,  NaN], // This should actually fail. Needs fix in Utils
+                [false, ""],
+                [false, "0"],
+                [false, new Object()],
+                [false, []],
+                [false, true],
+                [false, null],
+                [false, undefined],
+            ];
+        }
+    )
+]);
+
+var isNumeric = new TestSuite("Tester.isNumeric", [
+    new Test("should test if value is numeric",
+        function(pTester, pDataProvider) {
+            
+            var dummyTester = (new Tester("Test Dummy")).setOutputEnabled(false);
+            var expectValue = pDataProvider[0];
+            var actualValue = dummyTester.expectThat(pDataProvider[1]).isNumeric().getTestResult();
+
+            pTester.expectThat(actualValue).equals(expectValue).assert();
+        },
+        function dataProvider() {
+            return [
+                [true,  0],
+                [true,  100],
+                [true,  33.33333],
+                [true,  "0777"], // Octal
+                [true,  "2e6"], // Exponentiation
+                [true,  "0.1e2"], // Exponentiation
+                [true,  +Infinity],
+                [true,  -Infinity],
+                [true,  NaN], // This should actually fail. Needs fix in Utils
+                [true,  "50000"],
+                [true,  "0"],
+                [false, ""],
+                [false, new Object()],
+                [false, []],
+                [false, true],
+                [false, null],
+                [false, undefined],
+            ];
+        }
+    )
+]);
+
+var isNotANumber = new TestSuite("Tester.isNaN", [
+    new Test("should test if value is not NaN",
+        function(pTester, pDataProvider) {
+            
+            var dummyTester = (new Tester("Test Dummy")).setOutputEnabled(false);
+            var expectValue = pDataProvider[0];
+            var actualValue = dummyTester.expectThat(pDataProvider[1]).isNaN().getTestResult();
+
+            pTester.expectThat(actualValue).equals(expectValue).assert();
+        },
+        function dataProvider() {
+            return [
+                [true,  NaN],
+                [false, 0],
+                [false, 100],
+                [false, 33.33333],
+                [false, "0777"], // Octal
+                [false, "2e6"], // Exponentiation
+                [false, "0.1e2"], // Exponentiation
+                [false, +Infinity],
+                [false, -Infinity],
+                [false, "50000"],
+                [false, "0"],
+                [false,  ""],
+                [false,  new Object()],
+                [false,  []],
+                [false,  true],
+                [false,  null],
+                [false,  undefined],
+            ];
+        }
+    )
+]);
+
+var isInteger = new TestSuite("Tester.isInteger", [
+    new Test("should test if value is an integer",
+        function(pTester, pDataProvider) {
+            
+            var dummyTester = (new Tester("Test Dummy")).setOutputEnabled(false);
+            var expectValue = pDataProvider[0];
+            var actualValue = dummyTester.expectThat(pDataProvider[1]).isInteger().getTestResult();
+
+            pTester.expectThat(actualValue).equals(expectValue).assert();
+        },
+        function dataProvider() {
+            return [
+                [true,  0],
+                [true,  100],
+                [true,  0xFFFFFF],
+                [true,  0777], // Octal
+                [true,  2e6], // Exponentiation
+                [true,  0.1e2], // Exponentiation
+                [true,  "0"],
+                [false, 33.33333],
+                [false, +Infinity],
+                [false, -Infinity],
+                [false, NaN],
+                [false, ""],
+                [false, new Object()],
+                [false, []],
+                [false, true],
+                [false, null],
+                [false, undefined],
+            ];
+        }
+    )
+]);
+
+var isFloat = new TestSuite("Tester.isFloat", [
+    new Test("should test if value is a float",
+        function(pTester, pDataProvider) {
+            
+            var dummyTester = (new Tester("Test Dummy")).setOutputEnabled(false);
+            var expectValue = pDataProvider[0];
+            var actualValue = dummyTester.expectThat(pDataProvider[1]).isFloat().getTestResult();
+
+            pTester.expectThat(actualValue).equals(expectValue).assert();
+        },
+        function dataProvider() {
+            return [
+                [true,  33.33333],
+                [false, 0],
+                [false, 100],
+                [false, 0xFFFFFF],
+                [false, 0777], // Octal
+                [false, 2e6], // Exponentiation
+                [false, 0.1e2], // Exponentiation
+                [false, +Infinity],
+                [false, -Infinity],
+                [false, NaN],
+                [false, ""],
+                [false, "0"],
+                [false, new Object()],
+                [false, []],
+                [false, true],
+                [false, null],
+                [false, undefined],
+            ];
+        }
+    )
+]);
+
+var isString = new TestSuite("Tester.isString", [
+    new Test("should test if value is a string",
+        function(pTester, pDataProvider) {
+            
+            var dummyTester = (new Tester("Test Dummy")).setOutputEnabled(false);
+            var expectValue = pDataProvider[0];
+            var actualValue = dummyTester.expectThat(pDataProvider[1]).isString().getTestResult();
+
+            pTester.expectThat(actualValue).equals(expectValue).assert();
+        },
+        function dataProvider() {
+            return [
+                [true,  ""],
+                [true,  "Hello"],
+                [true,  "0"],
+                [false, new String('Hello')],
+                [false, []],
+                [false, 0],
+                [false, true],
+                [false, null],
+                [false, undefined],
+            ];
+        }
+    )
+]);
+
+var isArray = new TestSuite("Tester.isArray", [
+    new Test("should test if value is an array",
+        function(pTester, pDataProvider) {
+            
+            var dummyTester = (new Tester("Test Dummy")).setOutputEnabled(false);
+            var expectValue = pDataProvider[0];
+            var actualValue = dummyTester.expectThat(pDataProvider[1]).isArray().getTestResult();
+
+            pTester.expectThat(actualValue).equals(expectValue).assert();
+        },
+        function dataProvider() {
+            return [
+                [true,  []],
+                [true,  ["a", 2, null]],
+                [true,  new Array()],
+                [false, ""],
+                [false, "0"],
+                [false, new Object()],
+                [false, new Function()],
+                [false, 0],
+                [false, true],
+                [false, null],
+                [false, undefined],
+            ];
+        }
+    )
+]);
+
+var isObject = new TestSuite("Tester.isObject", [
+    new Test("should test if value is an object",
+        function(pTester, pDataProvider) {
+            
+            var dummyTester = (new Tester("Test Dummy")).setOutputEnabled(false);
+            var expectValue = pDataProvider[0];
+            var actualValue = dummyTester.expectThat(pDataProvider[1]).isObject().getTestResult();
+
+            pTester.expectThat(actualValue).equals(expectValue).assert();
+        },
+        function dataProvider() {
+            return [
+                [true,  {}],
+                [true,  []],
+                [true,  ["a", 2, null]],
+                [true,  new Array()],
+                [true,  new Object()],
+                [true,  new String("hello")],
+                [false, new Function()],
+                [false, ""],
+                [false, "0"],
+                [false, 0],
+                [false, true],
+                [false, null],
+                [false, undefined],
+            ];
+        }
+    )
+]);
+
+var isFunction = new TestSuite("Tester.isFunction", [
+    new Test("should test if value is a function",
+        function(pTester, pDataProvider) {
+            
+            var dummyTester = (new Tester("Test Dummy")).setOutputEnabled(false);
+            var expectValue = pDataProvider[0];
+            var actualValue = dummyTester.expectThat(pDataProvider[1]).isFunction().getTestResult();
+
+            pTester.expectThat(actualValue).equals(expectValue).assert();
+        },
+        function dataProvider() {
+            return [
+                [true,  new Function()],
+                [true,  function(){}],
+                [true,  Math.sin],
+                [true,  Array.isArray],
+                [false, new Array()],
+                [false, new Object()],
+                [false, ""],
+                [false, "0"],
+                [false, 0],
+                [false, true],
+                [false, null],
+                [false, undefined],
+            ];
+        }
+    )
+]);
+
+var isNull = new TestSuite("Tester.isNull", [
+    new Test("should test if value is null",
+        function(pTester, pDataProvider) {
+            
+            var dummyTester = (new Tester("Test Dummy")).setOutputEnabled(false);
+            var expectValue = pDataProvider[0];
+            var actualValue = dummyTester.expectThat(pDataProvider[1]).isNull().getTestResult();
+
+            pTester.expectThat(actualValue).equals(expectValue).assert();
+        },
+        function dataProvider() {
+            return [
+                [true,  null],
+                [false, ""],
+                [false, "Hello"],
+                [false, "0"],
+                [false, new String('Hello')],
+                [false, []],
+                [false, 0],
+                [false, true],
+                [false, undefined],
+            ];
+        }
+    )
+]);
+
+var isUndefined = new TestSuite("Tester.isUndefined", [
+    new Test("should test if value is undefined",
+        function(pTester, pDataProvider) {
+            
+            var dummyTester = (new Tester("Test Dummy")).setOutputEnabled(false);
+            var expectValue = pDataProvider[0];
+            var actualValue = dummyTester.expectThat(pDataProvider[1]).isUndefined().getTestResult();
+
+            pTester.expectThat(actualValue).equals(expectValue).assert();
+        },
+        function dataProvider() {
+            return [
+                [true,  undefined],
+                [false, ""],
+                [false, "Hello"],
+                [false, "0"],
+                [false, new String('Hello')],
+                [false, []],
+                [false, 0],
+                [false, true],
+                [false, null],
+            ];
+        }
+    )
+]);
+
+var isUpperCase = new TestSuite("Tester.isUpperCase", [
+    new Test("should test if value is an uppercase string",
+        function(pTester, pDataProvider) {
+            
+            var dummyTester = (new Tester("Test Dummy")).setOutputEnabled(false);
+            var expectValue = pDataProvider[0];
+            var actualValue = dummyTester.expectThat(pDataProvider[1]).isUpperCase().getTestResult();
+
+            pTester.expectThat(actualValue).equals(expectValue).assert();
+        },
+        function dataProvider() {
+            return [
+                [true,  "HELLO"],
+                [false, "HeLlo"],
+                [false, "hello"],
+                [false, "0"],
+                [false, new String('Hello')],
+                [false, []],
+                [false, 0],
+                [false, true],
+                [false, null],
+                [false, undefined],
+            ];
+        }
+    )
+]);
+
+var isLowerCase = new TestSuite("Tester.isLowerCase", [
+    new Test("should test if value is a lowercase string",
+        function(pTester, pDataProvider) {
+            
+            var dummyTester = (new Tester("Test Dummy")).setOutputEnabled(false);
+            var expectValue = pDataProvider[0];
+            var actualValue = dummyTester.expectThat(pDataProvider[1]).isLowerCase().getTestResult();
+
+            pTester.expectThat(actualValue).equals(expectValue).assert();
+        },
+        function dataProvider() {
+            return [
+                [true,  "hello"],
+                [false, "HELLO"],
+                [false, "HeLlo"],
+                [false, "0"],
+                [false, new String('Hello')],
+                [false, []],
+                [false, 0],
+                [false, true],
+                [false, null],
+                [false, undefined],
+            ];
+        }
+    )
+]);
+
+var startsWith = new TestSuite("Tester.startsWith", [
+    new Test("should test if value starts with a given string",
+        function(pTester, pDataProvider) {
+            
+            var dummyTester = (new Tester("Test Dummy")).setOutputEnabled(false);
+            var expectValue = pDataProvider[0];
+            var actualValue = dummyTester.expectThat(pDataProvider[1]).startsWith(pDataProvider[2]).getTestResult();
+
+            pTester.expectThat(actualValue).equals(expectValue).assert();
+        },
+        function dataProvider() {
+            return [
+                [true,  "Millenium Falcon", "Mill"],
+                [false, "Millenium Falcon", "MILL"],
+                [false, "Millenium Falcon", "Abc"],
+                [false, "Millenium Falcon", "0"],
+            ];
+        }
+    )
+]);
+
+var endsWith = new TestSuite("Tester.endsWith", [
+    new Test("should test if value ends with a given string",
+        function(pTester, pDataProvider) {
+            
+            var dummyTester = (new Tester("Test Dummy")).setOutputEnabled(false);
+            var expectValue = pDataProvider[0];
+            var actualValue = dummyTester.expectThat(pDataProvider[1]).endsWith(pDataProvider[2]).getTestResult();
+
+            pTester.expectThat(actualValue).equals(expectValue).assert();
+        },
+        function dataProvider() {
+            return [
+                [true,  "Millenium Falcon", "con"],
+                [false, "Millenium Falcon", "CON"],
+                [false, "Millenium Falcon", "Abc"],
+                [false, "Millenium Falcon", "0"],
+            ];
+        }
+    )
+]);
+
+var isInstanceOf = new TestSuite("Tester.isInstanceOf", [
+    new Test("should test if value is an instance of given class",
+        function(pTester, pDataProvider) {
+            
+            var dummyTester = (new Tester("Test Dummy")).setOutputEnabled(false);
+            var expectValue = pDataProvider[0];
+            var actualValue = dummyTester.expectThat(pDataProvider[1]).isInstanceOf(pDataProvider[2]).getTestResult();
+
+            pTester.expectThat(actualValue).equals(expectValue).assert();
+        },
+        function dataProvider() {
+            return [
+                [true,  new Tester(), "Tester"],
+                [true,  [],           "Array"],
+                [true,  {},           "Object"],
+                [false, "abc",        "String"],
+                [false, true,         "Boolean"],
+                [false, 0,            "Number"],
+            ];
+        }
+    )
+]);
+
+var hasLength = new TestSuite("Tester.hasLength", [
+    new Test("should test if value has the expected length",
+        function(pTester, pDataProvider) {
+            
+            var dummyTester = (new Tester("Test Dummy")).setOutputEnabled(false);
+            var expectValue = pDataProvider[0];
+            var actualValue = dummyTester.expectThat(pDataProvider[1]).hasLength(pDataProvider[2]).getTestResult();
+
+            pTester.expectThat(actualValue).equals(expectValue).assert();
+        },
+        function dataProvider() {
+            return [
+                [true,  "",               0],
+                [true,  [],               0],
+                [true,  {},               0],
+                [true,  "abc",            3],
+                [true,  ["a", "z"],       2],
+                [true,  new String("?!"), 2],
+                [false, 0,                1],
+                [false, true,             1],
+                [false, null,             1],
+                [false, undefined,        1],
+            ];
+        }
+    )
+]);
+
+
+var hasMinLength = new TestSuite("Tester.hasMinLength", [
+    new Test("should test if value has the expected minimum length",
+        function(pTester, pDataProvider) {
+            
+            var dummyTester = (new Tester("Test Dummy")).setOutputEnabled(false);
+            var expectValue = pDataProvider[0];
+            var actualValue = dummyTester.expectThat(pDataProvider[1]).hasMinLength(pDataProvider[2]).getTestResult();
+
+            pTester.expectThat(actualValue).equals(expectValue).assert();
+        },
+        function dataProvider() {
+            return [
+                [true,  "",               0],
+                [true,  [],               0],
+                [true,  {},               0],
+                [true,  "abc",            3],
+                [true,  "abc",            2],
+                [true,  ["a", "z"],       2],
+                [true,  ["a", "z"],       1],
+                [true,  new String("?!"), 2],
+                [false, "abc",            4],
+                [false, ["a", "z"],       5],
+                [false, 0,                1],
+                [false, true,             1],
+                [false, null,             1],
+                [false, undefined,        1],
+            ];
+        }
+    )
+]);
+
+
+var hasMaxLength = new TestSuite("Tester.hasMaxLength", [
+    new Test("should test if value has the expected maximum length",
+        function(pTester, pDataProvider) {
+            
+            var dummyTester = (new Tester("Test Dummy")).setOutputEnabled(false);
+            var expectValue = pDataProvider[0];
+            var actualValue = dummyTester.expectThat(pDataProvider[1]).hasMaxLength(pDataProvider[2]).getTestResult();
+
+            pTester.expectThat(actualValue).equals(expectValue).assert();
+        },
+        function dataProvider() {
+            return [
+                [true,  "",               0],
+                [true,  [],               0],
+                [true,  {},               0],
+                [true,  "abc",            3],
+                [true,  "abc",            4],
+                [true,  ["a", "z"],       2],
+                [true,  ["a", "z"],       3],
+                [true,  new String("?!"), 2],
+                [false, "abc",            2],
+                [false, ["a", "z"],       1],
+                [false, 0,                1],
+                [false, true,             1],
+                [false, null,             1],
+                [false, undefined,        1],
+            ];
+        }
+    )
+]);
+
+var not = new TestSuite("Tester.not", [
+    new Test("should test negation of compare tests",
+        function(pTester, pDataProvider) {
+            
+            var dummyTester = (new Tester("Test Dummy")).setOutputEnabled(false);
+            var expectValue = pDataProvider[0];
+            var method = pDataProvider[1];
+            var actualValue = dummyTester.expectThat(pDataProvider[2]).not()[method](pDataProvider[3]).getTestResult();
+
+            pTester.expectThat(actualValue).equals(expectValue).assert();
+        },
+        function dataProvider() {
+            var num = 0;
+            var str = '0';
+            var objStr = new String('0');
+            var obj_1 = {a: 1, b: 2, c: 3};
+            var obj_2 = {x: null, y: "test", z: true};
+            
+            return [
+                [true,  "equals",         true,               false],
+                [true,  "equals",         obj_1,              obj_2],
+                [true,  "equals",         num,                objStr],
+                [false, "equals",         num,                num],
+                [false, "equals",         str,                str],
+                [false, "equals",         true,               true],
+                [true,  "isGreater",      3,                  3],
+                [true,  "isGreater",      0,                  5],
+                [true,  "isGreater",      1234,               5678],
+                [false, "isGreater",      1,                  0],
+                [false, "isGreater",      100,                10],
+                [true,  "isGreaterEqual", 0,                  5],
+                [true,  "isGreaterEqual", 1234,               5678],
+                [false, "isGreaterEqual", 1,                  0],
+                [false, "isGreaterEqual", 101,                100],
+                [false, "isGreaterEqual", 3,                  3],
+                [true,  "isLower",        3,                  3],
+                [true,  "isLower",        5,                  0],
+                [true,  "isLower",        5678,               1234],
+                [false, "isLower",        0,                  1],
+                [false, "isLower",        10,                 100],
+                [true,  "isLowerEqual",   5,                  0],
+                [true,  "isLowerEqual",   5678,               1234],
+                [false, "isLowerEqual",   0,                  1],
+                [false, "isLowerEqual",   100,                101],
+                [false, "isLowerEqual",   3,                  3],
+                [true,  "startsWith",     "Millenium Falcon", "MILL"],
+                [true,  "startsWith",     "Millenium Falcon", "Abc"],
+                [true,  "startsWith",     "Millenium Falcon", "0"],
+                [false, "startsWith",     "Millenium Falcon", "Mill"],
+                [true,  "endsWith",       "Millenium Falcon", "CON"],
+                [true,  "endsWith",       "Millenium Falcon", "Abc"],
+                [true,  "endsWith",       "Millenium Falcon", "0"],
+                [false, "endsWith",       "Millenium Falcon", "con"],
+                [true,  "isInstanceOf",   "abc",              "String"],
+                [true,  "isInstanceOf",   true,               "Boolean"],
+                [true,  "isInstanceOf",   0,                  "Number"],
+                [false, "isInstanceOf",   new Tester(),       "Tester"],
+                [false, "isInstanceOf",   [],                 "Array"],
+                [false, "isInstanceOf",   {},                 "Object"],
+                [true,  "hasLength",      0,                  1],
+                [true,  "hasLength",      true,               1],
+                [true,  "hasLength",      null,               1],
+                [true,  "hasLength",      undefined,          1],
+                [false, "hasLength",      "",                 0],
+                [false, "hasLength",      [],                 0],
+                [false, "hasLength",      {},                 0],
+                [false, "hasLength",      "abc",              3],
+                [false, "hasLength",      ["a", "z"],         2],
+                [false, "hasLength",      new String("?!"),   2],
+            ];
+        }
+    ),
+    new Test("should test negation of type tests",
+        function(pTester, pDataProvider) {
+            
+            var dummyTester = (new Tester("Test Dummy")).setOutputEnabled(false);
+            var expectValue = pDataProvider[0];
+            var method = pDataProvider[1];
+            var actualValue = dummyTester.expectThat(pDataProvider[2]).not()[method]().getTestResult();
+
+            pTester.expectThat(actualValue).equals(expectValue).assert();
+        },
+        function dataProvider() {
+            return [
+                [true,  "isBoolean",   "true"],
+                [true,  "isBoolean",   "false"],
+                [true,  "isBoolean",   ""],
+                [true,  "isBoolean",   "0"],
+                [true,  "isBoolean",   0],
+                [true,  "isBoolean",   new Object()],
+                [true,  "isBoolean",   []],
+                [true,  "isBoolean",   null],
+                [true,  "isBoolean",   undefined],
+                [false, "isBoolean",   true],
+                [false, "isBoolean",   false],
+                [true,  "isNumber",    ""],
+                [true,  "isNumber",    "0"],
+                [true,  "isNumber",    new Object()],
+                [true,  "isNumber",    []],
+                [true,  "isNumber",    true],
+                [true,  "isNumber",    null],
+                [true,  "isNumber",    undefined],
+                [false, "isNumber",    0],
+                [false, "isNumber",    100],
+                [false, "isNumber",    33.33333],
+                [false, "isNumber",    0xFFFFFF],
+                [false, "isNumber",    0777], // Octal
+                [false, "isNumber",    2e6], // Exponentiation
+                [false, "isNumber",    0.1e2], // Exponentiation
+                [false, "isNumber",    +Infinity],
+                [false, "isNumber",    -Infinity],
+                [false, "isNumber",    NaN],
+                [true,  "isNumeric",   ""],
+                [true,  "isNumeric",   new Object()],
+                [true,  "isNumeric",   []],
+                [true,  "isNumeric",   true],
+                [true,  "isNumeric",   null],
+                [true,  "isNumeric",   undefined],
+                [false, "isNumeric",   0],
+                [false, "isNumeric",   100],
+                [false, "isNumeric",   33.33333],
+                [false, "isNumeric",   "0777"], // Octal
+                [false, "isNumeric",   "2e6"], // Exponentiation
+                [false, "isNumeric",   "0.1e2"], // Exponentiation
+                [false, "isNumeric",   +Infinity],
+                [false, "isNumeric",   -Infinity],
+                [false, "isNumeric",   NaN],
+                [false, "isNumeric",   "50000"],
+                [false, "isNumeric",   "0"],
+                [true,  "isNaN",       0],
+                [true,  "isNaN",       100],
+                [true,  "isNaN",       33.33333],
+                [true,  "isNaN",       "0777"], // Octal
+                [true,  "isNaN",       "2e6"], // Exponentiation
+                [true,  "isNaN",       "0.1e2"], // Exponentiation
+                [true,  "isNaN",       +Infinity],
+                [true,  "isNaN",       -Infinity],
+                [true,  "isNaN",       "50000"],
+                [true,  "isNaN",       "0"],
+                [true,  "isNaN",       ""],
+                [true,  "isNaN",       new Object()],
+                [true,  "isNaN",       []],
+                [true,  "isNaN",       true],
+                [true,  "isNaN",       null],
+                [true,  "isNaN",       undefined],
+                [false, "isNaN",       NaN],
+                [true,  "isInteger",   33.33333],
+                [true,  "isInteger",   +Infinity],
+                [true,  "isInteger",   -Infinity],
+                [true,  "isInteger",   NaN],
+                [true,  "isInteger",   ""],
+                [true,  "isInteger",   new Object()],
+                [true,  "isInteger",   []],
+                [true,  "isInteger",   true],
+                [true,  "isInteger",   null],
+                [true,  "isInteger",   undefined],
+                [false, "isInteger",   0],
+                [false, "isInteger",   100],
+                [false, "isInteger",   0xFFFFFF],
+                [false, "isInteger",   0777], // Octal
+                [false, "isInteger",   2e6], // Exponentiation
+                [false, "isInteger",   0.1e2], // Exponentiation
+                [false, "isInteger",   "0"],
+                [true,  "isFloat",     0],
+                [true,  "isFloat",     100],
+                [true,  "isFloat",     0xFFFFFF],
+                [true,  "isFloat",     0777], // Octal
+                [true,  "isFloat",     2e6], // Exponentiation
+                [true,  "isFloat",     0.1e2], // Exponentiation
+                [true,  "isFloat",     +Infinity],
+                [true,  "isFloat",     -Infinity],
+                [true,  "isFloat",     NaN],
+                [true,  "isFloat",     ""],
+                [true,  "isFloat",     "0"],
+                [true,  "isFloat",     new Object()],
+                [true,  "isFloat",     []],
+                [true,  "isFloat",     true],
+                [true,  "isFloat",     null],
+                [true,  "isFloat",     undefined],
+                [false, "isFloat",     33.33333],
+                [true,  "isString",    new String('Hello')],
+                [true,  "isString",    []],
+                [true,  "isString",    0],
+                [true,  "isString",    true],
+                [true,  "isString",    null],
+                [true,  "isString",    undefined],
+                [false, "isString",    ""],
+                [false, "isString",    "Hello"],
+                [false, "isString",    "0"],
+                [true,  "isArray",     ""],
+                [true,  "isArray",     "0"],
+                [true,  "isArray",     new Object()],
+                [true,  "isArray",     new Function()],
+                [true,  "isArray",     0],
+                [true,  "isArray",     true],
+                [true,  "isArray",     null],
+                [true,  "isArray",     undefined],
+                [false, "isArray",     []],
+                [false, "isArray",     ["a", 2, null]],
+                [false, "isArray",     new Array()],
+                [true,  "isObject",    new Function()],
+                [true,  "isObject",    ""],
+                [true,  "isObject",    "0"],
+                [true,  "isObject",    0],
+                [true,  "isObject",    true],
+                [true,  "isObject",    null],
+                [true,  "isObject",    undefined],
+                [false, "isObject",    {}],
+                [false, "isObject",    []],
+                [false, "isObject",    ["a", 2, null]],
+                [false, "isObject",    new Array()],
+                [false, "isObject",    new Object()],
+                [false, "isObject",    new String("hello")],
+                [true,  "isFunction",  new Array()],
+                [true,  "isFunction",  new Object()],
+                [true,  "isFunction",  ""],
+                [true,  "isFunction",  "0"],
+                [true,  "isFunction",  0],
+                [true,  "isFunction",  true],
+                [true,  "isFunction",  null],
+                [true,  "isFunction",  undefined],
+                [false, "isFunction",  new Function()],
+                [false, "isFunction",  function(){}],
+                [false, "isFunction",  Math.sin],
+                [false, "isFunction",  Array.isArray],
+                [true,  "isNull",      ""],
+                [true,  "isNull",      "Hello"],
+                [true,  "isNull",      "0"],
+                [true,  "isNull",      new String('Hello')],
+                [true,  "isNull",      []],
+                [true,  "isNull",      0],
+                [true,  "isNull",      true],
+                [true,  "isNull",      undefined],
+                [false, "isNull",      null],
+                [true,  "isUndefined", ""],
+                [true,  "isUndefined", "Hello"],
+                [true,  "isUndefined", "0"],
+                [true,  "isUndefined", new String('Hello')],
+                [true,  "isUndefined", []],
+                [true,  "isUndefined", 0],
+                [true,  "isUndefined", true],
+                [true,  "isUndefined", null],
+                [false, "isUndefined", undefined],
+                [true,  "isUpperCase", "HeLlo"],
+                [true,  "isUpperCase", "hello"],
+                [true,  "isUpperCase", "0"],
+                [true,  "isUpperCase", new String('Hello')],
+                [true,  "isUpperCase", []],
+                [true,  "isUpperCase", 0],
+                [true,  "isUpperCase", true],
+                [true,  "isUpperCase", null],
+                [true,  "isUpperCase", undefined],
+                [false, "isUpperCase", "HELLO"],
+                [true,  "isLowerCase", "HELLO"],
+                [true,  "isLowerCase", "HeLlo"],
+                [true,  "isLowerCase", "0"],
+                [true,  "isLowerCase", new String('Hello')],
+                [true,  "isLowerCase", []],
+                [true,  "isLowerCase", 0],
+                [true,  "isLowerCase", true],
+                [true,  "isLowerCase", null],
+                [true,  "isLowerCase", undefined],
+                [false, "isLowerCase", "hello"],
+            ];
+        }
+    ),
+    new Test("should not affect other assertions",
+    function(pTester) {
+
+        var dummyTester = (new Tester("Test Dummy")).setOutputEnabled(false);
+        //first assertion with not()-call
+        var expectValue = true;
+        var actualValue = dummyTester.expectThat("this value").not().equals("that other value").getTestResult();
+        pTester.expectThat(actualValue).equals(expectValue).assert();
+
+        //second test without not()-call => the first not()-call should not affect the second assertion
+        expectValue = false;
+        actualValue = dummyTester.expectThat("this value").equals("that other value").getTestResult();
+        pTester.expectThat(actualValue).equals(expectValue).assert();
+    }
+    )
+]);
+
+var elementAt = new TestSuite("Tester.elementAt", [
+    new Test("should test if value element at key position passes test",
+        function(pTester, pDataProvider) {
+            
+            var dummyTester = (new Tester("Test Dummy")).setOutputEnabled(false);
+            var expectValue = pDataProvider[0];
+            var key = pDataProvider[2];
+            var method = pDataProvider[3];
+            var actualValue = dummyTester.expectThat(pDataProvider[1]).elementAt(key)[method](pDataProvider[4]).getTestResult();
+
+            pTester.expectThat(actualValue).equals(expectValue).assert();
+        },
+        function dataProvider() {
+            return [
+                [true,  ["a", "z", ["x", true, 42]],                0, "isString",  undefined],
+                [true,  ["a", "z", ["x", true, 42]],                1, "equals",    "z"],
+                [true,  ["a", "z", ["x", true, 42]],                2, "isArray",   undefined],
+                [true,  ["a", "z", ["x", true, 42]],                2, "hasLength", 3],
+                [true,  ["a", "z", {"first": "x", "second": true}], 2, "isObject",  undefined],
+                [true,  ["a", "z", {"first": "x", "second": true}], 2, "hasLength", 2],
+                [false, ["a", "z", ["x", true, 42]],                0, "isNumeric", undefined],
+                [false, ["a", "z", ["x", true, 42]],                1, "equals",    "a"],
+                [false, ["a", "z", ["x", true, 42]],                2, "isString",  undefined],
+                [false, ["a", "z", ["x", true, 42]],                2, "hasLength", 1],
+                [false, ["a", "z", {"first": "x", "second": true}], 2, "isArray",   undefined],
+                [false, ["a", "z", {"first": "x", "second": true}], 2, "hasLength", 1],
+            ];
+        }
+    ),
+    new Test("should test if nested value element at key position passes test",
+        function(pTester, pDataProvider) {
+            
+            var dummyTester = (new Tester("Test Dummy")).setOutputEnabled(false);
+            var expectValue = pDataProvider[0];
+            var key1 = pDataProvider[2];
+            var key2 = pDataProvider[3];
+            var method = pDataProvider[4];
+            var actualValue = dummyTester.expectThat(pDataProvider[1]).elementAt(key1).elementAt(key2)[method](pDataProvider[5]).getTestResult();
+
+            pTester.expectThat(actualValue).equals(expectValue).assert();
+        },
+        function dataProvider() {
+            return [
+                [true,  [["x", true, [42]]],            0,       0,        "isString",  undefined],
+                [true,  [["x", true, [42]]],            0,       0,        "equals",    "x"],
+                [true,  [["x", true, [42]]],            0,       1,        "isBoolean", undefined],
+                [true,  [["x", true, [42]]],            0,       1,        "equals",    true],
+                [true,  [["x", true, [42]]],            0,       2,        "isArray",   undefined],
+                [true,  [{"first": "a", "second": 42}], 0,       "first",  "equals",    "a"],
+                [true,  [{"first": "a", "second": 42}], 0,       "second", "equals",    42],
+                [true,  {"outer": {"inner": "a"}},      "outer", "inner",  "isString",  undefined],
+                [true,  {"outer": {"inner": "a"}},      "outer", "inner",  "equals",    "a"],
+                [false, [["x", true, [42]]],            0,       1,        "equals",    "a"],
+                [false, [["x", true, [42]]],            0,       2,        "isNumber",  undefined],
+                [false, {"outer": {"inner": "a"}},      "outer", "inner",  "isNumber",  undefined],
+            ];
+        }
+    )
+]);
+
+var getCoverageRate = new TestSuite("Tester._getCoverageRate", [
+    new Test("should test if coverage is correctly calculated",
+        function(pTester, pDataProvider) {
+            
+            var dummyTester = (new Tester("Test Dummy")).setOutputEnabled(false);
+            var expectValue = pDataProvider[0];
+            dummyTester.methods = pDataProvider[1];
+            dummyTester.methodsCalled = pDataProvider[2];
+            var actualValue = dummyTester._getCoverageRate();
+
+            pTester.expectThat(actualValue).equals(expectValue).assert();
+        },
+        function dataProvider() {
+            return [
+                [100,   ["method1", "method2", "method3"], ["method1", "method2", "method3"]],
+                [33.33, ["method1", "method2", "method3"], ["method1"]],
+                [66.67, ["method1", "method2", "method3"], ["method1", "method2"]],
+                [100,   ["method1"],                       ["method1", "method2", "method3"]],
+                [0,     ["method1"],                       []],
+                [0,     [],                                ["method1"]],
+                [null,  [],                                []],
+            ];
+        }
+    )
+]);
+
+var getLength = new TestSuite("Tester._getLength", [
+    new Test("should test if value has the expected length",
+        function(pTester, pDataProvider) {
+            
+            var dummyTester = (new Tester("Test Dummy")).setOutputEnabled(false);
+            var expectValue = pDataProvider[1];
+            var actualValue = dummyTester._getLength(pDataProvider[0]);
+
+            pTester.expectThat(actualValue).equals(expectValue).assert();
+        },
+        function dataProvider() {
+            return [
+                ["",               0],
+                [[],               0],
+                [{},               0],
+                ["abc",            3],
+                [["a", "z"],       2],
+                [new String("?!"), 2],
+                [{first: "xyz"},   1],
+                [0,                undefined],
+                [true,             undefined],
+                [null,             undefined],
+                [undefined,        undefined],
+            ];
+        }
+    )
+]);
+
+
+
+var tester = new Tester("Test UnitTest_lib");
+tester.initCoverage(Tester);
+tester.test(equals);
+tester.test(isGreater);
+tester.test(isGreaterEqual);
+tester.test(isLower);
+tester.test(isLowerEqual);
+tester.test(isBoolean);
+tester.test(isNumber);
+tester.test(isNumeric);
+tester.test(isNotANumber);
+tester.test(isInteger);
+tester.test(isFloat);
+tester.test(isString);
+tester.test(isArray);
+tester.test(isObject);
+tester.test(isFunction);
+tester.test(isNull);
+tester.test(isUndefined);
+tester.test(isUpperCase);
+tester.test(isLowerCase);
+tester.test(startsWith);
+tester.test(endsWith);
+tester.test(isInstanceOf);
+tester.test(hasLength);
+tester.test(hasMinLength);
+tester.test(hasMaxLength);
+tester.test(not);
+tester.test(elementAt);
+tester.test(getCoverageRate);
+tester.test(getLength);
+
+tester.summary();
+    
+result.object(tester.getResults());
diff --git a/process/Util_lib/process.js b/process/Util_lib/process.js
index 9dc7208091d..97545be1730 100644
--- a/process/Util_lib/process.js
+++ b/process/Util_lib/process.js
@@ -183,6 +183,39 @@ Utils.isNumber = function (pValue)
     return typeof pValue === "number";
 }
 
+/**
+ * Checks if the given value is numeric.
+ * 
+ * @param {Object} pValue the value to check
+ * @return {Boolean} true if the value is numeric
+ */
+Utils.isNumeric = function (pValue)
+{
+    return Utils.isNumber(pValue) || (!isNaN(parseFloat(pValue)) && isFinite(pValue));
+}
+
+/**
+ * Checks if the given value is an integer.
+ * 
+ * @param {Object} pValue the value to check
+ * @return {Boolean} true if the value is an integer
+ */
+Utils.isInteger = function (pValue)
+{
+    return Number.isInteger(parseFloat(pValue)) && isFinite(pValue);
+}
+
+/**
+ * Checks if the given value is a floating point number.
+ * 
+ * @param {Object} pValue the value to check
+ * @return {Boolean} true if the value is a float
+ */
+Utils.isFloat = function (pValue)
+{
+    return !Number.isInteger(parseFloat(pValue)) && !isNaN(parseFloat(pValue)) && isFinite(pValue);
+}
+
 /**
  * Checks if the given value is an object. Be careful, null is also considered "object".
  * 
@@ -191,7 +224,7 @@ Utils.isNumber = function (pValue)
  */
 Utils.isObject = function (pValue)
 {
-    return typeof pValue === "object";
+    return typeof pValue === "object" && pValue !== null;
 }
 
 /**
diff --git a/process/_all_test/_all_test.aod b/process/_all_test/_all_test.aod
new file mode 100644
index 00000000000..4336a9ddb94
--- /dev/null
+++ b/process/_all_test/_all_test.aod
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+  <name>_all_test</name>
+  <title>[TEST] .All</title>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <icon>VAADIN:CHECK_CIRCLE</icon>
+  <process>%aditoprj%/process/_all_test/process.js</process>
+  <alias>Data_alias</alias>
+  <variants>
+    <element>EXECUTABLE</element>
+  </variants>
+</process>
diff --git a/process/_all_test/process.js b/process/_all_test/process.js
new file mode 100644
index 00000000000..cbc75f35849
--- /dev/null
+++ b/process/_all_test/process.js
@@ -0,0 +1,23 @@
+import("system.logging");
+import("system.process");
+import("UnitTest_lib");
+import("Terminal_lib");
+
+
+var testResults = [];
+
+process.getProcesses([process.VARIANT_EXECUTABLE]).forEach(function(pProcessName) {
+    // Run all executable processes ending with "_test" except THIS one
+    if(pProcessName !== "_all_test" && pProcessName.substr(-5, 5) === "_test") {
+        var startConfig = process.createStartConfig().setName(pProcessName);
+        var testResult = JSON.parse(process.start(startConfig));
+        
+        if(testResult !== null && typeof testResult === "object") {
+            testResults.push(testResult);
+        }
+    }
+});
+
+var tester = new Tester("");
+tester.summary(testResults);
+
-- 
GitLab


From bc67ab8720d96985af20b85e2483beaab2b96ae5 Mon Sep 17 00:00:00 2001
From: Johannes Goderbauer <j.goderbauer@adito.de>
Date: Fri, 30 Oct 2020 08:17:53 +0000
Subject: [PATCH 046/184] Merge branch '#1065112-unit-test' into '2020.2'

#1065112 unit test

See merge request xrm/basic!461

(cherry picked from commit 4028739296154fe0f0e9ffb41e64d1a16cad0563)

10c27fe4 #1065112: Massively refactored and extended UnitTest_lib including a collection runner
410b3453 #1065112: Update existing and add new UnitTests
34d19ace #1065112: Implement code coverage for Unit Tests
6d7e775d #1065112: Implement data providers for tests
e34f25b5 #1065112: Implement new string tests
0946c2ae #1065112: Switch data provider values for more consistency
67067782 #1065112: Documentation and some bug fixing
23de5e48 #1065112: Add coverage method count to output
fd7bb172 #1065112: Merge and update equality methods and add documentation
36412ea0 #1065112: Implement more tests
35dc9252 #1065112: Fix KeywordAttribute test
60f74598 #1065112: Add documentation
b2978f57 #1065112: Refactor test coverage
b7c9e55a #1065112: Add and improve documentation
6d505996 #1065112: Fix typo in docs
d05a4851 #1065112: Introduce display values for assertion and add stacktrace to errors
9ee07194 #1065112: Fix test process config
7d4fe5e4 #1065112: Implement rerun option for tests and improve exception handling
df86e7c7 #1065112: Implement test negation and therefore needed assert description generation
a5f3c230 #1065112: Fix failing keyword tests
619c88a4 #1065112: Improve exception handling
3eeaeb20 #1065112: Update keyword tests
aad8fb8f #1065112: Implement `elementAt()` and update tests
d3314c2d #1065112: Implement `hasMinLength()` and `hasMaxLength()` and update tests
873b3d41 #1065112: Reorder and rename methods, add documentation and update tests accordingly
d403e025 #1065112: Adapt coding guidelines
e32568de Bugfix: UnitTest_lib applied not()-call for all assertions
aae3b3f4 Split Sql_test into SqlBuilder_test and SqlMaskingUtils_test
b3608380 Disabled faulty Keyword_test
---
 .../KeywordAttribute_test.aod                 |   12 +
 process/KeywordAttribute_test/process.js      |  144 ++
 process/Keyword_test/Keyword_test.aod         |   12 +
 process/Keyword_test/process.js               |  143 ++
 process/SqlBuilder_test/SqlBuilder_test.aod   |   12 +
 process/SqlBuilder_test/process.js            | 1266 +++++++++++++++
 process/SqlLib_tests/process.js               | 1015 ------------
 .../SqlMaskingUtils_test.aod                  |   12 +
 process/SqlMaskingUtils_test/process.js       |  158 ++
 process/Sql_lib/documentation.adoc            |    4 +-
 .../Terminal_lib.aod}                         |    6 +-
 process/Terminal_lib/process.js               |  342 ++++
 process/UnitTest_lib/UnitTest_lib.aod         |    1 +
 process/UnitTest_lib/process.js               | 1374 ++++++++++++++---
 process/UnitTest_test/UnitTest_test.aod       |   12 +
 process/UnitTest_test/process.js              | 1141 ++++++++++++++
 process/Util_lib/process.js                   |   35 +-
 process/_all_test/_all_test.aod               |   12 +
 process/_all_test/process.js                  |   23 +
 19 files changed, 4531 insertions(+), 1193 deletions(-)
 create mode 100644 process/KeywordAttribute_test/KeywordAttribute_test.aod
 create mode 100644 process/KeywordAttribute_test/process.js
 create mode 100644 process/Keyword_test/Keyword_test.aod
 create mode 100644 process/Keyword_test/process.js
 create mode 100644 process/SqlBuilder_test/SqlBuilder_test.aod
 create mode 100644 process/SqlBuilder_test/process.js
 delete mode 100644 process/SqlLib_tests/process.js
 create mode 100644 process/SqlMaskingUtils_test/SqlMaskingUtils_test.aod
 create mode 100644 process/SqlMaskingUtils_test/process.js
 rename process/{SqlLib_tests/SqlLib_tests.aod => Terminal_lib/Terminal_lib.aod} (67%)
 create mode 100644 process/Terminal_lib/process.js
 create mode 100644 process/UnitTest_test/UnitTest_test.aod
 create mode 100644 process/UnitTest_test/process.js
 create mode 100644 process/_all_test/_all_test.aod
 create mode 100644 process/_all_test/process.js

diff --git a/process/KeywordAttribute_test/KeywordAttribute_test.aod b/process/KeywordAttribute_test/KeywordAttribute_test.aod
new file mode 100644
index 00000000000..5956980e85a
--- /dev/null
+++ b/process/KeywordAttribute_test/KeywordAttribute_test.aod
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+  <name>KeywordAttribute_test</name>
+  <title>[TEST] KeywordAttribute_lib</title>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <icon>VAADIN:CHECK_CIRCLE</icon>
+  <process>%aditoprj%/process/KeywordAttribute_test/process.js</process>
+  <alias>Data_alias</alias>
+  <variants>
+    <element>EXECUTABLE</element>
+  </variants>
+</process>
diff --git a/process/KeywordAttribute_test/process.js b/process/KeywordAttribute_test/process.js
new file mode 100644
index 00000000000..888e3a79bc3
--- /dev/null
+++ b/process/KeywordAttribute_test/process.js
@@ -0,0 +1,144 @@
+import("system.result");
+import("system.translate");
+import("system.vars");
+import("Keyword_lib");
+import("UnitTest_lib");
+import("Sql_lib");
+
+
+var constructor = new TestSuite("KeywordAttribute.constructor", [
+    new Test("should throw error if no data is found and no default value is defined",
+        function(pTester) {
+            var exception = new Error(translate.withArguments("no keyword attribute \"%0\" found in keyword container \"%1\"", ["contacts", "AddressType"]));
+            pTester.expectThat(function() {
+                new KeywordAttribute("AddressType", "contacts");
+            }).throwsException(exception).assert();
+        }
+    ),
+
+    new Test("should not throw error if no data is found but default value is defined",
+        function(pTester) {
+            pTester.expectThat(function() {
+                new KeywordAttribute("AddressType", "contact", "testDefault");
+            }).not().throwsException().assert();
+        }
+    ),
+]);
+
+
+var getValue = new TestSuite("KeywordAttribute.getValue", [
+    new Test("should throw error if attribute does not exist in container and no default value is defined",
+        function(pTester) {
+            var exception = new Error(translate.withArguments("no keyword attribute \"%0\" found in keyword container \"%1\"", ["asdf", "AddressType"]));
+
+            pTester.expectThat(function() {
+                var ka = new KeywordAttribute("AddressType", "asdf");
+                ka.getValue("abc");
+            }).throwsException(exception).assert();
+        }
+    ),
+        
+    new Test("should throw error if attribute is not assigned to keyword and no default value is defined",
+        function(pTester) {
+            var exception = new Error(translate.withArguments("no keyword attribute \"%0\" found in keyword \"%1\" from container \"%2\"", ["contact", "abc", "AddressType"]));
+
+            pTester.expectThat(function() {
+                var ka = new KeywordAttribute("AddressType", "contact");
+                ka.getValue("abc");
+            }).throwsException(exception).assert();
+        }
+    ),
+
+    new Test("should return default value if defined but attribute does not exist in container",
+        function(pTester) {
+            var ka = new KeywordAttribute("AddressType", "asdf", "testDefault");
+            var actualValue = ka.getValue("HOMEADDR");
+
+            pTester.expectThat(actualValue).equals("testDefault").assert();
+        }
+    ),
+
+    new Test("should return default value if defined and attribute exists in container but is not assigned to keyword",
+        function(pTester) {
+            var ka = new KeywordAttribute("AddressType", "contact", "testDefault");
+            var actualValue = ka.getValue("abc");
+
+            pTester.expectThat(actualValue).equals("testDefault").assert();
+        }
+    ),
+
+    new Test("should return keywords boolean value (actually a number)",
+        function(pTester) {
+            var ka = new KeywordAttribute("AddressType", "organisation");
+            var actualValue = ka.getValue("HOMEADDR");
+
+            pTester.expectThat(actualValue).isNumeric().assert();
+            pTester.expectThat(actualValue).equals("0").assert();
+        }
+    ),
+
+    new Test("should return keywords number value (actually a string)",
+        function(pTester) {
+            var ka = new KeywordAttribute("PaymentTerm", "dayNumber");
+            var actualValue = ka.getValue("PAYTERM30");
+
+            pTester.expectThat(actualValue).isNumeric().assert();
+            pTester.expectThat(actualValue).isString().assert();
+            pTester.expectThat(actualValue).equals("30.00").assert();
+        }
+    ),
+        
+    new Test("should return keywords char value (string)",
+        function(pTester) {
+            var ka = new KeywordAttribute("TaskStatus", "icon");
+            var actualValue = ka.getValue("ASSIGNED");
+
+            pTester.expectThat(actualValue).isString().assert();
+            pTester.expectThat(actualValue).equals("NEON:STATUS_ASSIGNED").assert();
+        }
+    ),
+        
+    new Test("should return keywords long char value (string)",
+        function(pTester) {
+            var ka = new KeywordAttribute("TicketType", "attributes");
+            var actualValue = ka.getValue("SUPPORTTICKET");
+
+            pTester.expectThat(actualValue).isString().assert();
+            pTester.expectThat(actualValue).equals('["ff8b1caf-cf30-4edb-b5ca-a9a219ba8399"]').assert();
+        }
+    ),
+]);
+
+
+var getSqlBuilderSelect = new TestSuite("KeywordAttribute.getSqlBuilderSelect", [
+    new Test("should return a SqlBuilder instance",
+        function(pTester) {
+            var ka = new KeywordAttribute("MemberRole", "Intern");
+            /** @type {SqlBuilder} */
+            var actualValue = ka.getSqlBuilderSelect();
+            
+            var expectQueryResult = [
+                "039fd6ae-b4ad-431e-86bf-59ed2f4df0a9",
+                "8cb1b843-713a-4193-aa50-9f5ca06820f8",
+                "9c421b0b-8529-4e07-9463-28d59fd027b6",
+                "b72294cd-3a46-4f71-ab93-72824f63f7f4",
+                "f78f229f-f809-4bd2-aca8-24e2f82fa220",
+            ];
+            var actualQueryResult = actualValue.orderBy("AB_KEYWORD_ATTRIBUTERELATION.AB_KEYWORD_ENTRY_ID").arrayColumn();
+
+            pTester.expectThat(actualValue).isInstanceOf("SqlBuilder").assert();
+            pTester.expectThat(actualQueryResult).equals(expectQueryResult).assert();
+        }
+    ),
+]);
+
+
+var tester = new Tester("Test KeywordAttribute_lib");
+tester.initCoverage(KeywordAttribute);
+tester.test(constructor);
+tester.test(getValue);
+tester.test(getSqlBuilderSelect);
+
+tester.summary();
+    
+result.object(tester.getResults());
diff --git a/process/Keyword_test/Keyword_test.aod b/process/Keyword_test/Keyword_test.aod
new file mode 100644
index 00000000000..e654f56663b
--- /dev/null
+++ b/process/Keyword_test/Keyword_test.aod
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+  <name>Keyword_test</name>
+  <title>[TEST] Keyword_lib</title>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <icon>VAADIN:CHECK_CIRCLE</icon>
+  <process>%aditoprj%/process/Keyword_test/process.js</process>
+  <alias>Data_alias</alias>
+  <variants>
+    <element>EXECUTABLE</element>
+  </variants>
+</process>
diff --git a/process/Keyword_test/process.js b/process/Keyword_test/process.js
new file mode 100644
index 00000000000..d1b1d910e9d
--- /dev/null
+++ b/process/Keyword_test/process.js
@@ -0,0 +1,143 @@
+import("system.result");
+import("system.translate");
+import("system.vars");
+import("Keyword_lib");
+import("UnitTest_lib");
+
+//this test will not work currently 
+//TODO: renable and fix the tests
+
+//var getContainerNames = new TestSuite("KeywordUtils.getContainerNames", [
+//    new Test("should return an alphabetically ascending ordered list of all keyword containers",
+//        function(pTester) {
+//            var actualValue = KeywordUtils.getContainerNames();
+//
+//            pTester.expectThat(actualValue).isArray().assert();
+//            pTester.expectThat(actualValue).hasMinLength(1).assert();
+//            pTester.expectThat(actualValue).elementAt(0).equals("ActivityCategory").assert();
+//            pTester.expectThat(actualValue).elementAt(-1).equals("YesNo").assert();
+//        }
+//    )
+//]);
+//
+//
+//var getCategoryNameById = new TestSuite("KeywordUtils.getCategoryNameById", [
+//    new Test("should return existing keyword category name for correct uuid",
+//        function(pTester) {
+//            var actualValue = KeywordUtils.getCategoryNameById("a55654b1-6a19-4d0c-b08d-cfbc12b5f7b0");
+//
+//            pTester.expectThat(actualValue).equals("MemberRole").assert();
+//        }
+//    ),
+//
+//    new Test("should return non-existing keyword category name for wrong uuid",
+//        function(pTester) {
+//            var actualValue = KeywordUtils.getCategoryNameById("a55654b1-6a19-4d0c-b08d-cfbc12b5f7b1");
+//
+//            pTester.expectThat(actualValue).equals("<unknown>").assert();
+//        }
+//    ),
+//
+//    new Test("should return non-existing keyword category name for missing uuid",
+//        function(pTester) {
+//            var actualValue = KeywordUtils.getCategoryNameById();
+//
+//            pTester.expectThat(actualValue).equals("<unknown>").assert();
+//        }
+//    ),
+//]);
+//
+//
+//var getCategoryIdByName = new TestSuite("KeywordUtils.getCategoryIdByName", [
+//    new Test("should return existing keyword uuid for correct category name",
+//        function(pTester) {
+//            var actualValue = KeywordUtils.getCategoryIdByName("MemberRole");
+//
+//            pTester.expectThat(actualValue).equals("a55654b1-6a19-4d0c-b08d-cfbc12b5f7b0").assert();
+//        }
+//    ),
+//
+//    new Test("should throw exception for wrong keyword category name",
+//        function(pTester) {
+//            var exception = new Error(translate.withArguments("no keyword category \"%0\" found", ["AddressTypes"]));
+//            pTester.expectThat(function() {
+//                KeywordUtils.getCategoryIdByName("AddressTypes");
+//            }).throwsException(exception).assert();
+//        }
+//    ),
+//
+//    new Test("should throw exception for missing keyword category name",
+//        function(pTester) {
+//            var exception = new Error(translate.withArguments("no keyword category \"%0\" found", [""]));
+//            pTester.expectThat(function() {
+//                KeywordUtils.getCategoryIdByName();
+//            }).throwsException(exception).assert();
+//        }
+//    ),
+//]);
+//
+//
+//var getEntryNamesAndIdsByContainer = new TestSuite("KeywordUtils.getEntryNamesAndIdsByContainer", [
+//    new Test("should return an array of all keywords and their ID's for given container",
+//        function(pTester) {
+//            var actualValue = KeywordUtils.getEntryNamesAndIdsByContainer("ActivityDirection");
+//
+//            pTester.expectThat(actualValue).isArray().assert();
+//            pTester.expectThat(actualValue).hasMinLength(1, {name: "array"}).assert();
+//            pTester.expectThat(actualValue).elementAt(0).isArray().assert();
+//            pTester.expectThat(actualValue).elementAt(0).hasLength(2).assert();
+//        }
+//    ),
+//
+//    new Test("should return an empty array for non-existent container",
+//        function(pTester) {
+//            var actualValue = KeywordUtils.getEntryNamesAndIdsByContainer("Asdf");
+//
+//            pTester.expectThat(actualValue).isArray().assert();
+//            pTester.expectThat(actualValue).hasLength(0, {name: "array"}).assert();
+//        }
+//    ),
+//]);
+//
+//
+//var exists = new TestSuite("KeywordUtils.exists", [
+//    new Test("should return a boolean indicating that a known keyword in a known container exists",
+//        function(pTester) {
+//            var actualValue = KeywordUtils.exists("VISIT", "ActivityCategory");
+//
+//            pTester.expectThat(actualValue).isBoolean().assert();
+//            pTester.expectThat(actualValue).equals(true, "known keyword exists in known container").assert();
+//        }
+//    ),
+//
+//    new Test("should return a boolean indicating that an unknown keyword in a known container does not exist",
+//        function(pTester) {
+//            var actualValue = KeywordUtils.exists("ASDF", "ActivityCategory");
+//
+//            pTester.expectThat(actualValue).isBoolean().assert();
+//            pTester.expectThat(actualValue).equals(false, "unknown keyword does not exist in known container").assert();
+//        }
+//    ),
+//
+//    new Test("should return a boolean indicating that a known keyword in an unknown container does not exist",
+//        function(pTester) {
+//            var actualValue = KeywordUtils.exists("VISIT", "Asdf");
+//
+//            pTester.expectThat(actualValue).isBoolean().assert();
+//            pTester.expectThat(actualValue).equals(false, "known keyword does not exist in unknown container").assert();
+//        }
+//    ),
+//]);
+//
+//
+//var tester = new Tester("Test Keyword_lib");
+//tester.initCoverage(KeywordUtils);
+//tester.test(getContainerNames);
+//tester.test(getCategoryNameById);
+//tester.test(getCategoryIdByName);
+//tester.test(getEntryNamesAndIdsByContainer);
+//tester.test(exists);
+//
+//tester.summary();
+//    
+//result.object(tester.getResults());
\ No newline at end of file
diff --git a/process/SqlBuilder_test/SqlBuilder_test.aod b/process/SqlBuilder_test/SqlBuilder_test.aod
new file mode 100644
index 00000000000..39922829116
--- /dev/null
+++ b/process/SqlBuilder_test/SqlBuilder_test.aod
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+  <name>SqlBuilder_test</name>
+  <title>[TEST] Sql_lib - SqlBuilder</title>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <icon>VAADIN:CHECK_CIRCLE</icon>
+  <process>%aditoprj%/process/SqlBuilder_test/process.js</process>
+  <alias>Data_alias</alias>
+  <variants>
+    <element>EXECUTABLE</element>
+  </variants>
+</process>
diff --git a/process/SqlBuilder_test/process.js b/process/SqlBuilder_test/process.js
new file mode 100644
index 00000000000..3ec9ec86ddb
--- /dev/null
+++ b/process/SqlBuilder_test/process.js
@@ -0,0 +1,1266 @@
+import("system.db");
+import("system.result");
+import("system.vars");
+import("system.translate");
+import("system.logging");
+import("system.SQLTYPES");
+import("Sql_lib");
+import("UnitTest_lib");
+
+//SqlBuilder-tests:
+var newSelectTests = new TestSuite("SqlLib.newSelect", [
+    new Test("newSelect with just a string should just use it as select",
+        function(pTester)
+        {
+            var actualValue = newSelect("MySuper, Field, String")
+
+            pTester.expectThat(actualValue).elementAt("_select").elementAt("_sqlStorage").equals("select MySuper, Field, String").assert();
+            pTester.expectThat(actualValue).elementAt("_select").elementAt("preparedValues").hasLength(0).assert();
+        }
+    ),
+
+    new Test("newSelect with just an array of strings should just use them concatenated as select",
+        function(pTester)
+        {
+            var actualValue = newSelect(["MySuper", "Field", "String"])
+
+            pTester.expectThat(actualValue).elementAt("_select").elementAt("_sqlStorage").equals("select MySuper, Field, String").assert();
+            pTester.expectThat(actualValue).elementAt("_select").elementAt("preparedValues").hasLength(0).assert();
+        }
+    ),
+
+    new Test("newSelect with just an SqlBuilder should use it as subselect",
+        function(pTester)
+        {
+            var actualValue = newSelect(new SqlBuilder().select("PERSONID").from("PERSON").where("PERSON.FIRSTNAME", "Fritz"))
+
+            pTester.expectThat(actualValue).elementAt("_select").elementAt("_sqlStorage").equals("select (select PERSONID from PERSON where PERSON.FIRSTNAME = ?)").assert();
+            pTester.expectThat(actualValue).elementAt("_select").elementAt("preparedValues").hasLength(1).assert();
+        }
+    ),
+
+    new Test("newSelect an array of Strings and SqlBuilders should add them all",
+        function(pTester)
+        {
+            var actualValue = newSelect(["MySuper", "Field", "String", new SqlBuilder().select("PERSONID").from("PERSON").where("PERSON.FIRSTNAME", "Fritz")])
+
+            pTester.expectThat(actualValue).elementAt("_select").elementAt("_sqlStorage").equals("select MySuper, Field, String, (select PERSONID from PERSON where PERSON.FIRSTNAME = ?)").assert();
+            pTester.expectThat(actualValue).elementAt("_select").elementAt("preparedValues").hasLength(1).assert();
+        }
+    ),
+]);
+
+
+var validAndUsageTests = new TestSuite("SqlLib.validAndUsage", [
+    new Test("and should just add simple strings as condition just as it is",
+        function(pTester)
+        {
+            var actualValue = new SqlBuilder()
+                                .where("PERSON.FIRSTNAME = 'Tim'") // NOTE: you should not do this as this does not add a real prepared statement with "?"
+                                .and("PERSON.LASTNAME = 'Admin'")
+
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("_sqlStorage").equals("PERSON.FIRSTNAME = 'Tim' and PERSON.LASTNAME = 'Admin'").assert();
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("preparedValues").hasLength(0).assert();
+        }
+    ),
+
+    new Test("and should add a condition if field and value are passed",
+        function(pTester)
+        {
+            var actualValue = new SqlBuilder()
+                                .where("PERSON.FIRSTNAME", "Tim")
+                                .and("PERSON.LASTNAME", "Admin")
+
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("_sqlStorage").equals("PERSON.FIRSTNAME = ? and PERSON.LASTNAME = ?").assert();
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("preparedValues").hasLength(2).assert();
+        }
+    ),
+
+    new Test("and should add a condition if value is an empty string",
+        function(pTester)
+        {
+            var actualValue = new SqlBuilder()
+                                .where("PERSON.FIRSTNAME", "")
+                                .and("PERSON.LASTNAME", "")
+
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("_sqlStorage").equals("PERSON.FIRSTNAME = ? and PERSON.LASTNAME = ?").assert();
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("preparedValues").hasLength(2).assert();
+        }
+    ),
+
+    new Test("and should add a condition if field and value as jdito-var are passed",
+        function(pTester)
+        {
+            vars.set("$global.TestUnitValueName", "Tim");
+            var actualValue = new SqlBuilder()
+                                .where("PERSON.FIRSTNAME", "$global.TestUnitValueName")
+
+            pTester.expectThat(actualValue.toString()).equals("( PERSON.FIRSTNAME = 'Tim' ) ").assert();
+        }
+    ),
+
+    new Test("$ should be escaped by a second $ and the string should therefore just be used as string and not as jdito variable",
+        function(pTester)
+        {
+            var actualValue = new SqlBuilder()
+                                .where("PERSON.FIRSTNAME", "$$mySuperString")
+
+            pTester.expectThat(actualValue.toString()).equals("( PERSON.FIRSTNAME = '$mySuperString' ) ").assert();
+        }
+    ),
+
+    new Test("and should add a condition if value is a jdito-var containing an empty string",
+        function(pTester)
+        {
+            vars.set("$global.TestingVarEmptyString", "");
+            var actualValue = new SqlBuilder()
+                                .where("PERSON.FIRSTNAME", "$global.TestingVarEmptyString")
+                                .and("PERSON.LASTNAME", "$global.TestingVarEmptyString")
+
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("_sqlStorage").equals("PERSON.FIRSTNAME = ? and PERSON.LASTNAME = ?").assert();
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("preparedValues").hasLength(2).assert();
+        }
+    ),
+
+    new Test("and should use the given condition pattern",
+        function(pTester)
+        {
+            var actualValue = new SqlBuilder()
+                                .where("PERSON.FIRSTNAME", "Tim", "# <> ?")
+                                .and("PERSON.LASTNAME", "Admin")
+
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("_sqlStorage").equals("PERSON.FIRSTNAME <> ? and PERSON.LASTNAME = ?").assert();
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("preparedValues").hasLength(2).assert();
+        }
+    ),
+
+    new Test("and should use the given SQLTYPE if provided",
+        function(pTester)
+        {
+            var actualValue = new SqlBuilder()
+                                .where("PERSON.FIRSTNAME", 6, null, SQLTYPES.INTEGER)
+                                .and("PERSON.LASTNAME", 7, undefined, SQLTYPES.INTEGER)
+                                .and("PERSON.LASTNAME", 8, "# <> ?", SQLTYPES.INTEGER)
+
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("_sqlStorage").equals("PERSON.FIRSTNAME = ? and PERSON.LASTNAME = ? and PERSON.LASTNAME <> ?").assert();
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("preparedValues").hasLength(3).assert();
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("preparedValues").elementAt(0).elementAt(1).equals(SQLTYPES.INTEGER).assert();
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("preparedValues").elementAt(1).elementAt(1).equals(SQLTYPES.INTEGER).assert();
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("preparedValues").elementAt(2).elementAt(1).equals(SQLTYPES.INTEGER).assert();
+        }
+    ),
+
+    new Test("and only with a prepared statement-array should just use it as it is",
+        function(pTester)
+        {
+            var actualValue = new SqlBuilder()
+                                .where([
+                                    "PERSON.FIRSTNAME = ?", [["Peter", 12]]
+                                ])
+                                .and([
+                                    "exists (select * FROM CONTACT where PERSON_ID = PERSONID)", []
+                                ])
+
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("_sqlStorage").equals(" ( PERSON.FIRSTNAME = ? )  and  ( exists (select * FROM CONTACT where PERSON_ID = PERSONID) ) ").assert();
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("preparedValues").hasLength(1).assert();
+        }
+    ),
+
+    new Test("and only with a SqlBulder object should just use the condition from it",
+        function(pTester)
+        {
+            var actualValue = new SqlBuilder()
+                                .where(new SqlBuilder()
+                                    .select("TEST")
+                                    .from("PERSON")
+                                    .where("PERSON.FIRSTNAME", "Tim")
+                                    .and("PERSON.LASTNAME", "Admin"))
+
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("_sqlStorage").equals(" ( PERSON.FIRSTNAME = ? and PERSON.LASTNAME = ? ) ").assert();
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("preparedValues").hasLength(2).assert();
+        }
+    ),
+
+    new Test("and with a builder as value and condition (field is null|undefined) should add the whole builder as subquery",
+        function(pTester)
+        {
+            var actualValue = new SqlBuilder()
+                                .where(null, new SqlBuilder()
+                                    .select("FIRSTNAME")
+                                    .from("PERSON")
+                                    .where("PERSON.FIRSTNAME", "Tim")
+                                    .and("PERSON.LASTNAME", "Admin"),
+                                    "exists ?")  // Note: you can use SqlBuilder.EXISTS() instead of  "exists ?"
+
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("_sqlStorage").equals("exists  ( select FIRSTNAME from PERSON where PERSON.FIRSTNAME = ? and PERSON.LASTNAME = ? ) ").assert();
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("preparedValues").hasLength(2).assert();
+        }
+    ),
+
+    new Test("and with a builder as value and field should add the whole builder as subquery with field = (subquery)",
+        function(pTester)
+        {
+            var actualValue = new SqlBuilder()
+                                .where("PERSON.FIRSTNAME", new SqlBuilder()
+                                    .select("FIRSTNAME")
+                                    .from("PERSON")
+                                    .where("PERSON.FIRSTNAME", "Tim")
+                                    .and("PERSON.LASTNAME", "Admin"))
+
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("_sqlStorage").equals("PERSON.FIRSTNAME =  ( select FIRSTNAME from PERSON where PERSON.FIRSTNAME = ? and PERSON.LASTNAME = ? ) ").assert();
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("preparedValues").hasLength(2).assert();
+        }
+    ),
+
+    new Test("and with a prepared statement-array as value and field is null|undefined should add the whole statement as subquery",
+        function(pTester)
+        {
+            var actualValue = new SqlBuilder()
+                                .where(null, ["select FIRSTNAME from PERSON.FIRSTNAME = ?", [["Peter", 12]]], "exists ?")
+                                .and(null, ["exists (select FIRSTNAME from PERSON.FIRSTNAME = ?)", [["Peter", 12]]]) // also without pCond it should work as the condition could be included in the prep statement
+
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("_sqlStorage").equals("exists  ( select FIRSTNAME from PERSON.FIRSTNAME = ? )  and  ( exists (select FIRSTNAME from PERSON.FIRSTNAME = ?) ) ").assert();
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("preparedValues").hasLength(2).assert();
+        }
+    ),
+
+    new Test("and with a prepared statement-array as value and field should add the whole statement as subquery with field = (subquery)",
+        function(pTester)
+        {
+            var actualValue = new SqlBuilder()
+                                .where("PERSON.FIRSTNAME", ["select FIRSTNAME from PERSON.FIRSTNAME = ?", [["Peter", 12]]])
+
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("_sqlStorage").equals("PERSON.FIRSTNAME =  ( select FIRSTNAME from PERSON.FIRSTNAME = ? ) ").assert();
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("preparedValues").hasLength(1).assert();
+        }
+    ),
+]);
+
+
+var validOrUsageTests = new TestSuite("SqlLib.validOrUsage", [
+    new Test("or should just add simple strings as condition just as it is",
+        function(pTester)
+        {
+            var actualValue = new SqlBuilder()
+                                .where("PERSON.FIRSTNAME = 'Tim'") // NOTE: you should not do this as this does not add a real prepared statement with "?"
+                                .or("PERSON.LASTNAME = 'Admin'")
+
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("_sqlStorage").equals("PERSON.FIRSTNAME = 'Tim' or PERSON.LASTNAME = 'Admin'").assert();
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("preparedValues").hasLength(0).assert();
+        }
+    ),
+
+    new Test("or should add a condition if field and value are passed",
+        function(pTester)
+        {
+            var actualValue = new SqlBuilder()
+                                .where("PERSON.FIRSTNAME", "Tim")
+                                .or("PERSON.LASTNAME", "Admin")
+
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("_sqlStorage").equals("PERSON.FIRSTNAME = ? or PERSON.LASTNAME = ?").assert();
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("preparedValues").hasLength(2).assert();
+        }
+    ),
+
+    new Test("or should use the given condition pattern",
+        function(pTester)
+        {
+            var actualValue = new SqlBuilder()
+                                .where("PERSON.FIRSTNAME", "Tim", "# <> ?")
+                                .or("PERSON.LASTNAME", "Admin")
+
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("_sqlStorage").equals("PERSON.FIRSTNAME <> ? or PERSON.LASTNAME = ?").assert();
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("preparedValues").hasLength(2).assert();
+        }
+    ),
+
+    new Test("or should use the given SQLTYPE if provided",
+        function(pTester)
+        {
+            var actualValue = new SqlBuilder()
+                                .where("PERSON.FIRSTNAME", 6, null, SQLTYPES.INTEGER)
+                                .or("PERSON.LASTNAME", 7, undefined, SQLTYPES.INTEGER)
+                                .or("PERSON.LASTNAME", 8, "# <> ?", SQLTYPES.INTEGER)
+
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("_sqlStorage").equals("PERSON.FIRSTNAME = ? or PERSON.LASTNAME = ? or PERSON.LASTNAME <> ?").assert();
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("preparedValues").hasLength(3).assert();
+        }
+    ),
+
+    new Test("or only with a prepared statement-array should just use it as it is",
+        function(pTester)
+        {
+            var actualValue = new SqlBuilder()
+                                .where([
+                                    "PERSON.FIRSTNAME = ?", [["Peter", 12]]
+                                ])
+                                .or([
+                                    "exists (select * FROM CONTACT where PERSON_ID = PERSONID)", []
+                                ])
+
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("_sqlStorage").equals(" ( PERSON.FIRSTNAME = ? )  or  ( exists (select * FROM CONTACT where PERSON_ID = PERSONID) ) ").assert();
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("preparedValues").hasLength(1).assert();
+        }
+    ),
+
+    new Test("or only with a SqlBulder object should just use the condition from it",
+        function(pTester)
+        {
+            var actualValue = new SqlBuilder()
+                                .where(new SqlBuilder()
+                                    .where("PERSON.FIRSTNAME", "Tim")
+                                    .or("PERSON.LASTNAME", "Admin"))
+
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("_sqlStorage").equals(" ( PERSON.FIRSTNAME = ? or PERSON.LASTNAME = ? ) ").assert();
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("preparedValues").hasLength(2).assert();
+        }
+    ),
+
+    new Test("or with a builder as value and condition (field is null|undefined) should add the whole builder as subquery",
+        function(pTester)
+        {
+            var actualValue = new SqlBuilder()
+                                .where(null, new SqlBuilder()
+                                    .select("FIRSTNAME")
+                                    .from("PERSON")
+                                    .where("PERSON.FIRSTNAME", "Tim")
+                                    .or("PERSON.LASTNAME", "Admin"),
+                                    "exists ?")
+
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("_sqlStorage").equals("exists  ( select FIRSTNAME from PERSON where PERSON.FIRSTNAME = ? or PERSON.LASTNAME = ? ) ").assert();
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("preparedValues").hasLength(2).assert();
+        }
+    ),
+
+    new Test("or with a builder as value and field should add the whole builder as subquery with field = (subquery)",
+        function(pTester)
+        {
+            var actualValue = new SqlBuilder()
+                                .where("PERSON.FIRSTNAME", new SqlBuilder()
+                                    .select("FIRSTNAME")
+                                    .from("PERSON")
+                                    .where("PERSON.FIRSTNAME", "Tim")
+                                    .or("PERSON.LASTNAME", "Admin"))
+
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("_sqlStorage").equals("PERSON.FIRSTNAME =  ( select FIRSTNAME from PERSON where PERSON.FIRSTNAME = ? or PERSON.LASTNAME = ? ) ").assert();
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("preparedValues").hasLength(2).assert();
+        }
+    ),
+
+    new Test("or with a prepared statement-array as value and field is null|undefined should add the whole statement as subquery",
+        function(pTester)
+        {
+            var actualValue = new SqlBuilder()
+                                .where(null, ["select FIRSTNAME from PERSON.FIRSTNAME = ?", [["Peter", 12]]], "exists ?")
+                                .or(null, ["exists (select FIRSTNAME from PERSON.FIRSTNAME = ?)", [["Peter", 12]]]) // also without pCond it should work as the condition could be included in the prep statement
+
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("_sqlStorage").equals("exists  ( select FIRSTNAME from PERSON.FIRSTNAME = ? )  or  ( exists (select FIRSTNAME from PERSON.FIRSTNAME = ?) ) ").assert();
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("preparedValues").hasLength(2).assert();
+        }
+    ),
+]);
+
+var combinedAndOrTests = new TestSuite("SqlLib.combinedAndOr", [
+    new Test("or combining two and",
+        function(pTester)
+        {
+            var actualValue = new SqlBuilder()
+                            .where("PERSON.FIRSTNAME", "Tim")
+                            .and("PERSON.LASTNAME", "Admin")
+                            .or(new SqlBuilder()
+                                    .where("PERSON.FIRSTNAME", "Peter")
+                                    .and("PERSON.LASTNAME", "Müller"))
+
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("_sqlStorage").equals("(PERSON.FIRSTNAME = ? and PERSON.LASTNAME = ?) or  ( PERSON.FIRSTNAME = ? and PERSON.LASTNAME = ? ) ").assert();
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("preparedValues").hasLength(4).assert();
+        }
+    ),
+
+    new Test("and combining two or",
+        function(pTester)
+        {
+            var actualValue = new SqlBuilder()
+                            .where(new SqlBuilder()
+                                    .where("PERSON.FIRSTNAME", "Tim")
+                                    .or("PERSON.LASTNAME", "Admin"))
+                            .and(new SqlBuilder()
+                                    .where("PERSON.FIRSTNAME", "Peter")
+                                    .or("PERSON.LASTNAME", "Müller"))
+
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("_sqlStorage").equals(" ( PERSON.FIRSTNAME = ? or PERSON.LASTNAME = ? )  and  ( PERSON.FIRSTNAME = ? or PERSON.LASTNAME = ? ) ").assert();
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("preparedValues").hasLength(4).assert();
+        }
+    ),
+
+    new Test("some and/or combinations in one select",
+        function(pTester)
+        {
+            var actualValue = new SqlBuilder()
+                            .where("PERSON.FIRSTNAME", "Tim")
+                            .or("PERSON.FIRSTNAME", "Franz")
+                            .and("PERSON.LASTNAME", "Admin")
+                            .and(new SqlBuilder()
+                                    .where("PERSON.FIRSTNAME", "Peter")
+                                    .or("PERSON.LASTNAME", "Müller"))
+                            .or("PERSON.FIRSTNAME", "Franz")
+                            .and("PERSON.FIRSTNAME", "Franz")
+                            .or(new SqlBuilder()
+                                    .where("PERSON.FIRSTNAME", "Peter")
+                                    .and("PERSON.LASTNAME", "Müller")
+                                    .and(new SqlBuilder()
+                                            .where("PERSON.FIRSTNAME", "Peter")
+                                            .or("PERSON.LASTNAME", "Müller")))
+
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("_sqlStorage").equals("PERSON.FIRSTNAME = ? or PERSON.FIRSTNAME = ? and PERSON.LASTNAME = ? and  ( PERSON.FIRSTNAME = ? or PERSON.LASTNAME = ? )  or (PERSON.FIRSTNAME = ?) and PERSON.FIRSTNAME = ? or  ( PERSON.FIRSTNAME = ? and PERSON.LASTNAME = ? and  ( PERSON.FIRSTNAME = ? or PERSON.LASTNAME = ? )  ) ").assert();
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("preparedValues").hasLength(11).assert();
+        }
+    ),
+]);
+
+
+var ifSetTests = new TestSuite("SqlLib.ifSet", [
+    new Test("simple and if set with all types of empty values.",
+        function(pTester)
+        {
+            var actualValue = new SqlBuilder()
+                            .whereIfSet("PERSON.LASTNAME", null)
+                            .andIfSet("PERSON.LASTNAME", undefined)
+
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("_sqlStorage").equals("", "no sql should be added").assert();
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("preparedValues").hasLength(0, "no params should be added").assert();
+        }
+    ),
+
+    new Test("jdito variable with null",
+        function(pTester)
+        {
+            vars.set("$global.TestingVarNull", null);
+
+            var actualValue = new SqlBuilder()
+                            .whereIfSet("PERSON.FIRSTNAME", "$global.TestingVarNull")
+
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("_sqlStorage").equals("", "no sql should be added").assert();
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("preparedValues").hasLength(0, "no params should be added").assert();
+        }
+    ),
+
+    new Test("empty simple conditions",
+        function(pTester)
+        {
+            var actualValue = new SqlBuilder()
+                            .whereIfSet("")
+                            .andIfSet(["", []])
+                            .andIfSet(new SqlBuilder())
+
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("_sqlStorage").equals("", "no sql should be added").assert();
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("preparedValues").hasLength(0, "no params should be added").assert();
+        }
+    ),
+
+    new Test("empty subqueries",
+        function(pTester)
+        {
+            var actualValue = new SqlBuilder()
+                            .whereIfSet("PERSON.FIRSTNAME", ["", []])
+                            .andIfSet("PERSON.LASTNAME", new SqlBuilder())
+
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("_sqlStorage").equals("", "no sql should be added").assert();
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("preparedValues").hasLength(0, "no params should be added").assert();
+        }
+    ),
+]);
+
+
+function cleanWrapperTests()
+{
+    try {
+        db.runStatement("drop table SQL_LIB_TEST_TABLE");
+    } catch(ex) {}
+
+    try {
+        db.deleteData("PERSON", "PERSONID in ('TEST-5', 'TEST-6')")
+    } catch(ex) {}
+
+}
+
+
+var dbWrapperTests = new TestSuite("SqlLib.dbWrapper", [
+    new Test("cell should load only one value",
+        function(pTester)
+        {
+            var builder = new SqlBuilder()
+                                .select("FIRSTNAME")
+                                .from("PERSON")
+                                .where("PERSON.PERSONID", "TEST-5")
+            var actualValue = builder.cell()
+
+            pTester.expectThat(actualValue).equals("Franz").assert();
+        }
+    ),
+
+    new Test("cell should just return '' if no condition set but pExecuteOnlyIfConditionExists is true",
+        function(pTester)
+        {
+            var builder = new SqlBuilder()
+                                .select("FIRSTNAME")
+                                .from("PERSON")
+            var actualValue = builder.cell(true)
+
+            pTester.expectThat(actualValue).equals("").assert();
+        }
+    ),
+
+    new Test("cell should return a value if no condition set and pExecuteOnlyIfConditionExists is false",
+        function(pTester)
+        {
+            var builder = new SqlBuilder()
+                                .select("FIRSTNAME")
+                                .from("PERSON");
+
+            var actualValue = builder.cell(false)
+
+            pTester.expectThat(actualValue).not().equals("").assert();
+            pTester.expectThat(actualValue).not().isNull().assert();
+            pTester.expectThat(actualValue).not().isUndefined().assert();
+        }
+    ),
+
+    new Test("array should load an array of values",
+        function(pTester)
+        {
+            var builder = new SqlBuilder()
+                                .select("FIRSTNAME, LASTNAME")
+                                .from("PERSON")
+                                .where("PERSON.PERSONID", "TEST-5");
+
+            var actualValue = builder.array(db.ROW);
+            pTester.expectThat(actualValue).elementAt(0).equals("Franz", {name: "firstname"}).assert();
+            pTester.expectThat(actualValue).elementAt(1).equals("Müller", {name: "lastname"}).assert();
+        }
+    ),
+
+    new Test("array should return an empty array if no condition set but pExecuteOnlyIfConditionExists is true",
+        function(pTester)
+        {
+            var builder = new SqlBuilder()
+                                .select("FIRSTNAME, LASTNAME")
+                                .from("PERSON")
+
+            var actualValue = builder.array(db.ROW, true);
+            pTester.expectThat(actualValue).hasLength(0).assert();
+        }
+    ),
+
+    new Test("array should return a non-empty array if no condition set and pExecuteOnlyIfConditionExists is false",
+        function(pTester)
+        {
+            var builder = new SqlBuilder()
+                                .select("FIRSTNAME, LASTNAME")
+                                .from("PERSON")
+
+            var actualValue = builder.array(db.ROW, false);
+            pTester.expectThat(actualValue).hasMinLength(1).assert();
+        }
+    ),
+
+    new Test("table should load an array of arrays with values",
+        function(pTester)
+        {
+            var builder = new SqlBuilder()
+                                .select("FIRSTNAME, LASTNAME")
+                                .from("PERSON")
+                                .where("PERSON.PERSONID", "TEST-5")
+                                .or("PERSON.PERSONID", "TEST-6")
+                                .orderBy("PERSONID asc");
+
+            var actualValue = builder.table();
+            pTester.expectThat(actualValue).elementAt(0).elementAt(0).equals("Franz", {name: "firstname"}).assert();
+            pTester.expectThat(actualValue).elementAt(0).elementAt(1).equals("Müller", {name: "lastname"}).assert();
+
+            pTester.expectThat(actualValue).elementAt(1).elementAt(0).equals("Marco", {name: "firstname"}).assert();
+            pTester.expectThat(actualValue).elementAt(1).elementAt(1).equals("Polo", {name: "lastname"}).assert();
+        }
+    ),
+
+    new Test("table should return an empty array if no condition set but pExecuteOnlyIfConditionExists is true",
+        function(pTester)
+        {
+            var builder = new SqlBuilder()
+                                .select("FIRSTNAME, LASTNAME")
+                                .from("PERSON");
+
+            var actualValue = builder.table(true);
+
+            pTester.expectThat(actualValue).hasLength(0).assert();
+        }
+    ),
+
+    new Test("table should return a non-empty array if no condition set and pExecuteOnlyIfConditionExists is false",
+        function(pTester)
+        {
+            var builder = new SqlBuilder()
+                                .select("FIRSTNAME, LASTNAME")
+                                .from("PERSON");
+
+            var actualValue = builder.table(false);
+            pTester.expectThat(actualValue).hasMinLength(1).assert();
+        }
+    ),
+
+    new Test("delete should delete the data and use the from and condition from the builder",
+        function(pTester)
+        {
+            db.deleteData("SQL_LIB_TEST_TABLE", "TESTID = 'TEST-7'");
+            db.insertData("SQL_LIB_TEST_TABLE", ["TESTID", "FIRSTNAME", "LASTNAME"], null, ["TEST-7", "Ludwig", "Fischer"]);
+
+            var builder = new SqlBuilder()
+                                .from("SQL_LIB_TEST_TABLE")
+                                .where("SQL_LIB_TEST_TABLE.TESTID", "TEST-7");
+
+            var actualValue = builder.deleteData();
+            pTester.expectThat(actualValue).equals(1).assert();
+        }
+    ),
+
+    new Test("delete should delete the data from the provided table and use the condition from the builder. It ignores .from if a table is given.",
+        function(pTester)
+        {
+            db.deleteData("SQL_LIB_TEST_TABLE", "TESTID = 'TEST-7'");
+            db.insertData("SQL_LIB_TEST_TABLE", ["TESTID", "FIRSTNAME", "LASTNAME"], null, ["TEST-7", "Ludwig", "Fischer"]);
+
+            var builder = new SqlBuilder()
+                                .from("PERSON")
+                                .where("SQL_LIB_TEST_TABLE.TESTID", "TEST-7");
+
+            var actualValue = builder.deleteData(false, "SQL_LIB_TEST_TABLE");
+            pTester.expectThat(actualValue).equals(1).assert();
+        }
+    ),
+
+    new Test("delete should delete ALL data from a table if the builder has no condition and pExecuteOnlyIfConditionExists is false",
+        function(pTester)
+        {
+            db.deleteData("SQL_LIB_TEST_TABLE", "TESTID in ('TEST-7', 'TEST-8')");
+            db.insertData("SQL_LIB_TEST_TABLE", ["TESTID", "FIRSTNAME", "LASTNAME"], null, ["TEST-7", "Ludwig", "Fischer"]);
+            db.insertData("SQL_LIB_TEST_TABLE", ["TESTID", "FIRSTNAME", "LASTNAME"], null, ["TEST-8", "Ludwig", "Fischer"]);
+
+            var builder = new SqlBuilder()
+                                .from("SQL_LIB_TEST_TABLE")
+
+            var actualValue = builder.deleteData(false);
+            pTester.expectThat(actualValue).equals(2).assert();
+        }
+    ),
+
+    new Test("delete should delete NO data from a table if the builder has no condition and pExecuteOnlyIfConditionExists is true",
+        function(pTester)
+        {
+            db.deleteData("SQL_LIB_TEST_TABLE", "TESTID in ('TEST-7', 'TEST-8')");
+            db.insertData("SQL_LIB_TEST_TABLE", ["TESTID", "FIRSTNAME", "LASTNAME"], null, ["TEST-7", "Ludwig", "Fischer"]);
+            db.insertData("SQL_LIB_TEST_TABLE", ["TESTID", "FIRSTNAME", "LASTNAME"], null, ["TEST-8", "Ludwig", "Fischer"]);
+
+            var builder = new SqlBuilder()
+                                .from("SQL_LIB_TEST_TABLE")
+
+            var actualValue = builder.deleteData(true);
+            pTester.expectThat(actualValue).equals(0).assert();
+        }
+    ),
+
+    new Test("update should update the data and use the from and condition from the builder",
+        function(pTester)
+        {
+            db.deleteData("SQL_LIB_TEST_TABLE", "TESTID = 'TEST-7'");
+            db.insertData("SQL_LIB_TEST_TABLE", ["TESTID", "FIRSTNAME", "LASTNAME"], null, ["TEST-7", "Ludwig", "Fischer"]);
+
+            var builder = new SqlBuilder()
+                                .from("SQL_LIB_TEST_TABLE")
+                                .where("SQL_LIB_TEST_TABLE.TESTID", "TEST-7");
+
+            builder.updateData(false, undefined, ["FIRSTNAME"], null, ["Fritz"]);
+
+            var actualValue = db.cell("select FIRSTNAME from SQL_LIB_TEST_TABLE where SQL_LIB_TEST_TABLE.TESTID = 'TEST-7'")
+
+            pTester.expectThat(actualValue).equals("Fritz").assert();
+        }
+    ),
+
+    new Test("update should update the data from the provided table and use the condition from the builder. It ignores .from if a table is given.",
+        function(pTester)
+        {
+            db.deleteData("SQL_LIB_TEST_TABLE", "TESTID = 'TEST-7'");
+            db.insertData("SQL_LIB_TEST_TABLE", ["TESTID", "FIRSTNAME", "LASTNAME"], null, ["TEST-7", "Ludwig", "Fischer"]);
+
+            var builder = new SqlBuilder()
+                                .from("PERSON")
+                                .where("SQL_LIB_TEST_TABLE.TESTID", "TEST-7");
+
+            builder.updateData(false, "SQL_LIB_TEST_TABLE", ["FIRSTNAME"], null, ["Fritz"]);
+
+            var actualValue = db.cell("select FIRSTNAME from SQL_LIB_TEST_TABLE where SQL_LIB_TEST_TABLE.TESTID = 'TEST-7'")
+
+            pTester.expectThat(actualValue).equals("Fritz").assert();
+        }
+    ),
+
+    new Test("update should update ALL data from a table if the builder has no condition and pExecuteOnlyIfConditionExists is false",
+        function(pTester)
+        {
+            db.deleteData("SQL_LIB_TEST_TABLE", "TESTID in ('TEST-7', 'TEST-8')");
+            db.insertData("SQL_LIB_TEST_TABLE", ["TESTID", "FIRSTNAME", "LASTNAME"], null, ["TEST-7", "Ludwig", "Fischer"]);
+            db.insertData("SQL_LIB_TEST_TABLE", ["TESTID", "FIRSTNAME", "LASTNAME"], null, ["TEST-8", "Franz", "Fischer"]);
+
+            var builder = new SqlBuilder()
+                                .from("SQL_LIB_TEST_TABLE")
+
+            builder.updateData(false, undefined, ["FIRSTNAME"], null, ["Fritz"]);
+
+            var actualValue1 = db.cell("select FIRSTNAME from SQL_LIB_TEST_TABLE where SQL_LIB_TEST_TABLE.TESTID = 'TEST-7'")
+            var actualValue2 = db.cell("select FIRSTNAME from SQL_LIB_TEST_TABLE where SQL_LIB_TEST_TABLE.TESTID = 'TEST-8'")
+
+            pTester.expectThat(actualValue1).equals("Fritz", "TEST-7 should have Firstname Fritz").assert();
+            pTester.expectThat(actualValue2).equals("Fritz", "TEST-8 should have Firstname Fritz").assert();
+        }
+    ),
+
+    new Test("update should update NO data from a table if the builder has no condition and pExecuteOnlyIfConditionExists is true",
+        function(pTester)
+        {
+            db.deleteData("SQL_LIB_TEST_TABLE", "TESTID in ('TEST-7', 'TEST-8')")
+            db.insertData("SQL_LIB_TEST_TABLE", ["TESTID", "FIRSTNAME", "LASTNAME"], null, ["TEST-7", "Ludwig", "Fischer"]);
+            db.insertData("SQL_LIB_TEST_TABLE", ["TESTID", "FIRSTNAME", "LASTNAME"], null, ["TEST-8", "Franz", "Fischer"]);
+
+            var builder = new SqlBuilder()
+                                .from("SQL_LIB_TEST_TABLE")
+
+            builder.updateData(true, undefined, ["FIRSTNAME"], null, ["Fritz"]);
+
+            var actualValue1 = db.cell("select FIRSTNAME from SQL_LIB_TEST_TABLE where SQL_LIB_TEST_TABLE.TESTID = 'TEST-7'")
+            var actualValue2 = db.cell("select FIRSTNAME from SQL_LIB_TEST_TABLE where SQL_LIB_TEST_TABLE.TESTID = 'TEST-8'")
+
+            pTester.expectThat(actualValue1).equals("Ludwig", "TEST-7 should have Firstname Ludwig").assert();
+            pTester.expectThat(actualValue2).equals("Franz", "TEST-8 should have Firstname Franz").assert();
+        }
+    ),
+], function preAll()
+{
+    // remove data which may exist if previous test-run failed and postAll was not executed
+    cleanWrapperTests();
+
+    // add table for save testing of deletes
+    db.runStatement("create table SQL_LIB_TEST_TABLE (TESTID varchar(36), FIRSTNAME varchar(100), LASTNAME varchar(100))");
+
+    // add test persons
+    db.insertData("PERSON", ["PERSONID", "FIRSTNAME", "LASTNAME", "USER_NEW", "DATE_NEW"], null, ["TEST-5", "Franz", "Müller", "testuser", vars.get("$sys.date")])
+    db.insertData("PERSON", ["PERSONID", "FIRSTNAME", "LASTNAME", "USER_NEW", "DATE_NEW"], null, ["TEST-6", "Marco", "Polo", "testuser", vars.get("$sys.date")])
+}, undefined, undefined, function postAll()
+{
+    cleanWrapperTests();
+})
+
+
+var mandatoryErrorTests = new TestSuite("SqlLib.mandatoryError", [
+// and
+    new Test("and without parameter should error",
+        function(pTester)
+        {
+            pTester.expectThat(function() {
+                new SqlBuilder().where().or();
+            }).throwsException(SqlBuilder._ERROR_NO_PARAMETER_PROVIDED()).assert();
+        }
+    ),
+
+    new Test("and with null as value should error",
+        function(pTester)
+        {
+            pTester.expectThat(function() {
+                new SqlBuilder().where().or("PERSON.FIRSTNAME", null);
+            }).throwsException(SqlBuilder._ERROR_VALUE_IS_MANDATORY()).assert();
+        }
+    ),
+
+    new Test("and with undefined as value should error",
+        function(pTester)
+        {
+            pTester.expectThat(function() {
+                new SqlBuilder().where().or("PERSON.FIRSTNAME", undefined);
+            }).throwsException(SqlBuilder._ERROR_VALUE_IS_MANDATORY()).assert();
+        }
+    ),
+
+    new Test("and with a jdito-var containing null should error",
+        function(pTester)
+        {
+            vars.set("$global.TestingVarNull", null);
+
+            pTester.expectThat(function() {
+                new SqlBuilder().where().or("PERSON.FIRSTNAME", "$global.TestingVarNull");
+            }).throwsException(SqlBuilder._ERROR_VALUE_IS_MANDATORY_JDITO_VAR()).assert();
+        }
+    ),
+
+    new Test("and with an empty sql-builder as subquery should error",
+        function(pTester)
+        {
+            pTester.expectThat(function() {
+                new SqlBuilder().where().or("PERSON.FIRSTNAME", new SqlBuilder());
+            }).throwsException(SqlBuilder._ERROR_VALUE_IS_MANDATORY()).assert();
+        }
+    ),
+
+    new Test("and with an empty prepared statement as subquery should error",
+        function(pTester)
+        {
+            pTester.expectThat(function() {
+                new SqlBuilder().where().or("PERSON.FIRSTNAME", ["", []]);
+            }).throwsException(SqlBuilder._ERROR_VALUE_IS_MANDATORY()).assert();
+        }
+    ),
+
+
+// or
+    new Test("or without parameter should error",
+        function(pTester)
+        {
+            pTester.expectThat(function() {
+                new SqlBuilder().where().or();
+            }).throwsException(SqlBuilder._ERROR_NO_PARAMETER_PROVIDED()).assert();
+        }
+    ),
+
+    new Test("or with null as value should error",
+        function(pTester)
+        {
+            pTester.expectThat(function() {
+                new SqlBuilder().where().or("PERSON.FIRSTNAME", null);
+            }).throwsException(SqlBuilder._ERROR_VALUE_IS_MANDATORY()).assert();
+        }
+    ),
+
+    new Test("or with undefined as value should error",
+        function(pTester)
+        {
+            pTester.expectThat(function() {
+                new SqlBuilder().where().or("PERSON.FIRSTNAME", undefined);
+            }).throwsException(SqlBuilder._ERROR_VALUE_IS_MANDATORY()).assert();
+        }
+    ),
+
+    new Test("or with a jdito-var containing null should error",
+        function(pTester)
+        {
+            vars.set("$global.TestingVarNull", null);
+
+            pTester.expectThat(function() {
+                new SqlBuilder().where().or("PERSON.FIRSTNAME", "$global.TestingVarNull");
+            }).throwsException(SqlBuilder._ERROR_VALUE_IS_MANDATORY_JDITO_VAR()).assert();
+        }
+    ),
+
+    new Test("or with an empty sql-builder as subquery should error",
+        function(pTester)
+        {
+            pTester.expectThat(function() {
+                new SqlBuilder().where().or("PERSON.FIRSTNAME", new SqlBuilder());
+            }).throwsException(SqlBuilder._ERROR_VALUE_IS_MANDATORY()).assert();
+        }
+    ),
+
+    new Test("or with an empty prepared statement as subquery should error",
+        function(pTester)
+        {
+            pTester.expectThat(function() {
+                new SqlBuilder().where().or("PERSON.FIRSTNAME", ["", []]);
+            }).throwsException(SqlBuilder._ERROR_VALUE_IS_MANDATORY()).assert();
+        }
+    ),
+]);
+
+
+var inStatementTests = new TestSuite("SqlLib.inStatement", [
+    new Test("simple and in",
+        function(pTester)
+        {
+            var actualValue = new SqlBuilder()
+                                .where("PERSON.LASTNAME", ["Franz", "Fritz"], SqlBuilder.IN()) // Note: you can use SqlBuilder.IN(), SqlBuilder.NOT_IN(), "# in ?", etc. as 3rd parameter
+                                .or("PERSON.LASTNAME", ["Peter", "Mayer"], SqlBuilder.IN());
+
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("_sqlStorage").equals(" ( PERSON.LASTNAME in  (?, ?)  )  or  ( PERSON.LASTNAME in  (?, ?)  ) ").assert();
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("preparedValues").hasLength(4).assert();
+        }
+    ),
+
+    new Test("simple and not in",
+        function(pTester)
+        {
+            var actualValue = new SqlBuilder()
+                                .where("PERSON.LASTNAME", ["Franz", "Fritz"], "# not in ?"); // Note: you can use SqlBuilder.IN(), SqlBuilder.NOT_IN(), "# in ?", etc. as 3rd parameter
+
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("_sqlStorage").equals(" ( PERSON.LASTNAME not in  (?, ?)  ) ").assert();
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("preparedValues").hasLength(2).assert();
+        }
+    ),
+
+    new Test("in with subquery",
+        function(pTester)
+        {
+            var actualValue = new SqlBuilder()
+                            .where("PERSON.FIRSTNAME", new SqlBuilder()
+                                                            .select("PERSON.FIRSTNAME")
+                                                            .from("PERSON")
+                                                            .where("PERSON.LASTNAME", "Fritz")
+                                                    , "# in ?"); // Note: you can use SqlBuilder.IN() instead of "# in ?"
+
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("_sqlStorage").equals("PERSON.FIRSTNAME in  ( select PERSON.FIRSTNAME from PERSON where PERSON.LASTNAME = ? ) ").assert();
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("preparedValues").hasLength(1).assert();
+        }
+    ),
+
+    new Test("in with prepared statement-array",
+        function(pTester)
+        {
+            var actualValue = new SqlBuilder()
+                            .where("PERSON.FIRSTNAME", ["select PERSON.FIRSTNAME from PERSON where PERSON.LASTNAME = ?", [["Fritz", SQLTYPES.VARCHAR]]]
+                                                    , "# in ?"); // Note: you can use SqlBuilder.IN() instead of "# in ?"
+
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("_sqlStorage").equals("PERSON.FIRSTNAME in  ( select PERSON.FIRSTNAME from PERSON where PERSON.LASTNAME = ? ) ").assert();
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("preparedValues").hasLength(1).assert();
+        }
+    ),
+
+    new Test("andIfSet should ignore empty array",
+        function(pTester)
+        {
+            var actualValue = new SqlBuilder()
+                                .whereIfSet("PERSON.LASTNAME", []);
+
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("_sqlStorage").equals("").assert();
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("preparedValues").hasLength(0).assert();
+        }
+    ),
+
+    new Test("and should error on an empty array",
+        function(pTester)
+        {
+            pTester.expectThat(function() {
+                new SqlBuilder().where("PERSON.LASTNAME", []);
+            }).throwsException(SqlBuilder._ERROR_VALUE_IS_MANDATORY()).assert();
+        }
+    ),
+]);
+
+
+var testConstantFunctions = new TestSuite("SqlLib.testConstantFunc", [
+    new Test("SqlBuilder.IN()",
+        function(pTester)
+        {
+            var actualValue = SqlBuilder.IN();
+            pTester.expectThat(actualValue).equals("# in ?").assert();
+        }
+    ),
+
+    new Test("SqlBuilder.NOT_IN()",
+        function(pTester)
+        {
+            var actualValue = SqlBuilder.NOT_IN();
+            pTester.expectThat(actualValue).equals("# not in ?").assert();
+        }
+    ),
+
+    new Test("SqlBuilder.EXISTS()",
+        function(pTester)
+        {
+            var actualValue = SqlBuilder.EXISTS();
+            pTester.expectThat(actualValue).equals("exists ?").assert();
+        }
+    ),
+]);
+
+
+var selectTests = new TestSuite("SqlLib.select", [
+    new Test("a sql-builder in a fields-array is translated to sql correctly",
+        function(pTester)
+        {
+            var countSubQuery = newSelect("count(*)")
+                                    .from("AB_ATTRIBUTEUSAGE")
+                                    .where("AB_ATTRIBUTEUSAGE.OBJECT_TYPE", "myType")
+                                    .and("AB_ATTRIBUTEUSAGE.AB_ATTRIBUTE_ID = AB_ATTRIBUTE.AB_ATTRIBUTEID");
+
+            var actualValue = new SqlBuilder()
+                .select(["AB_ATTRIBUTEID", "AB_ATTRIBUTEUSAGEID", countSubQuery])
+                .from("AB_ATTRIBUTE")
+
+            pTester.expectThat(actualValue).elementAt("_select").elementAt("_sqlStorage").equals("select AB_ATTRIBUTEID, AB_ATTRIBUTEUSAGEID, (select count(*) from AB_ATTRIBUTEUSAGE where AB_ATTRIBUTEUSAGE.OBJECT_TYPE = ? and AB_ATTRIBUTEUSAGE.AB_ATTRIBUTE_ID = AB_ATTRIBUTE.AB_ATTRIBUTEID)").assert();
+            pTester.expectThat(actualValue).elementAt("_select").elementAt("preparedValues").hasLength(1).assert();
+        }
+    ),
+
+    new Test("a sql-builder in from is used as subselect",
+        function(pTester)
+        {
+            var subQuery = newSelect("FIRSTNAME")
+                                    .from("PERSON")
+                                    .where("PERSON.LASTNAME", "Meier")
+
+            var actualValue = new SqlBuilder()
+                .select("*")
+                .from(subQuery)
+
+            pTester.expectThat(actualValue).elementAt("_from").elementAt("_sqlStorage").equals("from (select FIRSTNAME from PERSON where PERSON.LASTNAME = ?)").assert();
+            pTester.expectThat(actualValue).elementAt("_from").elementAt("preparedValues").hasLength(1).assert();
+        }
+    ),
+]);
+
+
+var joinTests = new TestSuite("SqlLib.join", [
+    new Test("SqlBuilder as on-condition should only add the conditon of the builder",
+        function(pTester)
+        {
+            var subQuery = newSelect("NAME")
+                                    .from("ORGANISATION")
+                                    .where("ORGANISATION.NAME", "Adito")
+
+            var actualValue = new SqlBuilder()
+                .select("*")
+                .from("PERSON")
+                .join("ORGANISATION", subQuery)
+
+            pTester.expectThat(actualValue).elementAt("_joins").elementAt(0).elementAt("_sqlStorage").equals("join ORGANISATION on ORGANISATION.NAME = ?").assert();
+            pTester.expectThat(actualValue).elementAt("_joins").elementAt(0).elementAt("preparedValues").hasLength(1).assert();
+        }
+    ),
+
+    new Test("SqlBuilder as table for join is added as subselect",
+        function(pTester)
+        {
+            var subQuery = newSelect("NAME")
+                                    .from("ORGANISATION")
+                                    .where("ORGANISATION.NAME", "Adito")
+
+            var actualValue = new SqlBuilder()
+                .select("*")
+                .from("PERSON")
+                .join(subQuery, "orgname.NAME = TABLE2.NAME", "orgname")
+
+            pTester.expectThat(actualValue).elementAt("_joins").elementAt(0).elementAt("_sqlStorage").equals("join (select NAME from ORGANISATION where ORGANISATION.NAME = ?) orgname on orgname.NAME = TABLE2.NAME").assert();
+            pTester.expectThat(actualValue).elementAt("_joins").elementAt(0).elementAt("preparedValues").hasLength(1).assert();
+        }
+    ),
+
+    new Test("just use a string also containing a condition as join without additional condition",
+        function(pTester)
+        {
+            var actualValue = new SqlBuilder()
+                .select("*")
+                .from("PERSON")
+                .join("TABLE1 on TABLE1.NAME = TABLE2.NAME")
+
+            pTester.expectThat(actualValue).elementAt("_joins").elementAt(0).elementAt("_sqlStorage").equals("join TABLE1 on TABLE1.NAME = TABLE2.NAME").assert();
+            pTester.expectThat(actualValue).elementAt("_joins").elementAt(0).elementAt("preparedValues").hasLength(0).assert();
+        }
+    ),
+]);
+
+
+var subqueryAsFieldTests = new TestSuite("SqlLib.subqueryAsField", [
+    new Test("Test if a Subselect as field works if pValue is provided. This should be added as subselect.",
+        function(pTester)
+        {
+            var subQuery = newSelect("NAME")
+                                    .from("ORGANISATION")
+                                    .where("ORGANISATION.ORGANISATIONID = CONTACT.ORGANISATION_ID")
+                                    .and("PERSON.FIRSTNAME", "val1") // test if the value is added at the correct place
+
+            var actualValue = new SqlBuilder().where(subQuery, "val2", "# = ?", SQLTYPES.VARCHAR)
+                                         .and("PERSON.FIRSTNAME", "val3");
+
+
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("_sqlStorage").equals(" ( ( select NAME from ORGANISATION where ORGANISATION.ORGANISATIONID = CONTACT.ORGANISATION_ID and PERSON.FIRSTNAME = ? ) = ? )  and PERSON.FIRSTNAME = ?").assert();
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("preparedValues").hasLength(3).assert();
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("preparedValues").elementAt(0).elementAt(0).equals("val1").assert();
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("preparedValues").elementAt(1).elementAt(0).equals("val2").assert();
+            pTester.expectThat(actualValue).elementAt("_where").elementAt("preparedValues").elementAt(2).elementAt(0).equals("val3").assert();
+        }
+    ),
+
+    new Test("Test if a Subselect as field should error if no SQLTYPE is provided.",
+        function(pTester)
+        {
+            pTester.expectThat(function() {
+                var subQuery = newSelect("NAME")
+                                .from("ORGANISATION")
+                                .where("ORGANISATION.ORGANISATIONID = CONTACT.ORGANISATION_ID")
+                                .and("PERSON.FIRSTNAME", "val1") // test if the value is added at the correct place
+                new SqlBuilder().where(subQuery, "val2", "# = ?");
+            }).throwsException(SqlBuilder._ERROR_SUBSELECT_AS_FIELD_NO_FIELD_TYPE()).assert();
+        }
+    ),
+
+    new Test("Test if a Subselect as field should error if it is not a full select.",
+        function(pTester)
+        {
+            pTester.expectThat(function() {
+                var subQuery = newSelect("NAME")
+                                .where("ORGANISATION.ORGANISATIONID = CONTACT.ORGANISATION_ID")
+                                .and("PERSON.FIRSTNAME", "val1") // test if the value is added at the correct place
+
+                new SqlBuilder().where(subQuery, "val2", "# = ?", SQLTYPES.VARCHAR);
+            }).throwsException(SqlBuilder._ERROR_SUBSELECT_AS_FIELD_NOT_COMPLETE()).assert();
+        }
+    ),
+]);
+
+
+var conditionFormatTests = new TestSuite("SqlLib.conditionFormat", [
+    new Test("pCondition should not fail if # an ? exist in correct order",
+        function(pTester)
+        {
+            pTester.expectThat(function() {
+                new SqlBuilder()
+                    .where("PERSON.FIRSTNAME", "val1", "# = ?")
+                    .and("PERSON.FIRSTNAME", "val1", "asdf # fdsa=asdf ?fdas")
+                    ;
+            }).not().throwsException().assert();
+        }
+    ),
+
+    new Test("pCondition should not fail if # an ? exist in correct order and there are additional, escaped # and ?",
+        function(pTester)
+        {
+            pTester.expectThat(function() {
+                new SqlBuilder().where("PERSON.FIRSTNAME", "val1", "\\? # \\#= ?");
+            }).not().throwsException().assert();
+        }
+    ),
+
+    new Test("pCondition should not fail if only ? exists",
+        function(pTester)
+        {
+            pTester.expectThat(function() {
+                new SqlBuilder().where("PERSON.FIRSTNAME", "val1", "?")
+            }).not().throwsException().assert();
+        }
+    ),
+
+    new Test("pCondition should fail if more than one ? exists",
+        function(pTester)
+        {
+            pTester.expectThat(function() {
+                new SqlBuilder().where("PERSON.FIRSTNAME", "val1", "? test ?")
+            }).throwsException(SqlBuilder._ERROR_CONDITION_WRONG_FORMAT()).assert();
+        }
+    ),
+
+    new Test("pCondition should fail if more than one # exists",
+        function(pTester)
+        {
+            pTester.expectThat(function() {
+                new SqlBuilder().where("PERSON.FIRSTNAME", "val1", "# test #")
+            }).throwsException(SqlBuilder._ERROR_CONDITION_WRONG_FORMAT()).assert();
+        }
+    ),
+
+    new Test("pCondition should fail if # and ? are in wrong order",
+        function(pTester)
+        {
+            pTester.expectThat(function() {
+                new SqlBuilder().where("PERSON.FIRSTNAME", "val1", "? = #")
+            }).throwsException(SqlBuilder._ERROR_CONDITION_WRONG_FORMAT()).assert();
+        }
+    ),
+]);
+
+
+var subqueryAliasTests = new TestSuite("SqlLib.subqueryAlias", [
+    new Test("subselectAlias should be added for subquery in .select",
+        function(pTester)
+        {
+            var subQuery = newSelect("NAME")
+                                    .from("ORGANISATION")
+                                    .where("ORGANISATION.NAME", "Adito")
+                                    .subselectAlias("testAlias")
+
+            var actualValue = new SqlBuilder()
+                .select([subQuery, "FIRSTNAME"])
+                .from("PERSON")
+
+            pTester.expectThat(actualValue).elementAt("_select").elementAt("_sqlStorage").equals("select (select NAME from ORGANISATION where ORGANISATION.NAME = ?) testAlias, FIRSTNAME").assert();
+            pTester.expectThat(actualValue).elementAt("_select").elementAt("preparedValues").hasLength(1).assert();
+        }
+    ),
+
+    new Test("subselectAlias should be added for subquery in .from",
+        function(pTester)
+        {
+            var subQuery = newSelect("NAME")
+                                    .from("ORGANISATION")
+                                    .where("ORGANISATION.NAME", "Adito")
+                                    .subselectAlias("testAlias")
+
+            var actualValue = new SqlBuilder()
+                .from(subQuery)
+
+            pTester.expectThat(actualValue).elementAt("_from").elementAt("_sqlStorage").equals("from (select NAME from ORGANISATION where ORGANISATION.NAME = ?) testAlias").assert();
+            pTester.expectThat(actualValue).elementAt("_from").elementAt("preparedValues").hasLength(1).assert();
+        }
+    ),
+
+    new Test("subselectAlias should be overruled by the param in in .from",
+        function(pTester)
+        {
+            var subQuery = newSelect("NAME")
+                                    .from("ORGANISATION")
+                                    .where("ORGANISATION.NAME", "Adito")
+                                    .subselectAlias("testAlias")
+
+            var actualValue = new SqlBuilder()
+                .from(subQuery, "overwriteAlias")
+
+            pTester.expectThat(actualValue).elementAt("_from").elementAt("_sqlStorage").equals("from (select NAME from ORGANISATION where ORGANISATION.NAME = ?) overwriteAlias").assert();
+            pTester.expectThat(actualValue).elementAt("_from").elementAt("preparedValues").hasLength(1).assert();
+        }
+    ),
+
+    new Test("subselectAlias should be added for subquery in .join",
+        function(pTester)
+        {
+            var subQuery = newSelect("NAME, ORGANISATIONID")
+                                    .from("ORGANISATION")
+                                    .where("ORGANISATION.NAME", "Adito")
+                                    .subselectAlias("testAlias")
+
+            var actualValue = new SqlBuilder()
+                .from("CONTACT")
+                .join(subQuery, "testAlias.ORGANISATIONID = ORGANISATION_ID")
+                .join(subQuery, "testAlias.ORGANISATIONID = ORGANISATION_ID", "overwriteAlias")
+
+            pTester.expectThat(actualValue).elementAt("_joins").elementAt(0).elementAt("_sqlStorage").equals("join (select NAME, ORGANISATIONID from ORGANISATION where ORGANISATION.NAME = ?) testAlias on testAlias.ORGANISATIONID = ORGANISATION_ID").assert();
+            pTester.expectThat(actualValue).elementAt("_joins").elementAt(0).elementAt("preparedValues").hasLength(1).assert();
+
+            pTester.expectThat(actualValue).elementAt("_joins").elementAt(1).elementAt("_sqlStorage").equals("join (select NAME, ORGANISATIONID from ORGANISATION where ORGANISATION.NAME = ?) overwriteAlias on testAlias.ORGANISATIONID = ORGANISATION_ID").assert();
+            pTester.expectThat(actualValue).elementAt("_joins").elementAt(1).elementAt("preparedValues").hasLength(1).assert();
+        }
+    ),
+]);
+
+
+var tester = new Tester("Test SqlBuilder");
+tester.test(newSelectTests);
+tester.test(validAndUsageTests);
+tester.test(validOrUsageTests);
+tester.test(combinedAndOrTests);
+tester.test(ifSetTests);
+tester.test(dbWrapperTests);
+tester.test(mandatoryErrorTests);
+tester.test(inStatementTests);
+tester.test(testConstantFunctions);
+tester.test(selectTests);
+tester.test(joinTests);
+tester.test(subqueryAsFieldTests);
+tester.test(conditionFormatTests);
+tester.test(subqueryAliasTests);
+
+tester.summary();
+
+result.object(tester.getResults());
\ No newline at end of file
diff --git a/process/SqlLib_tests/process.js b/process/SqlLib_tests/process.js
deleted file mode 100644
index 924162e2a4e..00000000000
--- a/process/SqlLib_tests/process.js
+++ /dev/null
@@ -1,1015 +0,0 @@
-import("system.db");
-import("system.vars");
-import("system.translate");
-import("system.logging");
-import("system.SQLTYPES");
-import("Sql_lib");
-import("UnitTest_lib");
-
-var newSelectTests = new TestSuite([
-    ["newSelect with just a string schould just use it as select", function(pTester)
-    {
-        var actual = newSelect("MySuper, Field, String")
-
-        pTester.assert("select MySuper, Field, String", actual._select._sqlStorage, "prepared sql");
-        pTester.assert(0, actual._select.preparedValues.length, "number of params");
-    }],
-
-    ["newSelect with just an array of strings schould just use them concatenated as select", function(pTester)
-    {
-        var actual = newSelect(["MySuper", "Field", "String"])
-
-        pTester.assert("select MySuper, Field, String", actual._select._sqlStorage, "prepared sql");
-        pTester.assert(0, actual._select.preparedValues.length, "number of params");
-    }],
-
-    ["newSelect with just an SqlBuilder should use it as subselect", function(pTester)
-    {
-        var actual = newSelect(new SqlBuilder().select("PERSONID").from("PERSON").where("PERSON.FIRSTNAME", "Fritz"))
-
-        pTester.assert("select (select PERSONID from PERSON where PERSON.FIRSTNAME = ?)", actual._select._sqlStorage, "prepared sql");
-        pTester.assert(1, actual._select.preparedValues.length, "number of params");
-    }],
-
-    ["newSelect an array of Strings and SqlBuilders should add them all", function(pTester)
-    {
-        var actual = newSelect(["MySuper", "Field", "String", new SqlBuilder().select("PERSONID").from("PERSON").where("PERSON.FIRSTNAME", "Fritz")])
-
-        pTester.assert("select MySuper, Field, String, (select PERSONID from PERSON where PERSON.FIRSTNAME = ?)", actual._select._sqlStorage, "prepared sql");
-        pTester.assert(1, actual._select.preparedValues.length, "number of params");
-    }],
-]);
-
-var validAndUsageTests = new TestSuite([
-    ["and should just add simple strings as condition just as it is", function(pTester)
-    {
-        var actual = new SqlBuilder()
-                            .where("PERSON.FIRSTNAME = 'Tim'") // NOTE: you should not do this as this does not add a real prepared statement with "?"
-                            .and("PERSON.LASTNAME = 'Admin'")
-
-        pTester.assert("PERSON.FIRSTNAME = 'Tim' and PERSON.LASTNAME = 'Admin'", actual._where._sqlStorage, "prepared sql");
-        pTester.assert(0, actual._where.preparedValues.length, "number of params");
-    }],
-
-    ["and should add a condition if field and value are passed", function(pTester)
-    {
-        var actual = new SqlBuilder()
-                            .where("PERSON.FIRSTNAME", "Tim")
-                            .and("PERSON.LASTNAME", "Admin")
-                            
-        pTester.assert("PERSON.FIRSTNAME = ? and PERSON.LASTNAME = ?", actual._where._sqlStorage, "prepared sql");
-        pTester.assert(2, actual._where.preparedValues.length, "number of params");
-    }],
-
-    ["and should add a condition if value is an empty string", function(pTester)
-    {
-        var actual = new SqlBuilder()
-                            .where("PERSON.FIRSTNAME", "")
-                            .and("PERSON.LASTNAME", "")
-                            
-        pTester.assert("PERSON.FIRSTNAME = ? and PERSON.LASTNAME = ?", actual._where._sqlStorage, "prepared sql");
-        pTester.assert(2, actual._where.preparedValues.length, "number of params");
-    }],
-
-    ["and should add a condition if field and value as jdito-var are passed", function(pTester)
-    {
-        vars.set("$global.TestUnitValueName", "Tim");
-        var actual = new SqlBuilder()
-                            .where("PERSON.FIRSTNAME", "$global.TestUnitValueName")
-                            
-        pTester.assert("( PERSON.FIRSTNAME = 'Tim' ) ", actual.toString());
-    }],
-
-    ["$ should be escaped by a second $ and the string should therefore just be used as string and not as jdito variable", function(pTester)
-    {
-        var actual = new SqlBuilder()
-                            .where("PERSON.FIRSTNAME", "$$mySuperString")
-                            
-        pTester.assert("( PERSON.FIRSTNAME = '$mySuperString' ) ", actual.toString());
-    }],
-
-    ["and should add a condition if value is a jdito-var containing an empty string", function(pTester)
-    {
-        vars.set("$global.TestingVarEmptyString", "");
-        var actual = new SqlBuilder()
-                            .where("PERSON.FIRSTNAME", "$global.TestingVarEmptyString")
-                            .and("PERSON.LASTNAME", "$global.TestingVarEmptyString")
-                            
-        pTester.assert("PERSON.FIRSTNAME = ? and PERSON.LASTNAME = ?", actual._where._sqlStorage, "prepared sql");
-        pTester.assert(2, actual._where.preparedValues.length, "number of params");
-    }],
-
-    ["and should use the given condition pattern", function(pTester)
-    {
-        var actual = new SqlBuilder()
-                            .where("PERSON.FIRSTNAME", "Tim", "# <> ?")
-                            .and("PERSON.LASTNAME", "Admin")
-                            
-        pTester.assert("PERSON.FIRSTNAME <> ? and PERSON.LASTNAME = ?", actual._where._sqlStorage, "prepared sql");
-        pTester.assert(2, actual._where.preparedValues.length, "number of params");
-    }],
-
-    ["and should use the given SQLTYPE if provided", function(pTester)
-    {
-        var actual = new SqlBuilder()
-                            .where("PERSON.FIRSTNAME", 6, null, SQLTYPES.INTEGER)
-                            .and("PERSON.LASTNAME", 7, undefined, SQLTYPES.INTEGER)
-                            .and("PERSON.LASTNAME", 8, "# <> ?", SQLTYPES.INTEGER)
-        
-        pTester.assert("PERSON.FIRSTNAME = ? and PERSON.LASTNAME = ? and PERSON.LASTNAME <> ?", actual._where._sqlStorage, "prepared sql");
-        pTester.assert(3, actual._where.preparedValues.length, "number of params");
-        pTester.assert(SQLTYPES.INTEGER, actual._where.preparedValues[0][1], "sql type of param 1 is the provided type");
-        pTester.assert(SQLTYPES.INTEGER, actual._where.preparedValues[1][1], "sql type of param 2 is the provided type");
-        pTester.assert(SQLTYPES.INTEGER, actual._where.preparedValues[2][1], "sql type of param 3 is the provided type");
-    }],
-
-    ["and only with a prepared statement-array should just use it as it is", function(pTester)
-    {
-        var actual = new SqlBuilder()
-                            .where([
-                                "PERSON.FIRSTNAME = ?", [["Peter", 12]]
-                            ])
-                            .and([
-                                "exists (select * FROM CONTACT where PERSON_ID = PERSONID)", []
-                            ])
-                            
-        pTester.assert(" ( PERSON.FIRSTNAME = ? )  and  ( exists (select * FROM CONTACT where PERSON_ID = PERSONID) ) ", actual._where._sqlStorage, "prepared sql");
-        pTester.assert(1, actual._where.preparedValues.length, "number of params");
-    }],
-
-    ["and only with a SqlBulder object should just use the condition from it", function(pTester)
-    {
-        var actual = new SqlBuilder()
-                            .where(new SqlBuilder()
-                                .select("TEST")
-                                .from("PERSON")
-                                .where("PERSON.FIRSTNAME", "Tim")
-                                .and("PERSON.LASTNAME", "Admin"))
-                            
-        pTester.assert(" ( PERSON.FIRSTNAME = ? and PERSON.LASTNAME = ? ) ", actual._where._sqlStorage, "prepared sql");
-        pTester.assert(2, actual._where.preparedValues.length, "number of params");
-    }],
-
-    ["and with a builder as value and condition (field is null|undefined) should add the whole builder as subquery", function(pTester)
-    {
-        var actual = new SqlBuilder()
-                            .where(null, new SqlBuilder()
-                                .select("FIRSTNAME")
-                                .from("PERSON")
-                                .where("PERSON.FIRSTNAME", "Tim")
-                                .and("PERSON.LASTNAME", "Admin"),
-                                "exists ?")  // Note: you can use SqlBuilder.EXISTS() instead of  "exists ?"
-        
-        pTester.assert("exists  ( select FIRSTNAME from PERSON where PERSON.FIRSTNAME = ? and PERSON.LASTNAME = ? ) ", actual._where._sqlStorage, "prepared sql");
-        pTester.assert(2, actual._where.preparedValues.length, "number of params");
-    }],
-
-    ["and with a builder as value and field should add the whole builder as subquery with field = (subquery)", function(pTester)
-    {
-        var actual = new SqlBuilder()
-                            .where("PERSON.FIRSTNAME", new SqlBuilder()
-                                .select("FIRSTNAME")
-                                .from("PERSON")
-                                .where("PERSON.FIRSTNAME", "Tim")
-                                .and("PERSON.LASTNAME", "Admin"))
-        
-        pTester.assert("PERSON.FIRSTNAME =  ( select FIRSTNAME from PERSON where PERSON.FIRSTNAME = ? and PERSON.LASTNAME = ? ) ", actual._where._sqlStorage, "prepared sql");
-        pTester.assert(2, actual._where.preparedValues.length, "number of params");
-    }],
-
-    ["and with a prepared statement-array as value and field is null|undefined should add the whole statement as subquery", function(pTester)
-    {
-        var actual = new SqlBuilder()
-                            .where(null, ["select FIRSTNAME from PERSON.FIRSTNAME = ?", [["Peter", 12]]], "exists ?")
-                            .and(null, ["exists (select FIRSTNAME from PERSON.FIRSTNAME = ?)", [["Peter", 12]]]) // also without pCond it should work as the condition could be included in the prep statement
-        
-        pTester.assert("exists  ( select FIRSTNAME from PERSON.FIRSTNAME = ? )  and  ( exists (select FIRSTNAME from PERSON.FIRSTNAME = ?) ) ", actual._where._sqlStorage, "prepared sql");
-        pTester.assert(2, actual._where.preparedValues.length, "number of params");
-    }],
-
-    ["and with a prepared statement-array as value and field should add the whole statement as subquery with field = (subquery)", function(pTester)
-    {
-        var actual = new SqlBuilder()
-                            .where("PERSON.FIRSTNAME", ["select FIRSTNAME from PERSON.FIRSTNAME = ?", [["Peter", 12]]])
-        
-        pTester.assert("PERSON.FIRSTNAME =  ( select FIRSTNAME from PERSON.FIRSTNAME = ? ) ", actual._where._sqlStorage, "prepared sql");
-        pTester.assert(1, actual._where.preparedValues.length, "number of params");
-    }]
-]);
-
-var validOrUsageTests = new TestSuite([
-    ["or should just add simple strings as condition just as it is", function(pTester)
-    {
-        var actual = new SqlBuilder()
-                            .where("PERSON.FIRSTNAME = 'Tim'") // NOTE: you should not do this as this does not add a real prepared statement with "?"
-                            .or("PERSON.LASTNAME = 'Admin'")
-
-        pTester.assert("PERSON.FIRSTNAME = 'Tim' or PERSON.LASTNAME = 'Admin'", actual._where._sqlStorage, "prepared sql");
-        pTester.assert(0, actual._where.preparedValues.length, "number of params");
-    }],
-
-    ["or should add a condition if field and value are passed", function(pTester)
-    {
-        var actual = new SqlBuilder()
-                            .where("PERSON.FIRSTNAME", "Tim")
-                            .or("PERSON.LASTNAME", "Admin")
-                            
-        pTester.assert("PERSON.FIRSTNAME = ? or PERSON.LASTNAME = ?", actual._where._sqlStorage, "prepared sql");
-        pTester.assert(2, actual._where.preparedValues.length, "number of params");
-    }],
-
-    ["or should use the given condition pattern", function(pTester)
-    {
-        var actual = new SqlBuilder()
-                            .where("PERSON.FIRSTNAME", "Tim", "# <> ?")
-                            .or("PERSON.LASTNAME", "Admin")
-                            
-        pTester.assert("PERSON.FIRSTNAME <> ? or PERSON.LASTNAME = ?", actual._where._sqlStorage, "prepared sql");
-        pTester.assert(2, actual._where.preparedValues.length, "number of params");
-    }],
-
-    ["or should use the given SQLTYPE if provided", function(pTester)
-    {
-        var actual = new SqlBuilder()
-                            .where("PERSON.FIRSTNAME", 6, null, SQLTYPES.INTEGER)
-                            .or("PERSON.LASTNAME", 7, undefined, SQLTYPES.INTEGER)
-                            .or("PERSON.LASTNAME", 8, "# <> ?", SQLTYPES.INTEGER)
-                            
-        pTester.assert("PERSON.FIRSTNAME = ? or PERSON.LASTNAME = ? or PERSON.LASTNAME <> ?", actual._where._sqlStorage, "prepared sql");
-        pTester.assert(3, actual._where.preparedValues.length, "number of params");
-    }],
-
-    ["or only with a prepared statement-array should just use it as it is", function(pTester)
-    {
-        var actual = new SqlBuilder()
-                            .where([
-                                "PERSON.FIRSTNAME = ?", [["Peter", 12]]
-                            ])
-                            .or([
-                                "exists (select * FROM CONTACT where PERSON_ID = PERSONID)", []
-                            ])
-                            
-        pTester.assert(" ( PERSON.FIRSTNAME = ? )  or  ( exists (select * FROM CONTACT where PERSON_ID = PERSONID) ) ", actual._where._sqlStorage, "prepared sql");
-        pTester.assert(1, actual._where.preparedValues.length, "number of params");
-    }],
-
-    ["or only with a SqlBulder object should just use the condition from it", function(pTester)
-    {
-        var actual = new SqlBuilder()
-                            .where(new SqlBuilder()
-                                .where("PERSON.FIRSTNAME", "Tim")
-                                .or("PERSON.LASTNAME", "Admin"))
-                            
-        pTester.assert(" ( PERSON.FIRSTNAME = ? or PERSON.LASTNAME = ? ) ", actual._where._sqlStorage, "prepared sql");
-        pTester.assert(2, actual._where.preparedValues.length, "number of params");
-    }],
-
-    ["or with a builder as value and condition (field is null|undefined) should add the whole builder as subquery", function(pTester)
-    {
-        var actual = new SqlBuilder()
-                            .where(null, new SqlBuilder()
-                                .select("FIRSTNAME")
-                                .from("PERSON")
-                                .where("PERSON.FIRSTNAME", "Tim")
-                                .or("PERSON.LASTNAME", "Admin"),
-                                "exists ?")
-        
-        pTester.assert("exists  ( select FIRSTNAME from PERSON where PERSON.FIRSTNAME = ? or PERSON.LASTNAME = ? ) ", actual._where._sqlStorage, "prepared sql");
-        pTester.assert(2, actual._where.preparedValues.length, "number of params");
-    }],
-
-    ["or with a builder as value and field should add the whole builder as subquery with field = (subquery)", function(pTester)
-    {
-        var actual = new SqlBuilder()
-                            .where("PERSON.FIRSTNAME", new SqlBuilder()
-                                .select("FIRSTNAME")
-                                .from("PERSON")
-                                .where("PERSON.FIRSTNAME", "Tim")
-                                .or("PERSON.LASTNAME", "Admin"))
-        
-        pTester.assert("PERSON.FIRSTNAME =  ( select FIRSTNAME from PERSON where PERSON.FIRSTNAME = ? or PERSON.LASTNAME = ? ) ", actual._where._sqlStorage, "prepared sql");
-        pTester.assert(2, actual._where.preparedValues.length, "number of params");
-    }],
-
-    ["or with a prepared statement-array as value and field is null|undefined should add the whole statement as subquery", function(pTester)
-    {
-        var actual = new SqlBuilder()
-                            .where(null, ["select FIRSTNAME from PERSON.FIRSTNAME = ?", [["Peter", 12]]], "exists ?")
-                            .or(null, ["exists (select FIRSTNAME from PERSON.FIRSTNAME = ?)", [["Peter", 12]]]) // also without pCond it should work as the condition could be included in the prep statement
-        
-        pTester.assert("exists  ( select FIRSTNAME from PERSON.FIRSTNAME = ? )  or  ( exists (select FIRSTNAME from PERSON.FIRSTNAME = ?) ) ", actual._where._sqlStorage, "prepared sql");
-        pTester.assert(2, actual._where.preparedValues.length, "number of params");
-    }]
-]);
-
-var combinedAndOrTests = new TestSuite([
-    ["or combining two and", function(pTester)
-    {
-        var actual = new SqlBuilder()
-                        .where("PERSON.FIRSTNAME", "Tim")
-                        .and("PERSON.LASTNAME", "Admin")
-                        .or(new SqlBuilder()
-                                .where("PERSON.FIRSTNAME", "Peter")
-                                .and("PERSON.LASTNAME", "Müller"))
-        
-        pTester.assert("(PERSON.FIRSTNAME = ? and PERSON.LASTNAME = ?) or  ( PERSON.FIRSTNAME = ? and PERSON.LASTNAME = ? ) ", actual._where._sqlStorage, "prepared sql");
-        pTester.assert(4, actual._where.preparedValues.length, "number of params");
-    }],
-    
-    ["and combining two or", function(pTester)
-    {                 
-        var actual = new SqlBuilder()
-                        .where(new SqlBuilder()
-                                .where("PERSON.FIRSTNAME", "Tim")
-                                .or("PERSON.LASTNAME", "Admin"))
-                        .and(new SqlBuilder()
-                                .where("PERSON.FIRSTNAME", "Peter")
-                                .or("PERSON.LASTNAME", "Müller"))
-        
-        pTester.assert(" ( PERSON.FIRSTNAME = ? or PERSON.LASTNAME = ? )  and  ( PERSON.FIRSTNAME = ? or PERSON.LASTNAME = ? ) ", actual._where._sqlStorage, "prepared sql");
-        pTester.assert(4, actual._where.preparedValues.length, "number of params");
-    }],
-
-    ["some and/or combinations in one select", function(pTester)
-    {
-        var actual = new SqlBuilder()
-                        .where("PERSON.FIRSTNAME", "Tim")
-                        .or("PERSON.FIRSTNAME", "Franz")
-                        .and("PERSON.LASTNAME", "Admin")
-                        .and(new SqlBuilder()
-                                .where("PERSON.FIRSTNAME", "Peter")
-                                .or("PERSON.LASTNAME", "Müller"))
-                        .or("PERSON.FIRSTNAME", "Franz")
-                        .and("PERSON.FIRSTNAME", "Franz")
-                        .or(new SqlBuilder()
-                                .where("PERSON.FIRSTNAME", "Peter")
-                                .and("PERSON.LASTNAME", "Müller")
-                                .and(new SqlBuilder()
-                                        .where("PERSON.FIRSTNAME", "Peter")
-                                        .or("PERSON.LASTNAME", "Müller")))
-                        
-        pTester.assert("PERSON.FIRSTNAME = ? or PERSON.FIRSTNAME = ? and PERSON.LASTNAME = ? and  ( PERSON.FIRSTNAME = ? or PERSON.LASTNAME = ? )  or (PERSON.FIRSTNAME = ?) and PERSON.FIRSTNAME = ? or  ( PERSON.FIRSTNAME = ? and PERSON.LASTNAME = ? and  ( PERSON.FIRSTNAME = ? or PERSON.LASTNAME = ? )  ) ", actual._where._sqlStorage, "prepared sql");
-        pTester.assert(11, actual._where.preparedValues.length, "number of params");
-    }]
-]);
-
-var ifSetTests = new TestSuite([
-    ["simple and if set with all types of empty values.", function(pTester)
-    {
-        var actual = new SqlBuilder()
-                        .whereIfSet("PERSON.LASTNAME", null)
-                        .andIfSet("PERSON.LASTNAME", undefined)
-                        
-        pTester.assert("", actual._where._sqlStorage, "no sql should be added");
-        pTester.assert(0, actual._where.preparedValues.length, "no params should be added");
-    }],
-
-    ["jdito variable with null", function(pTester)
-    {
-        vars.set("$global.TestingVarNull", null);
-        
-        var actual = new SqlBuilder()
-                        .whereIfSet("PERSON.FIRSTNAME", "$global.TestingVarNull")
-                        
-        pTester.assert("", actual._where._sqlStorage, "no sql should be added");
-        pTester.assert(0, actual._where.preparedValues.length, "no params should be added");
-    }],
-
-    ["empty simple conditions", function(pTester)
-    {
-        var actual = new SqlBuilder()
-                        .whereIfSet("")
-                        .andIfSet(["", []])
-                        .andIfSet(new SqlBuilder())
-                        
-        pTester.assert("", actual._where._sqlStorage, "no sql should be added");
-        pTester.assert(0, actual._where.preparedValues.length, "no params should be added");
-    }],
-
-    ["empty subqueries", function(pTester)
-    {
-        var actual = new SqlBuilder()
-                        .whereIfSet("PERSON.FIRSTNAME", ["", []])
-                        .andIfSet("PERSON.LASTNAME", new SqlBuilder())
-                        
-        pTester.assert("", actual._where._sqlStorage, "no sql should be added");
-        pTester.assert(0, actual._where.preparedValues.length, "no params should be added");
-    }]
-]);
-
-function cleanWrapperTests()
-{
-    try {
-        db.runStatement("drop table SQL_LIB_TEST_TABLE");
-    } catch(ex) {}
-    
-    try {
-        db.deleteData("PERSON", "PERSONID in ('TEST-5', 'TEST-6')")
-    } catch(ex) {}
-    
-}
-
-var dbWrapperTests = new TestSuite([
-    ["cell should load only one value", function(pTester)
-    {
-        var builder = new SqlBuilder()
-                            .select("FIRSTNAME")
-                            .from("PERSON")
-                            .where("PERSON.PERSONID", "TEST-5")
-        pTester.assert("Franz", builder.cell());
-    }],
-
-    ["cell should just return '' if no condition set but pExecuteOnlyIfConditionExists is true", function(pTester)
-    {
-        var builder = new SqlBuilder()
-                            .select("FIRSTNAME")
-                            .from("PERSON")
-        pTester.assert("", builder.cell(true));
-    }],
-
-    ["cell should return a value if no condition set and pExecuteOnlyIfConditionExists is false", function(pTester)
-    {
-        var builder = new SqlBuilder()
-                            .select("FIRSTNAME")
-                            .from("PERSON");
-                            
-        var actual = builder.cell(false)
-        pTester.assert(true, actual !== "" && actual !== null && actual !== undefined);
-    }],
-
-    ["array should load an array of values", function(pTester)
-    {
-        var builder = new SqlBuilder()
-                            .select("FIRSTNAME, LASTNAME")
-                            .from("PERSON")
-                            .where("PERSON.PERSONID", "TEST-5");
-                            
-        var actual = builder.array(db.ROW);
-        pTester.assert("Franz", actual[0], "firstname should be 'Franz'");
-        pTester.assert("Müller", actual[1], "lastname should be 'Müller'");
-    }],
-
-    ["array should return an empty array if no condition set but pExecuteOnlyIfConditionExists is true", function(pTester)
-    {
-        var builder = new SqlBuilder()
-                            .select("FIRSTNAME, LASTNAME")
-                            .from("PERSON")
-                            
-        var actual = builder.array(db.ROW, true);
-        pTester.assert(0, actual.length);
-    }],
-
-    ["array should return a non-empty array if no condition set and pExecuteOnlyIfConditionExists is false", function(pTester)
-    {
-        var builder = new SqlBuilder()
-                            .select("FIRSTNAME, LASTNAME")
-                            .from("PERSON")
-                            
-        var actual = builder.array(db.ROW, false);
-        pTester.assert(true, actual.length > 0);
-    }],
- 
-    ["table should load an array of arrays with values", function(pTester)
-    {
-        var builder = new SqlBuilder()
-                            .select("FIRSTNAME, LASTNAME")
-                            .from("PERSON")
-                            .where("PERSON.PERSONID", "TEST-5")
-                            .or("PERSON.PERSONID", "TEST-6")
-                            .orderBy("PERSONID asc");
-                            
-        var actual = builder.table();
-        pTester.assert("Franz", actual[0][0], "firstname should be 'Franz'");
-        pTester.assert("Müller", actual[0][1], "lastname should be 'Müller'");
-        
-        pTester.assert("Marco", actual[1][0], "firstname should be 'Marco'");
-        pTester.assert("Polo", actual[1][1], "lastname should be 'Polo'");
-    }],
-
-    ["table should return an empty array if no condition set but pExecuteOnlyIfConditionExists is true", function(pTester)
-    {
-        var builder = new SqlBuilder()
-                            .select("FIRSTNAME, LASTNAME")
-                            .from("PERSON");
-                            
-        var actual = builder.table(true);
-        pTester.assert(0, actual.length);
-    }],
-
-    ["table should return a non-empty array if no condition set and pExecuteOnlyIfConditionExists is false", function(pTester)
-    {
-        var builder = new SqlBuilder()
-                            .select("FIRSTNAME, LASTNAME")
-                            .from("PERSON");
-                            
-        var actual = builder.table(false);
-        pTester.assert(true, actual.length > 0);
-    }],
-
-    ["delete should delete the data and use the from and condition from the builder", function(pTester)
-    {
-        db.deleteData("SQL_LIB_TEST_TABLE", "TESTID = 'TEST-7'");
-        db.insertData("SQL_LIB_TEST_TABLE", ["TESTID", "FIRSTNAME", "LASTNAME"], null, ["TEST-7", "Ludwig", "Fischer"]);
-        
-        var builder = new SqlBuilder()
-                            .from("SQL_LIB_TEST_TABLE")
-                            .where("SQL_LIB_TEST_TABLE.TESTID", "TEST-7");
-                            
-        var deletedRows = builder.deleteData();
-        pTester.assert(1, deletedRows);
-    }],
-
-    ["delete should delete the data from the provided table and use the condition from the builder. It ignores .from if a table is given.", function(pTester)
-    {
-        db.deleteData("SQL_LIB_TEST_TABLE", "TESTID = 'TEST-7'");
-        db.insertData("SQL_LIB_TEST_TABLE", ["TESTID", "FIRSTNAME", "LASTNAME"], null, ["TEST-7", "Ludwig", "Fischer"]);
-        
-        var builder = new SqlBuilder()
-                            .from("PERSON")
-                            .where("SQL_LIB_TEST_TABLE.TESTID", "TEST-7");
-                            
-        var deletedRows = builder.deleteData(false, "SQL_LIB_TEST_TABLE");
-        pTester.assert(1, deletedRows);
-    }],
-
-    ["delete should delete ALL data from a table if the builder has no condition and pExecuteOnlyIfConditionExists is false", function(pTester)
-    {
-        db.deleteData("SQL_LIB_TEST_TABLE", "TESTID in ('TEST-7', 'TEST-8')");
-        db.insertData("SQL_LIB_TEST_TABLE", ["TESTID", "FIRSTNAME", "LASTNAME"], null, ["TEST-7", "Ludwig", "Fischer"]);
-        db.insertData("SQL_LIB_TEST_TABLE", ["TESTID", "FIRSTNAME", "LASTNAME"], null, ["TEST-8", "Ludwig", "Fischer"]);
-        
-        var builder = new SqlBuilder()
-                            .from("SQL_LIB_TEST_TABLE")
-                            
-        var deletedRows = builder.deleteData(false);
-        pTester.assert(2, deletedRows);
-    }],
-
-    ["delete should delete NO data from a table if the builder has no condition and pExecuteOnlyIfConditionExists is true", function(pTester)
-    {
-        db.deleteData("SQL_LIB_TEST_TABLE", "TESTID in ('TEST-7', 'TEST-8')");
-        db.insertData("SQL_LIB_TEST_TABLE", ["TESTID", "FIRSTNAME", "LASTNAME"], null, ["TEST-7", "Ludwig", "Fischer"]);
-        db.insertData("SQL_LIB_TEST_TABLE", ["TESTID", "FIRSTNAME", "LASTNAME"], null, ["TEST-8", "Ludwig", "Fischer"]);
-        
-        var builder = new SqlBuilder()
-                            .from("SQL_LIB_TEST_TABLE")
-                            
-        var deletedRows = builder.deleteData(true);
-        pTester.assert(0, deletedRows);
-    }],
-
-    ["update should update the data and use the from and condition from the builder", function(pTester)
-    {
-        db.deleteData("SQL_LIB_TEST_TABLE", "TESTID = 'TEST-7'");
-        db.insertData("SQL_LIB_TEST_TABLE", ["TESTID", "FIRSTNAME", "LASTNAME"], null, ["TEST-7", "Ludwig", "Fischer"]);
-        
-        var builder = new SqlBuilder()
-                            .from("SQL_LIB_TEST_TABLE")
-                            .where("SQL_LIB_TEST_TABLE.TESTID", "TEST-7");
-                            
-        builder.updateData(false, undefined, ["FIRSTNAME"], null, ["Fritz"]);
-        
-        var actual = db.cell("select FIRSTNAME from SQL_LIB_TEST_TABLE where SQL_LIB_TEST_TABLE.TESTID = 'TEST-7'")
-        
-        pTester.assert("Fritz", actual);
-    }],
-
-    ["update should update the data from the provided table and use the condition from the builder. It ignores .from if a table is given.", function(pTester)
-    {
-        db.deleteData("SQL_LIB_TEST_TABLE", "TESTID = 'TEST-7'");
-        db.insertData("SQL_LIB_TEST_TABLE", ["TESTID", "FIRSTNAME", "LASTNAME"], null, ["TEST-7", "Ludwig", "Fischer"]);
-        
-        var builder = new SqlBuilder()
-                            .from("PERSON")
-                            .where("SQL_LIB_TEST_TABLE.TESTID", "TEST-7");
-                            
-        builder.updateData(false, "SQL_LIB_TEST_TABLE", ["FIRSTNAME"], null, ["Fritz"]);
-        
-        var actual = db.cell("select FIRSTNAME from SQL_LIB_TEST_TABLE where SQL_LIB_TEST_TABLE.TESTID = 'TEST-7'")
-        
-        pTester.assert("Fritz", actual);
-    }],
-
-    ["update should update ALL data from a table if the builder has no condition and pExecuteOnlyIfConditionExists is false", function(pTester)
-    {
-        db.deleteData("SQL_LIB_TEST_TABLE", "TESTID in ('TEST-7', 'TEST-8')");
-        db.insertData("SQL_LIB_TEST_TABLE", ["TESTID", "FIRSTNAME", "LASTNAME"], null, ["TEST-7", "Ludwig", "Fischer"]);
-        db.insertData("SQL_LIB_TEST_TABLE", ["TESTID", "FIRSTNAME", "LASTNAME"], null, ["TEST-8", "Franz", "Fischer"]);
-        
-        var builder = new SqlBuilder()
-                            .from("SQL_LIB_TEST_TABLE")
-                            
-        builder.updateData(false, undefined, ["FIRSTNAME"], null, ["Fritz"]);
-        
-        var actual1 = db.cell("select FIRSTNAME from SQL_LIB_TEST_TABLE where SQL_LIB_TEST_TABLE.TESTID = 'TEST-7'")
-        var actual2 = db.cell("select FIRSTNAME from SQL_LIB_TEST_TABLE where SQL_LIB_TEST_TABLE.TESTID = 'TEST-8'")
-        
-        pTester.assert("Fritz", actual1, "TEST-7 should have Firstname Fritz");        
-        pTester.assert("Fritz", actual2, "TEST-8 should have Firstname Fritz");
-    }],
-
-    ["update should update NO data from a table if the builder has no condition and pExecuteOnlyIfConditionExists is true", function(pTester)
-    {
-        db.deleteData("SQL_LIB_TEST_TABLE", "TESTID in ('TEST-7', 'TEST-8')")        
-        db.insertData("SQL_LIB_TEST_TABLE", ["TESTID", "FIRSTNAME", "LASTNAME"], null, ["TEST-7", "Ludwig", "Fischer"]);
-        db.insertData("SQL_LIB_TEST_TABLE", ["TESTID", "FIRSTNAME", "LASTNAME"], null, ["TEST-8", "Franz", "Fischer"]);
-        
-        var builder = new SqlBuilder()
-                            .from("SQL_LIB_TEST_TABLE")
-                            
-        builder.updateData(true, undefined, ["FIRSTNAME"], null, ["Fritz"]);
-        
-        var actual1 = db.cell("select FIRSTNAME from SQL_LIB_TEST_TABLE where SQL_LIB_TEST_TABLE.TESTID = 'TEST-7'")
-        var actual2 = db.cell("select FIRSTNAME from SQL_LIB_TEST_TABLE where SQL_LIB_TEST_TABLE.TESTID = 'TEST-8'")
-        
-        pTester.assert("Ludwig", actual1, "TEST-7 should have Firstname Ludwig");        
-        pTester.assert("Franz", actual2, "TEST-8 should have Firstname Franz");
-    }]
-], function preAll() 
-{
-    // remove data which may exist if previous test-run failed and postAll was not executed
-    cleanWrapperTests()
-    
-    // add table for save testing of deletes
-    db.runStatement("create table SQL_LIB_TEST_TABLE (TESTID varchar(36), FIRSTNAME varchar(100), LASTNAME varchar(100))");
-    
-    // add test persons
-    db.insertData("PERSON", ["PERSONID", "FIRSTNAME", "LASTNAME", "USER_NEW", "DATE_NEW"], null, ["TEST-5", "Franz", "Müller", "testuser", vars.get("$sys.date")])
-    db.insertData("PERSON", ["PERSONID", "FIRSTNAME", "LASTNAME", "USER_NEW", "DATE_NEW"], null, ["TEST-6", "Marco", "Polo", "testuser", vars.get("$sys.date")])
-}, undefined, undefined, function postAll()
-{
-    cleanWrapperTests()
-})
-
-var mandatoryErrorTests = new TestSuite([
-// and
-    ["and without parameter should error", function(pTester)
-    {
-        new SqlBuilder().where().or();
-    }, SqlBuilder._ERROR_NO_PARAMETER_PROVIDED()],
-
-    ["and with null as value should error", function(pTester)
-    {
-        new SqlBuilder().where().or("PERSON.FIRSTNAME", null);
-    }, SqlBuilder._ERROR_VALUE_IS_MANDATORY()],
-
-    ["and with undefined as value should error", function(pTester)
-    {
-        new SqlBuilder().where().or("PERSON.FIRSTNAME", undefined);
-    }, SqlBuilder._ERROR_VALUE_IS_MANDATORY()],
-
-    ["and with a jdito-var containing null should error", function(pTester)
-    {
-        vars.set("$global.TestingVarNull", null);
-        
-        new SqlBuilder().where().or("PERSON.FIRSTNAME", "$global.TestingVarNull");
-    }, SqlBuilder._ERROR_VALUE_IS_MANDATORY_JDITO_VAR()],
-
-    ["and with an empty sql-builder as subquery should error", function(pTester)
-    {        
-        new SqlBuilder().where().or("PERSON.FIRSTNAME", new SqlBuilder());
-    }, SqlBuilder._ERROR_VALUE_IS_MANDATORY()],
-
-    ["and with an empty prepared statement as subquery should error", function(pTester)
-    {        
-        new SqlBuilder().where().or("PERSON.FIRSTNAME", ["", []]);
-    }, SqlBuilder._ERROR_VALUE_IS_MANDATORY()],
-
-
-// or
-    ["or without parameter should error", function(pTester)
-    {
-        new SqlBuilder().where().or();
-    }, SqlBuilder._ERROR_NO_PARAMETER_PROVIDED()],
-
-    ["or with null as value should error", function(pTester)
-    {
-        new SqlBuilder().where().or("PERSON.FIRSTNAME", null);
-    }, SqlBuilder._ERROR_VALUE_IS_MANDATORY()],
-
-    ["or with undefined as value should error", function(pTester)
-    {
-        new SqlBuilder().where().or("PERSON.FIRSTNAME", undefined);
-    }, SqlBuilder._ERROR_VALUE_IS_MANDATORY()],
-
-    ["or with a jdito-var containing null should error", function(pTester)
-    {
-        vars.set("$global.TestingVarNull", null);
-        
-        new SqlBuilder().where().or("PERSON.FIRSTNAME", "$global.TestingVarNull");
-    }, SqlBuilder._ERROR_VALUE_IS_MANDATORY_JDITO_VAR()],
-
-    ["or with an empty sql-builder as subquery should error", function(pTester)
-    {        
-        new SqlBuilder().where().or("PERSON.FIRSTNAME", new SqlBuilder());
-    }, SqlBuilder._ERROR_VALUE_IS_MANDATORY()],
-
-    ["or with an empty prepared statement as subquery should error", function(pTester)
-    {        
-        new SqlBuilder().where().or("PERSON.FIRSTNAME", ["", []]);
-    }, SqlBuilder._ERROR_VALUE_IS_MANDATORY()],
-]);
-
-var inStatementTests = new TestSuite([
-    ["simple and in", function(pTester)
-    {
-        var actual = new SqlBuilder()
-                            .where("PERSON.LASTNAME", ["Franz", "Fritz"], SqlBuilder.IN()) // Note: you can use SqlBuilder.IN(), SqlBuilder.NOT_IN(), "# in ?", etc. as 3rd parameter
-                            .or("PERSON.LASTNAME", ["Peter", "Mayer"], SqlBuilder.IN());
-                            
-        pTester.assert(" ( PERSON.LASTNAME in  (?, ?)  )  or  ( PERSON.LASTNAME in  (?, ?)  ) ", actual._where._sqlStorage, "prepared sql");
-        pTester.assert(4, actual._where.preparedValues.length, "number of params");
-    }],
-
-    ["simple and not in", function(pTester)
-    {
-        var actual = new SqlBuilder()
-                            .where("PERSON.LASTNAME", ["Franz", "Fritz"], "# not in ?"); // Note: you can use SqlBuilder.IN(), SqlBuilder.NOT_IN(), "# in ?", etc. as 3rd parameter
-                            
-        pTester.assert(" ( PERSON.LASTNAME not in  (?, ?)  ) ", actual._where._sqlStorage, "prepared sql");
-        pTester.assert(2, actual._where.preparedValues.length, "number of params");
-    }],
-
-    ["in with subquery", function(pTester)
-    {
-        var actual = new SqlBuilder()
-                        .where("PERSON.FIRSTNAME", new SqlBuilder()
-                                                        .select("PERSON.FIRSTNAME")
-                                                        .from("PERSON")
-                                                        .where("PERSON.LASTNAME", "Fritz")
-                                                , "# in ?"); // Note: you can use SqlBuilder.IN() instead of "# in ?"
-                            
-        pTester.assert("PERSON.FIRSTNAME in  ( select PERSON.FIRSTNAME from PERSON where PERSON.LASTNAME = ? ) ", actual._where._sqlStorage, "prepared sql");
-        pTester.assert(1, actual._where.preparedValues.length, "number of params");
-    }],
-
-    ["in with prepared statement-array", function(pTester)
-    {
-        var actual = new SqlBuilder()
-                        .where("PERSON.FIRSTNAME", ["select PERSON.FIRSTNAME from PERSON where PERSON.LASTNAME = ?", [["Fritz", SQLTYPES.VARCHAR]]]
-                                                , "# in ?"); // Note: you can use SqlBuilder.IN() instead of "# in ?"
-                            
-        pTester.assert("PERSON.FIRSTNAME in  ( select PERSON.FIRSTNAME from PERSON where PERSON.LASTNAME = ? ) ", actual._where._sqlStorage, "prepared sql");
-        pTester.assert(1, actual._where.preparedValues.length, "number of params");
-    }],
-
-    ["andIfSet should ignore empty array", function(pTester)
-    {
-        var actual = new SqlBuilder()
-                            .whereIfSet("PERSON.LASTNAME", []);
-                            
-        pTester.assert("", actual._where._sqlStorage, "prepared sql should be empty");
-        pTester.assert(0, actual._where.preparedValues.length, "number of params should be 0");
-    }],
-
-    ["and should error on an empty array", function(pTester)
-    {
-        new SqlBuilder()
-                .where("PERSON.LASTNAME", []);
-    }, SqlBuilder._ERROR_VALUE_IS_MANDATORY()]
-]);
-
-var testConstantFunctions = new TestSuite([
-    ["SqlBuilder.IN()", function(pTester)
-    {
-        pTester.assert("# in ?", SqlBuilder.IN());
-    }],
-    
-    ["SqlBuilder.NOT_IN()", function(pTester)
-    {
-        pTester.assert("# not in ?", SqlBuilder.NOT_IN());
-    }],
-
-    ["SqlBuilder.EXISTS()", function(pTester)
-    {
-        pTester.assert("exists ?", SqlBuilder.EXISTS());
-    }]
-]);
-
-var selectTests = new TestSuite([
-    ["a sql-builder in a fields-array is translated to sql correctly", function(pTester)
-    {
-        var countSubQuery = newSelect("count(*)")
-                                .from("AB_ATTRIBUTEUSAGE")
-                                .where("AB_ATTRIBUTEUSAGE.OBJECT_TYPE", "myType")
-                                .and("AB_ATTRIBUTEUSAGE.AB_ATTRIBUTE_ID = AB_ATTRIBUTE.AB_ATTRIBUTEID");
-    
-        var actual = new SqlBuilder()
-            .select(["AB_ATTRIBUTEID", "AB_ATTRIBUTEUSAGEID", countSubQuery])
-            .from("AB_ATTRIBUTE")
-                        
-        pTester.assert("select AB_ATTRIBUTEID, AB_ATTRIBUTEUSAGEID, (select count(*) from AB_ATTRIBUTEUSAGE where AB_ATTRIBUTEUSAGE.OBJECT_TYPE = ? and AB_ATTRIBUTEUSAGE.AB_ATTRIBUTE_ID = AB_ATTRIBUTE.AB_ATTRIBUTEID)", actual._select._sqlStorage, "prepared select-sql");
-        pTester.assert(1, actual._select.preparedValues.length, "number of params");
-    }],
-
-    ["a sql-builder in from is used as subselect", function(pTester)
-    {
-        var subQuery = newSelect("FIRSTNAME")
-                                .from("PERSON")
-                                .where("PERSON.LASTNAME", "Meier")
-    
-        var actual = new SqlBuilder()
-            .select("*")
-            .from(subQuery)
-            
-        pTester.assert("from (select FIRSTNAME from PERSON where PERSON.LASTNAME = ?)", actual._from._sqlStorage, "prepared select-sql");
-        pTester.assert(1, actual._from.preparedValues.length, "number of params");
-    }]
-]);
-
-var joinTests = new TestSuite([
-    ["SqlBuilder as on-condition should only add the conditon of the builder", function(pTester)
-    {
-        var subQuery = newSelect("NAME")
-                                .from("ORGANISATION")
-                                .where("ORGANISATION.NAME", "Adito")
-    
-        var actual = new SqlBuilder()
-            .select("*")
-            .from("PERSON")
-            .join("ORGANISATION", subQuery)
-            
-        pTester.assert("join ORGANISATION on ORGANISATION.NAME = ?", actual._joins[0]._sqlStorage, "prepared select-sql");
-        pTester.assert(1, actual._joins[0].preparedValues.length, "number of params");
-    }],
-
-    ["SqlBuilder as table for join is added as subselect", function(pTester)
-    {
-        var subQuery = newSelect("NAME")
-                                .from("ORGANISATION")
-                                .where("ORGANISATION.NAME", "Adito")
-    
-        var actual = new SqlBuilder()
-            .select("*")
-            .from("PERSON")
-            .join(subQuery, "orgname.NAME = TABLE2.NAME", "orgname")
-            
-        pTester.assert("join (select NAME from ORGANISATION where ORGANISATION.NAME = ?) orgname on orgname.NAME = TABLE2.NAME", actual._joins[0]._sqlStorage, "prepared select-sql");
-        pTester.assert(1, actual._joins[0].preparedValues.length, "number of params");
-    }],
-
-    ["just use a string also containing a condition as join without additional condition", function(pTester)
-    {
-        var actual = new SqlBuilder()
-            .select("*")
-            .from("PERSON")
-            .join("TABLE1 on TABLE1.NAME = TABLE2.NAME")
-            
-        pTester.assert("join TABLE1 on TABLE1.NAME = TABLE2.NAME", actual._joins[0]._sqlStorage, "prepared select-sql");
-        pTester.assert(0, actual._joins[0].preparedValues.length, "number of params");
-    }]
-]);
-
-var subqueryAsFieldTests = new TestSuite([
-    ["Test if a Subselect as field works if pValue is provided. This should be added as subselect.", function(pTester)
-    {
-        var subQuery = newSelect("NAME")
-                                .from("ORGANISATION")
-                                .where("ORGANISATION.ORGANISATIONID = CONTACT.ORGANISATION_ID")
-                                .and("PERSON.FIRSTNAME", "val1") // test if the value is added at the correct place
-    
-        var actual = new SqlBuilder().where(subQuery, "val2", "# = ?", SQLTYPES.VARCHAR)
-                                     .and("PERSON.FIRSTNAME", "val3");
-                
-            
-        pTester.assert(" ( ( select NAME from ORGANISATION where ORGANISATION.ORGANISATIONID = CONTACT.ORGANISATION_ID and PERSON.FIRSTNAME = ? ) = ? )  and PERSON.FIRSTNAME = ?", actual._where._sqlStorage, "prepared select-sql");
-        pTester.assert(3, actual._where.preparedValues.length, "number of params");
-        pTester.assert("val1", actual._where.preparedValues[0][0], "param 1 is correct value");
-        pTester.assert("val2", actual._where.preparedValues[1][0], "param 2 is correct value");
-        pTester.assert("val3", actual._where.preparedValues[2][0], "param 3 is correct value");
-    }],
-
-    ["Test if a Subselect as field should error if no SQLTYPE is provided.", function(pTester)
-    {
-        var subQuery = newSelect("NAME")
-                                .from("ORGANISATION")
-                                .where("ORGANISATION.ORGANISATIONID = CONTACT.ORGANISATION_ID")
-                                .and("PERSON.FIRSTNAME", "val1") // test if the value is added at the correct place
-        new SqlBuilder().where(subQuery, "val2", "# = ?");
-    }, SqlBuilder._ERROR_SUBSELECT_AS_FIELD_NO_FIELD_TYPE()],
-
-    ["Test if a Subselect as field should error if it is not a full select.", function(pTester)
-    {
-        var subQuery = newSelect("NAME")
-                                .where("ORGANISATION.ORGANISATIONID = CONTACT.ORGANISATION_ID")
-                                .and("PERSON.FIRSTNAME", "val1") // test if the value is added at the correct place
-    
-        new SqlBuilder().where(subQuery, "val2", "# = ?", SQLTYPES.VARCHAR);
-    }, SqlBuilder._ERROR_SUBSELECT_AS_FIELD_NOT_COMPLETE()]
-]);
-
-var conditionFormatTests = new TestSuite([
-    ["pCondition should not fail if # an ? exist in correct order", function(pTester)
-    {
-        new SqlBuilder().where("PERSON.FIRSTNAME", "val1", "# = ?")
-                        .and("PERSON.FIRSTNAME", "val1", "asdf # fdsa=asdf ?fdas")
-    }],
-
-    ["pCondition should not fail if # an ? exist in correct order and there are additional, escaped # and ?", function(pTester)
-    {
-        new SqlBuilder().where("PERSON.FIRSTNAME", "val1", "\\? # \\#= ?");
-    }],
-
-    ["pCondition should not fail if only ? exists", function(pTester)
-    {
-        new SqlBuilder().where("PERSON.FIRSTNAME", "val1", "?")
-    }],
-
-    ["pCondition should fail if more than one ? exists", function(pTester)
-    {
-        new SqlBuilder().where("PERSON.FIRSTNAME", "val1", "? test ?")
-    }, SqlBuilder._ERROR_CONDITION_WRONG_FORMAT()],
-
-    ["pCondition should fail if more than one # exists", function(pTester)
-    {
-        new SqlBuilder().where("PERSON.FIRSTNAME", "val1", "# test #")
-    }, SqlBuilder._ERROR_CONDITION_WRONG_FORMAT()],
-
-    ["pCondition should fail if # and ? are in wrong order", function(pTester)
-    {
-        new SqlBuilder().where("PERSON.FIRSTNAME", "val1", "? = #")
-    }, SqlBuilder._ERROR_CONDITION_WRONG_FORMAT()]
-]);
-
-var subqueryAliasTests = new TestSuite([
-    ["subselectAlias should be added for subquery in .select", function(pTester)
-    {
-        var subQuery = newSelect("NAME")
-                                .from("ORGANISATION")
-                                .where("ORGANISATION.NAME", "Adito")
-                                .subselectAlias("testAlias")
-    
-        var actual = new SqlBuilder()
-            .select([subQuery, "FIRSTNAME"])
-            .from("PERSON")
-            
-        pTester.assert("select (select NAME from ORGANISATION where ORGANISATION.NAME = ?) testAlias, FIRSTNAME", actual._select._sqlStorage, "prepared select-sql");
-        pTester.assert(1, actual._select.preparedValues.length, "number of params");
-    }],
-
-    ["subselectAlias should be added for subquery in .from", function(pTester)
-    {
-        var subQuery = newSelect("NAME")
-                                .from("ORGANISATION")
-                                .where("ORGANISATION.NAME", "Adito")
-                                .subselectAlias("testAlias")
-    
-        var actual = new SqlBuilder()
-            .from(subQuery)
-            
-        pTester.assert("from (select NAME from ORGANISATION where ORGANISATION.NAME = ?) testAlias", actual._from._sqlStorage, "prepared select-sql");
-        pTester.assert(1, actual._from.preparedValues.length, "number of params");
-    }],
-
-    ["subselectAlias should be overruled by the param in in .from", function(pTester)
-    {
-        var subQuery = newSelect("NAME")
-                                .from("ORGANISATION")
-                                .where("ORGANISATION.NAME", "Adito")
-                                .subselectAlias("testAlias")
-    
-        var actual = new SqlBuilder()
-            .from(subQuery, "overwriteAlias")
-            
-        pTester.assert("from (select NAME from ORGANISATION where ORGANISATION.NAME = ?) overwriteAlias", actual._from._sqlStorage, "prepared select-sql");
-        pTester.assert(1, actual._from.preparedValues.length, "number of params");
-    }],
-
-    ["subselectAlias should be added for subquery in .join", function(pTester)
-    {
-        var subQuery = newSelect("NAME, ORGANISATIONID")
-                                .from("ORGANISATION")
-                                .where("ORGANISATION.NAME", "Adito")
-                                .subselectAlias("testAlias")
-    
-        var actual = new SqlBuilder()
-            .from("CONTACT")
-            .join(subQuery, "testAlias.ORGANISATIONID = ORGANISATION_ID")
-            .join(subQuery, "testAlias.ORGANISATIONID = ORGANISATION_ID", "overwriteAlias")
-            
-        pTester.assert("join (select NAME, ORGANISATIONID from ORGANISATION where ORGANISATION.NAME = ?) testAlias on testAlias.ORGANISATIONID = ORGANISATION_ID", actual._joins[0]._sqlStorage, "prepared select-sql join 1");
-        pTester.assert(1, actual._joins[0].preparedValues.length, "number of params join 1");
-        
-        pTester.assert("join (select NAME, ORGANISATIONID from ORGANISATION where ORGANISATION.NAME = ?) overwriteAlias on testAlias.ORGANISATIONID = ORGANISATION_ID", actual._joins[1]._sqlStorage, "prepared select-sql join 2");
-        pTester.assert(1, actual._joins[1].preparedValues.length, "number of params join 2");
-    }]
-])
-
-var tester = new Tester("Test SqlBuilder");
-tester.test(newSelectTests);
-tester.test(validAndUsageTests);
-tester.test(validOrUsageTests);
-tester.test(combinedAndOrTests);
-tester.test(ifSetTests);
-tester.test(dbWrapperTests);
-tester.test(mandatoryErrorTests);
-tester.test(inStatementTests);
-tester.test(testConstantFunctions);
-tester.test(selectTests);
-tester.test(joinTests);
-tester.test(subqueryAsFieldTests);
-tester.test(conditionFormatTests);
-tester.test(subqueryAliasTests);
-
-logging.log("-------------------------");
-tester.printResults();
diff --git a/process/SqlMaskingUtils_test/SqlMaskingUtils_test.aod b/process/SqlMaskingUtils_test/SqlMaskingUtils_test.aod
new file mode 100644
index 00000000000..8636a3707b1
--- /dev/null
+++ b/process/SqlMaskingUtils_test/SqlMaskingUtils_test.aod
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+  <name>SqlMaskingUtils_test</name>
+  <title>[TEST] Sql_lib - SqlMaskingUtils</title>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <icon>VAADIN:CHECK_CIRCLE</icon>
+  <process>%aditoprj%/process/SqlMaskingUtils_test/process.js</process>
+  <alias>Data_alias</alias>
+  <variants>
+    <element>EXECUTABLE</element>
+  </variants>
+</process>
diff --git a/process/SqlMaskingUtils_test/process.js b/process/SqlMaskingUtils_test/process.js
new file mode 100644
index 00000000000..533a1b32e94
--- /dev/null
+++ b/process/SqlMaskingUtils_test/process.js
@@ -0,0 +1,158 @@
+import("system.result");
+import("system.db");
+import("Sql_lib");
+import("UnitTest_lib");
+
+function _createDummyMaskingUtil(pDbType)
+{
+    var currentAlias = db.getCurrentAlias();
+    if (!currentAlias)
+        throw new Error("alias required for test is not set");
+    var currentAliasType = db.getDatabaseType(currentAlias);
+    if (!currentAliasType)
+        throw new Error("alias type required for test is not set");
+    var createdObject = new SqlMaskingUtils(currentAlias);
+    createdObject.dbType = pDbType;
+    return createdObject;
+}
+
+var constructorTest = new TestSuite("SqlMaskingUtils.constructor", [
+    new Test("constructor sets correct specified alias",
+        function(pTester)
+        {
+            var currentAlias = db.getCurrentAlias();
+            if (!currentAlias)
+                throw new Error("alias required for test is not set");
+            var createdObject = new SqlMaskingUtils(currentAlias);
+            pTester.expectThat(createdObject.alias).equals(currentAlias).assert();
+        }
+        ),
+    new Test("constructor sets correct default alias",
+        function(pTester)
+        {
+            var currentAlias = db.getCurrentAlias();
+            if (!currentAlias)
+                throw new Error("alias required for test is not set");
+            var createdObject = new SqlMaskingUtils();
+            pTester.expectThat(createdObject.alias).equals(currentAlias).assert();
+        }
+        ),
+    new Test("constructor sets correct alias type",
+        function(pTester)
+        {
+            var currentAlias = db.getCurrentAlias();
+            if (!currentAlias)
+                throw new Error("alias required for test is not set");
+            var currentAliasType = db.getDatabaseType(currentAlias);
+            if (!currentAliasType)
+                throw new Error("alias type required for test is not set");
+            var createdObject = new SqlMaskingUtils(currentAlias);
+            pTester.expectThat(createdObject.dbType).equals(currentAliasType).assert();
+        }
+        ),
+    new Test("overwrite constructors dbType with derby",
+     function(pTester)
+     {
+        var res = _createDummyMaskingUtil(db.DBTYPE_DERBY10);
+        pTester.expectThat(res.dbType).equals(db.DBTYPE_DERBY10).assert();
+        pTester.expectThat(res.alias).isNull().assert();
+     }
+     ),
+    new Test("overwrite constructors dbType with mariaDB",
+        function(pTester)
+        {
+            var res = _createDummyMaskingUtil(db.DBTYPE_MARIADB10);
+            pTester.expectThat(res.dbType).equals(db.DBTYPE_MARIADB10).assert();
+            pTester.expectThat(res.alias).isNull().assert();
+        }
+        ),
+    new Test("overwrite constructors dbType with mySql",
+        function(pTester)
+        {
+            var res = _createDummyMaskingUtil(db.DBTYPE_MYSQL4);
+            pTester.expectThat(res.dbType).equals(db.DBTYPE_MYSQL4).assert();
+            pTester.expectThat(res.alias).isNull().assert();
+        }
+        ),
+    new Test("overwrite constructors dbType with oracle-cluster",
+        function(pTester)
+        {
+            var res = _createDummyMaskingUtil(db.DBTYPE_ORACLE10_CLUSTER);
+            pTester.expectThat(res.dbType).equals(db.DBTYPE_ORACLE10_CLUSTER).assert();
+            pTester.expectThat(res.alias).isNull().assert();
+        }
+        ),
+    new Test("overwrite constructors dbType with oracle-oci",
+        function(pTester)
+        {
+            var res = _createDummyMaskingUtil(db.DBTYPE_ORACLE10_OCI);
+            pTester.expectThat(res.dbType).equals(db.DBTYPE_ORACLE10_OCI).assert();
+            pTester.expectThat(res.alias).isNull().assert();
+        }
+        ),
+    new Test("overwrite constructors dbType with oracle-thin",
+        function(pTester)
+        {
+            var res = _createDummyMaskingUtil(db.DBTYPE_ORACLE10_THIN);
+            pTester.expectThat(res.dbType).equals(db.DBTYPE_ORACLE10_THIN).assert();
+            pTester.expectThat(res.alias).isNull().assert();
+        }
+        ),
+    new Test("overwrite constructors dbType with postgresql",
+        function(pTester)
+        {
+            var res = _createDummyMaskingUtil(db.DBTYPE_POSTGRESQL8);
+            pTester.expectThat(res.dbType).equals(db.DBTYPE_POSTGRESQL8).assert();
+            pTester.expectThat(res.alias).isNull().assert();
+        }
+        ),
+    new Test("overwrite constructors dbType with ms sql",
+        function(pTester)
+        {
+            var res = _createDummyMaskingUtil(db.DBTYPE_SQLSERVER2000);
+            pTester.expectThat(res.dbType).equals(db.DBTYPE_SQLSERVER2000).assert();
+            pTester.expectThat(res.alias).isNull().assert();
+        }
+        )
+    ]);
+
+
+var getConcatSymbolTest = new TestSuite("SqlMaskingUtils.getConcatSymbol", [
+    new Test("getConcatSymbol returns a non empty string",
+        function(pTester)
+        {
+            var maskingHelper = _createDummyMaskingUtil(db.DBTYPE_SQLSERVER2000);
+            var res = maskingHelper.getConcatSymbol();
+            pTester.expectThat(res).not().isNull().assert();
+            pTester.expectThat(res).not().isUndefined().assert();
+            pTester.expectThat(res).isString().assert();
+            pTester.expectThat(res.length).isInteger().assert();
+            pTester.expectThat(res.length).isGreater(0).assert();
+        }
+        ),
+    new Test("+ for MS SQL",
+        function(pTester)
+        {
+            var maskingHelper = _createDummyMaskingUtil(db.DBTYPE_SQLSERVER2000);
+            var res = maskingHelper.getConcatSymbol();
+            pTester.expectThat(res.trim()).equals("+").assert();
+        }
+        ),
+    new Test("|| for Oracle",
+        function(pTester)
+        {
+            var maskingHelper = _createDummyMaskingUtil(db.DBTYPE_ORACLE10_THIN);
+            var res = maskingHelper.getConcatSymbol();
+            pTester.expectThat(res.trim()).equals("||").assert();
+        }
+        )
+    ]);
+
+var tester = new Tester("Test SqlMaskingUtils");
+tester.initCoverage(SqlMaskingUtils);
+tester.test(constructorTest);
+tester.test(getConcatSymbolTest);
+//TODO: add full test coverage
+tester.summary();
+
+result.object(tester.getResults());
\ No newline at end of file
diff --git a/process/Sql_lib/documentation.adoc b/process/Sql_lib/documentation.adoc
index 8b903c2155e..417d8aa237b 100644
--- a/process/Sql_lib/documentation.adoc
+++ b/process/Sql_lib/documentation.adoc
@@ -17,10 +17,10 @@ include::_default_attributes_EN.adoc[]
 
 This document describes the functionality and the usage of the SqlBuilder, which is included in the library *Sql_lib* of the ADITO xRM project (see "Projects" window, under process > libraries). The documentation may not contain all features of the SqlBuilder. It is supplemental to the documentation you find in the code itself: A usage will often be possible in an intuitive way, so just try coding using code completion and JSDoc, where all parameters are documented.
 
-You may also take a look at the library *SqlLib_tests* (also under process > libraries), as it contains many possible ways to use the SqlBuilder.
+You may also take a look at the library *Sql_test* (also under process > libraries), as it contains many possible ways to use the SqlBuilder.
 
 [NOTE]
-The tests included in the library SqlLib_tests use the UnitTest_lib for unit testing. You can use this functionality also in other contexts, according to your requirements.
+The tests included in the library Sql_test use the UnitTest_lib for unit testing. You can use this functionality also in other contexts, according to your requirements.
 
 == Benefits
 
diff --git a/process/SqlLib_tests/SqlLib_tests.aod b/process/Terminal_lib/Terminal_lib.aod
similarity index 67%
rename from process/SqlLib_tests/SqlLib_tests.aod
rename to process/Terminal_lib/Terminal_lib.aod
index 9f2866f8f91..9fa0811425e 100644
--- a/process/SqlLib_tests/SqlLib_tests.aod
+++ b/process/Terminal_lib/Terminal_lib.aod
@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
-  <name>SqlLib_tests</name>
+  <name>Terminal_lib</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
-  <process>%aditoprj%/process/SqlLib_tests/process.js</process>
-  <alias>Data_alias</alias>
+  <documentation>%aditoprj%/process/Terminal_lib/documentation.adoc</documentation>
+  <process>%aditoprj%/process/Terminal_lib/process.js</process>
   <variants>
     <element>LIBRARY</element>
   </variants>
diff --git a/process/Terminal_lib/process.js b/process/Terminal_lib/process.js
new file mode 100644
index 00000000000..13a0188495d
--- /dev/null
+++ b/process/Terminal_lib/process.js
@@ -0,0 +1,342 @@
+import("system.logging");
+import("Util_lib");
+
+
+/**
+ * This library gives you helpful colored output on the terminal
+ * You can use the predefined helper methods or use your own color- and format combinations
+ *
+ * @example
+ * var t = new Terminal();
+ * logging.log(t.success("It works!"));
+ * logging.log(t.color(t.fg.green).background(t.bg.red).output("I would never use green text on red background..."));
+ *
+ * @see https://en.wikipedia.org/wiki/ANSI_escape_code
+ * @class
+ */
+function Terminal()
+{
+    this.mod = {
+        reset : 0
+    };
+
+    this.fg = {
+        reset         : 39,
+        black         : 30,
+        red           : 31,
+        green         : 32,
+        yellow        : 33,
+        blue          : 34,
+        magenta       : 35,
+        cyan          : 36,
+        white         : 37,
+        brightBlack   : 90,
+        brightRed     : 91,
+        brightGreen   : 92,
+        brightYellow  : 93,
+        brightBlue    : 94,
+        brightMagenta : 95,
+        brightCyan    : 96,
+        brightWhite   : 97
+    };
+
+    this.bg = {
+        reset         : 49,
+        black         : 40,
+        red           : 41,
+        green         : 42,
+        yellow        : 43,
+        blue          : 44,
+        magenta       : 45,
+        cyan          : 46,
+        white         : 47,
+        brightBlack   : 100,
+        brightRed     : 101,
+        brightGreen   : 102,
+        brightYellow  : 103,
+        brightBlue    : 104,
+        brightMagenta : 105,
+        brightCyan    : 106,
+        brightWhite   : 107
+    };
+
+    this.formats = {
+        weightBold      : 1,
+        weightLight     : 2,
+        weightOff       : 22,
+        italic          : 3,
+        italicOff       : 23,
+        underline       : 4,
+        underlineDouble : 21,
+        underlineOff    : 24,
+        strike          : 9,
+        strikeOff       : 29
+    };
+
+    this._defaultConfig = {
+        colorText: this.fg.reset,
+        colorBackground: this.bg.reset,
+        bold: this.formats.weightOff,
+        italic: this.formats.italicOff,
+        underline: this.formats.underlineOff,
+        strike: this.formats.strikeOff
+    };
+
+    this.outputConfig = Utils.clone(this._defaultConfig);
+}
+
+
+/**
+ * Reset the output config by cloning and setting the default
+ *
+ * @return {void}
+ */
+Terminal.prototype._resetConfig = function ()
+{
+    this.outputConfig = Utils.clone(this._defaultConfig);
+}
+
+/**
+ * Set or reset the text color
+ *
+ * @param {int} pValue
+ * @return {Terminal}
+ */
+Terminal.prototype.color = function (pValue)
+{
+    this.outputConfig.colorText = this._contains(this.fg, pValue) ? pValue : this.fg.reset;
+    
+    return this;
+}
+
+/**
+ * Set or reset the background color
+ *
+ * @param {int} pValue
+ * @return {Terminal}
+ */
+Terminal.prototype.background = function (pValue)
+{
+    this.outputConfig.colorBackground = this._contains(this.bg, pValue) ? pValue : this.bg.reset;
+    
+    return this;
+}
+
+/**
+ * Set, unset or add a formatting to the output config
+ *
+ * @param {int} pValue
+ * @return {Terminal}
+ */
+Terminal.prototype.format = function (pValue)
+{    
+    var allowedWeightValues = [this.formats.weightBold, this.formats.weightLight, this.formats.weightOff];
+    this.outputConfig.bold = this._contains(allowedWeightValues, pValue) ? pValue : this.formats.weightOff;
+
+    var allowedItalicValues = [this.formats.italic, this.formats.italicOff];
+    this.outputConfig.italic = this._contains(allowedItalicValues, pValue) ? pValue : this.formats.italicOff;
+
+    var allowedUnderlineValues = [this.formats.underline, this.formats.underlineDouble, this.formats.underlineOff];
+    this.outputConfig.underline = this._contains(allowedUnderlineValues, pValue) ? pValue : this.formats.underlineOff;
+
+    var allowedStrikeValues = [this.formats.strike, this.formats.strikeOff];
+    this.outputConfig.strike = this._contains(allowedStrikeValues, pValue) ? pValue : this.formats.strikeOff;
+    
+    return this;
+}
+
+/**
+ * Returns a string wrapped in escape sequences according to previous formatting instructions
+ * Must be called after `.color()`, `.background()` and/or `.format()`.
+ *
+ * @param {String} pString the string to format
+ * @return {String}
+ */
+Terminal.prototype.output = function (pString)
+{
+    var output = "";
+    var seqValues = [];
+    
+    Object.keys(this.outputConfig).forEach(function(pKey) {
+        seqValues.push(this.outputConfig[pKey]);
+    }, this);
+    
+    output += this._generateSequence(seqValues);
+    output += pString;
+    output += this._generateSequence(this.mod.reset);
+    
+    this._resetConfig();
+    return output;
+}
+
+/**
+ * Returns the given string formatted as light-colored text
+ *
+ * @param {String} pString the string to format
+ * @return {String}
+ */
+Terminal.prototype.debug = function (pString)
+{
+    return this.color(this.fg.white).output(pString);
+}
+
+/**
+ * Returns the given string formatted as bold black text on green background
+ *
+ * @param {String} pString the string to format
+ * @return {String}
+ */
+Terminal.prototype.successBlock = function (pString)
+{
+    return this.color(this.fg.brightBlack).background(this.bg.green).format(this.formats.weightBold).output(pString);
+}
+
+/**
+ * Returns the given string formatted as bold green text
+ *
+ * @param {String} pString the string to format
+ * @return {String}
+ */
+Terminal.prototype.success = function (pString)
+{
+    return this.color(this.fg.green).format(this.formats.weightBold).output(pString);
+}
+
+/**
+ * Returns the given string formatted as bold black text on green background
+ *
+ * @param {String} pString the string to format
+ * @return {String}
+ */
+Terminal.prototype.successBlock = function (pString)
+{
+    return this.color(this.fg.brightBlack).background(this.bg.green).format(this.formats.weightBold).output(" " + pString + " ");
+}
+
+/**
+ * Returns the given string formatted as bold blue text
+ *
+ * @param {String} pString the string to format
+ * @return {String}
+ */
+Terminal.prototype.info = function (pString)
+{
+    return this.color(this.fg.blue).format(this.formats.weightBold).output(pString);
+}
+
+/**
+ * Returns the given string formatted as bold white text on blue background
+ *
+ * @param {String} pString the string to format
+ * @return {String}
+ */
+Terminal.prototype.infoBlock = function (pString)
+{
+    return this.color(this.fg.brightWhite).background(this.bg.blue).format(this.formats.weightBold).output(" " + pString + " ");
+}
+
+/**
+ * Returns the given string formatted as bold magenta text
+ *
+ * @param {String} pString the string to format
+ * @return {String}
+ */
+Terminal.prototype.important = function (pString)
+{
+    return this.color(this.fg.magenta).format(this.formats.weightBold).output(pString);
+}
+
+/**
+ * Returns the given string formatted as bold white text on magenta background
+ *
+ * @param {String} pString the string to format
+ * @return {String}
+ */
+Terminal.prototype.importantBlock = function (pString)
+{
+    return this.color(this.fg.brightWhite).background(this.bg.magenta).format(this.formats.weightBold).output(" " + pString + " ");
+}
+
+/**
+ * Returns the given string formatted as bold yellow text
+ *
+ * @param {String} pString the string to format
+ * @return {String}
+ */
+Terminal.prototype.warning = function (pString)
+{
+    return this.color(this.fg.yellow).format(this.formats.weightBold).output(pString);
+}
+
+/**
+ * Returns the given string formatted as bold black text on yellow background
+ *
+ * @param {String} pString the string to format
+ * @return {String}
+ */
+Terminal.prototype.warningBlock = function (pString)
+{
+    return this.color(this.fg.brightBlack).background(this.bg.yellow).format(this.formats.weightBold).output(" " + pString + " ");
+}
+
+/**
+ * Returns the given string formatted as bold red text
+ *
+ * @param {String} pString the string to format
+ * @return {String}
+ */
+Terminal.prototype.error = function (pString)
+{
+    return this.color(this.fg.red).format(this.formats.weightBold).output(pString);
+}
+
+/**
+ * Returns the given string formatted as bold white text on red background
+ *
+ * @param {String} pString the string to format
+ * @return {String}
+ */
+Terminal.prototype.errorBlock = function (pString)
+{
+    return this.color(this.fg.brightWhite).background(this.bg.red).format(this.formats.weightBold).output(" " + pString + " ");
+}
+
+/**
+ * Checks if a specific value is in a given array or object
+ *
+ * @param {(Array|Object)} pType
+ * @param {Any} pValue
+ * @return {Boolean}
+ */
+Terminal.prototype._contains = function (pType, pValue)
+{
+    var res = false;
+    
+    if(Array.isArray(pType)) {
+        res = pType.indexOf(pValue) !== -1;
+    } else {
+        Object.keys(pType).forEach(function(pKey) {
+            if(pType[pKey] === pValue) {
+                res = true;
+            }
+        }, this);
+    }
+
+    return res;
+}
+
+/**
+ * Generates and returns a terminal escape sequence
+ *
+ * @param {(int|int[])} pSequences A single or multiple escape sequence commands
+ */
+Terminal.prototype._generateSequence = function (pSequences)
+{
+    var seq = Array.isArray(pSequences) ? pSequences : [pSequences];
+    
+    seq = seq.filter(function(pElement) {
+        return Number.isInteger(parseFloat(pElement)) && isFinite(pElement);
+    });
+    
+    return "\033[" + seq.join(";") + "m";
+}
diff --git a/process/UnitTest_lib/UnitTest_lib.aod b/process/UnitTest_lib/UnitTest_lib.aod
index 225ac230384..a4499316765 100644
--- a/process/UnitTest_lib/UnitTest_lib.aod
+++ b/process/UnitTest_lib/UnitTest_lib.aod
@@ -2,6 +2,7 @@
 <process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
   <name>UnitTest_lib</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
+  <icon>VAADIN:CHECK_CIRCLE_O</icon>
   <process>%aditoprj%/process/UnitTest_lib/process.js</process>
   <alias>Data_alias</alias>
   <variants>
diff --git a/process/UnitTest_lib/process.js b/process/UnitTest_lib/process.js
index 0ce141d4828..382d37e0215 100644
--- a/process/UnitTest_lib/process.js
+++ b/process/UnitTest_lib/process.js
@@ -1,235 +1,1265 @@
 import("system.logging");
+import("Terminal_lib");
+import("Util_lib");
+
+/**
+ * @param {String} pName the name/description of the test
+ * @param {Function} pCallback the actual test callback to execute
+ * @param {Function} pDataProviderCallback an optional callback to deliver multiple datasets to the test
+ * @param {Boolean} pRerunOnError an optional flag indicating if a test should get rerun without try-catch if an error occurs (default: false)
+ *
+ * @class
+ */
+function Test(pName, pCallback, pDataProviderCallback, pRerunOnError)
+{
+    this.name = pName;
+    this.callback = pCallback;
+    this.dataProviderCallback = pDataProviderCallback || function() { return null; };
+    this.rerunOnError = !!pRerunOnError;
+}
 
 /**
  * A TestSuite combines several tests
- * @param {Array} pTests this is a n array of Tests in the following form:<br/>
- *                  [<br/>
- *                      ["Test description", function(pTester) <br/>
- *                          {<br/>
- *                              // the test which may use pTester.assert(...)<br/>
- *                          }, {Optional: an expected error}<br/>
- *                      ],<br/>
- *                      [...]<br/>
- *                  ]<br/>
+ *
+ * @param {String} pName name of the TestSuite
+ * @param {Array} pTests this is a n array of Tests
+ *
+ * @example
+ * var myTest = new TestSuite("MyObject.myTest", [
+ *     new Test("Test description",
+ *         function(pTester) {
+ *             var expectValue = 5;
+ *             var var actualValue = 20;
+ *             pTester.expectThat(actualValue).isGreater(expectValue).assert();
+ *         },
+ *     ),
+ *     new Test(...)
+ * ];
+
+ * @example
+ * // Using a DataProvider
+ * var myTest = new TestSuite("MyObject.myTest", [
+ *     new Test("Test description",
+ *         function(pTester, pDataProvider) {
+ *             var obj = new MyObject("Something");
+ *             var expectValue = pDataProvider[0];
+ *             var var actualValue = obj.getNumber();
+ *             pTester.expectThat(actualValue).isGreater(expectValue).assert();
+ *         },
+ *         function dataProvider() {
+ *             return [
+ *                 [0],
+ *                 [10],
+ *                 [100],
+ *             ];
+ *         },
+ *     ),
+ *     new Test(...)
+ * ];
+ *
  * @param {functionCallback} [pPreAll] a callback, called once before all tests
  * @param {functionCallback} [pPreTest] a callback, called once before each test
  * @param {functionCallback} [pPostTest] a callback, called once after each test
  * @param {functionCallback} [pPostAll] a callback, called once after all tests
- * 
+ *
+ * TODO: set callbacks via separate methods
+ *
  * @class
  */
-function TestSuite(pTests, pPreAll, pPreTest, pPostTest, pPostAll)
+function TestSuite(pName, pTests, pPreAll, pPreTest, pPostTest, pPostAll)
 {
+    this.name = pName;
     this.tests = pTests;
-    this.preAll = (pPreAll ? pPreAll : function() {});
-    this.preTest = (pPreTest ? pPreTest : function() {});
-    this.postTest = (pPostTest ? pPostTest : function() {});
-    this.postAll = (pPostAll ? pPostAll : function() {});
+    this.preAll = pPreAll || function() {};
+    this.preTest = pPreTest || function() {};
+    this.postTest = pPostTest || function() {};
+    this.postAll = pPostAll || function() {};
 }
 
 /**
- * The tester can test TestSuites.
- * It will be passed as paramter to each test.
- * 
+ * The tester runs TestSuites.
+ * It will be passed as parameter to each test.
+ *
  * @param {String} pCollectionName
+ *
+ * @example
+ * var myTest = new TestSuite("MyObject.myTest", [...]);
+ * var tester = new Tester("Test SqlBuilder", SqlBuilder);
+ * tester.test(myTest);
+ * // More test suites using tester.test()
+ * // ...
+ *
+ * tester.summary();
+ *
+ * @class
+ *
+ * TODO: Implement `isEmpty()`
+ * TODO: Implement `hasKey()`
+ * TODO: Implement `contains()`
+ * TODO: Implement `containsIgnoreCase()`
+ * TODO: Implement `isPrimitive()`
+ * TODO: Implement `matches()`
+ * TODO: Implement `matchesIgnoreCase()`
+ * TODO: Move multiple used code blocks into separate methods (like the logging output + reset)
+ * TODO: Use more getters, especially when implementing `elementAt()`
+ * TODO: Add examples to test methods
+ */
+function Tester(pCollectionName)
+{
+    this.collectionName = pCollectionName;
+    this.instanceName = undefined;
+    this.methods = [];
+    this.methodsCalled = [];
+
+    this.actualValue = undefined;
+    this.actualDisplayValue = undefined;
+    this.actualOriginalValue = undefined;
+    this.actualOriginalDisplayValue = undefined;
+    this.actualValueElementHierarchy = [];
+    this.expectedValue = undefined;
+    this.expectedDisplayValue = undefined;
+    this._assertDescription = "";
+    this._testResult = false;
+    this._useNegation = false;
+    this.dataProvider = undefined;
+    this.currentTestSuite = undefined;
+
+    this.testCount = 0;
+    this.successCount = 0;
+    this.failCount = 0;
+    this.startTime = new Date().getTime();
+    this.endTime = null;
+
+    this.t = new Terminal();
+    this.outputEnabled = true;
+    this.output = "";
+}
+
+/**
+ * Set the value to test
+ *
+ * @param {*} pValue
+ * @return {Tester}
+ */
+Tester.prototype.expectThat = function(pValue)
+{
+    this.actualValue = pValue;
+    this.actualDisplayValue = pValue;
+    this.actualOriginalValue = pValue;
+    this.actualOriginalDisplayValue = pValue;
+    this._useNegation = false;
+
+    return this;
+}
+
+/**
+ * Retrieve the result of the current test
+ *
+ * @return {Boolean}
+ */
+Tester.prototype.getTestResult = function()
+{
+    return this._useNegation ? !this._testResult : this._testResult;
+}
+
+/**
+ * Enable or disable the output
+ *
+ * @param {Boolean} pIsEnabled whether the output should be enabled or not
+ * @return {Tester}
+ */
+Tester.prototype.setOutputEnabled = function(pIsEnabled)
+{
+    this.outputEnabled = pIsEnabled;
+    return this;
+}
+
+/**
+ * Assert makes the test eventually pass or fail by looking at the result and writing into the output
+ *
+ * @return {void}
+ */
+Tester.prototype.assert = function()
+{
+    if(this.getTestResult() === true)
+    {
+        this.successCount++;
+        this._log("success", "\t\t\u2705 " + this._assertDescription);
+    }
+    else
+    {
+        this.failCount++;
+        this._log("error", "\t\t\u274C " + this._assertDescription);
+
+        if(this.actualDisplayValue !== undefined && this.expectedDisplayValue !== undefined)
+        {
+            this._log("warning", "\t\t\t expected: " + JSON.stringify(this.expectedDisplayValue, null, "\t"));
+            this._log("error", "\t\t\t actual:   " + JSON.stringify(this.actualDisplayValue, null, "\t"));
+        }
+    }
+}
+
+/**
+ * Activate test negation
+ *
+ * @return {Tester}
+ */
+Tester.prototype.not = function()
+{
+    this._useNegation = true;
+
+    return this;
+}
+
+/**
+ * Select a child element of `actualValue` to work with
+ *
+ * @param {(String|Number)} pKey the key of the child
+ * @return {Tester}
  * 
  * @example
- * var tester = new Tester("Test SqlBuilder");
- * tester.test(newSelectTests);
- * tester.test(validAndUsageTests);
- * tester.test(validOrUsageTests);
+ * // Grab first array element to test
+ * pTester.expectThat(actualValue).elementAt(0).equals("MyValue").assert();
  * 
- * logging.log("-------------------------");
- * tester.printResults();
+ * // Grab last array element to test
+ * pTester.expectThat(actualValue).elementAt(-1).equals("MyValue").assert();
  * 
- * @class
+ * // Grab object element to test
+ * pTester.expectThat(actualValue).elementAt("myKey").equals("MyValue").assert();
+ * 
+ * // Grab nested element in array/object structure to test, in this case `actualValue[5].myKey[2].someChild`
+ * pTester.expectThat(actualValue).elementAt(5).elementAt("myKey").elementAt(2).elementAt("someChild").equals("MyValue").assert();
  */
-function Tester(pCollectionName) 
+Tester.prototype.elementAt = function(pKey)
 {
-    this.collectionName = pCollectionName;
-    this.testResults = [];
+    if(!Array.isArray(this.actualValue) && !Utils.isObject(this.actualValue))
+    {
+        var error = new Error("actualValue must be array or object to use elementAt('" + pKey + "')");
+        error.name = "UnitTest_lib Error";
+        throw error;
+    }
+    
+    var key = Array.isArray(this.actualValue) && pKey === -1 ? this.actualValue.length - 1 : pKey;
     
-    // if no assert was called during a test, no test-message would be added. -> Add a success message that no error occoured.
-    this.currentTestHadAlreadyAssert = false;
+    this.actualValueElementHierarchy.push(key);
+    this.actualValue = this.actualValue[key];
+    this.actualDisplayValue = this.actualDisplayValue[key];
+
+    return this;
 }
 
 /**
- * generates a summary of the test results
- * 
- * @return {Obect}
+ * Test if a value is equal to a given value
+ *
+ * @param {*} pExpect the value to compare
+ * @param {(String|Object)} pCustomDescription an optional custom assert description or config object overwrite
+ * @return {Tester}
+ */
+Tester.prototype.equals = function(pExpect, pCustomDescription)
+{
+    this._setExpectValue(pExpect);
+
+    if(Utils.isObject(this.actualValue) || Utils.isObject(this.expectedValue))
+    {
+        this.expectedDisplayValue = JSON.stringify(this.actualValue);
+        this._testResult = Utils.isEqual(this.actualValue, this.expectedValue);
+        this._generateAssertDescription({custom: pCustomDescription, operator: "===", name: "Object value"});
+    }
+    else
+    {
+        this._testResult = this.actualValue === this.expectedValue;
+        this._generateAssertDescription({custom: pCustomDescription, operator: "==="});
+    }
+
+    return this;
+}
+
+/**
+ * Test if a value is greater than a given compare value
+ *
+ * @param {Number} pExpect the value to compare
+ * @param {(String|Object)} pCustomDescription an optional custom assert description or config object overwrite
+ * @return {Tester}
+ */
+Tester.prototype.isGreater = function(pExpect, pCustomDescription)
+{
+    this._setExpectValue(pExpect);
+    this._testResult = this.actualValue > this.expectedValue;
+
+    this._generateAssertDescription({custom: pCustomDescription, operator: ">"});
+
+    return this;
+}
+
+/**
+ * Test if a value is greater or equal than a given compare value
+ *
+ * @param {Number} pExpect the value to compare
+ * @param {(String|Object)} pCustomDescription an optional custom assert description or config object overwrite
+ * @return {Tester}
+ */
+Tester.prototype.isGreaterEqual = function(pExpect, pCustomDescription)
+{
+    this._setExpectValue(pExpect);
+    this._testResult = this.actualValue >= this.expectedValue;
+
+    this._generateAssertDescription({custom: pCustomDescription, operator: ">="});
+
+    return this;
+}
+
+/**
+ * Test if a value is lower than a given compare value
+ *
+ * @param {Number} pExpect the value to compare
+ * @param {(String|Object)} pCustomDescription an optional custom assert description or config object overwrite
+ * @return {Tester}
+ */
+Tester.prototype.isLower = function(pExpect, pCustomDescription)
+{
+    this._setExpectValue(pExpect);
+    this._testResult = this.actualValue < this.expectedValue;
+
+    this._generateAssertDescription({custom: pCustomDescription, operator: "<"});
+
+    return this;
+}
+
+/**
+ * Test if a value is lower or equal than a given compare value
+ *
+ * @param {Number} pExpect the value to compare
+ * @param {(String|Object)} pCustomDescription an optional custom assert description or config object overwrite
+ * @return {Tester}
+ */
+Tester.prototype.isLowerEqual = function(pExpect, pCustomDescription)
+{
+    this._setExpectValue(pExpect);
+    this._testResult = this.actualValue <= this.expectedValue;
+
+    this._generateAssertDescription({custom: pCustomDescription, operator: "<="});
+
+    return this;
+}
+
+/**
+ * Test if a value is a boolean
+ *
+ * @param {(String|Object)} pCustomDescription an optional custom assert description or config object overwrite
+ * @return {Tester}
+ */
+Tester.prototype.isBoolean = function(pCustomDescription)
+{
+    this._setExpectValue("boolean");
+    this._testResult = Utils.isBoolean(this.actualValue);
+    this.actualDisplayValue = typeof this.actualValue;
+
+    this._generateAssertDescription({custom: pCustomDescription, operator: "type is"});
+
+    return this;
+}
+
+/**
+ * Test if a value is a number
+ *
+ * @param {(String|Object)} pCustomDescription an optional custom assert description or config object overwrite
+ * @return {Tester}
+ */
+Tester.prototype.isNumber = function(pCustomDescription)
+{
+    this._setExpectValue("number");
+    this._testResult = Utils.isNumber(this.actualValue);
+    this.actualDisplayValue = typeof this.actualValue;
+
+    this._generateAssertDescription({custom: pCustomDescription, operator: "type is"});
+
+    return this;
+}
+
+/**
+ * Test if a value is numeric
+ *
+ * @param {(String|Object)} pCustomDescription an optional custom assert description or config object overwrite
+ * @return {Tester}
+ */
+Tester.prototype.isNumeric = function(pCustomDescription)
+{
+    this._setExpectValue("numeric");
+    this._testResult = Utils.isNumeric(this.actualValue);
+    this.actualDisplayValue = typeof this.actualValue;
+
+    this._generateAssertDescription({custom: pCustomDescription, operator: "is"});
+
+    return this;
+}
+
+/**
+ * Test if a value is NaN (not a number)
+ *
+ * @param {(String|Object)} pCustomDescription an optional custom assert description or config object overwrite
+ * @return {Tester}
+ */
+Tester.prototype.isNaN = function(pCustomDescription)
+{
+    this._setExpectValue("NaN");
+    this._testResult = Number.isNaN(this.actualValue);
+    this.actualDisplayValue = typeof this.actualValue;
+
+    this._generateAssertDescription({custom: pCustomDescription, operator: "type is"});
+
+    return this;
+}
+
+/**
+ * Test if a value is an integer
+ *
+ * @param {(String|Object)} pCustomDescription an optional custom assert description or config object overwrite
+ * @return {Tester}
+ */
+Tester.prototype.isInteger = function(pCustomDescription)
+{
+    this._setExpectValue("integer");
+    this._testResult = Utils.isInteger(this.actualValue);
+
+    this.actualDisplayValue = typeof this.actualValue;
+    this.expectedDisplayValue = "number";
+
+    this._generateAssertDescription({custom: pCustomDescription, operator: "is", expected: this.expectedValue});
+
+    return this;
+}
+
+/**
+ * Test if a value is a float
+ *
+ * @param {(String|Object)} pCustomDescription an optional custom assert description or config object overwrite
+ * @return {Tester}
+ */
+Tester.prototype.isFloat = function(pCustomDescription)
+{
+    this._setExpectValue("float");
+    this._testResult = Utils.isFloat(this.actualValue);
+
+    this.actualDisplayValue = typeof this.actualValue;
+    this.expectedDisplayValue = "number";
+
+    this._generateAssertDescription({custom: pCustomDescription, operator: "is", expected: this.expectedValue});
+
+    return this;
+}
+
+/**
+ * Test if a value is a string
+ *
+ * @param {(String|Object)} pCustomDescription an optional custom assert description or config object overwrite
+ * @return {Tester}
+ */
+Tester.prototype.isString = function(pCustomDescription)
+{
+    this._setExpectValue("string");
+    this._testResult = Utils.isString(this.actualValue);
+    this.actualDisplayValue = typeof this.actualValue;
+
+    this._generateAssertDescription({custom: pCustomDescription, operator: "type is"});
+
+    return this;
+}
+
+/**
+ * Test if a value is an array
+ *
+ * @param {(String|Object)} pCustomDescription an optional custom assert description or config object overwrite
+ * @return {Tester}
+ */
+Tester.prototype.isArray = function(pCustomDescription)
+{
+    this._setExpectValue("array");
+    this._testResult = Array.isArray(this.actualValue);
+    this.actualDisplayValue = typeof this.actualValue;
+
+    this._generateAssertDescription({custom: pCustomDescription, operator: "type is"});
+
+    return this;
+}
+
+/**
+ * Test if a value is an object
+ *
+ * @param {(String|Object)} pCustomDescription an optional custom assert description or config object overwrite
+ * @return {Tester}
+ */
+Tester.prototype.isObject = function(pCustomDescription)
+{
+    this._setExpectValue("object");
+    this._testResult = Utils.isObject(this.actualValue);
+    this.actualDisplayValue = typeof this.actualValue;
+
+    this._generateAssertDescription({custom: pCustomDescription, operator: "type is"});
+
+    return this;
+}
+
+/**
+ * Test if a value is a function
+ *
+ * @param {(String|Object)} pCustomDescription an optional custom assert description or config object overwrite
+ * @return {Tester}
+ */
+Tester.prototype.isFunction = function(pCustomDescription)
+{
+    this._setExpectValue("function");
+    this._testResult = Utils.isFunction(this.actualValue);
+    this.actualDisplayValue = typeof this.actualValue;
+
+    this._generateAssertDescription({custom: pCustomDescription, operator: "type is"});
+
+    return this;
+}
+
+/**
+ * Test if a value is null
+ *
+ * @param {(String|Object)} pCustomDescription an optional custom assert description or config object overwrite
+ * @return {Tester}
+ */
+Tester.prototype.isNull = function(pCustomDescription)
+{
+    this._setExpectValue("null");
+    this._testResult = this.actualValue === null;
+
+    this._generateAssertDescription({custom: pCustomDescription, operator: "is"});
+
+    return this;
+}
+
+/**
+ * Test if a value is undefined
+ *
+ * @param {(String|Object)} pCustomDescription an optional custom assert description or config object overwrite
+ * @return {Tester}
+ */
+Tester.prototype.isUndefined = function(pCustomDescription)
+{
+    this._setExpectValue("undefined");
+    this._testResult = this.actualValue === undefined || typeof this.actualValue === "undefined";
+
+    this._generateAssertDescription({custom: pCustomDescription, operator: "is"});
+
+    return this;
+}
+
+/**
+ * Test if a string value is lowercase
+ *
+ * An additional check of the opposite must be made to prevent strings with non-letter characters passing the test
+ *
+ * @param {(String|Object)} pCustomDescription an optional custom assert description or config object overwrite
+ * @return {Tester}
+ */
+Tester.prototype.isUpperCase = function(pCustomDescription)
+{
+    this._setExpectValue("uppercase");
+    this._testResult = Utils.isString(this.actualValue)
+                        && this.actualValue === this.actualValue.toUpperCase()
+                        && this.actualValue !== this.actualValue.toLowerCase()
+                        ;
+
+    this._generateAssertDescription({custom: pCustomDescription, operator: "is"});
+
+    return this;
+}
+
+/**
+ * Test if a string value is lowercase
+ *
+ * An additional check of the opposite must be made to prevent strings with non-letter characters passing the test
+ *
+ * @param {(String|Object)} pCustomDescription an optional custom assert description or config object overwrite
+ * @return {Tester}
+ */
+Tester.prototype.isLowerCase = function(pCustomDescription)
+{
+    this._setExpectValue("lowercase");
+    this._testResult = Utils.isString(this.actualValue)
+                        && this.actualValue === this.actualValue.toLowerCase()
+                        && this.actualValue !== this.actualValue.toUpperCase()
+                        ;
+
+    this._generateAssertDescription({custom: pCustomDescription, operator: "is"});
+
+    return this;
+}
+
+/**
+ * Test if a value starts with a given string
+ *
+ * An additional check of the opposite must be made to prevent strings with non-letter characters passing the test
+ *
+ * @param {Number} pExpect the expected string beginning
+ * @param {(String|Object)} pCustomDescription an optional custom assert description or config object overwrite
+ * @return {Tester}
+ */
+Tester.prototype.startsWith = function(pExpect, pCustomDescription)
+{
+    this._setExpectValue(pExpect);
+    this._testResult = Utils.isString(this.actualValue) && this.actualValue.startsWith(this.expectedValue);
+
+    this._generateAssertDescription({custom: pCustomDescription, operator: "starts with"});
+
+    return this;
+}
+
+/**
+ * Test if a value end with a given string
+ *
+ * An additional check of the opposite must be made to prevent strings with non-letter characters passing the test
+ *
+ * @param {Number} pExpect the expected string beginning
+ * @param {(String|Object)} pCustomDescription an optional custom assert description or config object overwrite
+ * @return {Tester}
+ */
+Tester.prototype.endsWith = function(pExpect, pCustomDescription)
+{
+    this._setExpectValue(pExpect);
+    this._testResult = Utils.isString(this.actualValue) && this.actualValue.endsWith(this.expectedValue);
+
+    this._generateAssertDescription({custom: pCustomDescription, operator: "ends with"});
+
+    return this;
+}
+
+/**
+ * Test if value is an instance of the expected "class"
+ *
+ * @param {Number} pExpect the expected instance name
+ * @param {(String|Object)} pCustomDescription an optional custom assert description or config object overwrite
+ * @return {Tester}
+ */
+Tester.prototype.isInstanceOf = function(pExpect, pCustomDescription)
+{
+    this._setExpectValue(pExpect);
+
+    // Checks the name of the constructor and runs a function to check the actual instance.
+    // To prevent security issues by using `eval()`, a double nested function was needed.
+    // The outer one to evaluate the code, the inner one to be able to pass an argument, that will be evaluated.
+    // TODO: Also check for isObject() before
+    this._testResult = Utils.isObject(this.actualValue)
+                        && this.actualValue.constructor.name === this.expectedValue
+                        && Function('"use strict"; return function(obj) {return obj instanceof ' + this.expectedValue + ';};')()(this.actualValue);
+    this.actualDisplayValue = this.actualValue.constructor.name;
+
+    this._generateAssertDescription({custom: pCustomDescription, operator: "is instance of"});
+
+    return this;
+}
+
+/**
+ * Test if value (array, string, object) has the expected length
+ *
+ * @param {Number} pExpect the expected length
+ * @param {(String|Object)} pCustomDescription an optional custom assert description or config object overwrite
+ * @return {Tester}
+ */
+Tester.prototype.hasLength = function(pExpect, pCustomDescription)
+{
+    this._setExpectValue(pExpect);
+
+    var length = this._getLength(this.actualValue);
+    this._testResult = length === this.expectedValue;
+    this.actualDisplayValue = length;
+
+    this._generateAssertDescription({custom: pCustomDescription, operator: "===", nameSuffix: ".length"});
+
+    return this;
+}
+
+/**
+ * Test if value (array, string, object) has a minimum expected length
+ *
+ * @param {Number} pExpect the expected length
+ * @param {(String|Object)} pCustomDescription an optional custom assert description or config object overwrite
+ * @return {Tester}
+ */
+Tester.prototype.hasMinLength = function(pExpect, pCustomDescription)
+{
+    this._setExpectValue(pExpect);
+
+    var length = this._getLength(this.actualValue);
+    this._testResult = length >= this.expectedValue;
+    this.actualDisplayValue = length;
+
+    this._generateAssertDescription({custom: pCustomDescription, operator: ">=", nameSuffix: ".length"});
+
+    return this;
+}
+
+/**
+ * Test if value (array, string, object) has a maximum expected length
+ *
+ * @param {Number} pExpect the expected length
+ * @param {(String|Object)} pCustomDescription an optional custom assert description or config object overwrite
+ * @return {Tester}
+ */
+Tester.prototype.hasMaxLength = function(pExpect, pCustomDescription)
+{
+    this._setExpectValue(pExpect);
+
+    var length = this._getLength(this.actualValue);
+    this._testResult = length <= this.expectedValue;
+    this.actualDisplayValue = length;
+
+    this._generateAssertDescription({custom: pCustomDescription, operator: "<=", nameSuffix: ".length"});
+
+    return this;
+}
+
+
+/**
+ * Test if a callback function throws an exception
+ *
+ * @param {Number} pExpect the expected error
+ * @param {(String|Object)} pCustomDescription an optional custom assert description or config object overwrite
+ * @return {Tester}
  */
-Tester.prototype.getSummary = function ()
+Tester.prototype.throwsException = function(pExpect, pCustomDescription)
 {
-    var summary = {
-        failures : 0,
-        successes : 0,
-        failedTests : [],
-        getMessage : function ()
+    this._setExpectValue(pExpect);
+    this._generateAssertDescription({custom: pCustomDescription, operator: "throws", expected: "exception", name: " "});
+
+    if(this._useNegation)
+    {
+        try
+        {
+            this.actualValue();
+        }
+        catch(e)
+        {
+            this._testResult = true; // Actually `false` and therefore failed, but must be `true` to make negation work
+            this.actualDisplayValue = e;
+            throw e;
+        }
+
+        this._testResult = false; // Actually `true` and therefore successful, but must be `false` to make negation work
+    }
+    else
+    {
+        try
         {
-            var message = "-------------------------\n"
-                + (this.failures ? "Test failure" : "Test success")
-                + "\n-------------------------\nTests performed: " + (this.successes + this.failures)
-                + "\nTests successful: " + this.successes
-                + "\nTests failed: " + this.failures;
-            if (this.failedTests.length)
+            this.actualValue();
+        }
+        catch(e)
+        {
+            this._testResult = e.toSource() === this.expectedValue.toSource();
+
+            if (!this._testResult)
             {
-                message += "\nFailures:";
-                this.failedTests.forEach(function (testName)
-                {
-                    message += "\n\t" + testName;
-                });
+                this.actualDisplayValue = e;
+                throw e;
             }
-            return message;
         }
     }
-    this.testResults.forEach(function ([testName,, successful])
-    {
-        if (successful)
-            summary.successes++;
+
+    return this;
+}
+
+/**
+ * Executes all tests in a TestSuite
+ *
+ * @param {TestSuite} pTestSuite the TestSuite which should be tested
+ * @return {void}
+ */
+Tester.prototype.test = function(pTestSuite)
+{
+    this.currentTestSuite = pTestSuite;
+    this._log("important", "\u2692 Suite: " + this.currentTestSuite.name);
+    this._registerMethodTestCall();
+
+    this.currentTestSuite.preAll(this);
+
+    this.currentTestSuite.tests.forEach(function(pTest) {
+        this._resetTest();
+
+        this.currentTestSuite.preTest(this);
+        this.dataProvider = pTest.dataProviderCallback();
+
+        if(Array.isArray(this.dataProvider) && this.dataProvider.length > 0)
+        {
+            this.dataProvider.forEach(function(pElement, pIndex) {
+                this._runTest(pTest, pIndex);
+            }, this);
+        }
         else
         {
-            summary.failures++;
-            summary.failedTests.push(testName);
+            this._runTest(pTest);
         }
+
+        this.currentTestSuite.postTest(this);
+    }, this);
+
+    this.currentTestSuite.postAll(this);
+}
+
+/**
+ * Calculate test duration
+ *
+ * Will we used in the results and summary output.
+ *
+ * @return {Number} the duration in milliseconds
+ */
+Tester.prototype.getDuration = function()
+{
+    if(this.endTime === null)
+    {
+        this.endTime = new Date().getTime();
+    }
+
+    return this.endTime - this.startTime;
+}
+
+/**
+ * Initializes test coverage by registering available and testable methods of given class
+ *
+ * @param {Object=} pInstanceName an optional class instance to make test coverage work
+ * @return {void}
+ */
+Tester.prototype.initCoverage = function(pInstanceName)
+{
+    if(pInstanceName !== undefined)
+    {
+        this.instanceName = pInstanceName;
+
+        var instanceMethods = Object.getOwnPropertyNames(this.instanceName.prototype).filter(function(property) {
+            return typeof this.instanceName.prototype[property] === 'function';
+        }, this);
+        var staticMethods = Object.getOwnPropertyNames(this.instanceName).filter(function(property) {
+            return typeof this.instanceName[property] === 'function';
+        }, this);
+
+        this.methods = instanceMethods.concat(staticMethods);
+    }
+}
+
+/**
+ * Get the results of current tester as object
+ *
+ * @return {Object} the test results
+ */
+Tester.prototype.getResults = function()
+{
+    return {
+        testCount: this.testCount,
+        assertCount: this.successCount + this.failCount,
+        successCount: this.successCount,
+        failCount: this.failCount,
+        duration: this.getDuration(),
+        coverage: this._getCoverageRate(),
+        methodsTotal: this.methods.length,
+        methodsCalled: this.methodsCalled.length
+    };
+}
+
+/**
+ * Output the summary for a single or multiple test suites to the server log
+ *
+ * The results of multiple tests get cumulated.
+ * There will be no log output if it has been disabled.
+ *
+ * @param {(Object|Object[])} pTestSuiteResults the test suite result(s) to log a summary for
+ * @return {void}
+ */
+Tester.prototype.summary = function(pTestSuiteResults)
+{
+    var testSuiteResults = pTestSuiteResults !== undefined && Array.isArray(pTestSuiteResults) ? pTestSuiteResults : [this.getResults()];
+    var divider = testSuiteResults.length > 1 ? "=" : "-";
+    var title = testSuiteResults.length > 1 ? "All Tests" : this.collectionName;
+
+    var testCount = 0;
+    var assertCount = 0;
+    var successCount = 0;
+    var failCount = 0;
+    var duration = 0;
+
+    testSuiteResults.forEach(function(pTestResult) {
+        testCount += pTestResult.testCount;
+        assertCount += pTestResult.assertCount;
+        successCount += pTestResult.successCount;
+        failCount += pTestResult.failCount;
+        duration += pTestResult.duration;
     });
-    return summary;
+
+    this._log("info", "\n" + title + " Summary:");
+    this._log("info", divider.repeat(32));
+    this._log("", "Total:    " + this.t.important(testCount + " Tests, " + assertCount + " Assertions"));
+    this._log("", "Passed:   " + (successCount === assertCount ? this.t.success(successCount) : this.t.warning(successCount)));
+    this._log("", "Failed:   " + (failCount === 0 ? this.t.success(failCount) : this.t.error(failCount)));
+    this._log("", "Time:     " + this.t.important(duration + "ms"));
+    this._log("", "Coverage: " + this._getCoverageOutput(testSuiteResults));
+    this._log("", "\n\n");
+
+    this._print();
 }
 
 /**
- * With assert you can test if a variable is the same like an expected value.<br/>
- * The test result is added to the Tester<br/>
+ * Write a certain message type to the output
+ *
+ * If the given message type is not valid/allowed, the output will be plain unformatted text.
+ *
+ * @param {String} pType the message type
+ * @param {String} pOutput the actual message
+ * @return {void}
  * 
- * Note: the values are compared by === so also the type is checked.<br/>
- * By using assert you can Test everything you want.<br/>
+ * @private
+ */
+Tester.prototype._log = function(pType, pOutput)
+{
+    var allowedTerminalMethods = ["debug", "success", "info", "error", "warning", "important"];
+
+    if(allowedTerminalMethods.indexOf(pType) !== -1)
+    {
+        this.output += "\n" + this.t[pType](pOutput);
+    }
+    else
+    {
+        this.output += "\n" + pOutput;
+    }
+}
+
+/**
+ * Set the value to test against
+ *
+ * @param {*} pValue
+ * @return {void}
  * 
- * @param {AnyValue} pExpect the expected value
- * @param {AnyValue} pActual the actual value
- * @param {String} [pTestDescription] this is an optional description. You should use it, if you have more than one .assert in your test.
+ * @private
  */
-Tester.prototype.assert = function (pExpect, pActual, pTestDescription)
+Tester.prototype._setExpectValue = function(pValue)
 {
-    this.currentTestHadAlreadyAssert = true;
-    
-    var res = pActual === pExpect;
+    this.expectedValue = pValue;
+    this.expectedDisplayValue = pValue;
+}
+
+/**
+ * Determine, whether an error is expected in the current test run
+ *
+ * @return {Boolean}
+ * 
+ * @private
+ */
+Tester.prototype._testExpectsError = function()
+{
+    return this.expectedValue instanceof Error;
+}
+
+/**
+ * Write the ouput to the log and reset the output to an empty string
+ *
+ * @return {Tester}
+ * 
+ * @private
+ */
+Tester.prototype._print = function()
+{
+    if(this.outputEnabled)
+    {
+        logging.log(this.output);
+    }
     
-    this.testResults.push([
-        this._currentTest,
-        pTestDescription,
-        res,
-        pExpect,
-        pActual
-    ]);
+    this.output = "";
+    return this;
 }
 
 /**
- * Executes all tests in a TestSuite
- * @param {TestSuite} pTestSuite the TestSuite which should be tested
+ * Generates and sets an assert description by given config object or simply set a given custom string
+ *
+ * It also handles using the correct operators when negation via `not()` is used
+ *
+ * @param {Object} pDescriptionConfig a config object
+ * @return {void}
+ * 
+ * @private
  */
-Tester.prototype.test = function (pTestSuite)
+Tester.prototype._generateAssertDescription = function(pDescriptionConfig)
 {
-    pTestSuite.preAll(this);
+    if(Utils.isString(pDescriptionConfig.custom))
+    {
+        this._assertDescription = pDescriptionConfig.custom;
+        return;
+    }
     
-    pTestSuite.tests.forEach(function(pTest) {
-        logging.log("Testing " + pTest[0]);
-        
-        this.currentTestHadAlreadyAssert = false;
-
-        this._currentTest = pTest[0];
-        pTestSuite.preTest(this);
-        
-        if (pTest.length >= 3)
+    Object.assign(pDescriptionConfig, pDescriptionConfig.custom);
+    var valueName = pDescriptionConfig.name || "value";
+    var valueNameSuffix = pDescriptionConfig.nameSuffix || "";
+    var operator = pDescriptionConfig.operator.trim();
+    var expectedValue = pDescriptionConfig.expected || this.expectedDisplayValue;
+    expectedValue = Utils.isString(expectedValue) ? "`" + expectedValue + "`" : expectedValue + "";
+
+    if(this._useNegation)
+    {
+        switch(operator)
         {
-            var errorThrowed = false;
-            
-            try {
-                pTest[1](this);
-            } catch (ex) {
-                errorThrowed = true;
-                
-                if (ex.toSource() == pTest[2].toSource())
-                {
-                    this.testResults.push([
-                        this._currentTest,
-                        "Expected error throwed",
-                        true,
-                        pTest[2].toSource(),
-                        ex.toSource()
-                    ]);
-
-                    // don't throw as it's expected and no detailed stacktrace is needed
-                }
-                else
-                {
-                    this.testResults.push([
-                        this._currentTest,
-                        "Expected error throwed",
-                        false,
-                        pTest[2].toSource(),
-                        ex.toSource()
-                    ]);
-                    
-                    logging.log("Expected error: " + pTest[2].toSource() + ", but wrong error occoured.\nRunning test again without try catch to get detailed error stack trace")
-                    
-                    pTestSuite.preTest(this);
-                    pTest[1](this);
-                    pTestSuite.postTest(this);
-                    return;
-                }
-            }
-            
-            if (!errorThrowed)
-            {
-                // if it didn't fail
-                this.testResults.push([
-                    this._currentTest,
-                    "Expected error throwed",
-                    false,
-                    pTest[2].toSource(),
-                    "no error"
-                ]);
-            }
+            case "===":
+                operator = "!==";
+                break;
+            case ">":
+                operator = "<=";
+                break;
+            case ">=":
+                operator = "<";
+                break;
+            case "<":
+                operator = ">=";
+                break;
+            case "<=":
+                operator = ">";
+                break;
+            case "is":
+            case "type is":
+            case "has":
+                operator += " not";
+                break;
+            case "is instance of":
+                operator += "is not instance of";
+                break;
+            case "starts with":
+            case "ends with":
+            case "throws":
+            default:
+                operator = "not " + operator;
+                break;
         }
-        else
+    }
+
+    this.actualValueElementHierarchy.forEach(function(pElement) {
+        valueName += typeof pElement === "number" ? "[" + pElement + "]" : "." + pElement;
+    }, this);
+    
+    var description = valueName + valueNameSuffix + " " + operator + " " + expectedValue;
+    this._assertDescription = description.trim();
+    this.actualValueElementHierarchy = [];
+}
+
+/**
+ * Reset test-related properties to their initial state
+ *
+ * This is done before every test run to prevent side-effects or expired/invalid data and states
+ *
+ * @return {Tester}
+ * 
+ * @private
+ */
+Tester.prototype._resetTest = function()
+{
+    this.actualValue = undefined;
+    this.actualDisplayValue = undefined;
+    this.actualOriginalValue = undefined;
+    this.actualOriginalDisplayValue = undefined;
+    this.actualValueElementHierarchy = [];
+    this.expectedValue = undefined;
+    this.expectedDisplayValue = undefined;
+    this._assertDescription = "";
+    this._testResult = false;
+    this._useNegation = false;
+
+    return this;
+}
+
+/**
+ * Get the length of a given value or undefined if it is not an array, object or string
+ *
+ * @param {(Array|Object|String)} pActualValue the value to get the length from
+ * @return {Number}
+ * 
+ * @private
+ */
+Tester.prototype._getLength = function(pActualValue)
+{
+    if(Array.isArray(pActualValue) || Utils.isString(pActualValue))
+    {
+        return pActualValue.length;
+    }
+    else if(Utils.isObject(pActualValue))
+    {
+        return Object.keys(pActualValue).length;
+    }
+
+    return undefined;
+}
+
+/**
+ * Get the percentage of test coverage
+ *
+ * Will we used in the results and summary output.
+ *
+ * @return {?Number} the duration in milliseconds
+ */
+Tester.prototype._getCoverageRate = function()
+{
+    if(this.methods.length === 0 && this.methodsCalled.length === 0)
+    {
+        return null;
+    }
+
+    if(this.methods.length === 0 || this.methodsCalled.length === 0)
+    {
+        return 0.00;
+    }
+
+    var coverage = (this.methodsCalled.length / this.methods.length) * 100;
+    coverage = Number.parseFloat(Number.parseFloat(coverage).toFixed(2));
+
+    return coverage > 100 ? 100.00 : coverage;
+}
+
+/**
+ * Register, which method of the given class has been called
+ *
+ * It takes the name of the TestSuite and splits it to get the class name and the method.
+ * Then, it checks if the class has such a method. It gets added to the call-list, if it has not been added yet.
+ * This is necessary to calculate the test coverage.
+ * All available class methods get registered beforehand and will be compared to this list later in `_getCoverageRate()`.
+ *
+ * @return {void}
+ * 
+ * @private
+ */
+Tester.prototype._registerMethodTestCall = function()
+{
+    if(this.instanceName !== undefined)
+    {
+        var callParts = this.currentTestSuite.name.split(".");
+
+        if(callParts[0] === this.instanceName.prototype.constructor.name && this.methods.indexOf(callParts[1]) !== -1)
         {
-            // run without try catch as no error expected
-            pTest[1](this);
+            if(this.methodsCalled.indexOf(callParts[1]) === -1)
+            {
+                this.methodsCalled.push(callParts[1]);
+            }
         }
-        
-        if (!this.currentTestHadAlreadyAssert && pTest.length < 3) // only add message if no error expected
-        {
-            this.testResults.push([
-                    this._currentTest,
-                    "Expected no error",
-                    true,
-                    "no error",
-                    "no error"
-                ]);
+    }
+}
+
+/**
+ * Renders the output for the test coverage
+ *
+ * The results of multiple tests get cumulated.
+ *
+ * @param {Object[]} pTestSuiteResults the test suite(s) to log a summary for
+ * @return {String} the test coverage output
+ */
+Tester.prototype._getCoverageOutput = function(pTestSuiteResults)
+{
+    var coverageOutput = this.t.debug("unknown");
+    var methodsTotal = 0;
+    var methodsCalled = 0;
+    var coverage = null;
+    var avgCoverage = null;
+    var coverageMethodCount = null;
+
+    pTestSuiteResults.forEach(function(pTestResult) {
+        methodsTotal += pTestResult.methodsTotal;
+        methodsCalled += pTestResult.methodsCalled;
+
+        if(pTestResult.coverage !== null) {
+            coverage += pTestResult.coverage;
         }
-            
-        pTestSuite.postTest(this);
-    }, this);
-    
-    pTestSuite.postAll(this);
+    });
+
+    if(coverage !== null)
+    {
+        avgCoverage = coverage / pTestSuiteResults.length;
+        coverageMethodCount = "(" + methodsCalled + "/" + methodsTotal + ")";
+    }
+
+    if(avgCoverage >= 80)
+    {
+        coverageOutput = this.t.success(avgCoverage + "% " + coverageMethodCount);
+    }
+    else if(avgCoverage >= 50)
+    {
+        coverageOutput = this.t.warning(avgCoverage + "% " + coverageMethodCount);
+    }
+    else if(avgCoverage > 0)
+    {
+        coverageOutput = this.t.error(avgCoverage + "% " + coverageMethodCount);
+    }
+
+    return coverageOutput;
 }
 
 /**
- * Prints the test results to the log
+ * Generates the title for the test about to run
+ *
+ * @param {Test} pTest the test to run
+ * @param {Number} pDataProviderIndex the current index of the data provider
+ * @return {void}
+ * 
+ * @private
  */
-Tester.prototype.printResults = function ()
+Tester.prototype._generateTestTitle = function(pTest, pDataProviderIndex)
 {
-    var lastTestDescription = "";
-    logging.log("Test results for \"" + this.collectionName + "\"")
-    this.testResults.forEach(function(pResult) {
-        
-        if (lastTestDescription != pResult[0])
+    if(pDataProviderIndex !== undefined)
+    {
+        var titleValues = [];
+
+        this.dataProvider[pDataProviderIndex].forEach(function(pElement) {
+            titleValues.push(pElement === undefined ? "undefined" : JSON.stringify(pElement));
+        });
+        this._log("", this.t.info("\t\u2699 Test: " + pTest.name) + this.t.debug(" (#" + (pDataProviderIndex + 1) + ": " + titleValues.join(" | ") + ")"));
+    }
+    else
+    {
+        this._log("info", "\t\u2699 Test: " + pTest.name);
+    }
+}
+
+/**
+ * Runs a single test iteration and handles errors
+ *
+ * @param {Test} pTest the test to run
+ * @param {Number} pDataProviderIndex the current index of the data provider
+ * @return {void}
+ * 
+ * @private
+ */
+Tester.prototype._runTest = function(pTest, pDataProviderIndex)
+{
+    this._generateTestTitle(pTest, pDataProviderIndex);
+    this.testCount++;
+
+    var dataProvider = pDataProviderIndex !== undefined ? this.dataProvider[pDataProviderIndex] : undefined;
+
+    try
+    {
+        pTest.callback(this, dataProvider);
+    }
+    catch (e)
+    {
+        this.assert();
+
+        // Expected, but wrong error
+        if (this._testExpectsError() && e.toSource() !== this.expectedValue.toSource())
         {
-            logging.log("Test \"" + pResult[0] + "\":");
+            this._log("error", "Wrong error occurred");
+            this._log("warning", "\t\t expected: " + this.expectedValue.toSource());
+            this._log("error", "\t\t actual:   " + e.toSource());
         }
-        
-        var message = (pResult[1] ? " - " + pResult[1] : " - Test result ") + ": " + (pResult[2] ? "success" : "fail\nexpected: " + JSON.stringify(pResult[3], null, "\t") + "\nactual: " + JSON.stringify(pResult[4], null, "\t"));
-        
-        logging.log(message);
-        lastTestDescription = pResult[0];
-    }, this);
-    logging.log(this.getSummary().getMessage());
-}
\ No newline at end of file
+        else
+        { // Unexpected error
+            this._log("error", "Unexpected error occurred");
+        }
+
+        var exception = logging.toLogString(e["rhinoException"] !== undefined ? e["rhinoException"] : e, true);
+        this._log("error", e.name + ":\n" + exception.replace(/\s+(at|\[->\])\s/g, "\n\t$1 "));
+        this._log("error", "jDito callstack:\n" + e.stack);
+
+        if(pTest.rerunOnError)
+        {
+            this._log("debug", "Rerun without try-catch to get detailed error stack trace");
+            this._print();
+
+            this.currentTestSuite.preTest(this);
+            pTest.callback(this, dataProvider);
+            this.currentTestSuite.postTest(this);
+        }
+    }
+}
diff --git a/process/UnitTest_test/UnitTest_test.aod b/process/UnitTest_test/UnitTest_test.aod
new file mode 100644
index 00000000000..095a395529b
--- /dev/null
+++ b/process/UnitTest_test/UnitTest_test.aod
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+  <name>UnitTest_test</name>
+  <title>[TEST] UnitTest_lib</title>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <icon>VAADIN:CHECK_CIRCLE</icon>
+  <process>%aditoprj%/process/UnitTest_test/process.js</process>
+  <alias>Data_alias</alias>
+  <variants>
+    <element>EXECUTABLE</element>
+  </variants>
+</process>
diff --git a/process/UnitTest_test/process.js b/process/UnitTest_test/process.js
new file mode 100644
index 00000000000..7d80b7995e4
--- /dev/null
+++ b/process/UnitTest_test/process.js
@@ -0,0 +1,1141 @@
+import("system.result");
+import("system.vars");
+import("Keyword_lib");
+import("UnitTest_lib");
+
+
+var equals = new TestSuite("Tester.equals", [
+    new Test("should test value equality",
+        function(pTester, pDataProvider) {
+            
+            var dummyTester = (new Tester("Test Dummy")).setOutputEnabled(false);
+            var expectValue = pDataProvider[0];
+            var actualValue = dummyTester.expectThat(pDataProvider[1]).equals(pDataProvider[2]).getTestResult();
+
+            pTester.expectThat(actualValue).equals(expectValue).assert();
+        },
+        function dataProvider() {
+            var num = 0;
+            var str = '0';
+            var objStr = new String('0');
+            var obj_1 = {a: 1, b: 2, c: 3};
+            var obj_2 = {x: null, y: "test", z: true};
+            
+            return [
+                [true,  num,     num],
+                [true,  str,     str],
+                [true,  true,    true],
+                [true,  objStr,  objStr],
+                [true,  obj_1,   obj_1],
+                [true,  obj_2,   obj_2],
+                [false, true,    false],
+                [false, obj_1,   obj_2],
+                [false, num,     objStr],
+                [false, num,     str],
+                [false, objStr,  str],
+                [false, null,    undefined],
+                [false, objStr,  null],
+                [false, objStr,  undefined],
+                [false, null,    "null"],
+            ];
+        }
+    )
+]);
+
+var isGreater = new TestSuite("Tester.isGreater", [
+    new Test("should test if value is greater than another",
+        function(pTester, pDataProvider) {
+            
+            var dummyTester = (new Tester("Test Dummy")).setOutputEnabled(false);
+            var expectValue = pDataProvider[0];
+            var actualValue = dummyTester.expectThat(pDataProvider[1]).isGreater(pDataProvider[2]).getTestResult();
+
+            pTester.expectThat(actualValue).equals(expectValue).assert();
+        },
+        function dataProvider() {
+            return [
+                [true,  1,    0],
+                [true,  100,  10],
+                [false, 3,    3],
+                [false, 0,    5],
+                [false, 1234, 5678],
+            ];
+        }
+    )
+]);
+
+var isGreaterEqual = new TestSuite("Tester.isGreaterEqual", [
+    new Test("should test if value is greater or equal than another",
+        function(pTester, pDataProvider) {
+            
+            var dummyTester = (new Tester("Test Dummy")).setOutputEnabled(false);
+            var expectValue = pDataProvider[0];
+            var actualValue = dummyTester.expectThat(pDataProvider[1]).isGreaterEqual(pDataProvider[2]).getTestResult();
+
+            pTester.expectThat(actualValue).equals(expectValue).assert();
+        },
+        function dataProvider() {
+            return [
+                [true,  1,    0],
+                [true,  101,  100],
+                [true,  3,    3],
+                [false, 0,    5],
+                [false, 1234, 5678],
+            ];
+        }
+    )
+]);
+
+var isLower = new TestSuite("Tester.isLower", [
+    new Test("should test if value is lower than another",
+        function(pTester, pDataProvider) {
+            
+            var dummyTester = (new Tester("Test Dummy")).setOutputEnabled(false);
+            var expectValue = pDataProvider[0];
+            var actualValue = dummyTester.expectThat(pDataProvider[1]).isLower(pDataProvider[2]).getTestResult();
+
+            pTester.expectThat(actualValue).equals(expectValue).assert();
+        },
+        function dataProvider() {
+            return [
+                [true,  0,    1],
+                [true,  10,   100],
+                [false, 3,    3],
+                [false, 5,    0],
+                [false, 5678, 1234],
+            ];
+        }
+    )
+]);
+
+var isLowerEqual = new TestSuite("Tester.isLowerEqual", [
+    new Test("should test if value is greater or equal than another",
+        function(pTester, pDataProvider) {
+            
+            var dummyTester = (new Tester("Test Dummy")).setOutputEnabled(false);
+            var expectValue = pDataProvider[0];
+            var actualValue = dummyTester.expectThat(pDataProvider[1]).isLowerEqual(pDataProvider[2]).getTestResult();
+
+            pTester.expectThat(actualValue).equals(expectValue).assert();
+        },
+        function dataProvider() {
+            return [
+                [true,  0,    1],
+                [true,  100,  101],
+                [true,  3,    3],
+                [false, 5,    0],
+                [false, 5678, 1234],
+            ];
+        }
+    )
+]);
+
+var isBoolean = new TestSuite("Tester.isBoolean", [
+    new Test("should test if value is a boolean",
+        function(pTester, pDataProvider) {
+            
+            var dummyTester = (new Tester("Test Dummy")).setOutputEnabled(false);
+            var expectValue = pDataProvider[0];
+            var actualValue = dummyTester.expectThat(pDataProvider[1]).isBoolean().getTestResult();
+
+            pTester.expectThat(actualValue).equals(expectValue).assert();
+        },
+        function dataProvider() {
+            return [
+                [true,  true],
+                [true,  false],
+                [false, "true"],
+                [false, "false"],
+                [false, ""],
+                [false, "0"],
+                [false, 0],
+                [false, new Object()],
+                [false, []],
+                [false, null],
+                [false, undefined],
+            ];
+        }
+    )
+]);
+
+var isNumber = new TestSuite("Tester.isNumber", [
+    new Test("should test if value is a number",
+        function(pTester, pDataProvider) {
+            
+            var dummyTester = (new Tester("Test Dummy")).setOutputEnabled(false);
+            var expectValue = pDataProvider[0];
+            var actualValue = dummyTester.expectThat(pDataProvider[1]).isNumber().getTestResult();
+
+            pTester.expectThat(actualValue).equals(expectValue).assert();
+        },
+        function dataProvider() {
+            return [
+                [true,  0],
+                [true,  100],
+                [true,  33.33333],
+                [true,  0xFFFFFF],
+                [true,  0777], // Octal
+                //[true,  0o777], // New octal format since ECMAScript 2015
+                //[true,  0b11111111], // Seems like binary numbers are not supported
+                [true,  2e6], // Exponentiation
+                [true,  0.1e2], // Exponentiation
+                [true,  +Infinity],
+                [true,  -Infinity],
+                [true,  NaN], // This should actually fail. Needs fix in Utils
+                [false, ""],
+                [false, "0"],
+                [false, new Object()],
+                [false, []],
+                [false, true],
+                [false, null],
+                [false, undefined],
+            ];
+        }
+    )
+]);
+
+var isNumeric = new TestSuite("Tester.isNumeric", [
+    new Test("should test if value is numeric",
+        function(pTester, pDataProvider) {
+            
+            var dummyTester = (new Tester("Test Dummy")).setOutputEnabled(false);
+            var expectValue = pDataProvider[0];
+            var actualValue = dummyTester.expectThat(pDataProvider[1]).isNumeric().getTestResult();
+
+            pTester.expectThat(actualValue).equals(expectValue).assert();
+        },
+        function dataProvider() {
+            return [
+                [true,  0],
+                [true,  100],
+                [true,  33.33333],
+                [true,  "0777"], // Octal
+                [true,  "2e6"], // Exponentiation
+                [true,  "0.1e2"], // Exponentiation
+                [true,  +Infinity],
+                [true,  -Infinity],
+                [true,  NaN], // This should actually fail. Needs fix in Utils
+                [true,  "50000"],
+                [true,  "0"],
+                [false, ""],
+                [false, new Object()],
+                [false, []],
+                [false, true],
+                [false, null],
+                [false, undefined],
+            ];
+        }
+    )
+]);
+
+var isNotANumber = new TestSuite("Tester.isNaN", [
+    new Test("should test if value is not NaN",
+        function(pTester, pDataProvider) {
+            
+            var dummyTester = (new Tester("Test Dummy")).setOutputEnabled(false);
+            var expectValue = pDataProvider[0];
+            var actualValue = dummyTester.expectThat(pDataProvider[1]).isNaN().getTestResult();
+
+            pTester.expectThat(actualValue).equals(expectValue).assert();
+        },
+        function dataProvider() {
+            return [
+                [true,  NaN],
+                [false, 0],
+                [false, 100],
+                [false, 33.33333],
+                [false, "0777"], // Octal
+                [false, "2e6"], // Exponentiation
+                [false, "0.1e2"], // Exponentiation
+                [false, +Infinity],
+                [false, -Infinity],
+                [false, "50000"],
+                [false, "0"],
+                [false,  ""],
+                [false,  new Object()],
+                [false,  []],
+                [false,  true],
+                [false,  null],
+                [false,  undefined],
+            ];
+        }
+    )
+]);
+
+var isInteger = new TestSuite("Tester.isInteger", [
+    new Test("should test if value is an integer",
+        function(pTester, pDataProvider) {
+            
+            var dummyTester = (new Tester("Test Dummy")).setOutputEnabled(false);
+            var expectValue = pDataProvider[0];
+            var actualValue = dummyTester.expectThat(pDataProvider[1]).isInteger().getTestResult();
+
+            pTester.expectThat(actualValue).equals(expectValue).assert();
+        },
+        function dataProvider() {
+            return [
+                [true,  0],
+                [true,  100],
+                [true,  0xFFFFFF],
+                [true,  0777], // Octal
+                [true,  2e6], // Exponentiation
+                [true,  0.1e2], // Exponentiation
+                [true,  "0"],
+                [false, 33.33333],
+                [false, +Infinity],
+                [false, -Infinity],
+                [false, NaN],
+                [false, ""],
+                [false, new Object()],
+                [false, []],
+                [false, true],
+                [false, null],
+                [false, undefined],
+            ];
+        }
+    )
+]);
+
+var isFloat = new TestSuite("Tester.isFloat", [
+    new Test("should test if value is a float",
+        function(pTester, pDataProvider) {
+            
+            var dummyTester = (new Tester("Test Dummy")).setOutputEnabled(false);
+            var expectValue = pDataProvider[0];
+            var actualValue = dummyTester.expectThat(pDataProvider[1]).isFloat().getTestResult();
+
+            pTester.expectThat(actualValue).equals(expectValue).assert();
+        },
+        function dataProvider() {
+            return [
+                [true,  33.33333],
+                [false, 0],
+                [false, 100],
+                [false, 0xFFFFFF],
+                [false, 0777], // Octal
+                [false, 2e6], // Exponentiation
+                [false, 0.1e2], // Exponentiation
+                [false, +Infinity],
+                [false, -Infinity],
+                [false, NaN],
+                [false, ""],
+                [false, "0"],
+                [false, new Object()],
+                [false, []],
+                [false, true],
+                [false, null],
+                [false, undefined],
+            ];
+        }
+    )
+]);
+
+var isString = new TestSuite("Tester.isString", [
+    new Test("should test if value is a string",
+        function(pTester, pDataProvider) {
+            
+            var dummyTester = (new Tester("Test Dummy")).setOutputEnabled(false);
+            var expectValue = pDataProvider[0];
+            var actualValue = dummyTester.expectThat(pDataProvider[1]).isString().getTestResult();
+
+            pTester.expectThat(actualValue).equals(expectValue).assert();
+        },
+        function dataProvider() {
+            return [
+                [true,  ""],
+                [true,  "Hello"],
+                [true,  "0"],
+                [false, new String('Hello')],
+                [false, []],
+                [false, 0],
+                [false, true],
+                [false, null],
+                [false, undefined],
+            ];
+        }
+    )
+]);
+
+var isArray = new TestSuite("Tester.isArray", [
+    new Test("should test if value is an array",
+        function(pTester, pDataProvider) {
+            
+            var dummyTester = (new Tester("Test Dummy")).setOutputEnabled(false);
+            var expectValue = pDataProvider[0];
+            var actualValue = dummyTester.expectThat(pDataProvider[1]).isArray().getTestResult();
+
+            pTester.expectThat(actualValue).equals(expectValue).assert();
+        },
+        function dataProvider() {
+            return [
+                [true,  []],
+                [true,  ["a", 2, null]],
+                [true,  new Array()],
+                [false, ""],
+                [false, "0"],
+                [false, new Object()],
+                [false, new Function()],
+                [false, 0],
+                [false, true],
+                [false, null],
+                [false, undefined],
+            ];
+        }
+    )
+]);
+
+var isObject = new TestSuite("Tester.isObject", [
+    new Test("should test if value is an object",
+        function(pTester, pDataProvider) {
+            
+            var dummyTester = (new Tester("Test Dummy")).setOutputEnabled(false);
+            var expectValue = pDataProvider[0];
+            var actualValue = dummyTester.expectThat(pDataProvider[1]).isObject().getTestResult();
+
+            pTester.expectThat(actualValue).equals(expectValue).assert();
+        },
+        function dataProvider() {
+            return [
+                [true,  {}],
+                [true,  []],
+                [true,  ["a", 2, null]],
+                [true,  new Array()],
+                [true,  new Object()],
+                [true,  new String("hello")],
+                [false, new Function()],
+                [false, ""],
+                [false, "0"],
+                [false, 0],
+                [false, true],
+                [false, null],
+                [false, undefined],
+            ];
+        }
+    )
+]);
+
+var isFunction = new TestSuite("Tester.isFunction", [
+    new Test("should test if value is a function",
+        function(pTester, pDataProvider) {
+            
+            var dummyTester = (new Tester("Test Dummy")).setOutputEnabled(false);
+            var expectValue = pDataProvider[0];
+            var actualValue = dummyTester.expectThat(pDataProvider[1]).isFunction().getTestResult();
+
+            pTester.expectThat(actualValue).equals(expectValue).assert();
+        },
+        function dataProvider() {
+            return [
+                [true,  new Function()],
+                [true,  function(){}],
+                [true,  Math.sin],
+                [true,  Array.isArray],
+                [false, new Array()],
+                [false, new Object()],
+                [false, ""],
+                [false, "0"],
+                [false, 0],
+                [false, true],
+                [false, null],
+                [false, undefined],
+            ];
+        }
+    )
+]);
+
+var isNull = new TestSuite("Tester.isNull", [
+    new Test("should test if value is null",
+        function(pTester, pDataProvider) {
+            
+            var dummyTester = (new Tester("Test Dummy")).setOutputEnabled(false);
+            var expectValue = pDataProvider[0];
+            var actualValue = dummyTester.expectThat(pDataProvider[1]).isNull().getTestResult();
+
+            pTester.expectThat(actualValue).equals(expectValue).assert();
+        },
+        function dataProvider() {
+            return [
+                [true,  null],
+                [false, ""],
+                [false, "Hello"],
+                [false, "0"],
+                [false, new String('Hello')],
+                [false, []],
+                [false, 0],
+                [false, true],
+                [false, undefined],
+            ];
+        }
+    )
+]);
+
+var isUndefined = new TestSuite("Tester.isUndefined", [
+    new Test("should test if value is undefined",
+        function(pTester, pDataProvider) {
+            
+            var dummyTester = (new Tester("Test Dummy")).setOutputEnabled(false);
+            var expectValue = pDataProvider[0];
+            var actualValue = dummyTester.expectThat(pDataProvider[1]).isUndefined().getTestResult();
+
+            pTester.expectThat(actualValue).equals(expectValue).assert();
+        },
+        function dataProvider() {
+            return [
+                [true,  undefined],
+                [false, ""],
+                [false, "Hello"],
+                [false, "0"],
+                [false, new String('Hello')],
+                [false, []],
+                [false, 0],
+                [false, true],
+                [false, null],
+            ];
+        }
+    )
+]);
+
+var isUpperCase = new TestSuite("Tester.isUpperCase", [
+    new Test("should test if value is an uppercase string",
+        function(pTester, pDataProvider) {
+            
+            var dummyTester = (new Tester("Test Dummy")).setOutputEnabled(false);
+            var expectValue = pDataProvider[0];
+            var actualValue = dummyTester.expectThat(pDataProvider[1]).isUpperCase().getTestResult();
+
+            pTester.expectThat(actualValue).equals(expectValue).assert();
+        },
+        function dataProvider() {
+            return [
+                [true,  "HELLO"],
+                [false, "HeLlo"],
+                [false, "hello"],
+                [false, "0"],
+                [false, new String('Hello')],
+                [false, []],
+                [false, 0],
+                [false, true],
+                [false, null],
+                [false, undefined],
+            ];
+        }
+    )
+]);
+
+var isLowerCase = new TestSuite("Tester.isLowerCase", [
+    new Test("should test if value is a lowercase string",
+        function(pTester, pDataProvider) {
+            
+            var dummyTester = (new Tester("Test Dummy")).setOutputEnabled(false);
+            var expectValue = pDataProvider[0];
+            var actualValue = dummyTester.expectThat(pDataProvider[1]).isLowerCase().getTestResult();
+
+            pTester.expectThat(actualValue).equals(expectValue).assert();
+        },
+        function dataProvider() {
+            return [
+                [true,  "hello"],
+                [false, "HELLO"],
+                [false, "HeLlo"],
+                [false, "0"],
+                [false, new String('Hello')],
+                [false, []],
+                [false, 0],
+                [false, true],
+                [false, null],
+                [false, undefined],
+            ];
+        }
+    )
+]);
+
+var startsWith = new TestSuite("Tester.startsWith", [
+    new Test("should test if value starts with a given string",
+        function(pTester, pDataProvider) {
+            
+            var dummyTester = (new Tester("Test Dummy")).setOutputEnabled(false);
+            var expectValue = pDataProvider[0];
+            var actualValue = dummyTester.expectThat(pDataProvider[1]).startsWith(pDataProvider[2]).getTestResult();
+
+            pTester.expectThat(actualValue).equals(expectValue).assert();
+        },
+        function dataProvider() {
+            return [
+                [true,  "Millenium Falcon", "Mill"],
+                [false, "Millenium Falcon", "MILL"],
+                [false, "Millenium Falcon", "Abc"],
+                [false, "Millenium Falcon", "0"],
+            ];
+        }
+    )
+]);
+
+var endsWith = new TestSuite("Tester.endsWith", [
+    new Test("should test if value ends with a given string",
+        function(pTester, pDataProvider) {
+            
+            var dummyTester = (new Tester("Test Dummy")).setOutputEnabled(false);
+            var expectValue = pDataProvider[0];
+            var actualValue = dummyTester.expectThat(pDataProvider[1]).endsWith(pDataProvider[2]).getTestResult();
+
+            pTester.expectThat(actualValue).equals(expectValue).assert();
+        },
+        function dataProvider() {
+            return [
+                [true,  "Millenium Falcon", "con"],
+                [false, "Millenium Falcon", "CON"],
+                [false, "Millenium Falcon", "Abc"],
+                [false, "Millenium Falcon", "0"],
+            ];
+        }
+    )
+]);
+
+var isInstanceOf = new TestSuite("Tester.isInstanceOf", [
+    new Test("should test if value is an instance of given class",
+        function(pTester, pDataProvider) {
+            
+            var dummyTester = (new Tester("Test Dummy")).setOutputEnabled(false);
+            var expectValue = pDataProvider[0];
+            var actualValue = dummyTester.expectThat(pDataProvider[1]).isInstanceOf(pDataProvider[2]).getTestResult();
+
+            pTester.expectThat(actualValue).equals(expectValue).assert();
+        },
+        function dataProvider() {
+            return [
+                [true,  new Tester(), "Tester"],
+                [true,  [],           "Array"],
+                [true,  {},           "Object"],
+                [false, "abc",        "String"],
+                [false, true,         "Boolean"],
+                [false, 0,            "Number"],
+            ];
+        }
+    )
+]);
+
+var hasLength = new TestSuite("Tester.hasLength", [
+    new Test("should test if value has the expected length",
+        function(pTester, pDataProvider) {
+            
+            var dummyTester = (new Tester("Test Dummy")).setOutputEnabled(false);
+            var expectValue = pDataProvider[0];
+            var actualValue = dummyTester.expectThat(pDataProvider[1]).hasLength(pDataProvider[2]).getTestResult();
+
+            pTester.expectThat(actualValue).equals(expectValue).assert();
+        },
+        function dataProvider() {
+            return [
+                [true,  "",               0],
+                [true,  [],               0],
+                [true,  {},               0],
+                [true,  "abc",            3],
+                [true,  ["a", "z"],       2],
+                [true,  new String("?!"), 2],
+                [false, 0,                1],
+                [false, true,             1],
+                [false, null,             1],
+                [false, undefined,        1],
+            ];
+        }
+    )
+]);
+
+
+var hasMinLength = new TestSuite("Tester.hasMinLength", [
+    new Test("should test if value has the expected minimum length",
+        function(pTester, pDataProvider) {
+            
+            var dummyTester = (new Tester("Test Dummy")).setOutputEnabled(false);
+            var expectValue = pDataProvider[0];
+            var actualValue = dummyTester.expectThat(pDataProvider[1]).hasMinLength(pDataProvider[2]).getTestResult();
+
+            pTester.expectThat(actualValue).equals(expectValue).assert();
+        },
+        function dataProvider() {
+            return [
+                [true,  "",               0],
+                [true,  [],               0],
+                [true,  {},               0],
+                [true,  "abc",            3],
+                [true,  "abc",            2],
+                [true,  ["a", "z"],       2],
+                [true,  ["a", "z"],       1],
+                [true,  new String("?!"), 2],
+                [false, "abc",            4],
+                [false, ["a", "z"],       5],
+                [false, 0,                1],
+                [false, true,             1],
+                [false, null,             1],
+                [false, undefined,        1],
+            ];
+        }
+    )
+]);
+
+
+var hasMaxLength = new TestSuite("Tester.hasMaxLength", [
+    new Test("should test if value has the expected maximum length",
+        function(pTester, pDataProvider) {
+            
+            var dummyTester = (new Tester("Test Dummy")).setOutputEnabled(false);
+            var expectValue = pDataProvider[0];
+            var actualValue = dummyTester.expectThat(pDataProvider[1]).hasMaxLength(pDataProvider[2]).getTestResult();
+
+            pTester.expectThat(actualValue).equals(expectValue).assert();
+        },
+        function dataProvider() {
+            return [
+                [true,  "",               0],
+                [true,  [],               0],
+                [true,  {},               0],
+                [true,  "abc",            3],
+                [true,  "abc",            4],
+                [true,  ["a", "z"],       2],
+                [true,  ["a", "z"],       3],
+                [true,  new String("?!"), 2],
+                [false, "abc",            2],
+                [false, ["a", "z"],       1],
+                [false, 0,                1],
+                [false, true,             1],
+                [false, null,             1],
+                [false, undefined,        1],
+            ];
+        }
+    )
+]);
+
+var not = new TestSuite("Tester.not", [
+    new Test("should test negation of compare tests",
+        function(pTester, pDataProvider) {
+            
+            var dummyTester = (new Tester("Test Dummy")).setOutputEnabled(false);
+            var expectValue = pDataProvider[0];
+            var method = pDataProvider[1];
+            var actualValue = dummyTester.expectThat(pDataProvider[2]).not()[method](pDataProvider[3]).getTestResult();
+
+            pTester.expectThat(actualValue).equals(expectValue).assert();
+        },
+        function dataProvider() {
+            var num = 0;
+            var str = '0';
+            var objStr = new String('0');
+            var obj_1 = {a: 1, b: 2, c: 3};
+            var obj_2 = {x: null, y: "test", z: true};
+            
+            return [
+                [true,  "equals",         true,               false],
+                [true,  "equals",         obj_1,              obj_2],
+                [true,  "equals",         num,                objStr],
+                [false, "equals",         num,                num],
+                [false, "equals",         str,                str],
+                [false, "equals",         true,               true],
+                [true,  "isGreater",      3,                  3],
+                [true,  "isGreater",      0,                  5],
+                [true,  "isGreater",      1234,               5678],
+                [false, "isGreater",      1,                  0],
+                [false, "isGreater",      100,                10],
+                [true,  "isGreaterEqual", 0,                  5],
+                [true,  "isGreaterEqual", 1234,               5678],
+                [false, "isGreaterEqual", 1,                  0],
+                [false, "isGreaterEqual", 101,                100],
+                [false, "isGreaterEqual", 3,                  3],
+                [true,  "isLower",        3,                  3],
+                [true,  "isLower",        5,                  0],
+                [true,  "isLower",        5678,               1234],
+                [false, "isLower",        0,                  1],
+                [false, "isLower",        10,                 100],
+                [true,  "isLowerEqual",   5,                  0],
+                [true,  "isLowerEqual",   5678,               1234],
+                [false, "isLowerEqual",   0,                  1],
+                [false, "isLowerEqual",   100,                101],
+                [false, "isLowerEqual",   3,                  3],
+                [true,  "startsWith",     "Millenium Falcon", "MILL"],
+                [true,  "startsWith",     "Millenium Falcon", "Abc"],
+                [true,  "startsWith",     "Millenium Falcon", "0"],
+                [false, "startsWith",     "Millenium Falcon", "Mill"],
+                [true,  "endsWith",       "Millenium Falcon", "CON"],
+                [true,  "endsWith",       "Millenium Falcon", "Abc"],
+                [true,  "endsWith",       "Millenium Falcon", "0"],
+                [false, "endsWith",       "Millenium Falcon", "con"],
+                [true,  "isInstanceOf",   "abc",              "String"],
+                [true,  "isInstanceOf",   true,               "Boolean"],
+                [true,  "isInstanceOf",   0,                  "Number"],
+                [false, "isInstanceOf",   new Tester(),       "Tester"],
+                [false, "isInstanceOf",   [],                 "Array"],
+                [false, "isInstanceOf",   {},                 "Object"],
+                [true,  "hasLength",      0,                  1],
+                [true,  "hasLength",      true,               1],
+                [true,  "hasLength",      null,               1],
+                [true,  "hasLength",      undefined,          1],
+                [false, "hasLength",      "",                 0],
+                [false, "hasLength",      [],                 0],
+                [false, "hasLength",      {},                 0],
+                [false, "hasLength",      "abc",              3],
+                [false, "hasLength",      ["a", "z"],         2],
+                [false, "hasLength",      new String("?!"),   2],
+            ];
+        }
+    ),
+    new Test("should test negation of type tests",
+        function(pTester, pDataProvider) {
+            
+            var dummyTester = (new Tester("Test Dummy")).setOutputEnabled(false);
+            var expectValue = pDataProvider[0];
+            var method = pDataProvider[1];
+            var actualValue = dummyTester.expectThat(pDataProvider[2]).not()[method]().getTestResult();
+
+            pTester.expectThat(actualValue).equals(expectValue).assert();
+        },
+        function dataProvider() {
+            return [
+                [true,  "isBoolean",   "true"],
+                [true,  "isBoolean",   "false"],
+                [true,  "isBoolean",   ""],
+                [true,  "isBoolean",   "0"],
+                [true,  "isBoolean",   0],
+                [true,  "isBoolean",   new Object()],
+                [true,  "isBoolean",   []],
+                [true,  "isBoolean",   null],
+                [true,  "isBoolean",   undefined],
+                [false, "isBoolean",   true],
+                [false, "isBoolean",   false],
+                [true,  "isNumber",    ""],
+                [true,  "isNumber",    "0"],
+                [true,  "isNumber",    new Object()],
+                [true,  "isNumber",    []],
+                [true,  "isNumber",    true],
+                [true,  "isNumber",    null],
+                [true,  "isNumber",    undefined],
+                [false, "isNumber",    0],
+                [false, "isNumber",    100],
+                [false, "isNumber",    33.33333],
+                [false, "isNumber",    0xFFFFFF],
+                [false, "isNumber",    0777], // Octal
+                [false, "isNumber",    2e6], // Exponentiation
+                [false, "isNumber",    0.1e2], // Exponentiation
+                [false, "isNumber",    +Infinity],
+                [false, "isNumber",    -Infinity],
+                [false, "isNumber",    NaN],
+                [true,  "isNumeric",   ""],
+                [true,  "isNumeric",   new Object()],
+                [true,  "isNumeric",   []],
+                [true,  "isNumeric",   true],
+                [true,  "isNumeric",   null],
+                [true,  "isNumeric",   undefined],
+                [false, "isNumeric",   0],
+                [false, "isNumeric",   100],
+                [false, "isNumeric",   33.33333],
+                [false, "isNumeric",   "0777"], // Octal
+                [false, "isNumeric",   "2e6"], // Exponentiation
+                [false, "isNumeric",   "0.1e2"], // Exponentiation
+                [false, "isNumeric",   +Infinity],
+                [false, "isNumeric",   -Infinity],
+                [false, "isNumeric",   NaN],
+                [false, "isNumeric",   "50000"],
+                [false, "isNumeric",   "0"],
+                [true,  "isNaN",       0],
+                [true,  "isNaN",       100],
+                [true,  "isNaN",       33.33333],
+                [true,  "isNaN",       "0777"], // Octal
+                [true,  "isNaN",       "2e6"], // Exponentiation
+                [true,  "isNaN",       "0.1e2"], // Exponentiation
+                [true,  "isNaN",       +Infinity],
+                [true,  "isNaN",       -Infinity],
+                [true,  "isNaN",       "50000"],
+                [true,  "isNaN",       "0"],
+                [true,  "isNaN",       ""],
+                [true,  "isNaN",       new Object()],
+                [true,  "isNaN",       []],
+                [true,  "isNaN",       true],
+                [true,  "isNaN",       null],
+                [true,  "isNaN",       undefined],
+                [false, "isNaN",       NaN],
+                [true,  "isInteger",   33.33333],
+                [true,  "isInteger",   +Infinity],
+                [true,  "isInteger",   -Infinity],
+                [true,  "isInteger",   NaN],
+                [true,  "isInteger",   ""],
+                [true,  "isInteger",   new Object()],
+                [true,  "isInteger",   []],
+                [true,  "isInteger",   true],
+                [true,  "isInteger",   null],
+                [true,  "isInteger",   undefined],
+                [false, "isInteger",   0],
+                [false, "isInteger",   100],
+                [false, "isInteger",   0xFFFFFF],
+                [false, "isInteger",   0777], // Octal
+                [false, "isInteger",   2e6], // Exponentiation
+                [false, "isInteger",   0.1e2], // Exponentiation
+                [false, "isInteger",   "0"],
+                [true,  "isFloat",     0],
+                [true,  "isFloat",     100],
+                [true,  "isFloat",     0xFFFFFF],
+                [true,  "isFloat",     0777], // Octal
+                [true,  "isFloat",     2e6], // Exponentiation
+                [true,  "isFloat",     0.1e2], // Exponentiation
+                [true,  "isFloat",     +Infinity],
+                [true,  "isFloat",     -Infinity],
+                [true,  "isFloat",     NaN],
+                [true,  "isFloat",     ""],
+                [true,  "isFloat",     "0"],
+                [true,  "isFloat",     new Object()],
+                [true,  "isFloat",     []],
+                [true,  "isFloat",     true],
+                [true,  "isFloat",     null],
+                [true,  "isFloat",     undefined],
+                [false, "isFloat",     33.33333],
+                [true,  "isString",    new String('Hello')],
+                [true,  "isString",    []],
+                [true,  "isString",    0],
+                [true,  "isString",    true],
+                [true,  "isString",    null],
+                [true,  "isString",    undefined],
+                [false, "isString",    ""],
+                [false, "isString",    "Hello"],
+                [false, "isString",    "0"],
+                [true,  "isArray",     ""],
+                [true,  "isArray",     "0"],
+                [true,  "isArray",     new Object()],
+                [true,  "isArray",     new Function()],
+                [true,  "isArray",     0],
+                [true,  "isArray",     true],
+                [true,  "isArray",     null],
+                [true,  "isArray",     undefined],
+                [false, "isArray",     []],
+                [false, "isArray",     ["a", 2, null]],
+                [false, "isArray",     new Array()],
+                [true,  "isObject",    new Function()],
+                [true,  "isObject",    ""],
+                [true,  "isObject",    "0"],
+                [true,  "isObject",    0],
+                [true,  "isObject",    true],
+                [true,  "isObject",    null],
+                [true,  "isObject",    undefined],
+                [false, "isObject",    {}],
+                [false, "isObject",    []],
+                [false, "isObject",    ["a", 2, null]],
+                [false, "isObject",    new Array()],
+                [false, "isObject",    new Object()],
+                [false, "isObject",    new String("hello")],
+                [true,  "isFunction",  new Array()],
+                [true,  "isFunction",  new Object()],
+                [true,  "isFunction",  ""],
+                [true,  "isFunction",  "0"],
+                [true,  "isFunction",  0],
+                [true,  "isFunction",  true],
+                [true,  "isFunction",  null],
+                [true,  "isFunction",  undefined],
+                [false, "isFunction",  new Function()],
+                [false, "isFunction",  function(){}],
+                [false, "isFunction",  Math.sin],
+                [false, "isFunction",  Array.isArray],
+                [true,  "isNull",      ""],
+                [true,  "isNull",      "Hello"],
+                [true,  "isNull",      "0"],
+                [true,  "isNull",      new String('Hello')],
+                [true,  "isNull",      []],
+                [true,  "isNull",      0],
+                [true,  "isNull",      true],
+                [true,  "isNull",      undefined],
+                [false, "isNull",      null],
+                [true,  "isUndefined", ""],
+                [true,  "isUndefined", "Hello"],
+                [true,  "isUndefined", "0"],
+                [true,  "isUndefined", new String('Hello')],
+                [true,  "isUndefined", []],
+                [true,  "isUndefined", 0],
+                [true,  "isUndefined", true],
+                [true,  "isUndefined", null],
+                [false, "isUndefined", undefined],
+                [true,  "isUpperCase", "HeLlo"],
+                [true,  "isUpperCase", "hello"],
+                [true,  "isUpperCase", "0"],
+                [true,  "isUpperCase", new String('Hello')],
+                [true,  "isUpperCase", []],
+                [true,  "isUpperCase", 0],
+                [true,  "isUpperCase", true],
+                [true,  "isUpperCase", null],
+                [true,  "isUpperCase", undefined],
+                [false, "isUpperCase", "HELLO"],
+                [true,  "isLowerCase", "HELLO"],
+                [true,  "isLowerCase", "HeLlo"],
+                [true,  "isLowerCase", "0"],
+                [true,  "isLowerCase", new String('Hello')],
+                [true,  "isLowerCase", []],
+                [true,  "isLowerCase", 0],
+                [true,  "isLowerCase", true],
+                [true,  "isLowerCase", null],
+                [true,  "isLowerCase", undefined],
+                [false, "isLowerCase", "hello"],
+            ];
+        }
+    ),
+    new Test("should not affect other assertions",
+    function(pTester) {
+
+        var dummyTester = (new Tester("Test Dummy")).setOutputEnabled(false);
+        //first assertion with not()-call
+        var expectValue = true;
+        var actualValue = dummyTester.expectThat("this value").not().equals("that other value").getTestResult();
+        pTester.expectThat(actualValue).equals(expectValue).assert();
+
+        //second test without not()-call => the first not()-call should not affect the second assertion
+        expectValue = false;
+        actualValue = dummyTester.expectThat("this value").equals("that other value").getTestResult();
+        pTester.expectThat(actualValue).equals(expectValue).assert();
+    }
+    )
+]);
+
+var elementAt = new TestSuite("Tester.elementAt", [
+    new Test("should test if value element at key position passes test",
+        function(pTester, pDataProvider) {
+            
+            var dummyTester = (new Tester("Test Dummy")).setOutputEnabled(false);
+            var expectValue = pDataProvider[0];
+            var key = pDataProvider[2];
+            var method = pDataProvider[3];
+            var actualValue = dummyTester.expectThat(pDataProvider[1]).elementAt(key)[method](pDataProvider[4]).getTestResult();
+
+            pTester.expectThat(actualValue).equals(expectValue).assert();
+        },
+        function dataProvider() {
+            return [
+                [true,  ["a", "z", ["x", true, 42]],                0, "isString",  undefined],
+                [true,  ["a", "z", ["x", true, 42]],                1, "equals",    "z"],
+                [true,  ["a", "z", ["x", true, 42]],                2, "isArray",   undefined],
+                [true,  ["a", "z", ["x", true, 42]],                2, "hasLength", 3],
+                [true,  ["a", "z", {"first": "x", "second": true}], 2, "isObject",  undefined],
+                [true,  ["a", "z", {"first": "x", "second": true}], 2, "hasLength", 2],
+                [false, ["a", "z", ["x", true, 42]],                0, "isNumeric", undefined],
+                [false, ["a", "z", ["x", true, 42]],                1, "equals",    "a"],
+                [false, ["a", "z", ["x", true, 42]],                2, "isString",  undefined],
+                [false, ["a", "z", ["x", true, 42]],                2, "hasLength", 1],
+                [false, ["a", "z", {"first": "x", "second": true}], 2, "isArray",   undefined],
+                [false, ["a", "z", {"first": "x", "second": true}], 2, "hasLength", 1],
+            ];
+        }
+    ),
+    new Test("should test if nested value element at key position passes test",
+        function(pTester, pDataProvider) {
+            
+            var dummyTester = (new Tester("Test Dummy")).setOutputEnabled(false);
+            var expectValue = pDataProvider[0];
+            var key1 = pDataProvider[2];
+            var key2 = pDataProvider[3];
+            var method = pDataProvider[4];
+            var actualValue = dummyTester.expectThat(pDataProvider[1]).elementAt(key1).elementAt(key2)[method](pDataProvider[5]).getTestResult();
+
+            pTester.expectThat(actualValue).equals(expectValue).assert();
+        },
+        function dataProvider() {
+            return [
+                [true,  [["x", true, [42]]],            0,       0,        "isString",  undefined],
+                [true,  [["x", true, [42]]],            0,       0,        "equals",    "x"],
+                [true,  [["x", true, [42]]],            0,       1,        "isBoolean", undefined],
+                [true,  [["x", true, [42]]],            0,       1,        "equals",    true],
+                [true,  [["x", true, [42]]],            0,       2,        "isArray",   undefined],
+                [true,  [{"first": "a", "second": 42}], 0,       "first",  "equals",    "a"],
+                [true,  [{"first": "a", "second": 42}], 0,       "second", "equals",    42],
+                [true,  {"outer": {"inner": "a"}},      "outer", "inner",  "isString",  undefined],
+                [true,  {"outer": {"inner": "a"}},      "outer", "inner",  "equals",    "a"],
+                [false, [["x", true, [42]]],            0,       1,        "equals",    "a"],
+                [false, [["x", true, [42]]],            0,       2,        "isNumber",  undefined],
+                [false, {"outer": {"inner": "a"}},      "outer", "inner",  "isNumber",  undefined],
+            ];
+        }
+    )
+]);
+
+var getCoverageRate = new TestSuite("Tester._getCoverageRate", [
+    new Test("should test if coverage is correctly calculated",
+        function(pTester, pDataProvider) {
+            
+            var dummyTester = (new Tester("Test Dummy")).setOutputEnabled(false);
+            var expectValue = pDataProvider[0];
+            dummyTester.methods = pDataProvider[1];
+            dummyTester.methodsCalled = pDataProvider[2];
+            var actualValue = dummyTester._getCoverageRate();
+
+            pTester.expectThat(actualValue).equals(expectValue).assert();
+        },
+        function dataProvider() {
+            return [
+                [100,   ["method1", "method2", "method3"], ["method1", "method2", "method3"]],
+                [33.33, ["method1", "method2", "method3"], ["method1"]],
+                [66.67, ["method1", "method2", "method3"], ["method1", "method2"]],
+                [100,   ["method1"],                       ["method1", "method2", "method3"]],
+                [0,     ["method1"],                       []],
+                [0,     [],                                ["method1"]],
+                [null,  [],                                []],
+            ];
+        }
+    )
+]);
+
+var getLength = new TestSuite("Tester._getLength", [
+    new Test("should test if value has the expected length",
+        function(pTester, pDataProvider) {
+            
+            var dummyTester = (new Tester("Test Dummy")).setOutputEnabled(false);
+            var expectValue = pDataProvider[1];
+            var actualValue = dummyTester._getLength(pDataProvider[0]);
+
+            pTester.expectThat(actualValue).equals(expectValue).assert();
+        },
+        function dataProvider() {
+            return [
+                ["",               0],
+                [[],               0],
+                [{},               0],
+                ["abc",            3],
+                [["a", "z"],       2],
+                [new String("?!"), 2],
+                [{first: "xyz"},   1],
+                [0,                undefined],
+                [true,             undefined],
+                [null,             undefined],
+                [undefined,        undefined],
+            ];
+        }
+    )
+]);
+
+
+
+var tester = new Tester("Test UnitTest_lib");
+tester.initCoverage(Tester);
+tester.test(equals);
+tester.test(isGreater);
+tester.test(isGreaterEqual);
+tester.test(isLower);
+tester.test(isLowerEqual);
+tester.test(isBoolean);
+tester.test(isNumber);
+tester.test(isNumeric);
+tester.test(isNotANumber);
+tester.test(isInteger);
+tester.test(isFloat);
+tester.test(isString);
+tester.test(isArray);
+tester.test(isObject);
+tester.test(isFunction);
+tester.test(isNull);
+tester.test(isUndefined);
+tester.test(isUpperCase);
+tester.test(isLowerCase);
+tester.test(startsWith);
+tester.test(endsWith);
+tester.test(isInstanceOf);
+tester.test(hasLength);
+tester.test(hasMinLength);
+tester.test(hasMaxLength);
+tester.test(not);
+tester.test(elementAt);
+tester.test(getCoverageRate);
+tester.test(getLength);
+
+tester.summary();
+    
+result.object(tester.getResults());
diff --git a/process/Util_lib/process.js b/process/Util_lib/process.js
index 9dc7208091d..97545be1730 100644
--- a/process/Util_lib/process.js
+++ b/process/Util_lib/process.js
@@ -183,6 +183,39 @@ Utils.isNumber = function (pValue)
     return typeof pValue === "number";
 }
 
+/**
+ * Checks if the given value is numeric.
+ * 
+ * @param {Object} pValue the value to check
+ * @return {Boolean} true if the value is numeric
+ */
+Utils.isNumeric = function (pValue)
+{
+    return Utils.isNumber(pValue) || (!isNaN(parseFloat(pValue)) && isFinite(pValue));
+}
+
+/**
+ * Checks if the given value is an integer.
+ * 
+ * @param {Object} pValue the value to check
+ * @return {Boolean} true if the value is an integer
+ */
+Utils.isInteger = function (pValue)
+{
+    return Number.isInteger(parseFloat(pValue)) && isFinite(pValue);
+}
+
+/**
+ * Checks if the given value is a floating point number.
+ * 
+ * @param {Object} pValue the value to check
+ * @return {Boolean} true if the value is a float
+ */
+Utils.isFloat = function (pValue)
+{
+    return !Number.isInteger(parseFloat(pValue)) && !isNaN(parseFloat(pValue)) && isFinite(pValue);
+}
+
 /**
  * Checks if the given value is an object. Be careful, null is also considered "object".
  * 
@@ -191,7 +224,7 @@ Utils.isNumber = function (pValue)
  */
 Utils.isObject = function (pValue)
 {
-    return typeof pValue === "object";
+    return typeof pValue === "object" && pValue !== null;
 }
 
 /**
diff --git a/process/_all_test/_all_test.aod b/process/_all_test/_all_test.aod
new file mode 100644
index 00000000000..4336a9ddb94
--- /dev/null
+++ b/process/_all_test/_all_test.aod
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+  <name>_all_test</name>
+  <title>[TEST] .All</title>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <icon>VAADIN:CHECK_CIRCLE</icon>
+  <process>%aditoprj%/process/_all_test/process.js</process>
+  <alias>Data_alias</alias>
+  <variants>
+    <element>EXECUTABLE</element>
+  </variants>
+</process>
diff --git a/process/_all_test/process.js b/process/_all_test/process.js
new file mode 100644
index 00000000000..cbc75f35849
--- /dev/null
+++ b/process/_all_test/process.js
@@ -0,0 +1,23 @@
+import("system.logging");
+import("system.process");
+import("UnitTest_lib");
+import("Terminal_lib");
+
+
+var testResults = [];
+
+process.getProcesses([process.VARIANT_EXECUTABLE]).forEach(function(pProcessName) {
+    // Run all executable processes ending with "_test" except THIS one
+    if(pProcessName !== "_all_test" && pProcessName.substr(-5, 5) === "_test") {
+        var startConfig = process.createStartConfig().setName(pProcessName);
+        var testResult = JSON.parse(process.start(startConfig));
+        
+        if(testResult !== null && typeof testResult === "object") {
+            testResults.push(testResult);
+        }
+    }
+});
+
+var tester = new Tester("");
+tester.summary(testResults);
+
-- 
GitLab


From a62cad9fb6ae986fa384098b4a7d256dd6190cca Mon Sep 17 00:00:00 2001
From: Sebastian Listl <s.listl@adito.de>
Date: Fri, 30 Oct 2020 09:51:37 +0100
Subject: [PATCH 047/184] 1067663 sql queries fixed for oracle

---
 .../object_rowid.displayvalue/expression.js   |  2 +-
 .../object_rowid.displayvalue/expression.js   |  2 +-
 .../object_rowid.displayvalue/expression.js   |  2 +-
 .../object_rowid.displayvalue/expression.js   |  2 +-
 .../offer_id.displayvalue/expression.js       |  3 +-
 .../recordcontainers/jdito/contentProcess.js  |  4 +-
 process/Context_lib/process.js                | 29 +++++------
 process/Keyword_lib/process.js                |  1 +
 process/Sql_lib/process.js                    | 15 +++++-
 process/Turnover_lib/process.js               | 51 +++++++++++++------
 10 files changed, 73 insertions(+), 38 deletions(-)

diff --git a/entity/Competition_entity/recordcontainers/db/recordfieldmappings/object_rowid.displayvalue/expression.js b/entity/Competition_entity/recordcontainers/db/recordfieldmappings/object_rowid.displayvalue/expression.js
index 33554680ccc..fb69d484cfa 100644
--- a/entity/Competition_entity/recordcontainers/db/recordfieldmappings/object_rowid.displayvalue/expression.js
+++ b/entity/Competition_entity/recordcontainers/db/recordfieldmappings/object_rowid.displayvalue/expression.js
@@ -1,4 +1,4 @@
 import("system.result");
 import("Context_lib");
 
-result.string(ContextUtils.getNameSubselectSql("OBJECT_TYPE", "OBJECT_ROWID"))
\ No newline at end of file
+result.string(ContextUtils.getNameSubselectSql("COMPETITION.OBJECT_TYPE", "COMPETITION.OBJECT_ROWID"))
\ No newline at end of file
diff --git a/entity/Forecast_entity/recordcontainers/db/recordfieldmappings/object_rowid.displayvalue/expression.js b/entity/Forecast_entity/recordcontainers/db/recordfieldmappings/object_rowid.displayvalue/expression.js
index 33554680ccc..856c1bb3cff 100644
--- a/entity/Forecast_entity/recordcontainers/db/recordfieldmappings/object_rowid.displayvalue/expression.js
+++ b/entity/Forecast_entity/recordcontainers/db/recordfieldmappings/object_rowid.displayvalue/expression.js
@@ -1,4 +1,4 @@
 import("system.result");
 import("Context_lib");
 
-result.string(ContextUtils.getNameSubselectSql("OBJECT_TYPE", "OBJECT_ROWID"))
\ No newline at end of file
+result.string(ContextUtils.getNameSubselectSql("FORECAST.OBJECT_TYPE", "FORECAST.OBJECT_ROWID"))
\ No newline at end of file
diff --git a/entity/Member_entity/recordcontainers/db/recordfieldmappings/object_rowid.displayvalue/expression.js b/entity/Member_entity/recordcontainers/db/recordfieldmappings/object_rowid.displayvalue/expression.js
index 000d055cfac..a5d62617bee 100644
--- a/entity/Member_entity/recordcontainers/db/recordfieldmappings/object_rowid.displayvalue/expression.js
+++ b/entity/Member_entity/recordcontainers/db/recordfieldmappings/object_rowid.displayvalue/expression.js
@@ -5,6 +5,6 @@ import("Context_lib");
 //TODO: refactor:
 //whenever we want to shrink data for a single object it's not needed to resolve the objects name where we're from
 if (vars.get("$param.ObjectType_param") == null)
-    result.string(ContextUtils.getNameSubselectSql("OBJECT_TYPE", "OBJECT_ROWID"));
+    result.string(ContextUtils.getNameSubselectSql("OBJECTMEMBER.OBJECT_TYPE", "OBJECTMEMBER.OBJECT_ROWID"));
 else
     result.string("'OBJECT_ROWID.displayValue not loaded'");
\ No newline at end of file
diff --git a/entity/Offer_entity/recordcontainers/db/recordfieldmappings/object_rowid.displayvalue/expression.js b/entity/Offer_entity/recordcontainers/db/recordfieldmappings/object_rowid.displayvalue/expression.js
index 33554680ccc..c0332af5cb5 100644
--- a/entity/Offer_entity/recordcontainers/db/recordfieldmappings/object_rowid.displayvalue/expression.js
+++ b/entity/Offer_entity/recordcontainers/db/recordfieldmappings/object_rowid.displayvalue/expression.js
@@ -1,4 +1,4 @@
 import("system.result");
 import("Context_lib");
 
-result.string(ContextUtils.getNameSubselectSql("OBJECT_TYPE", "OBJECT_ROWID"))
\ No newline at end of file
+result.string(ContextUtils.getNameSubselectSql("OFFER.OBJECT_TYPE", "OFFER.OBJECT_ROWID"))
\ No newline at end of file
diff --git a/entity/Order_entity/recordcontainers/db/recordfieldmappings/offer_id.displayvalue/expression.js b/entity/Order_entity/recordcontainers/db/recordfieldmappings/offer_id.displayvalue/expression.js
index a86ac585f27..2aec63a8d1b 100644
--- a/entity/Order_entity/recordcontainers/db/recordfieldmappings/offer_id.displayvalue/expression.js
+++ b/entity/Order_entity/recordcontainers/db/recordfieldmappings/offer_id.displayvalue/expression.js
@@ -1,4 +1,5 @@
 import("system.result");
 import("Context_lib");
+import("system.db");
 
-result.string(ContextUtils.getNameSubselectSql("'Offer'", "SALESORDER.OFFER_ID"));
\ No newline at end of file
+result.string(db.translateStatement(ContextUtils.getNameSql("Offer", "SALESORDER.OFFER_ID")));
\ No newline at end of file
diff --git a/entity/Turnover_entity/recordcontainers/jdito/contentProcess.js b/entity/Turnover_entity/recordcontainers/jdito/contentProcess.js
index bd20eceda69..fd0e3bd7a6f 100644
--- a/entity/Turnover_entity/recordcontainers/jdito/contentProcess.js
+++ b/entity/Turnover_entity/recordcontainers/jdito/contentProcess.js
@@ -27,8 +27,8 @@ import("system.translate");
  */
 
 
-var turnoverCategory = translate.text('Turnover');
-var forecastCategory = translate.text('Forecast');
+var turnoverCategory = translate.text("Turnover");
+var forecastCategory = translate.text("Forecast");
 
 var maxYear = parseInt(vars.get("$param.MaxYear_param"));
 var yearCountToShow = parseInt(vars.get("$param.YearCountToShow_param"));
diff --git a/process/Context_lib/process.js b/process/Context_lib/process.js
index f0e62195ad8..fcf879f0488 100644
--- a/process/Context_lib/process.js
+++ b/process/Context_lib/process.js
@@ -536,31 +536,31 @@ ContextUtils.getSelectMap  = function()
                                             .setStateField("STATUS")
                                             .setActiveStates([$KeywordRegistry.salesprojectState$open(), $KeywordRegistry.salesprojectState$postponed()])
             ,"Contract": ContextSelector.create("CONTRACT", "CONTRACTID")
-                                        .setTitleExpression(maskingUtils.concat([
+                                        .setTitleExpression(maskingUtils.cast(maskingUtils.concat([
                                                                 KeywordUtils.getResolvedTitleSqlPart("ContractType", "CONTRACTTYPE"),
                                                                 maskingUtils.cast("CONTRACTCODE", SQLTYPES.VARCHAR, 10)
-                                                                ], " "))
+                                                                ], " "), SQLTYPES.NVARCHAR, 50))
                                         .setContactIdField("CONTACT_ID")
                                         .setCreationDateField("CONTRACTSTART")
                                         .setStateField("CONTRACTSTATUS")
                                         .setActiveStates([$KeywordRegistry.contractState$validLimited(), $KeywordRegistry.contractState$validUnlimited(), $KeywordRegistry.contractState$notSigned()])
             ,"Offer": ContextSelector.create("OFFER", "OFFERID")
-                                     .setTitleExpression(maskingUtils.concat([
+                                     .setTitleExpression(maskingUtils.cast(maskingUtils.concat([
                                                 "'" + translate.text("Offer") + "'",
                                                 "' '",
                                                 maskingUtils.cast("OFFERCODE", SQLTYPES.VARCHAR, 10),
                                                 "'-'",
                                                 maskingUtils.cast("VERSNR", SQLTYPES.VARCHAR, 10)
-                                                ], "", false))
+                                                ], "", false), SQLTYPES.NVARCHAR, 50))
                                      .setContactIdField("CONTACT_ID")
                                      .setCreationDateField("OFFERDATE")
                                      .setStateField("STATUS")
                                      .setActiveStates([$KeywordRegistry.offerStatus$open(), $KeywordRegistry.offerStatus$checked(), $KeywordRegistry.offerStatus$sent()])
             ,"Order": ContextSelector.create("SALESORDER", "SALESORDERID")
-                                     .setTitleExpression(maskingUtils.concat([
+                                     .setTitleExpression(maskingUtils.cast(maskingUtils.concat([
                                                         KeywordUtils.getResolvedTitleSqlPart("OrderType", "ORDERTYPE"),
                                                         maskingUtils.cast("SALESORDERCODE", SQLTYPES.VARCHAR, 10)
-                                                        ], " "))
+                                                        ], " "), SQLTYPES.NVARCHAR, 50))
                                      .setContactIdField("CONTACT_ID")
                                      .setCreationDateField("SALESORDERDATE")
                                      .setStateField("ORDERSTATUS")
@@ -607,20 +607,19 @@ ContextUtils.getSelectMap  = function()
  */
 ContextUtils.getNameSubselectSql = function(pContextIdDbField, pRowIdDbField)
 {
-    // TODO: prepared?
-    //!SqlBuilder
-    var select = "(case " + pContextIdDbField + " ";
+    var select = SqlBuilder.caseStatement()
 
-    var selectMap = ContextUtils.getSelectMap ()
+    var selectMap = ContextUtils.getSelectMap();
     for (let contextId in selectMap)
     {
-        select += "when '" + contextId + "' then (select " + selectMap[contextId].titleExpression + " from " + selectMap[contextId].getFullFromClause() + (pRowIdDbField ? " where " + selectMap[contextId].getFullIdField() + " = " + pRowIdDbField : " ") + ") ";
+        let titleSelect = newSelect(selectMap[contextId].titleExpression)
+            .from(selectMap[contextId].getFullFromClause())
+            .where(selectMap[contextId].getFullIdField() + " = " + pRowIdDbField);
+            
+        select.when(pContextIdDbField, contextId).then(titleSelect);
     }
 
-    select += "else 'Not defined in ContextUtils.getNameSql()!'";
-    select += "end)";
-
-    return select;
+    return select.toString();
 }
 
 /**
diff --git a/process/Keyword_lib/process.js b/process/Keyword_lib/process.js
index ea1736e5c13..994fd55c07d 100644
--- a/process/Keyword_lib/process.js
+++ b/process/Keyword_lib/process.js
@@ -107,6 +107,7 @@ KeywordUtils.getContainerNames = function()
     //do not cache this list since
     // a) the list can easly change when a new container is created
     // b) where this is called it's not relevant in terms of performance
+    //!SqlBuilder
     var list = db.array(db.COLUMN, "select distinct AB_KEYWORD_ENTRY.CONTAINER from AB_KEYWORD_ENTRY order by AB_KEYWORD_ENTRY.CONTAINER asc");
     return list;
 };
diff --git a/process/Sql_lib/process.js b/process/Sql_lib/process.js
index 49bcb6bfc96..0af28ce22fa 100644
--- a/process/Sql_lib/process.js
+++ b/process/Sql_lib/process.js
@@ -3100,6 +3100,14 @@ SqlBuilder.caseWhen = function (pFieldOrCond, pValue, pCondition, pFieldType)
     return new SqlBuilder._CaseStatement().when(pFieldOrCond, pValue, pCondition, pFieldType);
 }
 
+/**
+ * @return {SqlBuilder._CaseStatement}
+ */
+SqlBuilder.caseStatement = function ()
+{
+    return new SqlBuilder._CaseStatement();
+}
+
 /**
  * Represents a case-when statement
  */
@@ -3373,6 +3381,8 @@ SqlMaskingUtils.prototype.cast = function (pField, pTargetDatatype, pTargetLengt
                 return "char";
             case SQLTYPES.VARCHAR:
                 return "char";
+            case SQLTYPES.NVARCHAR:
+                return "nvarchar";
             case SQLTYPES.INTEGER:
                 return "int";
             case SQLTYPES.DECIMAL:
@@ -3429,6 +3439,9 @@ SqlMaskingUtils.prototype.cast = function (pField, pTargetDatatype, pTargetLengt
                 case SQLTYPES.VARCHAR:
                     sqlDataType = "varchar2";
                     break;
+                case SQLTYPES.NVARCHAR:
+                    sqlDataType = "nvarchar2";
+                    break;
                 case SQLTYPES.INTEGER:
                     sqlDataType = "number";
                     pTargetLength = "10"
@@ -4152,7 +4165,7 @@ SqlUtils.getResolvingCaseWhen = function(pKeyValueArray, pDbFieldName, pLocale)
         else
             return translate.text(value);
     };
-    
+    //!SqlBuilder
     var resSql = "case ", preparedValues = [];
     var colTypeKeyId = SQLTYPES.CHAR;
     var colTypeTitle = SQLTYPES.NVARCHAR;
diff --git a/process/Turnover_lib/process.js b/process/Turnover_lib/process.js
index e8f96a61314..1e69ad37d5f 100644
--- a/process/Turnover_lib/process.js
+++ b/process/Turnover_lib/process.js
@@ -26,24 +26,45 @@ function TurnoverUtil() {}
  */
 TurnoverUtil.getTurnoverData = function (pMaxYear, pYearCount, pSalesprojectId)
 {
-    var turnoverCategory = translate.text('Turnover');
-
+    var turnoverCategory = translate.text("Turnover");
     var minYear = pMaxYear - pYearCount + 1;
+    var sqlMask = new SqlMaskingUtils();
         
     // load data
-    return newSelect("'" + turnoverCategory + "', year(SALESORDERDATE) yearNum, month(SALESORDERDATE) monthNum, SALESORDERITEM.DISCOUNT discount, SALESORDERITEM.VAT vat, SALESORDERITEM.PRICE price, sum(SALESORDERITEM.QUANTITY) quantity, SALESORDERITEM.GROUPCODEID prodGroup, (" + KeywordUtils.getResolvedTitleSqlPart($KeywordRegistry.productGroupcode(), "SALESORDERITEM.GROUPCODEID") + ") prodGroupName")
-                    .from("SALESORDER")
-                    .join("SALESORDERITEM", "SALESORDERITEM.SALESORDER_ID = SALESORDER.SALESORDERID")
-                    .where("SALESORDER.ORDERTYPE", "ORDTYPEINVO")
-                    .and("SALESORDER.ORDERSTATUS = 1")
-                    .and("SALESORDER.CANCELLATION <> 1")
-                    .and("SALESORDERITEM.OPTIONAL <> 1")
-                    .and("SALESORDER.SALESORDERDATE", pMaxYear, "year(#) <= ?", SQLTYPES.INTEGER)
-                    .and("SALESORDER.SALESORDERDATE", minYear, "year(#) >= ?", SQLTYPES.INTEGER)
-                    .andIfSet("SALESORDER.SALESPROJECT_ID", pSalesprojectId)
-                    .groupBy("year(SALESORDERDATE), month(SALESORDERDATE), SALESORDERITEM.GROUPCODEID, SALESORDERITEM.DISCOUNT, SALESORDERITEM.VAT, SALESORDERITEM.PRICE")
-                    .orderBy("yearNum, monthNum")
-                    .table();
+    
+    return newSelect([
+            "'" + turnoverCategory + "'", 
+            sqlMask.yearFromDate("SALESORDERDATE"), 
+            sqlMask.monthFromDate("SALESORDERDATE"),
+            "SALESORDERITEM.DISCOUNT",
+            "SALESORDERITEM.VAT",
+            "SALESORDERITEM.PRICE",
+            "sum(SALESORDERITEM.QUANTITY)",
+            "SALESORDERITEM.GROUPCODEID",
+            KeywordUtils.getResolvedTitleSqlPart($KeywordRegistry.productGroupcode(), "SALESORDERITEM.GROUPCODEID")
+        ])
+        .from("SALESORDER")
+        .join("SALESORDERITEM", "SALESORDERITEM.SALESORDER_ID = SALESORDER.SALESORDERID")
+        .where("SALESORDER.ORDERTYPE", "ORDTYPEINVO")
+        .and("SALESORDER.ORDERSTATUS", "1")
+        .and("SALESORDER.CANCELLATION", "1", SqlBuilder.NOT_EQUAL())
+        .and("SALESORDERITEM.OPTIONAL", "1", SqlBuilder.NOT_EQUAL())
+        .and("SALESORDER.SALESORDERDATE", pMaxYear, sqlMask.yearFromDate("#") + " <= ?", SQLTYPES.INTEGER)
+        .and("SALESORDER.SALESORDERDATE", minYear, sqlMask.yearFromDate("#") + " >= ?", SQLTYPES.INTEGER)
+        .andIfSet("SALESORDER.SALESPROJECT_ID", pSalesprojectId)
+        .groupBy([
+            sqlMask.yearFromDate("SALESORDERDATE"), 
+            sqlMask.monthFromDate("SALESORDERDATE"),
+            "SALESORDERITEM.GROUPCODEID",
+            "SALESORDERITEM.DISCOUNT",
+            "SALESORDERITEM.VAT",
+            "SALESORDERITEM.PRICE"
+        ])
+        .orderBy([
+            sqlMask.yearFromDate("SALESORDERDATE"), 
+            sqlMask.monthFromDate("SALESORDERDATE")
+        ])
+        .table();
 }
 
 /**
-- 
GitLab


From 44cef7690d238204ba0a4cc0f17c8dfdb5da2cf8 Mon Sep 17 00:00:00 2001
From: Sebastian Listl <s.listl@adito.de>
Date: Fri, 30 Oct 2020 09:57:50 +0100
Subject: [PATCH 048/184] ContactTitleRenderer sql correction

---
 process/Contact_lib/process.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/process/Contact_lib/process.js b/process/Contact_lib/process.js
index 1d8216d36f5..4d53dde63a7 100644
--- a/process/Contact_lib/process.js
+++ b/process/Contact_lib/process.js
@@ -661,7 +661,7 @@ function ContactTitleRenderer(pContact, pOptions)
         var maskingUtil = new SqlMaskingUtils();
         var res = maskingUtil.concat([this.contact.salutation, this.contact.title, this.contact.firstname, this.contact.middlename, this.contact.lastname].filter(function (e){
             return e != "";
-        }), " ");
+        }), " ", false);
         //binary AND check for possibility to check serveral options
         if (this._options & ContactTitleRenderer.OPTIONS.IncludeOrganisation && this.contact.organisationName)
             res = maskingUtil.concat([res, this.contact.organisationName], " | ");
-- 
GitLab


From 86efedf5e9072c782f65146b90b9e8fffd0edf67 Mon Sep 17 00:00:00 2001
From: Sebastian Listl <s.listl@adito.de>
Date: Fri, 30 Oct 2020 10:07:23 +0100
Subject: [PATCH 049/184] SqlMaskingUtils.cast map nvarchar to varchar if derby

---
 process/Sql_lib/process.js | 1 +
 1 file changed, 1 insertion(+)

diff --git a/process/Sql_lib/process.js b/process/Sql_lib/process.js
index 0af28ce22fa..d0c827e77c8 100644
--- a/process/Sql_lib/process.js
+++ b/process/Sql_lib/process.js
@@ -3398,6 +3398,7 @@ SqlMaskingUtils.prototype.cast = function (pField, pTargetDatatype, pTargetLengt
         case db.DBTYPE_DERBY10:
             switch(pTargetDatatype) 
             {
+                case SQLTYPES.NVARCHAR:
                 case SQLTYPES.VARCHAR:
                     // Because of a Derby bug, you can't cast INTEGER into VARCHAR
                     // Therefor first cast to char then to varchar
-- 
GitLab


From 9856f4c6e6b4102d9a8dd14a6639eb48f7c82db8 Mon Sep 17 00:00:00 2001
From: "s.pongratz" <s.pongratz@adito.de>
Date: Fri, 30 Oct 2020 10:27:30 +0100
Subject: [PATCH 050/184] #1068034-CampaignDeshlet Fix Condition and
 FromClause-Prozess

---
 .../recordcontainers/db/conditionProcess.js      | 16 ++++------------
 .../recordcontainers/db/fromClauseProcess.js     |  9 +++++----
 2 files changed, 9 insertions(+), 16 deletions(-)

diff --git a/entity/Campaign_entity/recordcontainers/db/conditionProcess.js b/entity/Campaign_entity/recordcontainers/db/conditionProcess.js
index b56a17e4e11..ea77837ea6f 100644
--- a/entity/Campaign_entity/recordcontainers/db/conditionProcess.js
+++ b/entity/Campaign_entity/recordcontainers/db/conditionProcess.js
@@ -7,19 +7,11 @@ import("Sql_lib");
 
 
 var recordState = vars.get("$sys.recordstate");
+var condition = newWhere();
 
 if(vars.get("$param.ShowOnlyCurrentUsersCampaigns_param") == 'true')
 {
-    //TODO: use a preparedCondition (.build instead of .translate) when available #1030812 #1034026
-    result.string(newWhere("CAMPAIGN.EMPLOYEE_CONTACT_ID", EmployeeUtils.getCurrentContactId()).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")
-        ;
+    condition.and("CAMPAIGN.EMPLOYEE_CONTACT_ID", EmployeeUtils.getCurrentContactId());
+}
 
-    result.string(condition.toString());
-} else {
-    
-    result.string(newWhere().toString());
-}
\ No newline at end of file
+result.string(condition.toString());
\ No newline at end of file
diff --git a/entity/Campaign_entity/recordcontainers/db/fromClauseProcess.js b/entity/Campaign_entity/recordcontainers/db/fromClauseProcess.js
index 5eec4c678e0..a24f9dfb3c0 100644
--- a/entity/Campaign_entity/recordcontainers/db/fromClauseProcess.js
+++ b/entity/Campaign_entity/recordcontainers/db/fromClauseProcess.js
@@ -7,10 +7,11 @@ var recordState = vars.get("$sys.recordstate");
 var res = "CAMPAIGN";
 
 if (recordState != neon.OPERATINGSTATE_NEW && recordState != neon.OPERATINGSTATE_EDIT) {
-    var subSelectDateStart = "(select min(DATE_START) as STEPDATESTART_ALIAS, CAMPAIGN_ID from CAMPAIGNSTEP group by CAMPAIGN_ID) as STEPDATESTART_TABLEALIAS";
-    var subSelectDateEnd = "(select max(DATE_END) as STEPDATEEND_ALIAS, CAMPAIGN_ID from CAMPAIGNSTEP group by CAMPAIGN_ID) as STEPDATEEND_TABLEALIAS";
-         
-    res += ", " + subSelectDateStart + ", " + subSelectDateEnd;
+    res +=  " join (select min(DATE_START) as STEPDATESTART_ALIAS, CAMPAIGN_ID from CAMPAIGNSTEP group by CAMPAIGN_ID) as STEPDATESTART_TABLEALIAS"
+        + " on STEPDATESTART_TABLEALIAS.CAMPAIGN_ID = CAMPAIGN.CAMPAIGNID "
+        + " join (select max(DATE_END) as STEPDATEEND_ALIAS, CAMPAIGN_ID from CAMPAIGNSTEP group by CAMPAIGN_ID) as STEPDATEEND_TABLEALIAS"
+        + " on STEPDATEEND_TABLEALIAS.CAMPAIGN_ID = CAMPAIGN.CAMPAIGNID ";
+
 }
 
 result.string(res);
-- 
GitLab


From fcdadc8bd486c32bf7362794f56aca4398e3e887 Mon Sep 17 00:00:00 2001
From: Sebastian Listl <s.listl@adito.de>
Date: Fri, 30 Oct 2020 11:36:53 +0100
Subject: [PATCH 051/184] Utils.clone support for Map, Set and Symbol
 properties

---
 process/Sql_lib/process.js  | 27 +++++------------------
 process/Util_lib/process.js | 43 ++++++++++++++++++++++++++++++-------
 2 files changed, 40 insertions(+), 30 deletions(-)

diff --git a/process/Sql_lib/process.js b/process/Sql_lib/process.js
index d0c827e77c8..fc73644c520 100644
--- a/process/Sql_lib/process.js
+++ b/process/Sql_lib/process.js
@@ -801,8 +801,6 @@ function SqlBuilder (pAlias)
     
     this._where = {};
     this._initWhere();
-    
-    SqlBuilder.defineCanBuildSql(this);
 }
 
 /**
@@ -823,6 +821,8 @@ SqlBuilder.checkCanBuildSql = function (pObject)
     return pObject[SqlBuilder.getCanBuildSqlSymbol()];
 }
 
+SqlBuilder.defineCanBuildSql(SqlBuilder.prototype);
+
 /**
  * Deep copies the SqlBuilder object and returns a new one.<br/>
  * Use this if you want to add for example add additional parameters without modifying the current builder.
@@ -830,25 +830,7 @@ SqlBuilder.checkCanBuildSql = function (pObject)
  */
 SqlBuilder.prototype.copy = function()
 {
-    var newBuilder = _deepCopyByJson(this, new SqlBuilder());
-    return newBuilder;
-    
-    // NOTE: this works only with simple data types. 
-    // Here we only use strings, arrays, booleans and null, so this should work
-    function _deepCopyByJson(pObject, pNewObject)
-    {
-        // deep copy by using json
-        var deepCopied = JSON.parse(JSON.stringify(pObject));
-        
-        // set the props of the new object to the deepCopied ones.
-        // without this all functions would be lost
-        for (let prop in deepCopied)
-        {
-            pNewObject[prop] = deepCopied[prop]
-        }
-        
-        return pNewObject;
-    }
+    return Utils.clone(this);
 }
 
 // errors which are thrown by the SqlBuilder
@@ -3117,9 +3099,10 @@ SqlBuilder._CaseStatement = function ()
     this._whenThens = [];
     this._elseValue = null;
     this._afterWhenMask = new SqlBuilder._CaseWhen(this);
-    SqlBuilder.defineCanBuildSql(this);
 }
 
+SqlBuilder.defineCanBuildSql(SqlBuilder._CaseStatement.prototype);
+
 /**
  * @param {String|String[]|SqlBuilder|PreparedSqlArray} [pFieldOrCond] If this is the only parameter, it is used as Subselect <br/>
  *                                                                     else it is used as Field. <br/>
diff --git a/process/Util_lib/process.js b/process/Util_lib/process.js
index 97545be1730..778e4ae46cb 100644
--- a/process/Util_lib/process.js
+++ b/process/Util_lib/process.js
@@ -53,7 +53,7 @@ Utils.isNullOrEmpty = function (pObject)
 }
 
 /**
- * Creates a deep copy of the given object. Also works with arrays.
+ * Creates a deep copy of the given object. Also works with arrays, maps and sets.
  * 
  * @param {Object} pObject the object to create a copy of
  * @return {Object} the cloned object
@@ -69,7 +69,7 @@ Utils.isNullOrEmpty = function (pObject)
  * 
  * logging.log(original.name != copy.name);    //true
  * logging.log(copy instanceof MyObject());    //true, prototypes are set correctly
- * logging.log(copy.obj1 === copy.obj2);       //true, relative object references are kept
+ * logging.log(copy.obj1 === copy.obj2);       //true, relative object references are preserved
  */
 Utils.clone = function (pObject)
 {
@@ -84,20 +84,47 @@ Utils.clone = function (pObject)
         if (referenceMap.has(pObject))
             return referenceMap.get(pObject);
         
-        var clonedObject = Array.isArray(pObject) 
-            ? [] 
-            : Object.create(Object.getPrototypeOf(pObject)); //set the prototype of the given object
+        var clonedObject;
+        if (Array.isArray(pObject))
+            clonedObject = [];
+        else if (pObject instanceof Map)
+            clonedObject = new Map();
+        else if (pObject instanceof Set)
+            clonedObject = new Set();
+        else
+            clonedObject = Object.create(Object.getPrototypeOf(pObject)); //set the prototype of the given object
         
         /* keeps track of all encountered objects and maps the original to the copy, this makes it possible to:
            - have the same relative references in the copy as in the original
            - copy cyclic references without error */
         referenceMap.set(pObject, clonedObject);
         
-        for (let key in pObject) 
+        if (pObject instanceof Map)
+        {
+            pObject.forEach(function (value, key)
+            {
+                clonedObject.set(_clone(key), _clone(value));
+            });
+        }
+        else if (pObject instanceof Set)
         {
-            var value = pObject[key];
-            clonedObject[key] = _clone(value); //Recursively (deep) copy for nested objects, including arrays
+            pObject.forEach(function (value)
+            {
+                clonedObject.add(_clone(value));
+            });
         }
+        else
+        {
+            for (let key in pObject) 
+            {
+                clonedObject[key] = _clone(pObject[key]); //Recursively (deep) copy for nested objects, including arrays
+            }
+        }
+        
+        Object.getOwnPropertySymbols(pObject).forEach(function (sym)
+        {
+            clonedObject[sym] = _clone(pObject[sym]);
+        });
         
         return clonedObject;
     }
-- 
GitLab


From f237b2ed51d035cf21baef5b15861d7e97e741f7 Mon Sep 17 00:00:00 2001
From: Sebastian Listl <s.listl@adito.de>
Date: Fri, 30 Oct 2020 11:50:42 +0100
Subject: [PATCH 052/184] WorkflowTask afterSave fieldnames fixed

---
 entity/WorkflowTask_entity/afterSave.js | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/entity/WorkflowTask_entity/afterSave.js b/entity/WorkflowTask_entity/afterSave.js
index 68fae8b0d24..383331b295d 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.value"]
+            "TaskTitle_param" : rowData["NAME"]
         };
         //if you try to open the task now, it will display "Task done"
-        neon.openContext("WorkflowTask", "WorkflowTaskPreview_view", [rowData["UID.value"]], neon.OPERATINGSTATE_VIEW, params);
+        neon.openContext("WorkflowTask", "WorkflowTaskPreview_view", [rowData["UID"]], neon.OPERATINGSTATE_VIEW, params);
     }
 }
\ No newline at end of file
-- 
GitLab


From 00eb6144ea2f097e3f88763cda9bd04cbe9118ce Mon Sep 17 00:00:00 2001
From: Sebastian Listl <s.listl@adito.de>
Date: Fri, 30 Oct 2020 13:17:10 +0100
Subject: [PATCH 053/184] 1067733 ContextUtils.getSelectMap not working with
 mariaDB

---
 process/Context_lib/process.js | 10 +++++++---
 process/Sql_lib/process.js     | 22 ++++++++++++++--------
 2 files changed, 21 insertions(+), 11 deletions(-)

diff --git a/process/Context_lib/process.js b/process/Context_lib/process.js
index fcf879f0488..a9b9eac3121 100644
--- a/process/Context_lib/process.js
+++ b/process/Context_lib/process.js
@@ -494,6 +494,10 @@ ContextSelector.prototype.setGroupBy = function(pValue)
 ContextUtils.getSelectMap  = function()
 {
     var maskingUtils = new SqlMaskingUtils();
+    var isOracle = maskingUtils.dbType == db.DBTYPE_ORACLE10_CLUSTER
+        || maskingUtils.dbType == db.DBTYPE_ORACLE10_OCI
+        || maskingUtils.dbType == db.DBTYPE_ORACLE10_THIN;
+    
     return {
             "Organisation": ContextSelector.create("ORGANISATION", "CONTACT.CONTACTID", "ORGANISATION.NAME")
                                        .setJoinExpression("join CONTACT on ORGANISATION.ORGANISATIONID = CONTACT.ORGANISATION_ID and CONTACT.PERSON_ID is null")
@@ -539,7 +543,7 @@ ContextUtils.getSelectMap  = function()
                                         .setTitleExpression(maskingUtils.cast(maskingUtils.concat([
                                                                 KeywordUtils.getResolvedTitleSqlPart("ContractType", "CONTRACTTYPE"),
                                                                 maskingUtils.cast("CONTRACTCODE", SQLTYPES.VARCHAR, 10)
-                                                                ], " "), SQLTYPES.NVARCHAR, 50))
+                                                                ], " "), isOracle ? SQLTYPES.NVARCHAR : SQLTYPES.VARCHAR, 50))
                                         .setContactIdField("CONTACT_ID")
                                         .setCreationDateField("CONTRACTSTART")
                                         .setStateField("CONTRACTSTATUS")
@@ -551,7 +555,7 @@ ContextUtils.getSelectMap  = function()
                                                 maskingUtils.cast("OFFERCODE", SQLTYPES.VARCHAR, 10),
                                                 "'-'",
                                                 maskingUtils.cast("VERSNR", SQLTYPES.VARCHAR, 10)
-                                                ], "", false), SQLTYPES.NVARCHAR, 50))
+                                                ], "", false), isOracle ? SQLTYPES.NVARCHAR : SQLTYPES.VARCHAR, 50))
                                      .setContactIdField("CONTACT_ID")
                                      .setCreationDateField("OFFERDATE")
                                      .setStateField("STATUS")
@@ -560,7 +564,7 @@ ContextUtils.getSelectMap  = function()
                                      .setTitleExpression(maskingUtils.cast(maskingUtils.concat([
                                                         KeywordUtils.getResolvedTitleSqlPart("OrderType", "ORDERTYPE"),
                                                         maskingUtils.cast("SALESORDERCODE", SQLTYPES.VARCHAR, 10)
-                                                        ], " "), SQLTYPES.NVARCHAR, 50))
+                                                        ], " "), isOracle ? SQLTYPES.NVARCHAR : SQLTYPES.VARCHAR, 50))
                                      .setContactIdField("CONTACT_ID")
                                      .setCreationDateField("SALESORDERDATE")
                                      .setStateField("ORDERSTATUS")
diff --git a/process/Sql_lib/process.js b/process/Sql_lib/process.js
index fc73644c520..75c6923e249 100644
--- a/process/Sql_lib/process.js
+++ b/process/Sql_lib/process.js
@@ -3406,6 +3406,7 @@ SqlMaskingUtils.prototype.cast = function (pField, pTargetDatatype, pTargetLengt
         case db.DBTYPE_MYSQL4:
             switch(pTargetDatatype) 
             {
+                case SQLTYPES.NVARCHAR:
                 case SQLTYPES.VARCHAR:
                 case SQLTYPES.CHAR:
                 case SQLTYPES.INTEGER:
@@ -3445,18 +3446,23 @@ SqlMaskingUtils.prototype.cast = function (pField, pTargetDatatype, pTargetLengt
                 case SQLTYPES.INTEGER:
                 case SQLTYPES.CHAR:
                 case SQLTYPES.VARCHAR:
+                case SQLTYPES.NVARCHAR:
                     sqlDataType = _mapDefaults(pTargetDatatype);
                     break;
             }
             break;
         case db.DBTYPE_SQLSERVER2000:
-        case SQLTYPES.DATE:
-        case SQLTYPES.DECIMAL:
-        case SQLTYPES.INTEGER:
-        case SQLTYPES.CHAR:
-        case SQLTYPES.VARCHAR:
-            sqlDataType = _mapDefaults(pTargetDatatype);
-            break;
+            switch(pTargetDatatype)
+            {
+                case SQLTYPES.DATE:
+                case SQLTYPES.DECIMAL:
+                case SQLTYPES.INTEGER:
+                case SQLTYPES.CHAR:
+                case SQLTYPES.VARCHAR:
+                case SQLTYPES.NVARCHAR:
+                    sqlDataType = _mapDefaults(pTargetDatatype);
+                    break;
+            }
             //TODO: firebird support?
     }
 
@@ -3586,7 +3592,7 @@ SqlMaskingUtils.prototype.concat = function (pFields, pSeparator, pAutoTrimField
     
     if (pSeparator === null || pSeparator === undefined)
         pSeparator = "' '";
-    else if (pSeparator)
+    else if (pSeparator || pSeparator === "")
         pSeparator = "'" + db.quote(pSeparator, this.alias) + "'";
     
     var doEmptyStringCheck = true;
-- 
GitLab


From 5d76286961707810d7be58f2da0825b144855471 Mon Sep 17 00:00:00 2001
From: "s.pongratz" <s.pongratz@adito.de>
Date: Fri, 30 Oct 2020 14:50:31 +0100
Subject: [PATCH 054/184] #1067733-KampagneFixOracle Remove As for Alias in
 select

---
 .../Campaign_entity/recordcontainers/db/fromClauseProcess.js  | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/entity/Campaign_entity/recordcontainers/db/fromClauseProcess.js b/entity/Campaign_entity/recordcontainers/db/fromClauseProcess.js
index a24f9dfb3c0..f1704c63ce0 100644
--- a/entity/Campaign_entity/recordcontainers/db/fromClauseProcess.js
+++ b/entity/Campaign_entity/recordcontainers/db/fromClauseProcess.js
@@ -7,9 +7,9 @@ var recordState = vars.get("$sys.recordstate");
 var res = "CAMPAIGN";
 
 if (recordState != neon.OPERATINGSTATE_NEW && recordState != neon.OPERATINGSTATE_EDIT) {
-    res +=  " join (select min(DATE_START) as STEPDATESTART_ALIAS, CAMPAIGN_ID from CAMPAIGNSTEP group by CAMPAIGN_ID) as STEPDATESTART_TABLEALIAS"
+    res +=  " join (select min(DATE_START) as STEPDATESTART_ALIAS, CAMPAIGN_ID from CAMPAIGNSTEP group by CAMPAIGN_ID) STEPDATESTART_TABLEALIAS"
         + " on STEPDATESTART_TABLEALIAS.CAMPAIGN_ID = CAMPAIGN.CAMPAIGNID "
-        + " join (select max(DATE_END) as STEPDATEEND_ALIAS, CAMPAIGN_ID from CAMPAIGNSTEP group by CAMPAIGN_ID) as STEPDATEEND_TABLEALIAS"
+        + " join (select max(DATE_END) as STEPDATEEND_ALIAS, CAMPAIGN_ID from CAMPAIGNSTEP group by CAMPAIGN_ID) STEPDATEEND_TABLEALIAS"
         + " on STEPDATEEND_TABLEALIAS.CAMPAIGN_ID = CAMPAIGN.CAMPAIGNID ";
 
 }
-- 
GitLab


From 3ca44156d01cd9b6ccad122de1506fedc4bb74f0 Mon Sep 17 00:00:00 2001
From: "a.schindlbeck" <a.schindlbeck@adito.de>
Date: Mon, 2 Nov 2020 10:38:22 +0100
Subject: [PATCH 055/184] Revert Revert #1060919 Calendar Fixes

---
 .../Appointment_entity/grantDeleteProcess.js  |  8 ++++++--
 .../Appointment_entity/grantUpdateProcess.js  | 10 ++++++++--
 .../recordcontainers/jdito/contentProcess.js  |  3 ++-
 .../recordcontainers/jdito/onDelete.js        | 20 ++++++++++++++-----
 4 files changed, 31 insertions(+), 10 deletions(-)

diff --git a/entity/Appointment_entity/grantDeleteProcess.js b/entity/Appointment_entity/grantDeleteProcess.js
index 4caa2d99cfd..aef302f1112 100644
--- a/entity/Appointment_entity/grantDeleteProcess.js
+++ b/entity/Appointment_entity/grantDeleteProcess.js
@@ -2,6 +2,10 @@ import("system.vars");
 import("system.result");
 import("system.calendars");
 import("system.text");
+import("system.tools");
 
-var owner = text.decodeMS(JSON.parse(vars.get("$param.Entry_param"))["h"])[1].split(":")[1];
-result.string(calendars.hasPermission([owner], calendars.VEVENT, "WRITE"));
\ No newline at end of file
+
+var user = tools.getCurrentUser();
+var calUser = calendars.getCalendarUser(user["title"]);
+var calUserCn = text.decodeMS(calUser)[1].split(":")[1];
+result.string(calendars.hasPermission(calUserCn, calendars.VEVENT, "WRITE"));
\ No newline at end of file
diff --git a/entity/Appointment_entity/grantUpdateProcess.js b/entity/Appointment_entity/grantUpdateProcess.js
index 3562ea4a6c4..e6ac4c8426c 100644
--- a/entity/Appointment_entity/grantUpdateProcess.js
+++ b/entity/Appointment_entity/grantUpdateProcess.js
@@ -2,7 +2,13 @@ import("system.vars");
 import("system.result");
 import("system.calendars");
 import("system.text");
+import("system.tools");
+import("system.logging");
 
-var owner = text.decodeMS(JSON.parse(vars.get("$param.Entry_param"))["h"])[1].split(":")[1];
-result.string(calendars.hasPermission([owner], calendars.VEVENT, "WRITE"));
 
+var user = tools.getCurrentUser();
+var calUser = calendars.getCalendarUser(user["title"]);
+var calUserCn = text.decodeMS(calUser)[1].split(":")[1];
+var permitted = calendars.hasPermission(calUserCn, calendars.VEVENT, "WRITE");
+
+result.string(permitted);
diff --git a/entity/Appointment_entity/recordcontainers/jdito/contentProcess.js b/entity/Appointment_entity/recordcontainers/jdito/contentProcess.js
index e56415a0faf..3d5ff22eafe 100644
--- a/entity/Appointment_entity/recordcontainers/jdito/contentProcess.js
+++ b/entity/Appointment_entity/recordcontainers/jdito/contentProcess.js
@@ -9,6 +9,7 @@ import("system.datetime");
 import("system.eMath");
 import("system.util");
 import("system.neon");
+import("system.text");
 
 var appointmentSelect = newSelect("APPOINTMENT_ID").from("AB_APPOINTMENTLINK");
 var appointmentUids;
@@ -77,7 +78,7 @@ function buildEntry(pEntry, pMasterentry)
     if(pEntry[calendars.ORGANIZER2] != undefined)
         var organizer = pEntry[calendars.ORGANIZER2]["paramvalue"];
     if(pEntry[calendars.USER2] != undefined)
-        var owner = pEntry[calendars.USER2]["paramvalue"];
+        var owner = JSON.stringify(pEntry[calendars.USER2]);
     var status = pEntry[calendars.STATUS];
     var location = pEntry[calendars.LOCATION];
     var reminder = pEntry[calendars.REMINDER_DURATION];
diff --git a/entity/Appointment_entity/recordcontainers/jdito/onDelete.js b/entity/Appointment_entity/recordcontainers/jdito/onDelete.js
index 4e0e5c7a5c1..6f6249aee33 100644
--- a/entity/Appointment_entity/recordcontainers/jdito/onDelete.js
+++ b/entity/Appointment_entity/recordcontainers/jdito/onDelete.js
@@ -1,20 +1,30 @@
+import("system.logging");
 import("Sql_lib");
 import("system.neon");
 import("system.calendars");
 import("system.vars");
 
-if (vars.exists("$param.Entry_param"))
+var uid;
+
+if (vars.get("$param.Entry_param") != null)
 {
     var entry = JSON.parse(vars.getString("$param.Entry_param"));
     var reccurenceid = entry[calendars.RECURRENCEID];
+    
     if (reccurenceid == undefined) 
         reccurenceid = null;
     
-    calendars.removeEntryByUID(calendars.VEVENT, entry[calendars.USER2]["cn"], entry[calendars.ID], reccurenceid)
+    uid = entry[calendars.ID];
+    calendars.removeEntryByUID(calendars.VEVENT, entry[calendars.USER2]["cn"], uid, reccurenceid);
+}
+else if(vars.get("$field.OWNER"))
+{
+    uid = vars.get("$field.UID");
+    calendars.removeEntryByUID(calendars.VEVENT, JSON.parse(vars.get("$field.OWNER"))["cn"], uid, vars.get("$field.RECURRENCEID"));
+}
     
     /**
      * Deletes ApointmentLinks referring to the deleted Appointment.
      */
-    newWhereIfSet("AB_APPOINTMENTLINK.APPOINTMENT_ID", entry[calendars.ID])
-            .deleteData();
-}
\ No newline at end of file
+    newWhereIfSet("AB_APPOINTMENTLINK.APPOINTMENT_ID", uid)
+            .deleteData();
\ No newline at end of file
-- 
GitLab


From d676a03a3eff380362f5a5728889de9ccd6ef1a4 Mon Sep 17 00:00:00 2001
From: "a.schindlbeck" <a.schindlbeck@adito.de>
Date: Mon, 2 Nov 2020 09:38:22 +0000
Subject: [PATCH 056/184] Revert Revert #1060919 Calendar Fixes

(cherry picked from commit 3ca44156d01cd9b6ccad122de1506fedc4bb74f0)
---
 .../Appointment_entity/grantDeleteProcess.js  |  8 ++++++--
 .../Appointment_entity/grantUpdateProcess.js  | 10 ++++++++--
 .../recordcontainers/jdito/contentProcess.js  |  3 ++-
 .../recordcontainers/jdito/onDelete.js        | 20 ++++++++++++++-----
 4 files changed, 31 insertions(+), 10 deletions(-)

diff --git a/entity/Appointment_entity/grantDeleteProcess.js b/entity/Appointment_entity/grantDeleteProcess.js
index 4caa2d99cfd..aef302f1112 100644
--- a/entity/Appointment_entity/grantDeleteProcess.js
+++ b/entity/Appointment_entity/grantDeleteProcess.js
@@ -2,6 +2,10 @@ import("system.vars");
 import("system.result");
 import("system.calendars");
 import("system.text");
+import("system.tools");
 
-var owner = text.decodeMS(JSON.parse(vars.get("$param.Entry_param"))["h"])[1].split(":")[1];
-result.string(calendars.hasPermission([owner], calendars.VEVENT, "WRITE"));
\ No newline at end of file
+
+var user = tools.getCurrentUser();
+var calUser = calendars.getCalendarUser(user["title"]);
+var calUserCn = text.decodeMS(calUser)[1].split(":")[1];
+result.string(calendars.hasPermission(calUserCn, calendars.VEVENT, "WRITE"));
\ No newline at end of file
diff --git a/entity/Appointment_entity/grantUpdateProcess.js b/entity/Appointment_entity/grantUpdateProcess.js
index 3562ea4a6c4..e6ac4c8426c 100644
--- a/entity/Appointment_entity/grantUpdateProcess.js
+++ b/entity/Appointment_entity/grantUpdateProcess.js
@@ -2,7 +2,13 @@ import("system.vars");
 import("system.result");
 import("system.calendars");
 import("system.text");
+import("system.tools");
+import("system.logging");
 
-var owner = text.decodeMS(JSON.parse(vars.get("$param.Entry_param"))["h"])[1].split(":")[1];
-result.string(calendars.hasPermission([owner], calendars.VEVENT, "WRITE"));
 
+var user = tools.getCurrentUser();
+var calUser = calendars.getCalendarUser(user["title"]);
+var calUserCn = text.decodeMS(calUser)[1].split(":")[1];
+var permitted = calendars.hasPermission(calUserCn, calendars.VEVENT, "WRITE");
+
+result.string(permitted);
diff --git a/entity/Appointment_entity/recordcontainers/jdito/contentProcess.js b/entity/Appointment_entity/recordcontainers/jdito/contentProcess.js
index e56415a0faf..3d5ff22eafe 100644
--- a/entity/Appointment_entity/recordcontainers/jdito/contentProcess.js
+++ b/entity/Appointment_entity/recordcontainers/jdito/contentProcess.js
@@ -9,6 +9,7 @@ import("system.datetime");
 import("system.eMath");
 import("system.util");
 import("system.neon");
+import("system.text");
 
 var appointmentSelect = newSelect("APPOINTMENT_ID").from("AB_APPOINTMENTLINK");
 var appointmentUids;
@@ -77,7 +78,7 @@ function buildEntry(pEntry, pMasterentry)
     if(pEntry[calendars.ORGANIZER2] != undefined)
         var organizer = pEntry[calendars.ORGANIZER2]["paramvalue"];
     if(pEntry[calendars.USER2] != undefined)
-        var owner = pEntry[calendars.USER2]["paramvalue"];
+        var owner = JSON.stringify(pEntry[calendars.USER2]);
     var status = pEntry[calendars.STATUS];
     var location = pEntry[calendars.LOCATION];
     var reminder = pEntry[calendars.REMINDER_DURATION];
diff --git a/entity/Appointment_entity/recordcontainers/jdito/onDelete.js b/entity/Appointment_entity/recordcontainers/jdito/onDelete.js
index 4e0e5c7a5c1..6f6249aee33 100644
--- a/entity/Appointment_entity/recordcontainers/jdito/onDelete.js
+++ b/entity/Appointment_entity/recordcontainers/jdito/onDelete.js
@@ -1,20 +1,30 @@
+import("system.logging");
 import("Sql_lib");
 import("system.neon");
 import("system.calendars");
 import("system.vars");
 
-if (vars.exists("$param.Entry_param"))
+var uid;
+
+if (vars.get("$param.Entry_param") != null)
 {
     var entry = JSON.parse(vars.getString("$param.Entry_param"));
     var reccurenceid = entry[calendars.RECURRENCEID];
+    
     if (reccurenceid == undefined) 
         reccurenceid = null;
     
-    calendars.removeEntryByUID(calendars.VEVENT, entry[calendars.USER2]["cn"], entry[calendars.ID], reccurenceid)
+    uid = entry[calendars.ID];
+    calendars.removeEntryByUID(calendars.VEVENT, entry[calendars.USER2]["cn"], uid, reccurenceid);
+}
+else if(vars.get("$field.OWNER"))
+{
+    uid = vars.get("$field.UID");
+    calendars.removeEntryByUID(calendars.VEVENT, JSON.parse(vars.get("$field.OWNER"))["cn"], uid, vars.get("$field.RECURRENCEID"));
+}
     
     /**
      * Deletes ApointmentLinks referring to the deleted Appointment.
      */
-    newWhereIfSet("AB_APPOINTMENTLINK.APPOINTMENT_ID", entry[calendars.ID])
-            .deleteData();
-}
\ No newline at end of file
+    newWhereIfSet("AB_APPOINTMENTLINK.APPOINTMENT_ID", uid)
+            .deleteData();
\ No newline at end of file
-- 
GitLab


From 6184e711b1ae6a5f4f342f3459c1ec59fce31319 Mon Sep 17 00:00:00 2001
From: "a.schindlbeck" <a.schindlbeck@adito.de>
Date: Tue, 3 Nov 2020 15:07:17 +0100
Subject: [PATCH 057/184] #1068152 Calendar: PermissionCheck on linked
 Appointments

---
 .../Appointment_entity/Appointment_entity.aod |  15 +-
 .../erroronpermissiondenied/valueProcess.js   |   3 +
 .../recordcontainers/jdito/contentProcess.js  |  84 +---
 .../recordcontainers/jdito/rowCountProcess.js |   7 +-
 .../Organisation_entity.aod                   | 440 +++++++++---------
 .../erroronpermissiondenied/valueProcess.js   |   3 +
 entity/Person_entity/Person_entity.aod        | 402 ++++++++--------
 .../erroronpermissiondenied/valueProcess.js   |   3 +
 process/Calendar_lib/process.js               | 109 +++++
 9 files changed, 563 insertions(+), 503 deletions(-)
 create mode 100644 entity/Appointment_entity/entityfields/erroronpermissiondenied/valueProcess.js
 create mode 100644 entity/Organisation_entity/entityfields/linkedappointments/children/erroronpermissiondenied/valueProcess.js
 create mode 100644 entity/Person_entity/entityfields/appointments/children/erroronpermissiondenied/valueProcess.js

diff --git a/entity/Appointment_entity/Appointment_entity.aod b/entity/Appointment_entity/Appointment_entity.aod
index 6f51538041f..2b98d6bd2c3 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 00000000000..e5bfa3bbe7f
--- /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 3d5ff22eafe..c533370a334 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()));
+}
\ No newline at end of file
diff --git a/entity/Appointment_entity/recordcontainers/jdito/rowCountProcess.js b/entity/Appointment_entity/recordcontainers/jdito/rowCountProcess.js
index afff252f743..d6495461f94 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/Organisation_entity/Organisation_entity.aod b/entity/Organisation_entity/Organisation_entity.aod
index 4d5db6ed1a8..0287eb1d381 100644
--- a/entity/Organisation_entity/Organisation_entity.aod
+++ b/entity/Organisation_entity/Organisation_entity.aod
@@ -71,11 +71,6 @@
     </entityField>
     <entityConsumer>
       <name>Activities</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Activity_entity</entityName>
-        <fieldName>LinkedObjects</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>RowId_param</name>
@@ -86,21 +81,26 @@
           <valueProcess>%aditoprj%/entity/Organisation_entity/entityfields/activities/children/objectid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Activity_entity</entityName>
+        <fieldName>LinkedObjects</fieldName>
+      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>Contact</name>
       <selectionMode>MULTI</selectionMode>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Person_entity</entityName>
-        <fieldName>OrganisationRelated</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>OrgId_param</name>
           <valueProcess>%aditoprj%/entity/Organisation_entity/entityfields/contact/children/orgid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Person_entity</entityName>
+        <fieldName>OrganisationRelated</fieldName>
+      </dependency>
     </entityConsumer>
     <entityFieldGroup>
       <name>CUSTOMERCODE_DISPLAY_fieldGroup</name>
@@ -114,6 +114,36 @@
       <name>Organisations</name>
       <documentation>%aditoprj%/entity/Organisation_entity/entityfields/organisations/documentation.adoc</documentation>
       <recordContainer>db</recordContainer>
+      <children>
+        <entityParameter>
+          <name>WithPrivate_param</name>
+          <expose v="true" />
+        </entityParameter>
+        <entityParameter>
+          <name>ExcludeOrganisationsByPersonId</name>
+          <expose v="false" />
+        </entityParameter>
+        <entityParameter>
+          <name>ExcludedContactIds_param</name>
+          <expose v="true" />
+        </entityParameter>
+        <entityParameter>
+          <name>AttributeKeyId_param</name>
+          <expose v="false" />
+        </entityParameter>
+        <entityParameter>
+          <name>AttributeId_param</name>
+          <expose v="false" />
+        </entityParameter>
+        <entityParameter>
+          <name>DuplicateActionsControl_param</name>
+          <expose v="false" />
+        </entityParameter>
+        <entityParameter>
+          <name>DuplicateCurrentContactId_param</name>
+          <expose v="false" />
+        </entityParameter>
+      </children>
       <dependencies>
         <entityDependency>
           <name>85aa363e-d8ba-4df5-8422-bf7aff86a4f8</name>
@@ -152,44 +182,9 @@
           <isConsumer v="false" />
         </entityDependency>
       </dependencies>
-      <children>
-        <entityParameter>
-          <name>WithPrivate_param</name>
-          <expose v="true" />
-        </entityParameter>
-        <entityParameter>
-          <name>ExcludeOrganisationsByPersonId</name>
-          <expose v="false" />
-        </entityParameter>
-        <entityParameter>
-          <name>ExcludedContactIds_param</name>
-          <expose v="true" />
-        </entityParameter>
-        <entityParameter>
-          <name>AttributeKeyId_param</name>
-          <expose v="false" />
-        </entityParameter>
-        <entityParameter>
-          <name>AttributeId_param</name>
-          <expose v="false" />
-        </entityParameter>
-        <entityParameter>
-          <name>DuplicateActionsControl_param</name>
-          <expose v="false" />
-        </entityParameter>
-        <entityParameter>
-          <name>DuplicateCurrentContactId_param</name>
-          <expose v="false" />
-        </entityParameter>
-      </children>
     </entityProvider>
     <entityConsumer>
       <name>Addresses</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Address_entity</entityName>
-        <fieldName>OrganisationAddresses</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>DefaultAddressId_param</name>
@@ -201,6 +196,11 @@
           <expose v="false" />
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Address_entity</entityName>
+        <fieldName>OrganisationAddresses</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>ADDRESS_ID</name>
@@ -211,11 +211,6 @@
     </entityField>
     <entityConsumer>
       <name>Communications</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Communication_entity</entityName>
-        <fieldName>AllCommunications</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContactId_param</name>
@@ -227,15 +222,15 @@
           <valueProcess>%aditoprj%/entity/Organisation_entity/entityfields/communications/children/contactsmaincountry_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Communication_entity</entityName>
+        <fieldName>AllCommunications</fieldName>
+      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>Contracts</name>
       <selectionMode>MULTI</selectionMode>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Contract_entity</entityName>
-        <fieldName>Contracts</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContactId_param</name>
@@ -244,14 +239,14 @@
           <mandatory v="true" />
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>Productprices</name>
       <dependency>
         <name>dependency</name>
-        <entityName>Productprice_entity</entityName>
-        <fieldName>Productprices</fieldName>
+        <entityName>Contract_entity</entityName>
+        <fieldName>Contracts</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>Productprices</name>
       <children>
         <entityParameter>
           <name>ContactId_param</name>
@@ -260,6 +255,11 @@
           <mandatory v="true" />
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Productprice_entity</entityName>
+        <fieldName>Productprices</fieldName>
+      </dependency>
     </entityConsumer>
     <entityProvider>
       <name>#PROVIDER</name>
@@ -300,11 +300,6 @@
     <entityConsumer>
       <name>Documents</name>
       <selectionMode>MULTI</selectionMode>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Document_entity</entityName>
-        <fieldName>Documents</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>AssignmentRowId_param</name>
@@ -315,6 +310,11 @@
           <valueProcess>%aditoprj%/entity/Organisation_entity/entityfields/documents/children/assignmenttable_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Document_entity</entityName>
+        <fieldName>Documents</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>STANDARD_EMAIL_COMMUNICATION</name>
@@ -330,11 +330,6 @@
     </entityField>
     <entityConsumer>
       <name>PhoneCommunications</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Communication_entity</entityName>
-        <fieldName>PhoneCommunications</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContactId_param</name>
@@ -342,14 +337,14 @@
           <expose v="false" />
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>EmailCommunications</name>
       <dependency>
         <name>dependency</name>
         <entityName>Communication_entity</entityName>
-        <fieldName>EmailCommunications</fieldName>
+        <fieldName>PhoneCommunications</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>EmailCommunications</name>
       <children>
         <entityParameter>
           <name>ContactId_param</name>
@@ -357,6 +352,11 @@
           <expose v="false" />
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Communication_entity</entityName>
+        <fieldName>EmailCommunications</fieldName>
+      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>Countries</name>
@@ -369,11 +369,6 @@
     <entityConsumer>
       <name>Attributes</name>
       <onValidation>%aditoprj%/entity/Organisation_entity/entityfields/attributes/onValidation.js</onValidation>
-      <dependency>
-        <name>dependency</name>
-        <entityName>AttributeRelation_entity</entityName>
-        <fieldName>AttributeRelations</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ObjectRowId_param</name>
@@ -385,14 +380,14 @@
           <valueProcess>%aditoprj%/entity/Organisation_entity/entityfields/attributes/children/objecttype_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>KeywordContactStates</name>
       <dependency>
         <name>dependency</name>
-        <entityName>KeywordEntry_entity</entityName>
-        <fieldName>SpecificContainerKeywords</fieldName>
+        <entityName>AttributeRelation_entity</entityName>
+        <fieldName>AttributeRelations</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>KeywordContactStates</name>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
@@ -400,14 +395,14 @@
           <expose v="false" />
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>KeywordOrganisationTypes</name>
       <dependency>
         <name>dependency</name>
         <entityName>KeywordEntry_entity</entityName>
         <fieldName>SpecificContainerKeywords</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>KeywordOrganisationTypes</name>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
@@ -415,6 +410,11 @@
           <expose v="false" />
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>SpecificContainerKeywords</fieldName>
+      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>Languages</name>
@@ -426,11 +426,6 @@
     </entityConsumer>
     <entityConsumer>
       <name>KeywordPricePolitics</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>KeywordEntry_entity</entityName>
-        <fieldName>SpecificContainerKeywords</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
@@ -438,14 +433,14 @@
           <expose v="false" />
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>KeywordWeaknesses</name>
       <dependency>
         <name>dependency</name>
         <entityName>KeywordEntry_entity</entityName>
         <fieldName>SpecificContainerKeywords</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>KeywordWeaknesses</name>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
@@ -453,14 +448,14 @@
           <expose v="false" />
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>KeywordStrenghts</name>
       <dependency>
         <name>dependency</name>
         <entityName>KeywordEntry_entity</entityName>
         <fieldName>SpecificContainerKeywords</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>KeywordStrenghts</name>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
@@ -468,14 +463,14 @@
           <expose v="false" />
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>Salesprojects</name>
       <dependency>
         <name>dependency</name>
-        <entityName>Salesproject_entity</entityName>
-        <fieldName>Salesprojects</fieldName>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>SpecificContainerKeywords</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>Salesprojects</name>
       <children>
         <entityParameter>
           <name>ContactId_param</name>
@@ -484,14 +479,14 @@
           <mandatory v="true" />
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>Offers</name>
       <dependency>
         <name>dependency</name>
-        <entityName>Offer_entity</entityName>
-        <fieldName>ContactOffers</fieldName>
+        <entityName>Salesproject_entity</entityName>
+        <fieldName>Salesprojects</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>Offers</name>
       <children>
         <entityParameter>
           <name>ContactId_param</name>
@@ -500,14 +495,14 @@
           <mandatory v="true" />
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>Tasks</name>
       <dependency>
         <name>dependency</name>
-        <entityName>Task_entity</entityName>
-        <fieldName>Tasks</fieldName>
+        <entityName>Offer_entity</entityName>
+        <fieldName>ContactOffers</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>Tasks</name>
       <children>
         <entityParameter>
           <name>RowId_param</name>
@@ -518,6 +513,11 @@
           <valueProcess>%aditoprj%/entity/Organisation_entity/entityfields/tasks/children/objectid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Task_entity</entityName>
+        <fieldName>Tasks</fieldName>
+      </dependency>
     </entityConsumer>
     <entityParameter>
       <name>WithPrivate_param</name>
@@ -528,11 +528,6 @@
     </entityParameter>
     <entityConsumer>
       <name>ObjectTrees</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>ObjectTree_entity</entityName>
-        <fieldName>TreeProvider</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ObjectIds_param</name>
@@ -543,14 +538,14 @@
           <valueProcess>%aditoprj%/entity/Organisation_entity/entityfields/objecttrees/children/objecttypes_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>LogHistories</name>
       <dependency>
         <name>dependency</name>
-        <entityName>LogHistory_entity</entityName>
-        <fieldName>LogHistoryProvider</fieldName>
+        <entityName>ObjectTree_entity</entityName>
+        <fieldName>TreeProvider</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>LogHistories</name>
       <children>
         <entityParameter>
           <name>tablenames_param</name>
@@ -559,14 +554,14 @@
           <mandatory v="true" />
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>360DegreeObjects</name>
       <dependency>
         <name>dependency</name>
-        <entityName>360Degree_entity</entityName>
-        <fieldName>OrganisationObjects</fieldName>
+        <entityName>LogHistory_entity</entityName>
+        <fieldName>LogHistoryProvider</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>360DegreeObjects</name>
       <children>
         <entityParameter>
           <name>ObjectRowId_param</name>
@@ -577,6 +572,11 @@
           <valueProcess>%aditoprj%/entity/Organisation_entity/entityfields/360degreeobjects/children/objectstatus_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>360Degree_entity</entityName>
+        <fieldName>OrganisationObjects</fieldName>
+      </dependency>
     </entityConsumer>
     <entityParameter>
       <name>ExcludeOrganisationsByPersonId</name>
@@ -587,26 +587,6 @@
     <entityProvider>
       <name>WithPersonIdFilter</name>
       <documentation>%aditoprj%/entity/Organisation_entity/entityfields/withpersonidfilter/documentation.adoc</documentation>
-      <dependencies>
-        <entityDependency>
-          <name>5a456b04-f0ca-4a45-9c1f-bdfdf074434a</name>
-          <entityName>Contact_entity</entityName>
-          <fieldName>Organisations</fieldName>
-          <isConsumer v="false" />
-        </entityDependency>
-        <entityDependency>
-          <name>a80c3db0-29db-433c-8f7c-4ebf6639ad6d</name>
-          <entityName>Person_entity</entityName>
-          <fieldName>Organisations</fieldName>
-          <isConsumer v="false" />
-        </entityDependency>
-        <entityDependency>
-          <name>748a3083-89c2-41b4-a233-3fd5364396e9</name>
-          <entityName>Competition_entity</entityName>
-          <fieldName>Organisation</fieldName>
-          <isConsumer v="false" />
-        </entityDependency>
-      </dependencies>
       <children>
         <entityParameter>
           <name>ExcludeOrganisationsByPersonId</name>
@@ -639,6 +619,26 @@
           <expose v="false" />
         </entityParameter>
       </children>
+      <dependencies>
+        <entityDependency>
+          <name>5a456b04-f0ca-4a45-9c1f-bdfdf074434a</name>
+          <entityName>Contact_entity</entityName>
+          <fieldName>Organisations</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+        <entityDependency>
+          <name>a80c3db0-29db-433c-8f7c-4ebf6639ad6d</name>
+          <entityName>Person_entity</entityName>
+          <fieldName>Organisations</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+        <entityDependency>
+          <name>748a3083-89c2-41b4-a233-3fd5364396e9</name>
+          <entityName>Competition_entity</entityName>
+          <fieldName>Organisation</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+      </dependencies>
     </entityProvider>
     <entityParameter>
       <name>AttributeId_param</name>
@@ -653,20 +653,6 @@
     <entityProvider>
       <name>WithAttribute</name>
       <documentation>%aditoprj%/entity/Organisation_entity/entityfields/withattribute/documentation.adoc</documentation>
-      <dependencies>
-        <entityDependency>
-          <name>10480df2-f0b6-4cb6-8bfb-4a468b994996</name>
-          <entityName>Competition_entity</entityName>
-          <fieldName>Organisations</fieldName>
-          <isConsumer v="false" />
-        </entityDependency>
-        <entityDependency>
-          <name>f368be61-1a15-449f-b37c-b1343069412c</name>
-          <entityName>Product_entity</entityName>
-          <fieldName>Organisations</fieldName>
-          <isConsumer v="false" />
-        </entityDependency>
-      </dependencies>
       <children>
         <entityParameter>
           <name>AttributeId_param</name>
@@ -698,6 +684,20 @@
           <expose v="false" />
         </entityParameter>
       </children>
+      <dependencies>
+        <entityDependency>
+          <name>10480df2-f0b6-4cb6-8bfb-4a468b994996</name>
+          <entityName>Competition_entity</entityName>
+          <fieldName>Organisations</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+        <entityDependency>
+          <name>f368be61-1a15-449f-b37c-b1343069412c</name>
+          <entityName>Product_entity</entityName>
+          <fieldName>Organisations</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+      </dependencies>
     </entityProvider>
     <entityParameter>
       <name>ExcludedContactIds_param</name>
@@ -706,11 +706,6 @@
     </entityParameter>
     <entityConsumer>
       <name>AttributeTree</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>AttributeRelation_entity</entityName>
-        <fieldName>TreeProvider</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ObjectRowId_param</name>
@@ -721,6 +716,11 @@
           <valueProcess>%aditoprj%/entity/Organisation_entity/entityfields/attributetree/children/objecttype_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>AttributeRelation_entity</entityName>
+        <fieldName>TreeProvider</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>DATE_NEW</name>
@@ -772,11 +772,6 @@
     <entityConsumer>
       <name>AttributeConditions</name>
       <onValidation>%aditoprj%/entity/Organisation_entity/entityfields/attributeconditions/onValidation.js</onValidation>
-      <dependency>
-        <name>dependency</name>
-        <entityName>AttributeRelation_entity</entityName>
-        <fieldName>AttributeRelations</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ObjectRowId_param</name>
@@ -799,20 +794,29 @@
           <valueProcess>%aditoprj%/entity/Organisation_entity/entityfields/attributeconditions/children/showempty_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>LinkedAppointments</name>
       <dependency>
         <name>dependency</name>
-        <entityName>Appointment_entity</entityName>
-        <fieldName>LinkedAppointments</fieldName>
+        <entityName>AttributeRelation_entity</entityName>
+        <fieldName>AttributeRelations</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>LinkedAppointments</name>
       <children>
         <entityParameter>
           <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>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Appointment_entity</entityName>
+        <fieldName>LinkedAppointments</fieldName>
+      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>Products</name>
@@ -1083,11 +1087,6 @@
     </entityParameter>
     <entityConsumer>
       <name>SelfDuplicatesUncached</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Organisation_entity</entityName>
-        <fieldName>SelfDuplicates</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>DuplicateActionsControl_param</name>
@@ -1107,20 +1106,25 @@
           <valueProcess>%aditoprj%/entity/Organisation_entity/entityfields/selfduplicatesuncached/children/excludedcontactids_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>CommRestrictions</name>
       <dependency>
         <name>dependency</name>
-        <entityName>CommRestriction_Entity</entityName>
-        <fieldName>CommRestrictions</fieldName>
+        <entityName>Organisation_entity</entityName>
+        <fieldName>SelfDuplicates</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>CommRestrictions</name>
       <children>
         <entityParameter>
           <name>ContactId_param</name>
           <valueProcess>%aditoprj%/entity/Organisation_entity/entityfields/commrestrictions/children/contactid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>CommRestriction_Entity</entityName>
+        <fieldName>CommRestrictions</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>COMMRESTRICTIONS_ACTIVE</name>
@@ -1175,11 +1179,6 @@
     <entityConsumer>
       <name>Classifications</name>
       <refreshParent v="true" />
-      <dependency>
-        <name>dependency</name>
-        <entityName>Classification_entity</entityName>
-        <fieldName>Classifications</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ClassificationType_param</name>
@@ -1197,6 +1196,11 @@
           <expose v="true" />
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Classification_entity</entityName>
+        <fieldName>Classifications</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>COUNT</name>
@@ -1217,14 +1221,6 @@
       <name>OrganisationsViaIndex</name>
       <documentation>%aditoprj%/entity/Organisation_entity/entityfields/organisationsviaindex/documentation.adoc</documentation>
       <recordContainer>index</recordContainer>
-      <dependencies>
-        <entityDependency>
-          <name>e60b8983-166d-4280-a1a5-f990ad77eeb9</name>
-          <entityName>AroundLocation_entity</entityName>
-          <fieldName>Organisations</fieldName>
-          <isConsumer v="false" />
-        </entityDependency>
-      </dependencies>
       <children>
         <entityParameter>
           <name>ExcludeOrganisationsByPersonId</name>
@@ -1267,6 +1263,14 @@
           <expose v="true" />
         </entityParameter>
       </children>
+      <dependencies>
+        <entityDependency>
+          <name>e60b8983-166d-4280-a1a5-f990ad77eeb9</name>
+          <entityName>AroundLocation_entity</entityName>
+          <fieldName>Organisations</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+      </dependencies>
     </entityProvider>
     <entityActionField>
       <name>openAroundLocation</name>
@@ -1337,17 +1341,17 @@
     </entityProvider>
     <entityConsumer>
       <name>DistrictResponsibles</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>DistrictResponsible_entity</entityName>
-        <fieldName>OrganisationResponsibles</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>OrgUid_param</name>
           <valueProcess>%aditoprj%/entity/Organisation_entity/entityfields/districtresponsibles/children/orguid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>DistrictResponsible_entity</entityName>
+        <fieldName>OrganisationResponsibles</fieldName>
+      </dependency>
     </entityConsumer>
     <entityParameter>
       <name>FilterPreSet_param</name>
@@ -1356,14 +1360,6 @@
     <entityProvider>
       <name>NonselfDuplicates</name>
       <documentation>%aditoprj%/entity/Organisation_entity/entityfields/nonselfduplicates/documentation.adoc</documentation>
-      <dependencies>
-        <entityDependency>
-          <name>2e410b9e-5ebc-48ea-9562-da386202d7e8</name>
-          <entityName>Duplicates_entity</entityName>
-          <fieldName>DuplicateOrganisationsConsumer</fieldName>
-          <isConsumer v="false" />
-        </entityDependency>
-      </dependencies>
       <children>
         <entityParameter>
           <name>AttributeKeyId_param</name>
@@ -1386,6 +1382,14 @@
           <expose v="false" />
         </entityParameter>
       </children>
+      <dependencies>
+        <entityDependency>
+          <name>2e410b9e-5ebc-48ea-9562-da386202d7e8</name>
+          <entityName>Duplicates_entity</entityName>
+          <fieldName>DuplicateOrganisationsConsumer</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+      </dependencies>
     </entityProvider>
     <entityActionGroup>
       <name>orgReportDispatch</name>
@@ -1402,11 +1406,6 @@
     </entityActionGroup>
     <entityConsumer>
       <name>AttributesFilter</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>AttributeRelation_entity</entityName>
-        <fieldName>FilterProvider</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ObjectRowId_param</name>
@@ -1417,6 +1416,11 @@
           <valueProcess>%aditoprj%/entity/Organisation_entity/entityfields/attributesfilter/children/objecttype_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>AttributeRelation_entity</entityName>
+        <fieldName>FilterProvider</fieldName>
+      </dependency>
     </entityConsumer>
   </entityFields>
   <recordContainers>
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 00000000000..15b1f8d0322
--- /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 c66ce949329..4a393db4dab 100644
--- a/entity/Person_entity/Person_entity.aod
+++ b/entity/Person_entity/Person_entity.aod
@@ -89,11 +89,6 @@
     </entityFieldGroup>
     <entityConsumer>
       <name>Activities</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Activity_entity</entityName>
-        <fieldName>LinkedObjects</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>RowId_param</name>
@@ -108,6 +103,11 @@
           <valueProcess>%aditoprj%/entity/Person_entity/entityfields/activities/children/presetlinks_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Activity_entity</entityName>
+        <fieldName>LinkedObjects</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>CONTACTID</name>
@@ -118,14 +118,6 @@
       <name>OrganisationRelated</name>
       <documentation>%aditoprj%/entity/Person_entity/entityfields/organisationrelated/documentation.adoc</documentation>
       <recordContainer>db</recordContainer>
-      <dependencies>
-        <entityDependency>
-          <name>41952879-c2f0-411f-8ca1-36c38914a629</name>
-          <entityName>Organisation_entity</entityName>
-          <fieldName>Contact</fieldName>
-          <isConsumer v="false" />
-        </entityDependency>
-      </dependencies>
       <children>
         <entityParameter>
           <name>ContactId_param</name>
@@ -144,6 +136,14 @@
           <expose v="false" />
         </entityParameter>
       </children>
+      <dependencies>
+        <entityDependency>
+          <name>41952879-c2f0-411f-8ca1-36c38914a629</name>
+          <entityName>Organisation_entity</entityName>
+          <fieldName>Contact</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+      </dependencies>
     </entityProvider>
     <entityField>
       <name>PERSON_ID</name>
@@ -161,11 +161,6 @@
     </entityField>
     <entityConsumer>
       <name>PersAddresses</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Address_entity</entityName>
-        <fieldName>ContactAddresses</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>DefaultAddressId_param</name>
@@ -185,14 +180,14 @@
           <valueProcess>%aditoprj%/entity/Person_entity/entityfields/persaddresses/children/replacestandardaddress_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>Communications</name>
       <dependency>
         <name>dependency</name>
-        <entityName>Communication_entity</entityName>
-        <fieldName>AllCommunications</fieldName>
+        <entityName>Address_entity</entityName>
+        <fieldName>ContactAddresses</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>Communications</name>
       <children>
         <entityParameter>
           <name>ContactId_param</name>
@@ -210,29 +205,29 @@
           <valueProcess>%aditoprj%/entity/Person_entity/entityfields/communications/children/contactsmaincountry_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Communication_entity</entityName>
+        <fieldName>AllCommunications</fieldName>
+      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>Organisations</name>
       <selectionMode>SINGLE</selectionMode>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Organisation_entity</entityName>
-        <fieldName>WithPersonIdFilter</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ExcludeOrganisationsByPersonId</name>
           <valueProcess>%aditoprj%/entity/Person_entity/entityfields/organisations/children/excludeorganisationsbypersonid/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>Contracts</name>
       <dependency>
         <name>dependency</name>
-        <entityName>Contract_entity</entityName>
-        <fieldName>Contracts</fieldName>
+        <entityName>Organisation_entity</entityName>
+        <fieldName>WithPersonIdFilter</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>Contracts</name>
       <children>
         <entityParameter>
           <name>ContactId_param</name>
@@ -241,16 +236,16 @@
           <mandatory v="true" />
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Contract_entity</entityName>
+        <fieldName>Contracts</fieldName>
+      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>Pricelists</name>
       <state>AUTO</state>
       <stateProcess>%aditoprj%/entity/Person_entity/entityfields/pricelists/stateProcess.js</stateProcess>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Productprice_entity</entityName>
-        <fieldName>Productprices</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContactId_param</name>
@@ -259,6 +254,11 @@
           <mandatory v="true" />
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Productprice_entity</entityName>
+        <fieldName>Productprices</fieldName>
+      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>Genders</name>
@@ -313,11 +313,6 @@
     <entityConsumer>
       <name>Documents</name>
       <selectionMode>MULTI</selectionMode>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Document_entity</entityName>
-        <fieldName>Documents</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>AssignmentRowId_param</name>
@@ -332,6 +327,11 @@
           <valueProcess>%aditoprj%/entity/Person_entity/entityfields/documents/children/disallowcreate_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Document_entity</entityName>
+        <fieldName>Documents</fieldName>
+      </dependency>
     </entityConsumer>
     <entityParameter>
       <name>ContactId_param</name>
@@ -356,14 +356,6 @@
       <name>Contact</name>
       <documentation>%aditoprj%/entity/Person_entity/entityfields/contact/documentation.adoc</documentation>
       <recordContainer>db</recordContainer>
-      <dependencies>
-        <entityDependency>
-          <name>f925c8e6-b096-4093-bd39-c9cd30a6a71a</name>
-          <entityName>Lead_entity</entityName>
-          <fieldName>ContactId</fieldName>
-          <isConsumer v="false" />
-        </entityDependency>
-      </dependencies>
       <children>
         <entityParameter>
           <name>OrgId_param</name>
@@ -391,16 +383,19 @@
           <expose v="false" />
         </entityParameter>
       </children>
+      <dependencies>
+        <entityDependency>
+          <name>f925c8e6-b096-4093-bd39-c9cd30a6a71a</name>
+          <entityName>Lead_entity</entityName>
+          <fieldName>ContactId</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+      </dependencies>
     </entityProvider>
     <entityConsumer>
       <name>OrgAddresses</name>
       <state>READONLY</state>
       <stateProcess>%aditoprj%/entity/Person_entity/entityfields/orgaddresses/stateProcess.js</stateProcess>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Address_entity</entityName>
-        <fieldName>OrganisationAddressesByContact</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContactId_param</name>
@@ -412,6 +407,11 @@
           <valueProcess>%aditoprj%/entity/Person_entity/entityfields/orgaddresses/children/defaultaddressid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Address_entity</entityName>
+        <fieldName>OrganisationAddressesByContact</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>STANDARD_EMAIL_COMMUNICATION</name>
@@ -428,11 +428,6 @@
     <entityConsumer>
       <name>PhoneCommunications</name>
       <description>Used for standard communication</description>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Communication_entity</entityName>
-        <fieldName>PhoneCommunications</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContactId_param</name>
@@ -442,15 +437,15 @@
                         Usually this is used for filtering COMMUNICATION-entries by a specified contact or creating a new entry that is related to a contact.</description>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>EmailCommunications</name>
-      <description>Used for standard communication</description>
       <dependency>
         <name>dependency</name>
         <entityName>Communication_entity</entityName>
-        <fieldName>EmailCommunications</fieldName>
+        <fieldName>PhoneCommunications</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>EmailCommunications</name>
+      <description>Used for standard communication</description>
       <children>
         <entityParameter>
           <name>ContactId_param</name>
@@ -460,6 +455,11 @@
                         Usually this is used for filtering COMMUNICATION-entries by a specified contact or creating a new entry that is related to a contact.</description>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Communication_entity</entityName>
+        <fieldName>EmailCommunications</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>ADDRESS_ID</name>
@@ -471,11 +471,6 @@
     </entityField>
     <entityConsumer>
       <name>KeywordGenders</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>KeywordEntry_entity</entityName>
-        <fieldName>SpecificContainerKeywords</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
@@ -483,6 +478,11 @@
           <expose v="false" />
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>SpecificContainerKeywords</fieldName>
+      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>Languages</name>
@@ -494,40 +494,35 @@
     </entityConsumer>
     <entityConsumer>
       <name>Offers</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Offer_entity</entityName>
-        <fieldName>ContactOffers</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContactId_param</name>
           <valueProcess>%aditoprj%/entity/Person_entity/entityfields/offers/children/contactid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>Salutations</name>
       <dependency>
         <name>dependency</name>
-        <entityName>SalutationDistinct_entity</entityName>
-        <fieldName>Salutations</fieldName>
+        <entityName>Offer_entity</entityName>
+        <fieldName>ContactOffers</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>Salutations</name>
       <children>
         <entityParameter>
           <name>Language_param</name>
           <valueProcess>%aditoprj%/entity/Person_entity/entityfields/salutations/children/language_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>SalutationDistinct_entity</entityName>
+        <fieldName>Salutations</fieldName>
+      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>Attributes</name>
       <onValidation>%aditoprj%/entity/Person_entity/entityfields/attributes/onValidation.js</onValidation>
-      <dependency>
-        <name>dependency</name>
-        <entityName>AttributeRelation_entity</entityName>
-        <fieldName>AttributeRelations</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ObjectRowId_param</name>
@@ -542,14 +537,14 @@
           <valueProcess>%aditoprj%/entity/Person_entity/entityfields/attributes/children/showdsgvomessage_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>SalutationTitles</name>
       <dependency>
         <name>dependency</name>
-        <entityName>SalutationTitleDistinct_entity</entityName>
-        <fieldName>SalutationTitles</fieldName>
+        <entityName>AttributeRelation_entity</entityName>
+        <fieldName>AttributeRelations</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>SalutationTitles</name>
       <children>
         <entityParameter>
           <name>Salutation_param</name>
@@ -560,15 +555,15 @@
           <valueProcess>%aditoprj%/entity/Person_entity/entityfields/salutationtitles/children/language_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>SalutationTitleDistinct_entity</entityName>
+        <fieldName>SalutationTitles</fieldName>
+      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>Tasks</name>
       <state>EDITABLE</state>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Task_entity</entityName>
-        <fieldName>Tasks</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>RowId_param</name>
@@ -583,14 +578,14 @@
           <valueProcess>%aditoprj%/entity/Person_entity/entityfields/tasks/children/presetlinks_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>ObjectTrees</name>
       <dependency>
         <name>dependency</name>
-        <entityName>ObjectTree_entity</entityName>
-        <fieldName>TreeProvider</fieldName>
+        <entityName>Task_entity</entityName>
+        <fieldName>Tasks</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>ObjectTrees</name>
       <children>
         <entityParameter>
           <name>ObjectIds_param</name>
@@ -601,6 +596,11 @@
           <valueProcess>%aditoprj%/entity/Person_entity/entityfields/objecttrees/children/objecttypes_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>ObjectTree_entity</entityName>
+        <fieldName>TreeProvider</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>STATUS</name>
@@ -612,25 +612,20 @@
     </entityField>
     <entityConsumer>
       <name>KeywordContactStates</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>KeywordEntry_entity</entityName>
-        <fieldName>SpecificContainerKeywords</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
           <valueProcess>%aditoprj%/entity/Person_entity/entityfields/keywordcontactstates/children/containername_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>ContactAndOrganisationAddresses</name>
       <dependency>
         <name>dependency</name>
-        <entityName>Address_entity</entityName>
-        <fieldName>OrganisationAndContactAddresses</fieldName>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>SpecificContainerKeywords</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>ContactAndOrganisationAddresses</name>
       <children>
         <entityParameter>
           <name>ContactId_param</name>
@@ -641,6 +636,11 @@
           <valueProcess>%aditoprj%/entity/Person_entity/entityfields/contactandorganisationaddresses/children/organisationid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Address_entity</entityName>
+        <fieldName>OrganisationAndContactAddresses</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>DEPARTMENT</name>
@@ -663,11 +663,6 @@
     </entityField>
     <entityConsumer>
       <name>LogHistories</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>LogHistory_entity</entityName>
-        <fieldName>LogHistoryProvider</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>tablenames_param</name>
@@ -676,14 +671,14 @@
           <mandatory v="true" />
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>OtherContacts</name>
       <dependency>
         <name>dependency</name>
-        <entityName>Contact_entity</entityName>
-        <fieldName>PersonsContactsExceptOwn</fieldName>
+        <entityName>LogHistory_entity</entityName>
+        <fieldName>LogHistoryProvider</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>OtherContacts</name>
       <children>
         <entityParameter>
           <name>OwnContactId_param</name>
@@ -694,6 +689,11 @@
           <valueProcess>%aditoprj%/entity/Person_entity/entityfields/othercontacts/children/languagekey_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Contact_entity</entityName>
+        <fieldName>PersonsContactsExceptOwn</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>ORGANISATION_NAME</name>
@@ -706,20 +706,6 @@
     <entityProvider>
       <name>Contacts</name>
       <documentation>%aditoprj%/entity/Person_entity/entityfields/contacts/documentation.adoc</documentation>
-      <dependencies>
-        <entityDependency>
-          <name>c98da62f-d6b2-4ddb-9101-92e9a60abdfb</name>
-          <entityName>VisitPlanEmployeeWeek_entity</entityName>
-          <fieldName>Persons</fieldName>
-          <isConsumer v="false" />
-        </entityDependency>
-        <entityDependency>
-          <name>f56b1378-138d-4f88-b9df-274adce9f90c</name>
-          <entityName>VisitPlanEntry_entity</entityName>
-          <fieldName>Persons</fieldName>
-          <isConsumer v="false" />
-        </entityDependency>
-      </dependencies>
       <children>
         <entityParameter>
           <name>ContactId_param</name>
@@ -746,14 +732,23 @@
           <expose v="false" />
         </entityParameter>
       </children>
+      <dependencies>
+        <entityDependency>
+          <name>c98da62f-d6b2-4ddb-9101-92e9a60abdfb</name>
+          <entityName>VisitPlanEmployeeWeek_entity</entityName>
+          <fieldName>Persons</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+        <entityDependency>
+          <name>f56b1378-138d-4f88-b9df-274adce9f90c</name>
+          <entityName>VisitPlanEntry_entity</entityName>
+          <fieldName>Persons</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+      </dependencies>
     </entityProvider>
     <entityConsumer>
       <name>360DegreeObjects</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>360Degree_entity</entityName>
-        <fieldName>PersonObjects</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ObjectRowId_param</name>
@@ -764,14 +759,14 @@
           <valueProcess>%aditoprj%/entity/Person_entity/entityfields/360degreeobjects/children/objectstatus_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>AttributeTree</name>
       <dependency>
         <name>dependency</name>
-        <entityName>AttributeRelation_entity</entityName>
-        <fieldName>TreeProvider</fieldName>
+        <entityName>360Degree_entity</entityName>
+        <fieldName>PersonObjects</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>AttributeTree</name>
       <children>
         <entityParameter>
           <name>ObjectRowId_param</name>
@@ -786,6 +781,11 @@
           <valueProcess>%aditoprj%/entity/Person_entity/entityfields/attributetree/children/showdsgvomessage_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>AttributeRelation_entity</entityName>
+        <fieldName>TreeProvider</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>DATE_NEW</name>
@@ -845,46 +845,50 @@
     </entityParameter>
     <entityConsumer>
       <name>CommRestrictions</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>CommRestriction_Entity</entityName>
-        <fieldName>CommRestrictions</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContactId_param</name>
           <valueProcess>%aditoprj%/entity/Person_entity/entityfields/commrestrictions/children/contactid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>CommRestriction_Entity</entityName>
+        <fieldName>CommRestrictions</fieldName>
+      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>DSGVOEntries</name>
       <stateProcess>%aditoprj%/entity/Person_entity/entityfields/dsgvoentries/stateProcess.js</stateProcess>
-      <dependency>
-        <name>dependency</name>
-        <entityName>DSGVO_entity</entityName>
-        <fieldName>#PROVIDER</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContactId_param</name>
           <valueProcess>%aditoprj%/entity/Person_entity/entityfields/dsgvoentries/children/contactid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>Appointments</name>
       <dependency>
         <name>dependency</name>
-        <entityName>Appointment_entity</entityName>
-        <fieldName>LinkedAppointments</fieldName>
+        <entityName>DSGVO_entity</entityName>
+        <fieldName>#PROVIDER</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>Appointments</name>
       <children>
         <entityParameter>
           <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>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Appointment_entity</entityName>
+        <fieldName>LinkedAppointments</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>OpenTasks</name>
@@ -921,11 +925,6 @@
     </entityField>
     <entityConsumer>
       <name>SelfDuplicatesUncached</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Person_entity</entityName>
-        <fieldName>SelfDuplicates</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>DuplicateActionsControl_param</name>
@@ -944,6 +943,11 @@
           <valueProcess>%aditoprj%/entity/Person_entity/entityfields/selfduplicatesuncached/children/excludedcontactids_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Person_entity</entityName>
+        <fieldName>SelfDuplicates</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>LEAD_LEADID</name>
@@ -974,14 +978,6 @@
       <name>QuickEntryContacts</name>
       <documentation>%aditoprj%/entity/Person_entity/entityfields/quickentrycontacts/documentation.adoc</documentation>
       <titlePlural>Additional Contacts</titlePlural>
-      <dependencies>
-        <entityDependency>
-          <name>6d137850-63ba-4be0-9ca5-1464e71d4f77</name>
-          <entityName>QuickEntry_entity</entityName>
-          <fieldName>Contacts</fieldName>
-          <isConsumer v="false" />
-        </entityDependency>
-      </dependencies>
       <children>
         <entityParameter>
           <name>ContactId_param</name>
@@ -1004,6 +1000,14 @@
           <expose v="false" />
         </entityParameter>
       </children>
+      <dependencies>
+        <entityDependency>
+          <name>6d137850-63ba-4be0-9ca5-1464e71d4f77</name>
+          <entityName>QuickEntry_entity</entityName>
+          <fieldName>Contacts</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+      </dependencies>
     </entityProvider>
     <entityActionField>
       <name>openEditDefaultsView</name>
@@ -1249,14 +1253,6 @@
     <entityProvider>
       <name>IdFilteredActiveContacts</name>
       <documentation>%aditoprj%/entity/Person_entity/entityfields/idfilteredactivecontacts/documentation.adoc</documentation>
-      <dependencies>
-        <entityDependency>
-          <name>511f3e4c-7493-4a31-a136-0ba80ba2ec85</name>
-          <entityName>Member_entity</entityName>
-          <fieldName>Contacts</fieldName>
-          <isConsumer v="false" />
-        </entityDependency>
-      </dependencies>
       <children>
         <entityParameter>
           <name>ExcludedContactIds_param</name>
@@ -1291,6 +1287,14 @@
           <expose v="false" />
         </entityParameter>
       </children>
+      <dependencies>
+        <entityDependency>
+          <name>511f3e4c-7493-4a31-a136-0ba80ba2ec85</name>
+          <entityName>Member_entity</entityName>
+          <fieldName>Contacts</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+      </dependencies>
     </entityProvider>
     <entityField>
       <name>COUNT</name>
@@ -1325,29 +1329,21 @@
       <name>Districts</name>
       <state>INVISIBLE</state>
       <stateProcess>%aditoprj%/entity/Person_entity/entityfields/districts/stateProcess.js</stateProcess>
-      <dependency>
-        <name>dependency</name>
-        <entityName>District_entity</entityName>
-        <fieldName>ResponsibleDistricts</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>DistrictsByContactId_param</name>
           <valueProcess>%aditoprj%/entity/Person_entity/entityfields/districts/children/districtsbycontactid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>District_entity</entityName>
+        <fieldName>ResponsibleDistricts</fieldName>
+      </dependency>
     </entityConsumer>
     <entityProvider>
       <name>NonselfDuplicates</name>
       <documentation>%aditoprj%/entity/Person_entity/entityfields/nonselfduplicates/documentation.adoc</documentation>
-      <dependencies>
-        <entityDependency>
-          <name>3a4352e2-9686-4c52-9d01-dbfad8c68ea7</name>
-          <entityName>Duplicates_entity</entityName>
-          <fieldName>DuplicatePersonsConsumer</fieldName>
-          <isConsumer v="false" />
-        </entityDependency>
-      </dependencies>
       <children>
         <entityParameter>
           <name>ContactId_param</name>
@@ -1370,22 +1366,30 @@
           <expose v="false" />
         </entityParameter>
       </children>
+      <dependencies>
+        <entityDependency>
+          <name>3a4352e2-9686-4c52-9d01-dbfad8c68ea7</name>
+          <entityName>Duplicates_entity</entityName>
+          <fieldName>DuplicatePersonsConsumer</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+      </dependencies>
     </entityProvider>
     <entityConsumer>
       <name>DistrictResponsibles</name>
       <state>INVISIBLE</state>
       <stateProcess>%aditoprj%/entity/Person_entity/entityfields/districtresponsibles/stateProcess.js</stateProcess>
-      <dependency>
-        <name>dependency</name>
-        <entityName>DistrictResponsible_entity</entityName>
-        <fieldName>OrganisationResponsibles</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>OrgUid_param</name>
           <valueProcess>%aditoprj%/entity/Person_entity/entityfields/districtresponsibles/children/orguid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>DistrictResponsible_entity</entityName>
+        <fieldName>OrganisationResponsibles</fieldName>
+      </dependency>
     </entityConsumer>
   </entityFields>
   <recordContainers>
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 00000000000..15b1f8d0322
--- /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/process/Calendar_lib/process.js b/process/Calendar_lib/process.js
index 0a9a4b99e7c..bc056c2d02c 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.getString("$param.ErrorOnPermissionDenied") && vars.get("$param.ErrorOnPermissionDenied") == "false")
+            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
-- 
GitLab


From 3e8ed424c8a1a4911c0967ca7b7cb6ccfef380ae Mon Sep 17 00:00:00 2001
From: "a.schindlbeck" <a.schindlbeck@adito.de>
Date: Tue, 3 Nov 2020 16:01:58 +0100
Subject: [PATCH 058/184] #1068152 Calendar: Dashlet-Fix

---
 process/Calendar_lib/process.js | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/process/Calendar_lib/process.js b/process/Calendar_lib/process.js
index bc056c2d02c..e9f96a4a908 100644
--- a/process/Calendar_lib/process.js
+++ b/process/Calendar_lib/process.js
@@ -548,9 +548,9 @@ CalendarUtil.buildEntriesFromUids = function(appointmentUids)
     {
         var hasPermission = true;
         
-        if(vars.getString("$param.ErrorOnPermissionDenied") && vars.get("$param.ErrorOnPermissionDenied") == "false")
+        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);
     }
-- 
GitLab


From 2119941a8b72ff15b96045646502a671349d0792 Mon Sep 17 00:00:00 2001
From: Benjamin Ulrich <b.ulrich@adito.de>
Date: Wed, 4 Nov 2020 13:26:21 +0000
Subject: [PATCH 059/184] 1065877 fix order report incorrect spelling

---
 language/_____LANGUAGE_de/_____LANGUAGE_de.aod |  2 +-
 process/Order_lib/process.js                   |  3 ++-
 report/Reminder_report/reportData.jrxml        | 17 +++++++++--------
 3 files changed, 12 insertions(+), 10 deletions(-)

diff --git a/language/_____LANGUAGE_de/_____LANGUAGE_de.aod b/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
index b563a3076d2..6fe54793874 100644
--- a/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
+++ b/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
@@ -6568,7 +6568,7 @@
     </entry>
     <entry>
       <key>Print reminder</key>
-      <value>Mahnung drucken</value>
+      <value>Mahnung anzeigen</value>
     </entry>
     <entry>
       <key>Rech.-Betrag</key>
diff --git a/process/Order_lib/process.js b/process/Order_lib/process.js
index d6938458c59..bcb1b842869 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/report/Reminder_report/reportData.jrxml b/report/Reminder_report/reportData.jrxml
index ca529152a3f..1347b1ef959 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>
-- 
GitLab


From 8fcd36c76d70718dbc71eb5fab4cfe949c999696 Mon Sep 17 00:00:00 2001
From: "b.ulrich" <b.ulrich@adito.de>
Date: Mon, 2 Nov 2020 13:28:31 +0000
Subject: [PATCH 060/184] [Projekt: Entwicklung - xRM][TicketNr.:
 1061035][Serienmail - Testen - Fehler im Serverlog]

(cherry picked from commit d2e307981c0f62579c4b9c93ce166d3c41b003aa)
---
 language/_____LANGUAGE_de/_____LANGUAGE_de.aod | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/language/_____LANGUAGE_de/_____LANGUAGE_de.aod b/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
index 6fe54793874..c75f227a0ed 100644
--- a/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
+++ b/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
@@ -6628,7 +6628,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>
-- 
GitLab


From ce6de6dc3ca6ae0be8f1b5b63219fe2da5c238c3 Mon Sep 17 00:00:00 2001
From: Sebastian Listl <s.listl@adito.de>
Date: Wed, 4 Nov 2020 10:10:56 +0100
Subject: [PATCH 061/184] #1065236 marketing automation workflow

---
 .../BulkMailRecipient_entity.aod              |  6 ++++
 .../onActionProcess.js                        | 34 ++++++++++++++++++
 .../CampaignParticipant_entity.aod            |  6 ++++
 .../onActionProcess.js                        | 36 +++++++++++++++++++
 .../DocumentTemplate_entity.aod               |  1 +
 .../onValidation.js                           | 14 ++++++++
 .../MarketingWorkflowLauncher_entity.aod      |  1 +
 .../processvariables_param/valueProcess.js    |  2 +-
 .../children/targets_param/valueProcess.js    |  8 +++--
 .../Organisation_entity.aod                   | 12 +++++++
 .../onActionProcess.js                        |  9 +++++
 entity/Person_entity/Person_entity.aod        |  2 +-
 .../onActionProcess.js                        |  1 +
 entity/WorkflowTask_entity/afterSave.js       |  4 +--
 .../MarketingWorkflowLauncher.aod             |  2 +-
 .../OrganisationFilter_view.aod               |  2 ++
 .../WorkflowLauncherEdit_view.aod             |  4 +++
 process/FilterViewAction_lib/process.js       |  5 ++-
 process/SendEmail_workflowService/process.js  |  2 +-
 19 files changed, 142 insertions(+), 9 deletions(-)
 create mode 100644 entity/BulkMailRecipient_entity/entityfields/recipientactions/children/startmarketingworkflows/onActionProcess.js
 create mode 100644 entity/CampaignParticipant_entity/entityfields/filterviewactiongroup/children/startmarketingworkflows/onActionProcess.js
 create mode 100644 entity/DocumentTemplate_entity/entityfields/documenttemplateplaceofuse/onValidation.js
 create mode 100644 entity/Organisation_entity/entityfields/workflowactions/children/startmarketingworkflows/onActionProcess.js

diff --git a/entity/BulkMailRecipient_entity/BulkMailRecipient_entity.aod b/entity/BulkMailRecipient_entity/BulkMailRecipient_entity.aod
index bae83161b6a..d60c6ae8ced 100644
--- a/entity/BulkMailRecipient_entity/BulkMailRecipient_entity.aod
+++ b/entity/BulkMailRecipient_entity/BulkMailRecipient_entity.aod
@@ -121,6 +121,12 @@
           <iconId>VAADIN:BAN</iconId>
           <tooltipProcess>%aditoprj%/entity/BulkMailRecipient_entity/entityfields/recipientactions/children/removewithcommrestriction/tooltipProcess.js</tooltipProcess>
         </entityActionField>
+        <entityActionField>
+          <name>startMarketingWorkflows</name>
+          <title>Start marketing workflow</title>
+          <onActionProcess>%aditoprj%/entity/BulkMailRecipient_entity/entityfields/recipientactions/children/startmarketingworkflows/onActionProcess.js</onActionProcess>
+          <isObjectAction v="false" />
+        </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 00000000000..cbe91449e5c
--- /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 3c8e5a5655f..2ecc8752c73 100644
--- a/entity/CampaignParticipant_entity/CampaignParticipant_entity.aod
+++ b/entity/CampaignParticipant_entity/CampaignParticipant_entity.aod
@@ -177,6 +177,12 @@
           <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 workflow</title>
+          <onActionProcess>%aditoprj%/entity/CampaignParticipant_entity/entityfields/filterviewactiongroup/children/startmarketingworkflows/onActionProcess.js</onActionProcess>
+          <isObjectAction v="false" />
+        </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 00000000000..40e60ff20d2
--- /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 9cf1d9cca30..dbb9e49a3b6 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 00000000000..a40be7eb7d8
--- /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/MarketingWorkflowLauncher_entity/MarketingWorkflowLauncher_entity.aod b/entity/MarketingWorkflowLauncher_entity/MarketingWorkflowLauncher_entity.aod
index 40b9b39c899..f387fc2eca7 100644
--- a/entity/MarketingWorkflowLauncher_entity/MarketingWorkflowLauncher_entity.aod
+++ b/entity/MarketingWorkflowLauncher_entity/MarketingWorkflowLauncher_entity.aod
@@ -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 b81df3d4fb9..3855fc6c443 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,6 @@ import("system.vars");
 import("system.result");
 
 var variables = {
-    documentTemplate: vars.get("$field.DOCUMENTTEMPLATE_ID")
+    documentTemplateId: vars.get("$field.DOCUMENTTEMPLATE_ID")
 };
 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 6a28aafa528..cca5f0e8d7c 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 0287eb1d381..bfd5e70a02a 100644
--- a/entity/Organisation_entity/Organisation_entity.aod
+++ b/entity/Organisation_entity/Organisation_entity.aod
@@ -1422,6 +1422,18 @@
         <fieldName>FilterProvider</fieldName>
       </dependency>
     </entityConsumer>
+    <entityActionGroup>
+      <name>workflowActions</name>
+      <title>Workflow</title>
+      <children>
+        <entityActionField>
+          <name>startMarketingWorkflows</name>
+          <title>Start marketing workflow</title>
+          <onActionProcess>%aditoprj%/entity/Organisation_entity/entityfields/workflowactions/children/startmarketingworkflows/onActionProcess.js</onActionProcess>
+          <isObjectAction v="false" />
+        </entityActionField>
+      </children>
+    </entityActionGroup>
   </entityFields>
   <recordContainers>
     <dbRecordContainer>
diff --git a/entity/Organisation_entity/entityfields/workflowactions/children/startmarketingworkflows/onActionProcess.js b/entity/Organisation_entity/entityfields/workflowactions/children/startmarketingworkflows/onActionProcess.js
new file mode 100644
index 00000000000..2b04867cc90
--- /dev/null
+++ b/entity/Organisation_entity/entityfields/workflowactions/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/Person_entity/Person_entity.aod b/entity/Person_entity/Person_entity.aod
index 4a393db4dab..24d78e6da4f 100644
--- a/entity/Person_entity/Person_entity.aod
+++ b/entity/Person_entity/Person_entity.aod
@@ -1103,7 +1103,7 @@
         </entityActionField>
         <entityActionField>
           <name>startMarketingWorkflows</name>
-          <title>Marketing Workflow</title>
+          <title>Start marketing workflow</title>
           <onActionProcess>%aditoprj%/entity/Person_entity/entityfields/filterviewactiongroup/children/startmarketingworkflows/onActionProcess.js</onActionProcess>
           <isObjectAction v="false" />
         </entityActionField>
diff --git a/entity/Person_entity/entityfields/filterviewactiongroup/children/startmarketingworkflows/onActionProcess.js b/entity/Person_entity/entityfields/filterviewactiongroup/children/startmarketingworkflows/onActionProcess.js
index 3e462ab4498..2b04867cc90 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/WorkflowTask_entity/afterSave.js b/entity/WorkflowTask_entity/afterSave.js
index 383331b295d..61b54c53434 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/neonContext/MarketingWorkflowLauncher/MarketingWorkflowLauncher.aod b/neonContext/MarketingWorkflowLauncher/MarketingWorkflowLauncher.aod
index bad0c038509..e200a8a70f8 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/neonView/OrganisationFilter_view/OrganisationFilter_view.aod b/neonView/OrganisationFilter_view/OrganisationFilter_view.aod
index 1cbde0c5309..7f17a0e1a0f 100644
--- a/neonView/OrganisationFilter_view/OrganisationFilter_view.aod
+++ b/neonView/OrganisationFilter_view/OrganisationFilter_view.aod
@@ -51,6 +51,7 @@
       <name>Organisations</name>
       <favoriteActionGroup1>filterViewActionGroup</favoriteActionGroup1>
       <favoriteActionGroup2>DuplicateActions</favoriteActionGroup2>
+      <favoriteActionGroup3>workflowActions</favoriteActionGroup3>
       <subtitleField>CUSTOMERCODE_DISPLAY_fieldGroup</subtitleField>
       <entityField>#ENTITY</entityField>
       <linkedColumns>
@@ -100,6 +101,7 @@
       <name>Treetable</name>
       <favoriteActionGroup1>filterViewActionGroup</favoriteActionGroup1>
       <favoriteActionGroup2>DuplicateActions</favoriteActionGroup2>
+      <favoriteActionGroup3>workflowActions</favoriteActionGroup3>
       <entityField>#ENTITY</entityField>
       <linkedColumns>
         <element>NAME</element>
diff --git a/neonView/WorkflowLauncherEdit_view/WorkflowLauncherEdit_view.aod b/neonView/WorkflowLauncherEdit_view/WorkflowLauncherEdit_view.aod
index 8445a151ff6..8f7e944084f 100644
--- a/neonView/WorkflowLauncherEdit_view/WorkflowLauncherEdit_view.aod
+++ b/neonView/WorkflowLauncherEdit_view/WorkflowLauncherEdit_view.aod
@@ -23,6 +23,10 @@
           <name>14de7f56-44cf-4c9e-89a7-59f84e482fd9</name>
           <entityField>NAME</entityField>
         </entityFieldLink>
+        <entityFieldLink>
+          <name>fd4252cf-e137-4068-a91b-732708f5ee1c</name>
+          <entityField>workflowTargets</entityField>
+        </entityFieldLink>
       </fields>
     </genericViewTemplate>
     <dynamicFormViewTemplate>
diff --git a/process/FilterViewAction_lib/process.js b/process/FilterViewAction_lib/process.js
index b0fa04291d0..8615c426d6d 100644
--- a/process/FilterViewAction_lib/process.js
+++ b/process/FilterViewAction_lib/process.js
@@ -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/SendEmail_workflowService/process.js b/process/SendEmail_workflowService/process.js
index 6ccbfe3e760..ded2b169e19 100644
--- a/process/SendEmail_workflowService/process.js
+++ b/process/SendEmail_workflowService/process.js
@@ -10,7 +10,7 @@ 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;
-- 
GitLab


From 4446c7d6df37eab0bf1fd4e6e719d9959c09309d Mon Sep 17 00:00:00 2001
From: Sebastian Listl <s.listl@adito.de>
Date: Wed, 4 Nov 2020 10:39:24 +0100
Subject: [PATCH 062/184] #1065236 marketing automation workflow set adito url

---
 .../processvariables_param/valueProcess.js     |  3 ++-
 .../Organisation_entity.aod                    | 18 ++++++------------
 .../startmarketingworkflows/onActionProcess.js |  0
 .../WorkflowLauncher_entity.aod                |  2 ++
 .../OrganisationFilter_view.aod                |  2 --
 process/FilterViewAction_lib/process.js        |  2 +-
 process/SendEmail_workflowService/process.js   | 13 +++++++++----
 7 files changed, 20 insertions(+), 20 deletions(-)
 rename entity/Organisation_entity/entityfields/{workflowactions => filterviewactiongroup}/children/startmarketingworkflows/onActionProcess.js (100%)

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 3855fc6c443..cea637a710a 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 = {
-    documentTemplateId: 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/Organisation_entity/Organisation_entity.aod b/entity/Organisation_entity/Organisation_entity.aod
index bfd5e70a02a..d428c6f4de9 100644
--- a/entity/Organisation_entity/Organisation_entity.aod
+++ b/entity/Organisation_entity/Organisation_entity.aod
@@ -959,6 +959,12 @@
           <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 workflow</title>
+          <onActionProcess>%aditoprj%/entity/Organisation_entity/entityfields/filterviewactiongroup/children/startmarketingworkflows/onActionProcess.js</onActionProcess>
+          <isObjectAction v="false" />
+        </entityActionField>
       </children>
     </entityActionGroup>
     <entityActionField>
@@ -1422,18 +1428,6 @@
         <fieldName>FilterProvider</fieldName>
       </dependency>
     </entityConsumer>
-    <entityActionGroup>
-      <name>workflowActions</name>
-      <title>Workflow</title>
-      <children>
-        <entityActionField>
-          <name>startMarketingWorkflows</name>
-          <title>Start marketing workflow</title>
-          <onActionProcess>%aditoprj%/entity/Organisation_entity/entityfields/workflowactions/children/startmarketingworkflows/onActionProcess.js</onActionProcess>
-          <isObjectAction v="false" />
-        </entityActionField>
-      </children>
-    </entityActionGroup>
   </entityFields>
   <recordContainers>
     <dbRecordContainer>
diff --git a/entity/Organisation_entity/entityfields/workflowactions/children/startmarketingworkflows/onActionProcess.js b/entity/Organisation_entity/entityfields/filterviewactiongroup/children/startmarketingworkflows/onActionProcess.js
similarity index 100%
rename from entity/Organisation_entity/entityfields/workflowactions/children/startmarketingworkflows/onActionProcess.js
rename to entity/Organisation_entity/entityfields/filterviewactiongroup/children/startmarketingworkflows/onActionProcess.js
diff --git a/entity/WorkflowLauncher_entity/WorkflowLauncher_entity.aod b/entity/WorkflowLauncher_entity/WorkflowLauncher_entity.aod
index f1640dc1aac..4ac6aa0edf3 100644
--- a/entity/WorkflowLauncher_entity/WorkflowLauncher_entity.aod
+++ b/entity/WorkflowLauncher_entity/WorkflowLauncher_entity.aod
@@ -31,6 +31,7 @@
       <name>KEY</name>
       <title>Key</title>
       <consumer>WorkflowDefinitions</consumer>
+      <mandatory v="true" />
       <state>EDITABLE</state>
     </entityField>
     <entityActionField>
@@ -88,6 +89,7 @@
   <recordContainers>
     <datalessRecordContainer>
       <name>dataLess</name>
+      <alias>Data_alias</alias>
     </datalessRecordContainer>
   </recordContainers>
 </entity>
diff --git a/neonView/OrganisationFilter_view/OrganisationFilter_view.aod b/neonView/OrganisationFilter_view/OrganisationFilter_view.aod
index 7f17a0e1a0f..1cbde0c5309 100644
--- a/neonView/OrganisationFilter_view/OrganisationFilter_view.aod
+++ b/neonView/OrganisationFilter_view/OrganisationFilter_view.aod
@@ -51,7 +51,6 @@
       <name>Organisations</name>
       <favoriteActionGroup1>filterViewActionGroup</favoriteActionGroup1>
       <favoriteActionGroup2>DuplicateActions</favoriteActionGroup2>
-      <favoriteActionGroup3>workflowActions</favoriteActionGroup3>
       <subtitleField>CUSTOMERCODE_DISPLAY_fieldGroup</subtitleField>
       <entityField>#ENTITY</entityField>
       <linkedColumns>
@@ -101,7 +100,6 @@
       <name>Treetable</name>
       <favoriteActionGroup1>filterViewActionGroup</favoriteActionGroup1>
       <favoriteActionGroup2>DuplicateActions</favoriteActionGroup2>
-      <favoriteActionGroup3>workflowActions</favoriteActionGroup3>
       <entityField>#ENTITY</entityField>
       <linkedColumns>
         <element>NAME</element>
diff --git a/process/FilterViewAction_lib/process.js b/process/FilterViewAction_lib/process.js
index 8615c426d6d..afd89d4d6d4 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")
diff --git a/process/SendEmail_workflowService/process.js b/process/SendEmail_workflowService/process.js
index ded2b169e19..14247ad4e4b 100644
--- a/process/SendEmail_workflowService/process.js
+++ b/process/SendEmail_workflowService/process.js
@@ -14,15 +14,20 @@ 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)];
 
-- 
GitLab


From dcf5daf57b39f65750adc20fb140d17becae1ae3 Mon Sep 17 00:00:00 2001
From: Sebastian Listl <s.listl@adito.de>
Date: Wed, 4 Nov 2020 16:42:22 +0100
Subject: [PATCH 063/184] #1065236 launch marketing workflow

---
 .../BulkMailRecipient_entity.aod              |   3 +-
 .../CampaignParticipant_entity.aod            |   3 +-
 .../MarketingWorkflowLauncher_entity.aod      |   2 +-
 .../Organisation_entity.aod                   | 439 +++++++++---------
 entity/Person_entity/Person_entity.aod        | 401 ++++++++--------
 .../WorkflowLauncher_entity.aod               |   1 -
 .../_____LANGUAGE_de/_____LANGUAGE_de.aod     |   4 +
 .../WorkflowLauncherEdit_view.aod             |   4 -
 8 files changed, 430 insertions(+), 427 deletions(-)

diff --git a/entity/BulkMailRecipient_entity/BulkMailRecipient_entity.aod b/entity/BulkMailRecipient_entity/BulkMailRecipient_entity.aod
index d60c6ae8ced..60d85496e22 100644
--- a/entity/BulkMailRecipient_entity/BulkMailRecipient_entity.aod
+++ b/entity/BulkMailRecipient_entity/BulkMailRecipient_entity.aod
@@ -123,9 +123,10 @@
         </entityActionField>
         <entityActionField>
           <name>startMarketingWorkflows</name>
-          <title>Start marketing workflow</title>
+          <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>
diff --git a/entity/CampaignParticipant_entity/CampaignParticipant_entity.aod b/entity/CampaignParticipant_entity/CampaignParticipant_entity.aod
index 2ecc8752c73..4d3b86ba02c 100644
--- a/entity/CampaignParticipant_entity/CampaignParticipant_entity.aod
+++ b/entity/CampaignParticipant_entity/CampaignParticipant_entity.aod
@@ -179,9 +179,10 @@
         </entityActionField>
         <entityActionField>
           <name>startMarketingWorkflows</name>
-          <title>Start marketing workflow</title>
+          <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>
diff --git a/entity/MarketingWorkflowLauncher_entity/MarketingWorkflowLauncher_entity.aod b/entity/MarketingWorkflowLauncher_entity/MarketingWorkflowLauncher_entity.aod
index f387fc2eca7..791b08d72b2 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>
diff --git a/entity/Organisation_entity/Organisation_entity.aod b/entity/Organisation_entity/Organisation_entity.aod
index d428c6f4de9..50afcd2e322 100644
--- a/entity/Organisation_entity/Organisation_entity.aod
+++ b/entity/Organisation_entity/Organisation_entity.aod
@@ -71,6 +71,11 @@
     </entityField>
     <entityConsumer>
       <name>Activities</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Activity_entity</entityName>
+        <fieldName>LinkedObjects</fieldName>
+      </dependency>
       <children>
         <entityParameter>
           <name>RowId_param</name>
@@ -81,26 +86,21 @@
           <valueProcess>%aditoprj%/entity/Organisation_entity/entityfields/activities/children/objectid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Activity_entity</entityName>
-        <fieldName>LinkedObjects</fieldName>
-      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>Contact</name>
       <selectionMode>MULTI</selectionMode>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Person_entity</entityName>
+        <fieldName>OrganisationRelated</fieldName>
+      </dependency>
       <children>
         <entityParameter>
           <name>OrgId_param</name>
           <valueProcess>%aditoprj%/entity/Organisation_entity/entityfields/contact/children/orgid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Person_entity</entityName>
-        <fieldName>OrganisationRelated</fieldName>
-      </dependency>
     </entityConsumer>
     <entityFieldGroup>
       <name>CUSTOMERCODE_DISPLAY_fieldGroup</name>
@@ -114,36 +114,6 @@
       <name>Organisations</name>
       <documentation>%aditoprj%/entity/Organisation_entity/entityfields/organisations/documentation.adoc</documentation>
       <recordContainer>db</recordContainer>
-      <children>
-        <entityParameter>
-          <name>WithPrivate_param</name>
-          <expose v="true" />
-        </entityParameter>
-        <entityParameter>
-          <name>ExcludeOrganisationsByPersonId</name>
-          <expose v="false" />
-        </entityParameter>
-        <entityParameter>
-          <name>ExcludedContactIds_param</name>
-          <expose v="true" />
-        </entityParameter>
-        <entityParameter>
-          <name>AttributeKeyId_param</name>
-          <expose v="false" />
-        </entityParameter>
-        <entityParameter>
-          <name>AttributeId_param</name>
-          <expose v="false" />
-        </entityParameter>
-        <entityParameter>
-          <name>DuplicateActionsControl_param</name>
-          <expose v="false" />
-        </entityParameter>
-        <entityParameter>
-          <name>DuplicateCurrentContactId_param</name>
-          <expose v="false" />
-        </entityParameter>
-      </children>
       <dependencies>
         <entityDependency>
           <name>85aa363e-d8ba-4df5-8422-bf7aff86a4f8</name>
@@ -182,9 +152,44 @@
           <isConsumer v="false" />
         </entityDependency>
       </dependencies>
+      <children>
+        <entityParameter>
+          <name>WithPrivate_param</name>
+          <expose v="true" />
+        </entityParameter>
+        <entityParameter>
+          <name>ExcludeOrganisationsByPersonId</name>
+          <expose v="false" />
+        </entityParameter>
+        <entityParameter>
+          <name>ExcludedContactIds_param</name>
+          <expose v="true" />
+        </entityParameter>
+        <entityParameter>
+          <name>AttributeKeyId_param</name>
+          <expose v="false" />
+        </entityParameter>
+        <entityParameter>
+          <name>AttributeId_param</name>
+          <expose v="false" />
+        </entityParameter>
+        <entityParameter>
+          <name>DuplicateActionsControl_param</name>
+          <expose v="false" />
+        </entityParameter>
+        <entityParameter>
+          <name>DuplicateCurrentContactId_param</name>
+          <expose v="false" />
+        </entityParameter>
+      </children>
     </entityProvider>
     <entityConsumer>
       <name>Addresses</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Address_entity</entityName>
+        <fieldName>OrganisationAddresses</fieldName>
+      </dependency>
       <children>
         <entityParameter>
           <name>DefaultAddressId_param</name>
@@ -196,11 +201,6 @@
           <expose v="false" />
         </entityParameter>
       </children>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Address_entity</entityName>
-        <fieldName>OrganisationAddresses</fieldName>
-      </dependency>
     </entityConsumer>
     <entityField>
       <name>ADDRESS_ID</name>
@@ -211,6 +211,11 @@
     </entityField>
     <entityConsumer>
       <name>Communications</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Communication_entity</entityName>
+        <fieldName>AllCommunications</fieldName>
+      </dependency>
       <children>
         <entityParameter>
           <name>ContactId_param</name>
@@ -222,15 +227,15 @@
           <valueProcess>%aditoprj%/entity/Organisation_entity/entityfields/communications/children/contactsmaincountry_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Communication_entity</entityName>
-        <fieldName>AllCommunications</fieldName>
-      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>Contracts</name>
       <selectionMode>MULTI</selectionMode>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Contract_entity</entityName>
+        <fieldName>Contracts</fieldName>
+      </dependency>
       <children>
         <entityParameter>
           <name>ContactId_param</name>
@@ -239,14 +244,14 @@
           <mandatory v="true" />
         </entityParameter>
       </children>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Contract_entity</entityName>
-        <fieldName>Contracts</fieldName>
-      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>Productprices</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Productprice_entity</entityName>
+        <fieldName>Productprices</fieldName>
+      </dependency>
       <children>
         <entityParameter>
           <name>ContactId_param</name>
@@ -255,11 +260,6 @@
           <mandatory v="true" />
         </entityParameter>
       </children>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Productprice_entity</entityName>
-        <fieldName>Productprices</fieldName>
-      </dependency>
     </entityConsumer>
     <entityProvider>
       <name>#PROVIDER</name>
@@ -300,6 +300,11 @@
     <entityConsumer>
       <name>Documents</name>
       <selectionMode>MULTI</selectionMode>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Document_entity</entityName>
+        <fieldName>Documents</fieldName>
+      </dependency>
       <children>
         <entityParameter>
           <name>AssignmentRowId_param</name>
@@ -310,11 +315,6 @@
           <valueProcess>%aditoprj%/entity/Organisation_entity/entityfields/documents/children/assignmenttable_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Document_entity</entityName>
-        <fieldName>Documents</fieldName>
-      </dependency>
     </entityConsumer>
     <entityField>
       <name>STANDARD_EMAIL_COMMUNICATION</name>
@@ -330,6 +330,11 @@
     </entityField>
     <entityConsumer>
       <name>PhoneCommunications</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Communication_entity</entityName>
+        <fieldName>PhoneCommunications</fieldName>
+      </dependency>
       <children>
         <entityParameter>
           <name>ContactId_param</name>
@@ -337,14 +342,14 @@
           <expose v="false" />
         </entityParameter>
       </children>
+    </entityConsumer>
+    <entityConsumer>
+      <name>EmailCommunications</name>
       <dependency>
         <name>dependency</name>
         <entityName>Communication_entity</entityName>
-        <fieldName>PhoneCommunications</fieldName>
+        <fieldName>EmailCommunications</fieldName>
       </dependency>
-    </entityConsumer>
-    <entityConsumer>
-      <name>EmailCommunications</name>
       <children>
         <entityParameter>
           <name>ContactId_param</name>
@@ -352,11 +357,6 @@
           <expose v="false" />
         </entityParameter>
       </children>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Communication_entity</entityName>
-        <fieldName>EmailCommunications</fieldName>
-      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>Countries</name>
@@ -369,6 +369,11 @@
     <entityConsumer>
       <name>Attributes</name>
       <onValidation>%aditoprj%/entity/Organisation_entity/entityfields/attributes/onValidation.js</onValidation>
+      <dependency>
+        <name>dependency</name>
+        <entityName>AttributeRelation_entity</entityName>
+        <fieldName>AttributeRelations</fieldName>
+      </dependency>
       <children>
         <entityParameter>
           <name>ObjectRowId_param</name>
@@ -380,14 +385,14 @@
           <valueProcess>%aditoprj%/entity/Organisation_entity/entityfields/attributes/children/objecttype_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-      <dependency>
-        <name>dependency</name>
-        <entityName>AttributeRelation_entity</entityName>
-        <fieldName>AttributeRelations</fieldName>
-      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>KeywordContactStates</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>SpecificContainerKeywords</fieldName>
+      </dependency>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
@@ -395,14 +400,14 @@
           <expose v="false" />
         </entityParameter>
       </children>
+    </entityConsumer>
+    <entityConsumer>
+      <name>KeywordOrganisationTypes</name>
       <dependency>
         <name>dependency</name>
         <entityName>KeywordEntry_entity</entityName>
         <fieldName>SpecificContainerKeywords</fieldName>
       </dependency>
-    </entityConsumer>
-    <entityConsumer>
-      <name>KeywordOrganisationTypes</name>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
@@ -410,11 +415,6 @@
           <expose v="false" />
         </entityParameter>
       </children>
-      <dependency>
-        <name>dependency</name>
-        <entityName>KeywordEntry_entity</entityName>
-        <fieldName>SpecificContainerKeywords</fieldName>
-      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>Languages</name>
@@ -426,6 +426,11 @@
     </entityConsumer>
     <entityConsumer>
       <name>KeywordPricePolitics</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>SpecificContainerKeywords</fieldName>
+      </dependency>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
@@ -433,14 +438,14 @@
           <expose v="false" />
         </entityParameter>
       </children>
+    </entityConsumer>
+    <entityConsumer>
+      <name>KeywordWeaknesses</name>
       <dependency>
         <name>dependency</name>
         <entityName>KeywordEntry_entity</entityName>
         <fieldName>SpecificContainerKeywords</fieldName>
       </dependency>
-    </entityConsumer>
-    <entityConsumer>
-      <name>KeywordWeaknesses</name>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
@@ -448,14 +453,14 @@
           <expose v="false" />
         </entityParameter>
       </children>
+    </entityConsumer>
+    <entityConsumer>
+      <name>KeywordStrenghts</name>
       <dependency>
         <name>dependency</name>
         <entityName>KeywordEntry_entity</entityName>
         <fieldName>SpecificContainerKeywords</fieldName>
       </dependency>
-    </entityConsumer>
-    <entityConsumer>
-      <name>KeywordStrenghts</name>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
@@ -463,14 +468,14 @@
           <expose v="false" />
         </entityParameter>
       </children>
-      <dependency>
-        <name>dependency</name>
-        <entityName>KeywordEntry_entity</entityName>
-        <fieldName>SpecificContainerKeywords</fieldName>
-      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>Salesprojects</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Salesproject_entity</entityName>
+        <fieldName>Salesprojects</fieldName>
+      </dependency>
       <children>
         <entityParameter>
           <name>ContactId_param</name>
@@ -479,14 +484,14 @@
           <mandatory v="true" />
         </entityParameter>
       </children>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Salesproject_entity</entityName>
-        <fieldName>Salesprojects</fieldName>
-      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>Offers</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Offer_entity</entityName>
+        <fieldName>ContactOffers</fieldName>
+      </dependency>
       <children>
         <entityParameter>
           <name>ContactId_param</name>
@@ -495,14 +500,14 @@
           <mandatory v="true" />
         </entityParameter>
       </children>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Offer_entity</entityName>
-        <fieldName>ContactOffers</fieldName>
-      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>Tasks</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Task_entity</entityName>
+        <fieldName>Tasks</fieldName>
+      </dependency>
       <children>
         <entityParameter>
           <name>RowId_param</name>
@@ -513,11 +518,6 @@
           <valueProcess>%aditoprj%/entity/Organisation_entity/entityfields/tasks/children/objectid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Task_entity</entityName>
-        <fieldName>Tasks</fieldName>
-      </dependency>
     </entityConsumer>
     <entityParameter>
       <name>WithPrivate_param</name>
@@ -528,6 +528,11 @@
     </entityParameter>
     <entityConsumer>
       <name>ObjectTrees</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>ObjectTree_entity</entityName>
+        <fieldName>TreeProvider</fieldName>
+      </dependency>
       <children>
         <entityParameter>
           <name>ObjectIds_param</name>
@@ -538,14 +543,14 @@
           <valueProcess>%aditoprj%/entity/Organisation_entity/entityfields/objecttrees/children/objecttypes_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-      <dependency>
-        <name>dependency</name>
-        <entityName>ObjectTree_entity</entityName>
-        <fieldName>TreeProvider</fieldName>
-      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>LogHistories</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>LogHistory_entity</entityName>
+        <fieldName>LogHistoryProvider</fieldName>
+      </dependency>
       <children>
         <entityParameter>
           <name>tablenames_param</name>
@@ -554,14 +559,14 @@
           <mandatory v="true" />
         </entityParameter>
       </children>
-      <dependency>
-        <name>dependency</name>
-        <entityName>LogHistory_entity</entityName>
-        <fieldName>LogHistoryProvider</fieldName>
-      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>360DegreeObjects</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>360Degree_entity</entityName>
+        <fieldName>OrganisationObjects</fieldName>
+      </dependency>
       <children>
         <entityParameter>
           <name>ObjectRowId_param</name>
@@ -572,11 +577,6 @@
           <valueProcess>%aditoprj%/entity/Organisation_entity/entityfields/360degreeobjects/children/objectstatus_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-      <dependency>
-        <name>dependency</name>
-        <entityName>360Degree_entity</entityName>
-        <fieldName>OrganisationObjects</fieldName>
-      </dependency>
     </entityConsumer>
     <entityParameter>
       <name>ExcludeOrganisationsByPersonId</name>
@@ -587,6 +587,26 @@
     <entityProvider>
       <name>WithPersonIdFilter</name>
       <documentation>%aditoprj%/entity/Organisation_entity/entityfields/withpersonidfilter/documentation.adoc</documentation>
+      <dependencies>
+        <entityDependency>
+          <name>5a456b04-f0ca-4a45-9c1f-bdfdf074434a</name>
+          <entityName>Contact_entity</entityName>
+          <fieldName>Organisations</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+        <entityDependency>
+          <name>a80c3db0-29db-433c-8f7c-4ebf6639ad6d</name>
+          <entityName>Person_entity</entityName>
+          <fieldName>Organisations</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+        <entityDependency>
+          <name>748a3083-89c2-41b4-a233-3fd5364396e9</name>
+          <entityName>Competition_entity</entityName>
+          <fieldName>Organisation</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+      </dependencies>
       <children>
         <entityParameter>
           <name>ExcludeOrganisationsByPersonId</name>
@@ -619,26 +639,6 @@
           <expose v="false" />
         </entityParameter>
       </children>
-      <dependencies>
-        <entityDependency>
-          <name>5a456b04-f0ca-4a45-9c1f-bdfdf074434a</name>
-          <entityName>Contact_entity</entityName>
-          <fieldName>Organisations</fieldName>
-          <isConsumer v="false" />
-        </entityDependency>
-        <entityDependency>
-          <name>a80c3db0-29db-433c-8f7c-4ebf6639ad6d</name>
-          <entityName>Person_entity</entityName>
-          <fieldName>Organisations</fieldName>
-          <isConsumer v="false" />
-        </entityDependency>
-        <entityDependency>
-          <name>748a3083-89c2-41b4-a233-3fd5364396e9</name>
-          <entityName>Competition_entity</entityName>
-          <fieldName>Organisation</fieldName>
-          <isConsumer v="false" />
-        </entityDependency>
-      </dependencies>
     </entityProvider>
     <entityParameter>
       <name>AttributeId_param</name>
@@ -653,6 +653,20 @@
     <entityProvider>
       <name>WithAttribute</name>
       <documentation>%aditoprj%/entity/Organisation_entity/entityfields/withattribute/documentation.adoc</documentation>
+      <dependencies>
+        <entityDependency>
+          <name>10480df2-f0b6-4cb6-8bfb-4a468b994996</name>
+          <entityName>Competition_entity</entityName>
+          <fieldName>Organisations</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+        <entityDependency>
+          <name>f368be61-1a15-449f-b37c-b1343069412c</name>
+          <entityName>Product_entity</entityName>
+          <fieldName>Organisations</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+      </dependencies>
       <children>
         <entityParameter>
           <name>AttributeId_param</name>
@@ -684,20 +698,6 @@
           <expose v="false" />
         </entityParameter>
       </children>
-      <dependencies>
-        <entityDependency>
-          <name>10480df2-f0b6-4cb6-8bfb-4a468b994996</name>
-          <entityName>Competition_entity</entityName>
-          <fieldName>Organisations</fieldName>
-          <isConsumer v="false" />
-        </entityDependency>
-        <entityDependency>
-          <name>f368be61-1a15-449f-b37c-b1343069412c</name>
-          <entityName>Product_entity</entityName>
-          <fieldName>Organisations</fieldName>
-          <isConsumer v="false" />
-        </entityDependency>
-      </dependencies>
     </entityProvider>
     <entityParameter>
       <name>ExcludedContactIds_param</name>
@@ -706,6 +706,11 @@
     </entityParameter>
     <entityConsumer>
       <name>AttributeTree</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>AttributeRelation_entity</entityName>
+        <fieldName>TreeProvider</fieldName>
+      </dependency>
       <children>
         <entityParameter>
           <name>ObjectRowId_param</name>
@@ -716,11 +721,6 @@
           <valueProcess>%aditoprj%/entity/Organisation_entity/entityfields/attributetree/children/objecttype_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-      <dependency>
-        <name>dependency</name>
-        <entityName>AttributeRelation_entity</entityName>
-        <fieldName>TreeProvider</fieldName>
-      </dependency>
     </entityConsumer>
     <entityField>
       <name>DATE_NEW</name>
@@ -772,6 +772,11 @@
     <entityConsumer>
       <name>AttributeConditions</name>
       <onValidation>%aditoprj%/entity/Organisation_entity/entityfields/attributeconditions/onValidation.js</onValidation>
+      <dependency>
+        <name>dependency</name>
+        <entityName>AttributeRelation_entity</entityName>
+        <fieldName>AttributeRelations</fieldName>
+      </dependency>
       <children>
         <entityParameter>
           <name>ObjectRowId_param</name>
@@ -794,14 +799,14 @@
           <valueProcess>%aditoprj%/entity/Organisation_entity/entityfields/attributeconditions/children/showempty_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-      <dependency>
-        <name>dependency</name>
-        <entityName>AttributeRelation_entity</entityName>
-        <fieldName>AttributeRelations</fieldName>
-      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>LinkedAppointments</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Appointment_entity</entityName>
+        <fieldName>LinkedAppointments</fieldName>
+      </dependency>
       <children>
         <entityParameter>
           <name>LinkedObjectId_param</name>
@@ -812,11 +817,6 @@
           <valueProcess>%aditoprj%/entity/Organisation_entity/entityfields/linkedappointments/children/erroronpermissiondenied/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Appointment_entity</entityName>
-        <fieldName>LinkedAppointments</fieldName>
-      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>Products</name>
@@ -961,9 +961,10 @@
         </entityActionField>
         <entityActionField>
           <name>startMarketingWorkflows</name>
-          <title>Start marketing workflow</title>
+          <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>
@@ -1093,6 +1094,11 @@
     </entityParameter>
     <entityConsumer>
       <name>SelfDuplicatesUncached</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Organisation_entity</entityName>
+        <fieldName>SelfDuplicates</fieldName>
+      </dependency>
       <children>
         <entityParameter>
           <name>DuplicateActionsControl_param</name>
@@ -1112,25 +1118,20 @@
           <valueProcess>%aditoprj%/entity/Organisation_entity/entityfields/selfduplicatesuncached/children/excludedcontactids_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Organisation_entity</entityName>
-        <fieldName>SelfDuplicates</fieldName>
-      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>CommRestrictions</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>CommRestriction_Entity</entityName>
+        <fieldName>CommRestrictions</fieldName>
+      </dependency>
       <children>
         <entityParameter>
           <name>ContactId_param</name>
           <valueProcess>%aditoprj%/entity/Organisation_entity/entityfields/commrestrictions/children/contactid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-      <dependency>
-        <name>dependency</name>
-        <entityName>CommRestriction_Entity</entityName>
-        <fieldName>CommRestrictions</fieldName>
-      </dependency>
     </entityConsumer>
     <entityField>
       <name>COMMRESTRICTIONS_ACTIVE</name>
@@ -1185,6 +1186,11 @@
     <entityConsumer>
       <name>Classifications</name>
       <refreshParent v="true" />
+      <dependency>
+        <name>dependency</name>
+        <entityName>Classification_entity</entityName>
+        <fieldName>Classifications</fieldName>
+      </dependency>
       <children>
         <entityParameter>
           <name>ClassificationType_param</name>
@@ -1202,11 +1208,6 @@
           <expose v="true" />
         </entityParameter>
       </children>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Classification_entity</entityName>
-        <fieldName>Classifications</fieldName>
-      </dependency>
     </entityConsumer>
     <entityField>
       <name>COUNT</name>
@@ -1227,6 +1228,14 @@
       <name>OrganisationsViaIndex</name>
       <documentation>%aditoprj%/entity/Organisation_entity/entityfields/organisationsviaindex/documentation.adoc</documentation>
       <recordContainer>index</recordContainer>
+      <dependencies>
+        <entityDependency>
+          <name>e60b8983-166d-4280-a1a5-f990ad77eeb9</name>
+          <entityName>AroundLocation_entity</entityName>
+          <fieldName>Organisations</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+      </dependencies>
       <children>
         <entityParameter>
           <name>ExcludeOrganisationsByPersonId</name>
@@ -1269,14 +1278,6 @@
           <expose v="true" />
         </entityParameter>
       </children>
-      <dependencies>
-        <entityDependency>
-          <name>e60b8983-166d-4280-a1a5-f990ad77eeb9</name>
-          <entityName>AroundLocation_entity</entityName>
-          <fieldName>Organisations</fieldName>
-          <isConsumer v="false" />
-        </entityDependency>
-      </dependencies>
     </entityProvider>
     <entityActionField>
       <name>openAroundLocation</name>
@@ -1347,17 +1348,17 @@
     </entityProvider>
     <entityConsumer>
       <name>DistrictResponsibles</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>DistrictResponsible_entity</entityName>
+        <fieldName>OrganisationResponsibles</fieldName>
+      </dependency>
       <children>
         <entityParameter>
           <name>OrgUid_param</name>
           <valueProcess>%aditoprj%/entity/Organisation_entity/entityfields/districtresponsibles/children/orguid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-      <dependency>
-        <name>dependency</name>
-        <entityName>DistrictResponsible_entity</entityName>
-        <fieldName>OrganisationResponsibles</fieldName>
-      </dependency>
     </entityConsumer>
     <entityParameter>
       <name>FilterPreSet_param</name>
@@ -1366,6 +1367,14 @@
     <entityProvider>
       <name>NonselfDuplicates</name>
       <documentation>%aditoprj%/entity/Organisation_entity/entityfields/nonselfduplicates/documentation.adoc</documentation>
+      <dependencies>
+        <entityDependency>
+          <name>2e410b9e-5ebc-48ea-9562-da386202d7e8</name>
+          <entityName>Duplicates_entity</entityName>
+          <fieldName>DuplicateOrganisationsConsumer</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+      </dependencies>
       <children>
         <entityParameter>
           <name>AttributeKeyId_param</name>
@@ -1388,14 +1397,6 @@
           <expose v="false" />
         </entityParameter>
       </children>
-      <dependencies>
-        <entityDependency>
-          <name>2e410b9e-5ebc-48ea-9562-da386202d7e8</name>
-          <entityName>Duplicates_entity</entityName>
-          <fieldName>DuplicateOrganisationsConsumer</fieldName>
-          <isConsumer v="false" />
-        </entityDependency>
-      </dependencies>
     </entityProvider>
     <entityActionGroup>
       <name>orgReportDispatch</name>
@@ -1412,6 +1413,11 @@
     </entityActionGroup>
     <entityConsumer>
       <name>AttributesFilter</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>AttributeRelation_entity</entityName>
+        <fieldName>FilterProvider</fieldName>
+      </dependency>
       <children>
         <entityParameter>
           <name>ObjectRowId_param</name>
@@ -1422,11 +1428,6 @@
           <valueProcess>%aditoprj%/entity/Organisation_entity/entityfields/attributesfilter/children/objecttype_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-      <dependency>
-        <name>dependency</name>
-        <entityName>AttributeRelation_entity</entityName>
-        <fieldName>FilterProvider</fieldName>
-      </dependency>
     </entityConsumer>
   </entityFields>
   <recordContainers>
diff --git a/entity/Person_entity/Person_entity.aod b/entity/Person_entity/Person_entity.aod
index 24d78e6da4f..42f436e7093 100644
--- a/entity/Person_entity/Person_entity.aod
+++ b/entity/Person_entity/Person_entity.aod
@@ -89,6 +89,11 @@
     </entityFieldGroup>
     <entityConsumer>
       <name>Activities</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Activity_entity</entityName>
+        <fieldName>LinkedObjects</fieldName>
+      </dependency>
       <children>
         <entityParameter>
           <name>RowId_param</name>
@@ -103,11 +108,6 @@
           <valueProcess>%aditoprj%/entity/Person_entity/entityfields/activities/children/presetlinks_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Activity_entity</entityName>
-        <fieldName>LinkedObjects</fieldName>
-      </dependency>
     </entityConsumer>
     <entityField>
       <name>CONTACTID</name>
@@ -118,6 +118,14 @@
       <name>OrganisationRelated</name>
       <documentation>%aditoprj%/entity/Person_entity/entityfields/organisationrelated/documentation.adoc</documentation>
       <recordContainer>db</recordContainer>
+      <dependencies>
+        <entityDependency>
+          <name>41952879-c2f0-411f-8ca1-36c38914a629</name>
+          <entityName>Organisation_entity</entityName>
+          <fieldName>Contact</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+      </dependencies>
       <children>
         <entityParameter>
           <name>ContactId_param</name>
@@ -136,14 +144,6 @@
           <expose v="false" />
         </entityParameter>
       </children>
-      <dependencies>
-        <entityDependency>
-          <name>41952879-c2f0-411f-8ca1-36c38914a629</name>
-          <entityName>Organisation_entity</entityName>
-          <fieldName>Contact</fieldName>
-          <isConsumer v="false" />
-        </entityDependency>
-      </dependencies>
     </entityProvider>
     <entityField>
       <name>PERSON_ID</name>
@@ -161,6 +161,11 @@
     </entityField>
     <entityConsumer>
       <name>PersAddresses</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Address_entity</entityName>
+        <fieldName>ContactAddresses</fieldName>
+      </dependency>
       <children>
         <entityParameter>
           <name>DefaultAddressId_param</name>
@@ -180,14 +185,14 @@
           <valueProcess>%aditoprj%/entity/Person_entity/entityfields/persaddresses/children/replacestandardaddress_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Address_entity</entityName>
-        <fieldName>ContactAddresses</fieldName>
-      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>Communications</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Communication_entity</entityName>
+        <fieldName>AllCommunications</fieldName>
+      </dependency>
       <children>
         <entityParameter>
           <name>ContactId_param</name>
@@ -205,29 +210,29 @@
           <valueProcess>%aditoprj%/entity/Person_entity/entityfields/communications/children/contactsmaincountry_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Communication_entity</entityName>
-        <fieldName>AllCommunications</fieldName>
-      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>Organisations</name>
       <selectionMode>SINGLE</selectionMode>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Organisation_entity</entityName>
+        <fieldName>WithPersonIdFilter</fieldName>
+      </dependency>
       <children>
         <entityParameter>
           <name>ExcludeOrganisationsByPersonId</name>
           <valueProcess>%aditoprj%/entity/Person_entity/entityfields/organisations/children/excludeorganisationsbypersonid/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Organisation_entity</entityName>
-        <fieldName>WithPersonIdFilter</fieldName>
-      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>Contracts</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Contract_entity</entityName>
+        <fieldName>Contracts</fieldName>
+      </dependency>
       <children>
         <entityParameter>
           <name>ContactId_param</name>
@@ -236,16 +241,16 @@
           <mandatory v="true" />
         </entityParameter>
       </children>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Contract_entity</entityName>
-        <fieldName>Contracts</fieldName>
-      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>Pricelists</name>
       <state>AUTO</state>
       <stateProcess>%aditoprj%/entity/Person_entity/entityfields/pricelists/stateProcess.js</stateProcess>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Productprice_entity</entityName>
+        <fieldName>Productprices</fieldName>
+      </dependency>
       <children>
         <entityParameter>
           <name>ContactId_param</name>
@@ -254,11 +259,6 @@
           <mandatory v="true" />
         </entityParameter>
       </children>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Productprice_entity</entityName>
-        <fieldName>Productprices</fieldName>
-      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>Genders</name>
@@ -313,6 +313,11 @@
     <entityConsumer>
       <name>Documents</name>
       <selectionMode>MULTI</selectionMode>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Document_entity</entityName>
+        <fieldName>Documents</fieldName>
+      </dependency>
       <children>
         <entityParameter>
           <name>AssignmentRowId_param</name>
@@ -327,11 +332,6 @@
           <valueProcess>%aditoprj%/entity/Person_entity/entityfields/documents/children/disallowcreate_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Document_entity</entityName>
-        <fieldName>Documents</fieldName>
-      </dependency>
     </entityConsumer>
     <entityParameter>
       <name>ContactId_param</name>
@@ -356,6 +356,14 @@
       <name>Contact</name>
       <documentation>%aditoprj%/entity/Person_entity/entityfields/contact/documentation.adoc</documentation>
       <recordContainer>db</recordContainer>
+      <dependencies>
+        <entityDependency>
+          <name>f925c8e6-b096-4093-bd39-c9cd30a6a71a</name>
+          <entityName>Lead_entity</entityName>
+          <fieldName>ContactId</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+      </dependencies>
       <children>
         <entityParameter>
           <name>OrgId_param</name>
@@ -383,19 +391,16 @@
           <expose v="false" />
         </entityParameter>
       </children>
-      <dependencies>
-        <entityDependency>
-          <name>f925c8e6-b096-4093-bd39-c9cd30a6a71a</name>
-          <entityName>Lead_entity</entityName>
-          <fieldName>ContactId</fieldName>
-          <isConsumer v="false" />
-        </entityDependency>
-      </dependencies>
     </entityProvider>
     <entityConsumer>
       <name>OrgAddresses</name>
       <state>READONLY</state>
       <stateProcess>%aditoprj%/entity/Person_entity/entityfields/orgaddresses/stateProcess.js</stateProcess>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Address_entity</entityName>
+        <fieldName>OrganisationAddressesByContact</fieldName>
+      </dependency>
       <children>
         <entityParameter>
           <name>ContactId_param</name>
@@ -407,11 +412,6 @@
           <valueProcess>%aditoprj%/entity/Person_entity/entityfields/orgaddresses/children/defaultaddressid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Address_entity</entityName>
-        <fieldName>OrganisationAddressesByContact</fieldName>
-      </dependency>
     </entityConsumer>
     <entityField>
       <name>STANDARD_EMAIL_COMMUNICATION</name>
@@ -428,6 +428,11 @@
     <entityConsumer>
       <name>PhoneCommunications</name>
       <description>Used for standard communication</description>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Communication_entity</entityName>
+        <fieldName>PhoneCommunications</fieldName>
+      </dependency>
       <children>
         <entityParameter>
           <name>ContactId_param</name>
@@ -437,15 +442,15 @@
                         Usually this is used for filtering COMMUNICATION-entries by a specified contact or creating a new entry that is related to a contact.</description>
         </entityParameter>
       </children>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Communication_entity</entityName>
-        <fieldName>PhoneCommunications</fieldName>
-      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>EmailCommunications</name>
       <description>Used for standard communication</description>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Communication_entity</entityName>
+        <fieldName>EmailCommunications</fieldName>
+      </dependency>
       <children>
         <entityParameter>
           <name>ContactId_param</name>
@@ -455,11 +460,6 @@
                         Usually this is used for filtering COMMUNICATION-entries by a specified contact or creating a new entry that is related to a contact.</description>
         </entityParameter>
       </children>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Communication_entity</entityName>
-        <fieldName>EmailCommunications</fieldName>
-      </dependency>
     </entityConsumer>
     <entityField>
       <name>ADDRESS_ID</name>
@@ -471,6 +471,11 @@
     </entityField>
     <entityConsumer>
       <name>KeywordGenders</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>SpecificContainerKeywords</fieldName>
+      </dependency>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
@@ -478,11 +483,6 @@
           <expose v="false" />
         </entityParameter>
       </children>
-      <dependency>
-        <name>dependency</name>
-        <entityName>KeywordEntry_entity</entityName>
-        <fieldName>SpecificContainerKeywords</fieldName>
-      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>Languages</name>
@@ -494,35 +494,40 @@
     </entityConsumer>
     <entityConsumer>
       <name>Offers</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Offer_entity</entityName>
+        <fieldName>ContactOffers</fieldName>
+      </dependency>
       <children>
         <entityParameter>
           <name>ContactId_param</name>
           <valueProcess>%aditoprj%/entity/Person_entity/entityfields/offers/children/contactid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Offer_entity</entityName>
-        <fieldName>ContactOffers</fieldName>
-      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>Salutations</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>SalutationDistinct_entity</entityName>
+        <fieldName>Salutations</fieldName>
+      </dependency>
       <children>
         <entityParameter>
           <name>Language_param</name>
           <valueProcess>%aditoprj%/entity/Person_entity/entityfields/salutations/children/language_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-      <dependency>
-        <name>dependency</name>
-        <entityName>SalutationDistinct_entity</entityName>
-        <fieldName>Salutations</fieldName>
-      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>Attributes</name>
       <onValidation>%aditoprj%/entity/Person_entity/entityfields/attributes/onValidation.js</onValidation>
+      <dependency>
+        <name>dependency</name>
+        <entityName>AttributeRelation_entity</entityName>
+        <fieldName>AttributeRelations</fieldName>
+      </dependency>
       <children>
         <entityParameter>
           <name>ObjectRowId_param</name>
@@ -537,14 +542,14 @@
           <valueProcess>%aditoprj%/entity/Person_entity/entityfields/attributes/children/showdsgvomessage_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-      <dependency>
-        <name>dependency</name>
-        <entityName>AttributeRelation_entity</entityName>
-        <fieldName>AttributeRelations</fieldName>
-      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>SalutationTitles</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>SalutationTitleDistinct_entity</entityName>
+        <fieldName>SalutationTitles</fieldName>
+      </dependency>
       <children>
         <entityParameter>
           <name>Salutation_param</name>
@@ -555,15 +560,15 @@
           <valueProcess>%aditoprj%/entity/Person_entity/entityfields/salutationtitles/children/language_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-      <dependency>
-        <name>dependency</name>
-        <entityName>SalutationTitleDistinct_entity</entityName>
-        <fieldName>SalutationTitles</fieldName>
-      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>Tasks</name>
       <state>EDITABLE</state>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Task_entity</entityName>
+        <fieldName>Tasks</fieldName>
+      </dependency>
       <children>
         <entityParameter>
           <name>RowId_param</name>
@@ -578,14 +583,14 @@
           <valueProcess>%aditoprj%/entity/Person_entity/entityfields/tasks/children/presetlinks_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Task_entity</entityName>
-        <fieldName>Tasks</fieldName>
-      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>ObjectTrees</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>ObjectTree_entity</entityName>
+        <fieldName>TreeProvider</fieldName>
+      </dependency>
       <children>
         <entityParameter>
           <name>ObjectIds_param</name>
@@ -596,11 +601,6 @@
           <valueProcess>%aditoprj%/entity/Person_entity/entityfields/objecttrees/children/objecttypes_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-      <dependency>
-        <name>dependency</name>
-        <entityName>ObjectTree_entity</entityName>
-        <fieldName>TreeProvider</fieldName>
-      </dependency>
     </entityConsumer>
     <entityField>
       <name>STATUS</name>
@@ -612,20 +612,25 @@
     </entityField>
     <entityConsumer>
       <name>KeywordContactStates</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>SpecificContainerKeywords</fieldName>
+      </dependency>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
           <valueProcess>%aditoprj%/entity/Person_entity/entityfields/keywordcontactstates/children/containername_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-      <dependency>
-        <name>dependency</name>
-        <entityName>KeywordEntry_entity</entityName>
-        <fieldName>SpecificContainerKeywords</fieldName>
-      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>ContactAndOrganisationAddresses</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Address_entity</entityName>
+        <fieldName>OrganisationAndContactAddresses</fieldName>
+      </dependency>
       <children>
         <entityParameter>
           <name>ContactId_param</name>
@@ -636,11 +641,6 @@
           <valueProcess>%aditoprj%/entity/Person_entity/entityfields/contactandorganisationaddresses/children/organisationid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Address_entity</entityName>
-        <fieldName>OrganisationAndContactAddresses</fieldName>
-      </dependency>
     </entityConsumer>
     <entityField>
       <name>DEPARTMENT</name>
@@ -663,6 +663,11 @@
     </entityField>
     <entityConsumer>
       <name>LogHistories</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>LogHistory_entity</entityName>
+        <fieldName>LogHistoryProvider</fieldName>
+      </dependency>
       <children>
         <entityParameter>
           <name>tablenames_param</name>
@@ -671,14 +676,14 @@
           <mandatory v="true" />
         </entityParameter>
       </children>
-      <dependency>
-        <name>dependency</name>
-        <entityName>LogHistory_entity</entityName>
-        <fieldName>LogHistoryProvider</fieldName>
-      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>OtherContacts</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Contact_entity</entityName>
+        <fieldName>PersonsContactsExceptOwn</fieldName>
+      </dependency>
       <children>
         <entityParameter>
           <name>OwnContactId_param</name>
@@ -689,11 +694,6 @@
           <valueProcess>%aditoprj%/entity/Person_entity/entityfields/othercontacts/children/languagekey_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Contact_entity</entityName>
-        <fieldName>PersonsContactsExceptOwn</fieldName>
-      </dependency>
     </entityConsumer>
     <entityField>
       <name>ORGANISATION_NAME</name>
@@ -706,6 +706,20 @@
     <entityProvider>
       <name>Contacts</name>
       <documentation>%aditoprj%/entity/Person_entity/entityfields/contacts/documentation.adoc</documentation>
+      <dependencies>
+        <entityDependency>
+          <name>c98da62f-d6b2-4ddb-9101-92e9a60abdfb</name>
+          <entityName>VisitPlanEmployeeWeek_entity</entityName>
+          <fieldName>Persons</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+        <entityDependency>
+          <name>f56b1378-138d-4f88-b9df-274adce9f90c</name>
+          <entityName>VisitPlanEntry_entity</entityName>
+          <fieldName>Persons</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+      </dependencies>
       <children>
         <entityParameter>
           <name>ContactId_param</name>
@@ -732,23 +746,14 @@
           <expose v="false" />
         </entityParameter>
       </children>
-      <dependencies>
-        <entityDependency>
-          <name>c98da62f-d6b2-4ddb-9101-92e9a60abdfb</name>
-          <entityName>VisitPlanEmployeeWeek_entity</entityName>
-          <fieldName>Persons</fieldName>
-          <isConsumer v="false" />
-        </entityDependency>
-        <entityDependency>
-          <name>f56b1378-138d-4f88-b9df-274adce9f90c</name>
-          <entityName>VisitPlanEntry_entity</entityName>
-          <fieldName>Persons</fieldName>
-          <isConsumer v="false" />
-        </entityDependency>
-      </dependencies>
     </entityProvider>
     <entityConsumer>
       <name>360DegreeObjects</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>360Degree_entity</entityName>
+        <fieldName>PersonObjects</fieldName>
+      </dependency>
       <children>
         <entityParameter>
           <name>ObjectRowId_param</name>
@@ -759,14 +764,14 @@
           <valueProcess>%aditoprj%/entity/Person_entity/entityfields/360degreeobjects/children/objectstatus_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-      <dependency>
-        <name>dependency</name>
-        <entityName>360Degree_entity</entityName>
-        <fieldName>PersonObjects</fieldName>
-      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>AttributeTree</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>AttributeRelation_entity</entityName>
+        <fieldName>TreeProvider</fieldName>
+      </dependency>
       <children>
         <entityParameter>
           <name>ObjectRowId_param</name>
@@ -781,11 +786,6 @@
           <valueProcess>%aditoprj%/entity/Person_entity/entityfields/attributetree/children/showdsgvomessage_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-      <dependency>
-        <name>dependency</name>
-        <entityName>AttributeRelation_entity</entityName>
-        <fieldName>TreeProvider</fieldName>
-      </dependency>
     </entityConsumer>
     <entityField>
       <name>DATE_NEW</name>
@@ -845,35 +845,40 @@
     </entityParameter>
     <entityConsumer>
       <name>CommRestrictions</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>CommRestriction_Entity</entityName>
+        <fieldName>CommRestrictions</fieldName>
+      </dependency>
       <children>
         <entityParameter>
           <name>ContactId_param</name>
           <valueProcess>%aditoprj%/entity/Person_entity/entityfields/commrestrictions/children/contactid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-      <dependency>
-        <name>dependency</name>
-        <entityName>CommRestriction_Entity</entityName>
-        <fieldName>CommRestrictions</fieldName>
-      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>DSGVOEntries</name>
       <stateProcess>%aditoprj%/entity/Person_entity/entityfields/dsgvoentries/stateProcess.js</stateProcess>
+      <dependency>
+        <name>dependency</name>
+        <entityName>DSGVO_entity</entityName>
+        <fieldName>#PROVIDER</fieldName>
+      </dependency>
       <children>
         <entityParameter>
           <name>ContactId_param</name>
           <valueProcess>%aditoprj%/entity/Person_entity/entityfields/dsgvoentries/children/contactid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-      <dependency>
-        <name>dependency</name>
-        <entityName>DSGVO_entity</entityName>
-        <fieldName>#PROVIDER</fieldName>
-      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>Appointments</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Appointment_entity</entityName>
+        <fieldName>LinkedAppointments</fieldName>
+      </dependency>
       <children>
         <entityParameter>
           <name>LinkedObjectId_param</name>
@@ -884,11 +889,6 @@
           <valueProcess>%aditoprj%/entity/Person_entity/entityfields/appointments/children/erroronpermissiondenied/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Appointment_entity</entityName>
-        <fieldName>LinkedAppointments</fieldName>
-      </dependency>
     </entityConsumer>
     <entityField>
       <name>OpenTasks</name>
@@ -925,6 +925,11 @@
     </entityField>
     <entityConsumer>
       <name>SelfDuplicatesUncached</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Person_entity</entityName>
+        <fieldName>SelfDuplicates</fieldName>
+      </dependency>
       <children>
         <entityParameter>
           <name>DuplicateActionsControl_param</name>
@@ -943,11 +948,6 @@
           <valueProcess>%aditoprj%/entity/Person_entity/entityfields/selfduplicatesuncached/children/excludedcontactids_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Person_entity</entityName>
-        <fieldName>SelfDuplicates</fieldName>
-      </dependency>
     </entityConsumer>
     <entityField>
       <name>LEAD_LEADID</name>
@@ -978,6 +978,14 @@
       <name>QuickEntryContacts</name>
       <documentation>%aditoprj%/entity/Person_entity/entityfields/quickentrycontacts/documentation.adoc</documentation>
       <titlePlural>Additional Contacts</titlePlural>
+      <dependencies>
+        <entityDependency>
+          <name>6d137850-63ba-4be0-9ca5-1464e71d4f77</name>
+          <entityName>QuickEntry_entity</entityName>
+          <fieldName>Contacts</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+      </dependencies>
       <children>
         <entityParameter>
           <name>ContactId_param</name>
@@ -1000,14 +1008,6 @@
           <expose v="false" />
         </entityParameter>
       </children>
-      <dependencies>
-        <entityDependency>
-          <name>6d137850-63ba-4be0-9ca5-1464e71d4f77</name>
-          <entityName>QuickEntry_entity</entityName>
-          <fieldName>Contacts</fieldName>
-          <isConsumer v="false" />
-        </entityDependency>
-      </dependencies>
     </entityProvider>
     <entityActionField>
       <name>openEditDefaultsView</name>
@@ -1103,9 +1103,10 @@
         </entityActionField>
         <entityActionField>
           <name>startMarketingWorkflows</name>
-          <title>Start 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>
@@ -1253,6 +1254,14 @@
     <entityProvider>
       <name>IdFilteredActiveContacts</name>
       <documentation>%aditoprj%/entity/Person_entity/entityfields/idfilteredactivecontacts/documentation.adoc</documentation>
+      <dependencies>
+        <entityDependency>
+          <name>511f3e4c-7493-4a31-a136-0ba80ba2ec85</name>
+          <entityName>Member_entity</entityName>
+          <fieldName>Contacts</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+      </dependencies>
       <children>
         <entityParameter>
           <name>ExcludedContactIds_param</name>
@@ -1287,14 +1296,6 @@
           <expose v="false" />
         </entityParameter>
       </children>
-      <dependencies>
-        <entityDependency>
-          <name>511f3e4c-7493-4a31-a136-0ba80ba2ec85</name>
-          <entityName>Member_entity</entityName>
-          <fieldName>Contacts</fieldName>
-          <isConsumer v="false" />
-        </entityDependency>
-      </dependencies>
     </entityProvider>
     <entityField>
       <name>COUNT</name>
@@ -1329,21 +1330,29 @@
       <name>Districts</name>
       <state>INVISIBLE</state>
       <stateProcess>%aditoprj%/entity/Person_entity/entityfields/districts/stateProcess.js</stateProcess>
+      <dependency>
+        <name>dependency</name>
+        <entityName>District_entity</entityName>
+        <fieldName>ResponsibleDistricts</fieldName>
+      </dependency>
       <children>
         <entityParameter>
           <name>DistrictsByContactId_param</name>
           <valueProcess>%aditoprj%/entity/Person_entity/entityfields/districts/children/districtsbycontactid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-      <dependency>
-        <name>dependency</name>
-        <entityName>District_entity</entityName>
-        <fieldName>ResponsibleDistricts</fieldName>
-      </dependency>
     </entityConsumer>
     <entityProvider>
       <name>NonselfDuplicates</name>
       <documentation>%aditoprj%/entity/Person_entity/entityfields/nonselfduplicates/documentation.adoc</documentation>
+      <dependencies>
+        <entityDependency>
+          <name>3a4352e2-9686-4c52-9d01-dbfad8c68ea7</name>
+          <entityName>Duplicates_entity</entityName>
+          <fieldName>DuplicatePersonsConsumer</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+      </dependencies>
       <children>
         <entityParameter>
           <name>ContactId_param</name>
@@ -1366,30 +1375,22 @@
           <expose v="false" />
         </entityParameter>
       </children>
-      <dependencies>
-        <entityDependency>
-          <name>3a4352e2-9686-4c52-9d01-dbfad8c68ea7</name>
-          <entityName>Duplicates_entity</entityName>
-          <fieldName>DuplicatePersonsConsumer</fieldName>
-          <isConsumer v="false" />
-        </entityDependency>
-      </dependencies>
     </entityProvider>
     <entityConsumer>
       <name>DistrictResponsibles</name>
       <state>INVISIBLE</state>
       <stateProcess>%aditoprj%/entity/Person_entity/entityfields/districtresponsibles/stateProcess.js</stateProcess>
+      <dependency>
+        <name>dependency</name>
+        <entityName>DistrictResponsible_entity</entityName>
+        <fieldName>OrganisationResponsibles</fieldName>
+      </dependency>
       <children>
         <entityParameter>
           <name>OrgUid_param</name>
           <valueProcess>%aditoprj%/entity/Person_entity/entityfields/districtresponsibles/children/orguid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-      <dependency>
-        <name>dependency</name>
-        <entityName>DistrictResponsible_entity</entityName>
-        <fieldName>OrganisationResponsibles</fieldName>
-      </dependency>
     </entityConsumer>
   </entityFields>
   <recordContainers>
diff --git a/entity/WorkflowLauncher_entity/WorkflowLauncher_entity.aod b/entity/WorkflowLauncher_entity/WorkflowLauncher_entity.aod
index 4ac6aa0edf3..e5749fe5101 100644
--- a/entity/WorkflowLauncher_entity/WorkflowLauncher_entity.aod
+++ b/entity/WorkflowLauncher_entity/WorkflowLauncher_entity.aod
@@ -31,7 +31,6 @@
       <name>KEY</name>
       <title>Key</title>
       <consumer>WorkflowDefinitions</consumer>
-      <mandatory v="true" />
       <state>EDITABLE</state>
     </entityField>
     <entityActionField>
diff --git a/language/_____LANGUAGE_de/_____LANGUAGE_de.aod b/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
index c75f227a0ed..d68c0ad4d76 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>
diff --git a/neonView/WorkflowLauncherEdit_view/WorkflowLauncherEdit_view.aod b/neonView/WorkflowLauncherEdit_view/WorkflowLauncherEdit_view.aod
index 8f7e944084f..8445a151ff6 100644
--- a/neonView/WorkflowLauncherEdit_view/WorkflowLauncherEdit_view.aod
+++ b/neonView/WorkflowLauncherEdit_view/WorkflowLauncherEdit_view.aod
@@ -23,10 +23,6 @@
           <name>14de7f56-44cf-4c9e-89a7-59f84e482fd9</name>
           <entityField>NAME</entityField>
         </entityFieldLink>
-        <entityFieldLink>
-          <name>fd4252cf-e137-4068-a91b-732708f5ee1c</name>
-          <entityField>workflowTargets</entityField>
-        </entityFieldLink>
       </fields>
     </genericViewTemplate>
     <dynamicFormViewTemplate>
-- 
GitLab


From dea6ce655ddaa685e82176e201ef8751765598dd Mon Sep 17 00:00:00 2001
From: Sebastian Listl <s.listl@adito.de>
Date: Mon, 9 Nov 2020 14:26:21 +0100
Subject: [PATCH 064/184] Copy Offer action refactor

---
 .../entityfields/copyoffer/onActionProcess.js | 24 ++++-----
 .../recordcontainers/db/onDBInsert.js         | 17 ++++---
 process/Neon_lib/process.js                   | 33 +++---------
 process/Offer_lib/process.js                  | 51 +++++++++----------
 4 files changed, 55 insertions(+), 70 deletions(-)

diff --git a/entity/Offer_entity/entityfields/copyoffer/onActionProcess.js b/entity/Offer_entity/entityfields/copyoffer/onActionProcess.js
index 17cc41af886..d610943f340 100644
--- a/entity/Offer_entity/entityfields/copyoffer/onActionProcess.js
+++ b/entity/Offer_entity/entityfields/copyoffer/onActionProcess.js
@@ -1,19 +1,19 @@
 import("system.vars");
-import("system.neon");
 import("Offer_lib");
 
-var contactId = vars.getString("$field.CONTACT_ID");
-var currency = vars.getString("$field.CURRENCY");
-var language = vars.getString("$field.ISOLANGUAGE");
-var header = vars.getString("$field.HEADER");
-var footer = vars.getString("$field.FOOTER");
 var offerId = vars.getString("$field.OFFERID");
-var deliveryTerm = vars.getString("$field.DELIVERYTERMS");
-var paymentTerm = vars.getString("$field.PAYMENTTERMS");
-var rowId = vars.getString("$field.OBJECT_ROWID");
-var objectType = vars.getString("$field.OBJECT_TYPE");
 
+var fieldValues = {
+    contactId: vars.getString("$field.CONTACT_ID"),
+    language: vars.getString("$field.ISOLANGUAGE"),
+    currency: vars.getString("$field.CURRENCY"),
+    header: vars.getString("$field.HEADER"),
+    footer: vars.getString("$field.FOOTER"),
+    deliveryTerm: vars.getString("$field.DELIVERYTERMS"),
+    paymentTerm: vars.getString("$field.PAYMENTTERMS"),
+    objectRowId: vars.getString("$field.OBJECT_ROWID"),
+    objectType: vars.getString("$field.OBJECT_TYPE")
+};
 
-
-OfferUtils.copyOffer(offerId, contactId, language, currency, header, footer, deliveryTerm, paymentTerm, objectType, rowId);
+OfferUtils.copyOffer(offerId, fieldValues);
     
\ No newline at end of file
diff --git a/entity/Offer_entity/recordcontainers/db/onDBInsert.js b/entity/Offer_entity/recordcontainers/db/onDBInsert.js
index 086ca1c5598..da551808a8c 100644
--- a/entity/Offer_entity/recordcontainers/db/onDBInsert.js
+++ b/entity/Offer_entity/recordcontainers/db/onDBInsert.js
@@ -1,23 +1,28 @@
+import("Context_lib");
 import("system.workflow");
 import("Workflow_lib");
-import("system.db");
 import("system.datetime");
-import("system.util");
 import("system.neon");
 import("system.vars");
 import("Offer_lib");
+import("Sql_lib");
 
 if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW)
 {
+    var offerId = vars.get("$local.uid");
     if (vars.exists("$param.OfferOriginal_Id_param"))
-        OfferUtils.copyOfferItems(vars.getString("$param.OfferOriginal_Id_param"), vars.get("$local.uid"));
+        OfferUtils.copyOfferItems(vars.getString("$param.OfferOriginal_Id_param"), offerId);
     
     var activityId = vars.get("$param.ActivityId_param");
     if (activityId)
     {
-        var activityLinkColumns = ["ACTIVITYLINKID", "ACTIVITY_ID", "DATE_NEW", "USER_NEW", "OBJECT_TYPE", "OBJECT_ROWID"];
-        var activityLinkValues = [util.getNewUUID(), activityId,  datetime.date(), vars.get("$sys.user"), "Offer", vars.get("$field.OFFERID")];
-        db.insertData("ACTIVITYLINK", activityLinkColumns, null, activityLinkValues);
+        new SqlBuilder().insertFields({
+            "ACTIVITY_ID": activityId,
+            "DATE_NEW": datetime.date(),
+            "USER_NEW": vars.get("$sys.user"),
+            "OBJECT_TYPE": ContextUtils.getCurrentContextId(),
+            "OBJECT_ROWID": offerId
+        }, "ACTIVITYLINK", "ACTIVITYLINKID");
     }
 }
 
diff --git a/process/Neon_lib/process.js b/process/Neon_lib/process.js
index b758e7db586..4d7d910d5d9 100644
--- a/process/Neon_lib/process.js
+++ b/process/Neon_lib/process.js
@@ -177,12 +177,11 @@ CopyModuleUtils.copyModule = function(pInputMapping)
 
             var ModuleColumnsStructure = AliasDefinitionStructure.tables[pModule].columns;
             var cols = Object.keys(ModuleColumnsStructure);
-
-            var condition = "1=1";
+            var dataQuery = newSelect(cols).from(pModule);
             if(pCondition != undefined)
-                condition = pCondition;
+                dataQuery.where(pCondition)
 
-            var dbData = newSelect(cols).from(pModule).where(condition).table();
+            var dbData = dataQuery.table();
 
             //map 2d-Array to Object { $rowNumber$: { $columnName$: { value: "valueInDB" } } }
             var DataObj = {};
@@ -304,23 +303,15 @@ CopyModuleUtils.copyModule = function(pInputMapping)
                 }
                 break;
                 case "OFFERLINK":
-                {
-
-                    }
                 default:
                 {
 
-                    }
-
-
+                }
             }
 
             return ModuleRowMapping;
         }
 
-
-
-
         function _columnMapping(pNewValue, pOldValue, pDestinationColumn)
         {
             return {
@@ -329,7 +320,6 @@ CopyModuleUtils.copyModule = function(pInputMapping)
                 destinationColumn: pDestinationColumn
             };
         }
-
     }
 
     /**
@@ -356,33 +346,26 @@ CopyModuleUtils.copyModule = function(pInputMapping)
 
             for(var subModule in pMapping.SubModules)
             {
-
                 for(var row in pMapping.SubModules[subModule].DataRows)
                 {
                     statements.push(_statement(pMapping.SubModules[subModule].DataRows[row]));
                 }
-
                 _subordinatedStatements(pMapping.SubModules[subModule]);
             }
-
         }
 
         function _statement(pRowMapping)
         {
-            var cols = [];
-            var vals = [];
+            var fieldValues = new Map();
             var destTable = pRowMapping.ModuleMapping.destinationModuleName;
             var colMapping = pRowMapping.ColumnMapping;
 
-            for(var col in colMapping)
+            for (let col in colMapping)
             {
-                cols.push(colMapping[col].destinationColumn);
-                vals.push(colMapping[col].newValue.toString());
+                fieldValues.set(colMapping[col].destinationColumn, colMapping[col].newValue)
             }
 
-            var colTypes = db.getColumnTypes(destTable, cols)//load once for better performance
-
-            return [destTable, cols, colTypes, vals];
+            return new SqlBuilder().buildInsertStatement(fieldValues, destTable);
         }
     }
 }
diff --git a/process/Offer_lib/process.js b/process/Offer_lib/process.js
index f5a8cd0138d..78ea329bfc0 100644
--- a/process/Offer_lib/process.js
+++ b/process/Offer_lib/process.js
@@ -319,29 +319,24 @@ OfferUtils.openOfferReport = function (pOfferID)
  * opens an offer in NEW mode with values from an offer
  * 
  * @param {String} pOfferId of the offer
- * @param {String} pContactId
- * @param {String} pLanguage
- * @param {String} [pCurrency=""]
- * @param {String} [pHeader=""]
- * @param {String} [pFooter=""]
- * @param {String} [pDeliveryTerm=""]
- * @param {String} [pPaymentTerm=""]
- * @param {String} [pObjectType=""]
- * @param {String} [pRowId=""]
+ * @param {Object} [pOfferData={}] additional offer properties: 
+ *                      contactId, language, currency, header, footer, deliveryTerm, paymentTerm, objectType, objectRowId
  */
-OfferUtils.copyOffer = function (pOfferId, pContactId, pLanguage, pCurrency, pHeader, pFooter, pDeliveryTerm, pPaymentTerm, pObjectType, pRowId)
+OfferUtils.copyOffer = function (pOfferId, pOfferData)
 {
+    if (!pOfferData)
+        pOfferData = {};
     var params = {
-        "ContactId_param" : pContactId,
-        "OfferLanguage_param" : pLanguage,
-        "OfferOriginal_Id_param" : pOfferId,
-        "OfferCurrency_param" : pCurrency || "",
-        "OfferHeader_param" : pHeader || "",
-        "OfferFooter_param" : pFooter || "",
-        "OfferDeliveryTerm_param" : pDeliveryTerm || "",
-        "OfferPaymentTerm_param" : pPaymentTerm || "",
-        "ObjectType_param" : pObjectType || "",
-        "ObjectRowId_param" : pRowId || ""
+        "OfferOriginal_Id_param": pOfferId,
+        "ContactId_param": pOfferData.contactId,
+        "OfferLanguage_param": pOfferData.language,
+        "OfferCurrency_param": pOfferData.currency || "",
+        "OfferHeader_param": pOfferData.header || "",
+        "OfferFooter_param": pOfferData.footer || "",
+        "OfferDeliveryTerm_param": pOfferData.deliveryTerm || "",
+        "OfferPaymentTerm_param": pOfferData.paymentTerm || "",
+        "ObjectType_param": pOfferData.objectType || "",
+        "ObjectRowId_param": pOfferData.objectRowId || ""
     };
     neon.openContext("Offer", null, null, neon.OPERATINGSTATE_NEW, params);
 }
@@ -354,24 +349,26 @@ OfferUtils.copyOffer = function (pOfferId, pContactId, pLanguage, pCurrency, pHe
  */
 OfferUtils.copyOfferItems = function (pSourceOfferId, pTargetOfferId)
 {
-    var InputMapping = {
+    var inputMapping = {
         "OFFERITEM": {
-            condition: newWhereIfSet("OFFERITEM.OFFER_ID", pSourceOfferId).orderBy("ITEMSORT").toString(SqlBuilder.NORESULT_CONDITION(), true),
+            condition: newWhere("OFFERITEM.OFFER_ID", pSourceOfferId),
             ValueMapping: {
-                "OFFER_ID" : pTargetOfferId
+                "OFFER_ID": pTargetOfferId
             }
         }
     };
-    CopyModuleUtils.copyModule(InputMapping);
+    CopyModuleUtils.copyModule(inputMapping);
     
     var oiUtils = new OfferItemUtils(pTargetOfferId);
     
     //update order price
-    cols = ["NET", "VAT"];
-    var vals = oiUtils.getNetAndVat();
+    var [netPrice, vat] = oiUtils.getNetAndVat();
     
     newWhere("OFFER.OFFERID", pTargetOfferId)
-        .updateData(true, "OFFER", cols, null, vals);
+        .updateFields({
+            "NET": netPrice,
+            "VAT": vat
+        });
 }
 
 /**
-- 
GitLab


From b9ba11d3b1cdfe6442bb9489f60d338a978aa428 Mon Sep 17 00:00:00 2001
From: Sebastian Listl <s.listl@adito.de>
Date: Mon, 9 Nov 2020 16:05:54 +0100
Subject: [PATCH 065/184] #1062892 CampaignParticipant filter

---
 .../AnyContact_entity/AnyContact_entity.aod   | 43 ++++++-----
 .../CampaignParticipant_entity.aod            | 75 +++++++++++--------
 .../advertisingban_icon/colorProcess.js       | 15 +---
 .../displayValueProcess.js                    | 11 +--
 .../children/campaignid_param/valueProcess.js |  7 +-
 .../hasadvertisingban/dropDownProcess.js      |  7 ++
 .../advertisingban_icon.value/expression.js   | 11 ---
 .../anycontacts/filterConditionProcess.js     | 10 +++
 .../hasadvertisingban.value/expression.js     | 11 +++
 .../expression.js                             |  0
 .../expression.js                             |  0
 process/Contact_lib/process.js                | 20 +++++
 12 files changed, 129 insertions(+), 81 deletions(-)
 create mode 100644 entity/CampaignParticipant_entity/entityfields/hasadvertisingban/dropDownProcess.js
 delete mode 100644 entity/CampaignParticipant_entity/recordcontainers/participantsdbrecordcontainer/recordfieldmappings/advertisingban_icon.value/expression.js
 create mode 100644 entity/CampaignParticipant_entity/recordcontainers/participantsdbrecordcontainer/recordfieldmappings/anycontacts/filterConditionProcess.js
 create mode 100644 entity/CampaignParticipant_entity/recordcontainers/participantsdbrecordcontainer/recordfieldmappings/hasadvertisingban.value/expression.js
 rename entity/CampaignParticipant_entity/recordcontainers/participantsdbrecordcontainer/recordfieldmappings/{standard_email_communication.displayvalue => standard_email_communication.value}/expression.js (100%)
 rename entity/CampaignParticipant_entity/recordcontainers/participantsdbrecordcontainer/recordfieldmappings/{standard_phone_communication.displayvalue => standard_phone_communication.value}/expression.js (100%)

diff --git a/entity/AnyContact_entity/AnyContact_entity.aod b/entity/AnyContact_entity/AnyContact_entity.aod
index 0d0c5d1d960..3b3b3c3e989 100644
--- a/entity/AnyContact_entity/AnyContact_entity.aod
+++ b/entity/AnyContact_entity/AnyContact_entity.aod
@@ -3,6 +3,7 @@
   <name>AnyContact_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <documentation>%aditoprj%/entity/AnyContact_entity/documentation.adoc</documentation>
+  <title>Contact</title>
   <contentTitleProcess>%aditoprj%/entity/AnyContact_entity/contentTitleProcess.js</contentTitleProcess>
   <initFilterProcess>%aditoprj%/entity/AnyContact_entity/initFilterProcess.js</initFilterProcess>
   <imageProcess>%aditoprj%/entity/AnyContact_entity/imageProcess.js</imageProcess>
@@ -29,12 +30,6 @@
           <fieldName>AnyContacts</fieldName>
           <isConsumer v="false" />
         </entityDependency>
-        <entityDependency>
-          <name>336fdc6b-05f8-40bc-89ba-d4ab98bd6948</name>
-          <entityName>CampaignParticipant_entity</entityName>
-          <fieldName>AnyContacts</fieldName>
-          <isConsumer v="false" />
-        </entityDependency>
         <entityDependency>
           <name>b2895709-2ebf-46ec-a46d-6b2e9a4575a3</name>
           <entityName>BulkMailRecipient_entity</entityName>
@@ -77,11 +72,23 @@
           <fieldName>Contacts</fieldName>
           <isConsumer v="false" />
         </entityDependency>
+        <entityDependency>
+          <name>ea7c855e-dccd-4c05-9efb-a1303f37dab8</name>
+          <entityName>CampaignParticipant_entity</entityName>
+          <fieldName>AnyContacts</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
       </dependencies>
     </entityProvider>
     <entityProvider>
       <name>ContactsByIds</name>
       <documentation>%aditoprj%/entity/AnyContact_entity/entityfields/contactsbyids/documentation.adoc</documentation>
+      <children>
+        <entityParameter>
+          <name>ContactId_param</name>
+          <expose v="false" />
+        </entityParameter>
+      </children>
       <dependencies>
         <entityDependency>
           <name>0206f7a8-fd58-47e8-8b7a-5ff4531e56fb</name>
@@ -90,12 +97,6 @@
           <isConsumer v="false" />
         </entityDependency>
       </dependencies>
-      <children>
-        <entityParameter>
-          <name>ContactId_param</name>
-          <expose v="false" />
-        </entityParameter>
-      </children>
     </entityProvider>
     <entityParameter>
       <name>ContactIds_param</name>
@@ -108,6 +109,7 @@
     </entityField>
     <entityField>
       <name>LANGUAGE</name>
+      <title>Language</title>
     </entityField>
     <entityField>
       <name>ORGANISATION_ID</name>
@@ -157,9 +159,11 @@ See ContactUtils.getRelationTypeByPersOrg for possible values</description>
     </entityField>
     <entityField>
       <name>PERSON_TITLE</name>
+      <title>Title</title>
     </entityField>
     <entityField>
       <name>PERSON_SALUTATION</name>
+      <title>Salutation</title>
     </entityField>
     <entityField>
       <name>PERSON_FULL_NAME</name>
@@ -173,6 +177,13 @@ See ContactUtils.getRelationTypeByPersOrg for possible values</description>
     <entityProvider>
       <name>OnlySameCompany</name>
       <documentation>%aditoprj%/entity/AnyContact_entity/entityfields/onlysamecompany/documentation.adoc</documentation>
+      <children>
+        <entityParameter>
+          <name>ContactId_param</name>
+          <expose v="true" />
+          <mandatory v="true" />
+        </entityParameter>
+      </children>
       <dependencies>
         <entityDependency>
           <name>28b19d6b-237c-4268-b6c6-323df408c94a</name>
@@ -181,13 +192,6 @@ See ContactUtils.getRelationTypeByPersOrg for possible values</description>
           <isConsumer v="false" />
         </entityDependency>
       </dependencies>
-      <children>
-        <entityParameter>
-          <name>ContactId_param</name>
-          <expose v="true" />
-          <mandatory v="true" />
-        </entityParameter>
-      </children>
     </entityProvider>
     <entityParameter>
       <name>WithPrivatePersons_param</name>
@@ -248,6 +252,7 @@ See ContactUtils.getRelationTypeByPersOrg for possible values</description>
         <dbRecordFieldMapping>
           <name>LANGUAGE.value</name>
           <recordfield>CONTACT.ISOLANGUAGE</recordfield>
+          <isFilterable v="true" />
         </dbRecordFieldMapping>
         <dbRecordFieldMapping>
           <name>ORGANISATION_ID.value</name>
diff --git a/entity/CampaignParticipant_entity/CampaignParticipant_entity.aod b/entity/CampaignParticipant_entity/CampaignParticipant_entity.aod
index 4d3b86ba02c..42f0af8d639 100644
--- a/entity/CampaignParticipant_entity/CampaignParticipant_entity.aod
+++ b/entity/CampaignParticipant_entity/CampaignParticipant_entity.aod
@@ -21,20 +21,6 @@
       <targetContextField>CONTACTCONTEXT</targetContextField>
       <targetIdField>CONTACT_ID</targetIdField>
       <documentation>%aditoprj%/entity/CampaignParticipant_entity/entityfields/campaignparticipantsprovider/documentation.adoc</documentation>
-      <dependencies>
-        <entityDependency>
-          <name>f28945cd-4613-4dfa-91f7-a7d9d64cef58</name>
-          <entityName>Campaign_entity</entityName>
-          <fieldName>CampaignParticipants</fieldName>
-          <isConsumer v="false" />
-        </entityDependency>
-        <entityDependency>
-          <name>7ad08378-b36f-4512-8891-db727c6ddcd7</name>
-          <entityName>CampaignStep_entity</entityName>
-          <fieldName>CampaignParticipantsConsumer</fieldName>
-          <isConsumer v="false" />
-        </entityDependency>
-      </dependencies>
       <children>
         <entityParameter>
           <name>ContactId_param</name>
@@ -49,6 +35,20 @@
           <expose v="true" />
         </entityParameter>
       </children>
+      <dependencies>
+        <entityDependency>
+          <name>f28945cd-4613-4dfa-91f7-a7d9d64cef58</name>
+          <entityName>Campaign_entity</entityName>
+          <fieldName>CampaignParticipants</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+        <entityDependency>
+          <name>7ad08378-b36f-4512-8891-db727c6ddcd7</name>
+          <entityName>CampaignStep_entity</entityName>
+          <fieldName>CampaignParticipantsConsumer</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+      </dependencies>
     </entityProvider>
     <entityParameter>
       <name>CampaignStepId_param</name>
@@ -145,11 +145,6 @@
     <entityConsumer>
       <name>CampaignSteps</name>
       <refreshParent v="true" />
-      <dependency>
-        <name>dependency</name>
-        <entityName>CampaignStep_entity</entityName>
-        <fieldName>CampaignSteps</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>campaignId_param</name>
@@ -157,6 +152,11 @@
           <expose v="true" />
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>CampaignStep_entity</entityName>
+        <fieldName>CampaignSteps</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>CONTACTCONTEXT</name>
@@ -212,17 +212,17 @@
     </entityConsumer>
     <entityConsumer>
       <name>CommRestrictionIcon</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>KeywordAttribute_entity</entityName>
-        <fieldName>SpecificContainerKeyword</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
           <valueProcess>%aditoprj%/entity/CampaignParticipant_entity/entityfields/commrestrictionicon/children/containername_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordAttribute_entity</entityName>
+        <fieldName>SpecificContainerKeyword</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>STANDARD_EMAIL_COMMUNICATION</name>
@@ -238,6 +238,12 @@
       <name>#PROVIDER_AGGREGATES</name>
       <useAggregates v="true" />
     </entityProvider>
+    <entityField>
+      <name>HASADVERTISINGBAN</name>
+      <title>Advertising ban</title>
+      <contentType>BOOLEAN</contentType>
+      <dropDownProcess>%aditoprj%/entity/CampaignParticipant_entity/entityfields/hasadvertisingban/dropDownProcess.js</dropDownProcess>
+    </entityField>
   </entityFields>
   <recordContainers>
     <dbRecordContainer>
@@ -267,6 +273,7 @@
         <dbRecordFieldMapping>
           <name>CAMPAIGNSTEP_ID.value</name>
           <recordfield>CAMPAIGNPARTICIPANT.CAMPAIGNSTEP_ID</recordfield>
+          <isFilterable v="true" />
         </dbRecordFieldMapping>
         <dbRecordFieldMapping>
           <name>CONTACT_ID.value</name>
@@ -293,16 +300,24 @@
           <recordfield>CAMPAIGNPARTICIPANT.CAMPAIGNPARTICIPANTID</recordfield>
         </dbRecordFieldMapping>
         <dbRecordFieldMapping>
-          <name>STANDARD_PHONE_COMMUNICATION.displayValue</name>
-          <expression>%aditoprj%/entity/CampaignParticipant_entity/recordcontainers/participantsdbrecordcontainer/recordfieldmappings/standard_phone_communication.displayvalue/expression.js</expression>
+          <name>STANDARD_EMAIL_COMMUNICATION.value</name>
+          <expression>%aditoprj%/entity/CampaignParticipant_entity/recordcontainers/participantsdbrecordcontainer/recordfieldmappings/standard_email_communication.value/expression.js</expression>
+          <isFilterable v="true" />
         </dbRecordFieldMapping>
         <dbRecordFieldMapping>
-          <name>STANDARD_EMAIL_COMMUNICATION.displayValue</name>
-          <expression>%aditoprj%/entity/CampaignParticipant_entity/recordcontainers/participantsdbrecordcontainer/recordfieldmappings/standard_email_communication.displayvalue/expression.js</expression>
+          <name>STANDARD_PHONE_COMMUNICATION.value</name>
+          <expression>%aditoprj%/entity/CampaignParticipant_entity/recordcontainers/participantsdbrecordcontainer/recordfieldmappings/standard_phone_communication.value/expression.js</expression>
         </dbRecordFieldMapping>
+        <consumerMapping>
+          <name>AnyContacts</name>
+          <filterConditionProcess>%aditoprj%/entity/CampaignParticipant_entity/recordcontainers/participantsdbrecordcontainer/recordfieldmappings/anycontacts/filterConditionProcess.js</filterConditionProcess>
+          <isFilterable v="true" />
+          <filtertype>BASIC</filtertype>
+        </consumerMapping>
         <dbRecordFieldMapping>
-          <name>ADVERTISINGBAN_ICON.value</name>
-          <expression>%aditoprj%/entity/CampaignParticipant_entity/recordcontainers/participantsdbrecordcontainer/recordfieldmappings/advertisingban_icon.value/expression.js</expression>
+          <name>HASADVERTISINGBAN.value</name>
+          <expression>%aditoprj%/entity/CampaignParticipant_entity/recordcontainers/participantsdbrecordcontainer/recordfieldmappings/hasadvertisingban.value/expression.js</expression>
+          <isFilterable v="true" />
         </dbRecordFieldMapping>
       </recordFieldMappings>
     </dbRecordContainer>
diff --git a/entity/CampaignParticipant_entity/entityfields/advertisingban_icon/colorProcess.js b/entity/CampaignParticipant_entity/entityfields/advertisingban_icon/colorProcess.js
index 1bcf3daac52..f322e15de7a 100644
--- a/entity/CampaignParticipant_entity/entityfields/advertisingban_icon/colorProcess.js
+++ b/entity/CampaignParticipant_entity/entityfields/advertisingban_icon/colorProcess.js
@@ -1,16 +1,7 @@
+import("Util_lib");
 import("system.result");
-import("Sql_lib");
-import("system.db");
 import("system.vars");
 import("system.neon");
-import("Campaign_lib");
                 
-if(vars.get("$field.ADVERTISINGBAN_ICON") > 0)
-{
-    result.string(neon.PRIORITY_MEDIUM_COLOR);
-}
-else
-{
-    result.string(neon.PRIORITY_LOW_COLOR);
-}
-
+var hasAdvertisingBan = Utils.toBoolean(vars.get("$field.HASADVERTISINGBAN"));
+result.string(hasAdvertisingBan ? neon.PRIORITY_MEDIUM_COLOR : neon.PRIORITY_LOW_COLOR);
\ No newline at end of file
diff --git a/entity/CampaignParticipant_entity/entityfields/advertisingban_icon/displayValueProcess.js b/entity/CampaignParticipant_entity/entityfields/advertisingban_icon/displayValueProcess.js
index 837878d3b76..7ff3faa94c8 100644
--- a/entity/CampaignParticipant_entity/entityfields/advertisingban_icon/displayValueProcess.js
+++ b/entity/CampaignParticipant_entity/entityfields/advertisingban_icon/displayValueProcess.js
@@ -1,12 +1,7 @@
+import("Util_lib");
 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.ADVERTISINGBAN_ICON") == 0)
-{
-    result.string("VAADIN:CHECK");
-}
-else
-{
-    result.string("VAADIN:WARNING");
-}
\ No newline at end of file
+var hasAdvertisingBan = Utils.toBoolean(vars.get("$field.HASADVERTISINGBAN"));
+result.string(hasAdvertisingBan ? "VAADIN:WARNING" : "VAADIN:CHECK");
\ No newline at end of file
diff --git a/entity/CampaignParticipant_entity/entityfields/campaignsteps/children/campaignid_param/valueProcess.js b/entity/CampaignParticipant_entity/entityfields/campaignsteps/children/campaignid_param/valueProcess.js
index 90d07eb4d8a..a22fac8bd53 100644
--- a/entity/CampaignParticipant_entity/entityfields/campaignsteps/children/campaignid_param/valueProcess.js
+++ b/entity/CampaignParticipant_entity/entityfields/campaignsteps/children/campaignid_param/valueProcess.js
@@ -1,3 +1,8 @@
 import("system.vars");
 import("system.result");
-result.string(vars.get("$field.CAMPAIGN_ID"));
\ No newline at end of file
+import("system.neon");
+
+if (vars.get("$sys.viewmode") == neon.FRAME_VIEWMODE_TABLE)
+    result.string(vars.get("$param.CampaignId_param"));
+else
+    result.string(vars.get("$field.CAMPAIGN_ID"));
\ No newline at end of file
diff --git a/entity/CampaignParticipant_entity/entityfields/hasadvertisingban/dropDownProcess.js b/entity/CampaignParticipant_entity/entityfields/hasadvertisingban/dropDownProcess.js
new file mode 100644
index 00000000000..3373b8a886d
--- /dev/null
+++ b/entity/CampaignParticipant_entity/entityfields/hasadvertisingban/dropDownProcess.js
@@ -0,0 +1,7 @@
+import("system.translate");
+import("system.result");
+
+result.object([
+    ["1", translate.text("Yes")],
+    ["0", translate.text("No")]
+]);
\ No newline at end of file
diff --git a/entity/CampaignParticipant_entity/recordcontainers/participantsdbrecordcontainer/recordfieldmappings/advertisingban_icon.value/expression.js b/entity/CampaignParticipant_entity/recordcontainers/participantsdbrecordcontainer/recordfieldmappings/advertisingban_icon.value/expression.js
deleted file mode 100644
index 27052d9123b..00000000000
--- a/entity/CampaignParticipant_entity/recordcontainers/participantsdbrecordcontainer/recordfieldmappings/advertisingban_icon.value/expression.js
+++ /dev/null
@@ -1,11 +0,0 @@
-import("system.vars");
-import("Contact_lib");
-import("Sql_lib");
-import("system.result");
-
-// Now show warning always, if any commrestriction exists. No matter which medium the current step has.
-result.string("(" + newSelect("count(*)")
-                        .from("CONTACT")
-                        .where("CONTACT.CONTACTID = CAMPAIGNPARTICIPANT.CONTACT_ID")
-                        .and(newWhere(ContactUtils.getCommRestrictionCondition(undefined, false, vars.get("$sys.date")))) // TODO: the newWhere can be removed when getCommRestrictionCondition returns a sqlBuilder instead of a SqlCondition
-                        .toString() + ")");
\ No newline at end of file
diff --git a/entity/CampaignParticipant_entity/recordcontainers/participantsdbrecordcontainer/recordfieldmappings/anycontacts/filterConditionProcess.js b/entity/CampaignParticipant_entity/recordcontainers/participantsdbrecordcontainer/recordfieldmappings/anycontacts/filterConditionProcess.js
new file mode 100644
index 00000000000..c37a5f4a9b9
--- /dev/null
+++ b/entity/CampaignParticipant_entity/recordcontainers/participantsdbrecordcontainer/recordfieldmappings/anycontacts/filterConditionProcess.js
@@ -0,0 +1,10 @@
+import("system.result");
+import("system.vars");
+import("Contact_lib");
+import("Sql_lib");
+
+var condition = newWhere(null, ContactUtils.getFullContactSqlBuilder("CONTACTID")
+    .where("CONTACTID = CAMPAIGNPARTICIPANT.CONTACT_ID")
+    .and(vars.get("$local.condition")), SqlBuilder.EXISTS());
+    
+result.string(condition.toString());
\ No newline at end of file
diff --git a/entity/CampaignParticipant_entity/recordcontainers/participantsdbrecordcontainer/recordfieldmappings/hasadvertisingban.value/expression.js b/entity/CampaignParticipant_entity/recordcontainers/participantsdbrecordcontainer/recordfieldmappings/hasadvertisingban.value/expression.js
new file mode 100644
index 00000000000..b1292f54399
--- /dev/null
+++ b/entity/CampaignParticipant_entity/recordcontainers/participantsdbrecordcontainer/recordfieldmappings/hasadvertisingban.value/expression.js
@@ -0,0 +1,11 @@
+import("system.vars");
+import("Contact_lib");
+import("Sql_lib");
+import("system.result");
+
+var commRestrictionContactSubSql = newSelect("CONTACT.CONTACTID")
+    .from("CONTACT")
+    .where("CONTACT.CONTACTID = CAMPAIGNPARTICIPANT.CONTACT_ID")
+    .and(ContactUtils.getCommRestrictionCondition());
+
+result.string(SqlBuilder.caseWhen(null, commRestrictionContactSubSql, SqlBuilder.EXISTS()).thenString("1").elseString("0").toString());
\ No newline at end of file
diff --git a/entity/CampaignParticipant_entity/recordcontainers/participantsdbrecordcontainer/recordfieldmappings/standard_email_communication.displayvalue/expression.js b/entity/CampaignParticipant_entity/recordcontainers/participantsdbrecordcontainer/recordfieldmappings/standard_email_communication.value/expression.js
similarity index 100%
rename from entity/CampaignParticipant_entity/recordcontainers/participantsdbrecordcontainer/recordfieldmappings/standard_email_communication.displayvalue/expression.js
rename to entity/CampaignParticipant_entity/recordcontainers/participantsdbrecordcontainer/recordfieldmappings/standard_email_communication.value/expression.js
diff --git a/entity/CampaignParticipant_entity/recordcontainers/participantsdbrecordcontainer/recordfieldmappings/standard_phone_communication.displayvalue/expression.js b/entity/CampaignParticipant_entity/recordcontainers/participantsdbrecordcontainer/recordfieldmappings/standard_phone_communication.value/expression.js
similarity index 100%
rename from entity/CampaignParticipant_entity/recordcontainers/participantsdbrecordcontainer/recordfieldmappings/standard_phone_communication.displayvalue/expression.js
rename to entity/CampaignParticipant_entity/recordcontainers/participantsdbrecordcontainer/recordfieldmappings/standard_phone_communication.value/expression.js
diff --git a/process/Contact_lib/process.js b/process/Contact_lib/process.js
index 4d53dde63a7..05d3069f863 100644
--- a/process/Contact_lib/process.js
+++ b/process/Contact_lib/process.js
@@ -434,6 +434,26 @@ ContactUtils.getFullContactString = function()
          + " left join ADDRESS on ADDRESS.ADDRESSID = CONTACT.ADDRESS_ID";
 }
 
+/**
+ * Returns a SqlBuilder for selecting a contact with organisation, person and address. 
+ * 
+ * @param {String|Array|SqlBuilder} [pSelectFields] The select-part to set for the query, if it is omitted, no select will be set.
+ * @return {SqlBuilder}
+ */
+ContactUtils.getFullContactSqlBuilder = function (pSelectFields)
+{
+    var sql = new SqlBuilder()
+        .from("CONTACT")
+        .join("ORGANISATION", "ORGANISATION.ORGANISATIONID = CONTACT.ORGANISATION_ID")
+        .leftJoin("PERSON", "PERSON.PERSONID = CONTACT.PERSON_ID")
+        .leftJoin("ADDRESS", "ADDRESS.ADDRESSID = CONTACT.ADDRESS_ID");
+        
+    if (pSelectFields)
+        sql.select(pSelectFields);
+    
+    return sql;
+}
+
 /**
  * get the addressid of the default address
  *
-- 
GitLab


From 35f4e271dbf9b9b5b43c06953c561b25ed76df81 Mon Sep 17 00:00:00 2001
From: Sebastian Listl <s.listl@adito.de>
Date: Mon, 9 Nov 2020 17:08:23 +0100
Subject: [PATCH 066/184] #1063444 Communication address placeholder

---
 .../Data_alias/basic/2020.2.2/changelog.xml   |  5 ++
 ...insert_commMediumTitleKeywordAttribute.xml | 55 ++++++++++++
 .liquibase/Data_alias/changelog.xml           |  1 +
 .../Communication_entity.aod                  | 87 ++++++++++---------
 .../entityfields/addr/titleProcess.js         | 10 +++
 .../_____LANGUAGE_EXTRA.aod                   |  3 +
 .../_____LANGUAGE_de/_____LANGUAGE_de.aod     |  4 +
 .../_____LANGUAGE_en/_____LANGUAGE_en.aod     |  3 +
 8 files changed, 125 insertions(+), 43 deletions(-)
 create mode 100644 .liquibase/Data_alias/basic/2020.2.2/changelog.xml
 create mode 100644 .liquibase/Data_alias/basic/2020.2.2/insert_commMediumTitleKeywordAttribute.xml
 create mode 100644 entity/Communication_entity/entityfields/addr/titleProcess.js

diff --git a/.liquibase/Data_alias/basic/2020.2.2/changelog.xml b/.liquibase/Data_alias/basic/2020.2.2/changelog.xml
new file mode 100644
index 00000000000..c4de83cc615
--- /dev/null
+++ b/.liquibase/Data_alias/basic/2020.2.2/changelog.xml
@@ -0,0 +1,5 @@
+<?xml version="1.1" encoding="UTF-8" standalone="no"?>
+<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
+                   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd">
+    <include relativeToChangelogFile="true" file="insert_commMediumTitleKeywordAttribute.xml"/>
+</databaseChangeLog>
diff --git a/.liquibase/Data_alias/basic/2020.2.2/insert_commMediumTitleKeywordAttribute.xml b/.liquibase/Data_alias/basic/2020.2.2/insert_commMediumTitleKeywordAttribute.xml
new file mode 100644
index 00000000000..e67d1cc992d
--- /dev/null
+++ b/.liquibase/Data_alias/basic/2020.2.2/insert_commMediumTitleKeywordAttribute.xml
@@ -0,0 +1,55 @@
+<?xml version="1.1" encoding="UTF-8" standalone="no"?>
+<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd">
+  <changeSet author="s.listl" id="deb46cd2-c2e7-424b-93a1-052cd0a5aef7">
+      <insert tableName="AB_KEYWORD_ATTRIBUTE">
+          <column name="AB_KEYWORD_ATTRIBUTEID" value="ace00630-1e07-4615-8d61-2478995538fa"/>
+          <column name="CONTAINER" value="CommunicationMedium"/>
+          <column name="KIND" value="CHAR_VALUE"/>
+          <column name="NAME" value="placeholderTitle"/>
+      </insert>
+      <insert tableName="AB_KEYWORD_ATTRIBUTERELATION">
+          <column name="AB_KEYWORD_ATTRIBUTERELATIONID" value="ebf5a52c-34db-4394-9fc1-21dfbdc3c6ea"/>
+          <column name="AB_KEYWORD_ATTRIBUTE_ID" value="ace00630-1e07-4615-8d61-2478995538fa"/>
+          <column name="AB_KEYWORD_ENTRY_ID" value="cc16d938-b95f-4e07-a3b4-73f8524bb664"/>
+          <column name="CHAR_VALUE" value="Phone number"/>
+      </insert>
+      <insert tableName="AB_KEYWORD_ATTRIBUTERELATION">
+          <column name="AB_KEYWORD_ATTRIBUTERELATIONID" value="5a2bb861-31c8-471d-8fb9-a3c28d589b9f"/>
+          <column name="AB_KEYWORD_ATTRIBUTE_ID" value="ace00630-1e07-4615-8d61-2478995538fa"/>
+          <column name="AB_KEYWORD_ENTRY_ID" value="66950de5-fa8b-465c-8db1-4eb7aac98bd3"/>
+          <column name="CHAR_VALUE" value="Email address"/>
+      </insert>
+      <insert tableName="AB_KEYWORD_ATTRIBUTERELATION">
+          <column name="AB_KEYWORD_ATTRIBUTERELATIONID" value="c860637f-4182-4cc4-9879-7ed3d009aee4"/>
+          <column name="AB_KEYWORD_ATTRIBUTE_ID" value="ace00630-1e07-4615-8d61-2478995538fa"/>
+          <column name="AB_KEYWORD_ENTRY_ID" value="aa2b9cc9-3e87-4fe9-98a2-a4e417a3324f"/>
+          <column name="CHAR_VALUE" value="Phone number"/>
+      </insert>
+      <insert tableName="AB_KEYWORD_ATTRIBUTERELATION">
+          <column name="AB_KEYWORD_ATTRIBUTERELATIONID" value="def9c03f-4f8b-4158-9f9c-4f2c6f1f52be"/>
+          <column name="AB_KEYWORD_ATTRIBUTE_ID" value="ace00630-1e07-4615-8d61-2478995538fa"/>
+          <column name="AB_KEYWORD_ENTRY_ID" value="cfebe176-0a64-428d-b0ec-bba454d2ca3e"/>
+          <column name="CHAR_VALUE" value="URL"/>
+      </insert>
+      <insert tableName="AB_KEYWORD_ATTRIBUTERELATION">
+          <column name="AB_KEYWORD_ATTRIBUTERELATIONID" value="bf7be765-ebcc-409f-9c81-66665b6b55f6"/>
+          <column name="AB_KEYWORD_ATTRIBUTE_ID" value="ace00630-1e07-4615-8d61-2478995538fa"/>
+          <column name="AB_KEYWORD_ENTRY_ID" value="d80c3689-7e0a-45ac-801d-91d199c08bd5"/>
+          <column name="CHAR_VALUE" value="URL"/>
+      </insert>
+      <insert tableName="AB_KEYWORD_ATTRIBUTERELATION">
+          <column name="AB_KEYWORD_ATTRIBUTERELATIONID" value="9fc7f919-b04c-40f3-8124-9e1d4d8198f5"/>
+          <column name="AB_KEYWORD_ATTRIBUTE_ID" value="ace00630-1e07-4615-8d61-2478995538fa"/>
+          <column name="AB_KEYWORD_ENTRY_ID" value="e6c36792-763d-44f8-8afe-157c8f158ef8"/>
+          <column name="CHAR_VALUE" value="URL"/>
+      </insert>
+      <insert tableName="AB_KEYWORD_ATTRIBUTERELATION">
+          <column name="AB_KEYWORD_ATTRIBUTERELATIONID" value="5d64759f-acd2-4dbc-9df3-c38bceaf8f6b"/>
+          <column name="AB_KEYWORD_ATTRIBUTE_ID" value="ace00630-1e07-4615-8d61-2478995538fa"/>
+          <column name="AB_KEYWORD_ENTRY_ID" value="7abf7fc5-08a1-4bae-b0ca-ec5e406d154c"/>
+          <column name="CHAR_VALUE" value="URL"/>
+      </insert>
+  </changeSet>
+</databaseChangeLog>
\ No newline at end of file
diff --git a/.liquibase/Data_alias/changelog.xml b/.liquibase/Data_alias/changelog.xml
index 9d1ca6c5576..3f25ca1dbb1 100644
--- a/.liquibase/Data_alias/changelog.xml
+++ b/.liquibase/Data_alias/changelog.xml
@@ -17,6 +17,7 @@
     <include relativeToChangelogFile="true" file="basic/2020.1.3/changelog.xml"/>
     <include relativeToChangelogFile="true" file="basic/2020.2.0/changelog.xml"/>
     <include relativeToChangelogFile="true" file="basic/2020.2.1/changelog.xml"/>
+    <include relativeToChangelogFile="true" file="basic/2020.2.2/changelog.xml"/>
 
     <!--enable this only when you definetly want to overwrite the existing data with demo records:-->
     <!--<include relativeToChangelogFile="true" file="basic/_demoData/changelog.xml" context="example"/>-->
diff --git a/entity/Communication_entity/Communication_entity.aod b/entity/Communication_entity/Communication_entity.aod
index dbc7bf89b31..f931c15531a 100644
--- a/entity/Communication_entity/Communication_entity.aod
+++ b/entity/Communication_entity/Communication_entity.aod
@@ -13,6 +13,7 @@
       <title>${COMM_ADDRESS}</title>
       <contentTypeProcess>%aditoprj%/entity/Communication_entity/entityfields/addr/contentTypeProcess.js</contentTypeProcess>
       <mandatory v="true" />
+      <titleProcess>%aditoprj%/entity/Communication_entity/entityfields/addr/titleProcess.js</titleProcess>
       <valueProcess>%aditoprj%/entity/Communication_entity/entityfields/addr/valueProcess.js</valueProcess>
       <onValidation>%aditoprj%/entity/Communication_entity/entityfields/addr/onValidation.js</onValidation>
     </entityField>
@@ -62,6 +63,27 @@ Usually this is used for filtering COMMUNICATION-entries by a specified contact
       <name>AllCommunications</name>
       <documentation>%aditoprj%/entity/Communication_entity/entityfields/allcommunications/documentation.adoc</documentation>
       <recordContainer>db</recordContainer>
+      <children>
+        <entityParameter>
+          <name>CommCategory_param</name>
+          <expose v="true" />
+          <description>TODO: expose auf false. aktuell wird der Code nicht ausgeführt, wenn Expose false ist.</description>
+        </entityParameter>
+        <entityParameter>
+          <name>ContactId_param</name>
+          <expose v="true" />
+          <description>This parameter is used for specifing a related "CONTACTID" to a COMMUNICATION-entry. 
+Usually this is used for filtering COMMUNICATION-entries by a specified contact or creating a new entry that is related to a contact.</description>
+        </entityParameter>
+        <entityParameter>
+          <name>Address_param</name>
+          <expose v="false" />
+        </entityParameter>
+        <entityParameter>
+          <name>AdditionalContactIds_param</name>
+          <expose v="false" />
+        </entityParameter>
+      </children>
       <dependencies>
         <entityDependency>
           <name>070b2457-3766-4c8a-b43f-a2bf7c9ef638</name>
@@ -88,10 +110,16 @@ Usually this is used for filtering COMMUNICATION-entries by a specified contact
           <isConsumer v="false" />
         </entityDependency>
       </dependencies>
+    </entityProvider>
+    <entityProvider>
+      <name>PhoneCommunications</name>
+      <documentation>%aditoprj%/entity/Communication_entity/entityfields/phonecommunications/documentation.adoc</documentation>
+      <recordContainer>db</recordContainer>
       <children>
         <entityParameter>
           <name>CommCategory_param</name>
-          <expose v="true" />
+          <valueProcess>%aditoprj%/entity/Communication_entity/entityfields/phonecommunications/children/commcategory_param/valueProcess.js</valueProcess>
+          <expose v="false" />
           <description>TODO: expose auf false. aktuell wird der Code nicht ausgeführt, wenn Expose false ist.</description>
         </entityParameter>
         <entityParameter>
@@ -102,18 +130,14 @@ Usually this is used for filtering COMMUNICATION-entries by a specified contact
         </entityParameter>
         <entityParameter>
           <name>Address_param</name>
-          <expose v="false" />
+          <expose v="true" />
+          <mandatory v="false" />
         </entityParameter>
         <entityParameter>
           <name>AdditionalContactIds_param</name>
           <expose v="false" />
         </entityParameter>
       </children>
-    </entityProvider>
-    <entityProvider>
-      <name>PhoneCommunications</name>
-      <documentation>%aditoprj%/entity/Communication_entity/entityfields/phonecommunications/documentation.adoc</documentation>
-      <recordContainer>db</recordContainer>
       <dependencies>
         <entityDependency>
           <name>7382242a-aa18-4a31-ab77-69a79f2b97b8</name>
@@ -128,10 +152,16 @@ Usually this is used for filtering COMMUNICATION-entries by a specified contact
           <isConsumer v="false" />
         </entityDependency>
       </dependencies>
+    </entityProvider>
+    <entityProvider>
+      <name>EmailCommunications</name>
+      <documentation>%aditoprj%/entity/Communication_entity/entityfields/emailcommunications/documentation.adoc</documentation>
+      <recordContainer>db</recordContainer>
       <children>
         <entityParameter>
           <name>CommCategory_param</name>
-          <valueProcess>%aditoprj%/entity/Communication_entity/entityfields/phonecommunications/children/commcategory_param/valueProcess.js</valueProcess>
+          <title></title>
+          <valueProcess>%aditoprj%/entity/Communication_entity/entityfields/emailcommunications/children/commcategory_param/valueProcess.js</valueProcess>
           <expose v="false" />
           <description>TODO: expose auf false. aktuell wird der Code nicht ausgeführt, wenn Expose false ist.</description>
         </entityParameter>
@@ -143,19 +173,13 @@ Usually this is used for filtering COMMUNICATION-entries by a specified contact
         </entityParameter>
         <entityParameter>
           <name>Address_param</name>
-          <expose v="true" />
-          <mandatory v="false" />
+          <expose v="false" />
         </entityParameter>
         <entityParameter>
           <name>AdditionalContactIds_param</name>
           <expose v="false" />
         </entityParameter>
       </children>
-    </entityProvider>
-    <entityProvider>
-      <name>EmailCommunications</name>
-      <documentation>%aditoprj%/entity/Communication_entity/entityfields/emailcommunications/documentation.adoc</documentation>
-      <recordContainer>db</recordContainer>
       <dependencies>
         <entityDependency>
           <name>ecfbf518-fe92-4661-8ebe-e2d3c8d259e1</name>
@@ -182,29 +206,6 @@ Usually this is used for filtering COMMUNICATION-entries by a specified contact
           <isConsumer v="false" />
         </entityDependency>
       </dependencies>
-      <children>
-        <entityParameter>
-          <name>CommCategory_param</name>
-          <title></title>
-          <valueProcess>%aditoprj%/entity/Communication_entity/entityfields/emailcommunications/children/commcategory_param/valueProcess.js</valueProcess>
-          <expose v="false" />
-          <description>TODO: expose auf false. aktuell wird der Code nicht ausgeführt, wenn Expose false ist.</description>
-        </entityParameter>
-        <entityParameter>
-          <name>ContactId_param</name>
-          <expose v="true" />
-          <description>This parameter is used for specifing a related "CONTACTID" to a COMMUNICATION-entry. 
-Usually this is used for filtering COMMUNICATION-entries by a specified contact or creating a new entry that is related to a contact.</description>
-        </entityParameter>
-        <entityParameter>
-          <name>Address_param</name>
-          <expose v="false" />
-        </entityParameter>
-        <entityParameter>
-          <name>AdditionalContactIds_param</name>
-          <expose v="false" />
-        </entityParameter>
-      </children>
     </entityProvider>
     <entityParameter>
       <name>CommCategory_param</name>
@@ -218,11 +219,6 @@ Usually this is used for filtering COMMUNICATION-entries by a specified contact
     </entityParameter>
     <entityConsumer>
       <name>KeywordMediums</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>KeywordEntry_entity</entityName>
-        <fieldName>SpecificContainerKeywords</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
@@ -230,6 +226,11 @@ Usually this is used for filtering COMMUNICATION-entries by a specified contact
           <expose v="false" />
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>SpecificContainerKeywords</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>USER_NEW</name>
diff --git a/entity/Communication_entity/entityfields/addr/titleProcess.js b/entity/Communication_entity/entityfields/addr/titleProcess.js
new file mode 100644
index 00000000000..8bacbaa9a70
--- /dev/null
+++ b/entity/Communication_entity/entityfields/addr/titleProcess.js
@@ -0,0 +1,10 @@
+import("system.translate");
+import("system.result");
+import("KeywordRegistry_basic");
+import("Keyword_lib");
+import("system.vars");
+
+var commMedium = vars.get("$field.MEDIUM_ID");
+var keywordAttributes = KeywordUtils.getAttributeRelationsByKey(commMedium, $KeywordRegistry.communicationMedium());
+if (keywordAttributes && keywordAttributes.placeholderTitle)
+    result.string(translate.text(keywordAttributes.placeholderTitle));
\ No newline at end of file
diff --git a/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod b/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod
index 3439544cfe8..7b27a5c7418 100644
--- a/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod
+++ b/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod
@@ -7296,6 +7296,9 @@
     <entry>
       <key>Outstanding Amount</key>
     </entry>
+    <entry>
+      <key>Start marketing mailing</key>
+    </entry>
   </keyValueMap>
   <font name="Dialog" style="0" size="11" />
   <sqlModels>
diff --git a/language/_____LANGUAGE_de/_____LANGUAGE_de.aod b/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
index d68c0ad4d76..e1b810a066f 100644
--- a/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
+++ b/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
@@ -3071,6 +3071,10 @@
       <key>Kgs</key>
       <value>Kg</value>
     </entry>
+    <entry>
+      <key>Email address</key>
+      <value>E-Mail Adresse</value>
+    </entry>
     <entry>
       <key>Australia</key>
       <value>Australien</value>
diff --git a/language/_____LANGUAGE_en/_____LANGUAGE_en.aod b/language/_____LANGUAGE_en/_____LANGUAGE_en.aod
index cf8d0df31f4..221f4b4a721 100644
--- a/language/_____LANGUAGE_en/_____LANGUAGE_en.aod
+++ b/language/_____LANGUAGE_en/_____LANGUAGE_en.aod
@@ -7377,6 +7377,9 @@
     <entry>
       <key>Outstanding Amount</key>
     </entry>
+    <entry>
+      <key>Start marketing mailing</key>
+    </entry>
   </keyValueMap>
   <font name="Dialog" style="0" size="11" />
 </language>
-- 
GitLab


From 37f1d76922b681d380d0229ebe00108e98e37c1d Mon Sep 17 00:00:00 2001
From: Erik Pollinger <e.pollinger@yahoo.de>
Date: Tue, 10 Nov 2020 01:48:34 +0100
Subject: [PATCH 067/184] Implemented KnowledgeManagement

---
 .../changelog_knowledgeManagement.xml         |   14 +
 .../Knowledgemanagement/data/blobs/git.css    |  450 +++++++
 .../data/blobs/standard.css                   |  138 ++
 .../data/knowledgeKeywords.xml                |   87 ++
 .../Knowledgemanagement/data/knowledgeTag.xml |   10 +
 .../struct/create_KnowledgeRoles.xml          |   13 +
 .../struct/knowledgeDiscussion_table.xml      |   20 +
 .../struct/knowledgeGitInterface_table.xml    |   17 +
 .../struct/knowledgeLink_table.xml            |   18 +
 .../struct/knowledgeManagement_table.xml      |   29 +
 .../struct/knowledgeTagLink_table.xml         |   17 +
 .../struct/knowledgeTagModeration_table.xml   |   13 +
 .../struct/knowledgeTag_table.xml             |   17 +
 .liquibase/Data_alias/changelog.xml           |    4 +-
 aliasDefinition/Data_alias/Data_alias.aod     | 1028 +++++++++++++-
 .../_____SYSTEM_APPLICATION_NEON.aod          |   22 +
 .../KnowledgeDiscussion_entity.aod            |  219 +++
 .../KnowledgeDiscussion_entity/afterUiInit.js |    7 +
 .../entityfields/author/valueProcess.js       |    8 +
 .../entityfields/date_edit/valueProcess.js    |    7 +
 .../entityfields/date_new/valueProcess.js     |    7 +
 .../addanswer_action/onActionProcess.js       |    9 +
 .../children/showall_action/iconIdProcess.js  |    7 +
 .../showall_action/onActionProcess.js         |   12 +
 .../onActionProcess.js                        |   12 +
 .../knowledgemanagement_id/valueProcess.js    |    7 +
 .../parentid_param/valueProcess.js            |    4 +
 .../entityfields/status/valueProcess.js       |    7 +
 .../containername_param/valueProcess.js       |    4 +
 .../onlyactives_param/valueProcess.js         |    3 +
 .../withclosed_param/valueProcess.js          |    5 +
 .../grantCreateProcess.js                     |   18 +
 .../grantDeleteProcess.js                     |   24 +
 .../grantUpdateProcess.js                     |   30 +
 .../iconIdProcess.js                          |    4 +
 .../contentProcess.js                         |   23 +
 .../onDelete.js                               |    6 +
 .../onInsert.js                               |    9 +
 .../onUpdate.js                               |    8 +
 .../rowCountProcess.js                        |   25 +
 .../KnowledgeLink_entity.aod                  |  177 +++
 .../entityfields/date_edit/valueProcess.js    |    6 +
 .../entityfields/date_new/valueProcess.js     |    6 +
 .../knowledgemanagement_id/valueProcess.js    |   13 +
 .../object_type/displayValueProcess.js        |    7 +
 .../children/contactid_param/valueProcess.js  |    7 +
 .../children/objecttype_param/valueProcess.js |    4 +
 .../row_id/displayValueProcess.js             |   11 +
 .../row_id/linkedContextProcess.js            |    5 +
 .../entityfields/user_edit/valueProcess.js    |    6 +
 .../entityfields/user_new/valueProcess.js     |    6 +
 entity/KnowledgeLink_entity/iconIdProcess.js  |    5 +
 .../recordcontainers/db/conditionProcess.js   |   16 +
 .../KnowledgeManagementTagList_entity.aod     |   48 +
 .../contentTitleProcess.js                    |    4 +
 .../jdito_taglist/contentProcess.js           |    8 +
 .../KnowledgeManagementTags_entity.aod        |   93 ++
 .../entityfields/listtitle/valueProcess.js    |    3 +
 .../entityfields/tag/displayValueProcess.js   |    5 +
 .../contentProcess.js                         |   12 +
 .../onDelete.js                               |    8 +
 .../onInsert.js                               |   17 +
 .../onUpdate.js                               |   13 +
 .../KnowledgeManagement_entity.aod            |  499 +++++++
 .../afterOperatingState.js                    |   52 +
 .../contentTitleProcess.js                    |    3 +
 .../author_contact_id/displayValueProcess.js  |   10 +
 .../author_contact_id/valueProcess.js         |    8 +
 .../contentdecoded/valueProcess.js            |    5 +
 .../entityfields/date_edit/valueProcess.js    |   12 +
 .../entityfields/date_new/valueProcess.js     |    9 +
 .../knowledgeid_param/valueProcess.js         |    4 +
 .../exporthtml_action/onActionProcess.js      |    5 +
 .../entityfields/htmlview/valueProcess.js     |   12 +
 .../entityfields/isnewsmark/valueProcess.js   |   35 +
 .../containername_param/valueProcess.js       |    4 +
 .../containername_param/valueProcess.js       |    4 +
 .../valueProcess.js                           |    2 +
 .../knowledgemanagement_param/valueProcess.js |    4 +
 .../publishlevelroles_param/valueProcess.js   |   28 +
 .../knowledgeroles/onValidation.js            |   15 +
 .../knowledgeroles/stateProcess.js            |   11 +
 .../assignmentrowid_param/valueProcess.js     |    4 +
 .../assignmenttable_param/valueProcess.js     |    3 +
 .../valueProcess.js                           |    4 +
 .../children/tablenames_param/valueProcess.js |    8 +
 .../notificationmark/stateProcess.js          |    8 +
 .../openentryasmail/onActionProcess.js        |   10 +
 .../publish/displayValueProcess.js            |    7 +
 .../entityfields/publish/valueProcess.js      |    8 +
 .../displayValueProcess.js                    |   12 +
 .../responsible_contact_id/valueProcess.js    |    8 +
 .../valueProcess.js                           |    4 +
 .../children/objectid_param/valueProcess.js   |    4 +
 .../presetlinks_param/valueProcess.js         |    5 +
 .../children/rowid_param/valueProcess.js      |    4 +
 .../entityfields/type/valueProcess.js         |    8 +
 .../entityfields/user_edit/valueProcess.js    |    8 +
 .../entityfields/user_new/valueProcess.js     |    8 +
 .../grantDeleteProcess.js                     |    9 +
 .../grantUpdateProcess.js                     |    9 +
 .../iconIdProcess.js                          |    6 +
 .../recordcontainers/db/conditionProcess.js   |   32 +
 .../tagfilter/filterConditionProcess.js       |   44 +
 .../tagfilter/filterValuesProcess.js          |    6 +
 .../recordcontainers/db/onDBInsert.js         |   17 +
 .../recordcontainers/db/onDBUpdate.js         |   17 +
 .../recordcontainers/db/orderClauseProcess.js |    6 +
 .../expression.js                             |    7 +
 .../knowledgeroles/filterConditionProcess.js  |    4 +
 .../lastchange.value/expression.js            |    6 +
 .../publish.displayvalue/expression.js        |    4 +
 .../expression.js                             |    7 +
 .../type.displayvalue/expression.js           |    4 +
 .../indexsearchknowledgebase/affectedIds.js   |   25 +
 .../patternExtensionProcess.js                |   11 +
 .../indexsearchknowledgebase/query.js         |   42 +
 .../indexsearchknowledgebase/subProcess.js    |    7 +
 .../KnowledgeNewsFeed_entity.aod              |   33 +
 .../documentation.adoc                        |    3 +
 .../entityfields/htmlcontent/valueProcess.js  |   34 +
 .../KnowledgeRole_entity.aod                  |  110 ++
 .../knowledgemanagment_id/valueProcess.js     |    5 +
 .../excluderoles_param/valueProcess.js        |   12 +
 .../entityfields/roles/displayValueProcess.js |   13 +
 .../targetcontext/valueProcess.js             |    3 +
 .../recordcontainers/db/conditionProcess.js   |    6 +
 .../roles.displayvalue/expression.js          |    7 +
 entity/Role_entity/Role_entity.aod            |    4 +
 .../KnowledgeDiscussion.aod                   |   24 +
 neonContext/KnowledgeLink/KnowledgeLink.aod   |   27 +
 .../KnowledgeManagement.aod                   |   48 +
 .../KnowledgeManagementTagList.aod            |    6 +
 .../KnowledgeManagementTags.aod               |   16 +
 .../KnowledgeNewsFeed/KnowledgeNewsFeed.aod   |   14 +
 neonContext/KnowledgeRole/KnowledgeRole.aod   |   13 +
 .../KnowledgeDiscussionEdit_view.aod          |   27 +
 .../KnowledgeDiscussionPreview_view.aod       |   37 +
 .../KnowledgeDiscussionTree_view.aod          |   33 +
 .../KnowledgeLinkActionList_view.aod          |   19 +
 .../KnowledgeLinkEdit_view.aod                |   31 +
 .../KnowledgeLinkLookup_view.aod              |   27 +
 .../KnowledgeLinkMultiEdit_view.aod           |   29 +
 .../KnowledgeManagementDetails_view.aod       |   58 +
 .../KnowledgeManagementEdit_view.aod          |   86 ++
 .../KnowledgeManagementFilter_view.aod        |   50 +
 .../KnowledgeManagementLookup_view.aod        |   34 +
 .../KnowledgeManagementMain_view.aod          |   42 +
 .../KnowledgeManagementPreview_view.aod       |   17 +
 .../KnowledgeManagementRole_view.aod          |   33 +
 .../KnowledgeManagementTimeline_view.aod      |   44 +
 .../KnowledgeNewsFeed_view.aod                |   42 +
 .../KnowledgeRoleEdit_view.aod                |   30 +
 .../KnowledgeTagList_GenMult_view.aod         |   27 +
 .../KnowledgeTagList_view.aod                 |   25 +
 process/Html_lib/Html_lib.aod                 |    9 +
 process/Html_lib/process.js                   |  149 +++
 process/KeywordRegistry_basic/process.js      |   13 +
 .../KnowledgeManagement_lib.aod               |   10 +
 process/KnowledgeManagement_lib/process.js    | 1179 +++++++++++++++++
 process/NewsSystem_lib/NewsSystem_lib.aod     |    9 +
 process/NewsSystem_lib/process.js             |   91 ++
 process/Sql_lib/process.js                    |   27 +
 process/Util_lib/process.js                   |    7 +
 164 files changed, 6495 insertions(+), 8 deletions(-)
 create mode 100644 .liquibase/Data_alias/basic/Knowledgemanagement/changelog_knowledgeManagement.xml
 create mode 100644 .liquibase/Data_alias/basic/Knowledgemanagement/data/blobs/git.css
 create mode 100644 .liquibase/Data_alias/basic/Knowledgemanagement/data/blobs/standard.css
 create mode 100644 .liquibase/Data_alias/basic/Knowledgemanagement/data/knowledgeKeywords.xml
 create mode 100644 .liquibase/Data_alias/basic/Knowledgemanagement/data/knowledgeTag.xml
 create mode 100644 .liquibase/Data_alias/basic/Knowledgemanagement/struct/create_KnowledgeRoles.xml
 create mode 100644 .liquibase/Data_alias/basic/Knowledgemanagement/struct/knowledgeDiscussion_table.xml
 create mode 100644 .liquibase/Data_alias/basic/Knowledgemanagement/struct/knowledgeGitInterface_table.xml
 create mode 100644 .liquibase/Data_alias/basic/Knowledgemanagement/struct/knowledgeLink_table.xml
 create mode 100644 .liquibase/Data_alias/basic/Knowledgemanagement/struct/knowledgeManagement_table.xml
 create mode 100644 .liquibase/Data_alias/basic/Knowledgemanagement/struct/knowledgeTagLink_table.xml
 create mode 100644 .liquibase/Data_alias/basic/Knowledgemanagement/struct/knowledgeTagModeration_table.xml
 create mode 100644 .liquibase/Data_alias/basic/Knowledgemanagement/struct/knowledgeTag_table.xml
 create mode 100644 entity/KnowledgeDiscussion_entity/KnowledgeDiscussion_entity.aod
 create mode 100644 entity/KnowledgeDiscussion_entity/afterUiInit.js
 create mode 100644 entity/KnowledgeDiscussion_entity/entityfields/author/valueProcess.js
 create mode 100644 entity/KnowledgeDiscussion_entity/entityfields/date_edit/valueProcess.js
 create mode 100644 entity/KnowledgeDiscussion_entity/entityfields/date_new/valueProcess.js
 create mode 100644 entity/KnowledgeDiscussion_entity/entityfields/edit_actiongroup/children/addanswer_action/onActionProcess.js
 create mode 100644 entity/KnowledgeDiscussion_entity/entityfields/edit_actiongroup/children/showall_action/iconIdProcess.js
 create mode 100644 entity/KnowledgeDiscussion_entity/entityfields/edit_actiongroup/children/showall_action/onActionProcess.js
 create mode 100644 entity/KnowledgeDiscussion_entity/entityfields/edit_actiongroup/children/togglediscussionstatus_action/onActionProcess.js
 create mode 100644 entity/KnowledgeDiscussion_entity/entityfields/knowledgemanagement_id/valueProcess.js
 create mode 100644 entity/KnowledgeDiscussion_entity/entityfields/parentid_param/valueProcess.js
 create mode 100644 entity/KnowledgeDiscussion_entity/entityfields/status/valueProcess.js
 create mode 100644 entity/KnowledgeDiscussion_entity/entityfields/statuskeyword/children/containername_param/valueProcess.js
 create mode 100644 entity/KnowledgeDiscussion_entity/entityfields/statuskeyword/children/onlyactives_param/valueProcess.js
 create mode 100644 entity/KnowledgeDiscussion_entity/entityfields/withclosed_param/valueProcess.js
 create mode 100644 entity/KnowledgeDiscussion_entity/grantCreateProcess.js
 create mode 100644 entity/KnowledgeDiscussion_entity/grantDeleteProcess.js
 create mode 100644 entity/KnowledgeDiscussion_entity/grantUpdateProcess.js
 create mode 100644 entity/KnowledgeDiscussion_entity/iconIdProcess.js
 create mode 100644 entity/KnowledgeDiscussion_entity/recordcontainers/jdito_knowledgediscussioncontainer/contentProcess.js
 create mode 100644 entity/KnowledgeDiscussion_entity/recordcontainers/jdito_knowledgediscussioncontainer/onDelete.js
 create mode 100644 entity/KnowledgeDiscussion_entity/recordcontainers/jdito_knowledgediscussioncontainer/onInsert.js
 create mode 100644 entity/KnowledgeDiscussion_entity/recordcontainers/jdito_knowledgediscussioncontainer/onUpdate.js
 create mode 100644 entity/KnowledgeDiscussion_entity/recordcontainers/jdito_knowledgediscussioncontainer/rowCountProcess.js
 create mode 100644 entity/KnowledgeLink_entity/KnowledgeLink_entity.aod
 create mode 100644 entity/KnowledgeLink_entity/entityfields/date_edit/valueProcess.js
 create mode 100644 entity/KnowledgeLink_entity/entityfields/date_new/valueProcess.js
 create mode 100644 entity/KnowledgeLink_entity/entityfields/knowledgemanagement_id/valueProcess.js
 create mode 100644 entity/KnowledgeLink_entity/entityfields/object_type/displayValueProcess.js
 create mode 100644 entity/KnowledgeLink_entity/entityfields/objects/children/contactid_param/valueProcess.js
 create mode 100644 entity/KnowledgeLink_entity/entityfields/objects/children/objecttype_param/valueProcess.js
 create mode 100644 entity/KnowledgeLink_entity/entityfields/row_id/displayValueProcess.js
 create mode 100644 entity/KnowledgeLink_entity/entityfields/row_id/linkedContextProcess.js
 create mode 100644 entity/KnowledgeLink_entity/entityfields/user_edit/valueProcess.js
 create mode 100644 entity/KnowledgeLink_entity/entityfields/user_new/valueProcess.js
 create mode 100644 entity/KnowledgeLink_entity/iconIdProcess.js
 create mode 100644 entity/KnowledgeLink_entity/recordcontainers/db/conditionProcess.js
 create mode 100644 entity/KnowledgeManagementTagList_entity/KnowledgeManagementTagList_entity.aod
 create mode 100644 entity/KnowledgeManagementTagList_entity/contentTitleProcess.js
 create mode 100644 entity/KnowledgeManagementTagList_entity/recordcontainers/jdito_taglist/contentProcess.js
 create mode 100644 entity/KnowledgeManagementTags_entity/KnowledgeManagementTags_entity.aod
 create mode 100644 entity/KnowledgeManagementTags_entity/entityfields/listtitle/valueProcess.js
 create mode 100644 entity/KnowledgeManagementTags_entity/entityfields/tag/displayValueProcess.js
 create mode 100644 entity/KnowledgeManagementTags_entity/recordcontainers/jdito_knowledgemanagementkeywords/contentProcess.js
 create mode 100644 entity/KnowledgeManagementTags_entity/recordcontainers/jdito_knowledgemanagementkeywords/onDelete.js
 create mode 100644 entity/KnowledgeManagementTags_entity/recordcontainers/jdito_knowledgemanagementkeywords/onInsert.js
 create mode 100644 entity/KnowledgeManagementTags_entity/recordcontainers/jdito_knowledgemanagementkeywords/onUpdate.js
 create mode 100644 entity/KnowledgeManagement_entity/KnowledgeManagement_entity.aod
 create mode 100644 entity/KnowledgeManagement_entity/afterOperatingState.js
 create mode 100644 entity/KnowledgeManagement_entity/contentTitleProcess.js
 create mode 100644 entity/KnowledgeManagement_entity/entityfields/author_contact_id/displayValueProcess.js
 create mode 100644 entity/KnowledgeManagement_entity/entityfields/author_contact_id/valueProcess.js
 create mode 100644 entity/KnowledgeManagement_entity/entityfields/contentdecoded/valueProcess.js
 create mode 100644 entity/KnowledgeManagement_entity/entityfields/date_edit/valueProcess.js
 create mode 100644 entity/KnowledgeManagement_entity/entityfields/date_new/valueProcess.js
 create mode 100644 entity/KnowledgeManagement_entity/entityfields/discussionsbyknowledgeid/children/knowledgeid_param/valueProcess.js
 create mode 100644 entity/KnowledgeManagement_entity/entityfields/exporthtml_action/onActionProcess.js
 create mode 100644 entity/KnowledgeManagement_entity/entityfields/htmlview/valueProcess.js
 create mode 100644 entity/KnowledgeManagement_entity/entityfields/isnewsmark/valueProcess.js
 create mode 100644 entity/KnowledgeManagement_entity/entityfields/keywordknowledgetype/children/containername_param/valueProcess.js
 create mode 100644 entity/KnowledgeManagement_entity/entityfields/keywordpublish/children/containername_param/valueProcess.js
 create mode 100644 entity/KnowledgeManagement_entity/entityfields/knowledgemanagement_objecttype/valueProcess.js
 create mode 100644 entity/KnowledgeManagement_entity/entityfields/knowledgeroles/children/knowledgemanagement_param/valueProcess.js
 create mode 100644 entity/KnowledgeManagement_entity/entityfields/knowledgeroles/children/publishlevelroles_param/valueProcess.js
 create mode 100644 entity/KnowledgeManagement_entity/entityfields/knowledgeroles/onValidation.js
 create mode 100644 entity/KnowledgeManagement_entity/entityfields/knowledgeroles/stateProcess.js
 create mode 100644 entity/KnowledgeManagement_entity/entityfields/linkeddocuments/children/assignmentrowid_param/valueProcess.js
 create mode 100644 entity/KnowledgeManagement_entity/entityfields/linkeddocuments/children/assignmenttable_param/valueProcess.js
 create mode 100644 entity/KnowledgeManagement_entity/entityfields/linksbyknowledgeid/children/knowledgemanagementid_param/valueProcess.js
 create mode 100644 entity/KnowledgeManagement_entity/entityfields/loghistories/children/tablenames_param/valueProcess.js
 create mode 100644 entity/KnowledgeManagement_entity/entityfields/notificationmark/stateProcess.js
 create mode 100644 entity/KnowledgeManagement_entity/entityfields/openentryasmail/onActionProcess.js
 create mode 100644 entity/KnowledgeManagement_entity/entityfields/publish/displayValueProcess.js
 create mode 100644 entity/KnowledgeManagement_entity/entityfields/publish/valueProcess.js
 create mode 100644 entity/KnowledgeManagement_entity/entityfields/responsible_contact_id/displayValueProcess.js
 create mode 100644 entity/KnowledgeManagement_entity/entityfields/responsible_contact_id/valueProcess.js
 create mode 100644 entity/KnowledgeManagement_entity/entityfields/tagsbyknowledgeid/children/knowledgemanagementid_param/valueProcess.js
 create mode 100644 entity/KnowledgeManagement_entity/entityfields/tasks/children/objectid_param/valueProcess.js
 create mode 100644 entity/KnowledgeManagement_entity/entityfields/tasks/children/presetlinks_param/valueProcess.js
 create mode 100644 entity/KnowledgeManagement_entity/entityfields/tasks/children/rowid_param/valueProcess.js
 create mode 100644 entity/KnowledgeManagement_entity/entityfields/type/valueProcess.js
 create mode 100644 entity/KnowledgeManagement_entity/entityfields/user_edit/valueProcess.js
 create mode 100644 entity/KnowledgeManagement_entity/entityfields/user_new/valueProcess.js
 create mode 100644 entity/KnowledgeManagement_entity/grantDeleteProcess.js
 create mode 100644 entity/KnowledgeManagement_entity/grantUpdateProcess.js
 create mode 100644 entity/KnowledgeManagement_entity/iconIdProcess.js
 create mode 100644 entity/KnowledgeManagement_entity/recordcontainers/db/conditionProcess.js
 create mode 100644 entity/KnowledgeManagement_entity/recordcontainers/db/filterextensions/tagfilter/filterConditionProcess.js
 create mode 100644 entity/KnowledgeManagement_entity/recordcontainers/db/filterextensions/tagfilter/filterValuesProcess.js
 create mode 100644 entity/KnowledgeManagement_entity/recordcontainers/db/onDBInsert.js
 create mode 100644 entity/KnowledgeManagement_entity/recordcontainers/db/onDBUpdate.js
 create mode 100644 entity/KnowledgeManagement_entity/recordcontainers/db/orderClauseProcess.js
 create mode 100644 entity/KnowledgeManagement_entity/recordcontainers/db/recordfieldmappings/author_contact_id.displayvalue/expression.js
 create mode 100644 entity/KnowledgeManagement_entity/recordcontainers/db/recordfieldmappings/knowledgeroles/filterConditionProcess.js
 create mode 100644 entity/KnowledgeManagement_entity/recordcontainers/db/recordfieldmappings/lastchange.value/expression.js
 create mode 100644 entity/KnowledgeManagement_entity/recordcontainers/db/recordfieldmappings/publish.displayvalue/expression.js
 create mode 100644 entity/KnowledgeManagement_entity/recordcontainers/db/recordfieldmappings/responsible_contact_id.displayvalue/expression.js
 create mode 100644 entity/KnowledgeManagement_entity/recordcontainers/db/recordfieldmappings/type.displayvalue/expression.js
 create mode 100644 entity/KnowledgeManagement_entity/recordcontainers/indexsearchknowledgebase/affectedIds.js
 create mode 100644 entity/KnowledgeManagement_entity/recordcontainers/indexsearchknowledgebase/patternExtensionProcess.js
 create mode 100644 entity/KnowledgeManagement_entity/recordcontainers/indexsearchknowledgebase/query.js
 create mode 100644 entity/KnowledgeManagement_entity/recordcontainers/indexsearchknowledgebase/subProcess.js
 create mode 100644 entity/KnowledgeNewsFeed_entity/KnowledgeNewsFeed_entity.aod
 create mode 100644 entity/KnowledgeNewsFeed_entity/documentation.adoc
 create mode 100644 entity/KnowledgeNewsFeed_entity/entityfields/htmlcontent/valueProcess.js
 create mode 100644 entity/KnowledgeRole_entity/KnowledgeRole_entity.aod
 create mode 100644 entity/KnowledgeRole_entity/entityfields/knowledgemanagment_id/valueProcess.js
 create mode 100644 entity/KnowledgeRole_entity/entityfields/newsrole/children/excluderoles_param/valueProcess.js
 create mode 100644 entity/KnowledgeRole_entity/entityfields/roles/displayValueProcess.js
 create mode 100644 entity/KnowledgeRole_entity/entityfields/targetcontext/valueProcess.js
 create mode 100644 entity/KnowledgeRole_entity/recordcontainers/db/conditionProcess.js
 create mode 100644 entity/KnowledgeRole_entity/recordcontainers/db/recordfieldmappings/roles.displayvalue/expression.js
 create mode 100644 neonContext/KnowledgeDiscussion/KnowledgeDiscussion.aod
 create mode 100644 neonContext/KnowledgeLink/KnowledgeLink.aod
 create mode 100644 neonContext/KnowledgeManagement/KnowledgeManagement.aod
 create mode 100644 neonContext/KnowledgeManagementTagList/KnowledgeManagementTagList.aod
 create mode 100644 neonContext/KnowledgeManagementTags/KnowledgeManagementTags.aod
 create mode 100644 neonContext/KnowledgeNewsFeed/KnowledgeNewsFeed.aod
 create mode 100644 neonContext/KnowledgeRole/KnowledgeRole.aod
 create mode 100644 neonView/KnowledgeDiscussionEdit_view/KnowledgeDiscussionEdit_view.aod
 create mode 100644 neonView/KnowledgeDiscussionPreview_view/KnowledgeDiscussionPreview_view.aod
 create mode 100644 neonView/KnowledgeDiscussionTree_view/KnowledgeDiscussionTree_view.aod
 create mode 100644 neonView/KnowledgeLinkActionList_view/KnowledgeLinkActionList_view.aod
 create mode 100644 neonView/KnowledgeLinkEdit_view/KnowledgeLinkEdit_view.aod
 create mode 100644 neonView/KnowledgeLinkLookup_view/KnowledgeLinkLookup_view.aod
 create mode 100644 neonView/KnowledgeLinkMultiEdit_view/KnowledgeLinkMultiEdit_view.aod
 create mode 100644 neonView/KnowledgeManagementDetails_view/KnowledgeManagementDetails_view.aod
 create mode 100644 neonView/KnowledgeManagementEdit_view/KnowledgeManagementEdit_view.aod
 create mode 100644 neonView/KnowledgeManagementFilter_view/KnowledgeManagementFilter_view.aod
 create mode 100644 neonView/KnowledgeManagementLookup_view/KnowledgeManagementLookup_view.aod
 create mode 100644 neonView/KnowledgeManagementMain_view/KnowledgeManagementMain_view.aod
 create mode 100644 neonView/KnowledgeManagementPreview_view/KnowledgeManagementPreview_view.aod
 create mode 100644 neonView/KnowledgeManagementRole_view/KnowledgeManagementRole_view.aod
 create mode 100644 neonView/KnowledgeManagementTimeline_view/KnowledgeManagementTimeline_view.aod
 create mode 100644 neonView/KnowledgeNewsFeed_view/KnowledgeNewsFeed_view.aod
 create mode 100644 neonView/KnowledgeRoleEdit_view/KnowledgeRoleEdit_view.aod
 create mode 100644 neonView/KnowledgeTagList_GenMult_view/KnowledgeTagList_GenMult_view.aod
 create mode 100644 neonView/KnowledgeTagList_view/KnowledgeTagList_view.aod
 create mode 100644 process/Html_lib/Html_lib.aod
 create mode 100644 process/Html_lib/process.js
 create mode 100644 process/KnowledgeManagement_lib/KnowledgeManagement_lib.aod
 create mode 100644 process/KnowledgeManagement_lib/process.js
 create mode 100644 process/NewsSystem_lib/NewsSystem_lib.aod
 create mode 100644 process/NewsSystem_lib/process.js

diff --git a/.liquibase/Data_alias/basic/Knowledgemanagement/changelog_knowledgeManagement.xml b/.liquibase/Data_alias/basic/Knowledgemanagement/changelog_knowledgeManagement.xml
new file mode 100644
index 00000000000..06a974df46b
--- /dev/null
+++ b/.liquibase/Data_alias/basic/Knowledgemanagement/changelog_knowledgeManagement.xml
@@ -0,0 +1,14 @@
+<?xml version="1.1" encoding="UTF-8" standalone="no"?>
+<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
+                   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd">
+    <include file="struct/knowledgeManagement_table.xml" relativeToChangelogFile="true" />  
+    <include file="struct/knowledgeTagModeration_table.xml" relativeToChangelogFile="true" />  
+    <include file="struct/knowledgeDiscussion_table.xml" relativeToChangelogFile="true" />  
+    <include file="struct/knowledgeGitInterface_table.xml" relativeToChangelogFile="true" />  
+    <include file="struct/knowledgeLink_table.xml" relativeToChangelogFile="true" /> 
+    <include file="data/knowledgeKeywords.xml" relativeToChangelogFile="true" />  
+    <include file="struct/create_KnowledgeRoles.xml" relativeToChangelogFile="true" />
+    <include file="struct/knowledgeTag_table.xml" relativeToChangelogFile="true" />
+    <include file="struct/knowledgeTagLink_table.xml" relativeToChangelogFile="true" />
+    <include file="data/knowledgeTag.xml" relativeToChangelogFile="true" />
+</databaseChangeLog>
diff --git a/.liquibase/Data_alias/basic/Knowledgemanagement/data/blobs/git.css b/.liquibase/Data_alias/basic/Knowledgemanagement/data/blobs/git.css
new file mode 100644
index 00000000000..cb1b3ff2ef3
--- /dev/null
+++ b/.liquibase/Data_alias/basic/Knowledgemanagement/data/blobs/git.css
@@ -0,0 +1,450 @@
+/* Asciidoctor default stylesheet | MIT License | http://asciidoctor.org */
+/* Uncomment @import statement below to use as custom stylesheet */
+/*@import "https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400,700";*/
+article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}
+audio,canvas,video{display:inline-block}
+audio:not([controls]){display:none;height:0}
+script{display:none!important}
+html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}
+a{background:transparent}
+a:focus{outline:thin dotted}
+a:active,a:hover{outline:0}
+h1{font-size:2em;margin:.67em 0}
+abbr[title]{border-bottom:1px dotted}
+b,strong{font-weight:bold}
+dfn{font-style:italic}
+hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}
+mark{background:#ff0;color:#000}
+code,kbd,pre,samp{font-family:monospace;font-size:1em}
+pre{white-space:pre-wrap}
+q{quotes:"\201C" "\201D" "\2018" "\2019"}
+small{font-size:80%}
+sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}
+sup{top:-.5em}
+sub{bottom:-.25em}
+img{border:0}
+svg:not(:root){overflow:hidden}
+figure{margin:0}
+fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}
+legend{border:0;padding:0}
+button,input,select,textarea{font-family:inherit;font-size:100%;margin:0}
+button,input{line-height:normal}
+button,select{text-transform:none}
+button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}
+button[disabled],html input[disabled]{cursor:default}
+input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}
+button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}
+textarea{overflow:auto;vertical-align:top}
+table{border-collapse:collapse;border-spacing:0}
+*,*::before,*::after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}
+html,body{font-size:100%}
+body{background:#fff;color:rgba(0,0,0,.8);padding:0;margin:0;font-family:"Noto Serif","DejaVu Serif",serif;font-weight:400;font-style:normal;line-height:1;position:relative;cursor:auto;tab-size:4;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased}
+a:hover{cursor:pointer}
+img,object,embed{max-width:100%;height:auto}
+object,embed{height:100%}
+img{-ms-interpolation-mode:bicubic}
+.left{float:left!important}
+.right{float:right!important}
+.text-left{text-align:left!important}
+.text-right{text-align:right!important}
+.text-center{text-align:center!important}
+.text-justify{text-align:justify!important}
+.hide{display:none}
+img,object,svg{display:inline-block;vertical-align:middle}
+textarea{height:auto;min-height:50px}
+select{width:100%}
+.center{margin-left:auto;margin-right:auto}
+.stretch{width:100%}
+.subheader,.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{line-height:1.45;color:#7a2518;font-weight:400;margin-top:0;margin-bottom:.25em}
+div,dl,dt,dd,ul,ol,li,h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6,pre,form,p,blockquote,th,td{margin:0;padding:0;direction:ltr}
+a{color:#2156a5;text-decoration:underline;line-height:inherit}
+a:hover,a:focus{color:#1d4b8f}
+a img{border:none}
+p{font-family:inherit;font-weight:400;font-size:1em;line-height:1.6;margin-bottom:1.25em;text-rendering:optimizeLegibility}
+p aside{font-size:.875em;line-height:1.35;font-style:italic}
+h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{font-family:"Open Sans","DejaVu Sans",sans-serif;font-weight:300;font-style:normal;color:#ba3925;text-rendering:optimizeLegibility;margin-top:1em;margin-bottom:.5em;line-height:1.0125em}
+h1 small,h2 small,h3 small,#toctitle small,.sidebarblock>.content>.title small,h4 small,h5 small,h6 small{font-size:60%;color:#e99b8f;line-height:0}
+h1{font-size:2.125em}
+h2{font-size:1.6875em}
+h3,#toctitle,.sidebarblock>.content>.title{font-size:1.375em}
+h4,h5{font-size:1.125em}
+h6{font-size:1em}
+hr{border:solid #ddddd8;border-width:1px 0 0;clear:both;margin:1.25em 0 1.1875em;height:0}
+em,i{font-style:italic;line-height:inherit}
+strong,b{font-weight:bold;line-height:inherit}
+small{font-size:60%;line-height:inherit}
+code{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;font-weight:400;color:rgba(0,0,0,.9)}
+ul,ol,dl{font-size:1em;line-height:1.6;margin-bottom:1.25em;list-style-position:outside;font-family:inherit}
+ul,ol{margin-left:1.5em}
+ul li ul,ul li ol{margin-left:1.25em;margin-bottom:0;font-size:1em}
+ul.square li ul,ul.circle li ul,ul.disc li ul{list-style:inherit}
+ul.square{list-style-type:square}
+ul.circle{list-style-type:circle}
+ul.disc{list-style-type:disc}
+ol li ul,ol li ol{margin-left:1.25em;margin-bottom:0}
+dl dt{margin-bottom:.3125em;font-weight:bold}
+dl dd{margin-bottom:1.25em}
+abbr,acronym{text-transform:uppercase;font-size:90%;color:rgba(0,0,0,.8);border-bottom:1px dotted #ddd;cursor:help}
+abbr{text-transform:none}
+blockquote{margin:0 0 1.25em;padding:.5625em 1.25em 0 1.1875em;border-left:1px solid #ddd}
+blockquote cite{display:block;font-size:.9375em;color:rgba(0,0,0,.6)}
+blockquote cite::before{content:"\2014 \0020"}
+blockquote cite a,blockquote cite a:visited{color:rgba(0,0,0,.6)}
+blockquote,blockquote p{line-height:1.6;color:rgba(0,0,0,.85)}
+@media screen and (min-width:768px){h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2}
+h1{font-size:2.75em}
+h2{font-size:2.3125em}
+h3,#toctitle,.sidebarblock>.content>.title{font-size:1.6875em}
+h4{font-size:1.4375em}}
+table{background:#fff;margin-bottom:1.25em;border:solid 1px #dedede}
+table thead,table tfoot{background:#f7f8f7}
+table thead tr th,table thead tr td,table tfoot tr th,table tfoot tr td{padding:.5em .625em .625em;font-size:inherit;color:rgba(0,0,0,.8);text-align:left}
+table tr th,table tr td{padding:.5625em .625em;font-size:inherit;color:rgba(0,0,0,.8)}
+table tr.even,table tr.alt,table tr:nth-of-type(even){background:#f8f8f7}
+table thead tr th,table tfoot tr th,table tbody tr td,table tr td,table tfoot tr td{display:table-cell;line-height:1.6}
+h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2;word-spacing:-.05em}
+h1 strong,h2 strong,h3 strong,#toctitle strong,.sidebarblock>.content>.title strong,h4 strong,h5 strong,h6 strong{font-weight:400}
+.clearfix::before,.clearfix::after,.float-group::before,.float-group::after{content:" ";display:table}
+.clearfix::after,.float-group::after{clear:both}
+*:not(pre)>code{font-size:.9375em;font-style:normal!important;letter-spacing:0;padding:.1em .5ex;word-spacing:-.15em;background-color:#f7f7f8;-webkit-border-radius:4px;border-radius:4px;line-height:1.45;text-rendering:optimizeSpeed;word-wrap:break-word}
+*:not(pre)>code.nobreak{word-wrap:normal}
+*:not(pre)>code.nowrap{white-space:nowrap}
+pre,pre>code{line-height:1.45;color:rgba(0,0,0,.9);font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;font-weight:400;text-rendering:optimizeSpeed}
+em em{font-style:normal}
+strong strong{font-weight:400}
+.keyseq{color:rgba(51,51,51,.8)}
+kbd{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;display:inline-block;color:rgba(0,0,0,.8);font-size:.65em;line-height:1.45;background-color:#f7f7f7;border:1px solid #ccc;-webkit-border-radius:3px;border-radius:3px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,.2),0 0 0 .1em white inset;box-shadow:0 1px 0 rgba(0,0,0,.2),0 0 0 .1em #fff inset;margin:0 .15em;padding:.2em .5em;vertical-align:middle;position:relative;top:-.1em;white-space:nowrap}
+.keyseq kbd:first-child{margin-left:0}
+.keyseq kbd:last-child{margin-right:0}
+.menuseq,.menuref{color:#000}
+.menuseq b:not(.caret),.menuref{font-weight:inherit}
+.menuseq{word-spacing:-.02em}
+.menuseq b.caret{font-size:1.25em;line-height:.8}
+.menuseq i.caret{font-weight:bold;text-align:center;width:.45em}
+b.button::before,b.button::after{position:relative;top:-1px;font-weight:400}
+b.button::before{content:"[";padding:0 3px 0 2px}
+b.button::after{content:"]";padding:0 2px 0 3px}
+p a>code:hover{color:rgba(0,0,0,.9)}
+#header,#content,#footnotes,#footer{width:100%;margin-left:auto;margin-right:auto;margin-top:0;margin-bottom:0;/*max-width:62.5em;*/*zoom:1;position:relative;padding-left:.9375em;padding-right:.9375em}
+#header::before,#header::after,#content::before,#content::after,#footnotes::before,#footnotes::after,#footer::before,#footer::after{content:" ";display:table}
+#header::after,#content::after,#footnotes::after,#footer::after{clear:both}
+#content{margin-top:1.25em}
+#content::before{content:none}
+#header>h1:first-child{color:rgba(0,0,0,.85);margin-top:2.25rem;margin-bottom:0}
+#header>h1:first-child+#toc{margin-top:8px;border-top:1px solid #ddddd8}
+#header>h1:only-child,body.toc2 #header>h1:nth-last-child(2){border-bottom:1px solid #ddddd8;padding-bottom:8px}
+#header .details{border-bottom:1px solid #ddddd8;line-height:1.45;padding-top:.25em;padding-bottom:.25em;padding-left:.25em;color:rgba(0,0,0,.6);display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-flow:row wrap;-webkit-flex-flow:row wrap;flex-flow:row wrap}
+#header .details span:first-child{margin-left:-.125em}
+#header .details span.email a{color:rgba(0,0,0,.85)}
+#header .details br{display:none}
+#header .details br+span::before{content:"\00a0\2013\00a0"}
+#header .details br+span.author::before{content:"\00a0\22c5\00a0";color:rgba(0,0,0,.85)}
+#header .details br+span#revremark::before{content:"\00a0|\00a0"}
+#header #revnumber{text-transform:capitalize}
+#header #revnumber::after{content:"\00a0"}
+#content>h1:first-child:not([class]){color:rgba(0,0,0,.85);border-bottom:1px solid #ddddd8;padding-bottom:8px;margin-top:0;padding-top:1rem;margin-bottom:1.25rem}
+#toc{border-bottom:1px solid #efefed;padding-bottom:.5em}
+#toc>ul{margin-left:.125em}
+#toc ul.sectlevel0>li>a{font-style:italic}
+#toc ul.sectlevel0 ul.sectlevel1{margin:.5em 0}
+#toc ul{font-family:"Open Sans","DejaVu Sans",sans-serif;list-style-type:none}
+#toc li{line-height:1.3334;margin-top:.3334em}
+#toc a{text-decoration:none}
+#toc a:active{text-decoration:underline}
+#toctitle{color:#7a2518;font-size:1.2em}
+@media screen and (min-width:768px){#toctitle{font-size:1.375em}
+body.toc2{padding-left:15em;padding-right:0}
+#toc.toc2{margin-top:0!important;background-color:#f8f8f7;position:fixed;width:15em;left:0;top:0;border-right:1px solid #efefed;border-top-width:0!important;border-bottom-width:0!important;z-index:1000;padding:1.25em 1em;height:100%;overflow:auto}
+#toc.toc2 #toctitle{margin-top:0;margin-bottom:.8rem;font-size:1.2em}
+#toc.toc2>ul{font-size:.9em;margin-bottom:0}
+#toc.toc2 ul ul{margin-left:0;padding-left:1em}
+#toc.toc2 ul.sectlevel0 ul.sectlevel1{padding-left:0;margin-top:.5em;margin-bottom:.5em}
+body.toc2.toc-right{padding-left:0;padding-right:15em}
+body.toc2.toc-right #toc.toc2{border-right-width:0;border-left:1px solid #efefed;left:auto;right:0}}
+@media screen and (min-width:1280px){body.toc2{padding-left:20em;padding-right:0}
+#toc.toc2{width:20em}
+#toc.toc2 #toctitle{font-size:1.375em}
+#toc.toc2>ul{font-size:.95em}
+#toc.toc2 ul ul{padding-left:1.25em}
+body.toc2.toc-right{padding-left:0;padding-right:20em}}
+#content #toc{border-style:solid;border-width:1px;border-color:#e0e0dc;margin-bottom:1.25em;padding:1.25em;background:#f8f8f7;-webkit-border-radius:4px;border-radius:4px}
+#content #toc>:first-child{margin-top:0}
+#content #toc>:last-child{margin-bottom:0}
+#footer{max-width:100%;background-color:rgba(0,0,0,.8);padding:1.25em}
+#footer-text{color:rgba(255,255,255,.8);line-height:1.44}
+#content{margin-bottom:.625em}
+.sect1{padding-bottom:.625em}
+@media screen and (min-width:768px){#content{margin-bottom:1.25em}
+.sect1{padding-bottom:1.25em}}
+.sect1:last-child{padding-bottom:0}
+.sect1+.sect1{border-top:1px solid #efefed}
+#content h1>a.anchor,h2>a.anchor,h3>a.anchor,#toctitle>a.anchor,.sidebarblock>.content>.title>a.anchor,h4>a.anchor,h5>a.anchor,h6>a.anchor{position:absolute;z-index:1001;width:1.5ex;margin-left:-1.5ex;display:block;text-decoration:none!important;visibility:hidden;text-align:center;font-weight:400}
+#content h1>a.anchor::before,h2>a.anchor::before,h3>a.anchor::before,#toctitle>a.anchor::before,.sidebarblock>.content>.title>a.anchor::before,h4>a.anchor::before,h5>a.anchor::before,h6>a.anchor::before{content:"\00A7";font-size:.85em;display:block;padding-top:.1em}
+#content h1:hover>a.anchor,#content h1>a.anchor:hover,h2:hover>a.anchor,h2>a.anchor:hover,h3:hover>a.anchor,#toctitle:hover>a.anchor,.sidebarblock>.content>.title:hover>a.anchor,h3>a.anchor:hover,#toctitle>a.anchor:hover,.sidebarblock>.content>.title>a.anchor:hover,h4:hover>a.anchor,h4>a.anchor:hover,h5:hover>a.anchor,h5>a.anchor:hover,h6:hover>a.anchor,h6>a.anchor:hover{visibility:visible}
+#content h1>a.link,h2>a.link,h3>a.link,#toctitle>a.link,.sidebarblock>.content>.title>a.link,h4>a.link,h5>a.link,h6>a.link{color:#ba3925;text-decoration:none}
+#content h1>a.link:hover,h2>a.link:hover,h3>a.link:hover,#toctitle>a.link:hover,.sidebarblock>.content>.title>a.link:hover,h4>a.link:hover,h5>a.link:hover,h6>a.link:hover{color:#a53221}
+.audioblock,.imageblock,.literalblock,.listingblock,.stemblock,.videoblock{margin-bottom:1.25em}
+.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{text-rendering:optimizeLegibility;text-align:left;font-family:"Noto Serif","DejaVu Serif",serif;font-size:1rem;font-style:italic}
+table.tableblock.fit-content>caption.title{white-space:nowrap;width:0}
+.paragraph.lead>p,#preamble>.sectionbody>[class="paragraph"]:first-of-type p{font-size:1.21875em;line-height:1.6;color:rgba(0,0,0,.85)}
+table.tableblock #preamble>.sectionbody>[class="paragraph"]:first-of-type p{font-size:inherit}
+.admonitionblock>table{border-collapse:separate;border:0;background:none;width:100%}
+.admonitionblock>table td.icon{text-align:center;width:80px}
+.admonitionblock>table td.icon img{max-width:none}
+.admonitionblock>table td.icon .title{font-weight:bold;font-family:"Open Sans","DejaVu Sans",sans-serif;text-transform:uppercase}
+.admonitionblock>table td.content{padding-left:1.125em;padding-right:1.25em;border-left:1px solid #ddddd8;color:rgba(0,0,0,.6)}
+.admonitionblock>table td.content>:last-child>:last-child{margin-bottom:0}
+.exampleblock>.content{border-style:solid;border-width:1px;border-color:#e6e6e6;margin-bottom:1.25em;padding:1.25em;background:#fff;-webkit-border-radius:4px;border-radius:4px}
+.exampleblock>.content>:first-child{margin-top:0}
+.exampleblock>.content>:last-child{margin-bottom:0}
+.sidebarblock{border-style:solid;border-width:1px;border-color:#e0e0dc;margin-bottom:1.25em;padding:1.25em;background:#f8f8f7;-webkit-border-radius:4px;border-radius:4px}
+.sidebarblock>:first-child{margin-top:0}
+.sidebarblock>:last-child{margin-bottom:0}
+.sidebarblock>.content>.title{color:#7a2518;margin-top:0;text-align:center}
+.exampleblock>.content>:last-child>:last-child,.exampleblock>.content .olist>ol>li:last-child>:last-child,.exampleblock>.content .ulist>ul>li:last-child>:last-child,.exampleblock>.content .qlist>ol>li:last-child>:last-child,.sidebarblock>.content>:last-child>:last-child,.sidebarblock>.content .olist>ol>li:last-child>:last-child,.sidebarblock>.content .ulist>ul>li:last-child>:last-child,.sidebarblock>.content .qlist>ol>li:last-child>:last-child{margin-bottom:0}
+.literalblock pre,.listingblock pre:not(.highlight),.listingblock pre[class="highlight"],.listingblock pre[class^="highlight "],.listingblock pre.CodeRay,.listingblock pre.prettyprint{background:#f7f7f8}
+.sidebarblock .literalblock pre,.sidebarblock .listingblock pre:not(.highlight),.sidebarblock .listingblock pre[class="highlight"],.sidebarblock .listingblock pre[class^="highlight "],.sidebarblock .listingblock pre.CodeRay,.sidebarblock .listingblock pre.prettyprint{background:#f2f1f1}
+.literalblock pre,.literalblock pre[class],.listingblock pre,.listingblock pre[class]{-webkit-border-radius:4px;border-radius:4px;word-wrap:break-word;padding:1em;font-size:.8125em}
+.literalblock pre.nowrap,.literalblock pre[class].nowrap,.listingblock pre.nowrap,.listingblock pre[class].nowrap{overflow-x:auto;white-space:pre;word-wrap:normal}
+@media screen and (min-width:768px){.literalblock pre,.literalblock pre[class],.listingblock pre,.listingblock pre[class]{font-size:.90625em}}
+@media screen and (min-width:1280px){.literalblock pre,.literalblock pre[class],.listingblock pre,.listingblock pre[class]{font-size:1em}}
+.literalblock.output pre{color:#f7f7f8;background-color:rgba(0,0,0,.9)}
+.listingblock pre.highlightjs{padding:0}
+.listingblock pre.highlightjs>code{padding:1em;-webkit-border-radius:4px;border-radius:4px}
+.listingblock pre.prettyprint{border-width:0}
+.listingblock>.content{position:relative}
+.listingblock code[data-lang]::before{display:none;content:attr(data-lang);position:absolute;font-size:.75em;top:.425rem;right:.5rem;line-height:1;text-transform:uppercase;color:#999}
+.listingblock:hover code[data-lang]::before{display:block}
+.listingblock.terminal pre .command::before{content:attr(data-prompt);padding-right:.5em;color:#999}
+.listingblock.terminal pre .command:not([data-prompt])::before{content:"$"}
+table.pyhltable{border-collapse:separate;border:0;margin-bottom:0;background:none}
+table.pyhltable td{vertical-align:top;padding-top:0;padding-bottom:0;line-height:1.45}
+table.pyhltable td.code{padding-left:.75em;padding-right:0}
+pre.pygments .lineno,table.pyhltable td:not(.code){color:#999;padding-left:0;padding-right:.5em;border-right:1px solid #ddddd8}
+pre.pygments .lineno{display:inline-block;margin-right:.25em}
+table.pyhltable .linenodiv{background:none!important;padding-right:0!important}
+.quoteblock{margin:0 1em 1.25em 1.5em;display:table}
+.quoteblock>.title{margin-left:-1.5em;margin-bottom:.75em}
+.quoteblock blockquote,.quoteblock blockquote p{color:rgba(0,0,0,.85);font-size:1.15rem;line-height:1.75;word-spacing:.1em;letter-spacing:0;font-style:italic;text-align:justify}
+.quoteblock blockquote{margin:0;padding:0;border:0}
+.quoteblock blockquote::before{content:"\201c";float:left;font-size:2.75em;font-weight:bold;line-height:.6em;margin-left:-.6em;color:#7a2518;text-shadow:0 1px 2px rgba(0,0,0,.1)}
+.quoteblock blockquote>.paragraph:last-child p{margin-bottom:0}
+.quoteblock .attribution{margin-top:.5em;margin-right:.5ex;text-align:right}
+.quoteblock .quoteblock{margin-left:0;margin-right:0;padding:.5em 0;border-left:3px solid rgba(0,0,0,.6)}
+.quoteblock .quoteblock blockquote{padding:0 0 0 .75em}
+.quoteblock .quoteblock blockquote::before{display:none}
+.verseblock{margin:0 1em 1.25em}
+.verseblock pre{font-family:"Open Sans","DejaVu Sans",sans;font-size:1.15rem;color:rgba(0,0,0,.85);font-weight:300;text-rendering:optimizeLegibility}
+.verseblock pre strong{font-weight:400}
+.verseblock .attribution{margin-top:1.25rem;margin-left:.5ex}
+.quoteblock .attribution,.verseblock .attribution{font-size:.9375em;line-height:1.45;font-style:italic}
+.quoteblock .attribution br,.verseblock .attribution br{display:none}
+.quoteblock .attribution cite,.verseblock .attribution cite{display:block;letter-spacing:-.025em;color:rgba(0,0,0,.6)}
+.quoteblock.abstract{margin:0 1em 1.25em;display:block}
+.quoteblock.abstract>.title{margin:0 0 .375em;font-size:1.15em;text-align:center}
+.quoteblock.abstract blockquote,.quoteblock.abstract blockquote p{word-spacing:0;line-height:1.6}
+.quoteblock.abstract blockquote::before,.quoteblock.abstract p::before{display:none}
+table.tableblock{max-width:100%;border-collapse:separate}
+p.tableblock:last-child{margin-bottom:0}
+td.tableblock>.content{margin-bottom:-1.25em}
+table.tableblock,th.tableblock,td.tableblock{border:0 solid #dedede}
+table.grid-all>thead>tr>.tableblock,table.grid-all>tbody>tr>.tableblock{border-width:0 1px 1px 0}
+table.grid-all>tfoot>tr>.tableblock{border-width:1px 1px 0 0}
+table.grid-cols>*>tr>.tableblock{border-width:0 1px 0 0}
+table.grid-rows>thead>tr>.tableblock,table.grid-rows>tbody>tr>.tableblock{border-width:0 0 1px}
+table.grid-rows>tfoot>tr>.tableblock{border-width:1px 0 0}
+table.grid-all>*>tr>.tableblock:last-child,table.grid-cols>*>tr>.tableblock:last-child{border-right-width:0}
+table.grid-all>tbody>tr:last-child>.tableblock,table.grid-all>thead:last-child>tr>.tableblock,table.grid-rows>tbody>tr:last-child>.tableblock,table.grid-rows>thead:last-child>tr>.tableblock{border-bottom-width:0}
+table.frame-all{border-width:1px}
+table.frame-sides{border-width:0 1px}
+table.frame-topbot,table.frame-ends{border-width:1px 0}
+table.stripes-all tr,table.stripes-odd tr:nth-of-type(odd){background:#f8f8f7}
+table.stripes-none tr,table.stripes-odd tr:nth-of-type(even){background:none}
+th.halign-left,td.halign-left{text-align:left}
+th.halign-right,td.halign-right{text-align:right}
+th.halign-center,td.halign-center{text-align:center}
+th.valign-top,td.valign-top{vertical-align:top}
+th.valign-bottom,td.valign-bottom{vertical-align:bottom}
+th.valign-middle,td.valign-middle{vertical-align:middle}
+table thead th,table tfoot th{font-weight:bold}
+tbody tr th{display:table-cell;line-height:1.6;background:#f7f8f7}
+tbody tr th,tbody tr th p,tfoot tr th,tfoot tr th p{color:rgba(0,0,0,.8);font-weight:bold}
+p.tableblock>code:only-child{background:none;padding:0}
+p.tableblock{font-size:1em}
+td>div.verse{white-space:pre}
+ol{margin-left:1.75em}
+ul li ol{margin-left:1.5em}
+dl dd{margin-left:1.125em}
+dl dd:last-child,dl dd:last-child>:last-child{margin-bottom:0}
+ol>li p,ul>li p,ul dd,ol dd,.olist .olist,.ulist .ulist,.ulist .olist,.olist .ulist{margin-bottom:.625em}
+ul.checklist,ul.none,ol.none,ul.no-bullet,ol.no-bullet,ol.unnumbered,ul.unstyled,ol.unstyled{list-style-type:none}
+ul.no-bullet,ol.no-bullet,ol.unnumbered{margin-left:.625em}
+ul.unstyled,ol.unstyled{margin-left:0}
+ul.checklist{margin-left:.625em}
+ul.checklist li>p:first-child>.fa-square-o:first-child,ul.checklist li>p:first-child>.fa-check-square-o:first-child{width:1.25em;font-size:.8em;position:relative;bottom:.125em}
+ul.checklist li>p:first-child>input[type="checkbox"]:first-child{margin-right:.25em}
+ul.inline{display:-ms-flexbox;display:-webkit-box;display:flex;-ms-flex-flow:row wrap;-webkit-flex-flow:row wrap;flex-flow:row wrap;list-style:none;margin:0 0 .625em -1.25em}
+ul.inline>li{margin-left:1.25em}
+.unstyled dl dt{font-weight:400;font-style:normal}
+ol.arabic{list-style-type:decimal}
+ol.decimal{list-style-type:decimal-leading-zero}
+ol.loweralpha{list-style-type:lower-alpha}
+ol.upperalpha{list-style-type:upper-alpha}
+ol.lowerroman{list-style-type:lower-roman}
+ol.upperroman{list-style-type:upper-roman}
+ol.lowergreek{list-style-type:lower-greek}
+.hdlist>table,.colist>table{border:0;background:none}
+.hdlist>table>tbody>tr,.colist>table>tbody>tr{background:none}
+td.hdlist1,td.hdlist2{vertical-align:top;padding:0 .625em}
+td.hdlist1{font-weight:bold;padding-bottom:1.25em}
+.literalblock+.colist,.listingblock+.colist{margin-top:-.5em}
+.colist td:not([class]):first-child{padding:.4em .75em 0;line-height:1;vertical-align:top}
+.colist td:not([class]):first-child img{max-width:none}
+.colist td:not([class]):last-child{padding:.25em 0}
+.thumb,.th{line-height:0;display:inline-block;border:solid 4px #fff;-webkit-box-shadow:0 0 0 1px #ddd;box-shadow:0 0 0 1px #ddd}
+.imageblock.left,.imageblock[style*="float: left"]{margin:.25em .625em 1.25em 0}
+.imageblock.right,.imageblock[style*="float: right"]{margin:.25em 0 1.25em .625em}
+.imageblock>.title{margin-bottom:0}
+.imageblock.thumb,.imageblock.th{border-width:6px}
+.imageblock.thumb>.title,.imageblock.th>.title{padding:0 .125em}
+.image.left,.image.right{margin-top:.25em;margin-bottom:.25em;display:inline-block;line-height:0}
+.image.left{margin-right:.625em}
+.image.right{margin-left:.625em}
+a.image{text-decoration:none;display:inline-block}
+a.image object{pointer-events:none}
+sup.footnote,sup.footnoteref{font-size:.875em;position:static;vertical-align:super}
+sup.footnote a,sup.footnoteref a{text-decoration:none}
+sup.footnote a:active,sup.footnoteref a:active{text-decoration:underline}
+#footnotes{padding-top:.75em;padding-bottom:.75em;margin-bottom:.625em}
+#footnotes hr{width:20%;min-width:6.25em;margin:-.25em 0 .75em;border-width:1px 0 0}
+#footnotes .footnote{padding:0 .375em 0 .225em;line-height:1.3334;font-size:.875em;margin-left:1.2em;margin-bottom:.2em}
+#footnotes .footnote a:first-of-type{font-weight:bold;text-decoration:none;margin-left:-1.05em}
+#footnotes .footnote:last-of-type{margin-bottom:0}
+#content #footnotes{margin-top:-.625em;margin-bottom:0;padding:.75em 0}
+.gist .file-data>table{border:0;background:#fff;width:100%;margin-bottom:0}
+.gist .file-data>table td.line-data{width:99%}
+div.unbreakable{page-break-inside:avoid}
+.big{font-size:larger}
+.small{font-size:smaller}
+.underline{text-decoration:underline}
+.overline{text-decoration:overline}
+.line-through{text-decoration:line-through}
+.aqua{color:#00bfbf}
+.aqua-background{background-color:#00fafa}
+.black{color:#000}
+.black-background{background-color:#000}
+.blue{color:#0000bf}
+.blue-background{background-color:#0000fa}
+.fuchsia{color:#bf00bf}
+.fuchsia-background{background-color:#fa00fa}
+.gray{color:#606060}
+.gray-background{background-color:#7d7d7d}
+.green{color:#006000}
+.green-background{background-color:#007d00}
+.lime{color:#00bf00}
+.lime-background{background-color:#00fa00}
+.maroon{color:#600000}
+.maroon-background{background-color:#7d0000}
+.navy{color:#000060}
+.navy-background{background-color:#00007d}
+.olive{color:#606000}
+.olive-background{background-color:#7d7d00}
+.purple{color:#600060}
+.purple-background{background-color:#7d007d}
+.red{color:#bf0000}
+.red-background{background-color:#fa0000}
+.silver{color:#909090}
+.silver-background{background-color:#bcbcbc}
+.teal{color:#006060}
+.teal-background{background-color:#007d7d}
+.white{color:#bfbfbf}
+.white-background{background-color:#fafafa}
+.yellow{color:#bfbf00}
+.yellow-background{background-color:#fafa00}
+span.icon>.fa{cursor:default}
+a span.icon>.fa{cursor:inherit}
+.admonitionblock td.icon [class^="fa icon-"]{font-size:2.5em;text-shadow:1px 1px 2px rgba(0,0,0,.5);cursor:default}
+.admonitionblock td.icon .icon-note::before{content:"\f05a";color:#19407c}
+.admonitionblock td.icon .icon-tip::before{content:"\f0eb";text-shadow:1px 1px 2px rgba(155,155,0,.8);color:#111}
+.admonitionblock td.icon .icon-warning::before{content:"\f071";color:#bf6900}
+.admonitionblock td.icon .icon-caution::before{content:"\f06d";color:#bf3400}
+.admonitionblock td.icon .icon-important::before{content:"\f06a";color:#bf0000}
+.conum[data-value]{display:inline-block;color:#fff!important;background-color:rgba(0,0,0,.8);-webkit-border-radius:100px;border-radius:100px;text-align:center;font-size:.75em;width:1.67em;height:1.67em;line-height:1.67em;font-family:"Open Sans","DejaVu Sans",sans-serif;font-style:normal;font-weight:bold}
+.conum[data-value] *{color:#fff!important}
+.conum[data-value]+b{display:none}
+.conum[data-value]::after{content:attr(data-value)}
+pre .conum[data-value]{position:relative;top:-.125em}
+b.conum *{color:inherit!important}
+.conum:not([data-value]):empty{display:none}
+dt,th.tableblock,td.content,div.footnote{text-rendering:optimizeLegibility}
+h1,h2,p,td.content,span.alt{letter-spacing:-.01em}
+p strong,td.content strong,div.footnote strong{letter-spacing:-.005em}
+p,blockquote,dt,td.content,span.alt{font-size:1.0625rem}
+p{margin-bottom:1.25rem}
+.sidebarblock p,.sidebarblock dt,.sidebarblock td.content,p.tableblock{font-size:1em}
+.exampleblock>.content{background-color:#fffef7;border-color:#e0e0dc;-webkit-box-shadow:0 1px 4px #e0e0dc;box-shadow:0 1px 4px #e0e0dc}
+.print-only{display:none!important}
+@page{margin:1.25cm .75cm}
+@media print{*{-webkit-box-shadow:none!important;box-shadow:none!important;text-shadow:none!important}
+html{font-size:80%}
+a{color:inherit!important;text-decoration:underline!important}
+a.bare,a[href^="#"],a[href^="mailto:"]{text-decoration:none!important}
+a[href^="http:"]:not(.bare)::after,a[href^="https:"]:not(.bare)::after{content:"(" attr(href) ")";display:inline-block;font-size:.875em;padding-left:.25em}
+abbr[title]::after{content:" (" attr(title) ")"}
+pre,blockquote,tr,img,object,svg{page-break-inside:avoid}
+thead{display:table-header-group}
+svg{max-width:100%}
+p,blockquote,dt,td.content{font-size:1em;orphans:3;widows:3}
+h2,h3,#toctitle,.sidebarblock>.content>.title{page-break-after:avoid}
+#toc,.sidebarblock,.exampleblock>.content{background:none!important}
+#toc{border-bottom:1px solid #ddddd8!important;padding-bottom:0!important}
+body.book #header{text-align:center}
+body.book #header>h1:first-child{border:0!important;margin:2.5em 0 1em}
+body.book #header .details{border:0!important;display:block;padding:0!important}
+body.book #header .details span:first-child{margin-left:0!important}
+body.book #header .details br{display:block}
+body.book #header .details br+span::before{content:none!important}
+body.book #toc{border:0!important;text-align:left!important;padding:0!important;margin:0!important}
+body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-break-before:always}
+.listingblock code[data-lang]::before{display:block}
+#footer{padding:0 .9375em}
+.hide-on-print{display:none!important}
+.print-only{display:block!important}
+.hide-for-print{display:none!important}
+.show-for-print{display:inherit!important}}
+@media print,amzn-kf8{#header>h1:first-child{margin-top:1.25rem}
+.sect1{padding:0!important}
+.sect1+.sect1{border:0}
+#footer{background:none}
+#footer-text{color:rgba(0,0,0,.6);font-size:.9em}}
+@media amzn-kf8{#header,#content,#footnotes,#footer{padding:0}}
+
+.topcorner {
+font-family: Calibri, Verdana;
+font-size: 16px;
+float:right;
+top:100px;
+right: 100px;
+width: 300px;
+height: auto;
+background-color: #EBEBEB;
+border-width: 1px;
+border-color: #666666;
+border-style: dotted;
+padding: 3px;
+box-shadow: 3px 3px 7px #AAAAAA;
+}
+
+.topcorner p {
+	font-family:inherit;font-weight:400;font-size:1em;text-rendering:optimizeLegibility
+}
+
+.stitletext {
+/*font-family: Calibri, Verdana;*/
+color:#ba3925;
+font-size: 30px;
+padding-top: 4px;
+padding-bottom: 4px;
+border-bottom: medium solid #000000;
+font-weight: bold;
+}
\ No newline at end of file
diff --git a/.liquibase/Data_alias/basic/Knowledgemanagement/data/blobs/standard.css b/.liquibase/Data_alias/basic/Knowledgemanagement/data/blobs/standard.css
new file mode 100644
index 00000000000..3ca3c40a41e
--- /dev/null
+++ b/.liquibase/Data_alias/basic/Knowledgemanagement/data/blobs/standard.css
@@ -0,0 +1,138 @@
+h1 {
+font-family: Calibri, Verdana;
+color: #E60048;
+font-size: 25px;
+}
+
+h2 {
+font-family: Calibri, Verdana;
+color: #E60048;
+font-size: 20px;
+}
+
+h3 {
+font-family: Calibri, Verdana;
+font-style: italic;
+color: #E60048;
+font-size: 20px;
+}
+
+h4 {
+font-family: Calibri, Verdana;
+font-style: italic;
+color: #0095B8;
+font-size: 20px;
+}
+
+div {
+font-family: Calibri, Verdana;
+color: #000000;
+font-size: 16px;
+}
+
+p {
+font-family: Calibri, Verdana;
+color: #000000;
+font-size: 18px;
+}
+
+li {
+font-family: Calibri, Verdana;
+color: #000000;
+font-size: 18px;
+}
+
+hr {
+	border: 0;
+	height: 1px;
+	background-image: linear-gradient(to right, #22BBFF, #0095B8, #22BBFF);
+}
+
+table {
+	border-collapse: collapse;
+}
+
+tr:first-child {
+	background-color: #8EE1FF;
+}
+
+table, th, td {
+   border: 1px solid #0095B8;
+}
+
+.stitletext {
+font-family: Calibri, Verdana;
+font-size: 30px;
+padding-top: 4px;
+padding-bottom: 4px;
+color: #E60048;
+border-bottom: medium dotted #0095B8;
+font-weight: bold;
+}
+
+.proptext {
+font-family: Calibri, Verdana;
+font-size: 16px;
+padding-top: 2px;
+padding-bottom: 2px;
+color: #E60048;
+font-weight: bold;
+}
+
+.liketext {
+font-family: Calibri, Verdana;
+font-size: 18px;
+padding-top: 2px;
+padding-bottom: 2px;
+color: #e50047;
+font-weight: bold;
+}
+
+.hashtag {
+font-family: Calibri, Verdana;
+font-size: 12px;
+font-style: italic;
+color: #666666;
+}
+
+.personas {
+font-family: Calibri, Verdana;
+font-size: 12px;
+color: #666666;
+font-weight: bold;
+}
+
+.topcorner {
+font-family: Calibri, Verdana;
+font-size: 16px;
+float:right;
+top:100px;
+right: 100px;
+width: 300px;
+height: auto;
+background-color: #EBEBEB;
+border-width: 1px;
+border-color: #666666;
+border-style: dotted;
+padding: 3px;
+box-shadow: 3px 3px 7px #AAAAAA;
+}
+
+.amenub {
+color: #0095B8;
+text-decoration: underline;}
+
+.processDesc {
+float:left;
+}
+
+.mainDiv {
+	width:100%;
+	height:100%;
+}
+
+.businessProcess {
+	margin-top:30px;
+	width:100%;
+	height:100%;
+}
\ No newline at end of file
diff --git a/.liquibase/Data_alias/basic/Knowledgemanagement/data/knowledgeKeywords.xml b/.liquibase/Data_alias/basic/Knowledgemanagement/data/knowledgeKeywords.xml
new file mode 100644
index 00000000000..10bb6c90408
--- /dev/null
+++ b/.liquibase/Data_alias/basic/Knowledgemanagement/data/knowledgeKeywords.xml
@@ -0,0 +1,87 @@
+<?xml version="1.1" encoding="UTF-8" standalone="no"?>
+<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
+                   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd">
+    <changeSet author="e.pollinger" id="6c1bb89e-60db-4a50-ba77-c81a8ec82d2c">
+        <!-- KEYWORD ENTRIES ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
+        <!-- Keywords for discussion status -->
+        <insert tableName="AB_KEYWORD_ENTRY">
+            <column name="AB_KEYWORD_ENTRYID" value="DISCUSSIONACTIVE"/>
+            <column name="KEYID" value="ACTIVE"/>
+            <column name="TITLE" value="active"/>
+            <column name="CONTAINER" value="DiscussionStatus"/>
+            <column name="SORTING" valueNumeric="1"/>
+            <column name="ISACTIVE" valueNumeric="1"/>
+        </insert>
+        <insert tableName="AB_KEYWORD_ENTRY">
+            <column name="AB_KEYWORD_ENTRYID" value="DISCUSSIONCLOSED"/>
+            <column name="KEYID" value="CLOSED"/>
+            <column name="TITLE" value="closed"/>
+            <column name="CONTAINER" value="DiscussionStatus"/>
+            <column name="SORTING" valueNumeric="2"/>
+            <column name="ISACTIVE" valueNumeric="1"/>
+        </insert>
+        <!-- Keywords for knowledge type -->
+        <insert tableName="AB_KEYWORD_ENTRY">
+            <column name="AB_KEYWORD_ENTRYID" value="KNOWLEDGEBASE"/>
+            <column name="KEYID" value="KNOWLEDGEBASE"/>
+            <column name="TITLE" value="Knowledgebase"/>
+            <column name="CONTAINER" value="KnowledgeType"/>
+            <column name="SORTING" valueNumeric="1"/>
+            <column name="ISACTIVE" valueNumeric="1"/>
+        </insert>
+        <insert tableName="AB_KEYWORD_ENTRY">
+            <column name="AB_KEYWORD_ENTRYID" value="EDITORIAL"/>
+            <column name="KEYID" value="EDITORIAL"/>
+            <column name="TITLE" value="Editorial"/>
+            <column name="CONTAINER" value="KnowledgeType"/>
+            <column name="SORTING" valueNumeric="2"/>
+            <column name="ISACTIVE" valueNumeric="1"/>
+        </insert>
+        <!-- Keywords for publishing level -->
+        <insert tableName="AB_KEYWORD_ENTRY">
+            <column name="AB_KEYWORD_ENTRYID" value="INTERNAL"/>
+            <column name="KEYID" value="INTERNAL"/>
+            <column name="TITLE" value="Internal"/>
+            <column name="CONTAINER" value="KnowledgePublishLevel"/>
+            <column name="SORTING" valueNumeric="1"/>
+            <column name="ISACTIVE" valueNumeric="1"/>
+        </insert>
+        <insert tableName="AB_KEYWORD_ENTRY">
+            <column name="AB_KEYWORD_ENTRYID" value="PARTNER"/>
+            <column name="KEYID" value="PARTNER"/>
+            <column name="TITLE" value="Partner"/>
+            <column name="CONTAINER" value="KnowledgePublishLevel"/>
+            <column name="SORTING" valueNumeric="2"/>
+            <column name="ISACTIVE" valueNumeric="1"/>
+        </insert>
+        <insert tableName="AB_KEYWORD_ENTRY">
+            <column name="AB_KEYWORD_ENTRYID" value="PUBLIC"/>
+            <column name="KEYID" value="PUBLIC"/>
+            <column name="TITLE" value="Public"/>
+            <column name="CONTAINER" value="KnowledgePublishLevel"/>
+            <column name="SORTING" valueNumeric="3"/>
+            <column name="ISACTIVE" valueNumeric="1"/>
+        </insert>
+        <!-- KEYWORD ATTRIBUTES ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
+        <insert tableName="AB_KEYWORD_ATTRIBUTE">
+            <column name="AB_KEYWORD_ATTRIBUTEID" value="b03f93a2-3b87-4a98-b3f9-9ed2358abdfe"/>
+            <column name="NAME" value="contentCssStylesheet"/>
+            <column name="KIND" value="LONG_CHAR_VALUE"/>
+            <column name="CONTAINER" value="KnowledgeType"/>
+        </insert>
+        <!-- KEYWORD ATTRIBUTE RELATIONS ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
+        <!-- Knowledge type stylesheets-->
+        <insert tableName="AB_KEYWORD_ATTRIBUTERELATION">
+            <column name="AB_KEYWORD_ATTRIBUTERELATIONID" value="d65d9988-2a50-42ed-8235-e1073d7a035e"/>
+            <column name="AB_KEYWORD_ENTRY_ID" value="KNOWLEDGEBASE"/>
+            <column name="AB_KEYWORD_ATTRIBUTE_ID" value="b03f93a2-3b87-4a98-b3f9-9ed2358abdfe"/>
+            <column name="LONG_CHAR_VALUE" valueClobFile="blobs/standard.css"/>
+        </insert>
+        <insert tableName="AB_KEYWORD_ATTRIBUTERELATION">
+            <column name="AB_KEYWORD_ATTRIBUTERELATIONID" value="5c8293eb-2ea2-4de3-a4eb-40e1785c9785"/>
+            <column name="AB_KEYWORD_ENTRY_ID" value="EDITORIAL"/>
+            <column name="AB_KEYWORD_ATTRIBUTE_ID" value="b03f93a2-3b87-4a98-b3f9-9ed2358abdfe"/>
+            <column name="LONG_CHAR_VALUE" valueClobFile="blobs/git.css"/>
+        </insert>
+    </changeSet>
+</databaseChangeLog>
diff --git a/.liquibase/Data_alias/basic/Knowledgemanagement/data/knowledgeTag.xml b/.liquibase/Data_alias/basic/Knowledgemanagement/data/knowledgeTag.xml
new file mode 100644
index 00000000000..4a17a2ef636
--- /dev/null
+++ b/.liquibase/Data_alias/basic/Knowledgemanagement/data/knowledgeTag.xml
@@ -0,0 +1,10 @@
+<?xml version="1.1" encoding="UTF-8" standalone="no"?>
+<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
+                   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd">
+    <changeSet author="e.pollinger" id="9c1bb89e-60db-4a50-ba77-c81a8ec82d2c">
+        <insert tableName="KNOWLEDGETAG">
+            <column name="KNOWLEDGETAGID" value="9c1bb89e-60db-4a50-ba77-c81a8ec82d2c"/>
+            <column name="TAG" value="News"/>
+        </insert>
+    </changeSet>
+</databaseChangeLog>
diff --git a/.liquibase/Data_alias/basic/Knowledgemanagement/struct/create_KnowledgeRoles.xml b/.liquibase/Data_alias/basic/Knowledgemanagement/struct/create_KnowledgeRoles.xml
new file mode 100644
index 00000000000..7a44ef7aefa
--- /dev/null
+++ b/.liquibase/Data_alias/basic/Knowledgemanagement/struct/create_KnowledgeRoles.xml
@@ -0,0 +1,13 @@
+<?xml version="1.1" encoding="UTF-8" standalone="no"?>
+<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
+                   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd">
+    <changeSet author="f.adler" id="eea7595b-3908-449b-8976-6e822aa1923c">
+        <createTable tableName="KNOWLEDGEROLES">
+            <column name="KNOWLEDGEROLESID" type="CHAR(36)">
+                <constraints primaryKey="true" primaryKeyName="PK_KNOWLEDGEROLES_KNOWLEDGEROLESID"/>
+            </column>
+            <column name="KNOWLEDGEMANAGEMENT_ID" type="CHAR(36)"></column>
+            <column name="ROLENAME" type="VARCHAR(100)"/>
+        </createTable>
+    </changeSet>
+</databaseChangeLog>
diff --git a/.liquibase/Data_alias/basic/Knowledgemanagement/struct/knowledgeDiscussion_table.xml b/.liquibase/Data_alias/basic/Knowledgemanagement/struct/knowledgeDiscussion_table.xml
new file mode 100644
index 00000000000..c4b9698f688
--- /dev/null
+++ b/.liquibase/Data_alias/basic/Knowledgemanagement/struct/knowledgeDiscussion_table.xml
@@ -0,0 +1,20 @@
+<?xml version="1.1" encoding="UTF-8" standalone="no"?>
+<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
+                   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd">
+    <changeSet author="e.pollinger" id="1261195c-ffc1-4abb-a31f-0732823ee0cb">
+        <createTable tableName="KNOWLEDGEDISCUSSION">
+            <column name="KNOWLEDGEDISCUSSIONID" type="CHAR(36)">
+                <constraints primaryKey="true" primaryKeyName="PK_KNOWLEDGEDISCUSSION_KNOWLEDGEDISCUSSIONID"/>
+            </column>
+            <column name="KNOWLEDGEMANAGEMENT_ID" type="CHAR(36)"></column>
+            <column name="DATE_NEW" type="DATETIME2"/>
+            <column name="DATE_EDIT" type="DATETIME2"/>
+            <column name="USER_NEW" type="NVARCHAR(50)"/>
+            <column name="USER_EDIT" type="NVARCHAR(50)"/>
+            <column name="STATUS" type="VARCHAR(36)"/>
+            <column name="AUTHOR" type="NVARCHAR(50)"/>
+            <column name="DISCUSSIONTEXT" type="LONGTEXT"/>
+            <column name="PARENTENTRY" type="CHAR(36)"/>
+        </createTable>
+    </changeSet>
+</databaseChangeLog>
diff --git a/.liquibase/Data_alias/basic/Knowledgemanagement/struct/knowledgeGitInterface_table.xml b/.liquibase/Data_alias/basic/Knowledgemanagement/struct/knowledgeGitInterface_table.xml
new file mode 100644
index 00000000000..8440cd20fdf
--- /dev/null
+++ b/.liquibase/Data_alias/basic/Knowledgemanagement/struct/knowledgeGitInterface_table.xml
@@ -0,0 +1,17 @@
+<?xml version="1.1" encoding="UTF-8" standalone="no"?>
+<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
+                   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd">
+    <changeSet author="e.pollinger" id="9e24c875-c592-4839-94aa-3de4269b6fe7">
+        <createTable tableName="KNOWLEDGEGITINTERFACE">
+            <column name="KNOWLEDGEGITINTERFACEID" type="CHAR(36)">
+                <constraints primaryKey="true" primaryKeyName="PK_KNOWLEDGEGITINTERFACE_KNOWLEDGEGITINTERFACEID"/>
+            </column>
+            <column name="GITCOMMIT" type="NVARCHAR(200)"/>
+            <column name="SYSTEMNAME" type="NVARCHAR(50)"/>              
+            <column name="DATE_NEW" type="DATETIME2"/>
+            <column name="DATE_EDIT" type="DATETIME2"/>
+            <column name="USER_NEW" type="NVARCHAR(50)"/>
+            <column name="USER_EDIT" type="NVARCHAR(50)"/>
+        </createTable>
+    </changeSet>
+</databaseChangeLog>
diff --git a/.liquibase/Data_alias/basic/Knowledgemanagement/struct/knowledgeLink_table.xml b/.liquibase/Data_alias/basic/Knowledgemanagement/struct/knowledgeLink_table.xml
new file mode 100644
index 00000000000..cdf69919e23
--- /dev/null
+++ b/.liquibase/Data_alias/basic/Knowledgemanagement/struct/knowledgeLink_table.xml
@@ -0,0 +1,18 @@
+<?xml version="1.1" encoding="UTF-8" standalone="no"?>
+<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
+                   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd">
+    <changeSet author="e.pollinger" id="1261195c-ffc1-4abb-a31f-0732823ee0cb">
+        <createTable tableName="KNOWLEDGELINK">
+            <column name="KNOWLEDGELINKID" type="CHAR(36)">
+                <constraints primaryKey="true" primaryKeyName="PK_KNOWLEDGELINK_KNOWLEDGELINKID"/>
+            </column>
+            <column name="KNOWLEDGEMANAGEMENT_ID" type="CHAR(36)"></column>
+            <column name="DATE_NEW" type="DATETIME2"/>
+            <column name="DATE_EDIT" type="DATETIME2"/>
+            <column name="USER_NEW" type="NVARCHAR(50)"/>
+            <column name="USER_EDIT" type="NVARCHAR(50)"/>
+            <column name="ROW_ID" type="CHAR(36)"/>
+            <column name="OBJECT_TYPE" type="NVARCHAR(100)"/>
+        </createTable>
+    </changeSet>
+</databaseChangeLog>
diff --git a/.liquibase/Data_alias/basic/Knowledgemanagement/struct/knowledgeManagement_table.xml b/.liquibase/Data_alias/basic/Knowledgemanagement/struct/knowledgeManagement_table.xml
new file mode 100644
index 00000000000..14747dd37ea
--- /dev/null
+++ b/.liquibase/Data_alias/basic/Knowledgemanagement/struct/knowledgeManagement_table.xml
@@ -0,0 +1,29 @@
+<?xml version="1.1" encoding="UTF-8" standalone="no"?>
+<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
+                   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd">
+    <changeSet author="e.pollinger" id="9a0aaba2-c114-4648-ab1e-15acf489f19d">
+        <createTable tableName="KNOWLEDGEMANAGEMENT">
+            <column name="KNOWLEDGEMANAGEMENTID" type="CHAR(36)">
+                <constraints primaryKey="true" primaryKeyName="PK_KNOWLEDGEMANAGEMENT_KNOWLEDGEMANAGEMENTID"/>
+            </column>
+            <column name="AUTHOR_CONTACT_ID" type="CHAR(36)"></column>
+            <column name="RESPONSIBLE_CONTACT_ID" type="CHAR(36)"></column>
+            <column name="USER_NEW" type="NVARCHAR(63)"></column>
+            <column name="DATE_NEW" type="DATETIME2"></column>
+            <column name="USER_EDIT" type="NVARCHAR(63)"></column>
+            <column name="DATE_EDIT" type="DATETIME2"></column>
+            <column name="TITLE" type="NVARCHAR(255)"></column>
+            <column name="CONTENT" type="LONGTEXT"></column>
+            <column name="CONTENTDECODED" type="LONGTEXT"></column>
+            <column name="PUBLISH" type="CHAR(36)"></column>
+            <column name="TYPE" type="CHAR(36)"></column>
+        </createTable>
+        
+        <createIndex tableName="KNOWLEDGEMANAGEMENT" indexName="IDX_KNOWLEDGEMANAGEMENT_TITLE">
+            <column name="TITLE"/>
+        </createIndex>
+        <createIndex tableName="KNOWLEDGEMANAGEMENT" indexName="IDX_KNOWLEDGEMANAGEMENT_TYPE">
+            <column name="TYPE"/>
+        </createIndex>
+    </changeSet>
+</databaseChangeLog>
diff --git a/.liquibase/Data_alias/basic/Knowledgemanagement/struct/knowledgeTagLink_table.xml b/.liquibase/Data_alias/basic/Knowledgemanagement/struct/knowledgeTagLink_table.xml
new file mode 100644
index 00000000000..a6b9b631d5d
--- /dev/null
+++ b/.liquibase/Data_alias/basic/Knowledgemanagement/struct/knowledgeTagLink_table.xml
@@ -0,0 +1,17 @@
+<?xml version="1.1" encoding="UTF-8" standalone="no"?>
+<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
+                   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd">
+    <changeSet author="e.pollinger" id="dc0b71e9-616b-4b5a-ad74-1725f0278a15">
+        <createTable tableName="KNOWLEDGETAGLINK">
+            <column name="KNOWLEDGETAGLINKID" type="CHAR(36)">
+                <constraints primaryKey="true" primaryKeyName="PK_KNOWLEDGETAGLINK_KNOWLEDGETAGLINKID"/>
+            </column>
+            <column name="KNOWLEDGETAG_ID" type="CHAR(36)"/>
+            <column name="KNOWLEDGEMANAGEMENT_ID" type="CHAR(36)"/>
+            <column name="DATE_NEW" type="TIMESTAMP"/>
+            <column name="DATE_EDIT" type="TIMESTAMP"/>
+            <column name="USER_NEW" type="nvarchar(50)"/>
+            <column name="USER_EDIT" type="nvarchar(50)"/>
+        </createTable>
+    </changeSet>
+</databaseChangeLog>
diff --git a/.liquibase/Data_alias/basic/Knowledgemanagement/struct/knowledgeTagModeration_table.xml b/.liquibase/Data_alias/basic/Knowledgemanagement/struct/knowledgeTagModeration_table.xml
new file mode 100644
index 00000000000..e15b8473605
--- /dev/null
+++ b/.liquibase/Data_alias/basic/Knowledgemanagement/struct/knowledgeTagModeration_table.xml
@@ -0,0 +1,13 @@
+<?xml version="1.1" encoding="UTF-8" standalone="no"?>
+<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
+                   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd">
+    <changeSet author="e.pollinger" id="50ea4ad8-c864-489e-a121-92f4738e0a7f">
+        <createTable tableName="KNOWLEDGEMANAGEMENTTAGMODERATION">
+            <column name="KNOWLEDGEMANAGEMENTTAGMODERATIONID" type="CHAR(36)">
+                <constraints primaryKey="true" primaryKeyName="PK_TAGMODERATION_KNOWLEDGEMANAGEMENTTAGMODERATIONID"/>
+            </column>
+            <column name="AB_ATTRIBUTE_ID" type="CHAR(36)"></column>
+            <column name="STATUS" type="CHAR(36)"/>
+        </createTable>
+    </changeSet>
+</databaseChangeLog>
diff --git a/.liquibase/Data_alias/basic/Knowledgemanagement/struct/knowledgeTag_table.xml b/.liquibase/Data_alias/basic/Knowledgemanagement/struct/knowledgeTag_table.xml
new file mode 100644
index 00000000000..aa0b15c81bb
--- /dev/null
+++ b/.liquibase/Data_alias/basic/Knowledgemanagement/struct/knowledgeTag_table.xml
@@ -0,0 +1,17 @@
+<?xml version="1.1" encoding="UTF-8" standalone="no"?>
+<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
+                   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd">
+    <changeSet author="e.pollinger" id="95eabecf-82f8-49c8-87b2-594c338d3c15">
+        <createTable tableName="KNOWLEDGETAG">
+            <column name="KNOWLEDGETAGID" type="CHAR(36)">
+                <constraints primaryKey="true" primaryKeyName="PK_KNOWLEDGETAG_KNOWLEDGETAGID"/>
+            </column>
+            <column name="TAG" type="VARCHAR(50)"/>
+            <column name="STATUS" type="CHAR(36)"/>
+            <column name="DATE_NEW" type="TIMESTAMP"/>
+            <column name="DATE_EDIT" type="TIMESTAMP"/>
+            <column name="USER_NEW" type="nvarchar(50)"/>
+            <column name="USER_EDIT" type="nvarchar(50)"/>
+        </createTable>
+    </changeSet>
+</databaseChangeLog>
diff --git a/.liquibase/Data_alias/changelog.xml b/.liquibase/Data_alias/changelog.xml
index 9d1ca6c5576..222dd9fae4c 100644
--- a/.liquibase/Data_alias/changelog.xml
+++ b/.liquibase/Data_alias/changelog.xml
@@ -17,7 +17,9 @@
     <include relativeToChangelogFile="true" file="basic/2020.1.3/changelog.xml"/>
     <include relativeToChangelogFile="true" file="basic/2020.2.0/changelog.xml"/>
     <include relativeToChangelogFile="true" file="basic/2020.2.1/changelog.xml"/>
+    
+    <include relativeToChangelogFile="true" file="basic/Knowledgemanagement/changelog_knowledgeManagement.xml"/>
 
     <!--enable this only when you definetly want to overwrite the existing data with demo records:-->
-    <!--<include relativeToChangelogFile="true" file="basic/_demoData/changelog.xml" context="example"/>-->
+    <include relativeToChangelogFile="true" file="basic/_demoData/changelog.xml" context="example"/>
 </databaseChangeLog>
\ No newline at end of file
diff --git a/aliasDefinition/Data_alias/Data_alias.aod b/aliasDefinition/Data_alias/Data_alias.aod
index 96738b18065..14f83a38728 100644
--- a/aliasDefinition/Data_alias/Data_alias.aod
+++ b/aliasDefinition/Data_alias/Data_alias.aod
@@ -10889,8 +10889,8 @@
                 <name>RECIPIENTS</name>
                 <dbName></dbName>
                 <primaryKey v="false" />
-                <columnType v="12" />
-                <size v="4000" />
+                <columnType v="2005" />
+                <size v="2147483647" />
                 <scale v="0" />
                 <notNull v="false" />
                 <isUnique v="false" />
@@ -11711,8 +11711,8 @@
                 <name>SCAN_PATTERN</name>
                 <dbName></dbName>
                 <primaryKey v="false" />
-                <columnType v="12" />
-                <size v="4000" />
+                <columnType v="2005" />
+                <size v="2147483647" />
                 <scale v="0" />
                 <notNull v="false" />
                 <isUnique v="false" />
@@ -13883,6 +13883,34 @@
                 <title></title>
                 <description></description>
               </entityFieldDb>
+              <entityFieldDb>
+                <name>P_COMMINTERNET</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="12" />
+                <size v="254" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>O_COMMINTERNET</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="12" />
+                <size v="254" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
             </entityFields>
           </entityDb>
           <entityDb>
@@ -14134,7 +14162,7 @@
                 <scale v="0" />
                 <notNull v="false" />
                 <isUnique v="false" />
-                <index v="true" />
+                <index v="false" />
                 <documentation></documentation>
                 <title></title>
                 <description></description>
@@ -14460,7 +14488,7 @@
                 <scale v="0" />
                 <notNull v="false" />
                 <isUnique v="false" />
-                <index v="true" />
+                <index v="false" />
                 <documentation></documentation>
                 <title></title>
                 <description></description>
@@ -14515,7 +14543,7 @@
                 <scale v="0" />
                 <notNull v="false" />
                 <isUnique v="false" />
-                <index v="true" />
+                <index v="false" />
                 <documentation></documentation>
                 <title></title>
                 <description></description>
@@ -15737,6 +15765,992 @@
               </entityFieldDb>
             </entityFields>
           </entityDb>
+          <entityDb>
+            <name>KNOWLEDGEDISCUSSION</name>
+            <dbName></dbName>
+            <idColumn>KNOWLEDGEDISCUSSIONID</idColumn>
+            <idGeneratorType v="0" />
+            <idGeneratorInterval v="1" />
+            <documentation></documentation>
+            <title></title>
+            <description></description>
+            <auditSyncConfig>
+              <name>auditSyncConfig</name>
+              <auditMode v="0" />
+              <syncActive v="false" />
+              <syncComplete v="true" />
+              <syncDirection v="1" />
+              <syncIds></syncIds>
+            </auditSyncConfig>
+            <entityFields>
+              <entityFieldDb>
+                <name>PARENTENTRY</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="1" />
+                <size v="36" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>STATUS</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="12" />
+                <size v="36" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>DISCUSSIONTEXT</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="2005" />
+                <size v="2147483647" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>DATE_EDIT</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="93" />
+                <size v="29" />
+                <scale v="9" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>KNOWLEDGEDISCUSSIONID</name>
+                <dbName></dbName>
+                <primaryKey v="true" />
+                <columnType v="1" />
+                <size v="36" />
+                <scale v="0" />
+                <notNull v="true" />
+                <isUnique v="true" />
+                <index v="true" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>KNOWLEDGEMANAGEMENT_ID</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="1" />
+                <size v="36" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>AUTHOR</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="12" />
+                <size v="50" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>DATE_NEW</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="93" />
+                <size v="29" />
+                <scale v="9" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>USER_NEW</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="12" />
+                <size v="50" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>USER_EDIT</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="12" />
+                <size v="50" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+            </entityFields>
+          </entityDb>
+          <entityDb>
+            <name>KNOWLEDGELINK</name>
+            <dbName></dbName>
+            <idColumn>KNOWLEDGELINKID</idColumn>
+            <idGeneratorType v="0" />
+            <idGeneratorInterval v="1" />
+            <documentation></documentation>
+            <title></title>
+            <description></description>
+            <auditSyncConfig>
+              <name>auditSyncConfig</name>
+              <auditMode v="0" />
+              <syncActive v="false" />
+              <syncComplete v="true" />
+              <syncDirection v="1" />
+              <syncIds></syncIds>
+            </auditSyncConfig>
+            <entityFields>
+              <entityFieldDb>
+                <name>KNOWLEDGELINKID</name>
+                <dbName></dbName>
+                <primaryKey v="true" />
+                <columnType v="1" />
+                <size v="36" />
+                <scale v="0" />
+                <notNull v="true" />
+                <isUnique v="true" />
+                <index v="true" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>DATE_EDIT</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="93" />
+                <size v="29" />
+                <scale v="9" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>KNOWLEDGEMANAGEMENT_ID</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="1" />
+                <size v="36" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>DATE_NEW</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="93" />
+                <size v="29" />
+                <scale v="9" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>USER_NEW</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="12" />
+                <size v="50" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>OBJECT_TYPE</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="12" />
+                <size v="100" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>USER_EDIT</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="12" />
+                <size v="50" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>ROW_ID</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="1" />
+                <size v="36" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+            </entityFields>
+          </entityDb>
+          <entityDb>
+            <name>KNOWLEDGEMANAGEMENT</name>
+            <dbName></dbName>
+            <idColumn>KNOWLEDGEMANAGEMENTID</idColumn>
+            <idGeneratorType v="0" />
+            <idGeneratorInterval v="1" />
+            <documentation></documentation>
+            <title></title>
+            <description></description>
+            <auditSyncConfig>
+              <name>auditSyncConfig</name>
+              <auditMode v="0" />
+              <syncActive v="false" />
+              <syncComplete v="true" />
+              <syncDirection v="1" />
+              <syncIds></syncIds>
+            </auditSyncConfig>
+            <entityFields>
+              <entityFieldDb>
+                <name>DATE_EDIT</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="93" />
+                <size v="29" />
+                <scale v="9" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>KNOWLEDGEMANAGEMENTID</name>
+                <dbName></dbName>
+                <primaryKey v="true" />
+                <columnType v="1" />
+                <size v="36" />
+                <scale v="0" />
+                <notNull v="true" />
+                <isUnique v="true" />
+                <index v="true" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>AUTHOR_CONTACT_ID</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="1" />
+                <size v="36" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+                <customProperties>
+                  <customBooleanProperty>
+                    <name>log</name>
+                    <global v="false" />
+                    <property v="true" />
+                  </customBooleanProperty>
+                </customProperties>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>PUBLISH</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="1" />
+                <size v="36" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>USER_EDIT</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="12" />
+                <size v="63" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>CONTENTDECODED</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="2005" />
+                <size v="2147483647" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>TITLE</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="12" />
+                <size v="255" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="true" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+                <customProperties>
+                  <customBooleanProperty>
+                    <name>log</name>
+                    <global v="false" />
+                    <property v="true" />
+                  </customBooleanProperty>
+                </customProperties>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>CONTENT</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="2005" />
+                <size v="2147483647" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+                <customProperties>
+                  <customBooleanProperty>
+                    <name>log</name>
+                    <global v="false" />
+                    <property v="true" />
+                  </customBooleanProperty>
+                </customProperties>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>DATE_NEW</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="93" />
+                <size v="29" />
+                <scale v="9" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>USER_NEW</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="12" />
+                <size v="63" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>RESPONSIBLE_CONTACT_ID</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="1" />
+                <size v="36" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+                <customProperties>
+                  <customBooleanProperty>
+                    <name>log</name>
+                    <global v="false" />
+                    <property v="true" />
+                  </customBooleanProperty>
+                </customProperties>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>TYPE</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="1" />
+                <size v="36" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="true" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+            </entityFields>
+          </entityDb>
+          <entityDb>
+            <name>KNOWLEDGEROLES</name>
+            <dbName></dbName>
+            <idColumn>KNOWLEDGEROLESID</idColumn>
+            <idGeneratorType v="0" />
+            <idGeneratorInterval v="1" />
+            <documentation></documentation>
+            <title></title>
+            <description></description>
+            <auditSyncConfig>
+              <name>auditSyncConfig</name>
+              <auditMode v="0" />
+              <syncActive v="false" />
+              <syncComplete v="true" />
+              <syncDirection v="1" />
+              <syncIds></syncIds>
+            </auditSyncConfig>
+            <entityFields>
+              <entityFieldDb>
+                <name>KNOWLEDGEROLESID</name>
+                <dbName></dbName>
+                <primaryKey v="true" />
+                <columnType v="1" />
+                <size v="36" />
+                <scale v="0" />
+                <notNull v="true" />
+                <isUnique v="true" />
+                <index v="true" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>KNOWLEDGEMANAGEMENT_ID</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="1" />
+                <size v="36" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>ROLENAME</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="12" />
+                <size v="100" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+            </entityFields>
+          </entityDb>
+          <entityDb>
+            <name>KNOWLEDGEGITINTERFACE</name>
+            <dbName></dbName>
+            <idColumn>KNOWLEDGEGITINTERFACEID</idColumn>
+            <idGeneratorType v="0" />
+            <idGeneratorInterval v="1" />
+            <documentation></documentation>
+            <title></title>
+            <description></description>
+            <auditSyncConfig>
+              <name>auditSyncConfig</name>
+              <auditMode v="0" />
+              <syncActive v="false" />
+              <syncComplete v="true" />
+              <syncDirection v="1" />
+              <syncIds></syncIds>
+            </auditSyncConfig>
+            <entityFields>
+              <entityFieldDb>
+                <name>DATE_EDIT</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="93" />
+                <size v="29" />
+                <scale v="9" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>KNOWLEDGEGITINTERFACEID</name>
+                <dbName></dbName>
+                <primaryKey v="true" />
+                <columnType v="1" />
+                <size v="36" />
+                <scale v="0" />
+                <notNull v="true" />
+                <isUnique v="true" />
+                <index v="true" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>GITCOMMIT</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="12" />
+                <size v="200" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>DATE_NEW</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="93" />
+                <size v="29" />
+                <scale v="9" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>USER_NEW</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="12" />
+                <size v="50" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>SYSTEMNAME</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="12" />
+                <size v="50" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>USER_EDIT</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="12" />
+                <size v="50" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+            </entityFields>
+          </entityDb>
+          <entityDb>
+            <name>KNOWLEDGEMANAGEMENTTAGMODERATION</name>
+            <dbName></dbName>
+            <idColumn>KNOWLEDGEMANAGEMENTTAGMODERATIONID</idColumn>
+            <idGeneratorType v="0" />
+            <idGeneratorInterval v="1" />
+            <documentation></documentation>
+            <title></title>
+            <description></description>
+            <auditSyncConfig>
+              <name>auditSyncConfig</name>
+              <auditMode v="0" />
+              <syncActive v="false" />
+              <syncComplete v="true" />
+              <syncDirection v="1" />
+              <syncIds></syncIds>
+            </auditSyncConfig>
+            <entityFields>
+              <entityFieldDb>
+                <name>STATUS</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="1" />
+                <size v="36" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>AB_ATTRIBUTE_ID</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="1" />
+                <size v="36" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>KNOWLEDGEMANAGEMENTTAGMODERATIONID</name>
+                <dbName></dbName>
+                <primaryKey v="true" />
+                <columnType v="1" />
+                <size v="36" />
+                <scale v="0" />
+                <notNull v="true" />
+                <isUnique v="true" />
+                <index v="true" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+            </entityFields>
+          </entityDb>
+          <entityDb>
+            <name>KNOWLEDGETAG</name>
+            <dbName></dbName>
+            <idColumn>KNOWLEDGETAGID</idColumn>
+            <idGeneratorType v="0" />
+            <idGeneratorInterval v="1" />
+            <documentation></documentation>
+            <title></title>
+            <description></description>
+            <auditSyncConfig>
+              <name>auditSyncConfig</name>
+              <auditMode v="0" />
+              <syncActive v="false" />
+              <syncComplete v="true" />
+              <syncDirection v="1" />
+              <syncIds></syncIds>
+            </auditSyncConfig>
+            <entityFields>
+              <entityFieldDb>
+                <name>KNOWLEDGETAGID</name>
+                <dbName></dbName>
+                <primaryKey v="true" />
+                <columnType v="1" />
+                <size v="36" />
+                <scale v="0" />
+                <notNull v="true" />
+                <isUnique v="true" />
+                <index v="true" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>STATUS</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="1" />
+                <size v="36" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>DATE_EDIT</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="93" />
+                <size v="29" />
+                <scale v="9" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>DATE_NEW</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="93" />
+                <size v="29" />
+                <scale v="9" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>TAG</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="12" />
+                <size v="50" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>USER_NEW</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="12" />
+                <size v="50" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>USER_EDIT</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="12" />
+                <size v="50" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+            </entityFields>
+          </entityDb>
+          <entityDb>
+            <name>KNOWLEDGETAGLINK</name>
+            <dbName></dbName>
+            <idColumn>KNOWLEDGETAGLINKID</idColumn>
+            <idGeneratorType v="0" />
+            <idGeneratorInterval v="1" />
+            <documentation></documentation>
+            <title></title>
+            <description></description>
+            <auditSyncConfig>
+              <name>auditSyncConfig</name>
+              <auditMode v="0" />
+              <syncActive v="false" />
+              <syncComplete v="true" />
+              <syncDirection v="1" />
+              <syncIds></syncIds>
+            </auditSyncConfig>
+            <entityFields>
+              <entityFieldDb>
+                <name>DATE_EDIT</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="93" />
+                <size v="29" />
+                <scale v="9" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>KNOWLEDGEMANAGEMENT_ID</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="1" />
+                <size v="36" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>KNOWLEDGETAGLINKID</name>
+                <dbName></dbName>
+                <primaryKey v="true" />
+                <columnType v="1" />
+                <size v="36" />
+                <scale v="0" />
+                <notNull v="true" />
+                <isUnique v="true" />
+                <index v="true" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>DATE_NEW</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="93" />
+                <size v="29" />
+                <scale v="9" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>KNOWLEDGETAG_ID</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="1" />
+                <size v="36" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>USER_NEW</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="12" />
+                <size v="50" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>USER_EDIT</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="12" />
+                <size v="50" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+            </entityFields>
+          </entityDb>
         </entities>
       </entityGroup>
     </aliasDefDb>
diff --git a/application/_____SYSTEM_APPLICATION_NEON/_____SYSTEM_APPLICATION_NEON.aod b/application/_____SYSTEM_APPLICATION_NEON/_____SYSTEM_APPLICATION_NEON.aod
index 2de36e83409..66bb73bc2f0 100644
--- a/application/_____SYSTEM_APPLICATION_NEON/_____SYSTEM_APPLICATION_NEON.aod
+++ b/application/_____SYSTEM_APPLICATION_NEON/_____SYSTEM_APPLICATION_NEON.aod
@@ -247,6 +247,28 @@
           </entityNode>
         </childNodes>
       </entityNode>
+      <entityNode>
+        <name>Group</name>
+        <kind v="123" />
+        <title>Knowledgemanagement</title>
+        <icon>VAADIN:ACADEMY_CAP</icon>
+        <childNodes>
+          <entityNode>
+            <name>Group5</name>
+            <kind v="123" />
+            <childNodes>
+              <entityNode>
+                <name>INTERNAL_EVERYONE</name>
+                <kind v="159" />
+              </entityNode>
+              <entityNode>
+                <name>KnowledgeManagement</name>
+                <kind v="10077" />
+              </entityNode>
+            </childNodes>
+          </entityNode>
+        </childNodes>
+      </entityNode>
       <entityNode>
         <name>Administration</name>
         <kind v="123" />
diff --git a/entity/KnowledgeDiscussion_entity/KnowledgeDiscussion_entity.aod b/entity/KnowledgeDiscussion_entity/KnowledgeDiscussion_entity.aod
new file mode 100644
index 00000000000..0c7fab8b6d8
--- /dev/null
+++ b/entity/KnowledgeDiscussion_entity/KnowledgeDiscussion_entity.aod
@@ -0,0 +1,219 @@
+<?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>KnowledgeDiscussion_entity</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <title>Discussion</title>
+  <grantCreateProcess>%aditoprj%/entity/KnowledgeDiscussion_entity/grantCreateProcess.js</grantCreateProcess>
+  <grantUpdateProcess>%aditoprj%/entity/KnowledgeDiscussion_entity/grantUpdateProcess.js</grantUpdateProcess>
+  <grantDeleteProcess>%aditoprj%/entity/KnowledgeDiscussion_entity/grantDeleteProcess.js</grantDeleteProcess>
+  <afterUiInit>%aditoprj%/entity/KnowledgeDiscussion_entity/afterUiInit.js</afterUiInit>
+  <iconIdProcess>%aditoprj%/entity/KnowledgeDiscussion_entity/iconIdProcess.js</iconIdProcess>
+  <titlePlural>Discussions</titlePlural>
+  <recordContainer>JDito_KnowledgeDiscussionContainer</recordContainer>
+  <entityFields>
+    <entityProvider>
+      <name>#PROVIDER</name>
+    </entityProvider>
+    <entityField>
+      <name>DISCUSSIONTEXT</name>
+      <title>Discussion</title>
+      <contentType>LONG_TEXT</contentType>
+    </entityField>
+    <entityField>
+      <name>KNOWLEDGEMANAGEMENT_ID</name>
+      <valueProcess>%aditoprj%/entity/KnowledgeDiscussion_entity/entityfields/knowledgemanagement_id/valueProcess.js</valueProcess>
+    </entityField>
+    <entityField>
+      <name>AUTHOR</name>
+      <title>Author</title>
+      <valueProcess>%aditoprj%/entity/KnowledgeDiscussion_entity/entityfields/author/valueProcess.js</valueProcess>
+    </entityField>
+    <entityField>
+      <name>STATUS</name>
+      <consumer>StatusKeyword</consumer>
+      <valueProcess>%aditoprj%/entity/KnowledgeDiscussion_entity/entityfields/status/valueProcess.js</valueProcess>
+    </entityField>
+    <entityField>
+      <name>USER_NEW</name>
+    </entityField>
+    <entityField>
+      <name>USER_EDIT</name>
+    </entityField>
+    <entityField>
+      <name>DATE_NEW</name>
+      <title>new</title>
+      <contentType>DATE</contentType>
+      <valueProcess>%aditoprj%/entity/KnowledgeDiscussion_entity/entityfields/date_new/valueProcess.js</valueProcess>
+    </entityField>
+    <entityField>
+      <name>DATE_EDIT</name>
+      <title>edited</title>
+      <contentType>DATE</contentType>
+      <valueProcess>%aditoprj%/entity/KnowledgeDiscussion_entity/entityfields/date_edit/valueProcess.js</valueProcess>
+    </entityField>
+    <entityField>
+      <name>PARENTENTRY</name>
+    </entityField>
+    <entityField>
+      <name>ICON</name>
+      <title>Icon</title>
+      <contentType>IMAGE</contentType>
+    </entityField>
+    <entityConsumer>
+      <name>StatusKeyword</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>SpecificContainerKeywords</fieldName>
+      </dependency>
+      <children>
+        <entityParameter>
+          <name>ContainerName_param</name>
+          <valueProcess>%aditoprj%/entity/KnowledgeDiscussion_entity/entityfields/statuskeyword/children/containername_param/valueProcess.js</valueProcess>
+        </entityParameter>
+        <entityParameter>
+          <name>OnlyActives_param</name>
+          <valueProcess>%aditoprj%/entity/KnowledgeDiscussion_entity/entityfields/statuskeyword/children/onlyactives_param/valueProcess.js</valueProcess>
+        </entityParameter>
+      </children>
+    </entityConsumer>
+    <entityProvider>
+      <name>ByKnowledgeId</name>
+      <dependencies>
+        <entityDependency>
+          <name>fbacb136-2690-495a-82c5-b6ab1576d3f9</name>
+          <entityName>KnowledgeManagement_entity</entityName>
+          <fieldName>DiscussionsByKnowledgeId</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+      </dependencies>
+    </entityProvider>
+    <entityParameter>
+      <name>KnowledgeId_param</name>
+      <expose v="true" />
+    </entityParameter>
+    <entityParameter>
+      <name>WithClosed_param</name>
+      <valueProcess>%aditoprj%/entity/KnowledgeDiscussion_entity/entityfields/withclosed_param/valueProcess.js</valueProcess>
+      <expose v="true" />
+    </entityParameter>
+    <entityActionGroup>
+      <name>Edit_ActionGroup</name>
+      <title>Bearbeiten</title>
+      <children>
+        <entityActionField>
+          <name>addAnswer_action</name>
+          <onActionProcess>%aditoprj%/entity/KnowledgeDiscussion_entity/entityfields/edit_actiongroup/children/addanswer_action/onActionProcess.js</onActionProcess>
+          <isObjectAction v="false" />
+          <isSelectionAction v="true" />
+          <iconId>VAADIN:COMMENT_O</iconId>
+          <tooltip>Adds an answer to the selected discussion</tooltip>
+        </entityActionField>
+        <entityActionField>
+          <name>showAll_action</name>
+          <onActionProcess>%aditoprj%/entity/KnowledgeDiscussion_entity/entityfields/edit_actiongroup/children/showall_action/onActionProcess.js</onActionProcess>
+          <isObjectAction v="false" />
+          <iconIdProcess>%aditoprj%/entity/KnowledgeDiscussion_entity/entityfields/edit_actiongroup/children/showall_action/iconIdProcess.js</iconIdProcess>
+          <tooltip>Toggles view between "show only open discussions" and "show all discussions"</tooltip>
+        </entityActionField>
+        <entityActionField>
+          <name>toggleDiscussionStatus_action</name>
+          <onActionProcess>%aditoprj%/entity/KnowledgeDiscussion_entity/entityfields/edit_actiongroup/children/togglediscussionstatus_action/onActionProcess.js</onActionProcess>
+          <isObjectAction v="false" />
+          <isSelectionAction v="true" />
+          <iconId>VAADIN:LOCK</iconId>
+          <tooltip>Toggles the status of  selected discussion between open and closed</tooltip>
+        </entityActionField>
+      </children>
+    </entityActionGroup>
+    <entityParameter>
+      <name>ParentId_param</name>
+      <valueProcess>%aditoprj%/entity/KnowledgeDiscussion_entity/entityfields/parentid_param/valueProcess.js</valueProcess>
+      <expose v="true" />
+    </entityParameter>
+    <entityParameter>
+      <name>RowCount_param</name>
+    </entityParameter>
+    <entityField>
+      <name>nodeType</name>
+    </entityField>
+    <entityField>
+      <name>showAll</name>
+      <contentType>BOOLEAN</contentType>
+    </entityField>
+    <entityField>
+      <name>discussionTitle</name>
+      <title>Created / Edited</title>
+    </entityField>
+    <entityField>
+      <name>UID</name>
+    </entityField>
+    <entityProvider>
+      <name>#PROVIDER_AGGREGATES</name>
+      <useAggregates v="true" />
+    </entityProvider>
+  </entityFields>
+  <recordContainers>
+    <jDitoRecordContainer>
+      <name>JDito_KnowledgeDiscussionContainer</name>
+      <jDitoRecordAlias>Data_alias</jDitoRecordAlias>
+      <isPageable v="false" />
+      <isFilterable v="false" />
+      <isRequireContainerFiltering v="true" />
+      <isSortable v="false" />
+      <contentProcess>%aditoprj%/entity/KnowledgeDiscussion_entity/recordcontainers/jdito_knowledgediscussioncontainer/contentProcess.js</contentProcess>
+      <rowCountProcess>%aditoprj%/entity/KnowledgeDiscussion_entity/recordcontainers/jdito_knowledgediscussioncontainer/rowCountProcess.js</rowCountProcess>
+      <hasDependentRecords v="true" />
+      <onInsert>%aditoprj%/entity/KnowledgeDiscussion_entity/recordcontainers/jdito_knowledgediscussioncontainer/onInsert.js</onInsert>
+      <onUpdate>%aditoprj%/entity/KnowledgeDiscussion_entity/recordcontainers/jdito_knowledgediscussioncontainer/onUpdate.js</onUpdate>
+      <onDelete>%aditoprj%/entity/KnowledgeDiscussion_entity/recordcontainers/jdito_knowledgediscussioncontainer/onDelete.js</onDelete>
+      <recordFieldMappings>
+        <jDitoRecordFieldMapping>
+          <name>UID.value</name>
+        </jDitoRecordFieldMapping>
+        <jDitoRecordFieldMapping>
+          <name>PARENTENTRY.value</name>
+        </jDitoRecordFieldMapping>
+        <jDitoRecordFieldMapping>
+          <name>KNOWLEDGEMANAGEMENT_ID.value</name>
+        </jDitoRecordFieldMapping>
+        <jDitoRecordFieldMapping>
+          <name>AUTHOR.value</name>
+        </jDitoRecordFieldMapping>
+        <jDitoRecordFieldMapping>
+          <name>DISCUSSIONTEXT.value</name>
+        </jDitoRecordFieldMapping>
+        <jDitoRecordFieldMapping>
+          <name>STATUS.value</name>
+        </jDitoRecordFieldMapping>
+        <jDitoRecordFieldMapping>
+          <name>STATUS.displayValue</name>
+        </jDitoRecordFieldMapping>
+        <jDitoRecordFieldMapping>
+          <name>DATE_NEW.value</name>
+        </jDitoRecordFieldMapping>
+        <jDitoRecordFieldMapping>
+          <name>DATE_EDIT.value</name>
+        </jDitoRecordFieldMapping>
+        <jDitoRecordFieldMapping>
+          <name>USER_NEW.value</name>
+        </jDitoRecordFieldMapping>
+        <jDitoRecordFieldMapping>
+          <name>USER_EDIT.value</name>
+        </jDitoRecordFieldMapping>
+        <jDitoRecordFieldMapping>
+          <name>AUTHOR.displayValue</name>
+        </jDitoRecordFieldMapping>
+        <jDitoRecordFieldMapping>
+          <name>ICON.value</name>
+        </jDitoRecordFieldMapping>
+        <jDitoRecordFieldMapping>
+          <name>nodeType.value</name>
+        </jDitoRecordFieldMapping>
+        <jDitoRecordFieldMapping>
+          <name>discussionTitle.value</name>
+        </jDitoRecordFieldMapping>
+      </recordFieldMappings>
+    </jDitoRecordContainer>
+  </recordContainers>
+</entity>
diff --git a/entity/KnowledgeDiscussion_entity/afterUiInit.js b/entity/KnowledgeDiscussion_entity/afterUiInit.js
new file mode 100644
index 00000000000..2b7ba120e62
--- /dev/null
+++ b/entity/KnowledgeDiscussion_entity/afterUiInit.js
@@ -0,0 +1,7 @@
+import("system.vars");
+import("system.neon");
+
+if(vars.exists("$param.WithClosed_param") && vars.get("$param.WithClosed_param"))
+    vars.set("$context.showAll", vars.get("$param.WithClosed_param"))
+//else if(!vars.exists("$context.showAll")) 
+//        vars.set("$context.showAll", "false");
\ No newline at end of file
diff --git a/entity/KnowledgeDiscussion_entity/entityfields/author/valueProcess.js b/entity/KnowledgeDiscussion_entity/entityfields/author/valueProcess.js
new file mode 100644
index 00000000000..2301fca2d43
--- /dev/null
+++ b/entity/KnowledgeDiscussion_entity/entityfields/author/valueProcess.js
@@ -0,0 +1,8 @@
+import("system.vars");
+import("system.result");
+import("system.neon");
+
+if(vars.get("$this.value") === null && vars.get("$sys.recordstate") === neon.OPERATINGSTATE_NEW)
+{
+    result.string(vars.get("$sys.user"));
+}
\ No newline at end of file
diff --git a/entity/KnowledgeDiscussion_entity/entityfields/date_edit/valueProcess.js b/entity/KnowledgeDiscussion_entity/entityfields/date_edit/valueProcess.js
new file mode 100644
index 00000000000..090ae91afea
--- /dev/null
+++ b/entity/KnowledgeDiscussion_entity/entityfields/date_edit/valueProcess.js
@@ -0,0 +1,7 @@
+import("system.vars");
+import("system.result");
+import("system.neon");
+import("system.datetime");
+
+if(vars.get("$sys.recordstate") === neon.OPERATINGSTATE_EDIT)
+    result.string(datetime.date());
\ No newline at end of file
diff --git a/entity/KnowledgeDiscussion_entity/entityfields/date_new/valueProcess.js b/entity/KnowledgeDiscussion_entity/entityfields/date_new/valueProcess.js
new file mode 100644
index 00000000000..cb4f3c1d5a1
--- /dev/null
+++ b/entity/KnowledgeDiscussion_entity/entityfields/date_new/valueProcess.js
@@ -0,0 +1,7 @@
+import("system.datetime");
+import("system.vars");
+import("system.result");
+import("system.neon");
+
+if(vars.get("$sys.recordstate") === neon.OPERATINGSTATE_NEW)
+    result.string(datetime.date());
\ No newline at end of file
diff --git a/entity/KnowledgeDiscussion_entity/entityfields/edit_actiongroup/children/addanswer_action/onActionProcess.js b/entity/KnowledgeDiscussion_entity/entityfields/edit_actiongroup/children/addanswer_action/onActionProcess.js
new file mode 100644
index 00000000000..014090f103f
--- /dev/null
+++ b/entity/KnowledgeDiscussion_entity/entityfields/edit_actiongroup/children/addanswer_action/onActionProcess.js
@@ -0,0 +1,9 @@
+import("system.vars");
+import("system.neon");
+
+var params = {
+    "KnowledgeId_param":vars.get("$param.KnowledgeId_param")
+    ,"ParentId_param":vars.get("$field.UID")
+}
+
+neon.openContext("KnowledgeDiscussion", "KnowledgeDiscussionEdit_view", null, neon.OPERATINGSTATE_NEW, params);
\ No newline at end of file
diff --git a/entity/KnowledgeDiscussion_entity/entityfields/edit_actiongroup/children/showall_action/iconIdProcess.js b/entity/KnowledgeDiscussion_entity/entityfields/edit_actiongroup/children/showall_action/iconIdProcess.js
new file mode 100644
index 00000000000..925dab4fbb0
--- /dev/null
+++ b/entity/KnowledgeDiscussion_entity/entityfields/edit_actiongroup/children/showall_action/iconIdProcess.js
@@ -0,0 +1,7 @@
+import("system.vars");
+import("system.result");
+import("system.neon");
+
+var ret = (vars.exists("$context.showAll") && vars.get("$context.showAll") == "true") ? "VAADIN:CLIPBOARD_CHECK" : "VAADIN:CLIPBOARD";
+
+result.string(ret);
\ No newline at end of file
diff --git a/entity/KnowledgeDiscussion_entity/entityfields/edit_actiongroup/children/showall_action/onActionProcess.js b/entity/KnowledgeDiscussion_entity/entityfields/edit_actiongroup/children/showall_action/onActionProcess.js
new file mode 100644
index 00000000000..10b70730e23
--- /dev/null
+++ b/entity/KnowledgeDiscussion_entity/entityfields/edit_actiongroup/children/showall_action/onActionProcess.js
@@ -0,0 +1,12 @@
+import("system.vars");
+import("system.result");
+import("system.neon");
+
+if(!vars.exists("$context.showAll"))
+    vars.set("$context.showAll", "true");
+else if((vars.exists("$context.showAll") && vars.get("$context.showAll") == "true"))
+    vars.set("$context.showAll", "false");
+else
+    vars.set("$context.showAll", "true");
+
+neon.refreshAll();
\ No newline at end of file
diff --git a/entity/KnowledgeDiscussion_entity/entityfields/edit_actiongroup/children/togglediscussionstatus_action/onActionProcess.js b/entity/KnowledgeDiscussion_entity/entityfields/edit_actiongroup/children/togglediscussionstatus_action/onActionProcess.js
new file mode 100644
index 00000000000..b2bac85e2f6
--- /dev/null
+++ b/entity/KnowledgeDiscussion_entity/entityfields/edit_actiongroup/children/togglediscussionstatus_action/onActionProcess.js
@@ -0,0 +1,12 @@
+import("KnowledgeManagement_lib");
+import("KeywordRegistry_basic");
+import("system.vars");
+import("system.neon");
+
+var status = (vars.get("$field.STATUS") == $KeywordRegistry.discussionStatus$acitve()) 
+             ? $KeywordRegistry.discussionStatus$closed() 
+             : $KeywordRegistry.discussionStatus$acitve();
+
+KnowledgeDiscussion.getInstance(vars.get("$param.KnowledgeId_param"))
+                   .setDiscussionStatus(vars.get("$field.UID"), status);
+neon.refreshAll();
\ No newline at end of file
diff --git a/entity/KnowledgeDiscussion_entity/entityfields/knowledgemanagement_id/valueProcess.js b/entity/KnowledgeDiscussion_entity/entityfields/knowledgemanagement_id/valueProcess.js
new file mode 100644
index 00000000000..3204947cd26
--- /dev/null
+++ b/entity/KnowledgeDiscussion_entity/entityfields/knowledgemanagement_id/valueProcess.js
@@ -0,0 +1,7 @@
+import("system.vars");
+import("system.result");
+
+if(vars.exists("$param.KnowledgeId_param") 
+                && vars.get("$param.KnowledgeId_param") 
+                && vars.get("$this.value") === null)
+    result.string(vars.get("$param.KnowledgeId_param"));
\ No newline at end of file
diff --git a/entity/KnowledgeDiscussion_entity/entityfields/parentid_param/valueProcess.js b/entity/KnowledgeDiscussion_entity/entityfields/parentid_param/valueProcess.js
new file mode 100644
index 00000000000..ed69697cc20
--- /dev/null
+++ b/entity/KnowledgeDiscussion_entity/entityfields/parentid_param/valueProcess.js
@@ -0,0 +1,4 @@
+//import("system.vars");
+//import("system.result");
+
+//result.string(vars.exists("$sys.selection") && vars.get("$sys.selection"));
\ No newline at end of file
diff --git a/entity/KnowledgeDiscussion_entity/entityfields/status/valueProcess.js b/entity/KnowledgeDiscussion_entity/entityfields/status/valueProcess.js
new file mode 100644
index 00000000000..051fa1deb28
--- /dev/null
+++ b/entity/KnowledgeDiscussion_entity/entityfields/status/valueProcess.js
@@ -0,0 +1,7 @@
+import("system.vars");
+import("system.result");
+import("system.neon");
+import("KeywordRegistry_basic");
+
+if(vars.get("$this.value") === null && vars.get("$sys.recordstate") === neon.OPERATINGSTATE_NEW)
+    result.string($KeywordRegistry.discussionStatus$acitve());
\ No newline at end of file
diff --git a/entity/KnowledgeDiscussion_entity/entityfields/statuskeyword/children/containername_param/valueProcess.js b/entity/KnowledgeDiscussion_entity/entityfields/statuskeyword/children/containername_param/valueProcess.js
new file mode 100644
index 00000000000..10532b30b86
--- /dev/null
+++ b/entity/KnowledgeDiscussion_entity/entityfields/statuskeyword/children/containername_param/valueProcess.js
@@ -0,0 +1,4 @@
+import("KeywordRegistry_basic");
+import("system.result");
+
+result.string($KeywordRegistry.discussionStatus());
\ No newline at end of file
diff --git a/entity/KnowledgeDiscussion_entity/entityfields/statuskeyword/children/onlyactives_param/valueProcess.js b/entity/KnowledgeDiscussion_entity/entityfields/statuskeyword/children/onlyactives_param/valueProcess.js
new file mode 100644
index 00000000000..40effa01784
--- /dev/null
+++ b/entity/KnowledgeDiscussion_entity/entityfields/statuskeyword/children/onlyactives_param/valueProcess.js
@@ -0,0 +1,3 @@
+import("system.result");
+
+result.string(true);
\ No newline at end of file
diff --git a/entity/KnowledgeDiscussion_entity/entityfields/withclosed_param/valueProcess.js b/entity/KnowledgeDiscussion_entity/entityfields/withclosed_param/valueProcess.js
new file mode 100644
index 00000000000..77e47923de2
--- /dev/null
+++ b/entity/KnowledgeDiscussion_entity/entityfields/withclosed_param/valueProcess.js
@@ -0,0 +1,5 @@
+import("system.vars");
+import("system.result");
+
+if(vars.exists("$context.showAll"))
+    result.string(vars.get("$context.showAll"));
\ No newline at end of file
diff --git a/entity/KnowledgeDiscussion_entity/grantCreateProcess.js b/entity/KnowledgeDiscussion_entity/grantCreateProcess.js
new file mode 100644
index 00000000000..241a88da0b5
--- /dev/null
+++ b/entity/KnowledgeDiscussion_entity/grantCreateProcess.js
@@ -0,0 +1,18 @@
+import("system.logging");
+import("system.vars");
+import("system.result");
+import("KnowledgeManagement_lib");
+import("KeywordRegistry_basic");
+
+var status = KnowledgeUtils.trimAndUp(vars.get("$field.STATUS"));
+var parent = vars.exists("$param.ParentId_param") && vars.get("$param.ParentId_param");
+
+var cond = (
+    (
+        status == KnowledgeUtils.trimAndUp($KeywordRegistry.discussionStatus$acitve())
+        ||
+        status == ""
+    )  
+);
+
+result.string(cond);
\ No newline at end of file
diff --git a/entity/KnowledgeDiscussion_entity/grantDeleteProcess.js b/entity/KnowledgeDiscussion_entity/grantDeleteProcess.js
new file mode 100644
index 00000000000..b76b609eeb1
--- /dev/null
+++ b/entity/KnowledgeDiscussion_entity/grantDeleteProcess.js
@@ -0,0 +1,24 @@
+import("system.vars");
+import("system.result");
+import("KnowledgeManagement_lib");
+import("KeywordRegistry_basic");
+
+var hasChildren = KnowledgeDiscussion.hasChildren(vars.get("$field.UID"));
+var status = vars.get("$field.STATUS");
+var user = vars.get("$sys.user");
+var author = vars.get("$field.AUTHOR");
+//As long as it doesn't have children AND ( ((author == user) and status == active) OR user is academy)
+var cond = (
+    !hasChildren
+    &&
+    (
+        (
+            KnowledgeUtils.trimAndUp(author) === KnowledgeUtils.trimAndUp(user) 
+            && ( KnowledgeUtils.trimAndUp(status) === KnowledgeUtils.trimAndUp($KeywordRegistry.discussionStatus$acitve().slice(0)))
+        )
+        ||
+        KnowledgeUtils.isAcademy(user)
+    )
+);
+
+result.string(cond);
\ No newline at end of file
diff --git a/entity/KnowledgeDiscussion_entity/grantUpdateProcess.js b/entity/KnowledgeDiscussion_entity/grantUpdateProcess.js
new file mode 100644
index 00000000000..07664375a4d
--- /dev/null
+++ b/entity/KnowledgeDiscussion_entity/grantUpdateProcess.js
@@ -0,0 +1,30 @@
+import("system.vars");
+import("system.result");
+import("KeywordRegistry_basic");
+import("KnowledgeManagement_lib");
+
+var user = vars.get("$sys.user");
+var author = vars.get("$field.AUTHOR");
+var status = vars.get("$field.STATUS");
+
+
+
+//if (author == user and status == active) OR user is of role "academy" allow edit
+var cond = (
+    (
+        KnowledgeUtils.trimAndUp(author) === KnowledgeUtils.trimAndUp(user) 
+        && ( KnowledgeUtils.trimAndUp(status) === KnowledgeUtils.trimAndUp($KeywordRegistry.discussionStatus$acitve().slice(0)))
+    )
+    ||
+    KnowledgeUtils.isAcademy(user)
+);
+
+/*
+ * (
+    author === user
+    &&
+    status === $KeywordRegistry.discussionStatus$acitve()
+);
+ */
+
+result.string(cond);
\ No newline at end of file
diff --git a/entity/KnowledgeDiscussion_entity/iconIdProcess.js b/entity/KnowledgeDiscussion_entity/iconIdProcess.js
new file mode 100644
index 00000000000..f86b12ac2a9
--- /dev/null
+++ b/entity/KnowledgeDiscussion_entity/iconIdProcess.js
@@ -0,0 +1,4 @@
+import("system.vars");
+import("system.result");
+
+result.string(vars.get("$field.ICON"));
\ No newline at end of file
diff --git a/entity/KnowledgeDiscussion_entity/recordcontainers/jdito_knowledgediscussioncontainer/contentProcess.js b/entity/KnowledgeDiscussion_entity/recordcontainers/jdito_knowledgediscussioncontainer/contentProcess.js
new file mode 100644
index 00000000000..b607e1b91ea
--- /dev/null
+++ b/entity/KnowledgeDiscussion_entity/recordcontainers/jdito_knowledgediscussioncontainer/contentProcess.js
@@ -0,0 +1,23 @@
+import("system.logging");
+import("KnowledgeManagement_lib");
+import("system.vars");
+import("system.result");
+import("system.neon");
+
+var wClosedParam = null;
+if(vars.exists("$param.WithClosed_param"))
+    wClosedParam = vars.get("$param.WithClosed_param");
+
+var kId = vars.exists("$param.KnowledgeId_param") && vars.get("$param.KnowledgeId_param");
+var withClosed = vars.exists("$context.showAll") && vars.get("$context.showAll");
+
+if(wClosedParam == "true")
+    withClosed = wClosedParam;
+
+logging.log(withClosed);
+
+var idValues = vars.exists("$local.idvalues") && vars.get("$local.idvalues");
+
+var discussions = KnowledgeDiscussion.getInstance(kId);    
+var retData = discussions.buildCompleteTree(KnowledgeDiscussion.getMode(withClosed), idValues).data;
+result.object(retData);
\ No newline at end of file
diff --git a/entity/KnowledgeDiscussion_entity/recordcontainers/jdito_knowledgediscussioncontainer/onDelete.js b/entity/KnowledgeDiscussion_entity/recordcontainers/jdito_knowledgediscussioncontainer/onDelete.js
new file mode 100644
index 00000000000..8493a27873b
--- /dev/null
+++ b/entity/KnowledgeDiscussion_entity/recordcontainers/jdito_knowledgediscussioncontainer/onDelete.js
@@ -0,0 +1,6 @@
+import("system.vars");
+import("system.result");
+import("KnowledgeManagement_lib");
+
+KnowledgeDiscussion.getInstance(vars.get("$field.KNOWLEDGEMANAGEMENT_ID"))
+                   .deleteDiscussion(vars.get("$local.uid"));
\ No newline at end of file
diff --git a/entity/KnowledgeDiscussion_entity/recordcontainers/jdito_knowledgediscussioncontainer/onInsert.js b/entity/KnowledgeDiscussion_entity/recordcontainers/jdito_knowledgediscussioncontainer/onInsert.js
new file mode 100644
index 00000000000..350267a4b06
--- /dev/null
+++ b/entity/KnowledgeDiscussion_entity/recordcontainers/jdito_knowledgediscussioncontainer/onInsert.js
@@ -0,0 +1,9 @@
+import("system.vars");
+import("system.result");
+import("KnowledgeManagement_lib");
+
+var parent = vars.exists("$param.ParentId_param") && vars.get("$param.ParentId_param");
+
+KnowledgeDiscussion.getInstance(vars.get("$param.KnowledgeId_param"))
+                   .addDiscussion(parent
+                                 ,vars.get("$local.rowdata"));
\ No newline at end of file
diff --git a/entity/KnowledgeDiscussion_entity/recordcontainers/jdito_knowledgediscussioncontainer/onUpdate.js b/entity/KnowledgeDiscussion_entity/recordcontainers/jdito_knowledgediscussioncontainer/onUpdate.js
new file mode 100644
index 00000000000..dbd17c4439f
--- /dev/null
+++ b/entity/KnowledgeDiscussion_entity/recordcontainers/jdito_knowledgediscussioncontainer/onUpdate.js
@@ -0,0 +1,8 @@
+import("system.vars");
+import("system.result");
+import("KnowledgeManagement_lib");
+
+KnowledgeDiscussion.getInstance(vars.get("$field.KNOWLEDGEMANAGEMENT_ID"))
+                   .editDiscussion(vars.get("$local.uid")
+                                    , vars.get("$local.rowdata")
+                                    , vars.get("$local.changed"));
\ No newline at end of file
diff --git a/entity/KnowledgeDiscussion_entity/recordcontainers/jdito_knowledgediscussioncontainer/rowCountProcess.js b/entity/KnowledgeDiscussion_entity/recordcontainers/jdito_knowledgediscussioncontainer/rowCountProcess.js
new file mode 100644
index 00000000000..4f9f77ea5e4
--- /dev/null
+++ b/entity/KnowledgeDiscussion_entity/recordcontainers/jdito_knowledgediscussioncontainer/rowCountProcess.js
@@ -0,0 +1,25 @@
+import("system.logging");
+import("KnowledgeManagement_lib");
+import("system.vars");
+import("system.result");
+import("system.neon");
+
+
+var wClosedParam = null;
+if(vars.exists("$param.WithClosed_param"))
+    wClosedParam = vars.get("$param.WithClosed_param");
+
+var kId = vars.exists("$param.KnowledgeId_param") && vars.get("$param.KnowledgeId_param");
+var withClosed = vars.exists("$context.showAll") && vars.get("$context.showAll");
+if(wClosedParam == "true")
+    withClosed = wClosedParam;
+
+var idValues = vars.exists("$local.idvalues") && vars.get("$local.idvalues");
+
+if(kId)
+{
+    var discussions = KnowledgeDiscussion.getInstance(kId);    
+    var retData = discussions.getDatasetCount(KnowledgeDiscussion.getMode(withClosed), idValues);
+    //logging.log("DATA: " + JSON.stringify([retData,idValues],null,"\t"));
+    result.object(retData);
+}
\ No newline at end of file
diff --git a/entity/KnowledgeLink_entity/KnowledgeLink_entity.aod b/entity/KnowledgeLink_entity/KnowledgeLink_entity.aod
new file mode 100644
index 00000000000..6ebca6010ae
--- /dev/null
+++ b/entity/KnowledgeLink_entity/KnowledgeLink_entity.aod
@@ -0,0 +1,177 @@
+<?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>KnowledgeLink_entity</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <title>Verknüpfung</title>
+  <iconIdProcess>%aditoprj%/entity/KnowledgeLink_entity/iconIdProcess.js</iconIdProcess>
+  <titlePlural>Verknüpfungen</titlePlural>
+  <recordContainer>db</recordContainer>
+  <entityFields>
+    <entityProvider>
+      <name>#PROVIDER</name>
+    </entityProvider>
+    <entityField>
+      <name>KNOWLEDGELINKID</name>
+      <usePermissions v="false" />
+    </entityField>
+    <entityField>
+      <name>ROW_ID</name>
+      <title>Dataset</title>
+      <consumer>Objects</consumer>
+      <linkedContextProcess>%aditoprj%/entity/KnowledgeLink_entity/entityfields/row_id/linkedContextProcess.js</linkedContextProcess>
+      <displayValueProcess>%aditoprj%/entity/KnowledgeLink_entity/entityfields/row_id/displayValueProcess.js</displayValueProcess>
+    </entityField>
+    <entityField>
+      <name>OBJECT_TYPE</name>
+      <title>Type</title>
+      <consumer>Contexts</consumer>
+      <displayValueProcess>%aditoprj%/entity/KnowledgeLink_entity/entityfields/object_type/displayValueProcess.js</displayValueProcess>
+    </entityField>
+    <entityField>
+      <name>KNOWLEDGEMANAGEMENT_ID</name>
+      <valueProcess>%aditoprj%/entity/KnowledgeLink_entity/entityfields/knowledgemanagement_id/valueProcess.js</valueProcess>
+    </entityField>
+    <entityField>
+      <name>DATE_NEW</name>
+      <valueProcess>%aditoprj%/entity/KnowledgeLink_entity/entityfields/date_new/valueProcess.js</valueProcess>
+    </entityField>
+    <entityField>
+      <name>DATE_EDIT</name>
+      <valueProcess>%aditoprj%/entity/KnowledgeLink_entity/entityfields/date_edit/valueProcess.js</valueProcess>
+    </entityField>
+    <entityField>
+      <name>USER_NEW</name>
+      <valueProcess>%aditoprj%/entity/KnowledgeLink_entity/entityfields/user_new/valueProcess.js</valueProcess>
+    </entityField>
+    <entityField>
+      <name>USER_EDIT</name>
+      <valueProcess>%aditoprj%/entity/KnowledgeLink_entity/entityfields/user_edit/valueProcess.js</valueProcess>
+    </entityField>
+    <entityConsumer>
+      <name>Contexts</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Context_entity</entityName>
+        <fieldName>ActivityLinkable</fieldName>
+      </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>Objects</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Object_entity</entityName>
+        <fieldName>FilteredObjects</fieldName>
+      </dependency>
+      <children>
+        <entityParameter>
+          <name>ObjectType_param</name>
+          <valueProcess>%aditoprj%/entity/KnowledgeLink_entity/entityfields/objects/children/objecttype_param/valueProcess.js</valueProcess>
+        </entityParameter>
+        <entityParameter>
+          <name>ContactId_param</name>
+          <valueProcess>%aditoprj%/entity/KnowledgeLink_entity/entityfields/objects/children/contactid_param/valueProcess.js</valueProcess>
+        </entityParameter>
+      </children>
+    </entityConsumer>
+    <entityParameter>
+      <name>KnowledgeManagementId_param</name>
+      <expose v="true" />
+    </entityParameter>
+    <entityProvider>
+      <name>ByKnowledgeId</name>
+      <targetContextField>OBJECT_TYPE</targetContextField>
+      <targetIdField>ROW_ID</targetIdField>
+      <dependencies>
+        <entityDependency>
+          <name>c3ed10c1-db55-4e55-9c18-2b8d400df033</name>
+          <entityName>KnowledgeManagement_entity</entityName>
+          <fieldName>LinksByKnowledgeId</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+      </dependencies>
+      <children>
+        <entityParameter>
+          <name>ObjectType_param</name>
+          <expose v="false" />
+        </entityParameter>
+        <entityParameter>
+          <name>RowId_param</name>
+          <expose v="false" />
+        </entityParameter>
+      </children>
+    </entityProvider>
+    <entityProvider>
+      <name>ByLink</name>
+      <targetContextField>OBJECT_TYPE</targetContextField>
+      <targetIdField>ROW_ID</targetIdField>
+      <children>
+        <entityParameter>
+          <name>KnowledgeManagementId_param</name>
+          <expose v="false" />
+        </entityParameter>
+      </children>
+    </entityProvider>
+    <entityParameter>
+      <name>RowId_param</name>
+      <expose v="true" />
+    </entityParameter>
+    <entityParameter>
+      <name>ObjectType_param</name>
+      <expose v="true" />
+    </entityParameter>
+    <entityProvider>
+      <name>#PROVIDER_AGGREGATES</name>
+      <useAggregates v="true" />
+    </entityProvider>
+  </entityFields>
+  <recordContainers>
+    <dbRecordContainer>
+      <name>db</name>
+      <alias>Data_alias</alias>
+      <conditionProcess>%aditoprj%/entity/KnowledgeLink_entity/recordcontainers/db/conditionProcess.js</conditionProcess>
+      <linkInformation>
+        <linkInformation>
+          <name>aea9524a-589e-47df-87d7-5f79519eb135</name>
+          <tableName>KNOWLEDGELINK</tableName>
+          <primaryKey>KNOWLEDGELINKID</primaryKey>
+          <isUIDTable v="true" />
+          <readonly v="false" />
+        </linkInformation>
+      </linkInformation>
+      <recordFieldMappings>
+        <dbRecordFieldMapping>
+          <name>DATE_EDIT.value</name>
+          <recordfield>KNOWLEDGELINK.DATE_EDIT</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>DATE_NEW.value</name>
+          <recordfield>KNOWLEDGELINK.DATE_NEW</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>KNOWLEDGELINKID.value</name>
+          <recordfield>KNOWLEDGELINK.KNOWLEDGELINKID</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>KNOWLEDGEMANAGEMENT_ID.value</name>
+          <recordfield>KNOWLEDGELINK.KNOWLEDGEMANAGEMENT_ID</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>OBJECT_TYPE.value</name>
+          <recordfield>KNOWLEDGELINK.OBJECT_TYPE</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>ROW_ID.value</name>
+          <recordfield>KNOWLEDGELINK.ROW_ID</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>USER_EDIT.value</name>
+          <recordfield>KNOWLEDGELINK.USER_EDIT</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>USER_NEW.value</name>
+          <recordfield>KNOWLEDGELINK.USER_NEW</recordfield>
+        </dbRecordFieldMapping>
+      </recordFieldMappings>
+    </dbRecordContainer>
+  </recordContainers>
+</entity>
diff --git a/entity/KnowledgeLink_entity/entityfields/date_edit/valueProcess.js b/entity/KnowledgeLink_entity/entityfields/date_edit/valueProcess.js
new file mode 100644
index 00000000000..f9bd2052348
--- /dev/null
+++ b/entity/KnowledgeLink_entity/entityfields/date_edit/valueProcess.js
@@ -0,0 +1,6 @@
+import("system.neon");
+import("system.vars");
+import("system.result");
+
+if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_EDIT && vars.exists("$this.value") && vars.get("$this.value") == null)
+    result.string(vars.get("$sys.date"));
\ No newline at end of file
diff --git a/entity/KnowledgeLink_entity/entityfields/date_new/valueProcess.js b/entity/KnowledgeLink_entity/entityfields/date_new/valueProcess.js
new file mode 100644
index 00000000000..2fc9c2258e7
--- /dev/null
+++ b/entity/KnowledgeLink_entity/entityfields/date_new/valueProcess.js
@@ -0,0 +1,6 @@
+import("system.neon");
+import("system.vars");
+import("system.result");
+
+if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && vars.exists("$this.value") && vars.get("$this.value") == null)
+    result.string(vars.get("$sys.date"));
\ No newline at end of file
diff --git a/entity/KnowledgeLink_entity/entityfields/knowledgemanagement_id/valueProcess.js b/entity/KnowledgeLink_entity/entityfields/knowledgemanagement_id/valueProcess.js
new file mode 100644
index 00000000000..d21371587c7
--- /dev/null
+++ b/entity/KnowledgeLink_entity/entityfields/knowledgemanagement_id/valueProcess.js
@@ -0,0 +1,13 @@
+import("system.vars");
+import("system.result");
+import("system.neon");
+
+result.string(
+    (
+        vars.exists("$param.KnowledgeManagementId_param") 
+        && vars.get("$this.value") == null 
+        && vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW
+    ) 
+    ? vars.getString("$param.KnowledgeManagementId_param") 
+    : ""
+);
\ No newline at end of file
diff --git a/entity/KnowledgeLink_entity/entityfields/object_type/displayValueProcess.js b/entity/KnowledgeLink_entity/entityfields/object_type/displayValueProcess.js
new file mode 100644
index 00000000000..3922264dc37
--- /dev/null
+++ b/entity/KnowledgeLink_entity/entityfields/object_type/displayValueProcess.js
@@ -0,0 +1,7 @@
+import("system.neon");
+import("system.vars");
+import("system.result");
+import("Context_lib");
+
+if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_EDIT && vars.get("$field.OBJECT_TYPE"))
+    result.string(ContextUtils.getTitle(vars.get("$field.OBJECT_TYPE")));
\ No newline at end of file
diff --git a/entity/KnowledgeLink_entity/entityfields/objects/children/contactid_param/valueProcess.js b/entity/KnowledgeLink_entity/entityfields/objects/children/contactid_param/valueProcess.js
new file mode 100644
index 00000000000..f781937a2a2
--- /dev/null
+++ b/entity/KnowledgeLink_entity/entityfields/objects/children/contactid_param/valueProcess.js
@@ -0,0 +1,7 @@
+import("system.vars");
+import("system.result");
+
+var rowId = vars.get("$field.ROW_ID");
+
+if(rowId != null && rowId != "")
+    result.string(rowId);
\ No newline at end of file
diff --git a/entity/KnowledgeLink_entity/entityfields/objects/children/objecttype_param/valueProcess.js b/entity/KnowledgeLink_entity/entityfields/objects/children/objecttype_param/valueProcess.js
new file mode 100644
index 00000000000..03654e9e879
--- /dev/null
+++ b/entity/KnowledgeLink_entity/entityfields/objects/children/objecttype_param/valueProcess.js
@@ -0,0 +1,4 @@
+import("system.vars");
+import("system.result");
+
+result.string(vars.get("$field.OBJECT_TYPE"));
\ No newline at end of file
diff --git a/entity/KnowledgeLink_entity/entityfields/row_id/displayValueProcess.js b/entity/KnowledgeLink_entity/entityfields/row_id/displayValueProcess.js
new file mode 100644
index 00000000000..3dbbcf620a1
--- /dev/null
+++ b/entity/KnowledgeLink_entity/entityfields/row_id/displayValueProcess.js
@@ -0,0 +1,11 @@
+import("system.neon");
+import("system.vars");
+import("system.db");
+import("system.result");
+import("Context_lib");
+
+if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && !vars.get("$field.ROW_ID")) {
+    result.string("");
+} else if (vars.exists("$field.OBJECT_TYPE") && vars.get("$field.OBJECT_TYPE")) {
+    result.string(db.cell(ContextUtils.getNameSql(vars.get("$field.OBJECT_TYPE"), vars.get("$field.ROW_ID"))));
+}
\ No newline at end of file
diff --git a/entity/KnowledgeLink_entity/entityfields/row_id/linkedContextProcess.js b/entity/KnowledgeLink_entity/entityfields/row_id/linkedContextProcess.js
new file mode 100644
index 00000000000..d868fe097f2
--- /dev/null
+++ b/entity/KnowledgeLink_entity/entityfields/row_id/linkedContextProcess.js
@@ -0,0 +1,5 @@
+import("system.vars");
+import("system.result");
+import("Context_lib");
+
+result.string(ContextUtils.getContextName(vars.get("$field.OBJECT_TYPE")))
\ No newline at end of file
diff --git a/entity/KnowledgeLink_entity/entityfields/user_edit/valueProcess.js b/entity/KnowledgeLink_entity/entityfields/user_edit/valueProcess.js
new file mode 100644
index 00000000000..d0d7b9894d5
--- /dev/null
+++ b/entity/KnowledgeLink_entity/entityfields/user_edit/valueProcess.js
@@ -0,0 +1,6 @@
+import("system.neon");
+import("system.vars");
+import("system.result");
+
+if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_EDIT && vars.exists("$this.value") && vars.get("$this.value") == null)
+    result.string(vars.get("$sys.user"));
\ No newline at end of file
diff --git a/entity/KnowledgeLink_entity/entityfields/user_new/valueProcess.js b/entity/KnowledgeLink_entity/entityfields/user_new/valueProcess.js
new file mode 100644
index 00000000000..44409408024
--- /dev/null
+++ b/entity/KnowledgeLink_entity/entityfields/user_new/valueProcess.js
@@ -0,0 +1,6 @@
+import("system.neon");
+import("system.vars");
+import("system.result");
+
+if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && vars.exists("$this.value") && vars.get("$this.value") == null)
+    result.string(vars.get("$sys.user"));
\ No newline at end of file
diff --git a/entity/KnowledgeLink_entity/iconIdProcess.js b/entity/KnowledgeLink_entity/iconIdProcess.js
new file mode 100644
index 00000000000..07e66a14ebd
--- /dev/null
+++ b/entity/KnowledgeLink_entity/iconIdProcess.js
@@ -0,0 +1,5 @@
+import("system.vars");
+import("system.result");
+import("Context_lib");
+
+result.string("TEXT:" + ContextUtils.getContextName(vars.get("$field.OBJECT_TYPE")))
\ No newline at end of file
diff --git a/entity/KnowledgeLink_entity/recordcontainers/db/conditionProcess.js b/entity/KnowledgeLink_entity/recordcontainers/db/conditionProcess.js
new file mode 100644
index 00000000000..3adf64f1274
--- /dev/null
+++ b/entity/KnowledgeLink_entity/recordcontainers/db/conditionProcess.js
@@ -0,0 +1,16 @@
+import("system.vars");
+import("system.result");
+
+var id = (vars.exists("$param.KnowledgeManagementId_param")) ? vars.get("$param.KnowledgeManagementId_param") : null;
+var localId = (vars.exists("$local.idvalue")) ? vars.get("$local.idvalue") : null;
+
+
+var cond = "";
+cond += (id) ? "KNOWLEDGEMANAGEMENT_ID = '" + id + "'" : "";
+cond += (cond.length && localId) ? " and " : "";
+cond += (localId) ? "KNOWLEDGELINKID = '" + localId + "'" : "";
+
+if(cond.length)
+    result.string(cond);
+else
+    result.string("1=2");
\ No newline at end of file
diff --git a/entity/KnowledgeManagementTagList_entity/KnowledgeManagementTagList_entity.aod b/entity/KnowledgeManagementTagList_entity/KnowledgeManagementTagList_entity.aod
new file mode 100644
index 00000000000..c7b24df7f14
--- /dev/null
+++ b/entity/KnowledgeManagementTagList_entity/KnowledgeManagementTagList_entity.aod
@@ -0,0 +1,48 @@
+<?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>KnowledgeManagementTagList_entity</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <contentTitleProcess>%aditoprj%/entity/KnowledgeManagementTagList_entity/contentTitleProcess.js</contentTitleProcess>
+  <recordContainer>JDito_TagList</recordContainer>
+  <entityFields>
+    <entityProvider>
+      <name>#PROVIDER</name>
+    </entityProvider>
+    <entityField>
+      <name>UID</name>
+    </entityField>
+    <entityField>
+      <name>NAME</name>
+    </entityField>
+    <entityProvider>
+      <name>CompleteList</name>
+      <dependencies>
+        <entityDependency>
+          <name>85925baa-5edc-4908-804e-f7ec4c5a2a0c</name>
+          <entityName>KnowledgeManagementTags_entity</entityName>
+          <fieldName>CompleteTagList</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+      </dependencies>
+    </entityProvider>
+    <entityProvider>
+      <name>#PROVIDER_AGGREGATES</name>
+      <useAggregates v="true" />
+    </entityProvider>
+  </entityFields>
+  <recordContainers>
+    <jDitoRecordContainer>
+      <name>JDito_TagList</name>
+      <jDitoRecordAlias>Data_alias</jDitoRecordAlias>
+      <contentProcess>%aditoprj%/entity/KnowledgeManagementTagList_entity/recordcontainers/jdito_taglist/contentProcess.js</contentProcess>
+      <recordFieldMappings>
+        <jDitoRecordFieldMapping>
+          <name>UID.value</name>
+        </jDitoRecordFieldMapping>
+        <jDitoRecordFieldMapping>
+          <name>NAME.value</name>
+        </jDitoRecordFieldMapping>
+      </recordFieldMappings>
+    </jDitoRecordContainer>
+  </recordContainers>
+</entity>
diff --git a/entity/KnowledgeManagementTagList_entity/contentTitleProcess.js b/entity/KnowledgeManagementTagList_entity/contentTitleProcess.js
new file mode 100644
index 00000000000..28fd67de270
--- /dev/null
+++ b/entity/KnowledgeManagementTagList_entity/contentTitleProcess.js
@@ -0,0 +1,4 @@
+import("system.vars");
+import("system.result");
+
+result.string(vars.get("$field.NAME"));
\ No newline at end of file
diff --git a/entity/KnowledgeManagementTagList_entity/recordcontainers/jdito_taglist/contentProcess.js b/entity/KnowledgeManagementTagList_entity/recordcontainers/jdito_taglist/contentProcess.js
new file mode 100644
index 00000000000..65e0462c8e4
--- /dev/null
+++ b/entity/KnowledgeManagementTagList_entity/recordcontainers/jdito_taglist/contentProcess.js
@@ -0,0 +1,8 @@
+import("system.vars");
+import("system.logging");
+import("KnowledgeManagement_lib");
+import("system.result");
+
+var res = KnowledgeManagementTagsModel.getInstance().getPossibleTags(KnowledgeUtils.getLocalIdValue()).array;
+
+result.object(res);
\ No newline at end of file
diff --git a/entity/KnowledgeManagementTags_entity/KnowledgeManagementTags_entity.aod b/entity/KnowledgeManagementTags_entity/KnowledgeManagementTags_entity.aod
new file mode 100644
index 00000000000..4e7cf8e9b74
--- /dev/null
+++ b/entity/KnowledgeManagementTags_entity/KnowledgeManagementTags_entity.aod
@@ -0,0 +1,93 @@
+<?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>KnowledgeManagementTags_entity</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <recordContainer>JDito_KnowledgeManagementKeywords</recordContainer>
+  <entityFields>
+    <entityProvider>
+      <name>#PROVIDER</name>
+    </entityProvider>
+    <entityParameter>
+      <name>KnowledgeManagementId_param</name>
+      <expose v="true" />
+    </entityParameter>
+    <entityProvider>
+      <name>ByKnowledgeManagementId</name>
+      <dependencies>
+        <entityDependency>
+          <name>8d86a61b-0fe3-44c4-a512-e044c990fded</name>
+          <entityName>KnowledgeManagement_entity</entityName>
+          <fieldName>TagsByKnowledgeId</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+      </dependencies>
+      <children>
+        <entityParameter>
+          <name>KnowledgeManagementId_param</name>
+          <mandatory v="true" />
+        </entityParameter>
+      </children>
+    </entityProvider>
+    <entityField>
+      <name>TAG</name>
+      <title>Tag</title>
+      <consumer>CompleteTagList</consumer>
+      <textInputAllowed v="true" />
+      <displayValueProcess>%aditoprj%/entity/KnowledgeManagementTags_entity/entityfields/tag/displayValueProcess.js</displayValueProcess>
+    </entityField>
+    <entityField>
+      <name>UID</name>
+    </entityField>
+    <entityConsumer>
+      <name>CompleteTagList</name>
+      <state>EDITABLE</state>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KnowledgeManagementTagList_entity</entityName>
+        <fieldName>CompleteList</fieldName>
+      </dependency>
+    </entityConsumer>
+    <entityField>
+      <name>ListTitle</name>
+      <state>READONLY</state>
+      <valueProcess>%aditoprj%/entity/KnowledgeManagementTags_entity/entityfields/listtitle/valueProcess.js</valueProcess>
+    </entityField>
+    <entityActionField>
+      <name>ActionField1</name>
+      <title>a1</title>
+    </entityActionField>
+    <entityActionField>
+      <name>ActionField2</name>
+      <title>a2</title>
+    </entityActionField>
+    <entityActionField>
+      <name>ActionField3</name>
+      <title>a3</title>
+    </entityActionField>
+    <entityProvider>
+      <name>#PROVIDER_AGGREGATES</name>
+      <useAggregates v="true" />
+    </entityProvider>
+  </entityFields>
+  <recordContainers>
+    <jDitoRecordContainer>
+      <name>JDito_KnowledgeManagementKeywords</name>
+      <jDitoRecordAlias>Data_alias</jDitoRecordAlias>
+      <contentProcess>%aditoprj%/entity/KnowledgeManagementTags_entity/recordcontainers/jdito_knowledgemanagementkeywords/contentProcess.js</contentProcess>
+      <onInsert>%aditoprj%/entity/KnowledgeManagementTags_entity/recordcontainers/jdito_knowledgemanagementkeywords/onInsert.js</onInsert>
+      <onUpdate>%aditoprj%/entity/KnowledgeManagementTags_entity/recordcontainers/jdito_knowledgemanagementkeywords/onUpdate.js</onUpdate>
+      <onDelete>%aditoprj%/entity/KnowledgeManagementTags_entity/recordcontainers/jdito_knowledgemanagementkeywords/onDelete.js</onDelete>
+      <recordFieldMappings>
+        <jDitoRecordFieldMapping>
+          <name>UID.value</name>
+        </jDitoRecordFieldMapping>
+        <jDitoRecordFieldMapping>
+          <name>TAG.value</name>
+        </jDitoRecordFieldMapping>
+        <jDitoRecordFieldMapping>
+          <name>TAG.displayValue</name>
+        </jDitoRecordFieldMapping>
+      </recordFieldMappings>
+    </jDitoRecordContainer>
+  </recordContainers>
+</entity>
diff --git a/entity/KnowledgeManagementTags_entity/entityfields/listtitle/valueProcess.js b/entity/KnowledgeManagementTags_entity/entityfields/listtitle/valueProcess.js
new file mode 100644
index 00000000000..2c6c244e954
--- /dev/null
+++ b/entity/KnowledgeManagementTags_entity/entityfields/listtitle/valueProcess.js
@@ -0,0 +1,3 @@
+import("system.result");
+
+result.string("Tag:");
\ No newline at end of file
diff --git a/entity/KnowledgeManagementTags_entity/entityfields/tag/displayValueProcess.js b/entity/KnowledgeManagementTags_entity/entityfields/tag/displayValueProcess.js
new file mode 100644
index 00000000000..674ac1a4a17
--- /dev/null
+++ b/entity/KnowledgeManagementTags_entity/entityfields/tag/displayValueProcess.js
@@ -0,0 +1,5 @@
+import("system.vars");
+import("system.result");
+import("Sql_lib");
+
+result.string(new SqlBuilder().select("TAG").from("KNOWLEDGETAG").where("KNOWLEDGETAGID = '" + vars.get("$field.TAG") + "'").cell());
\ No newline at end of file
diff --git a/entity/KnowledgeManagementTags_entity/recordcontainers/jdito_knowledgemanagementkeywords/contentProcess.js b/entity/KnowledgeManagementTags_entity/recordcontainers/jdito_knowledgemanagementkeywords/contentProcess.js
new file mode 100644
index 00000000000..d48540b541b
--- /dev/null
+++ b/entity/KnowledgeManagementTags_entity/recordcontainers/jdito_knowledgemanagementkeywords/contentProcess.js
@@ -0,0 +1,12 @@
+import("system.vars");
+import("system.result");
+import("system.db");
+import("KnowledgeManagement_lib");
+import("system.text");
+import("system.net");
+
+var idValue = vars.exists("$local.idvalues") && vars.get("$local.idvalues");
+
+result.object(KnowledgeManagementTagsModel.getInstance()
+                .collectTags(vars.get("$param.KnowledgeManagementId_param"), idValue)
+                .data);
\ No newline at end of file
diff --git a/entity/KnowledgeManagementTags_entity/recordcontainers/jdito_knowledgemanagementkeywords/onDelete.js b/entity/KnowledgeManagementTags_entity/recordcontainers/jdito_knowledgemanagementkeywords/onDelete.js
new file mode 100644
index 00000000000..8d94951f966
--- /dev/null
+++ b/entity/KnowledgeManagementTags_entity/recordcontainers/jdito_knowledgemanagementkeywords/onDelete.js
@@ -0,0 +1,8 @@
+import("system.logging");
+import("system.vars");
+import("system.result");
+import("KnowledgeManagement_lib");
+
+KnowledgeManagementTagsController
+    .getInstance(vars.get("$param.KnowledgeManagementId_param"))
+    .deleteTag(vars.get("$local.uid"), vars.get("$local.rowdata"))
\ No newline at end of file
diff --git a/entity/KnowledgeManagementTags_entity/recordcontainers/jdito_knowledgemanagementkeywords/onInsert.js b/entity/KnowledgeManagementTags_entity/recordcontainers/jdito_knowledgemanagementkeywords/onInsert.js
new file mode 100644
index 00000000000..410d6308daf
--- /dev/null
+++ b/entity/KnowledgeManagementTags_entity/recordcontainers/jdito_knowledgemanagementkeywords/onInsert.js
@@ -0,0 +1,17 @@
+import("system.db");
+import("system.neon");
+import("system.vars");
+import("system.result");
+import("KnowledgeManagement_lib");
+//You have to access this object in Array notation, cause the Keys are like "FIELD.value", 
+//if you do variable.FIELD.value, you get an error "Cannot find property value of undefined"
+//Because FIELD doesn't exist within the object, but "FIELD.value" does...
+var rowData = vars.get("$local.rowdata");
+
+//UID of this entity is being used for the attribute relation
+var attrRelationId = vars.get("$local.uid");
+var knowledgeId = vars.get("$param.KnowledgeManagementId_param");
+
+KnowledgeManagementTagsController
+    .getInstance(knowledgeId)
+    .addTag(attrRelationId, rowData);
\ No newline at end of file
diff --git a/entity/KnowledgeManagementTags_entity/recordcontainers/jdito_knowledgemanagementkeywords/onUpdate.js b/entity/KnowledgeManagementTags_entity/recordcontainers/jdito_knowledgemanagementkeywords/onUpdate.js
new file mode 100644
index 00000000000..e60c40d6f32
--- /dev/null
+++ b/entity/KnowledgeManagementTags_entity/recordcontainers/jdito_knowledgemanagementkeywords/onUpdate.js
@@ -0,0 +1,13 @@
+import("system.db");
+import("KnowledgeManagement_lib");
+import("system.logging");
+import("system.vars");
+import("system.result");
+import("Sql_lib");
+
+var data = vars.get("$local.rowdata");
+var knowledgeId = vars.get("$param.KnowledgeManagementId_param");
+
+KnowledgeManagementTagsController
+    .getInstance(knowledgeId)
+    .editTag(data["UID.value"], data);
\ No newline at end of file
diff --git a/entity/KnowledgeManagement_entity/KnowledgeManagement_entity.aod b/entity/KnowledgeManagement_entity/KnowledgeManagement_entity.aod
new file mode 100644
index 00000000000..2f6b2699aa9
--- /dev/null
+++ b/entity/KnowledgeManagement_entity/KnowledgeManagement_entity.aod
@@ -0,0 +1,499 @@
+<?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>KnowledgeManagement_entity</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <icon>VAADIN:ACADEMY_CAP</icon>
+  <title>Knowledge</title>
+  <grantUpdateProcess>%aditoprj%/entity/KnowledgeManagement_entity/grantUpdateProcess.js</grantUpdateProcess>
+  <grantDeleteProcess>%aditoprj%/entity/KnowledgeManagement_entity/grantDeleteProcess.js</grantDeleteProcess>
+  <contentTitleProcess>%aditoprj%/entity/KnowledgeManagement_entity/contentTitleProcess.js</contentTitleProcess>
+  <afterOperatingState>%aditoprj%/entity/KnowledgeManagement_entity/afterOperatingState.js</afterOperatingState>
+  <useFavorites v="true" />
+  <iconIdProcess>%aditoprj%/entity/KnowledgeManagement_entity/iconIdProcess.js</iconIdProcess>
+  <usePermissions v="true" />
+  <titlePlural>Knowledge entries</titlePlural>
+  <recordContainer>db</recordContainer>
+  <entityFields>
+    <entityProvider>
+      <name>#PROVIDER</name>
+    </entityProvider>
+    <entityField>
+      <name>KNOWLEDGEMANAGEMENTID</name>
+    </entityField>
+    <entityField>
+      <name>TITLE</name>
+      <title>Title</title>
+      <mandatory v="true" />
+    </entityField>
+    <entityField>
+      <name>CONTENT</name>
+      <title>Content</title>
+      <contentType>HTML</contentType>
+      <outputFormat></outputFormat>
+      <mandatory v="true" />
+      <onValueChangeTypes>
+        <element>MASK</element>
+        <element>PROCESS</element>
+        <element>PROCESS_SETVALUE</element>
+      </onValueChangeTypes>
+    </entityField>
+    <entityField>
+      <name>CONTENTDECODED</name>
+      <title>Text content</title>
+      <valueProcess>%aditoprj%/entity/KnowledgeManagement_entity/entityfields/contentdecoded/valueProcess.js</valueProcess>
+    </entityField>
+    <entityField>
+      <name>AUTHOR_CONTACT_ID</name>
+      <title>Author</title>
+      <consumer>PersonContacts</consumer>
+      <valueProcess>%aditoprj%/entity/KnowledgeManagement_entity/entityfields/author_contact_id/valueProcess.js</valueProcess>
+      <displayValueProcess>%aditoprj%/entity/KnowledgeManagement_entity/entityfields/author_contact_id/displayValueProcess.js</displayValueProcess>
+    </entityField>
+    <entityField>
+      <name>DATE_NEW</name>
+      <title>Created on</title>
+      <contentType>DATE</contentType>
+      <resolution>SECOND</resolution>
+      <outputFormat>dd.MM.yyyy HH:mm</outputFormat>
+      <inputFormat>dd.MM.yyyy HH:mm</inputFormat>
+      <state>READONLY</state>
+      <valueProcess>%aditoprj%/entity/KnowledgeManagement_entity/entityfields/date_new/valueProcess.js</valueProcess>
+    </entityField>
+    <entityField>
+      <name>DATE_EDIT</name>
+      <title>Edited on</title>
+      <contentType>DATE</contentType>
+      <resolution>SECOND</resolution>
+      <outputFormat>dd.MM.yyyy HH:mm</outputFormat>
+      <inputFormat>dd.MM.yyyy HH:mm</inputFormat>
+      <state>READONLY</state>
+      <valueProcess>%aditoprj%/entity/KnowledgeManagement_entity/entityfields/date_edit/valueProcess.js</valueProcess>
+      <onValueChangeTypes>
+        <element>MASK</element>
+        <element>PROCESS</element>
+        <element>PROCESS_SETVALUE</element>
+      </onValueChangeTypes>
+    </entityField>
+    <entityField>
+      <name>USER_NEW</name>
+      <title>Created by</title>
+      <valueProcess>%aditoprj%/entity/KnowledgeManagement_entity/entityfields/user_new/valueProcess.js</valueProcess>
+    </entityField>
+    <entityField>
+      <name>USER_EDIT</name>
+      <title>Edited by</title>
+      <valueProcess>%aditoprj%/entity/KnowledgeManagement_entity/entityfields/user_edit/valueProcess.js</valueProcess>
+    </entityField>
+    <entityField>
+      <name>TYPE</name>
+      <title>Type</title>
+      <consumer>KeywordKnowledgeType</consumer>
+      <valueProcess>%aditoprj%/entity/KnowledgeManagement_entity/entityfields/type/valueProcess.js</valueProcess>
+    </entityField>
+    <entityField>
+      <name>htmlView</name>
+      <title>Content</title>
+      <valueProcess>%aditoprj%/entity/KnowledgeManagement_entity/entityfields/htmlview/valueProcess.js</valueProcess>
+    </entityField>
+    <entityConsumer>
+      <name>TagsByKnowledgeId</name>
+      <refreshParent v="true" />
+      <state>EDITABLE</state>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KnowledgeManagementTags_entity</entityName>
+        <fieldName>ByKnowledgeManagementId</fieldName>
+      </dependency>
+      <children>
+        <entityParameter>
+          <name>KnowledgeManagementId_param</name>
+          <valueProcess>%aditoprj%/entity/KnowledgeManagement_entity/entityfields/tagsbyknowledgeid/children/knowledgemanagementid_param/valueProcess.js</valueProcess>
+        </entityParameter>
+      </children>
+    </entityConsumer>
+    <entityConsumer>
+      <name>DiscussionsByKnowledgeId</name>
+      <refreshParent v="true" />
+      <dependency>
+        <name>dependency</name>
+        <entityName>KnowledgeDiscussion_entity</entityName>
+        <fieldName>ByKnowledgeId</fieldName>
+      </dependency>
+      <children>
+        <entityParameter>
+          <name>KnowledgeId_param</name>
+          <valueProcess>%aditoprj%/entity/KnowledgeManagement_entity/entityfields/discussionsbyknowledgeid/children/knowledgeid_param/valueProcess.js</valueProcess>
+        </entityParameter>
+      </children>
+    </entityConsumer>
+    <entityProvider>
+      <name>Provider</name>
+    </entityProvider>
+    <entityConsumer>
+      <name>PersonContacts</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Person_entity</entityName>
+        <fieldName>Contacts</fieldName>
+      </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>KeywordKnowledgeType</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>SpecificContainerKeywords</fieldName>
+      </dependency>
+      <children>
+        <entityParameter>
+          <name>ContainerName_param</name>
+          <valueProcess>%aditoprj%/entity/KnowledgeManagement_entity/entityfields/keywordknowledgetype/children/containername_param/valueProcess.js</valueProcess>
+        </entityParameter>
+      </children>
+    </entityConsumer>
+    <entityConsumer>
+      <name>KeywordPublish</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>SpecificContainerKeywords</fieldName>
+      </dependency>
+      <children>
+        <entityParameter>
+          <name>ContainerName_param</name>
+          <valueProcess>%aditoprj%/entity/KnowledgeManagement_entity/entityfields/keywordpublish/children/containername_param/valueProcess.js</valueProcess>
+        </entityParameter>
+      </children>
+    </entityConsumer>
+    <entityField>
+      <name>indexTag</name>
+    </entityField>
+    <entityConsumer>
+      <name>LinkedDocuments</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Document_entity</entityName>
+        <fieldName>Documents</fieldName>
+      </dependency>
+      <children>
+        <entityParameter>
+          <name>AssignmentTable_param</name>
+          <valueProcess>%aditoprj%/entity/KnowledgeManagement_entity/entityfields/linkeddocuments/children/assignmenttable_param/valueProcess.js</valueProcess>
+        </entityParameter>
+        <entityParameter>
+          <name>AssignmentRowId_param</name>
+          <valueProcess>%aditoprj%/entity/KnowledgeManagement_entity/entityfields/linkeddocuments/children/assignmentrowid_param/valueProcess.js</valueProcess>
+        </entityParameter>
+      </children>
+    </entityConsumer>
+    <entityActionField>
+      <name>openEntryAsMail</name>
+      <title>send as mail</title>
+      <onActionProcess>%aditoprj%/entity/KnowledgeManagement_entity/entityfields/openentryasmail/onActionProcess.js</onActionProcess>
+      <isMenuAction v="true" />
+      <isSelectionAction v="true" />
+      <state>INVISIBLE</state>
+    </entityActionField>
+    <entityConsumer>
+      <name>LinksByKnowledgeId</name>
+      <refreshParent v="true" />
+      <dependency>
+        <name>dependency</name>
+        <entityName>KnowledgeLink_entity</entityName>
+        <fieldName>ByKnowledgeId</fieldName>
+      </dependency>
+      <children>
+        <entityParameter>
+          <name>KnowledgeManagementId_param</name>
+          <valueProcess>%aditoprj%/entity/KnowledgeManagement_entity/entityfields/linksbyknowledgeid/children/knowledgemanagementid_param/valueProcess.js</valueProcess>
+        </entityParameter>
+      </children>
+    </entityConsumer>
+    <entityField>
+      <name>LastChange</name>
+      <title>Last change</title>
+      <contentType>DATE</contentType>
+    </entityField>
+    <entityConsumer>
+      <name>LogHistories</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>LogHistory_entity</entityName>
+        <fieldName>LogHistoryProvider</fieldName>
+      </dependency>
+      <children>
+        <entityParameter>
+          <name>tablenames_param</name>
+          <valueProcess>%aditoprj%/entity/KnowledgeManagement_entity/entityfields/loghistories/children/tablenames_param/valueProcess.js</valueProcess>
+        </entityParameter>
+      </children>
+    </entityConsumer>
+    <entityActionField>
+      <name>exportHTML_action</name>
+      <title>Export HTML</title>
+      <onActionProcess>%aditoprj%/entity/KnowledgeManagement_entity/entityfields/exporthtml_action/onActionProcess.js</onActionProcess>
+      <iconId>NEON:EXPORT</iconId>
+      <tooltip>Exports the knowledge entry as a html file</tooltip>
+    </entityActionField>
+    <entityProvider>
+      <name>#PROVIDER_AGGREGATES</name>
+      <useAggregates v="true" />
+    </entityProvider>
+    <entityField>
+      <name>KNOWLEDGEMANAGEMENT_OBJECTTYPE</name>
+      <valueProcess>%aditoprj%/entity/KnowledgeManagement_entity/entityfields/knowledgemanagement_objecttype/valueProcess.js</valueProcess>
+    </entityField>
+    <entityField>
+      <name>binaryContents</name>
+      <contentType>FILE</contentType>
+    </entityField>
+    <entityField>
+      <name>isNewsMark</name>
+      <title>News</title>
+      <contentType>BOOLEAN</contentType>
+      <valueProcess>%aditoprj%/entity/KnowledgeManagement_entity/entityfields/isnewsmark/valueProcess.js</valueProcess>
+    </entityField>
+    <entityField>
+      <name>notificationMark</name>
+      <title>Notification</title>
+      <description>Oh Hi Mark</description>
+      <contentType>BOOLEAN</contentType>
+      <stateProcess>%aditoprj%/entity/KnowledgeManagement_entity/entityfields/notificationmark/stateProcess.js</stateProcess>
+    </entityField>
+    <entityParameter>
+      <name>isDashlet_param</name>
+      <expose v="true" />
+    </entityParameter>
+    <entityConsumer>
+      <name>KnowledgeRoles</name>
+      <stateProcess>%aditoprj%/entity/KnowledgeManagement_entity/entityfields/knowledgeroles/stateProcess.js</stateProcess>
+      <onValidation>%aditoprj%/entity/KnowledgeManagement_entity/entityfields/knowledgeroles/onValidation.js</onValidation>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KnowledgeRole_entity</entityName>
+        <fieldName>KnowledgeRole</fieldName>
+      </dependency>
+      <children>
+        <entityParameter>
+          <name>KnowledgeManagement_param</name>
+          <valueProcess>%aditoprj%/entity/KnowledgeManagement_entity/entityfields/knowledgeroles/children/knowledgemanagement_param/valueProcess.js</valueProcess>
+        </entityParameter>
+        <entityParameter>
+          <name>PublishLevelRoles_param</name>
+          <valueProcess>%aditoprj%/entity/KnowledgeManagement_entity/entityfields/knowledgeroles/children/publishlevelroles_param/valueProcess.js</valueProcess>
+          <expose v="true" />
+        </entityParameter>
+      </children>
+    </entityConsumer>
+    <entityConsumer>
+      <name>Tasks</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Task_entity</entityName>
+        <fieldName>Tasks</fieldName>
+      </dependency>
+      <children>
+        <entityParameter>
+          <name>ObjectId_param</name>
+          <valueProcess>%aditoprj%/entity/KnowledgeManagement_entity/entityfields/tasks/children/objectid_param/valueProcess.js</valueProcess>
+        </entityParameter>
+        <entityParameter>
+          <name>RowId_param</name>
+          <valueProcess>%aditoprj%/entity/KnowledgeManagement_entity/entityfields/tasks/children/rowid_param/valueProcess.js</valueProcess>
+        </entityParameter>
+        <entityParameter>
+          <name>PresetLinks_param</name>
+          <valueProcess>%aditoprj%/entity/KnowledgeManagement_entity/entityfields/tasks/children/presetlinks_param/valueProcess.js</valueProcess>
+        </entityParameter>
+      </children>
+    </entityConsumer>
+    <entityField>
+      <name>RESPONSIBLE_CONTACT_ID</name>
+      <title>Responsible</title>
+      <consumer>PersonContacts</consumer>
+      <valueProcess>%aditoprj%/entity/KnowledgeManagement_entity/entityfields/responsible_contact_id/valueProcess.js</valueProcess>
+      <displayValueProcess>%aditoprj%/entity/KnowledgeManagement_entity/entityfields/responsible_contact_id/displayValueProcess.js</displayValueProcess>
+    </entityField>
+    <entityField>
+      <name>PUBLISH</name>
+      <title>Publishing level</title>
+      <consumer>KeywordPublish</consumer>
+      <valueProcess>%aditoprj%/entity/KnowledgeManagement_entity/entityfields/publish/valueProcess.js</valueProcess>
+      <displayValueProcess>%aditoprj%/entity/KnowledgeManagement_entity/entityfields/publish/displayValueProcess.js</displayValueProcess>
+    </entityField>
+  </entityFields>
+  <recordContainers>
+    <dbRecordContainer>
+      <name>db</name>
+      <alias>Data_alias</alias>
+      <isRequireContainerFiltering v="true" />
+      <conditionProcess>%aditoprj%/entity/KnowledgeManagement_entity/recordcontainers/db/conditionProcess.js</conditionProcess>
+      <orderClauseProcess>%aditoprj%/entity/KnowledgeManagement_entity/recordcontainers/db/orderClauseProcess.js</orderClauseProcess>
+      <onDBInsert>%aditoprj%/entity/KnowledgeManagement_entity/recordcontainers/db/onDBInsert.js</onDBInsert>
+      <onDBUpdate>%aditoprj%/entity/KnowledgeManagement_entity/recordcontainers/db/onDBUpdate.js</onDBUpdate>
+      <linkInformation>
+        <linkInformation>
+          <name>9d4a7198-a4d1-45b3-867f-bf12cd558274</name>
+          <tableName>KNOWLEDGEMANAGEMENT</tableName>
+          <primaryKey>KNOWLEDGEMANAGEMENTID</primaryKey>
+          <isUIDTable v="true" />
+          <readonly v="false" />
+        </linkInformation>
+      </linkInformation>
+      <recordFieldMappings>
+        <dbRecordFieldMapping>
+          <name>AUTHOR_CONTACT_ID.value</name>
+          <recordfield>KNOWLEDGEMANAGEMENT.AUTHOR_CONTACT_ID</recordfield>
+          <isFilterable v="true" />
+          <isLookupFilter v="true" />
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>CONTENT.value</name>
+          <recordfield>KNOWLEDGEMANAGEMENT.CONTENT</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>CONTENTDECODED.value</name>
+          <recordfield>KNOWLEDGEMANAGEMENT.CONTENTDECODED</recordfield>
+          <isFilterable v="true" />
+          <isLookupFilter v="true" />
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>DATE_EDIT.value</name>
+          <recordfield>KNOWLEDGEMANAGEMENT.DATE_EDIT</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>DATE_NEW.value</name>
+          <recordfield>KNOWLEDGEMANAGEMENT.DATE_NEW</recordfield>
+          <isFilterable v="true" />
+          <isLookupFilter v="true" />
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>KNOWLEDGEMANAGEMENTID.value</name>
+          <recordfield>KNOWLEDGEMANAGEMENT.KNOWLEDGEMANAGEMENTID</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>TITLE.value</name>
+          <recordfield>KNOWLEDGEMANAGEMENT.TITLE</recordfield>
+          <isFilterable v="true" />
+          <isLookupFilter v="true" />
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>TYPE.value</name>
+          <recordfield>KNOWLEDGEMANAGEMENT.TYPE</recordfield>
+          <isFilterable v="true" />
+          <isLookupFilter v="true" />
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>USER_EDIT.value</name>
+          <recordfield>KNOWLEDGEMANAGEMENT.USER_EDIT</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>USER_NEW.value</name>
+          <recordfield>KNOWLEDGEMANAGEMENT.USER_NEW</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>AUTHOR_CONTACT_ID.displayValue</name>
+          <expression>%aditoprj%/entity/KnowledgeManagement_entity/recordcontainers/db/recordfieldmappings/author_contact_id.displayvalue/expression.js</expression>
+          <isFilterable v="true" />
+          <isLookupFilter v="true" />
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>LastChange.value</name>
+          <expression>%aditoprj%/entity/KnowledgeManagement_entity/recordcontainers/db/recordfieldmappings/lastchange.value/expression.js</expression>
+          <isFilterable v="true" />
+          <isLookupFilter v="true" />
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>TYPE.displayValue</name>
+          <expression>%aditoprj%/entity/KnowledgeManagement_entity/recordcontainers/db/recordfieldmappings/type.displayvalue/expression.js</expression>
+        </dbRecordFieldMapping>
+        <consumerMapping>
+          <name>KnowledgeRoles</name>
+          <filterConditionProcess>%aditoprj%/entity/KnowledgeManagement_entity/recordcontainers/db/recordfieldmappings/knowledgeroles/filterConditionProcess.js</filterConditionProcess>
+          <isFilterable v="true" />
+          <isLookupFilter v="true" />
+          <filtertype>BASIC</filtertype>
+        </consumerMapping>
+        <dbRecordFieldMapping>
+          <name>RESPONSIBLE_CONTACT_ID.value</name>
+          <recordfield>KNOWLEDGEMANAGEMENT.RESPONSIBLE_CONTACT_ID</recordfield>
+          <columnAlias></columnAlias>
+          <isFilterable v="true" />
+          <isLookupFilter v="true" />
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>RESPONSIBLE_CONTACT_ID.displayValue</name>
+          <expression>%aditoprj%/entity/KnowledgeManagement_entity/recordcontainers/db/recordfieldmappings/responsible_contact_id.displayvalue/expression.js</expression>
+          <isFilterable v="true" />
+          <isLookupFilter v="true" />
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>PUBLISH.value</name>
+          <recordfield>KNOWLEDGEMANAGEMENT.PUBLISH</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>PUBLISH.displayValue</name>
+          <expression>%aditoprj%/entity/KnowledgeManagement_entity/recordcontainers/db/recordfieldmappings/publish.displayvalue/expression.js</expression>
+        </dbRecordFieldMapping>
+      </recordFieldMappings>
+      <filterExtensions>
+        <filterExtension>
+          <name>TagFilter</name>
+          <title>Tag</title>
+          <contentType>TEXT</contentType>
+          <filterValuesProcess>%aditoprj%/entity/KnowledgeManagement_entity/recordcontainers/db/filterextensions/tagfilter/filterValuesProcess.js</filterValuesProcess>
+          <filterConditionProcess>%aditoprj%/entity/KnowledgeManagement_entity/recordcontainers/db/filterextensions/tagfilter/filterConditionProcess.js</filterConditionProcess>
+          <filtertype>BASIC</filtertype>
+        </filterExtension>
+      </filterExtensions>
+    </dbRecordContainer>
+    <indexRecordContainer>
+      <name>indexSearchKnowledgebase</name>
+      <configMode>INDEXGROUP_DEFINITION</configMode>
+      <patternExtensionProcess>%aditoprj%/entity/KnowledgeManagement_entity/recordcontainers/indexsearchknowledgebase/patternExtensionProcess.js</patternExtensionProcess>
+      <indexRecordAlias>Data_alias</indexRecordAlias>
+      <query>%aditoprj%/entity/KnowledgeManagement_entity/recordcontainers/indexsearchknowledgebase/query.js</query>
+      <subProcess>%aditoprj%/entity/KnowledgeManagement_entity/recordcontainers/indexsearchknowledgebase/subProcess.js</subProcess>
+      <affectedTables>
+        <element>KNOWLEDGEMANAGEMENT</element>
+        <element>KNOWLEDGETAGLINK</element>
+      </affectedTables>
+      <affectedIds>%aditoprj%/entity/KnowledgeManagement_entity/recordcontainers/indexsearchknowledgebase/affectedIds.js</affectedIds>
+      <title>Knowledgebase</title>
+      <indexFieldMappings>
+        <indexRecordSystemFieldMapping>
+          <name>#UID</name>
+        </indexRecordSystemFieldMapping>
+        <indexRecordMultilingualSystemFieldMapping>
+          <name>#TITLE</name>
+        </indexRecordMultilingualSystemFieldMapping>
+        <indexRecordMultilingualSystemFieldMapping>
+          <name>#DESCRIPTION</name>
+        </indexRecordMultilingualSystemFieldMapping>
+        <indexRecordFieldMapping>
+          <name>KNOWLEDGEMANAGEMENTID.value</name>
+          <systemField>UID</systemField>
+        </indexRecordFieldMapping>
+        <indexRecordFieldMapping>
+          <name>TITLE.value</name>
+          <indexFieldType>TEXT</indexFieldType>
+        </indexRecordFieldMapping>
+        <indexRecordFieldMapping>
+          <name>CONTENTDECODED.value</name>
+          <indexFieldType>TEXT</indexFieldType>
+        </indexRecordFieldMapping>
+        <indexRecordFieldMapping>
+          <name>indexTag.value</name>
+        </indexRecordFieldMapping>
+        <indexRecordSystemFieldMapping>
+          <name>#SUB_GROUP</name>
+        </indexRecordSystemFieldMapping>
+        <indexRecordFieldMapping>
+          <name>binaryContents.value</name>
+          <isStored v="false" />
+          <isMultiValued v="true" />
+        </indexRecordFieldMapping>
+      </indexFieldMappings>
+    </indexRecordContainer>
+  </recordContainers>
+</entity>
diff --git a/entity/KnowledgeManagement_entity/afterOperatingState.js b/entity/KnowledgeManagement_entity/afterOperatingState.js
new file mode 100644
index 00000000000..e94e7d52721
--- /dev/null
+++ b/entity/KnowledgeManagement_entity/afterOperatingState.js
@@ -0,0 +1,52 @@
+import("Util_lib");
+import("system.tools");
+import("system.neon");
+import("system.entities");
+import("NewsSystem_lib");
+import("system.vars");
+
+if(vars.exists("$field.isNewsMark") && Utils.toBoolean(vars.get("$field.isNewsMark")))
+{
+    if(vars.exists("$context.setNotificationMark") 
+        && vars.get("$context.setNotificationMark"))
+    {
+        var roles = [];
+    
+        /*
+     * We need a solution for the following problem:
+     * we need every child role of a parent Role like PROJECT_ADITO because nobody has PROJECT_ADITO but the rest is a child of the parent.
+     * Maybe a tools. method to get them. Currently I don't know how it translates to the prod system.
+     * Testing locally works.
+     */
+    
+
+    
+        var config = entities.createConfigForLoadingConsumerRows()
+        .consumer("KnowledgeRoles")
+        .fields(["ROLES"]);
+    
+        var roleData = entities.getRows(config); //get the rows of the consumer
+    
+        if(roleData)
+        {
+            roles = roleData.map(function(row) //check each role of this object and push it into an array
+            {
+                return row["ROLES"];
+            });
+        }
+    
+        var users = NewsSystem.getUsersWithRoles(roles); //get users with the given role(s)
+    
+        var content = vars.get("$field.CONTENTDECODED");
+        if (content.length > 72)
+            content = content.substring(0, 69) + " ...";
+        if(users.length > 0)
+        NewsSystem.createNewsNotification(content //create notification 
+            ,vars.get("$field.TITLE") 
+            ,users
+            ,vars.get("$field.KNOWLEDGEMANAGEMENTID")
+            );
+    }
+            
+    vars.set("$context.setNotificationMark", false); //set it 'false' so that it doesn't trigger again if it shouldn't
+}
\ No newline at end of file
diff --git a/entity/KnowledgeManagement_entity/contentTitleProcess.js b/entity/KnowledgeManagement_entity/contentTitleProcess.js
new file mode 100644
index 00000000000..e3e512ab73c
--- /dev/null
+++ b/entity/KnowledgeManagement_entity/contentTitleProcess.js
@@ -0,0 +1,3 @@
+import("system.result");
+import("system.vars");
+result.string(vars.get("$field.TITLE"));
\ No newline at end of file
diff --git a/entity/KnowledgeManagement_entity/entityfields/author_contact_id/displayValueProcess.js b/entity/KnowledgeManagement_entity/entityfields/author_contact_id/displayValueProcess.js
new file mode 100644
index 00000000000..0929d5fdbe0
--- /dev/null
+++ b/entity/KnowledgeManagement_entity/entityfields/author_contact_id/displayValueProcess.js
@@ -0,0 +1,10 @@
+import("Sql_lib");
+import("system.neon");
+import("system.vars");
+import("system.result");
+
+if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && vars.get("$this.value"))
+    result.query("select " + new SqlMaskingUtils().concat(["PERSON.FIRSTNAME","PERSON.LASTNAME"], " ", true)
+             +" from PERSON "
+             +" join CONTACT on PERSON.PERSONID = CONTACT.PERSON_ID "
+             +" where CONTACT.CONTACTID = '" + vars.get("$this.value") + "'");
\ No newline at end of file
diff --git a/entity/KnowledgeManagement_entity/entityfields/author_contact_id/valueProcess.js b/entity/KnowledgeManagement_entity/entityfields/author_contact_id/valueProcess.js
new file mode 100644
index 00000000000..48206583bee
--- /dev/null
+++ b/entity/KnowledgeManagement_entity/entityfields/author_contact_id/valueProcess.js
@@ -0,0 +1,8 @@
+import("system.vars");
+import("system.result");
+import("system.tools");
+
+if(vars.exists("$this.value") && vars.get("$this.value") == null)
+{
+    result.string(tools.getUser(vars.get("$sys.user"))[tools.PARAMS][tools.CONTACTID]);
+}
\ No newline at end of file
diff --git a/entity/KnowledgeManagement_entity/entityfields/contentdecoded/valueProcess.js b/entity/KnowledgeManagement_entity/entityfields/contentdecoded/valueProcess.js
new file mode 100644
index 00000000000..818f75bf6ec
--- /dev/null
+++ b/entity/KnowledgeManagement_entity/entityfields/contentdecoded/valueProcess.js
@@ -0,0 +1,5 @@
+import("system.vars");
+import("system.result");
+import("system.text");
+
+result.string(text.html2text(vars.get("$field.CONTENT")));
\ No newline at end of file
diff --git a/entity/KnowledgeManagement_entity/entityfields/date_edit/valueProcess.js b/entity/KnowledgeManagement_entity/entityfields/date_edit/valueProcess.js
new file mode 100644
index 00000000000..6942583568e
--- /dev/null
+++ b/entity/KnowledgeManagement_entity/entityfields/date_edit/valueProcess.js
@@ -0,0 +1,12 @@
+import("system.vars");
+import("system.result");
+import("system.neon");
+import("system.datetime");
+
+//if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_EDIT)
+//{
+//    result.string(datetime.date());
+//}
+
+if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_EDIT)
+    result.string(vars.get("$sys.date"));
\ No newline at end of file
diff --git a/entity/KnowledgeManagement_entity/entityfields/date_new/valueProcess.js b/entity/KnowledgeManagement_entity/entityfields/date_new/valueProcess.js
new file mode 100644
index 00000000000..6f4ffab7ba7
--- /dev/null
+++ b/entity/KnowledgeManagement_entity/entityfields/date_new/valueProcess.js
@@ -0,0 +1,9 @@
+import("system.vars");
+import("system.result");
+import("system.neon");
+import("system.datetime");
+
+if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && !vars.get("$field.DATE_NEW"))
+{
+    result.string(datetime.date());
+}
\ No newline at end of file
diff --git a/entity/KnowledgeManagement_entity/entityfields/discussionsbyknowledgeid/children/knowledgeid_param/valueProcess.js b/entity/KnowledgeManagement_entity/entityfields/discussionsbyknowledgeid/children/knowledgeid_param/valueProcess.js
new file mode 100644
index 00000000000..78c1da18583
--- /dev/null
+++ b/entity/KnowledgeManagement_entity/entityfields/discussionsbyknowledgeid/children/knowledgeid_param/valueProcess.js
@@ -0,0 +1,4 @@
+import("system.vars");
+import("system.result");
+
+result.string(vars.get("$field.KNOWLEDGEMANAGEMENTID"));
\ No newline at end of file
diff --git a/entity/KnowledgeManagement_entity/entityfields/exporthtml_action/onActionProcess.js b/entity/KnowledgeManagement_entity/entityfields/exporthtml_action/onActionProcess.js
new file mode 100644
index 00000000000..942f98b2ed4
--- /dev/null
+++ b/entity/KnowledgeManagement_entity/entityfields/exporthtml_action/onActionProcess.js
@@ -0,0 +1,5 @@
+import("system.vars");
+import("system.neon");
+import("system.util");
+
+neon.download(util.encodeBase64String(vars.get("$field.htmlView")), vars.get("$field.TITLE").replace(/\s/gi,"_") + ".html");
\ No newline at end of file
diff --git a/entity/KnowledgeManagement_entity/entityfields/htmlview/valueProcess.js b/entity/KnowledgeManagement_entity/entityfields/htmlview/valueProcess.js
new file mode 100644
index 00000000000..245543678a5
--- /dev/null
+++ b/entity/KnowledgeManagement_entity/entityfields/htmlview/valueProcess.js
@@ -0,0 +1,12 @@
+import("KnowledgeManagement_lib");
+import("Html_lib");
+import("Keyword_lib");
+import("KeywordRegistry_basic");
+import("system.vars");
+import("system.result");
+
+var ret = KnowledgeManagementModel.getInstance(vars.getString("$field.CONTENT"), vars.get("$field.KNOWLEDGEMANAGEMENTID"))
+                 .style(KeywordUtils.getAttributeRelation(vars.get("$field.TYPE"), $KeywordRegistry.knowledgeType(), "contentCssStylesheet"))
+                 .replaceAditoLinks().buildHTML();
+
+result.string(ret);
\ No newline at end of file
diff --git a/entity/KnowledgeManagement_entity/entityfields/isnewsmark/valueProcess.js b/entity/KnowledgeManagement_entity/entityfields/isnewsmark/valueProcess.js
new file mode 100644
index 00000000000..a7273ea0f5d
--- /dev/null
+++ b/entity/KnowledgeManagement_entity/entityfields/isnewsmark/valueProcess.js
@@ -0,0 +1,35 @@
+import("system.neon");
+import("system.vars");
+import("system.result");
+import("Sql_lib");
+
+if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_EDIT && !vars.getString("$this.value"))
+{
+//    var config = entities.createConfigForLoadingConsumerRows()
+//        .consumer("TagsByKnowledgeId")
+//        .fields(["TAG"])
+//    
+//    var entityData = entities.getRows(config);
+    var knowledgeId = vars.get("$field.KNOWLEDGEMANAGEMENTID");
+    
+    var isTagSet = newSelect("'1'")
+                    .from("KNOWLEDGETAGLINK")
+                    .join("KNOWLEDGETAG on KNOWLEDGETAG.KNOWLEDGETAGID = KNOWLEDGETAGLINK.KNOWLEDGETAG_ID")
+                    .where("KNOWLEDGETAGLINK.KNOWLEDGEMANAGEMENT_ID  = '" + knowledgeId + "'")
+                    .and("KNOWLEDGETAG.TAG = 'News'")
+                    .cell();
+    
+    
+//    if(entityData)
+//    {
+//        entityData.map(function(row)
+//        {
+//            if(row["TAG.displayValue"] == "News")
+//            {
+//                isTagSet = 1;
+//                return;
+//            }
+//        });
+//    }
+    result.string(isTagSet ? 1 : 0);
+}
\ No newline at end of file
diff --git a/entity/KnowledgeManagement_entity/entityfields/keywordknowledgetype/children/containername_param/valueProcess.js b/entity/KnowledgeManagement_entity/entityfields/keywordknowledgetype/children/containername_param/valueProcess.js
new file mode 100644
index 00000000000..777264ed660
--- /dev/null
+++ b/entity/KnowledgeManagement_entity/entityfields/keywordknowledgetype/children/containername_param/valueProcess.js
@@ -0,0 +1,4 @@
+import("system.result");
+import("KeywordRegistry_basic");
+
+result.string($KeywordRegistry.knowledgeType());
\ No newline at end of file
diff --git a/entity/KnowledgeManagement_entity/entityfields/keywordpublish/children/containername_param/valueProcess.js b/entity/KnowledgeManagement_entity/entityfields/keywordpublish/children/containername_param/valueProcess.js
new file mode 100644
index 00000000000..ecc5b27a744
--- /dev/null
+++ b/entity/KnowledgeManagement_entity/entityfields/keywordpublish/children/containername_param/valueProcess.js
@@ -0,0 +1,4 @@
+import("system.result");
+import("KeywordRegistry_basic");
+
+result.string($KeywordRegistry.knowledgePublishLevel());
\ No newline at end of file
diff --git a/entity/KnowledgeManagement_entity/entityfields/knowledgemanagement_objecttype/valueProcess.js b/entity/KnowledgeManagement_entity/entityfields/knowledgemanagement_objecttype/valueProcess.js
new file mode 100644
index 00000000000..c437e7b5c35
--- /dev/null
+++ b/entity/KnowledgeManagement_entity/entityfields/knowledgemanagement_objecttype/valueProcess.js
@@ -0,0 +1,2 @@
+import("system.result");
+result.string("KnowledgeManagement");
\ No newline at end of file
diff --git a/entity/KnowledgeManagement_entity/entityfields/knowledgeroles/children/knowledgemanagement_param/valueProcess.js b/entity/KnowledgeManagement_entity/entityfields/knowledgeroles/children/knowledgemanagement_param/valueProcess.js
new file mode 100644
index 00000000000..78c1da18583
--- /dev/null
+++ b/entity/KnowledgeManagement_entity/entityfields/knowledgeroles/children/knowledgemanagement_param/valueProcess.js
@@ -0,0 +1,4 @@
+import("system.vars");
+import("system.result");
+
+result.string(vars.get("$field.KNOWLEDGEMANAGEMENTID"));
\ No newline at end of file
diff --git a/entity/KnowledgeManagement_entity/entityfields/knowledgeroles/children/publishlevelroles_param/valueProcess.js b/entity/KnowledgeManagement_entity/entityfields/knowledgeroles/children/publishlevelroles_param/valueProcess.js
new file mode 100644
index 00000000000..08d815d9cd5
--- /dev/null
+++ b/entity/KnowledgeManagement_entity/entityfields/knowledgeroles/children/publishlevelroles_param/valueProcess.js
@@ -0,0 +1,28 @@
+import("KeywordRegistry_basic");
+import("system.vars");
+import("system.result");
+
+//return a one dimensional array for the excluded roles from the publish level
+//$KeywordRegistry.knowledgePublishLevel$internal()
+
+var level = vars.get("$field.PUBLISH");
+
+var res = _getExcludedRoles()
+
+result.object(res);
+
+
+function _getExcludedRoles()
+{
+    switch (level)
+    {
+        case $KeywordRegistry.knowledgePublishLevel$internal(): 
+            return ["PROJECT_Partner", "PROJECT_Subcontractor", "PROJECT_ExternMitarbeiter"];
+        case $KeywordRegistry.knowledgePublishLevel$partner():
+            return ["PROJECT_ExternMitarbeiter"];
+        case $KeywordRegistry.knowledgePublishLevel$public():
+            return [""];
+        default:
+            return ["PROJECT_Partner", "PROJECT_Subcontractor", "PROJECT_ExternMitarbeiter"];
+    }
+}
\ No newline at end of file
diff --git a/entity/KnowledgeManagement_entity/entityfields/knowledgeroles/onValidation.js b/entity/KnowledgeManagement_entity/entityfields/knowledgeroles/onValidation.js
new file mode 100644
index 00000000000..d9426aaf288
--- /dev/null
+++ b/entity/KnowledgeManagement_entity/entityfields/knowledgeroles/onValidation.js
@@ -0,0 +1,15 @@
+import("system.translate");
+import("Util_lib");
+import("system.result");
+import("system.logging");
+import("system.vars");
+import("Entity_lib");
+
+vars.get("$field.KnowledgeRoles.insertedRows");
+vars.get("$field.KnowledgeRoles.changedRows");
+vars.get("$field.KnowledgeRoles.deletedRows");
+
+var data = EntityConsumerRowsHelper.getCurrentConsumerRows("KnowledgeRoles", ["ROLES"])
+
+if(Utils.toBoolean(vars.get("$field.isNewsMark")) && data[0].ROLES == "" )
+    result.string(translate.text("No role(s) selected"))
\ No newline at end of file
diff --git a/entity/KnowledgeManagement_entity/entityfields/knowledgeroles/stateProcess.js b/entity/KnowledgeManagement_entity/entityfields/knowledgeroles/stateProcess.js
new file mode 100644
index 00000000000..8a02cf00398
--- /dev/null
+++ b/entity/KnowledgeManagement_entity/entityfields/knowledgeroles/stateProcess.js
@@ -0,0 +1,11 @@
+import("Util_lib");
+import("system.vars");
+import("system.result");
+import("system.neon");
+
+//make invisible if no news
+if(!Utils.toBoolean(vars.get("$field.isNewsMark")))
+    result.string(neon.COMPONENTSTATE_INVISIBLE);
+else
+    result.string(neon.COMPONENTSTATE_EDITABLE);
+
diff --git a/entity/KnowledgeManagement_entity/entityfields/linkeddocuments/children/assignmentrowid_param/valueProcess.js b/entity/KnowledgeManagement_entity/entityfields/linkeddocuments/children/assignmentrowid_param/valueProcess.js
new file mode 100644
index 00000000000..78c1da18583
--- /dev/null
+++ b/entity/KnowledgeManagement_entity/entityfields/linkeddocuments/children/assignmentrowid_param/valueProcess.js
@@ -0,0 +1,4 @@
+import("system.vars");
+import("system.result");
+
+result.string(vars.get("$field.KNOWLEDGEMANAGEMENTID"));
\ No newline at end of file
diff --git a/entity/KnowledgeManagement_entity/entityfields/linkeddocuments/children/assignmenttable_param/valueProcess.js b/entity/KnowledgeManagement_entity/entityfields/linkeddocuments/children/assignmenttable_param/valueProcess.js
new file mode 100644
index 00000000000..3057b0f452d
--- /dev/null
+++ b/entity/KnowledgeManagement_entity/entityfields/linkeddocuments/children/assignmenttable_param/valueProcess.js
@@ -0,0 +1,3 @@
+import("system.result");
+
+result.string("KNOWLEDGEMANAGEMENT");
\ No newline at end of file
diff --git a/entity/KnowledgeManagement_entity/entityfields/linksbyknowledgeid/children/knowledgemanagementid_param/valueProcess.js b/entity/KnowledgeManagement_entity/entityfields/linksbyknowledgeid/children/knowledgemanagementid_param/valueProcess.js
new file mode 100644
index 00000000000..78c1da18583
--- /dev/null
+++ b/entity/KnowledgeManagement_entity/entityfields/linksbyknowledgeid/children/knowledgemanagementid_param/valueProcess.js
@@ -0,0 +1,4 @@
+import("system.vars");
+import("system.result");
+
+result.string(vars.get("$field.KNOWLEDGEMANAGEMENTID"));
\ No newline at end of file
diff --git a/entity/KnowledgeManagement_entity/entityfields/loghistories/children/tablenames_param/valueProcess.js b/entity/KnowledgeManagement_entity/entityfields/loghistories/children/tablenames_param/valueProcess.js
new file mode 100644
index 00000000000..d31541c503b
--- /dev/null
+++ b/entity/KnowledgeManagement_entity/entityfields/loghistories/children/tablenames_param/valueProcess.js
@@ -0,0 +1,8 @@
+import("system.vars");
+import("system.result");
+
+var res = [];
+res.push({id: vars.get("$field.KNOWLEDGEMANAGEMENTID"), tableNames: ["KNOWLEDGEMANAGEMENT","AB_ATTRIBUTERELATION","KNOWLEDGEDISCUSSION"]});
+
+res = JSON.stringify(res);//currently only strings  can be passed as param
+result.object(res);
\ No newline at end of file
diff --git a/entity/KnowledgeManagement_entity/entityfields/notificationmark/stateProcess.js b/entity/KnowledgeManagement_entity/entityfields/notificationmark/stateProcess.js
new file mode 100644
index 00000000000..1c027a16a26
--- /dev/null
+++ b/entity/KnowledgeManagement_entity/entityfields/notificationmark/stateProcess.js
@@ -0,0 +1,8 @@
+import("system.vars");
+import("system.result");
+import("system.neon");
+//make invisible if no news
+if(vars.get("$field.isNewsMark") == false)
+    result.string(neon.COMPONENTSTATE_INVISIBLE);
+else
+    result.string(neon.COMPONENTSTATE_EDITABLE);
\ No newline at end of file
diff --git a/entity/KnowledgeManagement_entity/entityfields/openentryasmail/onActionProcess.js b/entity/KnowledgeManagement_entity/entityfields/openentryasmail/onActionProcess.js
new file mode 100644
index 00000000000..069f4e90fe0
--- /dev/null
+++ b/entity/KnowledgeManagement_entity/entityfields/openentryasmail/onActionProcess.js
@@ -0,0 +1,10 @@
+import("system.tools");
+import("Email_lib");
+import("system.vars");
+import("system.result");
+
+var toSend = new Email(vars.get("$field.CONTENT"));
+
+toSend.setSender(tools.getUser(vars.get("$sys.user"))[tools.PARAMS][tools.CONTACTID]);
+toSend.subject = "Wissen: " + vars.get("$field.TITLE");
+toSend.openMail();
\ No newline at end of file
diff --git a/entity/KnowledgeManagement_entity/entityfields/publish/displayValueProcess.js b/entity/KnowledgeManagement_entity/entityfields/publish/displayValueProcess.js
new file mode 100644
index 00000000000..f3b04d35862
--- /dev/null
+++ b/entity/KnowledgeManagement_entity/entityfields/publish/displayValueProcess.js
@@ -0,0 +1,7 @@
+import("system.result");
+import("system.vars");
+import("system.neon");
+import("Keyword_lib");
+
+if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW)
+    result.string(KeywordUtils.getViewValue("KnowledgePublishLevel", vars.get("$this.value")));
\ No newline at end of file
diff --git a/entity/KnowledgeManagement_entity/entityfields/publish/valueProcess.js b/entity/KnowledgeManagement_entity/entityfields/publish/valueProcess.js
new file mode 100644
index 00000000000..3ee4bee4554
--- /dev/null
+++ b/entity/KnowledgeManagement_entity/entityfields/publish/valueProcess.js
@@ -0,0 +1,8 @@
+import("system.vars");
+import("system.result");
+import("KeywordRegistry_basic");
+
+if(vars.get("$this.value") == null)
+{
+    result.string($KeywordRegistry.knowledgePublishLevel$internal());
+}
\ No newline at end of file
diff --git a/entity/KnowledgeManagement_entity/entityfields/responsible_contact_id/displayValueProcess.js b/entity/KnowledgeManagement_entity/entityfields/responsible_contact_id/displayValueProcess.js
new file mode 100644
index 00000000000..7ffc6898e2e
--- /dev/null
+++ b/entity/KnowledgeManagement_entity/entityfields/responsible_contact_id/displayValueProcess.js
@@ -0,0 +1,12 @@
+import("Sql_lib");
+import("system.neon");
+import("system.vars");
+import("system.result");
+
+var x = 0;
+
+if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && vars.get("$this.value"))
+    result.query("select " + new SqlMaskingUtils().concat(["PERSON.FIRSTNAME","PERSON.LASTNAME"], " ", true)
+             +" from PERSON "
+             +" join CONTACT on PERSON.PERSONID = CONTACT.PERSON_ID "
+             +" where CONTACT.CONTACTID = '" + vars.get("$this.value") + "'");
\ No newline at end of file
diff --git a/entity/KnowledgeManagement_entity/entityfields/responsible_contact_id/valueProcess.js b/entity/KnowledgeManagement_entity/entityfields/responsible_contact_id/valueProcess.js
new file mode 100644
index 00000000000..48206583bee
--- /dev/null
+++ b/entity/KnowledgeManagement_entity/entityfields/responsible_contact_id/valueProcess.js
@@ -0,0 +1,8 @@
+import("system.vars");
+import("system.result");
+import("system.tools");
+
+if(vars.exists("$this.value") && vars.get("$this.value") == null)
+{
+    result.string(tools.getUser(vars.get("$sys.user"))[tools.PARAMS][tools.CONTACTID]);
+}
\ No newline at end of file
diff --git a/entity/KnowledgeManagement_entity/entityfields/tagsbyknowledgeid/children/knowledgemanagementid_param/valueProcess.js b/entity/KnowledgeManagement_entity/entityfields/tagsbyknowledgeid/children/knowledgemanagementid_param/valueProcess.js
new file mode 100644
index 00000000000..78c1da18583
--- /dev/null
+++ b/entity/KnowledgeManagement_entity/entityfields/tagsbyknowledgeid/children/knowledgemanagementid_param/valueProcess.js
@@ -0,0 +1,4 @@
+import("system.vars");
+import("system.result");
+
+result.string(vars.get("$field.KNOWLEDGEMANAGEMENTID"));
\ No newline at end of file
diff --git a/entity/KnowledgeManagement_entity/entityfields/tasks/children/objectid_param/valueProcess.js b/entity/KnowledgeManagement_entity/entityfields/tasks/children/objectid_param/valueProcess.js
new file mode 100644
index 00000000000..cc6924394ae
--- /dev/null
+++ b/entity/KnowledgeManagement_entity/entityfields/tasks/children/objectid_param/valueProcess.js
@@ -0,0 +1,4 @@
+import("Context_lib");
+import("system.result");
+
+result.string(ContextUtils.getCurrentContextId());
\ No newline at end of file
diff --git a/entity/KnowledgeManagement_entity/entityfields/tasks/children/presetlinks_param/valueProcess.js b/entity/KnowledgeManagement_entity/entityfields/tasks/children/presetlinks_param/valueProcess.js
new file mode 100644
index 00000000000..a540967e165
--- /dev/null
+++ b/entity/KnowledgeManagement_entity/entityfields/tasks/children/presetlinks_param/valueProcess.js
@@ -0,0 +1,5 @@
+import("Context_lib");
+import("system.result");
+import("system.vars");
+
+result.object([[ContextUtils.getCurrentContextId(),vars.get("$field.KNOWLEDGEMANAGEMENTID")]]);
\ No newline at end of file
diff --git a/entity/KnowledgeManagement_entity/entityfields/tasks/children/rowid_param/valueProcess.js b/entity/KnowledgeManagement_entity/entityfields/tasks/children/rowid_param/valueProcess.js
new file mode 100644
index 00000000000..78c1da18583
--- /dev/null
+++ b/entity/KnowledgeManagement_entity/entityfields/tasks/children/rowid_param/valueProcess.js
@@ -0,0 +1,4 @@
+import("system.vars");
+import("system.result");
+
+result.string(vars.get("$field.KNOWLEDGEMANAGEMENTID"));
\ No newline at end of file
diff --git a/entity/KnowledgeManagement_entity/entityfields/type/valueProcess.js b/entity/KnowledgeManagement_entity/entityfields/type/valueProcess.js
new file mode 100644
index 00000000000..534409e0c3a
--- /dev/null
+++ b/entity/KnowledgeManagement_entity/entityfields/type/valueProcess.js
@@ -0,0 +1,8 @@
+import("system.vars");
+import("system.result");
+import("KeywordRegistry_basic");
+
+if(vars.get("$this.value") == null)
+{
+    result.string($KeywordRegistry.knowledgeType$knowledgeBase());
+}
\ No newline at end of file
diff --git a/entity/KnowledgeManagement_entity/entityfields/user_edit/valueProcess.js b/entity/KnowledgeManagement_entity/entityfields/user_edit/valueProcess.js
new file mode 100644
index 00000000000..101f9115ca7
--- /dev/null
+++ b/entity/KnowledgeManagement_entity/entityfields/user_edit/valueProcess.js
@@ -0,0 +1,8 @@
+import("system.vars");
+import("system.result");
+import("system.neon");
+
+if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_EDIT)
+{
+    result.string(vars.get("$sys.user"));
+}
\ No newline at end of file
diff --git a/entity/KnowledgeManagement_entity/entityfields/user_new/valueProcess.js b/entity/KnowledgeManagement_entity/entityfields/user_new/valueProcess.js
new file mode 100644
index 00000000000..6dbbcb8ffdc
--- /dev/null
+++ b/entity/KnowledgeManagement_entity/entityfields/user_new/valueProcess.js
@@ -0,0 +1,8 @@
+import("system.vars");
+import("system.result");
+import("system.neon");
+
+if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && !vars.get("$field.USER_NEW"))
+{
+    result.string(vars.get("$sys.user"));
+}
\ No newline at end of file
diff --git a/entity/KnowledgeManagement_entity/grantDeleteProcess.js b/entity/KnowledgeManagement_entity/grantDeleteProcess.js
new file mode 100644
index 00000000000..b91bca7d674
--- /dev/null
+++ b/entity/KnowledgeManagement_entity/grantDeleteProcess.js
@@ -0,0 +1,9 @@
+import("system.result");
+import("KeywordRegistry_basic");
+import("system.vars");
+
+var type  = vars.getString("$field.TYPE");
+
+var ret = (type != $KeywordRegistry.knowledgeType$editorial());
+
+result.string(ret);
\ No newline at end of file
diff --git a/entity/KnowledgeManagement_entity/grantUpdateProcess.js b/entity/KnowledgeManagement_entity/grantUpdateProcess.js
new file mode 100644
index 00000000000..b91bca7d674
--- /dev/null
+++ b/entity/KnowledgeManagement_entity/grantUpdateProcess.js
@@ -0,0 +1,9 @@
+import("system.result");
+import("KeywordRegistry_basic");
+import("system.vars");
+
+var type  = vars.getString("$field.TYPE");
+
+var ret = (type != $KeywordRegistry.knowledgeType$editorial());
+
+result.string(ret);
\ No newline at end of file
diff --git a/entity/KnowledgeManagement_entity/iconIdProcess.js b/entity/KnowledgeManagement_entity/iconIdProcess.js
new file mode 100644
index 00000000000..385d0165847
--- /dev/null
+++ b/entity/KnowledgeManagement_entity/iconIdProcess.js
@@ -0,0 +1,6 @@
+import("system.vars");
+import("system.result");
+
+var type = vars.get("$field.TYPE.displayValue");
+
+result.string("TEXT:" + type);
\ No newline at end of file
diff --git a/entity/KnowledgeManagement_entity/recordcontainers/db/conditionProcess.js b/entity/KnowledgeManagement_entity/recordcontainers/db/conditionProcess.js
new file mode 100644
index 00000000000..8f2514f13ee
--- /dev/null
+++ b/entity/KnowledgeManagement_entity/recordcontainers/db/conditionProcess.js
@@ -0,0 +1,32 @@
+import("system.logging");
+import("AttributeRegistry_basic");
+import("Sql_lib");
+import("system.vars");
+import("system.tools");
+import("system.result");
+
+//var cond = ["knowledgemanagement.TYPE != '3'"]
+//if(tools.hasRole(vars.get("$sys.user"), "PROJECT_Support"))
+//    cond.push("knowledgemanagement.PUBLISH in ('2','3')");
+
+var cond = [];
+
+if(vars.exists("$param.isDashlet_param") && vars.get("$param.isDashlet_param")) //check if the parameter exists and is filled
+{
+    var userRoles = tools.getRoles(vars.get("$sys.user")); //get all Roles from the current User
+    var res = newWhere(null //create a new condition where we check if any data sets exists with the given parameters
+        ,newSelect("KNOWLEDGEROLES.ROLENAME") //create a subselect for all data sets with the current user roles
+        .from("KNOWLEDGEROLES")
+        .where("KNOWLEDGEROLES.KNOWLEDGEMANAGEMENT_ID = KNOWLEDGEMANAGEMENT.KNOWLEDGEMANAGEMENTID")
+        .and("KNOWLEDGEROLES.ROLENAME", userRoles, SqlBuilder.IN()), SqlBuilder.EXISTS())
+    .and(null
+        ,newSelect("KNOWLEDGETAGLINK.KNOWLEDGETAGLINKID")
+        .from("KNOWLEDGETAGLINK")
+        .where("KNOWLEDGETAGLINK.KNOWLEDGEMANAGEMENT_ID = KNOWLEDGEMANAGEMENT.KNOWLEDGEMANAGEMENTID")
+        .and("KNOWLEDGETAGLINK.KNOWLEDGETAG_ID", "1f035a33-e5a3-48e4-bda6-6d8b320177e4"), SqlBuilder.EXISTS())
+    .build();
+            
+    cond.push(SqlUtils.translateConditionWithQuotes(res)); //db RecordContainer can't use preparedStatements
+}
+
+result.string(cond.join(" and "))
\ No newline at end of file
diff --git a/entity/KnowledgeManagement_entity/recordcontainers/db/filterextensions/tagfilter/filterConditionProcess.js b/entity/KnowledgeManagement_entity/recordcontainers/db/filterextensions/tagfilter/filterConditionProcess.js
new file mode 100644
index 00000000000..4c0d2b4fae7
--- /dev/null
+++ b/entity/KnowledgeManagement_entity/recordcontainers/db/filterextensions/tagfilter/filterConditionProcess.js
@@ -0,0 +1,44 @@
+import("system.result");
+import("system.vars");
+
+var op = vars.get("$local.comparison");
+var val = vars.get("$local.rawvalue");
+
+var condition = "";
+
+switch(op)
+{
+    case "EQUAL":
+        condition = " KNOWLEDGEMANAGEMENTID in "
+                       + " (select KNOWLEDGEMANAGEMENT_ID "
+                           + "  from KNOWLEDGETAGLINK "
+                           + "  where KNOWLEDGETAG_ID = '" + val + "')";
+    break;
+    
+    case "NOT_EQUAL":
+        condition = " KNOWLEDGEMANAGEMENTID not in "
+                        + " (select KNOWLEDGEMANAGEMENT_ID "
+                            + " from KNOWLEDGETAGLINK "
+                            + " where KNOWLEDGETAG_ID = '" + val + "')";
+    break;
+    
+    case "ISNULL":
+        condition = " not exists "
+                        + " (select KNOWLEDGEMANAGEMENT_ID "
+                            + " from KNOWLEDGETAGLINK "
+                            + " where KNOWLEDGETAGLINK.KNOWLEDGEMANAGEMENT_ID = KNOWLEDGEMANAGEMENT.KNOWLEDGEMANAGEMENTID)";
+    break;
+    
+    case "ISNOTNULL":
+        condition = " exists "
+                        + " (select KNOWLEDGEMANAGEMENT_ID "
+                            + " from KNOWLEDGETAGLINK "
+                            + " where KNOWLEDGETAGLINK.KNOWLEDGEMANAGEMENT_ID = KNOWLEDGEMANAGEMENT.KNOWLEDGEMANAGEMENTID)";
+    break;
+    
+    default:
+        condition = " 1 = 2 ";
+}
+
+
+result.string(condition);
\ No newline at end of file
diff --git a/entity/KnowledgeManagement_entity/recordcontainers/db/filterextensions/tagfilter/filterValuesProcess.js b/entity/KnowledgeManagement_entity/recordcontainers/db/filterextensions/tagfilter/filterValuesProcess.js
new file mode 100644
index 00000000000..5ed258348a7
--- /dev/null
+++ b/entity/KnowledgeManagement_entity/recordcontainers/db/filterextensions/tagfilter/filterValuesProcess.js
@@ -0,0 +1,6 @@
+import("system.db");
+import("system.result");
+
+result.object( 
+    db.table("select distinct KNOWLEDGETAGID, TAG from KNOWLEDGETAG order by TAG")
+);
\ No newline at end of file
diff --git a/entity/KnowledgeManagement_entity/recordcontainers/db/onDBInsert.js b/entity/KnowledgeManagement_entity/recordcontainers/db/onDBInsert.js
new file mode 100644
index 00000000000..091635be044
--- /dev/null
+++ b/entity/KnowledgeManagement_entity/recordcontainers/db/onDBInsert.js
@@ -0,0 +1,17 @@
+import("system.neon");
+import("system.vars");
+import("NewsSystem_lib");
+import("Util_lib");
+
+var bool = Utils.toBoolean; //Alias Utils.toBoolean to bool for easier reading
+
+if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW 
+        && vars.exists("$field.isNewsMark") 
+        && bool(vars.get("$field.isNewsMark")))
+{
+    NewsSystem.setAsNews(
+        vars.get("$field.KNOWLEDGEMANAGEMENTID")
+        , bool(vars.get("$field.notificationMark"))
+        , bool(vars.get("$field.isNewsMark"))
+    );
+}
\ No newline at end of file
diff --git a/entity/KnowledgeManagement_entity/recordcontainers/db/onDBUpdate.js b/entity/KnowledgeManagement_entity/recordcontainers/db/onDBUpdate.js
new file mode 100644
index 00000000000..091635be044
--- /dev/null
+++ b/entity/KnowledgeManagement_entity/recordcontainers/db/onDBUpdate.js
@@ -0,0 +1,17 @@
+import("system.neon");
+import("system.vars");
+import("NewsSystem_lib");
+import("Util_lib");
+
+var bool = Utils.toBoolean; //Alias Utils.toBoolean to bool for easier reading
+
+if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW 
+        && vars.exists("$field.isNewsMark") 
+        && bool(vars.get("$field.isNewsMark")))
+{
+    NewsSystem.setAsNews(
+        vars.get("$field.KNOWLEDGEMANAGEMENTID")
+        , bool(vars.get("$field.notificationMark"))
+        , bool(vars.get("$field.isNewsMark"))
+    );
+}
\ No newline at end of file
diff --git a/entity/KnowledgeManagement_entity/recordcontainers/db/orderClauseProcess.js b/entity/KnowledgeManagement_entity/recordcontainers/db/orderClauseProcess.js
new file mode 100644
index 00000000000..937b8f6eee3
--- /dev/null
+++ b/entity/KnowledgeManagement_entity/recordcontainers/db/orderClauseProcess.js
@@ -0,0 +1,6 @@
+import("system.db");
+import("system.result");
+
+result.object({
+    "COALESCE(KNOWLEDGEMANAGEMENT.DATE_EDIT, KNOWLEDGEMANAGEMENT.DATE_NEW)": db.DESCENDING
+})
\ No newline at end of file
diff --git a/entity/KnowledgeManagement_entity/recordcontainers/db/recordfieldmappings/author_contact_id.displayvalue/expression.js b/entity/KnowledgeManagement_entity/recordcontainers/db/recordfieldmappings/author_contact_id.displayvalue/expression.js
new file mode 100644
index 00000000000..3c7655ed448
--- /dev/null
+++ b/entity/KnowledgeManagement_entity/recordcontainers/db/recordfieldmappings/author_contact_id.displayvalue/expression.js
@@ -0,0 +1,7 @@
+import("system.result");
+import("Sql_lib");
+
+result.string("select " + new SqlMaskingUtils().concat(["PERSON.FIRSTNAME","PERSON.LASTNAME"], " ", true)
+             +" from PERSON "
+             +" join CONTACT on PERSON.PERSONID = CONTACT.PERSON_ID "
+             +" where CONTACT.CONTACTID = KNOWLEDGEMANAGEMENT.AUTHOR_CONTACT_ID");
\ No newline at end of file
diff --git a/entity/KnowledgeManagement_entity/recordcontainers/db/recordfieldmappings/knowledgeroles/filterConditionProcess.js b/entity/KnowledgeManagement_entity/recordcontainers/db/recordfieldmappings/knowledgeroles/filterConditionProcess.js
new file mode 100644
index 00000000000..75a22c1e5af
--- /dev/null
+++ b/entity/KnowledgeManagement_entity/recordcontainers/db/recordfieldmappings/knowledgeroles/filterConditionProcess.js
@@ -0,0 +1,4 @@
+import("system.vars");
+import("system.result");
+
+result.string("KNOWLEDGEMANAGEMENTID in (select KNOWLEDGEROLES.KNOWLEDGEMANAGEMENT_ID from KNOWLEDGEROLES where "  + vars.get("$local.condition") + " )");
\ No newline at end of file
diff --git a/entity/KnowledgeManagement_entity/recordcontainers/db/recordfieldmappings/lastchange.value/expression.js b/entity/KnowledgeManagement_entity/recordcontainers/db/recordfieldmappings/lastchange.value/expression.js
new file mode 100644
index 00000000000..c62b1991496
--- /dev/null
+++ b/entity/KnowledgeManagement_entity/recordcontainers/db/recordfieldmappings/lastchange.value/expression.js
@@ -0,0 +1,6 @@
+import("system.result");
+import("Sql_lib");
+
+var maskUtil = new SqlMaskingUtils();
+
+result.string( maskUtil.coalesce(["DATE_EDIT","DATE_NEW"]) );
\ No newline at end of file
diff --git a/entity/KnowledgeManagement_entity/recordcontainers/db/recordfieldmappings/publish.displayvalue/expression.js b/entity/KnowledgeManagement_entity/recordcontainers/db/recordfieldmappings/publish.displayvalue/expression.js
new file mode 100644
index 00000000000..caefc84ff51
--- /dev/null
+++ b/entity/KnowledgeManagement_entity/recordcontainers/db/recordfieldmappings/publish.displayvalue/expression.js
@@ -0,0 +1,4 @@
+import("Keyword_lib");
+import("system.result");
+
+result.string(KeywordUtils.getResolvedTitleSqlPart("KnowledgePublishLevel", "knowledgemanagement.PUBLISH"));
\ No newline at end of file
diff --git a/entity/KnowledgeManagement_entity/recordcontainers/db/recordfieldmappings/responsible_contact_id.displayvalue/expression.js b/entity/KnowledgeManagement_entity/recordcontainers/db/recordfieldmappings/responsible_contact_id.displayvalue/expression.js
new file mode 100644
index 00000000000..d56b5495f60
--- /dev/null
+++ b/entity/KnowledgeManagement_entity/recordcontainers/db/recordfieldmappings/responsible_contact_id.displayvalue/expression.js
@@ -0,0 +1,7 @@
+import("system.result");
+import("Sql_lib");
+
+result.string("select " + new SqlMaskingUtils().concat(["PERSON.FIRSTNAME","PERSON.LASTNAME"], " ", true)
+             +" from PERSON "
+             +" join CONTACT on PERSON.PERSONID = CONTACT.PERSON_ID "
+             +" where CONTACT.CONTACTID = KNOWLEDGEMANAGEMENT.RESPONSIBLE_CONTACT_ID");
\ No newline at end of file
diff --git a/entity/KnowledgeManagement_entity/recordcontainers/db/recordfieldmappings/type.displayvalue/expression.js b/entity/KnowledgeManagement_entity/recordcontainers/db/recordfieldmappings/type.displayvalue/expression.js
new file mode 100644
index 00000000000..3f4fde9ce6d
--- /dev/null
+++ b/entity/KnowledgeManagement_entity/recordcontainers/db/recordfieldmappings/type.displayvalue/expression.js
@@ -0,0 +1,4 @@
+import("Keyword_lib");
+import("system.result");
+
+result.string(KeywordUtils.getResolvedTitleSqlPart("KnowledgeType", "knowledgemanagement.TYPE"));
\ No newline at end of file
diff --git a/entity/KnowledgeManagement_entity/recordcontainers/indexsearchknowledgebase/affectedIds.js b/entity/KnowledgeManagement_entity/recordcontainers/indexsearchknowledgebase/affectedIds.js
new file mode 100644
index 00000000000..0a323b07c09
--- /dev/null
+++ b/entity/KnowledgeManagement_entity/recordcontainers/indexsearchknowledgebase/affectedIds.js
@@ -0,0 +1,25 @@
+import("system.db");
+import("system.result");
+import("system.vars");
+import("IndexSearch_lib");
+import("Sql_lib");
+
+var infoContainer, onUpdFn, tableName, res;
+
+tableName = vars.get("$local.table");
+idValue = vars.get("$local.idvalue");
+
+switch (tableName)
+{
+    case "KNOWLEDGEMANAGEMENT":
+        res = [idValue];
+        break;
+    case "KNOWLEDGETAGLINK":
+        res = db.array(db.COLUMN, "select KNOWLEDGEMANAGEMENT_ID from KNOWLEDGETAGLINK where KNOWLEDGETAGLINKID = '" + idValue + "'");
+        break;
+}
+
+if (res) {
+    result.object(res);
+}
+    
\ No newline at end of file
diff --git a/entity/KnowledgeManagement_entity/recordcontainers/indexsearchknowledgebase/patternExtensionProcess.js b/entity/KnowledgeManagement_entity/recordcontainers/indexsearchknowledgebase/patternExtensionProcess.js
new file mode 100644
index 00000000000..ad39e57e9cd
--- /dev/null
+++ b/entity/KnowledgeManagement_entity/recordcontainers/indexsearchknowledgebase/patternExtensionProcess.js
@@ -0,0 +1,11 @@
+import("system.logging");
+import("system.result");
+import("system.db");
+import("system.vars");
+import("system.tools");
+
+if(tools.hasRole(vars.get("$sys.user"), "PROJECT_Support"))
+{
+    var filter = "( +_index_group_:KNOWLEDGE_KNOWLEDGEBASE + ( (publish_value: 2)) ) OR ( -_index_group_:KNOWLEDGE_KNOWLEDGEBASE )";
+    result.string(filter)
+}
\ No newline at end of file
diff --git a/entity/KnowledgeManagement_entity/recordcontainers/indexsearchknowledgebase/query.js b/entity/KnowledgeManagement_entity/recordcontainers/indexsearchknowledgebase/query.js
new file mode 100644
index 00000000000..d35d47bbda4
--- /dev/null
+++ b/entity/KnowledgeManagement_entity/recordcontainers/indexsearchknowledgebase/query.js
@@ -0,0 +1,42 @@
+import("system.vars");
+import("system.result");
+import("KeywordRegistry_basic");
+import("Sql_lib");
+import("system.SQLTYPES");
+
+var condition = "";
+if ( vars.exists("$local.idvalue") )
+{
+    var ids = vars.get("$local.idvalue");
+    condition = " where km1.KNOWLEDGEMANAGEMENTID in ('" + ids.join("', '") + "')";
+}
+// the case when construct is used to decide, to which sub group the entry belongs
+var sql = "select km1.KNOWLEDGEMANAGEMENTID, km1.TITLE, " + new SqlMaskingUtils().castLob("CONTENTDECODED", 255)
+        + ", km1.KNOWLEDGEMANAGEMENTID, km1.TITLE, km1.CONTENTDECODED, KNOWLEDGETAG.TAG, "
+        + "case when exists( \
+                    select '1' \
+                    from KNOWLEDGEMANAGEMENT \
+                    join KNOWLEDGETAGLINK on KNOWLEDGEMANAGEMENTID = KNOWLEDGEMANAGEMENT_ID \
+                    join KNOWLEDGETAG on KNOWLEDGETAGID = KNOWLEDGETAG_ID \
+                    where KNOWLEDGETAG.TAG = 'News' \
+                          and KNOWLEDGEMANAGEMENT.KNOWLEDGEMANAGEMENTID = km1.KNOWLEDGEMANAGEMENTID \
+            ) \
+            then 'News' \
+            else case when GITPATH is null and TYPE = 1 \
+                then 'Knowledgebase' \
+                else case when GITPATH is not null and TYPE = 2 \
+                     then 'Editorial' \
+                     else case when TYPE = 3 \
+                          then 'Business process' \
+                          end \
+                     end \
+                end \
+            end "
+        + ", ''"
+        + " from KNOWLEDGEMANAGEMENT km1 "
+        + " left join KNOWLEDGETAGLINK on KNOWLEDGEMANAGEMENTID = KNOWLEDGEMANAGEMENT_ID"
+        + " left join KNOWLEDGETAG on KNOWLEDGETAGID = KNOWLEDGETAG_ID"
+        + condition
+        + " order by KNOWLEDGEMANAGEMENTID"
+
+result.string(sql);
\ No newline at end of file
diff --git a/entity/KnowledgeManagement_entity/recordcontainers/indexsearchknowledgebase/subProcess.js b/entity/KnowledgeManagement_entity/recordcontainers/indexsearchknowledgebase/subProcess.js
new file mode 100644
index 00000000000..197f0230b50
--- /dev/null
+++ b/entity/KnowledgeManagement_entity/recordcontainers/indexsearchknowledgebase/subProcess.js
@@ -0,0 +1,7 @@
+import("system.vars");
+import("system.result");
+import("KnowledgeManagement_lib");
+
+var res = KnowledgeIndexHelper.getInstance(vars.get("$local.idvalue"),vars.get("$local.data")).getDocumentsFromContent().data;
+
+result.object(res);
\ No newline at end of file
diff --git a/entity/KnowledgeNewsFeed_entity/KnowledgeNewsFeed_entity.aod b/entity/KnowledgeNewsFeed_entity/KnowledgeNewsFeed_entity.aod
new file mode 100644
index 00000000000..289c14e605d
--- /dev/null
+++ b/entity/KnowledgeNewsFeed_entity/KnowledgeNewsFeed_entity.aod
@@ -0,0 +1,33 @@
+<?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>KnowledgeNewsFeed_entity</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <documentation>%aditoprj%/entity/KnowledgeNewsFeed_entity/documentation.adoc</documentation>
+  <title>Feed</title>
+  <recordContainer>recordContainer</recordContainer>
+  <entityFields>
+    <entityProvider>
+      <name>#PROVIDER</name>
+    </entityProvider>
+    <entityField>
+      <name>HTMLContent</name>
+      <title>Content</title>
+      <contentType>HTML</contentType>
+      <valueProcess>%aditoprj%/entity/KnowledgeNewsFeed_entity/entityfields/htmlcontent/valueProcess.js</valueProcess>
+    </entityField>
+    <entityParameter>
+      <name>Parameter</name>
+      <expose v="true" />
+    </entityParameter>
+    <entityProvider>
+      <name>#PROVIDER_AGGREGATES</name>
+      <useAggregates v="true" />
+    </entityProvider>
+  </entityFields>
+  <recordContainers>
+    <datalessRecordContainer>
+      <name>recordContainer</name>
+      <alias>Data_alias</alias>
+    </datalessRecordContainer>
+  </recordContainers>
+</entity>
diff --git a/entity/KnowledgeNewsFeed_entity/documentation.adoc b/entity/KnowledgeNewsFeed_entity/documentation.adoc
new file mode 100644
index 00000000000..32d6227c662
--- /dev/null
+++ b/entity/KnowledgeNewsFeed_entity/documentation.adoc
@@ -0,0 +1,3 @@
+= Knowledge Newsfeed
+
+This entity is used for the creation of the newsfeed in ADITO. A HTML is generated and will be displayed in the client
\ No newline at end of file
diff --git a/entity/KnowledgeNewsFeed_entity/entityfields/htmlcontent/valueProcess.js b/entity/KnowledgeNewsFeed_entity/entityfields/htmlcontent/valueProcess.js
new file mode 100644
index 00000000000..ed8c1c9f315
--- /dev/null
+++ b/entity/KnowledgeNewsFeed_entity/entityfields/htmlcontent/valueProcess.js
@@ -0,0 +1,34 @@
+import("KeywordRegistry_basic");
+import("system.vars");
+import("Keyword_lib");
+import("Html_lib");
+import("system.entities");
+import("system.result");
+
+var config = entities.createConfigForLoadingRows()
+    .addParameter("isDashlet_param", true)
+    .entity("KnowledgeManagement_entity")
+    .fields(["TITLE", "CONTENT", "AUTHOR_CONTACT_ID.displayValue", "AUTHOR_CONTACT_ID"])
+    .ignorePermissions(true)
+    .count(10);
+    
+var data = entities.getRows(config);
+
+var htmlContent = "";
+
+if(data)
+{
+    data.forEach(function(row)
+    {
+        htmlContent += "<H2>" +  row["TITLE"] + "</H2>\n";
+        htmlContent += "<h3>" +  row["AUTHOR_CONTACT_ID.displayValue"] + "</h3>";
+        htmlContent += "<p>" +  row["CONTENT"] + "</p>\n";
+        htmlContent += "<hr>\n";
+    });
+}
+
+var css = KeywordUtils.getAttributeRelation($KeywordRegistry.knowledgeType$knowledgeBase(), $KeywordRegistry.knowledgeType(), "contentCssStylesheet");
+
+var htmlBody = SimpleHtmlObject.getInstance().body(htmlContent).style(css).toString();
+
+result.string(htmlBody);
diff --git a/entity/KnowledgeRole_entity/KnowledgeRole_entity.aod b/entity/KnowledgeRole_entity/KnowledgeRole_entity.aod
new file mode 100644
index 00000000000..cec4b2173e0
--- /dev/null
+++ b/entity/KnowledgeRole_entity/KnowledgeRole_entity.aod
@@ -0,0 +1,110 @@
+<?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>KnowledgeRole_entity</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <recordContainer>db</recordContainer>
+  <entityFields>
+    <entityProvider>
+      <name>#PROVIDER</name>
+    </entityProvider>
+    <entityField>
+      <name>ROLES</name>
+      <title>Roles</title>
+      <consumer>NewsRole</consumer>
+      <displayValueProcess>%aditoprj%/entity/KnowledgeRole_entity/entityfields/roles/displayValueProcess.js</displayValueProcess>
+    </entityField>
+    <entityConsumer>
+      <name>NewsRole</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Role_entity</entityName>
+        <fieldName>FilterRolesWithoutPermission</fieldName>
+      </dependency>
+      <children>
+        <entityParameter>
+          <name>ExcludeRoles_param</name>
+          <valueProcess>%aditoprj%/entity/KnowledgeRole_entity/entityfields/newsrole/children/excluderoles_param/valueProcess.js</valueProcess>
+        </entityParameter>
+      </children>
+    </entityConsumer>
+    <entityProvider>
+      <name>KnowledgeRole</name>
+      <lookupIdfield>ROLES</lookupIdfield>
+      <titlePlural>KnowledgeRoles</titlePlural>
+      <recordContainer>db</recordContainer>
+      <dependencies>
+        <entityDependency>
+          <name>404bd92c-6222-4b58-95b4-d7f657b62c82</name>
+          <entityName>KnowledgeManagement_entity</entityName>
+          <fieldName>KnowledgeRoles</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+      </dependencies>
+    </entityProvider>
+    <entityField>
+      <name>KNOWLEDGEROLEID</name>
+    </entityField>
+    <entityField>
+      <name>KNOWLEDGEMANAGMENT_ID</name>
+      <state>INVISIBLE</state>
+      <valueProcess>%aditoprj%/entity/KnowledgeRole_entity/entityfields/knowledgemanagment_id/valueProcess.js</valueProcess>
+    </entityField>
+    <entityField>
+      <name>TARGETCONTEXT</name>
+      <valueProcess>%aditoprj%/entity/KnowledgeRole_entity/entityfields/targetcontext/valueProcess.js</valueProcess>
+    </entityField>
+    <entityParameter>
+      <name>KnowledgeManagement_param</name>
+      <expose v="true" />
+    </entityParameter>
+    <entityParameter>
+      <name>CurrentRoles_param</name>
+    </entityParameter>
+    <entityProvider>
+      <name>#PROVIDER_AGGREGATES</name>
+      <useAggregates v="true" />
+    </entityProvider>
+    <entityParameter>
+      <name>PublishLevelRoles_param</name>
+      <expose v="true" />
+    </entityParameter>
+  </entityFields>
+  <recordContainers>
+    <dbRecordContainer>
+      <name>db</name>
+      <alias>Data_alias</alias>
+      <hasDependentRecords v="true" />
+      <conditionProcess>%aditoprj%/entity/KnowledgeRole_entity/recordcontainers/db/conditionProcess.js</conditionProcess>
+      <title>Knowledge Roles</title>
+      <linkInformation>
+        <linkInformation>
+          <name>16e6127e-67c6-4dce-b2e9-4b2b951dbcd4</name>
+          <tableName>KNOWLEDGEROLES</tableName>
+          <primaryKey>KNOWLEDGEROLESID</primaryKey>
+          <isUIDTable v="true" />
+          <readonly v="false" />
+        </linkInformation>
+      </linkInformation>
+      <recordFieldMappings>
+        <dbRecordFieldMapping>
+          <name>ROLES.value</name>
+          <recordfield>KNOWLEDGEROLES.ROLENAME</recordfield>
+          <isFilterable v="true" />
+          <isLookupFilter v="true" />
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>KNOWLEDGEROLEID.value</name>
+          <recordfield>KNOWLEDGEROLES.KNOWLEDGEROLESID</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>KNOWLEDGEMANAGMENT_ID.value</name>
+          <recordfield>KNOWLEDGEROLES.KNOWLEDGEMANAGEMENT_ID</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>ROLES.displayValue</name>
+          <expression>%aditoprj%/entity/KnowledgeRole_entity/recordcontainers/db/recordfieldmappings/roles.displayvalue/expression.js</expression>
+        </dbRecordFieldMapping>
+      </recordFieldMappings>
+    </dbRecordContainer>
+  </recordContainers>
+</entity>
diff --git a/entity/KnowledgeRole_entity/entityfields/knowledgemanagment_id/valueProcess.js b/entity/KnowledgeRole_entity/entityfields/knowledgemanagment_id/valueProcess.js
new file mode 100644
index 00000000000..10f790fb648
--- /dev/null
+++ b/entity/KnowledgeRole_entity/entityfields/knowledgemanagment_id/valueProcess.js
@@ -0,0 +1,5 @@
+import("system.result");
+import("system.neon");
+import("system.vars");
+
+result.string(vars.get("$param.KnowledgeManagement_param"));
\ No newline at end of file
diff --git a/entity/KnowledgeRole_entity/entityfields/newsrole/children/excluderoles_param/valueProcess.js b/entity/KnowledgeRole_entity/entityfields/newsrole/children/excluderoles_param/valueProcess.js
new file mode 100644
index 00000000000..937bc3cba44
--- /dev/null
+++ b/entity/KnowledgeRole_entity/entityfields/newsrole/children/excluderoles_param/valueProcess.js
@@ -0,0 +1,12 @@
+import("system.vars");
+import("system.result");
+
+//RIP Richy
+var roles = JSON.parse(vars.get("$param.PublishLevelRoles_param"));
+var roleArray = ["XMPP_OK", "INTERNAL_WEBSERVICE", "INTERNAL_CANARY", "INTERNAL_EVERYONE", "INTERNAL_GROUPWARE", "INTERNAL_SNMP", "INTERNAL_DESIGNER", "INTERNAL_TECHNICAL", "INTERNAL_DASHBOARDSTOREADMIN", ]
+    .concat(roles); //concat the excluded roles with the other roles
+var res = JSON.stringify(roleArray); //stringify the array
+
+
+
+result.string(res); //return
\ No newline at end of file
diff --git a/entity/KnowledgeRole_entity/entityfields/roles/displayValueProcess.js b/entity/KnowledgeRole_entity/entityfields/roles/displayValueProcess.js
new file mode 100644
index 00000000000..6890d68fc5d
--- /dev/null
+++ b/entity/KnowledgeRole_entity/entityfields/roles/displayValueProcess.js
@@ -0,0 +1,13 @@
+import("system.result");
+import("system.vars");
+import("system.tools");
+
+var allRoles = tools.getAllRoles(["PROJECT", "CUSTOM"], true);
+var roleTitle = vars.get("$field.ROLES");
+
+if (roleTitle in allRoles)
+{
+    roleTitle = allRoles[roleTitle][0];
+}
+
+result.string(roleTitle);
\ No newline at end of file
diff --git a/entity/KnowledgeRole_entity/entityfields/targetcontext/valueProcess.js b/entity/KnowledgeRole_entity/entityfields/targetcontext/valueProcess.js
new file mode 100644
index 00000000000..c9d54057e5a
--- /dev/null
+++ b/entity/KnowledgeRole_entity/entityfields/targetcontext/valueProcess.js
@@ -0,0 +1,3 @@
+import("system.result");
+
+result.string("KnowledgeManagement");
\ No newline at end of file
diff --git a/entity/KnowledgeRole_entity/recordcontainers/db/conditionProcess.js b/entity/KnowledgeRole_entity/recordcontainers/db/conditionProcess.js
new file mode 100644
index 00000000000..9148537a0db
--- /dev/null
+++ b/entity/KnowledgeRole_entity/recordcontainers/db/conditionProcess.js
@@ -0,0 +1,6 @@
+import("system.result");
+import("Sql_lib");
+
+var cond = newWhereIfSet("KNOWLEDGEROLES.KNOWLEDGEMANAGEMENT_ID", "$param.KnowledgeManagement_param");
+
+result.string(cond.toString());
\ No newline at end of file
diff --git a/entity/KnowledgeRole_entity/recordcontainers/db/recordfieldmappings/roles.displayvalue/expression.js b/entity/KnowledgeRole_entity/recordcontainers/db/recordfieldmappings/roles.displayvalue/expression.js
new file mode 100644
index 00000000000..c694956db20
--- /dev/null
+++ b/entity/KnowledgeRole_entity/recordcontainers/db/recordfieldmappings/roles.displayvalue/expression.js
@@ -0,0 +1,7 @@
+import("system.result");
+import("NewsSystem_lib");
+
+var resultSubSQL = NewsSystem.getDisplayValue();
+
+result.string(resultSubSQL);
+
diff --git a/entity/Role_entity/Role_entity.aod b/entity/Role_entity/Role_entity.aod
index b1e75e67c1d..6bff89e164d 100644
--- a/entity/Role_entity/Role_entity.aod
+++ b/entity/Role_entity/Role_entity.aod
@@ -173,6 +173,10 @@
       <name>#PROVIDER_AGGREGATES</name>
       <useAggregates v="true" />
     </entityProvider>
+    <entityProvider>
+      <name>FilterRolesWithoutPermission</name>
+      <usePermissions v="false" />
+    </entityProvider>
   </entityFields>
   <recordContainers>
     <jDitoRecordContainer>
diff --git a/neonContext/KnowledgeDiscussion/KnowledgeDiscussion.aod b/neonContext/KnowledgeDiscussion/KnowledgeDiscussion.aod
new file mode 100644
index 00000000000..4c1a61df497
--- /dev/null
+++ b/neonContext/KnowledgeDiscussion/KnowledgeDiscussion.aod
@@ -0,0 +1,24 @@
+<?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>KnowledgeDiscussion</name>
+  <title>Discussion</title>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <filterView>KnowledgeDiscussionTree_view</filterView>
+  <editView>KnowledgeDiscussionEdit_view</editView>
+  <previewView>KnowledgeDiscussionPreview_view</previewView>
+  <entity>KnowledgeDiscussion_entity</entity>
+  <references>
+    <neonViewReference>
+      <name>a400341e-5b6b-4952-a0fe-1f88c3e55027</name>
+      <view>KnowledgeDiscussionTree_view</view>
+    </neonViewReference>
+    <neonViewReference>
+      <name>fbb4d64f-5167-4d8f-b9ac-4cdb4f1ceb59</name>
+      <view>KnowledgeDiscussionPreview_view</view>
+    </neonViewReference>
+    <neonViewReference>
+      <name>05aa5ff8-7204-4949-b19c-f6fd15dc24fd</name>
+      <view>KnowledgeDiscussionEdit_view</view>
+    </neonViewReference>
+  </references>
+</neonContext>
diff --git a/neonContext/KnowledgeLink/KnowledgeLink.aod b/neonContext/KnowledgeLink/KnowledgeLink.aod
new file mode 100644
index 00000000000..e7b3b4c531d
--- /dev/null
+++ b/neonContext/KnowledgeLink/KnowledgeLink.aod
@@ -0,0 +1,27 @@
+<?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>KnowledgeLink</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <filterView>KnowledgeLinkLookup_view</filterView>
+  <editView>KnowledgeLinkEdit_view</editView>
+  <lookupView>KnowledgeLinkLookup_view</lookupView>
+  <entity>KnowledgeLink_entity</entity>
+  <references>
+    <neonViewReference>
+      <name>04a5480c-7327-46e8-8835-db77de3c6994</name>
+      <view>KnowledgeLinkLookup_view</view>
+    </neonViewReference>
+    <neonViewReference>
+      <name>7c4b7964-6668-4cfb-a2b3-9ca63dc10741</name>
+      <view>KnowledgeLinkActionList_view</view>
+    </neonViewReference>
+    <neonViewReference>
+      <name>51436b95-a74b-406a-8029-ab5113eedfa3</name>
+      <view>KnowledgeLinkEdit_view</view>
+    </neonViewReference>
+    <neonViewReference>
+      <name>051675e5-f526-4588-9b5c-72d9b4de00ab</name>
+      <view>KnowledgeLinkMultiEdit_view</view>
+    </neonViewReference>
+  </references>
+</neonContext>
diff --git a/neonContext/KnowledgeManagement/KnowledgeManagement.aod b/neonContext/KnowledgeManagement/KnowledgeManagement.aod
new file mode 100644
index 00000000000..b6caadef74f
--- /dev/null
+++ b/neonContext/KnowledgeManagement/KnowledgeManagement.aod
@@ -0,0 +1,48 @@
+<?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>KnowledgeManagement</name>
+  <title>Knowledgemanagement</title>
+  <description>&lt;null value&gt;</description>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <icon>VAADIN:ACADEMY_CAP</icon>
+  <mainView>KnowledgeManagementMain_view</mainView>
+  <filterView>KnowledgeManagementFilter_view</filterView>
+  <editView>KnowledgeManagementEdit_view</editView>
+  <previewView>KnowledgeManagementPreview_view</previewView>
+  <lookupView>KnowledgeManagementLookup_view</lookupView>
+  <entity>KnowledgeManagement_entity</entity>
+  <references>
+    <neonViewReference>
+      <name>37f60641-26b3-4fbd-b2fa-b69169de0cfe</name>
+      <view>KnowledgeManagementMain_view</view>
+    </neonViewReference>
+    <neonViewReference>
+      <name>aa5aab07-8093-4c3f-802e-3c5e2f15a307</name>
+      <view>KnowledgeManagementFilter_view</view>
+    </neonViewReference>
+    <neonViewReference>
+      <name>1c97f522-d463-42ce-ae31-2973b48f9be4</name>
+      <view>KnowledgeManagementPreview_view</view>
+    </neonViewReference>
+    <neonViewReference>
+      <name>3977743f-ab3a-472e-bb80-cea475f48aaa</name>
+      <view>KnowledgeManagementEdit_view</view>
+    </neonViewReference>
+    <neonViewReference>
+      <name>d6960882-2d57-40e1-b5bf-bf317e0ca9f4</name>
+      <view>KnowledgeManagementDetails_view</view>
+    </neonViewReference>
+    <neonViewReference>
+      <name>d94d09f3-b02c-4b8d-849e-c15d3fcbb393</name>
+      <view>KnowledgeManagementLookup_view</view>
+    </neonViewReference>
+    <neonViewReference>
+      <name>d94d09f3-b02c-4b8d-849e-c15d3fcbb394</name>
+      <view>KnowledgeManagementTimeline_view</view>
+    </neonViewReference>
+    <neonViewReference>
+      <name>4e903d37-f2ac-4368-99aa-aee2492a03dc</name>
+      <view>KnowledgeManagementRole_view</view>
+    </neonViewReference>
+  </references>
+</neonContext>
diff --git a/neonContext/KnowledgeManagementTagList/KnowledgeManagementTagList.aod b/neonContext/KnowledgeManagementTagList/KnowledgeManagementTagList.aod
new file mode 100644
index 00000000000..979843a0d36
--- /dev/null
+++ b/neonContext/KnowledgeManagementTagList/KnowledgeManagementTagList.aod
@@ -0,0 +1,6 @@
+<?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>KnowledgeManagementTagList</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <entity>KnowledgeManagementTagList_entity</entity>
+</neonContext>
diff --git a/neonContext/KnowledgeManagementTags/KnowledgeManagementTags.aod b/neonContext/KnowledgeManagementTags/KnowledgeManagementTags.aod
new file mode 100644
index 00000000000..038ba14e387
--- /dev/null
+++ b/neonContext/KnowledgeManagementTags/KnowledgeManagementTags.aod
@@ -0,0 +1,16 @@
+<?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>KnowledgeManagementTags</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <entity>KnowledgeManagementTags_entity</entity>
+  <references>
+    <neonViewReference>
+      <name>019050b1-db8f-4900-9ad1-d412cc9ec5b5</name>
+      <view>KnowledgeTagList_view</view>
+    </neonViewReference>
+    <neonViewReference>
+      <name>82e1dc21-123d-41f1-b9b7-cdd0a3c3d4c9</name>
+      <view>KnowledgeTagList_GenMult_view</view>
+    </neonViewReference>
+  </references>
+</neonContext>
diff --git a/neonContext/KnowledgeNewsFeed/KnowledgeNewsFeed.aod b/neonContext/KnowledgeNewsFeed/KnowledgeNewsFeed.aod
new file mode 100644
index 00000000000..f9bc4fdec87
--- /dev/null
+++ b/neonContext/KnowledgeNewsFeed/KnowledgeNewsFeed.aod
@@ -0,0 +1,14 @@
+<?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>KnowledgeNewsFeed</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <mainView>KnowledgeNewsFeed_view</mainView>
+  <filterView>KnowledgeNewsFeed_view</filterView>
+  <entity>KnowledgeNewsFeed_entity</entity>
+  <references>
+    <neonViewReference>
+      <name>a6965156-ab52-4520-a3be-1351eacd863d</name>
+      <view>KnowledgeNewsFeed_view</view>
+    </neonViewReference>
+  </references>
+</neonContext>
diff --git a/neonContext/KnowledgeRole/KnowledgeRole.aod b/neonContext/KnowledgeRole/KnowledgeRole.aod
new file mode 100644
index 00000000000..68bba633d72
--- /dev/null
+++ b/neonContext/KnowledgeRole/KnowledgeRole.aod
@@ -0,0 +1,13 @@
+<?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>KnowledgeRole</name>
+  <title>Knowledgerole</title>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <entity>KnowledgeRole_entity</entity>
+  <references>
+    <neonViewReference>
+      <name>d36e2044-65ed-4055-89ad-e8488f43123d</name>
+      <view>KnowledgeRoleEdit_view</view>
+    </neonViewReference>
+  </references>
+</neonContext>
diff --git a/neonView/KnowledgeDiscussionEdit_view/KnowledgeDiscussionEdit_view.aod b/neonView/KnowledgeDiscussionEdit_view/KnowledgeDiscussionEdit_view.aod
new file mode 100644
index 00000000000..8982a135812
--- /dev/null
+++ b/neonView/KnowledgeDiscussionEdit_view/KnowledgeDiscussionEdit_view.aod
@@ -0,0 +1,27 @@
+<?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>KnowledgeDiscussionEdit_view</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <size>SMALL</size>
+  <layout>
+    <boxLayout>
+      <name>layout</name>
+    </boxLayout>
+  </layout>
+  <children>
+    <genericViewTemplate>
+      <name>Generic</name>
+      <editMode v="true" />
+      <drawerCaption>Discussion</drawerCaption>
+      <fixedDrawer v="true" />
+      <hideLabels v="true" />
+      <entityField>#ENTITY</entityField>
+      <fields>
+        <entityFieldLink>
+          <name>c87217ce-184e-4436-9b58-0d20b218c864</name>
+          <entityField>DISCUSSIONTEXT</entityField>
+        </entityFieldLink>
+      </fields>
+    </genericViewTemplate>
+  </children>
+</neonView>
diff --git a/neonView/KnowledgeDiscussionPreview_view/KnowledgeDiscussionPreview_view.aod b/neonView/KnowledgeDiscussionPreview_view/KnowledgeDiscussionPreview_view.aod
new file mode 100644
index 00000000000..e98045a42c2
--- /dev/null
+++ b/neonView/KnowledgeDiscussionPreview_view/KnowledgeDiscussionPreview_view.aod
@@ -0,0 +1,37 @@
+<?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>KnowledgeDiscussionPreview_view</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <size>SMALL</size>
+  <layout>
+    <boxLayout>
+      <name>layout</name>
+    </boxLayout>
+  </layout>
+  <children>
+    <genericViewTemplate>
+      <name>Text</name>
+      <editMode v="false" />
+      <drawerCaption>Discussion</drawerCaption>
+      <fixedDrawer v="true" />
+      <hideLabels v="true" />
+      <entityField>#ENTITY</entityField>
+      <title>Discussion</title>
+      <devices>
+        <element>MOBILE</element>
+        <element>TABLET</element>
+        <element>DESKTOP</element>
+      </devices>
+      <fields>
+        <entityFieldLink>
+          <name>672eae9f-abfb-4256-879b-6ceb945bff4d</name>
+          <entityField>discussionTitle</entityField>
+        </entityFieldLink>
+        <entityFieldLink>
+          <name>c0ff5819-7bb6-4e7b-b051-bb4d74fe10c1</name>
+          <entityField>DISCUSSIONTEXT</entityField>
+        </entityFieldLink>
+      </fields>
+    </genericViewTemplate>
+  </children>
+</neonView>
diff --git a/neonView/KnowledgeDiscussionTree_view/KnowledgeDiscussionTree_view.aod b/neonView/KnowledgeDiscussionTree_view/KnowledgeDiscussionTree_view.aod
new file mode 100644
index 00000000000..601327c7d5b
--- /dev/null
+++ b/neonView/KnowledgeDiscussionTree_view/KnowledgeDiscussionTree_view.aod
@@ -0,0 +1,33 @@
+<?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>KnowledgeDiscussionTree_view</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <layout>
+    <boxLayout>
+      <name>layout</name>
+    </boxLayout>
+  </layout>
+  <children>
+    <treeTableViewTemplate>
+      <name>Treetable</name>
+      <parentField>PARENTENTRY</parentField>
+      <favoriteActionGroup1>Edit_ActionGroup</favoriteActionGroup1>
+      <entityField>#ENTITY</entityField>
+      <title>Discussions</title>
+      <columns>
+        <neonTreeTableColumn>
+          <name>0462213d-ce08-44e8-9a78-8fd761ca13ce</name>
+          <entityField>#ICON</entityField>
+        </neonTreeTableColumn>
+        <neonTreeTableColumn>
+          <name>be38dc3a-7295-407b-afa3-a409348985c8</name>
+          <entityField>DISCUSSIONTEXT</entityField>
+        </neonTreeTableColumn>
+        <neonTreeTableColumn>
+          <name>924ee584-22b6-4fa8-9b7d-a22b45e05c10</name>
+          <entityField>discussionTitle</entityField>
+        </neonTreeTableColumn>
+      </columns>
+    </treeTableViewTemplate>
+  </children>
+</neonView>
diff --git a/neonView/KnowledgeLinkActionList_view/KnowledgeLinkActionList_view.aod b/neonView/KnowledgeLinkActionList_view/KnowledgeLinkActionList_view.aod
new file mode 100644
index 00000000000..23ed8823319
--- /dev/null
+++ b/neonView/KnowledgeLinkActionList_view/KnowledgeLinkActionList_view.aod
@@ -0,0 +1,19 @@
+<?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>KnowledgeLinkActionList_view</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <layout>
+    <boxLayout>
+      <name>layout</name>
+    </boxLayout>
+  </layout>
+  <children>
+    <actionListViewTemplate>
+      <name>ActionList</name>
+      <titleField>ROW_ID</titleField>
+      <descriptionField>OBJECT_TYPE</descriptionField>
+      <iconField>#ICON</iconField>
+      <entityField>#ENTITY</entityField>
+    </actionListViewTemplate>
+  </children>
+</neonView>
diff --git a/neonView/KnowledgeLinkEdit_view/KnowledgeLinkEdit_view.aod b/neonView/KnowledgeLinkEdit_view/KnowledgeLinkEdit_view.aod
new file mode 100644
index 00000000000..34e51015d71
--- /dev/null
+++ b/neonView/KnowledgeLinkEdit_view/KnowledgeLinkEdit_view.aod
@@ -0,0 +1,31 @@
+<?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>KnowledgeLinkEdit_view</name>
+  <title>Links</title>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <size>SMALL</size>
+  <layout>
+    <boxLayout>
+      <name>layout</name>
+    </boxLayout>
+  </layout>
+  <children>
+    <genericViewTemplate>
+      <name>Edit</name>
+      <editMode v="true" />
+      <drawerCaption>Link</drawerCaption>
+      <hideEmptyFields v="false" />
+      <entityField>#ENTITY</entityField>
+      <fields>
+        <entityFieldLink>
+          <name>4dce246e-8ac8-491f-bc77-fc2d6ef9f62d</name>
+          <entityField>OBJECT_TYPE</entityField>
+        </entityFieldLink>
+        <entityFieldLink>
+          <name>7fedd111-a1d3-4159-b206-11d11d80c769</name>
+          <entityField>ROW_ID</entityField>
+        </entityFieldLink>
+      </fields>
+    </genericViewTemplate>
+  </children>
+</neonView>
diff --git a/neonView/KnowledgeLinkLookup_view/KnowledgeLinkLookup_view.aod b/neonView/KnowledgeLinkLookup_view/KnowledgeLinkLookup_view.aod
new file mode 100644
index 00000000000..49df3025f21
--- /dev/null
+++ b/neonView/KnowledgeLinkLookup_view/KnowledgeLinkLookup_view.aod
@@ -0,0 +1,27 @@
+<?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>KnowledgeLinkLookup_view</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <filterable v="true" />
+  <layout>
+    <boxLayout>
+      <name>layout</name>
+    </boxLayout>
+  </layout>
+  <children>
+    <tableViewTemplate>
+      <name>TableLooukup</name>
+      <entityField>#ENTITY</entityField>
+      <columns>
+        <neonTableColumn>
+          <name>5e32fe5d-6932-4c68-b5fd-2c995ba8fbd2</name>
+          <entityField>OBJECT_TYPE</entityField>
+        </neonTableColumn>
+        <neonTableColumn>
+          <name>a180c48b-1e09-4e84-ad4d-92aeeb4b6542</name>
+          <entityField>ROW_ID</entityField>
+        </neonTableColumn>
+      </columns>
+    </tableViewTemplate>
+  </children>
+</neonView>
diff --git a/neonView/KnowledgeLinkMultiEdit_view/KnowledgeLinkMultiEdit_view.aod b/neonView/KnowledgeLinkMultiEdit_view/KnowledgeLinkMultiEdit_view.aod
new file mode 100644
index 00000000000..0b3448b225c
--- /dev/null
+++ b/neonView/KnowledgeLinkMultiEdit_view/KnowledgeLinkMultiEdit_view.aod
@@ -0,0 +1,29 @@
+<?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>KnowledgeLinkMultiEdit_view</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <size>SMALL</size>
+  <layout>
+    <boxLayout>
+      <name>layout</name>
+      <autoHeight v="true" />
+    </boxLayout>
+  </layout>
+  <children>
+    <genericMultipleViewTemplate>
+      <name>MultiEdit</name>
+      <entityField>#ENTITY</entityField>
+      <title>Verknüpfungen</title>
+      <columns>
+        <neonGenericMultipleTableColumn>
+          <name>eb1bc3cb-3cf0-479c-901f-906a7ddde485</name>
+          <entityField>OBJECT_TYPE</entityField>
+        </neonGenericMultipleTableColumn>
+        <neonGenericMultipleTableColumn>
+          <name>331a348d-efdd-4a1b-a140-2c0b2adc27f0</name>
+          <entityField>ROW_ID</entityField>
+        </neonGenericMultipleTableColumn>
+      </columns>
+    </genericMultipleViewTemplate>
+  </children>
+</neonView>
diff --git a/neonView/KnowledgeManagementDetails_view/KnowledgeManagementDetails_view.aod b/neonView/KnowledgeManagementDetails_view/KnowledgeManagementDetails_view.aod
new file mode 100644
index 00000000000..992ac0b7ffb
--- /dev/null
+++ b/neonView/KnowledgeManagementDetails_view/KnowledgeManagementDetails_view.aod
@@ -0,0 +1,58 @@
+<?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>KnowledgeManagementDetails_view</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <layout>
+    <headerFooterLayout>
+      <name>layout</name>
+      <header>KnowledgeDetails</header>
+    </headerFooterLayout>
+  </layout>
+  <children>
+    <cardViewTemplate>
+      <name>KnowledgeDetails</name>
+      <iconField>#ICON</iconField>
+      <titleField>TITLE</titleField>
+      <entityField>#ENTITY</entityField>
+      <isEditable v="false" />
+    </cardViewTemplate>
+    <favoriteViewTemplate>
+      <name>favorites</name>
+      <objectType>KNOWLEDGEMANAGEMENT_OBJECTTYPE</objectType>
+      <rowId>#UID</rowId>
+      <entityField>#ENTITY</entityField>
+      <title>Favoriten</title>
+    </favoriteViewTemplate>
+    <genericViewTemplate>
+      <name>Details</name>
+      <entityField>#ENTITY</entityField>
+      <fields>
+        <entityFieldLink>
+          <name>2ed87edf-4aed-42cd-9ebe-f206810c86a7</name>
+          <entityField>AUTHOR_CONTACT_ID</entityField>
+        </entityFieldLink>
+        <entityFieldLink>
+          <name>e9d5fe54-9261-4ca4-9c20-c839c8d26395</name>
+          <entityField>RESPONSIBLE_CONTACT_ID</entityField>
+        </entityFieldLink>
+        <entityFieldLink>
+          <name>1248f0fc-e370-42e5-8d64-6d89da366580</name>
+          <entityField>DATE_NEW</entityField>
+        </entityFieldLink>
+        <entityFieldLink>
+          <name>59c020ac-3b20-45b4-83ce-d0e7bb9372ad</name>
+          <entityField>DATE_EDIT</entityField>
+        </entityFieldLink>
+        <entityFieldLink>
+          <name>6252c147-e35f-4c54-8e9c-f65eee2d5283</name>
+          <entityField>PUBLISH</entityField>
+        </entityFieldLink>
+      </fields>
+    </genericViewTemplate>
+    <neonViewReference>
+      <name>9322369a-d82b-402e-aaff-dedac00d1971</name>
+      <entityField>TagsByKnowledgeId</entityField>
+      <view>KnowledgeTagList_view</view>
+    </neonViewReference>
+  </children>
+</neonView>
diff --git a/neonView/KnowledgeManagementEdit_view/KnowledgeManagementEdit_view.aod b/neonView/KnowledgeManagementEdit_view/KnowledgeManagementEdit_view.aod
new file mode 100644
index 00000000000..5d41560c646
--- /dev/null
+++ b/neonView/KnowledgeManagementEdit_view/KnowledgeManagementEdit_view.aod
@@ -0,0 +1,86 @@
+<?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>KnowledgeManagementEdit_view</name>
+  <title>Knowledge</title>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <icon>VAADIN:ACADEMY_CAP</icon>
+  <size>NORMAL</size>
+  <quickEntry v="6" />
+  <layout>
+    <boxLayout>
+      <name>layout</name>
+      <autoHeight v="true" />
+    </boxLayout>
+  </layout>
+  <children>
+    <genericViewTemplate>
+      <name>Details</name>
+      <editMode v="true" />
+      <drawerCaption></drawerCaption>
+      <entityField>#ENTITY</entityField>
+      <title></title>
+      <devices>
+        <element>MOBILE</element>
+        <element>TABLET</element>
+        <element>DESKTOP</element>
+      </devices>
+      <fields>
+        <entityFieldLink>
+          <name>7be58130-991a-47e3-89d7-d01fc531ddd6</name>
+          <entityField>TITLE</entityField>
+        </entityFieldLink>
+        <entityFieldLink>
+          <name>59c18990-a0e2-4cbd-b728-f156a421081f</name>
+          <entityField>CONTENT</entityField>
+        </entityFieldLink>
+        <entityFieldLink>
+          <name>781765cb-93a4-431e-bc92-9bef2a17e39f</name>
+          <entityField>AUTHOR_CONTACT_ID</entityField>
+        </entityFieldLink>
+        <entityFieldLink>
+          <name>776ee39f-b666-4168-a758-0c17a3ed41a5</name>
+          <entityField>RESPONSIBLE_CONTACT_ID</entityField>
+        </entityFieldLink>
+        <entityFieldLink>
+          <name>bfa39723-52e1-45e5-945c-cc1db1c81b81</name>
+          <entityField>PUBLISH</entityField>
+        </entityFieldLink>
+      </fields>
+    </genericViewTemplate>
+    <neonViewReference>
+      <name>a62e4251-76b5-427c-b758-ae57bcdf5956</name>
+      <entityField>TagsByKnowledgeId</entityField>
+      <view>KnowledgeTagList_GenMult_view</view>
+    </neonViewReference>
+    <neonViewReference>
+      <name>6ac6f960-eaf3-4196-acc8-f516184215f1</name>
+      <entityField>LinksByKnowledgeId</entityField>
+      <view>KnowledgeLinkMultiEdit_view</view>
+    </neonViewReference>
+    <genericViewTemplate>
+      <name>genericc</name>
+      <editMode v="true" />
+      <entityField>#ENTITY</entityField>
+      <fields>
+        <entityFieldLink>
+          <name>a753ed28-28fa-402e-a98f-5fa0301158b2</name>
+          <entityField>isNewsMark</entityField>
+        </entityFieldLink>
+        <entityFieldLink>
+          <name>54f5adf2-800e-4dae-a4a0-7a9fb16ed083</name>
+          <entityField>notificationMark</entityField>
+        </entityFieldLink>
+      </fields>
+    </genericViewTemplate>
+    <neonViewReference>
+      <name>2649f436-3025-4f0b-bbd4-580e5dcf2cba</name>
+      <entityField>KnowledgeRoles</entityField>
+      <view>KnowledgeRoleEdit_view</view>
+    </neonViewReference>
+    <neonViewReference>
+      <name>ed706714-6290-4d6b-9e59-7e8833e8936f</name>
+      <entityField>LinkedDocuments</entityField>
+      <view>DocumentMultipleEdit_view</view>
+    </neonViewReference>
+  </children>
+</neonView>
diff --git a/neonView/KnowledgeManagementFilter_view/KnowledgeManagementFilter_view.aod b/neonView/KnowledgeManagementFilter_view/KnowledgeManagementFilter_view.aod
new file mode 100644
index 00000000000..28f846c0a6c
--- /dev/null
+++ b/neonView/KnowledgeManagementFilter_view/KnowledgeManagementFilter_view.aod
@@ -0,0 +1,50 @@
+<?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>KnowledgeManagementFilter_view</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <filterable v="true" />
+  <dashletConfigurations>
+    <neonDashletConfiguration>
+      <name>Wissen</name>
+      <title>Wissen</title>
+      <description>Alle Wissensbeiträge</description>
+      <fragment>KnowledgeManagement/filter</fragment>
+      <icon>VAADIN:ACADEMY_CAP</icon>
+      <categories>
+        <neonDashletCategory>
+          <name>knowledge</name>
+          <title>Knowledge</title>
+        </neonDashletCategory>
+      </categories>
+    </neonDashletConfiguration>
+  </dashletConfigurations>
+  <layout>
+    <boxLayout>
+      <name>layout</name>
+    </boxLayout>
+  </layout>
+  <children>
+    <tableViewTemplate>
+      <name>FilterTable</name>
+      <entityField>#ENTITY</entityField>
+      <columns>
+        <neonTableColumn>
+          <name>6536f7bc-b655-4011-b8ce-20b27fb0f656</name>
+          <entityField>#ICON</entityField>
+        </neonTableColumn>
+        <neonTableColumn>
+          <name>6a5fd77d-537b-4f27-a372-93838a76ff2e</name>
+          <entityField>TITLE</entityField>
+        </neonTableColumn>
+        <neonTableColumn>
+          <name>69905c5d-27c4-49aa-a10c-589fee93b67b</name>
+          <entityField>AUTHOR_CONTACT_ID</entityField>
+        </neonTableColumn>
+        <neonTableColumn>
+          <name>6f9daef0-872f-486c-8d1b-19fbde27efff</name>
+          <entityField>LastChange</entityField>
+        </neonTableColumn>
+      </columns>
+    </tableViewTemplate>
+  </children>
+</neonView>
diff --git a/neonView/KnowledgeManagementLookup_view/KnowledgeManagementLookup_view.aod b/neonView/KnowledgeManagementLookup_view/KnowledgeManagementLookup_view.aod
new file mode 100644
index 00000000000..8b9981d87da
--- /dev/null
+++ b/neonView/KnowledgeManagementLookup_view/KnowledgeManagementLookup_view.aod
@@ -0,0 +1,34 @@
+<?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>KnowledgeManagementLookup_view</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <layout>
+    <boxLayout>
+      <name>layout</name>
+    </boxLayout>
+  </layout>
+  <children>
+    <tableViewTemplate>
+      <name>LookupTable</name>
+      <entityField>#ENTITY</entityField>
+      <columns>
+        <neonTableColumn>
+          <name>5a7ab4ba-48a5-47bf-95e9-5631938af5b2</name>
+          <entityField>#IMAGE</entityField>
+        </neonTableColumn>
+        <neonTableColumn>
+          <name>b715bc0e-a6b7-478d-9aaf-9bc212812650</name>
+          <entityField>ViewKnowledgeNumber</entityField>
+        </neonTableColumn>
+        <neonTableColumn>
+          <name>4176e200-836f-475c-bc35-ae9c27bf1ed9</name>
+          <entityField>TITLE</entityField>
+        </neonTableColumn>
+        <neonTableColumn>
+          <name>0afc1762-3889-4eb5-bef9-4c14cd648eb6</name>
+          <entityField>CONTENTDECODED</entityField>
+        </neonTableColumn>
+      </columns>
+    </tableViewTemplate>
+  </children>
+</neonView>
diff --git a/neonView/KnowledgeManagementMain_view/KnowledgeManagementMain_view.aod b/neonView/KnowledgeManagementMain_view/KnowledgeManagementMain_view.aod
new file mode 100644
index 00000000000..33c43a3158a
--- /dev/null
+++ b/neonView/KnowledgeManagementMain_view/KnowledgeManagementMain_view.aod
@@ -0,0 +1,42 @@
+<?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>KnowledgeManagementMain_view</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <layout>
+    <masterSlaveLayout>
+      <name>layout</name>
+      <master>88686b9f-0333-4f8b-a24d-c1018bcf394b</master>
+    </masterSlaveLayout>
+  </layout>
+  <children>
+    <neonViewReference>
+      <name>88686b9f-0333-4f8b-a24d-c1018bcf394b</name>
+      <entityField>#ENTITY</entityField>
+      <view>KnowledgeManagementDetails_view</view>
+    </neonViewReference>
+    <webContentViewTemplate>
+      <name>Content</name>
+      <entityField>htmlView</entityField>
+    </webContentViewTemplate>
+    <neonViewReference>
+      <name>79fcef8e-c0ba-4463-a239-6faf332b6bc9</name>
+      <entityField>DiscussionsByKnowledgeId</entityField>
+      <view>KnowledgeDiscussionTree_view</view>
+    </neonViewReference>
+    <neonViewReference>
+      <name>914652b1-891f-4d79-a9e8-766a792da539</name>
+      <entityField>LinkedDocuments</entityField>
+      <view>DocumentFilter_view</view>
+    </neonViewReference>
+    <neonViewReference>
+      <name>b03ac69f-ed82-4a90-87b0-89d1822c749a</name>
+      <entityField>LinksByKnowledgeId</entityField>
+      <view>KnowledgeLinkLookup_view</view>
+    </neonViewReference>
+    <neonViewReference>
+      <name>40b21927-4fb9-46f3-8e99-682b1a114d19</name>
+      <entityField>LogHistories</entityField>
+      <view>LogHistoryFilter_view</view>
+    </neonViewReference>
+  </children>
+</neonView>
diff --git a/neonView/KnowledgeManagementPreview_view/KnowledgeManagementPreview_view.aod b/neonView/KnowledgeManagementPreview_view/KnowledgeManagementPreview_view.aod
new file mode 100644
index 00000000000..e8ae6cd155b
--- /dev/null
+++ b/neonView/KnowledgeManagementPreview_view/KnowledgeManagementPreview_view.aod
@@ -0,0 +1,17 @@
+<?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>KnowledgeManagementPreview_view</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <layout>
+    <headerFooterLayout>
+      <name>layout</name>
+    </headerFooterLayout>
+  </layout>
+  <children>
+    <webContentViewTemplate>
+      <name>PreviewHTML</name>
+      <height v="6000" />
+      <entityField>htmlView</entityField>
+    </webContentViewTemplate>
+  </children>
+</neonView>
diff --git a/neonView/KnowledgeManagementRole_view/KnowledgeManagementRole_view.aod b/neonView/KnowledgeManagementRole_view/KnowledgeManagementRole_view.aod
new file mode 100644
index 00000000000..ef4ea428e85
--- /dev/null
+++ b/neonView/KnowledgeManagementRole_view/KnowledgeManagementRole_view.aod
@@ -0,0 +1,33 @@
+<?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>KnowledgeManagementRole_view</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <layout>
+    <boxLayout>
+      <name>layout</name>
+      <autoHeight v="true" />
+    </boxLayout>
+  </layout>
+  <children>
+    <genericViewTemplate>
+      <name>Roles</name>
+      <editMode v="true" />
+      <entityField>#ENTITY</entityField>
+      <fields>
+        <entityFieldLink>
+          <name>f339bf74-1d3e-4584-8961-eebb730221dd</name>
+          <entityField>isNewsMark</entityField>
+        </entityFieldLink>
+        <entityFieldLink>
+          <name>6c6c1ee1-421c-4102-9ed4-a2770f8cc58c</name>
+          <entityField>notificationMark</entityField>
+        </entityFieldLink>
+      </fields>
+    </genericViewTemplate>
+    <neonViewReference>
+      <name>15f19382-186c-4ca7-b3f6-e7efa11a7edb</name>
+      <entityField>KnowledgeRoles</entityField>
+      <view>KnowledgeRoleEdit_view</view>
+    </neonViewReference>
+  </children>
+</neonView>
diff --git a/neonView/KnowledgeManagementTimeline_view/KnowledgeManagementTimeline_view.aod b/neonView/KnowledgeManagementTimeline_view/KnowledgeManagementTimeline_view.aod
new file mode 100644
index 00000000000..06766542b7e
--- /dev/null
+++ b/neonView/KnowledgeManagementTimeline_view/KnowledgeManagementTimeline_view.aod
@@ -0,0 +1,44 @@
+<?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>KnowledgeManagementTimeline_view</name>
+  <title>Newsfeed (Preview)</title>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <dashletConfigurations>
+    <neonDashletConfiguration>
+      <name>timelineDashletConfig</name>
+      <title>Newsfeed (Preview)</title>
+      <fragment>KnowledgeManagement/filter</fragment>
+      <categories>
+        <neonDashletCategory>
+          <name>knowledge</name>
+          <title>Knowledge</title>
+        </neonDashletCategory>
+      </categories>
+      <parameters>
+        <neonDashletParameter>
+          <name>isDashlet_param</name>
+          <value>true</value>
+        </neonDashletParameter>
+      </parameters>
+    </neonDashletConfiguration>
+  </dashletConfigurations>
+  <layout>
+    <boxLayout>
+      <name>layout</name>
+    </boxLayout>
+  </layout>
+  <children>
+    <timelineViewTemplate>
+      <name>time</name>
+      <dateField>LastChange</dateField>
+      <titleField>TITLE</titleField>
+      <descriptionField>CONTENT</descriptionField>
+      <subdescriptionField>AUTHOR_CONTACT_ID</subdescriptionField>
+      <entityField>#ENTITY</entityField>
+      <isDeletable v="false" />
+      <isEditable v="false" />
+      <title>Newsfeed Timeline</title>
+      <isCreatable v="false" />
+    </timelineViewTemplate>
+  </children>
+</neonView>
diff --git a/neonView/KnowledgeNewsFeed_view/KnowledgeNewsFeed_view.aod b/neonView/KnowledgeNewsFeed_view/KnowledgeNewsFeed_view.aod
new file mode 100644
index 00000000000..4f9bd988b14
--- /dev/null
+++ b/neonView/KnowledgeNewsFeed_view/KnowledgeNewsFeed_view.aod
@@ -0,0 +1,42 @@
+<?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>KnowledgeNewsFeed_view</name>
+  <title>Newsfeed (Complete Article)</title>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <dashletConfigurations>
+    <neonDashletConfiguration>
+      <name>knowledgeNewsFeed_dashletConfig</name>
+      <title>Newsfeed (Complete Article)</title>
+      <fragment>KnowledgeNewsFeed/filter</fragment>
+      <icon>VAADIN:NEWSPAPER</icon>
+      <categories>
+        <neonDashletCategory>
+          <name>knowledge</name>
+          <title>Knowledge</title>
+        </neonDashletCategory>
+      </categories>
+      <parameters>
+        <neonDashletParameter>
+          <name>Parameter</name>
+          <value>tre</value>
+        </neonDashletParameter>
+      </parameters>
+    </neonDashletConfiguration>
+  </dashletConfigurations>
+  <layout>
+    <boxLayout>
+      <name>layout</name>
+    </boxLayout>
+  </layout>
+  <children>
+    <webContentViewTemplate>
+      <name>WebContent</name>
+      <entityField>HTMLContent</entityField>
+      <devices>
+        <element>MOBILE</element>
+        <element>TABLET</element>
+        <element>DESKTOP</element>
+      </devices>
+    </webContentViewTemplate>
+  </children>
+</neonView>
diff --git a/neonView/KnowledgeRoleEdit_view/KnowledgeRoleEdit_view.aod b/neonView/KnowledgeRoleEdit_view/KnowledgeRoleEdit_view.aod
new file mode 100644
index 00000000000..5d6473c3512
--- /dev/null
+++ b/neonView/KnowledgeRoleEdit_view/KnowledgeRoleEdit_view.aod
@@ -0,0 +1,30 @@
+<?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>KnowledgeRoleEdit_view</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <layout>
+    <boxLayout>
+      <name>layout</name>
+      <autoHeight v="true" />
+    </boxLayout>
+  </layout>
+  <children>
+    <genericMultipleViewTemplate>
+      <name>GenericMultiple</name>
+      <entityField>#ENTITY</entityField>
+      <title>Roles</title>
+      <columns>
+        <neonGenericMultipleTableColumn>
+          <name>8fc4c848-f071-4c9d-b764-8d03e750937a</name>
+          <entityField>ROLES</entityField>
+          <fullWidth v="true" />
+        </neonGenericMultipleTableColumn>
+        <neonGenericMultipleTableColumn>
+          <name>23bbcd15-8d81-4d82-82c8-890a0091ccff</name>
+          <entityField>KNOWLEDGEMANAGMENT_ID</entityField>
+          <fullWidth v="false" />
+        </neonGenericMultipleTableColumn>
+      </columns>
+    </genericMultipleViewTemplate>
+  </children>
+</neonView>
diff --git a/neonView/KnowledgeTagList_GenMult_view/KnowledgeTagList_GenMult_view.aod b/neonView/KnowledgeTagList_GenMult_view/KnowledgeTagList_GenMult_view.aod
new file mode 100644
index 00000000000..15748243a68
--- /dev/null
+++ b/neonView/KnowledgeTagList_GenMult_view/KnowledgeTagList_GenMult_view.aod
@@ -0,0 +1,27 @@
+<?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>KnowledgeTagList_GenMult_view</name>
+  <title>Tags</title>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <size>SMALL</size>
+  <layout>
+    <boxLayout>
+      <name>layout</name>
+      <autoHeight v="true" />
+    </boxLayout>
+  </layout>
+  <children>
+    <genericMultipleViewTemplate>
+      <name>TagList</name>
+      <entityField>#ENTITY</entityField>
+      <title>Tags</title>
+      <columns>
+        <neonGenericMultipleTableColumn>
+          <name>7a59bcdd-e807-44db-9b5e-7b389ab10db8</name>
+          <entityField>TAG</entityField>
+          <fullWidth v="true" />
+        </neonGenericMultipleTableColumn>
+      </columns>
+    </genericMultipleViewTemplate>
+  </children>
+</neonView>
diff --git a/neonView/KnowledgeTagList_view/KnowledgeTagList_view.aod b/neonView/KnowledgeTagList_view/KnowledgeTagList_view.aod
new file mode 100644
index 00000000000..20b683b7634
--- /dev/null
+++ b/neonView/KnowledgeTagList_view/KnowledgeTagList_view.aod
@@ -0,0 +1,25 @@
+<?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>KnowledgeTagList_view</name>
+  <title>Tags</title>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <layout>
+    <boxLayout>
+      <name>layout</name>
+    </boxLayout>
+  </layout>
+  <children>
+    <titledListViewTemplate>
+      <name>TagList</name>
+      <titleField>ListTitle</titleField>
+      <entityField>#ENTITY</entityField>
+      <title>Tags</title>
+      <columns>
+        <neonTitledListTableColumn>
+          <name>4522858e-7bcb-43e3-b542-410898a8b90a</name>
+          <entityField>TAG</entityField>
+        </neonTitledListTableColumn>
+      </columns>
+    </titledListViewTemplate>
+  </children>
+</neonView>
diff --git a/process/Html_lib/Html_lib.aod b/process/Html_lib/Html_lib.aod
new file mode 100644
index 00000000000..98ca38b6fb0
--- /dev/null
+++ b/process/Html_lib/Html_lib.aod
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+  <name>Html_lib</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <process>%aditoprj%/process/Html_lib/process.js</process>
+  <variants>
+    <element>LIBRARY</element>
+  </variants>
+</process>
diff --git a/process/Html_lib/process.js b/process/Html_lib/process.js
new file mode 100644
index 00000000000..b12525e1ad2
--- /dev/null
+++ b/process/Html_lib/process.js
@@ -0,0 +1,149 @@
+function SimpleHtmlObject(pHtmlString, pUpdateFunc, pUpdateId)
+{
+    this.htmlObj = {head:{headers:"",style:""}, body:{content:""}};
+    this.updateFunc = pUpdateFunc || null;
+    this.updateId = pUpdateId || null;
+    
+    if(pHtmlString && typeof pHtmlString === "string") 
+        this.readHTML(pHtmlString);
+}
+
+SimpleHtmlObject.getInstance = function(pHtmlString, pUpdateFunc, pUpdateId)
+{
+    return new SimpleHtmlObject(pHtmlString, pUpdateFunc, pUpdateId);
+}
+
+SimpleHtmlObject.prototype.style = function(pCss)
+{
+    this.htmlObj.head.style = (pCss) ? pCss : "";
+    return this;
+}
+
+SimpleHtmlObject.prototype.body = function(pContent)
+{
+    this.htmlObj.body.content = (pContent) ? pContent : "";
+    return this;
+}
+
+SimpleHtmlObject.prototype.headers = function(pHeaders)
+{
+    this.htmlObj.head.headers = (pHeaders) ? pHeaders : "";
+    return this;
+}
+
+SimpleHtmlObject.prototype.readTagContent = function (pIn, pTag)
+{    
+    var ret = null;
+    var openTag = new RegExp("<" + pTag + ">","i");
+    var closeTag = new RegExp("<\\/" + pTag + ">","i");
+    //If for some reason 
+    if(pIn.search(new RegExp("<" + pTag + ".*\\/>","i")) > 0)
+        ret = "";
+    else
+    {
+        var start = pIn.search(openTag);
+        var end = pIn.search(closeTag);
+        if(start > -1 && end > -1)
+            ret = pIn.substring(start+(pTag.length+2), end);
+    }
+
+    return ret;
+}
+
+SimpleHtmlObject.prototype.accumulateStyleTags = function(pIn)
+{
+    var htmlString = pIn;
+    var matches = htmlString.match(/<STYLE.*>.*<\/STYLE>/gi);
+    
+    var styles = "";
+    
+    for(let i = 0; matches && i < matches.length; i++)
+    {
+        styles += this.readTagContent(matches[i], "STYLE") + "\n";
+    }
+    
+    return styles;
+}
+
+SimpleHtmlObject.prototype.readHTML = function(pInput)
+{
+    var htmlString = pInput;
+    //if no HTML opening Tag is present, assume its pure body content
+    try
+    {
+        if(htmlString.search(/<HTML>/gi) < 0)
+            this.body(htmlString);
+        else
+        {
+            this.htmlObj.body.content = this.readTagContent(htmlString, "BODY");
+            //Getting Headers without style info, because we store them seperately
+            this.htmlObj.head.headers = this.readTagContent(htmlString, "HEAD").replace(/<STYLE.*>.*<\/STYLE>/gi,"");
+            this.htmlObj.head.style = this.accumulateStyleTags(htmlString);
+        }
+        
+        return
+    }
+    catch(ex)
+    {
+        var fixedHTML = HtmlFixer.getInstance(pInput).fixHtml();
+        if(this.updateFunc && typeof this.updateFunc == "function" && this.updateId)
+            this.updateFunc(fixedHTML, this.updateId);
+        
+        this.readHTML(fixedHTML);
+        return
+    }
+}
+
+SimpleHtmlObject.prototype.toString = function()
+{
+    return "<HTML>\n"
+                + "<HEAD>\n"
+                    + this.htmlObj.head.headers + (this.htmlObj.head.headers.length > 0 ? "\n" : "")
+                    + "<STYLE type='text/css'>" + this.htmlObj.head.style + "</STYLE>" + "\n"
+                + "</HEAD>\n"
+                + "<BODY>\n"
+                    + this.htmlObj.body.content + "\n"
+                + "</BODY>\n"
+            +"</HTML>";
+}
+
+SimpleHtmlObject.prototype.getBody = function()
+{
+    return this.htmlObj.body.content.slice(0);
+}
+
+SimpleHtmlObject.prototype.getStyle = function()
+{
+    return this.htmlObj.head.style.slice(0);
+}
+
+
+function HtmlFixer(pIn)
+{
+    this.htmlString = pIn || "";
+}
+
+HtmlFixer.getInstance = function(pIn)
+{
+    return new HtmlFixer(pIn);
+}
+
+HtmlFixer.prototype.fixHtml = function()
+{
+    var htmlObj = SimpleHtmlObject.getInstance();
+    var readTag = htmlObj.readTagContent; //borrow a function from another Object, so i don't have to code the same thing twice
+    
+    //get a copy of the HTML, so we can modify it without chainging the original
+    var toFix = this.htmlString.slice(0);
+    
+    var style = readTag(toFix,"STYLE");
+    var head = readTag(toFix,"HEAD");
+    var body = readTag(toFix,"BODY");
+    
+    if(!body)
+    {
+        body = toFix.replace(/<HEAD>.*<\/HEAD>/gi,"").replace(/(<HTML>|<\/HTML>)/gi,"");        
+    }
+
+    return htmlObj.headers(head).style(style).body(body).toString();
+}
\ No newline at end of file
diff --git a/process/KeywordRegistry_basic/process.js b/process/KeywordRegistry_basic/process.js
index aa1c2042a60..eaa206920ca 100644
--- a/process/KeywordRegistry_basic/process.js
+++ b/process/KeywordRegistry_basic/process.js
@@ -296,3 +296,16 @@ $KeywordRegistry.workflowCategory = function(){return "WorkflowCategory";};
 $KeywordRegistry.notificationState = function(){ return "NotificationState";};
 $KeywordRegistry.notificationState$unseen = function(){return "UNSEEN";};
 $KeywordRegistry.notificationState$seen = function(){return "SEEN";};
+
+$KeywordRegistry.discussionStatus = function(){return "DiscussionStatus";}
+$KeywordRegistry.discussionStatus$acitve = function(){return "ACTIVE";}
+$KeywordRegistry.discussionStatus$closed = function(){return "CLOSED";}
+
+$KeywordRegistry.knowledgeType = function(){return "KnowledgeType";}
+$KeywordRegistry.knowledgeType$knowledgeBase = function(){return "KNOWLEDGEBASE";}
+$KeywordRegistry.knowledgeType$editorial = function(){return "EDITORIAL";}
+
+$KeywordRegistry.knowledgePublishLevel = function(){return "KnowledgePublishLevel";}
+$KeywordRegistry.knowledgePublishLevel$internal = function(){return "INTERNAL";}
+$KeywordRegistry.knowledgePublishLevel$partner = function(){return "PARTNER";}
+$KeywordRegistry.knowledgePublishLevel$public = function(){return "PUBLIC";}
\ No newline at end of file
diff --git a/process/KnowledgeManagement_lib/KnowledgeManagement_lib.aod b/process/KnowledgeManagement_lib/KnowledgeManagement_lib.aod
new file mode 100644
index 00000000000..7119bdb3846
--- /dev/null
+++ b/process/KnowledgeManagement_lib/KnowledgeManagement_lib.aod
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+  <name>KnowledgeManagement_lib</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <process>%aditoprj%/process/KnowledgeManagement_lib/process.js</process>
+  <alias>Data_alias</alias>
+  <variants>
+    <element>LIBRARY</element>
+  </variants>
+</process>
diff --git a/process/KnowledgeManagement_lib/process.js b/process/KnowledgeManagement_lib/process.js
new file mode 100644
index 00000000000..d2b23022b6a
--- /dev/null
+++ b/process/KnowledgeManagement_lib/process.js
@@ -0,0 +1,1179 @@
+import("system.project");
+import("system.fileIO");
+import("system.translate");
+import("system.tools");
+import("system.util");
+import("system.datetime");
+import("system.vars");
+import("system.db");
+import("system.logging");
+import("Html_lib");
+import("Sql_lib");
+import("Attribute_lib");
+import("AttributeRegistry_basic");
+import("Keyword_lib");
+import("KeywordRegistry_basic");
+import("Util_lib");
+import("system.tools");
+import("system.neon");
+import("system.text");
+
+/**
+ * Object that contains function for displying the knowledge entries
+ * @param {String} pHtml HTML Script as string.
+ * @param {String} pKnowledgeId Id of the knowledge entry, that's represented by this object
+ */
+function KnowledgeManagementModel(pHtml, pKnowledgeId)
+{
+    this.knowledgeId = pKnowledgeId || null;
+    
+    var updFunc = function(pContent, pId)
+    {
+        cols = ["CONTENT", "CONTENTDECODED"];
+        colTypes = db.getColumnTypes("KNOWLEDGEMANAGEMENT", cols);
+        db.updateData("KNOWLEDGEMANAGEMENT"
+            , cols
+            , colTypes
+            , [pContent, text.html2text(pContent)]
+            , "KNOWLEDGEMANAGEMENTID = '" + pId + "'");
+    }
+    
+    //this turns a HTML String into an instance of SimpleHtmlObject for further processing
+    //or if an instance of SimpleHtmlObject is given in pHtml it uses the given Object
+    this.html = (typeof pHtml === "string")
+    ? SimpleHtmlObject.getInstance(pHtml, updFunc, this.knowledgeId)
+    : (
+        (pHtml instanceof SimpleHtmlObject)
+        ? pHtml
+        : null
+        );
+    //provides the knowledge entry with it's tags
+    this.knowledgeTagModel = KnowledgeManagementTagsModel.getInstance(this.knowledgeId);
+}
+/**
+ * Factory function of KnowledgeManagementModel
+ * @param {String} pHtml HTML Script as string.
+ * @param {String} pId Id of the knowledge entry, that's represented by this object
+ *
+ * @return {KnowledgeManagementModel}
+ */
+KnowledgeManagementModel.getInstance = function(pHtml, pId)
+{
+    return new KnowledgeManagementModel(pHtml, pId);
+}
+
+/**
+ * Function for setting a CSS Stylesheet for the knowledge entry
+ * @param pStyle {String|function} This parameter takes either a string or a function
+ *                                 the function has to return a CSS Stylesheet as String
+ * @param pArgs {Array} This parameter takes the arguments for calling a style function, Required if pStyle is of type function
+ *
+ * @return {this} return the instance of KnowledgeManagementModel to enable function chaining
+ */
+KnowledgeManagementModel.prototype.style = function(pStyle, pArgs)
+{
+    switch(typeof pStyle)
+    {
+        case "function":
+            let args = (pArgs && pArgs.length)? pArgs : [];
+            this.html.style(pStyle.apply(pStyle, args));
+            break;
+        case "string":
+            this.html.style(pStyle);
+            break;
+    }
+
+    return this;
+}
+
+KnowledgeManagementModel.prototype.headers = function(pHeaders)
+{
+    this.html.headers(pHeaders);
+    
+    return this;
+}
+
+/**
+ * Function for setting the content of the HTML Body for the knowledge entry
+ * @param pContent {String|function} This parameter takes either a string or a function
+ *                                   the function has to return the content of the HTML Body as String
+ * @param pArgs {Array} This parameter takes the arguments for calling a function, Required if pStyle is of type function
+ *
+ * @return {this} return the instance of KnowledgeManagementModel to enable function chaining
+ */
+KnowledgeManagementModel.prototype.content = function(pContent, pArgs)
+{
+    switch(typeof pContent)
+    {
+        case "function":
+            let args = (pArgs && pArgs.length)? pArgs : [];
+            this.html.body(pContent.apply(pContent, args));
+            break;
+        case "string":
+            this.html.body(pContent);
+            break;
+    }
+
+    return this;
+}
+/**
+ * Wrapper for SimpleHtmlObject.prototype.toString, which is overridden so it provides a HTML Script
+ * containing the content and style set by the respective functions
+ *
+ * @return {String} HTML Script
+ */
+KnowledgeManagementModel.prototype.buildHTML = function()
+{
+    return this.html.toString();
+}
+/**
+ * Returns the content of the HTML Body
+ * @return {String}
+ */
+KnowledgeManagementModel.prototype.getContent = function()
+{
+    return this.html.getBody();
+}
+/**
+ * Returns the contents of the set Style Tag
+ * @return {String}
+ */
+KnowledgeManagementModel.prototype.getStyle = function()
+{
+    return this.html.getStyle();
+}
+
+KnowledgeManagementModel.getFrameMapping = function(pFrame)
+{
+    switch(pFrame.toUpperCase())
+    {
+        case "KNOWLEDGEMANAGEMENT":
+            return "KnowledgeManagement";
+            break;
+        default:
+            return null;
+    }
+}
+/**
+ * Function for replacing the http://adito/ and http://aditoknowledge links with links to the neon client
+ * @return {this}
+ */
+KnowledgeManagementModel.prototype.replaceAditoLinks = function()
+{   
+    var clientUrl = project.getInstanceConfigValue("custom.aditoLink.clientUrl", "");
+    var content = this.getContent();
+    //RegExp for finding regular ADITO Links
+    var regExAditoLink = /href\s*=\s*["']http:\/\/adito\/(\w+)\/([\w-]{0,36})["']/gi;
+    //RegExp for finding aditoknowledge links
+    var regExEditorialLink = /href\s*=\s*["']http:\/\/aditoknowledge\/(.+?\.adoc)["']/gi;
+    
+    var match, frame, uid, gitPath;
+    
+    function _getNeonLink(pContext, pUid)
+    {
+        if(pContext)
+            return "href = '" + clientUrl + "client/" + pContext + "/full?id=" + pUid + "' target='_parent'";
+        else
+            return "CONTEXT NOT MAPPED";
+    }
+    
+    while ((match = regExAditoLink.exec(content)) !== null) 
+    {
+        [match, frame, uid] = match;
+        content = content.replace(match, _getNeonLink(KnowledgeManagementModel.getFrameMapping(frame), uid));
+    }
+    
+    var idSql;
+                
+    
+    while ((match = regExEditorialLink.exec(content)) !== null) 
+    {
+        [match, gitPath] = match;
+        idSql = new SqlBuilder().select("KNOWLEDGEMANAGEMENT.KNOWLEDGEMANAGEMENTID")
+        .from("KNOWLEDGEMANAGEMENT")
+        .where("KNOWLEDGEMANAGEMENT.GITPATH", gitPath).cell();
+                
+        content = content.replace(
+            match
+            , _getNeonLink("KnowledgeManagement"
+                , (idSql) ? idSql : "DOCUMENT-NOT-EXISTING"
+                )
+            );
+    }
+       
+    this.content(content);
+    
+    return this;
+}
+/**
+ * Object for gathering the tags of a knowledge entry
+ * @param {String} pKnowledgemanagementId Id of the knowledge entry for which the tags should be collected
+ */
+function KnowledgeManagementTagsModel(pKnowledgemanagementId)
+{
+    this.data = [];
+    this.existingTags = {
+        array:[],
+        ByIdMap:{},
+        ByNameMap:{}
+    };
+    this.knowledgeId = pKnowledgemanagementId || null;
+}
+
+/**
+ * Factory function of KnowledgeManagementTagsModel
+ * @return {KnowledgeManagementTagsModel}
+ */
+KnowledgeManagementTagsModel.getInstance = function(pId)
+{
+    return new KnowledgeManagementTagsModel(pId);
+}
+/**
+ * Function for getting the list of already existing tags
+ * @param {String} pLocalUid If the id is given only one entry is loaded
+ * @return {Object} returns an object containing three keys: array, ByIdMap, ByNameMap
+ *                  the latter two are maps for quick lookup of TagIDs by Name or Name by Id
+ */
+KnowledgeManagementTagsModel.prototype.getPossibleTags = function(pLocalUid)
+{
+    this.existingTags.array = new SqlBuilder()
+                                .select("KNOWLEDGETAGID, TAG")
+                                .from("KNOWLEDGETAG")
+                                .table();
+    
+    for(let i in this.existingTags.array)
+    {
+        this.existingTags.ByIdMap[this.existingTags.array[i][0]] = this.existingTags.array[i][1];
+        this.existingTags.ByNameMap[this.existingTags.array[i][1].toUpperCase()] = this.existingTags.array[i][0];
+        //if a single id is requested, return only that specific dataset
+        if(pLocalUid && pLocalUid == this.existingTags.array[i][0])
+        {
+            let singleReturn = {
+                array:[],
+                ByIdMap:{},
+                ByNameMap:{}
+            };
+            singleReturn.array = [this.existingTags.array[i]];
+            singleReturn.ByIdMap[this.existingTags.array[i][0]] = this.existingTags.array[i][1];
+            singleReturn.ByNameMap[this.existingTags.array[i][1].toUpperCase()] = this.existingTags.array[i][0]
+
+            return singleReturn;
+        }
+    }
+
+    return this.existingTags;
+}
+/**
+ * Function to collect the set tags of a knowledge entry
+ * If no Id is present in either the function parameter or the object itself, it returns an empty dataset
+ *
+ * @param {String} pKnowledgeId Id of the knowledge entry to gather the tags for.
+ * @param {Array} pIdValue If we get one id from the system, we only need to load this one dataset
+ *
+ * @return {this}
+ */
+KnowledgeManagementTagsModel.prototype.collectTags = function(pKnowledgeId, pIdValue)
+{
+    //if no ID is given either by pKnowledgeId or by the property of the this object
+    //it sets an empty dataset and returns this.
+    if(!pKnowledgeId && !this.knowledgeId)
+    {
+        this.data = db.createEmptyTable(3);
+        return this;
+    }
+
+    if(!this.knowledgeId)
+        this.knowledgeId = pKnowledgeId.slice(0);
+
+    var sqlString = new SqlBuilder()
+                        .select("KNOWLEDGETAGLINKID, KNOWLEDGETAG_ID, TAG")
+                        .from("KNOWLEDGETAGLINK")
+                        .join("KNOWLEDGETAG on KNOWLEDGETAGID = KNOWLEDGETAG_ID")
+                        .where("KNOWLEDGETAGLINK.KNOWLEDGEMANAGEMENT_ID", this.knowledgeId)
+
+    if(pIdValue)
+        sqlString.and("KNOWLEDGETAGLINK.KNOWLEDGETAGLINKID", pIdValue, SqlBuilder.IN());
+
+    this.data = sqlString.table();
+
+    return this;
+}
+/**
+ * Object for handling tags.
+ * I.e. adding, editing and deleting tags of an knowledge entry
+ *
+ * @param {String} pKnowledgeId
+ * @param {KnowledgeManagementTagsModel} pTagsModel If you already have an instance of the Tags Model, you can give it to the function
+ *                                       instead of creating a new instance
+ */
+function KnowledgeManagementTagsController(pKnowledgeId, pTagsModel)
+{
+    this.model = (pTagsModel instanceof KnowledgeManagementTagsModel)
+    ? pTagsModel
+    : KnowledgeManagementTagsModel.getInstance(pKnowledgeId);
+
+    this.knowledgeId = pKnowledgeId || null;
+}
+/**
+ * Factory fucntion for KnowledgeManagementTagsController
+ * @return {KnowledgeManagementTagsController}
+ */
+KnowledgeManagementTagsController.getInstance = function(pId, pModel)
+{
+    return new KnowledgeManagementTagsController(pId, pModel);
+}
+/**
+ * This function is used to add a new tag to a knowledge entry
+ * If the tag is already used on the given entry, it does nothing
+ * If a completely new tag is entered, it gets created in the Tags Attribute and then it gets added to the knowledge entry
+ *
+ * @param {String} pIdValue, id of the new AttributeRelation typically read from $local.idvalue
+ * @param {Array} pRowData, data of the new tag, typically read from $local.rowdata
+ *
+ * @return {this}
+ */
+KnowledgeManagementTagsController.prototype.addTag = function(pIdValue, pRowData, pFromUpdate)
+{
+    if(!pRowData["TAG.value"] || !pIdValue)
+        return this;
+    //if we get an UUID, an existing tag was chosen and can be added directly
+    if(IdUtils.isUUID(pRowData["TAG.value"]))
+        _add.apply(this,[pIdValue, pRowData]);
+    else //else if get a new string, we have to create the tag in the attribute first
+    {
+        this.createNewTag(pIdValue, pRowData);
+    }
+    /**
+     * private function for adding the tag to the knowledge entry
+     * @param {String} pId, id of the new AttributeRelation typically read from $local.idvalue
+     * @param {Array} pData, data of the new tag, typically read from $local.rowdata
+     */
+    function _add(pId, pData)
+    {
+        //get all possible tags, to make sure the new tag is already registered
+        var existingTags = this.model.getPossibleTags();
+
+
+        var countSql = newSelect("count(*)")
+                            .from("KNOWLEDGETAGLINK")
+                            .where("KNOWLEDGETAGLINK.KNOWLEDGETAG_ID", pData["TAG.value"])
+                            .and("KNOWLEDGETAGLINK.KNOWLEDGEMANAGEMENT_ID", this.knowledgeId)
+                            .cell();
+
+        // if the tag is registered and isn't already used on this knowledge entry, add a attribute relation
+        if(existingTags.ByIdMap[pData["TAG.value"]] && Number(countSql) === 0 && !pFromUpdate)
+        {
+            var fields = ["KNOWLEDGETAGLINKID","KNOWLEDGEMANAGEMENT_ID","KNOWLEDGETAG_ID","USER_NEW","DATE_NEW"];//["AB_ATTRIBUTERELATIONID", "AB_ATTRIBUTE_ID", "OBJECT_ROWID", "OBJECT_TYPE", "ID_VALUE", "USER_NEW", "DATE_NEW"];
+            var dataTypes = db.getColumnTypes("KNOWLEDGETAGLINK", fields);
+            var values = [pId, this.knowledgeId, pData["TAG.value"], vars.get("$sys.user"), datetime.date()];
+
+            db.insertData("KNOWLEDGETAGLINK", fields, dataTypes, values);
+        }
+    }
+
+    return this;
+}
+/**
+ * Function for updating/editing an existing tag
+ * @param {String} pIdValue, id of the new AttributeRelation typically read from $local.idvalue
+ * @param {Array} pRowData, data of the new tag, typically read from $local.rowdata
+ *
+ * @return {this}
+ */
+KnowledgeManagementTagsController.prototype.editTag = function(pIdValue, pRowData)
+{
+    if(!pRowData["TAG.value"] || !pIdValue)
+        return this;
+
+    var existingTags = this.model.getPossibleTags();
+    //if we get an UUID and it is in the existing IDs Map, we can just update the database field
+    if(IdUtils.isUUID(data["TAG.value"]) && existingTags.ByIdMap[data["TAG.value"]])
+    {
+        _update.apply(this,[pIdValue, pRowData]);
+    }
+    else // if we get text, we have to get the old tags id, create the new tag and then check if the old tag is used somewhere else
+    {    // if it's not used anymore, it gets deleted from the attribute
+        var oldTag = new SqlBuilder()
+                            .select("KNOWLEDGETAG_ID")
+                            .from("KNOWLEDGETAGLINK")
+                            .where("KNOWLEDGETAGLINK.KNOWLEDGETAGLINKID", pIdValue)
+                            .cell();
+
+        var newTag = this.createNewTag(pIdValue, pRowData, true);
+        pRowData["TAG.value"] = newTag;
+
+        _clear.apply(this,[oldTag]);
+        _update.apply(this, [pIdValue, pRowData]);
+    }
+    /**
+     * private function for updating an AttributeRelation with the new tag
+     */
+    function _update(pId, pData)
+    {
+        var fields = ["KNOWLEDGETAG_ID", "USER_EDIT", "DATE_EDIT"];
+        var dataTypes = db.getColumnTypes("KNOWLEDGETAGLINK", fields);
+        var values = [pData["TAG.value"], vars.get("$sys.user"), datetime.date()];
+        var cond = newWhere("KNOWLEDGETAGLINK.KNOWLEDGETAGLINKID", pId).toString();
+
+        db.updateData("KNOWLEDGETAGLINK", fields, dataTypes, values, cond);
+    }
+    /**
+     * private function for checking, if an old tag is used anywhere else. If it's not used anymore, it gets deleted
+     */
+    function _clear(pOldValue)
+    {
+        var count = new SqlBuilder()
+                        .select("count(*)")
+                        .from("KNOWLEDGETAGLINK")
+                        .where("KNOWLEDGETAGLINK.KNOWLEDGETAG_ID", pOldValue)
+                        .cell();
+        if(count == 0)
+        {
+            db.deleteData("KNOWLEDGETAG", newWhere("KNOWLEDGETAG.KNOWLEDGETAGID", pOldValue).toString());
+        }
+    }
+
+    return this;
+}
+/**
+ * Function for deleting a tag from a knowledge entry
+ * If a tag isn't used anywhere else, it gets deleted from the list of existing tags
+ *
+ * @param {String} pIdValue Value of $local.idvalue in onDelete Process
+ * @param {[][]} pData Value of $local.rowdata in onDelete Process
+ *
+ * @return {this}
+ */
+KnowledgeManagementTagsController.prototype.deleteTag = function(pIdValue, pData)
+{
+    if(!pIdValue || !pData["TAG.value"])
+        return this;
+
+    db.deleteData("KNOWLEDGETAGLINK", newWhere("KNOWLEDGETAGLINK.KNOWLEDGETAGLINKID", pIdValue).toString());
+
+    var count = new SqlBuilder()
+                    .select("count(*)")
+                    .from("KNOWLEDGETAGLINK")
+                    .where("KNOWLEDGETAGLINK.KNOWLEDGETAG_ID", pData["TAG.value"])
+                    .cell();
+
+    if(count == 0)
+    {
+        db.deleteData("KNOWLEDGETAG", newWhere("KNOWLEDGETAG.KNOWLEDGETAGID", pData["TAG.value"]).toString());
+    }
+
+    return this;
+}
+/**
+ * Function to clear all tags from an entry
+ * Used in the Git Interface, to get rid of all tags and then newly create them
+ *
+ * @return {KnowledgeManagementTagsController} Returns this for chaining
+ */
+KnowledgeManagementTagsController.prototype.clearTags = function()
+{
+    this.model.collectTags(this.knowledgeId).data.forEach(
+        function(item)
+        {
+            let rowData = {};
+            rowData["TAG.value"] = item[1];
+
+            this.deleteTag(item[0], rowData);
+        }
+        ,this);
+
+    return this;
+}
+/**
+ * Fucntion for adding a new tag to the list of existing tags
+ * It adds it also to the table KNOWLEDGEMANAGEMENTTAGMODERATION where all new tags are stored for further moderation
+ *
+ * @param {String} pIdValue typically the $local.idvalue of the onInsert process, it is being used, if for some reason the entered tag is already existing.
+ *                          then a new AttributeRelation is created instead of the tag.
+ * @param {[][]} pData typically the $local.rowdata of the onInsert or onUpdate process
+ *
+ * @return {String|null} returns the id of the new tag attribute or null, if it couldn't be created
+ */
+KnowledgeManagementTagsController.prototype.createNewTag = function(pIdValue, pData, pFromUpdate)
+{
+    if(!pData["TAG.value"] || !pIdValue)
+        throw "no Tag was passed or no pIdValue was passed";
+
+    var existingTags = this.model.getPossibleTags();
+    var tagFields = ["KNOWLEDGETAGID"
+                        ,"TAG"
+                        ,"DATE_NEW"
+                        ,"USER_NEW"];
+    var tagColTypes = db.getColumnTypes("KNOWLEDGETAG", tagFields);
+    var newAttrId;
+    var tagValues;
+
+    //If the user entered text without choosing a list entry, do a lookup on the existing tags by upper case and add tag by id, if it already exists
+    if(existingTags.ByNameMap[pData["TAG.value"].toUpperCase()])
+    {
+        pData["TAG.value"] = existingTags.ByNameMap[pData["TAG.value"].toUpperCase()];
+        this.addTag(pIdValue, pData);
+    }
+    else
+    {
+        newAttrId = util.getNewUUID();
+        tagValues = [newAttrId, pData["TAG.value"], datetime.date(), vars.get("$sys.user")];
+
+        db.insertData("KNOWLEDGETAG", tagFields, tagColTypes, tagValues);
+        
+        pData["TAG.value"] = newAttrId;
+        
+        this.addTag(pIdValue, pData, pFromUpdate);
+
+        return newAttrId;
+    }
+
+    return null;
+}
+/**
+ * Object for handling the discussions
+ */
+function KnowledgeDiscussion(pKnowledgeId)
+{
+    this.knowledgeId = pKnowledgeId;
+    this.data = [];
+}
+/**
+ * Factory function of KnwoledgeDiscussion
+ * @param {String|null} pKnowledgeId UUID if only the discussion on on specific knowledge entry are needed, null if all discussions of all knowledge entries should be loaded.
+ */
+KnowledgeDiscussion.getInstance = function(pKnowledgeId)
+{
+    return new KnowledgeDiscussion(pKnowledgeId);
+}
+/**
+ * Function for getting the row count, uses less complex SQL and doesn't have the tree generation.
+ * It's used in the rowCountProcess of the RecordContainer of the KnowledgeDiscussion entity, to improve performance
+ *
+ * @param {KnowledgeDiscussion.WITHCLOSED|KnowledgeDiscussion.ONLYACTIVE} pMode Takes the value of one of the two mode constants
+ * @param {Array} pIdValues Takes an array of ids, typically one id with single selection, to only load the selected discusssion for the preview view
+ *
+ * @return {int} Total number of Datasets to load
+ */
+KnowledgeDiscussion.prototype.getDatasetCount = function(pMode, pIdValues)
+{
+    var knowledgeSql = newSelect("count(*)").from("KNOWLEDGEMANAGEMENT").join("KNOWLEDGEDISCUSSION", "KNOWLEDGEMANAGEMENT.KNOWLEDGEMANAGEMENTID = KNOWLEDGEDISCUSSION.KNOWLEDGEMANAGEMENT_ID").where();
+
+    var knowledgeData = 0;
+
+    var discussionSql = newSelect("count(*)").from("KNOWLEDGEDISCUSSION").where();
+
+    if(pMode == "true")
+    {
+        discussionSql.and("KNOWLEDGEDISCUSSION.STATUS", $KeywordRegistry.discussionStatus$acitve());
+        knowledgeSql.and("KNOWLEDGEDISCUSSION.STATUS", $KeywordRegistry.discussionStatus$acitve());
+    }
+
+    if(pIdValues)
+    {
+        knowledgeSql.and("KNOWLEDGEMANAGEMENT.KNOWLEDGEMANAGEMENTID", pIdValues, SqlBuilder.IN());
+        discussionSql.and("KNOWLEDGEDISCUSSION.KNOWLEDGEDISCUSSIONID", pIdValues, SqlBuilder.IN());
+    }
+
+    //if we have a specific knowledge, we don't need all knowledge entries. Otherwise load all knowledge entries that have discussions
+    if(this.knowledgeId)
+        discussionSql.and("KNOWLEDGEDISCUSSION.KNOWLEDGEMANAGEMENT_ID", this.knowledgeId);
+    else
+        knowledgeData = knowledgeSql.table()
+    
+
+    var discussionData = discussionSql.table()
+
+    var sum = ((Number(knowledgeData) > 0) ? Number(knowledgeData) + Number(discussionData) : Number(discussionData));
+
+    return sum;
+}
+
+/**
+ * Complex function to build the DiscussionTree.
+ * Loads the data depending on this.knowledgeId, pMode and pIdValues and builds the tree out of the data
+ * The tree always gets sorted by the date of the most recent action. Either a new answer to an discussion or an edit of an discussion
+ * Data is retireved by reading the data property of your instance of KnowledgeDiscussion after running buildCompleteTree
+ *
+ * @param {KnowledgeDiscussion.WITHCLOSED|KnowledgeDiscussion.ONLYACTIVE} pMode Takes the value of one of the two mode constants
+ * @param {Array} pIdValues Takes an array of ids, typically one id with single selection, to only load the selected discusssion for the preview view
+ * @param {Boolean} pGetAll Switch, which determines if all discussions on all knowledge entries should be loaded or only the discussion for one specific knowledge.
+ *
+ * @return {this} returns the now filled instance of the object.
+ */
+KnowledgeDiscussion.prototype.buildCompleteTree = function(pMode, pIdValues, pGetAll)
+{
+    var knowledgeSql = newSelect("KNOWLEDGEMANAGEMENT.KNOWLEDGEMANAGEMENTID, KNOWLEDGEMANAGEMENT.TITLE").from("KNOWLEDGEMANAGEMENT")
+    .join("KNOWLEDGEDISCUSSION", "KNOWLEDGEMANAGEMENT.KNOWLEDGEMANAGEMENTID = KNOWLEDGEDISCUSSION.KNOWLEDGEMANAGEMENT_ID")
+    .where()
+
+    var knowledgeData = null;
+
+    var discussionSql = newSelect("KNOWLEDGEDISCUSSIONID,PARENTENTRY,KNOWLEDGEMANAGEMENT_ID ,AUTHOR,DISCUSSIONTEXT,STATUS,'InsertKEyowrdSubselecthere' ,DATE_NEW,DATE_EDIT,USER_NEW,USER_EDIT")
+    .from("KNOWLEDGEDISCUSSION").where()
+    
+    var iconMap = { 
+        TOP:"VAADIN:PIN"
+        ,
+        ANSWER:"VAADIN:COMMENT_O"
+        ,
+        KNOWLEDGE:"VAADIN:ACADEMY_CAP"
+        ,
+        TOP_CLOSED:"VAADIN:LOCK"
+    };
+
+    if(pMode == "true" && !(pIdValues && pIdValues.length == 1))
+    {
+        discussionSql.and("KNOWLEDGEDISCUSSION.STATUS", $KeywordRegistry.discussionStatus$acitve());
+        knowledgeSql.and("KNOWLEDGEDISCUSSION.STATUS", $KeywordRegistry.discussionStatus$acitve());
+    }
+
+    if(pIdValues)
+    {
+        discussionSql.and("KNOWLEDGEDISCUSSION.KNOWLEDGEDISCUSSIONID",  pIdValues, SqlBuilder.IN());
+    }
+
+    //if we have a specific knowledge, we don't need all knowledge entries. Otherwise load all knowledge entries that have discussions
+    if(pGetAll)
+        knowledgeData = knowledgeSql.table()
+    else if(this.knowledgeId)
+        discussionSql.and("KNOWLEDGEDISCUSSION.KNOWLEDGEMANAGEMENT_ID", this.knowledgeId);
+
+    var discussionData = discussionSql.table()
+    var user, userTitle, discussionTitle;
+
+    //adding firstname and lastname from employee as author displayvalue and add icon
+    for(var i = 0; i < discussionData.length; i++)
+    {
+        discussionData[i][4] = discussionData[i][4].trim();
+        user = tools.getUser(discussionData[i][3]);
+        userTitle = _getNamefromUser(user);
+        //old icon code: KeywordUtils.getAttributeRelation(discussionData[i][5], "DiscussionStatus", "knowledgeDiscussionIcon")
+        discussionData[i].push(userTitle);
+        discussionData[i].push(_getIcon("D", discussionData[i][1].trim(), discussionData[i][5].trim()));
+        discussionData[i].push("D"); //Node type for discussions
+
+        discussionTitle = userTitle;
+        if(discussionData[i][7])
+            discussionTitle += " "+ translate.text("added on") +": " + datetime.toDate(discussionData[i][7], "dd.MM.yyyy");
+
+
+        if(discussionData[i][8])
+        {
+            if(discussionData[i][10] && discussionData[i][3] != discussionData[i][10])
+            {
+                user = tools.getUser(discussionData[i][10]);
+                userTitle = _getNamefromUser(user);
+            }
+            discussionTitle += ", " + userTitle + " " + translate.text("edited on") +": " + datetime.toDate(discussionData[i][8], "dd.MM.yyyy");
+        }
+
+        discussionData[i].push(discussionTitle);
+    }
+
+    //if something gets selected in the tree, only return those datasets
+    if(pIdValues && !this.knowledgeId && !discussionData.length)
+    {
+        this.data = knowledgeData;
+        return this;
+    }
+    else if(pIdValues && discussionData.length)
+    {
+        this.data = discussionData;
+        return this;
+    }
+
+    var tempTree = [];
+    //if a specific knowledge is given, then use the empty tree to fill with top parents
+    //, otherwise insert knowledge entries into the tree first via _fillKnowledge() and then add top parents to those
+    tempTree = _fillTopParents(((this.knowledgeId)
+        ? tempTree
+        : _fillKnowledge(tempTree, knowledgeData))
+    , discussionData
+    , this.knowledgeId);
+    //if we have a specific knowledgeId, we recursively add all children for each top parent.
+    if(this.knowledgeId)
+    {
+        for(let i = 0; i < tempTree.length; i++)
+        {
+            _fillInChildren(tempTree[i], discussionData, tempTree[i].id);
+            tempTree[i].date = _propagateMostRecentDate(tempTree[i]);
+        }
+        tempTree.sort(_sortByDateDesc);
+    }
+    else
+    {
+        for(let i = 0; i < tempTree.length; i++) // loop over knowledge
+        {
+            for(let ii = 0; ii < tempTree[i].children.length; ii++) // loop over opening threads
+            {
+                _fillInChildren(tempTree[i].children[ii], discussionData, tempTree[i].children[ii].id); //add children recursively to opening threads
+                tempTree[i].children[ii].date = _propagateMostRecentDate(tempTree[i].children[ii]);
+            }
+            tempTree[i].children.sort(_sortByDateDesc);
+            tempTree[i].date = tempTree[i].children[0].date;
+        }
+        tempTree.sort(_sortByDateDesc);
+    }
+
+    this.data = _buildArrayFromTree.apply(this, [tempTree]);
+
+    return this;
+
+    function _getIcon(pNodeType, pParentId, pStatus)
+    {           
+        if(pNodeType == "K")
+            return iconMap.KNOWLEDGE;
+        if(pNodeType == "D" && pStatus == $KeywordRegistry.discussionStatus$closed())
+            return iconMap.TOP_CLOSED;
+        if(pNodeType == "D" && pParentId == "")
+            return iconMap.TOP;
+        if(pNodeType == "D" && pParentId != "")
+            return iconMap.ANSWER;
+        
+        return "";
+    }
+
+    function _getNamefromUser(pUser)
+    {
+        return ((pUser && pUser[tools.PARAMS]) ? pUser[tools.PARAMS][tools.FIRSTNAME] + " " + pUser[tools.PARAMS][tools.LASTNAME] : null);
+    }
+
+    function _buildArrayFromTree(pTree)
+    {
+        var dataArray = [];
+
+        function __runLayers(pBranch)
+        {
+            dataArray.push(pBranch.data);
+
+            for(let i = 0; i < pBranch.children.length; i++)
+            {
+                __runLayers(pBranch.children[i]);
+            }
+        }
+
+        for(let i = 0; i < pTree.length; i++)
+        {
+            __runLayers.apply(this, [pTree[i]]);
+        }
+
+        return dataArray;
+    }
+
+    function _sortByDateDesc(a,b)
+    {
+        return b.date - a.date;
+    }
+
+    function _fillKnowledge(pTree, pData)
+    {
+        for(let i = 0; i < pData.length; i++)
+        {
+            pTree.push({
+                id:pData[i][0]
+                ,
+                parent:null
+                ,
+                data:[
+                pData[i][0]
+                ,null
+                ,null
+                ,null
+                ,pData[i][2]
+                ,null
+                ,null
+                ,null
+                ,null
+                ,null
+                ,null
+                ,null
+                ,""
+                ,"K"]
+                ,
+                children:[]
+            });
+            pData.splice(i--,1);
+        }
+
+        return pTree;
+    }
+
+    function _fillTopParents(pTree, pData, pHasSpecificKnowledge)
+    {
+        function __addNode(pTree, pNodeData, pNodeIndex, pSetAsParentId)
+        {
+            if(!pNodeIndex && !pSetAsParentId)
+            {
+                pTree.push({
+                    id:pNodeData[0]
+                    ,
+                    parent:null
+                    ,
+                    data:pNodeData
+                    ,
+                    nodeType:pNodeData[13]
+                    ,
+                    children:[]
+                });
+            }
+            else
+            {
+                pNodeData[1] = pSetAsParentId;
+                pTree[pNodeIndex].children.push({
+                    id:pNodeData[0]
+                    ,
+                    parent:pSetAsParentId
+                    ,
+                    data:pNodeData
+                    ,
+                    nodeType:pNodeData[13]
+                    ,
+                    children:[]
+                });
+            }
+        }
+
+        if(pHasSpecificKnowledge)
+        {
+            for(let i = 0; i < pData.length; i++)
+            {
+                if(!pData[i][1])
+                {
+                    __addNode(pTree, pData.splice(i--,1)[0]);
+                }
+            }
+        }
+        else
+        {
+            for(let i = 0; i < pTree.length; i++)
+            for(let ii = 0; ii < pData.length; ii++)
+            {
+                if(!pData[ii][1] && pData[ii][2] == pTree[i].id)
+                {
+                    __addNode(pTree, pData.splice(ii--,1)[0], i, pTree[i].id);
+                }
+            }
+        }
+
+        return pTree;
+    }
+
+    function _fillInChildren(pNode, pData, pParentId)
+    {
+        var tempNodes = [];
+        for(let i = 0; i < pData.length; i++)
+        {
+            let tempData = null;
+            if(pData[i][1] == pParentId)
+            {
+                tempData = pData.splice(i--,1)[0];
+                tempNodes.push({
+                    id:tempData[0]
+                    ,
+                    parent:tempData[1]
+                    ,
+                    data:tempData
+                    ,
+                    children:[]
+                    ,
+                    nodeType:tempData[13]
+                });
+            }
+        }
+
+        for(let i = 0; i < tempNodes.length; i++)
+        {
+            _fillInChildren(tempNodes[i], pData, tempNodes[i].id);
+            pNode.children.push(tempNodes[i]);
+        }
+    }
+
+    function _propagateMostRecentDate(pNode)
+    {
+        //this funcion takes n arguments, sorts them numerically descending
+        //, so the biggest and therefore most recent timestamp is on the first index
+        //, which then gets returned
+        function __getMostRecentDate()
+        {
+            return [].slice.call(arguments).sort(function(a, b){
+                return b - a;
+            })[0];
+        }
+
+        var propagatedDate = null;
+        //if we are on the last child, only get the most recent date of this child
+        if(!pNode.children.length)
+            propagatedDate = __getMostRecentDate(pNode.data[7], pNode.data[8]);
+        else
+        {
+            propagatedDate = []
+            //if we have children, we need to get the most recent date from the children and our current node.
+            for(let i = 0; i < pNode.children.length; i++)
+            {
+                propagatedDate.push(__getMostRecentDate(_propagateMostRecentDate(pNode.children[i]), pNode.data[7], pNode.data[8]));
+            }
+
+            propagatedDate = __getMostRecentDate.apply(null,propagatedDate);
+        }
+        //return the most recent date, which got propagated all the way through the tree branch
+        return propagatedDate;
+    }
+}
+/**
+ * Function for adding a new Discussion.
+ * Used in the onInsert process of the RecordContainer of the KnowledgeDiscussion entity
+ *
+ * @param {String} pDiscussionId $local.idvalue of the onInsert process
+ * @param {Array} pRowData $local.rowdata of the onInsert process
+ *
+ * @return {this}
+ */
+KnowledgeDiscussion.prototype.addDiscussion = function(pDiscussionId, pRowData)
+{
+    if(!pRowData["DISCUSSIONTEXT.value"])
+        return this;
+
+    if(!pDiscussionId)
+        pDiscussionId = "";
+
+    var fields = ["KNOWLEDGEDISCUSSIONID","PARENTENTRY"
+    ,"KNOWLEDGEMANAGEMENT_ID","DISCUSSIONTEXT"
+    ,"STATUS","AUTHOR"
+    ,"DATE_NEW","USER_NEW"];
+    var types = db.getColumnTypes("KNOWLEDGEDISCUSSION", fields);
+
+    var values = [
+    pRowData["UID.value"]
+    ,pDiscussionId.trim()
+    ,this.knowledgeId.trim()
+    ,pRowData["DISCUSSIONTEXT.value"]
+    ,pRowData["STATUS.value"]
+    ,pRowData["AUTHOR.value"].trim()
+    ,datetime.date()
+    ,vars.get("$sys.user").trim()
+    ];
+
+    db.insertData("KNOWLEDGEDISCUSSION", fields, types, values);
+
+    return this;
+}
+/**
+ * Function for editing an existing Discussion.
+ * Used in the onUpdate process of the RecordContainer of the KnowledgeDiscussion entity
+ *
+ * @param {String} pDiscussionId $local.idvalue of the onUpdate process
+ * @param {Array} pRowData $local.rowdata of the onUpdate process
+ * @param {Array} pChanged $local.changed of the onUpdate process
+ *
+ * @return {this}
+ */
+KnowledgeDiscussion.prototype.editDiscussion = function(pDiscussionId, pRowData, pChanged)
+{
+    if(!pDiscussionId)
+        return this;
+
+    var i;
+    var fields = [];
+    var values = [];
+    var types = null;
+
+    for(i = 0; i < pChanged.length; i++)
+    {
+        let field = pChanged[i];
+        values.push(pRowData[field]);
+        fields.push(field.split(".")[0]);
+    }
+
+    types = db.getColumnTypes("KNOWLEDGEDISCUSSION", fields);
+
+    db.updateData("KNOWLEDGEDISCUSSION"
+        , fields
+        , types
+        , values
+        , newWhere("KNOWLEDGEDISCUSSION.KNOWLEDGEDISCUSSIONID", pDiscussionId)
+        .and("KNOWLEDGEDISCUSSION.KNOWLEDGEMANAGEMENT_ID", this.knowledgeId).toString());
+
+    return this;
+}
+/**
+ * Function for deleting an existing Discussion.
+ * Used in the onUpdate process of the RecordContainer of the KnowledgeDiscussion entity
+ *
+ * @param {String} pDiscussionId $local.idvalue of the onUpdate process
+ *
+ * @return {this}
+ */
+KnowledgeDiscussion.prototype.deleteDiscussion = function(pDiscussionId)
+{
+    if(!pDiscussionId)
+        return this;
+
+    db.deleteData("KNOWLEDGEDISCUSSION"
+        , newWhere("KNOWLEDGEDISCUSSION.KNOWLEDGEDISCUSSIONID", pDiscussionId)
+        .and("KNOWLEDGEDISCUSSION.KNOWLEDGEMANAGEMENT_ID", this.knowledgeId).toString());
+
+    return this;
+}
+/**
+ * Static function for checking if a discussion has children below itself
+ *
+ * @param {String} pId Id of the discussion to check
+ *
+ * @return {Boolean} true if number of children is greater than 0
+ */
+KnowledgeDiscussion.hasChildren = function(pId)
+{
+    return newSelect("count(*)").from("KNOWLEDGEDISCUSSION").where("KNOWLEDGEDISCUSSION.PARENTENTRY", pId).cell() > 0
+}
+
+KnowledgeDiscussion.getMode = function (pWithClosed)
+{
+    return ((pWithClosed == "true") ? "false" : "true");
+}
+/**
+ * Function for setting the status of a discussion AND its children
+ * @param {String} pDiscussionId The id of the discussion
+ * @param {String} pStatus $KeywordRegistry.discussionStatus$acitve() or $KeywordRegistry.discussionStatus$closed()
+ *
+ * @return {this}
+ */
+KnowledgeDiscussion.prototype.setDiscussionStatus = function(pDiscussionId, pStatus)
+{
+
+    if(!pDiscussionId || (pStatus !== $KeywordRegistry.discussionStatus$acitve() && pStatus !== $KeywordRegistry.discussionStatus$closed()))
+        return this;
+
+    let table = "KNOWLEDGEDISCUSSION";
+    let cols = ["STATUS"];
+    let colTypes = db.getColumnTypes(table, cols);
+    let updates = [];
+    let updateTemplate = [table, cols, colTypes, [pStatus]];
+
+    _addChildrenToUpdates(pDiscussionId, pStatus);
+    let parentUpdate = [].slice.call(updateTemplate,0);
+    parentUpdate.push(table+"ID = '" + pDiscussionId + "'");
+    updates.push(parentUpdate);
+    
+    db.updates(updates);
+
+    function _addChildrenToUpdates(pId, pStatus)
+    {
+        var data = db.table("select KNOWLEDGEDISCUSSIONID, PARENTENTRY from KNOWLEDGEDISCUSSION where PARENTENTRY = '" + pId + "'");
+        if(!data.length)
+            return;
+
+        for(var i = 0; i < data.length; i++)
+        {
+            let upd = [].slice.call(updateTemplate,0);
+            upd.push(table+"ID = '" + data[i][0] + "'");
+            updates.push(upd);
+            //db.updateData(table, cols, colTypes, [pStatus], table+"ID = '" + data[i][0] + "'");
+            _addChildrenToUpdates(data[i][0], pStatus);
+        }
+    }
+
+    return this;
+}
+
+function KnowledgeIndexHelper(pKnowledgeId, pData)
+{
+    this.knowledgeId = pKnowledgeId || null;
+    this.data = pData || null;
+}
+
+KnowledgeIndexHelper.getInstance = function(pId, pData)
+{
+    return new KnowledgeIndexHelper(pId, pData);
+}
+
+KnowledgeIndexHelper.prototype.getDocumentsFromContent = function()
+{
+    var tempArray = [];
+    var content = db.cell("select content from KNOWLEDGEMANAGEMENT where knowledgemanagementid = '" + this.knowledgeId + "' ");
+    var invalidLink = false;
+    // the question mark quantifier is in (.*?) to make sure, that more than one file link can be present in one line!
+    var matches = content.match( new RegExp("<a href=\"file(.*?)((htm(l?))|(pdf)|(doc(x?)))\"", "gi") );
+    var i = 0;
+
+    if(matches)
+        matches.forEach(
+            function(match)
+            {
+                var data = null;
+                match = match.replace(/^(<a href="file:(\/*))/gi,"").replace(/"$/gi,"");
+
+                if(vars.get("$sys.serveros").indexOf("windows") != -1)
+                {
+                    match = match.replace(/[/\\]+FILER[/\\]publicshare\$/, "//filer/publicshare$", "gi").replace("S:", "//filer/publicshare$").replace(/\\/g, "/");
+                }
+                else
+                {
+                    match = match.replace(/[/\\]+FILER[/\\]publicshare\$/, "/mnt/filer_publicshare", "gi").replace("S:", "/mnt/filer_publicshare").replace(/\\/g, "/");
+                }
+
+                var decodedMatch = decodeURIComponent(match);
+
+                if(fileIO.exists(decodedMatch))
+                {
+                    //only get data, if it's not a directory. getData on a directory fails with an exception
+                    if(!fileIO.isDirectory(decodedMatch))
+                    {
+                        data = fileIO.getData(decodeURIComponent(decodedMatch), util.DATA_BINARY);
+                    }
+                }
+                else
+                {
+                    invalidLink = true;
+                }
+
+                if(data != null)
+                {
+                    tempArray.push(data);
+                }
+            }
+            ,this);
+            
+    this.data[8] = tempArray;
+    //    var keywordName = "Enthält ungültige Links";
+    //    if(invalidLink)
+    //    {
+    //        if (db.cell("select count(*) from knowledgemanagementkeyword where KNOWLEDGEMANAGEMENT_ID = '" + pId + "' and KEYWORD = '" + keywordName + "'") == 0)
+    //        {
+    //            var cols = ["KEYWORD", "KNOWLEDGEMANAGEMENTKEYWORDID", "KNOWLEDGEMANAGEMENT_ID"];
+    //            db.insertData("KNOWLEDGEMANAGEMENTKEYWORD", cols, db.getColumnTypes("KNOWLEDGEMANAGEMENTKEYWORD", cols), [keywordName, util.getNewUUID(), pId]);
+    //        }
+    //    }
+    //    else
+    //    {
+    //        db.deleteData("KNOWLEDGEMANAGEMENTKEYWORD", "KNOWLEDGEMANAGEMENT_ID = '" + pId + "' and KEYWORD = '" + keywordName + "'");
+    //    }
+
+    return this;
+}
+
+function KnowledgeUtils(){}
+
+KnowledgeUtils.getLocalIdValue = function()
+{
+    var id = vars.exists("$local.idvalues") && vars.get("$local.idvalues");
+    id = ( id && (typeof id == "object") && id.length == 1 ) ? id[0] : id;
+
+    return id;
+}
+
+KnowledgeUtils.isAcademy = function(pUser)
+{
+    let roles = tools.getRoles(pUser);
+    
+    for(let i = 0; i < roles.length; i++)
+    if(roles[i] == "PROJECT_Abt_Akademie")
+        return true;
+        
+    return false;
+}
+
+KnowledgeUtils.trimAndUp = function(pIn)
+{
+    return pIn.trim().toUpperCase();
+}
\ No newline at end of file
diff --git a/process/NewsSystem_lib/NewsSystem_lib.aod b/process/NewsSystem_lib/NewsSystem_lib.aod
new file mode 100644
index 00000000000..f4907ecd213
--- /dev/null
+++ b/process/NewsSystem_lib/NewsSystem_lib.aod
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+  <name>NewsSystem_lib</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <process>%aditoprj%/process/NewsSystem_lib/process.js</process>
+  <variants>
+    <element>LIBRARY</element>
+  </variants>
+</process>
diff --git a/process/NewsSystem_lib/process.js b/process/NewsSystem_lib/process.js
new file mode 100644
index 00000000000..3a365fac90e
--- /dev/null
+++ b/process/NewsSystem_lib/process.js
@@ -0,0 +1,91 @@
+import("system.vars");
+import("system.util");
+import("KnowledgeManagement_lib");
+import("system.entities");
+import("system.text");
+import("system.notification");
+import("system.tools");
+
+function NewsSystem() {}
+
+/*
+ * Returns the selected users with the given role/s.
+ * 
+ * @param {Array} roleArray req roles, that need to are selected.
+ * 
+ * @return {Array} User internal name of user model.
+ */
+NewsSystem.getUsersWithRoles = function(roleArray) 
+{
+    var users = tools.getUsers(tools.getUsersWithAnyRole(roleArray), tools.PROFILE_FULL);
+    var arr = [];
+    
+    for(var i = 0; i < users.length; i++)
+    {
+        arr.push(users[i][tools.NAME]);
+    }
+    
+    return arr;
+}
+
+/*
+ * Creates a news notification for the selected users.
+ * 
+ * @param {String} description req The description of the news.
+ * @param {String} caption req The title of the news.
+ * @param {Array} users req Selected users.
+ * @param {String} id req KnowledgemanagementID to connect the notification.
+ * 
+ * @return {void}
+ */
+NewsSystem.createNewsNotification = function(description, caption, users, id) 
+{
+    var config = notification.createConfig()
+    .notificationType("News")
+    .description(description)
+    .caption(caption)
+    .linkInfo(text.encodeMS(["KnowledgeManagement", id]))
+    .initialState(notification.STATE_UNSEEN)
+    .addUsersWithIds(users);
+    
+    notification.addNotificationWith(config);
+}
+
+/*
+ * Returns a sub-sql for the translated Roles.
+ * 
+ * @return {String} Returns a sub-sql for the translated Roles.
+ */
+NewsSystem.getDisplayValue = function() 
+{
+    var resultSet = " case ";
+    var allRolesObject = tools.getAllRoles();
+
+    for each (currentRoleObject in allRolesObject)
+    {
+        resultSet += " when KNOWLEDGEROLES.ROLENAME = '" + currentRoleObject[3] + "' then '" + currentRoleObject[0] + "' ";
+    }
+
+    resultSet += " end ";
+    
+    return resultSet;
+}
+
+NewsSystem.setAsNews = function(pKnowledgeID, pNotification, pIsNews)
+{
+    if(pNotification) //check if the field "mark" is ticked
+    {
+        vars.set("$context.setNotificationMark", true); //set context variable true to trigger the afterOperatingState process
+    }
+
+    if(pIsNews) //check if the field "isNewsMark" is ticked
+    {
+        var knowledgeId = pKnowledgeID;
+        var data = {};  
+        data["TAG.value"] = "News";
+        
+        KnowledgeManagementTagsController
+        .getInstance(knowledgeId)
+        .addTag(util.getNewUUID(), data); //set the "news"-tag to the current data set
+    }
+}
diff --git a/process/Sql_lib/process.js b/process/Sql_lib/process.js
index 75c6923e249..b5a7b0c686b 100644
--- a/process/Sql_lib/process.js
+++ b/process/Sql_lib/process.js
@@ -3766,6 +3766,33 @@ SqlMaskingUtils.prototype.yearFromDate = function(pField)
     }
 }
 
+/**
+ * returns the first field, that is not null or empty
+ * masks the behaviour of coalesce with case when
+ * 
+ * @param pFields {Array} Array of fieldnames. Has to be in the right order. It will be checked from 0 upwards
+ */
+SqlMaskingUtils.prototype.coalesce = function(pFields)
+{
+    var retSql = "";
+    
+    if(pFields && typeof pFields == "object" && pFields.length)
+    {
+        retSql = "case ";
+
+        for(let i = 0; i < pFields.length; i++)
+        {
+            retSql += " when (" + pFields[i] + " is not null or " + pFields[i] + " <> '') then " + pFields[i] + " "
+        }
+
+        retSql += " else null end";
+    }
+    else
+        throw {message:"The input to coalesce has to be an Array containing the column names"};
+    
+    return retSql;
+}
+
 /**
  * functions for various Sql-actions
  * Do not create an instance of this!
diff --git a/process/Util_lib/process.js b/process/Util_lib/process.js
index 778e4ae46cb..697b1e2dd7b 100644
--- a/process/Util_lib/process.js
+++ b/process/Util_lib/process.js
@@ -1082,4 +1082,11 @@ ConsecutiveCodeUtils.setCode = function(pId, pTable, pIdCol, pCodeCol)
     
     newWhereIfSet(pTable + "." + pIdCol, pId)
         .updateData(true, pTable, [pCodeCol], null, [parseInt(max)+1]);
+}
+
+function IdUtils() {}
+
+IdUtils.isUUID = function(pIn)
+{
+    return /\w{8}-\w{4}-\w{4}-\w{4}-\w{12}/i.test(pIn);
 }
\ No newline at end of file
-- 
GitLab


From a22088d97b6d52aea3f2d2a7da7da7021e34951d Mon Sep 17 00:00:00 2001
From: Erik Pollinger <e.pollinger@yahoo.de>
Date: Tue, 10 Nov 2020 01:49:03 +0100
Subject: [PATCH 068/184] removed a logging

---
 .../jdito_knowledgediscussioncontainer/contentProcess.js        | 2 --
 1 file changed, 2 deletions(-)

diff --git a/entity/KnowledgeDiscussion_entity/recordcontainers/jdito_knowledgediscussioncontainer/contentProcess.js b/entity/KnowledgeDiscussion_entity/recordcontainers/jdito_knowledgediscussioncontainer/contentProcess.js
index b607e1b91ea..fa4fb2b67c3 100644
--- a/entity/KnowledgeDiscussion_entity/recordcontainers/jdito_knowledgediscussioncontainer/contentProcess.js
+++ b/entity/KnowledgeDiscussion_entity/recordcontainers/jdito_knowledgediscussioncontainer/contentProcess.js
@@ -14,8 +14,6 @@ var withClosed = vars.exists("$context.showAll") && vars.get("$context.showAll")
 if(wClosedParam == "true")
     withClosed = wClosedParam;
 
-logging.log(withClosed);
-
 var idValues = vars.exists("$local.idvalues") && vars.get("$local.idvalues");
 
 var discussions = KnowledgeDiscussion.getInstance(kId);    
-- 
GitLab


From 30289689cd941d6977daf874df8e380adcf50e80 Mon Sep 17 00:00:00 2001
From: Sebastian Listl <s.listl@adito.de>
Date: Tue, 10 Nov 2020 09:57:56 +0100
Subject: [PATCH 069/184] #1052649 Title spellings

---
 aliasDefinition/Data_alias/Data_alias.aod     |  6 +--
 entity/360Degree_entity/360Degree_entity.aod  |  2 +-
 .../SalesprojectAnalyses_entity.aod           |  6 +--
 .../Salesproject_entity.aod                   |  2 +-
 entity/Salesproject_entity/onValidation.js    |  2 +-
 .../_____LANGUAGE_EXTRA.aod                   | 39 ++++++++++---------
 .../_____LANGUAGE_de/_____LANGUAGE_de.aod     | 36 ++++++++---------
 .../_____LANGUAGE_en/_____LANGUAGE_en.aod     | 39 ++++++++++---------
 .../ActivityFilter_view.aod                   |  4 +-
 .../CampaignCostChart_view.aod                |  2 +-
 .../CampaignFilter_view.aod                   |  2 +-
 .../MyDashboardScoreCard_view.aod             |  2 +-
 .../OfferFilter_view/OfferFilter_view.aod     |  2 +-
 .../OrderFilter_view/OrderFilter_view.aod     |  2 +-
 .../OrganisationFilter_view.aod               |  6 +--
 .../PersonFilter_view/PersonFilter_view.aod   |  6 +--
 .../SalesprojectAnalyses_view.aod             |  2 +-
 .../SalesprojectConversionRate_view.aod       |  2 +-
 .../SalesprojectEdit_view.aod                 |  2 +-
 .../SalesprojectFilter_view.aod               |  4 +-
 .../SalesprojectScoreCard_view.aod            |  2 +-
 .../SupportTicketFilter_view.aod              |  2 +-
 neonView/TaskFilter_view/TaskFilter_view.aod  |  2 +-
 .../UniversalFileProcessorDropzone_view.aod   |  2 +-
 .../UnlinkedMailFilter_view.aod               |  2 +-
 .../VisitPlanEntryFilter_view.aod             |  2 +-
 .../WorkflowTaskOwn_view.aod                  |  2 +-
 27 files changed, 94 insertions(+), 88 deletions(-)

diff --git a/aliasDefinition/Data_alias/Data_alias.aod b/aliasDefinition/Data_alias/Data_alias.aod
index 96738b18065..ed77c7a5792 100644
--- a/aliasDefinition/Data_alias/Data_alias.aod
+++ b/aliasDefinition/Data_alias/Data_alias.aod
@@ -3611,7 +3611,7 @@
                 <notNull v="true" />
                 <isUnique v="true" />
                 <index v="true" />
-                <title>Salesproject Id</title>
+                <title>Sales Project Id</title>
                 <description></description>
               </entityFieldDb>
               <entityFieldDb>
@@ -8091,7 +8091,7 @@
                 <isUnique v="false" />
                 <index v="true" />
                 <documentation></documentation>
-                <title>Salesproject Id</title>
+                <title>Sales Project Id</title>
                 <description></description>
                 <customProperties>
                   <customBooleanProperty>
@@ -8140,7 +8140,7 @@
                 <isUnique v="true" />
                 <index v="true" />
                 <documentation></documentation>
-                <title>Salesproject milestone Id</title>
+                <title>Sales Project milestone Id</title>
                 <description></description>
               </entityFieldDb>
               <entityFieldDb>
diff --git a/entity/360Degree_entity/360Degree_entity.aod b/entity/360Degree_entity/360Degree_entity.aod
index e4125015133..62c86300ec6 100644
--- a/entity/360Degree_entity/360Degree_entity.aod
+++ b/entity/360Degree_entity/360Degree_entity.aod
@@ -126,7 +126,7 @@
         </entityActionField>
         <entityActionField>
           <name>newSalesproject</name>
-          <title>Salesproject</title>
+          <title>Sales Project</title>
           <onActionProcess>%aditoprj%/entity/360Degree_entity/entityfields/newmodule/children/newsalesproject/onActionProcess.js</onActionProcess>
           <iconId>VAADIN:BOOK_DOLLAR</iconId>
           <stateProcess>%aditoprj%/entity/360Degree_entity/entityfields/newmodule/children/newsalesproject/stateProcess.js</stateProcess>
diff --git a/entity/SalesprojectAnalyses_entity/SalesprojectAnalyses_entity.aod b/entity/SalesprojectAnalyses_entity/SalesprojectAnalyses_entity.aod
index 5b2898641b5..3c35c7cf030 100644
--- a/entity/SalesprojectAnalyses_entity/SalesprojectAnalyses_entity.aod
+++ b/entity/SalesprojectAnalyses_entity/SalesprojectAnalyses_entity.aod
@@ -3,7 +3,7 @@
   <name>SalesprojectAnalyses_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <documentation>%aditoprj%/entity/SalesprojectAnalyses_entity/documentation.adoc</documentation>
-  <title>Salesproject Analyses</title>
+  <title>Sales Project Analyses</title>
   <iconId>VAADIN:PIE_CHART</iconId>
   <recordContainer>jdito</recordContainer>
   <entityFields>
@@ -41,14 +41,14 @@
     </entityField>
     <entityField>
       <name>SENT_OFFERS</name>
-      <title>Sent offers</title>
+      <title>Sent Offers</title>
       <contentType>NUMBER</contentType>
       <state>READONLY</state>
       <valueProcess>%aditoprj%/entity/SalesprojectAnalyses_entity/entityfields/sent_offers/valueProcess.js</valueProcess>
     </entityField>
     <entityField>
       <name>OPEN_SALESPROJECTS</name>
-      <title>Open salesprojects</title>
+      <title>Open Salesprojects</title>
       <contentType>NUMBER</contentType>
       <state>READONLY</state>
       <valueProcess>%aditoprj%/entity/SalesprojectAnalyses_entity/entityfields/open_salesprojects/valueProcess.js</valueProcess>
diff --git a/entity/Salesproject_entity/Salesproject_entity.aod b/entity/Salesproject_entity/Salesproject_entity.aod
index f33a3391222..1191ebd36be 100644
--- a/entity/Salesproject_entity/Salesproject_entity.aod
+++ b/entity/Salesproject_entity/Salesproject_entity.aod
@@ -14,7 +14,7 @@
   <useFavorites v="true" />
   <iconId>VAADIN:BOOK_DOLLAR</iconId>
   <imageProcess>%aditoprj%/entity/Salesproject_entity/imageProcess.js</imageProcess>
-  <titlePlural>Sales Projects</titlePlural>
+  <titlePlural>Salesprojects</titlePlural>
   <recordContainer>db</recordContainer>
   <entityFields>
     <entityProvider>
diff --git a/entity/Salesproject_entity/onValidation.js b/entity/Salesproject_entity/onValidation.js
index c9618796815..ffe29cce81f 100644
--- a/entity/Salesproject_entity/onValidation.js
+++ b/entity/Salesproject_entity/onValidation.js
@@ -9,4 +9,4 @@ var endDate = vars.get("$field.ENDDATE");
 if (!DateUtils.validateBeginnBeforeEnd(startDate, endDate))
     result.string(DateUtils.getValidationFailString());
 else if(!vars.get("$field.PROJECTTITLE") && vars.get("$field.PROJECTTYPE") && vars.exists("$param.PresetTitle_param"))
-    result.string(translate.text("The Sales Project can only be filled when a company has been specified"));
\ No newline at end of file
+    result.string(translate.text("The Salesproject can only be filled when a company has been specified"));
\ No newline at end of file
diff --git a/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod b/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod
index 7b27a5c7418..c5139ee3b51 100644
--- a/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod
+++ b/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod
@@ -61,7 +61,7 @@
       <key>Female</key>
     </entry>
     <entry>
-      <key>Contactmanagement</key>
+      <key>Contact Management</key>
     </entry>
     <entry>
       <key>Office address</key>
@@ -646,7 +646,7 @@
       <key>Orderitems</key>
     </entry>
     <entry>
-      <key>Sent receipts</key>
+      <key>Sent Receipts</key>
     </entry>
     <entry>
       <key>Copy receipt</key>
@@ -664,7 +664,7 @@
       <key>Turnover</key>
     </entry>
     <entry>
-      <key>Sent offers</key>
+      <key>Sent Offers</key>
     </entry>
     <entry>
       <key>Show all activities</key>
@@ -733,7 +733,7 @@
       <key>Show all salesprojects</key>
     </entry>
     <entry>
-      <key>Open salesprojects</key>
+      <key>Open Salesprojects</key>
     </entry>
     <entry>
       <key>July</key>
@@ -2374,7 +2374,7 @@
       <key>{$ADDRESS_IDENTIFIER}</key>
     </entry>
     <entry>
-      <key>Salesproject phases</key>
+      <key>Salesproject Phases</key>
     </entry>
     <entry>
       <key>Add to Campaign</key>
@@ -2392,7 +2392,7 @@
       <key>Add participants to Campaign</key>
     </entry>
     <entry>
-      <key>Key figures</key>
+      <key>Key Figures</key>
     </entry>
     <entry>
       <key>Delete all usage</key>
@@ -4105,7 +4105,7 @@
       <key>Show my campaigns</key>
     </entry>
     <entry>
-      <key>My campaigns</key>
+      <key>My Campaigns</key>
     </entry>
     <entry>
       <key>Add to Bulkmail</key>
@@ -4297,7 +4297,7 @@
       <key>Unknown incoming call from %0 to %1</key>
     </entry>
     <entry>
-      <key>All unlinked mails</key>
+      <key>All Unlinked Mails</key>
     </entry>
     <entry>
       <key>hour</key>
@@ -4309,7 +4309,7 @@
       <key>Incoming call from %0 (%1) to %2</key>
     </entry>
     <entry>
-      <key>import mails</key>
+      <key>Import Mails</key>
     </entry>
     <entry>
       <key>Unknown accepted call from %0 to %1, duration: %2</key>
@@ -4546,7 +4546,7 @@
       <key>Campaign management</key>
     </entry>
     <entry>
-      <key>Campaign costs</key>
+      <key>Campaign Costs</key>
     </entry>
     <entry>
       <key>Shows all campaigns</key>
@@ -4777,7 +4777,7 @@
       <key>Credit</key>
     </entry>
     <entry>
-      <key>My tickets</key>
+      <key>My Tickets</key>
     </entry>
     <entry>
       <key>Replacement name</key>
@@ -4933,13 +4933,13 @@
       <key>Show my contacts</key>
     </entry>
     <entry>
-      <key>My contacts</key>
+      <key>My Contacts</key>
     </entry>
     <entry>
       <key>Show my organisations</key>
     </entry>
     <entry>
-      <key>My organisations</key>
+      <key>My Organisations</key>
     </entry>
     <entry>
       <key>Custom template</key>
@@ -5334,7 +5334,7 @@
       <key>Mobility, Transport and Logistics</key>
     </entry>
     <entry>
-      <key>Sales Project</key>
+      <key>Salesproject</key>
     </entry>
     <entry>
       <key>Load data</key>
@@ -5688,7 +5688,7 @@
       <key>No letters</key>
     </entry>
     <entry>
-      <key>Own workflow tasks</key>
+      <key>My Workflow Tasks</key>
     </entry>
     <entry>
       <key>My workflow tasks</key>
@@ -6066,7 +6066,7 @@
       <key>Workflow management</key>
     </entry>
     <entry>
-      <key>my visit planning</key>
+      <key>My Visit Planning</key>
     </entry>
     <entry>
       <key>Update offer</key>
@@ -6522,7 +6522,7 @@
       <key>Full details</key>
     </entry>
     <entry>
-      <key>Sales Projects</key>
+      <key>Salesprojects</key>
     </entry>
     <entry>
       <key>set Read</key>
@@ -6705,7 +6705,7 @@
       <key>{SENT_MAIL}</key>
     </entry>
     <entry>
-      <key>The Sales Project can only be filled when a company has been specified</key>
+      <key>The Salesproject can only be filled when a company has been specified</key>
     </entry>
     <entry>
       <key>The workflow could not be deployed</key>
@@ -7299,6 +7299,9 @@
     <entry>
       <key>Start marketing mailing</key>
     </entry>
+    <entry>
+      <key>Email address</key>
+    </entry>
   </keyValueMap>
   <font name="Dialog" style="0" size="11" />
   <sqlModels>
diff --git a/language/_____LANGUAGE_de/_____LANGUAGE_de.aod b/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
index e1b810a066f..7de3c6423c0 100644
--- a/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
+++ b/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
@@ -83,7 +83,7 @@
       <value>Keine E-Mails</value>
     </entry>
     <entry>
-      <key>My organisations</key>
+      <key>My Organisations</key>
       <value>Meine Firmen</value>
     </entry>
     <entry>
@@ -259,7 +259,7 @@
       <value>Eigenschaftsgruppen können nicht verwendet werden</value>
     </entry>
     <entry>
-      <key>My contacts</key>
+      <key>My Contacts</key>
       <value>Meine Kontakte</value>
     </entry>
     <entry>
@@ -407,7 +407,7 @@
       <value>Priorität</value>
     </entry>
     <entry>
-      <key>Salesproject phases</key>
+      <key>Salesproject Phases</key>
       <value>Vertriebsprojektphasen</value>
     </entry>
     <entry>
@@ -1028,7 +1028,7 @@
       <value>Teilnehmer/innen</value>
     </entry>
     <entry>
-      <key>Contactmanagement</key>
+      <key>Contact Management</key>
       <value>Kontaktmanagement</value>
     </entry>
     <entry>
@@ -1763,7 +1763,7 @@
       <value>Niedrigpreisstrategie</value>
     </entry>
     <entry>
-      <key>Sent offers</key>
+      <key>Sent Offers</key>
       <value>Versendete Angebote</value>
     </entry>
     <entry>
@@ -1787,7 +1787,7 @@
       <value>Vertriebsprojekte</value>
     </entry>
     <entry>
-      <key>Open salesprojects</key>
+      <key>Open Salesprojects</key>
       <value>Offene Vertriebsprojekte</value>
     </entry>
     <entry>
@@ -2016,7 +2016,7 @@
       <value>Belegposten</value>
     </entry>
     <entry>
-      <key>Sent receipts</key>
+      <key>Sent Receipts</key>
       <value>Versendete Belege</value>
     </entry>
     <entry>
@@ -2200,7 +2200,7 @@
       <value>Vertriebsdashboard</value>
     </entry>
     <entry>
-      <key>Key figures</key>
+      <key>Key Figures</key>
       <value>Kennzahlen</value>
     </entry>
     <entry>
@@ -6150,7 +6150,7 @@
       <value>Keine Kontakte ausgewählt</value>
     </entry>
     <entry>
-      <key>My campaigns</key>
+      <key>My Campaigns</key>
       <value>Meine Kampagnen</value>
     </entry>
     <entry>
@@ -6243,7 +6243,7 @@
       <value>eine Datei ignoriert</value>
     </entry>
     <entry>
-      <key>All unlinked mails</key>
+      <key>All Unlinked Mails</key>
       <value>Alle unverknüpften E-Mails</value>
     </entry>
     <entry>
@@ -6259,7 +6259,7 @@
       <value>Eingehender Anruf von %0 (%1) nach %2</value>
     </entry>
     <entry>
-      <key>import mails</key>
+      <key>Import Mails</key>
       <value>E-Mails importieren</value>
     </entry>
     <entry>
@@ -6463,7 +6463,7 @@
       <value>Kampagnenmanagement</value>
     </entry>
     <entry>
-      <key>Campaign costs</key>
+      <key>Campaign Costs</key>
       <value>Kampagnenkosten</value>
     </entry>
     <entry>
@@ -6753,7 +6753,7 @@
       <value>Vorlagen-Anhänge verwenden</value>
     </entry>
     <entry>
-      <key>My tickets</key>
+      <key>My Tickets</key>
       <value>Meine Tickets</value>
     </entry>
     <entry>
@@ -6965,7 +6965,7 @@
       <key>yyyyMMdd</key>
     </entry>
     <entry>
-      <key>Sales Project</key>
+      <key>Salesproject</key>
       <value>Vertriebsprojekt</value>
     </entry>
     <entry>
@@ -7800,7 +7800,7 @@ Bitte Datumseingabe prüfen</value>
       <key>;</key>
     </entry>
     <entry>
-      <key>Own workflow tasks</key>
+      <key>My Workflow Tasks</key>
       <value>Meine Workflow Aufgaben</value>
     </entry>
     <entry>
@@ -8218,7 +8218,7 @@ Bitte Datumseingabe prüfen</value>
       <value>Workflow management</value>
     </entry>
     <entry>
-      <key>my visit planning</key>
+      <key>My Visit Planning</key>
       <value>Meine Besuchsplanung</value>
     </entry>
     <entry>
@@ -8754,7 +8754,7 @@ Bitte Datumseingabe prüfen</value>
       <value>Noch nicht erstellt</value>
     </entry>
     <entry>
-      <key>Sales Projects</key>
+      <key>Salesprojects</key>
       <value>Vertriebsprojekte</value>
     </entry>
     <entry>
@@ -9273,7 +9273,7 @@ Bitte Datumseingabe prüfen</value>
       <value>Punkte</value>
     </entry>
     <entry>
-      <key>The Sales Project can only be filled when a company has been specified</key>
+      <key>The Salesproject can only be filled when a company has been specified</key>
       <value>vertriebsprojekt darf nur gefüllt sein wenn eine Firma festgelegt wurde.</value>
     </entry>
     <entry>
diff --git a/language/_____LANGUAGE_en/_____LANGUAGE_en.aod b/language/_____LANGUAGE_en/_____LANGUAGE_en.aod
index 221f4b4a721..df669706ecc 100644
--- a/language/_____LANGUAGE_en/_____LANGUAGE_en.aod
+++ b/language/_____LANGUAGE_en/_____LANGUAGE_en.aod
@@ -86,7 +86,7 @@
       <key>Female</key>
     </entry>
     <entry>
-      <key>Contactmanagement</key>
+      <key>Contact Management</key>
     </entry>
     <entry>
       <key>Office address</key>
@@ -679,7 +679,7 @@
       <key>Orderitems</key>
     </entry>
     <entry>
-      <key>Sent receipts</key>
+      <key>Sent Receipts</key>
     </entry>
     <entry>
       <key>Copy receipt</key>
@@ -697,7 +697,7 @@
       <key>Turnover</key>
     </entry>
     <entry>
-      <key>Sent offers</key>
+      <key>Sent Offers</key>
     </entry>
     <entry>
       <key>Show all activities</key>
@@ -766,7 +766,7 @@
       <key>Show all salesprojects</key>
     </entry>
     <entry>
-      <key>Open salesprojects</key>
+      <key>Open Salesprojects</key>
     </entry>
     <entry>
       <key>July</key>
@@ -2426,7 +2426,7 @@
       <value>Identifier</value>
     </entry>
     <entry>
-      <key>Salesproject phases</key>
+      <key>Salesproject Phases</key>
     </entry>
     <entry>
       <key>Add to Campaign</key>
@@ -2444,7 +2444,7 @@
       <key>Add participants to Campaign</key>
     </entry>
     <entry>
-      <key>Key figures</key>
+      <key>Key Figures</key>
     </entry>
     <entry>
       <key>Hierarchy</key>
@@ -4215,7 +4215,7 @@
       <key>Show my campaigns</key>
     </entry>
     <entry>
-      <key>My campaigns</key>
+      <key>My Campaigns</key>
     </entry>
     <entry>
       <key>Add to Bulkmail</key>
@@ -4374,7 +4374,7 @@
       <key>Unknown incoming call from %0 to %1</key>
     </entry>
     <entry>
-      <key>All unlinked mails</key>
+      <key>All Unlinked Mails</key>
     </entry>
     <entry>
       <key>hour</key>
@@ -4386,7 +4386,7 @@
       <key>Incoming call from %0 (%1) to %2</key>
     </entry>
     <entry>
-      <key>import mails</key>
+      <key>Import Mails</key>
     </entry>
     <entry>
       <key>Unknown accepted call from %0 to %1, duration: %2</key>
@@ -4623,7 +4623,7 @@
       <key>Add the selection to a serial letter</key>
     </entry>
     <entry>
-      <key>Campaign costs</key>
+      <key>Campaign Costs</key>
     </entry>
     <entry>
       <key>Shows all campaigns</key>
@@ -4869,7 +4869,7 @@
       <key>Use template attachments</key>
     </entry>
     <entry>
-      <key>My tickets</key>
+      <key>My Tickets</key>
     </entry>
     <entry>
       <key>HTML template - Only for .html</key>
@@ -5010,13 +5010,13 @@
       <key>Show my contacts</key>
     </entry>
     <entry>
-      <key>My contacts</key>
+      <key>My Contacts</key>
     </entry>
     <entry>
       <key>Show my organisations</key>
     </entry>
     <entry>
-      <key>My organisations</key>
+      <key>My Organisations</key>
     </entry>
     <entry>
       <key>Custom template</key>
@@ -5411,7 +5411,7 @@
       <key>Mobility, Transport and Logistics</key>
     </entry>
     <entry>
-      <key>Sales Project</key>
+      <key>Salesproject</key>
     </entry>
     <entry>
       <key>Load data</key>
@@ -5765,7 +5765,7 @@
       <key>No letters</key>
     </entry>
     <entry>
-      <key>Own workflow tasks</key>
+      <key>My Workflow Tasks</key>
     </entry>
     <entry>
       <key>My workflow tasks</key>
@@ -6134,7 +6134,7 @@
       <key>Workflow management</key>
     </entry>
     <entry>
-      <key>my visit planning</key>
+      <key>My Visit Planning</key>
     </entry>
     <entry>
       <key>Update offer</key>
@@ -6607,7 +6607,7 @@
       <key>Invalid file type; only .html, .eml and .txt are allowed</key>
     </entry>
     <entry>
-      <key>Sales Projects</key>
+      <key>Salesprojects</key>
     </entry>
     <entry>
       <key>set Read</key>
@@ -6788,7 +6788,7 @@
       <key>Workflow Model</key>
     </entry>
     <entry>
-      <key>The Sales Project can only be filled when a company has been specified</key>
+      <key>The Salesproject can only be filled when a company has been specified</key>
     </entry>
     <entry>
       <key>{SEND_MAIL}</key>
@@ -7380,6 +7380,9 @@
     <entry>
       <key>Start marketing mailing</key>
     </entry>
+    <entry>
+      <key>Email address</key>
+    </entry>
   </keyValueMap>
   <font name="Dialog" style="0" size="11" />
 </language>
diff --git a/neonView/ActivityFilter_view/ActivityFilter_view.aod b/neonView/ActivityFilter_view/ActivityFilter_view.aod
index a94234cc3f8..3dff8e3ef36 100644
--- a/neonView/ActivityFilter_view/ActivityFilter_view.aod
+++ b/neonView/ActivityFilter_view/ActivityFilter_view.aod
@@ -16,7 +16,7 @@
       <categories>
         <neonDashletCategory>
           <name>contactmanagement</name>
-          <title>Contactmanagement</title>
+          <title>Contact Management</title>
         </neonDashletCategory>
       </categories>
     </neonDashletConfiguration>
@@ -31,7 +31,7 @@
       <categories>
         <neonDashletCategory>
           <name>contactmanagement</name>
-          <title>Contactmanagement</title>
+          <title>Contact Management</title>
         </neonDashletCategory>
       </categories>
       <parameters>
diff --git a/neonView/CampaignCostChart_view/CampaignCostChart_view.aod b/neonView/CampaignCostChart_view/CampaignCostChart_view.aod
index 9c8daa4a4eb..24159367f94 100644
--- a/neonView/CampaignCostChart_view/CampaignCostChart_view.aod
+++ b/neonView/CampaignCostChart_view/CampaignCostChart_view.aod
@@ -5,7 +5,7 @@
   <dashletConfigurations>
     <neonDashletConfiguration>
       <name>CampaignCostsChart</name>
-      <title>Campaign costs</title>
+      <title>Campaign Costs</title>
       <description>Shows campaing costs graphically processed</description>
       <fragment>Campaign/full</fragment>
       <singleton v="true" />
diff --git a/neonView/CampaignFilter_view/CampaignFilter_view.aod b/neonView/CampaignFilter_view/CampaignFilter_view.aod
index 0dcb198305d..4d7c3aac1c1 100644
--- a/neonView/CampaignFilter_view/CampaignFilter_view.aod
+++ b/neonView/CampaignFilter_view/CampaignFilter_view.aod
@@ -8,7 +8,7 @@
   <dashletConfigurations>
     <neonDashletConfiguration>
       <name>CurrentUsersOwnedCampaigns</name>
-      <title>My campaigns</title>
+      <title>My Campaigns</title>
       <description>Show my campaigns</description>
       <fragment>Campaign/filter</fragment>
       <singleton v="true" />
diff --git a/neonView/MyDashboardScoreCard_view/MyDashboardScoreCard_view.aod b/neonView/MyDashboardScoreCard_view/MyDashboardScoreCard_view.aod
index 723a24964e2..2c2b62c43e2 100644
--- a/neonView/MyDashboardScoreCard_view/MyDashboardScoreCard_view.aod
+++ b/neonView/MyDashboardScoreCard_view/MyDashboardScoreCard_view.aod
@@ -13,7 +13,7 @@
       <categories>
         <neonDashletCategory>
           <name>contactmanagement</name>
-          <title>Contactmanagement</title>
+          <title>Contact Management</title>
         </neonDashletCategory>
       </categories>
     </neonDashletConfiguration>
diff --git a/neonView/OfferFilter_view/OfferFilter_view.aod b/neonView/OfferFilter_view/OfferFilter_view.aod
index dcfe1e8da89..3e058b7c388 100644
--- a/neonView/OfferFilter_view/OfferFilter_view.aod
+++ b/neonView/OfferFilter_view/OfferFilter_view.aod
@@ -25,7 +25,7 @@
     </neonDashletConfiguration>
     <neonDashletConfiguration>
       <name>SendOffersDashlet</name>
-      <title>Sent offers</title>
+      <title>Sent Offers</title>
       <description>Show all sent offers</description>
       <fragment>Offer/filter</fragment>
       <singleton v="true" />
diff --git a/neonView/OrderFilter_view/OrderFilter_view.aod b/neonView/OrderFilter_view/OrderFilter_view.aod
index 31110f64b91..c2afbae5ef6 100644
--- a/neonView/OrderFilter_view/OrderFilter_view.aod
+++ b/neonView/OrderFilter_view/OrderFilter_view.aod
@@ -25,7 +25,7 @@
     </neonDashletConfiguration>
     <neonDashletConfiguration>
       <name>SendOrdersDashlet</name>
-      <title>Sent receipts</title>
+      <title>Sent Receipts</title>
       <description>Show all sent receipts</description>
       <fragment>Order/filter?search=eyJ0eXBlIjoiZ3JvdXAiLCJvcGVyYXRvciI6IkFORCIsImNoaWxkcyI6W3sidHlwZSI6InJvdyIsIm5hbWUiOiJPUkRFUlNUQVRVUyIsIm9wZXJhdG9yIjoiQ09OVEFJTlMiLCJ2YWx1ZSI6IkphIiwia2V5IjoiMSIsImNvbnRlbnR0eXBlIjoiQk9PTEVBTiJ9XX0%3D</fragment>
       <singleton v="false" />
diff --git a/neonView/OrganisationFilter_view/OrganisationFilter_view.aod b/neonView/OrganisationFilter_view/OrganisationFilter_view.aod
index 1cbde0c5309..8fdf03af01d 100644
--- a/neonView/OrganisationFilter_view/OrganisationFilter_view.aod
+++ b/neonView/OrganisationFilter_view/OrganisationFilter_view.aod
@@ -15,13 +15,13 @@
       <categories>
         <neonDashletCategory>
           <name>contactmanagement</name>
-          <title>Contactmanagement</title>
+          <title>Contact Management</title>
         </neonDashletCategory>
       </categories>
     </neonDashletConfiguration>
     <neonDashletConfiguration>
       <name>OwnSupervisedOrganisations</name>
-      <title>My organisations</title>
+      <title>My Organisations</title>
       <description>Show my organisations</description>
       <fragment>Organisation/filter</fragment>
       <singleton v="false" />
@@ -30,7 +30,7 @@
       <categories>
         <neonDashletCategory>
           <name>contactmanagement</name>
-          <title>Contactmanagement</title>
+          <title>Contact Management</title>
         </neonDashletCategory>
       </categories>
       <parameters>
diff --git a/neonView/PersonFilter_view/PersonFilter_view.aod b/neonView/PersonFilter_view/PersonFilter_view.aod
index 721f83815ee..7c17332f697 100644
--- a/neonView/PersonFilter_view/PersonFilter_view.aod
+++ b/neonView/PersonFilter_view/PersonFilter_view.aod
@@ -15,13 +15,13 @@
       <categories>
         <neonDashletCategory>
           <name>contactmanagement</name>
-          <title>Contactmanagement</title>
+          <title>Contact Management</title>
         </neonDashletCategory>
       </categories>
     </neonDashletConfiguration>
     <neonDashletConfiguration>
       <name>OwnSupervisedContacts</name>
-      <title>My contacts</title>
+      <title>My Contacts</title>
       <description>Show my contacts</description>
       <fragment>Person/filter</fragment>
       <singleton v="false" />
@@ -30,7 +30,7 @@
       <categories>
         <neonDashletCategory>
           <name>contactmanagement</name>
-          <title>Contactmanagement</title>
+          <title>Contact Management</title>
         </neonDashletCategory>
       </categories>
       <parameters>
diff --git a/neonView/SalesprojectAnalyses_view/SalesprojectAnalyses_view.aod b/neonView/SalesprojectAnalyses_view/SalesprojectAnalyses_view.aod
index 67c3c736904..8ed958a9952 100644
--- a/neonView/SalesprojectAnalyses_view/SalesprojectAnalyses_view.aod
+++ b/neonView/SalesprojectAnalyses_view/SalesprojectAnalyses_view.aod
@@ -6,7 +6,7 @@
   <dashletConfigurations>
     <neonDashletConfiguration>
       <name>SalesprojectPhases</name>
-      <title>Salesproject phases</title>
+      <title>Sales Project Phases</title>
       <description>Shows how many sales projects are in the various sales phases</description>
       <fragment>Salesproject/filter?search=eyJ0eXBlIjoiZ3JvdXAiLCJvcGVyYXRvciI6IkFORCIsImNoaWxkcyI6W3sidHlwZSI6InJvdyIsIm5hbWUiOiJQSEFTRSIsIm9wZXJhdG9yIjoiTk9UX0VRVUFMIiwidmFsdWUiOiJOZWdvdGlhdGlvbiIsImtleSI6IlNBTFBST0pQSEFTRU5FR08iLCJjb250ZW50dHlwZSI6IlRFWFQifSx7InR5cGUiOiJyb3ciLCJuYW1lIjoiU1RBVFVTIiwib3BlcmF0b3IiOiJFUVVBTCIsInZhbHVlIjoiT2ZmZW4iLCJrZXkiOiJTQUxQUk9KU1RBVE9QRU4iLCJjb250ZW50dHlwZSI6IlRFWFQifV19&amp;axes=COUNT&amp;grouping=%23EXTENSION.Phase_filterExtention.Phase_filterExtention%23TEXT</fragment>
       <singleton v="true" />
diff --git a/neonView/SalesprojectConversionRate_view/SalesprojectConversionRate_view.aod b/neonView/SalesprojectConversionRate_view/SalesprojectConversionRate_view.aod
index dfb2ef2e310..c17221595c4 100644
--- a/neonView/SalesprojectConversionRate_view/SalesprojectConversionRate_view.aod
+++ b/neonView/SalesprojectConversionRate_view/SalesprojectConversionRate_view.aod
@@ -6,7 +6,7 @@
   <dashletConfigurations>
     <neonDashletConfiguration>
       <name>ConvertionRates</name>
-      <title>Salesproject Convertion Rates</title>
+      <title>Sales Project Convertion Rates</title>
       <description>Shows the different conversion rates of the sales project phases</description>
       <fragment>SalesprojectConversionRate/filter?search=eyJ0eXBlIjoiZ3JvdXAiLCJvcGVyYXRvciI6IkFORCIsImNoaWxkcyI6W3sidHlwZSI6InJvdyIsIm5hbWUiOiIjRVhURU5TSU9OLkRBVEVfU1RBUlQuREFURV9TVEFSVCNEQVRFIiwib3BlcmF0b3IiOiJUSU1FRlJBTUVfRVFVQUwiLCJ2YWx1ZSI6IkRpZXNlcyBKYWhyIiwia2V5IjoiUkVMPUFESlVTVEVEO1VOSVQ9WUVBUiIsImNvbnRlbnR0eXBlIjoiREFURSJ9XX0%3D&amp;axes=conversionRate&amp;grouping=AB_KEYWORD_ENTRYID_KEYID%2C%23EXTENSION.Month.Month%23NUMBER</fragment>
       <singleton v="true" />
diff --git a/neonView/SalesprojectEdit_view/SalesprojectEdit_view.aod b/neonView/SalesprojectEdit_view/SalesprojectEdit_view.aod
index afcbeee47f9..04b352527d9 100644
--- a/neonView/SalesprojectEdit_view/SalesprojectEdit_view.aod
+++ b/neonView/SalesprojectEdit_view/SalesprojectEdit_view.aod
@@ -1,7 +1,7 @@
 <?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>SalesprojectEdit_view</name>
-  <title>Salesproject</title>
+  <title>Sales Project</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <icon>VAADIN:FILTER</icon>
   <quickEntry v="6" />
diff --git a/neonView/SalesprojectFilter_view/SalesprojectFilter_view.aod b/neonView/SalesprojectFilter_view/SalesprojectFilter_view.aod
index c055908d526..5a88276721b 100644
--- a/neonView/SalesprojectFilter_view/SalesprojectFilter_view.aod
+++ b/neonView/SalesprojectFilter_view/SalesprojectFilter_view.aod
@@ -6,7 +6,7 @@
   <dashletConfigurations>
     <neonDashletConfiguration>
       <name>AllSalesprojectDashlet</name>
-      <title>Salesprojects</title>
+      <title>Sales Projects</title>
       <description>Show all salesprojects</description>
       <fragment>Salesproject/filter</fragment>
       <singleton v="true" />
@@ -25,7 +25,7 @@
     </neonDashletConfiguration>
     <neonDashletConfiguration>
       <name>OpenSalesprojectsDashlet</name>
-      <title>Open salesprojects</title>
+      <title>Open Salesprojects</title>
       <description>Show open salesprojects</description>
       <fragment>Salesproject/filter?search=eyJ0eXBlIjoiZ3JvdXAiLCJvcGVyYXRvciI6IkFORCIsImNoaWxkcyI6W3sidHlwZSI6InJvdyIsIm5hbWUiOiJTVEFUVVMiLCJvcGVyYXRvciI6IkVRVUFMIiwidmFsdWUiOiJPZmZlbiIsImtleSI6IlNBTFBST0pTVEFUT1BFTiAgICAgICAgICAgICAgICAgICAgICIsImNvbnRlbnR0eXBlIjoiVEVYVCJ9XX0%253D</fragment>
       <singleton v="true" />
diff --git a/neonView/SalesprojectScoreCard_view/SalesprojectScoreCard_view.aod b/neonView/SalesprojectScoreCard_view/SalesprojectScoreCard_view.aod
index d56d4278c12..6a0e513a643 100644
--- a/neonView/SalesprojectScoreCard_view/SalesprojectScoreCard_view.aod
+++ b/neonView/SalesprojectScoreCard_view/SalesprojectScoreCard_view.aod
@@ -5,7 +5,7 @@
   <dashletConfigurations>
     <neonDashletConfiguration>
       <name>KeyFigures</name>
-      <title>Key figures</title>
+      <title>Key Figures</title>
       <description>Most important salse key figures</description>
       <fragment>SalesprojectAnalyses/full</fragment>
       <singleton v="true" />
diff --git a/neonView/SupportTicketFilter_view/SupportTicketFilter_view.aod b/neonView/SupportTicketFilter_view/SupportTicketFilter_view.aod
index 6dc1c376ae6..7b5e818ce4f 100644
--- a/neonView/SupportTicketFilter_view/SupportTicketFilter_view.aod
+++ b/neonView/SupportTicketFilter_view/SupportTicketFilter_view.aod
@@ -6,7 +6,7 @@
   <dashletConfigurations>
     <neonDashletConfiguration>
       <name>mytickets</name>
-      <title>My tickets</title>
+      <title>My Tickets</title>
       <description>Show tickets where I am the editor</description>
       <fragment>SupportTicket/filter</fragment>
       <singleton v="true" />
diff --git a/neonView/TaskFilter_view/TaskFilter_view.aod b/neonView/TaskFilter_view/TaskFilter_view.aod
index e42baf0ab3d..77601cb3a2e 100644
--- a/neonView/TaskFilter_view/TaskFilter_view.aod
+++ b/neonView/TaskFilter_view/TaskFilter_view.aod
@@ -16,7 +16,7 @@
       <categories>
         <neonDashletCategory>
           <name>contactmanagement</name>
-          <title>Contactmanagement</title>
+          <title>Contact Management</title>
         </neonDashletCategory>
       </categories>
       <parameters>
diff --git a/neonView/UniversalFileProcessorDropzone_view/UniversalFileProcessorDropzone_view.aod b/neonView/UniversalFileProcessorDropzone_view/UniversalFileProcessorDropzone_view.aod
index 8072435ed1e..441059938ff 100644
--- a/neonView/UniversalFileProcessorDropzone_view/UniversalFileProcessorDropzone_view.aod
+++ b/neonView/UniversalFileProcessorDropzone_view/UniversalFileProcessorDropzone_view.aod
@@ -5,7 +5,7 @@
   <dashletConfigurations>
     <neonDashletConfiguration>
       <name>MailDropzone</name>
-      <title>import mails</title>
+      <title>Import Mails</title>
       <description>Drop area for creating activities from mails</description>
       <fragment>UniversalFileProcessor/dropzone</fragment>
       <preview></preview>
diff --git a/neonView/UnlinkedMailFilter_view/UnlinkedMailFilter_view.aod b/neonView/UnlinkedMailFilter_view/UnlinkedMailFilter_view.aod
index 6b4b8b73154..fc53c28edde 100644
--- a/neonView/UnlinkedMailFilter_view/UnlinkedMailFilter_view.aod
+++ b/neonView/UnlinkedMailFilter_view/UnlinkedMailFilter_view.aod
@@ -5,7 +5,7 @@
   <dashletConfigurations>
     <neonDashletConfiguration>
       <name>allUnlinkedMailsDashlet</name>
-      <title>All unlinked mails</title>
+      <title>All Unlinked Mails</title>
       <description>All mails that could not automatically linked are displayed here</description>
       <fragment>UnlinkedMail/filter</fragment>
       <icon>VAADIN:AT</icon>
diff --git a/neonView/VisitPlanEntryFilter_view/VisitPlanEntryFilter_view.aod b/neonView/VisitPlanEntryFilter_view/VisitPlanEntryFilter_view.aod
index 4233a419591..d98e4cb1e5a 100644
--- a/neonView/VisitPlanEntryFilter_view/VisitPlanEntryFilter_view.aod
+++ b/neonView/VisitPlanEntryFilter_view/VisitPlanEntryFilter_view.aod
@@ -6,7 +6,7 @@
   <dashletConfigurations>
     <neonDashletConfiguration>
       <name>currentWeek</name>
-      <title>my visit planning</title>
+      <title>My Visit Planning</title>
       <description>show visit planning of the week</description>
       <fragment>VisitPlanEntry/filter</fragment>
       <singleton v="true" />
diff --git a/neonView/WorkflowTaskOwn_view/WorkflowTaskOwn_view.aod b/neonView/WorkflowTaskOwn_view/WorkflowTaskOwn_view.aod
index 9e0e3392f95..a6c4dbff4e5 100644
--- a/neonView/WorkflowTaskOwn_view/WorkflowTaskOwn_view.aod
+++ b/neonView/WorkflowTaskOwn_view/WorkflowTaskOwn_view.aod
@@ -6,7 +6,7 @@
   <dashletConfigurations>
     <neonDashletConfiguration>
       <name>OwnWorkflowTasks</name>
-      <title>Own workflow tasks</title>
+      <title>My Workflow Tasks</title>
       <description>My workflow tasks</description>
       <fragment>WorkflowTask/filter</fragment>
       <icon>VAADIN:CHECK_SQUARE_O</icon>
-- 
GitLab


From aefe0bad6f6d3948a660d6926b66ab0bfd8ef918 Mon Sep 17 00:00:00 2001
From: Sebastian Listl <s.listl@adito.de>
Date: Tue, 10 Nov 2020 14:45:02 +0100
Subject: [PATCH 070/184] #1067448 copy receipt

---
 .../recordcontainers/index/query.js           |   4 +-
 .../recordcontainers/index/query.js           |   4 +-
 entity/Order_entity/Order_entity.aod          | 208 +++++++++---------
 .../documentation.adoc                        |   0
 .../entityfields/copyorder/onActionProcess.js |  30 +++
 .../entityfields/neworder/onActionProcess.js  |  26 ---
 .../recordcontainers/db/onDBInsert.js         |  10 +-
 .../offer_id.displayvalue/expression.js       |   2 +-
 .../recordcontainers/index/query.js           |   4 +-
 .../recordcontainers/index/query.js           |  16 +-
 entity/Person_entity/initFilterProcess.js     |   1 +
 .../recordcontainers/index/query.js           |  10 +-
 .../recordcontainers/index/query.js           |   2 +-
 .../fromquantity.displayvalue/expression.js   |   2 +-
 .../recordcontainers/index/query.js           |   2 +-
 process/Contact_lib/process.js                |   6 +-
 process/Context_lib/process.js                |  35 +--
 process/Order_lib/process.js                  |  84 +++++--
 process/Placeholder_lib/process.js            |   4 +-
 process/PostalAddress_lib/process.js          |   2 +-
 process/Sql_lib/process.js                    |  81 ++++++-
 21 files changed, 332 insertions(+), 201 deletions(-)
 rename entity/Order_entity/entityfields/{neworder => copyorder}/documentation.adoc (100%)
 create mode 100644 entity/Order_entity/entityfields/copyorder/onActionProcess.js
 delete mode 100644 entity/Order_entity/entityfields/neworder/onActionProcess.js

diff --git a/entity/Contract_entity/recordcontainers/index/query.js b/entity/Contract_entity/recordcontainers/index/query.js
index e12356c93b0..62196bdcbb7 100644
--- a/entity/Contract_entity/recordcontainers/index/query.js
+++ b/entity/Contract_entity/recordcontainers/index/query.js
@@ -10,8 +10,8 @@ import("KeywordRegistry_basic");
 var sqlHelper = new SqlMaskingUtils();
 var querySelect = newSelect([
         "CONTRACTID", //#UID
-        sqlHelper.concat(["CONTRACTCODE", KeywordUtils.getResolvedTitleSqlPart($KeywordRegistry.contractStatus(), "CONTRACTSTATUS")], " | "), //#TITLE
-        sqlHelper.concat(["ORGANISATION.NAME", "'| " + translate.text("Type of contract") + ":'", 
+        sqlHelper.concatWithSeparator(["CONTRACTCODE", KeywordUtils.getResolvedTitleSqlPart($KeywordRegistry.contractStatus(), "CONTRACTSTATUS")], " | "), //#TITLE
+        sqlHelper.concatWithSeparator(["ORGANISATION.NAME", "'| " + translate.text("Type of contract") + ":'", 
             KeywordUtils.getResolvedTitleSqlPart($KeywordRegistry.contractType(), "CONTRACTTYPE")]), //#DESCRIPTION
         "CONTRACTCODE",
         "CONTACT.ORGANISATION_ID",  //CONTACT_ORG_ID
diff --git a/entity/Offer_entity/recordcontainers/index/query.js b/entity/Offer_entity/recordcontainers/index/query.js
index 7d975c8bb3e..b2853b92f92 100644
--- a/entity/Offer_entity/recordcontainers/index/query.js
+++ b/entity/Offer_entity/recordcontainers/index/query.js
@@ -9,8 +9,8 @@ import("KeywordRegistry_basic");
 var sqlHelper = new SqlMaskingUtils();
 var querySelect = newSelect([
         "OFFER.OFFERID", //#UID 
-        sqlHelper.concat([sqlHelper.cast("OFFER.OFFERCODE", SQLTYPES.CHAR, 10), KeywordUtils.getResolvedTitleSqlPart($KeywordRegistry.offerStatus(), "OFFER.STATUS")], " | "), //#TITLE
-        sqlHelper.concat(["ORGANISATION.NAME", "'| " + translate.text("Description") + ":'", sqlHelper.castLob("OFFER.INFO", 250)]), //#DESCRIPTION
+        sqlHelper.concatWithSeparator([sqlHelper.cast("OFFER.OFFERCODE", SQLTYPES.CHAR, 10), KeywordUtils.getResolvedTitleSqlPart($KeywordRegistry.offerStatus(), "OFFER.STATUS")], " | "), //#TITLE
+        sqlHelper.concatWithSeparator(["ORGANISATION.NAME", "'| " + translate.text("Description") + ":'", sqlHelper.castLob("OFFER.INFO", 250)]), //#DESCRIPTION
         "OFFER.OFFERCODE",
         "OFFER.CONTACT_ID",
         "CONTACT.ORGANISATION_ID",  //CONTACT_ORG_ID
diff --git a/entity/Order_entity/Order_entity.aod b/entity/Order_entity/Order_entity.aod
index 06389d921d5..ae39a7c4364 100644
--- a/entity/Order_entity/Order_entity.aod
+++ b/entity/Order_entity/Order_entity.aod
@@ -100,11 +100,6 @@
     <entityConsumer>
       <name>Orderitems</name>
       <description></description>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Orderitem_entity</entityName>
-        <fieldName>Orderitems</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>OrderId_param</name>
@@ -130,6 +125,11 @@
           <mandatory v="true" />
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Orderitem_entity</entityName>
+        <fieldName>Orderitems</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>NET</name>
@@ -191,11 +191,6 @@
     <entityConsumer>
       <name>Documents</name>
       <selectionMode>MULTI</selectionMode>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Document_entity</entityName>
-        <fieldName>Documents</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>AssignmentRowId_param</name>
@@ -206,19 +201,16 @@
           <valueProcess>%aditoprj%/entity/Order_entity/entityfields/documents/children/assignmenttable_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>MainDocuments</name>
-      <stateProcess>%aditoprj%/entity/Order_entity/entityfields/maindocuments/stateProcess.js</stateProcess>
       <dependency>
         <name>dependency</name>
         <entityName>Document_entity</entityName>
-        <fieldName>MainDocuments</fieldName>
+        <fieldName>Documents</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>MainDocuments</name>
+      <stateProcess>%aditoprj%/entity/Order_entity/entityfields/maindocuments/stateProcess.js</stateProcess>
       <children>
-        <entityParameter>
-          <name>AssignmentName_param</name>
-        </entityParameter>
         <entityParameter>
           <name>AssignmentRowId_param</name>
           <valueProcess>%aditoprj%/entity/Order_entity/entityfields/maindocuments/children/assignmentrowid_param/valueProcess.js</valueProcess>
@@ -228,28 +220,28 @@
           <valueProcess>%aditoprj%/entity/Order_entity/entityfields/maindocuments/children/assignmenttable_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>Salesprojects</name>
       <dependency>
         <name>dependency</name>
-        <entityName>Salesproject_entity</entityName>
-        <fieldName>Salesprojects</fieldName>
+        <entityName>Document_entity</entityName>
+        <fieldName>MainDocuments</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>Salesprojects</name>
       <children>
         <entityParameter>
           <name>ContactId_param</name>
           <valueProcess>%aditoprj%/entity/Order_entity/entityfields/salesprojects/children/contactid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>KeywordCurrencies</name>
       <dependency>
         <name>dependency</name>
-        <entityName>KeywordEntry_entity</entityName>
-        <fieldName>SpecificContainerKeywords</fieldName>
+        <entityName>Salesproject_entity</entityName>
+        <fieldName>Salesprojects</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>KeywordCurrencies</name>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
@@ -257,14 +249,14 @@
           <expose v="false" />
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>KeywordStates</name>
       <dependency>
         <name>dependency</name>
         <entityName>KeywordEntry_entity</entityName>
         <fieldName>SpecificContainerKeywords</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>KeywordStates</name>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
@@ -272,6 +264,11 @@
           <expose v="false" />
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>SpecificContainerKeywords</fieldName>
+      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>Languages</name>
@@ -290,11 +287,6 @@
     </entityParameter>
     <entityConsumer>
       <name>Activities</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Activity_entity</entityName>
-        <fieldName>LinkedObjects</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>RowId_param</name>
@@ -309,6 +301,11 @@
           <valueProcess>%aditoprj%/entity/Order_entity/entityfields/activities/children/presetlinks_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Activity_entity</entityName>
+        <fieldName>LinkedObjects</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>OFFER_ID</name>
@@ -322,11 +319,6 @@
     <entityConsumer>
       <name>Tasks</name>
       <stateProcess>%aditoprj%/entity/Order_entity/entityfields/tasks/stateProcess.js</stateProcess>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Task_entity</entityName>
-        <fieldName>Tasks</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>RowId_param</name>
@@ -341,15 +333,15 @@
           <valueProcess>%aditoprj%/entity/Order_entity/entityfields/tasks/children/presetlinks_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Task_entity</entityName>
+        <fieldName>Tasks</fieldName>
+      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>Attributes</name>
       <onValidation>%aditoprj%/entity/Order_entity/entityfields/attributes/onValidation.js</onValidation>
-      <dependency>
-        <name>dependency</name>
-        <entityName>AttributeRelation_entity</entityName>
-        <fieldName>AttributeRelations</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ObjectRowId_param</name>
@@ -360,15 +352,15 @@
           <valueProcess>%aditoprj%/entity/Order_entity/entityfields/attributes/children/objecttype_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>AttributeTree</name>
-      <stateProcess>%aditoprj%/entity/Order_entity/entityfields/attributetree/stateProcess.js</stateProcess>
       <dependency>
         <name>dependency</name>
         <entityName>AttributeRelation_entity</entityName>
-        <fieldName>TreeProvider</fieldName>
+        <fieldName>AttributeRelations</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>AttributeTree</name>
+      <stateProcess>%aditoprj%/entity/Order_entity/entityfields/attributetree/stateProcess.js</stateProcess>
       <children>
         <entityParameter>
           <name>ObjectType_param</name>
@@ -379,20 +371,25 @@
           <valueProcess>%aditoprj%/entity/Order_entity/entityfields/attributetree/children/objectrowid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>LogHistories</name>
       <dependency>
         <name>dependency</name>
-        <entityName>LogHistory_entity</entityName>
-        <fieldName>LogHistoryProvider</fieldName>
+        <entityName>AttributeRelation_entity</entityName>
+        <fieldName>TreeProvider</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>LogHistories</name>
       <children>
         <entityParameter>
           <name>tablenames_param</name>
           <valueProcess>%aditoprj%/entity/Order_entity/entityfields/loghistories/children/tablenames_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>LogHistory_entity</entityName>
+        <fieldName>LogHistoryProvider</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>ORDERTYPE</name>
@@ -470,31 +467,31 @@
     </entityField>
     <entityConsumer>
       <name>KeywordOrderTypes</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>KeywordEntry_entity</entityName>
-        <fieldName>SpecificContainerKeywords</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
           <valueProcess>%aditoprj%/entity/Order_entity/entityfields/keywordordertypes/children/containername_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>KeywordDunningLevels</name>
       <dependency>
         <name>dependency</name>
         <entityName>KeywordEntry_entity</entityName>
         <fieldName>SpecificContainerKeywords</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>KeywordDunningLevels</name>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
           <valueProcess>%aditoprj%/entity/Order_entity/entityfields/keyworddunninglevels/children/containername_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>SpecificContainerKeywords</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>OBJECT_ROWID</name>
@@ -522,11 +519,6 @@
     </entityField>
     <entityConsumer>
       <name>Objects</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Object_entity</entityName>
-        <fieldName>FilteredObjects</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContactId_param</name>
@@ -537,14 +529,14 @@
           <valueProcess>%aditoprj%/entity/Order_entity/entityfields/objects/children/objecttype_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>Contexts</name>
       <dependency>
         <name>dependency</name>
-        <entityName>Context_entity</entityName>
-        <fieldName>Exclusive</fieldName>
+        <entityName>Object_entity</entityName>
+        <fieldName>FilteredObjects</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>Contexts</name>
       <children>
         <entityParameter>
           <name>Blacklist_param</name>
@@ -555,6 +547,11 @@
           <valueProcess>%aditoprj%/entity/Order_entity/entityfields/contexts/children/invertblacklist_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Context_entity</entityName>
+        <fieldName>Exclusive</fieldName>
+      </dependency>
     </entityConsumer>
     <entityParameter>
       <name>PossibleConnectionTypes</name>
@@ -607,46 +604,46 @@
     </entityField>
     <entityConsumer>
       <name>KeywordPaymentTerms</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>KeywordEntry_entity</entityName>
-        <fieldName>SpecificContainerKeywords</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
           <valueProcess>%aditoprj%/entity/Order_entity/entityfields/keywordpaymentterms/children/containername_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>KeywordDeliveryTerms</name>
       <dependency>
         <name>dependency</name>
         <entityName>KeywordEntry_entity</entityName>
         <fieldName>SpecificContainerKeywords</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>KeywordDeliveryTerms</name>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
           <valueProcess>%aditoprj%/entity/Order_entity/entityfields/keyworddeliveryterms/children/containername_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>SpecificContainerKeywords</fieldName>
+      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>PossibleAddresses</name>
       <documentation>%aditoprj%/entity/Order_entity/entityfields/possibleaddresses/documentation.adoc</documentation>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Address_entity</entityName>
-        <fieldName>OrganisationAndContactAddresses</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContactId_param</name>
           <valueProcess>%aditoprj%/entity/Order_entity/entityfields/possibleaddresses/children/contactid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Address_entity</entityName>
+        <fieldName>OrganisationAndContactAddresses</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>NOTICE</name>
@@ -663,25 +660,20 @@
     </entityField>
     <entityConsumer>
       <name>Offers</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Offer_entity</entityName>
-        <fieldName>ContactOffers</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContactId_param</name>
           <valueProcess>%aditoprj%/entity/Order_entity/entityfields/offers/children/contactid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>DocumentTemplateTexHeader</name>
       <dependency>
         <name>dependency</name>
-        <entityName>DocumentTemplate_entity</entityName>
-        <fieldName>DocumentTemplateProvider</fieldName>
+        <entityName>Offer_entity</entityName>
+        <fieldName>ContactOffers</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>DocumentTemplateTexHeader</name>
       <children>
         <entityParameter>
           <name>DocumentTemplateType_param</name>
@@ -692,14 +684,14 @@
           <valueProcess>%aditoprj%/entity/Order_entity/entityfields/documenttemplatetexheader/children/documenttemplatetypeclassification_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>DocumentTemplateTexFooter</name>
       <dependency>
         <name>dependency</name>
         <entityName>DocumentTemplate_entity</entityName>
         <fieldName>DocumentTemplateProvider</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>DocumentTemplateTexFooter</name>
       <children>
         <entityParameter>
           <name>DocumentTemplateType_param</name>
@@ -710,6 +702,11 @@
           <valueProcess>%aditoprj%/entity/Order_entity/entityfields/documenttemplatetexfooter/children/documenttemplatetypeclassification_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>DocumentTemplate_entity</entityName>
+        <fieldName>DocumentTemplateProvider</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>ChosenTexHeader</name>
@@ -797,10 +794,10 @@
       <title>Count</title>
     </entityAggregateField>
     <entityActionField>
-      <name>newOrder</name>
-      <documentation>%aditoprj%/entity/Order_entity/entityfields/neworder/documentation.adoc</documentation>
+      <name>copyOrder</name>
+      <documentation>%aditoprj%/entity/Order_entity/entityfields/copyorder/documentation.adoc</documentation>
       <title>Copy receipt</title>
-      <onActionProcess>%aditoprj%/entity/Order_entity/entityfields/neworder/onActionProcess.js</onActionProcess>
+      <onActionProcess>%aditoprj%/entity/Order_entity/entityfields/copyorder/onActionProcess.js</onActionProcess>
       <iconId>VAADIN:COPY</iconId>
     </entityActionField>
     <entityActionField>
@@ -916,6 +913,11 @@
         </entityActionField>
       </children>
     </entityActionGroup>
+    <entityParameter>
+      <name>SourceOrderId_param</name>
+      <expose v="true" />
+      <description></description>
+    </entityParameter>
   </entityFields>
   <recordContainers>
     <dbRecordContainer>
diff --git a/entity/Order_entity/entityfields/neworder/documentation.adoc b/entity/Order_entity/entityfields/copyorder/documentation.adoc
similarity index 100%
rename from entity/Order_entity/entityfields/neworder/documentation.adoc
rename to entity/Order_entity/entityfields/copyorder/documentation.adoc
diff --git a/entity/Order_entity/entityfields/copyorder/onActionProcess.js b/entity/Order_entity/entityfields/copyorder/onActionProcess.js
new file mode 100644
index 00000000000..57c33c7f014
--- /dev/null
+++ b/entity/Order_entity/entityfields/copyorder/onActionProcess.js
@@ -0,0 +1,30 @@
+import("system.vars");
+import("system.neon");
+import("Order_lib");
+import("Keyword_lib");
+import("KeywordRegistry_basic");
+
+
+var orderId = vars.get("$field.SALESORDERID");
+var fieldValues = {
+    contactId: vars.getString("$field.CONTACT_ID"),
+    currency: vars.getString("$field.CURRENCY"),
+    language: vars.getString("$field.ISOLANGUAGE"),
+    header: vars.getString("$field.HEADER"),
+    footer: vars.getString("$field.FOOTER"),
+    offerId: vars.getString("$field.OFFER_ID"),
+    deliveryTerm: vars.getString("$field.DELIVERYTERMS"),
+    paymentTerm: vars.getString("$field.PAYMENTTERMS"),
+    paymentAddress: vars.getString("$field.PAYMENTADDRESS"),
+    deliveryAddress: vars.getString("$field.DELIVERYADDRESS"),
+    objectRowId: vars.getString("$field.OBJECT_ROWID"),
+    objectType: vars.getString("$field.OBJECT_TYPE"),
+    dunningDate: vars.getString("$field.DUNNINGDATE"),
+    dunningLevel: vars.getString("$field.DUNNINGLEVEL"),
+    orderType: vars.getString("$field.ORDERTYPE"),
+    cancellation: vars.getString("$field.CANCELLATION"),
+    orderStatus:vars.getString("$field.ORDERSTATUS")
+};
+
+OrderUtils.copyOrder(orderId, fieldValues);
+    
\ No newline at end of file
diff --git a/entity/Order_entity/entityfields/neworder/onActionProcess.js b/entity/Order_entity/entityfields/neworder/onActionProcess.js
deleted file mode 100644
index d73a39e61fe..00000000000
--- a/entity/Order_entity/entityfields/neworder/onActionProcess.js
+++ /dev/null
@@ -1,26 +0,0 @@
-import("system.vars");
-import("system.neon");
-import("Order_lib");
-import("Keyword_lib");
-import("KeywordRegistry_basic");
-
-var contactId = vars.getString("$field.CONTACT_ID");
-var currency = vars.getString("$field.CURRENCY");
-var language = vars.getString("$field.ISOLANGUAGE");
-var header = vars.getString("$field.HEADER");
-var footer = vars.getString("$field.FOOTER");
-var offerId = vars.getString("$field.OFFER_ID");
-var deliveryTerm = vars.getString("$field.DELIVERYTERMS");
-var paymentTerm = vars.getString("$field.PAYMENTTERMS");
-var paymentAddress = vars.getString("$field.PAYMENTADDRESS");
-var deliveryAddress = vars.getString("$field.DELIVERYADDRESS");
-var rowId = vars.getString("$field.OBJECT_ROWID");
-var objectType = vars.getString("$field.OBJECT_TYPE");
-var dunningDate = vars.getString("$field.DUNNINGDATE");
-var dunningLevel = vars.getString("$field.DUNNINGLEVEL");
-var orderType= vars.getString("$field.ORDERTYPE");
-var cancellation= vars.getString("$field.CANCELLATION");
-var orderStatus=vars.getString("$field.ORDERSTATUS");
-
-OrderUtils.copyOrder(offerId, contactId, orderType, language, currency, header, footer, deliveryTerm, paymentTerm, paymentAddress, deliveryAddress, objectType, rowId, dunningDate, dunningLevel, cancellation, orderStatus);
-    
\ No newline at end of file
diff --git a/entity/Order_entity/recordcontainers/db/onDBInsert.js b/entity/Order_entity/recordcontainers/db/onDBInsert.js
index 8e0f20e8575..bd3c2bb14b9 100644
--- a/entity/Order_entity/recordcontainers/db/onDBInsert.js
+++ b/entity/Order_entity/recordcontainers/db/onDBInsert.js
@@ -4,7 +4,11 @@ import("system.neon");
 import("system.vars");
 
 //@TODO: OfferId_param is also set by 'copy order' -> the items of the offer are copied. What should happen?
-if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && vars.exists("$param.OfferId_param"))
-    OrderUtils.copyOfferItemsToOrder(vars.getString("$param.OfferId_param"), vars.get("$local.rowdata")["SALESORDER.SALESORDERID"]);
-
+if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW)
+{
+    if (vars.exists("$param.OfferId_param") && vars.get("$param.OfferId_param"))
+        OrderUtils.copyOfferItemsToOrder(vars.get("$param.OfferId_param"), vars.get("$local.uid"));
+    if (vars.exists("$param.SourceOrderId_param") && vars.get("$param.SourceOrderId_param"))
+        OrderUtils.copyOrderItems(vars.get("$param.SourceOrderId_param"), vars.get("$local.uid"));
+}
 WorkflowSignalSender.inserted();
\ No newline at end of file
diff --git a/entity/Order_entity/recordcontainers/db/recordfieldmappings/offer_id.displayvalue/expression.js b/entity/Order_entity/recordcontainers/db/recordfieldmappings/offer_id.displayvalue/expression.js
index 2aec63a8d1b..cb7fa7682e1 100644
--- a/entity/Order_entity/recordcontainers/db/recordfieldmappings/offer_id.displayvalue/expression.js
+++ b/entity/Order_entity/recordcontainers/db/recordfieldmappings/offer_id.displayvalue/expression.js
@@ -2,4 +2,4 @@ import("system.result");
 import("Context_lib");
 import("system.db");
 
-result.string(db.translateStatement(ContextUtils.getNameSql("Offer", "SALESORDER.OFFER_ID")));
\ No newline at end of file
+result.string(db.translateStatement(ContextUtils.getNameSql("Offer", null, "SALESORDER.OFFER_ID")));
\ No newline at end of file
diff --git a/entity/Order_entity/recordcontainers/index/query.js b/entity/Order_entity/recordcontainers/index/query.js
index 75ed9d1999b..74db3c61d09 100644
--- a/entity/Order_entity/recordcontainers/index/query.js
+++ b/entity/Order_entity/recordcontainers/index/query.js
@@ -8,8 +8,8 @@ import("KeywordRegistry_basic");
 var sqlHelper = new SqlMaskingUtils();
 var querySelect = newSelect([
         "SALESORDERID", //#UID
-        sqlHelper.concat([sqlHelper.cast("SALESORDERCODE", SQLTYPES.CHAR, 10)], " | "), //#TITLE
-        sqlHelper.concat(["ORGANISATION.NAME"], " | "), //#DESCRIPTION
+        sqlHelper.concatWithSeparator([sqlHelper.cast("SALESORDERCODE", SQLTYPES.CHAR, 10)], " | "), //#TITLE
+        sqlHelper.concatWithSeparator(["ORGANISATION.NAME"], " | "), //#DESCRIPTION
         "SALESORDERCODE",
         "SALESORDER.CONTACT_ID",
         "CONTACT.ORGANISATION_ID", //as CONTACT_ORG_ID
diff --git a/entity/Organisation_entity/recordcontainers/index/query.js b/entity/Organisation_entity/recordcontainers/index/query.js
index 2d434dc250f..ee0f4bb6cea 100644
--- a/entity/Organisation_entity/recordcontainers/index/query.js
+++ b/entity/Organisation_entity/recordcontainers/index/query.js
@@ -20,14 +20,14 @@ var commMediumMailIds = CommUtil.getMediumIdsByCategory("EMAIL");
 var sqlHelper = new SqlMaskingUtils();
 var querySelect = newSelect([
         "CONTACT.CONTACTID",
-        sqlHelper.concat(["ORGANISATION.NAME", "'|'", "ORGANISATION.CUSTOMERCODE"]),
-        sqlHelper.concat([
-            sqlHelper.concat(["standardAddress.ADDRESS", "standardAddress.BUILDINGNO", "'-'"
+        sqlHelper.concatWithSeparator(["ORGANISATION.NAME", "'|'", "ORGANISATION.CUSTOMERCODE"]),
+        sqlHelper.concatWithSeparator([
+            sqlHelper.concatWithSeparator(["standardAddress.ADDRESS", "standardAddress.BUILDINGNO", "'-'"
                 ,"standardAddress.COUNTRY", "standardAddress.ZIP", "standardAddress.CITY"]),
-            sqlHelper.concat(["'" + translate.text("Phone") + ":'", "(" + CommUtil.getStandardSubSqlPhone() + ")"]),
-            sqlHelper.concat(["'" + translate.text("Email") + ":'", "(" + CommUtil.getStandardSubSqlMail() + ")"])
+            sqlHelper.concatWithSeparator(["'" + translate.text("Phone") + ":'", "(" + CommUtil.getStandardSubSqlPhone() + ")"]),
+            sqlHelper.concatWithSeparator(["'" + translate.text("Email") + ":'", "(" + CommUtil.getStandardSubSqlMail() + ")"])
         ], " | "),
-        sqlHelper.concat([sqlHelper.cast("standardAddress.LAT", SQLTYPES.VARCHAR, 16), sqlHelper.cast("standardAddress.LON", SQLTYPES.VARCHAR, 16)], ","),
+        sqlHelper.concatWithSeparator([sqlHelper.cast("standardAddress.LAT", SQLTYPES.VARCHAR, 16), sqlHelper.cast("standardAddress.LON", SQLTYPES.VARCHAR, 16)], ","),
         //additional indexed fields
         "ORGANISATION.NAME",
         sqlHelper.trim("ORGANISATION.ORGANISATIONID"),//trim to enable filter patterns like: >> -organisationid_value:0<<
@@ -39,8 +39,8 @@ var querySelect = newSelect([
         "ADDRESS.CITY",
         "standardEmail.ADDR",
         "standardPhone.ADDR",
-        sqlHelper.concat([sqlHelper.concat(["standardAddress.ADDRESS", "standardAddress.BUILDINGNO"])
-            ,sqlHelper.concat(["standardAddress.COUNTRY", "standardAddress.ZIP", "standardAddress.CITY"])
+        sqlHelper.conconcatWithSeparatorcat([sqlHelper.concatWithSeparator(["standardAddress.ADDRESS", "standardAddress.BUILDINGNO"])
+            ,sqlHelper.concatWithSeparator(["standardAddress.COUNTRY", "standardAddress.ZIP", "standardAddress.CITY"])
         ], " - ")
     ])
     .from("ORGANISATION")
diff --git a/entity/Person_entity/initFilterProcess.js b/entity/Person_entity/initFilterProcess.js
index c30d06ea24f..f64ef8977cc 100644
--- a/entity/Person_entity/initFilterProcess.js
+++ b/entity/Person_entity/initFilterProcess.js
@@ -1,3 +1,4 @@
+import("system.entities");
 import("Keyword_lib");
 import("KeywordRegistry_basic");
 import("system.result");
diff --git a/entity/Person_entity/recordcontainers/index/query.js b/entity/Person_entity/recordcontainers/index/query.js
index 57faf589990..e5c704e81ad 100644
--- a/entity/Person_entity/recordcontainers/index/query.js
+++ b/entity/Person_entity/recordcontainers/index/query.js
@@ -18,12 +18,12 @@ var commMediumPhoneIds = CommUtil.getMediumIdsByCategory("PHONE");
 sqlHelper = new SqlMaskingUtils();
 var querySelect = newSelect([
         "CONTACT.CONTACTID", //#UID
-        sqlHelper.concat(["PERSON.SALUTATION", "PERSON.FIRSTNAME", "PERSON.LASTNAME", "'|'", "ORGANISATION.NAME"]), //#TITLE
-        sqlHelper.concat([
-            sqlHelper.concat(["defaultAddress.ADDRESS", "defaultAddress.BUILDINGNO", "'-'",
+        sqlHelper.concatWithSeparator(["PERSON.SALUTATION", "PERSON.FIRSTNAME", "PERSON.LASTNAME", "'|'", "ORGANISATION.NAME"]), //#TITLE
+        sqlHelper.concatWithSeparator([
+            sqlHelper.concatWithSeparator(["defaultAddress.ADDRESS", "defaultAddress.BUILDINGNO", "'-'",
                 "defaultAddress.COUNTRY", "defaultAddress.ZIP", "defaultAddress.CITY"]),
-            sqlHelper.concat(["'" + translate.text("Phone") + ":'", "(" + CommUtil.getStandardSubSqlPhone() + ")"]),
-            sqlHelper.concat(["'" + translate.text("Email") + ":'", "(" + CommUtil.getStandardSubSqlMail() + ")"])
+            sqlHelper.concatWithSeparator(["'" + translate.text("Phone") + ":'", "(" + CommUtil.getStandardSubSqlPhone() + ")"]),
+            sqlHelper.concatWithSeparator(["'" + translate.text("Email") + ":'", "(" + CommUtil.getStandardSubSqlMail() + ")"])
         ], " | "), //#DESCRIPTION
         //additional indexed fields
         "CONTACT.CONTACTID",
diff --git a/entity/Product_entity/recordcontainers/index/query.js b/entity/Product_entity/recordcontainers/index/query.js
index e06093cbebe..b1d7ae47756 100644
--- a/entity/Product_entity/recordcontainers/index/query.js
+++ b/entity/Product_entity/recordcontainers/index/query.js
@@ -7,7 +7,7 @@ import("KeywordRegistry_basic");
 var sqlHelper = new SqlMaskingUtils();
 var sqlQuery = newSelect([
         "PRODUCTID", //#UID
-        sqlHelper.concat(["PRODUCTCODE", "PRODUCTNAME"], " | "), //#TITLE
+        sqlHelper.concatWithSeparator(["PRODUCTCODE", "PRODUCTNAME"], " | "), //#TITLE
         KeywordUtils.getResolvedTitleSqlPart($KeywordRegistry.productGroupcode(), "GROUPCODEID"), //#DESCRIPTION
         "PRODUCTCODE"
     ])
diff --git a/entity/Productprice_entity/recordcontainers/db/recordfieldmappings/fromquantity.displayvalue/expression.js b/entity/Productprice_entity/recordcontainers/db/recordfieldmappings/fromquantity.displayvalue/expression.js
index 9d2ad815005..cd8dcbf86f1 100644
--- a/entity/Productprice_entity/recordcontainers/db/recordfieldmappings/fromquantity.displayvalue/expression.js
+++ b/entity/Productprice_entity/recordcontainers/db/recordfieldmappings/fromquantity.displayvalue/expression.js
@@ -7,7 +7,7 @@ import("Sql_lib");
 
 var helper = new SqlMaskingUtils();
 
-var res =  newSelect(helper.concat([helper.cast("PRODUCTPRICE.FROMQUANTITY", SQLTYPES.CHAR, 36), "' '", KeywordUtils.getResolvedTitleSqlPart($KeywordRegistry.quantityUnit(), "PRODUCT.UNIT")], "|"))
+var res =  newSelect(helper.concatWithSeparator([helper.cast("PRODUCTPRICE.FROMQUANTITY", SQLTYPES.CHAR, 36), "' '", KeywordUtils.getResolvedTitleSqlPart($KeywordRegistry.quantityUnit(), "PRODUCT.UNIT")], "|"))
                         .from("PRODUCT")
                         .where("PRODUCT.PRODUCTID = PRODUCTPRICE.PRODUCT_ID")
                         .toString()
diff --git a/entity/Salesproject_entity/recordcontainers/index/query.js b/entity/Salesproject_entity/recordcontainers/index/query.js
index 000f54e04ce..ca558d146bc 100644
--- a/entity/Salesproject_entity/recordcontainers/index/query.js
+++ b/entity/Salesproject_entity/recordcontainers/index/query.js
@@ -10,7 +10,7 @@ var sqlHelper = new SqlMaskingUtils();
 var sqlQuery = newSelect([
         "SALESPROJECTID", //#UID
         "PROJECTTITLE", //#TITLE
-        sqlHelper.concat([
+        sqlHelper.concatWithSeparator([
             "'" + translate.text("Status") + ":'",  KeywordUtils.getResolvedTitleSqlPart($KeywordRegistry.salesprojectState(), "STATUS"),
             "'| " + translate.text("Phase") + ":'",  KeywordUtils.getResolvedTitleSqlPart($KeywordRegistry.salesprojectPhase(), "PHASE")
         ]), //#DESCRIPTION
diff --git a/process/Contact_lib/process.js b/process/Contact_lib/process.js
index 05d3069f863..4f73f699c57 100644
--- a/process/Contact_lib/process.js
+++ b/process/Contact_lib/process.js
@@ -552,7 +552,7 @@ ContactUtils.getActiveCommRestrictionsSubselect = function()
         parts.push("case when exists(" + subquery.toString() + ") then '" + pMedium[1] + "' else '' end");
     })
 
-    return sqlMasking.concat(parts, " ", false);
+    return sqlMasking.concatWithSeparator(parts, " ", false);
 }
 
 /**
@@ -679,12 +679,12 @@ function ContactTitleRenderer(pContact, pOptions)
     //function that renders the contact into a sql expression (e.g. for a subselect)
     this._asSqlFn = function(){
         var maskingUtil = new SqlMaskingUtils();
-        var res = maskingUtil.concat([this.contact.salutation, this.contact.title, this.contact.firstname, this.contact.middlename, this.contact.lastname].filter(function (e){
+        var res = maskingUtil.concatWithSeparator([this.contact.salutation, this.contact.title, this.contact.firstname, this.contact.middlename, this.contact.lastname].filter(function (e){
             return e != "";
         }), " ", false);
         //binary AND check for possibility to check serveral options
         if (this._options & ContactTitleRenderer.OPTIONS.IncludeOrganisation && this.contact.organisationName)
-            res = maskingUtil.concat([res, this.contact.organisationName], " | ");
+            res = maskingUtil.concatWithSeparator([res, this.contact.organisationName], " | ");
         return res;
     };
     
diff --git a/process/Context_lib/process.js b/process/Context_lib/process.js
index a9b9eac3121..a85d1c47027 100644
--- a/process/Context_lib/process.js
+++ b/process/Context_lib/process.js
@@ -506,7 +506,7 @@ ContextUtils.getSelectMap  = function()
                                            "Person": [newSelect("CONTACTID").from("CONTACT").where("PERSON_ID is not null"), "CONTACT.ORGANISATION_ID", ["Offer", "Order", "Contract", "SupportTicket"]]
                                        })
             ,"Person": ContextSelector.create("CONTACT", "CONTACTID")
-                                      .setTitleExpression(maskingUtils.concat([
+                                      .setTitleExpression(maskingUtils.concatWithSeparator([
                                                 new ContactTitleRenderer(Contact.createWithColumnPreset()).asSql()
                                                 ,"' - '"//looks pretty bad; TODO: workaround till Lookups can be loaded over a link-entity; then use displayProc
                                                 ,"defaultAddress.ADDRESS", "defaultAddress.BUILDINGNO"
@@ -517,7 +517,7 @@ ContextUtils.getSelectMap  = function()
                                                        + " join ORGANISATION on ORGANISATION.ORGANISATIONID = CONTACT.ORGANISATION_ID "
                                                        + " left join ADDRESS defaultAddress on defaultAddress.ADDRESSID = CONTACT.ADDRESS_ID")
             ,"PrivatePerson": ContextSelector.create("PERSON", "PERSONID")
-                                      .setTitleExpression(maskingUtils.concat([
+                                      .setTitleExpression(maskingUtils.concatWithSeparator([
                                                 new ContactTitleRenderer(Contact.createWithColumnPresetForPrivatePerson()).asSql()
                                                 ,"' - '"//looks pretty bad; TODO: workaround till Lookups can be loaded over a link-entity; then use displayProc
                                                 ,"defaultAddress.ADDRESS", "defaultAddress.BUILDINGNO"
@@ -528,19 +528,19 @@ ContextUtils.getSelectMap  = function()
                                       .setContactIdField("CONTACT.CONTACTID")
             ,"Activity": ContextSelector.create("ACTIVITY", "ACTIVITYID", "SUBJECT")
             ,"Salesproject": ContextSelector.create("SALESPROJECT", "SALESPROJECTID")
-                                            .setTitleExpression(maskingUtils.concat([
+                                            .setTitleExpression(maskingUtils.concatenate([
                                                                 "'" + translate.text("Salesproject") + "'",
                                                                 "' '",
                                                                 maskingUtils.cast("PROJECTCODE", SQLTYPES.VARCHAR, 10),
                                                                 "' | '",
                                                                 "PROJECTTITLE"
-                                                                ], "", false))
+                                                                ]))
                                             .setContactIdField("CONTACT_ID")
                                             .setCreationDateField("STARTDATE")
                                             .setStateField("STATUS")
                                             .setActiveStates([$KeywordRegistry.salesprojectState$open(), $KeywordRegistry.salesprojectState$postponed()])
             ,"Contract": ContextSelector.create("CONTRACT", "CONTRACTID")
-                                        .setTitleExpression(maskingUtils.cast(maskingUtils.concat([
+                                        .setTitleExpression(maskingUtils.cast(maskingUtils.concatWithSeparator([
                                                                 KeywordUtils.getResolvedTitleSqlPart("ContractType", "CONTRACTTYPE"),
                                                                 maskingUtils.cast("CONTRACTCODE", SQLTYPES.VARCHAR, 10)
                                                                 ], " "), isOracle ? SQLTYPES.NVARCHAR : SQLTYPES.VARCHAR, 50))
@@ -549,19 +549,19 @@ ContextUtils.getSelectMap  = function()
                                         .setStateField("CONTRACTSTATUS")
                                         .setActiveStates([$KeywordRegistry.contractState$validLimited(), $KeywordRegistry.contractState$validUnlimited(), $KeywordRegistry.contractState$notSigned()])
             ,"Offer": ContextSelector.create("OFFER", "OFFERID")
-                                     .setTitleExpression(maskingUtils.cast(maskingUtils.concat([
+                                     .setTitleExpression(maskingUtils.cast(maskingUtils.concatenate([
                                                 "'" + translate.text("Offer") + "'",
                                                 "' '",
                                                 maskingUtils.cast("OFFERCODE", SQLTYPES.VARCHAR, 10),
                                                 "'-'",
                                                 maskingUtils.cast("VERSNR", SQLTYPES.VARCHAR, 10)
-                                                ], "", false), isOracle ? SQLTYPES.NVARCHAR : SQLTYPES.VARCHAR, 50))
+                                                ]), isOracle ? SQLTYPES.NVARCHAR : SQLTYPES.VARCHAR, 50))
                                      .setContactIdField("CONTACT_ID")
                                      .setCreationDateField("OFFERDATE")
                                      .setStateField("STATUS")
                                      .setActiveStates([$KeywordRegistry.offerStatus$open(), $KeywordRegistry.offerStatus$checked(), $KeywordRegistry.offerStatus$sent()])
             ,"Order": ContextSelector.create("SALESORDER", "SALESORDERID")
-                                     .setTitleExpression(maskingUtils.cast(maskingUtils.concat([
+                                     .setTitleExpression(maskingUtils.cast(maskingUtils.concatWithSeparator([
                                                         KeywordUtils.getResolvedTitleSqlPart("OrderType", "ORDERTYPE"),
                                                         maskingUtils.cast("SALESORDERCODE", SQLTYPES.VARCHAR, 10)
                                                         ], " "), isOracle ? SQLTYPES.NVARCHAR : SQLTYPES.VARCHAR, 50))
@@ -570,14 +570,14 @@ ContextUtils.getSelectMap  = function()
                                      .setStateField("ORDERSTATUS")
                                      .setActiveStates([0, 1])
             ,"Product": ContextSelector.create("PRODUCT", "PRODUCTID")
-                                       .setTitleExpression(maskingUtils.concat([
+                                       .setTitleExpression(maskingUtils.concatenate([
                                             "PRODUCTCODE",
                                             "' | '",
                                             "PRODUCTNAME"
-                                            ], "", false))
+                                            ]))
             ,"Task": ContextSelector.create("TASK", "TASKID", "SUBJECT")
             ,"Campaign": ContextSelector.create("CAMPAIGN", "CAMPAIGNID")
-                         .setTitleExpression(maskingUtils.concat(["CAMPAIGN.NAME", "CAMPAIGNSTEP.NAME"], " - ", false))
+                         .setTitleExpression(maskingUtils.concatWithSeparator(["CAMPAIGN.NAME", "CAMPAIGNSTEP.NAME"], " - ", false))
                          .setContactIdField("CAMPAIGNPARTICIPANT.CONTACT_ID")
                          .setJoinExpression("left join CAMPAIGNPARTICIPANT on CAMPAIGNPARTICIPANT.CAMPAIGN_ID = CAMPAIGN.CAMPAIGNID " +
                                             "left join CAMPAIGNSTEP on CAMPAIGNSTEP.CAMPAIGNSTEPID = CAMPAIGNPARTICIPANT.CAMPAIGNSTEP_ID")
@@ -629,15 +629,18 @@ ContextUtils.getNameSubselectSql = function(pContextIdDbField, pRowIdDbField)
 /**
  * TODO: !!!temporary function until you can get fields from another Entity!!!
  */
-ContextUtils.getNameSql = function(pContextId, pRowId)
+ContextUtils.getNameSql = function(pContextId, pRowId, pRowIdField)
 {
     var selectMap = ContextUtils.getSelectMap ()
     if (selectMap[pContextId] != undefined)
     {
-        return newSelect(selectMap[pContextId].titleExpression)
-                    .from(selectMap[pContextId].getFullFromClause())
-                    .whereIfSet(selectMap[pContextId].getFullIdField(), pRowId)
-                    .build(SqlBuilder.NORESULT_CONDITION());
+        var sql = newSelect(selectMap[pContextId].titleExpression)
+                    .from(selectMap[pContextId].getFullFromClause());
+        if (pRowIdField)
+            sql.where(selectMap[pContextId].getFullIdField() + " = " + pRowIdField);
+        else
+            sql.whereIfSet(selectMap[pContextId].getFullIdField(), pRowId);
+        return sql.build(SqlBuilder.NORESULT_CONDITION());
     }
     else
         return "select 1 from person where 1=2";
diff --git a/process/Order_lib/process.js b/process/Order_lib/process.js
index bcb1b842869..10c273583ad 100644
--- a/process/Order_lib/process.js
+++ b/process/Order_lib/process.js
@@ -97,32 +97,42 @@ OrderUtils.createNewOrder = function(pContextId, pRowId, pRelationId)
     neon.openContext("Order", null, null, neon.OPERATINGSTATE_NEW, params);
 }
 
-OrderUtils.copyOrder = function (pSourceOfferId, pContactId, pOrderType, pLanguage, pCurrency, pHeader, pFooter, pDeliveryTerm, pPaymentTerm, pPaymentAddress, pDeliveryAddress, pObjectType, pRowId, pDunningDate, pDunningLevel, pCancellation, pOrderStatus)
+/**
+ * Opens a new Order copy
+ * 
+ * @param {String} pSourceOrderId id of the source order
+ * @param {Object} [pOrderData] the field values to preset, possible properties: contactId, orderType, language, offerId, currency, 
+ *      header, footer, deliveryTerm, paymentTerm, paymentAddress, deliveryAddress, objectType, objectRowId, 
+ *      dunningDate, dunningLevel, cancellation, orderStatus
+ */
+OrderUtils.copyOrder = function (pSourceOrderId, pOrderData)
 {
-    
+    if (!pOrderData)
+        pOrderData = {};
     var fieldparams = {
-        "$field.CONTACT_ID" : pContactId,
-        "$field.ORDERTYPE" : pOrderType,
-        "$field.ISOLANGUAGE" : pLanguage,
-        "$field.OFFER_ID" : pSourceOfferId,
-        "$field.CURRENCY" : pCurrency || "",
-        "$field.HEADER" : pHeader || "",
-        "$field.FOOTER" : pFooter || "",
-        "$field.DELIVERYTERMS" : pDeliveryTerm || "",
-        "$field.PAYMENTTERMS" : pPaymentTerm || "",
-        "$field.PAYMENTADDRESS" : pPaymentAddress || "",
-        "$field.DELIVERYADDRESS" : pDeliveryAddress || "",
-        "$field.OBJECT_TYPE" : pObjectType || "",
-        "$field.OBJECT_ROWID" : pRowId || "",
-        "$field.DUNNINGDATE" : pDunningDate || "",
-        "$field.DUNNINGLEVEL" : pDunningLevel || "",
-        "$field.CANCELLATION" : pCancellation || "",
-        "$field.ORDERSTATUS" : pOrderStatus || ""
+        "$field.CONTACT_ID": pOrderData.contactId,
+        "$field.ORDERTYPE": pOrderData.orderType,
+        "$field.ISOLANGUAGE": pOrderData.language,
+        "$field.OFFER_ID": pOrderData.offerId,
+        "$field.CURRENCY": pOrderData.currency || "",
+        "$field.HEADER": pOrderData.header || "",
+        "$field.FOOTER": pOrderData.footer || "",
+        "$field.DELIVERYTERMS": pOrderData.deliveryTerm || "",
+        "$field.PAYMENTTERMS": pOrderData.paymentTerm || "",
+        "$field.PAYMENTADDRESS": pOrderData.paymentAddress || "",
+        "$field.DELIVERYADDRESS": pOrderData.deliveryAddress || "",
+        "$field.OBJECT_TYPE": pOrderData.objectType || "",
+        "$field.OBJECT_ROWID": pOrderData.objectRowId || "",
+        "$field.DUNNINGDATE": pOrderData.dunningDate || "",
+        "$field.DUNNINGLEVEL": pOrderData.dunningLevel || "",
+        "$field.CANCELLATION": pOrderData.cancellation || "",
+        "$field.ORDERSTATUS": pOrderData.orderStatus || ""
     };
     
-    var params = {};
-    params["Copy_param"] = JSON.stringify(fieldparams);
-    params["OfferId_param"] = pSourceOfferId;
+    var params = {
+        "Copy_param": JSON.stringify(fieldparams),
+        "SourceOrderId_param": pSourceOrderId
+    };
     
     neon.openContext("Order", null, null, neon.OPERATINGSTATE_NEW, params);
 }
@@ -174,6 +184,36 @@ OrderUtils.copyOfferItemsToOrder = function (pSourceOfferId, pOrderId)
         .updateData(true, "SALESORDER", cols, null, vals);
 }
 
+/**
+ * copies all orderItems and creates orderItems for an order
+ * 
+ * @param {String} pSourceOrderId the order to get the items from
+ * @param {String} pTargetOrderId the order to create the items for
+ */
+OrderUtils.copyOrderItems = function (pSourceOrderId, pTargetOrderId)
+{
+    var inputMapping = {
+        "SALESORDERITEM": {
+            condition: newWhere("SALESORDERITEM.SALESORDER_ID", pSourceOrderId),
+            ValueMapping: {
+                "SALESORDER_ID": pTargetOrderId
+            }
+        }
+    };
+    CopyModuleUtils.copyModule(inputMapping);
+    
+    var oiUtils = new OrderItemUtils(pTargetOrderId);
+    
+    //update order price
+    var [netValue, vat] = oiUtils.getNetAndVat();
+    
+    newWhere("SALESORDER.SALESORDERID", pTargetOrderId)
+        .updateFields({
+            "NET": netValue,
+            "VAT": vat
+        });
+}
+
 /**
  * Will build the order report for the given order.
  * 
diff --git a/process/Placeholder_lib/process.js b/process/Placeholder_lib/process.js
index 2c1cb9d8214..a162fc7ee5d 100644
--- a/process/Placeholder_lib/process.js
+++ b/process/Placeholder_lib/process.js
@@ -53,10 +53,10 @@ PlaceholderUtils.getPlaceholders = function (pLocale, pIsExportTemplateField)
     _addSqlPart("title", "PERSON.TITLE", null , translate.text("Title", locale));
     _addSqlPart("phone", CommUtil.getStandardSubSqlPhone(), null , translate.text("Phone", locale));
     _addSqlPart("email", CommUtil.getStandardSubSqlMail(), null , translate.text("Email", locale));
-    _addSqlPart("name", sqlUtil.concat(["SALUTATION", "TITLE", "FIRSTNAME", "LASTNAME"]), null , translate.text("Name", locale));
+    _addSqlPart("name", sqlUtil.concatWithSeparator(["SALUTATION", "TITLE", "FIRSTNAME", "LASTNAME"]), null , translate.text("Name", locale));
     _addSqlPart("senderPhone", CommUtil.getStandardSubSqlPhone(), Placeholder.targets.SENDER, null);
     _addSqlPart("senderEmail", CommUtil.getStandardSubSqlMail(), Placeholder.targets.SENDER, null);
-    _addSqlPart("senderName", sqlUtil.concat(["SALUTATION", "TITLE", "FIRSTNAME", "LASTNAME"]), Placeholder.targets.SENDER, null);
+    _addSqlPart("senderName", sqlUtil.concatWithSeparator(["SALUTATION", "TITLE", "FIRSTNAME", "LASTNAME"]), Placeholder.targets.SENDER, null);
     _addSqlPart("date", "'" + datetime.toDate(vars.get("sys.date"), translate.text("dd.MM.yyyy")) + "'", Placeholder.targets.SENDER, null);
     
     
diff --git a/process/PostalAddress_lib/process.js b/process/PostalAddress_lib/process.js
index b7cf917b594..996991dd07a 100644
--- a/process/PostalAddress_lib/process.js
+++ b/process/PostalAddress_lib/process.js
@@ -42,7 +42,7 @@ AddressUtils.formatOnelineSql = function ()
 {
     //request (and resulting change) was made here to NOT include Country int othe title
     var maskingHelper = new SqlMaskingUtils();
-        var sqlExpression = maskingHelper.concat(["ADDRESS.ADDRESS", "ADDRESS.BUILDINGNO", "'-'", "ADDRESS.COUNTRY", "ADDRESS.ZIP", "ADDRESS.CITY", "ADDRESS.ADDRIDENTIFIER"]);
+        var sqlExpression = maskingHelper.concatWithSeparator(["ADDRESS.ADDRESS", "ADDRESS.BUILDINGNO", "'-'", "ADDRESS.COUNTRY", "ADDRESS.ZIP", "ADDRESS.CITY", "ADDRESS.ADDRIDENTIFIER"]);
     return sqlExpression;
 };
 
diff --git a/process/Sql_lib/process.js b/process/Sql_lib/process.js
index 75c6923e249..540b11b1525 100644
--- a/process/Sql_lib/process.js
+++ b/process/Sql_lib/process.js
@@ -3568,9 +3568,64 @@ SqlMaskingUtils.prototype.substring = function (pField, pStartPos, pLength)
     return sqlFnName + "(" + pField + ", " + pStartPos + ", " + pLength + ")";
 }
 
+/**
+* masks the function concat (without separator)
+*
+* @param {Array} pFields fields (or expressions) that should be concatenated
+*
+* @return {String} part of SQL-querey
+*/
+SqlMaskingUtils.prototype.concatenate = function (pFields)
+{
+    if (pFields.length === 0)
+        return "''";
+
+    switch (this.dbType)
+    {
+        case db.DBTYPE_MYSQL4:
+        case db.DBTYPE_MARIADB10:
+        case db.DBTYPE_POSTGRESQL8:
+            return " concat(" + pFields.join(", ") + ")";
+        case db.DBTYPE_ORACLE10_CLUSTER:
+        case db.DBTYPE_ORACLE10_THIN:
+        case db.DBTYPE_ORACLE10_OCI:
+            break;
+        case db.DBTYPE_SQLSERVER2000:
+            //MS SQL Server supports "concat_ws" (and ignoring null values) from version SQL Server 2017 and newer:
+            //https://docs.microsoft.com/de-de/sql/t-sql/functions/concat-ws-transact-sql?view=sql-server-2017
+            break;
+        case db.DBTYPE_DERBY10:
+            break;
+        default:
+            throw new Error(translate.withArguments("${SQL_LIB_UNSUPPORTED_DBTYPE} function: %0", ["SqlMaskingUtils.prototype.concatenate"]));
+    }
+    
+    var fields = [];
+    
+    for (let i = 0; i < pFields.length; i++)
+    {
+        let field = pFields[i];
+        let isLast = i + 1 === pFields.length;
+        
+        if (field && field != "''")
+        {
+            if (_isFixedValue(field))
+                fields.push(field);
+            else
+                fields.push(this.isNull(field));
+        }
+    }
+    
+    return fields.join(this.getConcatSymbol()) || "''";
+    
+    function _isFixedValue (pSqlField)
+    {
+        return pSqlField.startsWith("'") && pSqlField.endsWith("'") && !pSqlField.slice(1, -1).includes("'");
+    }
+}
 
 /**
-* masks the function concat
+* masks the function concat_ws
 * if a sql field is empty no separator will be added
 * note that this function will often create a lot of sql-code
 *
@@ -3580,13 +3635,16 @@ SqlMaskingUtils.prototype.substring = function (pField, pStartPos, pLength)
 *
 * @return {String} part of SQL-querey
 */
-SqlMaskingUtils.prototype.concat = function (pFields, pSeparator, pAutoTrimFields) 
+SqlMaskingUtils.prototype.concatWithSeparator = function (pFields, pSeparator, pAutoTrimFields) 
 {
     if (pFields.length === 0)
         return "''";
     if (pFields.length === 1)
         return pFields[0];
     
+    if (pSeparator === "" && pAutoTrimFields == false)
+        return this.concatenate(pFields);
+    
     if (pAutoTrimFields == undefined)
         pAutoTrimFields = true;
     
@@ -3662,6 +3720,25 @@ SqlMaskingUtils.prototype.concat = function (pFields, pSeparator, pAutoTrimField
     }
 }
 
+/**
+* masks the function concat
+* if a sql field is empty no separator will be added
+* note that this function will often create a lot of sql-code
+*
+* @param {Array} pFields fields (or expressions) that should be concatenated
+* @param {String} [pSeparator=space-character] character for separating the fields
+* @param {String} [pAutoTrimFields=true] autoTrimFields if true the expressions are always trimmed, false no change will be applied
+*
+* @return {String} part of SQL-querey
+* 
+* @deprecated The function has been renamed to SqlMaskingUtils.prototype.concatWithSeparator to differentiate it from 
+*             SqlMaskingUtils.prototype.concatenate.
+*/
+SqlMaskingUtils.prototype.concat = function (pFields, pSeparator, pAutoTrimFields) 
+{
+    return this.concatWithSeparator(pFields, pSeparator, pAutoTrimFields);
+}
+
 /**
      * returns the function for replacing a null value
      *
-- 
GitLab


From a7ca554d6b45d261e5b50a8499504870bb4f5288 Mon Sep 17 00:00:00 2001
From: Sebastian Listl <s.listl@adito.de>
Date: Tue, 10 Nov 2020 16:14:58 +0100
Subject: [PATCH 071/184] #1067448 order copy fix

---
 entity/Order_entity/Order_entity.aod          | 207 +++++++++---------
 .../documentation.adoc                        |   0
 .../entityfields/copyorder/onActionProcess.js |  30 +++
 .../entityfields/neworder/onActionProcess.js  |  26 ---
 .../recordcontainers/db/onDBInsert.js         |  12 +-
 process/Order_lib/process.js                  |  84 +++++--
 6 files changed, 204 insertions(+), 155 deletions(-)
 rename entity/Order_entity/entityfields/{neworder => copyorder}/documentation.adoc (100%)
 create mode 100644 entity/Order_entity/entityfields/copyorder/onActionProcess.js
 delete mode 100644 entity/Order_entity/entityfields/neworder/onActionProcess.js

diff --git a/entity/Order_entity/Order_entity.aod b/entity/Order_entity/Order_entity.aod
index 06389d921d5..1ff05a7b48c 100644
--- a/entity/Order_entity/Order_entity.aod
+++ b/entity/Order_entity/Order_entity.aod
@@ -100,11 +100,6 @@
     <entityConsumer>
       <name>Orderitems</name>
       <description></description>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Orderitem_entity</entityName>
-        <fieldName>Orderitems</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>OrderId_param</name>
@@ -130,6 +125,11 @@
           <mandatory v="true" />
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Orderitem_entity</entityName>
+        <fieldName>Orderitems</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>NET</name>
@@ -191,11 +191,6 @@
     <entityConsumer>
       <name>Documents</name>
       <selectionMode>MULTI</selectionMode>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Document_entity</entityName>
-        <fieldName>Documents</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>AssignmentRowId_param</name>
@@ -206,19 +201,16 @@
           <valueProcess>%aditoprj%/entity/Order_entity/entityfields/documents/children/assignmenttable_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>MainDocuments</name>
-      <stateProcess>%aditoprj%/entity/Order_entity/entityfields/maindocuments/stateProcess.js</stateProcess>
       <dependency>
         <name>dependency</name>
         <entityName>Document_entity</entityName>
-        <fieldName>MainDocuments</fieldName>
+        <fieldName>Documents</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>MainDocuments</name>
+      <stateProcess>%aditoprj%/entity/Order_entity/entityfields/maindocuments/stateProcess.js</stateProcess>
       <children>
-        <entityParameter>
-          <name>AssignmentName_param</name>
-        </entityParameter>
         <entityParameter>
           <name>AssignmentRowId_param</name>
           <valueProcess>%aditoprj%/entity/Order_entity/entityfields/maindocuments/children/assignmentrowid_param/valueProcess.js</valueProcess>
@@ -228,28 +220,28 @@
           <valueProcess>%aditoprj%/entity/Order_entity/entityfields/maindocuments/children/assignmenttable_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>Salesprojects</name>
       <dependency>
         <name>dependency</name>
-        <entityName>Salesproject_entity</entityName>
-        <fieldName>Salesprojects</fieldName>
+        <entityName>Document_entity</entityName>
+        <fieldName>MainDocuments</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>Salesprojects</name>
       <children>
         <entityParameter>
           <name>ContactId_param</name>
           <valueProcess>%aditoprj%/entity/Order_entity/entityfields/salesprojects/children/contactid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>KeywordCurrencies</name>
       <dependency>
         <name>dependency</name>
-        <entityName>KeywordEntry_entity</entityName>
-        <fieldName>SpecificContainerKeywords</fieldName>
+        <entityName>Salesproject_entity</entityName>
+        <fieldName>Salesprojects</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>KeywordCurrencies</name>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
@@ -257,14 +249,14 @@
           <expose v="false" />
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>KeywordStates</name>
       <dependency>
         <name>dependency</name>
         <entityName>KeywordEntry_entity</entityName>
         <fieldName>SpecificContainerKeywords</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>KeywordStates</name>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
@@ -272,6 +264,11 @@
           <expose v="false" />
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>SpecificContainerKeywords</fieldName>
+      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>Languages</name>
@@ -290,11 +287,6 @@
     </entityParameter>
     <entityConsumer>
       <name>Activities</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Activity_entity</entityName>
-        <fieldName>LinkedObjects</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>RowId_param</name>
@@ -309,6 +301,11 @@
           <valueProcess>%aditoprj%/entity/Order_entity/entityfields/activities/children/presetlinks_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Activity_entity</entityName>
+        <fieldName>LinkedObjects</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>OFFER_ID</name>
@@ -322,11 +319,6 @@
     <entityConsumer>
       <name>Tasks</name>
       <stateProcess>%aditoprj%/entity/Order_entity/entityfields/tasks/stateProcess.js</stateProcess>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Task_entity</entityName>
-        <fieldName>Tasks</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>RowId_param</name>
@@ -341,15 +333,15 @@
           <valueProcess>%aditoprj%/entity/Order_entity/entityfields/tasks/children/presetlinks_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Task_entity</entityName>
+        <fieldName>Tasks</fieldName>
+      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>Attributes</name>
       <onValidation>%aditoprj%/entity/Order_entity/entityfields/attributes/onValidation.js</onValidation>
-      <dependency>
-        <name>dependency</name>
-        <entityName>AttributeRelation_entity</entityName>
-        <fieldName>AttributeRelations</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ObjectRowId_param</name>
@@ -360,15 +352,15 @@
           <valueProcess>%aditoprj%/entity/Order_entity/entityfields/attributes/children/objecttype_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>AttributeTree</name>
-      <stateProcess>%aditoprj%/entity/Order_entity/entityfields/attributetree/stateProcess.js</stateProcess>
       <dependency>
         <name>dependency</name>
         <entityName>AttributeRelation_entity</entityName>
-        <fieldName>TreeProvider</fieldName>
+        <fieldName>AttributeRelations</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>AttributeTree</name>
+      <stateProcess>%aditoprj%/entity/Order_entity/entityfields/attributetree/stateProcess.js</stateProcess>
       <children>
         <entityParameter>
           <name>ObjectType_param</name>
@@ -379,20 +371,25 @@
           <valueProcess>%aditoprj%/entity/Order_entity/entityfields/attributetree/children/objectrowid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>LogHistories</name>
       <dependency>
         <name>dependency</name>
-        <entityName>LogHistory_entity</entityName>
-        <fieldName>LogHistoryProvider</fieldName>
+        <entityName>AttributeRelation_entity</entityName>
+        <fieldName>TreeProvider</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>LogHistories</name>
       <children>
         <entityParameter>
           <name>tablenames_param</name>
           <valueProcess>%aditoprj%/entity/Order_entity/entityfields/loghistories/children/tablenames_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>LogHistory_entity</entityName>
+        <fieldName>LogHistoryProvider</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>ORDERTYPE</name>
@@ -470,31 +467,31 @@
     </entityField>
     <entityConsumer>
       <name>KeywordOrderTypes</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>KeywordEntry_entity</entityName>
-        <fieldName>SpecificContainerKeywords</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
           <valueProcess>%aditoprj%/entity/Order_entity/entityfields/keywordordertypes/children/containername_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>KeywordDunningLevels</name>
       <dependency>
         <name>dependency</name>
         <entityName>KeywordEntry_entity</entityName>
         <fieldName>SpecificContainerKeywords</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>KeywordDunningLevels</name>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
           <valueProcess>%aditoprj%/entity/Order_entity/entityfields/keyworddunninglevels/children/containername_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>SpecificContainerKeywords</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>OBJECT_ROWID</name>
@@ -522,11 +519,6 @@
     </entityField>
     <entityConsumer>
       <name>Objects</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Object_entity</entityName>
-        <fieldName>FilteredObjects</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContactId_param</name>
@@ -537,14 +529,14 @@
           <valueProcess>%aditoprj%/entity/Order_entity/entityfields/objects/children/objecttype_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>Contexts</name>
       <dependency>
         <name>dependency</name>
-        <entityName>Context_entity</entityName>
-        <fieldName>Exclusive</fieldName>
+        <entityName>Object_entity</entityName>
+        <fieldName>FilteredObjects</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>Contexts</name>
       <children>
         <entityParameter>
           <name>Blacklist_param</name>
@@ -555,6 +547,11 @@
           <valueProcess>%aditoprj%/entity/Order_entity/entityfields/contexts/children/invertblacklist_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Context_entity</entityName>
+        <fieldName>Exclusive</fieldName>
+      </dependency>
     </entityConsumer>
     <entityParameter>
       <name>PossibleConnectionTypes</name>
@@ -607,46 +604,46 @@
     </entityField>
     <entityConsumer>
       <name>KeywordPaymentTerms</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>KeywordEntry_entity</entityName>
-        <fieldName>SpecificContainerKeywords</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
           <valueProcess>%aditoprj%/entity/Order_entity/entityfields/keywordpaymentterms/children/containername_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>KeywordDeliveryTerms</name>
       <dependency>
         <name>dependency</name>
         <entityName>KeywordEntry_entity</entityName>
         <fieldName>SpecificContainerKeywords</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>KeywordDeliveryTerms</name>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
           <valueProcess>%aditoprj%/entity/Order_entity/entityfields/keyworddeliveryterms/children/containername_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>SpecificContainerKeywords</fieldName>
+      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>PossibleAddresses</name>
       <documentation>%aditoprj%/entity/Order_entity/entityfields/possibleaddresses/documentation.adoc</documentation>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Address_entity</entityName>
-        <fieldName>OrganisationAndContactAddresses</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContactId_param</name>
           <valueProcess>%aditoprj%/entity/Order_entity/entityfields/possibleaddresses/children/contactid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Address_entity</entityName>
+        <fieldName>OrganisationAndContactAddresses</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>NOTICE</name>
@@ -663,25 +660,20 @@
     </entityField>
     <entityConsumer>
       <name>Offers</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Offer_entity</entityName>
-        <fieldName>ContactOffers</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContactId_param</name>
           <valueProcess>%aditoprj%/entity/Order_entity/entityfields/offers/children/contactid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>DocumentTemplateTexHeader</name>
       <dependency>
         <name>dependency</name>
-        <entityName>DocumentTemplate_entity</entityName>
-        <fieldName>DocumentTemplateProvider</fieldName>
+        <entityName>Offer_entity</entityName>
+        <fieldName>ContactOffers</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>DocumentTemplateTexHeader</name>
       <children>
         <entityParameter>
           <name>DocumentTemplateType_param</name>
@@ -692,14 +684,14 @@
           <valueProcess>%aditoprj%/entity/Order_entity/entityfields/documenttemplatetexheader/children/documenttemplatetypeclassification_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>DocumentTemplateTexFooter</name>
       <dependency>
         <name>dependency</name>
         <entityName>DocumentTemplate_entity</entityName>
         <fieldName>DocumentTemplateProvider</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>DocumentTemplateTexFooter</name>
       <children>
         <entityParameter>
           <name>DocumentTemplateType_param</name>
@@ -710,6 +702,11 @@
           <valueProcess>%aditoprj%/entity/Order_entity/entityfields/documenttemplatetexfooter/children/documenttemplatetypeclassification_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>DocumentTemplate_entity</entityName>
+        <fieldName>DocumentTemplateProvider</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>ChosenTexHeader</name>
@@ -797,10 +794,10 @@
       <title>Count</title>
     </entityAggregateField>
     <entityActionField>
-      <name>newOrder</name>
-      <documentation>%aditoprj%/entity/Order_entity/entityfields/neworder/documentation.adoc</documentation>
+      <name>copyOrder</name>
+      <documentation>%aditoprj%/entity/Order_entity/entityfields/copyorder/documentation.adoc</documentation>
       <title>Copy receipt</title>
-      <onActionProcess>%aditoprj%/entity/Order_entity/entityfields/neworder/onActionProcess.js</onActionProcess>
+      <onActionProcess>%aditoprj%/entity/Order_entity/entityfields/copyorder/onActionProcess.js</onActionProcess>
       <iconId>VAADIN:COPY</iconId>
     </entityActionField>
     <entityActionField>
@@ -916,6 +913,10 @@
         </entityActionField>
       </children>
     </entityActionGroup>
+    <entityParameter>
+      <name>SourceOrderId_param</name>
+      <expose v="true" />
+    </entityParameter>
   </entityFields>
   <recordContainers>
     <dbRecordContainer>
diff --git a/entity/Order_entity/entityfields/neworder/documentation.adoc b/entity/Order_entity/entityfields/copyorder/documentation.adoc
similarity index 100%
rename from entity/Order_entity/entityfields/neworder/documentation.adoc
rename to entity/Order_entity/entityfields/copyorder/documentation.adoc
diff --git a/entity/Order_entity/entityfields/copyorder/onActionProcess.js b/entity/Order_entity/entityfields/copyorder/onActionProcess.js
new file mode 100644
index 00000000000..57c33c7f014
--- /dev/null
+++ b/entity/Order_entity/entityfields/copyorder/onActionProcess.js
@@ -0,0 +1,30 @@
+import("system.vars");
+import("system.neon");
+import("Order_lib");
+import("Keyword_lib");
+import("KeywordRegistry_basic");
+
+
+var orderId = vars.get("$field.SALESORDERID");
+var fieldValues = {
+    contactId: vars.getString("$field.CONTACT_ID"),
+    currency: vars.getString("$field.CURRENCY"),
+    language: vars.getString("$field.ISOLANGUAGE"),
+    header: vars.getString("$field.HEADER"),
+    footer: vars.getString("$field.FOOTER"),
+    offerId: vars.getString("$field.OFFER_ID"),
+    deliveryTerm: vars.getString("$field.DELIVERYTERMS"),
+    paymentTerm: vars.getString("$field.PAYMENTTERMS"),
+    paymentAddress: vars.getString("$field.PAYMENTADDRESS"),
+    deliveryAddress: vars.getString("$field.DELIVERYADDRESS"),
+    objectRowId: vars.getString("$field.OBJECT_ROWID"),
+    objectType: vars.getString("$field.OBJECT_TYPE"),
+    dunningDate: vars.getString("$field.DUNNINGDATE"),
+    dunningLevel: vars.getString("$field.DUNNINGLEVEL"),
+    orderType: vars.getString("$field.ORDERTYPE"),
+    cancellation: vars.getString("$field.CANCELLATION"),
+    orderStatus:vars.getString("$field.ORDERSTATUS")
+};
+
+OrderUtils.copyOrder(orderId, fieldValues);
+    
\ No newline at end of file
diff --git a/entity/Order_entity/entityfields/neworder/onActionProcess.js b/entity/Order_entity/entityfields/neworder/onActionProcess.js
deleted file mode 100644
index d73a39e61fe..00000000000
--- a/entity/Order_entity/entityfields/neworder/onActionProcess.js
+++ /dev/null
@@ -1,26 +0,0 @@
-import("system.vars");
-import("system.neon");
-import("Order_lib");
-import("Keyword_lib");
-import("KeywordRegistry_basic");
-
-var contactId = vars.getString("$field.CONTACT_ID");
-var currency = vars.getString("$field.CURRENCY");
-var language = vars.getString("$field.ISOLANGUAGE");
-var header = vars.getString("$field.HEADER");
-var footer = vars.getString("$field.FOOTER");
-var offerId = vars.getString("$field.OFFER_ID");
-var deliveryTerm = vars.getString("$field.DELIVERYTERMS");
-var paymentTerm = vars.getString("$field.PAYMENTTERMS");
-var paymentAddress = vars.getString("$field.PAYMENTADDRESS");
-var deliveryAddress = vars.getString("$field.DELIVERYADDRESS");
-var rowId = vars.getString("$field.OBJECT_ROWID");
-var objectType = vars.getString("$field.OBJECT_TYPE");
-var dunningDate = vars.getString("$field.DUNNINGDATE");
-var dunningLevel = vars.getString("$field.DUNNINGLEVEL");
-var orderType= vars.getString("$field.ORDERTYPE");
-var cancellation= vars.getString("$field.CANCELLATION");
-var orderStatus=vars.getString("$field.ORDERSTATUS");
-
-OrderUtils.copyOrder(offerId, contactId, orderType, language, currency, header, footer, deliveryTerm, paymentTerm, paymentAddress, deliveryAddress, objectType, rowId, dunningDate, dunningLevel, cancellation, orderStatus);
-    
\ No newline at end of file
diff --git a/entity/Order_entity/recordcontainers/db/onDBInsert.js b/entity/Order_entity/recordcontainers/db/onDBInsert.js
index 8e0f20e8575..b472296c1cc 100644
--- a/entity/Order_entity/recordcontainers/db/onDBInsert.js
+++ b/entity/Order_entity/recordcontainers/db/onDBInsert.js
@@ -4,7 +4,11 @@ import("system.neon");
 import("system.vars");
 
 //@TODO: OfferId_param is also set by 'copy order' -> the items of the offer are copied. What should happen?
-if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && vars.exists("$param.OfferId_param"))
-    OrderUtils.copyOfferItemsToOrder(vars.getString("$param.OfferId_param"), vars.get("$local.rowdata")["SALESORDER.SALESORDERID"]);
-
-WorkflowSignalSender.inserted();
\ No newline at end of file
+if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW)
+{
+    if (vars.exists("$param.OfferId_param") && vars.get("$param.OfferId_param"))
+        OrderUtils.copyOfferItemsToOrder(vars.get("$param.OfferId_param"), vars.get("$local.uid"));
+    if (vars.exists("$param.SourceOrderId_param") && vars.get("$param.SourceOrderId_param"))
+        OrderUtils.copyOrderItems(vars.get("$param.SourceOrderId_param"), vars.get("$local.uid"));
+}
+WorkflowSignalSender.inserted();
diff --git a/process/Order_lib/process.js b/process/Order_lib/process.js
index bcb1b842869..10c273583ad 100644
--- a/process/Order_lib/process.js
+++ b/process/Order_lib/process.js
@@ -97,32 +97,42 @@ OrderUtils.createNewOrder = function(pContextId, pRowId, pRelationId)
     neon.openContext("Order", null, null, neon.OPERATINGSTATE_NEW, params);
 }
 
-OrderUtils.copyOrder = function (pSourceOfferId, pContactId, pOrderType, pLanguage, pCurrency, pHeader, pFooter, pDeliveryTerm, pPaymentTerm, pPaymentAddress, pDeliveryAddress, pObjectType, pRowId, pDunningDate, pDunningLevel, pCancellation, pOrderStatus)
+/**
+ * Opens a new Order copy
+ * 
+ * @param {String} pSourceOrderId id of the source order
+ * @param {Object} [pOrderData] the field values to preset, possible properties: contactId, orderType, language, offerId, currency, 
+ *      header, footer, deliveryTerm, paymentTerm, paymentAddress, deliveryAddress, objectType, objectRowId, 
+ *      dunningDate, dunningLevel, cancellation, orderStatus
+ */
+OrderUtils.copyOrder = function (pSourceOrderId, pOrderData)
 {
-    
+    if (!pOrderData)
+        pOrderData = {};
     var fieldparams = {
-        "$field.CONTACT_ID" : pContactId,
-        "$field.ORDERTYPE" : pOrderType,
-        "$field.ISOLANGUAGE" : pLanguage,
-        "$field.OFFER_ID" : pSourceOfferId,
-        "$field.CURRENCY" : pCurrency || "",
-        "$field.HEADER" : pHeader || "",
-        "$field.FOOTER" : pFooter || "",
-        "$field.DELIVERYTERMS" : pDeliveryTerm || "",
-        "$field.PAYMENTTERMS" : pPaymentTerm || "",
-        "$field.PAYMENTADDRESS" : pPaymentAddress || "",
-        "$field.DELIVERYADDRESS" : pDeliveryAddress || "",
-        "$field.OBJECT_TYPE" : pObjectType || "",
-        "$field.OBJECT_ROWID" : pRowId || "",
-        "$field.DUNNINGDATE" : pDunningDate || "",
-        "$field.DUNNINGLEVEL" : pDunningLevel || "",
-        "$field.CANCELLATION" : pCancellation || "",
-        "$field.ORDERSTATUS" : pOrderStatus || ""
+        "$field.CONTACT_ID": pOrderData.contactId,
+        "$field.ORDERTYPE": pOrderData.orderType,
+        "$field.ISOLANGUAGE": pOrderData.language,
+        "$field.OFFER_ID": pOrderData.offerId,
+        "$field.CURRENCY": pOrderData.currency || "",
+        "$field.HEADER": pOrderData.header || "",
+        "$field.FOOTER": pOrderData.footer || "",
+        "$field.DELIVERYTERMS": pOrderData.deliveryTerm || "",
+        "$field.PAYMENTTERMS": pOrderData.paymentTerm || "",
+        "$field.PAYMENTADDRESS": pOrderData.paymentAddress || "",
+        "$field.DELIVERYADDRESS": pOrderData.deliveryAddress || "",
+        "$field.OBJECT_TYPE": pOrderData.objectType || "",
+        "$field.OBJECT_ROWID": pOrderData.objectRowId || "",
+        "$field.DUNNINGDATE": pOrderData.dunningDate || "",
+        "$field.DUNNINGLEVEL": pOrderData.dunningLevel || "",
+        "$field.CANCELLATION": pOrderData.cancellation || "",
+        "$field.ORDERSTATUS": pOrderData.orderStatus || ""
     };
     
-    var params = {};
-    params["Copy_param"] = JSON.stringify(fieldparams);
-    params["OfferId_param"] = pSourceOfferId;
+    var params = {
+        "Copy_param": JSON.stringify(fieldparams),
+        "SourceOrderId_param": pSourceOrderId
+    };
     
     neon.openContext("Order", null, null, neon.OPERATINGSTATE_NEW, params);
 }
@@ -174,6 +184,36 @@ OrderUtils.copyOfferItemsToOrder = function (pSourceOfferId, pOrderId)
         .updateData(true, "SALESORDER", cols, null, vals);
 }
 
+/**
+ * copies all orderItems and creates orderItems for an order
+ * 
+ * @param {String} pSourceOrderId the order to get the items from
+ * @param {String} pTargetOrderId the order to create the items for
+ */
+OrderUtils.copyOrderItems = function (pSourceOrderId, pTargetOrderId)
+{
+    var inputMapping = {
+        "SALESORDERITEM": {
+            condition: newWhere("SALESORDERITEM.SALESORDER_ID", pSourceOrderId),
+            ValueMapping: {
+                "SALESORDER_ID": pTargetOrderId
+            }
+        }
+    };
+    CopyModuleUtils.copyModule(inputMapping);
+    
+    var oiUtils = new OrderItemUtils(pTargetOrderId);
+    
+    //update order price
+    var [netValue, vat] = oiUtils.getNetAndVat();
+    
+    newWhere("SALESORDER.SALESORDERID", pTargetOrderId)
+        .updateFields({
+            "NET": netValue,
+            "VAT": vat
+        });
+}
+
 /**
  * Will build the order report for the given order.
  * 
-- 
GitLab


From ad67b2923a724e397fbd33bea5f29ad1497b1ea7 Mon Sep 17 00:00:00 2001
From: Sebastian Listl <s.listl@adito.de>
Date: Wed, 11 Nov 2020 10:33:32 +0100
Subject: [PATCH 072/184] Corrupt xml fix after merge

---
 entity/Member_entity/Member_entity.aod | 38 ++++++++++----------------
 1 file changed, 15 insertions(+), 23 deletions(-)

diff --git a/entity/Member_entity/Member_entity.aod b/entity/Member_entity/Member_entity.aod
index b8db8bef917..9ab10a3baef 100644
--- a/entity/Member_entity/Member_entity.aod
+++ b/entity/Member_entity/Member_entity.aod
@@ -85,11 +85,6 @@
     </entityField>
     <entityConsumer>
       <name>Contacts</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Person_entity</entityName>
-        <fieldName>IdFilteredActiveContacts</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ExcludedContactIds_param</name>
@@ -100,20 +95,25 @@
           <valueProcess>%aditoprj%/entity/Member_entity/entityfields/contacts/children/onlyactive_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>KeywordMemberRoles</name>
       <dependency>
         <name>dependency</name>
-        <entityName>MemberRoles_entity</entityName>
-        <fieldName>ByCategory</fieldName>
+        <entityName>Person_entity</entityName>
+        <fieldName>IdFilteredActiveContacts</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>KeywordMemberRoles</name>
       <children>
         <entityParameter>
           <name>UsageFilter_param</name>
           <valueProcess>%aditoprj%/entity/Member_entity/entityfields/keywordmemberroles/children/usagefilter_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>MemberRoles_entity</entityName>
+        <fieldName>ByCategory</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>TARGETCONTEXT</name>
@@ -153,11 +153,6 @@
     </entityParameter>
     <entityConsumer>
       <name>Objects</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Object_entity</entityName>
-        <fieldName>AllObjects</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ObjectType_param</name>
@@ -166,6 +161,11 @@
           <mandatory v="true" />
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Object_entity</entityName>
+        <fieldName>AllObjects</fieldName>
+      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>Contexts</name>
@@ -305,10 +305,6 @@
       <expose v="true" />
       <description>PARAMETER</description>
     </entityParameter>
-    <entityField>
-      <name>recordType</name>
-      <documentation>%aditoprj%/entity/Member_entity/entityfields/recordtype/documentation.adoc</documentation>
-    </entityField>
   </entityFields>
   <recordContainers>
     <dbRecordContainer>
@@ -437,10 +433,6 @@
           <name>MST_MEMBERROLE.value</name>
           <expression>%aditoprj%/entity/Member_entity/recordcontainers/db/recordfieldmappings/mst_memberrole.value/expression.js</expression>
         </dbRecordFieldMapping>
-        <dbRecordFieldMapping>
-          <name>recordType.value</name>
-          <expression>%aditoprj%/entity/Member_entity/recordcontainers/db/recordfieldmappings/recordtype.value/expression.js</expression>
-        </dbRecordFieldMapping>
       </recordFieldMappings>
     </dbRecordContainer>
     <jDitoRecordContainer>
-- 
GitLab


From b86b9e1c10b211d4cec403dfcff526ea2a849875 Mon Sep 17 00:00:00 2001
From: Sebastian Listl <s.listl@adito.de>
Date: Wed, 11 Nov 2020 13:28:43 +0100
Subject: [PATCH 073/184] #1064484 Teams integration

---
 .../MSTeams/changelog.xml                     |  0
 .../MSTeams/create_MST_TEAM.xml               |  0
 .../MSTeams/create_MST_TEAMLINK.xml           |  0
 .../Data_alias/basic/2020.2.2/changelog.xml   |  1 +
 .../MemberFilter_view/MemberFilter_view.aod   |  4 +-
 process/MSTeams_lib/process.js                | 56 +++++++++++++------
 process/Util_lib/process.js                   | 28 ++++++++++
 7 files changed, 70 insertions(+), 19 deletions(-)
 rename .liquibase/Data_alias/basic/{2020.2.0 => 2020.2.2}/MSTeams/changelog.xml (100%)
 rename .liquibase/Data_alias/basic/{2020.2.0 => 2020.2.2}/MSTeams/create_MST_TEAM.xml (100%)
 rename .liquibase/Data_alias/basic/{2020.2.0 => 2020.2.2}/MSTeams/create_MST_TEAMLINK.xml (100%)

diff --git a/.liquibase/Data_alias/basic/2020.2.0/MSTeams/changelog.xml b/.liquibase/Data_alias/basic/2020.2.2/MSTeams/changelog.xml
similarity index 100%
rename from .liquibase/Data_alias/basic/2020.2.0/MSTeams/changelog.xml
rename to .liquibase/Data_alias/basic/2020.2.2/MSTeams/changelog.xml
diff --git a/.liquibase/Data_alias/basic/2020.2.0/MSTeams/create_MST_TEAM.xml b/.liquibase/Data_alias/basic/2020.2.2/MSTeams/create_MST_TEAM.xml
similarity index 100%
rename from .liquibase/Data_alias/basic/2020.2.0/MSTeams/create_MST_TEAM.xml
rename to .liquibase/Data_alias/basic/2020.2.2/MSTeams/create_MST_TEAM.xml
diff --git a/.liquibase/Data_alias/basic/2020.2.0/MSTeams/create_MST_TEAMLINK.xml b/.liquibase/Data_alias/basic/2020.2.2/MSTeams/create_MST_TEAMLINK.xml
similarity index 100%
rename from .liquibase/Data_alias/basic/2020.2.0/MSTeams/create_MST_TEAMLINK.xml
rename to .liquibase/Data_alias/basic/2020.2.2/MSTeams/create_MST_TEAMLINK.xml
diff --git a/.liquibase/Data_alias/basic/2020.2.2/changelog.xml b/.liquibase/Data_alias/basic/2020.2.2/changelog.xml
index c4de83cc615..d06001e6e91 100644
--- a/.liquibase/Data_alias/basic/2020.2.2/changelog.xml
+++ b/.liquibase/Data_alias/basic/2020.2.2/changelog.xml
@@ -2,4 +2,5 @@
 <databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
                    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd">
     <include relativeToChangelogFile="true" file="insert_commMediumTitleKeywordAttribute.xml"/>
+    <include relativeToChangelogFile="true" file="MSTeams/changelog.xml"/>
 </databaseChangeLog>
diff --git a/neonView/MemberFilter_view/MemberFilter_view.aod b/neonView/MemberFilter_view/MemberFilter_view.aod
index 921d83de636..a6d4fe21672 100644
--- a/neonView/MemberFilter_view/MemberFilter_view.aod
+++ b/neonView/MemberFilter_view/MemberFilter_view.aod
@@ -4,9 +4,9 @@
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <filterable v="true" />
   <layout>
-    <boxLayout>
+    <groupLayout>
       <name>layout</name>
-    </boxLayout>
+    </groupLayout>
   </layout>
   <children>
     <tableViewTemplate>
diff --git a/process/MSTeams_lib/process.js b/process/MSTeams_lib/process.js
index 1cf1d4b8271..a5f2d3006c1 100644
--- a/process/MSTeams_lib/process.js
+++ b/process/MSTeams_lib/process.js
@@ -1,3 +1,4 @@
+import("Util_lib");
 import("Communication_lib");
 import("system.translate");
 import("system.tools");
@@ -5,13 +6,24 @@ import("Sql_lib");
 import("system.teams");
 import("system.project");
 
+/**
+ * Provides static functions for working with the MS-Teams integration
+ */
 function MSTeamsUtils () {}
 
+/**
+ * Checks if the MS Teams integration is enabled in the instance config
+ * 
+ * @return {Boolean} if Teams is enabled
+ */
 MSTeamsUtils.isTeamsEnabled = function ()
 {
-    return project.getInstanceConfigValue("teamsEnabled", "false") == "true";
+    return Utils.toBoolean(project.getInstanceConfigValue("teamsEnabled", "false"));
 }
 
+/**
+ * 
+ */
 MSTeamsUtils.getTeamLinkContexts = function ()
 {
     return {
@@ -19,6 +31,9 @@ MSTeamsUtils.getTeamLinkContexts = function ()
     };
 }
 
+/**
+ * 
+ */
 MSTeamsUtils.createTeamLink = function (pTeamId, pRowId, pObjectType)
 {
     var currentTeamLinkId;
@@ -47,6 +62,9 @@ MSTeamsUtils.createTeamLink = function (pTeamId, pRowId, pObjectType)
     }
 }
 
+/**
+ * 
+ */
 MSTeamsUtils.getLinkedTeams = function (pRowId, pObjectType)
 {
     return newSelect("MST_TEAM_ID")
@@ -56,11 +74,17 @@ MSTeamsUtils.getLinkedTeams = function (pRowId, pObjectType)
         .arrayColumn();
 }
 
+/**
+ * 
+ */
 MSTeamsUtils.getLinkedTeam = function (pRowId, pObjectType)
 {
     return MSTeamsUtils.getLinkedTeams(pRowId, pObjectType)[0] || null;
 }
 
+/**
+ * 
+ */
 MSTeamsUtils.getContactIdsByAzureIds = function (pAzureIds)
 {
     if (pAzureIds.length === 0)
@@ -76,6 +100,9 @@ MSTeamsUtils.getContactIdsByAzureIds = function (pAzureIds)
     return contactIdMap;
 }
 
+/**
+ * 
+ */
 MSTeamsUtils.getTeamRoleSubSql = function (pTeamId, pContactIdField)
 {
     if (!pTeamId)
@@ -83,37 +110,32 @@ MSTeamsUtils.getTeamRoleSubSql = function (pTeamId, pContactIdField)
     
     var ownerIds = Object.keys(teams.getAllOwners(pTeamId));
     var ownerContactIds = MSTeamsUtils.getContactIdsByAzureIds(ownerIds);
-    ownerContactIds = _getObjectValues(ownerContactIds);
+    ownerContactIds = Utils.objectValues(ownerContactIds);
     
     var members = teams.getAllMembers(pTeamId);
     var memberIds = Object.keys(members);
     var memberContactIds = MSTeamsUtils.getContactIdsByAzureIds(memberIds);
-    memberContactIds = _getObjectValues(memberContactIds);
+    memberContactIds = Utils.objectValues(memberContactIds);
     
     if (ownerContactIds.length === 0 && memberContactIds.length === 0)
         return "''";
     
-    var caseWhen = SqlBuilder.caseStatement(true);
+    var caseWhen = SqlBuilder.caseStatement();
     if (ownerContactIds.length !== 0)
-        caseWhen.when(pContactIdField, ownerContactIds, SqlBuilder.IN()).then(translate.text("Owner"));
+        caseWhen.when(pContactIdField, ownerContactIds, SqlBuilder.IN()).thenString(translate.text("Owner"));
     if (memberContactIds.length !== 0)
-        caseWhen.when(pContactIdField, memberContactIds, SqlBuilder.IN()).then(translate.text("Member"));
+        caseWhen.when(pContactIdField, memberContactIds, SqlBuilder.IN()).thenString(translate.text("Member"));
     
     //the SqlBuilder.IN() can't be used here because of the sub-sql string for the email
-    caseWhen.when("(" + CommUtil.getStandardSubSqlMail() + ") in ('" + _getObjectValues(members).join("', '") + "')")
-        .then(translate.text("Guest")); 
+    caseWhen.when("(" + CommUtil.getStandardSubSqlMail() + ") in ('" + Utils.objectValues(members).join("', '") + "')")
+        .thenString(translate.text("Guest")); 
     
-    return caseWhen.elseValue("").toString();
-    
-    function _getObjectValues (pObject)
-    {
-        var values = [];
-        for (let key in pObject)
-            values.push(pObject[key]);
-        return values;
-    }
+    return caseWhen.elseString("").toString();
 }
 
+/**
+ * 
+ */
 MSTeamsUtils.isUserTeamOwner = function (pTeamId, pUserId)
 {
     var user;
diff --git a/process/Util_lib/process.js b/process/Util_lib/process.js
index 778e4ae46cb..037eb101d50 100644
--- a/process/Util_lib/process.js
+++ b/process/Util_lib/process.js
@@ -326,6 +326,34 @@ Utils.parseJSON = function (pJSON, pReviver)
     return null;
 }
 
+/**
+ * Returns the enumerable properties of the given object as an array of [key, value] pairs (works like Object.entries()).
+ * 
+ * @param {Object} pObject
+ * @return {Array} Object properties as 2d-array: [[key1, value1], [key2, value2], ...]
+ */
+Utils.objectEntries = function (pObject)
+{
+    return Object.keys(pObject).map(function (key)
+    {
+        return pObject[key];
+    });
+}
+
+/**
+ * Returns the values of all enumerable properties of the given object (works like Object.values()).
+ * 
+ * @param {Object} pObject
+ * @return {Array} Object values as array
+ */
+Utils.objectValues = function (pObject)
+{
+    return Object.keys(pObject).map(function (key)
+    {
+        return [key, pObject[key]];
+    });
+}
+
 /**
  * Class containing static utility functions for regular expression objects (RegExp)
  * Do not create an instance of this
-- 
GitLab


From d08f047cdebde4c04dccf4e3fe9ee761ea191096 Mon Sep 17 00:00:00 2001
From: Sebastian Listl <s.listl@adito.de>
Date: Wed, 11 Nov 2020 13:33:55 +0100
Subject: [PATCH 074/184] #1064484 Teams integration

---
 .aditoprj/UUIDNameMap.txt | 102 --------------------------------------
 1 file changed, 102 deletions(-)
 delete mode 100644 .aditoprj/UUIDNameMap.txt

diff --git a/.aditoprj/UUIDNameMap.txt b/.aditoprj/UUIDNameMap.txt
deleted file mode 100644
index 70f701e0fe2..00000000000
--- a/.aditoprj/UUIDNameMap.txt
+++ /dev/null
@@ -1,102 +0,0 @@
-*************************************************
-*                                               *
-* This is a generated file, please do not edit! *
-*                                               *
-*************************************************
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
-1.0.0
-1599146177805
-#ENTITY
-#ENTITY
-#PROVIDER_FIELD
-#PROVIDER_FIELD
-#CONTENTTITLE
-#CONTENTTITLE
-#TITLE
-#TITLE
-#INDEX_GROUP
-#INDEX_GROUP
-#TARGETCONTEXT
-#TARGETCONTEXT
-INTERNAL_ADMINISTRATOR
-INTERNAL_ADMINISTRATOR
-INTERNAL_WEBSERVICE
-INTERNAL_WEBSERVICE
-#DESCRIPTION
-#DESCRIPTION
-INTERNAL_GROUPWARE
-INTERNAL_GROUPWARE
-INTERNAL_TECHNICAL
-INTERNAL_TECHNICAL
-#MAPPING
-#MAPPING
-#LOCATION
-#LOCATION
-#PROVIDER
-#PROVIDER
-INTERNAL_DESIGNER
-INTERNAL_DESIGNER
-#USERHELP
-#USERHELP
-#NONE
-#NONE
-#TARGETID
-#TARGETID
-#CONTENTDESCRIPTION
-#CONTENTDESCRIPTION
-#SORTING
-#SORTING
-#LOOKUPID
-#LOOKUPID
-#GROUPING
-#GROUPING
-#ICON
-#ICON
-INTERNAL_DASHBOARDSTOREADMIN
-INTERNAL_DASHBOARDSTOREADMIN
-#IMAGE
-#IMAGE
-#UID
-#UID
-INTERNAL_SNMP
-INTERNAL_SNMP
-#TARGETCONSUMER
-#TARGETCONSUMER
-INTERNAL_EVERYONE
-INTERNAL_EVERYONE
\ No newline at end of file
-- 
GitLab


From 4e7493517325d8ba26212cf13e5a828846a7150c Mon Sep 17 00:00:00 2001
From: Sebastian Listl <s.listl@adito.de>
Date: Wed, 11 Nov 2020 15:28:08 +0100
Subject: [PATCH 075/184] ms teams

---
 .../recordcontainers/jdito/onInsert.js        |  13 +-
 .../recordcontainers/jdito/contentProcess.js  | 142 +++++++++---------
 process/MSTeams_lib/process.js                |   6 +-
 3 files changed, 84 insertions(+), 77 deletions(-)

diff --git a/entity/MSTTeam_entity/recordcontainers/jdito/onInsert.js b/entity/MSTTeam_entity/recordcontainers/jdito/onInsert.js
index 0f208a0331c..f7857c50dcc 100644
--- a/entity/MSTTeam_entity/recordcontainers/jdito/onInsert.js
+++ b/entity/MSTTeam_entity/recordcontainers/jdito/onInsert.js
@@ -45,7 +45,8 @@ teamMembers.forEach(function (teamMember)
 //mailNickName = teamName in camel case
 var mailNickName = teamName.replace(/(?:^\w|[A-Z]|\b\w|\s+)/g, function(match, index) 
 {
-    if (+match === 0) return ""; // or if (/\s+/.test(match)) for white spaces
+    if (+match === 0)  // or if (/\s+/.test(match)) for white spaces
+        return "";
     return index === 0 ? match.toLowerCase() : match.toUpperCase();
 });
 mailNickName = mailNickName + vars.get("$param.SalesprojectCode_param");
@@ -64,11 +65,11 @@ if (externalMembers.length !== 0)
     teams.addExternalMembers(mstTeam.teamId, externalMembers);
 
 new SqlBuilder().insertFields({
-    "MST_TEAMID" : mstTeam.teamId,
-    "TEAMNAME" : mstTeam.teamName,
-    "GENERAL_CHANNELID" : mstTeam.generalChannelId,
-    "IS_ARCHIVED" : 0,
-    "WEB_URL" : mstTeam.webUrl
+    "MST_TEAMID": mstTeam.teamId,
+    "TEAMNAME": mstTeam.teamName,
+    "GENERAL_CHANNELID": mstTeam.generalChannelId,
+    "IS_ARCHIVED": 0,
+    "WEB_URL": mstTeam.webUrl
 }, "MST_TEAM");
 
 MSTeamsUtils.createTeamLink(mstTeam.teamId, vars.get("$param.ObjectRowId_param"), vars.get("$param.ObjectType_param"));
\ No newline at end of file
diff --git a/entity/Member_entity/recordcontainers/jdito/contentProcess.js b/entity/Member_entity/recordcontainers/jdito/contentProcess.js
index e4d4225eebe..ae2052147d8 100644
--- a/entity/Member_entity/recordcontainers/jdito/contentProcess.js
+++ b/entity/Member_entity/recordcontainers/jdito/contentProcess.js
@@ -1,3 +1,4 @@
+import("Util_lib");
 import("system.translate");
 import("system.result");
 import("system.vars");
@@ -29,33 +30,6 @@ if (filter && filter.filter != null)
 }
 
 var memberRows = entities.getRows(memberLoadingConfig);
-
-if (vars.get("$param.ObjectType_param") == "Salesproject" && vars.get("$param.ObjectRowId_param") != null)
-{
-    var orgContactId = newSelect("SALESPROJECT.CONTACT_ID")
-                        .from("SALESPROJECT")
-                        .where("SALESPROJECT.SALESPROJECTID", "$param.ObjectRowId_param")
-                        .cell();
-    
-    var districtLoadingConfig = entities.createConfigForLoadingRows()
-                                            .entity("DistrictResponsible_entity")
-                                            .provider("OrganisationResponsibles")
-                                            .addParameter("OrgUid_param", orgContactId)
-                                            .fields(["#UID","DISTRICTRESPONSIBLEID", "DISTRICT_ID", "EMPLOYEE_CONTACT_ID", 
-                                                        "EMPLOYEE_CONTACT_ID.displayValue", "USER_EDIT", "USER_NEW", 
-                                                        "departmentAttributeName", "DATE_EDIT", "DATE_NEW"]);
-    
-    var districtRows = entities.getRows(districtLoadingConfig);
-    
-    
-    districtRows = districtRows.map(function(row)
-    {
-        return [row["#UID"], row["DISTRICTRESPONSIBLEID"], row["DISTRICT_ID"], row["EMPLOYEE_CONTACT_ID"], row["EMPLOYEE_CONTACT_ID.displayValue"], 
-            row["USER_EDIT"], row["USER_NEW"], row["departmentAttributeName"], row["DATE_EDIT"], row["DATE_NEW"]];
-    });
-}
-
-
 memberRows = memberRows.map(function(row)
 {
     return [row["#UID"], row["OBJECTMEMBERID"], row["CONTACT_ID"], row["CONTACT_ID.displayValue"], row["CONTACTROLE"], row["DEPARTMENT"], row["ICON"],
@@ -65,54 +39,82 @@ memberRows = memberRows.map(function(row)
                 row["POSITION"], row["TARGETCONTEXT"], row["recordType"]];
 });
 
-var responsibleUids = [];
+if (Utils.isNullOrEmpty(idValues) || memberRows.length === 0)
+{
+    if (vars.get("$param.ObjectType_param") == "Salesproject" && vars.get("$param.ObjectRowId_param") != null)
+    {
+        var orgContactId = newSelect("SALESPROJECT.CONTACT_ID")
+                            .from("SALESPROJECT")
+                            .where("SALESPROJECT.SALESPROJECTID", "$param.ObjectRowId_param")
+                            .cell();
 
-districtRows.forEach(function(row){
-    responsibleUids.push(row[3]);
-});
+        var districtLoadingConfig = entities.createConfigForLoadingRows()
+                                                .entity("DistrictResponsible_entity")
+                                                .provider("OrganisationResponsibles")
+                                                .addParameter("OrgUid_param", orgContactId)
+                                                .fields(["#UID","DISTRICTRESPONSIBLEID", "DISTRICT_ID", "EMPLOYEE_CONTACT_ID", 
+                                                            "EMPLOYEE_CONTACT_ID.displayValue", "USER_EDIT", "USER_NEW", 
+                                                            "departmentAttributeName", "DATE_EDIT", "DATE_NEW"]);
 
-var loadingConfPers = entities.createConfigForLoadingRows()
-                                    .entity("Person_entity")
-                                    .uids(responsibleUids)
-                                    .fields(["ORGANISATION_ID", "ORGANISATION_NAME", "CONTACTROLE", "POSITION", 
-                                                "FIRSTNAME", "LASTNAME", "SALUTATION", "TITLE"]);
+        var districtRows = entities.getRows(districtLoadingConfig);
 
-var persRows = entities.getRows(loadingConfPers);
 
-persRows = persRows.map(function(row){
-    return [row["SALUTATION"], row["TITLE"], row["FIRSTNAME"], row["LASTNAME"],
-                row["ORGANISATION_NAME"], row["ORGANISATION_ID"], row["CONTACTROLE"],
-                row["POSITION"], row["PERSONID"]];
-});
+        districtRows = districtRows.map(function(row)
+        {
+            return [row["#UID"], row["DISTRICTRESPONSIBLEID"], row["DISTRICT_ID"], row["EMPLOYEE_CONTACT_ID"], row["EMPLOYEE_CONTACT_ID.displayValue"], 
+                row["USER_EDIT"], row["USER_NEW"], row["departmentAttributeName"], row["DATE_EDIT"], row["DATE_NEW"]];
+        });
+    }
 
+    var responsibleUids = [];
 
-districtRows.forEach(function(row, counter){
-    
-    memberRows.push(
-        [row[0],
-        null,
-        row[3],
-        row[4],
-        persRows[counter][6],
-        row[7],
-        "VAADIN:GLOBE",
-        "TEXT:" + row[4].substring(row[4].indexOf(" ", 0)+1, row[4].length),
-        "MEMBERROLEDISTRICTRESPONSIBLE",
-        translate.text("District Responsible"),
-        vars.get("$param.ObjectRowId_param"),
-        vars.get("$param.ObjectType_param"),
-        persRows[counter][5],
-        persRows[counter][4],
-        persRows[counter][2],
-        row[4],
-        persRows[counter][3], 
-        persRows[counter][8], 
-        persRows[counter][0], 
-        persRows[counter][1], 
-        persRows[counter][7],
-        null, 
-        "DistrictResponsible"
-    ]);
-});
+    districtRows.forEach(function(row){
+        responsibleUids.push(row[3]);
+    });
+
+    var loadingConfPers = entities.createConfigForLoadingRows()
+                                        .entity("Person_entity")
+                                        .uids(responsibleUids)
+                                        .fields(["ORGANISATION_ID", "ORGANISATION_NAME", "CONTACTROLE", "POSITION", 
+                                                    "FIRSTNAME", "LASTNAME", "SALUTATION", "TITLE"]);
+
+    var persRows = entities.getRows(loadingConfPers);
+
+    persRows = persRows.map(function(row){
+        return [row["SALUTATION"], row["TITLE"], row["FIRSTNAME"], row["LASTNAME"],
+                    row["ORGANISATION_NAME"], row["ORGANISATION_ID"], row["CONTACTROLE"],
+                    row["POSITION"], row["PERSONID"]];
+    });
+
+
+    districtRows.forEach(function(row, counter){
+
+        memberRows.push(
+            [row[0],
+            null,
+            row[3],
+            row[4],
+            persRows[counter][6],
+            row[7],
+            "VAADIN:GLOBE",
+            "TEXT:" + row[4].substring(row[4].indexOf(" ", 0)+1, row[4].length),
+            "MEMBERROLEDISTRICTRESPONSIBLE",
+            translate.text("District Responsible"),
+            vars.get("$param.ObjectRowId_param"),
+            vars.get("$param.ObjectType_param"),
+            persRows[counter][5],
+            persRows[counter][4],
+            persRows[counter][2],
+            row[4],
+            persRows[counter][3], 
+            persRows[counter][8], 
+            persRows[counter][0], 
+            persRows[counter][1], 
+            persRows[counter][7],
+            null, 
+            "DistrictResponsible"
+        ]);
+    });
+}
 
 result.object(memberRows);
\ No newline at end of file
diff --git a/process/MSTeams_lib/process.js b/process/MSTeams_lib/process.js
index a5f2d3006c1..080da03c940 100644
--- a/process/MSTeams_lib/process.js
+++ b/process/MSTeams_lib/process.js
@@ -37,8 +37,12 @@ MSTeamsUtils.getTeamLinkContexts = function ()
 MSTeamsUtils.createTeamLink = function (pTeamId, pRowId, pObjectType)
 {
     var currentTeamLinkId;
+    var contextConfig = MSTeamsUtils.getTeamLinkContexts()[pObjectType];
+    if (!contextConfig)
+        return;
+    
     //if singleLinkPerObject is true, only one team link can be created for the given objectRowId
-    if (MSTeamsUtils.getTeamLinkContexts()[pObjectType].singleLinkPerObject)
+    if (contextConfig.singleLinkPerObject)
     {
         currentTeamLinkId = newSelect("MST_TEAMLINKID")
             .from("MST_TEAMLINK")
-- 
GitLab


From 4e3545a494c13ebfd7d0ac7d52f0ff994a1859bc Mon Sep 17 00:00:00 2001
From: Sebastian Listl <s.listl@adito.de>
Date: Wed, 11 Nov 2020 16:04:31 +0100
Subject: [PATCH 076/184] Knowledgemanagement liquibase files moved

---
 .../Knowledgemanagement/changelog_knowledgeManagement.xml        | 0
 .../basic/{ => 2020.2.2}/Knowledgemanagement/data/blobs/git.css  | 0
 .../{ => 2020.2.2}/Knowledgemanagement/data/blobs/standard.css   | 0
 .../Knowledgemanagement/data/knowledgeKeywords.xml               | 0
 .../{ => 2020.2.2}/Knowledgemanagement/data/knowledgeTag.xml     | 0
 .../Knowledgemanagement/struct/create_KnowledgeRoles.xml         | 0
 .../Knowledgemanagement/struct/knowledgeDiscussion_table.xml     | 0
 .../Knowledgemanagement/struct/knowledgeGitInterface_table.xml   | 0
 .../Knowledgemanagement/struct/knowledgeLink_table.xml           | 0
 .../Knowledgemanagement/struct/knowledgeManagement_table.xml     | 0
 .../Knowledgemanagement/struct/knowledgeTagLink_table.xml        | 0
 .../Knowledgemanagement/struct/knowledgeTagModeration_table.xml  | 0
 .../Knowledgemanagement/struct/knowledgeTag_table.xml            | 0
 .liquibase/Data_alias/basic/2020.2.2/changelog.xml               | 1 +
 14 files changed, 1 insertion(+)
 rename .liquibase/Data_alias/basic/{ => 2020.2.2}/Knowledgemanagement/changelog_knowledgeManagement.xml (100%)
 rename .liquibase/Data_alias/basic/{ => 2020.2.2}/Knowledgemanagement/data/blobs/git.css (100%)
 rename .liquibase/Data_alias/basic/{ => 2020.2.2}/Knowledgemanagement/data/blobs/standard.css (100%)
 rename .liquibase/Data_alias/basic/{ => 2020.2.2}/Knowledgemanagement/data/knowledgeKeywords.xml (100%)
 rename .liquibase/Data_alias/basic/{ => 2020.2.2}/Knowledgemanagement/data/knowledgeTag.xml (100%)
 rename .liquibase/Data_alias/basic/{ => 2020.2.2}/Knowledgemanagement/struct/create_KnowledgeRoles.xml (100%)
 rename .liquibase/Data_alias/basic/{ => 2020.2.2}/Knowledgemanagement/struct/knowledgeDiscussion_table.xml (100%)
 rename .liquibase/Data_alias/basic/{ => 2020.2.2}/Knowledgemanagement/struct/knowledgeGitInterface_table.xml (100%)
 rename .liquibase/Data_alias/basic/{ => 2020.2.2}/Knowledgemanagement/struct/knowledgeLink_table.xml (100%)
 rename .liquibase/Data_alias/basic/{ => 2020.2.2}/Knowledgemanagement/struct/knowledgeManagement_table.xml (100%)
 rename .liquibase/Data_alias/basic/{ => 2020.2.2}/Knowledgemanagement/struct/knowledgeTagLink_table.xml (100%)
 rename .liquibase/Data_alias/basic/{ => 2020.2.2}/Knowledgemanagement/struct/knowledgeTagModeration_table.xml (100%)
 rename .liquibase/Data_alias/basic/{ => 2020.2.2}/Knowledgemanagement/struct/knowledgeTag_table.xml (100%)

diff --git a/.liquibase/Data_alias/basic/Knowledgemanagement/changelog_knowledgeManagement.xml b/.liquibase/Data_alias/basic/2020.2.2/Knowledgemanagement/changelog_knowledgeManagement.xml
similarity index 100%
rename from .liquibase/Data_alias/basic/Knowledgemanagement/changelog_knowledgeManagement.xml
rename to .liquibase/Data_alias/basic/2020.2.2/Knowledgemanagement/changelog_knowledgeManagement.xml
diff --git a/.liquibase/Data_alias/basic/Knowledgemanagement/data/blobs/git.css b/.liquibase/Data_alias/basic/2020.2.2/Knowledgemanagement/data/blobs/git.css
similarity index 100%
rename from .liquibase/Data_alias/basic/Knowledgemanagement/data/blobs/git.css
rename to .liquibase/Data_alias/basic/2020.2.2/Knowledgemanagement/data/blobs/git.css
diff --git a/.liquibase/Data_alias/basic/Knowledgemanagement/data/blobs/standard.css b/.liquibase/Data_alias/basic/2020.2.2/Knowledgemanagement/data/blobs/standard.css
similarity index 100%
rename from .liquibase/Data_alias/basic/Knowledgemanagement/data/blobs/standard.css
rename to .liquibase/Data_alias/basic/2020.2.2/Knowledgemanagement/data/blobs/standard.css
diff --git a/.liquibase/Data_alias/basic/Knowledgemanagement/data/knowledgeKeywords.xml b/.liquibase/Data_alias/basic/2020.2.2/Knowledgemanagement/data/knowledgeKeywords.xml
similarity index 100%
rename from .liquibase/Data_alias/basic/Knowledgemanagement/data/knowledgeKeywords.xml
rename to .liquibase/Data_alias/basic/2020.2.2/Knowledgemanagement/data/knowledgeKeywords.xml
diff --git a/.liquibase/Data_alias/basic/Knowledgemanagement/data/knowledgeTag.xml b/.liquibase/Data_alias/basic/2020.2.2/Knowledgemanagement/data/knowledgeTag.xml
similarity index 100%
rename from .liquibase/Data_alias/basic/Knowledgemanagement/data/knowledgeTag.xml
rename to .liquibase/Data_alias/basic/2020.2.2/Knowledgemanagement/data/knowledgeTag.xml
diff --git a/.liquibase/Data_alias/basic/Knowledgemanagement/struct/create_KnowledgeRoles.xml b/.liquibase/Data_alias/basic/2020.2.2/Knowledgemanagement/struct/create_KnowledgeRoles.xml
similarity index 100%
rename from .liquibase/Data_alias/basic/Knowledgemanagement/struct/create_KnowledgeRoles.xml
rename to .liquibase/Data_alias/basic/2020.2.2/Knowledgemanagement/struct/create_KnowledgeRoles.xml
diff --git a/.liquibase/Data_alias/basic/Knowledgemanagement/struct/knowledgeDiscussion_table.xml b/.liquibase/Data_alias/basic/2020.2.2/Knowledgemanagement/struct/knowledgeDiscussion_table.xml
similarity index 100%
rename from .liquibase/Data_alias/basic/Knowledgemanagement/struct/knowledgeDiscussion_table.xml
rename to .liquibase/Data_alias/basic/2020.2.2/Knowledgemanagement/struct/knowledgeDiscussion_table.xml
diff --git a/.liquibase/Data_alias/basic/Knowledgemanagement/struct/knowledgeGitInterface_table.xml b/.liquibase/Data_alias/basic/2020.2.2/Knowledgemanagement/struct/knowledgeGitInterface_table.xml
similarity index 100%
rename from .liquibase/Data_alias/basic/Knowledgemanagement/struct/knowledgeGitInterface_table.xml
rename to .liquibase/Data_alias/basic/2020.2.2/Knowledgemanagement/struct/knowledgeGitInterface_table.xml
diff --git a/.liquibase/Data_alias/basic/Knowledgemanagement/struct/knowledgeLink_table.xml b/.liquibase/Data_alias/basic/2020.2.2/Knowledgemanagement/struct/knowledgeLink_table.xml
similarity index 100%
rename from .liquibase/Data_alias/basic/Knowledgemanagement/struct/knowledgeLink_table.xml
rename to .liquibase/Data_alias/basic/2020.2.2/Knowledgemanagement/struct/knowledgeLink_table.xml
diff --git a/.liquibase/Data_alias/basic/Knowledgemanagement/struct/knowledgeManagement_table.xml b/.liquibase/Data_alias/basic/2020.2.2/Knowledgemanagement/struct/knowledgeManagement_table.xml
similarity index 100%
rename from .liquibase/Data_alias/basic/Knowledgemanagement/struct/knowledgeManagement_table.xml
rename to .liquibase/Data_alias/basic/2020.2.2/Knowledgemanagement/struct/knowledgeManagement_table.xml
diff --git a/.liquibase/Data_alias/basic/Knowledgemanagement/struct/knowledgeTagLink_table.xml b/.liquibase/Data_alias/basic/2020.2.2/Knowledgemanagement/struct/knowledgeTagLink_table.xml
similarity index 100%
rename from .liquibase/Data_alias/basic/Knowledgemanagement/struct/knowledgeTagLink_table.xml
rename to .liquibase/Data_alias/basic/2020.2.2/Knowledgemanagement/struct/knowledgeTagLink_table.xml
diff --git a/.liquibase/Data_alias/basic/Knowledgemanagement/struct/knowledgeTagModeration_table.xml b/.liquibase/Data_alias/basic/2020.2.2/Knowledgemanagement/struct/knowledgeTagModeration_table.xml
similarity index 100%
rename from .liquibase/Data_alias/basic/Knowledgemanagement/struct/knowledgeTagModeration_table.xml
rename to .liquibase/Data_alias/basic/2020.2.2/Knowledgemanagement/struct/knowledgeTagModeration_table.xml
diff --git a/.liquibase/Data_alias/basic/Knowledgemanagement/struct/knowledgeTag_table.xml b/.liquibase/Data_alias/basic/2020.2.2/Knowledgemanagement/struct/knowledgeTag_table.xml
similarity index 100%
rename from .liquibase/Data_alias/basic/Knowledgemanagement/struct/knowledgeTag_table.xml
rename to .liquibase/Data_alias/basic/2020.2.2/Knowledgemanagement/struct/knowledgeTag_table.xml
diff --git a/.liquibase/Data_alias/basic/2020.2.2/changelog.xml b/.liquibase/Data_alias/basic/2020.2.2/changelog.xml
index c4de83cc615..d2c30058760 100644
--- a/.liquibase/Data_alias/basic/2020.2.2/changelog.xml
+++ b/.liquibase/Data_alias/basic/2020.2.2/changelog.xml
@@ -2,4 +2,5 @@
 <databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
                    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd">
     <include relativeToChangelogFile="true" file="insert_commMediumTitleKeywordAttribute.xml"/>
+    <include relativeToChangelogFile="true" file="Knowledgemanagement/changelog_knowledgeManagement.xml"/>
 </databaseChangeLog>
-- 
GitLab


From 85f09a6a1b45adaf67db60a4a34ab6a1914baae9 Mon Sep 17 00:00:00 2001
From: Sebastian Listl <s.listl@adito.de>
Date: Thu, 12 Nov 2020 11:24:02 +0100
Subject: [PATCH 077/184] Knowledgemanagement sql refactoring with SqlBuilder

---
 .liquibase/Data_alias/changelog.xml           |  2 -
 .../KnowledgeDiscussion_entity.aod            | 11 ++--
 .../KnowledgeDiscussion_entity/afterUiInit.js |  4 +-
 .../parentid_param/valueProcess.js            |  4 --
 .../rowCountProcess.js                        |  2 -
 .../recordcontainers/db/conditionProcess.js   | 14 ++---
 .../entityfields/tag/displayValueProcess.js   |  2 +-
 .../author_contact_id/displayValueProcess.js  | 12 ++--
 .../entityfields/date_edit/valueProcess.js    |  8 +--
 .../entityfields/isnewsmark/valueProcess.js   | 27 ++-------
 .../displayValueProcess.js                    | 14 +++--
 .../recordcontainers/db/conditionProcess.js   | 15 ++---
 .../tagfilter/filterConditionProcess.js       | 45 ++++----------
 .../tagfilter/filterValuesProcess.js          |  6 +-
 .../recordcontainers/db/orderClauseProcess.js |  8 ++-
 .../expression.js                             | 11 ++--
 .../knowledgeroles/filterConditionProcess.js  |  7 ++-
 .../expression.js                             | 11 ++--
 .../indexsearchknowledgebase/affectedIds.js   |  2 +-
 .../indexsearchknowledgebase/query.js         | 60 ++++++++-----------
 process/KnowledgeManagement_lib/process.js    | 51 ++++++----------
 process/NewsSystem_lib/process.js             | 12 ++--
 22 files changed, 127 insertions(+), 201 deletions(-)
 delete mode 100644 entity/KnowledgeDiscussion_entity/entityfields/parentid_param/valueProcess.js

diff --git a/.liquibase/Data_alias/changelog.xml b/.liquibase/Data_alias/changelog.xml
index 23b0846d0d6..3f25ca1dbb1 100644
--- a/.liquibase/Data_alias/changelog.xml
+++ b/.liquibase/Data_alias/changelog.xml
@@ -18,8 +18,6 @@
     <include relativeToChangelogFile="true" file="basic/2020.2.0/changelog.xml"/>
     <include relativeToChangelogFile="true" file="basic/2020.2.1/changelog.xml"/>
     <include relativeToChangelogFile="true" file="basic/2020.2.2/changelog.xml"/>
-    
-    <include relativeToChangelogFile="true" file="basic/Knowledgemanagement/changelog_knowledgeManagement.xml"/>
 
     <!--enable this only when you definetly want to overwrite the existing data with demo records:-->
     <!--<include relativeToChangelogFile="true" file="basic/_demoData/changelog.xml" context="example"/>-->
diff --git a/entity/KnowledgeDiscussion_entity/KnowledgeDiscussion_entity.aod b/entity/KnowledgeDiscussion_entity/KnowledgeDiscussion_entity.aod
index 0c7fab8b6d8..c30b50ef07a 100644
--- a/entity/KnowledgeDiscussion_entity/KnowledgeDiscussion_entity.aod
+++ b/entity/KnowledgeDiscussion_entity/KnowledgeDiscussion_entity.aod
@@ -61,11 +61,6 @@
     </entityField>
     <entityConsumer>
       <name>StatusKeyword</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>KeywordEntry_entity</entityName>
-        <fieldName>SpecificContainerKeywords</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
@@ -76,6 +71,11 @@
           <valueProcess>%aditoprj%/entity/KnowledgeDiscussion_entity/entityfields/statuskeyword/children/onlyactives_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>SpecificContainerKeywords</fieldName>
+      </dependency>
     </entityConsumer>
     <entityProvider>
       <name>ByKnowledgeId</name>
@@ -128,7 +128,6 @@
     </entityActionGroup>
     <entityParameter>
       <name>ParentId_param</name>
-      <valueProcess>%aditoprj%/entity/KnowledgeDiscussion_entity/entityfields/parentid_param/valueProcess.js</valueProcess>
       <expose v="true" />
     </entityParameter>
     <entityParameter>
diff --git a/entity/KnowledgeDiscussion_entity/afterUiInit.js b/entity/KnowledgeDiscussion_entity/afterUiInit.js
index 2b7ba120e62..4c6bf685556 100644
--- a/entity/KnowledgeDiscussion_entity/afterUiInit.js
+++ b/entity/KnowledgeDiscussion_entity/afterUiInit.js
@@ -2,6 +2,4 @@ import("system.vars");
 import("system.neon");
 
 if(vars.exists("$param.WithClosed_param") && vars.get("$param.WithClosed_param"))
-    vars.set("$context.showAll", vars.get("$param.WithClosed_param"))
-//else if(!vars.exists("$context.showAll")) 
-//        vars.set("$context.showAll", "false");
\ No newline at end of file
+    vars.set("$context.showAll", vars.get("$param.WithClosed_param"))
\ No newline at end of file
diff --git a/entity/KnowledgeDiscussion_entity/entityfields/parentid_param/valueProcess.js b/entity/KnowledgeDiscussion_entity/entityfields/parentid_param/valueProcess.js
deleted file mode 100644
index ed69697cc20..00000000000
--- a/entity/KnowledgeDiscussion_entity/entityfields/parentid_param/valueProcess.js
+++ /dev/null
@@ -1,4 +0,0 @@
-//import("system.vars");
-//import("system.result");
-
-//result.string(vars.exists("$sys.selection") && vars.get("$sys.selection"));
\ No newline at end of file
diff --git a/entity/KnowledgeDiscussion_entity/recordcontainers/jdito_knowledgediscussioncontainer/rowCountProcess.js b/entity/KnowledgeDiscussion_entity/recordcontainers/jdito_knowledgediscussioncontainer/rowCountProcess.js
index 4f9f77ea5e4..48a39b7f7de 100644
--- a/entity/KnowledgeDiscussion_entity/recordcontainers/jdito_knowledgediscussioncontainer/rowCountProcess.js
+++ b/entity/KnowledgeDiscussion_entity/recordcontainers/jdito_knowledgediscussioncontainer/rowCountProcess.js
@@ -1,4 +1,3 @@
-import("system.logging");
 import("KnowledgeManagement_lib");
 import("system.vars");
 import("system.result");
@@ -20,6 +19,5 @@ if(kId)
 {
     var discussions = KnowledgeDiscussion.getInstance(kId);    
     var retData = discussions.getDatasetCount(KnowledgeDiscussion.getMode(withClosed), idValues);
-    //logging.log("DATA: " + JSON.stringify([retData,idValues],null,"\t"));
     result.object(retData);
 }
\ No newline at end of file
diff --git a/entity/KnowledgeLink_entity/recordcontainers/db/conditionProcess.js b/entity/KnowledgeLink_entity/recordcontainers/db/conditionProcess.js
index 3adf64f1274..ba94f4a6e34 100644
--- a/entity/KnowledgeLink_entity/recordcontainers/db/conditionProcess.js
+++ b/entity/KnowledgeLink_entity/recordcontainers/db/conditionProcess.js
@@ -1,16 +1,10 @@
+import("Sql_lib");
 import("system.vars");
 import("system.result");
 
-var id = (vars.exists("$param.KnowledgeManagementId_param")) ? vars.get("$param.KnowledgeManagementId_param") : null;
 var localId = (vars.exists("$local.idvalue")) ? vars.get("$local.idvalue") : null;
 
+var cond = newWhereIfSet("KNOWLEDGELINK.KNOWLEDGEMANAGEMENT_ID", "$param.KnowledgeManagementId_param")
+    .andIfSet("KNOWLEDGELINK.KNOWLEDGELINKID", localId);
 
-var cond = "";
-cond += (id) ? "KNOWLEDGEMANAGEMENT_ID = '" + id + "'" : "";
-cond += (cond.length && localId) ? " and " : "";
-cond += (localId) ? "KNOWLEDGELINKID = '" + localId + "'" : "";
-
-if(cond.length)
-    result.string(cond);
-else
-    result.string("1=2");
\ No newline at end of file
+result.string(cond.toString(SqlBuilder.NORESULT_CONDITION()));
\ No newline at end of file
diff --git a/entity/KnowledgeManagementTags_entity/entityfields/tag/displayValueProcess.js b/entity/KnowledgeManagementTags_entity/entityfields/tag/displayValueProcess.js
index 674ac1a4a17..26d516e5a81 100644
--- a/entity/KnowledgeManagementTags_entity/entityfields/tag/displayValueProcess.js
+++ b/entity/KnowledgeManagementTags_entity/entityfields/tag/displayValueProcess.js
@@ -2,4 +2,4 @@ import("system.vars");
 import("system.result");
 import("Sql_lib");
 
-result.string(new SqlBuilder().select("TAG").from("KNOWLEDGETAG").where("KNOWLEDGETAGID = '" + vars.get("$field.TAG") + "'").cell());
\ No newline at end of file
+result.string(new SqlBuilder().select("TAG").from("KNOWLEDGETAG").where("KNOWLEDGETAG.KNOWLEDGETAGID", "$field.TAG").cell());
\ No newline at end of file
diff --git a/entity/KnowledgeManagement_entity/entityfields/author_contact_id/displayValueProcess.js b/entity/KnowledgeManagement_entity/entityfields/author_contact_id/displayValueProcess.js
index 0929d5fdbe0..ec6e27b3d07 100644
--- a/entity/KnowledgeManagement_entity/entityfields/author_contact_id/displayValueProcess.js
+++ b/entity/KnowledgeManagement_entity/entityfields/author_contact_id/displayValueProcess.js
@@ -4,7 +4,11 @@ import("system.vars");
 import("system.result");
 
 if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && vars.get("$this.value"))
-    result.query("select " + new SqlMaskingUtils().concat(["PERSON.FIRSTNAME","PERSON.LASTNAME"], " ", true)
-             +" from PERSON "
-             +" join CONTACT on PERSON.PERSONID = CONTACT.PERSON_ID "
-             +" where CONTACT.CONTACTID = '" + vars.get("$this.value") + "'");
\ No newline at end of file
+{
+    result.string(newSelect(new SqlMaskingUtils().concatWithSeparator(["PERSON.FIRSTNAME","PERSON.LASTNAME"]))
+        .from("PERSON")
+        .join("CONTACT", "PERSON.PERSONID = CONTACT.PERSON_ID")
+        .where("CONTACT.CONTACTID", "$this.value")
+        .cell()
+    );
+}
\ No newline at end of file
diff --git a/entity/KnowledgeManagement_entity/entityfields/date_edit/valueProcess.js b/entity/KnowledgeManagement_entity/entityfields/date_edit/valueProcess.js
index 6942583568e..f3fbb8b9401 100644
--- a/entity/KnowledgeManagement_entity/entityfields/date_edit/valueProcess.js
+++ b/entity/KnowledgeManagement_entity/entityfields/date_edit/valueProcess.js
@@ -1,12 +1,6 @@
 import("system.vars");
 import("system.result");
 import("system.neon");
-import("system.datetime");
 
-//if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_EDIT)
-//{
-//    result.string(datetime.date());
-//}
-
-if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_EDIT)
+if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_EDIT)
     result.string(vars.get("$sys.date"));
\ No newline at end of file
diff --git a/entity/KnowledgeManagement_entity/entityfields/isnewsmark/valueProcess.js b/entity/KnowledgeManagement_entity/entityfields/isnewsmark/valueProcess.js
index a7273ea0f5d..eff63fa32ee 100644
--- a/entity/KnowledgeManagement_entity/entityfields/isnewsmark/valueProcess.js
+++ b/entity/KnowledgeManagement_entity/entityfields/isnewsmark/valueProcess.js
@@ -5,31 +5,14 @@ import("Sql_lib");
 
 if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_EDIT && !vars.getString("$this.value"))
 {
-//    var config = entities.createConfigForLoadingConsumerRows()
-//        .consumer("TagsByKnowledgeId")
-//        .fields(["TAG"])
-//    
-//    var entityData = entities.getRows(config);
     var knowledgeId = vars.get("$field.KNOWLEDGEMANAGEMENTID");
     
     var isTagSet = newSelect("'1'")
-                    .from("KNOWLEDGETAGLINK")
-                    .join("KNOWLEDGETAG on KNOWLEDGETAG.KNOWLEDGETAGID = KNOWLEDGETAGLINK.KNOWLEDGETAG_ID")
-                    .where("KNOWLEDGETAGLINK.KNOWLEDGEMANAGEMENT_ID  = '" + knowledgeId + "'")
-                    .and("KNOWLEDGETAG.TAG = 'News'")
-                    .cell();
+        .from("KNOWLEDGETAGLINK")
+        .join("KNOWLEDGETAG", "KNOWLEDGETAG.KNOWLEDGETAGID = KNOWLEDGETAGLINK.KNOWLEDGETAG_ID")
+        .where("KNOWLEDGETAGLINK.KNOWLEDGEMANAGEMENT_ID", knowledgeId)
+        .and("KNOWLEDGETAG.TAG", "News")
+        .cell();
     
-    
-//    if(entityData)
-//    {
-//        entityData.map(function(row)
-//        {
-//            if(row["TAG.displayValue"] == "News")
-//            {
-//                isTagSet = 1;
-//                return;
-//            }
-//        });
-//    }
     result.string(isTagSet ? 1 : 0);
 }
\ No newline at end of file
diff --git a/entity/KnowledgeManagement_entity/entityfields/responsible_contact_id/displayValueProcess.js b/entity/KnowledgeManagement_entity/entityfields/responsible_contact_id/displayValueProcess.js
index 7ffc6898e2e..ec6e27b3d07 100644
--- a/entity/KnowledgeManagement_entity/entityfields/responsible_contact_id/displayValueProcess.js
+++ b/entity/KnowledgeManagement_entity/entityfields/responsible_contact_id/displayValueProcess.js
@@ -3,10 +3,12 @@ import("system.neon");
 import("system.vars");
 import("system.result");
 
-var x = 0;
-
 if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && vars.get("$this.value"))
-    result.query("select " + new SqlMaskingUtils().concat(["PERSON.FIRSTNAME","PERSON.LASTNAME"], " ", true)
-             +" from PERSON "
-             +" join CONTACT on PERSON.PERSONID = CONTACT.PERSON_ID "
-             +" where CONTACT.CONTACTID = '" + vars.get("$this.value") + "'");
\ No newline at end of file
+{
+    result.string(newSelect(new SqlMaskingUtils().concatWithSeparator(["PERSON.FIRSTNAME","PERSON.LASTNAME"]))
+        .from("PERSON")
+        .join("CONTACT", "PERSON.PERSONID = CONTACT.PERSON_ID")
+        .where("CONTACT.CONTACTID", "$this.value")
+        .cell()
+    );
+}
\ No newline at end of file
diff --git a/entity/KnowledgeManagement_entity/recordcontainers/db/conditionProcess.js b/entity/KnowledgeManagement_entity/recordcontainers/db/conditionProcess.js
index 8f2514f13ee..c25c12a3103 100644
--- a/entity/KnowledgeManagement_entity/recordcontainers/db/conditionProcess.js
+++ b/entity/KnowledgeManagement_entity/recordcontainers/db/conditionProcess.js
@@ -5,16 +5,12 @@ import("system.vars");
 import("system.tools");
 import("system.result");
 
-//var cond = ["knowledgemanagement.TYPE != '3'"]
-//if(tools.hasRole(vars.get("$sys.user"), "PROJECT_Support"))
-//    cond.push("knowledgemanagement.PUBLISH in ('2','3')");
-
-var cond = [];
+var cond = newWhere();
 
 if(vars.exists("$param.isDashlet_param") && vars.get("$param.isDashlet_param")) //check if the parameter exists and is filled
 {
     var userRoles = tools.getRoles(vars.get("$sys.user")); //get all Roles from the current User
-    var res = newWhere(null //create a new condition where we check if any data sets exists with the given parameters
+    cond.and(null //create a new condition where we check if any data sets exists with the given parameters
         ,newSelect("KNOWLEDGEROLES.ROLENAME") //create a subselect for all data sets with the current user roles
         .from("KNOWLEDGEROLES")
         .where("KNOWLEDGEROLES.KNOWLEDGEMANAGEMENT_ID = KNOWLEDGEMANAGEMENT.KNOWLEDGEMANAGEMENTID")
@@ -23,10 +19,7 @@ if(vars.exists("$param.isDashlet_param") && vars.get("$param.isDashlet_param"))
         ,newSelect("KNOWLEDGETAGLINK.KNOWLEDGETAGLINKID")
         .from("KNOWLEDGETAGLINK")
         .where("KNOWLEDGETAGLINK.KNOWLEDGEMANAGEMENT_ID = KNOWLEDGEMANAGEMENT.KNOWLEDGEMANAGEMENTID")
-        .and("KNOWLEDGETAGLINK.KNOWLEDGETAG_ID", "1f035a33-e5a3-48e4-bda6-6d8b320177e4"), SqlBuilder.EXISTS())
-    .build();
-            
-    cond.push(SqlUtils.translateConditionWithQuotes(res)); //db RecordContainer can't use preparedStatements
+        .and("KNOWLEDGETAGLINK.KNOWLEDGETAG_ID", "1f035a33-e5a3-48e4-bda6-6d8b320177e4"), SqlBuilder.EXISTS());
 }
 
-result.string(cond.join(" and "))
\ No newline at end of file
+result.string(cond.toString());
\ No newline at end of file
diff --git a/entity/KnowledgeManagement_entity/recordcontainers/db/filterextensions/tagfilter/filterConditionProcess.js b/entity/KnowledgeManagement_entity/recordcontainers/db/filterextensions/tagfilter/filterConditionProcess.js
index 4c0d2b4fae7..446c4299313 100644
--- a/entity/KnowledgeManagement_entity/recordcontainers/db/filterextensions/tagfilter/filterConditionProcess.js
+++ b/entity/KnowledgeManagement_entity/recordcontainers/db/filterextensions/tagfilter/filterConditionProcess.js
@@ -1,44 +1,25 @@
+import("Sql_lib");
 import("system.result");
 import("system.vars");
 
-var op = vars.get("$local.comparison");
-var val = vars.get("$local.rawvalue");
+var condition = newWhere();
+var tagLinkSql = newSelect("KNOWLEDGEMANAGEMENT_ID")
+    .from("KNOWLEDGETAGLINK")
+    .where("KNOWLEDGETAGLINK.KNOWLEDGEMANAGEMENT_ID = KNOWLEDGEMANAGEMENT.KNOWLEDGEMANAGEMENTID");
+var condType = SqlBuilder.EXISTS();
 
-var condition = "";
-
-switch(op)
+switch (vars.get("$local.comparison"))
 {
-    case "EQUAL":
-        condition = " KNOWLEDGEMANAGEMENTID in "
-                       + " (select KNOWLEDGEMANAGEMENT_ID "
-                           + "  from KNOWLEDGETAGLINK "
-                           + "  where KNOWLEDGETAG_ID = '" + val + "')";
-    break;
-    
     case "NOT_EQUAL":
-        condition = " KNOWLEDGEMANAGEMENTID not in "
-                        + " (select KNOWLEDGEMANAGEMENT_ID "
-                            + " from KNOWLEDGETAGLINK "
-                            + " where KNOWLEDGETAG_ID = '" + val + "')";
+        condType = SqlBuilder.NOT_EXISTS();
+    case "EQUAL":
+        condition.and(null, tagLinkSqll.and("KNOWLEDGETAGLINK.KNOWLEDGETAG_ID", "$local.rawvalue"), condType);
     break;
-    
     case "ISNULL":
-        condition = " not exists "
-                        + " (select KNOWLEDGEMANAGEMENT_ID "
-                            + " from KNOWLEDGETAGLINK "
-                            + " where KNOWLEDGETAGLINK.KNOWLEDGEMANAGEMENT_ID = KNOWLEDGEMANAGEMENT.KNOWLEDGEMANAGEMENTID)";
-    break;
-    
+        condType = SqlBuilder.NOT_EXISTS();
     case "ISNOTNULL":
-        condition = " exists "
-                        + " (select KNOWLEDGEMANAGEMENT_ID "
-                            + " from KNOWLEDGETAGLINK "
-                            + " where KNOWLEDGETAGLINK.KNOWLEDGEMANAGEMENT_ID = KNOWLEDGEMANAGEMENT.KNOWLEDGEMANAGEMENTID)";
+        condition.and(null, tagLinkSql, condType);
     break;
-    
-    default:
-        condition = " 1 = 2 ";
 }
 
-
-result.string(condition);
\ No newline at end of file
+result.string(condition.toString(SqlBuilder.NORESULT_CONDITION()));
\ No newline at end of file
diff --git a/entity/KnowledgeManagement_entity/recordcontainers/db/filterextensions/tagfilter/filterValuesProcess.js b/entity/KnowledgeManagement_entity/recordcontainers/db/filterextensions/tagfilter/filterValuesProcess.js
index 5ed258348a7..b2c2c7b07ef 100644
--- a/entity/KnowledgeManagement_entity/recordcontainers/db/filterextensions/tagfilter/filterValuesProcess.js
+++ b/entity/KnowledgeManagement_entity/recordcontainers/db/filterextensions/tagfilter/filterValuesProcess.js
@@ -1,6 +1,4 @@
-import("system.db");
+import("Sql_lib");
 import("system.result");
 
-result.object( 
-    db.table("select distinct KNOWLEDGETAGID, TAG from KNOWLEDGETAG order by TAG")
-);
\ No newline at end of file
+result.object(new SqlBuilder().selectDistinct(["KNOWLEDGETAGID", "TAG"]).from("KNOWLEDGETAG").orderBy("TAG").table());
\ No newline at end of file
diff --git a/entity/KnowledgeManagement_entity/recordcontainers/db/orderClauseProcess.js b/entity/KnowledgeManagement_entity/recordcontainers/db/orderClauseProcess.js
index 937b8f6eee3..bc51d2191bf 100644
--- a/entity/KnowledgeManagement_entity/recordcontainers/db/orderClauseProcess.js
+++ b/entity/KnowledgeManagement_entity/recordcontainers/db/orderClauseProcess.js
@@ -1,6 +1,8 @@
 import("system.db");
 import("system.result");
+import("Sql_lib");
 
-result.object({
-    "COALESCE(KNOWLEDGEMANAGEMENT.DATE_EDIT, KNOWLEDGEMANAGEMENT.DATE_NEW)": db.DESCENDING
-})
\ No newline at end of file
+var sortOrder = {};
+sortOrder[new SqlMaskingUtils().isNull("KNOWLEDGEMANAGEMENT.DATE_EDIT", "KNOWLEDGEMANAGEMENT.DATE_NEW")] = db.DESCENDING;
+
+result.object(sortOrder);
\ No newline at end of file
diff --git a/entity/KnowledgeManagement_entity/recordcontainers/db/recordfieldmappings/author_contact_id.displayvalue/expression.js b/entity/KnowledgeManagement_entity/recordcontainers/db/recordfieldmappings/author_contact_id.displayvalue/expression.js
index 3c7655ed448..4ed9cfc3749 100644
--- a/entity/KnowledgeManagement_entity/recordcontainers/db/recordfieldmappings/author_contact_id.displayvalue/expression.js
+++ b/entity/KnowledgeManagement_entity/recordcontainers/db/recordfieldmappings/author_contact_id.displayvalue/expression.js
@@ -1,7 +1,10 @@
 import("system.result");
 import("Sql_lib");
 
-result.string("select " + new SqlMaskingUtils().concat(["PERSON.FIRSTNAME","PERSON.LASTNAME"], " ", true)
-             +" from PERSON "
-             +" join CONTACT on PERSON.PERSONID = CONTACT.PERSON_ID "
-             +" where CONTACT.CONTACTID = KNOWLEDGEMANAGEMENT.AUTHOR_CONTACT_ID");
\ No newline at end of file
+result.string(
+    newSelect(new SqlMaskingUtils().concatWithSeparator(["PERSON.FIRSTNAME","PERSON.LASTNAME"]))
+        .from("PERSON")
+        .join("CONTACT", "PERSON.PERSONID = CONTACT.PERSON_ID")
+        .where("CONTACT.CONTACTID = KNOWLEDGEMANAGEMENT.AUTHOR_CONTACT_ID")
+        .toString()
+);
\ No newline at end of file
diff --git a/entity/KnowledgeManagement_entity/recordcontainers/db/recordfieldmappings/knowledgeroles/filterConditionProcess.js b/entity/KnowledgeManagement_entity/recordcontainers/db/recordfieldmappings/knowledgeroles/filterConditionProcess.js
index 75a22c1e5af..e518964b17a 100644
--- a/entity/KnowledgeManagement_entity/recordcontainers/db/recordfieldmappings/knowledgeroles/filterConditionProcess.js
+++ b/entity/KnowledgeManagement_entity/recordcontainers/db/recordfieldmappings/knowledgeroles/filterConditionProcess.js
@@ -1,4 +1,9 @@
+import("Sql_lib");
 import("system.vars");
 import("system.result");
 
-result.string("KNOWLEDGEMANAGEMENTID in (select KNOWLEDGEROLES.KNOWLEDGEMANAGEMENT_ID from KNOWLEDGEROLES where "  + vars.get("$local.condition") + " )");
\ No newline at end of file
+result.string(newWhere(null, newSelect("KNOWLEDGEROLES.KNOWLEDGEMANAGEMENT_ID")
+    .from("KNOWLEDGEROLES")
+    .where("KNOWLEDGEROLES.KNOWLEDGEMANAGEMENT_ID = KNOWLEDGEMANAGEMENTID")
+    .and(vars.get("$local.condition")), SqlBuilder.EXISTS())
+);
\ No newline at end of file
diff --git a/entity/KnowledgeManagement_entity/recordcontainers/db/recordfieldmappings/responsible_contact_id.displayvalue/expression.js b/entity/KnowledgeManagement_entity/recordcontainers/db/recordfieldmappings/responsible_contact_id.displayvalue/expression.js
index d56b5495f60..4ed9cfc3749 100644
--- a/entity/KnowledgeManagement_entity/recordcontainers/db/recordfieldmappings/responsible_contact_id.displayvalue/expression.js
+++ b/entity/KnowledgeManagement_entity/recordcontainers/db/recordfieldmappings/responsible_contact_id.displayvalue/expression.js
@@ -1,7 +1,10 @@
 import("system.result");
 import("Sql_lib");
 
-result.string("select " + new SqlMaskingUtils().concat(["PERSON.FIRSTNAME","PERSON.LASTNAME"], " ", true)
-             +" from PERSON "
-             +" join CONTACT on PERSON.PERSONID = CONTACT.PERSON_ID "
-             +" where CONTACT.CONTACTID = KNOWLEDGEMANAGEMENT.RESPONSIBLE_CONTACT_ID");
\ No newline at end of file
+result.string(
+    newSelect(new SqlMaskingUtils().concatWithSeparator(["PERSON.FIRSTNAME","PERSON.LASTNAME"]))
+        .from("PERSON")
+        .join("CONTACT", "PERSON.PERSONID = CONTACT.PERSON_ID")
+        .where("CONTACT.CONTACTID = KNOWLEDGEMANAGEMENT.AUTHOR_CONTACT_ID")
+        .toString()
+);
\ No newline at end of file
diff --git a/entity/KnowledgeManagement_entity/recordcontainers/indexsearchknowledgebase/affectedIds.js b/entity/KnowledgeManagement_entity/recordcontainers/indexsearchknowledgebase/affectedIds.js
index 0a323b07c09..7e282414273 100644
--- a/entity/KnowledgeManagement_entity/recordcontainers/indexsearchknowledgebase/affectedIds.js
+++ b/entity/KnowledgeManagement_entity/recordcontainers/indexsearchknowledgebase/affectedIds.js
@@ -15,7 +15,7 @@ switch (tableName)
         res = [idValue];
         break;
     case "KNOWLEDGETAGLINK":
-        res = db.array(db.COLUMN, "select KNOWLEDGEMANAGEMENT_ID from KNOWLEDGETAGLINK where KNOWLEDGETAGLINKID = '" + idValue + "'");
+        res = newSelect("KNOWLEDGEMANAGEMENT_ID").from("KNOWLEDGETAGLINK").where("KNOWLEDGETAGLINK.KNOWLEDGETAGLINKID", idValue).arrayColumn();
         break;
 }
 
diff --git a/entity/KnowledgeManagement_entity/recordcontainers/indexsearchknowledgebase/query.js b/entity/KnowledgeManagement_entity/recordcontainers/indexsearchknowledgebase/query.js
index d35d47bbda4..b13c3cdc15d 100644
--- a/entity/KnowledgeManagement_entity/recordcontainers/indexsearchknowledgebase/query.js
+++ b/entity/KnowledgeManagement_entity/recordcontainers/indexsearchknowledgebase/query.js
@@ -4,39 +4,29 @@ import("KeywordRegistry_basic");
 import("Sql_lib");
 import("system.SQLTYPES");
 
-var condition = "";
-if ( vars.exists("$local.idvalue") )
-{
-    var ids = vars.get("$local.idvalue");
-    condition = " where km1.KNOWLEDGEMANAGEMENTID in ('" + ids.join("', '") + "')";
-}
-// the case when construct is used to decide, to which sub group the entry belongs
-var sql = "select km1.KNOWLEDGEMANAGEMENTID, km1.TITLE, " + new SqlMaskingUtils().castLob("CONTENTDECODED", 255)
-        + ", km1.KNOWLEDGEMANAGEMENTID, km1.TITLE, km1.CONTENTDECODED, KNOWLEDGETAG.TAG, "
-        + "case when exists( \
-                    select '1' \
-                    from KNOWLEDGEMANAGEMENT \
-                    join KNOWLEDGETAGLINK on KNOWLEDGEMANAGEMENTID = KNOWLEDGEMANAGEMENT_ID \
-                    join KNOWLEDGETAG on KNOWLEDGETAGID = KNOWLEDGETAG_ID \
-                    where KNOWLEDGETAG.TAG = 'News' \
-                          and KNOWLEDGEMANAGEMENT.KNOWLEDGEMANAGEMENTID = km1.KNOWLEDGEMANAGEMENTID \
-            ) \
-            then 'News' \
-            else case when GITPATH is null and TYPE = 1 \
-                then 'Knowledgebase' \
-                else case when GITPATH is not null and TYPE = 2 \
-                     then 'Editorial' \
-                     else case when TYPE = 3 \
-                          then 'Business process' \
-                          end \
-                     end \
-                end \
-            end "
-        + ", ''"
-        + " from KNOWLEDGEMANAGEMENT km1 "
-        + " left join KNOWLEDGETAGLINK on KNOWLEDGEMANAGEMENTID = KNOWLEDGEMANAGEMENT_ID"
-        + " left join KNOWLEDGETAG on KNOWLEDGETAGID = KNOWLEDGETAG_ID"
-        + condition
-        + " order by KNOWLEDGEMANAGEMENTID"
+var sql = newSelect([
+        "km1.KNOWLEDGEMANAGEMENTID", "km1.TITLE", new SqlMaskingUtils().castLob("CONTENTDECODED", 255), "km1.KNOWLEDGEMANAGEMENTID", 
+        "km1.TITLE", "km1.CONTENTDECODED", "KNOWLEDGETAG.TAG",
+        SqlBuilder.caseWhen(null, newSelect("KNOWLEDGEMANAGEMENTID")
+                    .from("KNOWLEDGEMANAGEMENT")
+                    .join("KNOWLEDGETAGLINK", "KNOWLEDGEMANAGEMENTID = KNOWLEDGEMANAGEMENT_ID")
+                    .join("KNOWLEDGETAG", "KNOWLEDGETAGID = KNOWLEDGETAG_ID")
+                    .where("KNOWLEDGETAG.TAG", "News")
+                    .and("KNOWLEDGEMANAGEMENT.KNOWLEDGEMANAGEMENTID = km1.KNOWLEDGEMANAGEMENTID"))
+                .thenString("News")
+            .when(newWhere("GITPATH is null").and("TYPE = 1"))
+                .thenString("Knowledgebase")
+            .when(newWhere("GITPATH is not null").and("TYPE = 2"))
+                .thenString("Editorial")
+            .when("TYPE = 3")
+                .thenString("Business process"),
+        "''"
+    ]).from("KNOWLEDGEMANAGEMENT", "km1")
+    .leftJoin("KNOWLEDGETAGLINK", "KNOWLEDGEMANAGEMENTID = KNOWLEDGEMANAGEMENT_ID")
+    .leftJoin("KNOWLEDGETAG", "KNOWLEDGETAGID = KNOWLEDGETAG_ID")
+    .orderBy("KNOWLEDGEMANAGEMENTID");
 
-result.string(sql);
\ No newline at end of file
+if (vars.exists("$local.idvalue"))
+    querySelect.whereIfSet("KNOWLEDGEMANAGEMENT.KNOWLEDGEMANAGEMENTID", "$local.idvalue");
+
+result.string(sql.toString());
\ No newline at end of file
diff --git a/process/KnowledgeManagement_lib/process.js b/process/KnowledgeManagement_lib/process.js
index d2b23022b6a..8e639f6fcd6 100644
--- a/process/KnowledgeManagement_lib/process.js
+++ b/process/KnowledgeManagement_lib/process.js
@@ -29,13 +29,11 @@ function KnowledgeManagementModel(pHtml, pKnowledgeId)
     
     var updFunc = function(pContent, pId)
     {
-        cols = ["CONTENT", "CONTENTDECODED"];
-        colTypes = db.getColumnTypes("KNOWLEDGEMANAGEMENT", cols);
-        db.updateData("KNOWLEDGEMANAGEMENT"
-            , cols
-            , colTypes
-            , [pContent, text.html2text(pContent)]
-            , "KNOWLEDGEMANAGEMENTID = '" + pId + "'");
+        newWhere("KNOWLEDGEMANAGEMENT.KNOWLEDGEMANAGEMENTID", pId)
+            .updateFields({
+                "CONTENT": pContent,
+                "CONTENTDECODED": text.html2text(pContent)
+            });
     }
     
     //this turns a HTML String into an instance of SimpleHtmlObject for further processing
@@ -364,10 +362,9 @@ KnowledgeManagementTagsController.prototype.addTag = function(pIdValue, pRowData
         if(existingTags.ByIdMap[pData["TAG.value"]] && Number(countSql) === 0 && !pFromUpdate)
         {
             var fields = ["KNOWLEDGETAGLINKID","KNOWLEDGEMANAGEMENT_ID","KNOWLEDGETAG_ID","USER_NEW","DATE_NEW"];//["AB_ATTRIBUTERELATIONID", "AB_ATTRIBUTE_ID", "OBJECT_ROWID", "OBJECT_TYPE", "ID_VALUE", "USER_NEW", "DATE_NEW"];
-            var dataTypes = db.getColumnTypes("KNOWLEDGETAGLINK", fields);
             var values = [pId, this.knowledgeId, pData["TAG.value"], vars.get("$sys.user"), datetime.date()];
 
-            db.insertData("KNOWLEDGETAGLINK", fields, dataTypes, values);
+            db.insertData("KNOWLEDGETAGLINK", fields, null, values);
         }
     }
 
@@ -504,7 +501,6 @@ KnowledgeManagementTagsController.prototype.createNewTag = function(pIdValue, pD
                         ,"TAG"
                         ,"DATE_NEW"
                         ,"USER_NEW"];
-    var tagColTypes = db.getColumnTypes("KNOWLEDGETAG", tagFields);
     var newAttrId;
     var tagValues;
 
@@ -519,7 +515,7 @@ KnowledgeManagementTagsController.prototype.createNewTag = function(pIdValue, pD
         newAttrId = util.getNewUUID();
         tagValues = [newAttrId, pData["TAG.value"], datetime.date(), vars.get("$sys.user")];
 
-        db.insertData("KNOWLEDGETAG", tagFields, tagColTypes, tagValues);
+        db.insertData("KNOWLEDGETAG", tagFields, null, tagValues);
         
         pData["TAG.value"] = newAttrId;
         
@@ -941,7 +937,6 @@ KnowledgeDiscussion.prototype.addDiscussion = function(pDiscussionId, pRowData)
     ,"KNOWLEDGEMANAGEMENT_ID","DISCUSSIONTEXT"
     ,"STATUS","AUTHOR"
     ,"DATE_NEW","USER_NEW"];
-    var types = db.getColumnTypes("KNOWLEDGEDISCUSSION", fields);
 
     var values = [
     pRowData["UID.value"]
@@ -954,7 +949,7 @@ KnowledgeDiscussion.prototype.addDiscussion = function(pDiscussionId, pRowData)
     ,vars.get("$sys.user").trim()
     ];
 
-    db.insertData("KNOWLEDGEDISCUSSION", fields, types, values);
+    db.insertData("KNOWLEDGEDISCUSSION", fields, null, values);
 
     return this;
 }
@@ -976,7 +971,6 @@ KnowledgeDiscussion.prototype.editDiscussion = function(pDiscussionId, pRowData,
     var i;
     var fields = [];
     var values = [];
-    var types = null;
 
     for(i = 0; i < pChanged.length; i++)
     {
@@ -985,11 +979,10 @@ KnowledgeDiscussion.prototype.editDiscussion = function(pDiscussionId, pRowData,
         fields.push(field.split(".")[0]);
     }
 
-    types = db.getColumnTypes("KNOWLEDGEDISCUSSION", fields);
 
     db.updateData("KNOWLEDGEDISCUSSION"
         , fields
-        , types
+        , null
         , values
         , newWhere("KNOWLEDGEDISCUSSION.KNOWLEDGEDISCUSSIONID", pDiscussionId)
         .and("KNOWLEDGEDISCUSSION.KNOWLEDGEMANAGEMENT_ID", this.knowledgeId).toString());
@@ -1046,9 +1039,8 @@ KnowledgeDiscussion.prototype.setDiscussionStatus = function(pDiscussionId, pSta
 
     let table = "KNOWLEDGEDISCUSSION";
     let cols = ["STATUS"];
-    let colTypes = db.getColumnTypes(table, cols);
     let updates = [];
-    let updateTemplate = [table, cols, colTypes, [pStatus]];
+    let updateTemplate = [table, cols, null, [pStatus]];
 
     _addChildrenToUpdates(pDiscussionId, pStatus);
     let parentUpdate = [].slice.call(updateTemplate,0);
@@ -1059,7 +1051,10 @@ KnowledgeDiscussion.prototype.setDiscussionStatus = function(pDiscussionId, pSta
 
     function _addChildrenToUpdates(pId, pStatus)
     {
-        var data = db.table("select KNOWLEDGEDISCUSSIONID, PARENTENTRY from KNOWLEDGEDISCUSSION where PARENTENTRY = '" + pId + "'");
+        var data = newSelect(["KNOWLEDGEDISCUSSIONID", "PARENTENTRY"])
+            .from("KNOWLEDGEDISCUSSION")
+            .where("KNOWLEDGEDISCUSSION.PARENTENTRY", pId)
+            .table();
         if(!data.length)
             return;
 
@@ -1090,7 +1085,10 @@ KnowledgeIndexHelper.getInstance = function(pId, pData)
 KnowledgeIndexHelper.prototype.getDocumentsFromContent = function()
 {
     var tempArray = [];
-    var content = db.cell("select content from KNOWLEDGEMANAGEMENT where knowledgemanagementid = '" + this.knowledgeId + "' ");
+    var content = newSelect("CONTENT")
+        .from("KNOWLEDGEMANAGEMENT")
+        .where("KNOWLEDGEMANAGEMENT.KNOWLEDGEMANAGEMENTID", this.knowledgeId)
+        .cell();
     var invalidLink = false;
     // the question mark quantifier is in (.*?) to make sure, that more than one file link can be present in one line!
     var matches = content.match( new RegExp("<a href=\"file(.*?)((htm(l?))|(pdf)|(doc(x?)))\"", "gi") );
@@ -1135,19 +1133,6 @@ KnowledgeIndexHelper.prototype.getDocumentsFromContent = function()
             ,this);
             
     this.data[8] = tempArray;
-    //    var keywordName = "Enthält ungültige Links";
-    //    if(invalidLink)
-    //    {
-    //        if (db.cell("select count(*) from knowledgemanagementkeyword where KNOWLEDGEMANAGEMENT_ID = '" + pId + "' and KEYWORD = '" + keywordName + "'") == 0)
-    //        {
-    //            var cols = ["KEYWORD", "KNOWLEDGEMANAGEMENTKEYWORDID", "KNOWLEDGEMANAGEMENT_ID"];
-    //            db.insertData("KNOWLEDGEMANAGEMENTKEYWORD", cols, db.getColumnTypes("KNOWLEDGEMANAGEMENTKEYWORD", cols), [keywordName, util.getNewUUID(), pId]);
-    //        }
-    //    }
-    //    else
-    //    {
-    //        db.deleteData("KNOWLEDGEMANAGEMENTKEYWORD", "KNOWLEDGEMANAGEMENT_ID = '" + pId + "' and KEYWORD = '" + keywordName + "'");
-    //    }
 
     return this;
 }
diff --git a/process/NewsSystem_lib/process.js b/process/NewsSystem_lib/process.js
index 3a365fac90e..08af9ed2029 100644
--- a/process/NewsSystem_lib/process.js
+++ b/process/NewsSystem_lib/process.js
@@ -1,3 +1,4 @@
+import("Sql_lib");
 import("system.vars");
 import("system.util");
 import("KnowledgeManagement_lib");
@@ -58,17 +59,16 @@ NewsSystem.createNewsNotification = function(description, caption, users, id)
  */
 NewsSystem.getDisplayValue = function() 
 {
-    var resultSet = " case ";
+    var resultSet = SqlBuilder.caseStatement();
     var allRolesObject = tools.getAllRoles();
 
-    for each (currentRoleObject in allRolesObject)
+    for (let role in allRolesObject)
     {
-        resultSet += " when KNOWLEDGEROLES.ROLENAME = '" + currentRoleObject[3] + "' then '" + currentRoleObject[0] + "' ";
+        let currentRoleObject = allRolesObject[role];
+        resultSet.when("KNOWLEDGEROLES.ROLENAME", currentRoleObject[3]).thenString(currentRoleObject[0]);
     }
-
-    resultSet += " end ";
     
-    return resultSet;
+    return resultSet.toString();
 }
 
 NewsSystem.setAsNews = function(pKnowledgeID, pNotification, pIsNews)
-- 
GitLab


From ac8ed0921d0aa0594fb2e5904a8dbf7d39d8cc4b Mon Sep 17 00:00:00 2001
From: Sebastian Listl <s.listl@adito.de>
Date: Thu, 12 Nov 2020 11:36:33 +0100
Subject: [PATCH 078/184] Missing notificationType News added

---
 neonNotificationType/News/News.aod | 7 +++++++
 1 file changed, 7 insertions(+)
 create mode 100644 neonNotificationType/News/News.aod

diff --git a/neonNotificationType/News/News.aod b/neonNotificationType/News/News.aod
new file mode 100644
index 00000000000..239ea9b1feb
--- /dev/null
+++ b/neonNotificationType/News/News.aod
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<neonNotificationType xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.0" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonNotificationType/1.1.0">
+  <name>News</name>
+  <title>News</title>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <icon>VAADIN:NEWSPAPER</icon>
+</neonNotificationType>
-- 
GitLab


From 4d7a5c27f7e4d025561e920f31c80f15c823d7d3 Mon Sep 17 00:00:00 2001
From: Sebastian Listl <s.listl@adito.de>
Date: Thu, 12 Nov 2020 13:25:34 +0100
Subject: [PATCH 079/184] Knowledgemanagement css and filter fixed

---
 .../struct/knowledgeManagement_table.xml      |  4 +-
 .../KnowledgeManagement_entity.aod            | 95 ++++++++++---------
 .../tagsbyknowledgeid/onValidation.js         | 22 +++++
 .../recordcontainers/db/conditionProcess.js   |  2 +-
 .../tagfilter/filterConditionProcess.js       |  2 +-
 .../KnowledgeNewsFeed_entity.aod              |  4 -
 .../children/isdashlet_param/valueProcess.js  |  3 +
 .../KnowledgeRole_entity.aod                  | 11 ++-
 .../entityfields/roles/displayValueProcess.js |  4 +-
 .../KnowledgeManagement.aod                   |  4 +
 .../KnowledgeNewsFeed/KnowledgeNewsFeed.aod   |  3 +
 neonContext/KnowledgeRole/KnowledgeRole.aod   |  2 +-
 .../KnowledgeManagementContent_view.aod       | 17 ++++
 .../KnowledgeManagementDetails_view.aod       |  3 +
 .../KnowledgeManagementFilter_view.aod        |  4 +-
 .../KnowledgeManagementMain_view.aod          |  9 +-
 .../KnowledgeManagementTimeline_view.aod      |  2 +
 .../KnowledgeNewsFeed_view.aod                |  6 --
 process/KnowledgeManagement_lib/process.js    |  3 +-
 19 files changed, 127 insertions(+), 73 deletions(-)
 create mode 100644 entity/KnowledgeManagement_entity/entityfields/tagsbyknowledgeid/onValidation.js
 create mode 100644 entity/KnowledgeNewsFeed_entity/entityfields/consumer/children/isdashlet_param/valueProcess.js
 create mode 100644 neonView/KnowledgeManagementContent_view/KnowledgeManagementContent_view.aod

diff --git a/.liquibase/Data_alias/basic/2020.2.2/Knowledgemanagement/struct/knowledgeManagement_table.xml b/.liquibase/Data_alias/basic/2020.2.2/Knowledgemanagement/struct/knowledgeManagement_table.xml
index 14747dd37ea..ebe0b768225 100644
--- a/.liquibase/Data_alias/basic/2020.2.2/Knowledgemanagement/struct/knowledgeManagement_table.xml
+++ b/.liquibase/Data_alias/basic/2020.2.2/Knowledgemanagement/struct/knowledgeManagement_table.xml
@@ -15,8 +15,8 @@
             <column name="TITLE" type="NVARCHAR(255)"></column>
             <column name="CONTENT" type="LONGTEXT"></column>
             <column name="CONTENTDECODED" type="LONGTEXT"></column>
-            <column name="PUBLISH" type="CHAR(36)"></column>
-            <column name="TYPE" type="CHAR(36)"></column>
+            <column name="PUBLISH" type="VARCHAR(36)"></column>
+            <column name="TYPE" type="VARCHAR(36)"></column>
         </createTable>
         
         <createIndex tableName="KNOWLEDGEMANAGEMENT" indexName="IDX_KNOWLEDGEMANAGEMENT_TITLE">
diff --git a/entity/KnowledgeManagement_entity/KnowledgeManagement_entity.aod b/entity/KnowledgeManagement_entity/KnowledgeManagement_entity.aod
index 2f6b2699aa9..b05003ab87f 100644
--- a/entity/KnowledgeManagement_entity/KnowledgeManagement_entity.aod
+++ b/entity/KnowledgeManagement_entity/KnowledgeManagement_entity.aod
@@ -16,6 +16,14 @@
   <entityFields>
     <entityProvider>
       <name>#PROVIDER</name>
+      <dependencies>
+        <entityDependency>
+          <name>40cf66ca-421f-47f6-8ecc-8360657e0640</name>
+          <entityName>KnowledgeNewsFeed_entity</entityName>
+          <fieldName>Consumer</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+      </dependencies>
     </entityProvider>
     <entityField>
       <name>KNOWLEDGEMANAGEMENTID</name>
@@ -99,32 +107,33 @@
       <name>TagsByKnowledgeId</name>
       <refreshParent v="true" />
       <state>EDITABLE</state>
-      <dependency>
-        <name>dependency</name>
-        <entityName>KnowledgeManagementTags_entity</entityName>
-        <fieldName>ByKnowledgeManagementId</fieldName>
-      </dependency>
+      <onValidation>%aditoprj%/entity/KnowledgeManagement_entity/entityfields/tagsbyknowledgeid/onValidation.js</onValidation>
       <children>
         <entityParameter>
           <name>KnowledgeManagementId_param</name>
           <valueProcess>%aditoprj%/entity/KnowledgeManagement_entity/entityfields/tagsbyknowledgeid/children/knowledgemanagementid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KnowledgeManagementTags_entity</entityName>
+        <fieldName>ByKnowledgeManagementId</fieldName>
+      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>DiscussionsByKnowledgeId</name>
       <refreshParent v="true" />
-      <dependency>
-        <name>dependency</name>
-        <entityName>KnowledgeDiscussion_entity</entityName>
-        <fieldName>ByKnowledgeId</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>KnowledgeId_param</name>
           <valueProcess>%aditoprj%/entity/KnowledgeManagement_entity/entityfields/discussionsbyknowledgeid/children/knowledgeid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KnowledgeDiscussion_entity</entityName>
+        <fieldName>ByKnowledgeId</fieldName>
+      </dependency>
     </entityConsumer>
     <entityProvider>
       <name>Provider</name>
@@ -139,42 +148,37 @@
     </entityConsumer>
     <entityConsumer>
       <name>KeywordKnowledgeType</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>KeywordEntry_entity</entityName>
-        <fieldName>SpecificContainerKeywords</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
           <valueProcess>%aditoprj%/entity/KnowledgeManagement_entity/entityfields/keywordknowledgetype/children/containername_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>KeywordPublish</name>
       <dependency>
         <name>dependency</name>
         <entityName>KeywordEntry_entity</entityName>
         <fieldName>SpecificContainerKeywords</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>KeywordPublish</name>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
           <valueProcess>%aditoprj%/entity/KnowledgeManagement_entity/entityfields/keywordpublish/children/containername_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>SpecificContainerKeywords</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>indexTag</name>
     </entityField>
     <entityConsumer>
       <name>LinkedDocuments</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Document_entity</entityName>
-        <fieldName>Documents</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>AssignmentTable_param</name>
@@ -185,6 +189,11 @@
           <valueProcess>%aditoprj%/entity/KnowledgeManagement_entity/entityfields/linkeddocuments/children/assignmentrowid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Document_entity</entityName>
+        <fieldName>Documents</fieldName>
+      </dependency>
     </entityConsumer>
     <entityActionField>
       <name>openEntryAsMail</name>
@@ -197,17 +206,17 @@
     <entityConsumer>
       <name>LinksByKnowledgeId</name>
       <refreshParent v="true" />
-      <dependency>
-        <name>dependency</name>
-        <entityName>KnowledgeLink_entity</entityName>
-        <fieldName>ByKnowledgeId</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>KnowledgeManagementId_param</name>
           <valueProcess>%aditoprj%/entity/KnowledgeManagement_entity/entityfields/linksbyknowledgeid/children/knowledgemanagementid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KnowledgeLink_entity</entityName>
+        <fieldName>ByKnowledgeId</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>LastChange</name>
@@ -216,17 +225,17 @@
     </entityField>
     <entityConsumer>
       <name>LogHistories</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>LogHistory_entity</entityName>
-        <fieldName>LogHistoryProvider</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>tablenames_param</name>
           <valueProcess>%aditoprj%/entity/KnowledgeManagement_entity/entityfields/loghistories/children/tablenames_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>LogHistory_entity</entityName>
+        <fieldName>LogHistoryProvider</fieldName>
+      </dependency>
     </entityConsumer>
     <entityActionField>
       <name>exportHTML_action</name>
@@ -268,11 +277,6 @@
       <name>KnowledgeRoles</name>
       <stateProcess>%aditoprj%/entity/KnowledgeManagement_entity/entityfields/knowledgeroles/stateProcess.js</stateProcess>
       <onValidation>%aditoprj%/entity/KnowledgeManagement_entity/entityfields/knowledgeroles/onValidation.js</onValidation>
-      <dependency>
-        <name>dependency</name>
-        <entityName>KnowledgeRole_entity</entityName>
-        <fieldName>KnowledgeRole</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>KnowledgeManagement_param</name>
@@ -284,14 +288,14 @@
           <expose v="true" />
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>Tasks</name>
       <dependency>
         <name>dependency</name>
-        <entityName>Task_entity</entityName>
-        <fieldName>Tasks</fieldName>
+        <entityName>KnowledgeRole_entity</entityName>
+        <fieldName>KnowledgeRole</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>Tasks</name>
       <children>
         <entityParameter>
           <name>ObjectId_param</name>
@@ -306,6 +310,11 @@
           <valueProcess>%aditoprj%/entity/KnowledgeManagement_entity/entityfields/tasks/children/presetlinks_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Task_entity</entityName>
+        <fieldName>Tasks</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>RESPONSIBLE_CONTACT_ID</name>
diff --git a/entity/KnowledgeManagement_entity/entityfields/tagsbyknowledgeid/onValidation.js b/entity/KnowledgeManagement_entity/entityfields/tagsbyknowledgeid/onValidation.js
new file mode 100644
index 00000000000..a7755c7c8e3
--- /dev/null
+++ b/entity/KnowledgeManagement_entity/entityfields/tagsbyknowledgeid/onValidation.js
@@ -0,0 +1,22 @@
+import("system.translate");
+import("system.result");
+import("system.vars");
+import("Entity_lib");
+
+vars.get("$field.TagsByKnowledgeId.insertedRows");
+vars.get("$field.TagsByKnowledgeId.changedRows");
+vars.get("$field.TagsByKnowledgeId.deletedRows");
+
+var tagRows = EntityConsumerRowsHelper.getCurrentConsumerRows("TagsByKnowledgeId", ["TAG"]);
+var tagSet = new Set();
+var hasDuplicate = tagRows.some(function (row)
+{
+    var tag = row["TAG"].trim();
+    if (tagSet.has(tag))
+        return true;
+    tagSet.add(tag);
+    return false;
+});
+
+if (hasDuplicate)
+    result.string(translate.text("Tags can't be assigned more than once!"));
\ No newline at end of file
diff --git a/entity/KnowledgeManagement_entity/recordcontainers/db/conditionProcess.js b/entity/KnowledgeManagement_entity/recordcontainers/db/conditionProcess.js
index c25c12a3103..938e3152c59 100644
--- a/entity/KnowledgeManagement_entity/recordcontainers/db/conditionProcess.js
+++ b/entity/KnowledgeManagement_entity/recordcontainers/db/conditionProcess.js
@@ -19,7 +19,7 @@ if(vars.exists("$param.isDashlet_param") && vars.get("$param.isDashlet_param"))
         ,newSelect("KNOWLEDGETAGLINK.KNOWLEDGETAGLINKID")
         .from("KNOWLEDGETAGLINK")
         .where("KNOWLEDGETAGLINK.KNOWLEDGEMANAGEMENT_ID = KNOWLEDGEMANAGEMENT.KNOWLEDGEMANAGEMENTID")
-        .and("KNOWLEDGETAGLINK.KNOWLEDGETAG_ID", "1f035a33-e5a3-48e4-bda6-6d8b320177e4"), SqlBuilder.EXISTS());
+        .and("KNOWLEDGETAGLINK.KNOWLEDGETAG_ID", "9c1bb89e-60db-4a50-ba77-c81a8ec82d2c"), SqlBuilder.EXISTS());
 }
 
 result.string(cond.toString());
\ No newline at end of file
diff --git a/entity/KnowledgeManagement_entity/recordcontainers/db/filterextensions/tagfilter/filterConditionProcess.js b/entity/KnowledgeManagement_entity/recordcontainers/db/filterextensions/tagfilter/filterConditionProcess.js
index 446c4299313..c05ae19af19 100644
--- a/entity/KnowledgeManagement_entity/recordcontainers/db/filterextensions/tagfilter/filterConditionProcess.js
+++ b/entity/KnowledgeManagement_entity/recordcontainers/db/filterextensions/tagfilter/filterConditionProcess.js
@@ -13,7 +13,7 @@ switch (vars.get("$local.comparison"))
     case "NOT_EQUAL":
         condType = SqlBuilder.NOT_EXISTS();
     case "EQUAL":
-        condition.and(null, tagLinkSqll.and("KNOWLEDGETAGLINK.KNOWLEDGETAG_ID", "$local.rawvalue"), condType);
+        condition.and(null, tagLinkSql.and("KNOWLEDGETAGLINK.KNOWLEDGETAG_ID", "$local.rawvalue"), condType);
     break;
     case "ISNULL":
         condType = SqlBuilder.NOT_EXISTS();
diff --git a/entity/KnowledgeNewsFeed_entity/KnowledgeNewsFeed_entity.aod b/entity/KnowledgeNewsFeed_entity/KnowledgeNewsFeed_entity.aod
index 289c14e605d..aa197ca8d2a 100644
--- a/entity/KnowledgeNewsFeed_entity/KnowledgeNewsFeed_entity.aod
+++ b/entity/KnowledgeNewsFeed_entity/KnowledgeNewsFeed_entity.aod
@@ -15,10 +15,6 @@
       <contentType>HTML</contentType>
       <valueProcess>%aditoprj%/entity/KnowledgeNewsFeed_entity/entityfields/htmlcontent/valueProcess.js</valueProcess>
     </entityField>
-    <entityParameter>
-      <name>Parameter</name>
-      <expose v="true" />
-    </entityParameter>
     <entityProvider>
       <name>#PROVIDER_AGGREGATES</name>
       <useAggregates v="true" />
diff --git a/entity/KnowledgeNewsFeed_entity/entityfields/consumer/children/isdashlet_param/valueProcess.js b/entity/KnowledgeNewsFeed_entity/entityfields/consumer/children/isdashlet_param/valueProcess.js
new file mode 100644
index 00000000000..40effa01784
--- /dev/null
+++ b/entity/KnowledgeNewsFeed_entity/entityfields/consumer/children/isdashlet_param/valueProcess.js
@@ -0,0 +1,3 @@
+import("system.result");
+
+result.string(true);
\ No newline at end of file
diff --git a/entity/KnowledgeRole_entity/KnowledgeRole_entity.aod b/entity/KnowledgeRole_entity/KnowledgeRole_entity.aod
index cec4b2173e0..eb1b5a2d876 100644
--- a/entity/KnowledgeRole_entity/KnowledgeRole_entity.aod
+++ b/entity/KnowledgeRole_entity/KnowledgeRole_entity.aod
@@ -2,6 +2,7 @@
 <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>KnowledgeRole_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
+  <title>Knowledge Role</title>
   <recordContainer>db</recordContainer>
   <entityFields>
     <entityProvider>
@@ -15,17 +16,17 @@
     </entityField>
     <entityConsumer>
       <name>NewsRole</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Role_entity</entityName>
-        <fieldName>FilterRolesWithoutPermission</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ExcludeRoles_param</name>
           <valueProcess>%aditoprj%/entity/KnowledgeRole_entity/entityfields/newsrole/children/excluderoles_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Role_entity</entityName>
+        <fieldName>FilterRolesWithoutPermission</fieldName>
+      </dependency>
     </entityConsumer>
     <entityProvider>
       <name>KnowledgeRole</name>
diff --git a/entity/KnowledgeRole_entity/entityfields/roles/displayValueProcess.js b/entity/KnowledgeRole_entity/entityfields/roles/displayValueProcess.js
index 6890d68fc5d..34cda7e17c1 100644
--- a/entity/KnowledgeRole_entity/entityfields/roles/displayValueProcess.js
+++ b/entity/KnowledgeRole_entity/entityfields/roles/displayValueProcess.js
@@ -2,12 +2,10 @@ import("system.result");
 import("system.vars");
 import("system.tools");
 
-var allRoles = tools.getAllRoles(["PROJECT", "CUSTOM"], true);
+var allRoles = tools.getAllRoles(["PROJECT", "CUSTOM", "INTERNAL"], true);
 var roleTitle = vars.get("$field.ROLES");
 
 if (roleTitle in allRoles)
-{
     roleTitle = allRoles[roleTitle][0];
-}
 
 result.string(roleTitle);
\ No newline at end of file
diff --git a/neonContext/KnowledgeManagement/KnowledgeManagement.aod b/neonContext/KnowledgeManagement/KnowledgeManagement.aod
index b6caadef74f..44e4b904929 100644
--- a/neonContext/KnowledgeManagement/KnowledgeManagement.aod
+++ b/neonContext/KnowledgeManagement/KnowledgeManagement.aod
@@ -44,5 +44,9 @@
       <name>4e903d37-f2ac-4368-99aa-aee2492a03dc</name>
       <view>KnowledgeManagementRole_view</view>
     </neonViewReference>
+    <neonViewReference>
+      <name>be95c2fc-b29b-4d46-a8fc-0d79c09f67b6</name>
+      <view>KnowledgeManagementContent_view</view>
+    </neonViewReference>
   </references>
 </neonContext>
diff --git a/neonContext/KnowledgeNewsFeed/KnowledgeNewsFeed.aod b/neonContext/KnowledgeNewsFeed/KnowledgeNewsFeed.aod
index f9bc4fdec87..ecb8b248430 100644
--- a/neonContext/KnowledgeNewsFeed/KnowledgeNewsFeed.aod
+++ b/neonContext/KnowledgeNewsFeed/KnowledgeNewsFeed.aod
@@ -10,5 +10,8 @@
       <name>a6965156-ab52-4520-a3be-1351eacd863d</name>
       <view>KnowledgeNewsFeed_view</view>
     </neonViewReference>
+    <neonViewReference>
+      <name>e4604c82-a42f-47c6-a1d1-0f1d1727ee38</name>
+    </neonViewReference>
   </references>
 </neonContext>
diff --git a/neonContext/KnowledgeRole/KnowledgeRole.aod b/neonContext/KnowledgeRole/KnowledgeRole.aod
index 68bba633d72..a41da5ae918 100644
--- a/neonContext/KnowledgeRole/KnowledgeRole.aod
+++ b/neonContext/KnowledgeRole/KnowledgeRole.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>KnowledgeRole</name>
-  <title>Knowledgerole</title>
+  <title>Knowledge Role</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <entity>KnowledgeRole_entity</entity>
   <references>
diff --git a/neonView/KnowledgeManagementContent_view/KnowledgeManagementContent_view.aod b/neonView/KnowledgeManagementContent_view/KnowledgeManagementContent_view.aod
new file mode 100644
index 00000000000..2318cac2885
--- /dev/null
+++ b/neonView/KnowledgeManagementContent_view/KnowledgeManagementContent_view.aod
@@ -0,0 +1,17 @@
+<?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>KnowledgeManagementContent_view</name>
+  <title>Content</title>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <layout>
+    <boxLayout>
+      <name>layout</name>
+    </boxLayout>
+  </layout>
+  <children>
+    <webContentViewTemplate>
+      <name>htmlContent</name>
+      <entityField>htmlView</entityField>
+    </webContentViewTemplate>
+  </children>
+</neonView>
diff --git a/neonView/KnowledgeManagementDetails_view/KnowledgeManagementDetails_view.aod b/neonView/KnowledgeManagementDetails_view/KnowledgeManagementDetails_view.aod
index 992ac0b7ffb..43c26e82585 100644
--- a/neonView/KnowledgeManagementDetails_view/KnowledgeManagementDetails_view.aod
+++ b/neonView/KnowledgeManagementDetails_view/KnowledgeManagementDetails_view.aod
@@ -13,6 +13,7 @@
       <name>KnowledgeDetails</name>
       <iconField>#ICON</iconField>
       <titleField>TITLE</titleField>
+      <subtitleField>LastChange</subtitleField>
       <entityField>#ENTITY</entityField>
       <isEditable v="false" />
     </cardViewTemplate>
@@ -25,6 +26,8 @@
     </favoriteViewTemplate>
     <genericViewTemplate>
       <name>Details</name>
+      <showDrawer v="true" />
+      <drawerCaption>Details</drawerCaption>
       <entityField>#ENTITY</entityField>
       <fields>
         <entityFieldLink>
diff --git a/neonView/KnowledgeManagementFilter_view/KnowledgeManagementFilter_view.aod b/neonView/KnowledgeManagementFilter_view/KnowledgeManagementFilter_view.aod
index 28f846c0a6c..7a2dfc261ca 100644
--- a/neonView/KnowledgeManagementFilter_view/KnowledgeManagementFilter_view.aod
+++ b/neonView/KnowledgeManagementFilter_view/KnowledgeManagementFilter_view.aod
@@ -6,8 +6,8 @@
   <dashletConfigurations>
     <neonDashletConfiguration>
       <name>Wissen</name>
-      <title>Wissen</title>
-      <description>Alle Wissensbeiträge</description>
+      <title>Knowledge</title>
+      <description>All Articles</description>
       <fragment>KnowledgeManagement/filter</fragment>
       <icon>VAADIN:ACADEMY_CAP</icon>
       <categories>
diff --git a/neonView/KnowledgeManagementMain_view/KnowledgeManagementMain_view.aod b/neonView/KnowledgeManagementMain_view/KnowledgeManagementMain_view.aod
index 33c43a3158a..dd357ba38b8 100644
--- a/neonView/KnowledgeManagementMain_view/KnowledgeManagementMain_view.aod
+++ b/neonView/KnowledgeManagementMain_view/KnowledgeManagementMain_view.aod
@@ -14,10 +14,11 @@
       <entityField>#ENTITY</entityField>
       <view>KnowledgeManagementDetails_view</view>
     </neonViewReference>
-    <webContentViewTemplate>
-      <name>Content</name>
-      <entityField>htmlView</entityField>
-    </webContentViewTemplate>
+    <neonViewReference>
+      <name>0c32cd6f-82a6-466a-9a71-16eeeb9c6890</name>
+      <entityField>#ENTITY</entityField>
+      <view>KnowledgeManagementContent_view</view>
+    </neonViewReference>
     <neonViewReference>
       <name>79fcef8e-c0ba-4463-a239-6faf332b6bc9</name>
       <entityField>DiscussionsByKnowledgeId</entityField>
diff --git a/neonView/KnowledgeManagementTimeline_view/KnowledgeManagementTimeline_view.aod b/neonView/KnowledgeManagementTimeline_view/KnowledgeManagementTimeline_view.aod
index 06766542b7e..0dab386afeb 100644
--- a/neonView/KnowledgeManagementTimeline_view/KnowledgeManagementTimeline_view.aod
+++ b/neonView/KnowledgeManagementTimeline_view/KnowledgeManagementTimeline_view.aod
@@ -3,11 +3,13 @@
   <name>KnowledgeManagementTimeline_view</name>
   <title>Newsfeed (Preview)</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
+  <filterable v="true" />
   <dashletConfigurations>
     <neonDashletConfiguration>
       <name>timelineDashletConfig</name>
       <title>Newsfeed (Preview)</title>
       <fragment>KnowledgeManagement/filter</fragment>
+      <icon>NEON:TIMELINE</icon>
       <categories>
         <neonDashletCategory>
           <name>knowledge</name>
diff --git a/neonView/KnowledgeNewsFeed_view/KnowledgeNewsFeed_view.aod b/neonView/KnowledgeNewsFeed_view/KnowledgeNewsFeed_view.aod
index 4f9bd988b14..eb513c6f972 100644
--- a/neonView/KnowledgeNewsFeed_view/KnowledgeNewsFeed_view.aod
+++ b/neonView/KnowledgeNewsFeed_view/KnowledgeNewsFeed_view.aod
@@ -15,12 +15,6 @@
           <title>Knowledge</title>
         </neonDashletCategory>
       </categories>
-      <parameters>
-        <neonDashletParameter>
-          <name>Parameter</name>
-          <value>tre</value>
-        </neonDashletParameter>
-      </parameters>
     </neonDashletConfiguration>
   </dashletConfigurations>
   <layout>
diff --git a/process/KnowledgeManagement_lib/process.js b/process/KnowledgeManagement_lib/process.js
index 8e639f6fcd6..f827b8bf727 100644
--- a/process/KnowledgeManagement_lib/process.js
+++ b/process/KnowledgeManagement_lib/process.js
@@ -332,8 +332,9 @@ KnowledgeManagementTagsController.getInstance = function(pId, pModel)
  */
 KnowledgeManagementTagsController.prototype.addTag = function(pIdValue, pRowData, pFromUpdate)
 {
-    if(!pRowData["TAG.value"] || !pIdValue)
+    if(!pRowData["TAG.value"] || !pRowData["TAG.value"].trim() || !pIdValue)
         return this;
+    pRowData["TAG.value"] = pRowData["TAG.value"].trim();
     //if we get an UUID, an existing tag was chosen and can be added directly
     if(IdUtils.isUUID(pRowData["TAG.value"]))
         _add.apply(this,[pIdValue, pRowData]);
-- 
GitLab


From ec88acec73ea4645978fc7d4a318c7c528f05438 Mon Sep 17 00:00:00 2001
From: Sebastian Listl <s.listl@adito.de>
Date: Thu, 12 Nov 2020 17:02:15 +0100
Subject: [PATCH 080/184] Knowledgemanagement bugfixes and improvements

---
 .../KnowledgeDiscussion_entity.aod            | 17 ++------
 .../KnowledgeDiscussion_entity/afterUiInit.js |  5 ---
 .../children/showall_action/iconIdProcess.js  |  7 ---
 .../showall_action/onActionProcess.js         | 12 ------
 .../onActionProcess.js                        |  2 +-
 .../withclosed_param/valueProcess.js          |  5 ---
 .../contentProcess.js                         | 13 ++----
 .../rowCountProcess.js                        | 12 ++----
 .../KnowledgeLink_entity.aod                  | 38 ++++++++--------
 .../children/contactid_param/valueProcess.js  |  7 ---
 .../children/entity_param/valueProcess.js     |  5 +++
 .../children/objecttype_param/valueProcess.js |  4 --
 .../KnowledgeManagementTags_entity.aod        | 17 +++-----
 .../entityfields/listtitle/valueProcess.js    |  3 --
 .../KnowledgeManagement_entity.aod            |  2 +
 .../author_contact_id/valueProcess.js         |  6 +--
 .../responsible_contact_id/valueProcess.js    |  6 +--
 .../recordcontainers/db/conditionProcess.js   |  3 +-
 .../ObjectProxy_entity/ObjectProxy_entity.aod |  6 +++
 .../KnowledgeManagement.aod                   |  2 +-
 .../KnowledgeDiscussionTree_view.aod          |  1 +
 .../KnowledgeTagList_view.aod                 |  4 +-
 process/KnowledgeManagement_lib/process.js    | 43 ++++++++++++-------
 23 files changed, 84 insertions(+), 136 deletions(-)
 delete mode 100644 entity/KnowledgeDiscussion_entity/afterUiInit.js
 delete mode 100644 entity/KnowledgeDiscussion_entity/entityfields/edit_actiongroup/children/showall_action/iconIdProcess.js
 delete mode 100644 entity/KnowledgeDiscussion_entity/entityfields/edit_actiongroup/children/showall_action/onActionProcess.js
 delete mode 100644 entity/KnowledgeDiscussion_entity/entityfields/withclosed_param/valueProcess.js
 delete mode 100644 entity/KnowledgeLink_entity/entityfields/objects/children/contactid_param/valueProcess.js
 create mode 100644 entity/KnowledgeLink_entity/entityfields/objects/children/entity_param/valueProcess.js
 delete mode 100644 entity/KnowledgeLink_entity/entityfields/objects/children/objecttype_param/valueProcess.js
 delete mode 100644 entity/KnowledgeManagementTags_entity/entityfields/listtitle/valueProcess.js

diff --git a/entity/KnowledgeDiscussion_entity/KnowledgeDiscussion_entity.aod b/entity/KnowledgeDiscussion_entity/KnowledgeDiscussion_entity.aod
index c30b50ef07a..37de8395171 100644
--- a/entity/KnowledgeDiscussion_entity/KnowledgeDiscussion_entity.aod
+++ b/entity/KnowledgeDiscussion_entity/KnowledgeDiscussion_entity.aod
@@ -6,7 +6,6 @@
   <grantCreateProcess>%aditoprj%/entity/KnowledgeDiscussion_entity/grantCreateProcess.js</grantCreateProcess>
   <grantUpdateProcess>%aditoprj%/entity/KnowledgeDiscussion_entity/grantUpdateProcess.js</grantUpdateProcess>
   <grantDeleteProcess>%aditoprj%/entity/KnowledgeDiscussion_entity/grantDeleteProcess.js</grantDeleteProcess>
-  <afterUiInit>%aditoprj%/entity/KnowledgeDiscussion_entity/afterUiInit.js</afterUiInit>
   <iconIdProcess>%aditoprj%/entity/KnowledgeDiscussion_entity/iconIdProcess.js</iconIdProcess>
   <titlePlural>Discussions</titlePlural>
   <recordContainer>JDito_KnowledgeDiscussionContainer</recordContainer>
@@ -30,6 +29,7 @@
     </entityField>
     <entityField>
       <name>STATUS</name>
+      <title>Status</title>
       <consumer>StatusKeyword</consumer>
       <valueProcess>%aditoprj%/entity/KnowledgeDiscussion_entity/entityfields/status/valueProcess.js</valueProcess>
     </entityField>
@@ -92,11 +92,6 @@
       <name>KnowledgeId_param</name>
       <expose v="true" />
     </entityParameter>
-    <entityParameter>
-      <name>WithClosed_param</name>
-      <valueProcess>%aditoprj%/entity/KnowledgeDiscussion_entity/entityfields/withclosed_param/valueProcess.js</valueProcess>
-      <expose v="true" />
-    </entityParameter>
     <entityActionGroup>
       <name>Edit_ActionGroup</name>
       <title>Bearbeiten</title>
@@ -109,13 +104,6 @@
           <iconId>VAADIN:COMMENT_O</iconId>
           <tooltip>Adds an answer to the selected discussion</tooltip>
         </entityActionField>
-        <entityActionField>
-          <name>showAll_action</name>
-          <onActionProcess>%aditoprj%/entity/KnowledgeDiscussion_entity/entityfields/edit_actiongroup/children/showall_action/onActionProcess.js</onActionProcess>
-          <isObjectAction v="false" />
-          <iconIdProcess>%aditoprj%/entity/KnowledgeDiscussion_entity/entityfields/edit_actiongroup/children/showall_action/iconIdProcess.js</iconIdProcess>
-          <tooltip>Toggles view between "show only open discussions" and "show all discussions"</tooltip>
-        </entityActionField>
         <entityActionField>
           <name>toggleDiscussionStatus_action</name>
           <onActionProcess>%aditoprj%/entity/KnowledgeDiscussion_entity/entityfields/edit_actiongroup/children/togglediscussionstatus_action/onActionProcess.js</onActionProcess>
@@ -157,7 +145,7 @@
       <name>JDito_KnowledgeDiscussionContainer</name>
       <jDitoRecordAlias>Data_alias</jDitoRecordAlias>
       <isPageable v="false" />
-      <isFilterable v="false" />
+      <isFilterable v="true" />
       <isRequireContainerFiltering v="true" />
       <isSortable v="false" />
       <contentProcess>%aditoprj%/entity/KnowledgeDiscussion_entity/recordcontainers/jdito_knowledgediscussioncontainer/contentProcess.js</contentProcess>
@@ -184,6 +172,7 @@
         </jDitoRecordFieldMapping>
         <jDitoRecordFieldMapping>
           <name>STATUS.value</name>
+          <isFilterable v="true" />
         </jDitoRecordFieldMapping>
         <jDitoRecordFieldMapping>
           <name>STATUS.displayValue</name>
diff --git a/entity/KnowledgeDiscussion_entity/afterUiInit.js b/entity/KnowledgeDiscussion_entity/afterUiInit.js
deleted file mode 100644
index 4c6bf685556..00000000000
--- a/entity/KnowledgeDiscussion_entity/afterUiInit.js
+++ /dev/null
@@ -1,5 +0,0 @@
-import("system.vars");
-import("system.neon");
-
-if(vars.exists("$param.WithClosed_param") && vars.get("$param.WithClosed_param"))
-    vars.set("$context.showAll", vars.get("$param.WithClosed_param"))
\ No newline at end of file
diff --git a/entity/KnowledgeDiscussion_entity/entityfields/edit_actiongroup/children/showall_action/iconIdProcess.js b/entity/KnowledgeDiscussion_entity/entityfields/edit_actiongroup/children/showall_action/iconIdProcess.js
deleted file mode 100644
index 925dab4fbb0..00000000000
--- a/entity/KnowledgeDiscussion_entity/entityfields/edit_actiongroup/children/showall_action/iconIdProcess.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import("system.vars");
-import("system.result");
-import("system.neon");
-
-var ret = (vars.exists("$context.showAll") && vars.get("$context.showAll") == "true") ? "VAADIN:CLIPBOARD_CHECK" : "VAADIN:CLIPBOARD";
-
-result.string(ret);
\ No newline at end of file
diff --git a/entity/KnowledgeDiscussion_entity/entityfields/edit_actiongroup/children/showall_action/onActionProcess.js b/entity/KnowledgeDiscussion_entity/entityfields/edit_actiongroup/children/showall_action/onActionProcess.js
deleted file mode 100644
index 10b70730e23..00000000000
--- a/entity/KnowledgeDiscussion_entity/entityfields/edit_actiongroup/children/showall_action/onActionProcess.js
+++ /dev/null
@@ -1,12 +0,0 @@
-import("system.vars");
-import("system.result");
-import("system.neon");
-
-if(!vars.exists("$context.showAll"))
-    vars.set("$context.showAll", "true");
-else if((vars.exists("$context.showAll") && vars.get("$context.showAll") == "true"))
-    vars.set("$context.showAll", "false");
-else
-    vars.set("$context.showAll", "true");
-
-neon.refreshAll();
\ No newline at end of file
diff --git a/entity/KnowledgeDiscussion_entity/entityfields/edit_actiongroup/children/togglediscussionstatus_action/onActionProcess.js b/entity/KnowledgeDiscussion_entity/entityfields/edit_actiongroup/children/togglediscussionstatus_action/onActionProcess.js
index b2bac85e2f6..79943300955 100644
--- a/entity/KnowledgeDiscussion_entity/entityfields/edit_actiongroup/children/togglediscussionstatus_action/onActionProcess.js
+++ b/entity/KnowledgeDiscussion_entity/entityfields/edit_actiongroup/children/togglediscussionstatus_action/onActionProcess.js
@@ -9,4 +9,4 @@ var status = (vars.get("$field.STATUS") == $KeywordRegistry.discussionStatus$aci
 
 KnowledgeDiscussion.getInstance(vars.get("$param.KnowledgeId_param"))
                    .setDiscussionStatus(vars.get("$field.UID"), status);
-neon.refreshAll();
\ No newline at end of file
+neon.refresh();
\ No newline at end of file
diff --git a/entity/KnowledgeDiscussion_entity/entityfields/withclosed_param/valueProcess.js b/entity/KnowledgeDiscussion_entity/entityfields/withclosed_param/valueProcess.js
deleted file mode 100644
index 77e47923de2..00000000000
--- a/entity/KnowledgeDiscussion_entity/entityfields/withclosed_param/valueProcess.js
+++ /dev/null
@@ -1,5 +0,0 @@
-import("system.vars");
-import("system.result");
-
-if(vars.exists("$context.showAll"))
-    result.string(vars.get("$context.showAll"));
\ No newline at end of file
diff --git a/entity/KnowledgeDiscussion_entity/recordcontainers/jdito_knowledgediscussioncontainer/contentProcess.js b/entity/KnowledgeDiscussion_entity/recordcontainers/jdito_knowledgediscussioncontainer/contentProcess.js
index fa4fb2b67c3..ea4631c51b7 100644
--- a/entity/KnowledgeDiscussion_entity/recordcontainers/jdito_knowledgediscussioncontainer/contentProcess.js
+++ b/entity/KnowledgeDiscussion_entity/recordcontainers/jdito_knowledgediscussioncontainer/contentProcess.js
@@ -1,21 +1,14 @@
-import("system.logging");
+import("JditoFilter_lib");
 import("KnowledgeManagement_lib");
 import("system.vars");
 import("system.result");
 import("system.neon");
 
-var wClosedParam = null;
-if(vars.exists("$param.WithClosed_param"))
-    wClosedParam = vars.get("$param.WithClosed_param");
-
 var kId = vars.exists("$param.KnowledgeId_param") && vars.get("$param.KnowledgeId_param");
-var withClosed = vars.exists("$context.showAll") && vars.get("$context.showAll");
-
-if(wClosedParam == "true")
-    withClosed = wClosedParam;
 
 var idValues = vars.exists("$local.idvalues") && vars.get("$local.idvalues");
+var filterCondition = new FilterSqlTranslator(vars.get("$local.filter"), "KNOWLEDGEDISCUSSION").getSqlCondition();
 
 var discussions = KnowledgeDiscussion.getInstance(kId);    
-var retData = discussions.buildCompleteTree(KnowledgeDiscussion.getMode(withClosed), idValues).data;
+var retData = discussions.buildCompleteTree(filterCondition, idValues).data;
 result.object(retData);
\ No newline at end of file
diff --git a/entity/KnowledgeDiscussion_entity/recordcontainers/jdito_knowledgediscussioncontainer/rowCountProcess.js b/entity/KnowledgeDiscussion_entity/recordcontainers/jdito_knowledgediscussioncontainer/rowCountProcess.js
index 48a39b7f7de..ceb82cc1070 100644
--- a/entity/KnowledgeDiscussion_entity/recordcontainers/jdito_knowledgediscussioncontainer/rowCountProcess.js
+++ b/entity/KnowledgeDiscussion_entity/recordcontainers/jdito_knowledgediscussioncontainer/rowCountProcess.js
@@ -1,23 +1,17 @@
 import("KnowledgeManagement_lib");
+import("JditoFilter_lib");
 import("system.vars");
 import("system.result");
 import("system.neon");
 
-
-var wClosedParam = null;
-if(vars.exists("$param.WithClosed_param"))
-    wClosedParam = vars.get("$param.WithClosed_param");
-
 var kId = vars.exists("$param.KnowledgeId_param") && vars.get("$param.KnowledgeId_param");
-var withClosed = vars.exists("$context.showAll") && vars.get("$context.showAll");
-if(wClosedParam == "true")
-    withClosed = wClosedParam;
 
 var idValues = vars.exists("$local.idvalues") && vars.get("$local.idvalues");
+var filterCondition = new FilterSqlTranslator(vars.get("$local.filter"), "KNOWLEDGEDISCUSSION").getSqlCondition();
 
 if(kId)
 {
     var discussions = KnowledgeDiscussion.getInstance(kId);    
-    var retData = discussions.getDatasetCount(KnowledgeDiscussion.getMode(withClosed), idValues);
+    var retData = discussions.getDatasetCount(filterCondition, idValues);
     result.object(retData);
 }
\ No newline at end of file
diff --git a/entity/KnowledgeLink_entity/KnowledgeLink_entity.aod b/entity/KnowledgeLink_entity/KnowledgeLink_entity.aod
index 6ebca6010ae..81ffc1da3d8 100644
--- a/entity/KnowledgeLink_entity/KnowledgeLink_entity.aod
+++ b/entity/KnowledgeLink_entity/KnowledgeLink_entity.aod
@@ -2,9 +2,9 @@
 <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>KnowledgeLink_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
-  <title>Verknüpfung</title>
+  <title>Link</title>
   <iconIdProcess>%aditoprj%/entity/KnowledgeLink_entity/iconIdProcess.js</iconIdProcess>
-  <titlePlural>Verknüpfungen</titlePlural>
+  <titlePlural>Links</titlePlural>
   <recordContainer>db</recordContainer>
   <entityFields>
     <entityProvider>
@@ -57,21 +57,17 @@
     </entityConsumer>
     <entityConsumer>
       <name>Objects</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Object_entity</entityName>
-        <fieldName>FilteredObjects</fieldName>
-      </dependency>
       <children>
         <entityParameter>
-          <name>ObjectType_param</name>
-          <valueProcess>%aditoprj%/entity/KnowledgeLink_entity/entityfields/objects/children/objecttype_param/valueProcess.js</valueProcess>
-        </entityParameter>
-        <entityParameter>
-          <name>ContactId_param</name>
-          <valueProcess>%aditoprj%/entity/KnowledgeLink_entity/entityfields/objects/children/contactid_param/valueProcess.js</valueProcess>
+          <name>Entity_param</name>
+          <valueProcess>%aditoprj%/entity/KnowledgeLink_entity/entityfields/objects/children/entity_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>ObjectProxy_entity</entityName>
+        <fieldName>FilteredObjects</fieldName>
+      </dependency>
     </entityConsumer>
     <entityParameter>
       <name>KnowledgeManagementId_param</name>
@@ -81,14 +77,6 @@
       <name>ByKnowledgeId</name>
       <targetContextField>OBJECT_TYPE</targetContextField>
       <targetIdField>ROW_ID</targetIdField>
-      <dependencies>
-        <entityDependency>
-          <name>c3ed10c1-db55-4e55-9c18-2b8d400df033</name>
-          <entityName>KnowledgeManagement_entity</entityName>
-          <fieldName>LinksByKnowledgeId</fieldName>
-          <isConsumer v="false" />
-        </entityDependency>
-      </dependencies>
       <children>
         <entityParameter>
           <name>ObjectType_param</name>
@@ -99,6 +87,14 @@
           <expose v="false" />
         </entityParameter>
       </children>
+      <dependencies>
+        <entityDependency>
+          <name>c3ed10c1-db55-4e55-9c18-2b8d400df033</name>
+          <entityName>KnowledgeManagement_entity</entityName>
+          <fieldName>LinksByKnowledgeId</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+      </dependencies>
     </entityProvider>
     <entityProvider>
       <name>ByLink</name>
diff --git a/entity/KnowledgeLink_entity/entityfields/objects/children/contactid_param/valueProcess.js b/entity/KnowledgeLink_entity/entityfields/objects/children/contactid_param/valueProcess.js
deleted file mode 100644
index f781937a2a2..00000000000
--- a/entity/KnowledgeLink_entity/entityfields/objects/children/contactid_param/valueProcess.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import("system.vars");
-import("system.result");
-
-var rowId = vars.get("$field.ROW_ID");
-
-if(rowId != null && rowId != "")
-    result.string(rowId);
\ No newline at end of file
diff --git a/entity/KnowledgeLink_entity/entityfields/objects/children/entity_param/valueProcess.js b/entity/KnowledgeLink_entity/entityfields/objects/children/entity_param/valueProcess.js
new file mode 100644
index 00000000000..7f9d49710e5
--- /dev/null
+++ b/entity/KnowledgeLink_entity/entityfields/objects/children/entity_param/valueProcess.js
@@ -0,0 +1,5 @@
+import("system.vars");
+import("Context_lib");
+import("system.result");
+
+result.string(ContextUtils.getEntity(vars.get("$field.OBJECT_TYPE")));
\ No newline at end of file
diff --git a/entity/KnowledgeLink_entity/entityfields/objects/children/objecttype_param/valueProcess.js b/entity/KnowledgeLink_entity/entityfields/objects/children/objecttype_param/valueProcess.js
deleted file mode 100644
index 03654e9e879..00000000000
--- a/entity/KnowledgeLink_entity/entityfields/objects/children/objecttype_param/valueProcess.js
+++ /dev/null
@@ -1,4 +0,0 @@
-import("system.vars");
-import("system.result");
-
-result.string(vars.get("$field.OBJECT_TYPE"));
\ No newline at end of file
diff --git a/entity/KnowledgeManagementTags_entity/KnowledgeManagementTags_entity.aod b/entity/KnowledgeManagementTags_entity/KnowledgeManagementTags_entity.aod
index 4e7cf8e9b74..552ce5d4c60 100644
--- a/entity/KnowledgeManagementTags_entity/KnowledgeManagementTags_entity.aod
+++ b/entity/KnowledgeManagementTags_entity/KnowledgeManagementTags_entity.aod
@@ -13,6 +13,12 @@
     </entityParameter>
     <entityProvider>
       <name>ByKnowledgeManagementId</name>
+      <children>
+        <entityParameter>
+          <name>KnowledgeManagementId_param</name>
+          <mandatory v="true" />
+        </entityParameter>
+      </children>
       <dependencies>
         <entityDependency>
           <name>8d86a61b-0fe3-44c4-a512-e044c990fded</name>
@@ -21,12 +27,6 @@
           <isConsumer v="false" />
         </entityDependency>
       </dependencies>
-      <children>
-        <entityParameter>
-          <name>KnowledgeManagementId_param</name>
-          <mandatory v="true" />
-        </entityParameter>
-      </children>
     </entityProvider>
     <entityField>
       <name>TAG</name>
@@ -47,11 +47,6 @@
         <fieldName>CompleteList</fieldName>
       </dependency>
     </entityConsumer>
-    <entityField>
-      <name>ListTitle</name>
-      <state>READONLY</state>
-      <valueProcess>%aditoprj%/entity/KnowledgeManagementTags_entity/entityfields/listtitle/valueProcess.js</valueProcess>
-    </entityField>
     <entityActionField>
       <name>ActionField1</name>
       <title>a1</title>
diff --git a/entity/KnowledgeManagementTags_entity/entityfields/listtitle/valueProcess.js b/entity/KnowledgeManagementTags_entity/entityfields/listtitle/valueProcess.js
deleted file mode 100644
index 2c6c244e954..00000000000
--- a/entity/KnowledgeManagementTags_entity/entityfields/listtitle/valueProcess.js
+++ /dev/null
@@ -1,3 +0,0 @@
-import("system.result");
-
-result.string("Tag:");
\ No newline at end of file
diff --git a/entity/KnowledgeManagement_entity/KnowledgeManagement_entity.aod b/entity/KnowledgeManagement_entity/KnowledgeManagement_entity.aod
index b05003ab87f..c65093499e8 100644
--- a/entity/KnowledgeManagement_entity/KnowledgeManagement_entity.aod
+++ b/entity/KnowledgeManagement_entity/KnowledgeManagement_entity.aod
@@ -54,6 +54,7 @@
       <name>AUTHOR_CONTACT_ID</name>
       <title>Author</title>
       <consumer>PersonContacts</consumer>
+      <linkedContext>Person</linkedContext>
       <valueProcess>%aditoprj%/entity/KnowledgeManagement_entity/entityfields/author_contact_id/valueProcess.js</valueProcess>
       <displayValueProcess>%aditoprj%/entity/KnowledgeManagement_entity/entityfields/author_contact_id/displayValueProcess.js</displayValueProcess>
     </entityField>
@@ -320,6 +321,7 @@
       <name>RESPONSIBLE_CONTACT_ID</name>
       <title>Responsible</title>
       <consumer>PersonContacts</consumer>
+      <linkedContext>Person</linkedContext>
       <valueProcess>%aditoprj%/entity/KnowledgeManagement_entity/entityfields/responsible_contact_id/valueProcess.js</valueProcess>
       <displayValueProcess>%aditoprj%/entity/KnowledgeManagement_entity/entityfields/responsible_contact_id/displayValueProcess.js</displayValueProcess>
     </entityField>
diff --git a/entity/KnowledgeManagement_entity/entityfields/author_contact_id/valueProcess.js b/entity/KnowledgeManagement_entity/entityfields/author_contact_id/valueProcess.js
index 48206583bee..73c38e80b26 100644
--- a/entity/KnowledgeManagement_entity/entityfields/author_contact_id/valueProcess.js
+++ b/entity/KnowledgeManagement_entity/entityfields/author_contact_id/valueProcess.js
@@ -1,8 +1,6 @@
+import("Employee_lib");
 import("system.vars");
 import("system.result");
-import("system.tools");
 
 if(vars.exists("$this.value") && vars.get("$this.value") == null)
-{
-    result.string(tools.getUser(vars.get("$sys.user"))[tools.PARAMS][tools.CONTACTID]);
-}
\ No newline at end of file
+    result.string(EmployeeUtils.getCurrentContactId());
\ No newline at end of file
diff --git a/entity/KnowledgeManagement_entity/entityfields/responsible_contact_id/valueProcess.js b/entity/KnowledgeManagement_entity/entityfields/responsible_contact_id/valueProcess.js
index 48206583bee..73c38e80b26 100644
--- a/entity/KnowledgeManagement_entity/entityfields/responsible_contact_id/valueProcess.js
+++ b/entity/KnowledgeManagement_entity/entityfields/responsible_contact_id/valueProcess.js
@@ -1,8 +1,6 @@
+import("Employee_lib");
 import("system.vars");
 import("system.result");
-import("system.tools");
 
 if(vars.exists("$this.value") && vars.get("$this.value") == null)
-{
-    result.string(tools.getUser(vars.get("$sys.user"))[tools.PARAMS][tools.CONTACTID]);
-}
\ No newline at end of file
+    result.string(EmployeeUtils.getCurrentContactId());
\ No newline at end of file
diff --git a/entity/KnowledgeManagement_entity/recordcontainers/db/conditionProcess.js b/entity/KnowledgeManagement_entity/recordcontainers/db/conditionProcess.js
index 938e3152c59..d73eb83fe46 100644
--- a/entity/KnowledgeManagement_entity/recordcontainers/db/conditionProcess.js
+++ b/entity/KnowledgeManagement_entity/recordcontainers/db/conditionProcess.js
@@ -18,8 +18,9 @@ if(vars.exists("$param.isDashlet_param") && vars.get("$param.isDashlet_param"))
     .and(null
         ,newSelect("KNOWLEDGETAGLINK.KNOWLEDGETAGLINKID")
         .from("KNOWLEDGETAGLINK")
+        .join("KNOWLEDGETAG", "KNOWLEDGETAGLINK.KNOWLEDGETAG_ID = KNOWLEDGETAG.KNOWLEDGETAGID")
         .where("KNOWLEDGETAGLINK.KNOWLEDGEMANAGEMENT_ID = KNOWLEDGEMANAGEMENT.KNOWLEDGEMANAGEMENTID")
-        .and("KNOWLEDGETAGLINK.KNOWLEDGETAG_ID", "9c1bb89e-60db-4a50-ba77-c81a8ec82d2c"), SqlBuilder.EXISTS());
+        .and("KNOWLEDGETAG.TAG", "News"), SqlBuilder.EXISTS());
 }
 
 result.string(cond.toString());
\ No newline at end of file
diff --git a/entity/ObjectProxy_entity/ObjectProxy_entity.aod b/entity/ObjectProxy_entity/ObjectProxy_entity.aod
index ade8076995c..e197c4de792 100644
--- a/entity/ObjectProxy_entity/ObjectProxy_entity.aod
+++ b/entity/ObjectProxy_entity/ObjectProxy_entity.aod
@@ -31,6 +31,12 @@
           <fieldName>LinkedObject</fieldName>
           <isConsumer v="false" />
         </entityDependency>
+        <entityDependency>
+          <name>9d75842d-0f91-4ddf-bd94-d8f092f17224</name>
+          <entityName>KnowledgeLink_entity</entityName>
+          <fieldName>Objects</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
       </dependencies>
     </entityProvider>
     <entityParameter>
diff --git a/neonContext/KnowledgeManagement/KnowledgeManagement.aod b/neonContext/KnowledgeManagement/KnowledgeManagement.aod
index 44e4b904929..392aeb6cef2 100644
--- a/neonContext/KnowledgeManagement/KnowledgeManagement.aod
+++ b/neonContext/KnowledgeManagement/KnowledgeManagement.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>KnowledgeManagement</name>
-  <title>Knowledgemanagement</title>
+  <title>Knowledge Management</title>
   <description>&lt;null value&gt;</description>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <icon>VAADIN:ACADEMY_CAP</icon>
diff --git a/neonView/KnowledgeDiscussionTree_view/KnowledgeDiscussionTree_view.aod b/neonView/KnowledgeDiscussionTree_view/KnowledgeDiscussionTree_view.aod
index 601327c7d5b..ec4ef34471b 100644
--- a/neonView/KnowledgeDiscussionTree_view/KnowledgeDiscussionTree_view.aod
+++ b/neonView/KnowledgeDiscussionTree_view/KnowledgeDiscussionTree_view.aod
@@ -2,6 +2,7 @@
 <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>KnowledgeDiscussionTree_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
+  <filterable v="true" />
   <layout>
     <boxLayout>
       <name>layout</name>
diff --git a/neonView/KnowledgeTagList_view/KnowledgeTagList_view.aod b/neonView/KnowledgeTagList_view/KnowledgeTagList_view.aod
index 20b683b7634..61be3f1b770 100644
--- a/neonView/KnowledgeTagList_view/KnowledgeTagList_view.aod
+++ b/neonView/KnowledgeTagList_view/KnowledgeTagList_view.aod
@@ -11,13 +11,13 @@
   <children>
     <titledListViewTemplate>
       <name>TagList</name>
-      <titleField>ListTitle</titleField>
       <entityField>#ENTITY</entityField>
       <title>Tags</title>
       <columns>
         <neonTitledListTableColumn>
-          <name>4522858e-7bcb-43e3-b542-410898a8b90a</name>
+          <name>03ec809f-d410-4247-98a8-50022222c785</name>
           <entityField>TAG</entityField>
+          <fullWidth v="true" />
         </neonTitledListTableColumn>
       </columns>
     </titledListViewTemplate>
diff --git a/process/KnowledgeManagement_lib/process.js b/process/KnowledgeManagement_lib/process.js
index f827b8bf727..9ec7cfda580 100644
--- a/process/KnowledgeManagement_lib/process.js
+++ b/process/KnowledgeManagement_lib/process.js
@@ -547,12 +547,12 @@ KnowledgeDiscussion.getInstance = function(pKnowledgeId)
  * Function for getting the row count, uses less complex SQL and doesn't have the tree generation.
  * It's used in the rowCountProcess of the RecordContainer of the KnowledgeDiscussion entity, to improve performance
  *
- * @param {KnowledgeDiscussion.WITHCLOSED|KnowledgeDiscussion.ONLYACTIVE} pMode Takes the value of one of the two mode constants
+ * @param {SqlBuilder} pCondition sql condition
  * @param {Array} pIdValues Takes an array of ids, typically one id with single selection, to only load the selected discusssion for the preview view
  *
  * @return {int} Total number of Datasets to load
  */
-KnowledgeDiscussion.prototype.getDatasetCount = function(pMode, pIdValues)
+KnowledgeDiscussion.prototype.getDatasetCount = function(pCondition, pIdValues)
 {
     var knowledgeSql = newSelect("count(*)").from("KNOWLEDGEMANAGEMENT").join("KNOWLEDGEDISCUSSION", "KNOWLEDGEMANAGEMENT.KNOWLEDGEMANAGEMENTID = KNOWLEDGEDISCUSSION.KNOWLEDGEMANAGEMENT_ID").where();
 
@@ -560,10 +560,10 @@ KnowledgeDiscussion.prototype.getDatasetCount = function(pMode, pIdValues)
 
     var discussionSql = newSelect("count(*)").from("KNOWLEDGEDISCUSSION").where();
 
-    if(pMode == "true")
+    if(pCondition)
     {
-        discussionSql.and("KNOWLEDGEDISCUSSION.STATUS", $KeywordRegistry.discussionStatus$acitve());
-        knowledgeSql.and("KNOWLEDGEDISCUSSION.STATUS", $KeywordRegistry.discussionStatus$acitve());
+        discussionSql.andIfSet(pCondition);
+        knowledgeSql.andIfSet(pCondition);
     }
 
     if(pIdValues)
@@ -592,13 +592,13 @@ KnowledgeDiscussion.prototype.getDatasetCount = function(pMode, pIdValues)
  * The tree always gets sorted by the date of the most recent action. Either a new answer to an discussion or an edit of an discussion
  * Data is retireved by reading the data property of your instance of KnowledgeDiscussion after running buildCompleteTree
  *
- * @param {KnowledgeDiscussion.WITHCLOSED|KnowledgeDiscussion.ONLYACTIVE} pMode Takes the value of one of the two mode constants
+ * @param {SqlBuilder} pCondition sql condition
  * @param {Array} pIdValues Takes an array of ids, typically one id with single selection, to only load the selected discusssion for the preview view
  * @param {Boolean} pGetAll Switch, which determines if all discussions on all knowledge entries should be loaded or only the discussion for one specific knowledge.
  *
  * @return {this} returns the now filled instance of the object.
  */
-KnowledgeDiscussion.prototype.buildCompleteTree = function(pMode, pIdValues, pGetAll)
+KnowledgeDiscussion.prototype.buildCompleteTree = function(pCondition, pIdValues, pGetAll)
 {
     var knowledgeSql = newSelect("KNOWLEDGEMANAGEMENT.KNOWLEDGEMANAGEMENTID, KNOWLEDGEMANAGEMENT.TITLE").from("KNOWLEDGEMANAGEMENT")
     .join("KNOWLEDGEDISCUSSION", "KNOWLEDGEMANAGEMENT.KNOWLEDGEMANAGEMENTID = KNOWLEDGEDISCUSSION.KNOWLEDGEMANAGEMENT_ID")
@@ -619,10 +619,10 @@ KnowledgeDiscussion.prototype.buildCompleteTree = function(pMode, pIdValues, pGe
         TOP_CLOSED:"VAADIN:LOCK"
     };
 
-    if(pMode == "true" && !(pIdValues && pIdValues.length == 1))
+    if(pCondition && !(pIdValues && pIdValues.length == 1))
     {
-        discussionSql.and("KNOWLEDGEDISCUSSION.STATUS", $KeywordRegistry.discussionStatus$acitve());
-        knowledgeSql.and("KNOWLEDGEDISCUSSION.STATUS", $KeywordRegistry.discussionStatus$acitve());
+        discussionSql.andIfSet(pCondition);
+        knowledgeSql.andIfSet(pCondition);
     }
 
     if(pIdValues)
@@ -636,7 +636,24 @@ KnowledgeDiscussion.prototype.buildCompleteTree = function(pMode, pIdValues, pGe
     else if(this.knowledgeId)
         discussionSql.and("KNOWLEDGEDISCUSSION.KNOWLEDGEMANAGEMENT_ID", this.knowledgeId);
 
-    var discussionData = discussionSql.table()
+    var discussionData = discussionSql.table();
+    
+    //remove all parent-ids that can't be found in the array, otherwise these would not be included in the tree
+    //(if these entries were not included, the result from the rowCountProcess would be incorrect)
+    if (Utils.isNullOrEmpty(pIdValues))
+    {
+        var allDiscussionIds = new Set();
+        discussionData.forEach(function ([discussionId]) 
+        {
+            allDiscussionIds.add(discussionId);
+        });
+        discussionData.forEach(function (row) 
+        {
+            if (!allDiscussionIds.has(row[1]))
+                row[1] = ""; 
+        });
+    }
+    
     var user, userTitle, discussionTitle;
 
     //adding firstname and lastname from employee as author displayvalue and add icon
@@ -1021,10 +1038,6 @@ KnowledgeDiscussion.hasChildren = function(pId)
     return newSelect("count(*)").from("KNOWLEDGEDISCUSSION").where("KNOWLEDGEDISCUSSION.PARENTENTRY", pId).cell() > 0
 }
 
-KnowledgeDiscussion.getMode = function (pWithClosed)
-{
-    return ((pWithClosed == "true") ? "false" : "true");
-}
 /**
  * Function for setting the status of a discussion AND its children
  * @param {String} pDiscussionId The id of the discussion
-- 
GitLab


From d1d112a4ffc6ad02acb813ad520c134c7fa3bdd7 Mon Sep 17 00:00:00 2001
From: Sebastian Listl <s.listl@adito.de>
Date: Thu, 12 Nov 2020 17:54:58 +0100
Subject: [PATCH 081/184] Translations for Knowledge management

---
 .../data/knowledgeKeywords.xml                |  4 +-
 .../_____SYSTEM_APPLICATION_NEON.aod          |  2 +-
 .../KnowledgeDiscussion_entity.aod            |  4 +-
 .../_____LANGUAGE_EXTRA.aod                   | 15 ++-
 .../_____LANGUAGE_de/_____LANGUAGE_de.aod     | 92 ++++++++++++++++---
 .../_____LANGUAGE_en/_____LANGUAGE_en.aod     | 15 ++-
 .../KnowledgeManagementFilter_view.aod        |  4 +-
 .../KnowledgeNewsFeed_view.aod                |  3 +-
 8 files changed, 102 insertions(+), 37 deletions(-)

diff --git a/.liquibase/Data_alias/basic/2020.2.2/Knowledgemanagement/data/knowledgeKeywords.xml b/.liquibase/Data_alias/basic/2020.2.2/Knowledgemanagement/data/knowledgeKeywords.xml
index 10bb6c90408..51f7d6b6984 100644
--- a/.liquibase/Data_alias/basic/2020.2.2/Knowledgemanagement/data/knowledgeKeywords.xml
+++ b/.liquibase/Data_alias/basic/2020.2.2/Knowledgemanagement/data/knowledgeKeywords.xml
@@ -7,7 +7,7 @@
         <insert tableName="AB_KEYWORD_ENTRY">
             <column name="AB_KEYWORD_ENTRYID" value="DISCUSSIONACTIVE"/>
             <column name="KEYID" value="ACTIVE"/>
-            <column name="TITLE" value="active"/>
+            <column name="TITLE" value="Active"/>
             <column name="CONTAINER" value="DiscussionStatus"/>
             <column name="SORTING" valueNumeric="1"/>
             <column name="ISACTIVE" valueNumeric="1"/>
@@ -15,7 +15,7 @@
         <insert tableName="AB_KEYWORD_ENTRY">
             <column name="AB_KEYWORD_ENTRYID" value="DISCUSSIONCLOSED"/>
             <column name="KEYID" value="CLOSED"/>
-            <column name="TITLE" value="closed"/>
+            <column name="TITLE" value="Closed"/>
             <column name="CONTAINER" value="DiscussionStatus"/>
             <column name="SORTING" valueNumeric="2"/>
             <column name="ISACTIVE" valueNumeric="1"/>
diff --git a/application/_____SYSTEM_APPLICATION_NEON/_____SYSTEM_APPLICATION_NEON.aod b/application/_____SYSTEM_APPLICATION_NEON/_____SYSTEM_APPLICATION_NEON.aod
index 66bb73bc2f0..9e61fe62da3 100644
--- a/application/_____SYSTEM_APPLICATION_NEON/_____SYSTEM_APPLICATION_NEON.aod
+++ b/application/_____SYSTEM_APPLICATION_NEON/_____SYSTEM_APPLICATION_NEON.aod
@@ -250,7 +250,7 @@
       <entityNode>
         <name>Group</name>
         <kind v="123" />
-        <title>Knowledgemanagement</title>
+        <title>Knowledge Management</title>
         <icon>VAADIN:ACADEMY_CAP</icon>
         <childNodes>
           <entityNode>
diff --git a/entity/KnowledgeDiscussion_entity/KnowledgeDiscussion_entity.aod b/entity/KnowledgeDiscussion_entity/KnowledgeDiscussion_entity.aod
index 37de8395171..a5465f6d0a9 100644
--- a/entity/KnowledgeDiscussion_entity/KnowledgeDiscussion_entity.aod
+++ b/entity/KnowledgeDiscussion_entity/KnowledgeDiscussion_entity.aod
@@ -98,6 +98,7 @@
       <children>
         <entityActionField>
           <name>addAnswer_action</name>
+          <title>Reply</title>
           <onActionProcess>%aditoprj%/entity/KnowledgeDiscussion_entity/entityfields/edit_actiongroup/children/addanswer_action/onActionProcess.js</onActionProcess>
           <isObjectAction v="false" />
           <isSelectionAction v="true" />
@@ -106,6 +107,7 @@
         </entityActionField>
         <entityActionField>
           <name>toggleDiscussionStatus_action</name>
+          <title>Toggle status</title>
           <onActionProcess>%aditoprj%/entity/KnowledgeDiscussion_entity/entityfields/edit_actiongroup/children/togglediscussionstatus_action/onActionProcess.js</onActionProcess>
           <isObjectAction v="false" />
           <isSelectionAction v="true" />
@@ -130,7 +132,7 @@
     </entityField>
     <entityField>
       <name>discussionTitle</name>
-      <title>Created / Edited</title>
+      <title>Last change</title>
     </entityField>
     <entityField>
       <name>UID</name>
diff --git a/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod b/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod
index c5139ee3b51..c4a9eb1ad2d 100644
--- a/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod
+++ b/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod
@@ -5333,9 +5333,6 @@
     <entry>
       <key>Mobility, Transport and Logistics</key>
     </entry>
-    <entry>
-      <key>Salesproject</key>
-    </entry>
     <entry>
       <key>Load data</key>
     </entry>
@@ -6290,9 +6287,6 @@
     <entry>
       <key>Lead Import</key>
     </entry>
-    <entry>
-      <key>Contact Management</key>
-    </entry>
     <entry>
       <key>Campaign Planning</key>
     </entry>
@@ -6521,9 +6515,6 @@
     <entry>
       <key>Full details</key>
     </entry>
-    <entry>
-      <key>Salesprojects</key>
-    </entry>
     <entry>
       <key>set Read</key>
     </entry>
@@ -7302,6 +7293,12 @@
     <entry>
       <key>Email address</key>
     </entry>
+    <entry>
+      <key>#rememberme</key>
+    </entry>
+    <entry>
+      <key>#login</key>
+    </entry>
   </keyValueMap>
   <font name="Dialog" style="0" size="11" />
   <sqlModels>
diff --git a/language/_____LANGUAGE_de/_____LANGUAGE_de.aod b/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
index 12c75fdb56f..1581ad2733f 100644
--- a/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
+++ b/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
@@ -42,6 +42,10 @@
       <key>Data imported. Contact not found.</key>
       <value>Daten importiert. Keine weiteren Personendaten gefunden.</value>
     </entry>
+    <entry>
+      <key>Last change</key>
+      <value>Letzte Änderung</value>
+    </entry>
     <entry>
       <key>Variables</key>
       <value>Variablen</value>
@@ -50,6 +54,10 @@
       <key>Finished</key>
       <value>Fertig</value>
     </entry>
+    <entry>
+      <key>Knowledge Management</key>
+      <value>Wissensmanagement</value>
+    </entry>
     <entry>
       <key>Show my organisations</key>
       <value>Meine Firmen anzeigen</value>
@@ -58,6 +66,10 @@
       <key>Radius Search</key>
       <value>Umkreissuche</value>
     </entry>
+    <entry>
+      <key>Discussion</key>
+      <value>Diskussion</value>
+    </entry>
     <entry>
       <key>${FILTER_DYNAMIC_VALUE_ME}</key>
       <value>Ich</value>
@@ -1371,6 +1383,10 @@
       <key>IN</key>
       <value>EIN</value>
     </entry>
+    <entry>
+      <key>Knowledge</key>
+      <value>Wissen</value>
+    </entry>
     <entry>
       <key>OUT</key>
       <value>AUS</value>
@@ -1686,6 +1702,10 @@
       <key>Role</key>
       <value>Rolle</value>
     </entry>
+    <entry>
+      <key>Closed</key>
+      <value>Geschlossen</value>
+    </entry>
     <entry>
       <key>End date</key>
       <value>Enddatum</value>
@@ -2987,6 +3007,10 @@
       <key>Georgia</key>
       <value>Georgia</value>
     </entry>
+    <entry>
+      <key>Publishing level</key>
+      <value>Veröffentlichung</value>
+    </entry>
     <entry>
       <key>Saint Kitts and Nevis</key>
       <value>St. Kitts und Nevis</value>
@@ -3171,6 +3195,10 @@
       <key>Project manager</key>
       <value>Projektmanager</value>
     </entry>
+    <entry>
+      <key>List news articles</key>
+      <value>News-Artikel auflisten</value>
+    </entry>
     <entry>
       <key>Singapore</key>
       <value>Singapur</value>
@@ -4443,6 +4471,10 @@
       <key>Relation Title</key>
       <value>Beziehungstitel</value>
     </entry>
+    <entry>
+      <key>Knowledge entries</key>
+      <value>Wissenseinträge</value>
+    </entry>
     <entry>
       <key>%0 \"%1\"</key>
     </entry>
@@ -4454,10 +4486,18 @@
       <key>Data executed</key>
       <value>Daten ausgeführt</value>
     </entry>
+    <entry>
+      <key>Export HTML</key>
+      <value>HTML exportieren</value>
+    </entry>
     <entry>
       <key>Indexsearch</key>
       <value>Indexsuche</value>
     </entry>
+    <entry>
+      <key>Edited on</key>
+      <value>Bearbeitet am</value>
+    </entry>
     <entry>
       <key>Appointment link Id</key>
       <value>Terminverknüpfungs Id</value>
@@ -4482,6 +4522,10 @@
       <key>Int value</key>
       <value>Zahlenwert</value>
     </entry>
+    <entry>
+      <key>Text content</key>
+      <value>Textinhalt</value>
+    </entry>
     <entry>
       <key>Object 2 row Id</key>
       <value>Objekt 2 Row Id</value>
@@ -4622,6 +4666,10 @@
       <key>Address addition</key>
       <value>Adresszusatz</value>
     </entry>
+    <entry>
+      <key>Shows complete news articles</key>
+      <value>Zeigt News-Artikel vollständig an</value>
+    </entry>
     <entry>
       <key>the \"%0\" table is configured to get logged but this is the logging-stoarge itself and cannot be monitored</key>
       <value>Die "% 0" -Tabelle ist so konfiguriert, dass sie protokolliert wird. Dies ist jedoch der Protokollierspeicher selbst und kann nicht überwacht werden</value>
@@ -5294,6 +5342,10 @@
       <key>Minimal count must be a positive whole number</key>
       <value>Minimale Anzahl muss eine positive, ganze Zahl sein</value>
     </entry>
+    <entry>
+      <key>All Knowledge Entries</key>
+      <value>Alle Wissenseinträge</value>
+    </entry>
     <entry>
       <key>Maximal count must be one or higher</key>
       <value>Maximale Anzahl muss eins oder höher sein</value>
@@ -5338,6 +5390,10 @@
       <key>Privacy agreement</key>
       <value>Datenschutzabkommen</value>
     </entry>
+    <entry>
+      <key>Newsfeed (Preview)</key>
+      <value>Newsfeed (Vorschau)</value>
+    </entry>
     <entry>
       <key>Commodity group A</key>
       <value>Warengruppe A</value>
@@ -6881,6 +6937,10 @@
       <key>Faroe Islands</key>
       <value>Färöer</value>
     </entry>
+    <entry>
+      <key>Discussions</key>
+      <value>Diskussionen</value>
+    </entry>
     <entry>
       <key>${CONTRACT_STATUS}</key>
       <value>Vertragsstatus</value>
@@ -6964,10 +7024,6 @@
     <entry>
       <key>yyyyMMdd</key>
     </entry>
-    <entry>
-      <key>Salesproject</key>
-      <value>Vertriebsprojekt</value>
-    </entry>
     <entry>
       <key>closed</key>
       <value>geschlossen</value>
@@ -7120,6 +7176,10 @@
       <key>Column 7</key>
       <value>Spalte 7</value>
     </entry>
+    <entry>
+      <key>Reply</key>
+      <value>Antworten</value>
+    </entry>
     <entry>
       <key>Column 6</key>
       <value>Spalte 6</value>
@@ -7188,6 +7248,10 @@
       <key>Lead</key>
       <value>Lead </value>
     </entry>
+    <entry>
+      <key>Toggle status</key>
+      <value>Status ändern</value>
+    </entry>
     <entry>
       <key>Company name</key>
       <value>Firmenname</value>
@@ -7869,6 +7933,10 @@ Bitte Datumseingabe prüfen</value>
       <key>${CANCELLED}</key>
       <value>Abgebrochen</value>
     </entry>
+    <entry>
+      <key>Newsfeed (Full)</key>
+      <value>Newsfeed (Vollständig)</value>
+    </entry>
     <entry>
       <key>Workflow signal</key>
       <value>Workflow Signal</value>
@@ -8553,10 +8621,6 @@ Bitte Datumseingabe prüfen</value>
       <key>Lead Import</key>
       <value>Leadimport</value>
     </entry>
-    <entry>
-      <key>Contact Management</key>
-      <value>Kontaktmanagement</value>
-    </entry>
     <entry>
       <key>Campaign Planning</key>
       <value>Kampagnenplanung</value>
@@ -8565,6 +8629,10 @@ Bitte Datumseingabe prüfen</value>
       <key>Bulk Mail</key>
       <value>Serienmail</value>
     </entry>
+    <entry>
+      <key>Knowledge Role</key>
+      <value>Wissensrolle</value>
+    </entry>
     <entry>
       <key>Workflow Definition</key>
       <value>Workflowdefinition</value>
@@ -8725,6 +8793,10 @@ Bitte Datumseingabe prüfen</value>
       <key>Read and Write Permission</key>
       <value>Volle Lese- und Schreibberechtigung</value>
     </entry>
+    <entry>
+      <key>Created on</key>
+      <value>Erstellt am</value>
+    </entry>
     <entry>
       <key>Synchronize calendar permissions from Exchange to ADITO</key>
       <value>Synchronisiere Kalenderberechtigungen von Exchange nach ADITO</value>
@@ -8753,10 +8825,6 @@ Bitte Datumseingabe prüfen</value>
       <key>Not created yet</key>
       <value>Noch nicht erstellt</value>
     </entry>
-    <entry>
-      <key>Salesprojects</key>
-      <value>Vertriebsprojekte</value>
-    </entry>
     <entry>
       <key>set Read</key>
       <value>Gelesen setzen</value>
diff --git a/language/_____LANGUAGE_en/_____LANGUAGE_en.aod b/language/_____LANGUAGE_en/_____LANGUAGE_en.aod
index df669706ecc..a678822107a 100644
--- a/language/_____LANGUAGE_en/_____LANGUAGE_en.aod
+++ b/language/_____LANGUAGE_en/_____LANGUAGE_en.aod
@@ -5410,9 +5410,6 @@
     <entry>
       <key>Mobility, Transport and Logistics</key>
     </entry>
-    <entry>
-      <key>Salesproject</key>
-    </entry>
     <entry>
       <key>Load data</key>
     </entry>
@@ -6363,9 +6360,6 @@
     <entry>
       <key>Lead Import</key>
     </entry>
-    <entry>
-      <key>Contact Management</key>
-    </entry>
     <entry>
       <key>Campaign Planning</key>
     </entry>
@@ -6606,9 +6600,6 @@
     <entry>
       <key>Invalid file type; only .html, .eml and .txt are allowed</key>
     </entry>
-    <entry>
-      <key>Salesprojects</key>
-    </entry>
     <entry>
       <key>set Read</key>
     </entry>
@@ -7383,6 +7374,12 @@
     <entry>
       <key>Email address</key>
     </entry>
+    <entry>
+      <key>#rememberme</key>
+    </entry>
+    <entry>
+      <key>#login</key>
+    </entry>
   </keyValueMap>
   <font name="Dialog" style="0" size="11" />
 </language>
diff --git a/neonView/KnowledgeManagementFilter_view/KnowledgeManagementFilter_view.aod b/neonView/KnowledgeManagementFilter_view/KnowledgeManagementFilter_view.aod
index 7a2dfc261ca..68e3c959472 100644
--- a/neonView/KnowledgeManagementFilter_view/KnowledgeManagementFilter_view.aod
+++ b/neonView/KnowledgeManagementFilter_view/KnowledgeManagementFilter_view.aod
@@ -5,9 +5,9 @@
   <filterable v="true" />
   <dashletConfigurations>
     <neonDashletConfiguration>
-      <name>Wissen</name>
+      <name>Knowledge</name>
       <title>Knowledge</title>
-      <description>All Articles</description>
+      <description>All Knowledge Entries</description>
       <fragment>KnowledgeManagement/filter</fragment>
       <icon>VAADIN:ACADEMY_CAP</icon>
       <categories>
diff --git a/neonView/KnowledgeNewsFeed_view/KnowledgeNewsFeed_view.aod b/neonView/KnowledgeNewsFeed_view/KnowledgeNewsFeed_view.aod
index eb513c6f972..e0334d035e7 100644
--- a/neonView/KnowledgeNewsFeed_view/KnowledgeNewsFeed_view.aod
+++ b/neonView/KnowledgeNewsFeed_view/KnowledgeNewsFeed_view.aod
@@ -6,7 +6,8 @@
   <dashletConfigurations>
     <neonDashletConfiguration>
       <name>knowledgeNewsFeed_dashletConfig</name>
-      <title>Newsfeed (Complete Article)</title>
+      <title>Newsfeed (Full)</title>
+      <description>Shows complete news articles</description>
       <fragment>KnowledgeNewsFeed/filter</fragment>
       <icon>VAADIN:NEWSPAPER</icon>
       <categories>
-- 
GitLab


From 56c7a435b5ef62808e82c64edf53c750823cc97c Mon Sep 17 00:00:00 2001
From: "a.schindlbeck" <a.schindlbeck@adito.de>
Date: Fri, 2 Oct 2020 16:16:29 +0200
Subject: [PATCH 082/184] Calendar: Get all attendees with READ

---
 .../entityfields/attendees/dropDownProcess.js                   | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/entity/Appointment_entity/entityfields/attendees/dropDownProcess.js b/entity/Appointment_entity/entityfields/attendees/dropDownProcess.js
index 1ab0229fb44..52ca1397cf7 100644
--- a/entity/Appointment_entity/entityfields/attendees/dropDownProcess.js
+++ b/entity/Appointment_entity/entityfields/attendees/dropDownProcess.js
@@ -3,7 +3,7 @@ import("system.result");
 import("system.calendars");
 
 var entry = JSON.parse(vars.getString("$param.Entry_param"));
-var allUsers = calendars.getFullCalendarUsers(calendars.RIGHT_WRITE);
+var allUsers = calendars.getFullCalendarUsers(calendars.RIGHT_READ);
 var results = [];
 
 for (var i = 0; i < allUsers.length; i++)
-- 
GitLab


From 069b372314ea04b35b6c11adb67cf2c9c46789c2 Mon Sep 17 00:00:00 2001
From: "a.schindlbeck" <a.schindlbeck@adito.de>
Date: Fri, 13 Nov 2020 09:38:18 +0100
Subject: [PATCH 083/184] #1068647 Favorite: Removed from contactmanagement

---
 .../_____SYSTEM_APPLICATION_NEON.aod                          | 4 ----
 1 file changed, 4 deletions(-)

diff --git a/application/_____SYSTEM_APPLICATION_NEON/_____SYSTEM_APPLICATION_NEON.aod b/application/_____SYSTEM_APPLICATION_NEON/_____SYSTEM_APPLICATION_NEON.aod
index 9e61fe62da3..adb51ef4372 100644
--- a/application/_____SYSTEM_APPLICATION_NEON/_____SYSTEM_APPLICATION_NEON.aod
+++ b/application/_____SYSTEM_APPLICATION_NEON/_____SYSTEM_APPLICATION_NEON.aod
@@ -38,10 +38,6 @@
                 <name>Task</name>
                 <kind v="10077" />
               </entityNode>
-              <entityNode>
-                <name>Favorite</name>
-                <kind v="10077" />
-              </entityNode>
             </childNodes>
           </entityNode>
         </childNodes>
-- 
GitLab


From ea54ab72431d1983b1121f11b6e1024570636c4e Mon Sep 17 00:00:00 2001
From: Sebastian Listl <s.listl@adito.de>
Date: Mon, 16 Nov 2020 14:59:01 +0100
Subject: [PATCH 084/184] AdminView copy to clipboard action

---
 .../AdminViewRow_entity.aod                   |  5 ++
 .../copyvaluetoclipboard/onActionProcess.js   | 11 ++++
 .../openadminview/onActionProcess.js          |  4 +-
 .../DefaultAdminView_entity.aod               | 21 +++++--
 .../recordcontainers/jdito/contentProcess.js  |  2 +-
 .../_____LANGUAGE_EXTRA.aod                   | 60 +++++++++++++++++++
 .../_____LANGUAGE_de/_____LANGUAGE_de.aod     |  2 +-
 .../_____LANGUAGE_en/_____LANGUAGE_en.aod     | 60 +++++++++++++++++++
 .../AdminViewRow_view/AdminViewRow_view.aod   | 20 +++----
 .../DefaultAdminView_view.aod                 | 14 ++++-
 .../KnowledgeManagementFilter_view.aod        | 11 +++-
 process/Context_lib/process.js                | 23 +++++--
 .../SetAttribute_workflowService/process.js   |  8 +++
 .../serviceTaskParameterProcess.js            | 13 ++--
 14 files changed, 219 insertions(+), 35 deletions(-)
 create mode 100644 entity/AdminViewRow_entity/entityfields/copyvaluetoclipboard/onActionProcess.js

diff --git a/entity/AdminViewRow_entity/AdminViewRow_entity.aod b/entity/AdminViewRow_entity/AdminViewRow_entity.aod
index 75795a8f2a1..e957f3e131e 100644
--- a/entity/AdminViewRow_entity/AdminViewRow_entity.aod
+++ b/entity/AdminViewRow_entity/AdminViewRow_entity.aod
@@ -42,6 +42,11 @@
       <name>#PROVIDER_AGGREGATES</name>
       <useAggregates v="true" />
     </entityProvider>
+    <entityActionField>
+      <name>copyValueToClipboard</name>
+      <onActionProcess>%aditoprj%/entity/AdminViewRow_entity/entityfields/copyvaluetoclipboard/onActionProcess.js</onActionProcess>
+      <iconId>VAADIN:CLIPBOARD</iconId>
+    </entityActionField>
   </entityFields>
   <recordContainers>
     <jDitoRecordContainer>
diff --git a/entity/AdminViewRow_entity/entityfields/copyvaluetoclipboard/onActionProcess.js b/entity/AdminViewRow_entity/entityfields/copyvaluetoclipboard/onActionProcess.js
new file mode 100644
index 00000000000..dd853d9ace4
--- /dev/null
+++ b/entity/AdminViewRow_entity/entityfields/copyvaluetoclipboard/onActionProcess.js
@@ -0,0 +1,11 @@
+import("system.vars");
+import("system.neon");
+
+var fieldValues = JSON.parse(vars.get("$param.Rows_param"));
+var fieldId = vars.get("$local.uid");
+var row = fieldValues.find(function ([id])
+{
+    return id === fieldId;
+});
+if (row)
+    neon.copyToClipboard(row[2]);
\ No newline at end of file
diff --git a/entity/Attribute_entity/entityfields/openadminview/onActionProcess.js b/entity/Attribute_entity/entityfields/openadminview/onActionProcess.js
index 2405febf9b1..6f20e15ed48 100644
--- a/entity/Attribute_entity/entityfields/openadminview/onActionProcess.js
+++ b/entity/Attribute_entity/entityfields/openadminview/onActionProcess.js
@@ -1,6 +1,4 @@
 import("system.vars");
 import("Context_lib");
 
-AdminViewUtils.open("ATTRIBUTEID", [
-    ["ATTRIBUTE_PARENT_ID", vars.get("$field.ATTRIBUTE_PARENT_ID")]
-]);
\ No newline at end of file
+AdminViewUtils.open("AB_ATTRIBUTEID", ["ATTRIBUTE_PARENT_ID", "ATTRIBUTE_ACTIVE", "ATTRIBUTE_TYPE", "SORTING"]);
\ No newline at end of file
diff --git a/entity/DefaultAdminView_entity/DefaultAdminView_entity.aod b/entity/DefaultAdminView_entity/DefaultAdminView_entity.aod
index a84b79d58a2..7b0b1dd8ef9 100644
--- a/entity/DefaultAdminView_entity/DefaultAdminView_entity.aod
+++ b/entity/DefaultAdminView_entity/DefaultAdminView_entity.aod
@@ -19,17 +19,17 @@
     <entityConsumer>
       <name>Rows</name>
       <state>READONLY</state>
-      <dependency>
-        <name>dependency</name>
-        <entityName>AdminViewRow_entity</entityName>
-        <fieldName>AdminViewRows</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>Rows_param</name>
           <valueProcess>%aditoprj%/entity/DefaultAdminView_entity/entityfields/rows/children/rows_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>AdminViewRow_entity</entityName>
+        <fieldName>AdminViewRows</fieldName>
+      </dependency>
     </entityConsumer>
     <entityParameter>
       <name>Uid_param</name>
@@ -40,6 +40,14 @@
       <name>#PROVIDER_AGGREGATES</name>
       <useAggregates v="true" />
     </entityProvider>
+    <entityParameter>
+      <name>Entity_param</name>
+      <expose v="true" />
+    </entityParameter>
+    <entityField>
+      <name>ENTITY</name>
+      <title>Entity</title>
+    </entityField>
   </entityFields>
   <recordContainers>
     <jDitoRecordContainer>
@@ -49,6 +57,9 @@
         <jDitoRecordFieldMapping>
           <name>UID.value</name>
         </jDitoRecordFieldMapping>
+        <jDitoRecordFieldMapping>
+          <name>ENTITY.value</name>
+        </jDitoRecordFieldMapping>
       </recordFieldMappings>
     </jDitoRecordContainer>
   </recordContainers>
diff --git a/entity/DefaultAdminView_entity/recordcontainers/jdito/contentProcess.js b/entity/DefaultAdminView_entity/recordcontainers/jdito/contentProcess.js
index b6f288f713e..aa5a7e9b8e4 100644
--- a/entity/DefaultAdminView_entity/recordcontainers/jdito/contentProcess.js
+++ b/entity/DefaultAdminView_entity/recordcontainers/jdito/contentProcess.js
@@ -1,4 +1,4 @@
 import("system.vars");
 import("system.result");
 
-result.object([[vars.get("$param.Uid_param")]]);
\ No newline at end of file
+result.object([[vars.get("$param.Uid_param"), vars.get("$param.Entity_param")]]);
\ No newline at end of file
diff --git a/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod b/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod
index c4a9eb1ad2d..55f7497ad1e 100644
--- a/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod
+++ b/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod
@@ -7299,6 +7299,66 @@
     <entry>
       <key>#login</key>
     </entry>
+    <entry>
+      <key>Last change</key>
+    </entry>
+    <entry>
+      <key>Knowledge entries</key>
+    </entry>
+    <entry>
+      <key>Newsfeed (Preview)</key>
+    </entry>
+    <entry>
+      <key>Edited on</key>
+    </entry>
+    <entry>
+      <key>Created on</key>
+    </entry>
+    <entry>
+      <key>Discussion</key>
+    </entry>
+    <entry>
+      <key>Newsfeed (Full)</key>
+    </entry>
+    <entry>
+      <key>Closed</key>
+    </entry>
+    <entry>
+      <key>Text content</key>
+    </entry>
+    <entry>
+      <key>Reply</key>
+    </entry>
+    <entry>
+      <key>All Knowledge Entries</key>
+    </entry>
+    <entry>
+      <key>Export HTML</key>
+    </entry>
+    <entry>
+      <key>Publishing level</key>
+    </entry>
+    <entry>
+      <key>Discussions</key>
+    </entry>
+    <entry>
+      <key>Knowledge Management</key>
+    </entry>
+    <entry>
+      <key>List news articles</key>
+    </entry>
+    <entry>
+      <key>Knowledge Role</key>
+    </entry>
+    <entry>
+      <key>Shows complete news articles</key>
+    </entry>
+    <entry>
+      <key>Knowledge</key>
+    </entry>
+    <entry>
+      <key>Toggle status</key>
+    </entry>
   </keyValueMap>
   <font name="Dialog" style="0" size="11" />
   <sqlModels>
diff --git a/language/_____LANGUAGE_de/_____LANGUAGE_de.aod b/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
index 1581ad2733f..ada3bee7bc8 100644
--- a/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
+++ b/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
@@ -9346,7 +9346,7 @@ Bitte Datumseingabe prüfen</value>
     </entry>
     <entry>
       <key>Child Attributes</key>
-      <value>Diagrameigenschaften</value>
+      <value>Untergeordnete Eigenschaften</value>
     </entry>
     <entry>
       <key>Recalculate all Classifications</key>
diff --git a/language/_____LANGUAGE_en/_____LANGUAGE_en.aod b/language/_____LANGUAGE_en/_____LANGUAGE_en.aod
index a678822107a..f1739f8c88d 100644
--- a/language/_____LANGUAGE_en/_____LANGUAGE_en.aod
+++ b/language/_____LANGUAGE_en/_____LANGUAGE_en.aod
@@ -7380,6 +7380,66 @@
     <entry>
       <key>#login</key>
     </entry>
+    <entry>
+      <key>Last change</key>
+    </entry>
+    <entry>
+      <key>Knowledge entries</key>
+    </entry>
+    <entry>
+      <key>Newsfeed (Preview)</key>
+    </entry>
+    <entry>
+      <key>Edited on</key>
+    </entry>
+    <entry>
+      <key>Created on</key>
+    </entry>
+    <entry>
+      <key>Discussion</key>
+    </entry>
+    <entry>
+      <key>Newsfeed (Full)</key>
+    </entry>
+    <entry>
+      <key>Closed</key>
+    </entry>
+    <entry>
+      <key>Text content</key>
+    </entry>
+    <entry>
+      <key>Reply</key>
+    </entry>
+    <entry>
+      <key>All Knowledge Entries</key>
+    </entry>
+    <entry>
+      <key>Export HTML</key>
+    </entry>
+    <entry>
+      <key>Publishing level</key>
+    </entry>
+    <entry>
+      <key>Discussions</key>
+    </entry>
+    <entry>
+      <key>Knowledge Management</key>
+    </entry>
+    <entry>
+      <key>List news articles</key>
+    </entry>
+    <entry>
+      <key>Knowledge Role</key>
+    </entry>
+    <entry>
+      <key>Shows complete news articles</key>
+    </entry>
+    <entry>
+      <key>Knowledge</key>
+    </entry>
+    <entry>
+      <key>Toggle status</key>
+    </entry>
   </keyValueMap>
   <font name="Dialog" style="0" size="11" />
 </language>
diff --git a/neonView/AdminViewRow_view/AdminViewRow_view.aod b/neonView/AdminViewRow_view/AdminViewRow_view.aod
index ddb44338654..cd5a8658bb4 100644
--- a/neonView/AdminViewRow_view/AdminViewRow_view.aod
+++ b/neonView/AdminViewRow_view/AdminViewRow_view.aod
@@ -3,22 +3,16 @@
   <name>AdminViewRow_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
-    <noneLayout>
+    <boxLayout>
       <name>layout</name>
-    </noneLayout>
+    </boxLayout>
   </layout>
   <children>
-    <titledListViewTemplate>
-      <name>TitledList</name>
+    <actionListViewTemplate>
+      <name>ActionList</name>
       <titleField>TITLE</titleField>
-      <fixedDrawer v="true" />
-      <entityField>#ENTITY</entityField>
-      <columns>
-        <neonTitledListTableColumn>
-          <name>d42ddaa4-1996-41b3-be19-2f3c721f9536</name>
-          <entityField>VALUE</entityField>
-        </neonTitledListTableColumn>
-      </columns>
-    </titledListViewTemplate>
+      <descriptionField>VALUE</descriptionField>
+      <entryAction>copyValueToClipboard</entryAction>
+    </actionListViewTemplate>
   </children>
 </neonView>
diff --git a/neonView/DefaultAdminView_view/DefaultAdminView_view.aod b/neonView/DefaultAdminView_view/DefaultAdminView_view.aod
index dbd985c9477..dcba6ff2813 100644
--- a/neonView/DefaultAdminView_view/DefaultAdminView_view.aod
+++ b/neonView/DefaultAdminView_view/DefaultAdminView_view.aod
@@ -5,11 +5,21 @@
   <size>SMALL</size>
   <overlayOrientation>PORTRAIT</overlayOrientation>
   <layout>
-    <noneLayout>
+    <boxLayout>
       <name>layout</name>
-    </noneLayout>
+    </boxLayout>
   </layout>
   <children>
+    <genericViewTemplate>
+      <name>EntityInfo</name>
+      <isEditable v="false" />
+      <fields>
+        <entityFieldLink>
+          <name>09fb02da-699a-431b-8a5c-a22396ddf5b5</name>
+          <entityField>ENTITY</entityField>
+        </entityFieldLink>
+      </fields>
+    </genericViewTemplate>
     <neonViewReference>
       <name>80206d15-7132-45c1-9cf5-e2236d0f2fdb</name>
       <entityField>Rows</entityField>
diff --git a/neonView/KnowledgeManagementFilter_view/KnowledgeManagementFilter_view.aod b/neonView/KnowledgeManagementFilter_view/KnowledgeManagementFilter_view.aod
index 68e3c959472..69bb0a57328 100644
--- a/neonView/KnowledgeManagementFilter_view/KnowledgeManagementFilter_view.aod
+++ b/neonView/KnowledgeManagementFilter_view/KnowledgeManagementFilter_view.aod
@@ -19,9 +19,9 @@
     </neonDashletConfiguration>
   </dashletConfigurations>
   <layout>
-    <boxLayout>
+    <groupLayout>
       <name>layout</name>
-    </boxLayout>
+    </groupLayout>
   </layout>
   <children>
     <tableViewTemplate>
@@ -46,5 +46,12 @@
         </neonTableColumn>
       </columns>
     </tableViewTemplate>
+    <timelineViewTemplate>
+      <name>Timeline</name>
+      <dateField>LastChange</dateField>
+      <titleField>TITLE</titleField>
+      <descriptionField>CONTENT</descriptionField>
+      <subdescriptionField>AUTHOR_CONTACT_ID</subdescriptionField>
+    </timelineViewTemplate>
   </children>
 </neonView>
diff --git a/process/Context_lib/process.js b/process/Context_lib/process.js
index a85d1c47027..7aa6dedab7b 100644
--- a/process/Context_lib/process.js
+++ b/process/Context_lib/process.js
@@ -1,3 +1,4 @@
+import("Util_lib");
 import("system.entities");
 import("system.tools");
 import("system.neon");
@@ -754,6 +755,8 @@ function AdminViewUtils () {}
  */
 AdminViewUtils.open = function (pUidField, pFields)
 {
+    if (!AdminViewUtils.userHasAdminRole)
+        return;
     var uid = vars.get("$sys.uid");
     if (!pUidField)
         pUidField = "UID";
@@ -766,19 +769,31 @@ AdminViewUtils.open = function (pUidField, pFields)
     {
         pFields.forEach(function (field)
         {
-            rows.push([field[0], field[0], field[1], field[2] || "TEXT"]);
+            if (Utils.isString(field))
+            {
+                var fieldVar = field.startsWith("$") ? field : "$field." + field;
+                rows.push([field, field, vars.get(fieldVar), "TEXT"]);
+            }
+            else
+                rows.push([field[0], field[0], field[1], field[2] || "TEXT"]);
         });
     }
     var params = {
-        "Uid_param" : uid,
-        "Rows_param" : JSON.stringify(rows)
+        "Uid_param": uid,
+        "Rows_param": JSON.stringify(rows),
+        "Entity_param": vars.get("$sys.currententityname")
     };
     neon.openContext("DefaultAdminView", "DefaultAdminView_view", [uid], neon.OPERATINGSTATE_VIEW, params);
 }
 
 AdminViewUtils.getActionState = function ()
 {
-    if (tools.currentUserHasRole("INTERNAL_ADMINISTRATOR"))
+    if (AdminViewUtils.userHasAdminRole())
         return neon.COMPONENTSTATE_EDITABLE;
     return neon.COMPONENTSTATE_INVISIBLE;
+}
+
+AdminViewUtils.userHasAdminRole = function ()
+{
+    return tools.currentUserHasRole("INTERNAL_ADMINISTRATOR");
 }
\ No newline at end of file
diff --git a/process/SetAttribute_workflowService/process.js b/process/SetAttribute_workflowService/process.js
index c9f17d88c31..aebb4c992da 100644
--- a/process/SetAttribute_workflowService/process.js
+++ b/process/SetAttribute_workflowService/process.js
@@ -16,4 +16,12 @@ if (variables.attributeName)
 else
     attributeId = variables.attributeId;
 
+//attributeValueVariable -> instance variable to use for the attribute value
+if (variables.attributeValueVariable)
+{
+    var attributeValue = variables[variables.attributeValueVariable];
+    if (attributeValue !== null && attributeValue !== undefined && attributeValue !== "")
+        variables.attributeValue = attributeValue;
+}
+
 new AttributeRelationQuery(variables.targetId, attributeId, variables.targetContext).insertAttribute(variables.attributeValue);
\ No newline at end of file
diff --git a/process/SetAttribute_workflowService/serviceTaskParameterProcess.js b/process/SetAttribute_workflowService/serviceTaskParameterProcess.js
index 118269c0c1e..97d40e0f704 100644
--- a/process/SetAttribute_workflowService/serviceTaskParameterProcess.js
+++ b/process/SetAttribute_workflowService/serviceTaskParameterProcess.js
@@ -31,19 +31,22 @@ attributes = attributes.map(function (attributeId)
     var parentId = attributeId;
     var fullName = "";
     //the loop will stop if an id comes up twice, because otherwise that could cause an infinite loop if the data is faulty
-    var alreadyEncountered = {}; 
-    while (parentId && attributeNameMap[parentId] && !alreadyEncountered[parentId])
+    var alreadyEncountered = new Set(); 
+    while (parentId && attributeNameMap[parentId] && !alreadyEncountered.has(parentId))
     {
         var [currentName, currentParent] = attributeNameMap[parentId];
         if (!fullName)
             fullName = currentName;
         else
             fullName = currentName + " / " + fullName;
-        alreadyEncountered[parentId] = true;
+        alreadyEncountered.add(parentId);
         parentId = currentParent;
     }
 
-    return {id : attributeId, name : fullName};
+    return {
+        id: attributeId, 
+        name: fullName
+    };
 });
 
 var parameters = [
@@ -74,4 +77,6 @@ if (currentValues.attributeId && currentValues.attributeId.value)
         parameters.push(new WorkflowServiceTaskParameter("attributeValue", "Value", paramType, enumValues));
 }
 
+parameters.push(new WorkflowServiceTaskParameter("attributeValueVariable", "Value variable", WorkflowServiceTaskParameter.STRING()));
+
 result.object(parameters);
\ No newline at end of file
-- 
GitLab


From 15f61c91e763b7a3dcd95fc874d4017a7c7bc5a8 Mon Sep 17 00:00:00 2001
From: Sebastian Listl <s.listl@adito.de>
Date: Mon, 16 Nov 2020 17:45:50 +0100
Subject: [PATCH 085/184] SqlMaskingUtils.prototype.concatWithSeparator fix for
 oracle

---
 process/Sql_lib/process.js | 23 ++++++++++++++---------
 1 file changed, 14 insertions(+), 9 deletions(-)

diff --git a/process/Sql_lib/process.js b/process/Sql_lib/process.js
index c70131670ec..e90835fbafd 100644
--- a/process/Sql_lib/process.js
+++ b/process/Sql_lib/process.js
@@ -3653,7 +3653,7 @@ SqlMaskingUtils.prototype.concatWithSeparator = function (pFields, pSeparator, p
     else if (pSeparator || pSeparator === "")
         pSeparator = "'" + db.quote(pSeparator, this.alias) + "'";
     
-    var doEmptyStringCheck = true;
+    var isEmptyStringNull = false;
 
     switch (this.dbType)
     {
@@ -3666,7 +3666,7 @@ SqlMaskingUtils.prototype.concatWithSeparator = function (pFields, pSeparator, p
         case db.DBTYPE_ORACLE10_CLUSTER:
         case db.DBTYPE_ORACLE10_THIN:
         case db.DBTYPE_ORACLE10_OCI:
-            doEmptyStringCheck = false; //empty strings are changed to DB-null-values internally in oracle; by specifing JS-null we disable this check
+            isEmptyStringNull = true; //empty strings are changed to DB-null-values internally in oracle
             break;
         case db.DBTYPE_SQLSERVER2000:
             //MS SQL Server supports "concat_ws" (and ignoring null values) from version SQL Server 2017 and newer:
@@ -3675,7 +3675,7 @@ SqlMaskingUtils.prototype.concatWithSeparator = function (pFields, pSeparator, p
         case db.DBTYPE_DERBY10:
             break;
         default:
-            throw new Error(translate.withArguments("${SQL_LIB_UNSUPPORTED_DBTYPE} function: %0", ["SqlMaskingUtils.prototype.concat"]));
+            throw new Error(translate.withArguments("${SQL_LIB_UNSUPPORTED_DBTYPE} function: %0", ["SqlMaskingUtils.prototype.concatWithSeparator"]));
     }
     
     var concatCharacter = this.getConcatSymbol();
@@ -3686,10 +3686,13 @@ SqlMaskingUtils.prototype.concatWithSeparator = function (pFields, pSeparator, p
         let field = pFields[i];
         let isLast = i + 1 === pFields.length;
         
-        if (!_isFixedValue(field))
-            concatSql += (pAutoTrimFields ? this.trim(this.isNull(field)) : this.isNull(field));
-        else
+        if (_isFixedValue(field))
             concatSql += (pAutoTrimFields ? "'" + field.slice(1, -1).trim() + "'" : field);
+        else
+        {
+            let stringField = isEmptyStringNull ? field : this.isNull(field);
+            concatSql += (pAutoTrimFields ? this.trim(stringField) : this.isNull(stringField));
+        }
         
         if (!isLast)
         {
@@ -3702,10 +3705,12 @@ SqlMaskingUtils.prototype.concatWithSeparator = function (pFields, pSeparator, p
             }
             else if (pSeparator)
             {
+                let nextNotNullCondition;
                 let nextFieldTrimmed = pAutoTrimFields ? this.trim(nextField) : nextField;
-                let nextNotNullCondition = nextField + " is not null ";
-                if (doEmptyStringCheck || pAutoTrimFields)
-                    nextNotNullCondition += " and " + nextFieldTrimmed + " != '' ";
+                if (isEmptyStringNull)
+                    nextNotNullCondition = nextFieldTrimmed + " is not null";
+                else
+                    nextNotNullCondition = nextField + " is not null and " + nextFieldTrimmed + " != ''";
 
                 concatSql += "case when " + nextNotNullCondition + " then " + pSeparator + " else '' end " + concatCharacter;
             }
-- 
GitLab


From 9081741b5bedb692c211e111f980f123ae903a9b Mon Sep 17 00:00:00 2001
From: Sebastian Listl <s.listl@adito.de>
Date: Tue, 17 Nov 2020 09:26:17 +0100
Subject: [PATCH 086/184] View models upgraded to 1.1.7

---
 neonView/360DegreeFilter_view/360DegreeFilter_view.aod        | 2 +-
 neonView/ActivityAnalyses_view/ActivityAnalyses_view.aod      | 2 +-
 neonView/ActivityDetail_view/ActivityDetail_view.aod          | 2 +-
 neonView/ActivityDrawer_view/ActivityDrawer_view.aod          | 2 +-
 neonView/ActivityEdit_view/ActivityEdit_view.aod              | 2 +-
 neonView/ActivityFilter_view/ActivityFilter_view.aod          | 2 +-
 neonView/ActivityLinkFilter_view/ActivityLinkFilter_view.aod  | 2 +-
 .../ActivityLinkMultiEdit_view/ActivityLinkMultiEdit_view.aod | 2 +-
 .../ActivityLinkPreviewList_view.aod                          | 2 +-
 .../ActivityLinkPreview_view/ActivityLinkPreview_view.aod     | 2 +-
 neonView/ActivityMain_view/ActivityMain_view.aod              | 2 +-
 neonView/ActivityMultiEdit_view/ActivityMultiEdit_view.aod    | 2 +-
 neonView/ActivityPreview_view/ActivityPreview_view.aod        | 2 +-
 .../ActivityUniversalFileProcessorFilter_view.aod             | 2 +-
 neonView/AddressList_view/AddressList_view.aod                | 2 +-
 neonView/AddressLookup_view/AddressLookup_view.aod            | 2 +-
 .../AddressOrgMultiEdit_view/AddressOrgMultiEdit_view.aod     | 2 +-
 .../AddressValidationLookup_view.aod                          | 2 +-
 neonView/AdminViewRow_view/AdminViewRow_view.aod              | 2 +-
 neonView/AdressMultiEdit_view/AdressMultiEdit_view.aod        | 2 +-
 .../AnyContactDuplicates_view/AnyContactDuplicates_view.aod   | 2 +-
 neonView/AnyContactLookup_view/AnyContactLookup_view.aod      | 2 +-
 .../AnyObjectRelationTree_view0.aod                           | 2 +-
 neonView/AppointmentCheckUp_view/AppointmentCheckUp_view.aod  | 2 +-
 neonView/AppointmentEdit_view/AppointmentEdit_view.aod        | 2 +-
 .../AppointmentFilterDashlet_view.aod                         | 2 +-
 neonView/AppointmentFilter_view/AppointmentFilter_view.aod    | 2 +-
 .../AppointmentLinkEdit_view/AppointmentLinkEdit_view.aod     | 2 +-
 .../AppointmentLinkFilter_view/AppointmentLinkFilter_view.aod | 2 +-
 neonView/AppointmentPreview_view/AppointmentPreview_view.aod  | 2 +-
 .../AroundLocationHeader_view/AroundLocationHeader_view.aod   | 2 +-
 .../AroundOrganisationFooter_view.aod                         | 2 +-
 .../AroundOrganisationLocation_view.aod                       | 2 +-
 neonView/AttributeEdit_view/AttributeEdit_view.aod            | 2 +-
 neonView/AttributeFilter_view/AttributeFilter_view.aod        | 2 +-
 neonView/AttributeList_view/AttributeList_view.aod            | 2 +-
 neonView/AttributeLookup_view/AttributeLookup_view.aod        | 2 +-
 neonView/AttributeMultiEdit_view/AttributeMultiEdit_view.aod  | 2 +-
 neonView/AttributePreview_view/AttributePreview_view.aod      | 2 +-
 .../AttributeRelationMultiEdit_view.aod                       | 2 +-
 .../AttributeRelationPreviewList.aod                          | 2 +-
 .../AttributeRelationTreeDrawer_view.aod                      | 2 +-
 .../AttributeRelationTreeEdit_view.aod                        | 2 +-
 .../AttributeRelationTree_view/AttributeRelationTree_view.aod | 2 +-
 neonView/AttributeTree_view/AttributeTree_view.aod            | 2 +-
 neonView/AttributeUsageList_view/AttributeUsageList_view.aod  | 2 +-
 .../AttributeUsageMultiEdit_view.aod                          | 2 +-
 .../AuditLogHistoryFilter_view/AuditLogHistoryFilter_view.aod | 2 +-
 .../BulkMailAddRecipientsEdit_view.aod                        | 2 +-
 neonView/BulkMailContent_view/BulkMailContent_view.aod        | 2 +-
 neonView/BulkMailEdit_view/BulkMailEdit_view.aod              | 2 +-
 neonView/BulkMailFilter_view/BulkMailFilter_view.aod          | 2 +-
 neonView/BulkMailMain_view/BulkMailMain_view.aod              | 2 +-
 neonView/BulkMailPreview_view/BulkMailPreview_view.aod        | 2 +-
 .../BulkMailRecipientEdit_view/BulkMailRecipientEdit_view.aod | 2 +-
 .../BulkMailRecipientFilter_view.aod                          | 2 +-
 .../BulkMailStatusChart_view/BulkMailStatusChart_view.aod     | 2 +-
 neonView/BulkMailTesting_view/BulkMailTesting_view.aod        | 2 +-
 .../CampaignAddParticipantsEdit_view.aod                      | 2 +-
 neonView/CampaignCharts_view/CampaignCharts_view.aod          | 2 +-
 .../CampaignCostAnalysis_view/CampaignCostAnalysis_view.aod   | 2 +-
 neonView/CampaignCostChart_view/CampaignCostChart_view.aod    | 2 +-
 neonView/CampaignCostEdit_view/CampaignCostEdit_view.aod      | 2 +-
 .../CampaignCostExtendedFilter_view.aod                       | 2 +-
 neonView/CampaignCostFilter_view/CampaignCostFilter_view.aod  | 2 +-
 neonView/CampaignCostFix_view/CampaignCostFix_view.aod        | 2 +-
 .../CampaignCostVariable_view/CampaignCostVariable_view.aod   | 2 +-
 neonView/CampaignCost_view/CampaignCost_view.aod              | 2 +-
 neonView/CampaignEdit_view/CampaignEdit_view.aod              | 2 +-
 neonView/CampaignFilter_view/CampaignFilter_view.aod          | 2 +-
 neonView/CampaignMain_view/CampaignMain_view.aod              | 2 +-
 neonView/CampaignOverview_view/CampaignOverview_view.aod      | 2 +-
 .../CampaignParticipantChart_view.aod                         | 2 +-
 .../CampaignParticipantEdit_view.aod                          | 2 +-
 .../CampaignParticipantFilter_view.aod                        | 2 +-
 .../CampaignParticipantPreview_view.aod                       | 2 +-
 neonView/CampaignPlanning_view/CampaignPlanning_view.aod      | 2 +-
 neonView/CampaignPreview_view/CampaignPreview_view.aod        | 2 +-
 .../CampaignStepAddParticipants_view.aod                      | 2 +-
 .../CampaignStepAnalysis_view/CampaignStepAnalysis_view.aod   | 2 +-
 neonView/CampaignStepEdit_view/CampaignStepEdit_view.aod      | 2 +-
 neonView/CampaignStepFilter_view/CampaignStepFilter_view.aod  | 2 +-
 neonView/CampaignStepLookup_view/CampaignStepLookup_view.aod  | 2 +-
 neonView/CampaignStepMain_view/CampaignStepMain_view.aod      | 2 +-
 .../CampaignStepParticipnatsPerStep_view.aod                  | 2 +-
 .../CampaignStepPreview_view/CampaignStepPreview_view.aod     | 2 +-
 neonView/CampaignStepsGantt_view/CampaignStepsGantt_view.aod  | 2 +-
 .../ClassificationAdminEdit_view.aod                          | 2 +-
 .../ClassificationAdminFilter_view.aod                        | 2 +-
 .../ClassificationGradingMultipleEdit_view.aod                | 2 +-
 .../ClassificationGroupPreview_view.aod                       | 2 +-
 .../ClassificationPreview_view/ClassificationPreview_view.aod | 2 +-
 .../ClassificationScoreMultipleEdit_view.aod                  | 2 +-
 neonView/ClassificationTree_view/ClassificationTree_view.aod  | 2 +-
 .../ClassificationTypePreview_View.aod                        | 2 +-
 .../CommRestrictionDrawer_view/CommRestrictionDrawer_view.aod | 2 +-
 .../CommRestrictionFilter_view/CommRestrictionFilter_view.aod | 2 +-
 .../CommRestrictionPreview_view.aod                           | 2 +-
 .../CommRestrictionSmallEdit_view.aod                         | 2 +-
 neonView/CommunicationEdit_view/CommunicationEdit_view.aod    | 2 +-
 .../CommunicationFilter_view/CommunicationFilter_view.aod     | 2 +-
 neonView/CommunicationList_view/CommunicationList_view.aod    | 2 +-
 .../CommunicationMultiEdit_view.aod                           | 2 +-
 neonView/CompetitionDrawer_view/CompetitionDrawer_view.aod    | 2 +-
 neonView/CompetitionEdit_view/CompetitionEdit_view.aod        | 2 +-
 neonView/CompetitionFilter_view/CompetitionFilter_view.aod    | 2 +-
 neonView/CompetitionPreview_view/CompetitionPreview_view.aod  | 2 +-
 neonView/ContactEdit_view/ContactEdit_view.aod                | 2 +-
 neonView/ContactList_view/ContactList_view.aod                | 2 +-
 neonView/ContactTitledList_view/ContactTitledList_view.aod    | 2 +-
 neonView/ContractEdit_view/ContractEdit_view.aod              | 2 +-
 neonView/ContractFilter_view/ContractFilter_view.aod          | 2 +-
 neonView/ContractMain_view/ContractMain_view.aod              | 2 +-
 neonView/ContractPreview_view/ContractPreview_view.aod        | 2 +-
 neonView/CountriesPreview_view/CountriesPreview_view.aod      | 2 +-
 neonView/CountriesTable_view/CountriesTable_view.aod          | 2 +-
 neonView/DSGVODrawer_view/DSGVODrawer_view.aod                | 2 +-
 neonView/DSGVOEdit_view/DSGVOEdit_view.aod                    | 2 +-
 neonView/DSGVOFilter_view/DSGVOFilter_view.aod                | 2 +-
 neonView/DSGVOInfoEdit_view/DSGVOInfoEdit_view.aod            | 2 +-
 neonView/DSGVOPreviewAnonym_view/DSGVOPreviewAnonym_view.aod  | 2 +-
 neonView/DSGVOPreview_view/DSGVOPreview_view.aod              | 2 +-
 neonView/DSGVOReport_view/DSGVOReport_view.aod                | 2 +-
 neonView/DefaultAdminView_view/DefaultAdminView_view.aod      | 2 +-
 neonView/DefaultLookup_view/DefaultLookup_view.aod            | 2 +-
 .../DescriptionTranslationEdit_view.aod                       | 2 +-
 .../DescriptionTranslationFilter_view.aod                     | 2 +-
 .../DescriptionTranslationPreview_view.aod                    | 2 +-
 neonView/DistrictEdit_view/DistrictEdit_view.aod              | 2 +-
 neonView/DistrictFilter_view/DistrictFilter_view.aod          | 2 +-
 neonView/DistrictList_view/DistrictList_view.aod              | 2 +-
 neonView/DistrictMain_view/DistrictMain_view.aod              | 2 +-
 neonView/DistrictPreview_view/DistrictPreview_view.aod        | 2 +-
 .../DistrictResponsibleList_view.aod                          | 2 +-
 .../DistrictResponsibleMultiEdit_view.aod                     | 2 +-
 .../DistrictResponsiblePreviewList_view.aod                   | 2 +-
 neonView/DocumentDrawer_view/DocumentDrawer_view.aod          | 2 +-
 neonView/DocumentEdit_view/DocumentEdit_view.aod              | 2 +-
 neonView/DocumentFilter_view/DocumentFilter_view.aod          | 2 +-
 neonView/DocumentList_view/DocumentList_view.aod              | 2 +-
 .../DocumentMultipleEdit_view/DocumentMultipleEdit_view.aod   | 2 +-
 neonView/DocumentPreview_view/DocumentPreview_view.aod        | 2 +-
 .../DocumentTemplateEdit_view/DocumentTemplateEdit_view.aod   | 2 +-
 .../DocumentTemplateFilterSmall_view.aod                      | 2 +-
 .../DocumentTemplateFilter_view.aod                           | 2 +-
 .../DocumentTemplateLinkList_view.aod                         | 2 +-
 .../DocumentTemplateLinkMultiEdit_view.aod                    | 2 +-
 .../DocumentTemplatePlaceOfUseList_view.aod                   | 2 +-
 .../DocumentTemplatePlaceOfUseMultiEdit_view.aod              | 2 +-
 .../DocumentTemplatePlaceOfUseTitledList_view.aod             | 2 +-
 .../DocumentTemplatePreview_view.aod                          | 2 +-
 .../DocumentTemplateTypeCategoryFilter_view.aod               | 2 +-
 .../DocumentWithIdFilter_view/DocumentWithIdFilter_view.aod   | 2 +-
 .../DuplicateScannerEdit_view/DuplicateScannerEdit_view.aod   | 2 +-
 .../DuplicateScannerFilter_view.aod                           | 2 +-
 .../DuplicateScannerPreview_view.aod                          | 2 +-
 .../DuplicateScannerResultFieldConfigEdit_view.aod            | 2 +-
 neonView/DuplicatesOverview_view/DuplicatesOverview_view.aod  | 2 +-
 .../DuplicatesUnrelatedCluster_view.aod                       | 2 +-
 .../DuplicatesUnrelatedOrganisationFilter_view.aod            | 2 +-
 .../DuplicatesUnrelatedPersonFilter_view.aod                  | 2 +-
 neonView/EmailEdit_view/EmailEdit_view.aod                    | 2 +-
 neonView/EmployeeEdit_view/EmployeeEdit_view.aod              | 2 +-
 neonView/EmployeeFilter_view/EmployeeFilter_view.aod          | 2 +-
 neonView/EmployeeLookup_view/EmployeeLookup_view.aod          | 2 +-
 neonView/EmployeeMain_view/EmployeeMain_view.aod              | 2 +-
 neonView/EmployeePassword_view/EmployeePassword_view.aod      | 2 +-
 neonView/EmployeePermission_view/EmployeePermission_view.aod  | 2 +-
 neonView/EmployeePreview_view/EmployeePreview_view.aod        | 2 +-
 neonView/EmployeeRoleEdit_view/EmployeeRoleEdit_view.aod      | 2 +-
 neonView/EmployeeRoleFilter_view/EmployeeRoleFilter_view.aod  | 2 +-
 .../EmployeeRoleGenericEdit_view.aod                          | 2 +-
 neonView/EmployeeTokenEdit_view/EmployeeTokenEdit_view.aod    | 2 +-
 .../EmployeeTokenFilter_view/EmployeeTokenFilter_view.aod     | 2 +-
 neonView/ExportTemplateEdit_view/ExportTemplateEdit_view.aod  | 2 +-
 .../ExportTemplateFieldList_view.aod                          | 2 +-
 .../ExportTemplateFieldMultiEdit_view.aod                     | 2 +-
 .../ExportTemplateFilter_view/ExportTemplateFilter_view.aod   | 2 +-
 .../ExportTemplatePlaceOfUseList_view.aod                     | 2 +-
 .../ExportTemplatePlaceOfUseMultiEdit_view.aod                | 2 +-
 .../ExportTemplatePreview_view/ExportTemplatePreview_view.aod | 2 +-
 .../ExportTemplateSelectionEdit_view.aod                      | 2 +-
 neonView/FacebookTimeline_view/FacebookTimeline_view.aod      | 2 +-
 neonView/FavoriteFilter_view/FavoriteFilter_view.aod          | 2 +-
 neonView/FavoritePreview_view/FavoritePreview_view.aod        | 2 +-
 neonView/ForecastDrawer_view/ForecastDrawer_view.aod          | 2 +-
 neonView/ForecastEdit_view/ForecastEdit_view.aod              | 2 +-
 neonView/ForecastFilter_view/ForecastFilter_view.aod          | 2 +-
 neonView/ForecastPreview_view/ForecastPreview_view.aod        | 2 +-
 neonView/ImportFieldEdit_view/ImportFieldEdit_view.aod        | 2 +-
 .../ImportFieldFilterMapping_view.aod                         | 2 +-
 neonView/ImportFieldFilter_view/ImportFieldFilter_view.aod    | 2 +-
 neonView/IndexSearchView/IndexSearchView.aod                  | 2 +-
 .../KeywordAttributeEdit_view/KeywordAttributeEdit_view.aod   | 2 +-
 .../KeywordAttributeFilter_view.aod                           | 2 +-
 .../KeywordAttributeRelationRows_view.aod                     | 2 +-
 .../KeywordAttriubteRelationTitled_view.aod                   | 2 +-
 neonView/KeywordEntryEdit_view/KeywordEntryEdit_view.aod      | 2 +-
 neonView/KeywordEntryFilter_view/KeywordEntryFilter_view.aod  | 2 +-
 .../KeywordEntryPreview_view/KeywordEntryPreview_view.aod     | 2 +-
 .../KnowledgeDiscussionEdit_view.aod                          | 2 +-
 .../KnowledgeDiscussionPreview_view.aod                       | 2 +-
 .../KnowledgeDiscussionTree_view.aod                          | 2 +-
 .../KnowledgeLinkActionList_view.aod                          | 2 +-
 neonView/KnowledgeLinkEdit_view/KnowledgeLinkEdit_view.aod    | 2 +-
 .../KnowledgeLinkLookup_view/KnowledgeLinkLookup_view.aod     | 2 +-
 .../KnowledgeLinkMultiEdit_view.aod                           | 2 +-
 .../KnowledgeManagementContent_view.aod                       | 2 +-
 .../KnowledgeManagementDetails_view.aod                       | 2 +-
 .../KnowledgeManagementEdit_view.aod                          | 2 +-
 .../KnowledgeManagementFilter_view.aod                        | 2 +-
 .../KnowledgeManagementLookup_view.aod                        | 2 +-
 .../KnowledgeManagementMain_view.aod                          | 2 +-
 .../KnowledgeManagementPreview_view.aod                       | 2 +-
 .../KnowledgeManagementRole_view.aod                          | 2 +-
 .../KnowledgeManagementTimeline_view.aod                      | 2 +-
 neonView/KnowledgeNewsFeed_view/KnowledgeNewsFeed_view.aod    | 2 +-
 neonView/KnowledgeRoleEdit_view/KnowledgeRoleEdit_view.aod    | 2 +-
 .../KnowledgeTagList_GenMult_view.aod                         | 2 +-
 neonView/KnowledgeTagList_view/KnowledgeTagList_view.aod      | 2 +-
 neonView/LeadFilter_view/LeadFilter_view.aod                  | 2 +-
 .../LeadLogFilterDrawer_view/LeadLogFilterDrawer_view.aod     | 2 +-
 neonView/LeadLogFilter_view/LeadLogFilter_view.aod            | 2 +-
 neonView/LeadLogPreview_view/LeadLogPreview_view.aod          | 2 +-
 neonView/LeadPreview_view/LeadPreview_view.aod                | 2 +-
 neonView/LeadTempFilter_view/LeadTempFilter_view.aod          | 2 +-
 neonView/LeadimportDocEdit_view/LeadimportDocEdit_view.aod    | 2 +-
 neonView/LeadimportEdit_view/LeadimportEdit_view.aod          | 2 +-
 neonView/LeadimportFilter_view/LeadimportFilter_view.aod      | 2 +-
 .../LeadimportLeadFilter_view/LeadimportLeadFilter_view.aod   | 2 +-
 .../LeadimportLeadTempFilter_view.aod                         | 2 +-
 neonView/LeadimportLog_view/LeadimportLog_view.aod            | 2 +-
 neonView/LeadimportMain_view/LeadimportMain_view.aod          | 2 +-
 .../LeadimportMappingAssistantFilter_view.aod                 | 2 +-
 neonView/LeadimportPreview_view/LeadimportPreview_view.aod    | 2 +-
 neonView/LetterEdit_view/LetterEdit_view.aod                  | 2 +-
 .../LetterRecipientEdit_view/LetterRecipientEdit_view.aod     | 2 +-
 .../LetterRecipientFilter_view/LetterRecipientFilter_view.aod | 2 +-
 .../LogHistoryFilterDrawer_view.aod                           | 2 +-
 neonView/LogHistoryFilter_view/LogHistoryFilter_view.aod      | 2 +-
 neonView/LogHistoryPreview_view/LogHistoryPreview_view.aod    | 2 +-
 .../MarketingWorkflowLauncherEdit_view.aod                    | 2 +-
 neonView/MemberDrawer_view/MemberDrawer_view.aod              | 2 +-
 neonView/MemberEdit_view/MemberEdit_view.aod                  | 2 +-
 neonView/MemberFilter_view/MemberFilter_view.aod              | 2 +-
 neonView/ModuleTree_view/ModuleTree_view.aod                  | 2 +-
 .../MyDashboardScoreCard_view/MyDashboardScoreCard_view.aod   | 2 +-
 .../MyTurnoverForecastScoreCard_view.aod                      | 2 +-
 neonView/NotificationFilter_view/NotificationFilter_view.aod  | 2 +-
 .../NotificationPreview_view/NotificationPreview_view.aod     | 2 +-
 .../ObjectRelationTypeEdit_view.aod                           | 2 +-
 .../ObjectRelationTypeFilter_view.aod                         | 2 +-
 neonView/ObjectTreeEdit_view/ObjectTreeEdit_view.aod          | 2 +-
 neonView/ObjectTreeFilter_view/ObjectTreeFilter_view.aod      | 2 +-
 neonView/OfferCoverLetter_view/OfferCoverLetter_view.aod      | 2 +-
 neonView/OfferDrawer_view/OfferDrawer_view.aod                | 2 +-
 neonView/OfferEdit_view/OfferEdit_view.aod                    | 2 +-
 neonView/OfferFilter_view/OfferFilter_view.aod                | 2 +-
 neonView/OfferMain_view/OfferMain_view.aod                    | 2 +-
 .../OfferPreviewMultiple_view/OfferPreviewMultiple_view.aod   | 2 +-
 neonView/OfferPreview_view/OfferPreview_view.aod              | 2 +-
 neonView/OfferReport_view/OfferReport_view.aod                | 2 +-
 neonView/OfferitemEdit_view/OfferitemEdit_view.aod            | 2 +-
 neonView/OfferitemFilter_view/OfferitemFilter_view.aod        | 2 +-
 neonView/OfferitemMultiEdit_view/OfferitemMultiEdit_view.aod  | 2 +-
 neonView/OfferitemPreview_view/OfferitemPreview_view.aod      | 2 +-
 neonView/OrderDetail_view/OrderDetail_view.aod                | 2 +-
 neonView/OrderDunning_view/OrderDunning_view.aod              | 2 +-
 neonView/OrderEdit_view/OrderEdit_view.aod                    | 2 +-
 neonView/OrderFilter_view/OrderFilter_view.aod                | 4 ++--
 neonView/OrderLink_view/OrderLink_view.aod                    | 2 +-
 neonView/OrderMain_view/OrderMain_view.aod                    | 2 +-
 neonView/OrderPaid_view/OrderPaid_view.aod                    | 2 +-
 neonView/OrderPreview_view/OrderPreview_view.aod              | 2 +-
 .../OrderReminderReport_view/OrderReminderReport_view.aod     | 2 +-
 neonView/OrderReport_view/OrderReport_view.aod                | 2 +-
 neonView/OrderitemEdit_view/OrderitemEdit_view.aod            | 2 +-
 neonView/OrderitemFilter_view/OrderitemFilter_view.aod        | 2 +-
 neonView/OrderitemMultiEdit_view/OrderitemMultiEdit_view.aod  | 2 +-
 neonView/OrderitemPreview_view/OrderitemPreview_view.aod      | 2 +-
 .../OrganisationAttributeRestriction_view.aod                 | 2 +-
 .../OrganisationClassification/OrganisationClassification.aod | 2 +-
 .../OrganisationClassificationDrawer_view.aod                 | 2 +-
 .../OrganisationClusterMain_view.aod                          | 2 +-
 .../OrganisationConditionPricelist_view.aod                   | 2 +-
 .../OrganisationCondition_view/OrganisationCondition_view.aod | 2 +-
 .../OrganisationDuplicatesFilter_view.aod                     | 2 +-
 .../OrganisationDuplicatesTab_view.aod                        | 2 +-
 .../OrganisationEditDefaults_view.aod                         | 2 +-
 neonView/OrganisationEdit_view/OrganisationEdit_view.aod      | 2 +-
 neonView/OrganisationFilter_view/OrganisationFilter_view.aod  | 2 +-
 .../OrganisationLesserNoiseTable_view.aod                     | 2 +-
 neonView/OrganisationLookup_view/OrganisationLookup_view.aod  | 2 +-
 neonView/OrganisationMain_view/OrganisationMain_view.aod      | 2 +-
 .../OrganisationNoNoiseTable_view.aod                         | 2 +-
 .../OrganisationPreview_view/OrganisationPreview_view.aod     | 2 +-
 neonView/OrganisationReport_view/OrganisationReport_view.aod  | 2 +-
 .../OrganisationTaskAppointment_view.aod                      | 2 +-
 .../OrganisationUnrelatedDuplicates_view.aod                  | 2 +-
 .../PermissionActionEdit_view/PermissionActionEdit_view.aod   | 2 +-
 .../PermissionActionFilter_view.aod                           | 2 +-
 .../PermissionActionList_view/PermissionActionList_view.aod   | 2 +-
 .../PermissionCalendarEdit_view.aod                           | 2 +-
 .../PermissionCalendarFilterDrawer_view.aod                   | 2 +-
 .../PermissionCalendarFilterReverse_view.aod                  | 2 +-
 .../PermissionCalendarFilter_view.aod                         | 2 +-
 .../PermissionCalendarPreview_view.aod                        | 2 +-
 .../PermissionDetailEdit_view/PermissionDetailEdit_view.aod   | 2 +-
 .../PermissionDetailFilter_view.aod                           | 2 +-
 .../PermissionDetailPreview_view.aod                          | 2 +-
 .../PermissionMetaDataFilter_view.aod                         | 2 +-
 .../PermissionMetaDataMain_view.aod                           | 2 +-
 .../PermissionMetaDataPreview_view.aod                        | 2 +-
 .../PermissionOverviewFilter_view.aod                         | 2 +-
 .../PersonAttributeRestriction_view.aod                       | 2 +-
 neonView/PersonClusterMain_view/PersonClusterMain_view.aod    | 2 +-
 .../PersonClusterPreview_view/PersonClusterPreview_view.aod   | 2 +-
 neonView/PersonDetail_view/PersonDetail_view.aod              | 2 +-
 .../PersonDublicatesTab_view/PersonDublicatesTab_view.aod     | 2 +-
 .../PersonDuplicateEditview_view.aod                          | 2 +-
 .../PersonDuplicatesFilter_view.aod                           | 2 +-
 neonView/PersonEditDefaults_view/PersonEditDefaults_view.aod  | 2 +-
 neonView/PersonEdit_view/PersonEdit_view.aod                  | 2 +-
 neonView/PersonFilter_view/PersonFilter_view.aod              | 2 +-
 neonView/PersonLookup_view/PersonLookup_view.aod              | 2 +-
 neonView/PersonMain_view/PersonMain_view.aod                  | 2 +-
 .../PersonMultiEditQuickEntry_view.aod                        | 2 +-
 neonView/PersonMultiEdit_view/PersonMultiEdit_view.aod        | 2 +-
 neonView/PersonPreview_view/PersonPreview_view.aod            | 2 +-
 neonView/PersonSimpleList_view/PersonSimpleList_view.aod      | 2 +-
 .../PersonTaskAppointment_view/PersonTaskAppointment_view.aod | 2 +-
 .../PrivatePersonFilter_view/PrivatePersonFilter_view.aod     | 2 +-
 .../PrivatePersonPreview_view/PrivatePersonPreview_view.aod   | 2 +-
 neonView/Prod2ProdEdit_view/Prod2ProdEdit_view.aod            | 2 +-
 neonView/Prod2prodFilter_view/Prod2prodFilter_view.aod        | 2 +-
 neonView/ProductEdit_view/ProductEdit_view.aod                | 2 +-
 neonView/ProductFilter_view/ProductFilter_view.aod            | 2 +-
 neonView/ProductLookup_view/ProductLookup_view.aod            | 2 +-
 neonView/ProductMain_view/ProductMain_view.aod                | 2 +-
 neonView/ProductPreview_view/ProductPreview_view.aod          | 2 +-
 neonView/ProductpriceEdit_view/ProductpriceEdit_view.aod      | 2 +-
 neonView/ProductpriceFilter_view/ProductpriceFilter_view.aod  | 2 +-
 .../ProductpriceForProductFilter_view.aod                     | 2 +-
 .../ProductpricePreview_view/ProductpricePreview_view.aod     | 2 +-
 .../ProductpriceRelation_view/ProductpriceRelation_view.aod   | 2 +-
 neonView/QuickEntryEdit_view/QuickEntryEdit_view.aod          | 2 +-
 neonView/RoleChildrenEdit_view/RoleChildrenEdit_view.aod      | 2 +-
 neonView/RoleChildrenList_view/RoleChildrenList_view.aod      | 2 +-
 neonView/RoleEdit_view/RoleEdit_view.aod                      | 2 +-
 neonView/RoleFilter_view/RoleFilter_view.aod                  | 2 +-
 neonView/RoleMain_view/RoleMain_view.aod                      | 2 +-
 neonView/RoleParentList_view/RoleParentList_view.aod          | 2 +-
 neonView/RolePreview_view/RolePreview_view.aod                | 2 +-
 .../SalesprojectAnalysesPhases_view.aod                       | 2 +-
 .../SalesprojectAnalyses_view/SalesprojectAnalyses_view.aod   | 2 +-
 .../SalesprojectConversionRate_view.aod                       | 2 +-
 neonView/SalesprojectEdit_view/SalesprojectEdit_view.aod      | 2 +-
 neonView/SalesprojectFilter_view/SalesprojectFilter_view.aod  | 2 +-
 .../SalesprojectForecastDrawer_view.aod                       | 2 +-
 .../SalesprojectFurtherInfo_view.aod                          | 2 +-
 neonView/SalesprojectMain_view/SalesprojectMain_view.aod      | 2 +-
 .../SalesprojectMemberActivity_view.aod                       | 2 +-
 .../SalesprojectMilestoneChartPhase_view.aod                  | 2 +-
 .../SalesprojectMilestoneChartState_view.aod                  | 2 +-
 .../SalesprojectMilestoneInfo_view.aod                        | 2 +-
 .../SalesprojectMilestoneSource_view.aod                      | 2 +-
 .../SalesprojectMilestone_view/SalesprojectMilestone_view.aod | 2 +-
 .../SalesprojectMultiEdit_view/SalesprojectMultiEdit_view.aod | 2 +-
 .../SalesprojectOfferForecastChart_view.aod                   | 2 +-
 .../SalesprojectOfferForecast_view.aod                        | 2 +-
 .../SalesprojectOverview_view/SalesprojectOverview_view.aod   | 2 +-
 .../SalesprojectPhaseStep_view/SalesprojectPhaseStep_view.aod | 2 +-
 neonView/SalesprojectPhase_view/SalesprojectPhase_view.aod    | 2 +-
 .../SalesprojectPreview_view/SalesprojectPreview_view.aod     | 2 +-
 .../SalesprojectScoreCard_view/SalesprojectScoreCard_view.aod | 2 +-
 .../SalesprojectSourceDrawer_view.aod                         | 2 +-
 .../SalesprojectSourceEdit_view.aod                           | 2 +-
 .../SalesprojectSourceFilter_view.aod                         | 2 +-
 .../SalesprojectSourcePreview_view.aod                        | 2 +-
 neonView/SalutationEdit_view/SalutationEdit_view.aod          | 2 +-
 neonView/SalutationFilter_view/SalutationFilter_view.aod      | 2 +-
 .../SerialLetterAddRecipientsEdit_view.aod                    | 2 +-
 neonView/SerialLetterEdit_view/SerialLetterEdit_view.aod      | 2 +-
 neonView/SerialLetterFilter_view/SerialLetterFilter_view.aod  | 2 +-
 neonView/SerialLetterMain_view/SerialLetterMain_view.aod      | 2 +-
 .../SerialLetterPreview_view/SerialLetterPreview_view.aod     | 2 +-
 neonView/StockCount_view/StockCount_view.aod                  | 2 +-
 neonView/StockEdit_view/StockEdit_view.aod                    | 2 +-
 neonView/StockFilter_view/StockFilter_view.aod                | 2 +-
 neonView/SupportTicketEdit_view/SupportTicketEdit_view.aod    | 2 +-
 .../SupportTicketFilter_view/SupportTicketFilter_view.aod     | 2 +-
 neonView/SupportTicketMain_view/SupportTicketMain_view.aod    | 2 +-
 .../SupportTicketPreview_view/SupportTicketPreview_view.aod   | 2 +-
 neonView/TaskEdit_view/TaskEdit_view.aod                      | 2 +-
 neonView/TaskFilter_view/TaskFilter_view.aod                  | 2 +-
 neonView/TaskLinkFilter_view/TaskLinkFilter_view.aod          | 2 +-
 neonView/TaskLinkMultiEdit_view/TaskLinkMultiEdit_view.aod    | 2 +-
 .../TaskLinkPreviewList_view/TaskLinkPreviewList_view.aod     | 2 +-
 neonView/TaskLinkPreview_view/TaskLinkPreview_view.aod        | 2 +-
 neonView/TaskMain_view/TaskMain_view.aod                      | 2 +-
 neonView/TaskPreview_view/TaskPreview_view.aod                | 2 +-
 .../TimetrackingAnalysesDrawer_view.aod                       | 2 +-
 .../TimetrackingAnalyses_view/TimetrackingAnalyses_view.aod   | 2 +-
 neonView/TimetrackingDrawer_view/TimetrackingDrawer_view.aod  | 2 +-
 neonView/TimetrackingEdit_view/TimetrackingEdit_view.aod      | 2 +-
 .../TimetrackingFilterAnalyses/TimetrackingFilterAnalyses.aod | 2 +-
 neonView/TimetrackingFilter_view/TimetrackingFilter_view.aod  | 2 +-
 .../TimetrackingPreview_view/TimetrackingPreview_view.aod     | 2 +-
 neonView/TimetrackingScore_view/TimetrackingScore_view.aod    | 2 +-
 .../TurnoverChartForcastDrawer_view.aod                       | 2 +-
 .../TurnoverChartForecast_view/TurnoverChartForecast_view.aod | 2 +-
 neonView/TurnoverChart_view/TurnoverChart_view.aod            | 2 +-
 neonView/TurnoverTree_view/TurnoverTree_view.aod              | 2 +-
 neonView/TwitterTimeline_view/TwitterTimeline_view.aod        | 2 +-
 .../UniversalFileProcessorDropzone_view.aod                   | 2 +-
 neonView/UnlinkedMailFilter_view/UnlinkedMailFilter_view.aod  | 2 +-
 .../UnlinkedMailMappingLinkList_view.aod                      | 2 +-
 .../UnlinkedMailMappingWrapperMapping_view.aod                | 2 +-
 neonView/Userhelp_FilterView/Userhelp_FilterView.aod          | 2 +-
 neonView/UsersettingsEdit_view/UsersettingsEdit_view.aod      | 2 +-
 .../VisitPlanEmployeeWeekEdit_view.aod                        | 2 +-
 .../VisitPlanEmployeeWeekFilter_view.aod                      | 2 +-
 .../VisitPlanEmployeeWeekMain_view.aod                        | 2 +-
 .../VisitPlanEmployeeWeekPreview_view.aod                     | 2 +-
 neonView/VisitPlanEntryEdit_view/VisitPlanEntryEdit_view.aod  | 2 +-
 .../VisitPlanEntryFilter_view/VisitPlanEntryFilter_view.aod   | 2 +-
 .../VisitRecommendationEdit_view.aod                          | 2 +-
 .../VisitRecommendationFilter_view.aod                        | 2 +-
 .../WorkflowDefinitionDiagram_view.aod                        | 2 +-
 .../WorkflowDefinitionEdit_view.aod                           | 2 +-
 .../WorkflowDefinitionFilter_view.aod                         | 2 +-
 .../WorkflowDefinitionMain_view.aod                           | 2 +-
 .../WorkflowDefinitionPreview_view.aod                        | 2 +-
 .../WorkflowInstanceDiagram_view.aod                          | 2 +-
 .../WorkflowInstanceEdit_view/WorkflowInstanceEdit_view.aod   | 2 +-
 .../WorkflowInstanceFilter_view.aod                           | 2 +-
 .../WorkflowInstanceHistoryFilter_view.aod                    | 2 +-
 .../WorkflowInstanceMain_view/WorkflowInstanceMain_view.aod   | 2 +-
 .../WorkflowInstancePreview_view.aod                          | 2 +-
 .../WorkflowInstanceTasks_view/WorkflowInstanceTasks_view.aod | 2 +-
 .../WorkflowLauncherEdit_view/WorkflowLauncherEdit_view.aod   | 2 +-
 neonView/WorkflowModelEdit_view/WorkflowModelEdit_view.aod    | 2 +-
 .../WorkflowModelLookup_view/WorkflowModelLookup_view.aod     | 2 +-
 neonView/WorkflowSignalEdit_view/WorkflowSignalEdit_view.aod  | 2 +-
 .../WorkflowSignalFilter_view/WorkflowSignalFilter_view.aod   | 2 +-
 .../WorkflowSignalPreview_view/WorkflowSignalPreview_view.aod | 2 +-
 .../WorkflowStartConfigFilter_view.aod                        | 2 +-
 neonView/WorkflowTaskDrawer_view/WorkflowTaskDrawer_view.aod  | 2 +-
 neonView/WorkflowTaskFilter_view/WorkflowTaskFilter_view.aod  | 2 +-
 .../WorkflowTaskFinishedDrawer_view.aod                       | 2 +-
 .../WorkflowTaskFinishedList_view.aod                         | 2 +-
 neonView/WorkflowTaskForm_view/WorkflowTaskForm_view.aod      | 2 +-
 neonView/WorkflowTaskList_view/WorkflowTaskList_view.aod      | 2 +-
 neonView/WorkflowTaskOwn_view/WorkflowTaskOwn_view.aod        | 2 +-
 .../WorkflowTaskPreview_view/WorkflowTaskPreview_view.aod     | 2 +-
 .../WorkflowVariableValueFilter_view.aod                      | 2 +-
 456 files changed, 457 insertions(+), 457 deletions(-)

diff --git a/neonView/360DegreeFilter_view/360DegreeFilter_view.aod b/neonView/360DegreeFilter_view/360DegreeFilter_view.aod
index fcb25887036..92774253b35 100644
--- a/neonView/360DegreeFilter_view/360DegreeFilter_view.aod
+++ b/neonView/360DegreeFilter_view/360DegreeFilter_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>360DegreeFilter_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <filterable v="false" />
diff --git a/neonView/ActivityAnalyses_view/ActivityAnalyses_view.aod b/neonView/ActivityAnalyses_view/ActivityAnalyses_view.aod
index 606d13134ae..cb982f79c42 100644
--- a/neonView/ActivityAnalyses_view/ActivityAnalyses_view.aod
+++ b/neonView/ActivityAnalyses_view/ActivityAnalyses_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>ActivityAnalyses_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <filterable v="true" />
diff --git a/neonView/ActivityDetail_view/ActivityDetail_view.aod b/neonView/ActivityDetail_view/ActivityDetail_view.aod
index 870b77975c3..559c6a6620b 100644
--- a/neonView/ActivityDetail_view/ActivityDetail_view.aod
+++ b/neonView/ActivityDetail_view/ActivityDetail_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>ActivityDetail_view</name>
   <title>Description</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/neonView/ActivityDrawer_view/ActivityDrawer_view.aod b/neonView/ActivityDrawer_view/ActivityDrawer_view.aod
index b7d3bb7f8fc..eeacf167c5e 100644
--- a/neonView/ActivityDrawer_view/ActivityDrawer_view.aod
+++ b/neonView/ActivityDrawer_view/ActivityDrawer_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>ActivityDrawer_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/ActivityEdit_view/ActivityEdit_view.aod b/neonView/ActivityEdit_view/ActivityEdit_view.aod
index 955128744e3..2c8b44325c1 100644
--- a/neonView/ActivityEdit_view/ActivityEdit_view.aod
+++ b/neonView/ActivityEdit_view/ActivityEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>ActivityEdit_view</name>
   <title>Activity</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/neonView/ActivityFilter_view/ActivityFilter_view.aod b/neonView/ActivityFilter_view/ActivityFilter_view.aod
index 3dff8e3ef36..c942d1bd6b0 100644
--- a/neonView/ActivityFilter_view/ActivityFilter_view.aod
+++ b/neonView/ActivityFilter_view/ActivityFilter_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>ActivityFilter_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <filterable v="true" />
diff --git a/neonView/ActivityLinkFilter_view/ActivityLinkFilter_view.aod b/neonView/ActivityLinkFilter_view/ActivityLinkFilter_view.aod
index b5fff0f4ace..cd41eab6d66 100644
--- a/neonView/ActivityLinkFilter_view/ActivityLinkFilter_view.aod
+++ b/neonView/ActivityLinkFilter_view/ActivityLinkFilter_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>ActivityLinkFilter_view</name>
   <title>Connections</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/neonView/ActivityLinkMultiEdit_view/ActivityLinkMultiEdit_view.aod b/neonView/ActivityLinkMultiEdit_view/ActivityLinkMultiEdit_view.aod
index e19f1da0f82..519a822a81e 100644
--- a/neonView/ActivityLinkMultiEdit_view/ActivityLinkMultiEdit_view.aod
+++ b/neonView/ActivityLinkMultiEdit_view/ActivityLinkMultiEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>ActivityLinkMultiEdit_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/ActivityLinkPreviewList_view/ActivityLinkPreviewList_view.aod b/neonView/ActivityLinkPreviewList_view/ActivityLinkPreviewList_view.aod
index dab9bccb0a8..a34c9e28d9f 100644
--- a/neonView/ActivityLinkPreviewList_view/ActivityLinkPreviewList_view.aod
+++ b/neonView/ActivityLinkPreviewList_view/ActivityLinkPreviewList_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>ActivityLinkPreviewList_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/ActivityLinkPreview_view/ActivityLinkPreview_view.aod b/neonView/ActivityLinkPreview_view/ActivityLinkPreview_view.aod
index 5327f5fd86e..ecea997484b 100644
--- a/neonView/ActivityLinkPreview_view/ActivityLinkPreview_view.aod
+++ b/neonView/ActivityLinkPreview_view/ActivityLinkPreview_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>ActivityLinkPreview_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/ActivityMain_view/ActivityMain_view.aod b/neonView/ActivityMain_view/ActivityMain_view.aod
index 8dd7d3f4f2f..39972c2097c 100644
--- a/neonView/ActivityMain_view/ActivityMain_view.aod
+++ b/neonView/ActivityMain_view/ActivityMain_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>ActivityMain_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/ActivityMultiEdit_view/ActivityMultiEdit_view.aod b/neonView/ActivityMultiEdit_view/ActivityMultiEdit_view.aod
index 6d74561374a..d9b91e1b27b 100644
--- a/neonView/ActivityMultiEdit_view/ActivityMultiEdit_view.aod
+++ b/neonView/ActivityMultiEdit_view/ActivityMultiEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>ActivityMultiEdit_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/ActivityPreview_view/ActivityPreview_view.aod b/neonView/ActivityPreview_view/ActivityPreview_view.aod
index 7b82a42582a..b02a9a3bed5 100644
--- a/neonView/ActivityPreview_view/ActivityPreview_view.aod
+++ b/neonView/ActivityPreview_view/ActivityPreview_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>ActivityPreview_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/ActivityUniversalFileProcessorFilter_view/ActivityUniversalFileProcessorFilter_view.aod b/neonView/ActivityUniversalFileProcessorFilter_view/ActivityUniversalFileProcessorFilter_view.aod
index eaec7e7ddba..3b8adc8d670 100644
--- a/neonView/ActivityUniversalFileProcessorFilter_view/ActivityUniversalFileProcessorFilter_view.aod
+++ b/neonView/ActivityUniversalFileProcessorFilter_view/ActivityUniversalFileProcessorFilter_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>ActivityUniversalFileProcessorFilter_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <filterable v="true" />
diff --git a/neonView/AddressList_view/AddressList_view.aod b/neonView/AddressList_view/AddressList_view.aod
index bd5826a7da4..a9f9b3c6b85 100644
--- a/neonView/AddressList_view/AddressList_view.aod
+++ b/neonView/AddressList_view/AddressList_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>AddressList_view</name>
   <description>Org addresses</description>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/neonView/AddressLookup_view/AddressLookup_view.aod b/neonView/AddressLookup_view/AddressLookup_view.aod
index 904f60c6b30..42904c5f4c1 100644
--- a/neonView/AddressLookup_view/AddressLookup_view.aod
+++ b/neonView/AddressLookup_view/AddressLookup_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>AddressLookup_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/AddressOrgMultiEdit_view/AddressOrgMultiEdit_view.aod b/neonView/AddressOrgMultiEdit_view/AddressOrgMultiEdit_view.aod
index dd7ee5507e2..faa7531a910 100644
--- a/neonView/AddressOrgMultiEdit_view/AddressOrgMultiEdit_view.aod
+++ b/neonView/AddressOrgMultiEdit_view/AddressOrgMultiEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>AddressOrgMultiEdit_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/AddressValidationLookup_view/AddressValidationLookup_view.aod b/neonView/AddressValidationLookup_view/AddressValidationLookup_view.aod
index 7372c60c7af..c785e09dc8d 100644
--- a/neonView/AddressValidationLookup_view/AddressValidationLookup_view.aod
+++ b/neonView/AddressValidationLookup_view/AddressValidationLookup_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>AddressValidationLookup_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/AdminViewRow_view/AdminViewRow_view.aod b/neonView/AdminViewRow_view/AdminViewRow_view.aod
index cd5a8658bb4..77687eeb449 100644
--- a/neonView/AdminViewRow_view/AdminViewRow_view.aod
+++ b/neonView/AdminViewRow_view/AdminViewRow_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>AdminViewRow_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/AdressMultiEdit_view/AdressMultiEdit_view.aod b/neonView/AdressMultiEdit_view/AdressMultiEdit_view.aod
index b4612adcf1a..72a12761582 100644
--- a/neonView/AdressMultiEdit_view/AdressMultiEdit_view.aod
+++ b/neonView/AdressMultiEdit_view/AdressMultiEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>AdressMultiEdit_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/AnyContactDuplicates_view/AnyContactDuplicates_view.aod b/neonView/AnyContactDuplicates_view/AnyContactDuplicates_view.aod
index ff719ed3711..a4d400cb1bb 100644
--- a/neonView/AnyContactDuplicates_view/AnyContactDuplicates_view.aod
+++ b/neonView/AnyContactDuplicates_view/AnyContactDuplicates_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>AnyContactDuplicates_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/AnyContactLookup_view/AnyContactLookup_view.aod b/neonView/AnyContactLookup_view/AnyContactLookup_view.aod
index 4a06e39e312..f7d62ecfdeb 100644
--- a/neonView/AnyContactLookup_view/AnyContactLookup_view.aod
+++ b/neonView/AnyContactLookup_view/AnyContactLookup_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>AnyContactLookup_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/AnyObjectRelationTree_view0/AnyObjectRelationTree_view0.aod b/neonView/AnyObjectRelationTree_view0/AnyObjectRelationTree_view0.aod
index 83a01661633..e6fc96ef835 100644
--- a/neonView/AnyObjectRelationTree_view0/AnyObjectRelationTree_view0.aod
+++ b/neonView/AnyObjectRelationTree_view0/AnyObjectRelationTree_view0.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>AnyObjectRelationTree_view0</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/AppointmentCheckUp_view/AppointmentCheckUp_view.aod b/neonView/AppointmentCheckUp_view/AppointmentCheckUp_view.aod
index 2f0e9199d4d..2f0d2443425 100644
--- a/neonView/AppointmentCheckUp_view/AppointmentCheckUp_view.aod
+++ b/neonView/AppointmentCheckUp_view/AppointmentCheckUp_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>AppointmentCheckUp_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <dashletConfigurations>
diff --git a/neonView/AppointmentEdit_view/AppointmentEdit_view.aod b/neonView/AppointmentEdit_view/AppointmentEdit_view.aod
index 5b5def3ba12..6a2413b6953 100644
--- a/neonView/AppointmentEdit_view/AppointmentEdit_view.aod
+++ b/neonView/AppointmentEdit_view/AppointmentEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>AppointmentEdit_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <documentation>%aditoprj%/neonView/AppointmentEdit_view/documentation.adoc</documentation>
diff --git a/neonView/AppointmentFilterDashlet_view/AppointmentFilterDashlet_view.aod b/neonView/AppointmentFilterDashlet_view/AppointmentFilterDashlet_view.aod
index e0d50c9bd43..216efdb870d 100644
--- a/neonView/AppointmentFilterDashlet_view/AppointmentFilterDashlet_view.aod
+++ b/neonView/AppointmentFilterDashlet_view/AppointmentFilterDashlet_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>AppointmentFilterDashlet_view</name>
   <title>Linked Appointments</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/neonView/AppointmentFilter_view/AppointmentFilter_view.aod b/neonView/AppointmentFilter_view/AppointmentFilter_view.aod
index 75dfc0953f8..b21399ee35f 100644
--- a/neonView/AppointmentFilter_view/AppointmentFilter_view.aod
+++ b/neonView/AppointmentFilter_view/AppointmentFilter_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>AppointmentFilter_view</name>
   <title>Linked Appointments</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/neonView/AppointmentLinkEdit_view/AppointmentLinkEdit_view.aod b/neonView/AppointmentLinkEdit_view/AppointmentLinkEdit_view.aod
index 1d1f735b094..58da5f40fd7 100644
--- a/neonView/AppointmentLinkEdit_view/AppointmentLinkEdit_view.aod
+++ b/neonView/AppointmentLinkEdit_view/AppointmentLinkEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>AppointmentLinkEdit_view</name>
   <title>relations</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/neonView/AppointmentLinkFilter_view/AppointmentLinkFilter_view.aod b/neonView/AppointmentLinkFilter_view/AppointmentLinkFilter_view.aod
index 7ecded1820e..993d5d1ea5f 100644
--- a/neonView/AppointmentLinkFilter_view/AppointmentLinkFilter_view.aod
+++ b/neonView/AppointmentLinkFilter_view/AppointmentLinkFilter_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>AppointmentLinkFilter_view</name>
   <title>relations</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/neonView/AppointmentPreview_view/AppointmentPreview_view.aod b/neonView/AppointmentPreview_view/AppointmentPreview_view.aod
index 727a644d899..ccd565c6be3 100644
--- a/neonView/AppointmentPreview_view/AppointmentPreview_view.aod
+++ b/neonView/AppointmentPreview_view/AppointmentPreview_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>AppointmentPreview_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <documentation>%aditoprj%/neonView/AppointmentPreview_view/documentation.adoc</documentation>
diff --git a/neonView/AroundLocationHeader_view/AroundLocationHeader_view.aod b/neonView/AroundLocationHeader_view/AroundLocationHeader_view.aod
index ce86ba2afd5..0dbf0677ac4 100644
--- a/neonView/AroundLocationHeader_view/AroundLocationHeader_view.aod
+++ b/neonView/AroundLocationHeader_view/AroundLocationHeader_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>AroundLocationHeader_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/AroundOrganisationFooter_view/AroundOrganisationFooter_view.aod b/neonView/AroundOrganisationFooter_view/AroundOrganisationFooter_view.aod
index 74bac1d8443..72811993d34 100644
--- a/neonView/AroundOrganisationFooter_view/AroundOrganisationFooter_view.aod
+++ b/neonView/AroundOrganisationFooter_view/AroundOrganisationFooter_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>AroundOrganisationFooter_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/AroundOrganisationLocation_view/AroundOrganisationLocation_view.aod b/neonView/AroundOrganisationLocation_view/AroundOrganisationLocation_view.aod
index 6ee6f9459fd..7fa9102fcc0 100644
--- a/neonView/AroundOrganisationLocation_view/AroundOrganisationLocation_view.aod
+++ b/neonView/AroundOrganisationLocation_view/AroundOrganisationLocation_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>AroundOrganisationLocation_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <filterable v="false" />
diff --git a/neonView/AttributeEdit_view/AttributeEdit_view.aod b/neonView/AttributeEdit_view/AttributeEdit_view.aod
index f0540f0420d..310d74e958e 100644
--- a/neonView/AttributeEdit_view/AttributeEdit_view.aod
+++ b/neonView/AttributeEdit_view/AttributeEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>AttributeEdit_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <size>SMALL</size>
diff --git a/neonView/AttributeFilter_view/AttributeFilter_view.aod b/neonView/AttributeFilter_view/AttributeFilter_view.aod
index 573f26dd7d2..7b18cb00636 100644
--- a/neonView/AttributeFilter_view/AttributeFilter_view.aod
+++ b/neonView/AttributeFilter_view/AttributeFilter_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>AttributeFilter_view</name>
   <title>Attributes</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/neonView/AttributeList_view/AttributeList_view.aod b/neonView/AttributeList_view/AttributeList_view.aod
index 167cf43d52b..71c6f4b999e 100644
--- a/neonView/AttributeList_view/AttributeList_view.aod
+++ b/neonView/AttributeList_view/AttributeList_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>AttributeList_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/AttributeLookup_view/AttributeLookup_view.aod b/neonView/AttributeLookup_view/AttributeLookup_view.aod
index d1c1580870e..0abd15c3e22 100644
--- a/neonView/AttributeLookup_view/AttributeLookup_view.aod
+++ b/neonView/AttributeLookup_view/AttributeLookup_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>AttributeLookup_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/AttributeMultiEdit_view/AttributeMultiEdit_view.aod b/neonView/AttributeMultiEdit_view/AttributeMultiEdit_view.aod
index 21e86a1d4de..ce138e8b593 100644
--- a/neonView/AttributeMultiEdit_view/AttributeMultiEdit_view.aod
+++ b/neonView/AttributeMultiEdit_view/AttributeMultiEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>AttributeMultiEdit_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/AttributePreview_view/AttributePreview_view.aod b/neonView/AttributePreview_view/AttributePreview_view.aod
index f7164ab6941..6677b9e8eca 100644
--- a/neonView/AttributePreview_view/AttributePreview_view.aod
+++ b/neonView/AttributePreview_view/AttributePreview_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>AttributePreview_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/AttributeRelationMultiEdit_view/AttributeRelationMultiEdit_view.aod b/neonView/AttributeRelationMultiEdit_view/AttributeRelationMultiEdit_view.aod
index fab8b8d5f07..4996c55d00b 100644
--- a/neonView/AttributeRelationMultiEdit_view/AttributeRelationMultiEdit_view.aod
+++ b/neonView/AttributeRelationMultiEdit_view/AttributeRelationMultiEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>AttributeRelationMultiEdit_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/AttributeRelationPreviewList/AttributeRelationPreviewList.aod b/neonView/AttributeRelationPreviewList/AttributeRelationPreviewList.aod
index 3ecddbf8b49..04ae8c35a3c 100644
--- a/neonView/AttributeRelationPreviewList/AttributeRelationPreviewList.aod
+++ b/neonView/AttributeRelationPreviewList/AttributeRelationPreviewList.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>AttributeRelationPreviewList</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/AttributeRelationTreeDrawer_view/AttributeRelationTreeDrawer_view.aod b/neonView/AttributeRelationTreeDrawer_view/AttributeRelationTreeDrawer_view.aod
index 872e755c658..0a721f3a756 100644
--- a/neonView/AttributeRelationTreeDrawer_view/AttributeRelationTreeDrawer_view.aod
+++ b/neonView/AttributeRelationTreeDrawer_view/AttributeRelationTreeDrawer_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>AttributeRelationTreeDrawer_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/AttributeRelationTreeEdit_view/AttributeRelationTreeEdit_view.aod b/neonView/AttributeRelationTreeEdit_view/AttributeRelationTreeEdit_view.aod
index bcc1303d8a3..11f0be4ad61 100644
--- a/neonView/AttributeRelationTreeEdit_view/AttributeRelationTreeEdit_view.aod
+++ b/neonView/AttributeRelationTreeEdit_view/AttributeRelationTreeEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>AttributeRelationTreeEdit_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <size>SMALL</size>
diff --git a/neonView/AttributeRelationTree_view/AttributeRelationTree_view.aod b/neonView/AttributeRelationTree_view/AttributeRelationTree_view.aod
index f0161b804b5..de545b59667 100644
--- a/neonView/AttributeRelationTree_view/AttributeRelationTree_view.aod
+++ b/neonView/AttributeRelationTree_view/AttributeRelationTree_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>AttributeRelationTree_view</name>
   <title>Attributes</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/neonView/AttributeTree_view/AttributeTree_view.aod b/neonView/AttributeTree_view/AttributeTree_view.aod
index aa5ab7c0943..4485456b82f 100644
--- a/neonView/AttributeTree_view/AttributeTree_view.aod
+++ b/neonView/AttributeTree_view/AttributeTree_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>AttributeTree_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/AttributeUsageList_view/AttributeUsageList_view.aod b/neonView/AttributeUsageList_view/AttributeUsageList_view.aod
index 35e765c6458..856a329d1ef 100644
--- a/neonView/AttributeUsageList_view/AttributeUsageList_view.aod
+++ b/neonView/AttributeUsageList_view/AttributeUsageList_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>AttributeUsageList_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/AttributeUsageMultiEdit_view/AttributeUsageMultiEdit_view.aod b/neonView/AttributeUsageMultiEdit_view/AttributeUsageMultiEdit_view.aod
index 96ed51fb956..5bb2bc37b0d 100644
--- a/neonView/AttributeUsageMultiEdit_view/AttributeUsageMultiEdit_view.aod
+++ b/neonView/AttributeUsageMultiEdit_view/AttributeUsageMultiEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>AttributeUsageMultiEdit_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/AuditLogHistoryFilter_view/AuditLogHistoryFilter_view.aod b/neonView/AuditLogHistoryFilter_view/AuditLogHistoryFilter_view.aod
index 87d730da51e..c29afae20f9 100644
--- a/neonView/AuditLogHistoryFilter_view/AuditLogHistoryFilter_view.aod
+++ b/neonView/AuditLogHistoryFilter_view/AuditLogHistoryFilter_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>AuditLogHistoryFilter_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <filterable v="true" />
diff --git a/neonView/BulkMailAddRecipientsEdit_view/BulkMailAddRecipientsEdit_view.aod b/neonView/BulkMailAddRecipientsEdit_view/BulkMailAddRecipientsEdit_view.aod
index 3e391de8175..2eef718c2b4 100644
--- a/neonView/BulkMailAddRecipientsEdit_view/BulkMailAddRecipientsEdit_view.aod
+++ b/neonView/BulkMailAddRecipientsEdit_view/BulkMailAddRecipientsEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>BulkMailAddRecipientsEdit_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <size>SMALL</size>
diff --git a/neonView/BulkMailContent_view/BulkMailContent_view.aod b/neonView/BulkMailContent_view/BulkMailContent_view.aod
index ba5614086a9..6c3878a6091 100644
--- a/neonView/BulkMailContent_view/BulkMailContent_view.aod
+++ b/neonView/BulkMailContent_view/BulkMailContent_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>BulkMailContent_view</name>
   <title>Content</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/neonView/BulkMailEdit_view/BulkMailEdit_view.aod b/neonView/BulkMailEdit_view/BulkMailEdit_view.aod
index 48c07055579..6677a955a9b 100644
--- a/neonView/BulkMailEdit_view/BulkMailEdit_view.aod
+++ b/neonView/BulkMailEdit_view/BulkMailEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>BulkMailEdit_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/BulkMailFilter_view/BulkMailFilter_view.aod b/neonView/BulkMailFilter_view/BulkMailFilter_view.aod
index daa8da26604..fafdd0a86a9 100644
--- a/neonView/BulkMailFilter_view/BulkMailFilter_view.aod
+++ b/neonView/BulkMailFilter_view/BulkMailFilter_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>BulkMailFilter_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <filterable v="true" />
diff --git a/neonView/BulkMailMain_view/BulkMailMain_view.aod b/neonView/BulkMailMain_view/BulkMailMain_view.aod
index 5c3d99ce8a8..91a0c16c22f 100644
--- a/neonView/BulkMailMain_view/BulkMailMain_view.aod
+++ b/neonView/BulkMailMain_view/BulkMailMain_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>BulkMailMain_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/BulkMailPreview_view/BulkMailPreview_view.aod b/neonView/BulkMailPreview_view/BulkMailPreview_view.aod
index 7e3f5b4804e..42fee67eccd 100644
--- a/neonView/BulkMailPreview_view/BulkMailPreview_view.aod
+++ b/neonView/BulkMailPreview_view/BulkMailPreview_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>BulkMailPreview_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/BulkMailRecipientEdit_view/BulkMailRecipientEdit_view.aod b/neonView/BulkMailRecipientEdit_view/BulkMailRecipientEdit_view.aod
index 1ad8a7d50ee..5ea684474be 100644
--- a/neonView/BulkMailRecipientEdit_view/BulkMailRecipientEdit_view.aod
+++ b/neonView/BulkMailRecipientEdit_view/BulkMailRecipientEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>BulkMailRecipientEdit_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <size>SMALL</size>
diff --git a/neonView/BulkMailRecipientFilter_view/BulkMailRecipientFilter_view.aod b/neonView/BulkMailRecipientFilter_view/BulkMailRecipientFilter_view.aod
index 5f4bc454fb6..5a52f85478b 100644
--- a/neonView/BulkMailRecipientFilter_view/BulkMailRecipientFilter_view.aod
+++ b/neonView/BulkMailRecipientFilter_view/BulkMailRecipientFilter_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>BulkMailRecipientFilter_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <filterable v="true" />
diff --git a/neonView/BulkMailStatusChart_view/BulkMailStatusChart_view.aod b/neonView/BulkMailStatusChart_view/BulkMailStatusChart_view.aod
index ca3081b8e40..17be8796767 100644
--- a/neonView/BulkMailStatusChart_view/BulkMailStatusChart_view.aod
+++ b/neonView/BulkMailStatusChart_view/BulkMailStatusChart_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>BulkMailStatusChart_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/BulkMailTesting_view/BulkMailTesting_view.aod b/neonView/BulkMailTesting_view/BulkMailTesting_view.aod
index d3a8fa5c4e9..2fda589cb41 100644
--- a/neonView/BulkMailTesting_view/BulkMailTesting_view.aod
+++ b/neonView/BulkMailTesting_view/BulkMailTesting_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>BulkMailTesting_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <size>SMALL</size>
diff --git a/neonView/CampaignAddParticipantsEdit_view/CampaignAddParticipantsEdit_view.aod b/neonView/CampaignAddParticipantsEdit_view/CampaignAddParticipantsEdit_view.aod
index c5448b2e2f2..c4d7749e7fa 100644
--- a/neonView/CampaignAddParticipantsEdit_view/CampaignAddParticipantsEdit_view.aod
+++ b/neonView/CampaignAddParticipantsEdit_view/CampaignAddParticipantsEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>CampaignAddParticipantsEdit_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <size>SMALL</size>
diff --git a/neonView/CampaignCharts_view/CampaignCharts_view.aod b/neonView/CampaignCharts_view/CampaignCharts_view.aod
index e17db141336..1ca293d2d74 100644
--- a/neonView/CampaignCharts_view/CampaignCharts_view.aod
+++ b/neonView/CampaignCharts_view/CampaignCharts_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>CampaignCharts_view</name>
   <title>Overview</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/neonView/CampaignCostAnalysis_view/CampaignCostAnalysis_view.aod b/neonView/CampaignCostAnalysis_view/CampaignCostAnalysis_view.aod
index 8f82f69de82..4405b5b2479 100644
--- a/neonView/CampaignCostAnalysis_view/CampaignCostAnalysis_view.aod
+++ b/neonView/CampaignCostAnalysis_view/CampaignCostAnalysis_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>CampaignCostAnalysis_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/CampaignCostChart_view/CampaignCostChart_view.aod b/neonView/CampaignCostChart_view/CampaignCostChart_view.aod
index 24159367f94..7250ffc8f37 100644
--- a/neonView/CampaignCostChart_view/CampaignCostChart_view.aod
+++ b/neonView/CampaignCostChart_view/CampaignCostChart_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>CampaignCostChart_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <dashletConfigurations>
diff --git a/neonView/CampaignCostEdit_view/CampaignCostEdit_view.aod b/neonView/CampaignCostEdit_view/CampaignCostEdit_view.aod
index cb1f3d2f26a..82b672034de 100644
--- a/neonView/CampaignCostEdit_view/CampaignCostEdit_view.aod
+++ b/neonView/CampaignCostEdit_view/CampaignCostEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>CampaignCostEdit_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <size>SMALL</size>
diff --git a/neonView/CampaignCostExtendedFilter_view/CampaignCostExtendedFilter_view.aod b/neonView/CampaignCostExtendedFilter_view/CampaignCostExtendedFilter_view.aod
index 15bdd074a0c..ef68f8add69 100644
--- a/neonView/CampaignCostExtendedFilter_view/CampaignCostExtendedFilter_view.aod
+++ b/neonView/CampaignCostExtendedFilter_view/CampaignCostExtendedFilter_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>CampaignCostExtendedFilter_view</name>
   <title>Stop costs</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/neonView/CampaignCostFilter_view/CampaignCostFilter_view.aod b/neonView/CampaignCostFilter_view/CampaignCostFilter_view.aod
index 1cfa11b98bd..4962588f3b2 100644
--- a/neonView/CampaignCostFilter_view/CampaignCostFilter_view.aod
+++ b/neonView/CampaignCostFilter_view/CampaignCostFilter_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>CampaignCostFilter_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <filterable v="false" />
diff --git a/neonView/CampaignCostFix_view/CampaignCostFix_view.aod b/neonView/CampaignCostFix_view/CampaignCostFix_view.aod
index 4397f42cbf1..710331794c9 100644
--- a/neonView/CampaignCostFix_view/CampaignCostFix_view.aod
+++ b/neonView/CampaignCostFix_view/CampaignCostFix_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>CampaignCostFix_view</name>
   <title>Fix costs</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/neonView/CampaignCostVariable_view/CampaignCostVariable_view.aod b/neonView/CampaignCostVariable_view/CampaignCostVariable_view.aod
index c29615b901e..cdef7ed1035 100644
--- a/neonView/CampaignCostVariable_view/CampaignCostVariable_view.aod
+++ b/neonView/CampaignCostVariable_view/CampaignCostVariable_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>CampaignCostVariable_view</name>
   <title>Step costs</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/neonView/CampaignCost_view/CampaignCost_view.aod b/neonView/CampaignCost_view/CampaignCost_view.aod
index 03ccab3dbb9..1272ec645f2 100644
--- a/neonView/CampaignCost_view/CampaignCost_view.aod
+++ b/neonView/CampaignCost_view/CampaignCost_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>CampaignCost_view</name>
   <title>Cost</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/neonView/CampaignEdit_view/CampaignEdit_view.aod b/neonView/CampaignEdit_view/CampaignEdit_view.aod
index 4636fbdffb1..a7271844b7a 100644
--- a/neonView/CampaignEdit_view/CampaignEdit_view.aod
+++ b/neonView/CampaignEdit_view/CampaignEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>CampaignEdit_view</name>
   <title>Campaign</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/neonView/CampaignFilter_view/CampaignFilter_view.aod b/neonView/CampaignFilter_view/CampaignFilter_view.aod
index 4d7c3aac1c1..251fae2fce5 100644
--- a/neonView/CampaignFilter_view/CampaignFilter_view.aod
+++ b/neonView/CampaignFilter_view/CampaignFilter_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>CampaignFilter_view</name>
   <title>Campaign</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/neonView/CampaignMain_view/CampaignMain_view.aod b/neonView/CampaignMain_view/CampaignMain_view.aod
index 789dbfbf943..b9c3a7e101e 100644
--- a/neonView/CampaignMain_view/CampaignMain_view.aod
+++ b/neonView/CampaignMain_view/CampaignMain_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>CampaignMain_view</name>
   <title>Campaign</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/neonView/CampaignOverview_view/CampaignOverview_view.aod b/neonView/CampaignOverview_view/CampaignOverview_view.aod
index b3d627a88d4..d0855732e6d 100644
--- a/neonView/CampaignOverview_view/CampaignOverview_view.aod
+++ b/neonView/CampaignOverview_view/CampaignOverview_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>CampaignOverview_view</name>
   <title>Overview</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/neonView/CampaignParticipantChart_view/CampaignParticipantChart_view.aod b/neonView/CampaignParticipantChart_view/CampaignParticipantChart_view.aod
index ca3630fb2bd..33766f0cf1b 100644
--- a/neonView/CampaignParticipantChart_view/CampaignParticipantChart_view.aod
+++ b/neonView/CampaignParticipantChart_view/CampaignParticipantChart_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>CampaignParticipantChart_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/CampaignParticipantEdit_view/CampaignParticipantEdit_view.aod b/neonView/CampaignParticipantEdit_view/CampaignParticipantEdit_view.aod
index 6539d7a4d36..72e0dfacadd 100644
--- a/neonView/CampaignParticipantEdit_view/CampaignParticipantEdit_view.aod
+++ b/neonView/CampaignParticipantEdit_view/CampaignParticipantEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>CampaignParticipantEdit_view</name>
   <title>Add participant to Campaign</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/neonView/CampaignParticipantFilter_view/CampaignParticipantFilter_view.aod b/neonView/CampaignParticipantFilter_view/CampaignParticipantFilter_view.aod
index 0f7b7272655..b3148ca25c4 100644
--- a/neonView/CampaignParticipantFilter_view/CampaignParticipantFilter_view.aod
+++ b/neonView/CampaignParticipantFilter_view/CampaignParticipantFilter_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>CampaignParticipantFilter_view</name>
   <title></title>
   <description></description>
diff --git a/neonView/CampaignParticipantPreview_view/CampaignParticipantPreview_view.aod b/neonView/CampaignParticipantPreview_view/CampaignParticipantPreview_view.aod
index 0fe2fda3381..6a33444d499 100644
--- a/neonView/CampaignParticipantPreview_view/CampaignParticipantPreview_view.aod
+++ b/neonView/CampaignParticipantPreview_view/CampaignParticipantPreview_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>CampaignParticipantPreview_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/CampaignPlanning_view/CampaignPlanning_view.aod b/neonView/CampaignPlanning_view/CampaignPlanning_view.aod
index ac3d466a4be..3a6df29eef7 100644
--- a/neonView/CampaignPlanning_view/CampaignPlanning_view.aod
+++ b/neonView/CampaignPlanning_view/CampaignPlanning_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>CampaignPlanning_view</name>
   <title>Campaign planning</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/neonView/CampaignPreview_view/CampaignPreview_view.aod b/neonView/CampaignPreview_view/CampaignPreview_view.aod
index 6cbe20bbb71..0433154d474 100644
--- a/neonView/CampaignPreview_view/CampaignPreview_view.aod
+++ b/neonView/CampaignPreview_view/CampaignPreview_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>CampaignPreview_view</name>
   <title>Campaign</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/neonView/CampaignStepAddParticipants_view/CampaignStepAddParticipants_view.aod b/neonView/CampaignStepAddParticipants_view/CampaignStepAddParticipants_view.aod
index 975475f4630..245fb496dc2 100644
--- a/neonView/CampaignStepAddParticipants_view/CampaignStepAddParticipants_view.aod
+++ b/neonView/CampaignStepAddParticipants_view/CampaignStepAddParticipants_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>CampaignStepAddParticipants_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/CampaignStepAnalysis_view/CampaignStepAnalysis_view.aod b/neonView/CampaignStepAnalysis_view/CampaignStepAnalysis_view.aod
index 138d0044939..0404e066350 100644
--- a/neonView/CampaignStepAnalysis_view/CampaignStepAnalysis_view.aod
+++ b/neonView/CampaignStepAnalysis_view/CampaignStepAnalysis_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>CampaignStepAnalysis_view</name>
   <title>Evaluation</title>
   <description>Charts als Ãœbersicht der Kosten des Kampagnenschrittes</description>
diff --git a/neonView/CampaignStepEdit_view/CampaignStepEdit_view.aod b/neonView/CampaignStepEdit_view/CampaignStepEdit_view.aod
index 930baab2cbd..af0403664b9 100644
--- a/neonView/CampaignStepEdit_view/CampaignStepEdit_view.aod
+++ b/neonView/CampaignStepEdit_view/CampaignStepEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>CampaignStepEdit_view</name>
   <title>New campaign step</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/neonView/CampaignStepFilter_view/CampaignStepFilter_view.aod b/neonView/CampaignStepFilter_view/CampaignStepFilter_view.aod
index dc45eb0e658..f8ace2f468b 100644
--- a/neonView/CampaignStepFilter_view/CampaignStepFilter_view.aod
+++ b/neonView/CampaignStepFilter_view/CampaignStepFilter_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>CampaignStepFilter_view</name>
   <title>Campaign steps </title>
   <description></description>
diff --git a/neonView/CampaignStepLookup_view/CampaignStepLookup_view.aod b/neonView/CampaignStepLookup_view/CampaignStepLookup_view.aod
index 9f87ec71201..85ad77be178 100644
--- a/neonView/CampaignStepLookup_view/CampaignStepLookup_view.aod
+++ b/neonView/CampaignStepLookup_view/CampaignStepLookup_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>CampaignStepLookup_view</name>
   <title>Caimpaignsteps</title>
   <description></description>
diff --git a/neonView/CampaignStepMain_view/CampaignStepMain_view.aod b/neonView/CampaignStepMain_view/CampaignStepMain_view.aod
index 7bf5acbf61b..461ae82601e 100644
--- a/neonView/CampaignStepMain_view/CampaignStepMain_view.aod
+++ b/neonView/CampaignStepMain_view/CampaignStepMain_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>CampaignStepMain_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/CampaignStepParticipnatsPerStep_view/CampaignStepParticipnatsPerStep_view.aod b/neonView/CampaignStepParticipnatsPerStep_view/CampaignStepParticipnatsPerStep_view.aod
index cee2045769f..7b1fbeae783 100644
--- a/neonView/CampaignStepParticipnatsPerStep_view/CampaignStepParticipnatsPerStep_view.aod
+++ b/neonView/CampaignStepParticipnatsPerStep_view/CampaignStepParticipnatsPerStep_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>CampaignStepParticipnatsPerStep_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/CampaignStepPreview_view/CampaignStepPreview_view.aod b/neonView/CampaignStepPreview_view/CampaignStepPreview_view.aod
index 51d4713e524..f3e9b0141c1 100644
--- a/neonView/CampaignStepPreview_view/CampaignStepPreview_view.aod
+++ b/neonView/CampaignStepPreview_view/CampaignStepPreview_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>CampaignStepPreview_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/CampaignStepsGantt_view/CampaignStepsGantt_view.aod b/neonView/CampaignStepsGantt_view/CampaignStepsGantt_view.aod
index bc3590f6e3b..78d9814225f 100644
--- a/neonView/CampaignStepsGantt_view/CampaignStepsGantt_view.aod
+++ b/neonView/CampaignStepsGantt_view/CampaignStepsGantt_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>CampaignStepsGantt_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <filterable v="true" />
diff --git a/neonView/ClassificationAdminEdit_view/ClassificationAdminEdit_view.aod b/neonView/ClassificationAdminEdit_view/ClassificationAdminEdit_view.aod
index 43fd31c31ab..b3c80308e02 100644
--- a/neonView/ClassificationAdminEdit_view/ClassificationAdminEdit_view.aod
+++ b/neonView/ClassificationAdminEdit_view/ClassificationAdminEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>ClassificationAdminEdit_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <size>SMALL</size>
diff --git a/neonView/ClassificationAdminFilter_view/ClassificationAdminFilter_view.aod b/neonView/ClassificationAdminFilter_view/ClassificationAdminFilter_view.aod
index 61606618835..66bc95107a3 100644
--- a/neonView/ClassificationAdminFilter_view/ClassificationAdminFilter_view.aod
+++ b/neonView/ClassificationAdminFilter_view/ClassificationAdminFilter_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>ClassificationAdminFilter_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/ClassificationGradingMultipleEdit_view/ClassificationGradingMultipleEdit_view.aod b/neonView/ClassificationGradingMultipleEdit_view/ClassificationGradingMultipleEdit_view.aod
index 6ba9ff49eff..2a66faca02e 100644
--- a/neonView/ClassificationGradingMultipleEdit_view/ClassificationGradingMultipleEdit_view.aod
+++ b/neonView/ClassificationGradingMultipleEdit_view/ClassificationGradingMultipleEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>ClassificationGradingMultipleEdit_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <size>SMALL</size>
diff --git a/neonView/ClassificationGroupPreview_view/ClassificationGroupPreview_view.aod b/neonView/ClassificationGroupPreview_view/ClassificationGroupPreview_view.aod
index ac701fd79bb..07009fa6f7c 100644
--- a/neonView/ClassificationGroupPreview_view/ClassificationGroupPreview_view.aod
+++ b/neonView/ClassificationGroupPreview_view/ClassificationGroupPreview_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>ClassificationGroupPreview_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/ClassificationPreview_view/ClassificationPreview_view.aod b/neonView/ClassificationPreview_view/ClassificationPreview_view.aod
index 8c55fe145f7..099382a2e2d 100644
--- a/neonView/ClassificationPreview_view/ClassificationPreview_view.aod
+++ b/neonView/ClassificationPreview_view/ClassificationPreview_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>ClassificationPreview_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <isOverlay v="false" />
diff --git a/neonView/ClassificationScoreMultipleEdit_view/ClassificationScoreMultipleEdit_view.aod b/neonView/ClassificationScoreMultipleEdit_view/ClassificationScoreMultipleEdit_view.aod
index add9fa38736..20524c3da83 100644
--- a/neonView/ClassificationScoreMultipleEdit_view/ClassificationScoreMultipleEdit_view.aod
+++ b/neonView/ClassificationScoreMultipleEdit_view/ClassificationScoreMultipleEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>ClassificationScoreMultipleEdit_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/ClassificationTree_view/ClassificationTree_view.aod b/neonView/ClassificationTree_view/ClassificationTree_view.aod
index ca36f8fd5fa..7c7200def91 100644
--- a/neonView/ClassificationTree_view/ClassificationTree_view.aod
+++ b/neonView/ClassificationTree_view/ClassificationTree_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>ClassificationTree_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/ClassificationTypePreview_View/ClassificationTypePreview_View.aod b/neonView/ClassificationTypePreview_View/ClassificationTypePreview_View.aod
index 9b7072fc519..e9a3e74a76c 100644
--- a/neonView/ClassificationTypePreview_View/ClassificationTypePreview_View.aod
+++ b/neonView/ClassificationTypePreview_View/ClassificationTypePreview_View.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>ClassificationTypePreview_View</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/CommRestrictionDrawer_view/CommRestrictionDrawer_view.aod b/neonView/CommRestrictionDrawer_view/CommRestrictionDrawer_view.aod
index e764fb22513..62e73d65f64 100644
--- a/neonView/CommRestrictionDrawer_view/CommRestrictionDrawer_view.aod
+++ b/neonView/CommRestrictionDrawer_view/CommRestrictionDrawer_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>CommRestrictionDrawer_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/CommRestrictionFilter_view/CommRestrictionFilter_view.aod b/neonView/CommRestrictionFilter_view/CommRestrictionFilter_view.aod
index 8a4ff768fa4..118d5059636 100644
--- a/neonView/CommRestrictionFilter_view/CommRestrictionFilter_view.aod
+++ b/neonView/CommRestrictionFilter_view/CommRestrictionFilter_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>CommRestrictionFilter_view</name>
   <title>Restrictions</title>
   <description>Restrictions</description>
diff --git a/neonView/CommRestrictionPreview_view/CommRestrictionPreview_view.aod b/neonView/CommRestrictionPreview_view/CommRestrictionPreview_view.aod
index 58f971c0f6b..e740f6b2c74 100644
--- a/neonView/CommRestrictionPreview_view/CommRestrictionPreview_view.aod
+++ b/neonView/CommRestrictionPreview_view/CommRestrictionPreview_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>CommRestrictionPreview_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/CommRestrictionSmallEdit_view/CommRestrictionSmallEdit_view.aod b/neonView/CommRestrictionSmallEdit_view/CommRestrictionSmallEdit_view.aod
index fc757ef3413..03d88f6cc6c 100644
--- a/neonView/CommRestrictionSmallEdit_view/CommRestrictionSmallEdit_view.aod
+++ b/neonView/CommRestrictionSmallEdit_view/CommRestrictionSmallEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>CommRestrictionSmallEdit_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <size>SMALL</size>
diff --git a/neonView/CommunicationEdit_view/CommunicationEdit_view.aod b/neonView/CommunicationEdit_view/CommunicationEdit_view.aod
index 051e7e5fcbe..3fa9900fd7e 100644
--- a/neonView/CommunicationEdit_view/CommunicationEdit_view.aod
+++ b/neonView/CommunicationEdit_view/CommunicationEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>CommunicationEdit_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/CommunicationFilter_view/CommunicationFilter_view.aod b/neonView/CommunicationFilter_view/CommunicationFilter_view.aod
index 18c53dad65e..a0ae2fccad5 100644
--- a/neonView/CommunicationFilter_view/CommunicationFilter_view.aod
+++ b/neonView/CommunicationFilter_view/CommunicationFilter_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>CommunicationFilter_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <filterable v="true" />
diff --git a/neonView/CommunicationList_view/CommunicationList_view.aod b/neonView/CommunicationList_view/CommunicationList_view.aod
index cf84440573f..e646c71d4f7 100644
--- a/neonView/CommunicationList_view/CommunicationList_view.aod
+++ b/neonView/CommunicationList_view/CommunicationList_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>CommunicationList_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/CommunicationMultiEdit_view/CommunicationMultiEdit_view.aod b/neonView/CommunicationMultiEdit_view/CommunicationMultiEdit_view.aod
index ab9ecb32656..8022b2d402a 100644
--- a/neonView/CommunicationMultiEdit_view/CommunicationMultiEdit_view.aod
+++ b/neonView/CommunicationMultiEdit_view/CommunicationMultiEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>CommunicationMultiEdit_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/CompetitionDrawer_view/CompetitionDrawer_view.aod b/neonView/CompetitionDrawer_view/CompetitionDrawer_view.aod
index de151174dc8..469f6a0b536 100644
--- a/neonView/CompetitionDrawer_view/CompetitionDrawer_view.aod
+++ b/neonView/CompetitionDrawer_view/CompetitionDrawer_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>CompetitionDrawer_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/CompetitionEdit_view/CompetitionEdit_view.aod b/neonView/CompetitionEdit_view/CompetitionEdit_view.aod
index 2dc804c8fa5..c752afc16e2 100644
--- a/neonView/CompetitionEdit_view/CompetitionEdit_view.aod
+++ b/neonView/CompetitionEdit_view/CompetitionEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>CompetitionEdit_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <size>SMALL</size>
diff --git a/neonView/CompetitionFilter_view/CompetitionFilter_view.aod b/neonView/CompetitionFilter_view/CompetitionFilter_view.aod
index cc9122ea36d..9dd7bb66444 100644
--- a/neonView/CompetitionFilter_view/CompetitionFilter_view.aod
+++ b/neonView/CompetitionFilter_view/CompetitionFilter_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>CompetitionFilter_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <filterable v="true" />
diff --git a/neonView/CompetitionPreview_view/CompetitionPreview_view.aod b/neonView/CompetitionPreview_view/CompetitionPreview_view.aod
index 789733a343d..9c39a12fda8 100644
--- a/neonView/CompetitionPreview_view/CompetitionPreview_view.aod
+++ b/neonView/CompetitionPreview_view/CompetitionPreview_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>CompetitionPreview_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/ContactEdit_view/ContactEdit_view.aod b/neonView/ContactEdit_view/ContactEdit_view.aod
index 1ba399ccaff..b085859245f 100644
--- a/neonView/ContactEdit_view/ContactEdit_view.aod
+++ b/neonView/ContactEdit_view/ContactEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>ContactEdit_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/ContactList_view/ContactList_view.aod b/neonView/ContactList_view/ContactList_view.aod
index 182533d0196..f9394214646 100644
--- a/neonView/ContactList_view/ContactList_view.aod
+++ b/neonView/ContactList_view/ContactList_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>ContactList_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/ContactTitledList_view/ContactTitledList_view.aod b/neonView/ContactTitledList_view/ContactTitledList_view.aod
index 9e0050c6a15..c980c83ab37 100644
--- a/neonView/ContactTitledList_view/ContactTitledList_view.aod
+++ b/neonView/ContactTitledList_view/ContactTitledList_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>ContactTitledList_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/ContractEdit_view/ContractEdit_view.aod b/neonView/ContractEdit_view/ContractEdit_view.aod
index 1721da28721..67d330efcd5 100644
--- a/neonView/ContractEdit_view/ContractEdit_view.aod
+++ b/neonView/ContractEdit_view/ContractEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>ContractEdit_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/ContractFilter_view/ContractFilter_view.aod b/neonView/ContractFilter_view/ContractFilter_view.aod
index b43c2f7fa56..08b326cef29 100644
--- a/neonView/ContractFilter_view/ContractFilter_view.aod
+++ b/neonView/ContractFilter_view/ContractFilter_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>ContractFilter_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <filterable v="true" />
diff --git a/neonView/ContractMain_view/ContractMain_view.aod b/neonView/ContractMain_view/ContractMain_view.aod
index cc12eb81624..ccf52a59c9a 100644
--- a/neonView/ContractMain_view/ContractMain_view.aod
+++ b/neonView/ContractMain_view/ContractMain_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>ContractMain_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/ContractPreview_view/ContractPreview_view.aod b/neonView/ContractPreview_view/ContractPreview_view.aod
index d825a03fee1..f7fad6eb705 100644
--- a/neonView/ContractPreview_view/ContractPreview_view.aod
+++ b/neonView/ContractPreview_view/ContractPreview_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>ContractPreview_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/CountriesPreview_view/CountriesPreview_view.aod b/neonView/CountriesPreview_view/CountriesPreview_view.aod
index 7b61d0e9d93..e7c4eb2ccb9 100644
--- a/neonView/CountriesPreview_view/CountriesPreview_view.aod
+++ b/neonView/CountriesPreview_view/CountriesPreview_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>CountriesPreview_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/CountriesTable_view/CountriesTable_view.aod b/neonView/CountriesTable_view/CountriesTable_view.aod
index be33402167b..15bdadcf67b 100644
--- a/neonView/CountriesTable_view/CountriesTable_view.aod
+++ b/neonView/CountriesTable_view/CountriesTable_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>CountriesTable_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/DSGVODrawer_view/DSGVODrawer_view.aod b/neonView/DSGVODrawer_view/DSGVODrawer_view.aod
index 867b93a2dd9..ae073283600 100644
--- a/neonView/DSGVODrawer_view/DSGVODrawer_view.aod
+++ b/neonView/DSGVODrawer_view/DSGVODrawer_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>DSGVODrawer_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/DSGVOEdit_view/DSGVOEdit_view.aod b/neonView/DSGVOEdit_view/DSGVOEdit_view.aod
index b10ce1465ad..7a2e36dcd0d 100644
--- a/neonView/DSGVOEdit_view/DSGVOEdit_view.aod
+++ b/neonView/DSGVOEdit_view/DSGVOEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>DSGVOEdit_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <size>SMALL</size>
diff --git a/neonView/DSGVOFilter_view/DSGVOFilter_view.aod b/neonView/DSGVOFilter_view/DSGVOFilter_view.aod
index 0be528e00a0..3129f4f17be 100644
--- a/neonView/DSGVOFilter_view/DSGVOFilter_view.aod
+++ b/neonView/DSGVOFilter_view/DSGVOFilter_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>DSGVOFilter_view</name>
   <title>Data Privacy</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/neonView/DSGVOInfoEdit_view/DSGVOInfoEdit_view.aod b/neonView/DSGVOInfoEdit_view/DSGVOInfoEdit_view.aod
index 322834185a8..5adffc8c9c2 100644
--- a/neonView/DSGVOInfoEdit_view/DSGVOInfoEdit_view.aod
+++ b/neonView/DSGVOInfoEdit_view/DSGVOInfoEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>DSGVOInfoEdit_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <size>SMALL</size>
diff --git a/neonView/DSGVOPreviewAnonym_view/DSGVOPreviewAnonym_view.aod b/neonView/DSGVOPreviewAnonym_view/DSGVOPreviewAnonym_view.aod
index 16b162e36e1..658b5784674 100644
--- a/neonView/DSGVOPreviewAnonym_view/DSGVOPreviewAnonym_view.aod
+++ b/neonView/DSGVOPreviewAnonym_view/DSGVOPreviewAnonym_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>DSGVOPreviewAnonym_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <size>SMALL</size>
diff --git a/neonView/DSGVOPreview_view/DSGVOPreview_view.aod b/neonView/DSGVOPreview_view/DSGVOPreview_view.aod
index 89ff9d67426..f39f20c924e 100644
--- a/neonView/DSGVOPreview_view/DSGVOPreview_view.aod
+++ b/neonView/DSGVOPreview_view/DSGVOPreview_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>DSGVOPreview_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/DSGVOReport_view/DSGVOReport_view.aod b/neonView/DSGVOReport_view/DSGVOReport_view.aod
index 3835fcb15b8..08abe1b52b4 100644
--- a/neonView/DSGVOReport_view/DSGVOReport_view.aod
+++ b/neonView/DSGVOReport_view/DSGVOReport_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>DSGVOReport_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/DefaultAdminView_view/DefaultAdminView_view.aod b/neonView/DefaultAdminView_view/DefaultAdminView_view.aod
index dcba6ff2813..e44c460bd85 100644
--- a/neonView/DefaultAdminView_view/DefaultAdminView_view.aod
+++ b/neonView/DefaultAdminView_view/DefaultAdminView_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>DefaultAdminView_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <size>SMALL</size>
diff --git a/neonView/DefaultLookup_view/DefaultLookup_view.aod b/neonView/DefaultLookup_view/DefaultLookup_view.aod
index 13bbd8a0990..70e53f68709 100644
--- a/neonView/DefaultLookup_view/DefaultLookup_view.aod
+++ b/neonView/DefaultLookup_view/DefaultLookup_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>DefaultLookup_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/DescriptionTranslationEdit_view/DescriptionTranslationEdit_view.aod b/neonView/DescriptionTranslationEdit_view/DescriptionTranslationEdit_view.aod
index 88a27877074..9c24230a735 100644
--- a/neonView/DescriptionTranslationEdit_view/DescriptionTranslationEdit_view.aod
+++ b/neonView/DescriptionTranslationEdit_view/DescriptionTranslationEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>DescriptionTranslationEdit_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <size>SMALL</size>
diff --git a/neonView/DescriptionTranslationFilter_view/DescriptionTranslationFilter_view.aod b/neonView/DescriptionTranslationFilter_view/DescriptionTranslationFilter_view.aod
index 4d86b266dc5..004c88356e0 100644
--- a/neonView/DescriptionTranslationFilter_view/DescriptionTranslationFilter_view.aod
+++ b/neonView/DescriptionTranslationFilter_view/DescriptionTranslationFilter_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>DescriptionTranslationFilter_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/DescriptionTranslationPreview_view/DescriptionTranslationPreview_view.aod b/neonView/DescriptionTranslationPreview_view/DescriptionTranslationPreview_view.aod
index 1e491d1379d..11b5fc210b2 100644
--- a/neonView/DescriptionTranslationPreview_view/DescriptionTranslationPreview_view.aod
+++ b/neonView/DescriptionTranslationPreview_view/DescriptionTranslationPreview_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>DescriptionTranslationPreview_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <filterable v="true" />
diff --git a/neonView/DistrictEdit_view/DistrictEdit_view.aod b/neonView/DistrictEdit_view/DistrictEdit_view.aod
index ef598ae5665..ba7b2fa93c0 100644
--- a/neonView/DistrictEdit_view/DistrictEdit_view.aod
+++ b/neonView/DistrictEdit_view/DistrictEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>DistrictEdit_view</name>
   <title>Responsible Districts</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/neonView/DistrictFilter_view/DistrictFilter_view.aod b/neonView/DistrictFilter_view/DistrictFilter_view.aod
index 0ae033d2346..d60e76db262 100644
--- a/neonView/DistrictFilter_view/DistrictFilter_view.aod
+++ b/neonView/DistrictFilter_view/DistrictFilter_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>DistrictFilter_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <filterable v="true" />
diff --git a/neonView/DistrictList_view/DistrictList_view.aod b/neonView/DistrictList_view/DistrictList_view.aod
index 161c81303a5..45225faadb9 100644
--- a/neonView/DistrictList_view/DistrictList_view.aod
+++ b/neonView/DistrictList_view/DistrictList_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>DistrictList_view</name>
   <title>Responsible Districts</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/neonView/DistrictMain_view/DistrictMain_view.aod b/neonView/DistrictMain_view/DistrictMain_view.aod
index 2babd2f4b0b..f6d39a27cd5 100644
--- a/neonView/DistrictMain_view/DistrictMain_view.aod
+++ b/neonView/DistrictMain_view/DistrictMain_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>DistrictMain_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/DistrictPreview_view/DistrictPreview_view.aod b/neonView/DistrictPreview_view/DistrictPreview_view.aod
index 4f778e75402..8b7243f1f4e 100644
--- a/neonView/DistrictPreview_view/DistrictPreview_view.aod
+++ b/neonView/DistrictPreview_view/DistrictPreview_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>DistrictPreview_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <filterable v="true" />
diff --git a/neonView/DistrictResponsibleList_view/DistrictResponsibleList_view.aod b/neonView/DistrictResponsibleList_view/DistrictResponsibleList_view.aod
index cab52b315c3..fc2f1135c99 100644
--- a/neonView/DistrictResponsibleList_view/DistrictResponsibleList_view.aod
+++ b/neonView/DistrictResponsibleList_view/DistrictResponsibleList_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>DistrictResponsibleList_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/DistrictResponsibleMultiEdit_view/DistrictResponsibleMultiEdit_view.aod b/neonView/DistrictResponsibleMultiEdit_view/DistrictResponsibleMultiEdit_view.aod
index 9e04ed897b7..a6f18a1dfd0 100644
--- a/neonView/DistrictResponsibleMultiEdit_view/DistrictResponsibleMultiEdit_view.aod
+++ b/neonView/DistrictResponsibleMultiEdit_view/DistrictResponsibleMultiEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>DistrictResponsibleMultiEdit_view</name>
   <title></title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/neonView/DistrictResponsiblePreviewList_view/DistrictResponsiblePreviewList_view.aod b/neonView/DistrictResponsiblePreviewList_view/DistrictResponsiblePreviewList_view.aod
index c1deba893d6..d7166fc9276 100644
--- a/neonView/DistrictResponsiblePreviewList_view/DistrictResponsiblePreviewList_view.aod
+++ b/neonView/DistrictResponsiblePreviewList_view/DistrictResponsiblePreviewList_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>DistrictResponsiblePreviewList_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/DocumentDrawer_view/DocumentDrawer_view.aod b/neonView/DocumentDrawer_view/DocumentDrawer_view.aod
index 330a76e993c..95a6fb06859 100644
--- a/neonView/DocumentDrawer_view/DocumentDrawer_view.aod
+++ b/neonView/DocumentDrawer_view/DocumentDrawer_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>DocumentDrawer_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/DocumentEdit_view/DocumentEdit_view.aod b/neonView/DocumentEdit_view/DocumentEdit_view.aod
index 987ec495b6d..b6d671776a6 100644
--- a/neonView/DocumentEdit_view/DocumentEdit_view.aod
+++ b/neonView/DocumentEdit_view/DocumentEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>DocumentEdit_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <size>SMALL</size>
diff --git a/neonView/DocumentFilter_view/DocumentFilter_view.aod b/neonView/DocumentFilter_view/DocumentFilter_view.aod
index 76cd35ba1dd..aa4273cd64a 100644
--- a/neonView/DocumentFilter_view/DocumentFilter_view.aod
+++ b/neonView/DocumentFilter_view/DocumentFilter_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>DocumentFilter_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <filterable v="false" />
diff --git a/neonView/DocumentList_view/DocumentList_view.aod b/neonView/DocumentList_view/DocumentList_view.aod
index 01bb0076767..b3f9d671bc1 100644
--- a/neonView/DocumentList_view/DocumentList_view.aod
+++ b/neonView/DocumentList_view/DocumentList_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>DocumentList_view</name>
   <title>Errorlogs</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/neonView/DocumentMultipleEdit_view/DocumentMultipleEdit_view.aod b/neonView/DocumentMultipleEdit_view/DocumentMultipleEdit_view.aod
index f7e201e275a..150915177ec 100644
--- a/neonView/DocumentMultipleEdit_view/DocumentMultipleEdit_view.aod
+++ b/neonView/DocumentMultipleEdit_view/DocumentMultipleEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>DocumentMultipleEdit_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/DocumentPreview_view/DocumentPreview_view.aod b/neonView/DocumentPreview_view/DocumentPreview_view.aod
index d0d0b982594..a6a451190e3 100644
--- a/neonView/DocumentPreview_view/DocumentPreview_view.aod
+++ b/neonView/DocumentPreview_view/DocumentPreview_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>DocumentPreview_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/DocumentTemplateEdit_view/DocumentTemplateEdit_view.aod b/neonView/DocumentTemplateEdit_view/DocumentTemplateEdit_view.aod
index c21e2204ae0..9f8b7600fd0 100644
--- a/neonView/DocumentTemplateEdit_view/DocumentTemplateEdit_view.aod
+++ b/neonView/DocumentTemplateEdit_view/DocumentTemplateEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>DocumentTemplateEdit_view</name>
   <title>Document Template</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/neonView/DocumentTemplateFilterSmall_view/DocumentTemplateFilterSmall_view.aod b/neonView/DocumentTemplateFilterSmall_view/DocumentTemplateFilterSmall_view.aod
index fae9c9be8a7..c72049158c8 100644
--- a/neonView/DocumentTemplateFilterSmall_view/DocumentTemplateFilterSmall_view.aod
+++ b/neonView/DocumentTemplateFilterSmall_view/DocumentTemplateFilterSmall_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>DocumentTemplateFilterSmall_view</name>
   <title>Document Template</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/neonView/DocumentTemplateFilter_view/DocumentTemplateFilter_view.aod b/neonView/DocumentTemplateFilter_view/DocumentTemplateFilter_view.aod
index 7eadad0864f..06232462d05 100644
--- a/neonView/DocumentTemplateFilter_view/DocumentTemplateFilter_view.aod
+++ b/neonView/DocumentTemplateFilter_view/DocumentTemplateFilter_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>DocumentTemplateFilter_view</name>
   <title>Document Template</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/neonView/DocumentTemplateLinkList_view/DocumentTemplateLinkList_view.aod b/neonView/DocumentTemplateLinkList_view/DocumentTemplateLinkList_view.aod
index 3358d6c6e41..7838782e146 100644
--- a/neonView/DocumentTemplateLinkList_view/DocumentTemplateLinkList_view.aod
+++ b/neonView/DocumentTemplateLinkList_view/DocumentTemplateLinkList_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>DocumentTemplateLinkList_view</name>
   <title>Attachments</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/neonView/DocumentTemplateLinkMultiEdit_view/DocumentTemplateLinkMultiEdit_view.aod b/neonView/DocumentTemplateLinkMultiEdit_view/DocumentTemplateLinkMultiEdit_view.aod
index 58a2713ae97..daa83967839 100644
--- a/neonView/DocumentTemplateLinkMultiEdit_view/DocumentTemplateLinkMultiEdit_view.aod
+++ b/neonView/DocumentTemplateLinkMultiEdit_view/DocumentTemplateLinkMultiEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>DocumentTemplateLinkMultiEdit_view</name>
   <title>Attachments</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/neonView/DocumentTemplatePlaceOfUseList_view/DocumentTemplatePlaceOfUseList_view.aod b/neonView/DocumentTemplatePlaceOfUseList_view/DocumentTemplatePlaceOfUseList_view.aod
index 1ed442ea703..0dd0dd675f1 100644
--- a/neonView/DocumentTemplatePlaceOfUseList_view/DocumentTemplatePlaceOfUseList_view.aod
+++ b/neonView/DocumentTemplatePlaceOfUseList_view/DocumentTemplatePlaceOfUseList_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>DocumentTemplatePlaceOfUseList_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/DocumentTemplatePlaceOfUseMultiEdit_view/DocumentTemplatePlaceOfUseMultiEdit_view.aod b/neonView/DocumentTemplatePlaceOfUseMultiEdit_view/DocumentTemplatePlaceOfUseMultiEdit_view.aod
index 63f2c9dd137..9e422e2b62e 100644
--- a/neonView/DocumentTemplatePlaceOfUseMultiEdit_view/DocumentTemplatePlaceOfUseMultiEdit_view.aod
+++ b/neonView/DocumentTemplatePlaceOfUseMultiEdit_view/DocumentTemplatePlaceOfUseMultiEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>DocumentTemplatePlaceOfUseMultiEdit_view</name>
   <title>Documenttemplate Place Of Use</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/neonView/DocumentTemplatePlaceOfUseTitledList_view/DocumentTemplatePlaceOfUseTitledList_view.aod b/neonView/DocumentTemplatePlaceOfUseTitledList_view/DocumentTemplatePlaceOfUseTitledList_view.aod
index c625c14dd3c..bf02efdec24 100644
--- a/neonView/DocumentTemplatePlaceOfUseTitledList_view/DocumentTemplatePlaceOfUseTitledList_view.aod
+++ b/neonView/DocumentTemplatePlaceOfUseTitledList_view/DocumentTemplatePlaceOfUseTitledList_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>DocumentTemplatePlaceOfUseTitledList_view</name>
   <title>Documenttemplate Place Of Use</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/neonView/DocumentTemplatePreview_view/DocumentTemplatePreview_view.aod b/neonView/DocumentTemplatePreview_view/DocumentTemplatePreview_view.aod
index 5c4100bd637..7ce305ce181 100644
--- a/neonView/DocumentTemplatePreview_view/DocumentTemplatePreview_view.aod
+++ b/neonView/DocumentTemplatePreview_view/DocumentTemplatePreview_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>DocumentTemplatePreview_view</name>
   <title>Document Template</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/neonView/DocumentTemplateTypeCategoryFilter_view/DocumentTemplateTypeCategoryFilter_view.aod b/neonView/DocumentTemplateTypeCategoryFilter_view/DocumentTemplateTypeCategoryFilter_view.aod
index 8cd2d326b93..8412c83ab2b 100644
--- a/neonView/DocumentTemplateTypeCategoryFilter_view/DocumentTemplateTypeCategoryFilter_view.aod
+++ b/neonView/DocumentTemplateTypeCategoryFilter_view/DocumentTemplateTypeCategoryFilter_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>DocumentTemplateTypeCategoryFilter_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/DocumentWithIdFilter_view/DocumentWithIdFilter_view.aod b/neonView/DocumentWithIdFilter_view/DocumentWithIdFilter_view.aod
index 3cafd27757d..8021657957e 100644
--- a/neonView/DocumentWithIdFilter_view/DocumentWithIdFilter_view.aod
+++ b/neonView/DocumentWithIdFilter_view/DocumentWithIdFilter_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>DocumentWithIdFilter_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/DuplicateScannerEdit_view/DuplicateScannerEdit_view.aod b/neonView/DuplicateScannerEdit_view/DuplicateScannerEdit_view.aod
index 684c65d5dc6..a47a045257e 100644
--- a/neonView/DuplicateScannerEdit_view/DuplicateScannerEdit_view.aod
+++ b/neonView/DuplicateScannerEdit_view/DuplicateScannerEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>DuplicateScannerEdit_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/DuplicateScannerFilter_view/DuplicateScannerFilter_view.aod b/neonView/DuplicateScannerFilter_view/DuplicateScannerFilter_view.aod
index e70f21cbb44..922b7beb129 100644
--- a/neonView/DuplicateScannerFilter_view/DuplicateScannerFilter_view.aod
+++ b/neonView/DuplicateScannerFilter_view/DuplicateScannerFilter_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>DuplicateScannerFilter_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/DuplicateScannerPreview_view/DuplicateScannerPreview_view.aod b/neonView/DuplicateScannerPreview_view/DuplicateScannerPreview_view.aod
index a14a89ccf1b..e1d655cdbf3 100644
--- a/neonView/DuplicateScannerPreview_view/DuplicateScannerPreview_view.aod
+++ b/neonView/DuplicateScannerPreview_view/DuplicateScannerPreview_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>DuplicateScannerPreview_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/DuplicateScannerResultFieldConfigEdit_view/DuplicateScannerResultFieldConfigEdit_view.aod b/neonView/DuplicateScannerResultFieldConfigEdit_view/DuplicateScannerResultFieldConfigEdit_view.aod
index 576c3d38332..1689d8f9fc3 100644
--- a/neonView/DuplicateScannerResultFieldConfigEdit_view/DuplicateScannerResultFieldConfigEdit_view.aod
+++ b/neonView/DuplicateScannerResultFieldConfigEdit_view/DuplicateScannerResultFieldConfigEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>DuplicateScannerResultFieldConfigEdit_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/DuplicatesOverview_view/DuplicatesOverview_view.aod b/neonView/DuplicatesOverview_view/DuplicatesOverview_view.aod
index c019d199c21..0f2a6ce1c5f 100644
--- a/neonView/DuplicatesOverview_view/DuplicatesOverview_view.aod
+++ b/neonView/DuplicatesOverview_view/DuplicatesOverview_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>DuplicatesOverview_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/DuplicatesUnrelatedCluster_view/DuplicatesUnrelatedCluster_view.aod b/neonView/DuplicatesUnrelatedCluster_view/DuplicatesUnrelatedCluster_view.aod
index f0ead2ebdc8..fd2c40f8a36 100644
--- a/neonView/DuplicatesUnrelatedCluster_view/DuplicatesUnrelatedCluster_view.aod
+++ b/neonView/DuplicatesUnrelatedCluster_view/DuplicatesUnrelatedCluster_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>DuplicatesUnrelatedCluster_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/DuplicatesUnrelatedOrganisationFilter_view/DuplicatesUnrelatedOrganisationFilter_view.aod b/neonView/DuplicatesUnrelatedOrganisationFilter_view/DuplicatesUnrelatedOrganisationFilter_view.aod
index 9a595daa534..d7fafa1ae89 100644
--- a/neonView/DuplicatesUnrelatedOrganisationFilter_view/DuplicatesUnrelatedOrganisationFilter_view.aod
+++ b/neonView/DuplicatesUnrelatedOrganisationFilter_view/DuplicatesUnrelatedOrganisationFilter_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>DuplicatesUnrelatedOrganisationFilter_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/DuplicatesUnrelatedPersonFilter_view/DuplicatesUnrelatedPersonFilter_view.aod b/neonView/DuplicatesUnrelatedPersonFilter_view/DuplicatesUnrelatedPersonFilter_view.aod
index 4ba98a70931..3e9a45ecbbb 100644
--- a/neonView/DuplicatesUnrelatedPersonFilter_view/DuplicatesUnrelatedPersonFilter_view.aod
+++ b/neonView/DuplicatesUnrelatedPersonFilter_view/DuplicatesUnrelatedPersonFilter_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>DuplicatesUnrelatedPersonFilter_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/EmailEdit_view/EmailEdit_view.aod b/neonView/EmailEdit_view/EmailEdit_view.aod
index 0606c5788a5..4d54a0c3938 100644
--- a/neonView/EmailEdit_view/EmailEdit_view.aod
+++ b/neonView/EmailEdit_view/EmailEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>EmailEdit_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <size>SMALL</size>
diff --git a/neonView/EmployeeEdit_view/EmployeeEdit_view.aod b/neonView/EmployeeEdit_view/EmployeeEdit_view.aod
index 8ddd860527f..1042e95db5c 100644
--- a/neonView/EmployeeEdit_view/EmployeeEdit_view.aod
+++ b/neonView/EmployeeEdit_view/EmployeeEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>EmployeeEdit_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/EmployeeFilter_view/EmployeeFilter_view.aod b/neonView/EmployeeFilter_view/EmployeeFilter_view.aod
index 7cb12f6d37d..e26d5d132de 100644
--- a/neonView/EmployeeFilter_view/EmployeeFilter_view.aod
+++ b/neonView/EmployeeFilter_view/EmployeeFilter_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>EmployeeFilter_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <filterable v="true" />
diff --git a/neonView/EmployeeLookup_view/EmployeeLookup_view.aod b/neonView/EmployeeLookup_view/EmployeeLookup_view.aod
index a213204aaa0..3e33d83a90b 100644
--- a/neonView/EmployeeLookup_view/EmployeeLookup_view.aod
+++ b/neonView/EmployeeLookup_view/EmployeeLookup_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>EmployeeLookup_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/EmployeeMain_view/EmployeeMain_view.aod b/neonView/EmployeeMain_view/EmployeeMain_view.aod
index 94d73c9fd2e..b997a79e7c2 100644
--- a/neonView/EmployeeMain_view/EmployeeMain_view.aod
+++ b/neonView/EmployeeMain_view/EmployeeMain_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>EmployeeMain_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/EmployeePassword_view/EmployeePassword_view.aod b/neonView/EmployeePassword_view/EmployeePassword_view.aod
index 9309f0b748f..24cd4cab6c1 100644
--- a/neonView/EmployeePassword_view/EmployeePassword_view.aod
+++ b/neonView/EmployeePassword_view/EmployeePassword_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>EmployeePassword_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <size>SMALL</size>
diff --git a/neonView/EmployeePermission_view/EmployeePermission_view.aod b/neonView/EmployeePermission_view/EmployeePermission_view.aod
index 6bfd87a53c7..a25dbbf2be7 100644
--- a/neonView/EmployeePermission_view/EmployeePermission_view.aod
+++ b/neonView/EmployeePermission_view/EmployeePermission_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>EmployeePermission_view</name>
   <title>Permission</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/neonView/EmployeePreview_view/EmployeePreview_view.aod b/neonView/EmployeePreview_view/EmployeePreview_view.aod
index 576e510759e..0e0ae8dfbaa 100644
--- a/neonView/EmployeePreview_view/EmployeePreview_view.aod
+++ b/neonView/EmployeePreview_view/EmployeePreview_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>EmployeePreview_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/EmployeeRoleEdit_view/EmployeeRoleEdit_view.aod b/neonView/EmployeeRoleEdit_view/EmployeeRoleEdit_view.aod
index a7b67bdd57e..f50141d69c2 100644
--- a/neonView/EmployeeRoleEdit_view/EmployeeRoleEdit_view.aod
+++ b/neonView/EmployeeRoleEdit_view/EmployeeRoleEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>EmployeeRoleEdit_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/EmployeeRoleFilter_view/EmployeeRoleFilter_view.aod b/neonView/EmployeeRoleFilter_view/EmployeeRoleFilter_view.aod
index 92618fbb9cb..9fdfc39524c 100644
--- a/neonView/EmployeeRoleFilter_view/EmployeeRoleFilter_view.aod
+++ b/neonView/EmployeeRoleFilter_view/EmployeeRoleFilter_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>EmployeeRoleFilter_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/EmployeeRoleGenericEdit_view/EmployeeRoleGenericEdit_view.aod b/neonView/EmployeeRoleGenericEdit_view/EmployeeRoleGenericEdit_view.aod
index 28e2345dee0..675bac8f95f 100644
--- a/neonView/EmployeeRoleGenericEdit_view/EmployeeRoleGenericEdit_view.aod
+++ b/neonView/EmployeeRoleGenericEdit_view/EmployeeRoleGenericEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>EmployeeRoleGenericEdit_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <size>SMALL</size>
diff --git a/neonView/EmployeeTokenEdit_view/EmployeeTokenEdit_view.aod b/neonView/EmployeeTokenEdit_view/EmployeeTokenEdit_view.aod
index 9a0bad8cead..284bcdb7387 100644
--- a/neonView/EmployeeTokenEdit_view/EmployeeTokenEdit_view.aod
+++ b/neonView/EmployeeTokenEdit_view/EmployeeTokenEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>EmployeeTokenEdit_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/EmployeeTokenFilter_view/EmployeeTokenFilter_view.aod b/neonView/EmployeeTokenFilter_view/EmployeeTokenFilter_view.aod
index 852a0eed7cc..166cc2ab1e6 100644
--- a/neonView/EmployeeTokenFilter_view/EmployeeTokenFilter_view.aod
+++ b/neonView/EmployeeTokenFilter_view/EmployeeTokenFilter_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>EmployeeTokenFilter_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <filterable v="true" />
diff --git a/neonView/ExportTemplateEdit_view/ExportTemplateEdit_view.aod b/neonView/ExportTemplateEdit_view/ExportTemplateEdit_view.aod
index eae6477e9a3..1738cd09ed8 100644
--- a/neonView/ExportTemplateEdit_view/ExportTemplateEdit_view.aod
+++ b/neonView/ExportTemplateEdit_view/ExportTemplateEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>ExportTemplateEdit_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/ExportTemplateFieldList_view/ExportTemplateFieldList_view.aod b/neonView/ExportTemplateFieldList_view/ExportTemplateFieldList_view.aod
index c76b3911ada..28c2f1ac055 100644
--- a/neonView/ExportTemplateFieldList_view/ExportTemplateFieldList_view.aod
+++ b/neonView/ExportTemplateFieldList_view/ExportTemplateFieldList_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>ExportTemplateFieldList_view</name>
   <title>Field and Position</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/neonView/ExportTemplateFieldMultiEdit_view/ExportTemplateFieldMultiEdit_view.aod b/neonView/ExportTemplateFieldMultiEdit_view/ExportTemplateFieldMultiEdit_view.aod
index 32fe782b9ba..985ff2fd258 100644
--- a/neonView/ExportTemplateFieldMultiEdit_view/ExportTemplateFieldMultiEdit_view.aod
+++ b/neonView/ExportTemplateFieldMultiEdit_view/ExportTemplateFieldMultiEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>ExportTemplateFieldMultiEdit_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/ExportTemplateFilter_view/ExportTemplateFilter_view.aod b/neonView/ExportTemplateFilter_view/ExportTemplateFilter_view.aod
index 8291821119d..71913d29b93 100644
--- a/neonView/ExportTemplateFilter_view/ExportTemplateFilter_view.aod
+++ b/neonView/ExportTemplateFilter_view/ExportTemplateFilter_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>ExportTemplateFilter_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <filterable v="true" />
diff --git a/neonView/ExportTemplatePlaceOfUseList_view/ExportTemplatePlaceOfUseList_view.aod b/neonView/ExportTemplatePlaceOfUseList_view/ExportTemplatePlaceOfUseList_view.aod
index 45306dbb723..122ea2ead58 100644
--- a/neonView/ExportTemplatePlaceOfUseList_view/ExportTemplatePlaceOfUseList_view.aod
+++ b/neonView/ExportTemplatePlaceOfUseList_view/ExportTemplatePlaceOfUseList_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>ExportTemplatePlaceOfUseList_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/ExportTemplatePlaceOfUseMultiEdit_view/ExportTemplatePlaceOfUseMultiEdit_view.aod b/neonView/ExportTemplatePlaceOfUseMultiEdit_view/ExportTemplatePlaceOfUseMultiEdit_view.aod
index 3bb9efc85f4..23b08531c91 100644
--- a/neonView/ExportTemplatePlaceOfUseMultiEdit_view/ExportTemplatePlaceOfUseMultiEdit_view.aod
+++ b/neonView/ExportTemplatePlaceOfUseMultiEdit_view/ExportTemplatePlaceOfUseMultiEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>ExportTemplatePlaceOfUseMultiEdit_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/ExportTemplatePreview_view/ExportTemplatePreview_view.aod b/neonView/ExportTemplatePreview_view/ExportTemplatePreview_view.aod
index 06bcfe9edfd..0ba6f946034 100644
--- a/neonView/ExportTemplatePreview_view/ExportTemplatePreview_view.aod
+++ b/neonView/ExportTemplatePreview_view/ExportTemplatePreview_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>ExportTemplatePreview_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/ExportTemplateSelectionEdit_view/ExportTemplateSelectionEdit_view.aod b/neonView/ExportTemplateSelectionEdit_view/ExportTemplateSelectionEdit_view.aod
index 3886dffb7b0..439c760013d 100644
--- a/neonView/ExportTemplateSelectionEdit_view/ExportTemplateSelectionEdit_view.aod
+++ b/neonView/ExportTemplateSelectionEdit_view/ExportTemplateSelectionEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>ExportTemplateSelectionEdit_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <size>SMALL</size>
diff --git a/neonView/FacebookTimeline_view/FacebookTimeline_view.aod b/neonView/FacebookTimeline_view/FacebookTimeline_view.aod
index c9270765ff0..63c8a443c7d 100644
--- a/neonView/FacebookTimeline_view/FacebookTimeline_view.aod
+++ b/neonView/FacebookTimeline_view/FacebookTimeline_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>FacebookTimeline_view</name>
   <title>Facebook</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/neonView/FavoriteFilter_view/FavoriteFilter_view.aod b/neonView/FavoriteFilter_view/FavoriteFilter_view.aod
index 61070f4ce2c..9e9c42e217c 100644
--- a/neonView/FavoriteFilter_view/FavoriteFilter_view.aod
+++ b/neonView/FavoriteFilter_view/FavoriteFilter_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>FavoriteFilter_view</name>
   <title>FavoriteFilter_view</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/neonView/FavoritePreview_view/FavoritePreview_view.aod b/neonView/FavoritePreview_view/FavoritePreview_view.aod
index 25f98d8ef42..c022ed08740 100644
--- a/neonView/FavoritePreview_view/FavoritePreview_view.aod
+++ b/neonView/FavoritePreview_view/FavoritePreview_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>FavoritePreview_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/ForecastDrawer_view/ForecastDrawer_view.aod b/neonView/ForecastDrawer_view/ForecastDrawer_view.aod
index ef5388b8425..552f0439fb7 100644
--- a/neonView/ForecastDrawer_view/ForecastDrawer_view.aod
+++ b/neonView/ForecastDrawer_view/ForecastDrawer_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>ForecastDrawer_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/ForecastEdit_view/ForecastEdit_view.aod b/neonView/ForecastEdit_view/ForecastEdit_view.aod
index 28debe56d0f..9934ef36ef5 100644
--- a/neonView/ForecastEdit_view/ForecastEdit_view.aod
+++ b/neonView/ForecastEdit_view/ForecastEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>ForecastEdit_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <size>SMALL</size>
diff --git a/neonView/ForecastFilter_view/ForecastFilter_view.aod b/neonView/ForecastFilter_view/ForecastFilter_view.aod
index ffa08904f6b..b048b1260ed 100644
--- a/neonView/ForecastFilter_view/ForecastFilter_view.aod
+++ b/neonView/ForecastFilter_view/ForecastFilter_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>ForecastFilter_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <filterable v="true" />
diff --git a/neonView/ForecastPreview_view/ForecastPreview_view.aod b/neonView/ForecastPreview_view/ForecastPreview_view.aod
index f13e83a74c9..229641c2b83 100644
--- a/neonView/ForecastPreview_view/ForecastPreview_view.aod
+++ b/neonView/ForecastPreview_view/ForecastPreview_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>ForecastPreview_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/ImportFieldEdit_view/ImportFieldEdit_view.aod b/neonView/ImportFieldEdit_view/ImportFieldEdit_view.aod
index 4bcc0eda9db..fcf56cc9a05 100644
--- a/neonView/ImportFieldEdit_view/ImportFieldEdit_view.aod
+++ b/neonView/ImportFieldEdit_view/ImportFieldEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>ImportFieldEdit_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <size>SMALL</size>
diff --git a/neonView/ImportFieldFilterMapping_view/ImportFieldFilterMapping_view.aod b/neonView/ImportFieldFilterMapping_view/ImportFieldFilterMapping_view.aod
index 29a4e8be88b..b9d17d1d3cd 100644
--- a/neonView/ImportFieldFilterMapping_view/ImportFieldFilterMapping_view.aod
+++ b/neonView/ImportFieldFilterMapping_view/ImportFieldFilterMapping_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>ImportFieldFilterMapping_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/ImportFieldFilter_view/ImportFieldFilter_view.aod b/neonView/ImportFieldFilter_view/ImportFieldFilter_view.aod
index ee181575792..2528d1aea75 100644
--- a/neonView/ImportFieldFilter_view/ImportFieldFilter_view.aod
+++ b/neonView/ImportFieldFilter_view/ImportFieldFilter_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>ImportFieldFilter_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <filterable v="true" />
diff --git a/neonView/IndexSearchView/IndexSearchView.aod b/neonView/IndexSearchView/IndexSearchView.aod
index c1a8c71fd03..e1b5c1f4128 100644
--- a/neonView/IndexSearchView/IndexSearchView.aod
+++ b/neonView/IndexSearchView/IndexSearchView.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>IndexSearchView</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <dashletConfigurations>
diff --git a/neonView/KeywordAttributeEdit_view/KeywordAttributeEdit_view.aod b/neonView/KeywordAttributeEdit_view/KeywordAttributeEdit_view.aod
index 1e906c4ad40..f273fb416fe 100644
--- a/neonView/KeywordAttributeEdit_view/KeywordAttributeEdit_view.aod
+++ b/neonView/KeywordAttributeEdit_view/KeywordAttributeEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>KeywordAttributeEdit_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <size>SMALL</size>
diff --git a/neonView/KeywordAttributeFilter_view/KeywordAttributeFilter_view.aod b/neonView/KeywordAttributeFilter_view/KeywordAttributeFilter_view.aod
index 9072b6df51f..fdbdca90e0e 100644
--- a/neonView/KeywordAttributeFilter_view/KeywordAttributeFilter_view.aod
+++ b/neonView/KeywordAttributeFilter_view/KeywordAttributeFilter_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>KeywordAttributeFilter_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <filterable v="true" />
diff --git a/neonView/KeywordAttributeRelationRows_view/KeywordAttributeRelationRows_view.aod b/neonView/KeywordAttributeRelationRows_view/KeywordAttributeRelationRows_view.aod
index 3c349095ff8..b6ce5f6117a 100644
--- a/neonView/KeywordAttributeRelationRows_view/KeywordAttributeRelationRows_view.aod
+++ b/neonView/KeywordAttributeRelationRows_view/KeywordAttributeRelationRows_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>KeywordAttributeRelationRows_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <filterable v="false" />
diff --git a/neonView/KeywordAttriubteRelationTitled_view/KeywordAttriubteRelationTitled_view.aod b/neonView/KeywordAttriubteRelationTitled_view/KeywordAttriubteRelationTitled_view.aod
index 35a025815b8..7d6ae096e0e 100644
--- a/neonView/KeywordAttriubteRelationTitled_view/KeywordAttriubteRelationTitled_view.aod
+++ b/neonView/KeywordAttriubteRelationTitled_view/KeywordAttriubteRelationTitled_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>KeywordAttriubteRelationTitled_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/KeywordEntryEdit_view/KeywordEntryEdit_view.aod b/neonView/KeywordEntryEdit_view/KeywordEntryEdit_view.aod
index d759384a706..d272c794189 100644
--- a/neonView/KeywordEntryEdit_view/KeywordEntryEdit_view.aod
+++ b/neonView/KeywordEntryEdit_view/KeywordEntryEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>KeywordEntryEdit_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <size>SMALL</size>
diff --git a/neonView/KeywordEntryFilter_view/KeywordEntryFilter_view.aod b/neonView/KeywordEntryFilter_view/KeywordEntryFilter_view.aod
index 874bbf3c62f..8f78ef984bb 100644
--- a/neonView/KeywordEntryFilter_view/KeywordEntryFilter_view.aod
+++ b/neonView/KeywordEntryFilter_view/KeywordEntryFilter_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>KeywordEntryFilter_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <filterable v="true" />
diff --git a/neonView/KeywordEntryPreview_view/KeywordEntryPreview_view.aod b/neonView/KeywordEntryPreview_view/KeywordEntryPreview_view.aod
index 75d472d2485..e73858d8214 100644
--- a/neonView/KeywordEntryPreview_view/KeywordEntryPreview_view.aod
+++ b/neonView/KeywordEntryPreview_view/KeywordEntryPreview_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>KeywordEntryPreview_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/KnowledgeDiscussionEdit_view/KnowledgeDiscussionEdit_view.aod b/neonView/KnowledgeDiscussionEdit_view/KnowledgeDiscussionEdit_view.aod
index 8982a135812..9e22618d2ed 100644
--- a/neonView/KnowledgeDiscussionEdit_view/KnowledgeDiscussionEdit_view.aod
+++ b/neonView/KnowledgeDiscussionEdit_view/KnowledgeDiscussionEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>KnowledgeDiscussionEdit_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <size>SMALL</size>
diff --git a/neonView/KnowledgeDiscussionPreview_view/KnowledgeDiscussionPreview_view.aod b/neonView/KnowledgeDiscussionPreview_view/KnowledgeDiscussionPreview_view.aod
index e98045a42c2..a63d8a4035d 100644
--- a/neonView/KnowledgeDiscussionPreview_view/KnowledgeDiscussionPreview_view.aod
+++ b/neonView/KnowledgeDiscussionPreview_view/KnowledgeDiscussionPreview_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>KnowledgeDiscussionPreview_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <size>SMALL</size>
diff --git a/neonView/KnowledgeDiscussionTree_view/KnowledgeDiscussionTree_view.aod b/neonView/KnowledgeDiscussionTree_view/KnowledgeDiscussionTree_view.aod
index ec4ef34471b..4a2b372258a 100644
--- a/neonView/KnowledgeDiscussionTree_view/KnowledgeDiscussionTree_view.aod
+++ b/neonView/KnowledgeDiscussionTree_view/KnowledgeDiscussionTree_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>KnowledgeDiscussionTree_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <filterable v="true" />
diff --git a/neonView/KnowledgeLinkActionList_view/KnowledgeLinkActionList_view.aod b/neonView/KnowledgeLinkActionList_view/KnowledgeLinkActionList_view.aod
index 23ed8823319..a54f0dfcf89 100644
--- a/neonView/KnowledgeLinkActionList_view/KnowledgeLinkActionList_view.aod
+++ b/neonView/KnowledgeLinkActionList_view/KnowledgeLinkActionList_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>KnowledgeLinkActionList_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/KnowledgeLinkEdit_view/KnowledgeLinkEdit_view.aod b/neonView/KnowledgeLinkEdit_view/KnowledgeLinkEdit_view.aod
index 34e51015d71..7f554eb698f 100644
--- a/neonView/KnowledgeLinkEdit_view/KnowledgeLinkEdit_view.aod
+++ b/neonView/KnowledgeLinkEdit_view/KnowledgeLinkEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>KnowledgeLinkEdit_view</name>
   <title>Links</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/neonView/KnowledgeLinkLookup_view/KnowledgeLinkLookup_view.aod b/neonView/KnowledgeLinkLookup_view/KnowledgeLinkLookup_view.aod
index 49df3025f21..2750e534955 100644
--- a/neonView/KnowledgeLinkLookup_view/KnowledgeLinkLookup_view.aod
+++ b/neonView/KnowledgeLinkLookup_view/KnowledgeLinkLookup_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>KnowledgeLinkLookup_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <filterable v="true" />
diff --git a/neonView/KnowledgeLinkMultiEdit_view/KnowledgeLinkMultiEdit_view.aod b/neonView/KnowledgeLinkMultiEdit_view/KnowledgeLinkMultiEdit_view.aod
index 0b3448b225c..7d227e4aedf 100644
--- a/neonView/KnowledgeLinkMultiEdit_view/KnowledgeLinkMultiEdit_view.aod
+++ b/neonView/KnowledgeLinkMultiEdit_view/KnowledgeLinkMultiEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>KnowledgeLinkMultiEdit_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <size>SMALL</size>
diff --git a/neonView/KnowledgeManagementContent_view/KnowledgeManagementContent_view.aod b/neonView/KnowledgeManagementContent_view/KnowledgeManagementContent_view.aod
index 2318cac2885..243f07da317 100644
--- a/neonView/KnowledgeManagementContent_view/KnowledgeManagementContent_view.aod
+++ b/neonView/KnowledgeManagementContent_view/KnowledgeManagementContent_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>KnowledgeManagementContent_view</name>
   <title>Content</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/neonView/KnowledgeManagementDetails_view/KnowledgeManagementDetails_view.aod b/neonView/KnowledgeManagementDetails_view/KnowledgeManagementDetails_view.aod
index 43c26e82585..76016ffd829 100644
--- a/neonView/KnowledgeManagementDetails_view/KnowledgeManagementDetails_view.aod
+++ b/neonView/KnowledgeManagementDetails_view/KnowledgeManagementDetails_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>KnowledgeManagementDetails_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/KnowledgeManagementEdit_view/KnowledgeManagementEdit_view.aod b/neonView/KnowledgeManagementEdit_view/KnowledgeManagementEdit_view.aod
index 5d41560c646..59ba4694d9e 100644
--- a/neonView/KnowledgeManagementEdit_view/KnowledgeManagementEdit_view.aod
+++ b/neonView/KnowledgeManagementEdit_view/KnowledgeManagementEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>KnowledgeManagementEdit_view</name>
   <title>Knowledge</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/neonView/KnowledgeManagementFilter_view/KnowledgeManagementFilter_view.aod b/neonView/KnowledgeManagementFilter_view/KnowledgeManagementFilter_view.aod
index 69bb0a57328..1a3e3cc6271 100644
--- a/neonView/KnowledgeManagementFilter_view/KnowledgeManagementFilter_view.aod
+++ b/neonView/KnowledgeManagementFilter_view/KnowledgeManagementFilter_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>KnowledgeManagementFilter_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <filterable v="true" />
diff --git a/neonView/KnowledgeManagementLookup_view/KnowledgeManagementLookup_view.aod b/neonView/KnowledgeManagementLookup_view/KnowledgeManagementLookup_view.aod
index 8b9981d87da..4117b0b5a16 100644
--- a/neonView/KnowledgeManagementLookup_view/KnowledgeManagementLookup_view.aod
+++ b/neonView/KnowledgeManagementLookup_view/KnowledgeManagementLookup_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>KnowledgeManagementLookup_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/KnowledgeManagementMain_view/KnowledgeManagementMain_view.aod b/neonView/KnowledgeManagementMain_view/KnowledgeManagementMain_view.aod
index dd357ba38b8..ce38d5f1f86 100644
--- a/neonView/KnowledgeManagementMain_view/KnowledgeManagementMain_view.aod
+++ b/neonView/KnowledgeManagementMain_view/KnowledgeManagementMain_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>KnowledgeManagementMain_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/KnowledgeManagementPreview_view/KnowledgeManagementPreview_view.aod b/neonView/KnowledgeManagementPreview_view/KnowledgeManagementPreview_view.aod
index e8ae6cd155b..f7f259faa36 100644
--- a/neonView/KnowledgeManagementPreview_view/KnowledgeManagementPreview_view.aod
+++ b/neonView/KnowledgeManagementPreview_view/KnowledgeManagementPreview_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>KnowledgeManagementPreview_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/KnowledgeManagementRole_view/KnowledgeManagementRole_view.aod b/neonView/KnowledgeManagementRole_view/KnowledgeManagementRole_view.aod
index ef4ea428e85..d4f7b37a1a2 100644
--- a/neonView/KnowledgeManagementRole_view/KnowledgeManagementRole_view.aod
+++ b/neonView/KnowledgeManagementRole_view/KnowledgeManagementRole_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>KnowledgeManagementRole_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/KnowledgeManagementTimeline_view/KnowledgeManagementTimeline_view.aod b/neonView/KnowledgeManagementTimeline_view/KnowledgeManagementTimeline_view.aod
index 0dab386afeb..adf88a24fbe 100644
--- a/neonView/KnowledgeManagementTimeline_view/KnowledgeManagementTimeline_view.aod
+++ b/neonView/KnowledgeManagementTimeline_view/KnowledgeManagementTimeline_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>KnowledgeManagementTimeline_view</name>
   <title>Newsfeed (Preview)</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/neonView/KnowledgeNewsFeed_view/KnowledgeNewsFeed_view.aod b/neonView/KnowledgeNewsFeed_view/KnowledgeNewsFeed_view.aod
index e0334d035e7..75fc94ad122 100644
--- a/neonView/KnowledgeNewsFeed_view/KnowledgeNewsFeed_view.aod
+++ b/neonView/KnowledgeNewsFeed_view/KnowledgeNewsFeed_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>KnowledgeNewsFeed_view</name>
   <title>Newsfeed (Complete Article)</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/neonView/KnowledgeRoleEdit_view/KnowledgeRoleEdit_view.aod b/neonView/KnowledgeRoleEdit_view/KnowledgeRoleEdit_view.aod
index 5d6473c3512..a73902b9957 100644
--- a/neonView/KnowledgeRoleEdit_view/KnowledgeRoleEdit_view.aod
+++ b/neonView/KnowledgeRoleEdit_view/KnowledgeRoleEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>KnowledgeRoleEdit_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/KnowledgeTagList_GenMult_view/KnowledgeTagList_GenMult_view.aod b/neonView/KnowledgeTagList_GenMult_view/KnowledgeTagList_GenMult_view.aod
index 15748243a68..da077b8269e 100644
--- a/neonView/KnowledgeTagList_GenMult_view/KnowledgeTagList_GenMult_view.aod
+++ b/neonView/KnowledgeTagList_GenMult_view/KnowledgeTagList_GenMult_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>KnowledgeTagList_GenMult_view</name>
   <title>Tags</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/neonView/KnowledgeTagList_view/KnowledgeTagList_view.aod b/neonView/KnowledgeTagList_view/KnowledgeTagList_view.aod
index 61be3f1b770..101604a2f8f 100644
--- a/neonView/KnowledgeTagList_view/KnowledgeTagList_view.aod
+++ b/neonView/KnowledgeTagList_view/KnowledgeTagList_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>KnowledgeTagList_view</name>
   <title>Tags</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/neonView/LeadFilter_view/LeadFilter_view.aod b/neonView/LeadFilter_view/LeadFilter_view.aod
index 75dc1286e76..bf7495c315c 100644
--- a/neonView/LeadFilter_view/LeadFilter_view.aod
+++ b/neonView/LeadFilter_view/LeadFilter_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>LeadFilter_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <filterable v="true" />
diff --git a/neonView/LeadLogFilterDrawer_view/LeadLogFilterDrawer_view.aod b/neonView/LeadLogFilterDrawer_view/LeadLogFilterDrawer_view.aod
index 1463636384e..db90a45194a 100644
--- a/neonView/LeadLogFilterDrawer_view/LeadLogFilterDrawer_view.aod
+++ b/neonView/LeadLogFilterDrawer_view/LeadLogFilterDrawer_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>LeadLogFilterDrawer_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/LeadLogFilter_view/LeadLogFilter_view.aod b/neonView/LeadLogFilter_view/LeadLogFilter_view.aod
index 7faeebe7aac..b20013103d1 100644
--- a/neonView/LeadLogFilter_view/LeadLogFilter_view.aod
+++ b/neonView/LeadLogFilter_view/LeadLogFilter_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>LeadLogFilter_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <filterable v="true" />
diff --git a/neonView/LeadLogPreview_view/LeadLogPreview_view.aod b/neonView/LeadLogPreview_view/LeadLogPreview_view.aod
index 1db69ba7768..60042c59972 100644
--- a/neonView/LeadLogPreview_view/LeadLogPreview_view.aod
+++ b/neonView/LeadLogPreview_view/LeadLogPreview_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>LeadLogPreview_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/LeadPreview_view/LeadPreview_view.aod b/neonView/LeadPreview_view/LeadPreview_view.aod
index dcd3b235382..1398c08aa47 100644
--- a/neonView/LeadPreview_view/LeadPreview_view.aod
+++ b/neonView/LeadPreview_view/LeadPreview_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>LeadPreview_view</name>
   <title>Lead preview</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/neonView/LeadTempFilter_view/LeadTempFilter_view.aod b/neonView/LeadTempFilter_view/LeadTempFilter_view.aod
index 8b51e246b49..942e0084fb6 100644
--- a/neonView/LeadTempFilter_view/LeadTempFilter_view.aod
+++ b/neonView/LeadTempFilter_view/LeadTempFilter_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>LeadTempFilter_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <filterable v="true" />
diff --git a/neonView/LeadimportDocEdit_view/LeadimportDocEdit_view.aod b/neonView/LeadimportDocEdit_view/LeadimportDocEdit_view.aod
index 32007efecfe..f586b8f0c94 100644
--- a/neonView/LeadimportDocEdit_view/LeadimportDocEdit_view.aod
+++ b/neonView/LeadimportDocEdit_view/LeadimportDocEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>LeadimportDocEdit_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <size>SMALL</size>
diff --git a/neonView/LeadimportEdit_view/LeadimportEdit_view.aod b/neonView/LeadimportEdit_view/LeadimportEdit_view.aod
index 317814aa5ad..349c644cebf 100644
--- a/neonView/LeadimportEdit_view/LeadimportEdit_view.aod
+++ b/neonView/LeadimportEdit_view/LeadimportEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>LeadimportEdit_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/LeadimportFilter_view/LeadimportFilter_view.aod b/neonView/LeadimportFilter_view/LeadimportFilter_view.aod
index 111d9ee2c1c..3593bf9b430 100644
--- a/neonView/LeadimportFilter_view/LeadimportFilter_view.aod
+++ b/neonView/LeadimportFilter_view/LeadimportFilter_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>LeadimportFilter_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <filterable v="true" />
diff --git a/neonView/LeadimportLeadFilter_view/LeadimportLeadFilter_view.aod b/neonView/LeadimportLeadFilter_view/LeadimportLeadFilter_view.aod
index 5d7859d4cc1..3712b09ea7a 100644
--- a/neonView/LeadimportLeadFilter_view/LeadimportLeadFilter_view.aod
+++ b/neonView/LeadimportLeadFilter_view/LeadimportLeadFilter_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>LeadimportLeadFilter_view</name>
   <title>Transfer data</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/neonView/LeadimportLeadTempFilter_view/LeadimportLeadTempFilter_view.aod b/neonView/LeadimportLeadTempFilter_view/LeadimportLeadTempFilter_view.aod
index 6ec6b4bb48e..43ffd5910d6 100644
--- a/neonView/LeadimportLeadTempFilter_view/LeadimportLeadTempFilter_view.aod
+++ b/neonView/LeadimportLeadTempFilter_view/LeadimportLeadTempFilter_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>LeadimportLeadTempFilter_view</name>
   <title>Import Daten</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/neonView/LeadimportLog_view/LeadimportLog_view.aod b/neonView/LeadimportLog_view/LeadimportLog_view.aod
index 950120edca9..f86a57699c0 100644
--- a/neonView/LeadimportLog_view/LeadimportLog_view.aod
+++ b/neonView/LeadimportLog_view/LeadimportLog_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>LeadimportLog_view</name>
   <title>Logs</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/neonView/LeadimportMain_view/LeadimportMain_view.aod b/neonView/LeadimportMain_view/LeadimportMain_view.aod
index 3cbee3d28bf..e544314e6ee 100644
--- a/neonView/LeadimportMain_view/LeadimportMain_view.aod
+++ b/neonView/LeadimportMain_view/LeadimportMain_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>LeadimportMain_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/LeadimportMappingAssistantFilter_view/LeadimportMappingAssistantFilter_view.aod b/neonView/LeadimportMappingAssistantFilter_view/LeadimportMappingAssistantFilter_view.aod
index 0a32f33679c..631a0af5766 100644
--- a/neonView/LeadimportMappingAssistantFilter_view/LeadimportMappingAssistantFilter_view.aod
+++ b/neonView/LeadimportMappingAssistantFilter_view/LeadimportMappingAssistantFilter_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>LeadimportMappingAssistantFilter_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/LeadimportPreview_view/LeadimportPreview_view.aod b/neonView/LeadimportPreview_view/LeadimportPreview_view.aod
index 4e376d9f72a..51dde1c3ce2 100644
--- a/neonView/LeadimportPreview_view/LeadimportPreview_view.aod
+++ b/neonView/LeadimportPreview_view/LeadimportPreview_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>LeadimportPreview_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <filterable v="false" />
diff --git a/neonView/LetterEdit_view/LetterEdit_view.aod b/neonView/LetterEdit_view/LetterEdit_view.aod
index 5f77590bb26..dedcb0a8582 100644
--- a/neonView/LetterEdit_view/LetterEdit_view.aod
+++ b/neonView/LetterEdit_view/LetterEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>LetterEdit_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <size>SMALL</size>
diff --git a/neonView/LetterRecipientEdit_view/LetterRecipientEdit_view.aod b/neonView/LetterRecipientEdit_view/LetterRecipientEdit_view.aod
index 6bb0a1766a8..9e7b7028a13 100644
--- a/neonView/LetterRecipientEdit_view/LetterRecipientEdit_view.aod
+++ b/neonView/LetterRecipientEdit_view/LetterRecipientEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>LetterRecipientEdit_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <size>SMALL</size>
diff --git a/neonView/LetterRecipientFilter_view/LetterRecipientFilter_view.aod b/neonView/LetterRecipientFilter_view/LetterRecipientFilter_view.aod
index 2527705649e..2f84db092a8 100644
--- a/neonView/LetterRecipientFilter_view/LetterRecipientFilter_view.aod
+++ b/neonView/LetterRecipientFilter_view/LetterRecipientFilter_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>LetterRecipientFilter_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <filterable v="true" />
diff --git a/neonView/LogHistoryFilterDrawer_view/LogHistoryFilterDrawer_view.aod b/neonView/LogHistoryFilterDrawer_view/LogHistoryFilterDrawer_view.aod
index 0c329f2bd4d..bd094e6c427 100644
--- a/neonView/LogHistoryFilterDrawer_view/LogHistoryFilterDrawer_view.aod
+++ b/neonView/LogHistoryFilterDrawer_view/LogHistoryFilterDrawer_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>LogHistoryFilterDrawer_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/LogHistoryFilter_view/LogHistoryFilter_view.aod b/neonView/LogHistoryFilter_view/LogHistoryFilter_view.aod
index 046d2f8787f..94171bdc4e4 100644
--- a/neonView/LogHistoryFilter_view/LogHistoryFilter_view.aod
+++ b/neonView/LogHistoryFilter_view/LogHistoryFilter_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>LogHistoryFilter_view</name>
   <title>Log</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/neonView/LogHistoryPreview_view/LogHistoryPreview_view.aod b/neonView/LogHistoryPreview_view/LogHistoryPreview_view.aod
index 3ea10300b8e..3da1a6d76e7 100644
--- a/neonView/LogHistoryPreview_view/LogHistoryPreview_view.aod
+++ b/neonView/LogHistoryPreview_view/LogHistoryPreview_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>LogHistoryPreview_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/MarketingWorkflowLauncherEdit_view/MarketingWorkflowLauncherEdit_view.aod b/neonView/MarketingWorkflowLauncherEdit_view/MarketingWorkflowLauncherEdit_view.aod
index 8fe83127e05..4f1e6c027e8 100644
--- a/neonView/MarketingWorkflowLauncherEdit_view/MarketingWorkflowLauncherEdit_view.aod
+++ b/neonView/MarketingWorkflowLauncherEdit_view/MarketingWorkflowLauncherEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>MarketingWorkflowLauncherEdit_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <size>SMALL</size>
diff --git a/neonView/MemberDrawer_view/MemberDrawer_view.aod b/neonView/MemberDrawer_view/MemberDrawer_view.aod
index cfe7ea4229c..945f0f153b3 100644
--- a/neonView/MemberDrawer_view/MemberDrawer_view.aod
+++ b/neonView/MemberDrawer_view/MemberDrawer_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>MemberDrawer_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/MemberEdit_view/MemberEdit_view.aod b/neonView/MemberEdit_view/MemberEdit_view.aod
index d87d067090a..68fe23e3d36 100644
--- a/neonView/MemberEdit_view/MemberEdit_view.aod
+++ b/neonView/MemberEdit_view/MemberEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>MemberEdit_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <size>SMALL</size>
diff --git a/neonView/MemberFilter_view/MemberFilter_view.aod b/neonView/MemberFilter_view/MemberFilter_view.aod
index 1d4faccbdb0..b3757f6e68c 100644
--- a/neonView/MemberFilter_view/MemberFilter_view.aod
+++ b/neonView/MemberFilter_view/MemberFilter_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>MemberFilter_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <filterable v="true" />
diff --git a/neonView/ModuleTree_view/ModuleTree_view.aod b/neonView/ModuleTree_view/ModuleTree_view.aod
index 837a6f7608c..28e2e351e68 100644
--- a/neonView/ModuleTree_view/ModuleTree_view.aod
+++ b/neonView/ModuleTree_view/ModuleTree_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>ModuleTree_view</name>
   <title>Tree</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/neonView/MyDashboardScoreCard_view/MyDashboardScoreCard_view.aod b/neonView/MyDashboardScoreCard_view/MyDashboardScoreCard_view.aod
index 2c2b62c43e2..e8375e035d4 100644
--- a/neonView/MyDashboardScoreCard_view/MyDashboardScoreCard_view.aod
+++ b/neonView/MyDashboardScoreCard_view/MyDashboardScoreCard_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>MyDashboardScoreCard_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <dashletConfigurations>
diff --git a/neonView/MyTurnoverForecastScoreCard_view/MyTurnoverForecastScoreCard_view.aod b/neonView/MyTurnoverForecastScoreCard_view/MyTurnoverForecastScoreCard_view.aod
index 7285d5d8276..6aa096872dd 100644
--- a/neonView/MyTurnoverForecastScoreCard_view/MyTurnoverForecastScoreCard_view.aod
+++ b/neonView/MyTurnoverForecastScoreCard_view/MyTurnoverForecastScoreCard_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>MyTurnoverForecastScoreCard_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <dashletConfigurations>
diff --git a/neonView/NotificationFilter_view/NotificationFilter_view.aod b/neonView/NotificationFilter_view/NotificationFilter_view.aod
index 26ee281b76c..06f0c1d66ad 100644
--- a/neonView/NotificationFilter_view/NotificationFilter_view.aod
+++ b/neonView/NotificationFilter_view/NotificationFilter_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>NotificationFilter_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <filterable v="true" />
diff --git a/neonView/NotificationPreview_view/NotificationPreview_view.aod b/neonView/NotificationPreview_view/NotificationPreview_view.aod
index e67f2f56990..dab06ac7ddc 100644
--- a/neonView/NotificationPreview_view/NotificationPreview_view.aod
+++ b/neonView/NotificationPreview_view/NotificationPreview_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>NotificationPreview_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <filterable v="false" />
diff --git a/neonView/ObjectRelationTypeEdit_view/ObjectRelationTypeEdit_view.aod b/neonView/ObjectRelationTypeEdit_view/ObjectRelationTypeEdit_view.aod
index e354b3573f2..1d293530d8a 100644
--- a/neonView/ObjectRelationTypeEdit_view/ObjectRelationTypeEdit_view.aod
+++ b/neonView/ObjectRelationTypeEdit_view/ObjectRelationTypeEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>ObjectRelationTypeEdit_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <size>SMALL</size>
diff --git a/neonView/ObjectRelationTypeFilter_view/ObjectRelationTypeFilter_view.aod b/neonView/ObjectRelationTypeFilter_view/ObjectRelationTypeFilter_view.aod
index 9e6fa80dafd..cfec0b8f514 100644
--- a/neonView/ObjectRelationTypeFilter_view/ObjectRelationTypeFilter_view.aod
+++ b/neonView/ObjectRelationTypeFilter_view/ObjectRelationTypeFilter_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>ObjectRelationTypeFilter_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/ObjectTreeEdit_view/ObjectTreeEdit_view.aod b/neonView/ObjectTreeEdit_view/ObjectTreeEdit_view.aod
index 922ada4bc69..70ad4cf406d 100644
--- a/neonView/ObjectTreeEdit_view/ObjectTreeEdit_view.aod
+++ b/neonView/ObjectTreeEdit_view/ObjectTreeEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>ObjectTreeEdit_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <size>SMALL</size>
diff --git a/neonView/ObjectTreeFilter_view/ObjectTreeFilter_view.aod b/neonView/ObjectTreeFilter_view/ObjectTreeFilter_view.aod
index 3497cce9b4d..b846b67b19f 100644
--- a/neonView/ObjectTreeFilter_view/ObjectTreeFilter_view.aod
+++ b/neonView/ObjectTreeFilter_view/ObjectTreeFilter_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>ObjectTreeFilter_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <filterable v="true" />
diff --git a/neonView/OfferCoverLetter_view/OfferCoverLetter_view.aod b/neonView/OfferCoverLetter_view/OfferCoverLetter_view.aod
index 667dadc02c6..8e3b80d75be 100644
--- a/neonView/OfferCoverLetter_view/OfferCoverLetter_view.aod
+++ b/neonView/OfferCoverLetter_view/OfferCoverLetter_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>OfferCoverLetter_view</name>
   <title>Cover letter</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/neonView/OfferDrawer_view/OfferDrawer_view.aod b/neonView/OfferDrawer_view/OfferDrawer_view.aod
index b6445f06f71..ad0f760504d 100644
--- a/neonView/OfferDrawer_view/OfferDrawer_view.aod
+++ b/neonView/OfferDrawer_view/OfferDrawer_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>OfferDrawer_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/OfferEdit_view/OfferEdit_view.aod b/neonView/OfferEdit_view/OfferEdit_view.aod
index 5bacbaaaf32..3d4de5a7dc5 100644
--- a/neonView/OfferEdit_view/OfferEdit_view.aod
+++ b/neonView/OfferEdit_view/OfferEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>OfferEdit_view</name>
   <title>Offer</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/neonView/OfferFilter_view/OfferFilter_view.aod b/neonView/OfferFilter_view/OfferFilter_view.aod
index 3e058b7c388..d53c98d2e7d 100644
--- a/neonView/OfferFilter_view/OfferFilter_view.aod
+++ b/neonView/OfferFilter_view/OfferFilter_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>OfferFilter_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <filterable v="true" />
diff --git a/neonView/OfferMain_view/OfferMain_view.aod b/neonView/OfferMain_view/OfferMain_view.aod
index 1c956c7b763..ef774fd7b7c 100644
--- a/neonView/OfferMain_view/OfferMain_view.aod
+++ b/neonView/OfferMain_view/OfferMain_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>OfferMain_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/OfferPreviewMultiple_view/OfferPreviewMultiple_view.aod b/neonView/OfferPreviewMultiple_view/OfferPreviewMultiple_view.aod
index 44610fe33c4..399345116e2 100644
--- a/neonView/OfferPreviewMultiple_view/OfferPreviewMultiple_view.aod
+++ b/neonView/OfferPreviewMultiple_view/OfferPreviewMultiple_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>OfferPreviewMultiple_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/OfferPreview_view/OfferPreview_view.aod b/neonView/OfferPreview_view/OfferPreview_view.aod
index 7b78909905a..5cff758218d 100644
--- a/neonView/OfferPreview_view/OfferPreview_view.aod
+++ b/neonView/OfferPreview_view/OfferPreview_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>OfferPreview_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/OfferReport_view/OfferReport_view.aod b/neonView/OfferReport_view/OfferReport_view.aod
index 6ac54d910d1..043f3d17d2b 100644
--- a/neonView/OfferReport_view/OfferReport_view.aod
+++ b/neonView/OfferReport_view/OfferReport_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>OfferReport_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/OfferitemEdit_view/OfferitemEdit_view.aod b/neonView/OfferitemEdit_view/OfferitemEdit_view.aod
index b249c412708..d63f165363e 100644
--- a/neonView/OfferitemEdit_view/OfferitemEdit_view.aod
+++ b/neonView/OfferitemEdit_view/OfferitemEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>OfferitemEdit_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <size>SMALL</size>
diff --git a/neonView/OfferitemFilter_view/OfferitemFilter_view.aod b/neonView/OfferitemFilter_view/OfferitemFilter_view.aod
index cd9156a57cc..d98159492ed 100644
--- a/neonView/OfferitemFilter_view/OfferitemFilter_view.aod
+++ b/neonView/OfferitemFilter_view/OfferitemFilter_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>OfferitemFilter_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <filterable v="true" />
diff --git a/neonView/OfferitemMultiEdit_view/OfferitemMultiEdit_view.aod b/neonView/OfferitemMultiEdit_view/OfferitemMultiEdit_view.aod
index 7e027e2fc7f..faa26adb3f7 100644
--- a/neonView/OfferitemMultiEdit_view/OfferitemMultiEdit_view.aod
+++ b/neonView/OfferitemMultiEdit_view/OfferitemMultiEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>OfferitemMultiEdit_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/OfferitemPreview_view/OfferitemPreview_view.aod b/neonView/OfferitemPreview_view/OfferitemPreview_view.aod
index 3805f9a7120..2b977d802ea 100644
--- a/neonView/OfferitemPreview_view/OfferitemPreview_view.aod
+++ b/neonView/OfferitemPreview_view/OfferitemPreview_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>OfferitemPreview_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/OrderDetail_view/OrderDetail_view.aod b/neonView/OrderDetail_view/OrderDetail_view.aod
index df64544990c..aadbb8453e7 100644
--- a/neonView/OrderDetail_view/OrderDetail_view.aod
+++ b/neonView/OrderDetail_view/OrderDetail_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>OrderDetail_view</name>
   <title>Cover letter</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/neonView/OrderDunning_view/OrderDunning_view.aod b/neonView/OrderDunning_view/OrderDunning_view.aod
index 0a20b0fdb87..4f843d3eba3 100644
--- a/neonView/OrderDunning_view/OrderDunning_view.aod
+++ b/neonView/OrderDunning_view/OrderDunning_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>OrderDunning_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <size>SMALL</size>
diff --git a/neonView/OrderEdit_view/OrderEdit_view.aod b/neonView/OrderEdit_view/OrderEdit_view.aod
index e11f3390c89..a19c19a685e 100644
--- a/neonView/OrderEdit_view/OrderEdit_view.aod
+++ b/neonView/OrderEdit_view/OrderEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>OrderEdit_view</name>
   <title>Receipt</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/neonView/OrderFilter_view/OrderFilter_view.aod b/neonView/OrderFilter_view/OrderFilter_view.aod
index c2afbae5ef6..329fad392be 100644
--- a/neonView/OrderFilter_view/OrderFilter_view.aod
+++ b/neonView/OrderFilter_view/OrderFilter_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>OrderFilter_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <filterable v="true" />
@@ -102,11 +102,11 @@
     </tableViewTemplate>
     <treeTableViewTemplate>
       <name>tree</name>
-      <defaultGroupFields />
       <entityField>#ENTITY</entityField>
       <linkedColumns>
         <element>SALESORDERCODE</element>
       </linkedColumns>
+      <defaultGroupFields />
       <fixedFilterFields />
       <columns>
         <neonTreeTableColumn>
diff --git a/neonView/OrderLink_view/OrderLink_view.aod b/neonView/OrderLink_view/OrderLink_view.aod
index f959375bf36..8bb4173a323 100644
--- a/neonView/OrderLink_view/OrderLink_view.aod
+++ b/neonView/OrderLink_view/OrderLink_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>OrderLink_view</name>
   <title>Links</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/neonView/OrderMain_view/OrderMain_view.aod b/neonView/OrderMain_view/OrderMain_view.aod
index 428d0c02e07..a5a11844e39 100644
--- a/neonView/OrderMain_view/OrderMain_view.aod
+++ b/neonView/OrderMain_view/OrderMain_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>OrderMain_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/OrderPaid_view/OrderPaid_view.aod b/neonView/OrderPaid_view/OrderPaid_view.aod
index 67d17a1b948..e40f7e8d39c 100644
--- a/neonView/OrderPaid_view/OrderPaid_view.aod
+++ b/neonView/OrderPaid_view/OrderPaid_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>OrderPaid_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <size>SMALL</size>
diff --git a/neonView/OrderPreview_view/OrderPreview_view.aod b/neonView/OrderPreview_view/OrderPreview_view.aod
index 449cb53093e..65d6f80528d 100644
--- a/neonView/OrderPreview_view/OrderPreview_view.aod
+++ b/neonView/OrderPreview_view/OrderPreview_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>OrderPreview_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/OrderReminderReport_view/OrderReminderReport_view.aod b/neonView/OrderReminderReport_view/OrderReminderReport_view.aod
index 8c0ed255d69..3f14cbe374f 100644
--- a/neonView/OrderReminderReport_view/OrderReminderReport_view.aod
+++ b/neonView/OrderReminderReport_view/OrderReminderReport_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>OrderReminderReport_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/OrderReport_view/OrderReport_view.aod b/neonView/OrderReport_view/OrderReport_view.aod
index 0f3487512ac..19703e6ddeb 100644
--- a/neonView/OrderReport_view/OrderReport_view.aod
+++ b/neonView/OrderReport_view/OrderReport_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>OrderReport_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/OrderitemEdit_view/OrderitemEdit_view.aod b/neonView/OrderitemEdit_view/OrderitemEdit_view.aod
index bcc6e174805..c0c38570ead 100644
--- a/neonView/OrderitemEdit_view/OrderitemEdit_view.aod
+++ b/neonView/OrderitemEdit_view/OrderitemEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>OrderitemEdit_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <size>SMALL</size>
diff --git a/neonView/OrderitemFilter_view/OrderitemFilter_view.aod b/neonView/OrderitemFilter_view/OrderitemFilter_view.aod
index 4c6e8a7eac6..1f043a66f89 100644
--- a/neonView/OrderitemFilter_view/OrderitemFilter_view.aod
+++ b/neonView/OrderitemFilter_view/OrderitemFilter_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>OrderitemFilter_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <filterable v="true" />
diff --git a/neonView/OrderitemMultiEdit_view/OrderitemMultiEdit_view.aod b/neonView/OrderitemMultiEdit_view/OrderitemMultiEdit_view.aod
index fd4c03d14d1..3226af5f675 100644
--- a/neonView/OrderitemMultiEdit_view/OrderitemMultiEdit_view.aod
+++ b/neonView/OrderitemMultiEdit_view/OrderitemMultiEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>OrderitemMultiEdit_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/OrderitemPreview_view/OrderitemPreview_view.aod b/neonView/OrderitemPreview_view/OrderitemPreview_view.aod
index 40a1e0eac48..285683df967 100644
--- a/neonView/OrderitemPreview_view/OrderitemPreview_view.aod
+++ b/neonView/OrderitemPreview_view/OrderitemPreview_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>OrderitemPreview_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/OrganisationAttributeRestriction_view/OrganisationAttributeRestriction_view.aod b/neonView/OrganisationAttributeRestriction_view/OrganisationAttributeRestriction_view.aod
index b817d9e5a57..0142bb641ca 100644
--- a/neonView/OrganisationAttributeRestriction_view/OrganisationAttributeRestriction_view.aod
+++ b/neonView/OrganisationAttributeRestriction_view/OrganisationAttributeRestriction_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>OrganisationAttributeRestriction_view</name>
   <title>Attributes</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/neonView/OrganisationClassification/OrganisationClassification.aod b/neonView/OrganisationClassification/OrganisationClassification.aod
index 9019bf34d2f..e52d32adb6d 100644
--- a/neonView/OrganisationClassification/OrganisationClassification.aod
+++ b/neonView/OrganisationClassification/OrganisationClassification.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>OrganisationClassification</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/OrganisationClassificationDrawer_view/OrganisationClassificationDrawer_view.aod b/neonView/OrganisationClassificationDrawer_view/OrganisationClassificationDrawer_view.aod
index 3f81db3f2e4..fd336c3f6c1 100644
--- a/neonView/OrganisationClassificationDrawer_view/OrganisationClassificationDrawer_view.aod
+++ b/neonView/OrganisationClassificationDrawer_view/OrganisationClassificationDrawer_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>OrganisationClassificationDrawer_view</name>
   <title>Classifications</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/neonView/OrganisationClusterMain_view/OrganisationClusterMain_view.aod b/neonView/OrganisationClusterMain_view/OrganisationClusterMain_view.aod
index 22a28e8cd40..a4d2c1cc14c 100644
--- a/neonView/OrganisationClusterMain_view/OrganisationClusterMain_view.aod
+++ b/neonView/OrganisationClusterMain_view/OrganisationClusterMain_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>OrganisationClusterMain_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/OrganisationConditionPricelist_view/OrganisationConditionPricelist_view.aod b/neonView/OrganisationConditionPricelist_view/OrganisationConditionPricelist_view.aod
index 73db76aeba5..d8b313f05e7 100644
--- a/neonView/OrganisationConditionPricelist_view/OrganisationConditionPricelist_view.aod
+++ b/neonView/OrganisationConditionPricelist_view/OrganisationConditionPricelist_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>OrganisationConditionPricelist_view</name>
   <title>Conditions</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/neonView/OrganisationCondition_view/OrganisationCondition_view.aod b/neonView/OrganisationCondition_view/OrganisationCondition_view.aod
index b17a49016c2..854ba3f3278 100644
--- a/neonView/OrganisationCondition_view/OrganisationCondition_view.aod
+++ b/neonView/OrganisationCondition_view/OrganisationCondition_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>OrganisationCondition_view</name>
   <title>Conditions</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/neonView/OrganisationDuplicatesFilter_view/OrganisationDuplicatesFilter_view.aod b/neonView/OrganisationDuplicatesFilter_view/OrganisationDuplicatesFilter_view.aod
index dfe48ea0e80..9ca2b13a95a 100644
--- a/neonView/OrganisationDuplicatesFilter_view/OrganisationDuplicatesFilter_view.aod
+++ b/neonView/OrganisationDuplicatesFilter_view/OrganisationDuplicatesFilter_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>OrganisationDuplicatesFilter_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/OrganisationDuplicatesTab_view/OrganisationDuplicatesTab_view.aod b/neonView/OrganisationDuplicatesTab_view/OrganisationDuplicatesTab_view.aod
index 6ca9948b472..c6f447f92c4 100644
--- a/neonView/OrganisationDuplicatesTab_view/OrganisationDuplicatesTab_view.aod
+++ b/neonView/OrganisationDuplicatesTab_view/OrganisationDuplicatesTab_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>OrganisationDuplicatesTab_view</name>
   <title>Organisation duplicates</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/neonView/OrganisationEditDefaults_view/OrganisationEditDefaults_view.aod b/neonView/OrganisationEditDefaults_view/OrganisationEditDefaults_view.aod
index 70cc47cbd63..84a9507a937 100644
--- a/neonView/OrganisationEditDefaults_view/OrganisationEditDefaults_view.aod
+++ b/neonView/OrganisationEditDefaults_view/OrganisationEditDefaults_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>OrganisationEditDefaults_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <size>SMALL</size>
diff --git a/neonView/OrganisationEdit_view/OrganisationEdit_view.aod b/neonView/OrganisationEdit_view/OrganisationEdit_view.aod
index 5a59c451c77..c76fe9d4588 100644
--- a/neonView/OrganisationEdit_view/OrganisationEdit_view.aod
+++ b/neonView/OrganisationEdit_view/OrganisationEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>OrganisationEdit_view</name>
   <title>Company</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/neonView/OrganisationFilter_view/OrganisationFilter_view.aod b/neonView/OrganisationFilter_view/OrganisationFilter_view.aod
index 8fdf03af01d..352cf6a5b00 100644
--- a/neonView/OrganisationFilter_view/OrganisationFilter_view.aod
+++ b/neonView/OrganisationFilter_view/OrganisationFilter_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>OrganisationFilter_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <filterable v="true" />
diff --git a/neonView/OrganisationLesserNoiseTable_view/OrganisationLesserNoiseTable_view.aod b/neonView/OrganisationLesserNoiseTable_view/OrganisationLesserNoiseTable_view.aod
index 5b29deefbee..374a165f329 100644
--- a/neonView/OrganisationLesserNoiseTable_view/OrganisationLesserNoiseTable_view.aod
+++ b/neonView/OrganisationLesserNoiseTable_view/OrganisationLesserNoiseTable_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>OrganisationLesserNoiseTable_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/OrganisationLookup_view/OrganisationLookup_view.aod b/neonView/OrganisationLookup_view/OrganisationLookup_view.aod
index 0d9e7c9051b..9c93c1e04a6 100644
--- a/neonView/OrganisationLookup_view/OrganisationLookup_view.aod
+++ b/neonView/OrganisationLookup_view/OrganisationLookup_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>OrganisationLookup_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/OrganisationMain_view/OrganisationMain_view.aod b/neonView/OrganisationMain_view/OrganisationMain_view.aod
index df9be823dfc..03d6b384c21 100644
--- a/neonView/OrganisationMain_view/OrganisationMain_view.aod
+++ b/neonView/OrganisationMain_view/OrganisationMain_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>OrganisationMain_view</name>
   <title>Attribute</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/neonView/OrganisationNoNoiseTable_view/OrganisationNoNoiseTable_view.aod b/neonView/OrganisationNoNoiseTable_view/OrganisationNoNoiseTable_view.aod
index 2648fff3580..e77f5e397f2 100644
--- a/neonView/OrganisationNoNoiseTable_view/OrganisationNoNoiseTable_view.aod
+++ b/neonView/OrganisationNoNoiseTable_view/OrganisationNoNoiseTable_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>OrganisationNoNoiseTable_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/OrganisationPreview_view/OrganisationPreview_view.aod b/neonView/OrganisationPreview_view/OrganisationPreview_view.aod
index b3ee9054032..f357dbb8e36 100644
--- a/neonView/OrganisationPreview_view/OrganisationPreview_view.aod
+++ b/neonView/OrganisationPreview_view/OrganisationPreview_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>OrganisationPreview_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/OrganisationReport_view/OrganisationReport_view.aod b/neonView/OrganisationReport_view/OrganisationReport_view.aod
index 0c10fa2a0be..7207ac709a0 100644
--- a/neonView/OrganisationReport_view/OrganisationReport_view.aod
+++ b/neonView/OrganisationReport_view/OrganisationReport_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>OrganisationReport_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/OrganisationTaskAppointment_view/OrganisationTaskAppointment_view.aod b/neonView/OrganisationTaskAppointment_view/OrganisationTaskAppointment_view.aod
index 9fb952b77a2..e03f0349188 100644
--- a/neonView/OrganisationTaskAppointment_view/OrganisationTaskAppointment_view.aod
+++ b/neonView/OrganisationTaskAppointment_view/OrganisationTaskAppointment_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>OrganisationTaskAppointment_view</name>
   <title>ToDo</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/neonView/OrganisationUnrelatedDuplicates_view/OrganisationUnrelatedDuplicates_view.aod b/neonView/OrganisationUnrelatedDuplicates_view/OrganisationUnrelatedDuplicates_view.aod
index e8da741d067..882d51ed0ac 100644
--- a/neonView/OrganisationUnrelatedDuplicates_view/OrganisationUnrelatedDuplicates_view.aod
+++ b/neonView/OrganisationUnrelatedDuplicates_view/OrganisationUnrelatedDuplicates_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>OrganisationUnrelatedDuplicates_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/PermissionActionEdit_view/PermissionActionEdit_view.aod b/neonView/PermissionActionEdit_view/PermissionActionEdit_view.aod
index ab4ce87a232..023dc0ac7bb 100644
--- a/neonView/PermissionActionEdit_view/PermissionActionEdit_view.aod
+++ b/neonView/PermissionActionEdit_view/PermissionActionEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>PermissionActionEdit_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/PermissionActionFilter_view/PermissionActionFilter_view.aod b/neonView/PermissionActionFilter_view/PermissionActionFilter_view.aod
index 38481861ae2..b6bacb05021 100644
--- a/neonView/PermissionActionFilter_view/PermissionActionFilter_view.aod
+++ b/neonView/PermissionActionFilter_view/PermissionActionFilter_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>PermissionActionFilter_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/PermissionActionList_view/PermissionActionList_view.aod b/neonView/PermissionActionList_view/PermissionActionList_view.aod
index 5019e2d1b37..653f3fdae87 100644
--- a/neonView/PermissionActionList_view/PermissionActionList_view.aod
+++ b/neonView/PermissionActionList_view/PermissionActionList_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>PermissionActionList_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/PermissionCalendarEdit_view/PermissionCalendarEdit_view.aod b/neonView/PermissionCalendarEdit_view/PermissionCalendarEdit_view.aod
index 60c76072d2a..1908377c026 100644
--- a/neonView/PermissionCalendarEdit_view/PermissionCalendarEdit_view.aod
+++ b/neonView/PermissionCalendarEdit_view/PermissionCalendarEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>PermissionCalendarEdit_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <size>SMALL</size>
diff --git a/neonView/PermissionCalendarFilterDrawer_view/PermissionCalendarFilterDrawer_view.aod b/neonView/PermissionCalendarFilterDrawer_view/PermissionCalendarFilterDrawer_view.aod
index bea5b5d3b4c..1c9bf963592 100644
--- a/neonView/PermissionCalendarFilterDrawer_view/PermissionCalendarFilterDrawer_view.aod
+++ b/neonView/PermissionCalendarFilterDrawer_view/PermissionCalendarFilterDrawer_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>PermissionCalendarFilterDrawer_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/PermissionCalendarFilterReverse_view/PermissionCalendarFilterReverse_view.aod b/neonView/PermissionCalendarFilterReverse_view/PermissionCalendarFilterReverse_view.aod
index c70bb005294..c283d566399 100644
--- a/neonView/PermissionCalendarFilterReverse_view/PermissionCalendarFilterReverse_view.aod
+++ b/neonView/PermissionCalendarFilterReverse_view/PermissionCalendarFilterReverse_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>PermissionCalendarFilterReverse_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <documentation>%aditoprj%/neonView/PermissionCalendarFilterReverse_view/documentation.adoc</documentation>
diff --git a/neonView/PermissionCalendarFilter_view/PermissionCalendarFilter_view.aod b/neonView/PermissionCalendarFilter_view/PermissionCalendarFilter_view.aod
index ffca2d78c9c..e018328dd34 100644
--- a/neonView/PermissionCalendarFilter_view/PermissionCalendarFilter_view.aod
+++ b/neonView/PermissionCalendarFilter_view/PermissionCalendarFilter_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>PermissionCalendarFilter_view</name>
   <title>Their Permissions</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/neonView/PermissionCalendarPreview_view/PermissionCalendarPreview_view.aod b/neonView/PermissionCalendarPreview_view/PermissionCalendarPreview_view.aod
index 8671d21b95c..8614108694e 100644
--- a/neonView/PermissionCalendarPreview_view/PermissionCalendarPreview_view.aod
+++ b/neonView/PermissionCalendarPreview_view/PermissionCalendarPreview_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>PermissionCalendarPreview_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <size>SMALL</size>
diff --git a/neonView/PermissionDetailEdit_view/PermissionDetailEdit_view.aod b/neonView/PermissionDetailEdit_view/PermissionDetailEdit_view.aod
index b38046275b1..8324836e120 100644
--- a/neonView/PermissionDetailEdit_view/PermissionDetailEdit_view.aod
+++ b/neonView/PermissionDetailEdit_view/PermissionDetailEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>PermissionDetailEdit_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <size>SMALL</size>
diff --git a/neonView/PermissionDetailFilter_view/PermissionDetailFilter_view.aod b/neonView/PermissionDetailFilter_view/PermissionDetailFilter_view.aod
index 2a069a4c9a5..a82c84b80dd 100644
--- a/neonView/PermissionDetailFilter_view/PermissionDetailFilter_view.aod
+++ b/neonView/PermissionDetailFilter_view/PermissionDetailFilter_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>PermissionDetailFilter_view</name>
   <title>Permission Detail</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/neonView/PermissionDetailPreview_view/PermissionDetailPreview_view.aod b/neonView/PermissionDetailPreview_view/PermissionDetailPreview_view.aod
index 949bb12b7ab..58b70e10223 100644
--- a/neonView/PermissionDetailPreview_view/PermissionDetailPreview_view.aod
+++ b/neonView/PermissionDetailPreview_view/PermissionDetailPreview_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>PermissionDetailPreview_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/PermissionMetaDataFilter_view/PermissionMetaDataFilter_view.aod b/neonView/PermissionMetaDataFilter_view/PermissionMetaDataFilter_view.aod
index 9644e50cf2d..b28164f6d9d 100644
--- a/neonView/PermissionMetaDataFilter_view/PermissionMetaDataFilter_view.aod
+++ b/neonView/PermissionMetaDataFilter_view/PermissionMetaDataFilter_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>PermissionMetaDataFilter_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <filterable v="true" />
diff --git a/neonView/PermissionMetaDataMain_view/PermissionMetaDataMain_view.aod b/neonView/PermissionMetaDataMain_view/PermissionMetaDataMain_view.aod
index 53e8f0b956c..e668f8fe5ef 100644
--- a/neonView/PermissionMetaDataMain_view/PermissionMetaDataMain_view.aod
+++ b/neonView/PermissionMetaDataMain_view/PermissionMetaDataMain_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>PermissionMetaDataMain_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/PermissionMetaDataPreview_view/PermissionMetaDataPreview_view.aod b/neonView/PermissionMetaDataPreview_view/PermissionMetaDataPreview_view.aod
index 1f323f20aab..a734740b8e8 100644
--- a/neonView/PermissionMetaDataPreview_view/PermissionMetaDataPreview_view.aod
+++ b/neonView/PermissionMetaDataPreview_view/PermissionMetaDataPreview_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>PermissionMetaDataPreview_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/PermissionOverviewFilter_view/PermissionOverviewFilter_view.aod b/neonView/PermissionOverviewFilter_view/PermissionOverviewFilter_view.aod
index 7e1ea7f0faa..54950c54a2d 100644
--- a/neonView/PermissionOverviewFilter_view/PermissionOverviewFilter_view.aod
+++ b/neonView/PermissionOverviewFilter_view/PermissionOverviewFilter_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>PermissionOverviewFilter_view</name>
   <title>Permission  Overview</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/neonView/PersonAttributeRestriction_view/PersonAttributeRestriction_view.aod b/neonView/PersonAttributeRestriction_view/PersonAttributeRestriction_view.aod
index 11f7b639939..0954af14d6b 100644
--- a/neonView/PersonAttributeRestriction_view/PersonAttributeRestriction_view.aod
+++ b/neonView/PersonAttributeRestriction_view/PersonAttributeRestriction_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>PersonAttributeRestriction_view</name>
   <title>Attributes</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/neonView/PersonClusterMain_view/PersonClusterMain_view.aod b/neonView/PersonClusterMain_view/PersonClusterMain_view.aod
index 7ed8cea878e..02683511305 100644
--- a/neonView/PersonClusterMain_view/PersonClusterMain_view.aod
+++ b/neonView/PersonClusterMain_view/PersonClusterMain_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>PersonClusterMain_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/PersonClusterPreview_view/PersonClusterPreview_view.aod b/neonView/PersonClusterPreview_view/PersonClusterPreview_view.aod
index 7465d9548b1..8751b422c15 100644
--- a/neonView/PersonClusterPreview_view/PersonClusterPreview_view.aod
+++ b/neonView/PersonClusterPreview_view/PersonClusterPreview_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>PersonClusterPreview_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/PersonDetail_view/PersonDetail_view.aod b/neonView/PersonDetail_view/PersonDetail_view.aod
index bf877ec44c1..52653526a4c 100644
--- a/neonView/PersonDetail_view/PersonDetail_view.aod
+++ b/neonView/PersonDetail_view/PersonDetail_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>PersonDetail_view</name>
   <title>Details</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/neonView/PersonDublicatesTab_view/PersonDublicatesTab_view.aod b/neonView/PersonDublicatesTab_view/PersonDublicatesTab_view.aod
index 2099e5c6ee5..eba26d60018 100644
--- a/neonView/PersonDublicatesTab_view/PersonDublicatesTab_view.aod
+++ b/neonView/PersonDublicatesTab_view/PersonDublicatesTab_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>PersonDublicatesTab_view</name>
   <title>Person duplicates</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/neonView/PersonDuplicateEditview_view/PersonDuplicateEditview_view.aod b/neonView/PersonDuplicateEditview_view/PersonDuplicateEditview_view.aod
index 23c70461d00..476077463fc 100644
--- a/neonView/PersonDuplicateEditview_view/PersonDuplicateEditview_view.aod
+++ b/neonView/PersonDuplicateEditview_view/PersonDuplicateEditview_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>PersonDuplicateEditview_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/PersonDuplicatesFilter_view/PersonDuplicatesFilter_view.aod b/neonView/PersonDuplicatesFilter_view/PersonDuplicatesFilter_view.aod
index 94e88b257d1..867d991080f 100644
--- a/neonView/PersonDuplicatesFilter_view/PersonDuplicatesFilter_view.aod
+++ b/neonView/PersonDuplicatesFilter_view/PersonDuplicatesFilter_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>PersonDuplicatesFilter_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/PersonEditDefaults_view/PersonEditDefaults_view.aod b/neonView/PersonEditDefaults_view/PersonEditDefaults_view.aod
index 4be76fd4697..2c5a319e4dc 100644
--- a/neonView/PersonEditDefaults_view/PersonEditDefaults_view.aod
+++ b/neonView/PersonEditDefaults_view/PersonEditDefaults_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>PersonEditDefaults_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <size>SMALL</size>
diff --git a/neonView/PersonEdit_view/PersonEdit_view.aod b/neonView/PersonEdit_view/PersonEdit_view.aod
index c31dd51b7ff..68a42fbd3c0 100644
--- a/neonView/PersonEdit_view/PersonEdit_view.aod
+++ b/neonView/PersonEdit_view/PersonEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>PersonEdit_view</name>
   <title>Contact</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/neonView/PersonFilter_view/PersonFilter_view.aod b/neonView/PersonFilter_view/PersonFilter_view.aod
index 7c17332f697..e4483a7e82c 100644
--- a/neonView/PersonFilter_view/PersonFilter_view.aod
+++ b/neonView/PersonFilter_view/PersonFilter_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>PersonFilter_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <filterable v="true" />
diff --git a/neonView/PersonLookup_view/PersonLookup_view.aod b/neonView/PersonLookup_view/PersonLookup_view.aod
index 5877a1ee07a..8189598556f 100644
--- a/neonView/PersonLookup_view/PersonLookup_view.aod
+++ b/neonView/PersonLookup_view/PersonLookup_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>PersonLookup_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/PersonMain_view/PersonMain_view.aod b/neonView/PersonMain_view/PersonMain_view.aod
index 7e88568ac76..8ec9c55885a 100644
--- a/neonView/PersonMain_view/PersonMain_view.aod
+++ b/neonView/PersonMain_view/PersonMain_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>PersonMain_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/PersonMultiEditQuickEntry_view/PersonMultiEditQuickEntry_view.aod b/neonView/PersonMultiEditQuickEntry_view/PersonMultiEditQuickEntry_view.aod
index 5b15646ad0c..725d0fe4e9e 100644
--- a/neonView/PersonMultiEditQuickEntry_view/PersonMultiEditQuickEntry_view.aod
+++ b/neonView/PersonMultiEditQuickEntry_view/PersonMultiEditQuickEntry_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>PersonMultiEditQuickEntry_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/PersonMultiEdit_view/PersonMultiEdit_view.aod b/neonView/PersonMultiEdit_view/PersonMultiEdit_view.aod
index 511bdae7953..b6cc77de5ba 100644
--- a/neonView/PersonMultiEdit_view/PersonMultiEdit_view.aod
+++ b/neonView/PersonMultiEdit_view/PersonMultiEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>PersonMultiEdit_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/PersonPreview_view/PersonPreview_view.aod b/neonView/PersonPreview_view/PersonPreview_view.aod
index c0ecb2926bd..bcbe4a50630 100644
--- a/neonView/PersonPreview_view/PersonPreview_view.aod
+++ b/neonView/PersonPreview_view/PersonPreview_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>PersonPreview_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/PersonSimpleList_view/PersonSimpleList_view.aod b/neonView/PersonSimpleList_view/PersonSimpleList_view.aod
index 2f1efab3734..fe2cf08a2a9 100644
--- a/neonView/PersonSimpleList_view/PersonSimpleList_view.aod
+++ b/neonView/PersonSimpleList_view/PersonSimpleList_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>PersonSimpleList_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <filterable v="true" />
diff --git a/neonView/PersonTaskAppointment_view/PersonTaskAppointment_view.aod b/neonView/PersonTaskAppointment_view/PersonTaskAppointment_view.aod
index d23833c4c20..655e857c6ed 100644
--- a/neonView/PersonTaskAppointment_view/PersonTaskAppointment_view.aod
+++ b/neonView/PersonTaskAppointment_view/PersonTaskAppointment_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>PersonTaskAppointment_view</name>
   <title>ToDo</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/neonView/PrivatePersonFilter_view/PrivatePersonFilter_view.aod b/neonView/PrivatePersonFilter_view/PrivatePersonFilter_view.aod
index 3e106ebb254..e794fe65742 100644
--- a/neonView/PrivatePersonFilter_view/PrivatePersonFilter_view.aod
+++ b/neonView/PrivatePersonFilter_view/PrivatePersonFilter_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>PrivatePersonFilter_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/PrivatePersonPreview_view/PrivatePersonPreview_view.aod b/neonView/PrivatePersonPreview_view/PrivatePersonPreview_view.aod
index 13f2b9fd014..51fe925b724 100644
--- a/neonView/PrivatePersonPreview_view/PrivatePersonPreview_view.aod
+++ b/neonView/PrivatePersonPreview_view/PrivatePersonPreview_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>PrivatePersonPreview_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/Prod2ProdEdit_view/Prod2ProdEdit_view.aod b/neonView/Prod2ProdEdit_view/Prod2ProdEdit_view.aod
index 6048f3f0bdf..e6bb8787561 100644
--- a/neonView/Prod2ProdEdit_view/Prod2ProdEdit_view.aod
+++ b/neonView/Prod2ProdEdit_view/Prod2ProdEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>Prod2ProdEdit_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <size>SMALL</size>
diff --git a/neonView/Prod2prodFilter_view/Prod2prodFilter_view.aod b/neonView/Prod2prodFilter_view/Prod2prodFilter_view.aod
index e5bac593a14..ff851bb5587 100644
--- a/neonView/Prod2prodFilter_view/Prod2prodFilter_view.aod
+++ b/neonView/Prod2prodFilter_view/Prod2prodFilter_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>Prod2prodFilter_view</name>
   <title>Parts list</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/neonView/ProductEdit_view/ProductEdit_view.aod b/neonView/ProductEdit_view/ProductEdit_view.aod
index 768f479d12d..9b3843d6625 100644
--- a/neonView/ProductEdit_view/ProductEdit_view.aod
+++ b/neonView/ProductEdit_view/ProductEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>ProductEdit_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/ProductFilter_view/ProductFilter_view.aod b/neonView/ProductFilter_view/ProductFilter_view.aod
index 87133854a0b..326ff54ed32 100644
--- a/neonView/ProductFilter_view/ProductFilter_view.aod
+++ b/neonView/ProductFilter_view/ProductFilter_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>ProductFilter_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <filterable v="true" />
diff --git a/neonView/ProductLookup_view/ProductLookup_view.aod b/neonView/ProductLookup_view/ProductLookup_view.aod
index e038ed3765c..36f27e8de47 100644
--- a/neonView/ProductLookup_view/ProductLookup_view.aod
+++ b/neonView/ProductLookup_view/ProductLookup_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>ProductLookup_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <documentation>%aditoprj%/neonView/ProductLookup_view/documentation.adoc</documentation>
diff --git a/neonView/ProductMain_view/ProductMain_view.aod b/neonView/ProductMain_view/ProductMain_view.aod
index e284252e8f4..485f0f39033 100644
--- a/neonView/ProductMain_view/ProductMain_view.aod
+++ b/neonView/ProductMain_view/ProductMain_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>ProductMain_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/ProductPreview_view/ProductPreview_view.aod b/neonView/ProductPreview_view/ProductPreview_view.aod
index 61b9a8f77cd..f54cbe74852 100644
--- a/neonView/ProductPreview_view/ProductPreview_view.aod
+++ b/neonView/ProductPreview_view/ProductPreview_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>ProductPreview_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/ProductpriceEdit_view/ProductpriceEdit_view.aod b/neonView/ProductpriceEdit_view/ProductpriceEdit_view.aod
index f2c6e8dac43..9e99957324c 100644
--- a/neonView/ProductpriceEdit_view/ProductpriceEdit_view.aod
+++ b/neonView/ProductpriceEdit_view/ProductpriceEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>ProductpriceEdit_view</name>
   <title>Price list</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/neonView/ProductpriceFilter_view/ProductpriceFilter_view.aod b/neonView/ProductpriceFilter_view/ProductpriceFilter_view.aod
index f19f9c4d30b..13e9c8af8f1 100644
--- a/neonView/ProductpriceFilter_view/ProductpriceFilter_view.aod
+++ b/neonView/ProductpriceFilter_view/ProductpriceFilter_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>ProductpriceFilter_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <filterable v="true" />
diff --git a/neonView/ProductpriceForProductFilter_view/ProductpriceForProductFilter_view.aod b/neonView/ProductpriceForProductFilter_view/ProductpriceForProductFilter_view.aod
index 181e22f1cc5..7bc95e10fa1 100644
--- a/neonView/ProductpriceForProductFilter_view/ProductpriceForProductFilter_view.aod
+++ b/neonView/ProductpriceForProductFilter_view/ProductpriceForProductFilter_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>ProductpriceForProductFilter_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <filterable v="true" />
diff --git a/neonView/ProductpricePreview_view/ProductpricePreview_view.aod b/neonView/ProductpricePreview_view/ProductpricePreview_view.aod
index bb516112119..3a26703ba70 100644
--- a/neonView/ProductpricePreview_view/ProductpricePreview_view.aod
+++ b/neonView/ProductpricePreview_view/ProductpricePreview_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>ProductpricePreview_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/ProductpriceRelation_view/ProductpriceRelation_view.aod b/neonView/ProductpriceRelation_view/ProductpriceRelation_view.aod
index 9d054a7e576..fa3d8501713 100644
--- a/neonView/ProductpriceRelation_view/ProductpriceRelation_view.aod
+++ b/neonView/ProductpriceRelation_view/ProductpriceRelation_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>ProductpriceRelation_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/QuickEntryEdit_view/QuickEntryEdit_view.aod b/neonView/QuickEntryEdit_view/QuickEntryEdit_view.aod
index 9598c3420b1..5947deaa524 100644
--- a/neonView/QuickEntryEdit_view/QuickEntryEdit_view.aod
+++ b/neonView/QuickEntryEdit_view/QuickEntryEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>QuickEntryEdit_view</name>
   <title>Quick Entry</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/neonView/RoleChildrenEdit_view/RoleChildrenEdit_view.aod b/neonView/RoleChildrenEdit_view/RoleChildrenEdit_view.aod
index 8dd7cd21a63..4ba793b4c4a 100644
--- a/neonView/RoleChildrenEdit_view/RoleChildrenEdit_view.aod
+++ b/neonView/RoleChildrenEdit_view/RoleChildrenEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>RoleChildrenEdit_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/RoleChildrenList_view/RoleChildrenList_view.aod b/neonView/RoleChildrenList_view/RoleChildrenList_view.aod
index ada141eeefb..149c223100c 100644
--- a/neonView/RoleChildrenList_view/RoleChildrenList_view.aod
+++ b/neonView/RoleChildrenList_view/RoleChildrenList_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>RoleChildrenList_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/RoleEdit_view/RoleEdit_view.aod b/neonView/RoleEdit_view/RoleEdit_view.aod
index 55cdf175563..48efe4546a6 100644
--- a/neonView/RoleEdit_view/RoleEdit_view.aod
+++ b/neonView/RoleEdit_view/RoleEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>RoleEdit_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/RoleFilter_view/RoleFilter_view.aod b/neonView/RoleFilter_view/RoleFilter_view.aod
index 612096e53f1..41cdd7eb872 100644
--- a/neonView/RoleFilter_view/RoleFilter_view.aod
+++ b/neonView/RoleFilter_view/RoleFilter_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>RoleFilter_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <filterable v="true" />
diff --git a/neonView/RoleMain_view/RoleMain_view.aod b/neonView/RoleMain_view/RoleMain_view.aod
index f63cba1a93f..435f4e497dc 100644
--- a/neonView/RoleMain_view/RoleMain_view.aod
+++ b/neonView/RoleMain_view/RoleMain_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>RoleMain_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/RoleParentList_view/RoleParentList_view.aod b/neonView/RoleParentList_view/RoleParentList_view.aod
index 2a2073e3196..357f92e5373 100644
--- a/neonView/RoleParentList_view/RoleParentList_view.aod
+++ b/neonView/RoleParentList_view/RoleParentList_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>RoleParentList_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/RolePreview_view/RolePreview_view.aod b/neonView/RolePreview_view/RolePreview_view.aod
index 5f62a43c2ca..1c58e0710e0 100644
--- a/neonView/RolePreview_view/RolePreview_view.aod
+++ b/neonView/RolePreview_view/RolePreview_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>RolePreview_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/SalesprojectAnalysesPhases_view/SalesprojectAnalysesPhases_view.aod b/neonView/SalesprojectAnalysesPhases_view/SalesprojectAnalysesPhases_view.aod
index 86524aca75a..585ee4502b9 100644
--- a/neonView/SalesprojectAnalysesPhases_view/SalesprojectAnalysesPhases_view.aod
+++ b/neonView/SalesprojectAnalysesPhases_view/SalesprojectAnalysesPhases_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>SalesprojectAnalysesPhases_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/SalesprojectAnalyses_view/SalesprojectAnalyses_view.aod b/neonView/SalesprojectAnalyses_view/SalesprojectAnalyses_view.aod
index 8ed958a9952..31cd51c26b8 100644
--- a/neonView/SalesprojectAnalyses_view/SalesprojectAnalyses_view.aod
+++ b/neonView/SalesprojectAnalyses_view/SalesprojectAnalyses_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>SalesprojectAnalyses_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <filterable v="true" />
diff --git a/neonView/SalesprojectConversionRate_view/SalesprojectConversionRate_view.aod b/neonView/SalesprojectConversionRate_view/SalesprojectConversionRate_view.aod
index c17221595c4..23306b3f473 100644
--- a/neonView/SalesprojectConversionRate_view/SalesprojectConversionRate_view.aod
+++ b/neonView/SalesprojectConversionRate_view/SalesprojectConversionRate_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>SalesprojectConversionRate_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <filterable v="true" />
diff --git a/neonView/SalesprojectEdit_view/SalesprojectEdit_view.aod b/neonView/SalesprojectEdit_view/SalesprojectEdit_view.aod
index 04b352527d9..4481932076a 100644
--- a/neonView/SalesprojectEdit_view/SalesprojectEdit_view.aod
+++ b/neonView/SalesprojectEdit_view/SalesprojectEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>SalesprojectEdit_view</name>
   <title>Sales Project</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/neonView/SalesprojectFilter_view/SalesprojectFilter_view.aod b/neonView/SalesprojectFilter_view/SalesprojectFilter_view.aod
index 5a88276721b..6a613d6f1d4 100644
--- a/neonView/SalesprojectFilter_view/SalesprojectFilter_view.aod
+++ b/neonView/SalesprojectFilter_view/SalesprojectFilter_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>SalesprojectFilter_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <filterable v="true" />
diff --git a/neonView/SalesprojectForecastDrawer_view/SalesprojectForecastDrawer_view.aod b/neonView/SalesprojectForecastDrawer_view/SalesprojectForecastDrawer_view.aod
index 734f3f44872..ef00bdc11ab 100644
--- a/neonView/SalesprojectForecastDrawer_view/SalesprojectForecastDrawer_view.aod
+++ b/neonView/SalesprojectForecastDrawer_view/SalesprojectForecastDrawer_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>SalesprojectForecastDrawer_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/SalesprojectFurtherInfo_view/SalesprojectFurtherInfo_view.aod b/neonView/SalesprojectFurtherInfo_view/SalesprojectFurtherInfo_view.aod
index d222b3f6592..eb51c7978c5 100644
--- a/neonView/SalesprojectFurtherInfo_view/SalesprojectFurtherInfo_view.aod
+++ b/neonView/SalesprojectFurtherInfo_view/SalesprojectFurtherInfo_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>SalesprojectFurtherInfo_view</name>
   <title>Further informations</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/neonView/SalesprojectMain_view/SalesprojectMain_view.aod b/neonView/SalesprojectMain_view/SalesprojectMain_view.aod
index 9098e124f35..75a74d87d88 100644
--- a/neonView/SalesprojectMain_view/SalesprojectMain_view.aod
+++ b/neonView/SalesprojectMain_view/SalesprojectMain_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>SalesprojectMain_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/SalesprojectMemberActivity_view/SalesprojectMemberActivity_view.aod b/neonView/SalesprojectMemberActivity_view/SalesprojectMemberActivity_view.aod
index 98ba3483820..f66c853a872 100644
--- a/neonView/SalesprojectMemberActivity_view/SalesprojectMemberActivity_view.aod
+++ b/neonView/SalesprojectMemberActivity_view/SalesprojectMemberActivity_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>SalesprojectMemberActivity_view</name>
   <title>Project</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/neonView/SalesprojectMilestoneChartPhase_view/SalesprojectMilestoneChartPhase_view.aod b/neonView/SalesprojectMilestoneChartPhase_view/SalesprojectMilestoneChartPhase_view.aod
index 2d7a4e08733..8902d3ad115 100644
--- a/neonView/SalesprojectMilestoneChartPhase_view/SalesprojectMilestoneChartPhase_view.aod
+++ b/neonView/SalesprojectMilestoneChartPhase_view/SalesprojectMilestoneChartPhase_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>SalesprojectMilestoneChartPhase_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/SalesprojectMilestoneChartState_view/SalesprojectMilestoneChartState_view.aod b/neonView/SalesprojectMilestoneChartState_view/SalesprojectMilestoneChartState_view.aod
index 504c39d8aff..6509031c9d4 100644
--- a/neonView/SalesprojectMilestoneChartState_view/SalesprojectMilestoneChartState_view.aod
+++ b/neonView/SalesprojectMilestoneChartState_view/SalesprojectMilestoneChartState_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>SalesprojectMilestoneChartState_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/SalesprojectMilestoneInfo_view/SalesprojectMilestoneInfo_view.aod b/neonView/SalesprojectMilestoneInfo_view/SalesprojectMilestoneInfo_view.aod
index 178eb3816ff..ab5a53fc87e 100644
--- a/neonView/SalesprojectMilestoneInfo_view/SalesprojectMilestoneInfo_view.aod
+++ b/neonView/SalesprojectMilestoneInfo_view/SalesprojectMilestoneInfo_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>SalesprojectMilestoneInfo_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/SalesprojectMilestoneSource_view/SalesprojectMilestoneSource_view.aod b/neonView/SalesprojectMilestoneSource_view/SalesprojectMilestoneSource_view.aod
index 91f395b0f3c..0d8d9846cb0 100644
--- a/neonView/SalesprojectMilestoneSource_view/SalesprojectMilestoneSource_view.aod
+++ b/neonView/SalesprojectMilestoneSource_view/SalesprojectMilestoneSource_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>SalesprojectMilestoneSource_view</name>
   <title>Occurrences</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/neonView/SalesprojectMilestone_view/SalesprojectMilestone_view.aod b/neonView/SalesprojectMilestone_view/SalesprojectMilestone_view.aod
index 990d8b15066..94e96382d7d 100644
--- a/neonView/SalesprojectMilestone_view/SalesprojectMilestone_view.aod
+++ b/neonView/SalesprojectMilestone_view/SalesprojectMilestone_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>SalesprojectMilestone_view</name>
   <title></title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/neonView/SalesprojectMultiEdit_view/SalesprojectMultiEdit_view.aod b/neonView/SalesprojectMultiEdit_view/SalesprojectMultiEdit_view.aod
index 898af789d60..4e60e5354ec 100644
--- a/neonView/SalesprojectMultiEdit_view/SalesprojectMultiEdit_view.aod
+++ b/neonView/SalesprojectMultiEdit_view/SalesprojectMultiEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>SalesprojectMultiEdit_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/SalesprojectOfferForecastChart_view/SalesprojectOfferForecastChart_view.aod b/neonView/SalesprojectOfferForecastChart_view/SalesprojectOfferForecastChart_view.aod
index 3423f5ee4f8..80f3892c0d5 100644
--- a/neonView/SalesprojectOfferForecastChart_view/SalesprojectOfferForecastChart_view.aod
+++ b/neonView/SalesprojectOfferForecastChart_view/SalesprojectOfferForecastChart_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>SalesprojectOfferForecastChart_view</name>
   <title>Forecast</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/neonView/SalesprojectOfferForecast_view/SalesprojectOfferForecast_view.aod b/neonView/SalesprojectOfferForecast_view/SalesprojectOfferForecast_view.aod
index 2136aaa7a4b..417bad86b86 100644
--- a/neonView/SalesprojectOfferForecast_view/SalesprojectOfferForecast_view.aod
+++ b/neonView/SalesprojectOfferForecast_view/SalesprojectOfferForecast_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>SalesprojectOfferForecast_view</name>
   <title></title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/neonView/SalesprojectOverview_view/SalesprojectOverview_view.aod b/neonView/SalesprojectOverview_view/SalesprojectOverview_view.aod
index 9a84bbb876c..0485dce3b28 100644
--- a/neonView/SalesprojectOverview_view/SalesprojectOverview_view.aod
+++ b/neonView/SalesprojectOverview_view/SalesprojectOverview_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>SalesprojectOverview_view</name>
   <title>Overview</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/neonView/SalesprojectPhaseStep_view/SalesprojectPhaseStep_view.aod b/neonView/SalesprojectPhaseStep_view/SalesprojectPhaseStep_view.aod
index 4d42cd968e9..eef84fe84ee 100644
--- a/neonView/SalesprojectPhaseStep_view/SalesprojectPhaseStep_view.aod
+++ b/neonView/SalesprojectPhaseStep_view/SalesprojectPhaseStep_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>SalesprojectPhaseStep_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/SalesprojectPhase_view/SalesprojectPhase_view.aod b/neonView/SalesprojectPhase_view/SalesprojectPhase_view.aod
index 108a0a83781..b00f3193429 100644
--- a/neonView/SalesprojectPhase_view/SalesprojectPhase_view.aod
+++ b/neonView/SalesprojectPhase_view/SalesprojectPhase_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>SalesprojectPhase_view</name>
   <title>Phase</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/neonView/SalesprojectPreview_view/SalesprojectPreview_view.aod b/neonView/SalesprojectPreview_view/SalesprojectPreview_view.aod
index fcabc60c03f..6733e0803c4 100644
--- a/neonView/SalesprojectPreview_view/SalesprojectPreview_view.aod
+++ b/neonView/SalesprojectPreview_view/SalesprojectPreview_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>SalesprojectPreview_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/SalesprojectScoreCard_view/SalesprojectScoreCard_view.aod b/neonView/SalesprojectScoreCard_view/SalesprojectScoreCard_view.aod
index 6a0e513a643..b67ff0f9c15 100644
--- a/neonView/SalesprojectScoreCard_view/SalesprojectScoreCard_view.aod
+++ b/neonView/SalesprojectScoreCard_view/SalesprojectScoreCard_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>SalesprojectScoreCard_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <dashletConfigurations>
diff --git a/neonView/SalesprojectSourceDrawer_view/SalesprojectSourceDrawer_view.aod b/neonView/SalesprojectSourceDrawer_view/SalesprojectSourceDrawer_view.aod
index 7bdd751a12b..abcf6c15c2c 100644
--- a/neonView/SalesprojectSourceDrawer_view/SalesprojectSourceDrawer_view.aod
+++ b/neonView/SalesprojectSourceDrawer_view/SalesprojectSourceDrawer_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>SalesprojectSourceDrawer_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/SalesprojectSourceEdit_view/SalesprojectSourceEdit_view.aod b/neonView/SalesprojectSourceEdit_view/SalesprojectSourceEdit_view.aod
index 056fcc4af21..8eae1eea4db 100644
--- a/neonView/SalesprojectSourceEdit_view/SalesprojectSourceEdit_view.aod
+++ b/neonView/SalesprojectSourceEdit_view/SalesprojectSourceEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>SalesprojectSourceEdit_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <size>SMALL</size>
diff --git a/neonView/SalesprojectSourceFilter_view/SalesprojectSourceFilter_view.aod b/neonView/SalesprojectSourceFilter_view/SalesprojectSourceFilter_view.aod
index ca41ad24d87..1573062e0f5 100644
--- a/neonView/SalesprojectSourceFilter_view/SalesprojectSourceFilter_view.aod
+++ b/neonView/SalesprojectSourceFilter_view/SalesprojectSourceFilter_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>SalesprojectSourceFilter_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <filterable v="true" />
diff --git a/neonView/SalesprojectSourcePreview_view/SalesprojectSourcePreview_view.aod b/neonView/SalesprojectSourcePreview_view/SalesprojectSourcePreview_view.aod
index b71758441e6..e95fd39683b 100644
--- a/neonView/SalesprojectSourcePreview_view/SalesprojectSourcePreview_view.aod
+++ b/neonView/SalesprojectSourcePreview_view/SalesprojectSourcePreview_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>SalesprojectSourcePreview_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/SalutationEdit_view/SalutationEdit_view.aod b/neonView/SalutationEdit_view/SalutationEdit_view.aod
index 3179d62093f..3b05b5cf8a1 100644
--- a/neonView/SalutationEdit_view/SalutationEdit_view.aod
+++ b/neonView/SalutationEdit_view/SalutationEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>SalutationEdit_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <size>SMALL</size>
diff --git a/neonView/SalutationFilter_view/SalutationFilter_view.aod b/neonView/SalutationFilter_view/SalutationFilter_view.aod
index d424e336902..97206dab245 100644
--- a/neonView/SalutationFilter_view/SalutationFilter_view.aod
+++ b/neonView/SalutationFilter_view/SalutationFilter_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>SalutationFilter_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <filterable v="true" />
diff --git a/neonView/SerialLetterAddRecipientsEdit_view/SerialLetterAddRecipientsEdit_view.aod b/neonView/SerialLetterAddRecipientsEdit_view/SerialLetterAddRecipientsEdit_view.aod
index cc896e3f349..7e51a80a470 100644
--- a/neonView/SerialLetterAddRecipientsEdit_view/SerialLetterAddRecipientsEdit_view.aod
+++ b/neonView/SerialLetterAddRecipientsEdit_view/SerialLetterAddRecipientsEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>SerialLetterAddRecipientsEdit_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <size>SMALL</size>
diff --git a/neonView/SerialLetterEdit_view/SerialLetterEdit_view.aod b/neonView/SerialLetterEdit_view/SerialLetterEdit_view.aod
index f5d1223b1ab..4ffcf6004ca 100644
--- a/neonView/SerialLetterEdit_view/SerialLetterEdit_view.aod
+++ b/neonView/SerialLetterEdit_view/SerialLetterEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>SerialLetterEdit_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/SerialLetterFilter_view/SerialLetterFilter_view.aod b/neonView/SerialLetterFilter_view/SerialLetterFilter_view.aod
index b95fda0d5aa..45ba687a677 100644
--- a/neonView/SerialLetterFilter_view/SerialLetterFilter_view.aod
+++ b/neonView/SerialLetterFilter_view/SerialLetterFilter_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>SerialLetterFilter_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <filterable v="true" />
diff --git a/neonView/SerialLetterMain_view/SerialLetterMain_view.aod b/neonView/SerialLetterMain_view/SerialLetterMain_view.aod
index 1c9cdf0b094..2c7a25adb74 100644
--- a/neonView/SerialLetterMain_view/SerialLetterMain_view.aod
+++ b/neonView/SerialLetterMain_view/SerialLetterMain_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>SerialLetterMain_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/SerialLetterPreview_view/SerialLetterPreview_view.aod b/neonView/SerialLetterPreview_view/SerialLetterPreview_view.aod
index 14abcef6de4..38949d8ec56 100644
--- a/neonView/SerialLetterPreview_view/SerialLetterPreview_view.aod
+++ b/neonView/SerialLetterPreview_view/SerialLetterPreview_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>SerialLetterPreview_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/StockCount_view/StockCount_view.aod b/neonView/StockCount_view/StockCount_view.aod
index 20dd00eaeeb..ace71cf3310 100644
--- a/neonView/StockCount_view/StockCount_view.aod
+++ b/neonView/StockCount_view/StockCount_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>StockCount_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/StockEdit_view/StockEdit_view.aod b/neonView/StockEdit_view/StockEdit_view.aod
index d8270701944..227ab14331f 100644
--- a/neonView/StockEdit_view/StockEdit_view.aod
+++ b/neonView/StockEdit_view/StockEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>StockEdit_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/StockFilter_view/StockFilter_view.aod b/neonView/StockFilter_view/StockFilter_view.aod
index cad57413e4d..f5c09966799 100644
--- a/neonView/StockFilter_view/StockFilter_view.aod
+++ b/neonView/StockFilter_view/StockFilter_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>StockFilter_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <filterable v="true" />
diff --git a/neonView/SupportTicketEdit_view/SupportTicketEdit_view.aod b/neonView/SupportTicketEdit_view/SupportTicketEdit_view.aod
index aa9a3396de0..b78c65c1ded 100644
--- a/neonView/SupportTicketEdit_view/SupportTicketEdit_view.aod
+++ b/neonView/SupportTicketEdit_view/SupportTicketEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>SupportTicketEdit_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/SupportTicketFilter_view/SupportTicketFilter_view.aod b/neonView/SupportTicketFilter_view/SupportTicketFilter_view.aod
index 7b5e818ce4f..97892017ec8 100644
--- a/neonView/SupportTicketFilter_view/SupportTicketFilter_view.aod
+++ b/neonView/SupportTicketFilter_view/SupportTicketFilter_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>SupportTicketFilter_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <filterable v="true" />
diff --git a/neonView/SupportTicketMain_view/SupportTicketMain_view.aod b/neonView/SupportTicketMain_view/SupportTicketMain_view.aod
index 529d000dc9d..8950edb1d40 100644
--- a/neonView/SupportTicketMain_view/SupportTicketMain_view.aod
+++ b/neonView/SupportTicketMain_view/SupportTicketMain_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>SupportTicketMain_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/SupportTicketPreview_view/SupportTicketPreview_view.aod b/neonView/SupportTicketPreview_view/SupportTicketPreview_view.aod
index 48b48a2a48f..2495b76bd10 100644
--- a/neonView/SupportTicketPreview_view/SupportTicketPreview_view.aod
+++ b/neonView/SupportTicketPreview_view/SupportTicketPreview_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>SupportTicketPreview_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/TaskEdit_view/TaskEdit_view.aod b/neonView/TaskEdit_view/TaskEdit_view.aod
index c71ca1b6b43..c5c8e8e1091 100644
--- a/neonView/TaskEdit_view/TaskEdit_view.aod
+++ b/neonView/TaskEdit_view/TaskEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>TaskEdit_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/TaskFilter_view/TaskFilter_view.aod b/neonView/TaskFilter_view/TaskFilter_view.aod
index 77601cb3a2e..51c579c8f60 100644
--- a/neonView/TaskFilter_view/TaskFilter_view.aod
+++ b/neonView/TaskFilter_view/TaskFilter_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>TaskFilter_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <filterable v="true" />
diff --git a/neonView/TaskLinkFilter_view/TaskLinkFilter_view.aod b/neonView/TaskLinkFilter_view/TaskLinkFilter_view.aod
index f9e1e3aa8a2..aff539498ef 100644
--- a/neonView/TaskLinkFilter_view/TaskLinkFilter_view.aod
+++ b/neonView/TaskLinkFilter_view/TaskLinkFilter_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>TaskLinkFilter_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/TaskLinkMultiEdit_view/TaskLinkMultiEdit_view.aod b/neonView/TaskLinkMultiEdit_view/TaskLinkMultiEdit_view.aod
index 04ab701524e..01b6cf513e9 100644
--- a/neonView/TaskLinkMultiEdit_view/TaskLinkMultiEdit_view.aod
+++ b/neonView/TaskLinkMultiEdit_view/TaskLinkMultiEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>TaskLinkMultiEdit_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/TaskLinkPreviewList_view/TaskLinkPreviewList_view.aod b/neonView/TaskLinkPreviewList_view/TaskLinkPreviewList_view.aod
index 4427da0dd67..2cdff7d7062 100644
--- a/neonView/TaskLinkPreviewList_view/TaskLinkPreviewList_view.aod
+++ b/neonView/TaskLinkPreviewList_view/TaskLinkPreviewList_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>TaskLinkPreviewList_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/TaskLinkPreview_view/TaskLinkPreview_view.aod b/neonView/TaskLinkPreview_view/TaskLinkPreview_view.aod
index 14b9249b286..843b7a8efa9 100644
--- a/neonView/TaskLinkPreview_view/TaskLinkPreview_view.aod
+++ b/neonView/TaskLinkPreview_view/TaskLinkPreview_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>TaskLinkPreview_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/TaskMain_view/TaskMain_view.aod b/neonView/TaskMain_view/TaskMain_view.aod
index ad38b461f3f..a2521203f37 100644
--- a/neonView/TaskMain_view/TaskMain_view.aod
+++ b/neonView/TaskMain_view/TaskMain_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>TaskMain_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/TaskPreview_view/TaskPreview_view.aod b/neonView/TaskPreview_view/TaskPreview_view.aod
index 82ac185b0f1..57ad1bd7618 100644
--- a/neonView/TaskPreview_view/TaskPreview_view.aod
+++ b/neonView/TaskPreview_view/TaskPreview_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>TaskPreview_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/TimetrackingAnalysesDrawer_view/TimetrackingAnalysesDrawer_view.aod b/neonView/TimetrackingAnalysesDrawer_view/TimetrackingAnalysesDrawer_view.aod
index 17633107ed9..fe8b4ddcb0b 100644
--- a/neonView/TimetrackingAnalysesDrawer_view/TimetrackingAnalysesDrawer_view.aod
+++ b/neonView/TimetrackingAnalysesDrawer_view/TimetrackingAnalysesDrawer_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>TimetrackingAnalysesDrawer_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/TimetrackingAnalyses_view/TimetrackingAnalyses_view.aod b/neonView/TimetrackingAnalyses_view/TimetrackingAnalyses_view.aod
index 2ea1d75c892..eeddd0f26c9 100644
--- a/neonView/TimetrackingAnalyses_view/TimetrackingAnalyses_view.aod
+++ b/neonView/TimetrackingAnalyses_view/TimetrackingAnalyses_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>TimetrackingAnalyses_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/TimetrackingDrawer_view/TimetrackingDrawer_view.aod b/neonView/TimetrackingDrawer_view/TimetrackingDrawer_view.aod
index 228cf5d6e7e..b6bead1d562 100644
--- a/neonView/TimetrackingDrawer_view/TimetrackingDrawer_view.aod
+++ b/neonView/TimetrackingDrawer_view/TimetrackingDrawer_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>TimetrackingDrawer_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/TimetrackingEdit_view/TimetrackingEdit_view.aod b/neonView/TimetrackingEdit_view/TimetrackingEdit_view.aod
index 231020b4962..fda8ae851db 100644
--- a/neonView/TimetrackingEdit_view/TimetrackingEdit_view.aod
+++ b/neonView/TimetrackingEdit_view/TimetrackingEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>TimetrackingEdit_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <size>SMALL</size>
diff --git a/neonView/TimetrackingFilterAnalyses/TimetrackingFilterAnalyses.aod b/neonView/TimetrackingFilterAnalyses/TimetrackingFilterAnalyses.aod
index c0befff5418..6339c82f7e9 100644
--- a/neonView/TimetrackingFilterAnalyses/TimetrackingFilterAnalyses.aod
+++ b/neonView/TimetrackingFilterAnalyses/TimetrackingFilterAnalyses.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>TimetrackingFilterAnalyses</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/TimetrackingFilter_view/TimetrackingFilter_view.aod b/neonView/TimetrackingFilter_view/TimetrackingFilter_view.aod
index c05c5db874a..6957ae22e83 100644
--- a/neonView/TimetrackingFilter_view/TimetrackingFilter_view.aod
+++ b/neonView/TimetrackingFilter_view/TimetrackingFilter_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>TimetrackingFilter_view</name>
   <title>Timetracking</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/neonView/TimetrackingPreview_view/TimetrackingPreview_view.aod b/neonView/TimetrackingPreview_view/TimetrackingPreview_view.aod
index 1a76cbc61d1..42f42a0e537 100644
--- a/neonView/TimetrackingPreview_view/TimetrackingPreview_view.aod
+++ b/neonView/TimetrackingPreview_view/TimetrackingPreview_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>TimetrackingPreview_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/TimetrackingScore_view/TimetrackingScore_view.aod b/neonView/TimetrackingScore_view/TimetrackingScore_view.aod
index 1efd3641c31..c372f639c03 100644
--- a/neonView/TimetrackingScore_view/TimetrackingScore_view.aod
+++ b/neonView/TimetrackingScore_view/TimetrackingScore_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>TimetrackingScore_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/TurnoverChartForcastDrawer_view/TurnoverChartForcastDrawer_view.aod b/neonView/TurnoverChartForcastDrawer_view/TurnoverChartForcastDrawer_view.aod
index 602bf1fed83..7a404cd9833 100644
--- a/neonView/TurnoverChartForcastDrawer_view/TurnoverChartForcastDrawer_view.aod
+++ b/neonView/TurnoverChartForcastDrawer_view/TurnoverChartForcastDrawer_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>TurnoverChartForcastDrawer_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/TurnoverChartForecast_view/TurnoverChartForecast_view.aod b/neonView/TurnoverChartForecast_view/TurnoverChartForecast_view.aod
index 962a05e05a0..87500b99d68 100644
--- a/neonView/TurnoverChartForecast_view/TurnoverChartForecast_view.aod
+++ b/neonView/TurnoverChartForecast_view/TurnoverChartForecast_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>TurnoverChartForecast_view</name>
   <title>Forecast</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/neonView/TurnoverChart_view/TurnoverChart_view.aod b/neonView/TurnoverChart_view/TurnoverChart_view.aod
index 09c915ae244..cbee81a152b 100644
--- a/neonView/TurnoverChart_view/TurnoverChart_view.aod
+++ b/neonView/TurnoverChart_view/TurnoverChart_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>TurnoverChart_view</name>
   <title></title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/neonView/TurnoverTree_view/TurnoverTree_view.aod b/neonView/TurnoverTree_view/TurnoverTree_view.aod
index b8e357571ef..baa0832aab0 100644
--- a/neonView/TurnoverTree_view/TurnoverTree_view.aod
+++ b/neonView/TurnoverTree_view/TurnoverTree_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>TurnoverTree_view</name>
   <title>Tree</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/neonView/TwitterTimeline_view/TwitterTimeline_view.aod b/neonView/TwitterTimeline_view/TwitterTimeline_view.aod
index 167eb2982e3..7addad6331c 100644
--- a/neonView/TwitterTimeline_view/TwitterTimeline_view.aod
+++ b/neonView/TwitterTimeline_view/TwitterTimeline_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>TwitterTimeline_view</name>
   <title>Twitter</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/neonView/UniversalFileProcessorDropzone_view/UniversalFileProcessorDropzone_view.aod b/neonView/UniversalFileProcessorDropzone_view/UniversalFileProcessorDropzone_view.aod
index 441059938ff..8c66fbfacdd 100644
--- a/neonView/UniversalFileProcessorDropzone_view/UniversalFileProcessorDropzone_view.aod
+++ b/neonView/UniversalFileProcessorDropzone_view/UniversalFileProcessorDropzone_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>UniversalFileProcessorDropzone_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <dashletConfigurations>
diff --git a/neonView/UnlinkedMailFilter_view/UnlinkedMailFilter_view.aod b/neonView/UnlinkedMailFilter_view/UnlinkedMailFilter_view.aod
index fc53c28edde..819837d79cb 100644
--- a/neonView/UnlinkedMailFilter_view/UnlinkedMailFilter_view.aod
+++ b/neonView/UnlinkedMailFilter_view/UnlinkedMailFilter_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>UnlinkedMailFilter_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <dashletConfigurations>
diff --git a/neonView/UnlinkedMailMappingLinkList_view/UnlinkedMailMappingLinkList_view.aod b/neonView/UnlinkedMailMappingLinkList_view/UnlinkedMailMappingLinkList_view.aod
index 6be9cc5af6f..e6af4ffd56d 100644
--- a/neonView/UnlinkedMailMappingLinkList_view/UnlinkedMailMappingLinkList_view.aod
+++ b/neonView/UnlinkedMailMappingLinkList_view/UnlinkedMailMappingLinkList_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>UnlinkedMailMappingLinkList_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/UnlinkedMailMappingWrapperMapping_view/UnlinkedMailMappingWrapperMapping_view.aod b/neonView/UnlinkedMailMappingWrapperMapping_view/UnlinkedMailMappingWrapperMapping_view.aod
index dec9ecc2091..c7ba9b2d1e7 100644
--- a/neonView/UnlinkedMailMappingWrapperMapping_view/UnlinkedMailMappingWrapperMapping_view.aod
+++ b/neonView/UnlinkedMailMappingWrapperMapping_view/UnlinkedMailMappingWrapperMapping_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>UnlinkedMailMappingWrapperMapping_view</name>
   <title>Link e-mail addresses to contacts</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/neonView/Userhelp_FilterView/Userhelp_FilterView.aod b/neonView/Userhelp_FilterView/Userhelp_FilterView.aod
index 88b815cc8ab..f49695009f3 100644
--- a/neonView/Userhelp_FilterView/Userhelp_FilterView.aod
+++ b/neonView/Userhelp_FilterView/Userhelp_FilterView.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>Userhelp_FilterView</name>
   <title>Userhelp Ressources</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/neonView/UsersettingsEdit_view/UsersettingsEdit_view.aod b/neonView/UsersettingsEdit_view/UsersettingsEdit_view.aod
index 4a500fdf724..acf9e28696c 100644
--- a/neonView/UsersettingsEdit_view/UsersettingsEdit_view.aod
+++ b/neonView/UsersettingsEdit_view/UsersettingsEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>UsersettingsEdit_view</name>
   <title>Settings</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/neonView/VisitPlanEmployeeWeekEdit_view/VisitPlanEmployeeWeekEdit_view.aod b/neonView/VisitPlanEmployeeWeekEdit_view/VisitPlanEmployeeWeekEdit_view.aod
index f4bb8a7d21f..f03e6f119f0 100644
--- a/neonView/VisitPlanEmployeeWeekEdit_view/VisitPlanEmployeeWeekEdit_view.aod
+++ b/neonView/VisitPlanEmployeeWeekEdit_view/VisitPlanEmployeeWeekEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>VisitPlanEmployeeWeekEdit_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <size>SMALL</size>
diff --git a/neonView/VisitPlanEmployeeWeekFilter_view/VisitPlanEmployeeWeekFilter_view.aod b/neonView/VisitPlanEmployeeWeekFilter_view/VisitPlanEmployeeWeekFilter_view.aod
index 6de254467a3..bcbed30d9f5 100644
--- a/neonView/VisitPlanEmployeeWeekFilter_view/VisitPlanEmployeeWeekFilter_view.aod
+++ b/neonView/VisitPlanEmployeeWeekFilter_view/VisitPlanEmployeeWeekFilter_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>VisitPlanEmployeeWeekFilter_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <filterable v="false" />
diff --git a/neonView/VisitPlanEmployeeWeekMain_view/VisitPlanEmployeeWeekMain_view.aod b/neonView/VisitPlanEmployeeWeekMain_view/VisitPlanEmployeeWeekMain_view.aod
index 6bd22ba2b15..efed26c7342 100644
--- a/neonView/VisitPlanEmployeeWeekMain_view/VisitPlanEmployeeWeekMain_view.aod
+++ b/neonView/VisitPlanEmployeeWeekMain_view/VisitPlanEmployeeWeekMain_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>VisitPlanEmployeeWeekMain_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/VisitPlanEmployeeWeekPreview_view/VisitPlanEmployeeWeekPreview_view.aod b/neonView/VisitPlanEmployeeWeekPreview_view/VisitPlanEmployeeWeekPreview_view.aod
index ec7824e9dea..4ecd6b51c19 100644
--- a/neonView/VisitPlanEmployeeWeekPreview_view/VisitPlanEmployeeWeekPreview_view.aod
+++ b/neonView/VisitPlanEmployeeWeekPreview_view/VisitPlanEmployeeWeekPreview_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>VisitPlanEmployeeWeekPreview_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <size>SMALL</size>
diff --git a/neonView/VisitPlanEntryEdit_view/VisitPlanEntryEdit_view.aod b/neonView/VisitPlanEntryEdit_view/VisitPlanEntryEdit_view.aod
index 4a216530f8c..4538a67ca21 100644
--- a/neonView/VisitPlanEntryEdit_view/VisitPlanEntryEdit_view.aod
+++ b/neonView/VisitPlanEntryEdit_view/VisitPlanEntryEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>VisitPlanEntryEdit_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <size>SMALL</size>
diff --git a/neonView/VisitPlanEntryFilter_view/VisitPlanEntryFilter_view.aod b/neonView/VisitPlanEntryFilter_view/VisitPlanEntryFilter_view.aod
index d98e4cb1e5a..b514c136189 100644
--- a/neonView/VisitPlanEntryFilter_view/VisitPlanEntryFilter_view.aod
+++ b/neonView/VisitPlanEntryFilter_view/VisitPlanEntryFilter_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>VisitPlanEntryFilter_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <filterable v="false" />
diff --git a/neonView/VisitRecommendationEdit_view/VisitRecommendationEdit_view.aod b/neonView/VisitRecommendationEdit_view/VisitRecommendationEdit_view.aod
index d58550498e1..1c9a8ce3e80 100644
--- a/neonView/VisitRecommendationEdit_view/VisitRecommendationEdit_view.aod
+++ b/neonView/VisitRecommendationEdit_view/VisitRecommendationEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>VisitRecommendationEdit_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <size>SMALL</size>
diff --git a/neonView/VisitRecommendationFilter_view/VisitRecommendationFilter_view.aod b/neonView/VisitRecommendationFilter_view/VisitRecommendationFilter_view.aod
index c841039215a..73cb8599d02 100644
--- a/neonView/VisitRecommendationFilter_view/VisitRecommendationFilter_view.aod
+++ b/neonView/VisitRecommendationFilter_view/VisitRecommendationFilter_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>VisitRecommendationFilter_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <filterable v="true" />
diff --git a/neonView/WorkflowDefinitionDiagram_view/WorkflowDefinitionDiagram_view.aod b/neonView/WorkflowDefinitionDiagram_view/WorkflowDefinitionDiagram_view.aod
index 2cc729ddd7c..397400ecf30 100644
--- a/neonView/WorkflowDefinitionDiagram_view/WorkflowDefinitionDiagram_view.aod
+++ b/neonView/WorkflowDefinitionDiagram_view/WorkflowDefinitionDiagram_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>WorkflowDefinitionDiagram_view</name>
   <title>Diagram</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/neonView/WorkflowDefinitionEdit_view/WorkflowDefinitionEdit_view.aod b/neonView/WorkflowDefinitionEdit_view/WorkflowDefinitionEdit_view.aod
index d0aaeebbaa3..aaaeeeef4d9 100644
--- a/neonView/WorkflowDefinitionEdit_view/WorkflowDefinitionEdit_view.aod
+++ b/neonView/WorkflowDefinitionEdit_view/WorkflowDefinitionEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>WorkflowDefinitionEdit_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <size>SMALL</size>
diff --git a/neonView/WorkflowDefinitionFilter_view/WorkflowDefinitionFilter_view.aod b/neonView/WorkflowDefinitionFilter_view/WorkflowDefinitionFilter_view.aod
index 41ffef96290..1dbcd14a3d2 100644
--- a/neonView/WorkflowDefinitionFilter_view/WorkflowDefinitionFilter_view.aod
+++ b/neonView/WorkflowDefinitionFilter_view/WorkflowDefinitionFilter_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>WorkflowDefinitionFilter_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <filterable v="true" />
diff --git a/neonView/WorkflowDefinitionMain_view/WorkflowDefinitionMain_view.aod b/neonView/WorkflowDefinitionMain_view/WorkflowDefinitionMain_view.aod
index 29de742a06e..dcb755770f4 100644
--- a/neonView/WorkflowDefinitionMain_view/WorkflowDefinitionMain_view.aod
+++ b/neonView/WorkflowDefinitionMain_view/WorkflowDefinitionMain_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>WorkflowDefinitionMain_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/WorkflowDefinitionPreview_view/WorkflowDefinitionPreview_view.aod b/neonView/WorkflowDefinitionPreview_view/WorkflowDefinitionPreview_view.aod
index 7f955c56160..1a6d0acf0cf 100644
--- a/neonView/WorkflowDefinitionPreview_view/WorkflowDefinitionPreview_view.aod
+++ b/neonView/WorkflowDefinitionPreview_view/WorkflowDefinitionPreview_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>WorkflowDefinitionPreview_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/WorkflowInstanceDiagram_view/WorkflowInstanceDiagram_view.aod b/neonView/WorkflowInstanceDiagram_view/WorkflowInstanceDiagram_view.aod
index 98f6b692170..3098a8033b5 100644
--- a/neonView/WorkflowInstanceDiagram_view/WorkflowInstanceDiagram_view.aod
+++ b/neonView/WorkflowInstanceDiagram_view/WorkflowInstanceDiagram_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>WorkflowInstanceDiagram_view</name>
   <title>Diagram</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/neonView/WorkflowInstanceEdit_view/WorkflowInstanceEdit_view.aod b/neonView/WorkflowInstanceEdit_view/WorkflowInstanceEdit_view.aod
index 0d3e0c89b95..0f8aee6fc8c 100644
--- a/neonView/WorkflowInstanceEdit_view/WorkflowInstanceEdit_view.aod
+++ b/neonView/WorkflowInstanceEdit_view/WorkflowInstanceEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>WorkflowInstanceEdit_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <size>SMALL</size>
diff --git a/neonView/WorkflowInstanceFilter_view/WorkflowInstanceFilter_view.aod b/neonView/WorkflowInstanceFilter_view/WorkflowInstanceFilter_view.aod
index 4a851422779..fb3eb002014 100644
--- a/neonView/WorkflowInstanceFilter_view/WorkflowInstanceFilter_view.aod
+++ b/neonView/WorkflowInstanceFilter_view/WorkflowInstanceFilter_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>WorkflowInstanceFilter_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <filterable v="true" />
diff --git a/neonView/WorkflowInstanceHistoryFilter_view/WorkflowInstanceHistoryFilter_view.aod b/neonView/WorkflowInstanceHistoryFilter_view/WorkflowInstanceHistoryFilter_view.aod
index ff969c13fd5..b823e304090 100644
--- a/neonView/WorkflowInstanceHistoryFilter_view/WorkflowInstanceHistoryFilter_view.aod
+++ b/neonView/WorkflowInstanceHistoryFilter_view/WorkflowInstanceHistoryFilter_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>WorkflowInstanceHistoryFilter_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <filterable v="true" />
diff --git a/neonView/WorkflowInstanceMain_view/WorkflowInstanceMain_view.aod b/neonView/WorkflowInstanceMain_view/WorkflowInstanceMain_view.aod
index 0511dbbb5dc..238558d5d61 100644
--- a/neonView/WorkflowInstanceMain_view/WorkflowInstanceMain_view.aod
+++ b/neonView/WorkflowInstanceMain_view/WorkflowInstanceMain_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>WorkflowInstanceMain_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/WorkflowInstancePreview_view/WorkflowInstancePreview_view.aod b/neonView/WorkflowInstancePreview_view/WorkflowInstancePreview_view.aod
index 6e02ae567d1..dfe0c117d85 100644
--- a/neonView/WorkflowInstancePreview_view/WorkflowInstancePreview_view.aod
+++ b/neonView/WorkflowInstancePreview_view/WorkflowInstancePreview_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>WorkflowInstancePreview_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <size>SMALL</size>
diff --git a/neonView/WorkflowInstanceTasks_view/WorkflowInstanceTasks_view.aod b/neonView/WorkflowInstanceTasks_view/WorkflowInstanceTasks_view.aod
index 9755c12f76b..29da6b3f7d6 100644
--- a/neonView/WorkflowInstanceTasks_view/WorkflowInstanceTasks_view.aod
+++ b/neonView/WorkflowInstanceTasks_view/WorkflowInstanceTasks_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>WorkflowInstanceTasks_view</name>
   <title>Tasks</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/neonView/WorkflowLauncherEdit_view/WorkflowLauncherEdit_view.aod b/neonView/WorkflowLauncherEdit_view/WorkflowLauncherEdit_view.aod
index 8445a151ff6..db773e993fd 100644
--- a/neonView/WorkflowLauncherEdit_view/WorkflowLauncherEdit_view.aod
+++ b/neonView/WorkflowLauncherEdit_view/WorkflowLauncherEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>WorkflowLauncherEdit_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <size>SMALL</size>
diff --git a/neonView/WorkflowModelEdit_view/WorkflowModelEdit_view.aod b/neonView/WorkflowModelEdit_view/WorkflowModelEdit_view.aod
index b03c3813ded..9d0b6b9271e 100644
--- a/neonView/WorkflowModelEdit_view/WorkflowModelEdit_view.aod
+++ b/neonView/WorkflowModelEdit_view/WorkflowModelEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>WorkflowModelEdit_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <size>SMALL</size>
diff --git a/neonView/WorkflowModelLookup_view/WorkflowModelLookup_view.aod b/neonView/WorkflowModelLookup_view/WorkflowModelLookup_view.aod
index 051bb98fe84..cabc52d8e48 100644
--- a/neonView/WorkflowModelLookup_view/WorkflowModelLookup_view.aod
+++ b/neonView/WorkflowModelLookup_view/WorkflowModelLookup_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>WorkflowModelLookup_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/WorkflowSignalEdit_view/WorkflowSignalEdit_view.aod b/neonView/WorkflowSignalEdit_view/WorkflowSignalEdit_view.aod
index 43ae5938052..443eeb0d5e4 100644
--- a/neonView/WorkflowSignalEdit_view/WorkflowSignalEdit_view.aod
+++ b/neonView/WorkflowSignalEdit_view/WorkflowSignalEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>WorkflowSignalEdit_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <size>SMALL</size>
diff --git a/neonView/WorkflowSignalFilter_view/WorkflowSignalFilter_view.aod b/neonView/WorkflowSignalFilter_view/WorkflowSignalFilter_view.aod
index 3bfbce1fac8..e0fe81e1c76 100644
--- a/neonView/WorkflowSignalFilter_view/WorkflowSignalFilter_view.aod
+++ b/neonView/WorkflowSignalFilter_view/WorkflowSignalFilter_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>WorkflowSignalFilter_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <filterable v="true" />
diff --git a/neonView/WorkflowSignalPreview_view/WorkflowSignalPreview_view.aod b/neonView/WorkflowSignalPreview_view/WorkflowSignalPreview_view.aod
index fa81d16b1e2..1ab2d17c652 100644
--- a/neonView/WorkflowSignalPreview_view/WorkflowSignalPreview_view.aod
+++ b/neonView/WorkflowSignalPreview_view/WorkflowSignalPreview_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>WorkflowSignalPreview_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/WorkflowStartConfigFilter_view/WorkflowStartConfigFilter_view.aod b/neonView/WorkflowStartConfigFilter_view/WorkflowStartConfigFilter_view.aod
index cdac1faccf7..6bfaae55e6c 100644
--- a/neonView/WorkflowStartConfigFilter_view/WorkflowStartConfigFilter_view.aod
+++ b/neonView/WorkflowStartConfigFilter_view/WorkflowStartConfigFilter_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>WorkflowStartConfigFilter_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/WorkflowTaskDrawer_view/WorkflowTaskDrawer_view.aod b/neonView/WorkflowTaskDrawer_view/WorkflowTaskDrawer_view.aod
index 7d975c492d0..5f2d8f1a150 100644
--- a/neonView/WorkflowTaskDrawer_view/WorkflowTaskDrawer_view.aod
+++ b/neonView/WorkflowTaskDrawer_view/WorkflowTaskDrawer_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>WorkflowTaskDrawer_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/WorkflowTaskFilter_view/WorkflowTaskFilter_view.aod b/neonView/WorkflowTaskFilter_view/WorkflowTaskFilter_view.aod
index e767b57ecab..2165a6d4bec 100644
--- a/neonView/WorkflowTaskFilter_view/WorkflowTaskFilter_view.aod
+++ b/neonView/WorkflowTaskFilter_view/WorkflowTaskFilter_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>WorkflowTaskFilter_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <filterable v="true" />
diff --git a/neonView/WorkflowTaskFinishedDrawer_view/WorkflowTaskFinishedDrawer_view.aod b/neonView/WorkflowTaskFinishedDrawer_view/WorkflowTaskFinishedDrawer_view.aod
index f2147948b2e..f14afb6e132 100644
--- a/neonView/WorkflowTaskFinishedDrawer_view/WorkflowTaskFinishedDrawer_view.aod
+++ b/neonView/WorkflowTaskFinishedDrawer_view/WorkflowTaskFinishedDrawer_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>WorkflowTaskFinishedDrawer_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/WorkflowTaskFinishedList_view/WorkflowTaskFinishedList_view.aod b/neonView/WorkflowTaskFinishedList_view/WorkflowTaskFinishedList_view.aod
index 7cb5d6287d7..babb19cdf09 100644
--- a/neonView/WorkflowTaskFinishedList_view/WorkflowTaskFinishedList_view.aod
+++ b/neonView/WorkflowTaskFinishedList_view/WorkflowTaskFinishedList_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>WorkflowTaskFinishedList_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/WorkflowTaskForm_view/WorkflowTaskForm_view.aod b/neonView/WorkflowTaskForm_view/WorkflowTaskForm_view.aod
index e25ada40292..956ea0c55e6 100644
--- a/neonView/WorkflowTaskForm_view/WorkflowTaskForm_view.aod
+++ b/neonView/WorkflowTaskForm_view/WorkflowTaskForm_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>WorkflowTaskForm_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <size>SMALL</size>
diff --git a/neonView/WorkflowTaskList_view/WorkflowTaskList_view.aod b/neonView/WorkflowTaskList_view/WorkflowTaskList_view.aod
index f58afc252c8..3f84a4ee800 100644
--- a/neonView/WorkflowTaskList_view/WorkflowTaskList_view.aod
+++ b/neonView/WorkflowTaskList_view/WorkflowTaskList_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>WorkflowTaskList_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/WorkflowTaskOwn_view/WorkflowTaskOwn_view.aod b/neonView/WorkflowTaskOwn_view/WorkflowTaskOwn_view.aod
index a6c4dbff4e5..1c914a6a6fe 100644
--- a/neonView/WorkflowTaskOwn_view/WorkflowTaskOwn_view.aod
+++ b/neonView/WorkflowTaskOwn_view/WorkflowTaskOwn_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>WorkflowTaskOwn_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <filterable v="true" />
diff --git a/neonView/WorkflowTaskPreview_view/WorkflowTaskPreview_view.aod b/neonView/WorkflowTaskPreview_view/WorkflowTaskPreview_view.aod
index bf61df8ebf5..d6e7dc40366 100644
--- a/neonView/WorkflowTaskPreview_view/WorkflowTaskPreview_view.aod
+++ b/neonView/WorkflowTaskPreview_view/WorkflowTaskPreview_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>WorkflowTaskPreview_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <size>SMALL</size>
diff --git a/neonView/WorkflowVariableValueFilter_view/WorkflowVariableValueFilter_view.aod b/neonView/WorkflowVariableValueFilter_view/WorkflowVariableValueFilter_view.aod
index 6de8d6e623e..be4b8f4662f 100644
--- a/neonView/WorkflowVariableValueFilter_view/WorkflowVariableValueFilter_view.aod
+++ b/neonView/WorkflowVariableValueFilter_view/WorkflowVariableValueFilter_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>WorkflowVariableValueFilter_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
-- 
GitLab


From f391596037cb4de7a0af7acfcc29bd41d09bb85e Mon Sep 17 00:00:00 2001
From: "s.pongratz" <s.pongratz@adito.de>
Date: Tue, 17 Nov 2020 10:28:47 +0100
Subject: [PATCH 087/184] Library Dependency

---
 process/Dependency_lib/Dependency_lib.aod |  9 +++
 process/Dependency_lib/process.js         | 72 +++++++++++++++++++++++
 2 files changed, 81 insertions(+)
 create mode 100644 process/Dependency_lib/Dependency_lib.aod
 create mode 100644 process/Dependency_lib/process.js

diff --git a/process/Dependency_lib/Dependency_lib.aod b/process/Dependency_lib/Dependency_lib.aod
new file mode 100644
index 00000000000..3475b073c30
--- /dev/null
+++ b/process/Dependency_lib/Dependency_lib.aod
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+  <name>Dependency_lib</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <process>%aditoprj%/process/Dependency_lib/process.js</process>
+  <variants>
+    <element>LIBRARY</element>
+  </variants>
+</process>
diff --git a/process/Dependency_lib/process.js b/process/Dependency_lib/process.js
new file mode 100644
index 00000000000..d654f2f4667
--- /dev/null
+++ b/process/Dependency_lib/process.js
@@ -0,0 +1,72 @@
+
+function Dependency(){}
+
+/**
+ * This function is the template for the getUIDsfn-Function in the Dependency.mapping
+ */
+Dependency.templateFunction = function (pTableField) {
+    return function (pRowData, pChangedData) {
+        let res = [];
+        if (pRowData[pTableField])
+            res.push(pRowData[pTableField])
+        if (pChangedData[pTableField] && pChangedData[pTableField] != pRowData[pTableField])
+            res.push(pChangedData[pTableField])
+        return res;
+    }
+}
+
+/**
+ * Returns the Mapping of the Dependencies.
+ * 
+ * The mapping is structured as follows: <br>
+ *  
+ * @example { "Entity_entity" : { "Dependency_entity": { "getUIDsfn" : fucntion (pRowData, pChangedData) {return //the IDs of the EntityField } } } }
+ * 
+ * @return {Object}
+ */
+Dependency.mapping = function ()
+{
+    return {
+        "Address_entity": {
+            "Organisation_entity" : {
+                "getUIDsfn" : function (pRowData, pChangedData) {
+                    var tableField = "ADDRESS.CONTACT_ID";
+                    var res = [];
+                    if (pRowData[tableField])
+                        res.push(pRowData[tableField])
+                    if (pChangedData[tableField] && pChangedData[tableField] != pRowData[tableField])
+                        res.push(pChangedData[tableField])
+                    return res;
+                }
+            }
+        }
+    };
+};
+
+/**
+ * Returns the dependencies on the entity
+ * 
+ * @param {String} [pEntity] the name of the entity
+ * @return {String[]} the founded Dependencies. If no one is found, you get an empty Array
+ */
+Dependency.getDependency = function (pEntity) {
+    if (Dependency.mapping()[pEntity]) 
+    {
+        return Object.keys(Dependency.mapping()[pEntity]);
+    }
+    
+    
+    return [];
+};
+
+/**
+ * Returns the dependencies that this entity has on others
+ * 
+ * @param {String} [pEntity] the name of the entity
+ * @return {String[]} the founded Dependencies. If no one is found, you get an empty Array
+ */
+Dependency.getReverseDependency = function (pEntity) {
+    return Object.keys(Dependency.mapping()).filter(function (key) {
+        return Dependency.mapping()[key][pEntity];
+    });
+}
-- 
GitLab


From 2e8c6c4da04b2466448b00af343839f317994e76 Mon Sep 17 00:00:00 2001
From: "a.schindlbeck" <a.schindlbeck@adito.de>
Date: Mon, 16 Nov 2020 15:13:16 +0100
Subject: [PATCH 088/184] #1068648 Notifications: deleteContentIfOrphan
 param-change

---
 entity/Notification_entity/recordcontainers/db/onDBDelete.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/entity/Notification_entity/recordcontainers/db/onDBDelete.js b/entity/Notification_entity/recordcontainers/db/onDBDelete.js
index 54618e0f773..633f720b18b 100644
--- a/entity/Notification_entity/recordcontainers/db/onDBDelete.js
+++ b/entity/Notification_entity/recordcontainers/db/onDBDelete.js
@@ -4,4 +4,4 @@ import("system.notification");
 // Deletes notificationContents from its table, if there are no user notification left
 // Only AppointmentContents need to stay, because they would appear again after every deletion.
 if(vars.get("$field.TYPECODE") != "_____SYSTEM_NOTIFICATION_APPOINTMENT")
-    notification.deleteContentIfOrphan(vars.get("$field.ID"), vars.get("$field.CONTENTID"));
\ No newline at end of file
+    notification.deleteContentIfOrphan([vars.get("$field.CONTENTID")]);
\ No newline at end of file
-- 
GitLab


From ba5025314a3d150f24033cab49ca2fec129f356a Mon Sep 17 00:00:00 2001
From: Sebastian Pongratz <s.pongratz@adito.de>
Date: Tue, 17 Nov 2020 14:19:10 +0000
Subject: [PATCH 089/184] #1065924 conversion rate

---
 .../SalesprojectConversionRate_entity.aod     |   7 +-
 .../displayValueProcess.js                    |   8 -
 .../recordcontainers/jdito/contentProcess.js  | 117 +++---------
 .../recordcontainers/jdito/rowCountProcess.js |  65 +++++--
 process/Salesproject_lib/process.js           | 166 +++++++++++++++++-
 5 files changed, 240 insertions(+), 123 deletions(-)
 delete mode 100644 entity/SalesprojectConversionRate_entity/entityfields/ab_keyword_entryid_title/displayValueProcess.js

diff --git a/entity/SalesprojectConversionRate_entity/SalesprojectConversionRate_entity.aod b/entity/SalesprojectConversionRate_entity/SalesprojectConversionRate_entity.aod
index e7474ae27a8..2432f8fbbf7 100644
--- a/entity/SalesprojectConversionRate_entity/SalesprojectConversionRate_entity.aod
+++ b/entity/SalesprojectConversionRate_entity/SalesprojectConversionRate_entity.aod
@@ -18,7 +18,7 @@
     <entityField>
       <name>AB_KEYWORD_ENTRYID_TITLE</name>
       <title>Phase</title>
-      <displayValueProcess>%aditoprj%/entity/SalesprojectConversionRate_entity/entityfields/ab_keyword_entryid_title/displayValueProcess.js</displayValueProcess>
+      <groupable v="false" />
     </entityField>
     <entityActionField>
       <name>openSalesprojects</name>
@@ -76,6 +76,11 @@
           <name>AB_KEYWORD_ENTRYID_TITLE.value</name>
         </jDitoRecordFieldMapping>
       </recordFieldMappings>
+      <aggregateFieldMappings>
+        <jDitoRecordFieldMapping>
+          <name>conversionRate_aggregate.value</name>
+        </jDitoRecordFieldMapping>
+      </aggregateFieldMappings>
       <filterExtensions>
         <filterExtension>
           <name>Year</name>
diff --git a/entity/SalesprojectConversionRate_entity/entityfields/ab_keyword_entryid_title/displayValueProcess.js b/entity/SalesprojectConversionRate_entity/entityfields/ab_keyword_entryid_title/displayValueProcess.js
deleted file mode 100644
index dc763b0c615..00000000000
--- a/entity/SalesprojectConversionRate_entity/entityfields/ab_keyword_entryid_title/displayValueProcess.js
+++ /dev/null
@@ -1,8 +0,0 @@
-import("Keyword_lib");
-import("KeywordRegistry_basic");
-import("system.vars");
-import("system.translate");
-import("system.result");
-
-// It's important to translate twice, because there are Phase with an extra translation.
-result.string(KeywordUtils.getViewValue($KeywordRegistry.salesprojectPhase(), vars.get("$field.AB_KEYWORD_ENTRYID_TITLE")));
\ No newline at end of file
diff --git a/entity/SalesprojectConversionRate_entity/recordcontainers/jdito/contentProcess.js b/entity/SalesprojectConversionRate_entity/recordcontainers/jdito/contentProcess.js
index 2f3dad2864f..32a839f38d9 100644
--- a/entity/SalesprojectConversionRate_entity/recordcontainers/jdito/contentProcess.js
+++ b/entity/SalesprojectConversionRate_entity/recordcontainers/jdito/contentProcess.js
@@ -1,71 +1,49 @@
-import("JditoFilter_lib");
-import("Salesproject_lib");
-import("system.datetime");
-import("system.translate");
 import("system.result");
-import("system.vars");
+import("JditoFilter_lib");
 import("Sql_lib");
 import("KeywordRegistry_basic");
-import("system.neon");
+import("Salesproject_lib");
+import("system.vars");
 
-let sqlHelper = new SqlMaskingUtils();
 let filter = vars.get("$local.filters");
-let dateStartYear = sqlHelper.yearFromDate("SALESPROJECT_MILESTONE.DATE_START");
-let dateStartMonth = sqlHelper.monthFromDate("SALESPROJECT_MILESTONE.DATE_START");
-let isFirstPhase = true;
-let data = [];
+let gruppingFields = SalesprojectConversionRate.groupMapping(false);
+var filterPhasenIDs = [];
 
-    
-let  gruppingFields =  {
-    "AB_KEYWORD_ENTRYID_KEYID": ["AB_KEYWORD_ENTRY.KEYID", "AB_KEYWORD_ENTRY.TITLE", "AB_KEYWORD_ENTRY.SORTING"], 
-    "#EXTENSION.Year.Year#NUMBER" : [dateStartYear, dateStartYear, dateStartYear], 
-    "#EXTENSION.Month.Month#NUMBER" : [dateStartMonth, dateStartMonth, dateStartMonth]
-};
+var phasenManager = new SalesprojectConversionRate();
 
-let sql = new SqlBuilder()
+var sql = new SqlBuilder()
 .from("AB_KEYWORD_ENTRY")
 .where("AB_KEYWORD_ENTRY.CONTAINER", $KeywordRegistry.salesprojectPhase())
 .and("AB_KEYWORD_ENTRY.KEYID", $KeywordRegistry.salesprojectPhase$nego(), SqlBuilder.NOT_EQUAL());
 
 if (filter != null)
 {
-    if (JSON.stringify(filter).indexOf("AB_KEYWORD_ENTRYID_KEYID") > -1)
+    if (JSON.stringify(filter).indexOf("AB_KEYWORD_ENTRYID_KEYID") > -1 && vars.exists("$local.grouped"))
     {
-        let phasenFilter = filter.childs.filter(function (child) {
+        var phasenFilter = filter.childs.filter(function (child) {
             return (child.childs.filter(function (child) {
                 return child.name == "AB_KEYWORD_ENTRYID_KEYID";
             })).length > 0
-        })[0];
-        phasenFilter.operator = "OR";
-        let pre = newSelect("PRE.KEYID")
-            .from("AB_KEYWORD_ENTRY")
-            .join("AB_KEYWORD_ENTRY", "AB_KEYWORD_ENTRY.SORTING -1 = PRE.SORTING", "PRE")
-            .where("AB_KEYWORD_ENTRY.CONTAINER", $KeywordRegistry.salesprojectPhase())
-            .and(["AB_KEYWORD_ENTRY", "CONTAINER", "PRE"], $KeywordRegistry.salesprojectPhase())
-            .and("AB_KEYWORD_ENTRY.KEYID", phasenFilter.childs[0].value)
-            .cell()
-        if (pre != "") {
-            let temp = JSON.parse(JSON.stringify(phasenFilter.childs[0]));
-            temp.value = temp.key  = pre;
-            phasenFilter.childs.push(temp);
-            isFirstPhase = false;
-        }
+        });
+        
+        phasenFilter.forEach(function (pFilter) {
+            filterPhasenIDs = filterPhasenIDs.concat(pFilter.childs.map(function (child) { return child.key;}));
+            pFilter.childs = [];
+        });
     }
+    else 
+        filterPhasenIDs = null;
     
     let filterCondition = JditoFilterUtils.getSqlCondition(filter, "AB_KEYWORD_ENTRY", null, SalesprojectConversionRate.filterMapping(null));
     sql.andIfSet(filterCondition);
 }
 
-
-
 if (vars.exists("$local.grouped"))
 {
     let groupedfield = vars.get("$local.grouped");
     sql.join("SALESPROJECT_MILESTONE", newWhere("SALESPROJECT_MILESTONE.MILESTONEVALUE = AB_KEYWORD_ENTRY.KEYID"))
         // COUNT, ID, TITLE
-        .select(["COUNT(*)", gruppingFields[groupedfield][0], gruppingFields[groupedfield][1]])
-        .groupBy(["AB_KEYWORD_ENTRY.KEYID", "AB_KEYWORD_ENTRY.SORTING", gruppingFields[groupedfield][0], gruppingFields[groupedfield][1], gruppingFields[groupedfield][2]])
-        .orderBy([gruppingFields[groupedfield][2], "AB_KEYWORD_ENTRY.SORTING"]);
+        .select(["SALESPROJECT_MILESTONE.SALESPROJECT_ID", "SALESPROJECT_MILESTONE.MILESTONEVALUE", gruppingFields[groupedfield][0]]);
         
     if (filter != null)
     {
@@ -73,60 +51,11 @@ if (vars.exists("$local.grouped"))
         sql.andIfSet(filterCondition);
     }
     
-    let sqlData = sql.table();
-    let row = {
-        "id": "", 
-        "title": "",
-        "sumRate": 0.0, 
-        "sumCount": 0,
-        "count" : 0,
-        "getTitle": function (pGroupedField) {
-            if (pGroupedField == "#EXTENSION.Month.Month#NUMBER" )
-            {
-                // When convert the Number of the Month to the Month name it doesn't matter which Year is used, so here is the Year 2020 hard-coded.
-                let monthDate = new Date(2020, parseInt(this.title)-1);
-                return translate.text(datetime.toDate(monthDate.getTime(), "MMMM", "UTC"));
-            }
-            return translate.text(translate.text(this.title));
-        }
-    };
-    let pre = -1;
-    
-    for (let i = 0; i <= sqlData.length; i++){
-        if (i == sqlData.length || sqlData[i][1] != row.id) 
-        {
-            if (row.id != "")
-                data.push([row.sumCount + "", row.id, row.getTitle(groupedfield), row.sumRate / row.count]);
-            
-            if (i == sqlData.length)
-                break;
-            
-            row.id = sqlData[i][1];
-            row.title = sqlData[i][2];
-            row.sumRate = 0;
-            row.sumCount = 0;
-            row.count =  0;
-            
-            if (groupedfield != "AB_KEYWORD_ENTRYID_KEYID") {
-                pre = -1;
-            }
-        }
-        
-        if (pre != -1)
-            row.sumRate += (parseFloat(sqlData[i][0]) / pre);
-        
-        if (isFirstPhase || pre != -1)
-        {
-            row.count++;
-            row.sumCount += parseInt(sqlData[i][0]);
-        }
-            
-        
-        pre = parseFloat(sqlData[i][0]);
-        
-        
-    }
-    result.object(data);
+    sql.table().forEach(function (row) {
+        phasenManager.insertMilestone(row[0], row[1],groupedfield == "AB_KEYWORD_ENTRYID_KEYID" ? null :row[2] ); // TODO: Gruppingfield 
+    });
+
+    result.object(phasenManager.getConversionRates(filterPhasenIDs));
 } 
 else 
 {
diff --git a/entity/SalesprojectConversionRate_entity/recordcontainers/jdito/rowCountProcess.js b/entity/SalesprojectConversionRate_entity/recordcontainers/jdito/rowCountProcess.js
index 8615399a383..f30b4775d6c 100644
--- a/entity/SalesprojectConversionRate_entity/recordcontainers/jdito/rowCountProcess.js
+++ b/entity/SalesprojectConversionRate_entity/recordcontainers/jdito/rowCountProcess.js
@@ -1,32 +1,65 @@
-import("KeywordRegistry_basic");
-import("system.vars");
 import("system.result");
-import("Sql_lib");
 import("JditoFilter_lib");
+import("Sql_lib");
+import("KeywordRegistry_basic");
 import("Salesproject_lib");
+import("system.vars");
 
-var groupMapping = SalesprojectConversionRate.groupMapping(true);
-var phases = new SqlBuilder().select(["COUNT(*)"]).from("AB_KEYWORD_ENTRY")
-.join("SALESPROJECT_MILESTONE", "AB_KEYWORD_ENTRY.KEYID = SALESPROJECT_MILESTONE.MILESTONEVALUE")
+let filter = vars.get("$local.filters");
+let gruppingFields = SalesprojectConversionRate.groupMapping(false);
+var filterPhasenIDs = [];
+
+var phasenManager = new SalesprojectConversionRate();
+
+var sql = new SqlBuilder()
+.from("AB_KEYWORD_ENTRY")
 .where("AB_KEYWORD_ENTRY.CONTAINER", $KeywordRegistry.salesprojectPhase())
 .and("AB_KEYWORD_ENTRY.KEYID", $KeywordRegistry.salesprojectPhase$nego(), SqlBuilder.NOT_EQUAL());
 
-var filter = vars.get("$local.filters");
-
 if (filter != null)
 {
-    var filterCondition = JditoFilterUtils.getSqlCondition(vars.get("$local.filters"), "AB_KEYWORD_ENTRY", null, SalesprojectConversionRate.filterMapping("SALESPROJECT_MILESTONE.DATE_START", true));
-    phases.andIfSet(filterCondition);
+    if (JSON.stringify(filter).indexOf("AB_KEYWORD_ENTRYID_KEYID") > -1 && vars.exists("$local.grouped"))
+    {
+        var phasenFilter = filter.childs.filter(function (child) {
+            return (child.childs.filter(function (child) {
+                return child.name == "AB_KEYWORD_ENTRYID_KEYID";
+            })).length > 0
+        });
+        
+        phasenFilter.forEach(function (pFilter) {
+            filterPhasenIDs = filterPhasenIDs.concat(pFilter.childs.map(function (child) { return child.key;}));
+            pFilter.childs = [];
+        });
+    }
+    else 
+        filterPhasenIDs = null;
+    
+    let filterCondition = JditoFilterUtils.getSqlCondition(filter, "AB_KEYWORD_ENTRY", null, SalesprojectConversionRate.filterMapping(null));
+    sql.andIfSet(filterCondition);
 }
 
 if (vars.exists("$local.grouped"))
 {
-    var groupedfield = vars.get("$local.grouped")
-    phases.groupBy([groupMapping[groupedfield]]);
+    let groupedfield = vars.get("$local.grouped");
+    sql.join("SALESPROJECT_MILESTONE", newWhere("SALESPROJECT_MILESTONE.MILESTONEVALUE = AB_KEYWORD_ENTRY.KEYID"))
+        // COUNT, ID, TITLE
+        .select(["SALESPROJECT_MILESTONE.SALESPROJECT_ID", "SALESPROJECT_MILESTONE.MILESTONEVALUE", gruppingFields[groupedfield][0]]);
+        
+    if (filter != null)
+    {
+        filterCondition = JditoFilterUtils.getSqlCondition(filter, "SALESPROJECT_MILESTONE", null, SalesprojectConversionRate.filterMapping("SALESPROJECT_MILESTONE.DATE_START", false, "SALESPROJECT_MILESTONE"));
+        sql.andIfSet(filterCondition);
+    }
+    
+    sql.table().forEach(function (row) {
+        phasenManager.insertMilestone(row[0], row[1],groupedfield == "AB_KEYWORD_ENTRYID_KEYID" ? null :row[2] ); // TODO: Gruppingfield 
+    });
+
+    result.object(phasenManager.getConversionRates(filterPhasenIDs).length);
 } 
 else 
 {
-    phases.groupBy(["AB_KEYWORD_ENTRY.AB_KEYWORD_ENTRYID", "AB_KEYWORD_ENTRY.KEYID", "AB_KEYWORD_ENTRY.TITLE", "AB_KEYWORD_ENTRY.SORTING"]);
-}
-
-result.string(phases.arrayColumn().length);
\ No newline at end of file
+    sql.select(["AB_KEYWORD_ENTRY.AB_KEYWORD_ENTRYID", "AB_KEYWORD_ENTRY.KEYID", "AB_KEYWORD_ENTRY.TITLE"])
+        .orderBy("AB_KEYWORD_ENTRY.SORTING");
+    result.object(sql.table().length);
+}
\ No newline at end of file
diff --git a/process/Salesproject_lib/process.js b/process/Salesproject_lib/process.js
index 53974b08542..c88cd30a425 100644
--- a/process/Salesproject_lib/process.js
+++ b/process/Salesproject_lib/process.js
@@ -1,3 +1,6 @@
+import("system.datetime");
+import("system.logging");
+import("KeywordData_lib");
 import("Sql_lib");
 import("system.neon");
 import("system.vars");
@@ -156,7 +159,10 @@ Salesproject.updateSalesprojectPhase = function(pSalesprojectId, pPhase)
  * 
  * @class
  */
-function SalesprojectConversionRate() {}
+function SalesprojectConversionRate() {
+    this.MILESTONES = {};
+    this.isGrouping = null;
+}
 
 /**
  * Returns the Mapping of the Fields and FilterExtention for the grouping 
@@ -177,11 +183,11 @@ SalesprojectConversionRate.groupMapping = function (pRightOneTables)
         }
     }
     
-    let dateStartYear = sqlHelper.yearFromDate("DATA.DATE_START");
-    let dateStartMonth = sqlHelper.monthFromDate("DATA.DATE_START");
+    let dateStartYear = sqlHelper.yearFromDate("SALESPROJECT_MILESTONE.DATE_START");
+    let dateStartMonth = sqlHelper.monthFromDate("SALESPROJECT_MILESTONE.DATE_START");
     
     return {
-        "AB_KEYWORD_ENTRYID_KEYID": ["DATA.KEYID", "DATA.TITLE", "DATA.SORTING"], 
+        "AB_KEYWORD_ENTRYID_KEYID": ["AB_KEYWORD_ENTRY.KEYID", "AB_KEYWORD_ENTRY.TITLE", "AB_KEYWORD_ENTRY.SORTING"], 
         "#EXTENSION.Year.Year#NUMBER" : [dateStartYear, dateStartYear, dateStartYear], 
         "#EXTENSION.Month.Month#NUMBER" : [dateStartMonth, dateStartMonth, dateStartMonth]
     }
@@ -249,4 +255,156 @@ SalesprojectConversionRate.filterMapping = function(pField, pIsAll, pTable)
     
 }
 
+/**
+ * Returns the Phases Keywordkeys
+ * 
+ * @return {Array} Phases Keywordkeys
+ */
+SalesprojectConversionRate.prototype.PHASE = function () {
+    return KeywordData.getSimpleData($KeywordRegistry.salesprojectPhase()).map(function (r) {
+        return r[0];
+    });
+}
 
+/**
+ * Add Milestones to the Phases of the given Grouping. 
+ * The Milestone is adding to the given and overlying Phases.
+ * 
+ * @param {String} [pSalesprojectID] the ID of the Salesproject
+ * @param {String} [pPhase] the phase of the milestone
+ * @param {String} [pGrouping] the grouping Field
+ */
+SalesprojectConversionRate.prototype.insertMilestone = function (pSalesprojectID, pPhase, pGrouping) {
+    let logDetail = ["SALESPROJECT_MILESTONEID: " + pSalesprojectID, "PHASE: " + pPhase, "GROUPING: " + pGrouping]
+    let indexPhase = this.PHASE().indexOf(pPhase)
+    if (indexPhase > -1) {
+        let tempPhases;
+        if (pGrouping)
+        {
+            if ((!this.isGrouping) && this.isGrouping != null){
+                logging.log(translate.text("The grouping is not active, but there is one given!"), logging.ERROR, logDetail);
+                return;
+            }
+            if (!this.MILESTONES[pGrouping])
+                this.MILESTONES[pGrouping] = {};
+            this.isGrouping = true;
+            tempPhases = this.MILESTONES[pGrouping];
+        }
+        else if (this.isGrouping && this.isGrouping != null)
+        {
+            logging.log(translate.text("The grouping is active, but there is no one given!"), logging.ERROR, logDetail);
+            return;
+        }
+        else 
+        {
+            tempPhases = this.MILESTONES;
+            this.isGrouping = false;
+        }
+                
+            
+        if (!tempPhases[pPhase])
+        {
+            tempPhases[pPhase] = {};
+            tempPhases[pPhase].size = 0;
+        } 
+            
+        if (!tempPhases[pPhase][pSalesprojectID])
+        {
+            tempPhases[pPhase][pSalesprojectID] = true;
+            tempPhases[pPhase].size++;
+        }
+            
+        if (indexPhase - 1 != -1)
+            this.insertMilestone(pSalesprojectID, this.PHASE()[indexPhase - 1], pGrouping);
+    }
+    else 
+    {
+        logging.log(translate.withArguments("The given Phase \"%0\" can not be found.", [pPhase]), logging.ERROR, logDetail);
+    }
+}
+
+/**
+ * Calculates the Conversion Rate for evry grouping field
+ * 
+ * @param {Array} [pFilter] the ids of the phases, which has to be filtered
+ * 
+ */
+SalesprojectConversionRate.prototype.getConversionRates = function (pFilter) {
+    if (this.isGrouping == null)
+        logging.log(translate.text("You have to use the insertMilestone Function before."), logging.ERROR);
+    else if (this.isGrouping)
+    {
+        let groupingResults = [];
+        Object.keys(this.MILESTONES).forEach(function (grouping) {
+            let count = 0;
+            let sum = 0.0;
+            let sumMilestones = 0;
+            this._getConversionRatesofPhases(this.MILESTONES[grouping], pFilter).forEach(function (phase) {
+                sum += phase[3];
+                sumMilestones += phase[0]
+                count++;
+            }, this);
+            if (sumMilestones != 0)
+                groupingResults.push(["" + sumMilestones, grouping, this._getTitleOfKey(grouping, true), (sum / count)])
+        }, this);
+        return groupingResults
+    }
+    else
+    {
+        return this._getConversionRatesofPhases(this.MILESTONES, pFilter);
+    }
+    return [];
+}
+
+/**
+ * Calculates the Conversion Rate for the phases
+ * 
+ * @param {Array} [pPhases] the phases of the current grouping
+ * @param {Array} [pFilter] the ids of the phases, which has to be filtered
+ * 
+ */
+SalesprojectConversionRate.prototype._getConversionRatesofPhases = function (pPhases, pFilter) {
+    let results = [];
+    this._addToResult(pPhases[this.PHASE()[0]].size, this.PHASE()[0], -1,  results, pFilter);
+    for (let i = 1; i < Object.keys(pPhases).length ;i++)
+    {
+        this._addToResult(pPhases[this.PHASE()[i]].size, this.PHASE()[i], pPhases[this.PHASE()[i-1]].size,  results, pFilter);
+    }
+    return results;
+}
+    
+/**
+ * Adds the Values to the result array
+ * 
+ * @param {Array} [pCount] the count of the phase
+ * @param {Array} [pId] the id of the phase
+ * @param {Array} [pPreCount] the count of the previous phase
+ * @param {Array} [pResult] the array into which the data will be added
+ * @param {Array} [pFilter] the ids of the phases, which has to be filtered
+ */
+SalesprojectConversionRate.prototype._addToResult = function (pCount, pId, pPreCount, pResult, pFilter){
+    if ((pFilter && pFilter.indexOf(pId)> -1) || !pFilter)
+        // COUNT, ID, TITLE, CONVERSION_RATE
+        pResult.push([this.isGrouping ? pCount : ("" + pCount), pId, this._getTitleOfKey(pId), pPreCount == -1 ? 0 : (pCount /pPreCount)]);
+}
+   
+/**
+ * gets the title of the key
+ * @param {Array} [pKey] the key, which has to translate
+ * @param {Array} [pIsGrouping] is this title of a grouping
+ */
+SalesprojectConversionRate.prototype._getTitleOfKey = function (pKey, pIsGrouping) {
+    if (pIsGrouping)
+    {
+        if (pKey <= 12)
+        {
+            // When convert the Number of the Month to the Month name it doesn't matter which Year is used, so here is the Year 2020 hard-coded.
+            let monthDate = new Date(2020, parseInt(pKey)-1);
+            return translate.text(datetime.toDate(monthDate.getTime(), "MMMM", "UTC"));
+        }
+    }
+    else
+        return KeywordUtils.getViewValue($KeywordRegistry.salesprojectPhase(),pKey);
+        
+    return pKey;
+}
-- 
GitLab


From 9f2d827b8833dbfb7814e2647fff29bdfd01c34d Mon Sep 17 00:00:00 2001
From: Benjamin Ulrich <b.ulrich@adito.de>
Date: Tue, 17 Nov 2020 14:26:30 +0000
Subject: [PATCH 090/184] [Projekt: Entwicklung - xRM][TicketNr.:
 1061035][Serienmail - Testen - Fehler im Serverlog]

---
 language/_____LANGUAGE_de/_____LANGUAGE_de.aod | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/language/_____LANGUAGE_de/_____LANGUAGE_de.aod b/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
index ada3bee7bc8..a268f6441a2 100644
--- a/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
+++ b/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
@@ -4672,7 +4672,7 @@
     </entry>
     <entry>
       <key>the \"%0\" table is configured to get logged but this is the logging-stoarge itself and cannot be monitored</key>
-      <value>Die "% 0" -Tabelle ist so konfiguriert, dass sie protokolliert wird. Dies ist jedoch der Protokollierspeicher selbst und kann nicht überwacht werden</value>
+      <value>Die "%0" -Tabelle ist so konfiguriert, dass sie protokolliert wird. Dies ist jedoch der Protokollierspeicher selbst und kann nicht überwacht werden</value>
     </entry>
     <entry>
       <key>Attribute usage Id</key>
@@ -9720,7 +9720,7 @@ Bitte Datumseingabe prüfen</value>
     </entry>
     <entry>
       <key>Mailbridge failed: user '%0' is unknown, contact an administrator.</key>
-      <value>Mailbridge fehlgeschlagen: Benutzer '%0' ist unbekannt, kontaktieren sie einen Administrator.</value>
+      <value>Mailbridge fehlgeschlagen: Benutzer '%0' ist unbekannt, kontaktieren Sie einen Administrator.</value>
     </entry>
     <entry>
       <key>Count Chart</key>
-- 
GitLab


From edcc4ca7eeecd977671735f9ff8ae63fc5abbe7d Mon Sep 17 00:00:00 2001
From: Sebastian Listl <s.listl@adito.de>
Date: Tue, 17 Nov 2020 11:58:05 +0100
Subject: [PATCH 091/184] Marketing workflow enhancements

---
 .../Data_alias/basic/2020.2.2/changelog.xml   |  1 +
 .../insert_employeeCountAttribute.xml         | 21 ++++++++++++
 .../children/targets_param/valueProcess.js    | 34 ++++++++++++++++---
 .../launchworkflows/onActionProcess.js        |  5 ++-
 .../KnowledgeNewsFeed/KnowledgeNewsFeed.aod   |  3 --
 process/KnowledgeManagement_lib/process.js    |  2 ++
 .../SetAttribute_workflowService/process.js   |  3 +-
 .../serviceTaskParameterProcess.js            |  9 ++---
 8 files changed, 63 insertions(+), 15 deletions(-)
 create mode 100644 .liquibase/Data_alias/basic/2020.2.2/insert_employeeCountAttribute.xml

diff --git a/.liquibase/Data_alias/basic/2020.2.2/changelog.xml b/.liquibase/Data_alias/basic/2020.2.2/changelog.xml
index d2c30058760..91f02520130 100644
--- a/.liquibase/Data_alias/basic/2020.2.2/changelog.xml
+++ b/.liquibase/Data_alias/basic/2020.2.2/changelog.xml
@@ -3,4 +3,5 @@
                    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd">
     <include relativeToChangelogFile="true" file="insert_commMediumTitleKeywordAttribute.xml"/>
     <include relativeToChangelogFile="true" file="Knowledgemanagement/changelog_knowledgeManagement.xml"/>
+    <include relativeToChangelogFile="true" file="insert_employeeCountAttribute.xml"/>
 </databaseChangeLog>
diff --git a/.liquibase/Data_alias/basic/2020.2.2/insert_employeeCountAttribute.xml b/.liquibase/Data_alias/basic/2020.2.2/insert_employeeCountAttribute.xml
new file mode 100644
index 00000000000..f84d5e859c5
--- /dev/null
+++ b/.liquibase/Data_alias/basic/2020.2.2/insert_employeeCountAttribute.xml
@@ -0,0 +1,21 @@
+<?xml version="1.1" encoding="UTF-8" standalone="no"?>
+<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd">
+  <changeSet author="s.listl" id="59d2d137-086a-4c07-869a-72a2b24952d4">
+      <insert tableName="AB_ATTRIBUTE">
+          <column name="AB_ATTRIBUTEID" value="dd024883-c49e-4d09-85c8-829cf9c9c5e9"/>
+          <column name="ATTRIBUTE_PARENT_ID" value="e32cd923-3774-41c1-95d5-57b79e52e568"/>
+          <column name="ATTRIBUTE_ACTIVE" valueNumeric="1"/>
+          <column name="ATTRIBUTE_NAME" value="Employee count"/>
+          <column name="ATTRIBUTE_TYPE" value="NUMBER"/>
+          <column name="SORTING" valueNumeric="7"/>
+      </insert>
+      <insert tableName="AB_ATTRIBUTEUSAGE">
+          <column name="AB_ATTRIBUTEUSAGEID" value="8de717a1-9d64-44c9-b692-b350b0857d59"/>
+          <column name="AB_ATTRIBUTE_ID" value="dd024883-c49e-4d09-85c8-829cf9c9c5e9"/>
+          <column name="OBJECT_TYPE" value="Organisation"/>
+          <column name="MAX_COUNT" valueNumeric="1"/>
+      </insert>
+  </changeSet>
+</databaseChangeLog>
\ 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 cca5f0e8d7c..1bfc02a3f32 100644
--- a/entity/MarketingWorkflowLauncher_entity/entityfields/workflowlauncherintegration/children/targets_param/valueProcess.js
+++ b/entity/MarketingWorkflowLauncher_entity/entityfields/workflowlauncherintegration/children/targets_param/valueProcess.js
@@ -1,3 +1,4 @@
+import("Sql_lib");
 import("Util_lib");
 import("system.vars");
 import("system.result");
@@ -7,11 +8,36 @@ var context = vars.get("$param.ObjectType_param");
 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)
+var personContactIds = [];
+
+targets = FilterViewActionUtils.getUidsBySelectionOrFilter(context, targets, filter).map(function (target)
 {
-    if (Utils.isString(targetId))
-        return [targetId, context]; //todo: context dynamic (eg for participants)
-    return targetId;
+    if (Utils.isString(target))
+        target = [target, context];
+    if (target[1] == "Person")
+        personContactIds.push(target[0]);
+    return target;
 });
 
+if (personContactIds.length !== 0)
+{
+    var orgContactIds = newSelect(["anyContact.CONTACTID", "orgContact.CONTACTID"])
+        .from("CONTACT", "orgContact")
+        .join("CONTACT", "anyContact.ORGANISATION_ID = orgContact.ORGANISATION_ID and orgContact.PERSON_ID is null", "anyContact")
+        .where(["CONTACT", "CONTACTID", "anyContact"], personContactIds, SqlBuilder.IN())
+        .table();
+    var contactIdMap = new Map(orgContactIds);
+    targets.forEach(function ([targetId, targetContext, variables], i, allTargets)
+    {
+        if (contactIdMap.has(targetId))
+        {
+            if (!variables)
+                variables = {};
+            variables.attributeRowId = contactIdMap.get(targetId);
+            variables.attributeContext = "Organisation";
+            allTargets[i][2] = variables;
+        }
+    });
+}
+
 result.string(JSON.stringify(targets));
\ No newline at end of file
diff --git a/entity/WorkflowLauncher_entity/entityfields/launchworkflows/onActionProcess.js b/entity/WorkflowLauncher_entity/entityfields/launchworkflows/onActionProcess.js
index 7e0756271a9..71d4a69dc83 100644
--- a/entity/WorkflowLauncher_entity/entityfields/launchworkflows/onActionProcess.js
+++ b/entity/WorkflowLauncher_entity/entityfields/launchworkflows/onActionProcess.js
@@ -17,10 +17,9 @@ if (!Utils.isNullOrEmpty(startFormResult))
 
 targets.forEach(function ([targetId, targetContext, processVariables])
 {
-    /* Caution: If 'variables' is used, then 'processVariables' is only a reference to 'variables'. 
-       Currently that's fine, but keep it in mind when you change this code. */
     if (!processVariables)
-        processVariables = variables;
+        processVariables = {};
+    Object.assign(processVariables, variables);
     processVariables[WorkflowVariables.TARGET_ID()] = targetId;
     processVariables[WorkflowVariables.TARGET_CONTEXT()] = targetContext || context;
 
diff --git a/neonContext/KnowledgeNewsFeed/KnowledgeNewsFeed.aod b/neonContext/KnowledgeNewsFeed/KnowledgeNewsFeed.aod
index ecb8b248430..f9bc4fdec87 100644
--- a/neonContext/KnowledgeNewsFeed/KnowledgeNewsFeed.aod
+++ b/neonContext/KnowledgeNewsFeed/KnowledgeNewsFeed.aod
@@ -10,8 +10,5 @@
       <name>a6965156-ab52-4520-a3be-1351eacd863d</name>
       <view>KnowledgeNewsFeed_view</view>
     </neonViewReference>
-    <neonViewReference>
-      <name>e4604c82-a42f-47c6-a1d1-0f1d1727ee38</name>
-    </neonViewReference>
   </references>
 </neonContext>
diff --git a/process/KnowledgeManagement_lib/process.js b/process/KnowledgeManagement_lib/process.js
index 9ec7cfda580..5bbe53c0a84 100644
--- a/process/KnowledgeManagement_lib/process.js
+++ b/process/KnowledgeManagement_lib/process.js
@@ -327,6 +327,7 @@ KnowledgeManagementTagsController.getInstance = function(pId, pModel)
  *
  * @param {String} pIdValue, id of the new AttributeRelation typically read from $local.idvalue
  * @param {Array} pRowData, data of the new tag, typically read from $local.rowdata
+ * @param {Boolean} pFromUpdate
  *
  * @return {this}
  */
@@ -489,6 +490,7 @@ KnowledgeManagementTagsController.prototype.clearTags = function()
  * @param {String} pIdValue typically the $local.idvalue of the onInsert process, it is being used, if for some reason the entered tag is already existing.
  *                          then a new AttributeRelation is created instead of the tag.
  * @param {[][]} pData typically the $local.rowdata of the onInsert or onUpdate process
+ * @param {Boolean} pFromUpdate
  *
  * @return {String|null} returns the id of the new tag attribute or null, if it couldn't be created
  */
diff --git a/process/SetAttribute_workflowService/process.js b/process/SetAttribute_workflowService/process.js
index aebb4c992da..394ef054248 100644
--- a/process/SetAttribute_workflowService/process.js
+++ b/process/SetAttribute_workflowService/process.js
@@ -24,4 +24,5 @@ if (variables.attributeValueVariable)
         variables.attributeValue = attributeValue;
 }
 
-new AttributeRelationQuery(variables.targetId, attributeId, variables.targetContext).insertAttribute(variables.attributeValue);
\ No newline at end of file
+new AttributeRelationQuery(variables.attributeRowId || variables.targetId, attributeId, variables.attributeContext || variables.targetContext)
+    .insertAttribute(variables.attributeValue);
\ No newline at end of file
diff --git a/process/SetAttribute_workflowService/serviceTaskParameterProcess.js b/process/SetAttribute_workflowService/serviceTaskParameterProcess.js
index 97d40e0f704..443bc0179a0 100644
--- a/process/SetAttribute_workflowService/serviceTaskParameterProcess.js
+++ b/process/SetAttribute_workflowService/serviceTaskParameterProcess.js
@@ -17,12 +17,13 @@ var currentValues = JSON.parse(vars.get("$local.value"));
 var allAttributes = newSelect("AB_ATTRIBUTEID, ATTRIBUTE_PARENT_ID, ATTRIBUTE_NAME, ATTRIBUTE_TYPE, ATTRIBUTE_ACTIVE")
     .from("AB_ATTRIBUTE")
     .where("AB_ATTRIBUTE.ATTRIBUTE_TYPE", AttributeTypes.OBJECTSELECTION(), SqlBuilder.NOT_EQUAL()) //these can't work yet
+    .orderBy(["ATTRIBUTE_PARENT_ID", "SORTING", "ATTRIBUTE_NAME"])
     .table();
-var attributeNameMap = {};
+var attributeNameMap = new Map();
 var attributes = [];
 allAttributes.forEach(function ([attributeId, parentId, attributeName, attributeType, isActive])
 {
-    attributeNameMap[attributeId] = [translate.text(attributeName), parentId];
+    attributeNameMap.set(attributeId, [translate.text(attributeName), parentId]);
     if (isActive == "1" && attributeType != AttributeTypes.GROUP() && attributeType != AttributeTypes.COMBOVALUE())
         attributes.push(attributeId);
 });
@@ -32,9 +33,9 @@ attributes = attributes.map(function (attributeId)
     var fullName = "";
     //the loop will stop if an id comes up twice, because otherwise that could cause an infinite loop if the data is faulty
     var alreadyEncountered = new Set(); 
-    while (parentId && attributeNameMap[parentId] && !alreadyEncountered.has(parentId))
+    while (parentId && attributeNameMap.has(parentId) && !alreadyEncountered.has(parentId))
     {
-        var [currentName, currentParent] = attributeNameMap[parentId];
+        var [currentName, currentParent] = attributeNameMap.get(parentId);
         if (!fullName)
             fullName = currentName;
         else
-- 
GitLab


From e140a8e4e5abda469be32cf6d01c9b109ca4c364 Mon Sep 17 00:00:00 2001
From: Sebastian Listl <s.listl@adito.de>
Date: Tue, 17 Nov 2020 17:09:22 +0100
Subject: [PATCH 092/184] Workflow signal webservice

---
 process/workflowSignal_rest/process.js        | 23 +++++++++++++++++++
 .../workflowSignal_rest.aod                   | 13 +++++++++++
 2 files changed, 36 insertions(+)
 create mode 100644 process/workflowSignal_rest/process.js
 create mode 100644 process/workflowSignal_rest/workflowSignal_rest.aod

diff --git a/process/workflowSignal_rest/process.js b/process/workflowSignal_rest/process.js
new file mode 100644
index 00000000000..83fe2b22065
--- /dev/null
+++ b/process/workflowSignal_rest/process.js
@@ -0,0 +1,23 @@
+import("Workflow_lib");
+import("system.workflow");
+import("system.util");
+
+function restpost (pRequest)
+{
+    var request = JSON.parse(pRequest);
+    
+    var signalObj = JSON.parse(util.decodeBase64String(request.body));
+    if (signalObj && signalObj.signal && WorkflowUtils.engineIsEnabled())
+    {
+        var signal = signalObj.signal;
+        var processInstanceId = signalObj.processInstanceId || null;
+        var variables = signalObj.variables || {};
+        
+        workflow.signalEventReceived(signal, variables, processInstanceId);
+        
+        request.response.statuscode = 200;
+        request.response.body = JSON.stringify(signalObj);
+    }
+    
+    return JSON.stringify(request);
+}
\ No newline at end of file
diff --git a/process/workflowSignal_rest/workflowSignal_rest.aod b/process/workflowSignal_rest/workflowSignal_rest.aod
new file mode 100644
index 00000000000..3006dce1189
--- /dev/null
+++ b/process/workflowSignal_rest/workflowSignal_rest.aod
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+  <name>workflowSignal_rest</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <process>%aditoprj%/process/workflowSignal_rest/process.js</process>
+  <publishAsWebservice v="true" />
+  <style>REST</style>
+  <restAcceptedMimeType>application/json</restAcceptedMimeType>
+  <restDeliveredMimeType>application/json</restDeliveredMimeType>
+  <variants>
+    <element>EXECUTABLE</element>
+  </variants>
+</process>
-- 
GitLab


From 9a0d526c93bf556047eda1c3f277e9bd75e62448 Mon Sep 17 00:00:00 2001
From: Sebastian Pongratz <s.pongratz@adito.de>
Date: Wed, 18 Nov 2020 11:57:06 +0000
Subject: [PATCH 093/184] Dependency_WorkflowExtentions

---
 process/Context_lib/process.js                |  21 +++
 process/Dependency_lib/process.js             |  39 +++-
 process/Workflow_lib/process.js               | 178 +++++++++++++++++-
 .../process.js                                |   0
 .../workflowExtension_serverProcess.aod       |   9 +
 5 files changed, 236 insertions(+), 11 deletions(-)
 create mode 100644 process/workflowExtension_serverProcess/process.js
 create mode 100644 process/workflowExtension_serverProcess/workflowExtension_serverProcess.aod

diff --git a/process/Context_lib/process.js b/process/Context_lib/process.js
index 7aa6dedab7b..5713843c844 100644
--- a/process/Context_lib/process.js
+++ b/process/Context_lib/process.js
@@ -86,6 +86,27 @@ ContextUtils.getEntity = function (pContextId)
     return project.getContextStructure(pContextId).entity;
 }
 
+/**
+ * Returns the context associated with the entity
+ * 
+ * @param {String} pEntity the name of the Entity
+ * @return {String} the context
+ */
+ContextUtils.getContextId = function (pEntity)
+{
+    if (!pEntity)
+        return null;
+    
+    let contexte = ContextUtils.getContexts(false, [], false);
+    
+    for (let i = 0; i < contexte.length; i++) {
+        if (ContextUtils.getEntity(contexte[i][0]) == pEntity)
+            return contexte[i][0];
+    }
+    return null;
+    
+}
+
 /**
  * Returns the title of the entity associated with the context
  * 
diff --git a/process/Dependency_lib/process.js b/process/Dependency_lib/process.js
index d654f2f4667..1f4e1267a8e 100644
--- a/process/Dependency_lib/process.js
+++ b/process/Dependency_lib/process.js
@@ -29,6 +29,9 @@ Dependency.mapping = function ()
     return {
         "Address_entity": {
             "Organisation_entity" : {
+                "options" : {
+                    "isObservable" : true
+                },
                 "getUIDsfn" : function (pRowData, pChangedData) {
                     var tableField = "ADDRESS.CONTACT_ID";
                     var res = [];
@@ -47,12 +50,26 @@ Dependency.mapping = function ()
  * Returns the dependencies on the entity
  * 
  * @param {String} [pEntity] the name of the entity
+ * @param {Object} [pOptionFilter] the Object must be handed over in the format: { "option" : true/false }
+ * 
+ * @example
+ * Dependency.getDependency("Organisation_entity", {"isObservable" : true });
+ * @example
+ * Dependency.getDependency("Organisation_entity", {}));
+ * @example
+ * Dependency.getDependency("Organisation_entity"));
+ * 
  * @return {String[]} the founded Dependencies. If no one is found, you get an empty Array
  */
-Dependency.getDependency = function (pEntity) {
+Dependency.getDependency = function (pEntity, pOptionFilter) {
     if (Dependency.mapping()[pEntity]) 
     {
-        return Object.keys(Dependency.mapping()[pEntity]);
+        return Object.keys(Dependency.mapping()[pEntity]).filter(function (key) {
+            return (!pOptionFilter || Object.keys(pOptionFilter).every(function (pOption) {
+                let option = Dependency.mapping()[pEntity][key]["options"][pOption]
+                return option && pOptionFilter[pOption] == option;
+            }));
+        });
     }
     
     
@@ -63,10 +80,24 @@ Dependency.getDependency = function (pEntity) {
  * Returns the dependencies that this entity has on others
  * 
  * @param {String} [pEntity] the name of the entity
+ * @param {Object} [pOptionFilter] the Object must be handed over in the format: { "option" : true/false }
+ * 
+ * @example
+ * Dependency.getReverseDependency("Organisation_entity", {"isObservable" : true });
+ * @example
+ * Dependency.getReverseDependency("Organisation_entity", {}));
+ * @example
+ * Dependency.getReverseDependency("Organisation_entity"));
+ * 
  * @return {String[]} the founded Dependencies. If no one is found, you get an empty Array
  */
-Dependency.getReverseDependency = function (pEntity) {
+Dependency.getReverseDependency = function (pEntity, pOptionFilter) {
     return Object.keys(Dependency.mapping()).filter(function (key) {
-        return Dependency.mapping()[key][pEntity];
+        return Dependency.mapping()[key][pEntity] && (!pOptionFilter || Object.keys(pOptionFilter).every(function (pOption){
+            let option = Dependency.mapping()[key][pEntity]["options"][pOption]
+            return option && pOptionFilter[pOption] == option;
+        }));
     });
 }
+
+
diff --git a/process/Workflow_lib/process.js b/process/Workflow_lib/process.js
index 38627a87e22..8e0cef19c1b 100644
--- a/process/Workflow_lib/process.js
+++ b/process/Workflow_lib/process.js
@@ -1,3 +1,4 @@
+import("Employee_lib");
 import("system.process");
 import("Util_lib");
 import("system.text");
@@ -46,18 +47,15 @@ WorkflowUtils.openNewInstance = function (pVariables, pTargetIds, pTargetContext
 {
     if ((!pTargetIds || pTargetIds.length === 0) && pSelectionFilter)
         pTargetIds = [];
-    else if (!pTargetIds)
-        pTargetIds = [WorkflowVariables.TARGET_ID.getDefaultValue()];
     if (!pVariables)
         pVariables = {};
     
     Object.assign(pVariables, WorkflowVariables.getTargetVariables(pTargetIds, pTargetContext));
     
     neon.openContext("WorkflowLauncher", "WorkflowLauncherEdit_view", null, neon.OPERATINGSTATE_VIEW, {
-        "ProcessVariables_param": JSON.stringify(pVariables),
-        "TargetContext_param": pVariables[WorkflowVariables.TARGET_CONTEXT()],
-        "TargetFilter_param": pSelectionFilter ? JSON.stringify(pSelectionFilter) : "",
-        "Targets_param": JSON.stringify(pTargetIds)
+        "ProcessVariables_param" : JSON.stringify(pVariables),
+        "TargetContext_param" : pVariables[WorkflowVariables.TARGET_CONTEXT()],
+        "TargetFilter_param" : pSelectionFilter ? JSON.stringify(pSelectionFilter) : ""
     });
 }
 
@@ -176,7 +174,19 @@ WorkflowSignalSender.deleted = function (pVariables, pTargetId, pTargetContext)
  */
 WorkflowSignalSender.eventHappened = function (pEvent, pTargetId, pTargetContext, pVariables)
 {
-    var variables = WorkflowVariables.getTargetVariables(pTargetId, pTargetContext);
+    let temp = {};
+    temp[ WorkflowVariables.TARGET_CONTEXT()] = pTargetContext;
+    temp[WorkflowVariables.TARGET_ID()] = pTargetId;
+    temp[WorkflowVariables.TRIGGER()] = pEvent;
+    let variables = WorkflowVariables.getAllVariablesValue(temp);
+    
+    var processConfig = process.createStartAsyncConfig().setName("workflowExtension_serverProcess")
+                                                        .setLocalVariables({"variablesWorkflow" : JSON.stringify(variables)})
+                                                        .setShowErrorDialog(true)
+                                                        .setUser(vars.get("sys.user"))
+                                                        .setThreadPriority(process.THREADPRIORITY_NORM)
+                                                        .setTimerType(process.TIMERTYPE_SERVER);
+    process.startAsync(processConfig);
     
     var signals = WorkflowSignalSender.getSignalConfig(variables[WorkflowVariables.TARGET_CONTEXT()], pEvent);
     signals.forEach(function (signal)
@@ -281,6 +291,160 @@ WorkflowVariables.TARGET_CONTEXT.getDefaultValue = function ()
     return ContextUtils.getCurrentContextId();
 }
 
+/**
+ * Returns the variable name for the rowdata
+ */
+WorkflowVariables.ROWDATA = function ()
+{
+    return "rowdata";
+}
+
+/**
+ * Returns the default value for the rowdata
+ */
+WorkflowVariables.ROWDATA.getDefaultValue = function ()
+{
+    return JSON.stringify(vars.get("$local.rowdata"));
+}
+
+/**
+ * Returns the variable name for the changed rows
+ */
+WorkflowVariables.CHANGED_ROWS = function ()
+{
+    return "changedRows";
+}
+
+/**
+ * Returns the default value for the changed rows
+ */
+WorkflowVariables.CHANGED_ROWS.getDefaultValue = function ()
+{
+    return JSON.stringify(vars.get("$local.changed"));
+}
+
+/**
+ * Returns the variable name for the event user
+ */
+WorkflowVariables.EVENT_USER = function ()
+{
+    return "eventUser";
+}
+
+/**
+ * Returns the default value for the event user
+ */
+WorkflowVariables.EVENT_USER.getDefaultValue = function ()
+{
+    return EmployeeUtils.getCurrentUserId();
+}
+
+/**
+ * Returns the variable name for the event time
+ */
+WorkflowVariables.EVENT_TIME = function ()
+{
+    return "eventTime";
+}
+
+/**
+ * Returns the default value for the event time
+ */
+WorkflowVariables.EVENT_TIME.getDefaultValue = function ()
+{
+    return vars.get("$sys.date");
+}
+
+/**
+ * Returns the variable name for the trigger
+ */
+WorkflowVariables.TRIGGER = function ()
+{
+    return "trigger";
+}
+
+/**
+ * Returns the default value for the trigger
+ */
+WorkflowVariables.TRIGGER.getDefaultValue = function ()
+{
+    return null;
+}
+
+/**
+ * Returns the variable name for the contenttitle
+ */
+WorkflowVariables.CONTENTTITLE = function ()
+{
+    return "contenttitle";
+}
+
+/**
+ * Returns the default value for the contenttitle
+ */
+WorkflowVariables.CONTENTTITLE.getDefaultValue = function ()
+{
+    return vars.get("$field.#CONTENTTITLE");
+}
+
+/**
+ * Returns an array of the WorkflowVariables
+ * 
+ * @return {Array} array containing the variables name
+ */
+WorkflowVariables.getAllVariablesName = function ()
+{
+    return [
+        WorkflowVariables.TARGET_CONTEXT(), 
+        WorkflowVariables.TARGET_ID()
+    ]
+}
+
+/**
+ * Returns an array of the Variables, which contains the variables name
+ * 
+ * @return {Array} array containing the variables
+ */
+WorkflowVariables.getAllVariables = function ()
+{
+    return [
+        "CHANGED_ROWS", 
+        "EVENT_TIME", 
+        "EVENT_USER", 
+        "ROWDATA", 
+        "TARGET_CONTEXT", 
+        "TARGET_ID",
+        "TRIGGER",
+        "CONTENTTITLE"
+    ]
+}
+
+/**
+ * Makes an object containing the variables
+ * 
+ * @param {Objcet} [pVariables] value for the variables, if not provided, the dafault value is used.
+ * The Object have to hand over in the following format:
+ * 
+ * {WorkflowVariable : value}
+ * 
+ * @return {Object} object containing the variables
+ */
+WorkflowVariables.getAllVariablesValue = function (pVariables)
+{
+    if (!pVariables) 
+        pVariables = {};
+    
+    let tempVariables = {};
+    WorkflowVariables.getAllVariables().forEach(function (v){
+        let tempName = WorkflowVariables[v]();
+        if (pVariables[tempName])
+            tempVariables[tempName] = pVariables[tempName]
+        else 
+            tempVariables[tempName] = WorkflowVariables[v].getDefaultValue();
+    });
+    return tempVariables;
+}
+
 /**
  * Makes an object containing the variables "targetId" and "targetContext"
  * 
diff --git a/process/workflowExtension_serverProcess/process.js b/process/workflowExtension_serverProcess/process.js
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/process/workflowExtension_serverProcess/workflowExtension_serverProcess.aod b/process/workflowExtension_serverProcess/workflowExtension_serverProcess.aod
new file mode 100644
index 00000000000..d9ed92e0f4d
--- /dev/null
+++ b/process/workflowExtension_serverProcess/workflowExtension_serverProcess.aod
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+  <name>workflowExtension_serverProcess</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <process>%aditoprj%/process/workflowExtension_serverProcess/process.js</process>
+  <variants>
+    <element>EXECUTABLE</element>
+  </variants>
+</process>
-- 
GitLab


From 35625cf1c3168f79f53ee55167233220f258bbf9 Mon Sep 17 00:00:00 2001
From: Sebastian Listl <s.listl@adito.de>
Date: Thu, 19 Nov 2020 11:02:04 +0100
Subject: [PATCH 094/184] Teams integration bugfixes, translations

---
 aliasDefinition/Data_alias/Data_alias.aod     | 184 ++++++++++++-
 .../importfromteams/onActionProcess.js        |   2 +-
 .../MSTTeamMember_entity.aod                  |  26 +-
 .../entityfields/azureid/valueProcess.js      |   1 +
 .../entityfields/azureupn/valueProcess.js     |   1 +
 .../entityfields/invite/mandatoryProcess.js   |   5 +
 .../entityfields/isextern/valueProcess.js     |  17 +-
 .../entityfields/role/mandatoryProcess.js     |   5 +
 entity/MSTTeamMember_entity/onValidation.js   |  21 --
 entity/MSTTeam_entity/MSTTeam_entity.aod      |  26 +-
 .../entityfields/teammembers/stateProcess.js  |   3 +-
 .../recordcontainers/jdito/onInsert.js        |  26 +-
 .../recordcontainers/jdito/onUpdate.js        |   9 +-
 .../MSTeamsActivityImport_entity.aod          |  41 ++-
 .../importmessages/onActionProcess.js         |   0
 .../recordcontainers/jdito/contentProcess.js  |   9 -
 .../MSTeamsMessage_entity.aod                 |   1 +
 entity/Member_entity/Member_entity.aod        |  21 +-
 .../onActionProcess.js                        |   0
 .../stateProcess.js                           |   0
 .../recordcontainers/jdito/contentProcess.js  |  63 +++--
 .../Salesproject_entity.aod                   | 254 +++++++++---------
 .../recordcontainers/db/onDBUpdate.js         |  25 +-
 .../_____LANGUAGE_EXTRA.aod                   |  90 +++++++
 .../_____LANGUAGE_de/_____LANGUAGE_de.aod     |  40 +++
 .../_____LANGUAGE_en/_____LANGUAGE_en.aod     |  90 +++++++
 .../MSTTeamEdit_view/MSTTeamEdit_view.aod     |   4 +-
 neonView/PersonEdit_view/PersonEdit_view.aod  |  19 --
 process/Employee_lib/process.js               |   2 +
 process/MSTeams_lib/process.js                |  65 ++++-
 process/Sql_lib/process.js                    |  12 +
 process/Util_lib/process.js                   |  44 ++-
 32 files changed, 813 insertions(+), 293 deletions(-)
 create mode 100644 entity/MSTTeamMember_entity/entityfields/azureid/valueProcess.js
 create mode 100644 entity/MSTTeamMember_entity/entityfields/azureupn/valueProcess.js
 create mode 100644 entity/MSTTeamMember_entity/entityfields/invite/mandatoryProcess.js
 create mode 100644 entity/MSTTeamMember_entity/entityfields/role/mandatoryProcess.js
 delete mode 100644 entity/MSTTeamMember_entity/onValidation.js
 create mode 100644 entity/MSTeamsActivityImport_entity/entityfields/importmessages/onActionProcess.js
 delete mode 100644 entity/MSTeamsActivityImport_entity/recordcontainers/jdito/contentProcess.js
 rename entity/Member_entity/entityfields/msteamsactiongroup/children/{changetomsteam => openmsteams}/onActionProcess.js (100%)
 rename entity/Member_entity/entityfields/msteamsactiongroup/children/{changetomsteam => openmsteams}/stateProcess.js (100%)

diff --git a/aliasDefinition/Data_alias/Data_alias.aod b/aliasDefinition/Data_alias/Data_alias.aod
index 0d1539bb13d..2b11aae7aa4 100644
--- a/aliasDefinition/Data_alias/Data_alias.aod
+++ b/aliasDefinition/Data_alias/Data_alias.aod
@@ -16128,7 +16128,7 @@
                 <name>PUBLISH</name>
                 <dbName></dbName>
                 <primaryKey v="false" />
-                <columnType v="1" />
+                <columnType v="12" />
                 <size v="36" />
                 <scale v="0" />
                 <notNull v="false" />
@@ -16261,7 +16261,7 @@
                 <name>TYPE</name>
                 <dbName></dbName>
                 <primaryKey v="false" />
-                <columnType v="1" />
+                <columnType v="12" />
                 <size v="36" />
                 <scale v="0" />
                 <notNull v="false" />
@@ -16751,6 +16751,186 @@
               </entityFieldDb>
             </entityFields>
           </entityDb>
+          <entityDb>
+            <name>MST_TEAMLINK</name>
+            <dbName></dbName>
+            <idColumn>MST_TEAMLINKID</idColumn>
+            <idGeneratorType v="0" />
+            <idGeneratorInterval v="1" />
+            <documentation></documentation>
+            <title></title>
+            <description></description>
+            <auditSyncConfig>
+              <name>auditSyncConfig</name>
+              <auditMode v="0" />
+              <syncActive v="false" />
+              <syncComplete v="true" />
+              <syncDirection v="1" />
+              <syncIds></syncIds>
+            </auditSyncConfig>
+            <entityFields>
+              <entityFieldDb>
+                <name>OBJECT_ROWID</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="1" />
+                <size v="36" />
+                <scale v="0" />
+                <notNull v="true" />
+                <isUnique v="false" />
+                <index v="true" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>MST_TEAM_ID</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="1" />
+                <size v="36" />
+                <scale v="0" />
+                <notNull v="true" />
+                <isUnique v="false" />
+                <index v="true" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>MST_TEAMLINKID</name>
+                <dbName></dbName>
+                <primaryKey v="true" />
+                <columnType v="1" />
+                <size v="36" />
+                <scale v="0" />
+                <notNull v="true" />
+                <isUnique v="true" />
+                <index v="true" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>OBJECT_TYPE</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="12" />
+                <size v="63" />
+                <scale v="0" />
+                <notNull v="true" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+            </entityFields>
+          </entityDb>
+          <entityDb>
+            <name>MST_TEAM</name>
+            <dbName></dbName>
+            <idColumn>MST_TEAMID</idColumn>
+            <idGeneratorType v="0" />
+            <idGeneratorInterval v="1" />
+            <documentation></documentation>
+            <title></title>
+            <description></description>
+            <auditSyncConfig>
+              <name>auditSyncConfig</name>
+              <auditMode v="0" />
+              <syncActive v="false" />
+              <syncComplete v="true" />
+              <syncDirection v="1" />
+              <syncIds></syncIds>
+            </auditSyncConfig>
+            <entityFields>
+              <entityFieldDb>
+                <name>MST_TEAMID</name>
+                <dbName></dbName>
+                <primaryKey v="true" />
+                <columnType v="1" />
+                <size v="36" />
+                <scale v="0" />
+                <notNull v="true" />
+                <isUnique v="true" />
+                <index v="true" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>IS_ARCHIVED</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="5" />
+                <size v="5" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>SERVICE_URL</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="12" />
+                <size v="255" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>TEAMNAME</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="12" />
+                <size v="255" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>GENERAL_CHANNELID</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="1" />
+                <size v="48" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>WEB_URL</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="12" />
+                <size v="500" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+            </entityFields>
+          </entityDb>
         </entities>
       </entityGroup>
     </aliasDefDb>
diff --git a/entity/Activity_entity/entityfields/msteamsactions/children/importfromteams/onActionProcess.js b/entity/Activity_entity/entityfields/msteamsactions/children/importfromteams/onActionProcess.js
index 781ff2f24f2..102768f5f8e 100644
--- a/entity/Activity_entity/entityfields/msteamsactions/children/importfromteams/onActionProcess.js
+++ b/entity/Activity_entity/entityfields/msteamsactions/children/importfromteams/onActionProcess.js
@@ -1,7 +1,7 @@
 import("system.vars");
 import("system.neon");
 
-neon.openContext("MSTeamsActivityImport", null, null, neon.OPERATINGSTATE_NEW, {
+neon.openContext("MSTeamsActivityImport", "MSTeamsActivityImportEdit_view", null, neon.OPERATINGSTATE_VIEW, {
     "ObjectRowId_param" : vars.get("$param.RowId_param"),
     "ObjectType_param": vars.get("$param.ObjectId_param")
 });
\ No newline at end of file
diff --git a/entity/MSTTeamMember_entity/MSTTeamMember_entity.aod b/entity/MSTTeamMember_entity/MSTTeamMember_entity.aod
index 4847be9300d..ec5ee48818d 100644
--- a/entity/MSTTeamMember_entity/MSTTeamMember_entity.aod
+++ b/entity/MSTTeamMember_entity/MSTTeamMember_entity.aod
@@ -3,8 +3,9 @@
   <name>MSTTeamMember_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <documentation>%aditoprj%/entity/MSTTeamMember_entity/documentation.adoc</documentation>
+  <title>Member</title>
   <siblings />
-  <onValidation>%aditoprj%/entity/MSTTeamMember_entity/onValidation.js</onValidation>
+  <titlePlural>Members</titlePlural>
   <recordContainer>jdito</recordContainer>
   <entityFields>
     <entityProvider>
@@ -23,6 +24,7 @@
       <title>Members</title>
       <consumer>ProjectMembers</consumer>
       <linkedContextProcess>%aditoprj%/entity/MSTTeamMember_entity/entityfields/contact_id/linkedContextProcess.js</linkedContextProcess>
+      <mandatory v="true" />
       <stateProcess>%aditoprj%/entity/MSTTeamMember_entity/entityfields/contact_id/stateProcess.js</stateProcess>
       <displayValueProcess>%aditoprj%/entity/MSTTeamMember_entity/entityfields/contact_id/displayValueProcess.js</displayValueProcess>
     </entityField>
@@ -39,11 +41,6 @@
     </entityParameter>
     <entityConsumer>
       <name>ProjectMembers</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Member_entity</entityName>
-        <fieldName>TeamMemberProvider</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ObjectRowId_param</name>
@@ -54,6 +51,11 @@
           <valueProcess>%aditoprj%/entity/MSTTeamMember_entity/entityfields/projectmembers/children/objecttype_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Member_entity</entityName>
+        <fieldName>TeamMemberProvider</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>ISEXTERN</name>
@@ -69,7 +71,6 @@
     <entityProvider>
       <name>MembersOfTeam</name>
       <documentation>%aditoprj%/entity/MSTTeamMember_entity/entityfields/membersofteam/documentation.adoc</documentation>
-      <titlePlural>Team members</titlePlural>
       <dependencies>
         <entityDependency>
           <name>37854fde-c4ae-4f56-82df-14385717f82e</name>
@@ -90,12 +91,15 @@
     <entityField>
       <name>ROLE</name>
       <title>Role</title>
+      <mandatory v="true" />
+      <mandatoryProcess>%aditoprj%/entity/MSTTeamMember_entity/entityfields/role/mandatoryProcess.js</mandatoryProcess>
       <dropDownProcess>%aditoprj%/entity/MSTTeamMember_entity/entityfields/role/dropDownProcess.js</dropDownProcess>
       <stateProcess>%aditoprj%/entity/MSTTeamMember_entity/entityfields/role/stateProcess.js</stateProcess>
     </entityField>
     <entityField>
       <name>INVITE</name>
       <title>Invitation</title>
+      <mandatoryProcess>%aditoprj%/entity/MSTTeamMember_entity/entityfields/invite/mandatoryProcess.js</mandatoryProcess>
       <dropDownProcess>%aditoprj%/entity/MSTTeamMember_entity/entityfields/invite/dropDownProcess.js</dropDownProcess>
       <stateProcess>%aditoprj%/entity/MSTTeamMember_entity/entityfields/invite/stateProcess.js</stateProcess>
     </entityField>
@@ -103,6 +107,14 @@
       <name>#PROVIDER_AGGREGATES</name>
       <useAggregates v="true" />
     </entityProvider>
+    <entityField>
+      <name>AZUREID</name>
+      <valueProcess>%aditoprj%/entity/MSTTeamMember_entity/entityfields/azureid/valueProcess.js</valueProcess>
+    </entityField>
+    <entityField>
+      <name>AZUREUPN</name>
+      <valueProcess>%aditoprj%/entity/MSTTeamMember_entity/entityfields/azureupn/valueProcess.js</valueProcess>
+    </entityField>
   </entityFields>
   <recordContainers>
     <jDitoRecordContainer>
diff --git a/entity/MSTTeamMember_entity/entityfields/azureid/valueProcess.js b/entity/MSTTeamMember_entity/entityfields/azureid/valueProcess.js
new file mode 100644
index 00000000000..a2578b0245c
--- /dev/null
+++ b/entity/MSTTeamMember_entity/entityfields/azureid/valueProcess.js
@@ -0,0 +1 @@
+//The value is set by ISEXTERN.valueProcess
\ No newline at end of file
diff --git a/entity/MSTTeamMember_entity/entityfields/azureupn/valueProcess.js b/entity/MSTTeamMember_entity/entityfields/azureupn/valueProcess.js
new file mode 100644
index 00000000000..a2578b0245c
--- /dev/null
+++ b/entity/MSTTeamMember_entity/entityfields/azureupn/valueProcess.js
@@ -0,0 +1 @@
+//The value is set by ISEXTERN.valueProcess
\ No newline at end of file
diff --git a/entity/MSTTeamMember_entity/entityfields/invite/mandatoryProcess.js b/entity/MSTTeamMember_entity/entityfields/invite/mandatoryProcess.js
new file mode 100644
index 00000000000..488ee5dc7e0
--- /dev/null
+++ b/entity/MSTTeamMember_entity/entityfields/invite/mandatoryProcess.js
@@ -0,0 +1,5 @@
+import("Util_lib");
+import("system.vars");
+import("system.result");
+
+result.string(Utils.toBoolean(vars.get("$field.ISEXTERN")));
\ No newline at end of file
diff --git a/entity/MSTTeamMember_entity/entityfields/isextern/valueProcess.js b/entity/MSTTeamMember_entity/entityfields/isextern/valueProcess.js
index bb888295a8a..79c7037eb74 100644
--- a/entity/MSTTeamMember_entity/entityfields/isextern/valueProcess.js
+++ b/entity/MSTTeamMember_entity/entityfields/isextern/valueProcess.js
@@ -1,7 +1,14 @@
-import("Employee_lib");
-import("system.vars");
 import("system.result");
+import("system.neon");
+import("system.tools");
+import("system.vars");
+import("Employee_lib");
+
+var contactId = vars.get("$field.CONTACT_ID");
+var user = EmployeeUtils.getUserByContactId(contactId);
+var azureId = user ? user[tools.PARAMS][tools.TEAMS_AZUREID] : "";
+var azureUpn = user ? user[tools.PARAMS][tools.TEAMS_AZUREUPN] : "";
 
-var member = vars.get("$field.CONTACT_ID");
-if (member)
-    result.string(!EmployeeUtils.isUser(member));
\ No newline at end of file
+neon.setFieldValue("$field.AZUREUPN", azureUpn);
+neon.setFieldValue("$field.AZUREID", azureId);
+result.string(!azureId && !azureUpn);
\ No newline at end of file
diff --git a/entity/MSTTeamMember_entity/entityfields/role/mandatoryProcess.js b/entity/MSTTeamMember_entity/entityfields/role/mandatoryProcess.js
new file mode 100644
index 00000000000..79bef7b2ca0
--- /dev/null
+++ b/entity/MSTTeamMember_entity/entityfields/role/mandatoryProcess.js
@@ -0,0 +1,5 @@
+import("Util_lib");
+import("system.vars");
+import("system.result");
+
+result.string(!Utils.toBoolean(vars.get("$field.ISEXTERN")));
\ No newline at end of file
diff --git a/entity/MSTTeamMember_entity/onValidation.js b/entity/MSTTeamMember_entity/onValidation.js
deleted file mode 100644
index 9db830c5c67..00000000000
--- a/entity/MSTTeamMember_entity/onValidation.js
+++ /dev/null
@@ -1,21 +0,0 @@
-import("system.translate");
-import("system.result");
-import("system.vars");
-
-var isExtern = vars.getString("$field.ISEXTERN") == "true";
-var res;
-
-if (vars.get("$field.CONTACT_ID"))
-{
-    if (isExtern && !vars.get("$field.INVITE"))
-    {
-        res = translate.withArguments("Required value for %0 is missing", [vars.get("$property.INVITE.title")]);
-    }
-    else if(!isExtern && !vars.get("$field.ROLE"))
-    {
-        res = translate.withArguments("Required value for %0 is missing", [vars.get("$property.ROLE.title")]);
-    }
-}
-
-if (res)
-    result.string(res);
\ No newline at end of file
diff --git a/entity/MSTTeam_entity/MSTTeam_entity.aod b/entity/MSTTeam_entity/MSTTeam_entity.aod
index 4d7a5ff463e..eb36ed85e05 100644
--- a/entity/MSTTeam_entity/MSTTeam_entity.aod
+++ b/entity/MSTTeam_entity/MSTTeam_entity.aod
@@ -19,6 +19,12 @@
           <fieldName>Teams</fieldName>
           <isConsumer v="false" />
         </entityDependency>
+        <entityDependency>
+          <name>9794baf5-ffc8-498e-8aa8-f4eca945441c</name>
+          <entityName>MSTTeamLink_entity</entityName>
+          <fieldName>Teams</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
       </dependencies>
     </entityProvider>
     <entityField>
@@ -49,11 +55,6 @@
       <name>TeamMembers</name>
       <stateProcess>%aditoprj%/entity/MSTTeam_entity/entityfields/teammembers/stateProcess.js</stateProcess>
       <onValidation>%aditoprj%/entity/MSTTeam_entity/entityfields/teammembers/onValidation.js</onValidation>
-      <dependency>
-        <name>dependency</name>
-        <entityName>MSTTeamMember_entity</entityName>
-        <fieldName>MembersOfTeam</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>MSTTeamId_param</name>
@@ -68,6 +69,11 @@
           <valueProcess>%aditoprj%/entity/MSTTeam_entity/entityfields/teammembers/children/objecttype_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>MSTTeamMember_entity</entityName>
+        <fieldName>MembersOfTeam</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>TEAMID_AND_NAME</name>
@@ -87,17 +93,17 @@
     </entityParameter>
     <entityConsumer>
       <name>Channels</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>MSTeamsChannel_entity</entityName>
-        <fieldName>ChannelsForTeam</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>TeamId_param</name>
           <valueProcess>%aditoprj%/entity/MSTTeam_entity/entityfields/channels/children/teamid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>MSTeamsChannel_entity</entityName>
+        <fieldName>ChannelsForTeam</fieldName>
+      </dependency>
     </entityConsumer>
     <entityProvider>
       <name>#PROVIDER_AGGREGATES</name>
diff --git a/entity/MSTTeam_entity/entityfields/teammembers/stateProcess.js b/entity/MSTTeam_entity/entityfields/teammembers/stateProcess.js
index 9f48c47fee7..1c53ca6a0df 100644
--- a/entity/MSTTeam_entity/entityfields/teammembers/stateProcess.js
+++ b/entity/MSTTeam_entity/entityfields/teammembers/stateProcess.js
@@ -1,5 +1,6 @@
+import("Util_lib");
 import("system.result");
 import("system.vars");
 import("system.neon");
 
-result.string(vars.get("$field.ISARCHIVED") == "true" ? neon.COMPONENTSTATE_INVISIBLE : neon.COMPONENTSTATE_EDITABLE);
\ No newline at end of file
+result.string(Utils.toBoolean(vars.get("$field.ISARCHIVED")) ? neon.COMPONENTSTATE_INVISIBLE : neon.COMPONENTSTATE_EDITABLE);
\ No newline at end of file
diff --git a/entity/MSTTeam_entity/recordcontainers/jdito/onInsert.js b/entity/MSTTeam_entity/recordcontainers/jdito/onInsert.js
index f7857c50dcc..1d73c7766db 100644
--- a/entity/MSTTeam_entity/recordcontainers/jdito/onInsert.js
+++ b/entity/MSTTeam_entity/recordcontainers/jdito/onInsert.js
@@ -1,3 +1,4 @@
+import("Util_lib");
 import("Communication_lib");
 import("Sql_lib");
 import("system.vars");
@@ -16,39 +17,36 @@ var internalMembers = [];
 var externalMembers = [];
 teamMembers.forEach(function (teamMember)
 {
-    var memberUser = EmployeeUtils.getUserByContactId(teamMember["CONTACT_ID"]);
-    if (!memberUser)
+    var contactId = teamMember["CONTACT_ID"];
+    var isExtern = Utils.toBoolean(teamMember["ISEXTERN"]);
+    var isInvite = Utils.toBoolean(teamMember["INVITE"]);
+    var isOwner = teamMember["ROLE"] == "owner";
+    var memberAzureId = teamMember["AZUREID"];
+    var memberUpn = teamMember["AZUREUPN"];
+    if (isExtern)
     {
-        var memberEmail = CommUtil.getStandardMail(teamMember["CONTACT_ID"]);
+        var memberEmail = CommUtil.getStandardMail(contactId);
         if (memberEmail)
         {
             externalMembers.push(
                 teams.createExternalUserConfig(memberEmail)
-                    .sendInvitation(teamMember["INVITE"] == "true")
+                    .sendInvitation(isInvite)
             );
         }
         return;
     }
-    var memberAzureId = memberUser[tools.PARAMS][tools.TEAMS_AZUREID];
-    var memberUpn = memberUser[tools.PARAMS][tools.TEAMS_AZUREUPN];
     if (!memberAzureId && memberUpn)
         memberAzureId = teams.getInternalAzureId(memberUpn);
     if (memberAzureId)
     {
-        if (teamMember["ROLE"] == "owner")
+        if (isOwner)
             ownerIds.push(memberAzureId);
         else
             internalMembers.push(teams.createInternalUserConfig(memberAzureId));
     }
 });
 
-//mailNickName = teamName in camel case
-var mailNickName = teamName.replace(/(?:^\w|[A-Z]|\b\w|\s+)/g, function(match, index) 
-{
-    if (+match === 0)  // or if (/\s+/.test(match)) for white spaces
-        return "";
-    return index === 0 ? match.toLowerCase() : match.toUpperCase();
-});
+var mailNickName = StringUtils.toLowerCamelCase(teamName);  //mailNickName = teamName in camel case
 mailNickName = mailNickName + vars.get("$param.SalesprojectCode_param");
 
 var groupConfig = teams.createGroupConfig(teamName, mailNickName, ownerIds);
diff --git a/entity/MSTTeam_entity/recordcontainers/jdito/onUpdate.js b/entity/MSTTeam_entity/recordcontainers/jdito/onUpdate.js
index f55e08ec25b..54e7ab9ab6b 100644
--- a/entity/MSTTeam_entity/recordcontainers/jdito/onUpdate.js
+++ b/entity/MSTTeam_entity/recordcontainers/jdito/onUpdate.js
@@ -15,7 +15,8 @@ var deletedTeamMembers = vars.get("$field.TeamMembers.deletedRows");
 
 var internalMembers = [];
 var externalMembers = [];
-insertedTeamMembers.forEach(function (teamMember){
+insertedTeamMembers.forEach(function (teamMember)
+{
     var memberUser = EmployeeUtils.getUserByContactId(teamMember["CONTACT_ID"]);
     if (!memberUser)
     {
@@ -40,15 +41,15 @@ if (internalMembers.length !== 0)
 if (externalMembers.length !== 0)
     teams.addExternalMembers(teamId, externalMembers);
 
-changedTeamMembers.forEach(function (teamMember){
+changedTeamMembers.forEach(function (teamMember)
+{
     var memberUser = EmployeeUtils.getUserByContactId(teamMember["CONTACT_ID"]);
     if (!memberUser)
-        return null;
+        return;
     
     var internalUserConfigToChange = _getTeamsInternalUserConfig(memberUser, teamMember["ROLE"] == "owner");
     if (internalUserConfigToChange)
         teams.changeRole(teamId, internalUserConfigToChange);
-    return null;//prevent designer warning
 });
 
 
diff --git a/entity/MSTeamsActivityImport_entity/MSTeamsActivityImport_entity.aod b/entity/MSTeamsActivityImport_entity/MSTeamsActivityImport_entity.aod
index 6a44b2a44c1..bab6f3794ca 100644
--- a/entity/MSTeamsActivityImport_entity/MSTeamsActivityImport_entity.aod
+++ b/entity/MSTeamsActivityImport_entity/MSTeamsActivityImport_entity.aod
@@ -4,22 +4,13 @@
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <documentation>%aditoprj%/entity/MSTeamsActivityImport_entity/documentation.adoc</documentation>
   <siblings />
-  <recordContainer>jdito</recordContainer>
   <entityFields>
     <entityProvider>
       <name>#PROVIDER</name>
     </entityProvider>
-    <entityField>
-      <name>UID</name>
-    </entityField>
     <entityConsumer>
       <name>Messages</name>
       <selectionMode>MULTI</selectionMode>
-      <dependency>
-        <name>dependency</name>
-        <entityName>MSTeamsMessage_entity</entityName>
-        <fieldName>Messages</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>Channel_param</name>
@@ -34,6 +25,11 @@
           <valueProcess>%aditoprj%/entity/MSTeamsActivityImport_entity/entityfields/messages/children/loadnext_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>MSTeamsMessage_entity</entityName>
+        <fieldName>Messages</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>CHANNEL_ID</name>
@@ -50,17 +46,17 @@
     </entityField>
     <entityConsumer>
       <name>Channels</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>MSTeamsChannel_entity</entityName>
-        <fieldName>ChannelsForTeam</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>TeamId_param</name>
           <valueProcess>%aditoprj%/entity/MSTeamsActivityImport_entity/entityfields/channels/children/teamid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>MSTeamsChannel_entity</entityName>
+        <fieldName>ChannelsForTeam</fieldName>
+      </dependency>
     </entityConsumer>
     <entityActionField>
       <name>loadNextMessages</name>
@@ -79,17 +75,14 @@
       <name>#PROVIDER_AGGREGATES</name>
       <useAggregates v="true" />
     </entityProvider>
+    <entityActionField>
+      <name>importMessages</name>
+      <onActionProcess>%aditoprj%/entity/MSTeamsActivityImport_entity/entityfields/importmessages/onActionProcess.js</onActionProcess>
+    </entityActionField>
   </entityFields>
   <recordContainers>
-    <jDitoRecordContainer>
-      <name>jdito</name>
-      <jDitoRecordAlias>Data_alias</jDitoRecordAlias>
-      <contentProcess>%aditoprj%/entity/MSTeamsActivityImport_entity/recordcontainers/jdito/contentProcess.js</contentProcess>
-      <recordFieldMappings>
-        <jDitoRecordFieldMapping>
-          <name>UID.value</name>
-        </jDitoRecordFieldMapping>
-      </recordFieldMappings>
-    </jDitoRecordContainer>
+    <datalessRecordContainer>
+      <name>dataless</name>
+    </datalessRecordContainer>
   </recordContainers>
 </entity>
diff --git a/entity/MSTeamsActivityImport_entity/entityfields/importmessages/onActionProcess.js b/entity/MSTeamsActivityImport_entity/entityfields/importmessages/onActionProcess.js
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/entity/MSTeamsActivityImport_entity/recordcontainers/jdito/contentProcess.js b/entity/MSTeamsActivityImport_entity/recordcontainers/jdito/contentProcess.js
deleted file mode 100644
index e197aca8b77..00000000000
--- a/entity/MSTeamsActivityImport_entity/recordcontainers/jdito/contentProcess.js
+++ /dev/null
@@ -1,9 +0,0 @@
-import("system.result");
-import("system.vars");
-
-//TODO: This dummy implementation shouldn't be nescessary here. Remove this process eventually. #1051003
-var rows = [];
-if (vars.get("$local.idvalues"))
-    rows = vars.get("$local.idvalues").map(function (id) {return [id];});
-
-result.object(rows);
\ No newline at end of file
diff --git a/entity/MSTeamsMessage_entity/MSTeamsMessage_entity.aod b/entity/MSTeamsMessage_entity/MSTeamsMessage_entity.aod
index d4f61630a7e..63a08366e65 100644
--- a/entity/MSTeamsMessage_entity/MSTeamsMessage_entity.aod
+++ b/entity/MSTeamsMessage_entity/MSTeamsMessage_entity.aod
@@ -65,6 +65,7 @@
     <jDitoRecordContainer>
       <name>jdito</name>
       <jDitoRecordAlias>Data_alias</jDitoRecordAlias>
+      <contentProcess>%aditoprj%/entity/MSTeamsMessage_entity/recordcontainers/jdito/contentProcess.js</contentProcess>
       <title>Nachrichten</title>
       <recordFieldMappings>
         <jDitoRecordFieldMapping>
diff --git a/entity/Member_entity/Member_entity.aod b/entity/Member_entity/Member_entity.aod
index 9ab10a3baef..f0d15b5a877 100644
--- a/entity/Member_entity/Member_entity.aod
+++ b/entity/Member_entity/Member_entity.aod
@@ -219,7 +219,7 @@
       <children>
         <entityActionField>
           <name>createTeam</name>
-          <title>Create Teams group</title>
+          <title>Create Team</title>
           <onActionProcess>%aditoprj%/entity/Member_entity/entityfields/msteamsactiongroup/children/createteam/onActionProcess.js</onActionProcess>
           <isSelectionAction v="false" />
           <iconId>NEON:PLUS</iconId>
@@ -228,7 +228,7 @@
         </entityActionField>
         <entityActionField>
           <name>editTeam</name>
-          <title>Edit Teams Group</title>
+          <title>Edit Team</title>
           <onActionProcess>%aditoprj%/entity/Member_entity/entityfields/msteamsactiongroup/children/editteam/onActionProcess.js</onActionProcess>
           <iconId>NEON:PENCIL</iconId>
           <stateProcess>%aditoprj%/entity/Member_entity/entityfields/msteamsactiongroup/children/editteam/stateProcess.js</stateProcess>
@@ -242,28 +242,28 @@
         </entityActionField>
         <entityActionField>
           <name>chooseTeam</name>
-          <title>Choose Teams group</title>
+          <title>Choose Team</title>
           <onActionProcess>%aditoprj%/entity/Member_entity/entityfields/msteamsactiongroup/children/chooseteam/onActionProcess.js</onActionProcess>
           <iconId>NEON:GROUP_APPOINTMENT</iconId>
           <stateProcess>%aditoprj%/entity/Member_entity/entityfields/msteamsactiongroup/children/chooseteam/stateProcess.js</stateProcess>
         </entityActionField>
         <entityActionField>
           <name>restoreTeam</name>
-          <title>Restore Teams group</title>
+          <title>Restore Team</title>
           <onActionProcess>%aditoprj%/entity/Member_entity/entityfields/msteamsactiongroup/children/restoreteam/onActionProcess.js</onActionProcess>
           <iconId>VAADIN:ARROW_BACKWARD</iconId>
           <stateProcess>%aditoprj%/entity/Member_entity/entityfields/msteamsactiongroup/children/restoreteam/stateProcess.js</stateProcess>
         </entityActionField>
         <entityActionField>
-          <name>changeToMSTeam</name>
+          <name>openMSTeams</name>
           <title>Open Teams</title>
-          <onActionProcess>%aditoprj%/entity/Member_entity/entityfields/msteamsactiongroup/children/changetomsteam/onActionProcess.js</onActionProcess>
+          <onActionProcess>%aditoprj%/entity/Member_entity/entityfields/msteamsactiongroup/children/openmsteams/onActionProcess.js</onActionProcess>
           <iconId>VAADIN:EXTERNAL_LINK</iconId>
-          <stateProcess>%aditoprj%/entity/Member_entity/entityfields/msteamsactiongroup/children/changetomsteam/stateProcess.js</stateProcess>
+          <stateProcess>%aditoprj%/entity/Member_entity/entityfields/msteamsactiongroup/children/openmsteams/stateProcess.js</stateProcess>
         </entityActionField>
         <entityActionField>
           <name>deleteTeam</name>
-          <title>Delete Teams group</title>
+          <title>Delete Team</title>
           <onActionProcess>%aditoprj%/entity/Member_entity/entityfields/msteamsactiongroup/children/deleteteam/onActionProcess.js</onActionProcess>
           <iconId>NEON:TRASH</iconId>
           <stateProcess>%aditoprj%/entity/Member_entity/entityfields/msteamsactiongroup/children/deleteteam/stateProcess.js</stateProcess>
@@ -289,7 +289,7 @@
     </entityParameter>
     <entityField>
       <name>MST_MEMBERROLE</name>
-      <title>Teams role</title>
+      <title>Team role</title>
       <stateProcess>%aditoprj%/entity/Member_entity/entityfields/mst_memberrole/stateProcess.js</stateProcess>
     </entityField>
     <entityParameter>
@@ -513,6 +513,9 @@
         <jDitoRecordFieldMapping>
           <name>recordType.value</name>
         </jDitoRecordFieldMapping>
+        <jDitoRecordFieldMapping>
+          <name>MST_MEMBERROLE.value</name>
+        </jDitoRecordFieldMapping>
       </recordFieldMappings>
     </jDitoRecordContainer>
   </recordContainers>
diff --git a/entity/Member_entity/entityfields/msteamsactiongroup/children/changetomsteam/onActionProcess.js b/entity/Member_entity/entityfields/msteamsactiongroup/children/openmsteams/onActionProcess.js
similarity index 100%
rename from entity/Member_entity/entityfields/msteamsactiongroup/children/changetomsteam/onActionProcess.js
rename to entity/Member_entity/entityfields/msteamsactiongroup/children/openmsteams/onActionProcess.js
diff --git a/entity/Member_entity/entityfields/msteamsactiongroup/children/changetomsteam/stateProcess.js b/entity/Member_entity/entityfields/msteamsactiongroup/children/openmsteams/stateProcess.js
similarity index 100%
rename from entity/Member_entity/entityfields/msteamsactiongroup/children/changetomsteam/stateProcess.js
rename to entity/Member_entity/entityfields/msteamsactiongroup/children/openmsteams/stateProcess.js
diff --git a/entity/Member_entity/recordcontainers/jdito/contentProcess.js b/entity/Member_entity/recordcontainers/jdito/contentProcess.js
index ae2052147d8..48b27281c4e 100644
--- a/entity/Member_entity/recordcontainers/jdito/contentProcess.js
+++ b/entity/Member_entity/recordcontainers/jdito/contentProcess.js
@@ -17,7 +17,7 @@ var memberLoadingConfig = entities.createConfigForLoadingRows()
                                                 "MEMBERROLE", "MEMBERROLE.displayValue", "OBJECT_ROWID", "OBJECT_TYPE",
                                                 "OBJECTMEMBERID", "ORG_ORGID", "ORGANISATION_NAME", "PERSON_FIRSTNAME", "PERSON_FULL_NAME", 
                                                 "PERSON_LASTNAME", "PERSON_PERSID", "PERSON_SALUTATION", "PERSON_TITLE", "POSITION", "TARGETCONTEXT",
-                                                "recordType"]);
+                                                "recordType", "MST_MEMBERROLE"]);
 
 if (idValues)
 {
@@ -32,11 +32,32 @@ if (filter && filter.filter != null)
 var memberRows = entities.getRows(memberLoadingConfig);
 memberRows = memberRows.map(function(row)
 {
-    return [row["#UID"], row["OBJECTMEMBERID"], row["CONTACT_ID"], row["CONTACT_ID.displayValue"], row["CONTACTROLE"], row["DEPARTMENT"], row["ICON"],
-                row["IMAGE"], row["MEMBERROLE"], row["MEMBERROLE.displayValue"], row["OBJECT_ROWID"], 
-                row["OBJECT_TYPE"], row["ORG_ORGID"], row["ORGANISATION_NAME"], row["PERSON_FIRSTNAME"], 
-                row["PERSON_FULL_NAME"], row["PERSON_LASTNAME"], row["PERSON_PERSID"], row["PERSON_SALUTATION"], row["PERSON_TITLE"], 
-                row["POSITION"], row["TARGETCONTEXT"], row["recordType"]];
+    return [
+        row["#UID"], 
+        row["OBJECTMEMBERID"], 
+        row["CONTACT_ID"], 
+        row["CONTACT_ID.displayValue"], 
+        row["CONTACTROLE"], 
+        row["DEPARTMENT"], 
+        row["ICON"],
+        row["IMAGE"], 
+        row["MEMBERROLE"], 
+        row["MEMBERROLE.displayValue"], 
+        row["OBJECT_ROWID"], 
+        row["OBJECT_TYPE"], 
+        row["ORG_ORGID"], 
+        row["ORGANISATION_NAME"], 
+        row["PERSON_FIRSTNAME"], 
+        row["PERSON_FULL_NAME"], 
+        row["PERSON_LASTNAME"], 
+        row["PERSON_PERSID"], 
+        row["PERSON_SALUTATION"], 
+        row["PERSON_TITLE"], 
+        row["POSITION"], 
+        row["TARGETCONTEXT"], 
+        row["recordType"], 
+        row["MST_MEMBERROLE"]
+    ];
 });
 
 if (Utils.isNullOrEmpty(idValues) || memberRows.length === 0)
@@ -49,20 +70,29 @@ if (Utils.isNullOrEmpty(idValues) || memberRows.length === 0)
                             .cell();
 
         var districtLoadingConfig = entities.createConfigForLoadingRows()
-                                                .entity("DistrictResponsible_entity")
-                                                .provider("OrganisationResponsibles")
-                                                .addParameter("OrgUid_param", orgContactId)
-                                                .fields(["#UID","DISTRICTRESPONSIBLEID", "DISTRICT_ID", "EMPLOYEE_CONTACT_ID", 
-                                                            "EMPLOYEE_CONTACT_ID.displayValue", "USER_EDIT", "USER_NEW", 
-                                                            "departmentAttributeName", "DATE_EDIT", "DATE_NEW"]);
+            .entity("DistrictResponsible_entity")
+            .provider("OrganisationResponsibles")
+            .addParameter("OrgUid_param", orgContactId)
+            .fields(["#UID","DISTRICTRESPONSIBLEID", "DISTRICT_ID", "EMPLOYEE_CONTACT_ID", 
+                        "EMPLOYEE_CONTACT_ID.displayValue", "USER_EDIT", "USER_NEW", 
+                        "departmentAttributeName", "DATE_EDIT", "DATE_NEW"]);
 
         var districtRows = entities.getRows(districtLoadingConfig);
 
-
         districtRows = districtRows.map(function(row)
         {
-            return [row["#UID"], row["DISTRICTRESPONSIBLEID"], row["DISTRICT_ID"], row["EMPLOYEE_CONTACT_ID"], row["EMPLOYEE_CONTACT_ID.displayValue"], 
-                row["USER_EDIT"], row["USER_NEW"], row["departmentAttributeName"], row["DATE_EDIT"], row["DATE_NEW"]];
+            return [
+                row["#UID"], 
+                row["DISTRICTRESPONSIBLEID"], 
+                row["DISTRICT_ID"], 
+                row["EMPLOYEE_CONTACT_ID"], 
+                row["EMPLOYEE_CONTACT_ID.displayValue"], 
+                row["USER_EDIT"],
+                row["USER_NEW"], 
+                row["departmentAttributeName"], 
+                row["DATE_EDIT"], 
+                row["DATE_NEW"]
+            ];
         });
     }
 
@@ -112,7 +142,8 @@ if (Utils.isNullOrEmpty(idValues) || memberRows.length === 0)
             persRows[counter][1], 
             persRows[counter][7],
             null, 
-            "DistrictResponsible"
+            "DistrictResponsible",
+            ""
         ]);
     });
 }
diff --git a/entity/Salesproject_entity/Salesproject_entity.aod b/entity/Salesproject_entity/Salesproject_entity.aod
index a7de7c2636f..37af27431d7 100644
--- a/entity/Salesproject_entity/Salesproject_entity.aod
+++ b/entity/Salesproject_entity/Salesproject_entity.aod
@@ -145,39 +145,34 @@
     </entityField>
     <entityConsumer>
       <name>SalesprojectSources</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>SalesprojectSource_entity</entityName>
-        <fieldName>SalesprojectSouces</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>SalesprojectId_param</name>
           <valueProcess>%aditoprj%/entity/Salesproject_entity/entityfields/salesprojectsources/children/salesprojectid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>SalesprojectPhaseMilestones</name>
       <dependency>
         <name>dependency</name>
-        <entityName>SalesprojectMilestone_entity</entityName>
-        <fieldName>PhaseMilestones</fieldName>
+        <entityName>SalesprojectSource_entity</entityName>
+        <fieldName>SalesprojectSouces</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>SalesprojectPhaseMilestones</name>
       <children>
         <entityParameter>
           <name>SalesprojectId_param</name>
           <valueProcess>%aditoprj%/entity/Salesproject_entity/entityfields/salesprojectphasemilestones/children/salesprojectid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>Forecasts</name>
       <dependency>
         <name>dependency</name>
-        <entityName>Forecast_entity</entityName>
-        <fieldName>Links</fieldName>
+        <entityName>SalesprojectMilestone_entity</entityName>
+        <fieldName>PhaseMilestones</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>Forecasts</name>
       <children>
         <entityParameter>
           <name>ObjectType_param</name>
@@ -190,15 +185,15 @@
           <expose v="true" />
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>Competitions</name>
-      <selectionMode>MULTI</selectionMode>
       <dependency>
         <name>dependency</name>
-        <entityName>Competition_entity</entityName>
+        <entityName>Forecast_entity</entityName>
         <fieldName>Links</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>Competitions</name>
+      <selectionMode>MULTI</selectionMode>
       <children>
         <entityParameter>
           <name>ObjectRowId_param</name>
@@ -211,14 +206,14 @@
           <expose v="true" />
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>Offers</name>
       <dependency>
         <name>dependency</name>
-        <entityName>Offer_entity</entityName>
+        <entityName>Competition_entity</entityName>
         <fieldName>Links</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>Offers</name>
       <children>
         <entityParameter>
           <name>ObjectRowId_param</name>
@@ -231,14 +226,14 @@
           <expose v="true" />
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>Activities</name>
       <dependency>
         <name>dependency</name>
-        <entityName>Activity_entity</entityName>
-        <fieldName>LinkedObjects</fieldName>
+        <entityName>Offer_entity</entityName>
+        <fieldName>Links</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>Activities</name>
       <children>
         <entityParameter>
           <name>PresetLinks_param</name>
@@ -253,14 +248,14 @@
           <valueProcess>%aditoprj%/entity/Salesproject_entity/entityfields/activities/children/objectid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>Members</name>
       <dependency>
         <name>dependency</name>
-        <entityName>Member_entity</entityName>
-        <fieldName>WithDistrictResponsibles</fieldName>
+        <entityName>Activity_entity</entityName>
+        <fieldName>LinkedObjects</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>Members</name>
       <children>
         <entityParameter>
           <name>ObjectRowId_param</name>
@@ -285,6 +280,11 @@
           <valueProcess>%aditoprj%/entity/Salesproject_entity/entityfields/members/children/salesprojectcode_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Member_entity</entityName>
+        <fieldName>WithDistrictResponsibles</fieldName>
+      </dependency>
     </entityConsumer>
     <entityActionField>
       <name>newOffer</name>
@@ -297,11 +297,6 @@
     <entityConsumer>
       <name>Timetrackings</name>
       <refreshParent v="true" />
-      <dependency>
-        <name>dependency</name>
-        <entityName>Timetracking_entity</entityName>
-        <fieldName>Timetrackings</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ObjectId_param</name>
@@ -312,6 +307,11 @@
           <valueProcess>%aditoprj%/entity/Salesproject_entity/entityfields/timetrackings/children/rowid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Timetracking_entity</entityName>
+        <fieldName>Timetrackings</fieldName>
+      </dependency>
     </entityConsumer>
     <entityParameter>
       <name>ContactId_param</name>
@@ -335,11 +335,6 @@
     <entityConsumer>
       <name>Documents</name>
       <selectionMode>MULTI</selectionMode>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Document_entity</entityName>
-        <fieldName>Documents</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>AssignmentRowId_param</name>
@@ -354,15 +349,15 @@
           <valueProcess>%aditoprj%/entity/Salesproject_entity/entityfields/documents/children/mstteamid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>MainDocuments</name>
-      <stateProcess>%aditoprj%/entity/Salesproject_entity/entityfields/maindocuments/stateProcess.js</stateProcess>
       <dependency>
         <name>dependency</name>
         <entityName>Document_entity</entityName>
-        <fieldName>MainDocuments</fieldName>
+        <fieldName>Documents</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>MainDocuments</name>
+      <stateProcess>%aditoprj%/entity/Salesproject_entity/entityfields/maindocuments/stateProcess.js</stateProcess>
       <children>
         <entityParameter>
           <name>AssignmentRowId_param</name>
@@ -373,6 +368,11 @@
           <valueProcess>%aditoprj%/entity/Salesproject_entity/entityfields/maindocuments/children/assignmenttable_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Document_entity</entityName>
+        <fieldName>MainDocuments</fieldName>
+      </dependency>
     </entityConsumer>
     <entityActionField>
       <name>newTimetracking</name>
@@ -383,11 +383,6 @@
     </entityActionField>
     <entityConsumer>
       <name>KeywordProbabilties</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>KeywordEntry_entity</entityName>
-        <fieldName>SpecificContainerKeywords</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
@@ -396,14 +391,14 @@
           <expose v="false" />
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>KeywordStates</name>
       <dependency>
         <name>dependency</name>
         <entityName>KeywordEntry_entity</entityName>
         <fieldName>SpecificContainerKeywords</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>KeywordStates</name>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
@@ -411,6 +406,11 @@
           <expose v="false" />
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>SpecificContainerKeywords</fieldName>
+      </dependency>
     </entityConsumer>
     <entityActionField>
       <name>newActivity</name>
@@ -430,17 +430,17 @@
     <entityConsumer>
       <name>KeywordWonLost</name>
       <selectionMode>MULTI</selectionMode>
-      <dependency>
-        <name>dependency</name>
-        <entityName>KeywordEntry_entity</entityName>
-        <fieldName>SpecificContainerKeywords</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
           <valueProcess>%aditoprj%/entity/Salesproject_entity/entityfields/keywordwonlost/children/containername_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>SpecificContainerKeywords</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>REASONS</name>
@@ -457,6 +457,17 @@
     </entityField>
     <entityProvider>
       <name>Salesprojects</name>
+      <children>
+        <entityParameter>
+          <name>ContactId_param</name>
+          <expose v="true" />
+          <mandatory v="true" />
+        </entityParameter>
+        <entityParameter>
+          <name>PresetTitle_param</name>
+          <expose v="false" />
+        </entityParameter>
+      </children>
       <dependencies>
         <entityDependency>
           <name>0925d17f-a26a-4641-aaf4-0f74796fefa7</name>
@@ -477,17 +488,6 @@
           <isConsumer v="false" />
         </entityDependency>
       </dependencies>
-      <children>
-        <entityParameter>
-          <name>ContactId_param</name>
-          <expose v="true" />
-          <mandatory v="true" />
-        </entityParameter>
-        <entityParameter>
-          <name>PresetTitle_param</name>
-          <expose v="false" />
-        </entityParameter>
-      </children>
     </entityProvider>
     <entityActionField>
       <name>newTask</name>
@@ -498,11 +498,6 @@
     <entityConsumer>
       <name>Tasks</name>
       <stateProcess>%aditoprj%/entity/Salesproject_entity/entityfields/tasks/stateProcess.js</stateProcess>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Task_entity</entityName>
-        <fieldName>Tasks</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>RowId_param</name>
@@ -517,17 +512,14 @@
           <valueProcess>%aditoprj%/entity/Salesproject_entity/entityfields/tasks/children/objectid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Task_entity</entityName>
+        <fieldName>Tasks</fieldName>
+      </dependency>
     </entityConsumer>
     <entityProvider>
       <name>OpenSalesprojects</name>
-      <dependencies>
-        <entityDependency>
-          <name>631f55f9-fb0f-4205-bdb8-6e3476268ab4</name>
-          <entityName>Offer_entity</entityName>
-          <fieldName>Salesprojects</fieldName>
-          <isConsumer v="false" />
-        </entityDependency>
-      </dependencies>
       <children>
         <entityParameter>
           <name>Status_param</name>
@@ -538,6 +530,14 @@
           <expose v="false" />
         </entityParameter>
       </children>
+      <dependencies>
+        <entityDependency>
+          <name>631f55f9-fb0f-4205-bdb8-6e3476268ab4</name>
+          <entityName>Offer_entity</entityName>
+          <fieldName>Salesprojects</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+      </dependencies>
     </entityProvider>
     <entityParameter>
       <name>Status_param</name>
@@ -546,27 +546,22 @@
     </entityParameter>
     <entityConsumer>
       <name>SalesprojectStateMilestones</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>SalesprojectMilestone_entity</entityName>
-        <fieldName>StateMilestones</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>SalesprojectId_param</name>
           <valueProcess>%aditoprj%/entity/Salesproject_entity/entityfields/salesprojectstatemilestones/children/salesprojectid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>SalesprojectMilestone_entity</entityName>
+        <fieldName>StateMilestones</fieldName>
+      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>Attributes</name>
       <stateProcess>%aditoprj%/entity/Salesproject_entity/entityfields/attributes/stateProcess.js</stateProcess>
       <onValidation>%aditoprj%/entity/Salesproject_entity/entityfields/attributes/onValidation.js</onValidation>
-      <dependency>
-        <name>dependency</name>
-        <entityName>AttributeRelation_entity</entityName>
-        <fieldName>AttributeRelations</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ObjectType_param</name>
@@ -577,15 +572,15 @@
           <valueProcess>%aditoprj%/entity/Salesproject_entity/entityfields/attributes/children/objectrowid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>AttributeTree</name>
-      <stateProcess>%aditoprj%/entity/Salesproject_entity/entityfields/attributetree/stateProcess.js</stateProcess>
       <dependency>
         <name>dependency</name>
         <entityName>AttributeRelation_entity</entityName>
-        <fieldName>TreeProvider</fieldName>
+        <fieldName>AttributeRelations</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>AttributeTree</name>
+      <stateProcess>%aditoprj%/entity/Salesproject_entity/entityfields/attributetree/stateProcess.js</stateProcess>
       <children>
         <entityParameter>
           <name>ObjectType_param</name>
@@ -596,29 +591,29 @@
           <valueProcess>%aditoprj%/entity/Salesproject_entity/entityfields/attributetree/children/objectrowid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>LogHistories</name>
       <dependency>
         <name>dependency</name>
-        <entityName>LogHistory_entity</entityName>
-        <fieldName>LogHistoryProvider</fieldName>
+        <entityName>AttributeRelation_entity</entityName>
+        <fieldName>TreeProvider</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>LogHistories</name>
       <children>
         <entityParameter>
           <name>tablenames_param</name>
           <valueProcess>%aditoprj%/entity/Salesproject_entity/entityfields/loghistories/children/tablenames_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>LogHistory_entity</entityName>
+        <fieldName>LogHistoryProvider</fieldName>
+      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>Classifications</name>
       <refreshParent v="true" />
-      <dependency>
-        <name>dependency</name>
-        <entityName>Classification_entity</entityName>
-        <fieldName>Classifications</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ObjectRowid_param</name>
@@ -633,6 +628,11 @@
           <valueProcess>%aditoprj%/entity/Salesproject_entity/entityfields/classifications/children/classificationtype_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Classification_entity</entityName>
+        <fieldName>Classifications</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>RemainingTime</name>
@@ -646,11 +646,6 @@
     </entityField>
     <entityConsumer>
       <name>SalesprojectForecastCharts</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Turnover_entity</entityName>
-        <fieldName>FilteredTurnovers</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>SalesprojectId_param</name>
@@ -669,20 +664,25 @@
           <valueProcess>%aditoprj%/entity/Salesproject_entity/entityfields/salesprojectforecastcharts/children/yearcounttoshow_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>SalesprojectPhaseStepper</name>
       <dependency>
         <name>dependency</name>
-        <entityName>SalesprojectPhase_entity</entityName>
-        <fieldName>Phases</fieldName>
+        <entityName>Turnover_entity</entityName>
+        <fieldName>FilteredTurnovers</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>SalesprojectPhaseStepper</name>
       <children>
         <entityParameter>
           <name>CurrentPhase_param</name>
           <valueProcess>%aditoprj%/entity/Salesproject_entity/entityfields/salesprojectphasestepper/children/currentphase_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>SalesprojectPhase_entity</entityName>
+        <fieldName>Phases</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>PHASEINFO</name>
@@ -705,17 +705,17 @@
     </entityField>
     <entityConsumer>
       <name>ProjectTypeAttribute</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Attribute_entity</entityName>
-        <fieldName>SpecificAttribute</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ObjectType_param</name>
           <valueProcess>%aditoprj%/entity/Salesproject_entity/entityfields/projecttypeattribute/children/objecttype_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Attribute_entity</entityName>
+        <fieldName>SpecificAttribute</fieldName>
+      </dependency>
     </entityConsumer>
     <entityProvider>
       <name>QuickEntrySalesprojects</name>
@@ -752,7 +752,7 @@
     </entityField>
     <entityField>
       <name>MST_TEAM_ID</name>
-      <title>Teams group</title>
+      <title>Team</title>
       <linkedContext>MSTTeam</linkedContext>
       <state>INVISIBLE</state>
       <stateProcess>%aditoprj%/entity/Salesproject_entity/entityfields/mst_team_id/stateProcess.js</stateProcess>
diff --git a/entity/Salesproject_entity/recordcontainers/db/onDBUpdate.js b/entity/Salesproject_entity/recordcontainers/db/onDBUpdate.js
index 73086a2fdfb..b81c1dd9c2c 100644
--- a/entity/Salesproject_entity/recordcontainers/db/onDBUpdate.js
+++ b/entity/Salesproject_entity/recordcontainers/db/onDBUpdate.js
@@ -98,35 +98,26 @@ vars.get("$local.changed").forEach(function(fieldName) {
     }
 });
 
-var serviceUrl = newSelect("SERVICE_URL")
+var [serviceUrl, channelId] = newSelect(["SERVICE_URL", "GENERAL_CHANNELID"])
     .from("MST_TEAM")
     .where("MST_TEAM.MST_TEAMID", "$field.MST_TEAM_ID")
-    .cell();
+    .arrayRow();
 
-    var channelId = newSelect("GENERAL_CHANNELID")
-    .from("MST_TEAM")
-    .where("MST_TEAM.MST_TEAMID", "$field.MST_TEAM_ID")
-    .cell();
-    
-    if(serviceUrl)
-    {
-        teams.sendNotification(serviceUrl, channelId, "Etwas hat sich im Projekt "+ vars.get("$field.PROJECTTITLE") +" geaendert")
-    }
+if (serviceUrl)
+    teams.sendNotification(serviceUrl, channelId, "Etwas hat sich im Projekt "+ vars.get("$field.PROJECTTITLE") +" geaendert");
 
 if (needToUpdateForecast)
     Salesproject.notifyToUpdateForecast();
 
 WorkflowSignalSender.updated();
 
-neon.refreshAll();
-
 function _updateReasons()
 {
     var reasons = rowdata["SALESPROJECT.REASONS"];
     if(reasons)
     {
-        newWhere("SALESPROJECT.SALESPROJECTID", vars.getString("$local.uid"))
-                        .updateData(true, "SALESPROJECT", ["REASONS"], null, [reasons]);
+        newWhere("SALESPROJECT.SALESPROJECTID", "$local.uid")
+            .updateFields({"REASONS": reasons});
     }
 }
 
@@ -134,7 +125,7 @@ function _clearReasons(pReallyClear)
 {
     if (pReallyClear)
     {
-        newWhere("SALESPROJECT.SALESPROJECTID", vars.getString("$local.uid"))
-                        .updateData(true, "SALESPROJECT", ["REASONS"], null, [""]);
+        newWhere("SALESPROJECT.SALESPROJECTID", "$local.uid")
+            .updateFields({"REASONS": ""});
     }
 }
\ No newline at end of file
diff --git a/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod b/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod
index c4a9eb1ad2d..b64642c4016 100644
--- a/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod
+++ b/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod
@@ -7299,6 +7299,96 @@
     <entry>
       <key>#login</key>
     </entry>
+    <entry>
+      <key>Last change</key>
+    </entry>
+    <entry>
+      <key>Knowledge entries</key>
+    </entry>
+    <entry>
+      <key>Newsfeed (Preview)</key>
+    </entry>
+    <entry>
+      <key>Edited on</key>
+    </entry>
+    <entry>
+      <key>Created on</key>
+    </entry>
+    <entry>
+      <key>Discussion</key>
+    </entry>
+    <entry>
+      <key>Newsfeed (Full)</key>
+    </entry>
+    <entry>
+      <key>Closed</key>
+    </entry>
+    <entry>
+      <key>Text content</key>
+    </entry>
+    <entry>
+      <key>Reply</key>
+    </entry>
+    <entry>
+      <key>All Knowledge Entries</key>
+    </entry>
+    <entry>
+      <key>Export HTML</key>
+    </entry>
+    <entry>
+      <key>Publishing level</key>
+    </entry>
+    <entry>
+      <key>Discussions</key>
+    </entry>
+    <entry>
+      <key>Knowledge Management</key>
+    </entry>
+    <entry>
+      <key>List news articles</key>
+    </entry>
+    <entry>
+      <key>Knowledge Role</key>
+    </entry>
+    <entry>
+      <key>Shows complete news articles</key>
+    </entry>
+    <entry>
+      <key>Knowledge</key>
+    </entry>
+    <entry>
+      <key>Toggle status</key>
+    </entry>
+    <entry>
+      <key>Add app</key>
+    </entry>
+    <entry>
+      <key>Open Teams</key>
+    </entry>
+    <entry>
+      <key>Choose Team</key>
+    </entry>
+    <entry>
+      <key>Delete Team</key>
+    </entry>
+    <entry>
+      <key>Restore Team</key>
+    </entry>
+    <entry>
+      <key>Create Team</key>
+    </entry>
+    <entry>
+      <key>Team role</key>
+    </entry>
+    <entry>
+      <key>Edit Team</key>
+    </entry>
+    <entry>
+      <key>Sales Project</key>
+    </entry>
+    <entry>
+      <key>Channels</key>
+    </entry>
   </keyValueMap>
   <font name="Dialog" style="0" size="11" />
   <sqlModels>
diff --git a/language/_____LANGUAGE_de/_____LANGUAGE_de.aod b/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
index 1581ad2733f..05f8f17812c 100644
--- a/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
+++ b/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
@@ -10,6 +10,30 @@
       <key>Probability AI</key>
       <value>Wahrscheinlichkeit KI</value>
     </entry>
+    <entry>
+      <key>Delete Team</key>
+      <value>Team löschen</value>
+    </entry>
+    <entry>
+      <key>Open Teams</key>
+      <value>Teams öffnen</value>
+    </entry>
+    <entry>
+      <key>Restore Team</key>
+      <value>Team wiederherstellen</value>
+    </entry>
+    <entry>
+      <key>Choose Team</key>
+      <value>Team auswählen</value>
+    </entry>
+    <entry>
+      <key>Add app</key>
+      <value>App hinzufügen</value>
+    </entry>
+    <entry>
+      <key>Edit Team</key>
+      <value>Team bearbeiten</value>
+    </entry>
     <entry>
       <key>The start date has to be before the end date.</key>
       <value>Das Startdatum muss vor dem Enddatum sein.</value>
@@ -926,6 +950,10 @@
       <key>Contacts</key>
       <value>Kontakte</value>
     </entry>
+    <entry>
+      <key>Channels</key>
+      <value>Kanäle</value>
+    </entry>
     <entry>
       <key>Address</key>
       <value>Adresse</value>
@@ -1451,6 +1479,10 @@
       <key>Order</key>
       <value>Bestellung</value>
     </entry>
+    <entry>
+      <key>Team role</key>
+      <value>Teamrolle</value>
+    </entry>
     <entry>
       <key>Postponed</key>
       <value>Vertagt</value>
@@ -7480,6 +7512,10 @@
       <key>Nein</key>
       <value>Nein</value>
     </entry>
+    <entry>
+      <key>Create Team</key>
+      <value>Team erstellen</value>
+    </entry>
     <entry>
       <key>Use for duplicate search</key>
       <value>Für Duplettensuche benutzen</value>
@@ -8077,6 +8113,10 @@ Bitte Datumseingabe prüfen</value>
       <key>Senderphone</key>
       <value>Sendertelefonnummer</value>
     </entry>
+    <entry>
+      <key>Sales Project</key>
+      <value>Vertriebsprojekt</value>
+    </entry>
     <entry>
       <key>Sendername</key>
       <value>Sendername</value>
diff --git a/language/_____LANGUAGE_en/_____LANGUAGE_en.aod b/language/_____LANGUAGE_en/_____LANGUAGE_en.aod
index a678822107a..3580ad96f19 100644
--- a/language/_____LANGUAGE_en/_____LANGUAGE_en.aod
+++ b/language/_____LANGUAGE_en/_____LANGUAGE_en.aod
@@ -7380,6 +7380,96 @@
     <entry>
       <key>#login</key>
     </entry>
+    <entry>
+      <key>Last change</key>
+    </entry>
+    <entry>
+      <key>Knowledge entries</key>
+    </entry>
+    <entry>
+      <key>Newsfeed (Preview)</key>
+    </entry>
+    <entry>
+      <key>Edited on</key>
+    </entry>
+    <entry>
+      <key>Created on</key>
+    </entry>
+    <entry>
+      <key>Discussion</key>
+    </entry>
+    <entry>
+      <key>Newsfeed (Full)</key>
+    </entry>
+    <entry>
+      <key>Closed</key>
+    </entry>
+    <entry>
+      <key>Text content</key>
+    </entry>
+    <entry>
+      <key>Reply</key>
+    </entry>
+    <entry>
+      <key>All Knowledge Entries</key>
+    </entry>
+    <entry>
+      <key>Export HTML</key>
+    </entry>
+    <entry>
+      <key>Publishing level</key>
+    </entry>
+    <entry>
+      <key>Discussions</key>
+    </entry>
+    <entry>
+      <key>Knowledge Management</key>
+    </entry>
+    <entry>
+      <key>List news articles</key>
+    </entry>
+    <entry>
+      <key>Knowledge Role</key>
+    </entry>
+    <entry>
+      <key>Shows complete news articles</key>
+    </entry>
+    <entry>
+      <key>Knowledge</key>
+    </entry>
+    <entry>
+      <key>Toggle status</key>
+    </entry>
+    <entry>
+      <key>Add app</key>
+    </entry>
+    <entry>
+      <key>Open Teams</key>
+    </entry>
+    <entry>
+      <key>Choose Team</key>
+    </entry>
+    <entry>
+      <key>Delete Team</key>
+    </entry>
+    <entry>
+      <key>Restore Team</key>
+    </entry>
+    <entry>
+      <key>Create Team</key>
+    </entry>
+    <entry>
+      <key>Team role</key>
+    </entry>
+    <entry>
+      <key>Edit Team</key>
+    </entry>
+    <entry>
+      <key>Sales Project</key>
+    </entry>
+    <entry>
+      <key>Channels</key>
+    </entry>
   </keyValueMap>
   <font name="Dialog" style="0" size="11" />
 </language>
diff --git a/neonView/MSTTeamEdit_view/MSTTeamEdit_view.aod b/neonView/MSTTeamEdit_view/MSTTeamEdit_view.aod
index 404d59d6478..867c7a8fa07 100644
--- a/neonView/MSTTeamEdit_view/MSTTeamEdit_view.aod
+++ b/neonView/MSTTeamEdit_view/MSTTeamEdit_view.aod
@@ -4,9 +4,9 @@
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <size>SMALL</size>
   <layout>
-    <noneLayout>
+    <boxLayout>
       <name>layout</name>
-    </noneLayout>
+    </boxLayout>
   </layout>
   <children>
     <genericViewTemplate>
diff --git a/neonView/PersonEdit_view/PersonEdit_view.aod b/neonView/PersonEdit_view/PersonEdit_view.aod
index a89480fa864..c31dd51b7ff 100644
--- a/neonView/PersonEdit_view/PersonEdit_view.aod
+++ b/neonView/PersonEdit_view/PersonEdit_view.aod
@@ -91,24 +91,5 @@
       <entityField>Attributes</entityField>
       <view>AttributeRelationMultiEdit_view</view>
     </neonViewReference>
-    <actionsViewTemplate>
-      <name>asdf</name>
-      <actions>
-        <element>TestGroup</element>
-      </actions>
-      <entityField>#ENTITY</entityField>
-    </actionsViewTemplate>
-    <genericViewTemplate>
-      <name>ihu</name>
-      <editMode v="true" />
-      <entityField>#ENTITY</entityField>
-      <title>hui</title>
-      <fields>
-        <entityFieldLink>
-          <name>e6d21257-2eef-4de2-8d5f-a8a0fd3188a9</name>
-          <entityField>FIRSTNAME</entityField>
-        </entityFieldLink>
-      </fields>
-    </genericViewTemplate>
   </children>
 </neonView>
diff --git a/process/Employee_lib/process.js b/process/Employee_lib/process.js
index 5bb8a84573d..40db215e8d0 100644
--- a/process/Employee_lib/process.js
+++ b/process/Employee_lib/process.js
@@ -151,6 +151,8 @@ EmployeeUtils.isUser = function (pContactId)
 
 EmployeeUtils.getUserByContactId = function (pContactId)
 {
+    if (!pContactId)
+        return null;
     return tools.getUserByAttribute(tools.CONTACTID, pContactId);
 }
 
diff --git a/process/MSTeams_lib/process.js b/process/MSTeams_lib/process.js
index 080da03c940..4cff133da45 100644
--- a/process/MSTeams_lib/process.js
+++ b/process/MSTeams_lib/process.js
@@ -1,3 +1,5 @@
+import("system.logging");
+import("system.neon");
 import("Util_lib");
 import("Communication_lib");
 import("system.translate");
@@ -31,6 +33,50 @@ MSTeamsUtils.getTeamLinkContexts = function ()
     };
 }
 
+MSTeamsUtils.changeTeamsLink = function (pRowId, pObjectType)
+{
+    var linkConfig = MSTeamsUtils.getTeamLinkContexts()[pObjectType];
+    if (!linkConfig)
+        return;
+    
+    var existingTeamLinks = newSelect("MST_TEAMLINKID")
+        .from("MST_TEAMLINK")
+        .where("MST_TEAMLINK.OBJECT_ROWID", pRowId)
+        .and("MST_TEAMLINK.OBJECT_TYPE", pObjectType)
+        .arrayColumn();
+    if (existingTeamLinks.length === 0 || !linkConfig.singleLinkPerObject)
+    {
+        neon.openContext("MSTTeamLink", null, null, neon.OPERATINGSTATE_NEW, {
+            "ObjectRowId_param": pRowId,
+            "ObjectType_param": pObjectType
+        });
+    }
+    else
+    {
+        
+    }
+}
+
+MSTeamsUtils.purgeCorruptTeamLinks = function (pRowId, pObjectType, pTeamLinkIdToKeep)
+{
+    var teamLinks = MSTeamsUtils.getLinkedTeams(pRowId, pObjectType).map(function (row)
+    {
+        return row.teamLinkId;
+    });
+    var linkConfig = MSTeamsUtils.getTeamLinkContexts()[pObjectType];
+    var removeLinks = [];
+    if (!linkConfig)
+        removeLinks = teamLinks;
+    else if (linkConfig.singleLinkPerObject && pTeamLinkIdToKeep)
+        removeLinks = teamLinks.filter(function (id) {return id != pTeamLinkIdToKeep;});
+    else if (linkConfig.singleLinkPerObject)
+        removeLinks = teamLinks.slice(1);
+    
+    if (removeLinks.length === 0)
+        return 0;
+    return newWhere("MST_TEAMLINK.MST_TEAMLINKID", removeLinks, SqlBuilder.IN()).deleteData();
+}
+
 /**
  * 
  */
@@ -71,11 +117,20 @@ MSTeamsUtils.createTeamLink = function (pTeamId, pRowId, pObjectType)
  */
 MSTeamsUtils.getLinkedTeams = function (pRowId, pObjectType)
 {
-    return newSelect("MST_TEAM_ID")
+    return newSelect(["MST_TEAMLINKID", "MST_TEAM_ID"])
         .from("MST_TEAMLINK")
         .where("MST_TEAMLINK.OBJECT_ROWID", pRowId)
         .andIfSet("MST_TEAMLINK.OBJECT_TYPE", pObjectType)
-        .arrayColumn();
+        .orderBy("MST_TEAMLINKID")
+        .table()
+        .map(function ([linkId, teamId])
+        {
+            return {
+                teamLinkId: linkId,
+                teamId: teamId
+            };
+        });
+    
 }
 
 /**
@@ -83,7 +138,10 @@ MSTeamsUtils.getLinkedTeams = function (pRowId, pObjectType)
  */
 MSTeamsUtils.getLinkedTeam = function (pRowId, pObjectType)
 {
-    return MSTeamsUtils.getLinkedTeams(pRowId, pObjectType)[0] || null;
+    var linkedTeams = MSTeamsUtils.getLinkedTeams(pRowId, pObjectType);
+    if (linkedTeams.length === 0)
+        return null;
+    return linkedTeams[0].teamId;
 }
 
 /**
@@ -134,6 +192,7 @@ MSTeamsUtils.getTeamRoleSubSql = function (pTeamId, pContactIdField)
     caseWhen.when("(" + CommUtil.getStandardSubSqlMail() + ") in ('" + Utils.objectValues(members).join("', '") + "')")
         .thenString(translate.text("Guest")); 
     
+    logging.log(JSON.stringify(caseWhen))
     return caseWhen.elseString("").toString();
 }
 
diff --git a/process/Sql_lib/process.js b/process/Sql_lib/process.js
index c70131670ec..677d7f4e19b 100644
--- a/process/Sql_lib/process.js
+++ b/process/Sql_lib/process.js
@@ -3184,6 +3184,18 @@ SqlBuilder._CaseStatement.prototype.build = function (pParameters)
     ];
 }
 
+/**
+ * Custom toJSON method that omits the property '_afterWhenMask', because cyclic references can't be stringified
+ */
+SqlBuilder._CaseStatement.prototype.toJSON = function ()
+{
+    return {
+        _whenCondition: this._whenCondition,
+        _whenThens: this._whenThens,
+        _elseValue: this._elseValue
+    };
+}
+
 /**
  * Object providing the then-methods for the case-when expression. It can be only be accessed after calling .when to ensure a 'then' 
  * can only be added after a 'when'.
diff --git a/process/Util_lib/process.js b/process/Util_lib/process.js
index 9a5426854bb..5f5227efc07 100644
--- a/process/Util_lib/process.js
+++ b/process/Util_lib/process.js
@@ -336,7 +336,7 @@ Utils.objectEntries = function (pObject)
 {
     return Object.keys(pObject).map(function (key)
     {
-        return pObject[key];
+        return [key, pObject[key]];
     });
 }
 
@@ -350,7 +350,7 @@ Utils.objectValues = function (pObject)
 {
     return Object.keys(pObject).map(function (key)
     {
-        return [key, pObject[key]];
+        return pObject[key];
     });
 }
 
@@ -519,6 +519,46 @@ StringUtils.unescapeSlashes = function(pValue)
   return parsedStr ;
 }
 
+/**
+ * Transforms the given String to lowerCamelCase
+ * 
+ * @param {String} pString
+ * @return {String} string in lowerCamelCase
+ * @example
+ *      
+ * var name = StringUtils.toLowerCamelCase("Giorno Giovanna");
+ * logging.log(name); //output: "giornoGiovanna"
+ */
+StringUtils.toLowerCamelCase = function (pString)
+{
+    return pString.replace(/(?:^\w|[A-Z]|\b\w|\s+)/g, function (match, index) 
+    {
+        if (+match === 0)  // or if (/\s+/.test(match)) for white spaces
+            return "";
+        return index === 0 ? match.toLowerCase() : match.toUpperCase();
+    });
+}
+
+/**
+ * Transforms the given String to UpperCamelCase
+ * 
+ * @param {String} pString
+ * @return {String} string in UpperCamelCase
+ * @example
+ *      
+ * var youFellForIt = StringUtils.toUpperCamelCase("thunder cross split attack");
+ * logging.log(youFellForIt); //output: "ThunderCrossSplitAttack"
+ */
+StringUtils.toUpperCamelCase = function (pString)
+{
+    return pString.replace(/(?:^\w|[A-Z]|\b\w|\s+)/g, function (match) 
+    {
+        if (+match === 0)  // or if (/\s+/.test(match)) for white spaces
+            return "";
+        return match.toUpperCase();
+    });
+}
+
 /**
  * Class containing static utility functions for numbers
  * Do not create an instance of this
-- 
GitLab


From 6f003b32e2139325f3f95d2654bd21d3b78da3af Mon Sep 17 00:00:00 2001
From: Sebastian Listl <s.listl@adito.de>
Date: Thu, 19 Nov 2020 12:00:56 +0100
Subject: [PATCH 095/184] broken dataless recordcontainers corrected

---
 .../BulkMailAddRecipients_entity.aod          | 28 +------
 .../BulkMailTesting_entity.aod                | 28 +------
 .../CampaignAddParticipants_entity.aod        | 27 ++----
 entity/Email_entity/Email_entity.aod          | 48 ++++-------
 .../ExportTemplateSelection_entity.aod        | 29 +------
 entity/Letter_entity/Letter_entity.aod        | 28 +------
 .../MSTChooseTeam_entity.aod                  | 58 -------------
 .../MSTChooseTeam_entity/documentation.adoc   | 14 ----
 .../recordcontainers/jdito/contentProcess.js  |  9 --
 .../recordcontainers/jdito/onInsert.js        | 35 --------
 .../MSTTeamLink_entity/MSTTeamLink_entity.aod | 83 +++++++++++++++++++
 .../recordcontainers/db/conditionProcess.js   |  7 ++
 .../recordcontainers/db/fromClauseProcess.js  |  3 +
 .../recordcontainers/db/onDBInsert.js         |  7 ++
 entity/MSTTeam_entity/MSTTeam_entity.aod      |  6 --
 .../children/chooseteam/onActionProcess.js    |  8 +-
 .../SerialLetterAddRecipients_entity.aod      | 28 +------
 .../MSTTeamLink.aod}                          |  9 +-
 .../MSTChooseTeamEdit_view.aod                | 25 ------
 .../MSTTeamLinkEdit_view.aod                  | 10 +++
 process/MSTeams_lib/process.js                | 15 ++--
 21 files changed, 165 insertions(+), 340 deletions(-)
 delete mode 100644 entity/MSTChooseTeam_entity/MSTChooseTeam_entity.aod
 delete mode 100644 entity/MSTChooseTeam_entity/documentation.adoc
 delete mode 100644 entity/MSTChooseTeam_entity/recordcontainers/jdito/contentProcess.js
 delete mode 100644 entity/MSTChooseTeam_entity/recordcontainers/jdito/onInsert.js
 create mode 100644 entity/MSTTeamLink_entity/MSTTeamLink_entity.aod
 create mode 100644 entity/MSTTeamLink_entity/recordcontainers/db/conditionProcess.js
 create mode 100644 entity/MSTTeamLink_entity/recordcontainers/db/fromClauseProcess.js
 create mode 100644 entity/MSTTeamLink_entity/recordcontainers/db/onDBInsert.js
 rename neonContext/{MSTChooseTeam/MSTChooseTeam.aod => MSTTeamLink/MSTTeamLink.aod} (65%)
 delete mode 100644 neonView/MSTChooseTeamEdit_view/MSTChooseTeamEdit_view.aod
 create mode 100644 neonView/MSTTeamLinkEdit_view/MSTTeamLinkEdit_view.aod

diff --git a/entity/BulkMailAddRecipients_entity/BulkMailAddRecipients_entity.aod b/entity/BulkMailAddRecipients_entity/BulkMailAddRecipients_entity.aod
index efe6c1b76fb..95b5c59685b 100644
--- a/entity/BulkMailAddRecipients_entity/BulkMailAddRecipients_entity.aod
+++ b/entity/BulkMailAddRecipients_entity/BulkMailAddRecipients_entity.aod
@@ -87,29 +87,9 @@
     </entityParameter>
   </entityFields>
   <recordContainers>
-    <jDitoRecordContainer>
-      <name>jdito</name>
-      <jDitoRecordAlias>Data_alias</jDitoRecordAlias>
-      <isPageable v="true" />
-      <contentProcess>%aditoprj%/entity/MSTChooseTeam_entity/recordcontainers/jdito/contentProcess.js</contentProcess>
-      <onInsert>%aditoprj%/entity/MSTChooseTeam_entity/recordcontainers/jdito/onInsert.js</onInsert>
-      <recordFieldMappings>
-        <jDitoRecordFieldMapping>
-          <name>ALLTEAMS.value</name>
-        </jDitoRecordFieldMapping>
-        <jDitoRecordFieldMapping>
-          <name>ALLTEAMS.displayValue</name>
-        </jDitoRecordFieldMapping>
-        <jDitoRecordFieldMapping>
-          <name>UID.value</name>
-        </jDitoRecordFieldMapping>
-        <jDitoRecordFieldMapping>
-          <name>ALLARCHIVEDTEAMS.displayValue</name>
-        </jDitoRecordFieldMapping>
-        <jDitoRecordFieldMapping>
-          <name>ALLARCHIVEDTEAMS.value</name>
-        </jDitoRecordFieldMapping>
-      </recordFieldMappings>
-    </jDitoRecordContainer>
+    <datalessRecordContainer>
+      <name>datalessConfig</name>
+      <alias>Data_alias</alias>
+    </datalessRecordContainer>
   </recordContainers>
 </entity>
diff --git a/entity/BulkMailTesting_entity/BulkMailTesting_entity.aod b/entity/BulkMailTesting_entity/BulkMailTesting_entity.aod
index e31136e9154..008aa0177c9 100644
--- a/entity/BulkMailTesting_entity/BulkMailTesting_entity.aod
+++ b/entity/BulkMailTesting_entity/BulkMailTesting_entity.aod
@@ -62,29 +62,9 @@
     </entityProvider>
   </entityFields>
   <recordContainers>
-    <jDitoRecordContainer>
-      <name>jdito</name>
-      <jDitoRecordAlias>Data_alias</jDitoRecordAlias>
-      <isPageable v="true" />
-      <contentProcess>%aditoprj%/entity/MSTChooseTeam_entity/recordcontainers/jdito/contentProcess.js</contentProcess>
-      <onInsert>%aditoprj%/entity/MSTChooseTeam_entity/recordcontainers/jdito/onInsert.js</onInsert>
-      <recordFieldMappings>
-        <jDitoRecordFieldMapping>
-          <name>ALLTEAMS.value</name>
-        </jDitoRecordFieldMapping>
-        <jDitoRecordFieldMapping>
-          <name>ALLTEAMS.displayValue</name>
-        </jDitoRecordFieldMapping>
-        <jDitoRecordFieldMapping>
-          <name>UID.value</name>
-        </jDitoRecordFieldMapping>
-        <jDitoRecordFieldMapping>
-          <name>ALLARCHIVEDTEAMS.displayValue</name>
-        </jDitoRecordFieldMapping>
-        <jDitoRecordFieldMapping>
-          <name>ALLARCHIVEDTEAMS.value</name>
-        </jDitoRecordFieldMapping>
-      </recordFieldMappings>
-    </jDitoRecordContainer>
+    <datalessRecordContainer>
+      <name>datalessRecordContainer</name>
+      <alias>Data_alias</alias>
+    </datalessRecordContainer>
   </recordContainers>
 </entity>
diff --git a/entity/CampaignAddParticipants_entity/CampaignAddParticipants_entity.aod b/entity/CampaignAddParticipants_entity/CampaignAddParticipants_entity.aod
index aae7ad15aac..03225b22011 100644
--- a/entity/CampaignAddParticipants_entity/CampaignAddParticipants_entity.aod
+++ b/entity/CampaignAddParticipants_entity/CampaignAddParticipants_entity.aod
@@ -59,11 +59,6 @@
     </entityConsumer>
     <entityConsumer>
       <name>CampaignStepConsumer</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>CampaignStep_entity</entityName>
-        <fieldName>CampaignSteps</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>campaignId_param</name>
@@ -71,11 +66,12 @@
           <expose v="true" />
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>CampaignStep_entity</entityName>
+        <fieldName>CampaignSteps</fieldName>
+      </dependency>
     </entityConsumer>
-    <entityField>
-      <name>UID</name>
-      <state>EDITABLE</state>
-    </entityField>
     <entityParameter>
       <name>currentCampaignId_param</name>
       <expose v="true" />
@@ -156,14 +152,9 @@
     </entityProvider>
   </entityFields>
   <recordContainers>
-    <jDitoRecordContainer>
-      <name>jdito</name>
-      <jDitoRecordAlias>Data_alias</jDitoRecordAlias>
-      <recordFieldMappings>
-        <jDitoRecordFieldMapping>
-          <name>UID.value</name>
-        </jDitoRecordFieldMapping>
-      </recordFieldMappings>
-    </jDitoRecordContainer>
+    <datalessRecordContainer>
+      <name>datalessConfig</name>
+      <alias>Data_alias</alias>
+    </datalessRecordContainer>
   </recordContainers>
 </entity>
diff --git a/entity/Email_entity/Email_entity.aod b/entity/Email_entity/Email_entity.aod
index b4034640f5a..73da7f79012 100644
--- a/entity/Email_entity/Email_entity.aod
+++ b/entity/Email_entity/Email_entity.aod
@@ -29,11 +29,6 @@
     </entityField>
     <entityConsumer>
       <name>DocumentTemplates</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>DocumentTemplate_entity</entityName>
-        <fieldName>#PROVIDER</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>DocumentTemplateType_param</name>
@@ -48,6 +43,11 @@
           <valueProcess>%aditoprj%/entity/Email_entity/entityfields/documenttemplates/children/documenttemplatetypeclassification_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>DocumentTemplate_entity</entityName>
+        <fieldName>#PROVIDER</fieldName>
+      </dependency>
     </entityConsumer>
     <entityParameter>
       <name>Recipient_param</name>
@@ -65,17 +65,17 @@
     </entityField>
     <entityConsumer>
       <name>EmailAddresses</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Communication_entity</entityName>
-        <fieldName>EmailCommunications</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContactId_param</name>
           <valueProcess>%aditoprj%/entity/Email_entity/entityfields/emailaddresses/children/contactid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Communication_entity</entityName>
+        <fieldName>EmailCommunications</fieldName>
+      </dependency>
     </entityConsumer>
     <entityParameter>
       <name>ContactId_param</name>
@@ -151,29 +151,9 @@
     </entityParameter>
   </entityFields>
   <recordContainers>
-    <jDitoRecordContainer>
-      <name>jdito</name>
-      <jDitoRecordAlias>Data_alias</jDitoRecordAlias>
-      <isPageable v="true" />
-      <contentProcess>%aditoprj%/entity/MSTChooseTeam_entity/recordcontainers/jdito/contentProcess.js</contentProcess>
-      <onInsert>%aditoprj%/entity/MSTChooseTeam_entity/recordcontainers/jdito/onInsert.js</onInsert>
-      <recordFieldMappings>
-        <jDitoRecordFieldMapping>
-          <name>ALLTEAMS.value</name>
-        </jDitoRecordFieldMapping>
-        <jDitoRecordFieldMapping>
-          <name>ALLTEAMS.displayValue</name>
-        </jDitoRecordFieldMapping>
-        <jDitoRecordFieldMapping>
-          <name>UID.value</name>
-        </jDitoRecordFieldMapping>
-        <jDitoRecordFieldMapping>
-          <name>ALLARCHIVEDTEAMS.displayValue</name>
-        </jDitoRecordFieldMapping>
-        <jDitoRecordFieldMapping>
-          <name>ALLARCHIVEDTEAMS.value</name>
-        </jDitoRecordFieldMapping>
-      </recordFieldMappings>
-    </jDitoRecordContainer>
+    <datalessRecordContainer>
+      <name>datalessRecordContainer</name>
+      <alias>Data_alias</alias>
+    </datalessRecordContainer>
   </recordContainers>
 </entity>
diff --git a/entity/ExportTemplateSelection_entity/ExportTemplateSelection_entity.aod b/entity/ExportTemplateSelection_entity/ExportTemplateSelection_entity.aod
index 1120b8578e2..2840322c0f7 100644
--- a/entity/ExportTemplateSelection_entity/ExportTemplateSelection_entity.aod
+++ b/entity/ExportTemplateSelection_entity/ExportTemplateSelection_entity.aod
@@ -88,31 +88,10 @@
       <useAggregates v="true" />
     </entityProvider>
   </entityFields>
-  
   <recordContainers>
-    <jDitoRecordContainer>
-      <name>jdito</name>
-      <jDitoRecordAlias>Data_alias</jDitoRecordAlias>
-      <isPageable v="true" />
-      <contentProcess>%aditoprj%/entity/MSTChooseTeam_entity/recordcontainers/jdito/contentProcess.js</contentProcess>
-      <onInsert>%aditoprj%/entity/MSTChooseTeam_entity/recordcontainers/jdito/onInsert.js</onInsert>
-      <recordFieldMappings>
-        <jDitoRecordFieldMapping>
-          <name>ALLTEAMS.value</name>
-        </jDitoRecordFieldMapping>
-        <jDitoRecordFieldMapping>
-          <name>ALLTEAMS.displayValue</name>
-        </jDitoRecordFieldMapping>
-        <jDitoRecordFieldMapping>
-          <name>UID.value</name>
-        </jDitoRecordFieldMapping>
-        <jDitoRecordFieldMapping>
-          <name>ALLARCHIVEDTEAMS.displayValue</name>
-        </jDitoRecordFieldMapping>
-        <jDitoRecordFieldMapping>
-          <name>ALLARCHIVEDTEAMS.value</name>
-        </jDitoRecordFieldMapping>
-      </recordFieldMappings>
-    </jDitoRecordContainer>
+    <datalessRecordContainer>
+      <name>datalessRecordContainer</name>
+      <alias>Data_alias</alias>
+    </datalessRecordContainer>
   </recordContainers>
 </entity>
diff --git a/entity/Letter_entity/Letter_entity.aod b/entity/Letter_entity/Letter_entity.aod
index d82878bd13c..5e357ba6660 100644
--- a/entity/Letter_entity/Letter_entity.aod
+++ b/entity/Letter_entity/Letter_entity.aod
@@ -82,29 +82,9 @@
     </entityProvider>
   </entityFields>
   <recordContainers>
-    <jDitoRecordContainer>
-      <name>jdito</name>
-      <jDitoRecordAlias>Data_alias</jDitoRecordAlias>
-      <isPageable v="true" />
-      <contentProcess>%aditoprj%/entity/MSTChooseTeam_entity/recordcontainers/jdito/contentProcess.js</contentProcess>
-      <onInsert>%aditoprj%/entity/MSTChooseTeam_entity/recordcontainers/jdito/onInsert.js</onInsert>
-      <recordFieldMappings>
-        <jDitoRecordFieldMapping>
-          <name>ALLTEAMS.value</name>
-        </jDitoRecordFieldMapping>
-        <jDitoRecordFieldMapping>
-          <name>ALLTEAMS.displayValue</name>
-        </jDitoRecordFieldMapping>
-        <jDitoRecordFieldMapping>
-          <name>UID.value</name>
-        </jDitoRecordFieldMapping>
-        <jDitoRecordFieldMapping>
-          <name>ALLARCHIVEDTEAMS.displayValue</name>
-        </jDitoRecordFieldMapping>
-        <jDitoRecordFieldMapping>
-          <name>ALLARCHIVEDTEAMS.value</name>
-        </jDitoRecordFieldMapping>
-      </recordFieldMappings>
-    </jDitoRecordContainer>
+    <datalessRecordContainer>
+      <name>datalessConfig</name>
+      <alias>Data_alias</alias>
+    </datalessRecordContainer>
   </recordContainers>
 </entity>
diff --git a/entity/MSTChooseTeam_entity/MSTChooseTeam_entity.aod b/entity/MSTChooseTeam_entity/MSTChooseTeam_entity.aod
deleted file mode 100644
index 3fe2e3f7e7f..00000000000
--- a/entity/MSTChooseTeam_entity/MSTChooseTeam_entity.aod
+++ /dev/null
@@ -1,58 +0,0 @@
-<?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>MSTChooseTeam_entity</name>
-  <majorModelMode>DISTRIBUTED</majorModelMode>
-  <documentation>%aditoprj%/entity/MSTChooseTeam_entity/documentation.adoc</documentation>
-  <siblings />
-  <recordContainer>jdito</recordContainer>
-  <entityFields>
-    <entityProvider>
-      <name>#PROVIDER</name>
-    </entityProvider>
-    <entityField>
-      <name>MST_TEAM</name>
-      <title>Team</title>
-      <consumer>Teams</consumer>
-      <selectionMode>SINGLE</selectionMode>
-    </entityField>
-    <entityField>
-      <name>UID</name>
-    </entityField>
-    <entityParameter>
-      <name>ObjectRowId_param</name>
-      <expose v="true" />
-    </entityParameter>
-    <entityConsumer>
-      <name>Teams</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>MSTTeam_entity</entityName>
-        <fieldName>#PROVIDER</fieldName>
-      </dependency>
-    </entityConsumer>
-    <entityParameter>
-      <name>ObjectType_param</name>
-      <expose v="true" />
-    </entityParameter>
-    <entityProvider>
-      <name>#PROVIDER_AGGREGATES</name>
-      <useAggregates v="true" />
-    </entityProvider>
-  </entityFields>
-  <recordContainers>
-    <jDitoRecordContainer>
-      <name>jdito</name>
-      <jDitoRecordAlias>Data_alias</jDitoRecordAlias>
-      <contentProcess>%aditoprj%/entity/MSTChooseTeam_entity/recordcontainers/jdito/contentProcess.js</contentProcess>
-      <onInsert>%aditoprj%/entity/MSTChooseTeam_entity/recordcontainers/jdito/onInsert.js</onInsert>
-      <recordFieldMappings>
-        <jDitoRecordFieldMapping>
-          <name>UID.value</name>
-        </jDitoRecordFieldMapping>
-        <jDitoRecordFieldMapping>
-          <name>MST_TEAM.value</name>
-        </jDitoRecordFieldMapping>
-      </recordFieldMappings>
-    </jDitoRecordContainer>
-  </recordContainers>
-</entity>
diff --git a/entity/MSTChooseTeam_entity/documentation.adoc b/entity/MSTChooseTeam_entity/documentation.adoc
deleted file mode 100644
index 9c7ade951f5..00000000000
--- a/entity/MSTChooseTeam_entity/documentation.adoc
+++ /dev/null
@@ -1,14 +0,0 @@
-MSTChooseTeam
-============
-
-== Overview ==
-MSTChooseTeam is used to link any MST team to a sales project 
-
-== A MSTChooseTeam consists of some modules: ==
-- MSTChooseTeam itself
-
-== BestPractice ==
-
-== FAQ ==
-
-
diff --git a/entity/MSTChooseTeam_entity/recordcontainers/jdito/contentProcess.js b/entity/MSTChooseTeam_entity/recordcontainers/jdito/contentProcess.js
deleted file mode 100644
index af9ece7caa7..00000000000
--- a/entity/MSTChooseTeam_entity/recordcontainers/jdito/contentProcess.js
+++ /dev/null
@@ -1,9 +0,0 @@
-import("system.result");
-import("system.vars");
-
-//TODO: This dummy implementation shouldn't be nescessary here. Remove this process eventually. #1051003
-var rows = [];
-if (vars.get("$local.idvalues"))
-    rows = vars.get("$local.idvalues").map(function (id) {return [id, ""];});
-
-result.object(rows);
\ No newline at end of file
diff --git a/entity/MSTChooseTeam_entity/recordcontainers/jdito/onInsert.js b/entity/MSTChooseTeam_entity/recordcontainers/jdito/onInsert.js
deleted file mode 100644
index 66e2ebe9078..00000000000
--- a/entity/MSTChooseTeam_entity/recordcontainers/jdito/onInsert.js
+++ /dev/null
@@ -1,35 +0,0 @@
-import("system.teams");
-import("Sql_lib")
-import("system.vars")
-import("system.teams");
-import("system.util");
-import("system.neon");
-import("MSTeams_lib");
-
-var rowData = vars.get("$local.rowdata");
-
-var teamIdAndName = rowData["MST_TEAM.value"];
-
-if(teamIdAndName)
-{    
-    var [teamId, teamName] = JSON.parse(teamIdAndName);
-    var channelId = teams.getGeneralChannelId(teamId);
-    var webUrl = teams.getWebUrl(teamId);
-    
-    var mstTeamId = newSelect("MST_TEAMID")
-        .from("MST_TEAM")
-        .where("MST_TEAM.MST_TEAMID", teamId)
-        .cell();
-    
-    if (!mstTeamId)
-    {
-        new SqlBuilder().insertFields({
-            "MST_TEAMID" : teamId,
-            "TEAMNAME" : teamName,
-            "GENERAL_CHANNELID" : channelId,
-            "IS_ARCHIVED" : 0,
-            "WEB_URL" : webUrl
-        }, "MST_TEAM");
-    }
-    MSTeamsUtils.createTeamLink(teamId, vars.get("$param.ObjectRowId_param"), vars.get("$param.ObjectType_param"));
-}
\ No newline at end of file
diff --git a/entity/MSTTeamLink_entity/MSTTeamLink_entity.aod b/entity/MSTTeamLink_entity/MSTTeamLink_entity.aod
new file mode 100644
index 00000000000..82174ca3cd1
--- /dev/null
+++ b/entity/MSTTeamLink_entity/MSTTeamLink_entity.aod
@@ -0,0 +1,83 @@
+<?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>MSTTeamLink_entity</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <recordContainer>db</recordContainer>
+  <entityFields>
+    <entityProvider>
+      <name>#PROVIDER</name>
+    </entityProvider>
+    <entityProvider>
+      <name>#PROVIDER_AGGREGATES</name>
+      <useAggregates v="true" />
+    </entityProvider>
+    <entityField>
+      <name>MST_TEAMLINKID</name>
+    </entityField>
+    <entityField>
+      <name>MST_TEAM_ID</name>
+      <title>Team</title>
+    </entityField>
+    <entityField>
+      <name>OBJECT_ROWID</name>
+    </entityField>
+    <entityField>
+      <name>OBJECT_TYPE</name>
+    </entityField>
+    <entityParameter>
+      <name>ObjectRowId_param</name>
+      <expose v="true" />
+    </entityParameter>
+    <entityParameter>
+      <name>ObjectType_param</name>
+      <expose v="true" />
+    </entityParameter>
+  </entityFields>
+  <recordContainers>
+    <dbRecordContainer>
+      <name>db</name>
+      <alias>Data_alias</alias>
+      <fromClauseProcess>%aditoprj%/entity/MSTTeamLink_entity/recordcontainers/db/fromClauseProcess.js</fromClauseProcess>
+      <conditionProcess>%aditoprj%/entity/MSTTeamLink_entity/recordcontainers/db/conditionProcess.js</conditionProcess>
+      <onDBInsert>%aditoprj%/entity/MSTTeamLink_entity/recordcontainers/db/onDBInsert.js</onDBInsert>
+      <linkInformation>
+        <linkInformation>
+          <name>178230f3-4ee4-4ec0-a7f6-4f4ddddbbb22</name>
+          <tableName>MST_TEAMLINK</tableName>
+          <primaryKey>MST_TEAMLINKID</primaryKey>
+          <isUIDTable v="true" />
+          <readonly v="false" />
+        </linkInformation>
+        <linkInformation>
+          <name>53378325-f195-4eb3-9e22-68fd769eef03</name>
+          <tableName>MST_TEAM</tableName>
+          <primaryKey>MST_TEAMID</primaryKey>
+          <isUIDTable v="false" />
+          <readonly v="true" />
+        </linkInformation>
+      </linkInformation>
+      <recordFieldMappings>
+        <dbRecordFieldMapping>
+          <name>MST_TEAMLINKID.value</name>
+          <recordfield>MST_TEAMLINK.MST_TEAMLINKID</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>MST_TEAM_ID.value</name>
+          <recordfield>MST_TEAMLINK.MST_TEAM_ID</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>OBJECT_ROWID.value</name>
+          <recordfield>MST_TEAMLINK.OBJECT_ROWID</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>OBJECT_TYPE.value</name>
+          <recordfield>MST_TEAMLINK.OBJECT_TYPE</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>MST_TEAM_ID.displayValue</name>
+          <recordfield>MST_TEAM.TEAMNAME</recordfield>
+        </dbRecordFieldMapping>
+      </recordFieldMappings>
+    </dbRecordContainer>
+  </recordContainers>
+</entity>
diff --git a/entity/MSTTeamLink_entity/recordcontainers/db/conditionProcess.js b/entity/MSTTeamLink_entity/recordcontainers/db/conditionProcess.js
new file mode 100644
index 00000000000..ad0a18104e1
--- /dev/null
+++ b/entity/MSTTeamLink_entity/recordcontainers/db/conditionProcess.js
@@ -0,0 +1,7 @@
+import("system.result");
+import("Sql_lib");
+
+var condition = newWhereIfSet("MST_TEAMLINK.OBJECT_ROWID", "$param.ObjectRowId_param")
+    .andIfSet("MST_TEAMLINK.OBJECT_TYPE", "$param.ObjectType_param");
+
+result.string(condition.toString(SqlBuilder.NORESULT_CONDITION()));
\ No newline at end of file
diff --git a/entity/MSTTeamLink_entity/recordcontainers/db/fromClauseProcess.js b/entity/MSTTeamLink_entity/recordcontainers/db/fromClauseProcess.js
new file mode 100644
index 00000000000..4457ba9b19f
--- /dev/null
+++ b/entity/MSTTeamLink_entity/recordcontainers/db/fromClauseProcess.js
@@ -0,0 +1,3 @@
+import("system.result");
+
+result.string("MST_TEAMLINK left join MST_TEAM on MST_TEAMLINK.MST_TEAM_ID = MST_TEAM.MST_TEAMID");
\ No newline at end of file
diff --git a/entity/MSTTeamLink_entity/recordcontainers/db/onDBInsert.js b/entity/MSTTeamLink_entity/recordcontainers/db/onDBInsert.js
new file mode 100644
index 00000000000..3dec5ca7f61
--- /dev/null
+++ b/entity/MSTTeamLink_entity/recordcontainers/db/onDBInsert.js
@@ -0,0 +1,7 @@
+import("system.vars");
+import("MSTeams_lib");
+
+var teamLinkId = vars.get("$local.uid");
+var rowData = vars.get("$local.rowdata");
+//if the linked context is configured to have just one teamLink but the object already has a teamLink, the old teamLink will be deleted
+MSTeamsUtils.purgeCorruptTeamLinks(rowData["MST_TEAMLINK.OBJECT_ROWID"], rowData["MST_TEAMLINK.OBJECT_TYPE"], teamLinkId);
\ No newline at end of file
diff --git a/entity/MSTTeam_entity/MSTTeam_entity.aod b/entity/MSTTeam_entity/MSTTeam_entity.aod
index eb36ed85e05..27a447b2303 100644
--- a/entity/MSTTeam_entity/MSTTeam_entity.aod
+++ b/entity/MSTTeam_entity/MSTTeam_entity.aod
@@ -13,12 +13,6 @@
       <name>#PROVIDER</name>
       <lookupIdfield>TEAMID_AND_NAME</lookupIdfield>
       <dependencies>
-        <entityDependency>
-          <name>31745153-bc31-4529-a6dc-0cddfd2c5b7c</name>
-          <entityName>MSTChooseTeam_entity</entityName>
-          <fieldName>Teams</fieldName>
-          <isConsumer v="false" />
-        </entityDependency>
         <entityDependency>
           <name>9794baf5-ffc8-498e-8aa8-f4eca945441c</name>
           <entityName>MSTTeamLink_entity</entityName>
diff --git a/entity/Member_entity/entityfields/msteamsactiongroup/children/chooseteam/onActionProcess.js b/entity/Member_entity/entityfields/msteamsactiongroup/children/chooseteam/onActionProcess.js
index 2f2ae94d38c..f5761f78639 100644
--- a/entity/Member_entity/entityfields/msteamsactiongroup/children/chooseteam/onActionProcess.js
+++ b/entity/Member_entity/entityfields/msteamsactiongroup/children/chooseteam/onActionProcess.js
@@ -1,8 +1,4 @@
+import("MSTeams_lib");
 import("system.vars");
-import("system.neon");
-import("system.teams");
-import("system.logging");
 
-neon.openContext("MSTChooseTeam", null, null, neon.OPERATINGSTATE_NEW, {
-    "SalesprojectId_param" : vars.get("$param.ObjectRowId_param")
-});
\ No newline at end of file
+MSTeamsUtils.changeTeamsLink(vars.get("$field.OBJECT_ROWID"), vars.get("$field.OBJECT_TYPE"));
\ No newline at end of file
diff --git a/entity/SerialLetterAddRecipients_entity/SerialLetterAddRecipients_entity.aod b/entity/SerialLetterAddRecipients_entity/SerialLetterAddRecipients_entity.aod
index 035ea4090d2..a72c0501c5a 100644
--- a/entity/SerialLetterAddRecipients_entity/SerialLetterAddRecipients_entity.aod
+++ b/entity/SerialLetterAddRecipients_entity/SerialLetterAddRecipients_entity.aod
@@ -83,29 +83,9 @@
     </entityParameter>
   </entityFields>
   <recordContainers>
-    <jDitoRecordContainer>
-      <name>jdito</name>
-      <jDitoRecordAlias>Data_alias</jDitoRecordAlias>
-      <isPageable v="true" />
-      <contentProcess>%aditoprj%/entity/MSTChooseTeam_entity/recordcontainers/jdito/contentProcess.js</contentProcess>
-      <onInsert>%aditoprj%/entity/MSTChooseTeam_entity/recordcontainers/jdito/onInsert.js</onInsert>
-      <recordFieldMappings>
-        <jDitoRecordFieldMapping>
-          <name>ALLTEAMS.value</name>
-        </jDitoRecordFieldMapping>
-        <jDitoRecordFieldMapping>
-          <name>ALLTEAMS.displayValue</name>
-        </jDitoRecordFieldMapping>
-        <jDitoRecordFieldMapping>
-          <name>UID.value</name>
-        </jDitoRecordFieldMapping>
-        <jDitoRecordFieldMapping>
-          <name>ALLARCHIVEDTEAMS.displayValue</name>
-        </jDitoRecordFieldMapping>
-        <jDitoRecordFieldMapping>
-          <name>ALLARCHIVEDTEAMS.value</name>
-        </jDitoRecordFieldMapping>
-      </recordFieldMappings>
-    </jDitoRecordContainer>
+    <datalessRecordContainer>
+      <name>datalessRecordContainer</name>
+      <alias>Data_alias</alias>
+    </datalessRecordContainer>
   </recordContainers>
 </entity>
diff --git a/neonContext/MSTChooseTeam/MSTChooseTeam.aod b/neonContext/MSTTeamLink/MSTTeamLink.aod
similarity index 65%
rename from neonContext/MSTChooseTeam/MSTChooseTeam.aod
rename to neonContext/MSTTeamLink/MSTTeamLink.aod
index c28f7a58024..31b2ad861a6 100644
--- a/neonContext/MSTChooseTeam/MSTChooseTeam.aod
+++ b/neonContext/MSTTeamLink/MSTTeamLink.aod
@@ -1,13 +1,12 @@
 <?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>MSTChooseTeam</name>
+  <name>MSTTeamLink</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
-  <editView>MSTChooseTeamEdit_view</editView>
-  <entity>MSTChooseTeam_entity</entity>
+  <entity>MSTTeamLink_entity</entity>
   <references>
     <neonViewReference>
-      <name>0c4e977f-1ce1-4782-9a7f-7cabd557c9fc</name>
-      <view>MSTChooseTeamEdit_view</view>
+      <name>a165469f-eea5-4427-b5ba-4477fe7e04e6</name>
+      <view>MSTTeamLinkEdit_view</view>
     </neonViewReference>
   </references>
 </neonContext>
diff --git a/neonView/MSTChooseTeamEdit_view/MSTChooseTeamEdit_view.aod b/neonView/MSTChooseTeamEdit_view/MSTChooseTeamEdit_view.aod
deleted file mode 100644
index bae0a1ab12f..00000000000
--- a/neonView/MSTChooseTeamEdit_view/MSTChooseTeamEdit_view.aod
+++ /dev/null
@@ -1,25 +0,0 @@
-<?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>MSTChooseTeamEdit_view</name>
-  <majorModelMode>DISTRIBUTED</majorModelMode>
-  <size>SMALL</size>
-  <layout>
-    <boxLayout>
-      <name>layout</name>
-    </boxLayout>
-  </layout>
-  <children>
-    <genericViewTemplate>
-      <name>Team</name>
-      <editMode v="true" />
-      <entityField>#ENTITY</entityField>
-      <title>Alle Teams</title>
-      <fields>
-        <entityFieldLink>
-          <name>ec6b987e-4f7a-405b-8248-56625c92d3a5</name>
-          <entityField>MST_TEAM</entityField>
-        </entityFieldLink>
-      </fields>
-    </genericViewTemplate>
-  </children>
-</neonView>
diff --git a/neonView/MSTTeamLinkEdit_view/MSTTeamLinkEdit_view.aod b/neonView/MSTTeamLinkEdit_view/MSTTeamLinkEdit_view.aod
new file mode 100644
index 00000000000..b7261189dd7
--- /dev/null
+++ b/neonView/MSTTeamLinkEdit_view/MSTTeamLinkEdit_view.aod
@@ -0,0 +1,10 @@
+<?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>MSTTeamLinkEdit_view</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <layout>
+    <boxLayout>
+      <name>layout</name>
+    </boxLayout>
+  </layout>
+</neonView>
diff --git a/process/MSTeams_lib/process.js b/process/MSTeams_lib/process.js
index 4cff133da45..f243b05ff0c 100644
--- a/process/MSTeams_lib/process.js
+++ b/process/MSTeams_lib/process.js
@@ -44,17 +44,14 @@ MSTeamsUtils.changeTeamsLink = function (pRowId, pObjectType)
         .where("MST_TEAMLINK.OBJECT_ROWID", pRowId)
         .and("MST_TEAMLINK.OBJECT_TYPE", pObjectType)
         .arrayColumn();
+    var params = {
+        "ObjectRowId_param": pRowId,
+        "ObjectType_param": pObjectType
+    };
     if (existingTeamLinks.length === 0 || !linkConfig.singleLinkPerObject)
-    {
-        neon.openContext("MSTTeamLink", null, null, neon.OPERATINGSTATE_NEW, {
-            "ObjectRowId_param": pRowId,
-            "ObjectType_param": pObjectType
-        });
-    }
+        neon.openContext("MSTTeamLink", null, null, neon.OPERATINGSTATE_NEW, params);
     else
-    {
-        
-    }
+        neon.openContext("MSTTeamLink", null, [existingTeamLinks[0]], neon.OPERATINGSTATE_EDIT, params);
 }
 
 MSTeamsUtils.purgeCorruptTeamLinks = function (pRowId, pObjectType, pTeamLinkIdToKeep)
-- 
GitLab


From 9eff7fd5cd20cce67f9b0f81f69be24a5ac0b14e Mon Sep 17 00:00:00 2001
From: Sebastian Listl <s.listl@adito.de>
Date: Fri, 20 Nov 2020 15:57:04 +0100
Subject: [PATCH 096/184] MSTTeamLink_entity

---
 .../MSTTeamLink_entity/MSTTeamLink_entity.aod | 32 ++++++++++++++++-
 entity/MSTTeamLink_entity/afterUiInit.js      | 13 +++++++
 .../entityfields/mst_team_id/valueProcess.js  |  8 +++++
 .../entityfields/object_rowid/valueProcess.js |  6 ++++
 .../entityfields/object_type/valueProcess.js  |  6 ++++
 .../team_id_and_name/displayValueProcess.js   |  4 +++
 .../team_id_and_name/documentation.adoc       |  7 ++++
 .../team_id_and_name/valueProcess.js          |  7 ++++
 .../entityfields/teamname/valueProcess.js     |  8 +++++
 .../recordcontainers/db/onDBInsert.js         |  7 +++-
 .../recordcontainers/db/onDBUpdate.js         |  9 +++++
 entity/MSTTeam_entity/MSTTeam_entity.aod      | 35 ++++++++++++++-----
 .../children/usecache_param/valueProcess.js   |  3 ++
 .../teamsbyidandname/documentation.adoc       |  4 +++
 .../recordcontainers/jdito/cacheKeyProcess.js |  7 ++++
 .../recordcontainers/jdito/onInsert.js        |  9 +----
 entity/Member_entity/Member_entity.aod        |  1 +
 .../Salesproject_entity.aod                   |  1 +
 neonContext/MSTTeamLink/MSTTeamLink.aod       |  1 +
 .../MSTTeamLinkEdit_view.aod                  | 13 +++++++
 process/CachedRecordContainer_lib/process.js  | 15 +++++++-
 process/Liquibase_lib/process.js              |  2 +-
 process/MSTeams_lib/process.js                | 20 +++++++++++
 23 files changed, 197 insertions(+), 21 deletions(-)
 create mode 100644 entity/MSTTeamLink_entity/afterUiInit.js
 create mode 100644 entity/MSTTeamLink_entity/entityfields/mst_team_id/valueProcess.js
 create mode 100644 entity/MSTTeamLink_entity/entityfields/object_rowid/valueProcess.js
 create mode 100644 entity/MSTTeamLink_entity/entityfields/object_type/valueProcess.js
 create mode 100644 entity/MSTTeamLink_entity/entityfields/team_id_and_name/displayValueProcess.js
 create mode 100644 entity/MSTTeamLink_entity/entityfields/team_id_and_name/documentation.adoc
 create mode 100644 entity/MSTTeamLink_entity/entityfields/team_id_and_name/valueProcess.js
 create mode 100644 entity/MSTTeamLink_entity/entityfields/teamname/valueProcess.js
 create mode 100644 entity/MSTTeamLink_entity/recordcontainers/db/onDBUpdate.js
 create mode 100644 entity/MSTTeam_entity/entityfields/teamsbyidandname/children/usecache_param/valueProcess.js
 create mode 100644 entity/MSTTeam_entity/entityfields/teamsbyidandname/documentation.adoc
 create mode 100644 entity/MSTTeam_entity/recordcontainers/jdito/cacheKeyProcess.js

diff --git a/entity/MSTTeamLink_entity/MSTTeamLink_entity.aod b/entity/MSTTeamLink_entity/MSTTeamLink_entity.aod
index 82174ca3cd1..eec88fc693d 100644
--- a/entity/MSTTeamLink_entity/MSTTeamLink_entity.aod
+++ b/entity/MSTTeamLink_entity/MSTTeamLink_entity.aod
@@ -2,6 +2,11 @@
 <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>MSTTeamLink_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
+  <siblings>
+    <element>Salesproject_entity</element>
+    <element>Member_entity</element>
+  </siblings>
+  <afterUiInit>%aditoprj%/entity/MSTTeamLink_entity/afterUiInit.js</afterUiInit>
   <recordContainer>db</recordContainer>
   <entityFields>
     <entityProvider>
@@ -17,12 +22,16 @@
     <entityField>
       <name>MST_TEAM_ID</name>
       <title>Team</title>
+      <mandatory v="true" />
+      <valueProcess>%aditoprj%/entity/MSTTeamLink_entity/entityfields/mst_team_id/valueProcess.js</valueProcess>
     </entityField>
     <entityField>
       <name>OBJECT_ROWID</name>
+      <valueProcess>%aditoprj%/entity/MSTTeamLink_entity/entityfields/object_rowid/valueProcess.js</valueProcess>
     </entityField>
     <entityField>
       <name>OBJECT_TYPE</name>
+      <valueProcess>%aditoprj%/entity/MSTTeamLink_entity/entityfields/object_type/valueProcess.js</valueProcess>
     </entityField>
     <entityParameter>
       <name>ObjectRowId_param</name>
@@ -32,6 +41,26 @@
       <name>ObjectType_param</name>
       <expose v="true" />
     </entityParameter>
+    <entityConsumer>
+      <name>Teams</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>MSTTeam_entity</entityName>
+        <fieldName>TeamsByIdAndName</fieldName>
+      </dependency>
+    </entityConsumer>
+    <entityField>
+      <name>TEAMNAME</name>
+      <valueProcess>%aditoprj%/entity/MSTTeamLink_entity/entityfields/teamname/valueProcess.js</valueProcess>
+    </entityField>
+    <entityField>
+      <name>TEAM_ID_AND_NAME</name>
+      <documentation>%aditoprj%/entity/MSTTeamLink_entity/entityfields/team_id_and_name/documentation.adoc</documentation>
+      <title>Team</title>
+      <consumer>Teams</consumer>
+      <valueProcess>%aditoprj%/entity/MSTTeamLink_entity/entityfields/team_id_and_name/valueProcess.js</valueProcess>
+      <displayValueProcess>%aditoprj%/entity/MSTTeamLink_entity/entityfields/team_id_and_name/displayValueProcess.js</displayValueProcess>
+    </entityField>
   </entityFields>
   <recordContainers>
     <dbRecordContainer>
@@ -40,6 +69,7 @@
       <fromClauseProcess>%aditoprj%/entity/MSTTeamLink_entity/recordcontainers/db/fromClauseProcess.js</fromClauseProcess>
       <conditionProcess>%aditoprj%/entity/MSTTeamLink_entity/recordcontainers/db/conditionProcess.js</conditionProcess>
       <onDBInsert>%aditoprj%/entity/MSTTeamLink_entity/recordcontainers/db/onDBInsert.js</onDBInsert>
+      <onDBUpdate>%aditoprj%/entity/MSTTeamLink_entity/recordcontainers/db/onDBUpdate.js</onDBUpdate>
       <linkInformation>
         <linkInformation>
           <name>178230f3-4ee4-4ec0-a7f6-4f4ddddbbb22</name>
@@ -74,7 +104,7 @@
           <recordfield>MST_TEAMLINK.OBJECT_TYPE</recordfield>
         </dbRecordFieldMapping>
         <dbRecordFieldMapping>
-          <name>MST_TEAM_ID.displayValue</name>
+          <name>TEAMNAME.value</name>
           <recordfield>MST_TEAM.TEAMNAME</recordfield>
         </dbRecordFieldMapping>
       </recordFieldMappings>
diff --git a/entity/MSTTeamLink_entity/afterUiInit.js b/entity/MSTTeamLink_entity/afterUiInit.js
new file mode 100644
index 00000000000..bac4e960d87
--- /dev/null
+++ b/entity/MSTTeamLink_entity/afterUiInit.js
@@ -0,0 +1,13 @@
+import("system.vars");
+import("system.neon");
+import("system.entities");
+
+//reload the teams once, because the cache might not be up-to-date
+if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW || vars.get("$sys.recordstate") == neon.OPERATINGSTATE_EDIT)
+{
+    entities.invalidateCache("MSTTeam_entity", "jdito");
+    entities.getRows(entities.createConfigForLoadingConsumerRows()
+        .consumer("Teams")
+        .fields(["UID", "TEAMNAME", "TEAMID_AND_NAME", "ISARCHIVED", "DESCRIPTION"])
+    );
+}
\ No newline at end of file
diff --git a/entity/MSTTeamLink_entity/entityfields/mst_team_id/valueProcess.js b/entity/MSTTeamLink_entity/entityfields/mst_team_id/valueProcess.js
new file mode 100644
index 00000000000..8b66b4de6f1
--- /dev/null
+++ b/entity/MSTTeamLink_entity/entityfields/mst_team_id/valueProcess.js
@@ -0,0 +1,8 @@
+import("system.result");
+import("system.neon");
+import("system.vars");
+import("Util_lib");
+
+var teamIdAndName = Utils.parseJSON(vars.get("$field.TEAM_ID_AND_NAME"));
+if (teamIdAndName && (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW || vars.get("$sys.recordstate") == neon.OPERATINGSTATE_EDIT))
+    result.string(teamIdAndName[0]);
\ No newline at end of file
diff --git a/entity/MSTTeamLink_entity/entityfields/object_rowid/valueProcess.js b/entity/MSTTeamLink_entity/entityfields/object_rowid/valueProcess.js
new file mode 100644
index 00000000000..53123b405da
--- /dev/null
+++ b/entity/MSTTeamLink_entity/entityfields/object_rowid/valueProcess.js
@@ -0,0 +1,6 @@
+import("system.neon");
+import("system.vars");
+import("system.result");
+
+if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW)
+    result.string(vars.get("$param.ObjectRowId_param"));
\ No newline at end of file
diff --git a/entity/MSTTeamLink_entity/entityfields/object_type/valueProcess.js b/entity/MSTTeamLink_entity/entityfields/object_type/valueProcess.js
new file mode 100644
index 00000000000..7f34d7fdb90
--- /dev/null
+++ b/entity/MSTTeamLink_entity/entityfields/object_type/valueProcess.js
@@ -0,0 +1,6 @@
+import("system.neon");
+import("system.vars");
+import("system.result");
+
+if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW)
+    result.string(vars.get("$param.ObjectType_param"));
\ No newline at end of file
diff --git a/entity/MSTTeamLink_entity/entityfields/team_id_and_name/displayValueProcess.js b/entity/MSTTeamLink_entity/entityfields/team_id_and_name/displayValueProcess.js
new file mode 100644
index 00000000000..ada1bccad1d
--- /dev/null
+++ b/entity/MSTTeamLink_entity/entityfields/team_id_and_name/displayValueProcess.js
@@ -0,0 +1,4 @@
+import("system.vars");
+import("system.result");
+
+result.string(vars.get("$field.TEAMNAME"));
\ No newline at end of file
diff --git a/entity/MSTTeamLink_entity/entityfields/team_id_and_name/documentation.adoc b/entity/MSTTeamLink_entity/entityfields/team_id_and_name/documentation.adoc
new file mode 100644
index 00000000000..7ef07b42d0e
--- /dev/null
+++ b/entity/MSTTeamLink_entity/entityfields/team_id_and_name/documentation.adoc
@@ -0,0 +1,7 @@
+= TEAM_ID_AND_NAME
+
+This field is used for selecting a MST team for the teamLink. Because we need both the id and the name from the team, it can't be selected
+directly in the MST_TEAM_ID field, which contains only the id (and fetching the name afterwards using the id would be rather slow).
+
+In new- or edit-mode, the two fields MST_TEAM_ID and TEAMNAME pull their values from this field. In view-mode, this field gets the value
+from MST_TEAM_ID and TEAMNAME, because only these two fields are connected to the recordContainer.
\ No newline at end of file
diff --git a/entity/MSTTeamLink_entity/entityfields/team_id_and_name/valueProcess.js b/entity/MSTTeamLink_entity/entityfields/team_id_and_name/valueProcess.js
new file mode 100644
index 00000000000..94638c9fe90
--- /dev/null
+++ b/entity/MSTTeamLink_entity/entityfields/team_id_and_name/valueProcess.js
@@ -0,0 +1,7 @@
+import("system.result");
+import("system.neon");
+import("system.vars");
+
+//in view-mode, load the values from the fields that are connected to the recordcontainer
+if (vars.get("$sys.recordstate") != neon.OPERATINGSTATE_NEW && vars.get("$sys.recordstate") != neon.OPERATINGSTATE_EDIT)
+    result.string(JSON.stringify([vars.get("$field.MST_TEAM_ID"), vars.get("$field.TEAMNAME")]));
\ No newline at end of file
diff --git a/entity/MSTTeamLink_entity/entityfields/teamname/valueProcess.js b/entity/MSTTeamLink_entity/entityfields/teamname/valueProcess.js
new file mode 100644
index 00000000000..d3f581dba2d
--- /dev/null
+++ b/entity/MSTTeamLink_entity/entityfields/teamname/valueProcess.js
@@ -0,0 +1,8 @@
+import("system.result");
+import("system.neon");
+import("system.vars");
+import("Util_lib");
+
+var teamIdAndName = Utils.parseJSON(vars.get("$field.TEAM_ID_AND_NAME"));
+if (teamIdAndName && (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW || vars.get("$sys.recordstate") == neon.OPERATINGSTATE_EDIT))
+    result.string(teamIdAndName[1]);
\ No newline at end of file
diff --git a/entity/MSTTeamLink_entity/recordcontainers/db/onDBInsert.js b/entity/MSTTeamLink_entity/recordcontainers/db/onDBInsert.js
index 3dec5ca7f61..bf45fb33601 100644
--- a/entity/MSTTeamLink_entity/recordcontainers/db/onDBInsert.js
+++ b/entity/MSTTeamLink_entity/recordcontainers/db/onDBInsert.js
@@ -4,4 +4,9 @@ import("MSTeams_lib");
 var teamLinkId = vars.get("$local.uid");
 var rowData = vars.get("$local.rowdata");
 //if the linked context is configured to have just one teamLink but the object already has a teamLink, the old teamLink will be deleted
-MSTeamsUtils.purgeCorruptTeamLinks(rowData["MST_TEAMLINK.OBJECT_ROWID"], rowData["MST_TEAMLINK.OBJECT_TYPE"], teamLinkId);
\ No newline at end of file
+MSTeamsUtils.purgeCorruptTeamLinks(rowData["MST_TEAMLINK.OBJECT_ROWID"], rowData["MST_TEAMLINK.OBJECT_TYPE"], teamLinkId);
+
+MSTeamsUtils.insertTeamIfMissing({
+    teamId: rowData["MST_TEAMLINK.MST_TEAM_ID"],
+    teamName: rowData["MST_TEAM.TEAMNAME"]
+});
\ No newline at end of file
diff --git a/entity/MSTTeamLink_entity/recordcontainers/db/onDBUpdate.js b/entity/MSTTeamLink_entity/recordcontainers/db/onDBUpdate.js
new file mode 100644
index 00000000000..61769345ec3
--- /dev/null
+++ b/entity/MSTTeamLink_entity/recordcontainers/db/onDBUpdate.js
@@ -0,0 +1,9 @@
+import("system.vars");
+import("MSTeams_lib");
+
+var rowData = vars.get("$local.rowdata");
+
+MSTeamsUtils.insertTeamIfMissing({
+    teamId: rowData["MST_TEAMLINK.MST_TEAM_ID"],
+    teamName: rowData["MST_TEAM.TEAMNAME"]
+});
\ No newline at end of file
diff --git a/entity/MSTTeam_entity/MSTTeam_entity.aod b/entity/MSTTeam_entity/MSTTeam_entity.aod
index 27a447b2303..d062fa0ba01 100644
--- a/entity/MSTTeam_entity/MSTTeam_entity.aod
+++ b/entity/MSTTeam_entity/MSTTeam_entity.aod
@@ -11,15 +11,6 @@
   <entityFields>
     <entityProvider>
       <name>#PROVIDER</name>
-      <lookupIdfield>TEAMID_AND_NAME</lookupIdfield>
-      <dependencies>
-        <entityDependency>
-          <name>9794baf5-ffc8-498e-8aa8-f4eca945441c</name>
-          <entityName>MSTTeamLink_entity</entityName>
-          <fieldName>Teams</fieldName>
-          <isConsumer v="false" />
-        </entityDependency>
-      </dependencies>
     </entityProvider>
     <entityField>
       <name>UID</name>
@@ -108,6 +99,30 @@
       <expose v="true" />
       <description>PARAMETER</description>
     </entityParameter>
+    <entityProvider>
+      <name>TeamsByIdAndName</name>
+      <lookupIdfield>TEAMID_AND_NAME</lookupIdfield>
+      <documentation>%aditoprj%/entity/MSTTeam_entity/entityfields/teamsbyidandname/documentation.adoc</documentation>
+      <children>
+        <entityParameter>
+          <name>UseCache_param</name>
+          <valueProcess>%aditoprj%/entity/MSTTeam_entity/entityfields/teamsbyidandname/children/usecache_param/valueProcess.js</valueProcess>
+          <expose v="false" />
+        </entityParameter>
+      </children>
+      <dependencies>
+        <entityDependency>
+          <name>e48136a2-5f66-4399-903a-cd1363fa30c6</name>
+          <entityName>MSTTeamLink_entity</entityName>
+          <fieldName>Teams</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+      </dependencies>
+    </entityProvider>
+    <entityParameter>
+      <name>UseCache_param</name>
+      <expose v="true" />
+    </entityParameter>
   </entityFields>
   <recordContainers>
     <jDitoRecordContainer>
@@ -119,6 +134,8 @@
       <onInsert>%aditoprj%/entity/MSTTeam_entity/recordcontainers/jdito/onInsert.js</onInsert>
       <onUpdate>%aditoprj%/entity/MSTTeam_entity/recordcontainers/jdito/onUpdate.js</onUpdate>
       <onDelete>%aditoprj%/entity/MSTTeam_entity/recordcontainers/jdito/onDelete.js</onDelete>
+      <cacheType>SESSION</cacheType>
+      <cacheKeyProcess>%aditoprj%/entity/MSTTeam_entity/recordcontainers/jdito/cacheKeyProcess.js</cacheKeyProcess>
       <recordFieldMappings>
         <jDitoRecordFieldMapping>
           <name>UID.value</name>
diff --git a/entity/MSTTeam_entity/entityfields/teamsbyidandname/children/usecache_param/valueProcess.js b/entity/MSTTeam_entity/entityfields/teamsbyidandname/children/usecache_param/valueProcess.js
new file mode 100644
index 00000000000..40effa01784
--- /dev/null
+++ b/entity/MSTTeam_entity/entityfields/teamsbyidandname/children/usecache_param/valueProcess.js
@@ -0,0 +1,3 @@
+import("system.result");
+
+result.string(true);
\ No newline at end of file
diff --git a/entity/MSTTeam_entity/entityfields/teamsbyidandname/documentation.adoc b/entity/MSTTeam_entity/entityfields/teamsbyidandname/documentation.adoc
new file mode 100644
index 00000000000..84522789b1b
--- /dev/null
+++ b/entity/MSTTeam_entity/entityfields/teamsbyidandname/documentation.adoc
@@ -0,0 +1,4 @@
+= TeamsByIdAndName
+
+The provider uses a JSON containing [teamId, teamName] as the lookupIdField for cases when both values are needed.
+Because the request that loads the MST teams can be slow, the records will be cached if this provider is used.
\ No newline at end of file
diff --git a/entity/MSTTeam_entity/recordcontainers/jdito/cacheKeyProcess.js b/entity/MSTTeam_entity/recordcontainers/jdito/cacheKeyProcess.js
new file mode 100644
index 00000000000..f9c2f6bbd9d
--- /dev/null
+++ b/entity/MSTTeam_entity/recordcontainers/jdito/cacheKeyProcess.js
@@ -0,0 +1,7 @@
+import("system.result");
+import("system.vars");
+import("Util_lib");
+import("CachedRecordContainer_lib");
+
+if (Utils.toBoolean(vars.get("$param.UseCache_param")))
+    result.string(CachedRecordContainerUtils.getCommonKey("$param.UseCache_param"));
\ No newline at end of file
diff --git a/entity/MSTTeam_entity/recordcontainers/jdito/onInsert.js b/entity/MSTTeam_entity/recordcontainers/jdito/onInsert.js
index 1d73c7766db..3a4b2c76861 100644
--- a/entity/MSTTeam_entity/recordcontainers/jdito/onInsert.js
+++ b/entity/MSTTeam_entity/recordcontainers/jdito/onInsert.js
@@ -62,12 +62,5 @@ if (internalMembers.length !== 0)
 if (externalMembers.length !== 0)
     teams.addExternalMembers(mstTeam.teamId, externalMembers);
 
-new SqlBuilder().insertFields({
-    "MST_TEAMID": mstTeam.teamId,
-    "TEAMNAME": mstTeam.teamName,
-    "GENERAL_CHANNELID": mstTeam.generalChannelId,
-    "IS_ARCHIVED": 0,
-    "WEB_URL": mstTeam.webUrl
-}, "MST_TEAM");
-
+MSTeamsUtils.insertTeamIfMissing(mstTeam);
 MSTeamsUtils.createTeamLink(mstTeam.teamId, vars.get("$param.ObjectRowId_param"), vars.get("$param.ObjectType_param"));
\ No newline at end of file
diff --git a/entity/Member_entity/Member_entity.aod b/entity/Member_entity/Member_entity.aod
index f0d15b5a877..8706484f0ff 100644
--- a/entity/Member_entity/Member_entity.aod
+++ b/entity/Member_entity/Member_entity.aod
@@ -6,6 +6,7 @@
   <title>${SALESPROJECT_MEMBER}</title>
   <siblings>
     <element>MSTTeam_entity</element>
+    <element>MSTTeamLink_entity</element>
   </siblings>
   <grantUpdateProcess>%aditoprj%/entity/Member_entity/grantUpdateProcess.js</grantUpdateProcess>
   <grantDeleteProcess>%aditoprj%/entity/Member_entity/grantDeleteProcess.js</grantDeleteProcess>
diff --git a/entity/Salesproject_entity/Salesproject_entity.aod b/entity/Salesproject_entity/Salesproject_entity.aod
index 37af27431d7..f497a51be79 100644
--- a/entity/Salesproject_entity/Salesproject_entity.aod
+++ b/entity/Salesproject_entity/Salesproject_entity.aod
@@ -8,6 +8,7 @@
     <element>SalesprojectMilestone_entity</element>
     <element>Member_entity</element>
     <element>MSTTeam_entity</element>
+    <element>MSTTeamLink_entity</element>
   </siblings>
   <grantDeleteProcess>%aditoprj%/entity/Salesproject_entity/grantDeleteProcess.js</grantDeleteProcess>
   <contentTitleProcess>%aditoprj%/entity/Salesproject_entity/contentTitleProcess.js</contentTitleProcess>
diff --git a/neonContext/MSTTeamLink/MSTTeamLink.aod b/neonContext/MSTTeamLink/MSTTeamLink.aod
index 31b2ad861a6..d0d6d646fe3 100644
--- a/neonContext/MSTTeamLink/MSTTeamLink.aod
+++ b/neonContext/MSTTeamLink/MSTTeamLink.aod
@@ -2,6 +2,7 @@
 <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>MSTTeamLink</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
+  <editView>MSTTeamLinkEdit_view</editView>
   <entity>MSTTeamLink_entity</entity>
   <references>
     <neonViewReference>
diff --git a/neonView/MSTTeamLinkEdit_view/MSTTeamLinkEdit_view.aod b/neonView/MSTTeamLinkEdit_view/MSTTeamLinkEdit_view.aod
index b7261189dd7..acb23701eb4 100644
--- a/neonView/MSTTeamLinkEdit_view/MSTTeamLinkEdit_view.aod
+++ b/neonView/MSTTeamLinkEdit_view/MSTTeamLinkEdit_view.aod
@@ -2,9 +2,22 @@
 <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>MSTTeamLinkEdit_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
+  <size>SMALL</size>
   <layout>
     <boxLayout>
       <name>layout</name>
     </boxLayout>
   </layout>
+  <children>
+    <genericViewTemplate>
+      <name>TeamSelection</name>
+      <editMode v="true" />
+      <fields>
+        <entityFieldLink>
+          <name>1b10e15e-0774-430d-8b76-36307abdff33</name>
+          <entityField>TEAM_ID_AND_NAME</entityField>
+        </entityFieldLink>
+      </fields>
+    </genericViewTemplate>
+  </children>
 </neonView>
diff --git a/process/CachedRecordContainer_lib/process.js b/process/CachedRecordContainer_lib/process.js
index e44f4dfa90c..f7d4ea84563 100644
--- a/process/CachedRecordContainer_lib/process.js
+++ b/process/CachedRecordContainer_lib/process.js
@@ -161,7 +161,14 @@ CachedRecordContainerUtils.getKey = function(pVariable1, pVariableN) {
     varsToCheck.forEach(function (varToCheck){
         if (vars.exists(varToCheck))
         {
-            var value = vars.getString(varToCheck);
+            var value = vars.get(varToCheck);
+            if (value && Utils.isObject(value))
+            {
+                if (varToCheck === "$local.filters" && _isEmptyFilter(value))
+                    value = null;
+                else
+                    value = JSON.stringify(value);
+            }
             if (value != null)
                 key.push(value);
             else
@@ -174,4 +181,10 @@ CachedRecordContainerUtils.getKey = function(pVariable1, pVariableN) {
     });
     
     return key.join(".");
+    
+    function _isEmptyFilter (pFilter)
+    {
+        var childs = pFilter.childs;
+        return Utils.isNullOrEmpty(childs) || (childs.length === 1 && childs[0].operator === "CONTAINS" && !childs[0].key);
+    }
 };
\ No newline at end of file
diff --git a/process/Liquibase_lib/process.js b/process/Liquibase_lib/process.js
index 65cfed3485b..e673139131b 100644
--- a/process/Liquibase_lib/process.js
+++ b/process/Liquibase_lib/process.js
@@ -148,7 +148,7 @@ LiquiUtils._getDataXml = function(pAuthor, pLobPath, pTableName, pColumns, pCond
     var changesetId;
     if (pGenerateChangeSetIdFromArguments)
     {
-        changesetId = Array.prototype.slice.call(arguments);//todo: use Array.from instead when supported (>= rhino 1.7.11) (#1038664)
+        changesetId = Array.from(arguments);
         changesetId = changesetId.reduce(function (accumulator, currentValue){
             return (currentValue !== null && currentValue !== undefined ? accumulator + JSON.stringify(currentValue) : accumulator);
         }, "");
diff --git a/process/MSTeams_lib/process.js b/process/MSTeams_lib/process.js
index f243b05ff0c..fe2d31665e8 100644
--- a/process/MSTeams_lib/process.js
+++ b/process/MSTeams_lib/process.js
@@ -74,6 +74,26 @@ MSTeamsUtils.purgeCorruptTeamLinks = function (pRowId, pObjectType, pTeamLinkIdT
     return newWhere("MST_TEAMLINK.MST_TEAMLINKID", removeLinks, SqlBuilder.IN()).deleteData();
 }
 
+MSTeamsUtils.insertTeamIfMissing = function (pTeam)
+{
+    var existsTeam = newSelect("count(*)")
+        .from("MST_TEAM")
+        .where("MST_TEAM.MST_TEAMID", pTeam.teamId)
+        .cell() > 0;
+    if (existsTeam)
+        return false;
+    
+    new SqlBuilder().insertFields({
+        "MST_TEAMID": pTeam.teamId,
+        "TEAMNAME": pTeam.teamName,
+        "GENERAL_CHANNELID": pTeam.generalChannelId || teams.getGeneralChannelId(pTeam.teamId),
+        "IS_ARCHIVED": 0,
+        "WEB_URL": pTeam.webUrl || teams.getWebUrl(pTeam.teamId)
+    }, "MST_TEAM");
+    
+    return true;
+}
+
 /**
  * 
  */
-- 
GitLab


From 76ea9f30846d1fa364cddcae18289241b9b18754 Mon Sep 17 00:00:00 2001
From: Sebastian Listl <s.listl@adito.de>
Date: Fri, 20 Nov 2020 17:46:02 +0100
Subject: [PATCH 097/184] MSTeams_lib comments added

---
 entity/Activity_entity/Activity_entity.aod    | 173 +++++++++---------
 .../msteamsactions/stateProcess.js            |   4 +-
 .../MSTeamsActivityImport_entity.aod          |   4 +
 .../afterUiInit.js                            |   8 +
 .../MSTeamsChannel_entity.aod                 |   2 +
 .../recordcontainers/jdito/cacheKeyProcess.js |   4 +
 .../ActivityFilter_view.aod                   |   5 +-
 process/MSTeams_lib/process.js                |  47 ++++-
 8 files changed, 147 insertions(+), 100 deletions(-)
 create mode 100644 entity/MSTeamsActivityImport_entity/afterUiInit.js
 create mode 100644 entity/MSTeamsChannel_entity/recordcontainers/jdito/cacheKeyProcess.js

diff --git a/entity/Activity_entity/Activity_entity.aod b/entity/Activity_entity/Activity_entity.aod
index 4737e177d94..fae8253b6fe 100644
--- a/entity/Activity_entity/Activity_entity.aod
+++ b/entity/Activity_entity/Activity_entity.aod
@@ -117,11 +117,6 @@
     <entityConsumer>
       <name>Documents</name>
       <selectionMode>MULTI</selectionMode>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Document_entity</entityName>
-        <fieldName>Documents</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>AssignmentRowId_param</name>
@@ -132,15 +127,15 @@
           <valueProcess>%aditoprj%/entity/Activity_entity/entityfields/documents/children/assignmenttable_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>MainDocuments</name>
-      <stateProcess>%aditoprj%/entity/Activity_entity/entityfields/maindocuments/stateProcess.js</stateProcess>
       <dependency>
         <name>dependency</name>
         <entityName>Document_entity</entityName>
-        <fieldName>MainDocuments</fieldName>
+        <fieldName>Documents</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>MainDocuments</name>
+      <stateProcess>%aditoprj%/entity/Activity_entity/entityfields/maindocuments/stateProcess.js</stateProcess>
       <children>
         <entityParameter>
           <name>AssignmentTable_param</name>
@@ -151,6 +146,11 @@
           <valueProcess>%aditoprj%/entity/Activity_entity/entityfields/maindocuments/children/assignmentrowid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Document_entity</entityName>
+        <fieldName>MainDocuments</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>ENTRYMONTH</name>
@@ -165,25 +165,20 @@
     </entityField>
     <entityConsumer>
       <name>Links</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>ActivityLink_entity</entityName>
-        <fieldName>Links</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ActivityId_param</name>
           <valueProcess>%aditoprj%/entity/Activity_entity/entityfields/links/children/activityid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>KeywordDirections</name>
       <dependency>
         <name>dependency</name>
-        <entityName>KeywordEntry_entity</entityName>
-        <fieldName>SpecificContainerKeywords</fieldName>
+        <entityName>ActivityLink_entity</entityName>
+        <fieldName>Links</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>KeywordDirections</name>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
@@ -191,11 +186,47 @@
           <expose v="false" />
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>SpecificContainerKeywords</fieldName>
+      </dependency>
     </entityConsumer>
     <entityProvider>
       <name>LinkedObjects</name>
       <documentation>%aditoprj%/entity/Activity_entity/entityfields/linkedobjects/documentation.adoc</documentation>
       <recordContainer>db</recordContainer>
+      <children>
+        <entityParameter>
+          <name>OnlyInnate_param</name>
+          <expose v="false" />
+          <documentation>%aditoprj%/entity/Activity_entity/entityfields/linkedobjects/children/onlyinnate_param/documentation.adoc</documentation>
+        </entityParameter>
+        <entityParameter>
+          <name>ObjectId_param</name>
+          <expose v="true" />
+        </entityParameter>
+        <entityParameter>
+          <name>RowId_param</name>
+          <expose v="true" />
+        </entityParameter>
+        <entityParameter>
+          <name>PresetLinks_param</name>
+          <expose v="true" />
+        </entityParameter>
+        <entityParameter>
+          <name>ParentContext_param</name>
+          <expose v="false" />
+        </entityParameter>
+        <entityParameter>
+          <name>ParentId_param</name>
+          <expose v="false" />
+        </entityParameter>
+        <entityParameter>
+          <name>PresetDocuments_param</name>
+          <expose v="false" />
+        </entityParameter>
+      </children>
       <dependencies>
         <entityDependency>
           <name>8ececf30-a3bc-4cd2-ad04-fb9f3cb9332d</name>
@@ -276,37 +307,6 @@
           <isConsumer v="false" />
         </entityDependency>
       </dependencies>
-      <children>
-        <entityParameter>
-          <name>OnlyInnate_param</name>
-          <expose v="false" />
-          <documentation>%aditoprj%/entity/Activity_entity/entityfields/linkedobjects/children/onlyinnate_param/documentation.adoc</documentation>
-        </entityParameter>
-        <entityParameter>
-          <name>ObjectId_param</name>
-          <expose v="true" />
-        </entityParameter>
-        <entityParameter>
-          <name>RowId_param</name>
-          <expose v="true" />
-        </entityParameter>
-        <entityParameter>
-          <name>PresetLinks_param</name>
-          <expose v="true" />
-        </entityParameter>
-        <entityParameter>
-          <name>ParentContext_param</name>
-          <expose v="false" />
-        </entityParameter>
-        <entityParameter>
-          <name>ParentId_param</name>
-          <expose v="false" />
-        </entityParameter>
-        <entityParameter>
-          <name>PresetDocuments_param</name>
-          <expose v="false" />
-        </entityParameter>
-      </children>
     </entityProvider>
     <entityField>
       <name>RESPONSIBLE</name>
@@ -320,11 +320,6 @@
     </entityField>
     <entityConsumer>
       <name>ModuleTrees</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>ModuleTree_entity</entityName>
-        <fieldName>TreeProviders</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContextName_param</name>
@@ -337,6 +332,11 @@
           <mandatory v="true" />
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>ModuleTree_entity</entityName>
+        <fieldName>TreeProviders</fieldName>
+      </dependency>
     </entityConsumer>
     <entityActionField>
       <name>newActivity</name>
@@ -377,11 +377,6 @@
     </entityField>
     <entityConsumer>
       <name>KeywordCategories</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>KeywordEntry_entity</entityName>
-        <fieldName>SpecificContainerKeywords</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
@@ -389,6 +384,11 @@
           <expose v="true" />
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>SpecificContainerKeywords</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>ENTRYDAY</name>
@@ -398,11 +398,6 @@
     <entityConsumer>
       <name>Attributes</name>
       <onValidation>%aditoprj%/entity/Activity_entity/entityfields/attributes/onValidation.js</onValidation>
-      <dependency>
-        <name>dependency</name>
-        <entityName>AttributeRelation_entity</entityName>
-        <fieldName>AttributeRelations</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ObjectRowId_param</name>
@@ -413,6 +408,11 @@
           <valueProcess>%aditoprj%/entity/Activity_entity/entityfields/attributes/children/objecttype_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>AttributeRelation_entity</entityName>
+        <fieldName>AttributeRelations</fieldName>
+      </dependency>
     </entityConsumer>
     <entityActionField>
       <name>newOffer</name>
@@ -437,11 +437,6 @@
     </entityParameter>
     <entityConsumer>
       <name>AttributeTree</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>AttributeRelation_entity</entityName>
-        <fieldName>TreeProvider</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ObjectRowId_param</name>
@@ -452,6 +447,11 @@
           <valueProcess>%aditoprj%/entity/Activity_entity/entityfields/attributetree/children/objecttype_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>AttributeRelation_entity</entityName>
+        <fieldName>TreeProvider</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>USER_NEW</name>
@@ -519,11 +519,6 @@
     </entityParameter>
     <entityConsumer>
       <name>ActivityAtrributes</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Attribute_entity</entityName>
-        <fieldName>ThemeProvider</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ThemeObjectRowId_param</name>
@@ -534,14 +529,14 @@
           <valueProcess>%aditoprj%/entity/Activity_entity/entityfields/activityatrributes/children/objecttype_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>AttributeTreeIsTheme</name>
       <dependency>
         <name>dependency</name>
-        <entityName>AttributeRelation_entity</entityName>
-        <fieldName>TreeProvider</fieldName>
+        <entityName>Attribute_entity</entityName>
+        <fieldName>ThemeProvider</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>AttributeTreeIsTheme</name>
       <children>
         <entityParameter>
           <name>ObjectType_param</name>
@@ -556,6 +551,11 @@
           <valueProcess>%aditoprj%/entity/Activity_entity/entityfields/attributetreeistheme/children/gettheme_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>AttributeRelation_entity</entityName>
+        <fieldName>TreeProvider</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>ENTRYYEAR</name>
@@ -576,21 +576,22 @@
     </entityParameter>
     <entityConsumer>
       <name>LogHistories</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>LogHistory_entity</entityName>
-        <fieldName>LogHistoryProvider</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>tablenames_param</name>
           <valueProcess>%aditoprj%/entity/Activity_entity/entityfields/loghistories/children/tablenames_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>LogHistory_entity</entityName>
+        <fieldName>LogHistoryProvider</fieldName>
+      </dependency>
     </entityConsumer>
     <entityActionGroup>
       <name>MSTeamsActions</name>
       <title>MS Teams</title>
+      <state>EDITABLE</state>
       <stateProcess>%aditoprj%/entity/Activity_entity/entityfields/msteamsactions/stateProcess.js</stateProcess>
       <children>
         <entityActionField>
diff --git a/entity/Activity_entity/entityfields/msteamsactions/stateProcess.js b/entity/Activity_entity/entityfields/msteamsactions/stateProcess.js
index c05618702e3..828bf3fc583 100644
--- a/entity/Activity_entity/entityfields/msteamsactions/stateProcess.js
+++ b/entity/Activity_entity/entityfields/msteamsactions/stateProcess.js
@@ -3,5 +3,5 @@ import("system.neon");
 import("system.result");
 import("MSTeams_lib");
 
-var isTeamsEnabled = vars.get("$param.EnableMSTeams_param") == "true" && MSTeamsUtils.isTeamsEnabled();
-result.string(isTeamsEnabled ? neon.COMPONENTSTATE_EDITABLE : neon.COMPONENTSTATE_INVISIBLE);
\ No newline at end of file
+var isTeamsEnabled = vars.get("$param.ObjectId_param") in MSTeamsUtils.getTeamLinkContexts() && MSTeamsUtils.isTeamsEnabled();
+result.string(/*isTeamsEnabled ? neon.COMPONENTSTATE_EDITABLE : */neon.COMPONENTSTATE_INVISIBLE);
\ No newline at end of file
diff --git a/entity/MSTeamsActivityImport_entity/MSTeamsActivityImport_entity.aod b/entity/MSTeamsActivityImport_entity/MSTeamsActivityImport_entity.aod
index bab6f3794ca..fb158db38da 100644
--- a/entity/MSTeamsActivityImport_entity/MSTeamsActivityImport_entity.aod
+++ b/entity/MSTeamsActivityImport_entity/MSTeamsActivityImport_entity.aod
@@ -4,6 +4,8 @@
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <documentation>%aditoprj%/entity/MSTeamsActivityImport_entity/documentation.adoc</documentation>
   <siblings />
+  <afterUiInit>%aditoprj%/entity/MSTeamsActivityImport_entity/afterUiInit.js</afterUiInit>
+  <recordContainer>dataless</recordContainer>
   <entityFields>
     <entityProvider>
       <name>#PROVIDER</name>
@@ -35,6 +37,7 @@
       <name>CHANNEL_ID</name>
       <title>Channel</title>
       <consumer>Channels</consumer>
+      <state>EDITABLE</state>
     </entityField>
     <entityParameter>
       <name>ObjectRowId_param</name>
@@ -83,6 +86,7 @@
   <recordContainers>
     <datalessRecordContainer>
       <name>dataless</name>
+      <alias>Data_alias</alias>
     </datalessRecordContainer>
   </recordContainers>
 </entity>
diff --git a/entity/MSTeamsActivityImport_entity/afterUiInit.js b/entity/MSTeamsActivityImport_entity/afterUiInit.js
new file mode 100644
index 00000000000..9357f9cbc24
--- /dev/null
+++ b/entity/MSTeamsActivityImport_entity/afterUiInit.js
@@ -0,0 +1,8 @@
+import("system.entities");
+
+//load the channels into the cache when opening the dialog, so the user doesn't have to wait when opening the lookup
+entities.invalidateCache("MSTeamsChannel_entity", "jdito");
+entities.getRows(entities.createConfigForLoadingConsumerRows()
+    .consumer("Channels")
+    .fields(["UID", "CHANNELNAME"])
+);
\ No newline at end of file
diff --git a/entity/MSTeamsChannel_entity/MSTeamsChannel_entity.aod b/entity/MSTeamsChannel_entity/MSTeamsChannel_entity.aod
index 819f857c1ae..4c2ea19b101 100644
--- a/entity/MSTeamsChannel_entity/MSTeamsChannel_entity.aod
+++ b/entity/MSTeamsChannel_entity/MSTeamsChannel_entity.aod
@@ -65,6 +65,8 @@
       <name>jdito</name>
       <jDitoRecordAlias>Data_alias</jDitoRecordAlias>
       <contentProcess>%aditoprj%/entity/MSTeamsChannel_entity/recordcontainers/jdito/contentProcess.js</contentProcess>
+      <cacheType>SESSION</cacheType>
+      <cacheKeyProcess>%aditoprj%/entity/MSTeamsChannel_entity/recordcontainers/jdito/cacheKeyProcess.js</cacheKeyProcess>
       <recordFieldMappings>
         <jDitoRecordFieldMapping>
           <name>UID.value</name>
diff --git a/entity/MSTeamsChannel_entity/recordcontainers/jdito/cacheKeyProcess.js b/entity/MSTeamsChannel_entity/recordcontainers/jdito/cacheKeyProcess.js
new file mode 100644
index 00000000000..ee4f6d23760
--- /dev/null
+++ b/entity/MSTeamsChannel_entity/recordcontainers/jdito/cacheKeyProcess.js
@@ -0,0 +1,4 @@
+import("system.result");
+import("CachedRecordContainer_lib");
+
+result.string(CachedRecordContainerUtils.getCommonKey("$param.TeamId_param"));
\ No newline at end of file
diff --git a/neonView/ActivityFilter_view/ActivityFilter_view.aod b/neonView/ActivityFilter_view/ActivityFilter_view.aod
index 21662c37bba..0094ed28745 100644
--- a/neonView/ActivityFilter_view/ActivityFilter_view.aod
+++ b/neonView/ActivityFilter_view/ActivityFilter_view.aod
@@ -50,7 +50,7 @@
   <children>
     <timelineViewTemplate>
       <name>ActivitiesTimeline</name>
-      <favoriteActionGroup1>MSTeams</favoriteActionGroup1>
+      <favoriteActionGroup2>MSTeamsActions</favoriteActionGroup2>
       <dateField>entryDateDateFormat</dateField>
       <titleField>SUBJECT_DETAILS</titleField>
       <descriptionField>INFO</descriptionField>
@@ -60,7 +60,7 @@
     </timelineViewTemplate>
     <tableViewTemplate>
       <name>ActivitiesTable</name>
-      <favoriteActionGroup2>MST_TeamActions</favoriteActionGroup2>
+      <favoriteActionGroup2>MSTeamsActions</favoriteActionGroup2>
       <iconField>#IMAGE</iconField>
       <titleField>SUBJECT</titleField>
       <subtitleField>ENTRYDATE</subtitleField>
@@ -94,6 +94,7 @@
     </tableViewTemplate>
     <treeTableViewTemplate>
       <name>ActivitiesTreeTable</name>
+      <favoriteActionGroup2>MSTeamsActions</favoriteActionGroup2>
       <entityField>#ENTITY</entityField>
       <columns>
         <neonTreeTableColumn>
diff --git a/process/MSTeams_lib/process.js b/process/MSTeams_lib/process.js
index fe2d31665e8..4c5d02e33cc 100644
--- a/process/MSTeams_lib/process.js
+++ b/process/MSTeams_lib/process.js
@@ -24,7 +24,9 @@ MSTeamsUtils.isTeamsEnabled = function ()
 }
 
 /**
+ * Contains the configuration for the possible contexts that can be used for teamLinks.
  * 
+ * @return {Object} object with the context-names as keys and configuration-objects as values
  */
 MSTeamsUtils.getTeamLinkContexts = function ()
 {
@@ -33,6 +35,13 @@ MSTeamsUtils.getTeamLinkContexts = function ()
     };
 }
 
+/**
+ * Opens a context for changing the linked team of the given object. This function also checks the configuration from
+ * MSTeamsUtils.getTeamLinkContexts to make sure the created teamLink is allowed
+ * 
+ * @param {String} pRowId       uid of the linked object
+ * @param {String} pObjectType  context of the linked object
+ */
 MSTeamsUtils.changeTeamsLink = function (pRowId, pObjectType)
 {
     var linkConfig = MSTeamsUtils.getTeamLinkContexts()[pObjectType];
@@ -54,6 +63,14 @@ MSTeamsUtils.changeTeamsLink = function (pRowId, pObjectType)
         neon.openContext("MSTTeamLink", null, [existingTeamLinks[0]], neon.OPERATINGSTATE_EDIT, params);
 }
 
+/**
+ * Removes all teamLinks of the given object that are invalid.
+ * 
+ * @param {String} pRowId               uid of the linked object
+ * @param {String} pObjectType          context of the linked object
+ * @param {String} [pTeamLinkIdToKeep]  Only applies to contexts with 'singleLinkPerObject: true', if there are more than one teamLink, every
+ *                                      teamLink except one will be deleted. This param controls which one shouldn't be deleted.
+ */
 MSTeamsUtils.purgeCorruptTeamLinks = function (pRowId, pObjectType, pTeamLinkIdToKeep)
 {
     var teamLinks = MSTeamsUtils.getLinkedTeams(pRowId, pObjectType).map(function (row)
@@ -74,6 +91,21 @@ MSTeamsUtils.purgeCorruptTeamLinks = function (pRowId, pObjectType, pTeamLinkIdT
     return newWhere("MST_TEAMLINK.MST_TEAMLINKID", removeLinks, SqlBuilder.IN()).deleteData();
 }
 
+/**
+ * Saves the given team in the database if it is not already present.
+ * 
+ * @param {Object} pTeam    An object containing the data of the team. Required properties:
+ *                          <ul>
+ *                              <li>teamId</li>
+ *                              <li>teamName</li>
+ *                          </ul>
+ *                          Optional properties (will be loaded automatically if not given):
+ *                          <ul>
+ *                              <li>generalChannelId</li>
+ *                              <li>webUrl</li>
+ *                          </ul>
+ * @return {Boolean} true if the team was inserted, false if it already exists
+ */
 MSTeamsUtils.insertTeamIfMissing = function (pTeam)
 {
     var existsTeam = newSelect("count(*)")
@@ -95,11 +127,11 @@ MSTeamsUtils.insertTeamIfMissing = function (pTeam)
 }
 
 /**
- * 
+ * Creates a new teamLink.
  */
 MSTeamsUtils.createTeamLink = function (pTeamId, pRowId, pObjectType)
 {
-    var currentTeamLinkId;
+    var currentTeamLink;
     var contextConfig = MSTeamsUtils.getTeamLinkContexts()[pObjectType];
     if (!contextConfig)
         return;
@@ -107,15 +139,11 @@ MSTeamsUtils.createTeamLink = function (pTeamId, pRowId, pObjectType)
     //if singleLinkPerObject is true, only one team link can be created for the given objectRowId
     if (contextConfig.singleLinkPerObject)
     {
-        currentTeamLinkId = newSelect("MST_TEAMLINKID")
-            .from("MST_TEAMLINK")
-            .where("MST_TEAMLINK.OBJECT_ROWID", pRowId)
-            .and("MST_TEAMLINK.OBJECT_TYPE", pObjectType)
-            .cell();
+        currentTeamLink = MSTeamsUtils.getLinkedTeam(pRowId, pObjectType);
     }
-    if (currentTeamLinkId)
+    if (currentTeamLink)
     {
-        newWhere("MST_TEAMLINK.MST_TEAMLINKID", currentTeamLinkId).updateFields({
+        newWhere("MST_TEAMLINK.MST_TEAMLINKID", currentTeamLink.teamLinkId).updateFields({
             "MST_TEAM_ID": pTeamId
         });
     }
@@ -209,7 +237,6 @@ MSTeamsUtils.getTeamRoleSubSql = function (pTeamId, pContactIdField)
     caseWhen.when("(" + CommUtil.getStandardSubSqlMail() + ") in ('" + Utils.objectValues(members).join("', '") + "')")
         .thenString(translate.text("Guest")); 
     
-    logging.log(JSON.stringify(caseWhen))
     return caseWhen.elseString("").toString();
 }
 
-- 
GitLab


From b569a2b6cb0b9584ecf833fb601eb19dcea3b651 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Alexander=20V=C3=B6gl?= <a.voegl@adito.de>
Date: Mon, 23 Nov 2020 09:37:50 +0000
Subject: [PATCH 098/184] Add Attribute Grouping in Person and Organisation

---
 .../Organisation_entity.aod                   |  2 +
 .../attribute_filter/groupQueryProcess.js     |  9 +++
 entity/Person_entity/Person_entity.aod        |  2 +
 .../attribute_filter/groupQueryProcess.js     |  9 +++
 process/AttributeFilter_lib/process.js        | 76 ++++++++++++++++++-
 5 files changed, 97 insertions(+), 1 deletion(-)
 create mode 100644 entity/Organisation_entity/recordcontainers/db/filterextensions/attribute_filter/groupQueryProcess.js
 create mode 100644 entity/Person_entity/recordcontainers/db/filterextensions/attribute_filter/groupQueryProcess.js

diff --git a/entity/Organisation_entity/Organisation_entity.aod b/entity/Organisation_entity/Organisation_entity.aod
index 50afcd2e322..954f5023e7d 100644
--- a/entity/Organisation_entity/Organisation_entity.aod
+++ b/entity/Organisation_entity/Organisation_entity.aod
@@ -1669,6 +1669,8 @@
           <filterFieldsProcess>%aditoprj%/entity/Organisation_entity/recordcontainers/db/filterextensions/attribute_filter/filterFieldsProcess.js</filterFieldsProcess>
           <filterValuesProcess>%aditoprj%/entity/Organisation_entity/recordcontainers/db/filterextensions/attribute_filter/filterValuesProcess.js</filterValuesProcess>
           <filterConditionProcess>%aditoprj%/entity/Organisation_entity/recordcontainers/db/filterextensions/attribute_filter/filterConditionProcess.js</filterConditionProcess>
+          <isGroupable v="true" />
+          <groupQueryProcess>%aditoprj%/entity/Organisation_entity/recordcontainers/db/filterextensions/attribute_filter/groupQueryProcess.js</groupQueryProcess>
           <filtertype>BASIC</filtertype>
         </filterExtensionSet>
         <filterExtensionSet>
diff --git a/entity/Organisation_entity/recordcontainers/db/filterextensions/attribute_filter/groupQueryProcess.js b/entity/Organisation_entity/recordcontainers/db/filterextensions/attribute_filter/groupQueryProcess.js
new file mode 100644
index 00000000000..1bd2d352867
--- /dev/null
+++ b/entity/Organisation_entity/recordcontainers/db/filterextensions/attribute_filter/groupQueryProcess.js
@@ -0,0 +1,9 @@
+import("system.logging");
+import("system.result");
+import("AttributeFilter_lib");
+
+var sqlCond = AttributeFilterExtensionMaker.makeFilterGroupQuery("ORGANISATION \n\
+    join CONTACT on (ORGANISATION.ORGANISATIONID = CONTACT.ORGANISATION_ID and CONTACT.PERSON_ID is null)\n\
+    left join ADDRESS on (ADDRESS.ADDRESSID = CONTACT.ADDRESS_ID)\n\
+    left join CLASSIFICATIONSTORAGE on (CLASSIFICATIONSTORAGE.OBJECT_ROWID = CONTACT.CONTACTID)");
+result.string(sqlCond);
\ No newline at end of file
diff --git a/entity/Person_entity/Person_entity.aod b/entity/Person_entity/Person_entity.aod
index 42f436e7093..b642f05df01 100644
--- a/entity/Person_entity/Person_entity.aod
+++ b/entity/Person_entity/Person_entity.aod
@@ -1693,6 +1693,8 @@
           <filterFieldsProcess>%aditoprj%/entity/Person_entity/recordcontainers/db/filterextensions/attribute_filter/filterFieldsProcess.js</filterFieldsProcess>
           <filterValuesProcess>%aditoprj%/entity/Person_entity/recordcontainers/db/filterextensions/attribute_filter/filterValuesProcess.js</filterValuesProcess>
           <filterConditionProcess>%aditoprj%/entity/Person_entity/recordcontainers/db/filterextensions/attribute_filter/filterConditionProcess.js</filterConditionProcess>
+          <isGroupable v="true" />
+          <groupQueryProcess>%aditoprj%/entity/Person_entity/recordcontainers/db/filterextensions/attribute_filter/groupQueryProcess.js</groupQueryProcess>
           <filtertype>BASIC</filtertype>
         </filterExtensionSet>
         <filterExtension>
diff --git a/entity/Person_entity/recordcontainers/db/filterextensions/attribute_filter/groupQueryProcess.js b/entity/Person_entity/recordcontainers/db/filterextensions/attribute_filter/groupQueryProcess.js
new file mode 100644
index 00000000000..dcc085ca306
--- /dev/null
+++ b/entity/Person_entity/recordcontainers/db/filterextensions/attribute_filter/groupQueryProcess.js
@@ -0,0 +1,9 @@
+import("system.logging");
+import("system.result");
+import("AttributeFilter_lib");
+
+var sqlCond = AttributeFilterExtensionMaker.makeFilterGroupQuery("PERSON \n\
+    join CONTACT on (CONTACT.PERSON_ID = PERSON.PERSONID) \n\
+    join ORGANISATION on (ORGANISATION.ORGANISATIONID = CONTACT.ORGANISATION_ID) \n\
+    left join ADDRESS on (ADDRESS.ADDRESSID = CONTACT.ADDRESS_ID)");
+result.string(sqlCond);
\ No newline at end of file
diff --git a/process/AttributeFilter_lib/process.js b/process/AttributeFilter_lib/process.js
index d64df9664bf..5d0f8b5b4fe 100644
--- a/process/AttributeFilter_lib/process.js
+++ b/process/AttributeFilter_lib/process.js
@@ -97,11 +97,18 @@ AttributeFilterExtensionMaker.getFilterFields = function(pObjectType)
     attributeRows.forEach(function(row){
         var attributeType = row["ATTRIBUTE_TYPE"];
         var contentType = AttributeTypeUtil.getContentType(attributeType);
+        var groupedRecordField = AttributeTypeUtil.getDatabaseField(attributeType);
+        var titleRecordField = AttributeTypeUtil.getDatabaseField(attributeType);
         
         if (attributeType.trim() == AttributeTypes.VOID())
         {
             contentType = "BOOLEAN";
         }
+        else if(attributeType.trim() == AttributeTypes.COMBO())
+        {
+            groupedRecordField = "AB_ATTRIBUTEID";
+            titleRecordField = "ATTRIBUTE_NAME";
+        }
 
         if (contentType)
         {
@@ -111,7 +118,10 @@ AttributeFilterExtensionMaker.getFilterFields = function(pObjectType)
                 title: row["FULL_ATTRIBUTE_NAME"],
                 //workaround since we do not have a "UNKNOWN"-contentType in the filter-definition
                 contentType: contentType == "UNKNOWN" ? "TEXT" : contentType,
-                hasDropDownValues: contentType == "UNKNOWN" || contentType == "BOOLEAN" ? true : false//TODO: determine this somehow else
+                hasDropDownValues: contentType == "UNKNOWN" || contentType == "BOOLEAN" ? true : false,//TODO: determine this somehow else
+                isGroupable: true,
+                groupedRecordField: groupedRecordField,//groupedRecordField
+                titleRecordField: new SqlMaskingUtils().isNull(titleRecordField, "'"+translate.text("nicht zugeordnet")+"'")
             });
         }
     });
@@ -258,3 +268,67 @@ AttributeFilterExtensionMaker.makeFilterConditionSql = function()
         uidInfo.table, uidInfo.column, columnPlaceholder);
     return res;
 };
+
+/**
+ * fetches attributes that are groupable and transofms them into Groupings
+ * 
+ * @param {String} pFrom             The Value of the fromClauseProcess (if not used, then the "Main" Table)
+ * 
+ * @see AttributeFilterExtensionMaker.getFilterGroupQuery for more details
+ */
+AttributeFilterExtensionMaker.makeFilterGroupQuery = function(pFrom)
+{
+    var attributeName = vars.get("$local.name");
+    var condition = vars.get("$local.condition").trim(); //can have multiple space characters
+    var groupColumnList = vars.get("$local.columnlist");
+    var order = vars.get("$local.order");
+    var count = vars.get("$local.count");
+    var uidInfo = vars.get("$sys.uidcolumn");
+    var res = AttributeFilterExtensionMaker.getFilterGroupQuery(attributeName, condition, groupColumnList, order, count, uidInfo, pFrom);
+    return res;
+};
+
+
+/**
+ * 
+ * @param {String} pAttributeName       The Attribute-name contains various data of the attribute as a encoded string
+ * @param {String} pCondition           Contains the local Condition
+ * @param {String} pColumnList          Contains various Columns for the group Select
+ * @param {String} pOrder               In which order the results should be displayed
+ * @param {String} pCount               Indicates if u need to count or not, TRUE and FALSE
+ * @param {String} pUidColumn           The Column that is linked with AB_ATTRIBUTERELATION.OBJECT_ROWID
+ * @param {String} pFrom                The From part is needed to use the Condition right in every way
+ *                                      
+ * @return {String}                     <p/> SQL-Statemente for grouping
+ *                                      It returns the count or the Group Values
+ * @static 
+ */
+AttributeFilterExtensionMaker.getFilterGroupQuery = function(pAttributeName, pCondition, pColumnList, pOrder, pCount, pUidColumn, pFrom) 
+{
+
+    var name =  AttributeSearchNameCoder.decode(pAttributeName);
+
+    var attributeId = name.id;
+    var attrType = name.type;
+    if (attrType == AttributeTypes.VOID())
+        attrType = AttributeTypes.BOOLEAN();
+
+    var valuefield = AttributeTypeUtil.getDatabaseField(attrType);
+
+
+    var stmt = newSelect(pCount ? "1" : pColumnList).from(pFrom)
+    .leftJoin("AB_ATTRIBUTERELATION", "AB_ATTRIBUTERELATION.OBJECT_ROWID = "+pUidColumn+" and "+newWhere("AB_ATTRIBUTERELATION.AB_ATTRIBUTE_ID", attributeId).toString());
+    
+    if (attrType == AttributeTypes.COMBO())
+        stmt.leftJoin("AB_ATTRIBUTE", "AB_ATTRIBUTE.AB_ATTRIBUTEID = " + valuefield);
+        
+    if(pCondition)
+        stmt.where(pCondition);
+        
+    stmt.groupBy(valuefield);
+        
+    if(pOrder)   
+        stmt.orderBy(pOrder);
+
+    return stmt.toString();
+};
\ No newline at end of file
-- 
GitLab


From 7869864dcb487cf843e469e3c88649a3e610a7fb Mon Sep 17 00:00:00 2001
From: Sebastian Listl <s.listl@adito.de>
Date: Mon, 23 Nov 2020 11:25:19 +0100
Subject: [PATCH 099/184] MSTeams don't show imperso user

---
 .../recordcontainers/jdito/contentProcess.js      |  4 ++++
 process/AttributeFilter_lib/process.js            | 15 +++++++++------
 process/MSTeams_lib/process.js                    |  5 +++++
 3 files changed, 18 insertions(+), 6 deletions(-)

diff --git a/entity/MSTTeamMember_entity/recordcontainers/jdito/contentProcess.js b/entity/MSTTeamMember_entity/recordcontainers/jdito/contentProcess.js
index 3a44cd419e0..4f615a675a9 100644
--- a/entity/MSTTeamMember_entity/recordcontainers/jdito/contentProcess.js
+++ b/entity/MSTTeamMember_entity/recordcontainers/jdito/contentProcess.js
@@ -6,6 +6,10 @@ import("MSTeams_lib");
 
 var teamId = vars.get("$param.MSTTeamId_param");
 var allMembers = teamId ? teams.getAllMembers(teamId) : {};
+var impersoAzureId = MSTeamsUtils.getImpersoAzureId();
+if (impersoAzureId in allMembers) //don't display the imperso user
+    delete allMembers[impersoAzureId];
+    
 var memberIds = vars.get("$local.idvalues") || Object.keys(allMembers);
 var owners = teamId ? teams.getAllOwners(teamId) : {};
 var memberContactIds = MSTeamsUtils.getContactIdsByAzureIds(memberIds);
diff --git a/process/AttributeFilter_lib/process.js b/process/AttributeFilter_lib/process.js
index 5d0f8b5b4fe..adfea322ed0 100644
--- a/process/AttributeFilter_lib/process.js
+++ b/process/AttributeFilter_lib/process.js
@@ -87,6 +87,7 @@ function AttributeFilterExtensionMaker() {}
 AttributeFilterExtensionMaker.getFilterFields = function(pObjectType) 
 {
     var res = [];
+    var sqlMask = new SqlMaskingUtils();
 
     var loadingConfig = entities.createConfigForLoadingRows().entity("Attribute_entity")
         .provider("SpecificFilterAttributes")
@@ -95,20 +96,22 @@ AttributeFilterExtensionMaker.getFilterFields = function(pObjectType)
 
     var attributeRows = entities.getRows(loadingConfig);
     attributeRows.forEach(function(row){
-        var attributeType = row["ATTRIBUTE_TYPE"];
+        var attributeType = row["ATTRIBUTE_TYPE"].trim();
         var contentType = AttributeTypeUtil.getContentType(attributeType);
         var groupedRecordField = AttributeTypeUtil.getDatabaseField(attributeType);
         var titleRecordField = AttributeTypeUtil.getDatabaseField(attributeType);
         
-        if (attributeType.trim() == AttributeTypes.VOID())
+        if (attributeType == AttributeTypes.VOID())
         {
             contentType = "BOOLEAN";
         }
-        else if(attributeType.trim() == AttributeTypes.COMBO())
+        else if(attributeType == AttributeTypes.COMBO())
         {
             groupedRecordField = "AB_ATTRIBUTEID";
             titleRecordField = "ATTRIBUTE_NAME";
         }
+        if (titleRecordField == "INT_VALUE" || titleRecordField == "NUMBER_VALUE")
+            titleRecordField = sqlMask.cast(titleRecordField, SQLTYPES.VARCHAR, 50);
 
         if (contentType)
         {
@@ -118,10 +121,10 @@ AttributeFilterExtensionMaker.getFilterFields = function(pObjectType)
                 title: row["FULL_ATTRIBUTE_NAME"],
                 //workaround since we do not have a "UNKNOWN"-contentType in the filter-definition
                 contentType: contentType == "UNKNOWN" ? "TEXT" : contentType,
-                hasDropDownValues: contentType == "UNKNOWN" || contentType == "BOOLEAN" ? true : false,//TODO: determine this somehow else
+                hasDropDownValues: contentType == "UNKNOWN" || contentType == "BOOLEAN",//TODO: determine this somehow else
                 isGroupable: true,
                 groupedRecordField: groupedRecordField,//groupedRecordField
-                titleRecordField: new SqlMaskingUtils().isNull(titleRecordField, "'"+translate.text("nicht zugeordnet")+"'")
+                titleRecordField: sqlMask.isNull(titleRecordField, "'"+translate.text("unassigned")+"'")
             });
         }
     });
@@ -317,7 +320,7 @@ AttributeFilterExtensionMaker.getFilterGroupQuery = function(pAttributeName, pCo
 
 
     var stmt = newSelect(pCount ? "1" : pColumnList).from(pFrom)
-    .leftJoin("AB_ATTRIBUTERELATION", "AB_ATTRIBUTERELATION.OBJECT_ROWID = "+pUidColumn+" and "+newWhere("AB_ATTRIBUTERELATION.AB_ATTRIBUTE_ID", attributeId).toString());
+    .leftJoin("AB_ATTRIBUTERELATION", newWhere("AB_ATTRIBUTERELATION.OBJECT_ROWID = "+pUidColumn).and("AB_ATTRIBUTERELATION.AB_ATTRIBUTE_ID", attributeId));
     
     if (attrType == AttributeTypes.COMBO())
         stmt.leftJoin("AB_ATTRIBUTE", "AB_ATTRIBUTE.AB_ATTRIBUTEID = " + valuefield);
diff --git a/process/MSTeams_lib/process.js b/process/MSTeams_lib/process.js
index 4c5d02e33cc..16d41e7efaf 100644
--- a/process/MSTeams_lib/process.js
+++ b/process/MSTeams_lib/process.js
@@ -23,6 +23,11 @@ MSTeamsUtils.isTeamsEnabled = function ()
     return Utils.toBoolean(project.getInstanceConfigValue("teamsEnabled", "false"));
 }
 
+MSTeamsUtils.getImpersoAzureId = function ()
+{
+    return project.getInstanceConfigValue("teamsImpersoAzureId", "");
+}
+
 /**
  * Contains the configuration for the possible contexts that can be used for teamLinks.
  * 
-- 
GitLab


From e717e3ee7f1e9c453ff580300be6931b5876c403 Mon Sep 17 00:00:00 2001
From: Sebastian Listl <s.listl@adito.de>
Date: Mon, 23 Nov 2020 16:00:34 +0100
Subject: [PATCH 100/184] Grouping by Attributes

---
 .../attribute_filter/groupQueryProcess.js     |  1 -
 process/AttributeFilter_lib/process.js        | 27 +++----
 process/Attribute_lib/process.js              | 80 ++++++++++++++-----
 process/Util_lib/process.js                   |  9 +++
 4 files changed, 83 insertions(+), 34 deletions(-)

diff --git a/entity/Person_entity/recordcontainers/db/filterextensions/attribute_filter/groupQueryProcess.js b/entity/Person_entity/recordcontainers/db/filterextensions/attribute_filter/groupQueryProcess.js
index dcc085ca306..cd1075a6aca 100644
--- a/entity/Person_entity/recordcontainers/db/filterextensions/attribute_filter/groupQueryProcess.js
+++ b/entity/Person_entity/recordcontainers/db/filterextensions/attribute_filter/groupQueryProcess.js
@@ -1,4 +1,3 @@
-import("system.logging");
 import("system.result");
 import("AttributeFilter_lib");
 
diff --git a/process/AttributeFilter_lib/process.js b/process/AttributeFilter_lib/process.js
index adfea322ed0..0e9a44920ee 100644
--- a/process/AttributeFilter_lib/process.js
+++ b/process/AttributeFilter_lib/process.js
@@ -91,7 +91,7 @@ AttributeFilterExtensionMaker.getFilterFields = function(pObjectType)
 
     var loadingConfig = entities.createConfigForLoadingRows().entity("Attribute_entity")
         .provider("SpecificFilterAttributes")
-        .fields(["UID", "FULL_ATTRIBUTE_NAME", "ATTRIBUTE_TYPE"])
+        .fields(["UID", "FULL_ATTRIBUTE_NAME", "ATTRIBUTE_TYPE", "DROPDOWNDEFINITION"])
         .addParameter("ObjectType_param", pObjectType);
 
     var attributeRows = entities.getRows(loadingConfig);
@@ -99,17 +99,19 @@ AttributeFilterExtensionMaker.getFilterFields = function(pObjectType)
         var attributeType = row["ATTRIBUTE_TYPE"].trim();
         var contentType = AttributeTypeUtil.getContentType(attributeType);
         var groupedRecordField = AttributeTypeUtil.getDatabaseField(attributeType);
-        var titleRecordField = AttributeTypeUtil.getDatabaseField(attributeType);
+        var getTitleRecordFieldFn = AttributeTypeUtil.getDisplayValueSqlFn(attributeType);
+        var titleRecordField = getTitleRecordFieldFn({
+            attributeId: row["UID"],
+            dropDownDefinition: row["DROPDOWNDEFINITION"]
+        });
         
         if (attributeType == AttributeTypes.VOID())
         {
             contentType = "BOOLEAN";
+            groupedRecordField = SqlBuilder.caseWhen("AB_ATTRIBUTE_ID is not null").thenString("1").toString();
+            titleRecordField = SqlBuilder.caseWhen("AB_ATTRIBUTE_ID is not null").thenString(translate.text("Yes")).toString();
         }
-        else if(attributeType == AttributeTypes.COMBO())
-        {
-            groupedRecordField = "AB_ATTRIBUTEID";
-            titleRecordField = "ATTRIBUTE_NAME";
-        }
+        
         if (titleRecordField == "INT_VALUE" || titleRecordField == "NUMBER_VALUE")
             titleRecordField = sqlMask.cast(titleRecordField, SQLTYPES.VARCHAR, 50);
 
@@ -313,18 +315,15 @@ AttributeFilterExtensionMaker.getFilterGroupQuery = function(pAttributeName, pCo
 
     var attributeId = name.id;
     var attrType = name.type;
-    if (attrType == AttributeTypes.VOID())
-        attrType = AttributeTypes.BOOLEAN();
-
     var valuefield = AttributeTypeUtil.getDatabaseField(attrType);
+    
+    if (attrType == AttributeTypes.VOID())
+        valuefield = "AB_ATTRIBUTE_ID";
 
 
     var stmt = newSelect(pCount ? "1" : pColumnList).from(pFrom)
     .leftJoin("AB_ATTRIBUTERELATION", newWhere("AB_ATTRIBUTERELATION.OBJECT_ROWID = "+pUidColumn).and("AB_ATTRIBUTERELATION.AB_ATTRIBUTE_ID", attributeId));
-    
-    if (attrType == AttributeTypes.COMBO())
-        stmt.leftJoin("AB_ATTRIBUTE", "AB_ATTRIBUTE.AB_ATTRIBUTEID = " + valuefield);
-        
+            
     if(pCondition)
         stmt.where(pCondition);
         
diff --git a/process/Attribute_lib/process.js b/process/Attribute_lib/process.js
index 938efc90998..3e43bcc979b 100644
--- a/process/Attribute_lib/process.js
+++ b/process/Attribute_lib/process.js
@@ -859,10 +859,16 @@ Object.assign(AttributeTypes.BOOLEAN, {
     contentType: "BOOLEAN", 
     databaseField: "INT_VALUE",
     singleSelection: true,
+    getDisplayValueSql: function (pAttributeData)
+    {
+        var valueField = "AB_ATTRIBUTERELATION." + this.databaseField;
+        return SqlBuilder.caseWhen(valueField, "1").thenString(translate.text("Yes"))
+            .when(valueField, "0").thenString(translate.text("No"));
+    },
     getViewValue: function (pValue)
-        {
-            return pValue == "1" ? translate.text("Yes") : translate.text("No");
-        }
+    {
+        return Utils.toBoolean(pValue) ? translate.text("Yes") : translate.text("No");
+    }
 });
 Object.assign(AttributeTypes.COMBO, {
     toString: function () {return this();},
@@ -870,15 +876,30 @@ Object.assign(AttributeTypes.COMBO, {
     databaseField: "ID_VALUE",
     possibleChildren: [AttributeTypes.COMBOVALUE()],
     //in most cases the view value of this attribute type is loaded via a direct sql join for less queries and better performance
-    getViewValue: function (pValue)
+    getDisplayValueSql: function (pAttributeData)
+    {
+        var valueField = "AB_ATTRIBUTERELATION." + this.databaseField;
+        var values = newSelect(["AB_ATTRIBUTEID", "ATTRIBUTE_NAME"])
+            .from("AB_ATTRIBUTE")
+            .where("AB_ATTRIBUTE.ATTRIBUTE_PARENT_ID", pAttributeData.attributeId)
+            .and("AB_ATTRIBUTE.ATTRIBUTE_TYPE", AttributeTypes.COMBOVALUE())
+            .table();
+        var sql = SqlBuilder.caseStatement(values, valueField);
+        values.forEach(function ([key, value])
         {
-            var viewValue = newSelect("AB_ATTRIBUTE.ATTRIBUTE_NAME")
-                .from("AB_ATTRIBUTE")
-                .where("AB_ATTRIBUTE.AB_ATTRIBUTEID", pValue)
-                .and("AB_ATTRIBUTE.ATTRIBUTE_TYPE", AttributeTypes.COMBOVALUE())
-                .cell();
-            return viewValue ? translate.text(viewValue) : viewValue;
-        }
+            sql.when(valueField, key).thenString(translate.text(value));
+        });
+        return sql.toString();
+    },
+    getViewValue: function (pValue)
+    {
+        var viewValue = newSelect("AB_ATTRIBUTE.ATTRIBUTE_NAME")
+            .from("AB_ATTRIBUTE")
+            .where("AB_ATTRIBUTE.AB_ATTRIBUTEID", pValue)
+            .and("AB_ATTRIBUTE.ATTRIBUTE_TYPE", AttributeTypes.COMBOVALUE())
+            .cell();
+        return viewValue ? translate.text(viewValue) : viewValue;
+    }
 });
 Object.assign(AttributeTypes.COMBOVALUE, {
     toString: function () {return this();},
@@ -907,18 +928,23 @@ Object.assign(AttributeTypes.KEYWORD, {
     toString: function () {return this();},
     contentType: "UNKNOWN", 
     databaseField: "ID_VALUE", 
+    getDisplayValueSql: function (pAttributeData)
+    {
+        var valueField = "AB_ATTRIBUTERELATION." + this.databaseField;
+        return KeywordUtils.getResolvedTitleSqlPart(pAttributeData.dropDownDefinition, valueField);
+    },
     getViewValue: function (pValue, pKeyword)
-        {
-            return KeywordUtils.getViewValue(pKeyword, pValue);
-        },
+    {
+        return KeywordUtils.getViewValue(pKeyword, pValue);
+    },
     dropDownDefinitionTitle: "Keyword",
     getDropDownDefinitions: function ()
+    {
+        return KeywordUtils.getContainerNames().map(function (e)
         {
-            return KeywordUtils.getContainerNames().map(function (e)
-            {
-                return [e, e];//currently the first column is ID, second view value - which is the same because there is no ID for keyword-containers
-            });
-        }
+            return [e, e];//currently the first column is ID, second view value - which is the same because there is no ID for keyword-containers
+        });
+    }
 });
 Object.assign(AttributeTypes.VOID, {
     toString: function () {return this();},
@@ -1096,6 +1122,22 @@ AttributeTypeUtil.getDropDownDefinitionTitle = function (pAttributeType)
     return AttributeTypeUtil._getProperty(pAttributeType, "dropDownDefinitionTitle", "");
 }
 
+AttributeTypeUtil.getDisplayValueSqlFn = function (pAttributeType)
+{
+    if (!pAttributeType)
+        return null;
+    
+    pAttributeType = pAttributeType.trim();
+    var attributeType = AttributeTypes[pAttributeType];
+    if (!attributeType)
+        return null;
+    var displayValueSqlFn = attributeType.getDisplayValueSql || function () 
+    {
+        return this.databaseField;
+    };
+    return displayValueSqlFn.bind(attributeType);
+}
+
 /**
  * Compare the given pAttributeType with the attribute type string
  * "OBJECTSELECTION".
diff --git a/process/Util_lib/process.js b/process/Util_lib/process.js
index 5f5227efc07..b520401112a 100644
--- a/process/Util_lib/process.js
+++ b/process/Util_lib/process.js
@@ -312,6 +312,15 @@ Utils.objectFromMap = function (pMap)
     return mapObject;
 }
 
+Utils.toMap = function (pObject)
+{
+    if (Utils.isMap(pObject))
+        return pObject;
+    if (!Array.isArray(pObject))
+        pObject = Utils.objectEntries(pObject);
+    return new Map(pObject);
+}
+
 /**
  * Parses the given JSON to an object, but ignores empty strings, undefined or null.
  * 
-- 
GitLab


From a6b60aca5fe0314532f8bf2ec57a4eceabe3cec1 Mon Sep 17 00:00:00 2001
From: "b.ulrich" <b.ulrich@adito.de>
Date: Tue, 24 Nov 2020 10:04:56 +0100
Subject: [PATCH 101/184] [Projekt: Entwicklung - xRM][TicketNr.:
 1063066][Adressen - Entfernen des Felds "Gebiet"]

---
 .../AddressValidation_entity.aod              | 59 +++++++++----------
 .../recordcontainers/jdito/contentProcess.js  |  1 -
 .../AddressList_view/AddressList_view.aod     |  4 --
 process/DataPrivacy_lib/process.js            |  2 +-
 process/WsValidation_lib/process.js           |  3 -
 5 files changed, 29 insertions(+), 40 deletions(-)

diff --git a/entity/AddressValidation_entity/AddressValidation_entity.aod b/entity/AddressValidation_entity/AddressValidation_entity.aod
index 4f1ed593851..28904169c4f 100644
--- a/entity/AddressValidation_entity/AddressValidation_entity.aod
+++ b/entity/AddressValidation_entity/AddressValidation_entity.aod
@@ -17,6 +17,13 @@
     <entityProvider>
       <name>ZipValidaton</name>
       <documentation>%aditoprj%/entity/AddressValidation_entity/entityfields/zipvalidaton/documentation.adoc</documentation>
+      <children>
+        <entityParameter>
+          <name>Type_param</name>
+          <valueProcess>%aditoprj%/entity/AddressValidation_entity/entityfields/zipvalidaton/children/type_param/valueProcess.js</valueProcess>
+          <expose v="false" />
+        </entityParameter>
+      </children>
       <dependencies>
         <entityDependency>
           <name>fcfcbebe-260a-4773-a874-9791b4887ae2</name>
@@ -25,13 +32,6 @@
           <isConsumer v="false" />
         </entityDependency>
       </dependencies>
-      <children>
-        <entityParameter>
-          <name>Type_param</name>
-          <valueProcess>%aditoprj%/entity/AddressValidation_entity/entityfields/zipvalidaton/children/type_param/valueProcess.js</valueProcess>
-          <expose v="false" />
-        </entityParameter>
-      </children>
     </entityProvider>
     <entityParameter>
       <name>Type_param</name>
@@ -75,6 +75,13 @@
     <entityProvider>
       <name>CityValidation</name>
       <documentation>%aditoprj%/entity/AddressValidation_entity/entityfields/cityvalidation/documentation.adoc</documentation>
+      <children>
+        <entityParameter>
+          <name>Type_param</name>
+          <valueProcess>%aditoprj%/entity/AddressValidation_entity/entityfields/cityvalidation/children/type_param/valueProcess.js</valueProcess>
+          <expose v="false" />
+        </entityParameter>
+      </children>
       <dependencies>
         <entityDependency>
           <name>27114db7-8562-43b2-87d8-fa605bbf2319</name>
@@ -83,13 +90,6 @@
           <isConsumer v="false" />
         </entityDependency>
       </dependencies>
-      <children>
-        <entityParameter>
-          <name>Type_param</name>
-          <valueProcess>%aditoprj%/entity/AddressValidation_entity/entityfields/cityvalidation/children/type_param/valueProcess.js</valueProcess>
-          <expose v="false" />
-        </entityParameter>
-      </children>
     </entityProvider>
     <entityParameter>
       <name>CurrentValue_param</name>
@@ -99,6 +99,13 @@
     <entityProvider>
       <name>FullAddressValidation</name>
       <documentation>%aditoprj%/entity/AddressValidation_entity/entityfields/fulladdressvalidation/documentation.adoc</documentation>
+      <children>
+        <entityParameter>
+          <name>Type_param</name>
+          <valueProcess>%aditoprj%/entity/AddressValidation_entity/entityfields/fulladdressvalidation/children/type_param/valueProcess.js</valueProcess>
+          <expose v="false" />
+        </entityParameter>
+      </children>
       <dependencies>
         <entityDependency>
           <name>10f700b5-1ac6-4d50-bcb8-aae55714fb43</name>
@@ -107,13 +114,6 @@
           <isConsumer v="false" />
         </entityDependency>
       </dependencies>
-      <children>
-        <entityParameter>
-          <name>Type_param</name>
-          <valueProcess>%aditoprj%/entity/AddressValidation_entity/entityfields/fulladdressvalidation/children/type_param/valueProcess.js</valueProcess>
-          <expose v="false" />
-        </entityParameter>
-      </children>
     </entityProvider>
     <entityField>
       <name>STREET</name>
@@ -135,6 +135,13 @@
     <entityProvider>
       <name>StreetValidation</name>
       <documentation>%aditoprj%/entity/AddressValidation_entity/entityfields/streetvalidation/documentation.adoc</documentation>
+      <children>
+        <entityParameter>
+          <name>Type_param</name>
+          <valueProcess>%aditoprj%/entity/AddressValidation_entity/entityfields/streetvalidation/children/type_param/valueProcess.js</valueProcess>
+          <expose v="false" />
+        </entityParameter>
+      </children>
       <dependencies>
         <entityDependency>
           <name>3211d147-0867-4fc1-8640-34a1b8fdcf18</name>
@@ -143,13 +150,6 @@
           <isConsumer v="false" />
         </entityDependency>
       </dependencies>
-      <children>
-        <entityParameter>
-          <name>Type_param</name>
-          <valueProcess>%aditoprj%/entity/AddressValidation_entity/entityfields/streetvalidation/children/type_param/valueProcess.js</valueProcess>
-          <expose v="false" />
-        </entityParameter>
-      </children>
     </entityProvider>
     <entityParameter>
       <name>City_param</name>
@@ -194,9 +194,6 @@
         <jDitoRecordFieldMapping>
           <name>DISTRICT.value</name>
         </jDitoRecordFieldMapping>
-        <jDitoRecordFieldMapping>
-          <name>REGION.value</name>
-        </jDitoRecordFieldMapping>
         <jDitoRecordFieldMapping>
           <name>STATE.value</name>
         </jDitoRecordFieldMapping>
diff --git a/entity/AddressValidation_entity/recordcontainers/jdito/contentProcess.js b/entity/AddressValidation_entity/recordcontainers/jdito/contentProcess.js
index e92fed1fd8c..506f8a365a9 100644
--- a/entity/AddressValidation_entity/recordcontainers/jdito/contentProcess.js
+++ b/entity/AddressValidation_entity/recordcontainers/jdito/contentProcess.js
@@ -49,7 +49,6 @@ else
             row.cityExt,
             row.country,
             row.district,
-            row.region,
             row.state,
             row.road,
             row.buildingNo,
diff --git a/neonView/AddressList_view/AddressList_view.aod b/neonView/AddressList_view/AddressList_view.aod
index a9f9b3c6b85..409bae01d2f 100644
--- a/neonView/AddressList_view/AddressList_view.aod
+++ b/neonView/AddressList_view/AddressList_view.aod
@@ -62,10 +62,6 @@
           <name>aafc58cf-7dbb-42cb-b04c-d0869e58d09a</name>
           <entityField>STATE</entityField>
         </neonTitledListTableColumn>
-        <neonTitledListTableColumn>
-          <name>29dbb3f5-6f80-4100-aed3-334ac0b9cc48</name>
-          <entityField>REGION</entityField>
-        </neonTitledListTableColumn>
         <neonTitledListTableColumn>
           <name>6e369a01-965f-41d9-9b0a-6128a3827e47</name>
           <entityField>ADDRESSADDITION</entityField>
diff --git a/process/DataPrivacy_lib/process.js b/process/DataPrivacy_lib/process.js
index da986784dd2..009bd8c7c52 100644
--- a/process/DataPrivacy_lib/process.js
+++ b/process/DataPrivacy_lib/process.js
@@ -200,7 +200,7 @@ DataPrivacyType.get = function(pKey)
         // TODO: update and fix Address_lib and use it (and remove format-functions in PostalAddress_lib)
         var entityConfig = entities.createConfigForLoadingRows()
                                    .entity("Address_entity")
-                                   .fields(["ADDRESSID", "ADDRESS", "ADDRESSADDITION", "ADDRIDENTIFIER", "BUILDINGNO", "ZIP", "CITY", "COUNTRY", "DISTRICT", "REGION", "PROVINCE"]);
+                                   .fields(["ADDRESSID", "ADDRESS", "ADDRESSADDITION", "ADDRIDENTIFIER", "BUILDINGNO", "ZIP", "CITY", "COUNTRY", "DISTRICT", "PROVINCE"]);
 
         if (pAddressId)
         {
diff --git a/process/WsValidation_lib/process.js b/process/WsValidation_lib/process.js
index 03bccc71e66..df45171957c 100644
--- a/process/WsValidation_lib/process.js
+++ b/process/WsValidation_lib/process.js
@@ -108,8 +108,6 @@ WsValidationType.get = function(pKey)
                     city: city,
                     cityExt: cityext,
                     country: pPlaceData.address.country_code.toUpperCase(), //4
-                    district: pPlaceData.address.district,
-                    region: pPlaceData.address.state_district,
                     state: pPlaceData.address.state,
                     road: road, //8
                     buildingNo: pPlaceData.address.house_number,
@@ -361,7 +359,6 @@ WsValidationUtils.setAddressFields = function(pJSON)
         "$field.CITY": data.city,
         "$field.COUNTRY": data.country,
         //"$field.DISTRICT": data.district, not needed currently
-        "$field.REGION": data.region,
         "$field.STATE": data.state,
         "$field.ADDRESS": data.road,
         "$field.BUILDINGNO": data.buildingNo
-- 
GitLab


From bd8578a84f1dea0c452c56f16c974806da128e74 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Alexander=20V=C3=B6gl?= <a.voegl@adito.de>
Date: Wed, 25 Nov 2020 11:01:05 +0000
Subject: [PATCH 102/184] add Organisation to Activity as Link if you import a
 Mail through the UniversalFileProcessor

---
 process/IncomingEmailExecutor_lib/process.js | 18 +++++++++++++++++-
 1 file changed, 17 insertions(+), 1 deletion(-)

diff --git a/process/IncomingEmailExecutor_lib/process.js b/process/IncomingEmailExecutor_lib/process.js
index 555f4f161b3..18756c30f4d 100644
--- a/process/IncomingEmailExecutor_lib/process.js
+++ b/process/IncomingEmailExecutor_lib/process.js
@@ -266,7 +266,23 @@ IncomingEmailExecutor.prototype._getProcessingFunction = function (pIsSender, pT
         }
         else
         {
-            var link = [(contactPersonId == "" ? "Organisation" : "Person"), contactId];
+            var context = contactPersonId == "" ? "Organisation" : "Person"
+         
+            if(context == "Person")//add Organisation to the Activity as Link
+            {
+                var orgData = newSelect(["CONTACT.CONTACTID", "CONTACT.STATUS"], this._alias)
+                                .from("CONTACT")
+                                .join("CONTACT", "anyContact.ORGANISATION_ID = CONTACT.ORGANISATION_ID and CONTACT.PERSON_ID is null", "anyContact")
+                                .whereIfSet(["CONTACT", "CONTACTID", "anyContact"], contactId)
+                                .arrayRow()
+                
+                if (orgData[1] == $KeywordRegistry.contactStatus$active())
+                    pTargetArray["prefered"].push(["Organisation", orgData[0]]);
+                else
+                    pTargetArray["failback"].push(["Organisation", orgData[0]]);
+            }
+         
+            var link = [context, contactId];
             if (isContactActive)
                 pTargetArray["prefered"].push(link);
             else
-- 
GitLab


From 3eb17722862ad5308b48d574cc77628600077e87 Mon Sep 17 00:00:00 2001
From: Sebastian Listl <s.listl@adito.de>
Date: Tue, 24 Nov 2020 10:34:54 +0100
Subject: [PATCH 103/184] JditoFilter_lib enhancements

---
 .../recordcontainers/jdito/contentProcess.js  |  10 +-
 process/JditoFilter_lib/process.js            | 102 ++++++++++++++++++
 2 files changed, 104 insertions(+), 8 deletions(-)

diff --git a/entity/MSTTeam_entity/recordcontainers/jdito/contentProcess.js b/entity/MSTTeam_entity/recordcontainers/jdito/contentProcess.js
index 8bfa01a4579..dccb70e0330 100644
--- a/entity/MSTTeam_entity/recordcontainers/jdito/contentProcess.js
+++ b/entity/MSTTeam_entity/recordcontainers/jdito/contentProcess.js
@@ -3,14 +3,8 @@ import("system.result");
 import("system.vars");
 import("JditoFilter_lib");
 
-var searchValue = null;
-JditoFilterUtils.filterRecords(["$$$LOOKUPFIELD$$$"], [["dummy"]], vars.get("$local.filter").filter, {
-    "$$$LOOKUPFIELD$$$" : function (recordValue, filterValue)
-    {
-        searchValue = filterValue;
-        return true;
-    }
-});
+var lookupFilter = new FilterConditionGroup(vars.get("$local.filter")).getRow("$$$LOOKUPFIELD$$$");
+var searchValue = lookupFilter ? lookupFilter.key : null;
 
 var allTeams = teams.getAllTeams(searchValue || null);
 var teamsArray = [];
diff --git a/process/JditoFilter_lib/process.js b/process/JditoFilter_lib/process.js
index 8480664cc40..d3bd0f9a436 100644
--- a/process/JditoFilter_lib/process.js
+++ b/process/JditoFilter_lib/process.js
@@ -6,6 +6,108 @@ import("system.datetime");
 
 //@TODO: add support for permissions to the lib
 
+/**
+ * object representing a filter-condition
+ * 
+ * @param {Object} pGroup
+ */
+function FilterConditionGroup (pGroup)
+{
+    if (pGroup.filter)
+        pGroup = pGroup.filter;
+        
+    this.type = "group";
+    this.operator = pGroup.operator;
+    _removeEmptyGroups(pGroup.childs);
+    this.childs = pGroup.childs.map(function (child)
+    {
+        if (child.type === "group")
+            return new FilterConditionGroup(child);
+        return child;
+    });
+    
+    function _removeEmptyGroups (pCurrentArray)
+    {
+        for (let i = 0; i < pCurrentArray.length; i++)
+        {
+            let row = pCurrentArray[i];
+            if (row.type == "group")
+            {
+                _removeEmptyGroups(row.childs);
+                if (row.childs.length === 0)
+                    pCurrentArray.splice(i--, 1);
+            }
+        }
+    }
+}
+
+/**
+ * Calls the given function for every filter row/group and returns the value if the function returns something truthy
+ * 
+ * @param {Function} pCallbackFn  function that tests the values
+ * @return {Object} the first row/group that meets the conditions
+ */
+FilterConditionGroup.prototype.find = function (pCallbackFn)
+{
+    for (let i = 0; l = this.childs.length; i++)
+    {
+        let child = this.childs[i];
+        if (pCallbackFn(child))
+            return child;
+        if (child.type === "group")
+            return child.find(pCallbackFn);
+    }
+}
+
+/**
+ * Searches the filter for a row with the given name
+ * 
+ * @param {String} pName the name of the row
+ * @return {Object} the desired row, if found
+ */
+FilterConditionGroup.prototype.getRow = function (pName)
+{
+    return this.find(function (row)
+    {
+        return row.type === "row" && row.name == pName;
+    });
+}
+
+FilterConditionGroup.prototype.reduce = function (pRowCallbackFn, pAccumulatorGeneratorFn, pMergeFn)
+{
+    return _reduce(this);
+    
+    function _reduce (pRow, pAccumulator, pOperator)
+    {
+        if (pRow.type === "group")
+        {
+            var accumulator = pAccumulatorGeneratorFn();
+            for (let i = 0, l = pRow.childs.length; i < l; i++)
+            {
+                accumulator = _reduce(pRow.childs[i], accumulator, pRow.operator);
+            }
+            if (pAccumulator === undefined || pAccumulator === null)
+                return accumulator;
+            return pMergeFn(pAccumulator, accumulator, pRow.operator);
+        }
+        else if (pRow.type === "row")
+        {
+            return pRowCallbackFn(pAccumulator, pRow, pOperator);
+        }
+        return undefined;
+    }
+}
+
+/**
+ * Checks if the filter group is empty
+ * 
+ * @return {Boolean} true if the filter is empty
+ */
+FilterConditionGroup.prototype.isEmpty = function ()
+{
+    return this.childs.length === 0;
+}
+
 /**
  * object for filtering records
  * 
-- 
GitLab


From 95b221d92c044942aa414a87e57a80650a8bf8d6 Mon Sep 17 00:00:00 2001
From: Sebastian Listl <s.listl@adito.de>
Date: Tue, 24 Nov 2020 11:45:09 +0100
Subject: [PATCH 104/184] Campaign_lib refactoring: SqlBuilder usage

---
 process/Campaign_lib/process.js | 96 ++++++++++++++++-----------------
 1 file changed, 47 insertions(+), 49 deletions(-)

diff --git a/process/Campaign_lib/process.js b/process/Campaign_lib/process.js
index 7c893948d7f..6902d8c5c76 100644
--- a/process/Campaign_lib/process.js
+++ b/process/Campaign_lib/process.js
@@ -170,12 +170,16 @@ CampaignUtils.getCampaignStatusByCampaignId = function(pCampaignId)
  */
 CampaignUtils.createLogEntry = function(pCampaignId, pCampaignStepId, pCampaignParticipantId, pPreviousCampaignStepId)
 {
-    let colsCampaignParticipantLog = CampaignUtils.getParticipantLogInsertColumnNames();
+    var rowCount = new SqlBuilder().insertFields({
+        "CAMPAIGN_ID": pCampaignId, 
+        "CAMPAIGNSTEP_ID": pCampaignStepId, 
+        "CAMPAIGNPARTICIPANT_ID": pCampaignParticipantId, 
+        "USER_NEW": vars.get("$sys.user"), 
+        "DATE_NEW": vars.get("$sys.date"), 
+        "PREVIOUS_CAMPAIGNSTEP_ID": pPreviousCampaignStepId
+    }, "CAMPAIGNPARTICIPANTLOG", "CAMPAIGNPARTICIPANTLOGID");
     
-    let valsCampaignParticipantLog = new Array(util.getNewUUID(), pCampaignId, pCampaignStepId, pCampaignParticipantId, vars.get("$sys.user"), vars.get("$sys.date"), pPreviousCampaignStepId);
-    
-    let rows = db.insertData("CAMPAIGNPARTICIPANTLOG", colsCampaignParticipantLog, null, valsCampaignParticipantLog);
-    return (rows == 1);
+    return rowCount > 0;
 }
 
 /**
@@ -204,12 +208,11 @@ CampaignUtils.getParticipantLogInsertColumnNames = function()
 CampaignUtils.openSetCampaignStepViewByRowIds = function(pParticipantIds, pCampaignId, pCampaignStepId)
 {
     var params = {
-        "campaignParticipantsRowIds_param":pParticipantIds,
-        "currentCampaignId_param":pCampaignId,
-        "currentCampaignStepId_param":pCampaignStepId,
-        "isUpdate_param":true
+        "campaignParticipantsRowIds_param": pParticipantIds,
+        "currentCampaignId_param": pCampaignId,
+        "currentCampaignStepId_param": pCampaignStepId,
+        "isUpdate_param": true
     };
-    
     neon.openContext("CampaignAddParticipants", "CampaignAddParticipantsEdit_view", null, neon.OPERATINGSTATE_VIEW, params);
 }
 
@@ -226,12 +229,12 @@ CampaignUtils.openSetCampaignStepViewByRowIds = function(pParticipantIds, pCampa
  */
 CampaignUtils.openSetCampaignStepViewByCondition = function(pCondition, pCampaignId, pCampaignStepId)
 {
-    var params = {};
-    params["campaignParticipantsCondition_param"] = pCondition;
-    params["currentCampaignId_param"] = pCampaignId;
-    params["currentCampaignStepId_param"] = pCampaignStepId;
-    params["isUpdate_param"] = true;
-    
+    var params = {
+        "campaignParticipantsCondition_param": pCondition,
+        "currentCampaignId_param": pCampaignId,
+        "currentCampaignStepId_param": pCampaignStepId,
+        "isUpdate_param": true
+    };
     neon.openContext("CampaignAddParticipants", "CampaignAddParticipantsEdit_view", null, neon.OPERATINGSTATE_VIEW, params);
 }
 
@@ -244,11 +247,10 @@ CampaignUtils.openSetCampaignStepViewByCondition = function(pCondition, pCampaig
  */
 CampaignUtils.openNewCampaignStepView = function(pCampaignId)
 {
-    var params = {};
-    
-    params["campaignId_param"] = pCampaignId;
-    params["campaignSelectionVisible_param"] = true;
-
+    var params = {
+        "campaignId_param": pCampaignId,
+        "campaignSelectionVisible_param": true
+    };
     neon.openContext("CampaignStep", "CampaignStepEdit_view", null, neon.OPERATINGSTATE_NEW, params);
 }
 
@@ -258,9 +260,7 @@ CampaignUtils.openNewCampaignStepView = function(pCampaignId)
  */
 CampaignUtils.openNewCampaignView = function()
 {
-    var params = {};
-    
-    neon.openContext("Campaign", "CampaignEdit_view", null, neon.OPERATINGSTATE_NEW, params);
+    neon.openContext("Campaign", "CampaignEdit_view", null, neon.OPERATINGSTATE_NEW, {});
 }
 
 /**
@@ -343,19 +343,19 @@ CampaignUtils.getMaxParticipantsValidationMessage = function()
  */
 CampaignUtils.deleteCampaignStepData = function(pCampaignStepId)
 {
-    if(pCampaignStepId == null || pCampaignStepId == "")
+    if (!pCampaignStepId)
         return;
-    
-    let queries = [];
 
     newWhere("CAMPAIGNSTEP.PREDECESSORSTEP_ID", pCampaignStepId)
-        .updateData(true, ["PREDECESSORSTEP_ID"], null, [""]);
+        .updateFields({"PREDECESSORSTEP_ID": ""});
     
-    queries.push(new Array("CAMPAIGNPARTICIPANTLOG", newWhere("CAMPAIGNPARTICIPANTLOG.CAMPAIGNSTEP_ID", pCampaignStepId).build()));
-    queries.push(new Array("CAMPAIGNPARTICIPANT", newWhere("CAMPAIGNPARTICIPANT.CAMPAIGNSTEP_ID", pCampaignStepId).build()));
-    queries.push(new Array("CAMPAIGNCOST", newWhere("CAMPAIGNCOST.CAMPAIGNSTEP_ID", pCampaignStepId).build()));
-    queries.push(new Array("CAMPAIGNSTEP", newWhere("CAMPAIGNSTEP.CAMPAIGNSTEPID", pCampaignStepId).build()));
-    db.deletes(queries)
+    var deleteStatements = [
+        newWhere("CAMPAIGNPARTICIPANTLOG.CAMPAIGNSTEP_ID", pCampaignStepId).buildDeleteStatement(),
+        newWhere("CAMPAIGNPARTICIPANT.CAMPAIGNSTEP_ID", pCampaignStepId).buildDeleteStatement(),
+        newWhere("CAMPAIGNCOST.CAMPAIGNSTEP_ID", pCampaignStepId).buildDeleteStatement(),
+        newWhere("CAMPAIGNSTEP.CAMPAIGNSTEPID", pCampaignStepId).buildDeleteStatement()
+    ];
+    db.deletes(deleteStatements);
 }
 
 /**
@@ -372,24 +372,22 @@ CampaignUtils.deleteCampaignStepData = function(pCampaignStepId)
  */
 CampaignUtils.deleteCampaignData = function(pCampaignId)
 {
-    if(pCampaignId == null || pCampaignId == "")
+    if (!pCampaignId)
         return;
     
-    let campaignStepIds = newSelect("CAMPAIGNSTEPID")
+    var campaignStepIds = newSelect("CAMPAIGNSTEPID")
                             .from("CAMPAIGNSTEP")
                             .where("CAMPAIGNSTEP.CAMPAIGN_ID", pCampaignId)
                             .arrayColumn();
     
-    campaignStepIds.forEach(function (campaignStepId) 
-    {
-        CampaignUtils.deleteCampaignStepData(campaignStepId)
-    });
+    campaignStepIds.forEach(CampaignUtils.deleteCampaignStepData);
     
-    let campaignRelated = [];
-    campaignRelated.push(new Array("CAMPAIGNCOST", newWhere("CAMPAIGNCOST.CAMPAIGN_ID", pCampaignId).build()));
-    campaignRelated.push(new Array("CAMPAIGN", newWhere("CAMPAIGN.CAMPAIGNID", pCampaignId).build()));
+    var campaignRelated = [
+        newWhere("CAMPAIGNCOST.CAMPAIGN_ID", pCampaignId).buildDeleteStatement(),
+        newWhere("CAMPAIGN.CAMPAIGNID", pCampaignId).buildDeleteStatement()
+    ];
     
-    db.deletes(campaignRelated)
+    db.deletes(campaignRelated);
 }
 
 /**
@@ -404,14 +402,14 @@ CampaignUtils.deleteCampaignData = function(pCampaignId)
  */
 CampaignUtils.updateCampaignStep = function(pCampaignStepId, pDateStart, pDateEnd)
 {
-    if(pCampaignStepId == null || pCampaignStepId == "")
+    if (!pCampaignStepId)
         return;
     
-    let columnsToUpdate = ["DATE_START", "DATE_END"];
-    let newValues = [pDateStart, pDateEnd];
-    let campaignStepIdCondition = newWhere("CAMPAIGNSTEP.CAMPAIGNSTEPID", pCampaignStepId);
-    
-    campaignStepIdCondition.updateData(true, "CAMPAIGNSTEP", columnsToUpdate, null, newValues);
+    newWhere("CAMPAIGNSTEP.CAMPAIGNSTEPID", pCampaignStepId)
+        .updateFields({
+            "DATE_START": pDateStart, 
+            "DATE_END": pDateEnd
+        });
 }
 
 /**
-- 
GitLab


From baeb9ed4b09f41ca09d78c3ec745dbe1c4d4caf2 Mon Sep 17 00:00:00 2001
From: Sebastian Listl <s.listl@adito.de>
Date: Wed, 25 Nov 2020 14:43:33 +0100
Subject: [PATCH 105/184] JditoFilter_lib fix

---
 process/JditoFilter_lib/process.js | 10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/process/JditoFilter_lib/process.js b/process/JditoFilter_lib/process.js
index d3bd0f9a436..e6e2ec67865 100644
--- a/process/JditoFilter_lib/process.js
+++ b/process/JditoFilter_lib/process.js
@@ -13,13 +13,15 @@ import("system.datetime");
  */
 function FilterConditionGroup (pGroup)
 {
-    if (pGroup.filter)
+    if (pGroup && "filter" in pGroup)
         pGroup = pGroup.filter;
         
+    var operator = pGroup ? pGroup.operator : "AND";
+    var childs = pGroup ? pGroup.childs : [];
     this.type = "group";
-    this.operator = pGroup.operator;
-    _removeEmptyGroups(pGroup.childs);
-    this.childs = pGroup.childs.map(function (child)
+    this.operator = operator;
+    _removeEmptyGroups(childs);
+    this.childs = childs.map(function (child)
     {
         if (child.type === "group")
             return new FilterConditionGroup(child);
-- 
GitLab


From 9d2f85ea524ee5f6f6a18c693eea88bbcb5adc28 Mon Sep 17 00:00:00 2001
From: Sebastian Listl <s.listl@adito.de>
Date: Wed, 25 Nov 2020 15:51:07 +0100
Subject: [PATCH 106/184] Workflow ServiceTasks for Campaigns

---
 .../documenttemplate_id/onValueChange.js      |  2 +-
 .../entityfields/campaign_id/stateProcess.js  |  6 +--
 entity/SerialLetter_entity/onValidation.js    | 12 +++++-
 .../CampaignStepPreview_view.aod              | 11 +----
 .../RemoveFromCampaign_workflowService.aod    | 12 ++++++
 .../process.js                                | 12 ++++++
 .../serviceTaskParameterProcess.js            | 23 ++++++++++
 .../SetCampaignStep_workflowService.aod       | 12 ++++++
 .../process.js                                | 42 +++++++++++++++++++
 .../serviceTaskParameterProcess.js            | 40 ++++++++++++++++++
 10 files changed, 157 insertions(+), 15 deletions(-)
 create mode 100644 process/RemoveFromCampaign_workflowService/RemoveFromCampaign_workflowService.aod
 create mode 100644 process/RemoveFromCampaign_workflowService/process.js
 create mode 100644 process/RemoveFromCampaign_workflowService/serviceTaskParameterProcess.js
 create mode 100644 process/SetCampaignStep_workflowService/SetCampaignStep_workflowService.aod
 create mode 100644 process/SetCampaignStep_workflowService/process.js
 create mode 100644 process/SetCampaignStep_workflowService/serviceTaskParameterProcess.js

diff --git a/entity/BulkMail_entity/entityfields/documenttemplate_id/onValueChange.js b/entity/BulkMail_entity/entityfields/documenttemplate_id/onValueChange.js
index 5f100fbe60a..c581ed319d6 100644
--- a/entity/BulkMail_entity/entityfields/documenttemplate_id/onValueChange.js
+++ b/entity/BulkMail_entity/entityfields/documenttemplate_id/onValueChange.js
@@ -9,7 +9,7 @@ if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW || vars.get("$sys.re
 {
     // note: could not use only the valueProcess from $field.content because then it refreshed $field.content just before save.
     // --> only set in $field.content.valueProcess if $field.content is null and set it from here only if MASK triggered change
-    [content, type] = DocumentTemplateUtils.getTemplateContent(vars.get("$local.value"), new FileUpload(vars.get("$field.bindata")));
+    var [content, type] = DocumentTemplateUtils.getTemplateContent(vars.get("$local.value"), new FileUpload(vars.get("$field.bindata")));
     vars.set("$field.templateType", type);
     vars.set("$field.content", content);
     
diff --git a/entity/CampaignStep_entity/entityfields/campaign_id/stateProcess.js b/entity/CampaignStep_entity/entityfields/campaign_id/stateProcess.js
index fcfc9adff47..c53bfb5c9af 100644
--- a/entity/CampaignStep_entity/entityfields/campaign_id/stateProcess.js
+++ b/entity/CampaignStep_entity/entityfields/campaign_id/stateProcess.js
@@ -11,13 +11,13 @@ import("system.vars");
  * This is specifically required for the campaign planning module as we want to create
  * new steps there regardless of the selection
  */
-if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW &&
+if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_VIEW || (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW &&
     (vars.exists("$param.campaignId_param") && vars.get("$param.campaignId_param") == "" ||
-    vars.exists("$param.campaignSelectionVisible_param") && vars.get("$param.campaignSelectionVisible_param") == "true"))
+    vars.exists("$param.campaignSelectionVisible_param") && vars.get("$param.campaignSelectionVisible_param") == "true")))
 {
     result.string(neon.COMPONENTSTATE_AUTO);
 }
-else
+else if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_EDIT)
 {
     result.string(neon.COMPONENTSTATE_INVISIBLE);
 }
\ No newline at end of file
diff --git a/entity/SerialLetter_entity/onValidation.js b/entity/SerialLetter_entity/onValidation.js
index d0d694d8f85..f2f4506feaf 100644
--- a/entity/SerialLetter_entity/onValidation.js
+++ b/entity/SerialLetter_entity/onValidation.js
@@ -2,7 +2,15 @@ import("system.neon");
 import("system.result");
 import("system.vars");
 import("DocumentTemplate_lib");
+import("Document_lib");
 
-[content, type] = DocumentTemplateUtils.getTemplateContent(vars.get("$field.DOCUMENTTEMPLATE_ID"), new FileUpload(vars.get("$field.bindata")));
-if (type != DocumentTemplate.types.ODT && (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW || vars.get("$sys.recordstate") == neon.OPERATINGSTATE_EDIT))
+var templateId = vars.get("$field.DOCUMENTTEMPLATE_ID");
+var upload = new FileUpload(vars.get("$field.bindata"));
+var template;
+if (upload.isFilled())
+    template = DocumentTemplate.fromUpload(upload);
+else if (templateId)
+    template = DocumentTemplateUtils.getTemplate(templateId);
+
+if (template && template.type != DocumentTemplate.types.ODT)
     result.string(DocumentTemplate.getSerialLetterODTOnlyMessage());
\ No newline at end of file
diff --git a/neonView/CampaignStepPreview_view/CampaignStepPreview_view.aod b/neonView/CampaignStepPreview_view/CampaignStepPreview_view.aod
index 51d4713e524..34fb03143ea 100644
--- a/neonView/CampaignStepPreview_view/CampaignStepPreview_view.aod
+++ b/neonView/CampaignStepPreview_view/CampaignStepPreview_view.aod
@@ -50,19 +50,12 @@
           <name>f7ddecfb-60bc-4a94-8905-7da729b32acd</name>
           <entityField>STEPMEDIUM</entityField>
         </entityFieldLink>
-      </fields>
-    </genericViewTemplate>
-    <genericViewTemplate>
-      <name>CampaignId</name>
-      <editMode v="false" />
-      <entityField>#ENTITY</entityField>
-      <fields>
         <entityFieldLink>
-          <name>cee78c4b-bbac-458a-ab1c-53734ea8c7f0</name>
+          <name>4056e92a-6c5c-4a24-b0f6-dc2a5aa798d4</name>
           <entityField>CAMPAIGN_ID</entityField>
         </entityFieldLink>
         <entityFieldLink>
-          <name>0bffa6f8-cb18-47f8-a8f4-08cf9d718114</name>
+          <name>32c55d58-72c7-4af0-9236-a019149656d4</name>
           <entityField>CampaignStatus</entityField>
         </entityFieldLink>
       </fields>
diff --git a/process/RemoveFromCampaign_workflowService/RemoveFromCampaign_workflowService.aod b/process/RemoveFromCampaign_workflowService/RemoveFromCampaign_workflowService.aod
new file mode 100644
index 00000000000..8dde3d1708e
--- /dev/null
+++ b/process/RemoveFromCampaign_workflowService/RemoveFromCampaign_workflowService.aod
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+  <name>RemoveFromCampaign_workflowService</name>
+  <title>Remove from Campaign</title>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <process>%aditoprj%/process/RemoveFromCampaign_workflowService/process.js</process>
+  <alias>Data_alias</alias>
+  <serviceTaskParameterProcess>%aditoprj%/process/RemoveFromCampaign_workflowService/serviceTaskParameterProcess.js</serviceTaskParameterProcess>
+  <variants>
+    <element>WORKFLOW</element>
+  </variants>
+</process>
diff --git a/process/RemoveFromCampaign_workflowService/process.js b/process/RemoveFromCampaign_workflowService/process.js
new file mode 100644
index 00000000000..c7552ccfed5
--- /dev/null
+++ b/process/RemoveFromCampaign_workflowService/process.js
@@ -0,0 +1,12 @@
+import("system.util");
+import("Sql_lib");
+import("system.vars");
+
+var variables = JSON.parse(vars.get("$local.value"));
+
+var contactId = variables.contactId || variables.targetId;
+var campaignId = variables.campaignId;
+
+newWhere("CAMPAIGNPARTICIPANT.CAMPAIGN_ID", campaignId)
+    .and("CAMPAIGNPARTICIPANT.CONTACT_ID", contactId)
+    .deleteData();
\ No newline at end of file
diff --git a/process/RemoveFromCampaign_workflowService/serviceTaskParameterProcess.js b/process/RemoveFromCampaign_workflowService/serviceTaskParameterProcess.js
new file mode 100644
index 00000000000..cc949e7c105
--- /dev/null
+++ b/process/RemoveFromCampaign_workflowService/serviceTaskParameterProcess.js
@@ -0,0 +1,23 @@
+import("system.result");
+import("system.vars");
+import("Sql_lib");
+import("Workflow_lib");
+
+var currentValues = JSON.parse(vars.get("$local.value"));
+
+var campaigns = newSelect(["CAMPAIGNID", "NAME"])
+    .from("CAMPAIGN")
+    .table()
+    .map(function ([id, name])
+    {
+        return {
+            id: id,
+            name: name
+        };
+    });
+
+var parameters = [
+    new WorkflowServiceTaskParameter("campaignId", "Campaign", WorkflowServiceTaskParameter.ENUM(), campaigns)
+];
+
+result.object(parameters);
\ No newline at end of file
diff --git a/process/SetCampaignStep_workflowService/SetCampaignStep_workflowService.aod b/process/SetCampaignStep_workflowService/SetCampaignStep_workflowService.aod
new file mode 100644
index 00000000000..708612a5a1a
--- /dev/null
+++ b/process/SetCampaignStep_workflowService/SetCampaignStep_workflowService.aod
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+  <name>SetCampaignStep_workflowService</name>
+  <title>Set Campaign Step</title>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <process>%aditoprj%/process/SetCampaignStep_workflowService/process.js</process>
+  <alias>Data_alias</alias>
+  <serviceTaskParameterProcess>%aditoprj%/process/SetCampaignStep_workflowService/serviceTaskParameterProcess.js</serviceTaskParameterProcess>
+  <variants>
+    <element>WORKFLOW</element>
+  </variants>
+</process>
diff --git a/process/SetCampaignStep_workflowService/process.js b/process/SetCampaignStep_workflowService/process.js
new file mode 100644
index 00000000000..75067927861
--- /dev/null
+++ b/process/SetCampaignStep_workflowService/process.js
@@ -0,0 +1,42 @@
+import("system.util");
+import("Campaign_lib");
+import("Sql_lib");
+import("system.vars");
+
+var variables = JSON.parse(vars.get("$local.value"));
+
+var contactId = variables.contactId || variables.targetId;
+var campaignId = variables.campaignId;
+var campaignStepId = variables.campaignStepId;
+
+var campaignStepQuery = newSelect(["CAMPAIGNPARTICIPANTID", "CAMPAIGNSTEP_ID"])
+    .from("CAMPAIGNPARTICIPANT")
+    .where("CAMPAIGNPARTICIPANT.CAMPAIGN_ID", campaignId)
+    .and("CAMPAIGNPARTICIPANT.CONTACT_ID", contactId);
+
+var [participantId, currentCampaignStep] = campaignStepQuery.arrayRow();
+    
+if (currentCampaignStep != campaignStepId)
+{
+    if (!currentCampaignStep)
+    {
+        participantId = util.getNewUUID();
+        new SqlBuilder.insertFields({
+            "CAMPAIGNPARTICIPANTID": participantId,
+            "CAMPAIGNSTEP_ID": campaignStepId,
+            "CAMPAIGN_ID": campaignId,
+            "CONTACT_ID": contactId,
+            "DATE_NEW": vars.get("$sys.date"),
+            "USER_NEW": vars.get("$sys.user")
+        }, "CAMPAIGNPARTICIPANT");
+    }
+    else 
+    {
+        campaignStepQuery.updateFields({
+            "CAMPAIGNSTEP_ID": campaignStepId,
+            "DATE_EDIT": vars.get("$sys.date"),
+            "USER_EDIT": vars.get("$sys.user")
+        });
+    }
+    CampaignUtils.createLogEntry(campaignId, campaignStepId, participantId, currentCampaignStep);
+}
\ No newline at end of file
diff --git a/process/SetCampaignStep_workflowService/serviceTaskParameterProcess.js b/process/SetCampaignStep_workflowService/serviceTaskParameterProcess.js
new file mode 100644
index 00000000000..5978f70ed26
--- /dev/null
+++ b/process/SetCampaignStep_workflowService/serviceTaskParameterProcess.js
@@ -0,0 +1,40 @@
+import("system.result");
+import("system.vars");
+import("Sql_lib");
+import("Workflow_lib");
+
+var currentValues = JSON.parse(vars.get("$local.value"));
+
+var campaigns = newSelect(["CAMPAIGNID", "NAME"])
+    .from("CAMPAIGN")
+    .table()
+    .map(function ([id, name])
+    {
+        return {
+            id: id,
+            name: name
+        };
+    });
+
+var parameters = [
+    new WorkflowServiceTaskParameter("campaignId", "Campaign", WorkflowServiceTaskParameter.ENUM(), campaigns, true)
+];
+
+var campaignId = currentValues.campaignId && currentValues.campaignId.value;
+if (campaignId)
+{
+    var campaignSteps = newSelect(["CAMPAIGNSTEPID", "NAME"])
+        .from("CAMPAIGNSTEP")
+        .where("CAMPAIGNSTEP.CAMPAIGN_ID", campaignId)
+        .table()
+        .map(function ([id, name])
+        {
+            return {
+                id: id,
+                name: name
+            };
+        });
+    parameters.push(new WorkflowServiceTaskParameter("campaignStepId", "Campaign Step", WorkflowServiceTaskParameter.ENUM(), campaignSteps));
+}
+
+result.object(parameters);
\ No newline at end of file
-- 
GitLab


From bf219d62e9afe7db5dc8dd33b94781e86f5ebb95 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Alexander=20V=C3=B6gl?= <a.voegl@adito.de>
Date: Thu, 26 Nov 2020 09:37:42 +0000
Subject: [PATCH 107/184] 2020.2 Preset Email for writing Emails

---
 .../entityfields/recipient/displayValueProcess.js  | 14 +++++++++++---
 .../entityfields/recipient/valueProcess.js         | 14 ++++++--------
 2 files changed, 17 insertions(+), 11 deletions(-)

diff --git a/entity/Email_entity/entityfields/recipient/displayValueProcess.js b/entity/Email_entity/entityfields/recipient/displayValueProcess.js
index 8e2f689eb15..ee4d3155ec9 100644
--- a/entity/Email_entity/entityfields/recipient/displayValueProcess.js
+++ b/entity/Email_entity/entityfields/recipient/displayValueProcess.js
@@ -1,6 +1,14 @@
+import("Communication_lib");
 import("system.result");
-import("system.neon");
 import("system.vars");
 
-if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW)
-    result.string(vars.get("$field.RECIPIENT"));
\ No newline at end of file
+if(vars.get("$field.RECIPIENT"))
+{
+    var res = "";
+    if (vars.exists("$param.Recipient_param") && vars.get("$param.Recipient_param"))
+        res = vars.get("$param.Recipient_param");
+    else if (vars.exists("$param.ContactId_param") && vars.get("$param.ContactId_param"))
+        res = CommUtil.getStandardMail(vars.get("$param.ContactId_param"));
+    
+    result.string(res);
+}
\ No newline at end of file
diff --git a/entity/Email_entity/entityfields/recipient/valueProcess.js b/entity/Email_entity/entityfields/recipient/valueProcess.js
index 0b715605584..13f68a3ed37 100644
--- a/entity/Email_entity/entityfields/recipient/valueProcess.js
+++ b/entity/Email_entity/entityfields/recipient/valueProcess.js
@@ -1,16 +1,14 @@
 import("Communication_lib");
 import("system.result");
-import("system.neon");
 import("system.vars");
 
 if (vars.get("$this.value") == null)
 {
+    var res = "";
     if (vars.exists("$param.Recipient_param") && vars.get("$param.Recipient_param"))
-        result.string(vars.get("$param.Recipient_param"));
+        res = vars.get("$param.Recipient_param");
     else if (vars.exists("$param.ContactId_param") && vars.get("$param.ContactId_param"))
-        result.string(CommUtil.getStandardMail(vars.get("$param.ContactId_param")));
-}
-else if (!vars.get("$this.value").includes("@") && vars.get("$this.value") != "")
-    result.string(newSelect("ADDR")
-                        .from("COMMUNICATION")
-                        .where("COMMUNICATION.COMMUNICATIONID", vars.get("$this.value")).cell());
\ No newline at end of file
+        res = CommUtil.getStandardMail(vars.get("$param.ContactId_param"));
+    
+    result.string(res);
+}
\ No newline at end of file
-- 
GitLab


From 2510dd7b2f2e68399a525832f5ed2fb91cb5659f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Alexander=20V=C3=B6gl?= <a.voegl@adito.de>
Date: Thu, 26 Nov 2020 10:40:03 +0000
Subject: [PATCH 108/184] #1068341 group Salesprojects by attributes

---
 .../attribute_filter/groupQueryProcess.js              |  1 -
 entity/Salesproject_entity/Salesproject_entity.aod     |  2 ++
 .../attribute_filter/groupQueryProcess.js              | 10 ++++++++++
 3 files changed, 12 insertions(+), 1 deletion(-)
 create mode 100644 entity/Salesproject_entity/recordcontainers/db/filterextensions/attribute_filter/groupQueryProcess.js

diff --git a/entity/Organisation_entity/recordcontainers/db/filterextensions/attribute_filter/groupQueryProcess.js b/entity/Organisation_entity/recordcontainers/db/filterextensions/attribute_filter/groupQueryProcess.js
index 1bd2d352867..03fd2fb9213 100644
--- a/entity/Organisation_entity/recordcontainers/db/filterextensions/attribute_filter/groupQueryProcess.js
+++ b/entity/Organisation_entity/recordcontainers/db/filterextensions/attribute_filter/groupQueryProcess.js
@@ -1,4 +1,3 @@
-import("system.logging");
 import("system.result");
 import("AttributeFilter_lib");
 
diff --git a/entity/Salesproject_entity/Salesproject_entity.aod b/entity/Salesproject_entity/Salesproject_entity.aod
index f497a51be79..26c7f691c11 100644
--- a/entity/Salesproject_entity/Salesproject_entity.aod
+++ b/entity/Salesproject_entity/Salesproject_entity.aod
@@ -951,6 +951,8 @@
           <filterFieldsProcess>%aditoprj%/entity/Salesproject_entity/recordcontainers/db/filterextensions/attribute_filter/filterFieldsProcess.js</filterFieldsProcess>
           <filterValuesProcess>%aditoprj%/entity/Salesproject_entity/recordcontainers/db/filterextensions/attribute_filter/filterValuesProcess.js</filterValuesProcess>
           <filterConditionProcess>%aditoprj%/entity/Salesproject_entity/recordcontainers/db/filterextensions/attribute_filter/filterConditionProcess.js</filterConditionProcess>
+          <isGroupable v="true" />
+          <groupQueryProcess>%aditoprj%/entity/Salesproject_entity/recordcontainers/db/filterextensions/attribute_filter/groupQueryProcess.js</groupQueryProcess>
           <filtertype>BASIC</filtertype>
         </filterExtensionSet>
         <filterExtensionSet>
diff --git a/entity/Salesproject_entity/recordcontainers/db/filterextensions/attribute_filter/groupQueryProcess.js b/entity/Salesproject_entity/recordcontainers/db/filterextensions/attribute_filter/groupQueryProcess.js
new file mode 100644
index 00000000000..2db6219c715
--- /dev/null
+++ b/entity/Salesproject_entity/recordcontainers/db/filterextensions/attribute_filter/groupQueryProcess.js
@@ -0,0 +1,10 @@
+import("system.result");
+import("AttributeFilter_lib");
+
+var sqlCond = AttributeFilterExtensionMaker.makeFilterGroupQuery("SALESPROJECT \n\
+    left join CONTACT on (SALESPROJECT.CONTACT_ID = CONTACT.CONTACTID) \n\
+    left join ORGANISATION on (CONTACT.ORGANISATION_ID = ORGANISATION.ORGANISATIONID)\n\
+    left join CLASSIFICATIONSTORAGE on (CLASSIFICATIONSTORAGE.OBJECT_ROWID = SALESPROJECT.SALESPROJECTID)\n\
+    left join MST_TEAMLINK on (SALESPROJECT.SALESPROJECTID = MST_TEAMLINK.OBJECT_ROWID and MST_TEAMLINK.OBJECT_TYPE = 'Salesproject')\n\
+    left join MST_TEAM on (MST_TEAM.MST_TEAMID = MST_TEAMLINK.MST_TEAM_ID)");
+result.string(sqlCond);
\ No newline at end of file
-- 
GitLab


From 2f0277aead6d98b0124f1a3ea2b62f87142d64a8 Mon Sep 17 00:00:00 2001
From: Sebastian Listl <s.listl@adito.de>
Date: Thu, 26 Nov 2020 11:54:08 +0100
Subject: [PATCH 109/184] db.getColumnTypes usages removed

---
 .../children/dispatchofferreport/onActionProcess.js            | 2 +-
 .../children/dispatchorderreport/onActionProcess.js            | 2 +-
 process/Classification_lib/process.js                          | 3 +--
 process/KnowledgeManagement_lib/process.js                     | 3 +--
 process/Loghistory_lib/process.js                              | 3 +--
 5 files changed, 5 insertions(+), 8 deletions(-)

diff --git a/entity/Offer_entity/entityfields/offerreportdispatch/children/dispatchofferreport/onActionProcess.js b/entity/Offer_entity/entityfields/offerreportdispatch/children/dispatchofferreport/onActionProcess.js
index 0f003f4454e..82065987492 100644
--- a/entity/Offer_entity/entityfields/offerreportdispatch/children/dispatchofferreport/onActionProcess.js
+++ b/entity/Offer_entity/entityfields/offerreportdispatch/children/dispatchofferreport/onActionProcess.js
@@ -11,7 +11,7 @@ import("MimeType_lib");
 
 var offerReport = {}
 var attachmentArray = [];
-var updateStatements = [["OFFER", ["STATUS"], db.getColumnTypes("OFFER", ["STATUS"]), [$KeywordRegistry.offerStatus$sent()], newWhere("OFFER.OFFERID", vars.get("$field.OFFERID")).build()]];
+var updateStatements = [["OFFER", ["STATUS"], null, [$KeywordRegistry.offerStatus$sent()], newWhere("OFFER.OFFERID", vars.get("$field.OFFERID")).build()]];
 var notificationMsg = translate.text("The status of the offer was changed to \"sent\".");
 var contactId = vars.get("$field.CONTACT_ID");
 var arrayReport = OfferUtils.buildOfferReport(vars.get("$field.OFFERID"));
diff --git a/entity/Order_entity/entityfields/orderreportdispatch/children/dispatchorderreport/onActionProcess.js b/entity/Order_entity/entityfields/orderreportdispatch/children/dispatchorderreport/onActionProcess.js
index 44cf00055ad..53225e7adf9 100644
--- a/entity/Order_entity/entityfields/orderreportdispatch/children/dispatchorderreport/onActionProcess.js
+++ b/entity/Order_entity/entityfields/orderreportdispatch/children/dispatchorderreport/onActionProcess.js
@@ -8,7 +8,7 @@ import("Sql_lib");
 
 var orderReport = {};
 var attachmentArray = [];
-var updateStatements = [["SALESORDER", ["ORDERSTATUS"], db.getColumnTypes("SALESORDER", ["ORDERSTATUS"]), ["1"], newWhere("SALESORDER.SALESORDERID", vars.get("$field.SALESORDERID")).build()]];
+var updateStatements = [["SALESORDER", ["ORDERSTATUS"], null, ["1"], newWhere("SALESORDER.SALESORDERID", vars.get("$field.SALESORDERID")).build()]];
 var notificationMsg = translate.text("The status of the order was changed to \"sent\".");
 var contactId = vars.get("$field.CONTACT_ID");
 var orgContactId = vars.get("$field.CONTACT_ORG_ID");
diff --git a/process/Classification_lib/process.js b/process/Classification_lib/process.js
index 756e30fa538..b0a5a683000 100644
--- a/process/Classification_lib/process.js
+++ b/process/Classification_lib/process.js
@@ -369,7 +369,6 @@ ClassificationUtils.insertEmptyClassification = function(pUids, pObjectType)
             "OBJECT_ROWID",
             "OBJECT_TYPE"
             ];
-    var types = db.getColumnTypes("CLASSIFICATIONSTORAGE", columns);//load once for better performance
     var inserts = [];
     var values;
     for (var i = 0; i < pUids.length; i++) 
@@ -378,7 +377,7 @@ ClassificationUtils.insertEmptyClassification = function(pUids, pObjectType)
                 classificationvalue,
                 pUids[i],
                 pObjectType];
-        inserts.push(["CLASSIFICATIONSTORAGE", columns, types, values]);
+        inserts.push(["CLASSIFICATIONSTORAGE", columns, null, values]);
     }
     db.inserts(inserts);
 }
diff --git a/process/KnowledgeManagement_lib/process.js b/process/KnowledgeManagement_lib/process.js
index 5bbe53c0a84..6abec985abd 100644
--- a/process/KnowledgeManagement_lib/process.js
+++ b/process/KnowledgeManagement_lib/process.js
@@ -410,11 +410,10 @@ KnowledgeManagementTagsController.prototype.editTag = function(pIdValue, pRowDat
     function _update(pId, pData)
     {
         var fields = ["KNOWLEDGETAG_ID", "USER_EDIT", "DATE_EDIT"];
-        var dataTypes = db.getColumnTypes("KNOWLEDGETAGLINK", fields);
         var values = [pData["TAG.value"], vars.get("$sys.user"), datetime.date()];
         var cond = newWhere("KNOWLEDGETAGLINK.KNOWLEDGETAGLINKID", pId).toString();
 
-        db.updateData("KNOWLEDGETAGLINK", fields, dataTypes, values, cond);
+        db.updateData("KNOWLEDGETAGLINK", fields, null, values, cond);
     }
     /**
      * private function for checking, if an old tag is used anywhere else. If it's not used anymore, it gets deleted
diff --git a/process/Loghistory_lib/process.js b/process/Loghistory_lib/process.js
index 00ee5d28afd..c3cc279cd0c 100644
--- a/process/Loghistory_lib/process.js
+++ b/process/Loghistory_lib/process.js
@@ -252,11 +252,10 @@ LogHistoryExecutor.prototype._addEntryForInsert = function (pTablename, pTablena
             statements: []
             ,cols: ["LOGTYPE","TABLENAME","TABLENAMEID","DESCRIPTION", "SOURCE_TABLENAME", "SOURCE_TABLENAMEID", "DATE_NEW","USER_NEW", "AB_LOGHISTORYID"]
         };
-        this.toInsert.types = db.getColumnTypes("AB_LOGHISTORY", this.toInsert.cols);//load only once for better performance
     }
 
     var vals = [this.sqlAction, pTablename, pTablenameId, pDescription, pSourceTablename, pSourceTablenameId, this.timestamp, this.triggeringUser, util.getNewUUID()];
-    this.toInsert.statements.push(["AB_LOGHISTORY", this.toInsert.cols, this.toInsert.types, vals]);
+    this.toInsert.statements.push(["AB_LOGHISTORY", this.toInsert.cols, null, vals]);
 };
 
 /*
-- 
GitLab


From abe6f4fde858292c0bc5eb919a723c7c7f44426c Mon Sep 17 00:00:00 2001
From: Sebastian Listl <s.listl@adito.de>
Date: Thu, 26 Nov 2020 14:38:48 +0100
Subject: [PATCH 110/184] Scan Service fixes

---
 entity/Activity_entity/Activity_entity.aod    |  1 +
 .../createnewchatactivity/onActionProcess.js  |  6 --
 .../createnewchatactivity/stateProcess.js     | 23 -------
 .../AttributeRelation_entity.aod              | 69 ++++++++++---------
 .../AuditLogHistory_entity.aod                |  3 +-
 .../KnowledgeDiscussion_entity.aod            |  2 +-
 .../KnowledgeManagementTags_entity.aod        | 12 ----
 .../KnowledgeManagement_entity.aod            |  1 -
 .../children/isdashlet_param/valueProcess.js  |  3 -
 entity/MSTTeam_entity/MSTTeam_entity.aod      |  1 +
 .../MSTeamsActivityImport_entity.aod          |  1 -
 .../importmessages/onActionProcess.js         |  0
 .../MSTeamsMessage_entity.aod                 |  7 +-
 .../loadnext_param/documentation.adoc         |  3 -
 .../addrecordaction/onActionProcess.js        |  7 --
 .../SingleObject_entity.aod                   |  2 -
 .../VisitPlanEmployeeWeek_entity.aod          | 14 ++--
 .../_____LANGUAGE_EXTRA.aod                   |  6 --
 .../_____LANGUAGE_de/_____LANGUAGE_de.aod     |  6 --
 .../_____LANGUAGE_en/_____LANGUAGE_en.aod     |  6 --
 neonContext/MSTTeamMember/MSTTeamMember.aod   |  5 --
 neonDashboard/Home/Home.aod                   | 10 +--
 .../Vertriebsdashboard/Vertriebsdashboard.aod | 12 ++--
 .../AnyObjectRelationTree_view0.aod           | 19 -----
 .../KnowledgeLinkMultiEdit_view.aod           |  2 +-
 .../KnowledgeManagementDetails_view.aod       |  2 +-
 .../KnowledgeManagementLookup_view.aod        |  4 --
 .../MSTTeamMemberEdit_view.aod                | 36 ----------
 .../MSTeamsDocumentEdit_view.aod              |  2 +-
 29 files changed, 61 insertions(+), 204 deletions(-)
 delete mode 100644 entity/Activity_entity/entityfields/msteams/children/createnewchatactivity/onActionProcess.js
 delete mode 100644 entity/Activity_entity/entityfields/msteams/children/createnewchatactivity/stateProcess.js
 delete mode 100644 entity/KnowledgeNewsFeed_entity/entityfields/consumer/children/isdashlet_param/valueProcess.js
 delete mode 100644 entity/MSTeamsActivityImport_entity/entityfields/importmessages/onActionProcess.js
 delete mode 100644 entity/MSTeamsMessage_entity/entityfields/loadnext_param/documentation.adoc
 delete mode 100644 entity/Person_entity/entityfields/testgroup/children/addrecordaction/onActionProcess.js
 delete mode 100644 neonView/AnyObjectRelationTree_view0/AnyObjectRelationTree_view0.aod
 delete mode 100644 neonView/MSTTeamMemberEdit_view/MSTTeamMemberEdit_view.aod

diff --git a/entity/Activity_entity/Activity_entity.aod b/entity/Activity_entity/Activity_entity.aod
index fae8253b6fe..ddb1971da5f 100644
--- a/entity/Activity_entity/Activity_entity.aod
+++ b/entity/Activity_entity/Activity_entity.aod
@@ -157,6 +157,7 @@
       <title>Date (Month)</title>
       <contentType>TEXT</contentType>
       <groupable v="true" />
+      <displayValueProcess>%aditoprj%/entity/Activity_entity/entityfields/entrymonth/displayValueProcess.js</displayValueProcess>
       <onValueChangeTypes>
         <element>MASK</element>
         <element>PROCESS</element>
diff --git a/entity/Activity_entity/entityfields/msteams/children/createnewchatactivity/onActionProcess.js b/entity/Activity_entity/entityfields/msteams/children/createnewchatactivity/onActionProcess.js
deleted file mode 100644
index 6840e66a0bf..00000000000
--- a/entity/Activity_entity/entityfields/msteams/children/createnewchatactivity/onActionProcess.js
+++ /dev/null
@@ -1,6 +0,0 @@
-import("system.vars");
-import("system.neon");
-
-neon.openContext("MSTTeamChat", null, null, neon.OPERATINGSTATE_NEW, {
-    "ROWID_param" : vars.get("$param.RowId_param")
-});
\ No newline at end of file
diff --git a/entity/Activity_entity/entityfields/msteams/children/createnewchatactivity/stateProcess.js b/entity/Activity_entity/entityfields/msteams/children/createnewchatactivity/stateProcess.js
deleted file mode 100644
index 0b93d5c410b..00000000000
--- a/entity/Activity_entity/entityfields/msteams/children/createnewchatactivity/stateProcess.js
+++ /dev/null
@@ -1,23 +0,0 @@
-import("system.vars");
-import("system.neon");
-import("system.result");
-import("Sql_lib");
-
-var teamId = newSelect("MST_TEAMID")
-    .from("MST_TEAM")
-    .where("MST_TEAM.OBJECT_ROWID", vars.get("$param.RowId_param"))
-    .cell();
-
-var isArchived = newSelect("IS_ARCHIVED")
-    .from("MST_TEAM")
-    .where("MST_TEAM.OBJECT_ROWID", vars.get("$param.RowId_param"))
-    .cell();
-    
-if (teamId == "" || isArchived == 1) 
-{
-    result.string(neon.COMPONENTSTATE_INVISIBLE);
-}
-else
-{
-    result.string(neon.COMPONENTSTATE_EDITABLE);
-}
\ No newline at end of file
diff --git a/entity/AttributeRelation_entity/AttributeRelation_entity.aod b/entity/AttributeRelation_entity/AttributeRelation_entity.aod
index 4e5c98f9dec..6a92d5391d8 100644
--- a/entity/AttributeRelation_entity/AttributeRelation_entity.aod
+++ b/entity/AttributeRelation_entity/AttributeRelation_entity.aod
@@ -34,6 +34,13 @@
     <entityProvider>
       <name>TreeProvider</name>
       <documentation>%aditoprj%/entity/AttributeRelation_entity/entityfields/treeprovider/documentation.adoc</documentation>
+      <children>
+        <entityParameter>
+          <name>GetTree_param</name>
+          <valueProcess>%aditoprj%/entity/AttributeRelation_entity/entityfields/treeprovider/children/gettree_param/valueProcess.js</valueProcess>
+          <expose v="false" />
+        </entityParameter>
+      </children>
       <dependencies>
         <entityDependency>
           <name>e0a7a4bc-ec7f-4f09-9b94-cbeb328cd7b8</name>
@@ -96,13 +103,6 @@
           <isConsumer v="false" />
         </entityDependency>
       </dependencies>
-      <children>
-        <entityParameter>
-          <name>GetTree_param</name>
-          <valueProcess>%aditoprj%/entity/AttributeRelation_entity/entityfields/treeprovider/children/gettree_param/valueProcess.js</valueProcess>
-          <expose v="false" />
-        </entityParameter>
-      </children>
     </entityProvider>
     <entityField>
       <name>AB_ATTRIBUTE_ID</name>
@@ -132,11 +132,6 @@
     </entityField>
     <entityConsumer>
       <name>SpecificAttribute</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Attribute_entity</entityName>
-        <fieldName>SpecificAttribute</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ObjectType_param</name>
@@ -155,6 +150,11 @@
           <valueProcess>%aditoprj%/entity/AttributeRelation_entity/entityfields/specificattribute/children/themeobjectrowid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Attribute_entity</entityName>
+        <fieldName>SpecificAttribute</fieldName>
+      </dependency>
     </entityConsumer>
     <entityParameter>
       <name>GetTree_param</name>
@@ -165,6 +165,12 @@
     <entityProvider>
       <name>AttributeRelations</name>
       <documentation>%aditoprj%/entity/AttributeRelation_entity/entityfields/attributerelations/documentation.adoc</documentation>
+      <children>
+        <entityParameter>
+          <name>GetTree_param</name>
+          <expose v="false" />
+        </entityParameter>
+      </children>
       <dependencies>
         <entityDependency>
           <name>69560cc2-d92a-453c-9e64-fb712a538c4f</name>
@@ -239,12 +245,6 @@
           <isConsumer v="false" />
         </entityDependency>
       </dependencies>
-      <children>
-        <entityParameter>
-          <name>GetTree_param</name>
-          <expose v="false" />
-        </entityParameter>
-      </children>
     </entityProvider>
     <entityField>
       <name>DATE_EDIT</name>
@@ -312,11 +312,6 @@
     </entityField>
     <entityConsumer>
       <name>Objects</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>ObjectProxy_entity</entityName>
-        <fieldName>FilteredObjects</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>Entity_param</name>
@@ -327,6 +322,11 @@
           <valueProcess>%aditoprj%/entity/AttributeRelation_entity/entityfields/objects/children/filter_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>ObjectProxy_entity</entityName>
+        <fieldName>FilteredObjects</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>DROPDOWNDEFINITION</name>
@@ -341,6 +341,7 @@
     </entityProvider>
     <entityField>
       <name>AB_ATTRIBUTERELATIONID</name>
+      <valueProcess>%aditoprj%/entity/AttributeRelation_entity/entityfields/ab_attributerelationid/valueProcess.js</valueProcess>
     </entityField>
     <entityProvider>
       <name>#PROVIDER_AGGREGATES</name>
@@ -348,11 +349,6 @@
     </entityProvider>
     <entityConsumer>
       <name>SpecificFilterAttributes</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Attribute_entity</entityName>
-        <fieldName>SpecificFilterAttributes</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>AttributeCount_param</name>
@@ -363,9 +359,20 @@
           <valueProcess>%aditoprj%/entity/AttributeRelation_entity/entityfields/specificfilterattributes/children/objecttype_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Attribute_entity</entityName>
+        <fieldName>SpecificFilterAttributes</fieldName>
+      </dependency>
     </entityConsumer>
     <entityProvider>
       <name>FilterProvider</name>
+      <children>
+        <entityParameter>
+          <name>DisplaySimpleName_param</name>
+          <valueProcess>%aditoprj%/entity/AttributeRelation_entity/entityfields/filterprovider/children/displaysimplename_param/valueProcess.js</valueProcess>
+        </entityParameter>
+      </children>
       <dependencies>
         <entityDependency>
           <name>0560c6d0-8473-4050-9ca1-a935bbac2ef9</name>
@@ -374,12 +381,6 @@
           <isConsumer v="false" />
         </entityDependency>
       </dependencies>
-      <children>
-        <entityParameter>
-          <name>DisplaySimpleName_param</name>
-          <valueProcess>%aditoprj%/entity/AttributeRelation_entity/entityfields/filterprovider/children/displaysimplename_param/valueProcess.js</valueProcess>
-        </entityParameter>
-      </children>
     </entityProvider>
   </entityFields>
   <recordContainers>
diff --git a/entity/AuditLogHistory_entity/AuditLogHistory_entity.aod b/entity/AuditLogHistory_entity/AuditLogHistory_entity.aod
index 88d93c5023f..26336d2da24 100644
--- a/entity/AuditLogHistory_entity/AuditLogHistory_entity.aod
+++ b/entity/AuditLogHistory_entity/AuditLogHistory_entity.aod
@@ -7,7 +7,6 @@
   <grantCreate v="false" />
   <grantUpdate v="false" />
   <grantDelete v="true" />
-  <grantDeleteProcess>%aditoprj%/entity/AuditLogHistory_entity/grantDeleteProcess.js</grantDeleteProcess>
   <initFilterProcess>%aditoprj%/entity/AuditLogHistory_entity/initFilterProcess.js</initFilterProcess>
   <titlePlural>Audit Logs</titlePlural>
   <recordContainer>db</recordContainer>
@@ -132,7 +131,7 @@
       <filterExtensions>
         <filterExtension>
           <name>contextFilter</name>
-          <title>Kontext</title>
+          <title>Context</title>
           <contentType>TEXT</contentType>
           <filterValuesProcess>%aditoprj%/entity/AuditLogHistory_entity/recordcontainers/db/filterextensions/contextfilter/filterValuesProcess.js</filterValuesProcess>
           <filterConditionProcess>%aditoprj%/entity/AuditLogHistory_entity/recordcontainers/db/filterextensions/contextfilter/filterConditionProcess.js</filterConditionProcess>
diff --git a/entity/KnowledgeDiscussion_entity/KnowledgeDiscussion_entity.aod b/entity/KnowledgeDiscussion_entity/KnowledgeDiscussion_entity.aod
index a5465f6d0a9..0b70f5dfc1e 100644
--- a/entity/KnowledgeDiscussion_entity/KnowledgeDiscussion_entity.aod
+++ b/entity/KnowledgeDiscussion_entity/KnowledgeDiscussion_entity.aod
@@ -94,7 +94,7 @@
     </entityParameter>
     <entityActionGroup>
       <name>Edit_ActionGroup</name>
-      <title>Bearbeiten</title>
+      <title>Edit</title>
       <children>
         <entityActionField>
           <name>addAnswer_action</name>
diff --git a/entity/KnowledgeManagementTags_entity/KnowledgeManagementTags_entity.aod b/entity/KnowledgeManagementTags_entity/KnowledgeManagementTags_entity.aod
index 552ce5d4c60..10b75658ad1 100644
--- a/entity/KnowledgeManagementTags_entity/KnowledgeManagementTags_entity.aod
+++ b/entity/KnowledgeManagementTags_entity/KnowledgeManagementTags_entity.aod
@@ -47,18 +47,6 @@
         <fieldName>CompleteList</fieldName>
       </dependency>
     </entityConsumer>
-    <entityActionField>
-      <name>ActionField1</name>
-      <title>a1</title>
-    </entityActionField>
-    <entityActionField>
-      <name>ActionField2</name>
-      <title>a2</title>
-    </entityActionField>
-    <entityActionField>
-      <name>ActionField3</name>
-      <title>a3</title>
-    </entityActionField>
     <entityProvider>
       <name>#PROVIDER_AGGREGATES</name>
       <useAggregates v="true" />
diff --git a/entity/KnowledgeManagement_entity/KnowledgeManagement_entity.aod b/entity/KnowledgeManagement_entity/KnowledgeManagement_entity.aod
index c65093499e8..f52fc433f41 100644
--- a/entity/KnowledgeManagement_entity/KnowledgeManagement_entity.aod
+++ b/entity/KnowledgeManagement_entity/KnowledgeManagement_entity.aod
@@ -20,7 +20,6 @@
         <entityDependency>
           <name>40cf66ca-421f-47f6-8ecc-8360657e0640</name>
           <entityName>KnowledgeNewsFeed_entity</entityName>
-          <fieldName>Consumer</fieldName>
           <isConsumer v="false" />
         </entityDependency>
       </dependencies>
diff --git a/entity/KnowledgeNewsFeed_entity/entityfields/consumer/children/isdashlet_param/valueProcess.js b/entity/KnowledgeNewsFeed_entity/entityfields/consumer/children/isdashlet_param/valueProcess.js
deleted file mode 100644
index 40effa01784..00000000000
--- a/entity/KnowledgeNewsFeed_entity/entityfields/consumer/children/isdashlet_param/valueProcess.js
+++ /dev/null
@@ -1,3 +0,0 @@
-import("system.result");
-
-result.string(true);
\ No newline at end of file
diff --git a/entity/MSTTeam_entity/MSTTeam_entity.aod b/entity/MSTTeam_entity/MSTTeam_entity.aod
index d062fa0ba01..f7675657fed 100644
--- a/entity/MSTTeam_entity/MSTTeam_entity.aod
+++ b/entity/MSTTeam_entity/MSTTeam_entity.aod
@@ -26,6 +26,7 @@
       <name>DESCRIPTION</name>
       <title>Description</title>
       <contentType>LONG_TEXT</contentType>
+      <stateProcess>%aditoprj%/entity/MSTTeam_entity/entityfields/description/stateProcess.js</stateProcess>
       <valueProcess>%aditoprj%/entity/MSTTeam_entity/entityfields/description/valueProcess.js</valueProcess>
     </entityField>
     <entityParameter>
diff --git a/entity/MSTeamsActivityImport_entity/MSTeamsActivityImport_entity.aod b/entity/MSTeamsActivityImport_entity/MSTeamsActivityImport_entity.aod
index fb158db38da..2f279cf23fb 100644
--- a/entity/MSTeamsActivityImport_entity/MSTeamsActivityImport_entity.aod
+++ b/entity/MSTeamsActivityImport_entity/MSTeamsActivityImport_entity.aod
@@ -80,7 +80,6 @@
     </entityProvider>
     <entityActionField>
       <name>importMessages</name>
-      <onActionProcess>%aditoprj%/entity/MSTeamsActivityImport_entity/entityfields/importmessages/onActionProcess.js</onActionProcess>
     </entityActionField>
   </entityFields>
   <recordContainers>
diff --git a/entity/MSTeamsActivityImport_entity/entityfields/importmessages/onActionProcess.js b/entity/MSTeamsActivityImport_entity/entityfields/importmessages/onActionProcess.js
deleted file mode 100644
index e69de29bb2d..00000000000
diff --git a/entity/MSTeamsMessage_entity/MSTeamsMessage_entity.aod b/entity/MSTeamsMessage_entity/MSTeamsMessage_entity.aod
index 63a08366e65..c8c2fea856f 100644
--- a/entity/MSTeamsMessage_entity/MSTeamsMessage_entity.aod
+++ b/entity/MSTeamsMessage_entity/MSTeamsMessage_entity.aod
@@ -14,11 +14,11 @@
     </entityField>
     <entityField>
       <name>MESSAGE</name>
-      <title>Nachricht</title>
+      <title>Message</title>
     </entityField>
     <entityField>
       <name>CREATED_DATE_TIME</name>
-      <title>Erstelldatum</title>
+      <title>Creation date</title>
       <contentType>DATE</contentType>
     </entityField>
     <entityProvider>
@@ -54,7 +54,6 @@
     <entityParameter>
       <name>LoadNext_param</name>
       <expose v="true" />
-      <documentation>%aditoprj%/entity/MSTTeamsMessage_entity/entityfields/loadnext_param/documentation.adoc</documentation>
     </entityParameter>
     <entityProvider>
       <name>#PROVIDER_AGGREGATES</name>
@@ -66,7 +65,7 @@
       <name>jdito</name>
       <jDitoRecordAlias>Data_alias</jDitoRecordAlias>
       <contentProcess>%aditoprj%/entity/MSTeamsMessage_entity/recordcontainers/jdito/contentProcess.js</contentProcess>
-      <title>Nachrichten</title>
+      <title>Messages</title>
       <recordFieldMappings>
         <jDitoRecordFieldMapping>
           <name>UID.value</name>
diff --git a/entity/MSTeamsMessage_entity/entityfields/loadnext_param/documentation.adoc b/entity/MSTeamsMessage_entity/entityfields/loadnext_param/documentation.adoc
deleted file mode 100644
index c5debf74124..00000000000
--- a/entity/MSTeamsMessage_entity/entityfields/loadnext_param/documentation.adoc
+++ /dev/null
@@ -1,3 +0,0 @@
-= LoadNext_param
-
-A random UID to trigger a refresh
\ No newline at end of file
diff --git a/entity/Person_entity/entityfields/testgroup/children/addrecordaction/onActionProcess.js b/entity/Person_entity/entityfields/testgroup/children/addrecordaction/onActionProcess.js
deleted file mode 100644
index 2161e0ef8cc..00000000000
--- a/entity/Person_entity/entityfields/testgroup/children/addrecordaction/onActionProcess.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import("system.neon");
-
-var test = {
-                "AddressSearch" : "response.address"
-            };
-
-neon.addRecord("Documents", test)
\ No newline at end of file
diff --git a/entity/SingleObject_entity/SingleObject_entity.aod b/entity/SingleObject_entity/SingleObject_entity.aod
index a810e79749d..b2d528450e4 100644
--- a/entity/SingleObject_entity/SingleObject_entity.aod
+++ b/entity/SingleObject_entity/SingleObject_entity.aod
@@ -9,11 +9,9 @@
     </entityProvider>
     <entityField>
       <name>TARGET_CONTEXT</name>
-      <valueProcess>%aditoprj%/entity/SingleObject_entity/entityfields/target_context/valueProcess.js</valueProcess>
     </entityField>
     <entityField>
       <name>UID</name>
-      <valueProcess>%aditoprj%/entity/SingleObject_entity/entityfields/uid/valueProcess.js</valueProcess>
     </entityField>
     <entityParameter>
       <name>TargetContext_param</name>
diff --git a/entity/VisitPlanEmployeeWeek_entity/VisitPlanEmployeeWeek_entity.aod b/entity/VisitPlanEmployeeWeek_entity/VisitPlanEmployeeWeek_entity.aod
index 63130c5f63d..d7e664a2369 100644
--- a/entity/VisitPlanEmployeeWeek_entity/VisitPlanEmployeeWeek_entity.aod
+++ b/entity/VisitPlanEmployeeWeek_entity/VisitPlanEmployeeWeek_entity.aod
@@ -82,11 +82,6 @@
     </entityConsumer>
     <entityConsumer>
       <name>Entries</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>VisitPlanEntry_entity</entityName>
-        <fieldName>Entries</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>Entries_param</name>
@@ -94,6 +89,11 @@
           <expose v="true" />
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>VisitPlanEntry_entity</entityName>
+        <fieldName>Entries</fieldName>
+      </dependency>
     </entityConsumer>
     <entityProvider>
       <name>#PROVIDER_AGGREGATES</name>
@@ -136,10 +136,6 @@
           <name>CONTACT_ID.value</name>
           <recordfield>VISITPLANEMPLOYEEWEEK.CONTACT_ID</recordfield>
         </dbRecordFieldMapping>
-        <dbRecordFieldMapping>
-          <name>CONTACT_ID.displayValue</name>
-          <expression>%aditoprj%/entity/VisitPlanEmployeeWeek_entity/recordcontainers/db/recordfieldmappings/person_id.displayvalue/expression.js</expression>
-        </dbRecordFieldMapping>
       </recordFieldMappings>
     </dbRecordContainer>
   </recordContainers>
diff --git a/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod b/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod
index b64642c4016..38af80580f7 100644
--- a/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod
+++ b/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod
@@ -4971,18 +4971,12 @@
     <entry>
       <key>Has sales approved this step?</key>
     </entry>
-    <entry>
-      <key>"</key>
-    </entry>
     <entry>
       <key>Import Date</key>
     </entry>
     <entry>
       <key>Import Data</key>
     </entry>
-    <entry>
-      <key>;</key>
-    </entry>
     <entry>
       <key>Standard mail</key>
     </entry>
diff --git a/language/_____LANGUAGE_de/_____LANGUAGE_de.aod b/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
index b6705c747b8..c4575135d2e 100644
--- a/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
+++ b/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
@@ -7893,12 +7893,6 @@ Bitte Datumseingabe prüfen</value>
       <key>Show only own</key>
       <value>Nur Eigene anzeigen</value>
     </entry>
-    <entry>
-      <key>"</key>
-    </entry>
-    <entry>
-      <key>;</key>
-    </entry>
     <entry>
       <key>My Workflow Tasks</key>
       <value>Meine Workflow Aufgaben</value>
diff --git a/language/_____LANGUAGE_en/_____LANGUAGE_en.aod b/language/_____LANGUAGE_en/_____LANGUAGE_en.aod
index 3580ad96f19..e7cf1824f14 100644
--- a/language/_____LANGUAGE_en/_____LANGUAGE_en.aod
+++ b/language/_____LANGUAGE_en/_____LANGUAGE_en.aod
@@ -5048,18 +5048,12 @@
     <entry>
       <key>Has sales approved this step?</key>
     </entry>
-    <entry>
-      <key>"</key>
-    </entry>
     <entry>
       <key>Import Date</key>
     </entry>
     <entry>
       <key>Import Data</key>
     </entry>
-    <entry>
-      <key>;</key>
-    </entry>
     <entry>
       <key>Standard mail</key>
     </entry>
diff --git a/neonContext/MSTTeamMember/MSTTeamMember.aod b/neonContext/MSTTeamMember/MSTTeamMember.aod
index 66b94ef39e0..bfb06f7c7f5 100644
--- a/neonContext/MSTTeamMember/MSTTeamMember.aod
+++ b/neonContext/MSTTeamMember/MSTTeamMember.aod
@@ -2,13 +2,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>MSTTeamMember</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
-  <editView>MSTTeamMemberEdit_view</editView>
   <entity>MSTTeamMember_entity</entity>
   <references>
-    <neonViewReference>
-      <name>5e760ac4-fea0-4283-a0bf-d6d5f0f1c003</name>
-      <view>MSTTeamMemberEdit_view</view>
-    </neonViewReference>
     <neonViewReference>
       <name>61588d12-3c0d-4181-93ae-90d7ad50ed6b</name>
       <view>MSTTeamMemberMultiEdit_view</view>
diff --git a/neonDashboard/Home/Home.aod b/neonDashboard/Home/Home.aod
index 1c0ccc5e306..dc01fbf1ec3 100644
--- a/neonDashboard/Home/Home.aod
+++ b/neonDashboard/Home/Home.aod
@@ -8,7 +8,7 @@
   <editRoles />
   <defaultDashlets>
     <neonDashlet>
-      <name>Dashlet2</name>
+      <name>AllContactsDashlet</name>
       <viewName>PersonFilter_view</viewName>
       <configName>AllContactsDashlet</configName>
       <uiConfiguration>
@@ -20,7 +20,7 @@
       </uiConfiguration>
     </neonDashlet>
     <neonDashlet>
-      <name>Dashlet3</name>
+      <name>AditoTwitterDashlet</name>
       <viewName>TwitterTimeline_view</viewName>
       <configName>AditoTwitterDashlet</configName>
       <uiConfiguration>
@@ -32,7 +32,7 @@
       </uiConfiguration>
     </neonDashlet>
     <neonDashlet>
-      <name>Dashlet</name>
+      <name>MytasksDashlet</name>
       <viewName>TaskFilter_view</viewName>
       <configName>mytasks</configName>
       <uiConfiguration>
@@ -44,7 +44,7 @@
       </uiConfiguration>
     </neonDashlet>
     <neonDashlet>
-      <name>Dashlet4</name>
+      <name>InformationDashlet</name>
       <viewName>MyDashboardScoreCard_view</viewName>
       <configName>Information</configName>
       <uiConfiguration>
@@ -56,7 +56,7 @@
       </uiConfiguration>
     </neonDashlet>
     <neonDashlet>
-      <name>Dashlet5</name>
+      <name>NotificationDashlet</name>
       <viewName>NotificationFilter_view</viewName>
       <configName>NotificationDashletConfiguration</configName>
       <uiConfiguration>
diff --git a/neonDashboard/Vertriebsdashboard/Vertriebsdashboard.aod b/neonDashboard/Vertriebsdashboard/Vertriebsdashboard.aod
index 870d8ef2f23..b6750436bad 100644
--- a/neonDashboard/Vertriebsdashboard/Vertriebsdashboard.aod
+++ b/neonDashboard/Vertriebsdashboard/Vertriebsdashboard.aod
@@ -11,7 +11,7 @@
   </editRoles>
   <defaultDashlets>
     <neonDashlet>
-      <name>Dashlet</name>
+      <name>KeyFiguresDashlet</name>
       <viewName>SalesprojectScoreCard_view</viewName>
       <configName>KeyFigures</configName>
       <uiConfiguration>
@@ -23,7 +23,7 @@
       </uiConfiguration>
     </neonDashlet>
     <neonDashlet>
-      <name>Dashlet4</name>
+      <name>AllOrgsDashlet</name>
       <viewName>OrganisationFilter_view</viewName>
       <configName>AllOrgsDashlet</configName>
       <uiConfiguration>
@@ -35,7 +35,7 @@
       </uiConfiguration>
     </neonDashlet>
     <neonDashlet>
-      <name>Dashlet2</name>
+      <name>OpenSalesprojectsDashlet</name>
       <viewName>SalesprojectFilter_view</viewName>
       <configName>OpenSalesprojectsDashlet</configName>
       <uiConfiguration>
@@ -47,7 +47,7 @@
       </uiConfiguration>
     </neonDashlet>
     <neonDashlet>
-      <name>Dashlet3</name>
+      <name>SalesprojectPhasesDashlet</name>
       <viewName>SalesprojectAnalyses_view</viewName>
       <configName>SalesprojectPhases</configName>
       <uiConfiguration>
@@ -59,7 +59,7 @@
       </uiConfiguration>
     </neonDashlet>
     <neonDashlet>
-      <name>Dashlet6</name>
+      <name>ConvertionRatesDashlet</name>
       <viewName>SalesprojectConversionRate_view</viewName>
       <configName>ConvertionRates</configName>
       <uiConfiguration>
@@ -71,7 +71,7 @@
       </uiConfiguration>
     </neonDashlet>
     <neonDashlet>
-      <name>Dashlet7</name>
+      <name>AnalysesChartDashlet</name>
       <viewName>ActivityAnalyses_view</viewName>
       <configName>analysesChart</configName>
       <uiConfiguration>
diff --git a/neonView/AnyObjectRelationTree_view0/AnyObjectRelationTree_view0.aod b/neonView/AnyObjectRelationTree_view0/AnyObjectRelationTree_view0.aod
deleted file mode 100644
index 83a01661633..00000000000
--- a/neonView/AnyObjectRelationTree_view0/AnyObjectRelationTree_view0.aod
+++ /dev/null
@@ -1,19 +0,0 @@
-<?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>AnyObjectRelationTree_view0</name>
-  <majorModelMode>DISTRIBUTED</majorModelMode>
-  <layout>
-    <boxLayout>
-      <name>layout</name>
-    </boxLayout>
-  </layout>
-  <children>
-    <treeViewTemplate>
-      <name>AnyObjectRelations</name>
-      <parentField>AnyObjectType</parentField>
-      <titleField>AnyObjectRowid</titleField>
-      <entityField>#ENTITY</entityField>
-      <title></title>
-    </treeViewTemplate>
-  </children>
-</neonView>
diff --git a/neonView/KnowledgeLinkMultiEdit_view/KnowledgeLinkMultiEdit_view.aod b/neonView/KnowledgeLinkMultiEdit_view/KnowledgeLinkMultiEdit_view.aod
index 0b3448b225c..e695b7e4627 100644
--- a/neonView/KnowledgeLinkMultiEdit_view/KnowledgeLinkMultiEdit_view.aod
+++ b/neonView/KnowledgeLinkMultiEdit_view/KnowledgeLinkMultiEdit_view.aod
@@ -13,7 +13,7 @@
     <genericMultipleViewTemplate>
       <name>MultiEdit</name>
       <entityField>#ENTITY</entityField>
-      <title>Verknüpfungen</title>
+      <title>Links</title>
       <columns>
         <neonGenericMultipleTableColumn>
           <name>eb1bc3cb-3cf0-479c-901f-906a7ddde485</name>
diff --git a/neonView/KnowledgeManagementDetails_view/KnowledgeManagementDetails_view.aod b/neonView/KnowledgeManagementDetails_view/KnowledgeManagementDetails_view.aod
index 43c26e82585..1e1a3fa2b9e 100644
--- a/neonView/KnowledgeManagementDetails_view/KnowledgeManagementDetails_view.aod
+++ b/neonView/KnowledgeManagementDetails_view/KnowledgeManagementDetails_view.aod
@@ -22,7 +22,7 @@
       <objectType>KNOWLEDGEMANAGEMENT_OBJECTTYPE</objectType>
       <rowId>#UID</rowId>
       <entityField>#ENTITY</entityField>
-      <title>Favoriten</title>
+      <title>Favorites</title>
     </favoriteViewTemplate>
     <genericViewTemplate>
       <name>Details</name>
diff --git a/neonView/KnowledgeManagementLookup_view/KnowledgeManagementLookup_view.aod b/neonView/KnowledgeManagementLookup_view/KnowledgeManagementLookup_view.aod
index 8b9981d87da..163964460fb 100644
--- a/neonView/KnowledgeManagementLookup_view/KnowledgeManagementLookup_view.aod
+++ b/neonView/KnowledgeManagementLookup_view/KnowledgeManagementLookup_view.aod
@@ -16,10 +16,6 @@
           <name>5a7ab4ba-48a5-47bf-95e9-5631938af5b2</name>
           <entityField>#IMAGE</entityField>
         </neonTableColumn>
-        <neonTableColumn>
-          <name>b715bc0e-a6b7-478d-9aaf-9bc212812650</name>
-          <entityField>ViewKnowledgeNumber</entityField>
-        </neonTableColumn>
         <neonTableColumn>
           <name>4176e200-836f-475c-bc35-ae9c27bf1ed9</name>
           <entityField>TITLE</entityField>
diff --git a/neonView/MSTTeamMemberEdit_view/MSTTeamMemberEdit_view.aod b/neonView/MSTTeamMemberEdit_view/MSTTeamMemberEdit_view.aod
deleted file mode 100644
index b225944fe7c..00000000000
--- a/neonView/MSTTeamMemberEdit_view/MSTTeamMemberEdit_view.aod
+++ /dev/null
@@ -1,36 +0,0 @@
-<?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>MSTTeamMemberEdit_view</name>
-  <majorModelMode>DISTRIBUTED</majorModelMode>
-  <size>SMALL</size>
-  <layout>
-    <noneLayout>
-      <name>layout</name>
-    </noneLayout>
-  </layout>
-  <children>
-    <genericViewTemplate>
-      <name>Generic</name>
-      <editMode v="true" />
-      <entityField>#ENTITY</entityField>
-      <fields>
-        <entityFieldLink>
-          <name>0c013cb6-6a74-47c1-9e5c-8e23f1ce917a</name>
-          <entityField>UPNSOFMEMBERS</entityField>
-        </entityFieldLink>
-        <entityFieldLink>
-          <name>54cf4c2d-6c18-4c0f-ae52-32c1f7337cd7</name>
-          <entityField>ARETHESEOWNERS</entityField>
-        </entityFieldLink>
-        <entityFieldLink>
-          <name>75b97952-da9a-4a5c-9bbf-6cec3774541b</name>
-          <entityField>MAILSOFEXTERN</entityField>
-        </entityFieldLink>
-        <entityFieldLink>
-          <name>ab1ed6fe-5a68-4728-9d90-698636c93ce8</name>
-          <entityField>EXTERN</entityField>
-        </entityFieldLink>
-      </fields>
-    </genericViewTemplate>
-  </children>
-</neonView>
diff --git a/neonView/MSTeamsDocumentEdit_view/MSTeamsDocumentEdit_view.aod b/neonView/MSTeamsDocumentEdit_view/MSTeamsDocumentEdit_view.aod
index 058045a091b..c13a80654c3 100644
--- a/neonView/MSTeamsDocumentEdit_view/MSTeamsDocumentEdit_view.aod
+++ b/neonView/MSTeamsDocumentEdit_view/MSTeamsDocumentEdit_view.aod
@@ -14,7 +14,7 @@
       <name>Documents</name>
       <editMode v="true" />
       <entityField>#ENTITY</entityField>
-      <title>Dokumente</title>
+      <title>Documents</title>
       <fields>
         <entityFieldLink>
           <name>6b122227-6e23-4f25-b66c-05f90e991005</name>
-- 
GitLab


From 24ea865faadeb21893f384ff462f0a5ff6a70b3e Mon Sep 17 00:00:00 2001
From: "j.goderbauer" <j.goderbauer@adito.de>
Date: Fri, 27 Nov 2020 10:25:41 +0100
Subject: [PATCH 111/184] [Projekt: Entwicklung - xRM][TicketNr.:
 1067194][Default-Permissions greifen nicht]

---
 .../_____PREFERENCES_PROJECT/_____PREFERENCES_PROJECT.aod       | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/preferences/_____PREFERENCES_PROJECT/_____PREFERENCES_PROJECT.aod b/preferences/_____PREFERENCES_PROJECT/_____PREFERENCES_PROJECT.aod
index fe80b890a95..602795eafd8 100644
--- a/preferences/_____PREFERENCES_PROJECT/_____PREFERENCES_PROJECT.aod
+++ b/preferences/_____PREFERENCES_PROJECT/_____PREFERENCES_PROJECT.aod
@@ -30,7 +30,7 @@
   <recordContainerCachingAlias>RecordContainerCache</recordContainerCachingAlias>
   <clientSearchOptimizedForSpeed v="true" />
   <clientSearchExcludeForIgnorecase v="true" />
-  <neonClientPermissionsEnabled v="false" />
+  <neonClientPermissionsEnabled v="true" />
   <clientFeedbackMailaddress />
   <blobHandlingMethod>DATABASE</blobHandlingMethod>
   <databaseAuditGetOldValueLobs v="false" />
-- 
GitLab


From e127c4ef007b8ac4cf9f97f7fe7ebc46b927004a Mon Sep 17 00:00:00 2001
From: "j.goderbauer" <j.goderbauer@adito.de>
Date: Fri, 27 Nov 2020 10:35:10 +0100
Subject: [PATCH 112/184] =?UTF-8?q?[Projekt:=20Entwicklung=20-=20xRM][Tick?=
 =?UTF-8?q?etNr.:=201068553][Serienbrief=20-=20=20Meldung=20-=20Leerzeiche?=
 =?UTF-8?q?n=20fehlt=20-->=20macht=20unsauberen=20Eindruck=20bei=20Pr?=
 =?UTF-8?q?=C3=A4sentationen]?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 language/_____LANGUAGE_de/_____LANGUAGE_de.aod | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/language/_____LANGUAGE_de/_____LANGUAGE_de.aod b/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
index c4575135d2e..9f80d362ab3 100644
--- a/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
+++ b/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
@@ -6826,7 +6826,7 @@
     </entry>
     <entry>
       <key>Only .odt files are supported for bulkletters.</key>
-      <value>Für Serienbriefe werden nur.odt Dateien unterstützt</value>
+      <value>Für Serienbriefe werden nur .odt Dateien unterstützt</value>
     </entry>
     <entry>
       <key>Show tickets where I am the editor</key>
-- 
GitLab


From a05d177502f871c35f4f965400349168c552d7fb Mon Sep 17 00:00:00 2001
From: "j.goderbauer" <j.goderbauer@adito.de>
Date: Fri, 27 Nov 2020 10:51:48 +0100
Subject: [PATCH 113/184] =?UTF-8?q?[Projekt:=20Entwicklung=20-=20xRM][Tick?=
 =?UTF-8?q?etNr.:=201067073][Firma=20-=20Sortierung=20-=20keine=20=C3=84nd?=
 =?UTF-8?q?erung=20in=20der=20Anzeige,=20egal=20ob=20man=20auf-=20oder=20a?=
 =?UTF-8?q?bsteigend=20sortiert]?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../Organisation_entity.aod                   | 437 +++++++++---------
 1 file changed, 218 insertions(+), 219 deletions(-)

diff --git a/entity/Organisation_entity/Organisation_entity.aod b/entity/Organisation_entity/Organisation_entity.aod
index 954f5023e7d..6d472e1ac8a 100644
--- a/entity/Organisation_entity/Organisation_entity.aod
+++ b/entity/Organisation_entity/Organisation_entity.aod
@@ -71,11 +71,6 @@
     </entityField>
     <entityConsumer>
       <name>Activities</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Activity_entity</entityName>
-        <fieldName>LinkedObjects</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>RowId_param</name>
@@ -86,21 +81,26 @@
           <valueProcess>%aditoprj%/entity/Organisation_entity/entityfields/activities/children/objectid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Activity_entity</entityName>
+        <fieldName>LinkedObjects</fieldName>
+      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>Contact</name>
       <selectionMode>MULTI</selectionMode>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Person_entity</entityName>
-        <fieldName>OrganisationRelated</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>OrgId_param</name>
           <valueProcess>%aditoprj%/entity/Organisation_entity/entityfields/contact/children/orgid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Person_entity</entityName>
+        <fieldName>OrganisationRelated</fieldName>
+      </dependency>
     </entityConsumer>
     <entityFieldGroup>
       <name>CUSTOMERCODE_DISPLAY_fieldGroup</name>
@@ -114,6 +114,36 @@
       <name>Organisations</name>
       <documentation>%aditoprj%/entity/Organisation_entity/entityfields/organisations/documentation.adoc</documentation>
       <recordContainer>db</recordContainer>
+      <children>
+        <entityParameter>
+          <name>WithPrivate_param</name>
+          <expose v="true" />
+        </entityParameter>
+        <entityParameter>
+          <name>ExcludeOrganisationsByPersonId</name>
+          <expose v="false" />
+        </entityParameter>
+        <entityParameter>
+          <name>ExcludedContactIds_param</name>
+          <expose v="true" />
+        </entityParameter>
+        <entityParameter>
+          <name>AttributeKeyId_param</name>
+          <expose v="false" />
+        </entityParameter>
+        <entityParameter>
+          <name>AttributeId_param</name>
+          <expose v="false" />
+        </entityParameter>
+        <entityParameter>
+          <name>DuplicateActionsControl_param</name>
+          <expose v="false" />
+        </entityParameter>
+        <entityParameter>
+          <name>DuplicateCurrentContactId_param</name>
+          <expose v="false" />
+        </entityParameter>
+      </children>
       <dependencies>
         <entityDependency>
           <name>85aa363e-d8ba-4df5-8422-bf7aff86a4f8</name>
@@ -152,44 +182,9 @@
           <isConsumer v="false" />
         </entityDependency>
       </dependencies>
-      <children>
-        <entityParameter>
-          <name>WithPrivate_param</name>
-          <expose v="true" />
-        </entityParameter>
-        <entityParameter>
-          <name>ExcludeOrganisationsByPersonId</name>
-          <expose v="false" />
-        </entityParameter>
-        <entityParameter>
-          <name>ExcludedContactIds_param</name>
-          <expose v="true" />
-        </entityParameter>
-        <entityParameter>
-          <name>AttributeKeyId_param</name>
-          <expose v="false" />
-        </entityParameter>
-        <entityParameter>
-          <name>AttributeId_param</name>
-          <expose v="false" />
-        </entityParameter>
-        <entityParameter>
-          <name>DuplicateActionsControl_param</name>
-          <expose v="false" />
-        </entityParameter>
-        <entityParameter>
-          <name>DuplicateCurrentContactId_param</name>
-          <expose v="false" />
-        </entityParameter>
-      </children>
     </entityProvider>
     <entityConsumer>
       <name>Addresses</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Address_entity</entityName>
-        <fieldName>OrganisationAddresses</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>DefaultAddressId_param</name>
@@ -201,6 +196,11 @@
           <expose v="false" />
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Address_entity</entityName>
+        <fieldName>OrganisationAddresses</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>ADDRESS_ID</name>
@@ -211,11 +211,6 @@
     </entityField>
     <entityConsumer>
       <name>Communications</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Communication_entity</entityName>
-        <fieldName>AllCommunications</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContactId_param</name>
@@ -227,15 +222,15 @@
           <valueProcess>%aditoprj%/entity/Organisation_entity/entityfields/communications/children/contactsmaincountry_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Communication_entity</entityName>
+        <fieldName>AllCommunications</fieldName>
+      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>Contracts</name>
       <selectionMode>MULTI</selectionMode>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Contract_entity</entityName>
-        <fieldName>Contracts</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContactId_param</name>
@@ -244,14 +239,14 @@
           <mandatory v="true" />
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>Productprices</name>
       <dependency>
         <name>dependency</name>
-        <entityName>Productprice_entity</entityName>
-        <fieldName>Productprices</fieldName>
+        <entityName>Contract_entity</entityName>
+        <fieldName>Contracts</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>Productprices</name>
       <children>
         <entityParameter>
           <name>ContactId_param</name>
@@ -260,10 +255,14 @@
           <mandatory v="true" />
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Productprice_entity</entityName>
+        <fieldName>Productprices</fieldName>
+      </dependency>
     </entityConsumer>
     <entityProvider>
       <name>#PROVIDER</name>
-      <sortingField>NAME</sortingField>
       <dependencies>
         <entityDependency>
           <name>1a472ca0-4d27-453c-8de5-a046b86f22fb</name>
@@ -300,11 +299,6 @@
     <entityConsumer>
       <name>Documents</name>
       <selectionMode>MULTI</selectionMode>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Document_entity</entityName>
-        <fieldName>Documents</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>AssignmentRowId_param</name>
@@ -315,6 +309,11 @@
           <valueProcess>%aditoprj%/entity/Organisation_entity/entityfields/documents/children/assignmenttable_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Document_entity</entityName>
+        <fieldName>Documents</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>STANDARD_EMAIL_COMMUNICATION</name>
@@ -330,11 +329,6 @@
     </entityField>
     <entityConsumer>
       <name>PhoneCommunications</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Communication_entity</entityName>
-        <fieldName>PhoneCommunications</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContactId_param</name>
@@ -342,14 +336,14 @@
           <expose v="false" />
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>EmailCommunications</name>
       <dependency>
         <name>dependency</name>
         <entityName>Communication_entity</entityName>
-        <fieldName>EmailCommunications</fieldName>
+        <fieldName>PhoneCommunications</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>EmailCommunications</name>
       <children>
         <entityParameter>
           <name>ContactId_param</name>
@@ -357,6 +351,11 @@
           <expose v="false" />
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Communication_entity</entityName>
+        <fieldName>EmailCommunications</fieldName>
+      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>Countries</name>
@@ -369,11 +368,6 @@
     <entityConsumer>
       <name>Attributes</name>
       <onValidation>%aditoprj%/entity/Organisation_entity/entityfields/attributes/onValidation.js</onValidation>
-      <dependency>
-        <name>dependency</name>
-        <entityName>AttributeRelation_entity</entityName>
-        <fieldName>AttributeRelations</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ObjectRowId_param</name>
@@ -385,14 +379,14 @@
           <valueProcess>%aditoprj%/entity/Organisation_entity/entityfields/attributes/children/objecttype_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>KeywordContactStates</name>
       <dependency>
         <name>dependency</name>
-        <entityName>KeywordEntry_entity</entityName>
-        <fieldName>SpecificContainerKeywords</fieldName>
+        <entityName>AttributeRelation_entity</entityName>
+        <fieldName>AttributeRelations</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>KeywordContactStates</name>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
@@ -400,14 +394,14 @@
           <expose v="false" />
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>KeywordOrganisationTypes</name>
       <dependency>
         <name>dependency</name>
         <entityName>KeywordEntry_entity</entityName>
         <fieldName>SpecificContainerKeywords</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>KeywordOrganisationTypes</name>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
@@ -415,6 +409,11 @@
           <expose v="false" />
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>SpecificContainerKeywords</fieldName>
+      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>Languages</name>
@@ -426,11 +425,6 @@
     </entityConsumer>
     <entityConsumer>
       <name>KeywordPricePolitics</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>KeywordEntry_entity</entityName>
-        <fieldName>SpecificContainerKeywords</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
@@ -438,14 +432,14 @@
           <expose v="false" />
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>KeywordWeaknesses</name>
       <dependency>
         <name>dependency</name>
         <entityName>KeywordEntry_entity</entityName>
         <fieldName>SpecificContainerKeywords</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>KeywordWeaknesses</name>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
@@ -453,14 +447,14 @@
           <expose v="false" />
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>KeywordStrenghts</name>
       <dependency>
         <name>dependency</name>
         <entityName>KeywordEntry_entity</entityName>
         <fieldName>SpecificContainerKeywords</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>KeywordStrenghts</name>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
@@ -468,14 +462,14 @@
           <expose v="false" />
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>Salesprojects</name>
       <dependency>
         <name>dependency</name>
-        <entityName>Salesproject_entity</entityName>
-        <fieldName>Salesprojects</fieldName>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>SpecificContainerKeywords</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>Salesprojects</name>
       <children>
         <entityParameter>
           <name>ContactId_param</name>
@@ -484,14 +478,14 @@
           <mandatory v="true" />
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>Offers</name>
       <dependency>
         <name>dependency</name>
-        <entityName>Offer_entity</entityName>
-        <fieldName>ContactOffers</fieldName>
+        <entityName>Salesproject_entity</entityName>
+        <fieldName>Salesprojects</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>Offers</name>
       <children>
         <entityParameter>
           <name>ContactId_param</name>
@@ -500,14 +494,14 @@
           <mandatory v="true" />
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>Tasks</name>
       <dependency>
         <name>dependency</name>
-        <entityName>Task_entity</entityName>
-        <fieldName>Tasks</fieldName>
+        <entityName>Offer_entity</entityName>
+        <fieldName>ContactOffers</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>Tasks</name>
       <children>
         <entityParameter>
           <name>RowId_param</name>
@@ -518,6 +512,11 @@
           <valueProcess>%aditoprj%/entity/Organisation_entity/entityfields/tasks/children/objectid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Task_entity</entityName>
+        <fieldName>Tasks</fieldName>
+      </dependency>
     </entityConsumer>
     <entityParameter>
       <name>WithPrivate_param</name>
@@ -528,11 +527,6 @@
     </entityParameter>
     <entityConsumer>
       <name>ObjectTrees</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>ObjectTree_entity</entityName>
-        <fieldName>TreeProvider</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ObjectIds_param</name>
@@ -543,14 +537,14 @@
           <valueProcess>%aditoprj%/entity/Organisation_entity/entityfields/objecttrees/children/objecttypes_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>LogHistories</name>
       <dependency>
         <name>dependency</name>
-        <entityName>LogHistory_entity</entityName>
-        <fieldName>LogHistoryProvider</fieldName>
+        <entityName>ObjectTree_entity</entityName>
+        <fieldName>TreeProvider</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>LogHistories</name>
       <children>
         <entityParameter>
           <name>tablenames_param</name>
@@ -559,14 +553,14 @@
           <mandatory v="true" />
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>360DegreeObjects</name>
       <dependency>
         <name>dependency</name>
-        <entityName>360Degree_entity</entityName>
-        <fieldName>OrganisationObjects</fieldName>
+        <entityName>LogHistory_entity</entityName>
+        <fieldName>LogHistoryProvider</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>360DegreeObjects</name>
       <children>
         <entityParameter>
           <name>ObjectRowId_param</name>
@@ -577,6 +571,11 @@
           <valueProcess>%aditoprj%/entity/Organisation_entity/entityfields/360degreeobjects/children/objectstatus_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>360Degree_entity</entityName>
+        <fieldName>OrganisationObjects</fieldName>
+      </dependency>
     </entityConsumer>
     <entityParameter>
       <name>ExcludeOrganisationsByPersonId</name>
@@ -587,26 +586,6 @@
     <entityProvider>
       <name>WithPersonIdFilter</name>
       <documentation>%aditoprj%/entity/Organisation_entity/entityfields/withpersonidfilter/documentation.adoc</documentation>
-      <dependencies>
-        <entityDependency>
-          <name>5a456b04-f0ca-4a45-9c1f-bdfdf074434a</name>
-          <entityName>Contact_entity</entityName>
-          <fieldName>Organisations</fieldName>
-          <isConsumer v="false" />
-        </entityDependency>
-        <entityDependency>
-          <name>a80c3db0-29db-433c-8f7c-4ebf6639ad6d</name>
-          <entityName>Person_entity</entityName>
-          <fieldName>Organisations</fieldName>
-          <isConsumer v="false" />
-        </entityDependency>
-        <entityDependency>
-          <name>748a3083-89c2-41b4-a233-3fd5364396e9</name>
-          <entityName>Competition_entity</entityName>
-          <fieldName>Organisation</fieldName>
-          <isConsumer v="false" />
-        </entityDependency>
-      </dependencies>
       <children>
         <entityParameter>
           <name>ExcludeOrganisationsByPersonId</name>
@@ -639,6 +618,26 @@
           <expose v="false" />
         </entityParameter>
       </children>
+      <dependencies>
+        <entityDependency>
+          <name>5a456b04-f0ca-4a45-9c1f-bdfdf074434a</name>
+          <entityName>Contact_entity</entityName>
+          <fieldName>Organisations</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+        <entityDependency>
+          <name>a80c3db0-29db-433c-8f7c-4ebf6639ad6d</name>
+          <entityName>Person_entity</entityName>
+          <fieldName>Organisations</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+        <entityDependency>
+          <name>748a3083-89c2-41b4-a233-3fd5364396e9</name>
+          <entityName>Competition_entity</entityName>
+          <fieldName>Organisation</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+      </dependencies>
     </entityProvider>
     <entityParameter>
       <name>AttributeId_param</name>
@@ -653,20 +652,6 @@
     <entityProvider>
       <name>WithAttribute</name>
       <documentation>%aditoprj%/entity/Organisation_entity/entityfields/withattribute/documentation.adoc</documentation>
-      <dependencies>
-        <entityDependency>
-          <name>10480df2-f0b6-4cb6-8bfb-4a468b994996</name>
-          <entityName>Competition_entity</entityName>
-          <fieldName>Organisations</fieldName>
-          <isConsumer v="false" />
-        </entityDependency>
-        <entityDependency>
-          <name>f368be61-1a15-449f-b37c-b1343069412c</name>
-          <entityName>Product_entity</entityName>
-          <fieldName>Organisations</fieldName>
-          <isConsumer v="false" />
-        </entityDependency>
-      </dependencies>
       <children>
         <entityParameter>
           <name>AttributeId_param</name>
@@ -698,6 +683,20 @@
           <expose v="false" />
         </entityParameter>
       </children>
+      <dependencies>
+        <entityDependency>
+          <name>10480df2-f0b6-4cb6-8bfb-4a468b994996</name>
+          <entityName>Competition_entity</entityName>
+          <fieldName>Organisations</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+        <entityDependency>
+          <name>f368be61-1a15-449f-b37c-b1343069412c</name>
+          <entityName>Product_entity</entityName>
+          <fieldName>Organisations</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+      </dependencies>
     </entityProvider>
     <entityParameter>
       <name>ExcludedContactIds_param</name>
@@ -706,11 +705,6 @@
     </entityParameter>
     <entityConsumer>
       <name>AttributeTree</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>AttributeRelation_entity</entityName>
-        <fieldName>TreeProvider</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ObjectRowId_param</name>
@@ -721,6 +715,11 @@
           <valueProcess>%aditoprj%/entity/Organisation_entity/entityfields/attributetree/children/objecttype_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>AttributeRelation_entity</entityName>
+        <fieldName>TreeProvider</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>DATE_NEW</name>
@@ -772,11 +771,6 @@
     <entityConsumer>
       <name>AttributeConditions</name>
       <onValidation>%aditoprj%/entity/Organisation_entity/entityfields/attributeconditions/onValidation.js</onValidation>
-      <dependency>
-        <name>dependency</name>
-        <entityName>AttributeRelation_entity</entityName>
-        <fieldName>AttributeRelations</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ObjectRowId_param</name>
@@ -799,14 +793,14 @@
           <valueProcess>%aditoprj%/entity/Organisation_entity/entityfields/attributeconditions/children/showempty_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>LinkedAppointments</name>
       <dependency>
         <name>dependency</name>
-        <entityName>Appointment_entity</entityName>
-        <fieldName>LinkedAppointments</fieldName>
+        <entityName>AttributeRelation_entity</entityName>
+        <fieldName>AttributeRelations</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>LinkedAppointments</name>
       <children>
         <entityParameter>
           <name>LinkedObjectId_param</name>
@@ -817,6 +811,11 @@
           <valueProcess>%aditoprj%/entity/Organisation_entity/entityfields/linkedappointments/children/erroronpermissiondenied/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Appointment_entity</entityName>
+        <fieldName>LinkedAppointments</fieldName>
+      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>Products</name>
@@ -1094,11 +1093,6 @@
     </entityParameter>
     <entityConsumer>
       <name>SelfDuplicatesUncached</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Organisation_entity</entityName>
-        <fieldName>SelfDuplicates</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>DuplicateActionsControl_param</name>
@@ -1118,20 +1112,25 @@
           <valueProcess>%aditoprj%/entity/Organisation_entity/entityfields/selfduplicatesuncached/children/excludedcontactids_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>CommRestrictions</name>
       <dependency>
         <name>dependency</name>
-        <entityName>CommRestriction_Entity</entityName>
-        <fieldName>CommRestrictions</fieldName>
+        <entityName>Organisation_entity</entityName>
+        <fieldName>SelfDuplicates</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>CommRestrictions</name>
       <children>
         <entityParameter>
           <name>ContactId_param</name>
           <valueProcess>%aditoprj%/entity/Organisation_entity/entityfields/commrestrictions/children/contactid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>CommRestriction_Entity</entityName>
+        <fieldName>CommRestrictions</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>COMMRESTRICTIONS_ACTIVE</name>
@@ -1186,11 +1185,6 @@
     <entityConsumer>
       <name>Classifications</name>
       <refreshParent v="true" />
-      <dependency>
-        <name>dependency</name>
-        <entityName>Classification_entity</entityName>
-        <fieldName>Classifications</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ClassificationType_param</name>
@@ -1208,6 +1202,11 @@
           <expose v="true" />
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Classification_entity</entityName>
+        <fieldName>Classifications</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>COUNT</name>
@@ -1228,14 +1227,6 @@
       <name>OrganisationsViaIndex</name>
       <documentation>%aditoprj%/entity/Organisation_entity/entityfields/organisationsviaindex/documentation.adoc</documentation>
       <recordContainer>index</recordContainer>
-      <dependencies>
-        <entityDependency>
-          <name>e60b8983-166d-4280-a1a5-f990ad77eeb9</name>
-          <entityName>AroundLocation_entity</entityName>
-          <fieldName>Organisations</fieldName>
-          <isConsumer v="false" />
-        </entityDependency>
-      </dependencies>
       <children>
         <entityParameter>
           <name>ExcludeOrganisationsByPersonId</name>
@@ -1278,6 +1269,14 @@
           <expose v="true" />
         </entityParameter>
       </children>
+      <dependencies>
+        <entityDependency>
+          <name>e60b8983-166d-4280-a1a5-f990ad77eeb9</name>
+          <entityName>AroundLocation_entity</entityName>
+          <fieldName>Organisations</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+      </dependencies>
     </entityProvider>
     <entityActionField>
       <name>openAroundLocation</name>
@@ -1348,17 +1347,17 @@
     </entityProvider>
     <entityConsumer>
       <name>DistrictResponsibles</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>DistrictResponsible_entity</entityName>
-        <fieldName>OrganisationResponsibles</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>OrgUid_param</name>
           <valueProcess>%aditoprj%/entity/Organisation_entity/entityfields/districtresponsibles/children/orguid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>DistrictResponsible_entity</entityName>
+        <fieldName>OrganisationResponsibles</fieldName>
+      </dependency>
     </entityConsumer>
     <entityParameter>
       <name>FilterPreSet_param</name>
@@ -1367,14 +1366,6 @@
     <entityProvider>
       <name>NonselfDuplicates</name>
       <documentation>%aditoprj%/entity/Organisation_entity/entityfields/nonselfduplicates/documentation.adoc</documentation>
-      <dependencies>
-        <entityDependency>
-          <name>2e410b9e-5ebc-48ea-9562-da386202d7e8</name>
-          <entityName>Duplicates_entity</entityName>
-          <fieldName>DuplicateOrganisationsConsumer</fieldName>
-          <isConsumer v="false" />
-        </entityDependency>
-      </dependencies>
       <children>
         <entityParameter>
           <name>AttributeKeyId_param</name>
@@ -1397,6 +1388,14 @@
           <expose v="false" />
         </entityParameter>
       </children>
+      <dependencies>
+        <entityDependency>
+          <name>2e410b9e-5ebc-48ea-9562-da386202d7e8</name>
+          <entityName>Duplicates_entity</entityName>
+          <fieldName>DuplicateOrganisationsConsumer</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+      </dependencies>
     </entityProvider>
     <entityActionGroup>
       <name>orgReportDispatch</name>
@@ -1413,11 +1412,6 @@
     </entityActionGroup>
     <entityConsumer>
       <name>AttributesFilter</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>AttributeRelation_entity</entityName>
-        <fieldName>FilterProvider</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ObjectRowId_param</name>
@@ -1428,6 +1422,11 @@
           <valueProcess>%aditoprj%/entity/Organisation_entity/entityfields/attributesfilter/children/objecttype_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>AttributeRelation_entity</entityName>
+        <fieldName>FilterProvider</fieldName>
+      </dependency>
     </entityConsumer>
   </entityFields>
   <recordContainers>
-- 
GitLab


From 6e7eb77ec4a52ea5dee1be9d96f3238a372af049 Mon Sep 17 00:00:00 2001
From: "j.goderbauer" <j.goderbauer@adito.de>
Date: Fri, 27 Nov 2020 11:03:35 +0100
Subject: [PATCH 114/184] =?UTF-8?q?[Projekt:=20Entwicklung=20-=20xRM][Tick?=
 =?UTF-8?q?etNr.:=201052123][Aufgabe=20-=20Umbenennung=20von=20"Gesch?=
 =?UTF-8?q?=C3=BCtzt"=20in=20"Privat]?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 entity/Task_entity/Task_entity.aod            | 126 +++++++++---------
 .../protectionlevel/titleProcess.js           |   8 ++
 .../_____LANGUAGE_de/_____LANGUAGE_de.aod     |   4 +
 3 files changed, 75 insertions(+), 63 deletions(-)
 create mode 100644 entity/Task_entity/entityfields/protectionlevel/titleProcess.js

diff --git a/entity/Task_entity/Task_entity.aod b/entity/Task_entity/Task_entity.aod
index 0ed30f9267a..f7b03fedd7f 100644
--- a/entity/Task_entity/Task_entity.aod
+++ b/entity/Task_entity/Task_entity.aod
@@ -96,10 +96,10 @@
     </entityField>
     <entityField>
       <name>PROTECTIONLEVEL</name>
-      <title>Protected</title>
       <contentType>BOOLEAN</contentType>
       <contentTypeProcess>%aditoprj%/entity/Task_entity/entityfields/protectionlevel/contentTypeProcess.js</contentTypeProcess>
       <dropDownProcess>%aditoprj%/entity/Task_entity/entityfields/protectionlevel/dropDownProcess.js</dropDownProcess>
+      <titleProcess>%aditoprj%/entity/Task_entity/entityfields/protectionlevel/titleProcess.js</titleProcess>
       <valueProcess>%aditoprj%/entity/Task_entity/entityfields/protectionlevel/valueProcess.js</valueProcess>
     </entityField>
     <entityField>
@@ -127,11 +127,6 @@
     <entityConsumer>
       <name>MainDocuments</name>
       <stateProcess>%aditoprj%/entity/Task_entity/entityfields/maindocuments/stateProcess.js</stateProcess>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Document_entity</entityName>
-        <fieldName>#PROVIDER</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>AssignmentRowId_param</name>
@@ -142,14 +137,14 @@
           <valueProcess>%aditoprj%/entity/Task_entity/entityfields/maindocuments/children/assignmenttable_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>KeywordStates</name>
       <dependency>
         <name>dependency</name>
-        <entityName>KeywordEntry_entity</entityName>
-        <fieldName>SpecificContainerKeywords</fieldName>
+        <entityName>Document_entity</entityName>
+        <fieldName>#PROVIDER</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>KeywordStates</name>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
@@ -161,14 +156,14 @@
           <valueProcess>%aditoprj%/entity/Task_entity/entityfields/keywordstates/children/whitelistids_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>ModuleTrees</name>
       <dependency>
         <name>dependency</name>
-        <entityName>ModuleTree_entity</entityName>
-        <fieldName>TreeProviders</fieldName>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>SpecificContainerKeywords</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>ModuleTrees</name>
       <children>
         <entityParameter>
           <name>ID_param</name>
@@ -183,6 +178,11 @@
           <mandatory v="false" />
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>ModuleTree_entity</entityName>
+        <fieldName>TreeProviders</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>PARENT_CONTEXT</name>
@@ -229,11 +229,6 @@
     </entityParameter>
     <entityConsumer>
       <name>KeywordPriorities</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>KeywordEntry_entity</entityName>
-        <fieldName>SpecificContainerKeywords</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
@@ -241,6 +236,11 @@
           <expose v="false" />
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>SpecificContainerKeywords</fieldName>
+      </dependency>
     </entityConsumer>
     <entityActionField>
       <name>newOffer</name>
@@ -259,36 +259,58 @@
     </entityField>
     <entityConsumer>
       <name>KeywordProgress</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>KeywordEntry_entity</entityName>
-        <fieldName>SpecificContainerKeywords</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
           <valueProcess>%aditoprj%/entity/Task_entity/entityfields/keywordprogress/children/containername_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>SpecificContainerKeywords</fieldName>
+      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>Links</name>
       <state>EDITABLE</state>
-      <dependency>
-        <name>dependency</name>
-        <entityName>TaskLink_entity</entityName>
-        <fieldName>Link</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>TaskId_param</name>
           <valueProcess>%aditoprj%/entity/Task_entity/entityfields/links/children/taskid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>TaskLink_entity</entityName>
+        <fieldName>Link</fieldName>
+      </dependency>
     </entityConsumer>
     <entityProvider>
       <name>Tasks</name>
       <documentation>%aditoprj%/entity/Task_entity/entityfields/tasks/documentation.adoc</documentation>
+      <children>
+        <entityParameter>
+          <name>RowId_param</name>
+          <expose v="true" />
+        </entityParameter>
+        <entityParameter>
+          <name>PresetLinks_param</name>
+          <expose v="true" />
+        </entityParameter>
+        <entityParameter>
+          <name>ParentId_param</name>
+          <expose v="false" />
+        </entityParameter>
+        <entityParameter>
+          <name>ParentContext_param</name>
+          <expose v="false" />
+        </entityParameter>
+        <entityParameter>
+          <name>ObjectId_param</name>
+          <expose v="true" />
+        </entityParameter>
+      </children>
       <dependencies>
         <entityDependency>
           <name>dd79df43-264c-494b-9c92-cadf19e61db6</name>
@@ -357,28 +379,6 @@
           <isConsumer v="false" />
         </entityDependency>
       </dependencies>
-      <children>
-        <entityParameter>
-          <name>RowId_param</name>
-          <expose v="true" />
-        </entityParameter>
-        <entityParameter>
-          <name>PresetLinks_param</name>
-          <expose v="true" />
-        </entityParameter>
-        <entityParameter>
-          <name>ParentId_param</name>
-          <expose v="false" />
-        </entityParameter>
-        <entityParameter>
-          <name>ParentContext_param</name>
-          <expose v="false" />
-        </entityParameter>
-        <entityParameter>
-          <name>ObjectId_param</name>
-          <expose v="true" />
-        </entityParameter>
-      </children>
     </entityProvider>
     <entityParameter>
       <name>PresetLinks_param</name>
@@ -407,26 +407,21 @@
     </entityField>
     <entityConsumer>
       <name>LogHistories</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>LogHistory_entity</entityName>
-        <fieldName>LogHistoryProvider</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>tablenames_param</name>
           <valueProcess>%aditoprj%/entity/Task_entity/entityfields/loghistories/children/tablenames_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>LogHistory_entity</entityName>
+        <fieldName>LogHistoryProvider</fieldName>
+      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>Documents</name>
       <selectionMode>MULTI</selectionMode>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Document_entity</entityName>
-        <fieldName>Documents</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>AssignmentRowId_param</name>
@@ -437,6 +432,11 @@
           <valueProcess>%aditoprj%/entity/Task_entity/entityfields/documents/children/assignmenttable_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Document_entity</entityName>
+        <fieldName>Documents</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>TYPE</name>
diff --git a/entity/Task_entity/entityfields/protectionlevel/titleProcess.js b/entity/Task_entity/entityfields/protectionlevel/titleProcess.js
new file mode 100644
index 00000000000..c2997149287
--- /dev/null
+++ b/entity/Task_entity/entityfields/protectionlevel/titleProcess.js
@@ -0,0 +1,8 @@
+import("system.result");
+import("system.translate");
+
+//We already changed this title serveral times
+//This will be the last time and it's called "Private". Period.
+//The reason why this is in a titleProcess and not in the title property is just to write this comment you're reading.
+//Note: Whithin a porject feel free to change the title
+result.string(translate.text("Private"));
\ No newline at end of file
diff --git a/language/_____LANGUAGE_de/_____LANGUAGE_de.aod b/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
index 9f80d362ab3..566c1d1c162 100644
--- a/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
+++ b/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
@@ -26,6 +26,10 @@
       <key>Choose Team</key>
       <value>Team auswählen</value>
     </entry>
+    <entry>
+      <key>Private</key>
+      <value>Privat</value>
+    </entry>
     <entry>
       <key>Add app</key>
       <value>App hinzufügen</value>
-- 
GitLab


From 301b34e90f6aebaf2a0feafa32aa32fe14766eb3 Mon Sep 17 00:00:00 2001
From: Sebastian Listl <s.listl@adito.de>
Date: Thu, 26 Nov 2020 16:45:43 +0100
Subject: [PATCH 115/184] #1065277 Newsletter workflow

---
 .../children/synchronizedocuments/onActionProcess.js  |  2 --
 .../children/synchronizedocuments/stateProcess.js     |  7 ++++---
 process/CreateNotification_workflowService/process.js |  1 -
 process/SendEmail_workflowService/process.js          |  6 ++----
 process/Workflow_lib/process.js                       | 11 +++++++++++
 5 files changed, 17 insertions(+), 10 deletions(-)

diff --git a/entity/Document_entity/entityfields/msteam/children/synchronizedocuments/onActionProcess.js b/entity/Document_entity/entityfields/msteam/children/synchronizedocuments/onActionProcess.js
index 97975318752..2d871492297 100644
--- a/entity/Document_entity/entityfields/msteam/children/synchronizedocuments/onActionProcess.js
+++ b/entity/Document_entity/entityfields/msteam/children/synchronizedocuments/onActionProcess.js
@@ -7,5 +7,3 @@ neon.openContext("MSTTeamDocument", null, null, neon.OPERATINGSTATE_NEW, {
     "AssignmentName_param" : vars.get("$param.AssignmentName_param"),
     "AssignmentTable_param" : vars.get("$param.AssignmentTable_param")
 });
-
-
diff --git a/entity/Document_entity/entityfields/msteam/children/synchronizedocuments/stateProcess.js b/entity/Document_entity/entityfields/msteam/children/synchronizedocuments/stateProcess.js
index 38e484f314e..f5e9edcd5d6 100644
--- a/entity/Document_entity/entityfields/msteam/children/synchronizedocuments/stateProcess.js
+++ b/entity/Document_entity/entityfields/msteam/children/synchronizedocuments/stateProcess.js
@@ -1,11 +1,12 @@
+import("Util_lib");
 import("system.vars");
 import("system.neon");
 import("system.result");
 import("Sql_lib");
 
-var isArchived = newSelect("IS_ARCHIVED", "Data_alias")
+var isArchived = Utils.toBoolean(newSelect("IS_ARCHIVED")
     .from("MST_TEAM")
-    .where("MST_TEAM.MST_TEAMID", "$param.MSTTeamId_param")
-    .cell() == "1";
+    .whereIfSet("MST_TEAM.MST_TEAMID", "$param.MSTTeamId_param")
+    .cell(true));
 
 result.string(isArchived ? neon.COMPONENTSTATE_DISABLED : neon.COMPONENTSTATE_EDITABLE);
\ No newline at end of file
diff --git a/process/CreateNotification_workflowService/process.js b/process/CreateNotification_workflowService/process.js
index 458f665d714..3aa7508f4b6 100644
--- a/process/CreateNotification_workflowService/process.js
+++ b/process/CreateNotification_workflowService/process.js
@@ -6,7 +6,6 @@ var variables = JSON.parse(vars.get("$local.value"));
 var config = notification.createConfig()
     .notificationType("WorkflowNotification")
     .addUsersWithIds([variables.notificationUser || variables.USER_ID])
-    .initialState(notification.STATE_UNSEEN)
     .caption(variables.notificationCaption || "")
     .description(variables.notificationDescription || "");
     
diff --git a/process/SendEmail_workflowService/process.js b/process/SendEmail_workflowService/process.js
index 14247ad4e4b..bdc3aab5db6 100644
--- a/process/SendEmail_workflowService/process.js
+++ b/process/SendEmail_workflowService/process.js
@@ -21,10 +21,8 @@ actionParams.processInstanceId = processInstanceId;
 var additionalPlaceholders = [];
 if (aditoUrl)
 {
-    additionalPlaceholders.push(linkPlaceholder = new Placeholder("workflowActionLink", Placeholder.types.CALLBACKFUNCTION, function ()
-    {
-        return WorkflowLinkActions.getActionLink(aditoUrl, actionParams.linkActionType, actionParams.redirectLink, actionParams);
-    }));
+    var linkPlaceholder = WorkflowLinkActions.getActionLinkPlaceholder(actionParams.linkActionType, actionParams, actionParams.redirectLink, aditoUrl);
+    additionalPlaceholders.push(linkPlaceholder);
 }
 
 var email = Email.fromTemplate(documentTemplateId, recipientContactId, null, additionalPlaceholders);
diff --git a/process/Workflow_lib/process.js b/process/Workflow_lib/process.js
index 38627a87e22..05730801196 100644
--- a/process/Workflow_lib/process.js
+++ b/process/Workflow_lib/process.js
@@ -737,4 +737,15 @@ WorkflowLinkActions.parseAction = function (pEncodedAction)
             return null;
         }
     };
+}
+
+WorkflowLinkActions.getActionLinkPlaceholder = function (pLinkActionType, pActionParams, pRedirectLink, pBaseUrl)
+{
+    if (!pBaseUrl)
+        pBaseUrl = vars.get("$sys.origin");
+    
+    return new Placeholder("workflowActionLink", Placeholder.types.CALLBACKFUNCTION, function ()
+    {
+        return WorkflowLinkActions.getActionLink(pBaseUrl, pLinkActionType, pRedirectLink, pActionParams);
+    });
 }
\ No newline at end of file
-- 
GitLab


From 003c77e9dc99175e428c2485bb1430fd03c138dc Mon Sep 17 00:00:00 2001
From: Sebastian Listl <s.listl@adito.de>
Date: Fri, 27 Nov 2020 10:08:08 +0100
Subject: [PATCH 116/184] others/guide adoc files moved and removed

---
 .../LogHistory_entity/LogHistory_entity.aod   |   6 +
 entity/LogHistory_entity/documentation.adoc   |  91 +++++-
 .../tablenames_param/documentation.adoc       |  15 +
 .../loghistoryprovider/documentation.adoc     |   2 +
 neonContext/Offer/Offer.aod                   |   3 +
 others/genJsdoc.bat                           |   3 -
 others/guide/CodingGuidelines.adoc            |   8 -
 others/guide/CreateJsDoc.adoc                 |  40 ---
 others/guide/Loghistory.adoc                  |  87 ------
 others/guide/PersonOrganisationContact.adoc   |  39 ---
 others/guide/ProviderConsumerParameter.adoc   |  92 ------
 others/guide/TargetContext.adoc               |  19 --
 others/guide/how to write JDito code.adoc     | 261 ------------------
 others/guide/instanceableLibExample.adoc      |  62 -----
 others/guide/staticLibExample.adoc            |  57 ----
 others/guide/whichDatatype.adoc               | 105 -------
 process/Neon_lib/Neon_lib.aod                 |   1 +
 .../Neon_lib/documentation.adoc               |   0
 18 files changed, 116 insertions(+), 775 deletions(-)
 create mode 100644 entity/LogHistory_entity/entityfields/loghistoryprovider/children/tablenames_param/documentation.adoc
 delete mode 100644 others/genJsdoc.bat
 delete mode 100644 others/guide/CodingGuidelines.adoc
 delete mode 100644 others/guide/CreateJsDoc.adoc
 delete mode 100644 others/guide/Loghistory.adoc
 delete mode 100644 others/guide/PersonOrganisationContact.adoc
 delete mode 100644 others/guide/ProviderConsumerParameter.adoc
 delete mode 100644 others/guide/TargetContext.adoc
 delete mode 100644 others/guide/how to write JDito code.adoc
 delete mode 100644 others/guide/instanceableLibExample.adoc
 delete mode 100644 others/guide/staticLibExample.adoc
 delete mode 100644 others/guide/whichDatatype.adoc
 rename others/guide/how to copy objects with subitems.adoc => process/Neon_lib/documentation.adoc (100%)

diff --git a/entity/LogHistory_entity/LogHistory_entity.aod b/entity/LogHistory_entity/LogHistory_entity.aod
index 6499fc00e00..b7abfc4219a 100644
--- a/entity/LogHistory_entity/LogHistory_entity.aod
+++ b/entity/LogHistory_entity/LogHistory_entity.aod
@@ -39,6 +39,12 @@
     <entityProvider>
       <name>LogHistoryProvider</name>
       <documentation>%aditoprj%/entity/LogHistory_entity/entityfields/loghistoryprovider/documentation.adoc</documentation>
+      <children>
+        <entityParameter>
+          <name>tablenames_param</name>
+          <documentation>%aditoprj%/entity/LogHistory_entity/entityfields/loghistoryprovider/children/tablenames_param/documentation.adoc</documentation>
+        </entityParameter>
+      </children>
       <dependencies>
         <entityDependency>
           <name>23dbfa51-5340-48e3-bd60-e0dcb7d44ad3</name>
diff --git a/entity/LogHistory_entity/documentation.adoc b/entity/LogHistory_entity/documentation.adoc
index 20fa16faa47..b38670d44b7 100644
--- a/entity/LogHistory_entity/documentation.adoc
+++ b/entity/LogHistory_entity/documentation.adoc
@@ -2,5 +2,92 @@
 
 Entity for the log entries in the individual modules.
 
-This entity is based on the `AB_LOGHISTORY`-table. Note that this database table has no primary key associated to it.
-This is because it is only a pit of log-record and not necessary.
\ No newline at end of file
+This entity is based on the `AB_LOGHISTORY`-table.
+
+== configure Loghistory
+
+:DATA_ALIAS: Data_alias
+:EDITOR_ALIAS_DEFINITION: AliasDefinition-Editor
+
+=== the concept
+//TODO: extend the concept description
+Stoarge: Database-table: `AB_LOGHISTORY`
+
+Collecting Data:
+----
+Audit -> process_audit -> Loghistory_lib: LogHistoryExecutor 
+----
+
+Data is collected and pre-translated. Therefor only one Language can be applied for logging.
+Because the loghistory is written via the auditing, only changes that are done with the proper Jdito-Methods will be logged.
+
+=== prerequisites
+
+Auditing has to be activated for all tables you want to log.
+
+.prerequisites of enabling Audit in general
+* Auditing has to be enabled in your Server
+* Auditing has to be enabled for your alias (default: +{DATA_ALIAS}+)
+* Tables that shall be logged need some configs in the _{EDITOR_ALIAS_DEFINITION}_
+** property `idColumn` has to be set (a primary key is needed therefore)
+** `auditMode` has to be set -Standard, -CLOB, or -BLOB (chosse the one you really need)
+
+
+=== activate writing into loghistory
+
+Assuming that the 
+
+* required database-tables exist 
+* JDito-processes already exist
+* audit has been activated in general
+
+you are ready to configure _which_ column shall be logged and _how_.
+
+==== configure columns for logging
+
+There are several properties (custom and pre-exisiting) that can be set for configuring the logging:
+
+.configuration options per column
+[options="header"]
+|=======
+|property |purpose |property-type
+|+title+ |text that is used to display which column has been modified|pre-exisiting
+|+log+ |defines whether a column needs to be logged or not; not exisisting equals `false` |custom: Booelan
+|+tableRef+ |references table for automatically grouping data. This is usefull for ForeignKeys, e.g. a +OFFERITEM.OFFER_ID+ column could have a +tableRef+ "OFFER"|custom: String
+|+primaryKey+ |this is not only used to enable auditing generally, but it's used to resolve +tableRef+ values correctly|pre-exisiting
+|+keyword+ |defines a keyword contianer that should be used to transform a +KEYID+ into a display value|custom: String
+|+autoMapTrueFalse4Log+ |if `true` the loghistory-executor tries to automatically translate a value into a "yes"/"no"-display value|custom: Booelan
+|+translate4Log+ |defines a process to transform a technical value into a display value |custom: JDito
+|=======
+
++translate4Log+ is a mighty possibility to translate a ID-value into a displayvalue. However, you should keep several important things in mind:
+
+* translate text if necessary via the locale-parameter
+* the process is called each time a change to that column is applied - keep it fast and simple
+
+.translate4Log example (skip imports for better readability)
+[source,javascript]
+----
+var params = Translate4LogParams.load();// <1>
+var countryName = CountryUtils.getLatinNameByIso2(params.value, params.locale); // <2>
+result.string(countryName);// <3>
+----
+<1> load the parameters in a easy and fail-proof way
+<2> locale is passed to the resolving function and in that function a translation is applied
+<3> always return a string
+
+==== configure a consumer for retrieving the loghistory
+
+.Example for the +tablenames_param+ process
+----
+import("system.vars");
+import("system.result");
+import("Context_lib");
+
+var res = [];
+res.push({id: vars.get("$field.CONTACTID"), tableNames: ["CONTACT", "COMMUNICATION", "ADDRESS", "AB_ATTRIBUTERELATION"]});
+res.push({id: vars.get("$field.PERSONID"), tableNames: ["PERSON"]});
+
+res = JSON.stringify(res);
+result.object(res);
+----
\ No newline at end of file
diff --git a/entity/LogHistory_entity/entityfields/loghistoryprovider/children/tablenames_param/documentation.adoc b/entity/LogHistory_entity/entityfields/loghistoryprovider/children/tablenames_param/documentation.adoc
new file mode 100644
index 00000000000..3051d2df3f9
--- /dev/null
+++ b/entity/LogHistory_entity/entityfields/loghistoryprovider/children/tablenames_param/documentation.adoc
@@ -0,0 +1,15 @@
+= tablenames_param
+
+.Example
+----
+import("system.vars");
+import("system.result");
+import("Context_lib");
+
+var res = [];
+res.push({id: vars.get("$field.CONTACTID"), tableNames: ["CONTACT", "COMMUNICATION", "ADDRESS", "AB_ATTRIBUTERELATION"]});
+res.push({id: vars.get("$field.PERSONID"), tableNames: ["PERSON"]});
+
+res = JSON.stringify(res);
+result.object(res);
+----
\ No newline at end of file
diff --git a/entity/LogHistory_entity/entityfields/loghistoryprovider/documentation.adoc b/entity/LogHistory_entity/entityfields/loghistoryprovider/documentation.adoc
index 2712d5d5c6d..4088dd1c6fa 100644
--- a/entity/LogHistory_entity/entityfields/loghistoryprovider/documentation.adoc
+++ b/entity/LogHistory_entity/entityfields/loghistoryprovider/documentation.adoc
@@ -1,3 +1,5 @@
+= LogHistoryProvider
+
 Generic provider for log history entries. 
 
 A filter for given _tablenames_ is applied, see the documentation of the parameters for an example.
\ No newline at end of file
diff --git a/neonContext/Offer/Offer.aod b/neonContext/Offer/Offer.aod
index e8a6d8d34e5..271bdfa9b49 100644
--- a/neonContext/Offer/Offer.aod
+++ b/neonContext/Offer/Offer.aod
@@ -44,5 +44,8 @@
       <name>136dceaa-0eca-452a-9757-132fd54e8c55</name>
       <view>OfferPreviewMultiple_view</view>
     </neonViewReference>
+    <webserviceReference>
+      <name>277d4493-9a49-4e68-b00c-29d3d0e0b9d2</name>
+    </webserviceReference>
   </references>
 </neonContext>
diff --git a/others/genJsdoc.bat b/others/genJsdoc.bat
deleted file mode 100644
index db0775bbbb3..00000000000
--- a/others/genJsdoc.bat
+++ /dev/null
@@ -1,3 +0,0 @@
-SET mypath=%~dp0
-
-jsdoc -r %mypath:~0,-1%\..\process -d %mypath:~0,-1%\jsdocOut
\ No newline at end of file
diff --git a/others/guide/CodingGuidelines.adoc b/others/guide/CodingGuidelines.adoc
deleted file mode 100644
index 7fbd1bf92c5..00000000000
--- a/others/guide/CodingGuidelines.adoc
+++ /dev/null
@@ -1,8 +0,0 @@
-= Sample Document
-Doc Writer <doc.writer@asciidoc.org>; John Smith <john.smith@asciidoc.org>
-v1.0, 2013-05-20: First draft
-:title: Sample Document
-:tags: [document, example]
-
-
-Preamble...
diff --git a/others/guide/CreateJsDoc.adoc b/others/guide/CreateJsDoc.adoc
deleted file mode 100644
index d428b85c65a..00000000000
--- a/others/guide/CreateJsDoc.adoc
+++ /dev/null
@@ -1,40 +0,0 @@
-How to build js-doc out of the lib-comments
-===========================================
-:toc2: left
-:numbered:
-
-== installation ==
-1. Nodejs:
-https://nodejs.org/en/
-LTS-version (aktuell 10.15.0)
-
-download and install
-
-2. install jsdoc 
-
-open CMD
-[source]
-----
-npm install -g jsdoc
-----
-
-== generate jsdoc ==
-
-=== manually ===
-1. open CMD
-2. navigate into the project-folder. e.g.
-[source]
-----
-C:
-cd C:\Users\M.Mustermann\Documents\AditoProjects\xRM-Basic5.1
-----
-3. run command
-[source]
-----
-jsdoc -r process -d others\jsdocOut
-----
-4. Open others\jsdocOut\index.html with a webbrowser
-
-=== with script in designer (Windows) ===
-1. In the Designer right click on others\genJsdoc.bat -> "Open in System"
-2. Right click on others\jsdocOut\index.html -> "View"
\ No newline at end of file
diff --git a/others/guide/Loghistory.adoc b/others/guide/Loghistory.adoc
deleted file mode 100644
index 6a2f284bf89..00000000000
--- a/others/guide/Loghistory.adoc
+++ /dev/null
@@ -1,87 +0,0 @@
-configure Loghistory
-====================
-:DATA_ALIAS: Data_alias
-:EDITOR_ALIAS_DEFINITION: AliasDefinition-Editor
-
-== the concept ==
-//TODO: extend the concept description
-Stoarge: Database-table: `AB_LOGHISTORY`
-
-Collecting Data:
-----
-Audit -> process_audit -> Loghistory_lib: LogHistoryExecutor 
-----
-
-Data is collected and pre-translated. Therefor only one Language can be applied for logging.
-Because the loghistory is written via the auditing, only changes that are done with the proper Jdito-Methods will be logged.
-
-== prerequisites ==
-
-Auditing has to be activated for all tables you want to log.
-
-.prerequisites of enabling Audit in general
-* Auditing has to be enabled in your Server
-* Auditing has to be enabled for your alias (default: +{DATA_ALIAS}+)
-* Tables that shall be logged need some configs in the _{EDITOR_ALIAS_DEFINITION}_
-** property `idColumn` has to be set (a primary key is needed therefore)
-** `auditMode` has to be set -Standard, -CLOB, or -BLOB (chosse the one you really need)
-
-
-== activate writing into loghistory ==
-
-Assuming that the 
-
-* required database-tables exist 
-* JDito-processes already exist
-* audit has been activated in general
-
-you are ready to configure _which_ column shall be logged and _how_.
-
-=== configure columns for logging ===
-
-There are several properties (custom and pre-exisiting) that can be set for configuring the logging:
-
-.configuration options per column
-[options="header"]
-|=======
-|property |purpose |property-type
-|+title+ |text that is used to display which column has been modified|pre-exisiting
-|+log+ |defines whether a column needs to be logged or not; not exisisting equals `false` |custom: Booelan
-|+tableRef+ |references table for automatically grouping data. This is usefull for ForeignKeys, e.g. a +OFFERITEM.OFFER_ID+ column could have a +tableRef+ "OFFER"|custom: String
-|+primaryKey+ |this is not only used to enable auditing generally, but it's used to resolve +tableRef+ values correctly|pre-exisiting
-|+keyword+ |defines a keyword contianer that should be used to transform a +KEYID+ into a display value|custom: String
-|+autoMapTrueFalse4Log+ |if `true` the loghistory-executor tries to automatically translate a value into a "yes"/"no"-display value|custom: Booelan
-|+translate4Log+ |defines a process to transform a technical value into a display value |custom: JDito
-|=======
-
-+translate4Log+ is a mighty possibility to translate a ID-value into a displayvalue. However, you should keep several important things in mind:
-
-* translate text if necessary via the locale-parameter
-* the process is called each time a change to that column is applied - keep it fast and simple
-
-.translate4Log example (skip imports for better readability)
-[source,javascript]
-----
-var params = Translate4LogParams.load();// <1>
-var countryName = CountryUtils.getLatinNameByIso2(params.value, params.locale); // <2>
-result.string(countryName);// <3>
-----
-<1> load the parameters in a easy and fail-proof way
-<2> locale is passed to the resolving function and in that function a translation is applied
-<3> always return a string
-
-=== configure a consumer for retrieving the loghistory ===
-
-.Exampel for the +tablenames_param+ process
-----
-import("system.vars");
-import("system.result");
-import("Context_lib");
-
-var res = [];
-res.push({id: vars.get("$field.CONTACTID"), tableNames: ["CONTACT", "COMMUNICATION", "ADDRESS", "AB_ATTRIBUTERELATION"]});
-res.push({id: vars.get("$field.PERSONID"), tableNames: ["PERSON"]});
-
-res = JSON.stringify(res);//currently only strings  can be passed as param
-result.object(res);
-----
\ No newline at end of file
diff --git a/others/guide/PersonOrganisationContact.adoc b/others/guide/PersonOrganisationContact.adoc
deleted file mode 100644
index 7d7a1b33f97..00000000000
--- a/others/guide/PersonOrganisationContact.adoc
+++ /dev/null
@@ -1,39 +0,0 @@
-Person, Organisation, Contact
-=============================
-:toc2: left
-:numbered:
-
-== Differences to old Adito ==
-
-The old Adito basic had:
-
-- Pers
-- Org
-- Relation
-
-They are not gone, just renamed:
-
-- Pers = Person
-- Org = Organisation
-- Relation = Contact
-
-TODO: doku erweitern
-erson, Organisation, Contact
-===========================================
-:toc2: left
-:numbered:
-
-== Differences to old Adito ==
-
-The old Adito basic had:
-
-- Pers
-- Org
-- Relation
-
-They are not gone, just renamed:
-
-- Pers = Person
-- Org = Organisation
-- Relation = Contact
-
diff --git a/others/guide/ProviderConsumerParameter.adoc b/others/guide/ProviderConsumerParameter.adoc
deleted file mode 100644
index ee9ff59bc7d..00000000000
--- a/others/guide/ProviderConsumerParameter.adoc
+++ /dev/null
@@ -1,92 +0,0 @@
-Provider - Consumer
-===================
-:toc2: left
-:numbered:
-
-=== Provider ===
-Is the old dfi.
-
-==== Purpose ====
-The provider provides access to an entity.
-You can get data of another entity by connecting a consumer to a provider.
-
-==== Naming ====
-The names should provide information about *what the provider provides*.
-
-For example:
-Communication_entity has 3 providers:
-
-- *AllCommunications*
-- *EmailCommunications*
-- *PhoneCommunications*
-
-If you connect to *AllCommunications* you get *all* communication types of a contact.
-If you connect to *EmailCommunications* you get *only the Email* communication type of a contact.
-If you connect to *PhoneCommunications* you get *only the Phone* communication type of a contact.
-
-*Important:*
-*Do not always create a new provider when connecting a new entity. Maybe you can use an already existing provider.*
-*Try to reuse providers if you need similar data for two dependencies*
-
-=== Consumer ===
-Is the old dfo.
-
-=== Purpose ===
-The Consumer *consumes* the data a provider provides.
-It can be connected to a provider and fill the parameters of the provider.
-
-=== Naming ===
-Most of the time you get a list of "something" so you should call it the plural of what you get.
-
-Example:
-Persons
-Organisations
-
-If you have two Consumer to the same Entity, you should use speaking names. 
-
-Example:
-Documents (e.g. for all documents of a person)
-MainDocuments (e.g. for only the main documents of a person)
-
-If you know you get only one row, you can use the singular.
-
-Example:
-Person
-
-=== Parameter ===
-Parameters provide a way to tell a provider *what exactly you need*.
-
-==== Properties ====
-The most important properties are
-code, exposed, triggerRecalculation and mandatory
-
-Parameters work with a fallback mechanism.
-This means that if you set the code on the parameter directly then this is executed *only if you did not* provide the code on the parameter at the *provider* and/or *consumer*.
-Likewise if you set the code on a parameter at the provider it will only be executed if a *consumer* which connects to this provider *has no code set* at the parameter.
-
-Here some examples for the *code* property:
-
-[options="header"]
-|========================================================================================================================================================================================================================================================
-| Parameter | Provider | Consumer | Result                       | Notes                                                                                                                                                                                 
-| default   | default  | default  | Nothing executed             |                                                                                                                                                                                       
-| default   | default  | code set | Code from consumer executed  | This is the mostly used  scenario.                                                                                                                                                    
-| default   | code set | default  | Code from provider executed  | This is used if you need a default value for a parameter which is different on each provider. e.g. used by the Document_entity to determine if it should show main documents or not.  
-| code set  | default  | default  | Code from parameter executed |                                                                                                                                                                                       
-|========================================================================================================================================================================================================================================================
-
-The checkbox-parameters can have *three* states: default, checked, unchecked. Default means the property is *gray* and the value from the previous instance is used. Checked and unchecked overwrite always the previous instance.
-
-The exposed property is a way to decide if a parameter should be visible by the next instance
-Here some examples for the *exposed* property:
-
-[options="header"]
-|========================================================================================================================================================
-| Parameter | Provider | Result      | Notes                                                                                                             
-| default   | default  | NOT Exposed | because the default for exposed is: NOT exposed. -> the parameter won't be visible on the provider and consumer! 
-| set       | set      | Exposed     | This means that the parameter can be set by the consumer.                                                         
-| set       | UNset    | NOT Exposed | This will disable the parameter for one specific provider.                                                        
-| set       | default  | Exposed     |                                                                                                                   
-|========================================================================================================================================================
-
-*Note that there are currently (13.02.2019) some bugs and the handling of parameters with the default #PROVIDER may change.*
\ No newline at end of file
diff --git a/others/guide/TargetContext.adoc b/others/guide/TargetContext.adoc
deleted file mode 100644
index 1d466a0da9c..00000000000
--- a/others/guide/TargetContext.adoc
+++ /dev/null
@@ -1,19 +0,0 @@
-Target Context
-==============
-
-toc2: left
-:numbered:
-
-== What? ==
-The target context is for forwarding the preview and the klick-action to another context.
-
-== Why? ==
-For example the ObjectRelation entity uses this feature to open the linked object directly.
-
-== Where? == 
-It is configured by two properties of the providers.
-
-* targetContextField
-* targetIdField
-
-You can provide an entity-field for each of them which contains the contextId (currently the contextName 13.02.2019) and the rowId (UID) which should be used to open the preview or main view.
\ No newline at end of file
diff --git a/others/guide/how to write JDito code.adoc b/others/guide/how to write JDito code.adoc
deleted file mode 100644
index 9dbbdb19d29..00000000000
--- a/others/guide/how to write JDito code.adoc	
+++ /dev/null
@@ -1,261 +0,0 @@
-How to wirte JDito code
-=======================
-:toc2: left
-:numbered:
-
-== basics ==
-* Keep everything english. Every title, caption, messages, comments, etc. should be english. Add german translation to the languages if necessary.
-* in JavaScript-Strings use `"` instead of `'` - even if its only 1 character. `'` is for SQL (within JS-Strings)
-* Parameters should start with p.
-
-== code structure ==
-=== vars and others (var, let) ===
-* avoid `let` as much as possible because you cannot debug these variables
-
-=== brackets ===
-* `{` are placed on a new line
- 
-Example:
-[source,javascript]
-----
-for (i = 0, i < dataLen; i++) 
-{
-    //code here
-}
-
-myArray.forEach(function(pItem) 
-{
-    // Do something
-});
-----
-
-=== loops ===
-nested loops should be defined with replicated indexer variables.
-Therefore it's easy to see in which level of the counter you are.
-Even better would be a good and describing name.
-
-Example:
-[source,javascript]
-----
-for (i = 0, i < dataLen; i++) 
-{
-    for (ii = 0, ii < dataLen[i].length; ii++) 
-    {
-        //code...
-    }
-}
-
-for (row = 0, row < dataLen; row++) 
-{
-    for (col = 0, col < dataLen[row].length; col++) 
-    {
-        //code...
-    }
-}
-----
-
-
-== Functions - overview of different "types" ==
-This sections covers how to define different "types" of functions in libraries.
-
-=== by using static methods ===
-This will be mostly utility functions where there is no need to instantiate an object. You'll need this probably the most time.
-
--> Static object with static functions.
-
-
-Definition:
-[source,javascript]
-----
-/**
- * provides static methods for validation of communication data
- * do not create an instance of this
- * @static
- * @class
- */
-function CommValidationUtil(){}<1>
-
-/**
- * returns a blueprint for validation extensions; these extensions are needed for validating comm data and can be passed to other functions
- * @return {object} a object with properties that have a specific default value; normally you want to overwrite that value
- */
-CommValidationUtil.getExtensionsBlueprint = function() <2>
-{
-    return {
-        countryCode: null
-    };
-}
-----
-<1> the function-object that keeps everything together - this function should never be actually called (no direct call, no indirect call)
-<2> an actual function that can be called
-
-And how to use it:
-[source,javascript]
-----
-import("Comm_lib");
-
-var additionals = CommValidationUtil.getExtensionsBlueprint();
-----
-
-=== by creating an object with functions ===
-
-You may want to hold data and create objects where methods share that data. 
-
-Here is an example for an object that can be created:
-[source,javascript]
-----
-/**
- * object that provides featrues for a single keyword attribute; initalizes itself on creation with a specific keyword-attribute
- * 
- * @param {String} pContainerName specifies the type of the keyword and therefore the list elements;
- *                                  e.g. "COUNTRY"; use an entry of the $KeywordRegistry here
- * @param {String} pAttributeName the name of the keyword attribute that shall be initalized
- * @param {String} [pDefault=undefined] the default value -> Does not throw an error, if default value exists.
- * 
- * @class
- */
-function KeywordAttribute(pContainerName, pAttributeName, pDefault)
-{
-    this.container = pContainerName;
-    this.attribute = pAttributeName;
-    this.defaultValue = pDefault;
-
-    var keywordAttrData = newSelect("AB_KEYWORD_ATTRIBUTE.AB_KEYWORD_ATTRIBUTEID, AB_KEYWORD_ATTRIBUTE.KIND")
-        .from("AB_KEYWORD_ATTRIBUTE")
-        .where("AB_KEYWORD_ATTRIBUTE.CONTAINER", pContainerName)
-        .and("AB_KEYWORD_ATTRIBUTE.NAME", pAttributeName)
-        .arrayRow();
-    
-    if (keywordAttrData.length > 0) 
-    {
-        this.id = keywordAttrData[0];
-        this.type = keywordAttrData[1];
-        this.dbField = this.type.trim();
-    }
-    else if(pDefault == undefined)
-    {
-        throw new Error(translate.withArguments("no keyword attribute \"%0\" found in keyword container \"%1\"", [this.attribute, this.container]));
-    }
-}
-
-/**
- * get the value for a specific keyId.
- * Error if the keyword container does not have the attribute at all (you can check this with .exists())
- * Error if the attribute does not exist at the provided keyId and you have not specified a default
- * 
- * @param {String} pKeyId the keyId
- * 
- * @return {String} the loaded value (or the default)
- */
-KeywordAttribute.prototype.getValue = function(pKeyId)
-{
-    if (this.exists()) 
-    {
-        var attrValue = newSelect(this.dbField)
-            .from("AB_KEYWORD_ENTRY")
-            .join("AB_KEYWORD_ATTRIBUTERELATION", "AB_KEYWORD_ENTRY.AB_KEYWORD_ENTRYID = AB_KEYWORD_ATTRIBUTERELATION.AB_KEYWORD_ENTRY_ID")
-            .where("AB_KEYWORD_ENTRY.CONTAINER", this.container)
-            .and("AB_KEYWORD_ATTRIBUTERELATION.AB_KEYWORD_ATTRIBUTE_ID", this.id)
-            .and("AB_KEYWORD_ENTRY.KEYID", pKeyId)
-            .cell();
-
-        if (attrValue)
-            return attrValue;
-        
-        if (this.defaultValue)
-            return this.defaultValue;
-        
-        throw new Error(translate.withArguments("no keyword attribute \"%0\" found in keyword \"%1\" from container \"%2\"", [this.attribute, pKeyId, this.container]));
-    }
-    else if (this.defaultValue == undefined)
-        throw new Error(translate.withArguments("no keyword attribute \"%0\" found in keyword container \"%1\"", [this.attribute, this.container]));
-    else
-        return this.defaultValue;
-}
-
-/**
- * get a SqlBuilder object for this keyword attribute. You can easily add additional conditions to it.
- * 
- * @return {SqlBuilder} a SqlBuilder which contains a select for the entry-id's, joins to entry and attribute 
- *                      and conditions for the container and the attribute-name.
- */
-KeywordAttribute.prototype.getSqlBuilderSelect = function() 
-{
-    return newSelect("AB_KEYWORD_ATTRIBUTERELATION.AB_KEYWORD_ENTRY_ID")
-        .from("AB_KEYWORD_ATTRIBUTERELATION")
-        .join("AB_KEYWORD_ENTRY", "AB_KEYWORD_ENTRYID = AB_KEYWORD_ENTRY_ID", "attrEntry")
-        .join("AB_KEYWORD_ATTRIBUTE", "AB_KEYWORD_ATTRIBUTEID = AB_KEYWORD_ATTRIBUTE_ID")
-        .where(["AB_KEYWORD_ENTRY", "CONTAINER", "attrEntry"], this.container)
-        .and("AB_KEYWORD_ATTRIBUTE.NAME", this.attribute)
-}
-
-/**
- * check if the Container can have the attribute.
- * @return {Boolean} true if it exists, false if not
- */
-KeywordAttribute.prototype.exists = function()
-{
-    return this.id != undefined && this.type != undefined && this.dbField != undefined;
-}
-
-----
-
-=== private functions ===
-
-
-Private functions would be possible but make everything much more complicate.
-So just start your functions / methods name with a _ if you need private methods.
-
---> do not use functions which start with a _ outside of the class!
-
-Add @ignore to the comment of those functions to prevent showing them in the generated jsdoc.
-
-== JS-Doc ==
-
-<1> JS-Doc comment: http://usejsdoc.org/
-<2> jsdoc-blocks have to start with /&#x002A;&#x002A; otherwise JSDoc cannot generate a documentation
-<3> use the correct form for optional/required parameters: http://usejsdoc.org/tags-param.html
-Optional parameter: [alias=the current alias]
-Required parameter: alias
-Classes: @class
-[source,javascript]
-----
-/**
- * Description...
- * ...
- *  
- * @param {String} [pAlias=the current alias] the database alias where the condition shall be executed later (important for column types of preparedStatements)
- * @example Here is an example
- * @class
- */
-function SqlCondition(pAlias) 
-{
-...
-}
-----
-<4> examples are useful on more complex functions
-<5> constructor function; init properties (do not set functions ("methods") here!)
-<6> add functions ("methods") to the prototype, they are available through the prototype chain
-
-And how to use it (normally you'd want to use preparedStatements but for the sake of an easy example it's a bit shorter here)
-See also HowToSqlConditionLib.adoc for a full documentation.
-[source,javascript]
-----
-import("system.vars");
-import("system.result");
-import("Sql_lib");
-import("Comm_lib");
-
-var cond = new SqlCondition();
-
-var mediumIds = CommExtensions.getContextualMediumIds();
-if (mediumIds.length > 0)
-    cond.and("COMM.MEDIUM_ID in (" + mediumIds.join(", ") + ")");
-
-var idVal = vars.get("$local.idvalue");
-if (uids.length > 0)
-    cond.and("COMM.COMMID = '" + idVal + "' ");
-
-result.string(cond.toString("COMM.OPTIONAL = 't'"));
-----
-
diff --git a/others/guide/instanceableLibExample.adoc b/others/guide/instanceableLibExample.adoc
deleted file mode 100644
index 66dfc0a312e..00000000000
--- a/others/guide/instanceableLibExample.adoc
+++ /dev/null
@@ -1,62 +0,0 @@
-= Example for a instanceable Lib =
-:toc2: left
-:numbered:
-
-Remember to always change the comments to fit your class! +
-Use speaking names for ALL variables, classes and functions!
-
-[source,javascript]
-----
-import("...");
-
-/**
- * instanceable example Utility class;
- * 
- * @param {String} pParam1 is for ...
- * 
- * @example var myUtil = new UtilClass("-");
- * @class
- */
-function UtilClass(pParam1) 
-{
-    // here is the constructor.
-    // create class variables like this:
-    this.myVariable = pParam1;
-}
-
-/**
- * a public function
- * 
- * @param {String} pParam1 is for ...
- * @param {String} pParam2 is for ...
- * 
- * @example var myResult = myUtil.myFunction("p1", "p2");
- * 
- * @return {String} a result
- */
-UtilClass.prototype.myFunction = function(pParam1, pParam2) 
-{
-    return this._privateStaticFunction1(pParam1, pParam2, this.myVariable);
-}
-
-/**
- * a private function
- * 
- * @param {String} pParam1 is for ...
- * @param {String} pParam2 is for ...
- * @param {String} pParam3 is for ...
- * 
- * @return {String} a result
- * @ignore
- */
-UtilClass.prototype._myPrivateFunction = function(pParam1, pParam2, pParam3) 
-{
-    if(pParam1 && pParam2 && pParam3) 
-    {
-        ...
-        return pParam1 + pParam3 + pParam2;
-    }
-
-    return "";
-}
-----
\ No newline at end of file
diff --git a/others/guide/staticLibExample.adoc b/others/guide/staticLibExample.adoc
deleted file mode 100644
index d48e2eba91f..00000000000
--- a/others/guide/staticLibExample.adoc
+++ /dev/null
@@ -1,57 +0,0 @@
-= Example for a static Lib =
-:toc2: left
-:numbered:
-
-Remember to always change the comments to fit your class! +
-Use speaking names for ALL variables, classes and functions!  
-
-[source,javascript]
-----
-import("...");
-
-/**
- * a static Example Utility class
- * 
- * Do not create an instance of this!
- * @class
- */
-function ExampleUtils() {} // leave this function empty! A constructor is not needed for static functions.
-
-/**
- * a public static function
- * 
- * @param {String} pParam1 is for ...
- * @param {String} pParam2 is for ...
- * 
- * @example var myResult = ExampleUtils.staticFunction1("p1", "p2");
- * 
- * @return {String} a result
- */
-ExampleUtils.staticFunction1 = function(pParam1, pParam2) 
-{
-    return this._privateStaticFunction1(pParam1, pParam2, "-")
-}
-
-/**
- * a private static function
- * 
- * Do not use outside of ExampleUtils!
- * 
- * @param {String} pParam1 is for ...
- * @param {String} pParam2 is for ...
- * @param {String} pParam3 is for ...
- * 
- * @return {String} a result
- * @ignore
- */
-ExampleUtils._privateStaticFunction1 = function(pParam1, pParam2, pParam3) 
-{
-    if(pParam1 && pParam2 && pParam3) 
-    {
-        ...
-        return pParam1 + pParam3 + pParam2;
-    }
-
-    return "";
-}
-----
\ No newline at end of file
diff --git a/others/guide/whichDatatype.adoc b/others/guide/whichDatatype.adoc
deleted file mode 100644
index 092ae1bf6ae..00000000000
--- a/others/guide/whichDatatype.adoc
+++ /dev/null
@@ -1,105 +0,0 @@
-Overview over datatypes
-=======================
-:toc2: left
-:numbered:
-
-This is a simple overview about when to to use which datatype.
-
-== Boolean ==
-=== Datatype ===
-----
-TINYINT
-----
-=== Usage ===
-0 => false
-1 => true
-
-Add nullable="false" constraint, because for boolean null makes no sense and complicates searches and validations.
-
-== Text ==
-Text should be saved as Unicode. For this prefix the datatype with a 'N' (there are some exceptions like the UUID)
-
-=== Big text ===
-For informations, descriptions, ...
-----
-NCLOB
-----
-
-=== Small / Normal text ===
-For Names, ...
-
-You have to define the maximum length.
-----
-NVARCHAR(50)
-----
-
-=== Fixed size text ===
-If you are sure that the length is always fixed and will not change.
-
-You have to define the length.
-----
-NCHAR(5)
-----
-
-=== UUID's, standardized codes  ===
-For them unicode is mostly not needed. Only use unicode here if you are sure, it is needed.
-
-For UUID's, standardized codes (language codes), ...
-
-You have to define the length.
-----
-CHAR(5)
-----
-
-UUID needs length 36:
-----
-CHAR(36)
-----
-
-=== Decimal numbers ===
-If precision and fixed decimals (Nachkommastellen) are needed, use DECIMAL.
-For prices, ...
-----
-NUMERIC(10, 2)
-----
-
-Else you can use double. 
-----
-DOUBLE
-----
-
-=== Integer numbers ===
-In normal cases just use INTEGER
-
-If you know that very big integers or only very small Integers are needed, you can also use
-
-Byte count may not be the same on all databases.
-
-8 Byte
-
-----
-BIGINT
-----
-
-4 Byte 
-
-----
-INTEGER
-----
-
-2 Byte 
-
-----
-SMALLINT
-----
-
-1 Byte
-
-----
-TINYINT
-----
-
-=== Binary data ===
-----
-BLOB
-----
\ No newline at end of file
diff --git a/process/Neon_lib/Neon_lib.aod b/process/Neon_lib/Neon_lib.aod
index ace4a1e8ec1..6c99555616c 100644
--- a/process/Neon_lib/Neon_lib.aod
+++ b/process/Neon_lib/Neon_lib.aod
@@ -2,6 +2,7 @@
 <process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
   <name>Neon_lib</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
+  <documentation>%aditoprj%/process/Neon_lib/documentation.adoc</documentation>
   <process>%aditoprj%/process/Neon_lib/process.js</process>
   <variants>
     <element>LIBRARY</element>
diff --git a/others/guide/how to copy objects with subitems.adoc b/process/Neon_lib/documentation.adoc
similarity index 100%
rename from others/guide/how to copy objects with subitems.adoc
rename to process/Neon_lib/documentation.adoc
-- 
GitLab


From df131c9a14b486f499ff34a7bee14412ede3cc19 Mon Sep 17 00:00:00 2001
From: "j.goderbauer" <j.goderbauer@adito.de>
Date: Fri, 27 Nov 2020 13:33:31 +0100
Subject: [PATCH 117/184] =?UTF-8?q?[Projekt:=20Entwicklung=20-=20xRM][Tick?=
 =?UTF-8?q?etNr.:=201069286][Vertriebsprojekt=20-=20Projektteam=20-=20es?=
 =?UTF-8?q?=20k=C3=B6nnen=20keine=20Mitglieder=20hinzugef=C3=BCgt=20werden?=
 =?UTF-8?q?]?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 entity/Order_entity/Order_entity.aod          |   6 +
 entity/Person_entity/Person_entity.aod        | 407 +++++++++---------
 .../children/contactid_param/valueProcess.js  |   4 +
 .../entityfields/orders/documentation.adoc    |   1 +
 entity/Person_entity/grantDeleteProcess.js    |   2 +-
 5 files changed, 223 insertions(+), 197 deletions(-)
 create mode 100644 entity/Person_entity/entityfields/orders/children/contactid_param/valueProcess.js
 create mode 100644 entity/Person_entity/entityfields/orders/documentation.adoc

diff --git a/entity/Order_entity/Order_entity.aod b/entity/Order_entity/Order_entity.aod
index ae39a7c4364..2d2ea6554be 100644
--- a/entity/Order_entity/Order_entity.aod
+++ b/entity/Order_entity/Order_entity.aod
@@ -28,6 +28,12 @@
           <fieldName>Orders</fieldName>
           <isConsumer v="false" />
         </entityDependency>
+        <entityDependency>
+          <name>bfc738ad-8af3-4d2b-9ed5-b3ca2212bb9e</name>
+          <entityName>Person_entity</entityName>
+          <fieldName>Orders</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
       </dependencies>
     </entityProvider>
     <entityField>
diff --git a/entity/Person_entity/Person_entity.aod b/entity/Person_entity/Person_entity.aod
index b642f05df01..0c5b240aad1 100644
--- a/entity/Person_entity/Person_entity.aod
+++ b/entity/Person_entity/Person_entity.aod
@@ -89,11 +89,6 @@
     </entityFieldGroup>
     <entityConsumer>
       <name>Activities</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Activity_entity</entityName>
-        <fieldName>LinkedObjects</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>RowId_param</name>
@@ -108,6 +103,11 @@
           <valueProcess>%aditoprj%/entity/Person_entity/entityfields/activities/children/presetlinks_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Activity_entity</entityName>
+        <fieldName>LinkedObjects</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>CONTACTID</name>
@@ -118,14 +118,6 @@
       <name>OrganisationRelated</name>
       <documentation>%aditoprj%/entity/Person_entity/entityfields/organisationrelated/documentation.adoc</documentation>
       <recordContainer>db</recordContainer>
-      <dependencies>
-        <entityDependency>
-          <name>41952879-c2f0-411f-8ca1-36c38914a629</name>
-          <entityName>Organisation_entity</entityName>
-          <fieldName>Contact</fieldName>
-          <isConsumer v="false" />
-        </entityDependency>
-      </dependencies>
       <children>
         <entityParameter>
           <name>ContactId_param</name>
@@ -144,6 +136,14 @@
           <expose v="false" />
         </entityParameter>
       </children>
+      <dependencies>
+        <entityDependency>
+          <name>41952879-c2f0-411f-8ca1-36c38914a629</name>
+          <entityName>Organisation_entity</entityName>
+          <fieldName>Contact</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+      </dependencies>
     </entityProvider>
     <entityField>
       <name>PERSON_ID</name>
@@ -161,11 +161,6 @@
     </entityField>
     <entityConsumer>
       <name>PersAddresses</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Address_entity</entityName>
-        <fieldName>ContactAddresses</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>DefaultAddressId_param</name>
@@ -185,14 +180,14 @@
           <valueProcess>%aditoprj%/entity/Person_entity/entityfields/persaddresses/children/replacestandardaddress_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>Communications</name>
       <dependency>
         <name>dependency</name>
-        <entityName>Communication_entity</entityName>
-        <fieldName>AllCommunications</fieldName>
+        <entityName>Address_entity</entityName>
+        <fieldName>ContactAddresses</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>Communications</name>
       <children>
         <entityParameter>
           <name>ContactId_param</name>
@@ -210,29 +205,29 @@
           <valueProcess>%aditoprj%/entity/Person_entity/entityfields/communications/children/contactsmaincountry_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Communication_entity</entityName>
+        <fieldName>AllCommunications</fieldName>
+      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>Organisations</name>
       <selectionMode>SINGLE</selectionMode>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Organisation_entity</entityName>
-        <fieldName>WithPersonIdFilter</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ExcludeOrganisationsByPersonId</name>
           <valueProcess>%aditoprj%/entity/Person_entity/entityfields/organisations/children/excludeorganisationsbypersonid/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>Contracts</name>
       <dependency>
         <name>dependency</name>
-        <entityName>Contract_entity</entityName>
-        <fieldName>Contracts</fieldName>
+        <entityName>Organisation_entity</entityName>
+        <fieldName>WithPersonIdFilter</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>Contracts</name>
       <children>
         <entityParameter>
           <name>ContactId_param</name>
@@ -241,16 +236,16 @@
           <mandatory v="true" />
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Contract_entity</entityName>
+        <fieldName>Contracts</fieldName>
+      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>Pricelists</name>
       <state>AUTO</state>
       <stateProcess>%aditoprj%/entity/Person_entity/entityfields/pricelists/stateProcess.js</stateProcess>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Productprice_entity</entityName>
-        <fieldName>Productprices</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContactId_param</name>
@@ -259,6 +254,11 @@
           <mandatory v="true" />
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Productprice_entity</entityName>
+        <fieldName>Productprices</fieldName>
+      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>Genders</name>
@@ -313,11 +313,6 @@
     <entityConsumer>
       <name>Documents</name>
       <selectionMode>MULTI</selectionMode>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Document_entity</entityName>
-        <fieldName>Documents</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>AssignmentRowId_param</name>
@@ -332,6 +327,11 @@
           <valueProcess>%aditoprj%/entity/Person_entity/entityfields/documents/children/disallowcreate_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Document_entity</entityName>
+        <fieldName>Documents</fieldName>
+      </dependency>
     </entityConsumer>
     <entityParameter>
       <name>ContactId_param</name>
@@ -356,14 +356,6 @@
       <name>Contact</name>
       <documentation>%aditoprj%/entity/Person_entity/entityfields/contact/documentation.adoc</documentation>
       <recordContainer>db</recordContainer>
-      <dependencies>
-        <entityDependency>
-          <name>f925c8e6-b096-4093-bd39-c9cd30a6a71a</name>
-          <entityName>Lead_entity</entityName>
-          <fieldName>ContactId</fieldName>
-          <isConsumer v="false" />
-        </entityDependency>
-      </dependencies>
       <children>
         <entityParameter>
           <name>OrgId_param</name>
@@ -391,16 +383,19 @@
           <expose v="false" />
         </entityParameter>
       </children>
+      <dependencies>
+        <entityDependency>
+          <name>f925c8e6-b096-4093-bd39-c9cd30a6a71a</name>
+          <entityName>Lead_entity</entityName>
+          <fieldName>ContactId</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+      </dependencies>
     </entityProvider>
     <entityConsumer>
       <name>OrgAddresses</name>
       <state>READONLY</state>
       <stateProcess>%aditoprj%/entity/Person_entity/entityfields/orgaddresses/stateProcess.js</stateProcess>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Address_entity</entityName>
-        <fieldName>OrganisationAddressesByContact</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContactId_param</name>
@@ -412,6 +407,11 @@
           <valueProcess>%aditoprj%/entity/Person_entity/entityfields/orgaddresses/children/defaultaddressid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Address_entity</entityName>
+        <fieldName>OrganisationAddressesByContact</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>STANDARD_EMAIL_COMMUNICATION</name>
@@ -428,11 +428,6 @@
     <entityConsumer>
       <name>PhoneCommunications</name>
       <description>Used for standard communication</description>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Communication_entity</entityName>
-        <fieldName>PhoneCommunications</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContactId_param</name>
@@ -442,15 +437,15 @@
                         Usually this is used for filtering COMMUNICATION-entries by a specified contact or creating a new entry that is related to a contact.</description>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>EmailCommunications</name>
-      <description>Used for standard communication</description>
       <dependency>
         <name>dependency</name>
         <entityName>Communication_entity</entityName>
-        <fieldName>EmailCommunications</fieldName>
+        <fieldName>PhoneCommunications</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>EmailCommunications</name>
+      <description>Used for standard communication</description>
       <children>
         <entityParameter>
           <name>ContactId_param</name>
@@ -460,6 +455,11 @@
                         Usually this is used for filtering COMMUNICATION-entries by a specified contact or creating a new entry that is related to a contact.</description>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Communication_entity</entityName>
+        <fieldName>EmailCommunications</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>ADDRESS_ID</name>
@@ -471,11 +471,6 @@
     </entityField>
     <entityConsumer>
       <name>KeywordGenders</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>KeywordEntry_entity</entityName>
-        <fieldName>SpecificContainerKeywords</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
@@ -483,6 +478,11 @@
           <expose v="false" />
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>SpecificContainerKeywords</fieldName>
+      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>Languages</name>
@@ -494,40 +494,35 @@
     </entityConsumer>
     <entityConsumer>
       <name>Offers</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Offer_entity</entityName>
-        <fieldName>ContactOffers</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContactId_param</name>
           <valueProcess>%aditoprj%/entity/Person_entity/entityfields/offers/children/contactid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>Salutations</name>
       <dependency>
         <name>dependency</name>
-        <entityName>SalutationDistinct_entity</entityName>
-        <fieldName>Salutations</fieldName>
+        <entityName>Offer_entity</entityName>
+        <fieldName>ContactOffers</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>Salutations</name>
       <children>
         <entityParameter>
           <name>Language_param</name>
           <valueProcess>%aditoprj%/entity/Person_entity/entityfields/salutations/children/language_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>SalutationDistinct_entity</entityName>
+        <fieldName>Salutations</fieldName>
+      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>Attributes</name>
       <onValidation>%aditoprj%/entity/Person_entity/entityfields/attributes/onValidation.js</onValidation>
-      <dependency>
-        <name>dependency</name>
-        <entityName>AttributeRelation_entity</entityName>
-        <fieldName>AttributeRelations</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ObjectRowId_param</name>
@@ -542,14 +537,14 @@
           <valueProcess>%aditoprj%/entity/Person_entity/entityfields/attributes/children/showdsgvomessage_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>SalutationTitles</name>
       <dependency>
         <name>dependency</name>
-        <entityName>SalutationTitleDistinct_entity</entityName>
-        <fieldName>SalutationTitles</fieldName>
+        <entityName>AttributeRelation_entity</entityName>
+        <fieldName>AttributeRelations</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>SalutationTitles</name>
       <children>
         <entityParameter>
           <name>Salutation_param</name>
@@ -560,15 +555,15 @@
           <valueProcess>%aditoprj%/entity/Person_entity/entityfields/salutationtitles/children/language_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>SalutationTitleDistinct_entity</entityName>
+        <fieldName>SalutationTitles</fieldName>
+      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>Tasks</name>
       <state>EDITABLE</state>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Task_entity</entityName>
-        <fieldName>Tasks</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>RowId_param</name>
@@ -583,14 +578,14 @@
           <valueProcess>%aditoprj%/entity/Person_entity/entityfields/tasks/children/presetlinks_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>ObjectTrees</name>
       <dependency>
         <name>dependency</name>
-        <entityName>ObjectTree_entity</entityName>
-        <fieldName>TreeProvider</fieldName>
+        <entityName>Task_entity</entityName>
+        <fieldName>Tasks</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>ObjectTrees</name>
       <children>
         <entityParameter>
           <name>ObjectIds_param</name>
@@ -601,6 +596,11 @@
           <valueProcess>%aditoprj%/entity/Person_entity/entityfields/objecttrees/children/objecttypes_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>ObjectTree_entity</entityName>
+        <fieldName>TreeProvider</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>STATUS</name>
@@ -612,25 +612,20 @@
     </entityField>
     <entityConsumer>
       <name>KeywordContactStates</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>KeywordEntry_entity</entityName>
-        <fieldName>SpecificContainerKeywords</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
           <valueProcess>%aditoprj%/entity/Person_entity/entityfields/keywordcontactstates/children/containername_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>ContactAndOrganisationAddresses</name>
       <dependency>
         <name>dependency</name>
-        <entityName>Address_entity</entityName>
-        <fieldName>OrganisationAndContactAddresses</fieldName>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>SpecificContainerKeywords</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>ContactAndOrganisationAddresses</name>
       <children>
         <entityParameter>
           <name>ContactId_param</name>
@@ -641,6 +636,11 @@
           <valueProcess>%aditoprj%/entity/Person_entity/entityfields/contactandorganisationaddresses/children/organisationid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Address_entity</entityName>
+        <fieldName>OrganisationAndContactAddresses</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>DEPARTMENT</name>
@@ -663,11 +663,6 @@
     </entityField>
     <entityConsumer>
       <name>LogHistories</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>LogHistory_entity</entityName>
-        <fieldName>LogHistoryProvider</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>tablenames_param</name>
@@ -676,14 +671,14 @@
           <mandatory v="true" />
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>OtherContacts</name>
       <dependency>
         <name>dependency</name>
-        <entityName>Contact_entity</entityName>
-        <fieldName>PersonsContactsExceptOwn</fieldName>
+        <entityName>LogHistory_entity</entityName>
+        <fieldName>LogHistoryProvider</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>OtherContacts</name>
       <children>
         <entityParameter>
           <name>OwnContactId_param</name>
@@ -694,6 +689,11 @@
           <valueProcess>%aditoprj%/entity/Person_entity/entityfields/othercontacts/children/languagekey_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Contact_entity</entityName>
+        <fieldName>PersonsContactsExceptOwn</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>ORGANISATION_NAME</name>
@@ -706,20 +706,6 @@
     <entityProvider>
       <name>Contacts</name>
       <documentation>%aditoprj%/entity/Person_entity/entityfields/contacts/documentation.adoc</documentation>
-      <dependencies>
-        <entityDependency>
-          <name>c98da62f-d6b2-4ddb-9101-92e9a60abdfb</name>
-          <entityName>VisitPlanEmployeeWeek_entity</entityName>
-          <fieldName>Persons</fieldName>
-          <isConsumer v="false" />
-        </entityDependency>
-        <entityDependency>
-          <name>f56b1378-138d-4f88-b9df-274adce9f90c</name>
-          <entityName>VisitPlanEntry_entity</entityName>
-          <fieldName>Persons</fieldName>
-          <isConsumer v="false" />
-        </entityDependency>
-      </dependencies>
       <children>
         <entityParameter>
           <name>ContactId_param</name>
@@ -746,14 +732,23 @@
           <expose v="false" />
         </entityParameter>
       </children>
+      <dependencies>
+        <entityDependency>
+          <name>c98da62f-d6b2-4ddb-9101-92e9a60abdfb</name>
+          <entityName>VisitPlanEmployeeWeek_entity</entityName>
+          <fieldName>Persons</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+        <entityDependency>
+          <name>f56b1378-138d-4f88-b9df-274adce9f90c</name>
+          <entityName>VisitPlanEntry_entity</entityName>
+          <fieldName>Persons</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+      </dependencies>
     </entityProvider>
     <entityConsumer>
       <name>360DegreeObjects</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>360Degree_entity</entityName>
-        <fieldName>PersonObjects</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ObjectRowId_param</name>
@@ -764,14 +759,14 @@
           <valueProcess>%aditoprj%/entity/Person_entity/entityfields/360degreeobjects/children/objectstatus_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>AttributeTree</name>
       <dependency>
         <name>dependency</name>
-        <entityName>AttributeRelation_entity</entityName>
-        <fieldName>TreeProvider</fieldName>
+        <entityName>360Degree_entity</entityName>
+        <fieldName>PersonObjects</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>AttributeTree</name>
       <children>
         <entityParameter>
           <name>ObjectRowId_param</name>
@@ -786,6 +781,11 @@
           <valueProcess>%aditoprj%/entity/Person_entity/entityfields/attributetree/children/showdsgvomessage_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>AttributeRelation_entity</entityName>
+        <fieldName>TreeProvider</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>DATE_NEW</name>
@@ -845,40 +845,35 @@
     </entityParameter>
     <entityConsumer>
       <name>CommRestrictions</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>CommRestriction_Entity</entityName>
-        <fieldName>CommRestrictions</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContactId_param</name>
           <valueProcess>%aditoprj%/entity/Person_entity/entityfields/commrestrictions/children/contactid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>CommRestriction_Entity</entityName>
+        <fieldName>CommRestrictions</fieldName>
+      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>DSGVOEntries</name>
       <stateProcess>%aditoprj%/entity/Person_entity/entityfields/dsgvoentries/stateProcess.js</stateProcess>
-      <dependency>
-        <name>dependency</name>
-        <entityName>DSGVO_entity</entityName>
-        <fieldName>#PROVIDER</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContactId_param</name>
           <valueProcess>%aditoprj%/entity/Person_entity/entityfields/dsgvoentries/children/contactid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>Appointments</name>
       <dependency>
         <name>dependency</name>
-        <entityName>Appointment_entity</entityName>
-        <fieldName>LinkedAppointments</fieldName>
+        <entityName>DSGVO_entity</entityName>
+        <fieldName>#PROVIDER</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>Appointments</name>
       <children>
         <entityParameter>
           <name>LinkedObjectId_param</name>
@@ -889,6 +884,11 @@
           <valueProcess>%aditoprj%/entity/Person_entity/entityfields/appointments/children/erroronpermissiondenied/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Appointment_entity</entityName>
+        <fieldName>LinkedAppointments</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>OpenTasks</name>
@@ -925,11 +925,6 @@
     </entityField>
     <entityConsumer>
       <name>SelfDuplicatesUncached</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Person_entity</entityName>
-        <fieldName>SelfDuplicates</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>DuplicateActionsControl_param</name>
@@ -948,6 +943,11 @@
           <valueProcess>%aditoprj%/entity/Person_entity/entityfields/selfduplicatesuncached/children/excludedcontactids_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Person_entity</entityName>
+        <fieldName>SelfDuplicates</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>LEAD_LEADID</name>
@@ -978,14 +978,6 @@
       <name>QuickEntryContacts</name>
       <documentation>%aditoprj%/entity/Person_entity/entityfields/quickentrycontacts/documentation.adoc</documentation>
       <titlePlural>Additional Contacts</titlePlural>
-      <dependencies>
-        <entityDependency>
-          <name>6d137850-63ba-4be0-9ca5-1464e71d4f77</name>
-          <entityName>QuickEntry_entity</entityName>
-          <fieldName>Contacts</fieldName>
-          <isConsumer v="false" />
-        </entityDependency>
-      </dependencies>
       <children>
         <entityParameter>
           <name>ContactId_param</name>
@@ -1008,6 +1000,14 @@
           <expose v="false" />
         </entityParameter>
       </children>
+      <dependencies>
+        <entityDependency>
+          <name>6d137850-63ba-4be0-9ca5-1464e71d4f77</name>
+          <entityName>QuickEntry_entity</entityName>
+          <fieldName>Contacts</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+      </dependencies>
     </entityProvider>
     <entityActionField>
       <name>openEditDefaultsView</name>
@@ -1254,14 +1254,6 @@
     <entityProvider>
       <name>IdFilteredActiveContacts</name>
       <documentation>%aditoprj%/entity/Person_entity/entityfields/idfilteredactivecontacts/documentation.adoc</documentation>
-      <dependencies>
-        <entityDependency>
-          <name>511f3e4c-7493-4a31-a136-0ba80ba2ec85</name>
-          <entityName>Member_entity</entityName>
-          <fieldName>Contacts</fieldName>
-          <isConsumer v="false" />
-        </entityDependency>
-      </dependencies>
       <children>
         <entityParameter>
           <name>ExcludedContactIds_param</name>
@@ -1296,6 +1288,14 @@
           <expose v="false" />
         </entityParameter>
       </children>
+      <dependencies>
+        <entityDependency>
+          <name>511f3e4c-7493-4a31-a136-0ba80ba2ec85</name>
+          <entityName>Member_entity</entityName>
+          <fieldName>Contacts</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+      </dependencies>
     </entityProvider>
     <entityField>
       <name>COUNT</name>
@@ -1330,29 +1330,21 @@
       <name>Districts</name>
       <state>INVISIBLE</state>
       <stateProcess>%aditoprj%/entity/Person_entity/entityfields/districts/stateProcess.js</stateProcess>
-      <dependency>
-        <name>dependency</name>
-        <entityName>District_entity</entityName>
-        <fieldName>ResponsibleDistricts</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>DistrictsByContactId_param</name>
           <valueProcess>%aditoprj%/entity/Person_entity/entityfields/districts/children/districtsbycontactid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>District_entity</entityName>
+        <fieldName>ResponsibleDistricts</fieldName>
+      </dependency>
     </entityConsumer>
     <entityProvider>
       <name>NonselfDuplicates</name>
       <documentation>%aditoprj%/entity/Person_entity/entityfields/nonselfduplicates/documentation.adoc</documentation>
-      <dependencies>
-        <entityDependency>
-          <name>3a4352e2-9686-4c52-9d01-dbfad8c68ea7</name>
-          <entityName>Duplicates_entity</entityName>
-          <fieldName>DuplicatePersonsConsumer</fieldName>
-          <isConsumer v="false" />
-        </entityDependency>
-      </dependencies>
       <children>
         <entityParameter>
           <name>ContactId_param</name>
@@ -1375,22 +1367,45 @@
           <expose v="false" />
         </entityParameter>
       </children>
+      <dependencies>
+        <entityDependency>
+          <name>3a4352e2-9686-4c52-9d01-dbfad8c68ea7</name>
+          <entityName>Duplicates_entity</entityName>
+          <fieldName>DuplicatePersonsConsumer</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+      </dependencies>
     </entityProvider>
     <entityConsumer>
       <name>DistrictResponsibles</name>
       <state>INVISIBLE</state>
       <stateProcess>%aditoprj%/entity/Person_entity/entityfields/districtresponsibles/stateProcess.js</stateProcess>
+      <children>
+        <entityParameter>
+          <name>OrgUid_param</name>
+          <valueProcess>%aditoprj%/entity/Person_entity/entityfields/districtresponsibles/children/orguid_param/valueProcess.js</valueProcess>
+        </entityParameter>
+      </children>
       <dependency>
         <name>dependency</name>
         <entityName>DistrictResponsible_entity</entityName>
         <fieldName>OrganisationResponsibles</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>Orders</name>
+      <documentation>%aditoprj%/entity/Person_entity/entityfields/orders/documentation.adoc</documentation>
       <children>
         <entityParameter>
-          <name>OrgUid_param</name>
-          <valueProcess>%aditoprj%/entity/Person_entity/entityfields/districtresponsibles/children/orguid_param/valueProcess.js</valueProcess>
+          <name>ContactId_param</name>
+          <valueProcess>%aditoprj%/entity/Person_entity/entityfields/orders/children/contactid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Order_entity</entityName>
+        <fieldName>#PROVIDER</fieldName>
+      </dependency>
     </entityConsumer>
   </entityFields>
   <recordContainers>
diff --git a/entity/Person_entity/entityfields/orders/children/contactid_param/valueProcess.js b/entity/Person_entity/entityfields/orders/children/contactid_param/valueProcess.js
new file mode 100644
index 00000000000..7b6137b4d10
--- /dev/null
+++ b/entity/Person_entity/entityfields/orders/children/contactid_param/valueProcess.js
@@ -0,0 +1,4 @@
+import("system.vars");
+import("system.result");
+
+result.string(vars.get("$field.CONTACTID"));
\ No newline at end of file
diff --git a/entity/Person_entity/entityfields/orders/documentation.adoc b/entity/Person_entity/entityfields/orders/documentation.adoc
new file mode 100644
index 00000000000..cadb57b42a5
--- /dev/null
+++ b/entity/Person_entity/entityfields/orders/documentation.adoc
@@ -0,0 +1 @@
+Consumer for loading a contacts related Orders. This is for example used to verify if the Person-row can be deleted.
\ No newline at end of file
diff --git a/entity/Person_entity/grantDeleteProcess.js b/entity/Person_entity/grantDeleteProcess.js
index 876b00bdb6a..8ef35b97760 100644
--- a/entity/Person_entity/grantDeleteProcess.js
+++ b/entity/Person_entity/grantDeleteProcess.js
@@ -29,7 +29,7 @@ if(personCount == 1)
         .andNoEntityRows("Contract_entity", "Contracts", {ContactId_param : contactId}) //Contracts
         .andNoEntityRows("ObjectTree_entity", "TreeProvider", {ObjectIds_param : JSON.stringify([contactId, vars.get("$field.PERSON_ID")]), ObjectTypes_param : JSON.stringify([currentContext, "PrivatePerson"])})
         .andNoEntityRows("CampaignParticipant_entity", "CampaignParticipantsProvider", {ContactId_param : contactId})
-        .andNoEntityRows("Order_entity", "OrderProvider", {ContactId_param : contactId})
+        .andNoEntityRows("Order_entity", "Orders", {ContactId_param : contactId})
         .validate();
 }
 else if (personCount == 0) //special case in QuickEntry where it should be possible to remove a new Person that is not saved in the db yet
-- 
GitLab


From 0c26711d5501b639f9aaa5e7cd83a1c546cf8325 Mon Sep 17 00:00:00 2001
From: "j.goderbauer" <j.goderbauer@adito.de>
Date: Fri, 27 Nov 2020 13:36:49 +0100
Subject: [PATCH 118/184] [Projekt: Entwicklung - xRM][TicketNr.:
 1066209][weiteres Vorgehen nach Dublettenerkennung bei Firmenanlage]

---
 entity/Organisation_entity/Organisation_entity.aod | 7 +++++++
 entity/Person_entity/Person_entity.aod             | 7 +++++++
 2 files changed, 14 insertions(+)

diff --git a/entity/Organisation_entity/Organisation_entity.aod b/entity/Organisation_entity/Organisation_entity.aod
index 6d472e1ac8a..dbf97ba2d22 100644
--- a/entity/Organisation_entity/Organisation_entity.aod
+++ b/entity/Organisation_entity/Organisation_entity.aod
@@ -1053,6 +1053,8 @@
           <name>IntegrateSelectedIntoCurrentAction</name>
           <title>Integrate selected into current contact</title>
           <onActionProcess>%aditoprj%/entity/Organisation_entity/entityfields/duplicateactions/children/integrateselectedintocurrentaction/onActionProcess.js</onActionProcess>
+          <isMenuAction v="true" />
+          <isObjectAction v="false" />
           <isSelectionAction v="true" />
           <iconId>NEON:IMPORT</iconId>
           <stateProcess>%aditoprj%/entity/Organisation_entity/entityfields/duplicateactions/children/integrateselectedintocurrentaction/stateProcess.js</stateProcess>
@@ -1061,6 +1063,8 @@
           <name>IntegrateCurrentIntoSelectedAction</name>
           <title>Integrate current into selected contact</title>
           <onActionProcess>%aditoprj%/entity/Organisation_entity/entityfields/duplicateactions/children/integratecurrentintoselectedaction/onActionProcess.js</onActionProcess>
+          <isMenuAction v="true" />
+          <isObjectAction v="false" />
           <isSelectionAction v="true" />
           <iconId>NEON:EXPORT</iconId>
           <stateProcess>%aditoprj%/entity/Organisation_entity/entityfields/duplicateactions/children/integratecurrentintoselectedaction/stateProcess.js</stateProcess>
@@ -1069,6 +1073,8 @@
           <name>IgnoreDuplicate</name>
           <title>Ignore Duplicate</title>
           <onActionProcess>%aditoprj%/entity/Organisation_entity/entityfields/duplicateactions/children/ignoreduplicate/onActionProcess.js</onActionProcess>
+          <isMenuAction v="true" />
+          <isObjectAction v="false" />
           <isSelectionAction v="true" />
           <iconId>VAADIN:CLOSE</iconId>
           <stateProcess>%aditoprj%/entity/Organisation_entity/entityfields/duplicateactions/children/ignoreduplicate/stateProcess.js</stateProcess>
@@ -1077,6 +1083,7 @@
           <name>IgnoreWholeCluster</name>
           <title>Ignore whole Cluster</title>
           <onActionProcess>%aditoprj%/entity/Organisation_entity/entityfields/duplicateactions/children/ignorewholecluster/onActionProcess.js</onActionProcess>
+          <isObjectAction v="false" />
           <iconId>VAADIN:CLOSE</iconId>
           <stateProcess>%aditoprj%/entity/Organisation_entity/entityfields/duplicateactions/children/ignorewholecluster/stateProcess.js</stateProcess>
         </entityActionField>
diff --git a/entity/Person_entity/Person_entity.aod b/entity/Person_entity/Person_entity.aod
index 0c5b240aad1..92985df6633 100644
--- a/entity/Person_entity/Person_entity.aod
+++ b/entity/Person_entity/Person_entity.aod
@@ -1120,6 +1120,8 @@
           <name>IntegrateSelectedIntoCurrentAction</name>
           <title>Integrate selected into current contact</title>
           <onActionProcess>%aditoprj%/entity/Person_entity/entityfields/duplicateactions/children/integrateselectedintocurrentaction/onActionProcess.js</onActionProcess>
+          <isMenuAction v="true" />
+          <isObjectAction v="false" />
           <isSelectionAction v="true" />
           <iconId>NEON:IMPORT</iconId>
           <stateProcess>%aditoprj%/entity/Person_entity/entityfields/duplicateactions/children/integrateselectedintocurrentaction/stateProcess.js</stateProcess>
@@ -1128,6 +1130,8 @@
           <name>IntegrateCurrentIntoSelectedAction</name>
           <title>Integrate current into selected contact</title>
           <onActionProcess>%aditoprj%/entity/Person_entity/entityfields/duplicateactions/children/integratecurrentintoselectedaction/onActionProcess.js</onActionProcess>
+          <isMenuAction v="true" />
+          <isObjectAction v="false" />
           <isSelectionAction v="true" />
           <iconId>NEON:EXPORT</iconId>
           <stateProcess>%aditoprj%/entity/Person_entity/entityfields/duplicateactions/children/integratecurrentintoselectedaction/stateProcess.js</stateProcess>
@@ -1136,6 +1140,8 @@
           <name>IgnoreDuplicate</name>
           <title>Ignore Duplicate</title>
           <onActionProcess>%aditoprj%/entity/Person_entity/entityfields/duplicateactions/children/ignoreduplicate/onActionProcess.js</onActionProcess>
+          <isMenuAction v="true" />
+          <isObjectAction v="false" />
           <isSelectionAction v="true" />
           <iconId>VAADIN:CLOSE</iconId>
           <stateProcess>%aditoprj%/entity/Person_entity/entityfields/duplicateactions/children/ignoreduplicate/stateProcess.js</stateProcess>
@@ -1144,6 +1150,7 @@
           <name>IgnoreWholeCluster</name>
           <title>Ignore whole cluster</title>
           <onActionProcess>%aditoprj%/entity/Person_entity/entityfields/duplicateactions/children/ignorewholecluster/onActionProcess.js</onActionProcess>
+          <isObjectAction v="false" />
           <iconId>VAADIN:CLOSE</iconId>
           <stateProcess>%aditoprj%/entity/Person_entity/entityfields/duplicateactions/children/ignorewholecluster/stateProcess.js</stateProcess>
         </entityActionField>
-- 
GitLab


From fb01665aab3c74960c8b66493c230243f5788367 Mon Sep 17 00:00:00 2001
From: "j.goderbauer" <j.goderbauer@adito.de>
Date: Fri, 27 Nov 2020 13:46:40 +0100
Subject: [PATCH 119/184] Organisation: fix: Indexquery did not work

---
 entity/Organisation_entity/recordcontainers/index/query.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/entity/Organisation_entity/recordcontainers/index/query.js b/entity/Organisation_entity/recordcontainers/index/query.js
index ee0f4bb6cea..7ccddd82379 100644
--- a/entity/Organisation_entity/recordcontainers/index/query.js
+++ b/entity/Organisation_entity/recordcontainers/index/query.js
@@ -39,7 +39,7 @@ var querySelect = newSelect([
         "ADDRESS.CITY",
         "standardEmail.ADDR",
         "standardPhone.ADDR",
-        sqlHelper.conconcatWithSeparatorcat([sqlHelper.concatWithSeparator(["standardAddress.ADDRESS", "standardAddress.BUILDINGNO"])
+        sqlHelper.concatWithSeparatorcat([sqlHelper.concatWithSeparator(["standardAddress.ADDRESS", "standardAddress.BUILDINGNO"])
             ,sqlHelper.concatWithSeparator(["standardAddress.COUNTRY", "standardAddress.ZIP", "standardAddress.CITY"])
         ], " - ")
     ])
-- 
GitLab


From 66f8aac045ff9bad051b8f9a4da4a747cb38e063 Mon Sep 17 00:00:00 2001
From: "j.goderbauer" <j.goderbauer@adito.de>
Date: Fri, 27 Nov 2020 14:01:21 +0100
Subject: [PATCH 120/184] Organisation: fix: Indexquery did not work 2

---
 entity/Organisation_entity/recordcontainers/index/query.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/entity/Organisation_entity/recordcontainers/index/query.js b/entity/Organisation_entity/recordcontainers/index/query.js
index 7ccddd82379..e26250598ed 100644
--- a/entity/Organisation_entity/recordcontainers/index/query.js
+++ b/entity/Organisation_entity/recordcontainers/index/query.js
@@ -39,7 +39,7 @@ var querySelect = newSelect([
         "ADDRESS.CITY",
         "standardEmail.ADDR",
         "standardPhone.ADDR",
-        sqlHelper.concatWithSeparatorcat([sqlHelper.concatWithSeparator(["standardAddress.ADDRESS", "standardAddress.BUILDINGNO"])
+        sqlHelper.concatWithSeparator([sqlHelper.concatWithSeparator(["standardAddress.ADDRESS", "standardAddress.BUILDINGNO"])
             ,sqlHelper.concatWithSeparator(["standardAddress.COUNTRY", "standardAddress.ZIP", "standardAddress.CITY"])
         ], " - ")
     ])
-- 
GitLab


From 14e1f79d1ccc4a71b33503e1dd18a0ae1a146bfb Mon Sep 17 00:00:00 2001
From: "j.goderbauer" <j.goderbauer@adito.de>
Date: Fri, 27 Nov 2020 14:18:51 +0100
Subject: [PATCH 121/184] =?UTF-8?q?[Projekt:=20Entwicklung=20-=20xRM][Tick?=
 =?UTF-8?q?etNr.:=201068165][Kontakt=20kann=20nicht=20gel=C3=B6scht=20werd?=
 =?UTF-8?q?en]?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 entity/Person_entity/grantDeleteProcess.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/entity/Person_entity/grantDeleteProcess.js b/entity/Person_entity/grantDeleteProcess.js
index 8ef35b97760..36866c88c8b 100644
--- a/entity/Person_entity/grantDeleteProcess.js
+++ b/entity/Person_entity/grantDeleteProcess.js
@@ -29,7 +29,7 @@ if(personCount == 1)
         .andNoEntityRows("Contract_entity", "Contracts", {ContactId_param : contactId}) //Contracts
         .andNoEntityRows("ObjectTree_entity", "TreeProvider", {ObjectIds_param : JSON.stringify([contactId, vars.get("$field.PERSON_ID")]), ObjectTypes_param : JSON.stringify([currentContext, "PrivatePerson"])})
         .andNoEntityRows("CampaignParticipant_entity", "CampaignParticipantsProvider", {ContactId_param : contactId})
-        .andNoEntityRows("Order_entity", "Orders", {ContactId_param : contactId})
+        .andNoEntityRows("Order_entity", "#PROVIDER", {ContactId_param : contactId})
         .validate();
 }
 else if (personCount == 0) //special case in QuickEntry where it should be possible to remove a new Person that is not saved in the db yet
-- 
GitLab


From 69313e3efe8b3653aad3cc482ed57754595433d9 Mon Sep 17 00:00:00 2001
From: Benjamin Ulrich <b.ulrich@adito.de>
Date: Fri, 27 Nov 2020 14:08:46 +0000
Subject: [PATCH 122/184] =?UTF-8?q?[Projekt:=20Entwicklung=20-=20xRM][Tick?=
 =?UTF-8?q?etNr.:=201069300][Klassifizierung=20update=20wird=20nicht=20gep?=
 =?UTF-8?q?aged=20und=20"-"=20wird=20gespeichert=20f=C3=BCr=20Firmen=20ohn?=
 =?UTF-8?q?e=20Klassifizierungen]?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../recordcontainers/jdito/contentProcess.js  |  9 ++++++-
 .../recordcontainers/db/onDBInsert.js         |  4 ---
 .../recordcontainers/db/onDBInsert.js         |  6 -----
 process/ClassificationFilter_lib/process.js   | 18 ++++++++++---
 .../process.js                                | 27 +++++++------------
 5 files changed, 32 insertions(+), 32 deletions(-)

diff --git a/entity/Classification_entity/recordcontainers/jdito/contentProcess.js b/entity/Classification_entity/recordcontainers/jdito/contentProcess.js
index 78879bee925..9af7e2ab58b 100644
--- a/entity/Classification_entity/recordcontainers/jdito/contentProcess.js
+++ b/entity/Classification_entity/recordcontainers/jdito/contentProcess.js
@@ -161,5 +161,12 @@ function _updateScore()
     var values = [calculatedClassification];
 
     if(storedClassification[1] != undefined && calculatedClassification != storedClassification[1]) //Update the stored classification if the freshly calculated one differs
-        newWhere("CLASSIFICATIONSTORAGE.CLASSIFICATIONSTORAGEID", storedClassification[0]).updateData(true, table, columns, null, values);
+    {
+    newWhere("CLASSIFICATIONSTORAGE.CLASSIFICATIONSTORAGEID", storedClassification[0]).updateData(true, table, columns, null, values);
+    }
+    else if(storedClassification[1] == undefined) //insert if no classificationstorage exists yet
+    {
+        db.insertData(table, ["CLASSIFICATIONSTORAGEID", "CLASSIFICATIONVALUE", "OBJECT_ROWID", "OBJECT_TYPE"], null, 
+                                [util.getNewUUID(), calculatedClassification, objectRowIdParam, objectTypeParam])
+    }
 }
\ No newline at end of file
diff --git a/entity/Organisation_entity/recordcontainers/db/onDBInsert.js b/entity/Organisation_entity/recordcontainers/db/onDBInsert.js
index 434601a60b8..87c54eb133a 100644
--- a/entity/Organisation_entity/recordcontainers/db/onDBInsert.js
+++ b/entity/Organisation_entity/recordcontainers/db/onDBInsert.js
@@ -1,13 +1,9 @@
 import("system.vars");
-import("Classification_lib");
 import("Workflow_lib");
 
-
 var uid = vars.get("$sys.uid");
 var contextname = vars.get("$sys.currentcontextname");
 
-ClassificationUtils.insertEmptyClassification(uid, contextname);
-
 //start the execution in afterOperatingState, because here the dataset is not yet inserted
 vars.set("$context.workflowQueue", {});
 WorkflowSignalSender.inserted();
\ No newline at end of file
diff --git a/entity/Salesproject_entity/recordcontainers/db/onDBInsert.js b/entity/Salesproject_entity/recordcontainers/db/onDBInsert.js
index 38fe9698031..ac292d8633e 100644
--- a/entity/Salesproject_entity/recordcontainers/db/onDBInsert.js
+++ b/entity/Salesproject_entity/recordcontainers/db/onDBInsert.js
@@ -1,4 +1,3 @@
-import("Classification_lib");
 import("Workflow_lib");
 import("Context_lib");
 import("Attribute_lib");
@@ -17,11 +16,6 @@ if (vars.get("$field.PROJECTTYPE"))
         .insertAttribute(vars.get("$field.PROJECTTYPE"), true);
 }
 
-var salesprojectId = vars.get("$field.SALESPROJECTID");
-var contextname = vars.get("$sys.currentcontextname");
-
-ClassificationUtils.insertEmptyClassification(salesprojectId, contextname);
-
 //start the execution in afterOperatingState, because here the dataset is not yet inserted
 vars.set("$context.workflowQueue", {});
 WorkflowSignalSender.inserted();
\ No newline at end of file
diff --git a/process/ClassificationFilter_lib/process.js b/process/ClassificationFilter_lib/process.js
index e2200e6e6e8..bf593e70773 100644
--- a/process/ClassificationFilter_lib/process.js
+++ b/process/ClassificationFilter_lib/process.js
@@ -239,8 +239,15 @@ ClassificationGroupFilterUtils.getFilterFields = function(pObjectType)
     classificationGroups.forEach(function(classificationGroup, idx){
         var classificationGroupId = classificationGroup["CLASSIFICATIONGROUPID"];
         var classificationGroupTitle = classificationGroup["#CONTENTTITLE"];
-        
-        var representingSqlExpression = sqlHelper.substring("CLASSIFICATIONVALUE", idx+1, 1);
+
+        //"case when" needed since we want to group both the ones that have no classification for said classificationgroup ("-") 
+        //and the ones that have null as the value (since not all datasets have a CLASSIFICATIONSTORAGE dataset) together
+        // since both don't have an classification for that group
+        var representingSqlExpression = SqlBuilder.caseWhen(newWhere("CLASSIFICATIONSTORAGE.CLASSIFICATIONVALUE is null"))
+                                                            .thenString("-")
+                                                            .elseValue(sqlHelper.substring("CLASSIFICATIONVALUE", idx+1, 1))
+                                                            .toString();
+                                                            
         var name = ClassificationGroupFilterNameCoder.encode(classificationGroupId, representingSqlExpression);
         res.push({
             name: name,
@@ -318,7 +325,12 @@ ClassificationGroupFilterUtils.getFilterCondition = function(pObjectType, pFilte
 {
     var decodedFilterName = ClassificationGroupFilterNameCoder.decode(pFilterName);
     var condition = StringUtils.replaceAll(pCondition, pColumnPlaceholder, decodedFilterName.representingSqlExpression);
-            
+    
+    //"case when" needed since we want to filter both the ones that have no classification for said classificationgroup ("-") 
+    //and the ones that have null as the value (since not all datasets have a CLASSIFICATIONSTORAGE dataset) the same way
+    // since both don't have an classification for that group
+    if(pOperatorName == "IS NULL")
+        condition += " OR " + decodedFilterName.representingSqlExpression +"='-'";
     return condition;
 };
 
diff --git a/process/updateClassifications_serverProcess/process.js b/process/updateClassifications_serverProcess/process.js
index 22f452a82db..5520e0170e2 100644
--- a/process/updateClassifications_serverProcess/process.js
+++ b/process/updateClassifications_serverProcess/process.js
@@ -111,23 +111,7 @@ for (i = 0; i < objectTypes.length; i++) //update for each object_type
     }
     
     //this is the "upgrade" part of this process:
-    //first: insert default values into the records that have no entries 
-    idsWithoutStoredClassification = newSelect(currentObjectColumn)
-        .from(currentObjectTable)
-        .where(currentObjectColumn, newSelect("CLASSIFICATIONSTORAGE.OBJECT_ROWID").from("CLASSIFICATIONSTORAGE").where("CLASSIFICATIONSTORAGE.OBJECT_TYPE", objectTypes[i]), SqlBuilder.NOT_IN())
-                                                                        
-    if(isOrganisation)
-    {
-        idsWithoutStoredClassification.and("CONTACT.PERSON_ID is null")
-                .and("CONTACT.ORGANISATION_ID", OrgUtils.getPrivateOrganisationId(), SqlBuilder.NOT_EQUAL());
-    }
-        
-    idsWithoutStoredClassification = idsWithoutStoredClassification.arrayColumn();
-
-    if(idsWithoutStoredClassification)
-        ClassificationUtils.insertEmptyClassification(idsWithoutStoredClassification, objectTypes[i]);
-    
-    //second: update all entries with correct classificaiton values
+    //update all entries with correct classificaiton values
     
     //all groups of the objectType in the correct order, needed later to also add the "-" gradings if no classificationType has been set under that group
     orderedGroups = newSelect("distinct CLASSIFICATIONGROUP.CLASSIFICATIONGROUPID, CLASSIFICATIONGROUP.SORTING")
@@ -206,7 +190,14 @@ for (i = 0; i < objectTypes.length; i++) //update for each object_type
         cond = newWhere("CLASSIFICATIONSTORAGE.OBJECT_ROWID", row_Id)
             .and("CLASSIFICATIONSTORAGE.OBJECT_TYPE", objectTypes[i])
             .and("CLASSIFICATIONSTORAGE.CLASSIFICATIONVALUE", chainedGrading, SqlBuilder.NOT_EQUAL());
-        var count = Number(cond.updateData(true, table, column, null, [chainedGrading]));
+        if(new RegExp("^-+$").test(chainedGrading) == true || chainedGrading == "-")
+        {
+            count = newWhere("CLASSIFICATIONSTORAGE.OBJECT_ROWID", row_Id).deleteData(true, "CLASSIFICATIONSTORAGE");
+        }
+        else
+        {
+            count = Number(cond.updateData(true, table, column, null, [chainedGrading]));
+        }
         if (count > 0)
         {
             outputInformation[objectTypes[i]].updatedElements += count;
-- 
GitLab


From 1ea4108e5caabaf53ae95b3834e8fe312fb40e2c Mon Sep 17 00:00:00 2001
From: Sebastian Listl <s.listl@adito.de>
Date: Fri, 27 Nov 2020 16:15:33 +0100
Subject: [PATCH 123/184] Newsletter workflow

---
 .../Data_alias/basic/2020.2.2/changelog.xml   |  1 +
 .../2020.2.2/insert_newsletterAttribute.xml   | 33 +++++++++++++++++
 .../synchronizedocuments/onActionProcess.js   |  2 +-
 .../MSTeamsDocument_entity.aod                | 35 ++++++++-----------
 .../importdocuments/onActionProcess.js}       |  8 ++---
 .../recordcontainers/jdito/contentProcess.js  |  9 -----
 process/Workflow_lib/process.js               | 10 ++++--
 7 files changed, 61 insertions(+), 37 deletions(-)
 create mode 100644 .liquibase/Data_alias/basic/2020.2.2/insert_newsletterAttribute.xml
 rename entity/MSTeamsDocument_entity/{recordcontainers/jdito/onInsert.js => entityfields/importdocuments/onActionProcess.js} (75%)
 delete mode 100644 entity/MSTeamsDocument_entity/recordcontainers/jdito/contentProcess.js

diff --git a/.liquibase/Data_alias/basic/2020.2.2/changelog.xml b/.liquibase/Data_alias/basic/2020.2.2/changelog.xml
index 052c3a8db2d..7f5016480e9 100644
--- a/.liquibase/Data_alias/basic/2020.2.2/changelog.xml
+++ b/.liquibase/Data_alias/basic/2020.2.2/changelog.xml
@@ -5,4 +5,5 @@
     <include relativeToChangelogFile="true" file="Knowledgemanagement/changelog_knowledgeManagement.xml"/>
     <include relativeToChangelogFile="true" file="insert_employeeCountAttribute.xml"/>
     <include relativeToChangelogFile="true" file="MSTeams/changelog.xml"/>
+    <include relativeToChangelogFile="true" file="insert_newsletterAttribute.xml"/>
 </databaseChangeLog>
diff --git a/.liquibase/Data_alias/basic/2020.2.2/insert_newsletterAttribute.xml b/.liquibase/Data_alias/basic/2020.2.2/insert_newsletterAttribute.xml
new file mode 100644
index 00000000000..af877f23248
--- /dev/null
+++ b/.liquibase/Data_alias/basic/2020.2.2/insert_newsletterAttribute.xml
@@ -0,0 +1,33 @@
+<?xml version="1.1" encoding="UTF-8" standalone="no"?>
+<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd">
+  <changeSet author="s.listl" id="4b285b34-29bc-4446-8d95-37cfcff7bd58">
+      <insert tableName="AB_ATTRIBUTE">
+          <column name="AB_ATTRIBUTEID" value="cf985906-b4f9-443e-9d7b-edbeb60ca463"/>
+          <column name="ATTRIBUTE_NAME" value="Marketing"/>
+          <column name="ATTRIBUTE_TYPE" value="GROUP"/>
+          <column name="ATTRIBUTE_ACTIVE" valueNumeric="1"/>
+      </insert>
+      <insert tableName="AB_ATTRIBUTE">
+          <column name="AB_ATTRIBUTEID" value="e196975c-6cfd-46dc-9cb2-053893ec2faa"/>
+          <column name="ATTRIBUTE_PARENT_ID" value="cf985906-b4f9-443e-9d7b-edbeb60ca463"/>
+          <column name="ATTRIBUTE_NAME" value="Newsletter"/>
+          <column name="ATTRIBUTE_TYPE" value="BOOLEAN"/>
+          <column name="ATTRIBUTE_ACTIVE" valueNumeric="1"/>
+          <column name="SORTING" valueNumeric="0"/>
+      </insert>
+      <insert tableName="AB_ATTRIBUTEUSAGE">
+          <column name="AB_ATTRIBUTEUSAGEID" value="e9842896-628c-4c80-a0ef-811f35b8ae51"/>
+          <column name="AB_ATTRIBUTE_ID" value="cf985906-b4f9-443e-9d7b-edbeb60ca463"/>
+          <column name="OBJECT_TYPE" value="Person"/>
+          <column name="MAX_COUNT" valueNumeric="1"/>
+      </insert>
+      <insert tableName="AB_ATTRIBUTEUSAGE">
+          <column name="AB_ATTRIBUTEUSAGEID" value="fc594860-76c5-4acb-9758-44ea1a1db5d0"/>
+          <column name="AB_ATTRIBUTE_ID" value="e196975c-6cfd-46dc-9cb2-053893ec2faa"/>
+          <column name="OBJECT_TYPE" value="Person"/>
+          <column name="MAX_COUNT" valueNumeric="1"/>
+      </insert>
+  </changeSet>
+</databaseChangeLog>
\ No newline at end of file
diff --git a/entity/Document_entity/entityfields/msteam/children/synchronizedocuments/onActionProcess.js b/entity/Document_entity/entityfields/msteam/children/synchronizedocuments/onActionProcess.js
index 2d871492297..841ff10b184 100644
--- a/entity/Document_entity/entityfields/msteam/children/synchronizedocuments/onActionProcess.js
+++ b/entity/Document_entity/entityfields/msteam/children/synchronizedocuments/onActionProcess.js
@@ -1,7 +1,7 @@
 import("system.neon");
 import("system.vars");
 
-neon.openContext("MSTTeamDocument", null, null, neon.OPERATINGSTATE_NEW, {
+neon.openContext("MSTTeamsDocument", "MSTeamsDocumentEdit_view", null, neon.OPERATINGSTATE_VIEW, {
     "MSTTeamId_param" : vars.get("$param.MSTTeamId_param"),
     "ObjectRowId_param" : vars.get("$param.AssignmentRowId_param"),
     "AssignmentName_param" : vars.get("$param.AssignmentName_param"),
diff --git a/entity/MSTeamsDocument_entity/MSTeamsDocument_entity.aod b/entity/MSTeamsDocument_entity/MSTeamsDocument_entity.aod
index 9929c440ae7..ac694130ae5 100644
--- a/entity/MSTeamsDocument_entity/MSTeamsDocument_entity.aod
+++ b/entity/MSTeamsDocument_entity/MSTeamsDocument_entity.aod
@@ -4,7 +4,6 @@
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <documentation>%aditoprj%/entity/MSTeamsDocument_entity/documentation.adoc</documentation>
   <siblings />
-  <recordContainer>jdito</recordContainer>
   <entityFields>
     <entityProvider>
       <name>#PROVIDER</name>
@@ -14,12 +13,14 @@
       <title>Documents</title>
       <dropDownProcess>%aditoprj%/entity/MSTeamsDocument_entity/entityfields/documents/dropDownProcess.js</dropDownProcess>
       <selectionMode>MULTI</selectionMode>
+      <state>EDITABLE</state>
     </entityField>
     <entityField>
       <name>CHANNEL</name>
       <title>Channel</title>
       <consumer>Channels</consumer>
       <mandatory v="true" />
+      <state>EDITABLE</state>
     </entityField>
     <entityParameter>
       <name>ObjectRowId_param</name>
@@ -38,17 +39,17 @@
     </entityParameter>
     <entityConsumer>
       <name>Channels</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>MSTeamsChannel_entity</entityName>
-        <fieldName>ChannelsByName</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>TeamId_param</name>
           <valueProcess>%aditoprj%/entity/MSTeamsDocument_entity/entityfields/channels/children/teamid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>MSTeamsChannel_entity</entityName>
+        <fieldName>ChannelsByName</fieldName>
+      </dependency>
     </entityConsumer>
     <entityParameter>
       <name>MSTTeamId_param</name>
@@ -59,21 +60,15 @@
       <name>#PROVIDER_AGGREGATES</name>
       <useAggregates v="true" />
     </entityProvider>
+    <entityActionField>
+      <name>importDocuments</name>
+      <onActionProcess>%aditoprj%/entity/MSTeamsDocument_entity/entityfields/importdocuments/onActionProcess.js</onActionProcess>
+    </entityActionField>
   </entityFields>
   <recordContainers>
-    <jDitoRecordContainer>
-      <name>jdito</name>
-      <jDitoRecordAlias>Data_alias</jDitoRecordAlias>
-      <contentProcess>%aditoprj%/entity/MSTeamsDocument_entity/recordcontainers/jdito/contentProcess.js</contentProcess>
-      <onInsert>%aditoprj%/entity/MSTeamsDocument_entity/recordcontainers/jdito/onInsert.js</onInsert>
-      <recordFieldMappings>
-        <jDitoRecordFieldMapping>
-          <name>UID.value</name>
-        </jDitoRecordFieldMapping>
-        <jDitoRecordFieldMapping>
-          <name>DOCUMENTS.value</name>
-        </jDitoRecordFieldMapping>
-      </recordFieldMappings>
-    </jDitoRecordContainer>
+    <datalessRecordContainer>
+      <name>dataless</name>
+      <alias>Data_alias</alias>
+    </datalessRecordContainer>
   </recordContainers>
 </entity>
diff --git a/entity/MSTeamsDocument_entity/recordcontainers/jdito/onInsert.js b/entity/MSTeamsDocument_entity/entityfields/importdocuments/onActionProcess.js
similarity index 75%
rename from entity/MSTeamsDocument_entity/recordcontainers/jdito/onInsert.js
rename to entity/MSTeamsDocument_entity/entityfields/importdocuments/onActionProcess.js
index d97ac448ef7..7237c6c01de 100644
--- a/entity/MSTeamsDocument_entity/recordcontainers/jdito/onInsert.js
+++ b/entity/MSTeamsDocument_entity/entityfields/importdocuments/onActionProcess.js
@@ -9,7 +9,7 @@ import("system.logging");
 import("system.neon");
 
 var rowData = vars.get("$local.rowdata");
-var documents = text.decodeMS(rowData["DOCUMENTS.value"]);
+var documents = text.decodeMS(vars.get("$field.DOCUMENTS"));
 
 documents.forEach(function (document)
 {
@@ -20,8 +20,8 @@ documents.forEach(function (document)
     var assignmentName = vars.get("$param.AssignmentName_param");
     var assignmentRowId = vars.get("$param.ObjectRowId_param");
     var alias = SqlUtils.getBinariesAlias();
-
-    var uid = db.insertBinary(assignmentTable, assignmentName, assignmentRowId, null, 
-            file, documentName, "", "", alias, util.getNewUUID());    
+    
+    db.insertBinary(assignmentTable, assignmentName, assignmentRowId, null, 
+        file, documentName, "", "", alias, util.getNewUUID());    
 });
 
diff --git a/entity/MSTeamsDocument_entity/recordcontainers/jdito/contentProcess.js b/entity/MSTeamsDocument_entity/recordcontainers/jdito/contentProcess.js
deleted file mode 100644
index af9ece7caa7..00000000000
--- a/entity/MSTeamsDocument_entity/recordcontainers/jdito/contentProcess.js
+++ /dev/null
@@ -1,9 +0,0 @@
-import("system.result");
-import("system.vars");
-
-//TODO: This dummy implementation shouldn't be nescessary here. Remove this process eventually. #1051003
-var rows = [];
-if (vars.get("$local.idvalues"))
-    rows = vars.get("$local.idvalues").map(function (id) {return [id, ""];});
-
-result.object(rows);
\ No newline at end of file
diff --git a/process/Workflow_lib/process.js b/process/Workflow_lib/process.js
index 05730801196..375b30cc066 100644
--- a/process/Workflow_lib/process.js
+++ b/process/Workflow_lib/process.js
@@ -633,7 +633,7 @@ WorkflowLinkActions.types.RECEIVE_TASK.execute = function (pParameters)
 {
     if (!pParameters.processInstanceId)
         return;
-    workflow.triggerReceiveTask(pParameters.processInstanceId, pParameters.receiveTask || null);
+    workflow.triggerReceiveTask(pParameters.processInstanceId, pParameters.receiveTask || null, pParameters.variables || null);
 }
 
 /**
@@ -643,7 +643,7 @@ WorkflowLinkActions.types.SIGNAL.execute = function (pParameters)
 {
     if (!pParameters.signal)
         return;
-    workflow.signalEventReceived(pParameters.signal);
+    workflow.signalEventReceived(pParameters.signal, pParameters.variables || null);
 }
 
 /**
@@ -653,7 +653,7 @@ WorkflowLinkActions.types.MESSAGE.execute = function (pParameters)
 {
     if (!pParameters.processInstanceId || !pParameters.message)
         return;
-    workflow.messageEventReceived(pParameters.message, pParameters.processInstanceId);
+    workflow.messageEventReceived(pParameters.message, pParameters.processInstanceId, pParameters.variables || null);
 }
 
 /**
@@ -679,6 +679,8 @@ WorkflowLinkActions.encodeAction = function (pType, pLink, pParams)
         actionObj.ms = pParams.message;
     if (pParams.receiveTask)
         actionObj.re = pParams.receiveTask;
+    if (pParams.variables)
+        actionObj.v = pParams.variables;
     actionObj.ty = pType;
     actionObj.ln = pLink;
     
@@ -721,6 +723,8 @@ WorkflowLinkActions.parseAction = function (pEncodedAction)
         actionParams.message = parsedAction.ms;
     if (parsedAction.re)
         actionParams.receiveTask = parsedAction.re;
+    if (parsedAction.v)
+        actionParams.variables = parsedAction.v;
     
     return {
         type: parsedAction.ty || null,
-- 
GitLab


From d07fcdaa113e48934f42715ee39c14077d1508a3 Mon Sep 17 00:00:00 2001
From: Dianne Nowack <d.nowack@adito.de>
Date: Mon, 30 Nov 2020 09:57:49 +0000
Subject: [PATCH 124/184] Update valueProcess.js

---
 entity/Task_entity/entityfields/priority/valueProcess.js | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/entity/Task_entity/entityfields/priority/valueProcess.js b/entity/Task_entity/entityfields/priority/valueProcess.js
index 0639e8287e8..ee23436dbb5 100644
--- a/entity/Task_entity/entityfields/priority/valueProcess.js
+++ b/entity/Task_entity/entityfields/priority/valueProcess.js
@@ -4,5 +4,7 @@ import("system.neon");
 import("system.vars");
 import("KeywordRegistry_basic");
 
-if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW)
+if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && vars.get("$this.value") == null)
+{
     result.string($KeywordRegistry.taskPriority$low());
+}
\ No newline at end of file
-- 
GitLab


From a55b9500e9ee6d7b40cb7ba0f3e3cd0f849da59e Mon Sep 17 00:00:00 2001
From: "j.goderbauer" <j.goderbauer@adito.de>
Date: Mon, 30 Nov 2020 13:27:56 +0100
Subject: [PATCH 125/184] Fix several ScanServices

---
 .../SalesprojectMilestone_entity.aod          |  34 ++--
 .../SalesprojectSource_entity.aod             |  16 +-
 .../_____LANGUAGE_EXTRA.aod                   | 183 ++++++++++++++++++
 .../_____LANGUAGE_de/_____LANGUAGE_de.aod     | 180 +++++++++++++++++
 .../_____LANGUAGE_en/_____LANGUAGE_en.aod     | 183 ++++++++++++++++++
 5 files changed, 566 insertions(+), 30 deletions(-)

diff --git a/entity/SalesprojectMilestone_entity/SalesprojectMilestone_entity.aod b/entity/SalesprojectMilestone_entity/SalesprojectMilestone_entity.aod
index c420a5c09b4..8da44d60205 100644
--- a/entity/SalesprojectMilestone_entity/SalesprojectMilestone_entity.aod
+++ b/entity/SalesprojectMilestone_entity/SalesprojectMilestone_entity.aod
@@ -60,10 +60,6 @@
       <name>SalesprojectMilestones</name>
       <recordContainer>db</recordContainer>
       <children>
-        <entityParameter>
-          <name>ObjectRowId_param</name>
-          <expose v="true" />
-        </entityParameter>
         <entityParameter>
           <name>Kind_param</name>
           <expose v="false" />
@@ -77,17 +73,17 @@
     </entityField>
     <entityConsumer>
       <name>Keywords</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>KeywordEntry_entity</entityName>
-        <fieldName>SpecificContainerKeywords</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
           <valueProcess>%aditoprj%/entity/SalesprojectMilestone_entity/entityfields/keywords/children/containername_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>SpecificContainerKeywords</fieldName>
+      </dependency>
     </entityConsumer>
     <entityParameter>
       <name>Kind_param</name>
@@ -96,6 +92,12 @@
     </entityParameter>
     <entityProvider>
       <name>StateMilestones</name>
+      <children>
+        <entityParameter>
+          <name>Kind_param</name>
+          <valueProcess>%aditoprj%/entity/SalesprojectMilestone_entity/entityfields/statemilestones/children/kind_param/valueProcess.js</valueProcess>
+        </entityParameter>
+      </children>
       <dependencies>
         <entityDependency>
           <name>f705534d-dcf3-4049-a1ea-3f75e93aa2f0</name>
@@ -104,15 +106,15 @@
           <isConsumer v="false" />
         </entityDependency>
       </dependencies>
+    </entityProvider>
+    <entityProvider>
+      <name>PhaseMilestones</name>
       <children>
         <entityParameter>
           <name>Kind_param</name>
-          <valueProcess>%aditoprj%/entity/SalesprojectMilestone_entity/entityfields/statemilestones/children/kind_param/valueProcess.js</valueProcess>
+          <valueProcess>%aditoprj%/entity/SalesprojectMilestone_entity/entityfields/phasemilestones/children/kind_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityProvider>
-    <entityProvider>
-      <name>PhaseMilestones</name>
       <dependencies>
         <entityDependency>
           <name>b132527b-990c-416a-b2d6-ddbe6f4397e2</name>
@@ -121,12 +123,6 @@
           <isConsumer v="false" />
         </entityDependency>
       </dependencies>
-      <children>
-        <entityParameter>
-          <name>Kind_param</name>
-          <valueProcess>%aditoprj%/entity/SalesprojectMilestone_entity/entityfields/phasemilestones/children/kind_param/valueProcess.js</valueProcess>
-        </entityParameter>
-      </children>
     </entityProvider>
     <entityConsumer>
       <name>SalesProjectPhases</name>
diff --git a/entity/SalesprojectSource_entity/SalesprojectSource_entity.aod b/entity/SalesprojectSource_entity/SalesprojectSource_entity.aod
index 7e2e4769fec..4effdbc2cea 100644
--- a/entity/SalesprojectSource_entity/SalesprojectSource_entity.aod
+++ b/entity/SalesprojectSource_entity/SalesprojectSource_entity.aod
@@ -22,12 +22,6 @@
           <isConsumer v="false" />
         </entityDependency>
       </dependencies>
-      <children>
-        <entityParameter>
-          <name>ObjectRowId_param</name>
-          <expose v="true" />
-        </entityParameter>
-      </children>
     </entityProvider>
     <entityParameter>
       <name>SalesprojectId_param</name>
@@ -61,11 +55,6 @@
     </entityField>
     <entityConsumer>
       <name>KeywordSources</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>KeywordEntry_entity</entityName>
-        <fieldName>SpecificContainerKeywords</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
@@ -73,6 +62,11 @@
           <expose v="false" />
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>SpecificContainerKeywords</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>INFO</name>
diff --git a/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod b/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod
index 38af80580f7..6e143f7c08f 100644
--- a/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod
+++ b/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod
@@ -7383,6 +7383,189 @@
     <entry>
       <key>Channels</key>
     </entry>
+    <entry>
+      <key>Private</key>
+    </entry>
+    <entry>
+      <key>Rechnungsbetrag</key>
+    </entry>
+    <entry>
+      <key>[TEST] Sql_lib - SqlMaskingUtils</key>
+    </entry>
+    <entry>
+      <key>Knowledgebase</key>
+    </entry>
+    <entry>
+      <key>Marketing workflow</key>
+    </entry>
+    <entry>
+      <key>Token</key>
+    </entry>
+    <entry>
+      <key>Edited by</key>
+    </entry>
+    <entry>
+      <key>Sales Project Analyses</key>
+    </entry>
+    <entry>
+      <key>Sales Project Id</key>
+    </entry>
+    <entry>
+      <key>Sales Project Convertion Rates</key>
+    </entry>
+    <entry>
+      <key>Set Campaign Step</key>
+    </entry>
+    <entry>
+      <key>Member</key>
+    </entry>
+    <entry>
+      <key>Tags</key>
+    </entry>
+    <entry>
+      <key>[TEST] Sql_lib - SqlBuilder</key>
+    </entry>
+    <entry>
+      <key>Feed</key>
+    </entry>
+    <entry>
+      <key>[TEST] KeywordAttribute_lib</key>
+    </entry>
+    <entry>
+      <key>Messages</key>
+    </entry>
+    <entry>
+      <key>Channel Name</key>
+    </entry>
+    <entry>
+      <key>Sales Project Phases</key>
+    </entry>
+    <entry>
+      <key>Start workflows</key>
+    </entry>
+    <entry>
+      <key>edited</key>
+    </entry>
+    <entry>
+      <key>Channel</key>
+    </entry>
+    <entry>
+      <key>Import from Teams</key>
+    </entry>
+    <entry>
+      <key>Invitation</key>
+    </entry>
+    <entry>
+      <key>send as mail</key>
+    </entry>
+    <entry>
+      <key>User token</key>
+    </entry>
+    <entry>
+      <key>Team name</key>
+    </entry>
+    <entry>
+      <key>Knowledge Roles</key>
+    </entry>
+    <entry>
+      <key>Valid</key>
+    </entry>
+    <entry>
+      <key>Audit Logs</key>
+    </entry>
+    <entry>
+      <key>Editorial</key>
+    </entry>
+    <entry>
+      <key>KnowledgeRoles</key>
+    </entry>
+    <entry>
+      <key>Remove from Campaign</key>
+    </entry>
+    <entry>
+      <key>Message</key>
+    </entry>
+    <entry>
+      <key>Add members</key>
+    </entry>
+    <entry>
+      <key>[TEST] .All</key>
+    </entry>
+    <entry>
+      <key>Newsfeed (Complete Article)</key>
+    </entry>
+    <entry>
+      <key>Notification</key>
+    </entry>
+    <entry>
+      <key>Load older messages</key>
+    </entry>
+    <entry>
+      <key>Newsletter</key>
+    </entry>
+    <entry>
+      <key>Adds an answer to the selected discussion</key>
+    </entry>
+    <entry>
+      <key>LinkedIn (Person)</key>
+    </entry>
+    <entry>
+      <key>Newsfeed Timeline</key>
+    </entry>
+    <entry>
+      <key>MS Teams</key>
+    </entry>
+    <entry>
+      <key>User tokens</key>
+    </entry>
+    <entry>
+      <key>[TEST] Keyword_lib</key>
+    </entry>
+    <entry>
+      <key>News</key>
+    </entry>
+    <entry>
+      <key>Sales Projects</key>
+    </entry>
+    <entry>
+      <key>Team</key>
+    </entry>
+    <entry>
+      <key>Created by</key>
+    </entry>
+    <entry>
+      <key>Employee count</key>
+    </entry>
+    <entry>
+      <key>Toggles the status of  selected discussion between open and closed</key>
+    </entry>
+    <entry>
+      <key>Synchronize documents</key>
+    </entry>
+    <entry>
+      <key>AuditLogs</key>
+    </entry>
+    <entry>
+      <key>Audit Log</key>
+    </entry>
+    <entry>
+      <key>Admin</key>
+    </entry>
+    <entry>
+      <key>Show all audits</key>
+    </entry>
+    <entry>
+      <key>Sales Project milestone Id</key>
+    </entry>
+    <entry>
+      <key>LinkedIn (Organisation)</key>
+    </entry>
+    <entry>
+      <key>[TEST] UnitTest_lib</key>
+    </entry>
+    <entry>
+      <key>Exports the knowledge entry as a html file</key>
+    </entry>
   </keyValueMap>
   <font name="Dialog" style="0" size="11" />
   <sqlModels>
diff --git a/language/_____LANGUAGE_de/_____LANGUAGE_de.aod b/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
index 566c1d1c162..2c2348c9da0 100644
--- a/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
+++ b/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
@@ -9800,6 +9800,186 @@ Bitte Datumseingabe prüfen</value>
       <key>#login</key>
       <value>Login Token</value>
     </entry>
+    <entry>
+      <key>Rechnungsbetrag</key>
+    </entry>
+    <entry>
+      <key>[TEST] Sql_lib - SqlMaskingUtils</key>
+    </entry>
+    <entry>
+      <key>Knowledgebase</key>
+    </entry>
+    <entry>
+      <key>Marketing workflow</key>
+    </entry>
+    <entry>
+      <key>Token</key>
+    </entry>
+    <entry>
+      <key>Edited by</key>
+    </entry>
+    <entry>
+      <key>Sales Project Analyses</key>
+    </entry>
+    <entry>
+      <key>Sales Project Id</key>
+    </entry>
+    <entry>
+      <key>Sales Project Convertion Rates</key>
+    </entry>
+    <entry>
+      <key>Set Campaign Step</key>
+    </entry>
+    <entry>
+      <key>Member</key>
+    </entry>
+    <entry>
+      <key>Tags</key>
+    </entry>
+    <entry>
+      <key>[TEST] Sql_lib - SqlBuilder</key>
+    </entry>
+    <entry>
+      <key>Feed</key>
+    </entry>
+    <entry>
+      <key>[TEST] KeywordAttribute_lib</key>
+    </entry>
+    <entry>
+      <key>Messages</key>
+    </entry>
+    <entry>
+      <key>Channel Name</key>
+    </entry>
+    <entry>
+      <key>Sales Project Phases</key>
+    </entry>
+    <entry>
+      <key>Start workflows</key>
+    </entry>
+    <entry>
+      <key>edited</key>
+    </entry>
+    <entry>
+      <key>Channel</key>
+    </entry>
+    <entry>
+      <key>Import from Teams</key>
+    </entry>
+    <entry>
+      <key>Invitation</key>
+    </entry>
+    <entry>
+      <key>send as mail</key>
+    </entry>
+    <entry>
+      <key>User token</key>
+    </entry>
+    <entry>
+      <key>Team name</key>
+    </entry>
+    <entry>
+      <key>Knowledge Roles</key>
+    </entry>
+    <entry>
+      <key>Valid</key>
+    </entry>
+    <entry>
+      <key>Audit Logs</key>
+    </entry>
+    <entry>
+      <key>Editorial</key>
+    </entry>
+    <entry>
+      <key>KnowledgeRoles</key>
+    </entry>
+    <entry>
+      <key>Remove from Campaign</key>
+    </entry>
+    <entry>
+      <key>Message</key>
+    </entry>
+    <entry>
+      <key>Add members</key>
+    </entry>
+    <entry>
+      <key>[TEST] .All</key>
+    </entry>
+    <entry>
+      <key>Newsfeed (Complete Article)</key>
+    </entry>
+    <entry>
+      <key>Notification</key>
+    </entry>
+    <entry>
+      <key>Load older messages</key>
+    </entry>
+    <entry>
+      <key>Newsletter</key>
+    </entry>
+    <entry>
+      <key>Adds an answer to the selected discussion</key>
+    </entry>
+    <entry>
+      <key>LinkedIn (Person)</key>
+    </entry>
+    <entry>
+      <key>Newsfeed Timeline</key>
+    </entry>
+    <entry>
+      <key>MS Teams</key>
+    </entry>
+    <entry>
+      <key>User tokens</key>
+    </entry>
+    <entry>
+      <key>[TEST] Keyword_lib</key>
+    </entry>
+    <entry>
+      <key>News</key>
+    </entry>
+    <entry>
+      <key>Sales Projects</key>
+    </entry>
+    <entry>
+      <key>Team</key>
+    </entry>
+    <entry>
+      <key>Created by</key>
+    </entry>
+    <entry>
+      <key>Employee count</key>
+    </entry>
+    <entry>
+      <key>Toggles the status of  selected discussion between open and closed</key>
+    </entry>
+    <entry>
+      <key>Synchronize documents</key>
+    </entry>
+    <entry>
+      <key>AuditLogs</key>
+    </entry>
+    <entry>
+      <key>Audit Log</key>
+    </entry>
+    <entry>
+      <key>Admin</key>
+    </entry>
+    <entry>
+      <key>Show all audits</key>
+    </entry>
+    <entry>
+      <key>Sales Project milestone Id</key>
+    </entry>
+    <entry>
+      <key>LinkedIn (Organisation)</key>
+    </entry>
+    <entry>
+      <key>[TEST] UnitTest_lib</key>
+    </entry>
+    <entry>
+      <key>Exports the knowledge entry as a html file</key>
+    </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 e7cf1824f14..867c0450057 100644
--- a/language/_____LANGUAGE_en/_____LANGUAGE_en.aod
+++ b/language/_____LANGUAGE_en/_____LANGUAGE_en.aod
@@ -7464,6 +7464,189 @@
     <entry>
       <key>Channels</key>
     </entry>
+    <entry>
+      <key>Private</key>
+    </entry>
+    <entry>
+      <key>Rechnungsbetrag</key>
+    </entry>
+    <entry>
+      <key>[TEST] Sql_lib - SqlMaskingUtils</key>
+    </entry>
+    <entry>
+      <key>Knowledgebase</key>
+    </entry>
+    <entry>
+      <key>Marketing workflow</key>
+    </entry>
+    <entry>
+      <key>Token</key>
+    </entry>
+    <entry>
+      <key>Edited by</key>
+    </entry>
+    <entry>
+      <key>Sales Project Analyses</key>
+    </entry>
+    <entry>
+      <key>Sales Project Id</key>
+    </entry>
+    <entry>
+      <key>Sales Project Convertion Rates</key>
+    </entry>
+    <entry>
+      <key>Set Campaign Step</key>
+    </entry>
+    <entry>
+      <key>Member</key>
+    </entry>
+    <entry>
+      <key>Tags</key>
+    </entry>
+    <entry>
+      <key>[TEST] Sql_lib - SqlBuilder</key>
+    </entry>
+    <entry>
+      <key>Feed</key>
+    </entry>
+    <entry>
+      <key>[TEST] KeywordAttribute_lib</key>
+    </entry>
+    <entry>
+      <key>Messages</key>
+    </entry>
+    <entry>
+      <key>Channel Name</key>
+    </entry>
+    <entry>
+      <key>Sales Project Phases</key>
+    </entry>
+    <entry>
+      <key>Start workflows</key>
+    </entry>
+    <entry>
+      <key>edited</key>
+    </entry>
+    <entry>
+      <key>Channel</key>
+    </entry>
+    <entry>
+      <key>Import from Teams</key>
+    </entry>
+    <entry>
+      <key>Invitation</key>
+    </entry>
+    <entry>
+      <key>send as mail</key>
+    </entry>
+    <entry>
+      <key>User token</key>
+    </entry>
+    <entry>
+      <key>Team name</key>
+    </entry>
+    <entry>
+      <key>Knowledge Roles</key>
+    </entry>
+    <entry>
+      <key>Valid</key>
+    </entry>
+    <entry>
+      <key>Audit Logs</key>
+    </entry>
+    <entry>
+      <key>Editorial</key>
+    </entry>
+    <entry>
+      <key>KnowledgeRoles</key>
+    </entry>
+    <entry>
+      <key>Remove from Campaign</key>
+    </entry>
+    <entry>
+      <key>Message</key>
+    </entry>
+    <entry>
+      <key>Add members</key>
+    </entry>
+    <entry>
+      <key>[TEST] .All</key>
+    </entry>
+    <entry>
+      <key>Newsfeed (Complete Article)</key>
+    </entry>
+    <entry>
+      <key>Notification</key>
+    </entry>
+    <entry>
+      <key>Load older messages</key>
+    </entry>
+    <entry>
+      <key>Newsletter</key>
+    </entry>
+    <entry>
+      <key>Adds an answer to the selected discussion</key>
+    </entry>
+    <entry>
+      <key>LinkedIn (Person)</key>
+    </entry>
+    <entry>
+      <key>Newsfeed Timeline</key>
+    </entry>
+    <entry>
+      <key>MS Teams</key>
+    </entry>
+    <entry>
+      <key>User tokens</key>
+    </entry>
+    <entry>
+      <key>[TEST] Keyword_lib</key>
+    </entry>
+    <entry>
+      <key>News</key>
+    </entry>
+    <entry>
+      <key>Sales Projects</key>
+    </entry>
+    <entry>
+      <key>Team</key>
+    </entry>
+    <entry>
+      <key>Created by</key>
+    </entry>
+    <entry>
+      <key>Employee count</key>
+    </entry>
+    <entry>
+      <key>Toggles the status of  selected discussion between open and closed</key>
+    </entry>
+    <entry>
+      <key>Synchronize documents</key>
+    </entry>
+    <entry>
+      <key>AuditLogs</key>
+    </entry>
+    <entry>
+      <key>Audit Log</key>
+    </entry>
+    <entry>
+      <key>Admin</key>
+    </entry>
+    <entry>
+      <key>Show all audits</key>
+    </entry>
+    <entry>
+      <key>Sales Project milestone Id</key>
+    </entry>
+    <entry>
+      <key>LinkedIn (Organisation)</key>
+    </entry>
+    <entry>
+      <key>[TEST] UnitTest_lib</key>
+    </entry>
+    <entry>
+      <key>Exports the knowledge entry as a html file</key>
+    </entry>
   </keyValueMap>
   <font name="Dialog" style="0" size="11" />
 </language>
-- 
GitLab


From bab14c9e61835ec1d63ac290ef733697d79c5568 Mon Sep 17 00:00:00 2001
From: "a.schindlbeck" <a.schindlbeck@adito.de>
Date: Mon, 30 Nov 2020 16:18:18 +0100
Subject: [PATCH 126/184] #1067434 Notifications: Subcategory added

---
 .../create_asys_notificationcontents.xml      |  1 +
 .../_____SYSTEMALIAS/_____SYSTEMALIAS.aod     | 14 ++++++++++
 .../Notification_entity.aod                   | 26 +++++++++++++------
 .../NotificationFilter_view.aod               | 11 +++++++-
 4 files changed, 43 insertions(+), 9 deletions(-)

diff --git a/.liquibase/_____SYSTEMALIAS/basic/init/struct/create_asys_notificationcontents.xml b/.liquibase/_____SYSTEMALIAS/basic/init/struct/create_asys_notificationcontents.xml
index fb1ae2f5ee8..448a4c3063e 100644
--- a/.liquibase/_____SYSTEMALIAS/basic/init/struct/create_asys_notificationcontents.xml
+++ b/.liquibase/_____SYSTEMALIAS/basic/init/struct/create_asys_notificationcontents.xml
@@ -17,6 +17,7 @@
         <column name="RECIPIENTUSERIDS" type="CLOB"/>
         <column name="TYPECODE" type="VARCHAR(63)"/>
         <column name="VERSION" type="INTEGER"/>
+        <column name="SUBCATEGORY" type="VARCHAR(256)"/>
     </createTable>
     
     <createIndex indexName="idx_asysnoticontents_contid" tableName="ASYS_NOTIFICATIONCONTENTS">
diff --git a/aliasDefinition/_____SYSTEMALIAS/_____SYSTEMALIAS.aod b/aliasDefinition/_____SYSTEMALIAS/_____SYSTEMALIAS.aod
index 6f4f1b2dca5..9eaa60af5ab 100644
--- a/aliasDefinition/_____SYSTEMALIAS/_____SYSTEMALIAS.aod
+++ b/aliasDefinition/_____SYSTEMALIAS/_____SYSTEMALIAS.aod
@@ -1707,6 +1707,20 @@
                 <title></title>
                 <description></description>
               </entityFieldDb>
+              <entityFieldDb>
+                <name>SUBCATEGORY</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="12" />
+                <size v="256" />
+                <scale v="0" />
+                <notNull v="true" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
             </entityFields>
           </entityDb>
           <entityDb>
diff --git a/entity/Notification_entity/Notification_entity.aod b/entity/Notification_entity/Notification_entity.aod
index cf3203213ac..2668a0419e9 100644
--- a/entity/Notification_entity/Notification_entity.aod
+++ b/entity/Notification_entity/Notification_entity.aod
@@ -132,31 +132,31 @@
     </entityField>
     <entityConsumer>
       <name>StateKeywords</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>KeywordEntry_entity</entityName>
-        <fieldName>#PROVIDER</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
           <valueProcess>%aditoprj%/entity/Notification_entity/entityfields/statekeywords/children/containername_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>PrioKeywords</name>
       <dependency>
         <name>dependency</name>
         <entityName>KeywordEntry_entity</entityName>
         <fieldName>#PROVIDER</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>PrioKeywords</name>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
           <valueProcess>%aditoprj%/entity/Notification_entity/entityfields/priokeywords/children/containername_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>#PROVIDER</fieldName>
+      </dependency>
     </entityConsumer>
     <entityProvider>
       <name>#PROVIDER_AGGREGATES</name>
@@ -170,6 +170,10 @@
       <outputFormat>dd.MM.yyyy</outputFormat>
       <inputFormat>dd.MM.yyyy</inputFormat>
     </entityField>
+    <entityField>
+      <name>SUBCATEGORY</name>
+      <title>Subcategory</title>
+    </entityField>
   </entityFields>
   <recordContainers>
     <dbRecordContainer>
@@ -281,6 +285,12 @@
           <name>CREATEDAY.value</name>
           <recordfield>ASYS_NOTIFICATIONCONTENTS.CREATEDATE</recordfield>
         </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>SUBCATEGORY.value</name>
+          <recordfield>ASYS_NOTIFICATIONCONTENTS.SUBCATEGORY</recordfield>
+          <isFilterable v="true" />
+          <isLookupFilter v="true" />
+        </dbRecordFieldMapping>
       </recordFieldMappings>
     </dbRecordContainer>
   </recordContainers>
diff --git a/neonView/NotificationFilter_view/NotificationFilter_view.aod b/neonView/NotificationFilter_view/NotificationFilter_view.aod
index 26ee281b76c..6517c2f9eff 100644
--- a/neonView/NotificationFilter_view/NotificationFilter_view.aod
+++ b/neonView/NotificationFilter_view/NotificationFilter_view.aod
@@ -32,7 +32,7 @@
       <dateField>CREATEDAY</dateField>
       <titleField>CAPTION</titleField>
       <descriptionField>DESCRIPTION</descriptionField>
-      <subdescriptionField>CREATEDATE</subdescriptionField>
+      <subdescriptionField>SUBCATEGORY</subdescriptionField>
       <iconIdField>ICON</iconIdField>
       <additionalInfoField>STATE</additionalInfoField>
       <entityField>#ENTITY</entityField>
@@ -50,6 +50,7 @@
       <entityField>#ENTITY</entityField>
       <isEditable v="false" />
       <isSaveable v="false" />
+      <informationField>SUBCATEGORY</informationField>
       <columns>
         <neonTableColumn>
           <name>1cff3be1-523d-4a5a-b7d1-389d7cbb726f</name>
@@ -67,6 +68,10 @@
           <name>ff33a6c1-7ac6-4acd-a083-e56a36f89977</name>
           <entityField>DESCRIPTION</entityField>
         </neonTableColumn>
+        <neonTableColumn>
+          <name>0e3756eb-05f6-4ab2-a6e9-984f5215f542</name>
+          <entityField>SUBCATEGORY</entityField>
+        </neonTableColumn>
         <neonTableColumn>
           <name>5cb09de4-4413-41e5-8a7c-4970a3cf6a62</name>
           <entityField>STATE</entityField>
@@ -95,6 +100,10 @@
           <name>446c3d62-efa4-4f1a-85d4-e4f6a45019c7</name>
           <entityField>DESCRIPTION</entityField>
         </neonTreeTableColumn>
+        <neonTreeTableColumn>
+          <name>6caff937-2e67-4b28-b630-ae1dd5860f3b</name>
+          <entityField>SUBCATEGORY</entityField>
+        </neonTreeTableColumn>
         <neonTreeTableColumn>
           <name>4c82b79e-4c15-4298-bfbb-186c76fc5189</name>
           <entityField>STATE</entityField>
-- 
GitLab


From 93bb003f1142bc3813edda4fd04d0236128b4f7e Mon Sep 17 00:00:00 2001
From: Sebastian Listl <s.listl@adito.de>
Date: Mon, 30 Nov 2020 16:33:21 +0100
Subject: [PATCH 127/184] Scanservice errors fixed

---
 readme.md | 8 ++++++++
 1 file changed, 8 insertions(+)
 create mode 100644 readme.md

diff --git a/readme.md b/readme.md
new file mode 100644
index 00000000000..67a1a52f76a
--- /dev/null
+++ b/readme.md
@@ -0,0 +1,8 @@
+# xRM
+
+## Useful documents to get started
+
+* [Coding Guidelines](https://neon.adito.de/client/KnowledgeManagement/full?id=dc6e3066-2228-4d04-b9b6-dac792d5bfec)
+* [Customizing Manual](https://neon.adito.de/client/KnowledgeManagement/full?id=534c07da-387a-46e2-b5ab-040a5c1b0ab2)
+* [Designer Manual](https://neon.adito.de/client/KnowledgeManagement/full?id=56507a00-9c49-4be3-b4d5-9f83cb442ff7)
+* [Documentation Overview](https://neon.adito.de/client/KnowledgeManagement/full?id=42a481e3-b27d-446a-8a0b-fe5bffafc2ec)
\ No newline at end of file
-- 
GitLab


From a986deab0079c65911798626458fdc18721d6f1d Mon Sep 17 00:00:00 2001
From: "j.goderbauer" <j.goderbauer@adito.de>
Date: Mon, 30 Nov 2020 16:33:31 +0100
Subject: [PATCH 128/184] [Projekt: Entwicklung - xRM][TicketNr.:
 1068960][Liquibase-Skript Fehler;
 .liquibase/Data_alias/basic/2019.3.2/reworkDBIndexes.xml]

---
 .liquibase/Data_alias/basic/2019.3.2/reworkDbIndexes.xml | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/.liquibase/Data_alias/basic/2019.3.2/reworkDbIndexes.xml b/.liquibase/Data_alias/basic/2019.3.2/reworkDbIndexes.xml
index 62c9c29573a..c1d76b19cd2 100644
--- a/.liquibase/Data_alias/basic/2019.3.2/reworkDbIndexes.xml
+++ b/.liquibase/Data_alias/basic/2019.3.2/reworkDbIndexes.xml
@@ -10,10 +10,10 @@
             <column name="ACTIVITY_ID"/>
         </createIndex>
     </changeSet>
-    <changeSet id="e7527e13-7546-4fa6-ac95-5cc3e1f27056" author="s.listl" dbms="!oracle">
+    <changeSet id="e7527e13-7546-4fa6-ac95-5cc3e1f27056" author="s.listl">
         <preConditions onFail="MARK_RAN">
             <not>
-                <changeSetExecuted id="5a0b62f4-6770-454c-9a0e-d60ca16596dd" author="j.goderbauer"/>
+                <changeSetExecuted id="5a0b62f4-6770-454c-9a0e-d60ca16596dd" author="j.goderbauer" changeLogFile=".liquibase/Data_alias/basic/2019.3.2/reworkDbIndexes.xml"/>
             </not>
         </preConditions>
         <createIndex indexName="IDX_TICKET_TASK_ID" tableName="TICKET">
-- 
GitLab


From 73f344ad5a6562511c01939a051d2347eac18fba Mon Sep 17 00:00:00 2001
From: "a.schindlbeck" <a.schindlbeck@adito.de>
Date: Mon, 30 Nov 2020 16:48:15 +0100
Subject: [PATCH 129/184] #1067434 Notifications: adding subcategory on various
 .addNotification(...) calls

---
 process/buildSerialLetter_serverProcess/process.js | 2 +-
 process/importLead_serverProcess/process.js        | 2 +-
 process/sendBulkMail_serverProcess/process.js      | 2 +-
 3 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/process/buildSerialLetter_serverProcess/process.js b/process/buildSerialLetter_serverProcess/process.js
index 1d5cff1f394..b3210e860db 100644
--- a/process/buildSerialLetter_serverProcess/process.js
+++ b/process/buildSerialLetter_serverProcess/process.js
@@ -21,4 +21,4 @@ SingleBinaryUtils.set("SERIALLETTER", "SERIALLETTERFILE", letterId, document.con
 
 var message = translate.text("Download ready");
 var description = translate.withArguments("Serial letter \"%0\" can now be downloaded", [document.title]);
-notification.addNotification(util.getNewUUID(), text.encodeMS(["SerialLetter", letterId]), null, null, "DownloadReady", notification.PRIO_NORMAL, 2, notification.STATE_UNSEEN, [user], message, description);
\ No newline at end of file
+notification.addNotification(util.getNewUUID(), text.encodeMS(["SerialLetter", letterId]), null, null, "DownloadReady", null, notification.PRIO_NORMAL, 2, notification.STATE_UNSEEN, [user], message, description);
\ No newline at end of file
diff --git a/process/importLead_serverProcess/process.js b/process/importLead_serverProcess/process.js
index a24b084a933..35ac42b2b31 100644
--- a/process/importLead_serverProcess/process.js
+++ b/process/importLead_serverProcess/process.js
@@ -192,7 +192,7 @@ if(exeptions != "")//insert error document
 if (userId)// if there is an user - show a notification to this user when the import is complete
 {
     var description = translate.withArguments("%0 leads imported, %1 errors", [rows, errorCount]);
-    notification.addNotification(util.getNewUUID(), null, null, null, "LeadImport_Notification", notification.PRIO_NORMAL, 2, notification.STATE_UNSEEN, [userId], importName, description);
+    notification.addNotification(util.getNewUUID(), null, null, null, "LeadImport_Notification", null, notification.PRIO_NORMAL, 2, notification.STATE_UNSEEN, [userId], importName, description);
 }
 
 
diff --git a/process/sendBulkMail_serverProcess/process.js b/process/sendBulkMail_serverProcess/process.js
index 711120feb20..7ed237beffb 100644
--- a/process/sendBulkMail_serverProcess/process.js
+++ b/process/sendBulkMail_serverProcess/process.js
@@ -23,5 +23,5 @@ if (user && !testRecipients)
     var message = translate.withArguments("Bulk mail \"%0\" was sent!", [mailName]);
     var description = translate.withArguments("%0 mails sent sucessfully, %1 mails failed. Process took %2 s.", 
         [res.sucessful, res.failed, Math.round((datetime.date() - startTime) / datetime.ONE_SECOND)]);
-    notification.addNotification(util.getNewUUID(), null, null, null, "BulkMailSent", notification.PRIO_NORMAL, 2, notification.STATE_UNSEEN, [user], message, description);
+    notification.addNotification(util.getNewUUID(), null, null, null, "BulkMailSent", null, notification.PRIO_NORMAL, 2, notification.STATE_UNSEEN, [user], message, description);
 }
\ No newline at end of file
-- 
GitLab


From b38516db7defe1cf782e9f92d785f24eedf2c2d8 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Alexander=20V=C3=B6gl?= <a.voegl@adito.de>
Date: Mon, 30 Nov 2020 16:45:27 +0000
Subject: [PATCH 130/184] [Projekt: Entwicklung - xRM][TicketNr.: 1061957][360
 Grad: Umbenennung ViewTemplate Treetable -> Tree] [Projekt: Entwicklung -
 xRM][TicketNr.: 1053175][Erweiterte 360-Grad Ansicht]

---
 .../translate4log/property.js                 |   2 +-
 entity/360Degree_entity/360Degree_entity.aod  |  55 +-
 entity/360Degree_entity/documentation.adoc    |  25 +-
 .../newcampaignparticipant/stateProcess.js    |   4 +-
 .../children/newcontract/stateProcess.js      |   4 +-
 .../children/newoffer/stateProcess.js         |   4 +-
 .../children/neworder/stateProcess.js         |   4 +-
 .../children/newsalesproject/stateProcess.js  |   4 +-
 .../children/objecttype_param/valueProcess.js |  19 +-
 .../children/objecttype_param/valueProcess.js |  12 +-
 .../entityfields/year/valueProcess.js         |   6 -
 .../recordcontainers/jdito/contentProcess.js  | 162 ++---
 .../object_rowid/displayValueProcess.js       |   2 +-
 .../objectid/displayValueProcess.js           |   2 +-
 .../AttributeUsage_entity.aod                 |   4 -
 .../getallcontexts_param/valueProcess.js      |   2 -
 entity/Attribute_entity/Attribute_entity.aod  |   4 -
 .../getallcontexts_param/valueProcess.js      |   3 -
 .../CampaignStep_entity.aod                   |   1 +
 .../contentDescriptionProcess.js              |   5 +
 entity/Campaign_entity/Campaign_entity.aod    |   8 +
 .../contentDescriptionProcess.js              |   5 +
 .../active.value/expression.js                |   6 +
 .../Competition_entity/Competition_entity.aod |   4 -
 .../object_rowid/displayValueProcess.js       |   2 +-
 .../object_rowid.displayvalue/expression.js   |   4 -
 entity/Context_entity/Context_entity.aod      |   5 -
 .../recordcontainers/jdito/contentProcess.js  |   3 +-
 entity/Contract_entity/Contract_entity.aod    |  15 +
 .../contentDescriptionProcess.js              |  16 +
 entity/Contract_entity/contentTitleProcess.js |   4 +-
 .../active.value/expression.js                |   6 +
 .../DocumentTemplatePlaceOfUse_entity.aod     |   4 -
 .../getallcontexts_param/valueProcess.js      |   3 -
 entity/Forecast_entity/Forecast_entity.aod    |   4 -
 .../object_rowid/displayValueProcess.js       |   2 +-
 .../object_rowid.displayvalue/expression.js   |   4 -
 .../Leadimport_entity/Leadimport_entity.aod   |   9 +
 .../contentDescriptionProcess.js              |   5 +
 entity/Member_entity/Member_entity.aod        |   4 -
 .../object_rowid/displayValueProcess.js       |   2 +-
 .../object_rowid.displayvalue/expression.js   |  10 -
 .../target_id/displayValueProcess.js          |   2 +-
 .../recordcontainers/jdito/contentProcess.js  |   2 +-
 entity/Object_entity/Object_entity.aod        |   8 +
 .../recordcontainers/jdito/contentProcess.js  |   2 +-
 entity/Offer_entity/Offer_entity.aod          |  12 +-
 .../Offer_entity/contentDescriptionProcess.js |  12 +
 entity/Offer_entity/contentTitleProcess.js    |   4 +-
 .../object_rowid/displayValueProcess.js       |   2 +-
 .../active.value/expression.js                |   6 +
 .../object_rowid.displayvalue/expression.js   |   4 -
 entity/Order_entity/Order_entity.aod          | 219 +++---
 .../Order_entity/contentDescriptionProcess.js |  19 +
 entity/Order_entity/contentTitleProcess.js    |   7 +-
 .../object_rowid/displayValueProcess.js       |   2 +-
 .../active.value/expression.js                |   6 +
 .../object_rowid.displayvalue/expression.js   |   4 -
 .../offer_id.displayvalue/expression.js       |   5 -
 .../Organisation_entity.aod                   |   1 +
 .../contentDescriptionProcess.js              |   5 +
 entity/Product_entity/Product_entity.aod      |   1 +
 .../contentDescriptionProcess.js              |   5 +
 .../contact_id/displayValueProcess.js         |   2 +-
 .../Salesproject_entity.aod                   | 267 +++----
 .../contentDescriptionProcess.js              |  14 +
 .../contentTitleProcess.js                    |   4 +-
 .../active.value/expression.js                |   6 +
 .../SupportTicket_entity.aod                  |  15 +
 .../contentDescriptionProcess.js              |  18 +
 .../contentTitleProcess.js                    |   7 +-
 .../active.value/expression.js                |   7 +
 .../object_rowid/displayValueProcess.js       |   2 +-
 entity/Task_entity/Task_entity.aod            |   4 +
 .../Task_entity/contentDescriptionProcess.js  |   5 +
 .../WorkflowStartConfig_entity.aod            |   4 -
 .../getallcontexts_param/valueProcess.js      |   3 -
 .../_____LANGUAGE_de/_____LANGUAGE_de.aod     |   4 +
 neonContext/SupportTicket/SupportTicket.aod   |   1 +
 .../360DegreeFilter_view.aod                  |  15 +-
 process/Context_lib/process.js                | 669 +++++-------------
 process/Order_lib/process.js                  |   2 +-
 process/Util_lib/process.js                   | 135 +++-
 83 files changed, 989 insertions(+), 972 deletions(-)
 delete mode 100644 entity/360Degree_entity/entityfields/year/valueProcess.js
 delete mode 100644 entity/AttributeUsage_entity/entityfields/context/children/getallcontexts_param/valueProcess.js
 delete mode 100644 entity/Attribute_entity/entityfields/contexts/children/getallcontexts_param/valueProcess.js
 create mode 100644 entity/CampaignStep_entity/contentDescriptionProcess.js
 create mode 100644 entity/Campaign_entity/contentDescriptionProcess.js
 create mode 100644 entity/Campaign_entity/recordcontainers/db/recordfieldmappings/active.value/expression.js
 delete mode 100644 entity/Competition_entity/recordcontainers/db/recordfieldmappings/object_rowid.displayvalue/expression.js
 create mode 100644 entity/Contract_entity/contentDescriptionProcess.js
 create mode 100644 entity/Contract_entity/recordcontainers/db/recordfieldmappings/active.value/expression.js
 delete mode 100644 entity/DocumentTemplatePlaceOfUse_entity/entityfields/contextdocumenttemplateplaceofuse/children/getallcontexts_param/valueProcess.js
 delete mode 100644 entity/Forecast_entity/recordcontainers/db/recordfieldmappings/object_rowid.displayvalue/expression.js
 create mode 100644 entity/Leadimport_entity/contentDescriptionProcess.js
 delete mode 100644 entity/Member_entity/recordcontainers/db/recordfieldmappings/object_rowid.displayvalue/expression.js
 create mode 100644 entity/Offer_entity/contentDescriptionProcess.js
 create mode 100644 entity/Offer_entity/recordcontainers/db/recordfieldmappings/active.value/expression.js
 delete mode 100644 entity/Offer_entity/recordcontainers/db/recordfieldmappings/object_rowid.displayvalue/expression.js
 create mode 100644 entity/Order_entity/contentDescriptionProcess.js
 create mode 100644 entity/Order_entity/recordcontainers/db/recordfieldmappings/active.value/expression.js
 delete mode 100644 entity/Order_entity/recordcontainers/db/recordfieldmappings/object_rowid.displayvalue/expression.js
 delete mode 100644 entity/Order_entity/recordcontainers/db/recordfieldmappings/offer_id.displayvalue/expression.js
 create mode 100644 entity/Organisation_entity/contentDescriptionProcess.js
 create mode 100644 entity/Product_entity/contentDescriptionProcess.js
 create mode 100644 entity/Salesproject_entity/contentDescriptionProcess.js
 create mode 100644 entity/Salesproject_entity/recordcontainers/db/recordfieldmappings/active.value/expression.js
 create mode 100644 entity/SupportTicket_entity/contentDescriptionProcess.js
 create mode 100644 entity/SupportTicket_entity/recordcontainers/db/recordfieldmappings/active.value/expression.js
 create mode 100644 entity/Task_entity/contentDescriptionProcess.js
 delete mode 100644 entity/WorkflowStartConfig_entity/entityfields/contexts/children/getallcontexts_param/valueProcess.js

diff --git a/aliasDefinition/Data_alias/aliasdefinitionsub/entitygroup/entities/salesorder/entityfields/object_rowid/customproperties/translate4log/property.js b/aliasDefinition/Data_alias/aliasdefinitionsub/entitygroup/entities/salesorder/entityfields/object_rowid/customproperties/translate4log/property.js
index aa7a1fe2a06..7305220193d 100644
--- a/aliasDefinition/Data_alias/aliasdefinitionsub/entitygroup/entities/salesorder/entityfields/object_rowid/customproperties/translate4log/property.js
+++ b/aliasDefinition/Data_alias/aliasdefinitionsub/entitygroup/entities/salesorder/entityfields/object_rowid/customproperties/translate4log/property.js
@@ -12,4 +12,4 @@ var type = newSelect("OBJECT_TYPE")
            .where("SALESORDER.SALESORDERID", params.rowId)
            .cell();
 
-result.string(db.cell(ContextUtils.getNameSql(type, params.value)));
+result.string(ContextUtils.getTitleByContext(type, params.value));
diff --git a/entity/360Degree_entity/360Degree_entity.aod b/entity/360Degree_entity/360Degree_entity.aod
index 62c86300ec6..f527d3b4ebb 100644
--- a/entity/360Degree_entity/360Degree_entity.aod
+++ b/entity/360Degree_entity/360Degree_entity.aod
@@ -15,6 +15,7 @@
   </siblings>
   <grantUpdate v="false" />
   <grantDelete v="false" />
+  <titlePlural>Links</titlePlural>
   <recordContainer>jdito</recordContainer>
   <entityFields>
     <entityProvider>
@@ -25,6 +26,7 @@
     </entityField>
     <entityField>
       <name>TITLE</name>
+      <title>Title</title>
       <linkedContextProcess>%aditoprj%/entity/360Degree_entity/entityfields/title/linkedContextProcess.js</linkedContextProcess>
     </entityField>
     <entityParameter>
@@ -71,11 +73,10 @@
     <entityField>
       <name>ENTITY_NAME</name>
       <title>Module</title>
-      <groupable v="true" />
       <valueProcess>%aditoprj%/entity/360Degree_entity/entityfields/entity_name/valueProcess.js</valueProcess>
     </entityField>
     <entityField>
-      <name>DATE</name>
+      <name>DATE_NEW</name>
       <title>Date</title>
       <contentType>DATE</contentType>
       <resolution>DAY</resolution>
@@ -105,12 +106,6 @@
         </entityParameter>
       </children>
     </entityProvider>
-    <entityField>
-      <name>YEAR</name>
-      <title>Year</title>
-      <groupable v="true" />
-      <valueProcess>%aditoprj%/entity/360Degree_entity/entityfields/year/valueProcess.js</valueProcess>
-    </entityField>
     <entityActionGroup>
       <name>newModule</name>
       <title>New module</title>
@@ -166,13 +161,6 @@
       <contentType>IMAGE</contentType>
       <valueProcess>%aditoprj%/entity/360Degree_entity/entityfields/icon/valueProcess.js</valueProcess>
     </entityField>
-    <entityField>
-      <name>ACTIVE</name>
-      <title>Active</title>
-      <contentType>TEXT</contentType>
-      <groupable v="true" />
-      <dropDownProcess>%aditoprj%/entity/360Degree_entity/entityfields/active/dropDownProcess.js</dropDownProcess>
-    </entityField>
     <entityParameter>
       <name>BaseContextId_param</name>
       <expose v="true" />
@@ -185,6 +173,25 @@
       <name>#PROVIDER_AGGREGATES</name>
       <useAggregates v="true" />
     </entityProvider>
+    <entityField>
+      <name>GROUP</name>
+      <title>Group</title>
+      <groupable v="true" />
+    </entityField>
+    <entityField>
+      <name>DESCRIPTION</name>
+      <title>Description</title>
+    </entityField>
+    <entityField>
+      <name>YEAR</name>
+      <title>Year</title>
+      <groupable v="true" />
+    </entityField>
+    <entityField>
+      <name>ACTIVE</name>
+      <title>Active</title>
+      <dropDownProcess>%aditoprj%/entity/360Degree_entity/entityfields/active/dropDownProcess.js</dropDownProcess>
+    </entityField>
   </entityFields>
   <recordContainers>
     <jDitoRecordContainer>
@@ -203,20 +210,32 @@
         <jDitoRecordFieldMapping>
           <name>TARGET_CONTEXT.value</name>
         </jDitoRecordFieldMapping>
+        <jDitoRecordFieldMapping>
+          <name>TARGET_CONTEXT.displayValue</name>
+        </jDitoRecordFieldMapping>
         <jDitoRecordFieldMapping>
           <name>TITLE.value</name>
         </jDitoRecordFieldMapping>
         <jDitoRecordFieldMapping>
-          <name>DATE.value</name>
+          <name>DESCRIPTION.value</name>
         </jDitoRecordFieldMapping>
         <jDitoRecordFieldMapping>
-          <name>ACTIVE.value</name>
+          <name>DATE_NEW.value</name>
           <isFilterable v="true" />
-          <isLookupFilter v="true" />
+        </jDitoRecordFieldMapping>
+        <jDitoRecordFieldMapping>
+          <name>YEAR.value</name>
         </jDitoRecordFieldMapping>
         <jDitoRecordFieldMapping>
           <name>ENTITY_NAME.value</name>
         </jDitoRecordFieldMapping>
+        <jDitoRecordFieldMapping>
+          <name>GROUP.value</name>
+        </jDitoRecordFieldMapping>
+        <jDitoRecordFieldMapping>
+          <name>ACTIVE.value</name>
+          <isFilterable v="true" />
+        </jDitoRecordFieldMapping>
       </recordFieldMappings>
     </jDitoRecordContainer>
   </recordContainers>
diff --git a/entity/360Degree_entity/documentation.adoc b/entity/360Degree_entity/documentation.adoc
index d14c31a7c93..b2ad150c078 100644
--- a/entity/360Degree_entity/documentation.adoc
+++ b/entity/360Degree_entity/documentation.adoc
@@ -3,9 +3,9 @@
 The 360Degree_entity shows the Connection between data models.
 The entity has two providers for persons and organizations.
 
-The 360Degree_entity shows direct connections, don´t be confused with the ObjectRelation_entity.
+The 360Degree_entity shows direct connections, don´t be confused with the ObjectRelation_entity.
 
-== Adding new modules to the 360° view
+== Adding new modules to the 360° view
 You may want to display more modules within the 360degree view (for example after creating and implemeting your own module).
 
 .An Example:
@@ -14,6 +14,23 @@ display it in the 360degree view.
 
 Heres is a list of what you need to do whenever you want to do this:
 
-- Add an entry in the function `ContextUtils.getSelectMap` which is located in the `Context_lib` (check out the documentation there for further details). _Speaking of the example above you need to define there how to retrieve the t-shirt-data for a contact_
+- At first you have to fill/add certain Fields/Processes in your new Context.
+    - Add (These have to be written exactly like that, if not already existing):
+        - CONTACT_ID, this Field has to contain a CONTACTID. That will be used to find the Connection to your Person or your Organisation.
+        - DATE_NEW, this Field has to contain a Date as a Long Value. That will be used as the Date Value you can see in the Timeline View-Template.
+        - ACTIVE, in this Field you can specify which Datasets are active or not. You have to declare that in the Value Expression as a Case-When due to the Filter
+    - Fill (these can be filled in the specific Entity as a Process)
+        - #CONTENTTITLE, this will be the main display Text and the blue Link
+        - #CONTENTDESCRIPTION, this will be the smaller, mostly longer, Text beneath the #CONTENTTITLE 
+        
+- Add an elemnt (with the name of the context you want to add) in the process of the `ObjectType_param` in the *corresponding provider* which is located in the `360Degree_entity`. _We would extend the JSON-Object which is returned in the `PersonObjects`-provider by the name of our t-shirt-context: "TShirt" in our example
+- 
+- In that JSON-Object can also add some Configuration Elements to change the results.
+    - setGroupBy: here you can declare a DB-Column that will be used as the new group by of that context. A good example is Order. We want to group by the Ordertype so we have to declare ORDERTYPE as our groupBy. 
+        - If your DB-Value is related to a Keyword you also have to use groupByKeyword and add the Container as Value
 
-- Add an entry (with the name of the context you want to add) in the process of the `ObjectType_param` in the *corresponding provider* which is located in the `360Degree_entity`. _We would extend the array which is returned in the `PersonObjects`-provider by the name of our t-shirt-context: "TShirt" in our example_
\ No newline at end of file
+- If you have a Connection of 1:N in your Database Schema (like Activity and ActivityLink) you have to add specific Properties in your Context Object. Lets take ActivityLink as a Example.
+    - subContext: the Name of the "Link"-Context -> ActivityLink
+    - childField: The Field where the LinkID to your Parent is stored -> ACTIVITY_ID
+    - parentField: The field in your Parent Context where your Connection to your Child is stored -> ACTIVITYID
+    - contactIdField: The Field in the Link Context where your Contactid is stored -> OBJECT_ROWID
\ No newline at end of file
diff --git a/entity/360Degree_entity/entityfields/newmodule/children/newcampaignparticipant/stateProcess.js b/entity/360Degree_entity/entityfields/newmodule/children/newcampaignparticipant/stateProcess.js
index 353aa9f3676..fbdfd3fd2e1 100644
--- a/entity/360Degree_entity/entityfields/newmodule/children/newcampaignparticipant/stateProcess.js
+++ b/entity/360Degree_entity/entityfields/newmodule/children/newcampaignparticipant/stateProcess.js
@@ -7,11 +7,11 @@ if (contextList)
 {
     var found = false;
 
-    contextList.forEach(function (context) 
+    for(context in contextList)
     {
         if(context == "Campaign")
             found = true;        
-    });
+    }
     if(found)
         result.string(neon.COMPONENTSTATE_AUTO);
     else
diff --git a/entity/360Degree_entity/entityfields/newmodule/children/newcontract/stateProcess.js b/entity/360Degree_entity/entityfields/newmodule/children/newcontract/stateProcess.js
index f1cfb310581..64c597b2e18 100644
--- a/entity/360Degree_entity/entityfields/newmodule/children/newcontract/stateProcess.js
+++ b/entity/360Degree_entity/entityfields/newmodule/children/newcontract/stateProcess.js
@@ -6,11 +6,11 @@ var contextList = JSON.parse(vars.getString("$param.ObjectType_param"));
 if (contextList)
 {
     var found = false;
-    contextList.forEach(function (context) 
+    for(context in contextList)
     {
         if(context == "Contract")
             found = true;        
-    });
+    }
     if(found)
         result.string(neon.COMPONENTSTATE_AUTO);
     else
diff --git a/entity/360Degree_entity/entityfields/newmodule/children/newoffer/stateProcess.js b/entity/360Degree_entity/entityfields/newmodule/children/newoffer/stateProcess.js
index 02a2b07b699..ce3eb11c9bd 100644
--- a/entity/360Degree_entity/entityfields/newmodule/children/newoffer/stateProcess.js
+++ b/entity/360Degree_entity/entityfields/newmodule/children/newoffer/stateProcess.js
@@ -6,11 +6,11 @@ var contextList = JSON.parse(vars.getString("$param.ObjectType_param"));
 if (contextList)
 {
     var found = false;
-    contextList.forEach(function (context) 
+    for(context in contextList)
     {
         if(context == "Offer")
             found = true;        
-    });
+    }
     if(found)
         result.string(neon.COMPONENTSTATE_AUTO);
     else
diff --git a/entity/360Degree_entity/entityfields/newmodule/children/neworder/stateProcess.js b/entity/360Degree_entity/entityfields/newmodule/children/neworder/stateProcess.js
index 1c2b2b9123c..6b9ec816416 100644
--- a/entity/360Degree_entity/entityfields/newmodule/children/neworder/stateProcess.js
+++ b/entity/360Degree_entity/entityfields/newmodule/children/neworder/stateProcess.js
@@ -6,11 +6,11 @@ var contextList = JSON.parse(vars.getString("$param.ObjectType_param"));
 if (contextList)
 {
     var found = false;
-    contextList.forEach(function (context) 
+    for(context in contextList)
     {
         if(context == "Order")
             found = true;        
-    });
+    }
     if(found)
         result.string(neon.COMPONENTSTATE_AUTO);
     else
diff --git a/entity/360Degree_entity/entityfields/newmodule/children/newsalesproject/stateProcess.js b/entity/360Degree_entity/entityfields/newmodule/children/newsalesproject/stateProcess.js
index f23023f7d17..6a18dc9adfd 100644
--- a/entity/360Degree_entity/entityfields/newmodule/children/newsalesproject/stateProcess.js
+++ b/entity/360Degree_entity/entityfields/newmodule/children/newsalesproject/stateProcess.js
@@ -7,11 +7,11 @@ if (contextList)
 {
     var found = false;
     
-    contextList.forEach(function (context) 
+    for(context in contextList)
     {
         if(context == "Salesproject")
             found = true;        
-    });
+    }
     if(found)
         result.string(neon.COMPONENTSTATE_AUTO);
     else
diff --git a/entity/360Degree_entity/entityfields/organisationobjects/children/objecttype_param/valueProcess.js b/entity/360Degree_entity/entityfields/organisationobjects/children/objecttype_param/valueProcess.js
index 86503dcd7f3..9b0fe874baa 100644
--- a/entity/360Degree_entity/entityfields/organisationobjects/children/objecttype_param/valueProcess.js
+++ b/entity/360Degree_entity/entityfields/organisationobjects/children/objecttype_param/valueProcess.js
@@ -3,4 +3,21 @@ import("system.result");
 
 //No campaign, since a campaign can only be linked with a person. 
 //Even when all entries of persons are displayed in the organisation_entity: It's still nonsense to display campaigns per status.
-result.object(["Salesproject", "Offer", "Order", "Contract", "SupportTicket"]);
\ No newline at end of file
+
+var res = {
+    "Salesproject": {}, 
+    "Offer": {}, 
+    "Order": {
+        "setGroupBy":"ORDERTYPE",
+        "groupByKeyword":"OrderType"
+    }, 
+    "Contract": {}, 
+    "SupportTicket": {
+        "subContext":"TaskLink",
+        "childField":"TASK_ID",
+        "parentField":"TASK_TASKID",
+        "contactIdField":"OBJECT_ROWID"
+    }
+}
+
+result.string(JSON.stringify(res))
\ No newline at end of file
diff --git a/entity/360Degree_entity/entityfields/personobjects/children/objecttype_param/valueProcess.js b/entity/360Degree_entity/entityfields/personobjects/children/objecttype_param/valueProcess.js
index 51c40eed05b..0764eff7f7b 100644
--- a/entity/360Degree_entity/entityfields/personobjects/children/objecttype_param/valueProcess.js
+++ b/entity/360Degree_entity/entityfields/personobjects/children/objecttype_param/valueProcess.js
@@ -1,4 +1,14 @@
 import("system.vars");
 import("system.result");
 
-result.object(["Offer", "Contract", "Campaign", "Order", "SupportTicket"]);
\ No newline at end of file
+var res = { 
+    "Offer": {}, 
+    "Order": {
+        "setGroupBy":"ORDERTYPE"
+    }, 
+    "Contract": {}, 
+    "SupportTicket": {},
+    "Campaign": {}
+}
+
+result.string(JSON.stringify(res))
\ No newline at end of file
diff --git a/entity/360Degree_entity/entityfields/year/valueProcess.js b/entity/360Degree_entity/entityfields/year/valueProcess.js
deleted file mode 100644
index c21dcc8cde6..00000000000
--- a/entity/360Degree_entity/entityfields/year/valueProcess.js
+++ /dev/null
@@ -1,6 +0,0 @@
-import("system.datetime");
-import("system.result");
-import("system.vars");
-
-var dateVal = vars.get("$field.DATE");
-result.string(datetime.toDate(dateVal, "yyyy"));
\ No newline at end of file
diff --git a/entity/360Degree_entity/recordcontainers/jdito/contentProcess.js b/entity/360Degree_entity/recordcontainers/jdito/contentProcess.js
index 3014803809e..f6417bb26a7 100644
--- a/entity/360Degree_entity/recordcontainers/jdito/contentProcess.js
+++ b/entity/360Degree_entity/recordcontainers/jdito/contentProcess.js
@@ -1,36 +1,20 @@
-import("system.util");
-import("system.db");
-import("system.vars");
+import("system.datetime");
+import("system.logging");
+import("Util_lib");
+import("system.translate");
 import("system.result");
+import("system.vars");
 import("Context_lib");
-import("system.translate");
+import("Keyword_lib");
 
-if (vars.exists("$param.ObjectType_param") && vars.get("$param.ObjectType_param") && vars.exists("$param.ObjectRowId_param") && vars.get("$param.ObjectRowId_param"))
-{    
-    var active;
-    var selectMap = ContextUtils.getSelectMap();
-    if(vars.exists("$local.filter") && vars.get("$local.filter") )
-    {
-        var filter = vars.get("$local.filter");
-        if (filter.filter)
-            if(filter.filter.childs != null && filter.filter.childs.length > 0)
-            {
-                filter.filter.childs.forEach(function(child)
-                {
-                    if(child.name === "ACTIVE")
-                        active = child.key == 'true';
-                });  
-            }  
-    }
-    
-    var contextList = JSON.parse(vars.getString("$param.ObjectType_param"));
-    var contactId = vars.get("$param.ObjectRowId_param");
-    var idValues;
-    if (vars.exists("$local.idvalues"))
-        idValues = vars.get("$local.idvalues");
-    
-    var res =  _get360Data(selectMap, contactId, contextList, active, idValues);
-    result.object(res);   
+
+if (vars.exists("$param.ObjectType_param") && vars.get("$param.ObjectType_param") 
+    && vars.exists("$param.ObjectRowId_param") && vars.get("$param.ObjectRowId_param"))
+{
+    var contextList = JSON.parse(vars.get("$param.ObjectType_param"));
+    var contactId = JSON.parse(vars.get("$param.ObjectRowId_param"));
+    var data = _get360Data(contactId, contextList);
+    result.object(data);   
 } 
 else
 {
@@ -38,79 +22,65 @@ else
 }
 
 /** 
- * load all data for the 360Degree tree.
- * @param {Object} pSelectMap the select map (result of ContextUtils.getSelectMap())
- * @param {String[]} pContactId the Contactid the 360 Degree tree should be loaded for
- * @param {String[]} pContextList list of contexts to load. Note that subcontexts use their own list, defined in ContextUtils
- * @param {Boolean} [pActive=undefined] if not undefined: it select only for active / inactive state
- * @param {Array} [pUids=undefined] uids of the 360° entity that are used for filtering, each rowId needs the format: 
- *                                    {id: "«rowid»", type: "«context id»"}
+ * collects all data for the 360Degree tree.
+ * @param {String} pContactId, the main Contactid that will be used for the Connections
+ * @param {String[]} pContextList, a list of Contexts that should be displayed
  *  
  *  @return {String[][]} the resulting data
  */
-function _get360Data(pSelectMap, pContactId, pContextList, pActive, pUids)
+function _get360Data(pContactId, pContextList)
 {   
-    //if there are uids for filtering, group them per context:
-    var uidContextMap = new Map();//Map where key is the type (contextname) and value is an array of the rowIds for that type
-    if (pUids)
-    {
-        pUids.forEach(function (uid){
-            uid = JSON.parse(uid);
-            if (uidContextMap.has(uid.type))
-                uidContextMap.get(uid.type).push(uid.id);
-            else
-                uidContextMap.set(uid.type, [uid.id]);
-        });
-    }
-
     var resultList = [];
-    pContextList.forEach(function (context) 
+    var filter = vars.get("$sys.filter");
+    for(var context in pContextList) 
     {
-        var rowIds;
-        if (pUids)
-        {
-            //when a Uid-filter exists, but there is no context for filtering we can skip that context, 
-            //otherwise we need to filter for the found row ids of that context
-            if (!uidContextMap.has(context))
-                return;
-            else
-                rowIds = uidContextMap.get(context);
-        }
-        var data = db.table(ContextUtils.getContextDataSql(context, JSON.parse(pContactId), true, pActive, true, true, rowIds));
-        data.forEach(function (row) 
+        var group = context;
+        if(pContextList[context].hasOwnProperty("setGroupBy") && pContextList[context].hasOwnProperty("groupByKeyword"))
+            var groupKeyword = Utils.objectFromMap(new Map(KeywordUtils.getEntryNamesAndIdsByContainer(pContextList[context]["groupByKeyword"])));
+
+        var res = ContextUtils.getContextDataViaReadEntity(context, pContextList[context], filter, pContactId);
+        if(res.length > 0)
         {
-            var active;
-            if(pActive != undefined) //ACTIVE
-                active = translate.text(pActive);
-            else
+            res.forEach(function (row) 
             {
-                if(pSelectMap[context].activeStates && pSelectMap[context].activeStates.indexOf(row[3]) > -1)    
-                    active = translate.text("true");
-                else
-                    active = translate.text("false");
-            }
-            
-            var groupBy = row[4];
-            if(groupBy == "")
-                groupBy = ContextUtils.getEntityTitle(context, true);
-            
-            var uid = JSON.stringify({id: row[0], type: context});
-            resultList.push([
-                uid, // UID
-                row[0], // TARGET_ID
-                context, // TARGET_CONTEXT
-                row[1], // TITLE
-                row[2], //DATE
-                active,
-                groupBy
-                ]); 
-        });
-    });  
-    
-    resultList.sort(function (a,b) {
-        if (a[4] < b[4]) return  1;
-        if (a[4] > b[4]) return -1;
-        return 0;
-    })
+                var uid = JSON.stringify({
+                    "id": row["#UID"], 
+                    "type": context
+                });
+                var targetid = row["#UID"];
+                var title = row["#CONTENTTITLE"];
+                var description = row["#CONTENTDESCRIPTION"];
+                var dataDate = row["DATE_NEW"];
+                var active = row["ACTIVE"];
+                if(pContextList[context].hasOwnProperty("setGroupBy"))
+                    group = row[pContextList[context]["setGroupBy"]]
+                
+
+                if(pContextList[context].hasOwnProperty("setGroupBy"))
+                {
+                    if( pContextList[context].hasOwnProperty("groupByKeyword") && groupKeyword)
+                        group = groupKeyword[row[pContextList[context]["setGroupBy"]]]
+                    else
+                        group = row[pContextList[context]["setGroupBy"]]
+                }
+                
+                resultList.push([
+                    uid,                                          // UID
+                    targetid,                                     // TARGET_ID
+                    context,                                      // TARGET_CONTEXT
+                    translate.text(pContextList[context]),        // TARGET_CONTEXT.displayValue
+                    title,                                        // TITLE
+                    description,                                  // DESCRIPTION
+                    dataDate,                                     // DATE
+                    datetime.toDate(dataDate, "yyyy"),            // YEAR
+                    ContextUtils.getEntity(context),              // ENTITY_NAME
+                    translate.text(group),                        // GROUP
+                    active                                        // ACTIVE
+                    ]); 
+            });
+        }
+    }
+    var sortArr = [9, false]
+    resultList = ArrayUtils.sortMulti(resultList, sortArr)
     return resultList;
 }
\ No newline at end of file
diff --git a/entity/ActivityLink_entity/entityfields/object_rowid/displayValueProcess.js b/entity/ActivityLink_entity/entityfields/object_rowid/displayValueProcess.js
index 8b080bceea9..95c4eea5367 100644
--- a/entity/ActivityLink_entity/entityfields/object_rowid/displayValueProcess.js
+++ b/entity/ActivityLink_entity/entityfields/object_rowid/displayValueProcess.js
@@ -7,5 +7,5 @@ import("Context_lib");
 if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && !vars.get("$field.OBJECT_ROWID")) {
     result.string("");
 } else if (vars.exists("$field.OBJECT_TYPE") && vars.get("$field.OBJECT_TYPE")) {
-    result.string(db.cell(ContextUtils.getNameSql(vars.get("$field.OBJECT_TYPE"), vars.get("$field.OBJECT_ROWID"))));
+    result.string(ContextUtils.getTitleByContext(vars.get("$field.OBJECT_TYPE"), vars.get("$field.OBJECT_ROWID")));
 }
\ No newline at end of file
diff --git a/entity/AppointmentLink_entity/entityfields/objectid/displayValueProcess.js b/entity/AppointmentLink_entity/entityfields/objectid/displayValueProcess.js
index e95adef18a9..a44f299d8af 100644
--- a/entity/AppointmentLink_entity/entityfields/objectid/displayValueProcess.js
+++ b/entity/AppointmentLink_entity/entityfields/objectid/displayValueProcess.js
@@ -7,5 +7,5 @@ import("Context_lib");
 if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && !vars.get("$field.OBJECTID")) {
     result.string("");
 } else if (vars.exists("$field.OBJECTTYPE") && vars.get("$field.OBJECTTYPE")) {
-    result.string(db.cell(ContextUtils.getNameSql(vars.get("$field.OBJECTTYPE"), vars.get("$field.OBJECTID"))));
+    result.string(ContextUtils.getTitleByContext(vars.get("$field.OBJECTTYPE"), vars.get("$field.OBJECTID")));
 }
\ No newline at end of file
diff --git a/entity/AttributeUsage_entity/AttributeUsage_entity.aod b/entity/AttributeUsage_entity/AttributeUsage_entity.aod
index 281daa5f5aa..24f5a40c608 100644
--- a/entity/AttributeUsage_entity/AttributeUsage_entity.aod
+++ b/entity/AttributeUsage_entity/AttributeUsage_entity.aod
@@ -78,10 +78,6 @@
         <fieldName>Exclusive</fieldName>
       </dependency>
       <children>
-        <entityParameter>
-          <name>GetAllContexts_param</name>
-          <valueProcess>%aditoprj%/entity/AttributeUsage_entity/entityfields/context/children/getallcontexts_param/valueProcess.js</valueProcess>
-        </entityParameter>
         <entityParameter>
           <name>Blacklist_param</name>
           <valueProcess>%aditoprj%/entity/AttributeUsage_entity/entityfields/context/children/blacklist_param/valueProcess.js</valueProcess>
diff --git a/entity/AttributeUsage_entity/entityfields/context/children/getallcontexts_param/valueProcess.js b/entity/AttributeUsage_entity/entityfields/context/children/getallcontexts_param/valueProcess.js
deleted file mode 100644
index ed5935fc124..00000000000
--- a/entity/AttributeUsage_entity/entityfields/context/children/getallcontexts_param/valueProcess.js
+++ /dev/null
@@ -1,2 +0,0 @@
-import("system.result");
-result.string(true);
\ No newline at end of file
diff --git a/entity/Attribute_entity/Attribute_entity.aod b/entity/Attribute_entity/Attribute_entity.aod
index 26e2e934e59..f85aaaa9515 100644
--- a/entity/Attribute_entity/Attribute_entity.aod
+++ b/entity/Attribute_entity/Attribute_entity.aod
@@ -319,10 +319,6 @@
           <name>Blacklist_param</name>
           <valueProcess>%aditoprj%/entity/Attribute_entity/entityfields/contexts/children/blacklist_param/valueProcess.js</valueProcess>
         </entityParameter>
-        <entityParameter>
-          <name>GetAllContexts_param</name>
-          <valueProcess>%aditoprj%/entity/Attribute_entity/entityfields/contexts/children/getallcontexts_param/valueProcess.js</valueProcess>
-        </entityParameter>
         <entityParameter>
           <name>InvertBlacklist_param</name>
           <valueProcess>%aditoprj%/entity/Attribute_entity/entityfields/contexts/children/invertblacklist_param/valueProcess.js</valueProcess>
diff --git a/entity/Attribute_entity/entityfields/contexts/children/getallcontexts_param/valueProcess.js b/entity/Attribute_entity/entityfields/contexts/children/getallcontexts_param/valueProcess.js
deleted file mode 100644
index 40effa01784..00000000000
--- a/entity/Attribute_entity/entityfields/contexts/children/getallcontexts_param/valueProcess.js
+++ /dev/null
@@ -1,3 +0,0 @@
-import("system.result");
-
-result.string(true);
\ No newline at end of file
diff --git a/entity/CampaignStep_entity/CampaignStep_entity.aod b/entity/CampaignStep_entity/CampaignStep_entity.aod
index 38abc14be1b..ef3741b8dfb 100644
--- a/entity/CampaignStep_entity/CampaignStep_entity.aod
+++ b/entity/CampaignStep_entity/CampaignStep_entity.aod
@@ -11,6 +11,7 @@
   </siblings>
   <grantDeleteProcess>%aditoprj%/entity/CampaignStep_entity/grantDeleteProcess.js</grantDeleteProcess>
   <contentTitleProcess>%aditoprj%/entity/CampaignStep_entity/contentTitleProcess.js</contentTitleProcess>
+  <contentDescriptionProcess>%aditoprj%/entity/CampaignStep_entity/contentDescriptionProcess.js</contentDescriptionProcess>
   <onValidation>%aditoprj%/entity/CampaignStep_entity/onValidation.js</onValidation>
   <imageProcess>%aditoprj%/entity/CampaignStep_entity/imageProcess.js</imageProcess>
   <titlePlural>Steps</titlePlural>
diff --git a/entity/CampaignStep_entity/contentDescriptionProcess.js b/entity/CampaignStep_entity/contentDescriptionProcess.js
new file mode 100644
index 00000000000..b07a72fe7cc
--- /dev/null
+++ b/entity/CampaignStep_entity/contentDescriptionProcess.js
@@ -0,0 +1,5 @@
+import("system.translate");
+import("system.datetime");
+import("system.vars");
+import("system.result");
+result.string(datetime.toDate(vars.get("$field.DATE_NEW"), translate.text("dd.MM.yyyy")));
\ No newline at end of file
diff --git a/entity/Campaign_entity/Campaign_entity.aod b/entity/Campaign_entity/Campaign_entity.aod
index 37416e7b55c..571096dc232 100644
--- a/entity/Campaign_entity/Campaign_entity.aod
+++ b/entity/Campaign_entity/Campaign_entity.aod
@@ -13,6 +13,7 @@
   </siblings>
   <grantDeleteProcess>%aditoprj%/entity/Campaign_entity/grantDeleteProcess.js</grantDeleteProcess>
   <contentTitleProcess>%aditoprj%/entity/Campaign_entity/contentTitleProcess.js</contentTitleProcess>
+  <contentDescriptionProcess>%aditoprj%/entity/Campaign_entity/contentDescriptionProcess.js</contentDescriptionProcess>
   <afterUiInit>%aditoprj%/entity/Campaign_entity/afterUiInit.js</afterUiInit>
   <useFavorites v="true" />
   <iconId>VAADIN:GROUP</iconId>
@@ -552,6 +553,9 @@
       <name>#PROVIDER_AGGREGATES</name>
       <useAggregates v="true" />
     </entityProvider>
+    <entityField>
+      <name>ACTIVE</name>
+    </entityField>
   </entityFields>
   <recordContainers>
     <dbRecordContainer>
@@ -667,6 +671,10 @@
           <isFilterable v="true" />
           <filtertype>BASIC</filtertype>
         </consumerMapping>
+        <dbRecordFieldMapping>
+          <name>ACTIVE.value</name>
+          <expression>%aditoprj%/entity/Campaign_entity/recordcontainers/db/recordfieldmappings/active.value/expression.js</expression>
+        </dbRecordFieldMapping>
       </recordFieldMappings>
       <filterExtensions>
         <filterExtensionSet>
diff --git a/entity/Campaign_entity/contentDescriptionProcess.js b/entity/Campaign_entity/contentDescriptionProcess.js
new file mode 100644
index 00000000000..b07a72fe7cc
--- /dev/null
+++ b/entity/Campaign_entity/contentDescriptionProcess.js
@@ -0,0 +1,5 @@
+import("system.translate");
+import("system.datetime");
+import("system.vars");
+import("system.result");
+result.string(datetime.toDate(vars.get("$field.DATE_NEW"), translate.text("dd.MM.yyyy")));
\ No newline at end of file
diff --git a/entity/Campaign_entity/recordcontainers/db/recordfieldmappings/active.value/expression.js b/entity/Campaign_entity/recordcontainers/db/recordfieldmappings/active.value/expression.js
new file mode 100644
index 00000000000..0c4da8fb72e
--- /dev/null
+++ b/entity/Campaign_entity/recordcontainers/db/recordfieldmappings/active.value/expression.js
@@ -0,0 +1,6 @@
+import("Context_lib");
+import("system.result");
+import("KeywordRegistry_basic");
+
+var activArr = [$KeywordRegistry.campaignState$planning(), $KeywordRegistry.campaignState$approved()];
+result.string(ContextUtils.buildActiveCaseWhen(activArr, "CAMPAIGN.STATUS"));
\ No newline at end of file
diff --git a/entity/Competition_entity/Competition_entity.aod b/entity/Competition_entity/Competition_entity.aod
index ac91f28ee4d..7e7298fd9a7 100644
--- a/entity/Competition_entity/Competition_entity.aod
+++ b/entity/Competition_entity/Competition_entity.aod
@@ -374,10 +374,6 @@
           <name>PHASE.value</name>
           <recordfield>COMPETITION.PHASE</recordfield>
         </dbRecordFieldMapping>
-        <dbRecordFieldMapping>
-          <name>OBJECT_ROWID.displayValue</name>
-          <expression>%aditoprj%/entity/Competition_entity/recordcontainers/db/recordfieldmappings/object_rowid.displayvalue/expression.js</expression>
-        </dbRecordFieldMapping>
         <dbRecordFieldMapping>
           <name>COMPETITIONID.value</name>
           <recordfield>COMPETITION.COMPETITIONID</recordfield>
diff --git a/entity/Competition_entity/entityfields/object_rowid/displayValueProcess.js b/entity/Competition_entity/entityfields/object_rowid/displayValueProcess.js
index 8b080bceea9..95c4eea5367 100644
--- a/entity/Competition_entity/entityfields/object_rowid/displayValueProcess.js
+++ b/entity/Competition_entity/entityfields/object_rowid/displayValueProcess.js
@@ -7,5 +7,5 @@ import("Context_lib");
 if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && !vars.get("$field.OBJECT_ROWID")) {
     result.string("");
 } else if (vars.exists("$field.OBJECT_TYPE") && vars.get("$field.OBJECT_TYPE")) {
-    result.string(db.cell(ContextUtils.getNameSql(vars.get("$field.OBJECT_TYPE"), vars.get("$field.OBJECT_ROWID"))));
+    result.string(ContextUtils.getTitleByContext(vars.get("$field.OBJECT_TYPE"), vars.get("$field.OBJECT_ROWID")));
 }
\ No newline at end of file
diff --git a/entity/Competition_entity/recordcontainers/db/recordfieldmappings/object_rowid.displayvalue/expression.js b/entity/Competition_entity/recordcontainers/db/recordfieldmappings/object_rowid.displayvalue/expression.js
deleted file mode 100644
index fb69d484cfa..00000000000
--- a/entity/Competition_entity/recordcontainers/db/recordfieldmappings/object_rowid.displayvalue/expression.js
+++ /dev/null
@@ -1,4 +0,0 @@
-import("system.result");
-import("Context_lib");
-
-result.string(ContextUtils.getNameSubselectSql("COMPETITION.OBJECT_TYPE", "COMPETITION.OBJECT_ROWID"))
\ No newline at end of file
diff --git a/entity/Context_entity/Context_entity.aod b/entity/Context_entity/Context_entity.aod
index c82aab16b52..a8e3222ec7e 100644
--- a/entity/Context_entity/Context_entity.aod
+++ b/entity/Context_entity/Context_entity.aod
@@ -108,11 +108,6 @@
         </entityParameter>
       </children>
     </entityProvider>
-    <entityParameter>
-      <name>GetAllContexts_param</name>
-      <expose v="true" />
-      <description>PARAMETER</description>
-    </entityParameter>
     <entityParameter>
       <name>InvertBlacklist_param</name>
       <expose v="true" />
diff --git a/entity/Context_entity/recordcontainers/jdito/contentProcess.js b/entity/Context_entity/recordcontainers/jdito/contentProcess.js
index 25682212551..1bdca6e2fa3 100644
--- a/entity/Context_entity/recordcontainers/jdito/contentProcess.js
+++ b/entity/Context_entity/recordcontainers/jdito/contentProcess.js
@@ -4,7 +4,6 @@ import("Context_lib");
 
 var blacklist
 var invertBlacklist
-var filterContexts = vars.get("$param.GetAllContexts_param") != "true";
 var whitelist;
 
 if (vars.get("$local.idvalues") && vars.get("$local.idvalues").length > 0)
@@ -23,4 +22,4 @@ else
     invertBlacklist = vars.get("$param.InvertBlacklist_param") == "true";
 }
 
-result.object(ContextUtils.getContexts(filterContexts, blacklist, invertBlacklist));
\ No newline at end of file
+result.object(ContextUtils.getContexts(blacklist, invertBlacklist));
\ No newline at end of file
diff --git a/entity/Contract_entity/Contract_entity.aod b/entity/Contract_entity/Contract_entity.aod
index 273e731918f..a31e274eac6 100644
--- a/entity/Contract_entity/Contract_entity.aod
+++ b/entity/Contract_entity/Contract_entity.aod
@@ -6,6 +6,7 @@
   <title>Contract</title>
   <grantDeleteProcess>%aditoprj%/entity/Contract_entity/grantDeleteProcess.js</grantDeleteProcess>
   <contentTitleProcess>%aditoprj%/entity/Contract_entity/contentTitleProcess.js</contentTitleProcess>
+  <contentDescriptionProcess>%aditoprj%/entity/Contract_entity/contentDescriptionProcess.js</contentDescriptionProcess>
   <afterUiInit>%aditoprj%/entity/Contract_entity/afterUiInit.js</afterUiInit>
   <onValidation>%aditoprj%/entity/Contract_entity/onValidation.js</onValidation>
   <useFavorites v="true" />
@@ -402,6 +403,12 @@
       <name>#PROVIDER_AGGREGATES</name>
       <useAggregates v="true" />
     </entityProvider>
+    <entityField>
+      <name>DATE_NEW</name>
+    </entityField>
+    <entityField>
+      <name>ACTIVE</name>
+    </entityField>
   </entityFields>
   <recordContainers>
     <dbRecordContainer>
@@ -544,6 +551,14 @@
           <recordfield>CONTRACT.CONTRACTID</recordfield>
           <aggregateType>COUNT</aggregateType>
         </aggregateFieldDbMapping>
+        <dbRecordFieldMapping>
+          <name>DATE_NEW.value</name>
+          <recordfield>CONTRACT.CONTRACTSTART</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>ACTIVE.value</name>
+          <expression>%aditoprj%/entity/Contract_entity/recordcontainers/db/recordfieldmappings/active.value/expression.js</expression>
+        </dbRecordFieldMapping>
       </recordFieldMappings>
       <filterExtensions>
         <filterExtensionSet>
diff --git a/entity/Contract_entity/contentDescriptionProcess.js b/entity/Contract_entity/contentDescriptionProcess.js
new file mode 100644
index 00000000000..03f72c03ff0
--- /dev/null
+++ b/entity/Contract_entity/contentDescriptionProcess.js
@@ -0,0 +1,16 @@
+import("system.translate");
+import("system.datetime");
+import("system.vars");
+import("system.result");
+
+var res = [translate.text("Payment method") + ": " + vars.get("$field.PAYMENT.displayValue")];
+
+if(vars.get("$field.CONTRACTDUE"))
+    res.push(translate.text("Next due date") + ": " + vars.get("$field.CONTRACTDUE"));
+
+if(vars.get("$field.CONTRACTEND"))
+    res.push(translate.text("Contract expiry date") + ": " + vars.get("$field.CONTRACTEND"))
+                      
+res.push(translate.text("Creation date") + ": " + datetime.toDate(vars.get("$field.DATE_NEW"), translate.text("dd.MM.yyyy")));
+
+result.string(res.join(" | "));
\ No newline at end of file
diff --git a/entity/Contract_entity/contentTitleProcess.js b/entity/Contract_entity/contentTitleProcess.js
index 302a1d406e4..94a08f9ad5c 100644
--- a/entity/Contract_entity/contentTitleProcess.js
+++ b/entity/Contract_entity/contentTitleProcess.js
@@ -1,4 +1,6 @@
 import("system.vars");
 import("system.result");
 
-result.string(vars.get("$field.CONTRACTCODE_DISPLAY_fieldGroup"));
\ No newline at end of file
+var res = [vars.get("$field.CONTRACTCODE_DISPLAY_fieldGroup"), vars.get("$field.CONTRACTSTATUS.displayValue")];
+
+result.string(res.join(" | "));
\ No newline at end of file
diff --git a/entity/Contract_entity/recordcontainers/db/recordfieldmappings/active.value/expression.js b/entity/Contract_entity/recordcontainers/db/recordfieldmappings/active.value/expression.js
new file mode 100644
index 00000000000..d788aeadb92
--- /dev/null
+++ b/entity/Contract_entity/recordcontainers/db/recordfieldmappings/active.value/expression.js
@@ -0,0 +1,6 @@
+import("Context_lib");
+import("system.result");
+import("KeywordRegistry_basic");
+
+var activArr = [$KeywordRegistry.contractState$validLimited(), $KeywordRegistry.contractState$validUnlimited(), $KeywordRegistry.contractState$notSigned()];
+result.string(ContextUtils.buildActiveCaseWhen(activArr, "CONTRACT.CONTRACTSTATUS"));
\ No newline at end of file
diff --git a/entity/DocumentTemplatePlaceOfUse_entity/DocumentTemplatePlaceOfUse_entity.aod b/entity/DocumentTemplatePlaceOfUse_entity/DocumentTemplatePlaceOfUse_entity.aod
index 6db556011a3..3e77638a51c 100644
--- a/entity/DocumentTemplatePlaceOfUse_entity/DocumentTemplatePlaceOfUse_entity.aod
+++ b/entity/DocumentTemplatePlaceOfUse_entity/DocumentTemplatePlaceOfUse_entity.aod
@@ -43,10 +43,6 @@
           <name>Blacklist_param</name>
           <valueProcess>%aditoprj%/entity/DocumentTemplatePlaceOfUse_entity/entityfields/contextdocumenttemplateplaceofuse/children/blacklist_param/valueProcess.js</valueProcess>
         </entityParameter>
-        <entityParameter>
-          <name>GetAllContexts_param</name>
-          <valueProcess>%aditoprj%/entity/DocumentTemplatePlaceOfUse_entity/entityfields/contextdocumenttemplateplaceofuse/children/getallcontexts_param/valueProcess.js</valueProcess>
-        </entityParameter>
       </children>
     </entityConsumer>
     <entityProvider>
diff --git a/entity/DocumentTemplatePlaceOfUse_entity/entityfields/contextdocumenttemplateplaceofuse/children/getallcontexts_param/valueProcess.js b/entity/DocumentTemplatePlaceOfUse_entity/entityfields/contextdocumenttemplateplaceofuse/children/getallcontexts_param/valueProcess.js
deleted file mode 100644
index 40effa01784..00000000000
--- a/entity/DocumentTemplatePlaceOfUse_entity/entityfields/contextdocumenttemplateplaceofuse/children/getallcontexts_param/valueProcess.js
+++ /dev/null
@@ -1,3 +0,0 @@
-import("system.result");
-
-result.string(true);
\ No newline at end of file
diff --git a/entity/Forecast_entity/Forecast_entity.aod b/entity/Forecast_entity/Forecast_entity.aod
index f553dde8f46..75fd4c7ae92 100644
--- a/entity/Forecast_entity/Forecast_entity.aod
+++ b/entity/Forecast_entity/Forecast_entity.aod
@@ -171,10 +171,6 @@
           <name>OBJECT_ROWID.value</name>
           <recordfield>FORECAST.OBJECT_ROWID</recordfield>
         </dbRecordFieldMapping>
-        <dbRecordFieldMapping>
-          <name>OBJECT_ROWID.displayValue</name>
-          <expression>%aditoprj%/entity/Forecast_entity/recordcontainers/db/recordfieldmappings/object_rowid.displayvalue/expression.js</expression>
-        </dbRecordFieldMapping>
         <dbRecordFieldMapping>
           <name>OBJECT_TYPE.value</name>
           <recordfield>FORECAST.OBJECT_TYPE</recordfield>
diff --git a/entity/Forecast_entity/entityfields/object_rowid/displayValueProcess.js b/entity/Forecast_entity/entityfields/object_rowid/displayValueProcess.js
index 8b080bceea9..95c4eea5367 100644
--- a/entity/Forecast_entity/entityfields/object_rowid/displayValueProcess.js
+++ b/entity/Forecast_entity/entityfields/object_rowid/displayValueProcess.js
@@ -7,5 +7,5 @@ import("Context_lib");
 if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && !vars.get("$field.OBJECT_ROWID")) {
     result.string("");
 } else if (vars.exists("$field.OBJECT_TYPE") && vars.get("$field.OBJECT_TYPE")) {
-    result.string(db.cell(ContextUtils.getNameSql(vars.get("$field.OBJECT_TYPE"), vars.get("$field.OBJECT_ROWID"))));
+    result.string(ContextUtils.getTitleByContext(vars.get("$field.OBJECT_TYPE"), vars.get("$field.OBJECT_ROWID")));
 }
\ No newline at end of file
diff --git a/entity/Forecast_entity/recordcontainers/db/recordfieldmappings/object_rowid.displayvalue/expression.js b/entity/Forecast_entity/recordcontainers/db/recordfieldmappings/object_rowid.displayvalue/expression.js
deleted file mode 100644
index 856c1bb3cff..00000000000
--- a/entity/Forecast_entity/recordcontainers/db/recordfieldmappings/object_rowid.displayvalue/expression.js
+++ /dev/null
@@ -1,4 +0,0 @@
-import("system.result");
-import("Context_lib");
-
-result.string(ContextUtils.getNameSubselectSql("FORECAST.OBJECT_TYPE", "FORECAST.OBJECT_ROWID"))
\ No newline at end of file
diff --git a/entity/Leadimport_entity/Leadimport_entity.aod b/entity/Leadimport_entity/Leadimport_entity.aod
index e5241d647c8..e14d1cf8eba 100644
--- a/entity/Leadimport_entity/Leadimport_entity.aod
+++ b/entity/Leadimport_entity/Leadimport_entity.aod
@@ -10,6 +10,7 @@
   <grantDelete v="true" />
   <grantDeleteProcess>%aditoprj%/entity/Leadimport_entity/grantDeleteProcess.js</grantDeleteProcess>
   <contentTitleProcess>%aditoprj%/entity/Leadimport_entity/contentTitleProcess.js</contentTitleProcess>
+  <contentDescriptionProcess>%aditoprj%/entity/Leadimport_entity/contentDescriptionProcess.js</contentDescriptionProcess>
   <iconId>NEON:IMPORT</iconId>
   <imageProcess>%aditoprj%/entity/Leadimport_entity/imageProcess.js</imageProcess>
   <titlePlural>Lead Imports</titlePlural>
@@ -17,6 +18,14 @@
   <entityFields>
     <entityProvider>
       <name>#PROVIDER</name>
+      <dependencies>
+        <entityDependency>
+          <name>451f0237-27f9-4018-a165-9bb4857d6565</name>
+          <entityName>Object_entity</entityName>
+          <fieldName>Leadimports</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+      </dependencies>
     </entityProvider>
     <entityField>
       <name>NAME</name>
diff --git a/entity/Leadimport_entity/contentDescriptionProcess.js b/entity/Leadimport_entity/contentDescriptionProcess.js
new file mode 100644
index 00000000000..5fa0cb58bc2
--- /dev/null
+++ b/entity/Leadimport_entity/contentDescriptionProcess.js
@@ -0,0 +1,5 @@
+import("system.datetime");
+import("system.vars");
+import("system.result");
+import("system.translate");
+result.string(datetime.toDate(vars.get("$field.DATE_NEW"), translate.text("dd.MM.yyyy")));
\ No newline at end of file
diff --git a/entity/Member_entity/Member_entity.aod b/entity/Member_entity/Member_entity.aod
index 8706484f0ff..a416ef148b2 100644
--- a/entity/Member_entity/Member_entity.aod
+++ b/entity/Member_entity/Member_entity.aod
@@ -412,10 +412,6 @@
           <name>OBJECTMEMBERID.value</name>
           <recordfield>OBJECTMEMBER.OBJECTMEMBERID</recordfield>
         </dbRecordFieldMapping>
-        <dbRecordFieldMapping>
-          <name>OBJECT_ROWID.displayValue</name>
-          <expression>%aditoprj%/entity/Member_entity/recordcontainers/db/recordfieldmappings/object_rowid.displayvalue/expression.js</expression>
-        </dbRecordFieldMapping>
         <dbRecordFieldMapping>
           <name>MEMBERROLE.displayValue</name>
           <expression>%aditoprj%/entity/Member_entity/recordcontainers/db/recordfieldmappings/memberrole.displayvalue/expression.js</expression>
diff --git a/entity/Member_entity/entityfields/object_rowid/displayValueProcess.js b/entity/Member_entity/entityfields/object_rowid/displayValueProcess.js
index 8b080bceea9..95c4eea5367 100644
--- a/entity/Member_entity/entityfields/object_rowid/displayValueProcess.js
+++ b/entity/Member_entity/entityfields/object_rowid/displayValueProcess.js
@@ -7,5 +7,5 @@ import("Context_lib");
 if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && !vars.get("$field.OBJECT_ROWID")) {
     result.string("");
 } else if (vars.exists("$field.OBJECT_TYPE") && vars.get("$field.OBJECT_TYPE")) {
-    result.string(db.cell(ContextUtils.getNameSql(vars.get("$field.OBJECT_TYPE"), vars.get("$field.OBJECT_ROWID"))));
+    result.string(ContextUtils.getTitleByContext(vars.get("$field.OBJECT_TYPE"), vars.get("$field.OBJECT_ROWID")));
 }
\ No newline at end of file
diff --git a/entity/Member_entity/recordcontainers/db/recordfieldmappings/object_rowid.displayvalue/expression.js b/entity/Member_entity/recordcontainers/db/recordfieldmappings/object_rowid.displayvalue/expression.js
deleted file mode 100644
index a5d62617bee..00000000000
--- a/entity/Member_entity/recordcontainers/db/recordfieldmappings/object_rowid.displayvalue/expression.js
+++ /dev/null
@@ -1,10 +0,0 @@
-import("system.vars");
-import("system.result");
-import("Context_lib");
-
-//TODO: refactor:
-//whenever we want to shrink data for a single object it's not needed to resolve the objects name where we're from
-if (vars.get("$param.ObjectType_param") == null)
-    result.string(ContextUtils.getNameSubselectSql("OBJECTMEMBER.OBJECT_TYPE", "OBJECTMEMBER.OBJECT_ROWID"));
-else
-    result.string("'OBJECT_ROWID.displayValue not loaded'");
\ No newline at end of file
diff --git a/entity/ObjectTree_entity/entityfields/target_id/displayValueProcess.js b/entity/ObjectTree_entity/entityfields/target_id/displayValueProcess.js
index d074689525f..81438bdcb9f 100644
--- a/entity/ObjectTree_entity/entityfields/target_id/displayValueProcess.js
+++ b/entity/ObjectTree_entity/entityfields/target_id/displayValueProcess.js
@@ -6,5 +6,5 @@ import("Context_lib");
 
 if (vars.get("$field.TARGET_ID") && vars.get("$field.TARGET_CONTEXT"))
 {
-    result.string(db.cell(ContextUtils.getNameSql(vars.get("$field.TARGET_CONTEXT"), vars.get("$field.TARGET_ID"))));
+    result.string(ContextUtils.getTitleByContext(vars.get("$field.TARGET_CONTEXT"), vars.get("$field.TARGET_ID")));
 }
\ No newline at end of file
diff --git a/entity/ObjectTree_entity/recordcontainers/jdito/contentProcess.js b/entity/ObjectTree_entity/recordcontainers/jdito/contentProcess.js
index d1d925c81b4..7980a2bd433 100644
--- a/entity/ObjectTree_entity/recordcontainers/jdito/contentProcess.js
+++ b/entity/ObjectTree_entity/recordcontainers/jdito/contentProcess.js
@@ -298,7 +298,7 @@ function _insertEntry(pTree, pEntryData, pNodeId, pLayer, pObjectType, pNewRelat
     pEntryData.forEach(function ([objectId, objectRelationId, objectType, relationTitle, info, objectRelationTypeId], i)
     {
         //TODO: entities.getRow, check if this is possible with fewer queries
-        var display = db.cell(ContextUtils.getNameSql(pObjectType, objectId));
+        var display = ContextUtils.getTitleByContext(pObjectType, objectId);
         // TODO: Icon                       
         var uid = [objectId, i, objectRelationTypeId, pObjectType, pNodeId, objectType, objectRelationId, pHierarchy];
 
diff --git a/entity/Object_entity/Object_entity.aod b/entity/Object_entity/Object_entity.aod
index 1a571fad307..e3633e2483c 100644
--- a/entity/Object_entity/Object_entity.aod
+++ b/entity/Object_entity/Object_entity.aod
@@ -283,6 +283,14 @@
         <fieldName>#PROVIDER</fieldName>
       </dependency>
     </entityConsumer>
+    <entityConsumer>
+      <name>Leadimports</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Leadimport_entity</entityName>
+        <fieldName>#PROVIDER</fieldName>
+      </dependency>
+    </entityConsumer>
   </entityFields>
   <recordContainers>
     <jDitoRecordContainer>
diff --git a/entity/Object_entity/recordcontainers/jdito/contentProcess.js b/entity/Object_entity/recordcontainers/jdito/contentProcess.js
index 27b0b7e83a1..bf77eb9a2d0 100644
--- a/entity/Object_entity/recordcontainers/jdito/contentProcess.js
+++ b/entity/Object_entity/recordcontainers/jdito/contentProcess.js
@@ -19,7 +19,7 @@ if (vars.get("$param.ObjectType_param"))
     if (vars.exists("$param.ContactId") && vars.get("$param.ContactId"))
         contactId = vars.get("$param.ContactId");
     
-    result.object(db.table(ContextUtils.getContextDataSql(objectType, contactId, false, undefined, false, null, null, excludedIds)))
+    result.object(ContextUtils.loadContent(ContextUtils.getEntity(objectType), [contactId], ["#UID", "#CONTENTTITLE"], excludedIds))
 }
 else
 {
diff --git a/entity/Offer_entity/Offer_entity.aod b/entity/Offer_entity/Offer_entity.aod
index 0491466e0b6..e486ce29844 100644
--- a/entity/Offer_entity/Offer_entity.aod
+++ b/entity/Offer_entity/Offer_entity.aod
@@ -10,6 +10,7 @@
   <grantUpdateProcess>%aditoprj%/entity/Offer_entity/grantUpdateProcess.js</grantUpdateProcess>
   <grantDeleteProcess>%aditoprj%/entity/Offer_entity/grantDeleteProcess.js</grantDeleteProcess>
   <contentTitleProcess>%aditoprj%/entity/Offer_entity/contentTitleProcess.js</contentTitleProcess>
+  <contentDescriptionProcess>%aditoprj%/entity/Offer_entity/contentDescriptionProcess.js</contentDescriptionProcess>
   <afterUiInit>%aditoprj%/entity/Offer_entity/afterUiInit.js</afterUiInit>
   <useFavorites v="true" />
   <iconId>VAADIN:CART</iconId>
@@ -1052,6 +1053,9 @@
       <name>#PROVIDER_AGGREGATES</name>
       <useAggregates v="true" />
     </entityProvider>
+    <entityField>
+      <name>ACTIVE</name>
+    </entityField>
   </entityFields>
   <recordContainers>
     <dbRecordContainer>
@@ -1243,10 +1247,6 @@
           <name>OBJECT_TYPE.value</name>
           <recordfield>OFFER.OBJECT_TYPE</recordfield>
         </dbRecordFieldMapping>
-        <dbRecordFieldMapping>
-          <name>OBJECT_ROWID.displayValue</name>
-          <expression>%aditoprj%/entity/Offer_entity/recordcontainers/db/recordfieldmappings/object_rowid.displayvalue/expression.js</expression>
-        </dbRecordFieldMapping>
         <dbRecordFieldMapping>
           <name>CONTACT_ID.value</name>
           <recordfield>OFFER.CONTACT_ID</recordfield>
@@ -1304,6 +1304,10 @@
           <name>OFFER_ID.value</name>
           <recordfield>OFFER.OFFER_ID</recordfield>
         </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>ACTIVE.value</name>
+          <expression>%aditoprj%/entity/Offer_entity/recordcontainers/db/recordfieldmappings/active.value/expression.js</expression>
+        </dbRecordFieldMapping>
       </recordFieldMappings>
       <filterExtensions>
         <filterExtensionSet>
diff --git a/entity/Offer_entity/contentDescriptionProcess.js b/entity/Offer_entity/contentDescriptionProcess.js
new file mode 100644
index 00000000000..f1afab18db7
--- /dev/null
+++ b/entity/Offer_entity/contentDescriptionProcess.js
@@ -0,0 +1,12 @@
+import("Util_lib");
+import("system.eMath");
+import("system.translate");
+import("system.datetime");
+import("system.vars");
+import("system.result");
+
+var res = [translate.text("Total gross") + ": " + vars.get("$field.TotalGross.displayValue"), 
+           translate.text("Probability") + ": " + vars.get("$field.PROBABILITY.displayValue"),
+           translate.text("Creation date") + ": " + datetime.toDate(vars.get("$field.DATE_NEW"), translate.text("dd.MM.yyyy"))];
+
+result.string(res.join(" | "));
\ No newline at end of file
diff --git a/entity/Offer_entity/contentTitleProcess.js b/entity/Offer_entity/contentTitleProcess.js
index 98f9e420320..e90d32e0f10 100644
--- a/entity/Offer_entity/contentTitleProcess.js
+++ b/entity/Offer_entity/contentTitleProcess.js
@@ -1,4 +1,6 @@
 import("system.vars");
 import("system.result");
 
-result.string(vars.get("$field.OfferCode_VersNr_fieldgroup"));
\ No newline at end of file
+var res = [vars.get("$field.OfferCode_VersNr_fieldgroup"), vars.get("$field.STATUS.displayValue")]
+
+result.string(res.join(" | "));
\ No newline at end of file
diff --git a/entity/Offer_entity/entityfields/object_rowid/displayValueProcess.js b/entity/Offer_entity/entityfields/object_rowid/displayValueProcess.js
index fe2b7c72502..8074aca46e2 100644
--- a/entity/Offer_entity/entityfields/object_rowid/displayValueProcess.js
+++ b/entity/Offer_entity/entityfields/object_rowid/displayValueProcess.js
@@ -7,5 +7,5 @@ import("Context_lib");
 if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && vars.get("$field.OBJECT_ROWID") == null) {
     result.string("");
 } else if (vars.exists("$field.OBJECT_TYPE") && vars.get("$field.OBJECT_TYPE")) {
-    result.string(db.cell(ContextUtils.getNameSql(vars.get("$field.OBJECT_TYPE"), vars.get("$field.OBJECT_ROWID"))));
+    result.string(ContextUtils.getTitleByContext(vars.get("$field.OBJECT_TYPE"), vars.get("$field.OBJECT_ROWID")));
 }
\ No newline at end of file
diff --git a/entity/Offer_entity/recordcontainers/db/recordfieldmappings/active.value/expression.js b/entity/Offer_entity/recordcontainers/db/recordfieldmappings/active.value/expression.js
new file mode 100644
index 00000000000..6da46407ad5
--- /dev/null
+++ b/entity/Offer_entity/recordcontainers/db/recordfieldmappings/active.value/expression.js
@@ -0,0 +1,6 @@
+import("Context_lib");
+import("system.result");
+import("KeywordRegistry_basic");
+
+var activArr = [$KeywordRegistry.offerStatus$open(), $KeywordRegistry.offerStatus$checked(), $KeywordRegistry.offerStatus$sent()];
+result.string(ContextUtils.buildActiveCaseWhen(activArr, "OFFER.STATUS"));
\ No newline at end of file
diff --git a/entity/Offer_entity/recordcontainers/db/recordfieldmappings/object_rowid.displayvalue/expression.js b/entity/Offer_entity/recordcontainers/db/recordfieldmappings/object_rowid.displayvalue/expression.js
deleted file mode 100644
index c0332af5cb5..00000000000
--- a/entity/Offer_entity/recordcontainers/db/recordfieldmappings/object_rowid.displayvalue/expression.js
+++ /dev/null
@@ -1,4 +0,0 @@
-import("system.result");
-import("Context_lib");
-
-result.string(ContextUtils.getNameSubselectSql("OFFER.OBJECT_TYPE", "OFFER.OBJECT_ROWID"))
\ No newline at end of file
diff --git a/entity/Order_entity/Order_entity.aod b/entity/Order_entity/Order_entity.aod
index 2d2ea6554be..64b551ee2df 100644
--- a/entity/Order_entity/Order_entity.aod
+++ b/entity/Order_entity/Order_entity.aod
@@ -6,6 +6,7 @@
   <title>Receipt</title>
   <grantDeleteProcess>%aditoprj%/entity/Order_entity/grantDeleteProcess.js</grantDeleteProcess>
   <contentTitleProcess>%aditoprj%/entity/Order_entity/contentTitleProcess.js</contentTitleProcess>
+  <contentDescriptionProcess>%aditoprj%/entity/Order_entity/contentDescriptionProcess.js</contentDescriptionProcess>
   <afterUiInit>%aditoprj%/entity/Order_entity/afterUiInit.js</afterUiInit>
   <useFavorites v="true" />
   <iconId>VAADIN:DOLLAR</iconId>
@@ -106,6 +107,11 @@
     <entityConsumer>
       <name>Orderitems</name>
       <description></description>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Orderitem_entity</entityName>
+        <fieldName>Orderitems</fieldName>
+      </dependency>
       <children>
         <entityParameter>
           <name>OrderId_param</name>
@@ -131,11 +137,6 @@
           <mandatory v="true" />
         </entityParameter>
       </children>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Orderitem_entity</entityName>
-        <fieldName>Orderitems</fieldName>
-      </dependency>
     </entityConsumer>
     <entityField>
       <name>NET</name>
@@ -197,6 +198,11 @@
     <entityConsumer>
       <name>Documents</name>
       <selectionMode>MULTI</selectionMode>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Document_entity</entityName>
+        <fieldName>Documents</fieldName>
+      </dependency>
       <children>
         <entityParameter>
           <name>AssignmentRowId_param</name>
@@ -207,15 +213,15 @@
           <valueProcess>%aditoprj%/entity/Order_entity/entityfields/documents/children/assignmenttable_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Document_entity</entityName>
-        <fieldName>Documents</fieldName>
-      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>MainDocuments</name>
       <stateProcess>%aditoprj%/entity/Order_entity/entityfields/maindocuments/stateProcess.js</stateProcess>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Document_entity</entityName>
+        <fieldName>MainDocuments</fieldName>
+      </dependency>
       <children>
         <entityParameter>
           <name>AssignmentRowId_param</name>
@@ -226,28 +232,28 @@
           <valueProcess>%aditoprj%/entity/Order_entity/entityfields/maindocuments/children/assignmenttable_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Document_entity</entityName>
-        <fieldName>MainDocuments</fieldName>
-      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>Salesprojects</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Salesproject_entity</entityName>
+        <fieldName>Salesprojects</fieldName>
+      </dependency>
       <children>
         <entityParameter>
           <name>ContactId_param</name>
           <valueProcess>%aditoprj%/entity/Order_entity/entityfields/salesprojects/children/contactid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Salesproject_entity</entityName>
-        <fieldName>Salesprojects</fieldName>
-      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>KeywordCurrencies</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>SpecificContainerKeywords</fieldName>
+      </dependency>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
@@ -255,14 +261,14 @@
           <expose v="false" />
         </entityParameter>
       </children>
+    </entityConsumer>
+    <entityConsumer>
+      <name>KeywordStates</name>
       <dependency>
         <name>dependency</name>
         <entityName>KeywordEntry_entity</entityName>
         <fieldName>SpecificContainerKeywords</fieldName>
       </dependency>
-    </entityConsumer>
-    <entityConsumer>
-      <name>KeywordStates</name>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
@@ -270,11 +276,6 @@
           <expose v="false" />
         </entityParameter>
       </children>
-      <dependency>
-        <name>dependency</name>
-        <entityName>KeywordEntry_entity</entityName>
-        <fieldName>SpecificContainerKeywords</fieldName>
-      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>Languages</name>
@@ -293,6 +294,11 @@
     </entityParameter>
     <entityConsumer>
       <name>Activities</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Activity_entity</entityName>
+        <fieldName>LinkedObjects</fieldName>
+      </dependency>
       <children>
         <entityParameter>
           <name>RowId_param</name>
@@ -307,11 +313,6 @@
           <valueProcess>%aditoprj%/entity/Order_entity/entityfields/activities/children/presetlinks_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Activity_entity</entityName>
-        <fieldName>LinkedObjects</fieldName>
-      </dependency>
     </entityConsumer>
     <entityField>
       <name>OFFER_ID</name>
@@ -325,6 +326,11 @@
     <entityConsumer>
       <name>Tasks</name>
       <stateProcess>%aditoprj%/entity/Order_entity/entityfields/tasks/stateProcess.js</stateProcess>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Task_entity</entityName>
+        <fieldName>Tasks</fieldName>
+      </dependency>
       <children>
         <entityParameter>
           <name>RowId_param</name>
@@ -339,15 +345,15 @@
           <valueProcess>%aditoprj%/entity/Order_entity/entityfields/tasks/children/presetlinks_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Task_entity</entityName>
-        <fieldName>Tasks</fieldName>
-      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>Attributes</name>
       <onValidation>%aditoprj%/entity/Order_entity/entityfields/attributes/onValidation.js</onValidation>
+      <dependency>
+        <name>dependency</name>
+        <entityName>AttributeRelation_entity</entityName>
+        <fieldName>AttributeRelations</fieldName>
+      </dependency>
       <children>
         <entityParameter>
           <name>ObjectRowId_param</name>
@@ -358,15 +364,15 @@
           <valueProcess>%aditoprj%/entity/Order_entity/entityfields/attributes/children/objecttype_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-      <dependency>
-        <name>dependency</name>
-        <entityName>AttributeRelation_entity</entityName>
-        <fieldName>AttributeRelations</fieldName>
-      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>AttributeTree</name>
       <stateProcess>%aditoprj%/entity/Order_entity/entityfields/attributetree/stateProcess.js</stateProcess>
+      <dependency>
+        <name>dependency</name>
+        <entityName>AttributeRelation_entity</entityName>
+        <fieldName>TreeProvider</fieldName>
+      </dependency>
       <children>
         <entityParameter>
           <name>ObjectType_param</name>
@@ -377,25 +383,20 @@
           <valueProcess>%aditoprj%/entity/Order_entity/entityfields/attributetree/children/objectrowid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-      <dependency>
-        <name>dependency</name>
-        <entityName>AttributeRelation_entity</entityName>
-        <fieldName>TreeProvider</fieldName>
-      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>LogHistories</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>LogHistory_entity</entityName>
+        <fieldName>LogHistoryProvider</fieldName>
+      </dependency>
       <children>
         <entityParameter>
           <name>tablenames_param</name>
           <valueProcess>%aditoprj%/entity/Order_entity/entityfields/loghistories/children/tablenames_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-      <dependency>
-        <name>dependency</name>
-        <entityName>LogHistory_entity</entityName>
-        <fieldName>LogHistoryProvider</fieldName>
-      </dependency>
     </entityConsumer>
     <entityField>
       <name>ORDERTYPE</name>
@@ -473,31 +474,31 @@
     </entityField>
     <entityConsumer>
       <name>KeywordOrderTypes</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>SpecificContainerKeywords</fieldName>
+      </dependency>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
           <valueProcess>%aditoprj%/entity/Order_entity/entityfields/keywordordertypes/children/containername_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+    </entityConsumer>
+    <entityConsumer>
+      <name>KeywordDunningLevels</name>
       <dependency>
         <name>dependency</name>
         <entityName>KeywordEntry_entity</entityName>
         <fieldName>SpecificContainerKeywords</fieldName>
       </dependency>
-    </entityConsumer>
-    <entityConsumer>
-      <name>KeywordDunningLevels</name>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
           <valueProcess>%aditoprj%/entity/Order_entity/entityfields/keyworddunninglevels/children/containername_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-      <dependency>
-        <name>dependency</name>
-        <entityName>KeywordEntry_entity</entityName>
-        <fieldName>SpecificContainerKeywords</fieldName>
-      </dependency>
     </entityConsumer>
     <entityField>
       <name>OBJECT_ROWID</name>
@@ -525,6 +526,11 @@
     </entityField>
     <entityConsumer>
       <name>Objects</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Object_entity</entityName>
+        <fieldName>FilteredObjects</fieldName>
+      </dependency>
       <children>
         <entityParameter>
           <name>ContactId_param</name>
@@ -535,14 +541,14 @@
           <valueProcess>%aditoprj%/entity/Order_entity/entityfields/objects/children/objecttype_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Object_entity</entityName>
-        <fieldName>FilteredObjects</fieldName>
-      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>Contexts</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Context_entity</entityName>
+        <fieldName>Exclusive</fieldName>
+      </dependency>
       <children>
         <entityParameter>
           <name>Blacklist_param</name>
@@ -553,11 +559,6 @@
           <valueProcess>%aditoprj%/entity/Order_entity/entityfields/contexts/children/invertblacklist_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Context_entity</entityName>
-        <fieldName>Exclusive</fieldName>
-      </dependency>
     </entityConsumer>
     <entityParameter>
       <name>PossibleConnectionTypes</name>
@@ -610,46 +611,46 @@
     </entityField>
     <entityConsumer>
       <name>KeywordPaymentTerms</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>SpecificContainerKeywords</fieldName>
+      </dependency>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
           <valueProcess>%aditoprj%/entity/Order_entity/entityfields/keywordpaymentterms/children/containername_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+    </entityConsumer>
+    <entityConsumer>
+      <name>KeywordDeliveryTerms</name>
       <dependency>
         <name>dependency</name>
         <entityName>KeywordEntry_entity</entityName>
         <fieldName>SpecificContainerKeywords</fieldName>
       </dependency>
-    </entityConsumer>
-    <entityConsumer>
-      <name>KeywordDeliveryTerms</name>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
           <valueProcess>%aditoprj%/entity/Order_entity/entityfields/keyworddeliveryterms/children/containername_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-      <dependency>
-        <name>dependency</name>
-        <entityName>KeywordEntry_entity</entityName>
-        <fieldName>SpecificContainerKeywords</fieldName>
-      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>PossibleAddresses</name>
       <documentation>%aditoprj%/entity/Order_entity/entityfields/possibleaddresses/documentation.adoc</documentation>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Address_entity</entityName>
+        <fieldName>OrganisationAndContactAddresses</fieldName>
+      </dependency>
       <children>
         <entityParameter>
           <name>ContactId_param</name>
           <valueProcess>%aditoprj%/entity/Order_entity/entityfields/possibleaddresses/children/contactid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Address_entity</entityName>
-        <fieldName>OrganisationAndContactAddresses</fieldName>
-      </dependency>
     </entityConsumer>
     <entityField>
       <name>NOTICE</name>
@@ -666,20 +667,25 @@
     </entityField>
     <entityConsumer>
       <name>Offers</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Offer_entity</entityName>
+        <fieldName>ContactOffers</fieldName>
+      </dependency>
       <children>
         <entityParameter>
           <name>ContactId_param</name>
           <valueProcess>%aditoprj%/entity/Order_entity/entityfields/offers/children/contactid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Offer_entity</entityName>
-        <fieldName>ContactOffers</fieldName>
-      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>DocumentTemplateTexHeader</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>DocumentTemplate_entity</entityName>
+        <fieldName>DocumentTemplateProvider</fieldName>
+      </dependency>
       <children>
         <entityParameter>
           <name>DocumentTemplateType_param</name>
@@ -690,14 +696,14 @@
           <valueProcess>%aditoprj%/entity/Order_entity/entityfields/documenttemplatetexheader/children/documenttemplatetypeclassification_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+    </entityConsumer>
+    <entityConsumer>
+      <name>DocumentTemplateTexFooter</name>
       <dependency>
         <name>dependency</name>
         <entityName>DocumentTemplate_entity</entityName>
         <fieldName>DocumentTemplateProvider</fieldName>
       </dependency>
-    </entityConsumer>
-    <entityConsumer>
-      <name>DocumentTemplateTexFooter</name>
       <children>
         <entityParameter>
           <name>DocumentTemplateType_param</name>
@@ -708,11 +714,6 @@
           <valueProcess>%aditoprj%/entity/Order_entity/entityfields/documenttemplatetexfooter/children/documenttemplatetypeclassification_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-      <dependency>
-        <name>dependency</name>
-        <entityName>DocumentTemplate_entity</entityName>
-        <fieldName>DocumentTemplateProvider</fieldName>
-      </dependency>
     </entityConsumer>
     <entityField>
       <name>ChosenTexHeader</name>
@@ -924,6 +925,14 @@
       <expose v="true" />
       <description></description>
     </entityParameter>
+    <entityField>
+      <name>DATE_NEW</name>
+      <contentType>DATE</contentType>
+      <resolution>DAY</resolution>
+    </entityField>
+    <entityField>
+      <name>ACTIVE</name>
+    </entityField>
   </entityFields>
   <recordContainers>
     <dbRecordContainer>
@@ -1080,14 +1089,6 @@
           <name>OBJECT_ROWID.value</name>
           <recordfield>SALESORDER.OBJECT_ROWID</recordfield>
         </dbRecordFieldMapping>
-        <dbRecordFieldMapping>
-          <name>OBJECT_ROWID.displayValue</name>
-          <expression>%aditoprj%/entity/Order_entity/recordcontainers/db/recordfieldmappings/object_rowid.displayvalue/expression.js</expression>
-        </dbRecordFieldMapping>
-        <dbRecordFieldMapping>
-          <name>OFFER_ID.displayValue</name>
-          <expression>%aditoprj%/entity/Order_entity/recordcontainers/db/recordfieldmappings/offer_id.displayvalue/expression.js</expression>
-        </dbRecordFieldMapping>
         <dbRecordFieldMapping>
           <name>OBJECT_TYPE.value</name>
           <recordfield>SALESORDER.OBJECT_TYPE</recordfield>
@@ -1147,6 +1148,14 @@
           <recordfield>SALESORDER.SALESORDERID</recordfield>
           <aggregateType>COUNT</aggregateType>
         </aggregateFieldDbMapping>
+        <dbRecordFieldMapping>
+          <name>DATE_NEW.value</name>
+          <recordfield>SALESORDER.SALESORDERDATE</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>ACTIVE.value</name>
+          <expression>%aditoprj%/entity/Order_entity/recordcontainers/db/recordfieldmappings/active.value/expression.js</expression>
+        </dbRecordFieldMapping>
       </recordFieldMappings>
       <filterExtensions>
         <filterExtension>
diff --git a/entity/Order_entity/contentDescriptionProcess.js b/entity/Order_entity/contentDescriptionProcess.js
new file mode 100644
index 00000000000..bd351d26e62
--- /dev/null
+++ b/entity/Order_entity/contentDescriptionProcess.js
@@ -0,0 +1,19 @@
+import("system.logging");
+import("system.translate");
+import("system.datetime");
+import("system.vars");
+import("system.result");
+import("KeywordRegistry_basic");
+
+var orderstatus = vars.get("$field.ORDERSTATUS") == "1" ? translate.text("Yes"): translate.text("No")
+
+var res = [translate.text("Sent") + ": " + orderstatus, 
+           translate.text("Total gross") + ": " + vars.get("$field.TotalGross.displayValue")]
+
+if(vars.get("$field.PAYDATE"))
+    res.push(translate.text("Pay date") + ": " + datetime.toDate(vars.get("$field.PAYDATE"), translate.text("dd.MM.yyyy")))
+
+
+res.push(translate.text("Creation date") + ": " + datetime.toDate(vars.get("$field.DATE_NEW"), translate.text("dd.MM.yyyy")));
+    
+result.string(res.join(" | "));
\ No newline at end of file
diff --git a/entity/Order_entity/contentTitleProcess.js b/entity/Order_entity/contentTitleProcess.js
index efca7174f4e..376625c4943 100644
--- a/entity/Order_entity/contentTitleProcess.js
+++ b/entity/Order_entity/contentTitleProcess.js
@@ -4,4 +4,9 @@ import("system.translate");
 import("system.vars");
 import("system.result");
 
-result.string(KeywordUtils.getViewValue($KeywordRegistry.orderType(), vars.get("$field.ORDERTYPE")) +" - "+ vars.get("$field.SALESORDERCODE"));
+var res = [vars.get("$field.SALESORDERCODE")];
+
+if(vars.get("$field.CANCELLATION") == "1")
+    res.push(translate.text("${ORDER_CANCELLED}"));
+
+result.string(res.join(" | "));
diff --git a/entity/Order_entity/entityfields/object_rowid/displayValueProcess.js b/entity/Order_entity/entityfields/object_rowid/displayValueProcess.js
index 8b080bceea9..95c4eea5367 100644
--- a/entity/Order_entity/entityfields/object_rowid/displayValueProcess.js
+++ b/entity/Order_entity/entityfields/object_rowid/displayValueProcess.js
@@ -7,5 +7,5 @@ import("Context_lib");
 if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && !vars.get("$field.OBJECT_ROWID")) {
     result.string("");
 } else if (vars.exists("$field.OBJECT_TYPE") && vars.get("$field.OBJECT_TYPE")) {
-    result.string(db.cell(ContextUtils.getNameSql(vars.get("$field.OBJECT_TYPE"), vars.get("$field.OBJECT_ROWID"))));
+    result.string(ContextUtils.getTitleByContext(vars.get("$field.OBJECT_TYPE"), vars.get("$field.OBJECT_ROWID")));
 }
\ No newline at end of file
diff --git a/entity/Order_entity/recordcontainers/db/recordfieldmappings/active.value/expression.js b/entity/Order_entity/recordcontainers/db/recordfieldmappings/active.value/expression.js
new file mode 100644
index 00000000000..b6235593124
--- /dev/null
+++ b/entity/Order_entity/recordcontainers/db/recordfieldmappings/active.value/expression.js
@@ -0,0 +1,6 @@
+import("Context_lib");
+import("system.result");
+import("KeywordRegistry_basic");
+
+var activArr = [0, 1];
+result.string(ContextUtils.buildActiveCaseWhen(activArr, "SALESORDER.ORDERSTATUS"));
\ No newline at end of file
diff --git a/entity/Order_entity/recordcontainers/db/recordfieldmappings/object_rowid.displayvalue/expression.js b/entity/Order_entity/recordcontainers/db/recordfieldmappings/object_rowid.displayvalue/expression.js
deleted file mode 100644
index bbe883a8296..00000000000
--- a/entity/Order_entity/recordcontainers/db/recordfieldmappings/object_rowid.displayvalue/expression.js
+++ /dev/null
@@ -1,4 +0,0 @@
-import("system.result");
-import("Context_lib");
-
-result.string(ContextUtils.getNameSubselectSql("SALESORDER.OBJECT_TYPE", "SALESORDER.OBJECT_ROWID"))
\ No newline at end of file
diff --git a/entity/Order_entity/recordcontainers/db/recordfieldmappings/offer_id.displayvalue/expression.js b/entity/Order_entity/recordcontainers/db/recordfieldmappings/offer_id.displayvalue/expression.js
deleted file mode 100644
index cb7fa7682e1..00000000000
--- a/entity/Order_entity/recordcontainers/db/recordfieldmappings/offer_id.displayvalue/expression.js
+++ /dev/null
@@ -1,5 +0,0 @@
-import("system.result");
-import("Context_lib");
-import("system.db");
-
-result.string(db.translateStatement(ContextUtils.getNameSql("Offer", null, "SALESORDER.OFFER_ID")));
\ No newline at end of file
diff --git a/entity/Organisation_entity/Organisation_entity.aod b/entity/Organisation_entity/Organisation_entity.aod
index dbf97ba2d22..076fe1f6213 100644
--- a/entity/Organisation_entity/Organisation_entity.aod
+++ b/entity/Organisation_entity/Organisation_entity.aod
@@ -7,6 +7,7 @@
   <title>Company</title>
   <grantDeleteProcess>%aditoprj%/entity/Organisation_entity/grantDeleteProcess.js</grantDeleteProcess>
   <contentTitleProcess>%aditoprj%/entity/Organisation_entity/contentTitleProcess.js</contentTitleProcess>
+  <contentDescriptionProcess>%aditoprj%/entity/Organisation_entity/contentDescriptionProcess.js</contentDescriptionProcess>
   <afterUiInit>%aditoprj%/entity/Organisation_entity/afterUiInit.js</afterUiInit>
   <initFilterProcess>%aditoprj%/entity/Organisation_entity/initFilterProcess.js</initFilterProcess>
   <useFavorites v="true" />
diff --git a/entity/Organisation_entity/contentDescriptionProcess.js b/entity/Organisation_entity/contentDescriptionProcess.js
new file mode 100644
index 00000000000..b07a72fe7cc
--- /dev/null
+++ b/entity/Organisation_entity/contentDescriptionProcess.js
@@ -0,0 +1,5 @@
+import("system.translate");
+import("system.datetime");
+import("system.vars");
+import("system.result");
+result.string(datetime.toDate(vars.get("$field.DATE_NEW"), translate.text("dd.MM.yyyy")));
\ No newline at end of file
diff --git a/entity/Product_entity/Product_entity.aod b/entity/Product_entity/Product_entity.aod
index 2a6662b6f7d..b5487036312 100644
--- a/entity/Product_entity/Product_entity.aod
+++ b/entity/Product_entity/Product_entity.aod
@@ -9,6 +9,7 @@
   </siblings>
   <grantDeleteProcess>%aditoprj%/entity/Product_entity/grantDeleteProcess.js</grantDeleteProcess>
   <contentTitleProcess>%aditoprj%/entity/Product_entity/contentTitleProcess.js</contentTitleProcess>
+  <contentDescriptionProcess>%aditoprj%/entity/Product_entity/contentDescriptionProcess.js</contentDescriptionProcess>
   <afterUiInit>%aditoprj%/entity/Product_entity/afterUiInit.js</afterUiInit>
   <useFavorites v="true" />
   <iconId>VAADIN:HAMMER</iconId>
diff --git a/entity/Product_entity/contentDescriptionProcess.js b/entity/Product_entity/contentDescriptionProcess.js
new file mode 100644
index 00000000000..b07a72fe7cc
--- /dev/null
+++ b/entity/Product_entity/contentDescriptionProcess.js
@@ -0,0 +1,5 @@
+import("system.translate");
+import("system.datetime");
+import("system.vars");
+import("system.result");
+result.string(datetime.toDate(vars.get("$field.DATE_NEW"), translate.text("dd.MM.yyyy")));
\ No newline at end of file
diff --git a/entity/Product_entity/entityfields/contact_id/displayValueProcess.js b/entity/Product_entity/entityfields/contact_id/displayValueProcess.js
index 660715572ae..d29e2e10266 100644
--- a/entity/Product_entity/entityfields/contact_id/displayValueProcess.js
+++ b/entity/Product_entity/entityfields/contact_id/displayValueProcess.js
@@ -3,4 +3,4 @@ import("system.vars");
 import("system.result");
 import("Context_lib");
 
-result.string(db.cell(ContextUtils.getNameSql("Organisation", vars.get("$field.CONTACT_ID"))));
\ No newline at end of file
+result.string(ContextUtils.getTitleByContext("Organisation", vars.get("$field.CONTACT_ID")));
\ No newline at end of file
diff --git a/entity/Salesproject_entity/Salesproject_entity.aod b/entity/Salesproject_entity/Salesproject_entity.aod
index 26c7f691c11..bbe19fd7cf0 100644
--- a/entity/Salesproject_entity/Salesproject_entity.aod
+++ b/entity/Salesproject_entity/Salesproject_entity.aod
@@ -12,6 +12,7 @@
   </siblings>
   <grantDeleteProcess>%aditoprj%/entity/Salesproject_entity/grantDeleteProcess.js</grantDeleteProcess>
   <contentTitleProcess>%aditoprj%/entity/Salesproject_entity/contentTitleProcess.js</contentTitleProcess>
+  <contentDescriptionProcess>%aditoprj%/entity/Salesproject_entity/contentDescriptionProcess.js</contentDescriptionProcess>
   <afterUiInit>%aditoprj%/entity/Salesproject_entity/afterUiInit.js</afterUiInit>
   <onValidation>%aditoprj%/entity/Salesproject_entity/onValidation.js</onValidation>
   <useFavorites v="true" />
@@ -146,34 +147,39 @@
     </entityField>
     <entityConsumer>
       <name>SalesprojectSources</name>
-      <children>
-        <entityParameter>
-          <name>SalesprojectId_param</name>
-          <valueProcess>%aditoprj%/entity/Salesproject_entity/entityfields/salesprojectsources/children/salesprojectid_param/valueProcess.js</valueProcess>
-        </entityParameter>
-      </children>
       <dependency>
         <name>dependency</name>
         <entityName>SalesprojectSource_entity</entityName>
         <fieldName>SalesprojectSouces</fieldName>
       </dependency>
-    </entityConsumer>
-    <entityConsumer>
-      <name>SalesprojectPhaseMilestones</name>
       <children>
         <entityParameter>
           <name>SalesprojectId_param</name>
-          <valueProcess>%aditoprj%/entity/Salesproject_entity/entityfields/salesprojectphasemilestones/children/salesprojectid_param/valueProcess.js</valueProcess>
+          <valueProcess>%aditoprj%/entity/Salesproject_entity/entityfields/salesprojectsources/children/salesprojectid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+    </entityConsumer>
+    <entityConsumer>
+      <name>SalesprojectPhaseMilestones</name>
       <dependency>
         <name>dependency</name>
         <entityName>SalesprojectMilestone_entity</entityName>
         <fieldName>PhaseMilestones</fieldName>
       </dependency>
+      <children>
+        <entityParameter>
+          <name>SalesprojectId_param</name>
+          <valueProcess>%aditoprj%/entity/Salesproject_entity/entityfields/salesprojectphasemilestones/children/salesprojectid_param/valueProcess.js</valueProcess>
+        </entityParameter>
+      </children>
     </entityConsumer>
     <entityConsumer>
       <name>Forecasts</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Forecast_entity</entityName>
+        <fieldName>Links</fieldName>
+      </dependency>
       <children>
         <entityParameter>
           <name>ObjectType_param</name>
@@ -186,15 +192,15 @@
           <expose v="true" />
         </entityParameter>
       </children>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Forecast_entity</entityName>
-        <fieldName>Links</fieldName>
-      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>Competitions</name>
       <selectionMode>MULTI</selectionMode>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Competition_entity</entityName>
+        <fieldName>Links</fieldName>
+      </dependency>
       <children>
         <entityParameter>
           <name>ObjectRowId_param</name>
@@ -207,14 +213,14 @@
           <expose v="true" />
         </entityParameter>
       </children>
+    </entityConsumer>
+    <entityConsumer>
+      <name>Offers</name>
       <dependency>
         <name>dependency</name>
-        <entityName>Competition_entity</entityName>
+        <entityName>Offer_entity</entityName>
         <fieldName>Links</fieldName>
       </dependency>
-    </entityConsumer>
-    <entityConsumer>
-      <name>Offers</name>
       <children>
         <entityParameter>
           <name>ObjectRowId_param</name>
@@ -227,14 +233,14 @@
           <expose v="true" />
         </entityParameter>
       </children>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Offer_entity</entityName>
-        <fieldName>Links</fieldName>
-      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>Activities</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Activity_entity</entityName>
+        <fieldName>LinkedObjects</fieldName>
+      </dependency>
       <children>
         <entityParameter>
           <name>PresetLinks_param</name>
@@ -249,14 +255,14 @@
           <valueProcess>%aditoprj%/entity/Salesproject_entity/entityfields/activities/children/objectid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Activity_entity</entityName>
-        <fieldName>LinkedObjects</fieldName>
-      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>Members</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Member_entity</entityName>
+        <fieldName>WithDistrictResponsibles</fieldName>
+      </dependency>
       <children>
         <entityParameter>
           <name>ObjectRowId_param</name>
@@ -281,11 +287,6 @@
           <valueProcess>%aditoprj%/entity/Salesproject_entity/entityfields/members/children/salesprojectcode_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Member_entity</entityName>
-        <fieldName>WithDistrictResponsibles</fieldName>
-      </dependency>
     </entityConsumer>
     <entityActionField>
       <name>newOffer</name>
@@ -298,6 +299,11 @@
     <entityConsumer>
       <name>Timetrackings</name>
       <refreshParent v="true" />
+      <dependency>
+        <name>dependency</name>
+        <entityName>Timetracking_entity</entityName>
+        <fieldName>Timetrackings</fieldName>
+      </dependency>
       <children>
         <entityParameter>
           <name>ObjectId_param</name>
@@ -308,11 +314,6 @@
           <valueProcess>%aditoprj%/entity/Salesproject_entity/entityfields/timetrackings/children/rowid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Timetracking_entity</entityName>
-        <fieldName>Timetrackings</fieldName>
-      </dependency>
     </entityConsumer>
     <entityParameter>
       <name>ContactId_param</name>
@@ -336,6 +337,11 @@
     <entityConsumer>
       <name>Documents</name>
       <selectionMode>MULTI</selectionMode>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Document_entity</entityName>
+        <fieldName>Documents</fieldName>
+      </dependency>
       <children>
         <entityParameter>
           <name>AssignmentRowId_param</name>
@@ -350,15 +356,15 @@
           <valueProcess>%aditoprj%/entity/Salesproject_entity/entityfields/documents/children/mstteamid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Document_entity</entityName>
-        <fieldName>Documents</fieldName>
-      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>MainDocuments</name>
       <stateProcess>%aditoprj%/entity/Salesproject_entity/entityfields/maindocuments/stateProcess.js</stateProcess>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Document_entity</entityName>
+        <fieldName>MainDocuments</fieldName>
+      </dependency>
       <children>
         <entityParameter>
           <name>AssignmentRowId_param</name>
@@ -369,11 +375,6 @@
           <valueProcess>%aditoprj%/entity/Salesproject_entity/entityfields/maindocuments/children/assignmenttable_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Document_entity</entityName>
-        <fieldName>MainDocuments</fieldName>
-      </dependency>
     </entityConsumer>
     <entityActionField>
       <name>newTimetracking</name>
@@ -384,6 +385,11 @@
     </entityActionField>
     <entityConsumer>
       <name>KeywordProbabilties</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>SpecificContainerKeywords</fieldName>
+      </dependency>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
@@ -392,14 +398,14 @@
           <expose v="false" />
         </entityParameter>
       </children>
+    </entityConsumer>
+    <entityConsumer>
+      <name>KeywordStates</name>
       <dependency>
         <name>dependency</name>
         <entityName>KeywordEntry_entity</entityName>
         <fieldName>SpecificContainerKeywords</fieldName>
       </dependency>
-    </entityConsumer>
-    <entityConsumer>
-      <name>KeywordStates</name>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
@@ -407,11 +413,6 @@
           <expose v="false" />
         </entityParameter>
       </children>
-      <dependency>
-        <name>dependency</name>
-        <entityName>KeywordEntry_entity</entityName>
-        <fieldName>SpecificContainerKeywords</fieldName>
-      </dependency>
     </entityConsumer>
     <entityActionField>
       <name>newActivity</name>
@@ -431,17 +432,17 @@
     <entityConsumer>
       <name>KeywordWonLost</name>
       <selectionMode>MULTI</selectionMode>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>SpecificContainerKeywords</fieldName>
+      </dependency>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
           <valueProcess>%aditoprj%/entity/Salesproject_entity/entityfields/keywordwonlost/children/containername_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-      <dependency>
-        <name>dependency</name>
-        <entityName>KeywordEntry_entity</entityName>
-        <fieldName>SpecificContainerKeywords</fieldName>
-      </dependency>
     </entityConsumer>
     <entityField>
       <name>REASONS</name>
@@ -458,17 +459,6 @@
     </entityField>
     <entityProvider>
       <name>Salesprojects</name>
-      <children>
-        <entityParameter>
-          <name>ContactId_param</name>
-          <expose v="true" />
-          <mandatory v="true" />
-        </entityParameter>
-        <entityParameter>
-          <name>PresetTitle_param</name>
-          <expose v="false" />
-        </entityParameter>
-      </children>
       <dependencies>
         <entityDependency>
           <name>0925d17f-a26a-4641-aaf4-0f74796fefa7</name>
@@ -489,6 +479,17 @@
           <isConsumer v="false" />
         </entityDependency>
       </dependencies>
+      <children>
+        <entityParameter>
+          <name>ContactId_param</name>
+          <expose v="true" />
+          <mandatory v="true" />
+        </entityParameter>
+        <entityParameter>
+          <name>PresetTitle_param</name>
+          <expose v="false" />
+        </entityParameter>
+      </children>
     </entityProvider>
     <entityActionField>
       <name>newTask</name>
@@ -499,6 +500,11 @@
     <entityConsumer>
       <name>Tasks</name>
       <stateProcess>%aditoprj%/entity/Salesproject_entity/entityfields/tasks/stateProcess.js</stateProcess>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Task_entity</entityName>
+        <fieldName>Tasks</fieldName>
+      </dependency>
       <children>
         <entityParameter>
           <name>RowId_param</name>
@@ -513,14 +519,17 @@
           <valueProcess>%aditoprj%/entity/Salesproject_entity/entityfields/tasks/children/objectid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Task_entity</entityName>
-        <fieldName>Tasks</fieldName>
-      </dependency>
     </entityConsumer>
     <entityProvider>
       <name>OpenSalesprojects</name>
+      <dependencies>
+        <entityDependency>
+          <name>631f55f9-fb0f-4205-bdb8-6e3476268ab4</name>
+          <entityName>Offer_entity</entityName>
+          <fieldName>Salesprojects</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+      </dependencies>
       <children>
         <entityParameter>
           <name>Status_param</name>
@@ -531,14 +540,6 @@
           <expose v="false" />
         </entityParameter>
       </children>
-      <dependencies>
-        <entityDependency>
-          <name>631f55f9-fb0f-4205-bdb8-6e3476268ab4</name>
-          <entityName>Offer_entity</entityName>
-          <fieldName>Salesprojects</fieldName>
-          <isConsumer v="false" />
-        </entityDependency>
-      </dependencies>
     </entityProvider>
     <entityParameter>
       <name>Status_param</name>
@@ -547,22 +548,27 @@
     </entityParameter>
     <entityConsumer>
       <name>SalesprojectStateMilestones</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>SalesprojectMilestone_entity</entityName>
+        <fieldName>StateMilestones</fieldName>
+      </dependency>
       <children>
         <entityParameter>
           <name>SalesprojectId_param</name>
           <valueProcess>%aditoprj%/entity/Salesproject_entity/entityfields/salesprojectstatemilestones/children/salesprojectid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-      <dependency>
-        <name>dependency</name>
-        <entityName>SalesprojectMilestone_entity</entityName>
-        <fieldName>StateMilestones</fieldName>
-      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>Attributes</name>
       <stateProcess>%aditoprj%/entity/Salesproject_entity/entityfields/attributes/stateProcess.js</stateProcess>
       <onValidation>%aditoprj%/entity/Salesproject_entity/entityfields/attributes/onValidation.js</onValidation>
+      <dependency>
+        <name>dependency</name>
+        <entityName>AttributeRelation_entity</entityName>
+        <fieldName>AttributeRelations</fieldName>
+      </dependency>
       <children>
         <entityParameter>
           <name>ObjectType_param</name>
@@ -573,15 +579,15 @@
           <valueProcess>%aditoprj%/entity/Salesproject_entity/entityfields/attributes/children/objectrowid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-      <dependency>
-        <name>dependency</name>
-        <entityName>AttributeRelation_entity</entityName>
-        <fieldName>AttributeRelations</fieldName>
-      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>AttributeTree</name>
       <stateProcess>%aditoprj%/entity/Salesproject_entity/entityfields/attributetree/stateProcess.js</stateProcess>
+      <dependency>
+        <name>dependency</name>
+        <entityName>AttributeRelation_entity</entityName>
+        <fieldName>TreeProvider</fieldName>
+      </dependency>
       <children>
         <entityParameter>
           <name>ObjectType_param</name>
@@ -592,29 +598,29 @@
           <valueProcess>%aditoprj%/entity/Salesproject_entity/entityfields/attributetree/children/objectrowid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-      <dependency>
-        <name>dependency</name>
-        <entityName>AttributeRelation_entity</entityName>
-        <fieldName>TreeProvider</fieldName>
-      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>LogHistories</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>LogHistory_entity</entityName>
+        <fieldName>LogHistoryProvider</fieldName>
+      </dependency>
       <children>
         <entityParameter>
           <name>tablenames_param</name>
           <valueProcess>%aditoprj%/entity/Salesproject_entity/entityfields/loghistories/children/tablenames_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-      <dependency>
-        <name>dependency</name>
-        <entityName>LogHistory_entity</entityName>
-        <fieldName>LogHistoryProvider</fieldName>
-      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>Classifications</name>
       <refreshParent v="true" />
+      <dependency>
+        <name>dependency</name>
+        <entityName>Classification_entity</entityName>
+        <fieldName>Classifications</fieldName>
+      </dependency>
       <children>
         <entityParameter>
           <name>ObjectRowid_param</name>
@@ -629,11 +635,6 @@
           <valueProcess>%aditoprj%/entity/Salesproject_entity/entityfields/classifications/children/classificationtype_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Classification_entity</entityName>
-        <fieldName>Classifications</fieldName>
-      </dependency>
     </entityConsumer>
     <entityField>
       <name>RemainingTime</name>
@@ -647,6 +648,11 @@
     </entityField>
     <entityConsumer>
       <name>SalesprojectForecastCharts</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Turnover_entity</entityName>
+        <fieldName>FilteredTurnovers</fieldName>
+      </dependency>
       <children>
         <entityParameter>
           <name>SalesprojectId_param</name>
@@ -665,25 +671,20 @@
           <valueProcess>%aditoprj%/entity/Salesproject_entity/entityfields/salesprojectforecastcharts/children/yearcounttoshow_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Turnover_entity</entityName>
-        <fieldName>FilteredTurnovers</fieldName>
-      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>SalesprojectPhaseStepper</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>SalesprojectPhase_entity</entityName>
+        <fieldName>Phases</fieldName>
+      </dependency>
       <children>
         <entityParameter>
           <name>CurrentPhase_param</name>
           <valueProcess>%aditoprj%/entity/Salesproject_entity/entityfields/salesprojectphasestepper/children/currentphase_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-      <dependency>
-        <name>dependency</name>
-        <entityName>SalesprojectPhase_entity</entityName>
-        <fieldName>Phases</fieldName>
-      </dependency>
     </entityConsumer>
     <entityField>
       <name>PHASEINFO</name>
@@ -706,17 +707,17 @@
     </entityField>
     <entityConsumer>
       <name>ProjectTypeAttribute</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Attribute_entity</entityName>
+        <fieldName>SpecificAttribute</fieldName>
+      </dependency>
       <children>
         <entityParameter>
           <name>ObjectType_param</name>
           <valueProcess>%aditoprj%/entity/Salesproject_entity/entityfields/projecttypeattribute/children/objecttype_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Attribute_entity</entityName>
-        <fieldName>SpecificAttribute</fieldName>
-      </dependency>
     </entityConsumer>
     <entityProvider>
       <name>QuickEntrySalesprojects</name>
@@ -778,6 +779,12 @@
       <title>Classification</title>
       <groupable v="true" />
     </entityField>
+    <entityField>
+      <name>DATE_NEW</name>
+    </entityField>
+    <entityField>
+      <name>ACTIVE</name>
+    </entityField>
   </entityFields>
   <recordContainers>
     <dbRecordContainer>
@@ -944,6 +951,14 @@
           <name>MST_TEAM_ID.displayValue</name>
           <recordfield>MST_TEAM.TEAMNAME</recordfield>
         </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>DATE_NEW.value</name>
+          <recordfield>SALESPROJECT.STARTDATE</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>ACTIVE.value</name>
+          <expression>%aditoprj%/entity/Salesproject_entity/recordcontainers/db/recordfieldmappings/active.value/expression.js</expression>
+        </dbRecordFieldMapping>
       </recordFieldMappings>
       <filterExtensions>
         <filterExtensionSet>
diff --git a/entity/Salesproject_entity/contentDescriptionProcess.js b/entity/Salesproject_entity/contentDescriptionProcess.js
new file mode 100644
index 00000000000..3e00d9c6738
--- /dev/null
+++ b/entity/Salesproject_entity/contentDescriptionProcess.js
@@ -0,0 +1,14 @@
+import("Keyword_lib");
+import("system.translate");
+import("system.datetime");
+import("system.vars");
+import("system.result");
+import("KeywordRegistry_basic");
+
+var res = [translate.text("Phase") + ": " + KeywordUtils.getViewValue($KeywordRegistry.salesprojectPhase(), vars.get("$field.PHASE")), 
+           translate.text("Classification: ") + vars.get("$field.CLASSIFICATIONVALUE"),
+           translate.text("Volume") + ": " + vars.get("$field.VOLUME.displayValue"),
+           translate.text("Probability") + ": " + vars.get("$field.PROBABILITY.displayValue"),
+           translate.text("Creation date") + ": " + datetime.toDate(vars.get("$field.DATE_NEW"), translate.text("dd.MM.yyyy"))];
+
+result.string(res.join(" | "));
\ No newline at end of file
diff --git a/entity/Salesproject_entity/contentTitleProcess.js b/entity/Salesproject_entity/contentTitleProcess.js
index 5465ff4efe7..dd3706b77cb 100644
--- a/entity/Salesproject_entity/contentTitleProcess.js
+++ b/entity/Salesproject_entity/contentTitleProcess.js
@@ -1,4 +1,6 @@
 import("system.vars");
 import("system.result");
 
-result.string(vars.get("$field.PROJECTTITLE"));
\ No newline at end of file
+var res = [vars.get("$field.PROJECTCODE"), vars.get("$field.PROJECTTITLE"), vars.get("$field.STATUS.displayValue")];
+
+result.string(res.join(" | "));
\ No newline at end of file
diff --git a/entity/Salesproject_entity/recordcontainers/db/recordfieldmappings/active.value/expression.js b/entity/Salesproject_entity/recordcontainers/db/recordfieldmappings/active.value/expression.js
new file mode 100644
index 00000000000..d91a07968d0
--- /dev/null
+++ b/entity/Salesproject_entity/recordcontainers/db/recordfieldmappings/active.value/expression.js
@@ -0,0 +1,6 @@
+import("Context_lib");
+import("system.result");
+import("KeywordRegistry_basic");
+
+var activArr = [$KeywordRegistry.salesprojectState$open(), $KeywordRegistry.salesprojectState$postponed()];
+result.string(ContextUtils.buildActiveCaseWhen(activArr, "SALESPROJECT.STATUS"));
\ No newline at end of file
diff --git a/entity/SupportTicket_entity/SupportTicket_entity.aod b/entity/SupportTicket_entity/SupportTicket_entity.aod
index a289e1083cc..7449b209441 100644
--- a/entity/SupportTicket_entity/SupportTicket_entity.aod
+++ b/entity/SupportTicket_entity/SupportTicket_entity.aod
@@ -5,6 +5,7 @@
   <documentation>%aditoprj%/entity/SupportTicket_entity/documentation.adoc</documentation>
   <title>Support Ticket</title>
   <contentTitleProcess>%aditoprj%/entity/SupportTicket_entity/contentTitleProcess.js</contentTitleProcess>
+  <contentDescriptionProcess>%aditoprj%/entity/SupportTicket_entity/contentDescriptionProcess.js</contentDescriptionProcess>
   <afterUiInit>%aditoprj%/entity/SupportTicket_entity/afterUiInit.js</afterUiInit>
   <onValidation>%aditoprj%/entity/SupportTicket_entity/onValidation.js</onValidation>
   <useFavorites v="true" />
@@ -459,6 +460,12 @@
       <name>TASK_ICON_COLOR</name>
       <valueProcess>%aditoprj%/entity/SupportTicket_entity/entityfields/task_icon_color/valueProcess.js</valueProcess>
     </entityField>
+    <entityField>
+      <name>DATE_NEW</name>
+    </entityField>
+    <entityField>
+      <name>ACTIVE</name>
+    </entityField>
   </entityFields>
   <recordContainers>
     <dbRecordContainer>
@@ -597,6 +604,14 @@
           <recordfield>TICKET.TICKETID</recordfield>
           <aggregateType>COUNT</aggregateType>
         </aggregateFieldDbMapping>
+        <dbRecordFieldMapping>
+          <name>DATE_NEW.value</name>
+          <recordfield>TASK.START_DATE</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>ACTIVE.value</name>
+          <expression>%aditoprj%/entity/SupportTicket_entity/recordcontainers/db/recordfieldmappings/active.value/expression.js</expression>
+        </dbRecordFieldMapping>
       </recordFieldMappings>
       <filterExtensions>
         <filterExtension>
diff --git a/entity/SupportTicket_entity/contentDescriptionProcess.js b/entity/SupportTicket_entity/contentDescriptionProcess.js
new file mode 100644
index 00000000000..1d91623c4ae
--- /dev/null
+++ b/entity/SupportTicket_entity/contentDescriptionProcess.js
@@ -0,0 +1,18 @@
+import("KeywordRegistry_basic");
+import("Keyword_lib");
+import("system.translate");
+import("system.datetime");
+import("system.vars");
+import("system.result");
+
+var res = [];
+
+if(vars.get("$field.TASK_EDITOR_CONTACT_ID"))
+    res = [translate.text("{$TICKET_EDITOR}") + ": " + vars.get("$field.TASK_EDITOR_CONTACT_ID.displayValue")];
+    
+  res.push(translate.text("Maturity") + ": " + datetime.toDate(vars.get("$field.TASK_MATURITY_DATE"), translate.text("dd.MM.yyyy")));
+  res.push(translate.text("Progress") + ": " + KeywordUtils.getViewValue($KeywordRegistry.taskProgress(), vars.get("$field.TASK_PROGRESS")));
+  res.push(translate.text("Creation date") + ": " + datetime.toDate(vars.get("$field.DATE_NEW"), translate.text("dd.MM.yyyy")));
+
+result.string(res.join(" | "));
+    
\ No newline at end of file
diff --git a/entity/SupportTicket_entity/contentTitleProcess.js b/entity/SupportTicket_entity/contentTitleProcess.js
index aae1064b78e..626ec76cac0 100644
--- a/entity/SupportTicket_entity/contentTitleProcess.js
+++ b/entity/SupportTicket_entity/contentTitleProcess.js
@@ -1,4 +1,9 @@
+import("KeywordRegistry_basic");
+import("Keyword_lib");
 import("system.vars");
 import("system.result");
 
-result.string(vars.get("$field.TASK_SUBJECT"))
\ No newline at end of file
+
+var res = [vars.get("$field.TASK_SUBJECT"), vars.get("$field.TASK_STATUS.displayValue")];
+
+result.string(res.join(" | "))
\ No newline at end of file
diff --git a/entity/SupportTicket_entity/recordcontainers/db/recordfieldmappings/active.value/expression.js b/entity/SupportTicket_entity/recordcontainers/db/recordfieldmappings/active.value/expression.js
new file mode 100644
index 00000000000..26673fbc448
--- /dev/null
+++ b/entity/SupportTicket_entity/recordcontainers/db/recordfieldmappings/active.value/expression.js
@@ -0,0 +1,7 @@
+import("Context_lib");
+import("system.result");
+import("KeywordRegistry_basic");
+
+var activArr = [$KeywordRegistry.taskStatus$new(), $KeywordRegistry.taskStatus$unassigned(),  $KeywordRegistry.taskStatus$assigned(),
+$KeywordRegistry.taskStatus$inProgress(), $KeywordRegistry.taskStatus$waiting(), $KeywordRegistry.taskStatus$customerChecks()];
+result.string(ContextUtils.buildActiveCaseWhen(activArr, "TASK.STATUS"));
\ No newline at end of file
diff --git a/entity/TaskLink_entity/entityfields/object_rowid/displayValueProcess.js b/entity/TaskLink_entity/entityfields/object_rowid/displayValueProcess.js
index c87f4789fa9..23f715a5e9d 100644
--- a/entity/TaskLink_entity/entityfields/object_rowid/displayValueProcess.js
+++ b/entity/TaskLink_entity/entityfields/object_rowid/displayValueProcess.js
@@ -6,5 +6,5 @@ import("Context_lib");
 
 if(vars.get("$field.OBJECT_ROWID") && vars.get("$field.OBJECT_TYPE"))
 {
-    result.string(db.cell(ContextUtils.getNameSql(vars.get("$field.OBJECT_TYPE"), vars.get("$field.OBJECT_ROWID"))));
+    result.string(ContextUtils.getTitleByContext(vars.get("$field.OBJECT_TYPE"), vars.get("$field.OBJECT_ROWID")));
 }
\ No newline at end of file
diff --git a/entity/Task_entity/Task_entity.aod b/entity/Task_entity/Task_entity.aod
index f7b03fedd7f..45f3ee0f0cf 100644
--- a/entity/Task_entity/Task_entity.aod
+++ b/entity/Task_entity/Task_entity.aod
@@ -6,6 +6,7 @@
   <title>Task</title>
   <grantDeleteProcess>%aditoprj%/entity/Task_entity/grantDeleteProcess.js</grantDeleteProcess>
   <contentTitleProcess>%aditoprj%/entity/Task_entity/contentTitleProcess.js</contentTitleProcess>
+  <contentDescriptionProcess>%aditoprj%/entity/Task_entity/contentDescriptionProcess.js</contentDescriptionProcess>
   <afterUiInit>%aditoprj%/entity/Task_entity/afterUiInit.js</afterUiInit>
   <onValidation>%aditoprj%/entity/Task_entity/onValidation.js</onValidation>
   <initFilterProcess>%aditoprj%/entity/Task_entity/initFilterProcess.js</initFilterProcess>
@@ -503,6 +504,9 @@
       <name>ICON_COLOR</name>
       <valueProcess>%aditoprj%/entity/Task_entity/entityfields/icon_color/valueProcess.js</valueProcess>
     </entityField>
+    <entityField>
+      <name>DATE_NEW</name>
+    </entityField>
   </entityFields>
   <recordContainers>
     <dbRecordContainer>
diff --git a/entity/Task_entity/contentDescriptionProcess.js b/entity/Task_entity/contentDescriptionProcess.js
new file mode 100644
index 00000000000..b07a72fe7cc
--- /dev/null
+++ b/entity/Task_entity/contentDescriptionProcess.js
@@ -0,0 +1,5 @@
+import("system.translate");
+import("system.datetime");
+import("system.vars");
+import("system.result");
+result.string(datetime.toDate(vars.get("$field.DATE_NEW"), translate.text("dd.MM.yyyy")));
\ No newline at end of file
diff --git a/entity/WorkflowStartConfig_entity/WorkflowStartConfig_entity.aod b/entity/WorkflowStartConfig_entity/WorkflowStartConfig_entity.aod
index beafceffdfe..e57032a87e2 100644
--- a/entity/WorkflowStartConfig_entity/WorkflowStartConfig_entity.aod
+++ b/entity/WorkflowStartConfig_entity/WorkflowStartConfig_entity.aod
@@ -63,10 +63,6 @@
           <name>InvertBlacklist_param</name>
           <valueProcess>%aditoprj%/entity/WorkflowStartConfig_entity/entityfields/contexts/children/invertblacklist_param/valueProcess.js</valueProcess>
         </entityParameter>
-        <entityParameter>
-          <name>GetAllContexts_param</name>
-          <valueProcess>%aditoprj%/entity/WorkflowStartConfig_entity/entityfields/contexts/children/getallcontexts_param/valueProcess.js</valueProcess>
-        </entityParameter>
       </children>
     </entityConsumer>
     <entityConsumer>
diff --git a/entity/WorkflowStartConfig_entity/entityfields/contexts/children/getallcontexts_param/valueProcess.js b/entity/WorkflowStartConfig_entity/entityfields/contexts/children/getallcontexts_param/valueProcess.js
deleted file mode 100644
index 40effa01784..00000000000
--- a/entity/WorkflowStartConfig_entity/entityfields/contexts/children/getallcontexts_param/valueProcess.js
+++ /dev/null
@@ -1,3 +0,0 @@
-import("system.result");
-
-result.string(true);
\ No newline at end of file
diff --git a/language/_____LANGUAGE_de/_____LANGUAGE_de.aod b/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
index 2c2348c9da0..2abce19573c 100644
--- a/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
+++ b/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
@@ -6,6 +6,10 @@
   <country></country>
   <variant></variant>
   <keyValueMap>
+    <entry>
+      <key>Illegal Parent Operator in buildFilterObj-Function:</key>
+      <value>Übergebener Operator ungültig in Funktion "buildFilterObj"</value>
+    </entry>
     <entry>
       <key>Probability AI</key>
       <value>Wahrscheinlichkeit KI</value>
diff --git a/neonContext/SupportTicket/SupportTicket.aod b/neonContext/SupportTicket/SupportTicket.aod
index 5115f0e09bb..b0233b40612 100644
--- a/neonContext/SupportTicket/SupportTicket.aod
+++ b/neonContext/SupportTicket/SupportTicket.aod
@@ -4,6 +4,7 @@
   <title>Support Ticket</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <documentation>%aditoprj%/neonContext/SupportTicket/documentation.adoc</documentation>
+  <icon>VAADIN:CHAT</icon>
   <mainView>SupportTicketMain_view</mainView>
   <filterView>SupportTicketFilter_view</filterView>
   <editView>SupportTicketEdit_view</editView>
diff --git a/neonView/360DegreeFilter_view/360DegreeFilter_view.aod b/neonView/360DegreeFilter_view/360DegreeFilter_view.aod
index fcb25887036..bf84f6db4d7 100644
--- a/neonView/360DegreeFilter_view/360DegreeFilter_view.aod
+++ b/neonView/360DegreeFilter_view/360DegreeFilter_view.aod
@@ -2,7 +2,7 @@
 <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>360DegreeFilter_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
-  <filterable v="false" />
+  <filterable v="true" />
   <layout>
     <groupLayout>
       <name>layout</name>
@@ -10,22 +10,25 @@
   </layout>
   <children>
     <treeViewTemplate>
-      <name>Treetable</name>
+      <name>Tree</name>
       <favoriteActionGroup2>newModule</favoriteActionGroup2>
       <titleField>TITLE</titleField>
-      <descriptionField>DATE</descriptionField>
+      <descriptionField>DESCRIPTION</descriptionField>
       <iconField>ICON</iconField>
+      <hideContentSearch v="false" />
       <entityField>#ENTITY</entityField>
+      <linkedColumns />
       <defaultGroupFields>
-        <element>ENTITY_NAME</element>
+        <element>GROUP</element>
       </defaultGroupFields>
+      <fixedFilterFields />
     </treeViewTemplate>
     <timelineViewTemplate>
       <name>Timeline</name>
       <favoriteActionGroup2>newModule</favoriteActionGroup2>
-      <dateField>DATE</dateField>
+      <dateField>DATE_NEW</dateField>
       <titleField>TITLE</titleField>
-      <descriptionField>ENTITY_NAME</descriptionField>
+      <descriptionField>GROUP</descriptionField>
       <iconIdField>ICON</iconIdField>
       <hideContentSearch v="false" />
       <entityField>#ENTITY</entityField>
diff --git a/process/Context_lib/process.js b/process/Context_lib/process.js
index 7aa6dedab7b..b7bf2e8a17a 100644
--- a/process/Context_lib/process.js
+++ b/process/Context_lib/process.js
@@ -1,3 +1,4 @@
+import("system.logging");
 import("Util_lib");
 import("system.entities");
 import("system.tools");
@@ -29,7 +30,7 @@ function ContextUtils() {}
  */
 ContextUtils.getCurrentContextId = function()
 {
-   return   vars.getString("$sys.currentcontextname");
+    return vars.getString("$sys.currentcontextname");
 }
 
 /**
@@ -145,7 +146,7 @@ ContextUtils.getContextConsumer = function(pContextId)
         case ContextUtils.getContextName("PrivatePerson"):
             return "PrivatePersons";
         case ContextUtils.getContextName("Leadimport"):
-            return "Leadimport";
+            return "Leadimports";
         case ContextUtils.getContextName("Task"):
             return "Tasks";
         case ContextUtils.getContextName("SupportTicket"):
@@ -171,9 +172,9 @@ ContextUtils.loadContentTitle = function(pEntity, pUid, pProvider)
         return "";
 
     var conf = entities.createConfigForLoadingRows()
-        .entity(pEntity)
-        .uid(pUid)
-        .fields(["#CONTENTTITLE"]);
+    .entity(pEntity)
+    .uid(pUid)
+    .fields(["#CONTENTTITLE"]);
 
     if (pProvider)
         conf.provider(pProvider);
@@ -182,35 +183,107 @@ ContextUtils.loadContentTitle = function(pEntity, pUid, pProvider)
     return rows.length === 1 ? rows[0]["#CONTENTTITLE"] : "";
 }
 
+
+/**
+ * loads the contentdescription by using entities.getRow
+ * @param {String} pEntity The entity name you want to load the title for
+ * @param {String} pUid the uid for which to load the title
+ * @param {String} [pProvider] providername when instead of the default provider another provider shall be used
+ * 
+ * @return the #CONTENTDESCRIPTION or ""
+ */
+ContextUtils.loadContentDescription = function(pEntity, pUid, pProvider)
+{
+    if (!pUid)
+        return "";
+
+    var conf = entities.createConfigForLoadingRows()
+    .entity(pEntity)
+    .uid(pUid)
+    .fields(["#CONTENTDESCRIPTION"]);
+
+    if (pProvider)
+        conf.provider(pProvider);
+    
+    var rows = entities.getRows(conf);
+    return rows.length === 1 ? rows[0]["#CONTENTDESCRIPTION"] : "";
+}
+
+/**
+ * loads specified Fields for one Row by using entities.getRow
+ * @param {String} pEntity The entity name you want to load the title for
+ * @param {String[]} [pUid] the uids for which to load the content
+ * @param {String[]} [pFields] fields you want as result
+ * @param {String[]} [pExcludeIDs] uids you want to exclude from the list
+ * @param {String} pProvider providername when instead of the default provider another provider shall be used
+ * 
+ * @return the Values of the Fields
+ */
+ContextUtils.loadContent = function(pEntity, pUid, pFields, pExcludeIDs, pProvider)
+{
+    if (!pEntity)
+        return [];
+
+    var conf = entities.createConfigForLoadingRows()
+    .entity(pEntity)
+    .uids(pUid)
+    .fields(pFields);
+
+    if (pProvider)
+        conf.provider(pProvider);
+
+    if (pExcludeIDs)
+    {
+        var childsArray = [{
+            "type":"row",
+            "name":"#UID",
+            "operator":"NOT_IN",
+            "value": JSON.stringify(pExcludeIDs),
+            "key": JSON.stringify(pExcludeIDs),
+            "contenttype":"TEXT"
+        }];
+
+
+        var pFilterParent = {
+            "type":"group",
+            "operator":"OR",
+            "childs": childsArray
+        };
+        
+        conf.filter(JSON.stringify(pFilterParent));
+    }
+    
+    var rows = entities.getRows(conf);
+    return rows && rows.length > 0 ? rows : [];
+}
+
+
 /**
  *
- * @param {Boolean} [pFilter=false] filter only for contexts which have a mapping in ContextUtils.getSelectMap 
- * @param {String[]} [pBlacklist] contextIds that shall not be included (so this is a additional filter to the pFilter param)
+ * @param {String[]} [pBlacklist] contextIds that shall not be included
  * @param {Boolean} [pInvertBlacklist=false] decides whether the items in pBlacklist are excluded (false) or
  *                      everything that is NOT in pBlacklist is excluded (true) 
  *                      (-> if it is a whitelist or blacklist)
  *
  * @return {String[][]} the contexts [[contextId, contextName, contextTitle], [... ], ...]
  */
-ContextUtils.getContexts = function(pFilter, pBlacklist, pInvertBlacklist)
+ContextUtils.getContexts = function(pBlacklist, pInvertBlacklist)
 {
-    if (pFilter == undefined)
-        pFilter = false;
     if (pInvertBlacklist == undefined)
         pInvertBlacklist = false;
 
+
     var contexts = project.getDataModels(project.DATAMODEL_KIND_CONTEXT);
+    var contextsStandardList = ["Organisation", "Person", "PrivatePerson", "Activity", "Salesproject", "Contract", "Offer", "Order", "Product", "Task",
+    "Campaign", "CampaignStep", "SupportTicket", "Leadimport"];
 
-    if (pFilter)
-    {
-        contexts = contexts.filter(function(pContext) {
-            if (pBlacklist && pBlacklist.indexOf(pContext[0]) > -1 != pInvertBlacklist)
-                return false;
-            // filter only contexts which have defined mappings in Context_lib
-            return ContextUtils.getSelectMap ()[pContext[0]] != undefined;
-        });
-    }
-    else if (pBlacklist)
+    contexts = contexts.filter(function(pContext) {
+        if (contextsStandardList.indexOf(pContext[0]) > -1)
+            return true;
+        return false;
+    });
+
+    if (pBlacklist)
     {
         contexts = contexts.filter(function(pContext) {
             if (pBlacklist && pBlacklist.indexOf(pContext[0]) > -1 != pInvertBlacklist)
@@ -220,16 +293,16 @@ ContextUtils.getContexts = function(pFilter, pBlacklist, pInvertBlacklist)
     }
 
     return contexts.map(ContextUtils._contextDataMapping).sort(function(pContext1, pContext2)
-        {
-            // sort after ContextTitle
-            if (pContext1[2] > pContext2[2])
-                return 1;
+    {
+        // sort after ContextTitle
+        if (pContext1[2] > pContext2[2])
+            return 1;
 
-            if (pContext1[2] < pContext2[2])
-                return -1;
+        if (pContext1[2] < pContext2[2])
+            return -1;
 
-            return 0;
-        });
+        return 0;
+    });
 }
 
 /**
@@ -259,489 +332,131 @@ ContextUtils._contextDataMapping = function(pContext)
     return [pContext[0], contextName, (pContext[1] ? pContext[1] : contextName)];
 }
 
+
 /**
- * represents a single context selection for one context
- * this is usefull for objectlinks and 360° definition
- * most properties are read only and can only be written with a setter
+ * gets the Title for a specific Context
  * 
- * @param {String} [pTableName] presets the matching property of the object
- * @param {String} [pIdField] presets the matching property of the object
- * @param {String} [pTitleExpression] presets the matching property of the object
+ * @param {String} pContextId the name of the context
+ * @param {String} pRowId Uid of certain Context
  * 
- * TODO: mostly temporary function until you can get fields from another Entity
- *
- * @class
+ * @return {String} The #CONTENTTITLE
  */
-function ContextSelector(pTableName, pIdField, pTitleExpression)
+ContextUtils.getTitleByContext = function(pContextId, pRowId)
 {
-    //the >>this.propertyX = null;<< is for autocomplete in the designer
-    
-    /**
-     * title-definition; db-column or another sql-expression (like concating fields) as long as it returns one field
-     * read-only property; set it with a matching setter
-     * @property titleExpression
-     */
-    this.titleExpression = null; ProtoPropertyUtils.makeSemiReadOnly(this, "titleExpression");
-    this.setTitleExpression(pTitleExpression);
-
-    /**
-     * name of the database-table
-     * read-only property; set it with a matching setter
-     * @property tableName
-     */
-    this.tableName = null; ProtoPropertyUtils.makeSemiReadOnly(this, "tableName");
-    this.setTableName(pTableName);
-    
-    /**
-     * db-field for the ID of one record (UID of matching context)
-     * read-only property; set it with a matching setter
-     * @property idField
-     */
-    this.idField = null; ProtoPropertyUtils.makeSemiReadOnly(this, "idField");
-    this.setIdField(pIdField);
-    
-    /**
-     * expression for additional joins to be made (addotopmaö pt table-name)
-     * read-only property; set it with a matching setter
-     * @property joinExpression
-     */
-    this.joinExpression = null; ProtoPropertyUtils.makeSemiReadOnly(this, "joinExpression");
-    /**
-     * db-field for the ID of the relation to a CONTACT-record
-     * read-only property; set it with a matching setter
-     * @property contactIdField
-     */
-    this.contactIdField = null; ProtoPropertyUtils.makeSemiReadOnly(this, "contactIdField");
-    /**
-     * db-field that represents the date of creation
-     * read-only property; set it with a matching setter
-     * @property creationDateField
-     */
-    this.creationDateField = null; ProtoPropertyUtils.makeSemiReadOnly(this, "creationDateField");
-    /**
-     * db-field where the STATE-information (active/inactive) is stored (see the activeStates-property)
-     * read-only property; set it with a matching setter
-     * @property stateField
-     */
-    this.stateField = null; ProtoPropertyUtils.makeSemiReadOnly(this, "stateField");
-    /**
-     * array that contains IDs of states that represent an "active"-state
-     * read-only property; set it with a matching setter
-     * @property activeStates
-     */
-    this.activeStates = null; ProtoPropertyUtils.makeSemiReadOnly(this, "activeStates");
-    this.condition = null; ProtoPropertyUtils.makeSemiReadOnly(this, "condition");
-    /**
-     * db-field that will be used as groubBy
-     * read-only property; set it with a matching setter
-     * @property groupBy
-     */
-    this.groupBy = null; ProtoPropertyUtils.makeSemiReadOnly(this, "groupBy");
-    /**
-     * an object which contains the subcontexts and the prepared select to get the contactIds of them.
-     *                                                                                
-     * {                       V-- SqlBuilder with all conditions needed                                 V-IdCollumn name (with Tablename!)    V-the contexts to show for this subcontext
-     *   "Person": "Person": [newSelect("CONTACTID").from("CONTACT").where("PERSON_ID is not null"), "CONTACT.ORGANISATION_ID", ["Offer", "Order", "Contract", "SupportTicket"]],
-     * 
-     *   "Offer" ... // you can add as many subcontexts as you wish
-     * }
-     * read-only property; set it with a matching setter
-     * @property subContexts
-     */
-    this.subContexts = null; ProtoPropertyUtils.makeSemiReadOnly(this, "subContexts");
+    return ContextUtils.loadContentTitle(ContextUtils.getEntity(pContextId), pRowId);
 }
+
+
 /**
- * creates a new instance of a ContextSelector and returns it 
- * if given it also sets some properties (property names with matching function-parameters)
- * @static
- */
-ContextSelector.create = function(pTableName, pIdField, pTitleExpression)
-{
-    return new ContextSelector(pTableName, pIdField, pTitleExpression);
-};
-/**
- * @param {String} pField the fieldname that shall be returned as full string
- * @return {String} full field containing tablename and the column; if the column itself is already a full qualified field that field is returned
- */
-ContextSelector.prototype.getFullField = function(pField)
-{
-    //always keep undefined (and null) just undefined since it's never a fullQualifier and tablename.undefined is useless
-    if (pField == undefined)
-        return undefined;
-    if (SqlUtils.isFullFieldQualifier(pField))
-        return pField;
-    else
-        return this.tableName + "." + pField;
-};
-/**
- * @return {String} full id field containing tablename and column; if the column itself is already a full qualified field that field is returned
- */
-ContextSelector.prototype.getFullIdField = function()
-{
-    return this.getFullField(this.idField);
-};
-/**
- * @return {String} full from-expression with tablename and join-part
- */
-ContextSelector.prototype.getFullFromClause = function()
-{
-    if (this.joinExpression)
-        return " " + this.tableName + " " + this.joinExpression + " ";
-    else
-        return this.tableName;
-        
-};
-/**
- * @return {Object} in the following format: 
- *                  {
- *                      "{contactid1}": [SqlBuilder, ContextArray],
- *                      ...
- *                      ...
- *                  }
+ * gets Data from a specific Context with entities. Functions
+ * 
+ * @param {String} pContextId the title of the context
+ * @param {String[]} [pContextConfig] Config defined in the Provider Parameter
+ * @param {Object} [pFilterObj] prepeared Filter Object
+ * @param {String[]} [pContactId] Array of all the Contactids you want to search through
+ * 
+ * @return {String[][]} An Array of Fields (["#UID", "#TITLE", "#MAPPING", "#CONTENTDESCRIPTION", "#CONTENTTITLE", "CONTACT_ID", "DATE_NEW"]) for a certain Context
  */
-ContextSelector.prototype.getSubContexts = function(pParentRowId)
-{
-    if (this.subContexts)
+ContextUtils.getContextDataViaReadEntity = function(pContextId, pContextConfig, pFilterObj, pContactId)
+{     
+    if(pContextConfig.childField && pContextConfig.parentField && pContextConfig.contactIdField && pContextConfig.subContext)
     {
-        var sqls = {};
-        for (let contextId in this.subContexts)
-        {
-            // Copy the builder to prevent modifying the builder in this.subContexts
-            var select = this.subContexts[contextId][0].copy();
-            
-            // add id-condition
-            if (select.whereWasCalled())
-            {
-                select.and(this.subContexts[contextId][1], pParentRowId);
-            }
-            else
-            {
-                select.where(this.subContexts[contextId][1], pParentRowId);
-            }
-            
-            sqls[contextId] = [select, this.subContexts[contextId][2]];
-        }
+        var prefilter = Utils.buildFilterObj({}, pContextConfig.contactIdField, "IN", "TEXT", JSON.stringify(pContactId), JSON.stringify(pContactId), "OR");
+        var resObj = [];
+
+        var subConf = entities.createConfigForLoadingRows()
+        .entity(ContextUtils.getEntity(pContextConfig.subContext))
+        .fields([pContextConfig.childField])
+        .filter(JSON.stringify(prefilter.filter))
         
-        return sqls;
+        var subRes = entities.getRows(subConf);
+        for(var id in subRes)
+            resObj.push(subRes[id][pContextConfig.childField]);
+           
+        pFilterObj = Utils.buildFilterObj(pFilterObj, pContextConfig.parentField, "IN", "TEXT", JSON.stringify(resObj), JSON.stringify(resObj), "AND");
     }
     else
-        return {};
-        
-};
-//setters which to nothing special; no need to document them
-ContextSelector.prototype.setTitleExpression = function(pValue)
-{
-    this._titleExpression = pValue;
-    return this;
-};
-ContextSelector.prototype.setTableName = function(pValue)
-{
-    this._tableName = pValue;
-    return this;
-};
-ContextSelector.prototype.setIdField = function(pValue)
-{
-    this._idField = pValue;
-    return this;
-};
-ContextSelector.prototype.setJoinExpression = function(pValue)
-{
-    this._joinExpression = pValue;
-    return this;
-};
-ContextSelector.prototype.setContactIdField = function(pValue)
-{
-    this._contactIdField = pValue;
-    return this;
-};
-ContextSelector.prototype.setCreationDateField = function(pValue)
-{
-    this._creationDateField = pValue;
-    return this;
-};
-ContextSelector.prototype.setStateField = function(pValue)
-{
-    this._stateField = pValue;
-    return this;
-};
-ContextSelector.prototype.setActiveStates = function(pValue)
-{
-    this._activeStates = pValue;
-    return this;
-};
-/**
- * sets the condition property of a ContextSelector-object
- * @param {SqlBuilder} pSqlBuilder condition as SqlBuilder-object
- */
-ContextSelector.prototype.setCondition = function(pSqlBuilder)
-{
-    this._condition = pSqlBuilder;
-    return this;
-};
-ContextSelector.prototype.setSubContexts = function(pContexts)
-{
-    this._subContexts = pContexts;
-    return this;
-};
-ContextSelector.prototype.setGroupBy = function(pValue)
-{
-    this._groupBy = pValue;
-    return this;
-};
-
-/**
- * TODO: !!!temporary function until you can get fields from another Entity!!!
- */
-ContextUtils.getSelectMap  = function()
-{
-    var maskingUtils = new SqlMaskingUtils();
-    var isOracle = maskingUtils.dbType == db.DBTYPE_ORACLE10_CLUSTER
-        || maskingUtils.dbType == db.DBTYPE_ORACLE10_OCI
-        || maskingUtils.dbType == db.DBTYPE_ORACLE10_THIN;
+    {
+        pFilterObj = Utils.buildFilterObj(pFilterObj, "CONTACT_ID", "IN", "TEXT", JSON.stringify(pContactId), JSON.stringify(pContactId), "AND"); 
+    }
+    
+    var fields = ["#UID", "#TITLE", "#MAPPING", "#CONTENTDESCRIPTION", "#CONTENTTITLE", "CONTACT_ID", "DATE_NEW", "ACTIVE"];
+    if(pContextConfig.setGroupBy)
+        fields.push(pContextConfig.setGroupBy);
+    
+    
+    var conf = entities.createConfigForLoadingRows()
+    .entity(ContextUtils.getEntity(pContextId))
+    .fields(fields)
     
-    return {
-            "Organisation": ContextSelector.create("ORGANISATION", "CONTACT.CONTACTID", "ORGANISATION.NAME")
-                                       .setJoinExpression("join CONTACT on ORGANISATION.ORGANISATIONID = CONTACT.ORGANISATION_ID and CONTACT.PERSON_ID is null")
-                                       .setCondition(newWhere("ORGANISATION.ORGANISATIONID", "0", SqlBuilder.NOT_EQUAL()))
-                                       .setSubContexts({
-                                           "Person": [newSelect("CONTACTID").from("CONTACT").where("PERSON_ID is not null"), "CONTACT.ORGANISATION_ID", ["Offer", "Order", "Contract", "SupportTicket"]]
-                                       })
-            ,"Person": ContextSelector.create("CONTACT", "CONTACTID")
-                                      .setTitleExpression(maskingUtils.concatWithSeparator([
-                                                new ContactTitleRenderer(Contact.createWithColumnPreset()).asSql()
-                                                ,"' - '"//looks pretty bad; TODO: workaround till Lookups can be loaded over a link-entity; then use displayProc
-                                                ,"defaultAddress.ADDRESS", "defaultAddress.BUILDINGNO"
-                                                ,"' - '"
-                                                ,"defaultAddress.COUNTRY", "defaultAddress.ZIP", "defaultAddress.CITY"
-                                               ]," "))
-                                      .setJoinExpression("join PERSON on PERSON.PERSONID = CONTACT.PERSON_ID "
-                                                       + " join ORGANISATION on ORGANISATION.ORGANISATIONID = CONTACT.ORGANISATION_ID "
-                                                       + " left join ADDRESS defaultAddress on defaultAddress.ADDRESSID = CONTACT.ADDRESS_ID")
-            ,"PrivatePerson": ContextSelector.create("PERSON", "PERSONID")
-                                      .setTitleExpression(maskingUtils.concatWithSeparator([
-                                                new ContactTitleRenderer(Contact.createWithColumnPresetForPrivatePerson()).asSql()
-                                                ,"' - '"//looks pretty bad; TODO: workaround till Lookups can be loaded over a link-entity; then use displayProc
-                                                ,"defaultAddress.ADDRESS", "defaultAddress.BUILDINGNO"
-                                                ,"' - '"
-                                                ,"defaultAddress.COUNTRY", "defaultAddress.ZIP", "defaultAddress.CITY"
-                                               ]," "))
-                                      .setJoinExpression("left join CONTACT on PERSON.PERSONID = CONTACT.PERSON_ID and CONTACT.ORGANISATION_ID = '0' left join ADDRESS defaultAddress on defaultAddress.ADDRESSID = CONTACT.ADDRESS_ID")
-                                      .setContactIdField("CONTACT.CONTACTID")
-            ,"Activity": ContextSelector.create("ACTIVITY", "ACTIVITYID", "SUBJECT")
-            ,"Salesproject": ContextSelector.create("SALESPROJECT", "SALESPROJECTID")
-                                            .setTitleExpression(maskingUtils.concatenate([
-                                                                "'" + translate.text("Salesproject") + "'",
-                                                                "' '",
-                                                                maskingUtils.cast("PROJECTCODE", SQLTYPES.VARCHAR, 10),
-                                                                "' | '",
-                                                                "PROJECTTITLE"
-                                                                ]))
-                                            .setContactIdField("CONTACT_ID")
-                                            .setCreationDateField("STARTDATE")
-                                            .setStateField("STATUS")
-                                            .setActiveStates([$KeywordRegistry.salesprojectState$open(), $KeywordRegistry.salesprojectState$postponed()])
-            ,"Contract": ContextSelector.create("CONTRACT", "CONTRACTID")
-                                        .setTitleExpression(maskingUtils.cast(maskingUtils.concatWithSeparator([
-                                                                KeywordUtils.getResolvedTitleSqlPart("ContractType", "CONTRACTTYPE"),
-                                                                maskingUtils.cast("CONTRACTCODE", SQLTYPES.VARCHAR, 10)
-                                                                ], " "), isOracle ? SQLTYPES.NVARCHAR : SQLTYPES.VARCHAR, 50))
-                                        .setContactIdField("CONTACT_ID")
-                                        .setCreationDateField("CONTRACTSTART")
-                                        .setStateField("CONTRACTSTATUS")
-                                        .setActiveStates([$KeywordRegistry.contractState$validLimited(), $KeywordRegistry.contractState$validUnlimited(), $KeywordRegistry.contractState$notSigned()])
-            ,"Offer": ContextSelector.create("OFFER", "OFFERID")
-                                     .setTitleExpression(maskingUtils.cast(maskingUtils.concatenate([
-                                                "'" + translate.text("Offer") + "'",
-                                                "' '",
-                                                maskingUtils.cast("OFFERCODE", SQLTYPES.VARCHAR, 10),
-                                                "'-'",
-                                                maskingUtils.cast("VERSNR", SQLTYPES.VARCHAR, 10)
-                                                ]), isOracle ? SQLTYPES.NVARCHAR : SQLTYPES.VARCHAR, 50))
-                                     .setContactIdField("CONTACT_ID")
-                                     .setCreationDateField("OFFERDATE")
-                                     .setStateField("STATUS")
-                                     .setActiveStates([$KeywordRegistry.offerStatus$open(), $KeywordRegistry.offerStatus$checked(), $KeywordRegistry.offerStatus$sent()])
-            ,"Order": ContextSelector.create("SALESORDER", "SALESORDERID")
-                                     .setTitleExpression(maskingUtils.cast(maskingUtils.concatWithSeparator([
-                                                        KeywordUtils.getResolvedTitleSqlPart("OrderType", "ORDERTYPE"),
-                                                        maskingUtils.cast("SALESORDERCODE", SQLTYPES.VARCHAR, 10)
-                                                        ], " "), isOracle ? SQLTYPES.NVARCHAR : SQLTYPES.VARCHAR, 50))
-                                     .setContactIdField("CONTACT_ID")
-                                     .setCreationDateField("SALESORDERDATE")
-                                     .setStateField("ORDERSTATUS")
-                                     .setActiveStates([0, 1])
-            ,"Product": ContextSelector.create("PRODUCT", "PRODUCTID")
-                                       .setTitleExpression(maskingUtils.concatenate([
-                                            "PRODUCTCODE",
-                                            "' | '",
-                                            "PRODUCTNAME"
-                                            ]))
-            ,"Task": ContextSelector.create("TASK", "TASKID", "SUBJECT")
-            ,"Campaign": ContextSelector.create("CAMPAIGN", "CAMPAIGNID")
-                         .setTitleExpression(maskingUtils.concatWithSeparator(["CAMPAIGN.NAME", "CAMPAIGNSTEP.NAME"], " - ", false))
-                         .setContactIdField("CAMPAIGNPARTICIPANT.CONTACT_ID")
-                         .setJoinExpression("left join CAMPAIGNPARTICIPANT on CAMPAIGNPARTICIPANT.CAMPAIGN_ID = CAMPAIGN.CAMPAIGNID " +
-                                            "left join CAMPAIGNSTEP on CAMPAIGNSTEP.CAMPAIGNSTEPID = CAMPAIGNPARTICIPANT.CAMPAIGNSTEP_ID")
-                        .setCreationDateField("CAMPAIGNSTEP.DATE_START")
-                        .setStateField("CAMPAIGN.STATUS")
-                        .setActiveStates([$KeywordRegistry.campaignState$planning(), $KeywordRegistry.campaignState$approved()])
-            ,"CampaignStep" : ContextSelector.create("CAMPAIGNSTEP", "CAMPAIGNSTEPID", "NAME")
-            ,"SupportTicket": ContextSelector.create("TICKET", "TICKETID", "TASK.SUBJECT")
-                        .setJoinExpression("left join TASK on TASK.TASKID = TICKET.TASK_ID left join TASKLINK on TASKLINK.TASK_ID = TASK.TASKID")
-                        .setCondition(newWhere("TICKET.TICKETTYPE", $KeywordRegistry.ticketType$supportTicket()))
-                        .setContactIdField("TASKLINK.OBJECT_ROWID")
-                        .setStateField("TASK.STATUS")
-                        .setActiveStates([
-                            $KeywordRegistry.taskStatus$new(),
-                            $KeywordRegistry.taskStatus$unassigned(),
-                            $KeywordRegistry.taskStatus$assigned(),
-                            $KeywordRegistry.taskStatus$inProgress(),
-                            $KeywordRegistry.taskStatus$waiting(),
-                            $KeywordRegistry.taskStatus$customerChecks(),
-                        ])
-                        .setCreationDateField("TASK.START_DATE")
-            ,"BulkMail" : ContextSelector.create("BULKMAIL", "BULKMAILID", "NAME")
-            ,"SerialLetter" : ContextSelector.create("SERIALLETTER", "SERIALLETTERID", "TITLE")
-            ,"Leadimport": ContextSelector.create("LEADIMPORT", "LEADIMPORTID")
-                        .setTitleExpression("LEADIMPORT.NAME")
+    if(pFilterObj)
+        conf.filter(JSON.stringify(pFilterObj.filter))
+    
+    var res = [];
+    try//if Permissions prevent the user to read data from this context, entites.getRows throws an error. But we still wanna see the other Contexts
+    {
+        res = entities.getRows(conf);
     }
-}
-
-/**
- * TODO: !!!temporary function until you can get fields from another Entity!!!
- */
-ContextUtils.getNameSubselectSql = function(pContextIdDbField, pRowIdDbField)
-{
-    var select = SqlBuilder.caseStatement()
-
-    var selectMap = ContextUtils.getSelectMap();
-    for (let contextId in selectMap)
+    catch(ex)
     {
-        let titleSelect = newSelect(selectMap[contextId].titleExpression)
-            .from(selectMap[contextId].getFullFromClause())
-            .where(selectMap[contextId].getFullIdField() + " = " + pRowIdDbField);
-            
-        select.when(pContextIdDbField, contextId).then(titleSelect);
+        logging.log(ex)
     }
-
-    return select.toString();
-}
-
-/**
- * TODO: !!!temporary function until you can get fields from another Entity!!!
- */
-ContextUtils.getNameSql = function(pContextId, pRowId, pRowIdField)
-{
-    var selectMap = ContextUtils.getSelectMap ()
-    if (selectMap[pContextId] != undefined)
+    if(res.length > 0)
     {
-        var sql = newSelect(selectMap[pContextId].titleExpression)
-                    .from(selectMap[pContextId].getFullFromClause());
-        if (pRowIdField)
-            sql.where(selectMap[pContextId].getFullIdField() + " = " + pRowIdField);
-        else
-            sql.whereIfSet(selectMap[pContextId].getFullIdField(), pRowId);
-        return sql.build(SqlBuilder.NORESULT_CONDITION());
+        if(pContextConfig.subContext)
+        {
+            if(res[0]["#UID"] == undefined || res[0]["#TITLE"] == undefined || res[0]["#MAPPING"] == undefined || res[0]["#CONTENTDESCRIPTION"] == undefined 
+                || res[0]["#CONTENTTITLE"] == undefined || res[0]["DATE_NEW"] == undefined || res[0]["ACTIVE"] == undefined)
+                throw new Error(translate.text("Some prereserved EntityFields which are necessary fot 360° are not available. Context: "+pContextId
+                    +" Data: "+JSON.stringify(res)));
+        }
+        else if(res[0]["CONTACT_ID"] == undefined)
+            throw new Error(translate.text("CONTACT_ID is not defined! Context: "+pContextId));
     }
-    else
-        return "select 1 from person where 1=2";
+    return res;
 }
 
 /**
- * TODO: !!!temporary function until you can get fields from another Entity!!!
+ * gets the ContactId by using ContextUtils.loadContent()
+ * @param {String} pContextId The Context name
+ * @param {String} pRowId the uid for which to get the Contactid
+ * 
+ * @return the Contactid of certain Context and Uid
  */
 ContextUtils.getContactId = function(pContextId, pRowId)
 {
-    var selectMap = ContextUtils.getSelectMap()
-    if (selectMap[pContextId] != undefined && selectMap[pContextId].contactIdField)
-    {
-        return newSelect(selectMap[pContextId].contactIdField)
-                    .from(selectMap[pContextId].tableName)
-                    .where(selectMap[pContextId].getFullIdField(), pRowId)
-                    .cell();
-    }
-    else
-        return "";
+    var res = ContextUtils.loadContent(ContextUtils.getEntity(pContextId), [pRowId], ["CONTACT_ID"])[0]["CONTACT_ID"];
+    return res;
 }
 
+
 /**
- * TODO: !!!temporary function until you can get fields from another Entity!!!
- * nur 360
+ * gets the Count of Connections by Contactid
+ * @param {String} pContextId The Context name
+ * @param {String} pContactId The Contactid
  * 
+ * @return count of datasets for that specific Context
  */
-ContextUtils.getContextDataSql = function(pContextId, pContactId, pWithDate, pActive, pWithState, pWithGroupBy, pUidsForFiltering, pExcludeIds)
+ContextUtils.getCountByContactId = function(pContextId, pContactId)
 {
-    var selectMap = ContextUtils.getSelectMap();
-    var ownContextSelector = selectMap[pContextId];
-    var columns = [ownContextSelector.getFullIdField(), ownContextSelector.titleExpression];
-    
-    if (pWithDate === true)
-        columns.push(ownContextSelector.getFullField(ownContextSelector.creationDateField) || "''");
-
-    if (pWithState === true)
-    {
-        if (ownContextSelector.stateField)
-            columns.push(ownContextSelector.getFullField(ownContextSelector.stateField) || "''");
-        else
-            columns.push("''");
-    }
-    
-    if (pWithGroupBy === true)
-    {
-        if (ownContextSelector.groupBy)
-            columns.push(ownContextSelector.getFullField(ownContextSelector.groupBy) || "''");
-        else
-            columns.push("''");
-    }
-
-    var contextDataSelect = newSelect( columns.join(", ") )
-                                .from(ownContextSelector.getFullFromClause())
-                                .where(ownContextSelector.getFullField(ownContextSelector.contactIdField), pContactId, SqlBuilder.IN())
-                                .andIfSet(ownContextSelector.getFullIdField(), pUidsForFiltering, SqlBuilder.IN())
-                                .andIfSet(ownContextSelector.getFullIdField(), pExcludeIds, SqlBuilder.NOT_IN());
-    
-    if (pActive != undefined)
-    {
-        var activeStates = ownContextSelector.activeStates;
-        if(activeStates != null && activeStates.length > 0)
-        {
-            var condSub = newWhere();
-            activeStates.forEach(function (state) 
-            {   
-                if (ownContextSelector.stateField)
-                {
-                    if(pActive)
-                        condSub.or(ownContextSelector.getFullField(ownContextSelector.stateField), state)
-                    else
-                        condSub.and(ownContextSelector.getFullField(ownContextSelector.stateField), state, SqlBuilder.NOT_EQUAL())
-                }
-                
-            });
-            contextDataSelect.andIfSet(condSub);  
-        }
-    }    
-    contextDataSelect.andIfSet(ownContextSelector.condition);    
-    return contextDataSelect.build();
+    return ContextUtils.getContextDataViaReadEntity(pContextId, pContactId).length;
 }
 
 /**
- * TODO: !!!temporary function until you can get fields from another Entity!!!
+ * decides if a record is activ or not
+ * @param {String[]} pActiveStates, 1-dimensional Array of Active States
+ * @param {String} pDBFieldName, a DBField for comparison
+ * 
+ * @return a case when that resolves the active states to true and everything else to false in that Column
  */
-ContextUtils.getCountByContactId = function(pContextId, pContactId)
+ContextUtils.buildActiveCaseWhen = function(pActiveStates, pDBFieldName)
 {
-    var contextObject = ContextUtils.getSelectMap()[pContextId];
-    var tableName = contextObject.tableName;
-    var contactField = contextObject.getFullField(contextObject.contactIdField)
-    var join = contextObject.joinExpression;
-    if (tableName && contactField)
-    {
-        return newSelect("count(*)")
-                        .from(tableName + (join ? join : ""))
-                        .where(contactField, pContactId)
-                        .cell(true, "0");
-        return count;
-    }
-    return 0;
+    var extendedStates = [];
+    for(var i = 0; i < pActiveStates.length; i++)
+        extendedStates.push([pActiveStates[i], 'true']);
+    
+    //As default value we choose false, so we only have true or false and therefore we can filter more easily
+    return SqlUtils.translateStatementWithQuotes(SqlUtils.getResolvingCaseWhen(extendedStates, pDBFieldName, false)).replace("else '' end", "else 'false' end");
 }
 
 function AdminViewUtils () {}
@@ -763,7 +478,7 @@ AdminViewUtils.open = function (pUidField, pFields)
     else
         pUidField += " (UID)";
     var rows = [
-        [pUidField, pUidField, uid, "TEXT"]
+    [pUidField, pUidField, uid, "TEXT"]
     ];
     if (pFields)
     {
diff --git a/process/Order_lib/process.js b/process/Order_lib/process.js
index 10c273583ad..74651b5982c 100644
--- a/process/Order_lib/process.js
+++ b/process/Order_lib/process.js
@@ -383,7 +383,7 @@ OrderUtils.buildOrderReport = function (pOrderID)
         "SUMITEMSUM" : sumItemSum,
         "TOTAL" : text.formatDouble(total, "#,##0.00", true),
         "printDiscount" : printDiscount ? "1" : "0",
-        "Person" : db.cell(ContextUtils.getNameSql(vars.get("$field.OBJECT_TYPE"), vars.get("$field.OBJECT_ROWID")))
+        "Person" : ContextUtils.getTitleByContext(vars.get("$field.OBJECT_TYPE"), vars.get("$field.OBJECT_ROWID"))
     };
     
     
diff --git a/process/Util_lib/process.js b/process/Util_lib/process.js
index b520401112a..ca3962c9236 100644
--- a/process/Util_lib/process.js
+++ b/process/Util_lib/process.js
@@ -363,6 +363,95 @@ Utils.objectValues = function (pObject)
     });
 }
 
+
+/**
+ * builds/extends a filter-Object, can be used for e. g. entity.filter(), neon.setFilter, etc...
+ * Note: If a filter-Objects gets extended the new Filter will be added before the old one. 
+ * @example
+ * It will look like this: 
+    {
+       "filter":{               
+          "type":"group",                      -|
+          "operator":"AND",                     |
+          "childs":[                            |
+             {                                  |
+                "type":"row",                   |-  New Condition
+                "name":"ACTIVE",                |
+                "operator":"EQUAL",             |
+                "value":"Ja",                   |
+                "key":"true",                   |
+                "contenttype":"TEXT"           -|
+             },
+             {
+                "type":"group",                         -|
+                "operator":"AND",                        |
+                "childs":[                               |
+                   {                                     |
+                      "type":"row",                      |- Old condition
+                      "name":"DATE_NEW",                 |
+                      "operator":"TIMEFRAME_EQUAL",      |
+                      "value":"Heute",                   |
+                      "key":"REL=ADJUSTED;UNIT=DAY",     |
+                      "contenttype":"DATE"              -|
+                   }
+                ]
+             }
+          ]
+       }
+    }
+ * @param {Object} pFilterObj, the existing Filter-Object, for a new Obj use {} or null
+ * @param {String} pFieldName, all Fields which are filterable in that certain Entity
+ * @param {String} pOperator, Filteroperators, (look up "_getCondition"-Function in JditoFilter_lib for all available operator)
+ * @param {String} pContentType, the Contenttype of the Filter, ("TEXT",... etc)
+ * @param {String} pValue, this will be used as Value in the Frontend
+ * @param {String} pKey, this will be used as Value in the Backend
+ * @param {String} pParentOperator, "OR" or "AND" for the Group Operator, null = AND
+ * 
+ * @return new/extended Filter-Object
+ */
+Utils.buildFilterObj = function(pFilterObj, pFieldName, pOperator, pContentType, pValue, pKey, pParentOperator)
+{
+    
+    if(pParentOperator && pParentOperator != "AND" && pParentOperator != "OR")
+        throw new Error(translate.text("Illegal Parent Operator in buildFilterObj-Function: "+pParentOperator));
+    
+        
+    var subFilterObj = {
+        "type":"row",
+        "name":pFieldName,
+        "operator":pOperator,
+        "value": pValue,
+        "key": pKey,
+        "contenttype":pContentType
+    };
+        
+    var parentFilter = {
+        "filter" : {
+            "type":"group",
+            "operator":pParentOperator,
+            "childs": [subFilterObj]
+        }
+    };
+    
+
+    if(pFilterObj && pFilterObj.filters && pFilterObj.filters.childs.length > 0)
+    {
+        
+        var push = true;
+        for(var i = 0; i < pFilterObj.filters.childs.length; i++)
+        {
+            if(JSON.stringify(pFilterObj.filters.childs[i]) == JSON.stringify(subFilterObj))
+                push = false;
+        }
+        if(push)
+        {
+            parentFilter.filter.childs = parentFilter.filter.childs.concat([pFilterObj.filters]);
+        }
+       
+    }
+    return parentFilter;
+}
+
 /**
  * Class containing static utility functions for regular expression objects (RegExp)
  * Do not create an instance of this
@@ -469,10 +558,10 @@ StringUtils.replaceAll = function(pPlainInputStr, pPlainSearchStr, pReplacement,
  */
 StringUtils.concat = function(pSeparator, pElements)
 {
-   var res = pElements.filter(function(e){
-       return e != null && e != "";
-   }).join(pSeparator);
-   return res;
+    var res = pElements.filter(function(e){
+        return e != null && e != "";
+    }).join(pSeparator);
+    return res;
 };
 
 /**
@@ -514,18 +603,18 @@ StringUtils.pad36 = function(pValue)
  */
 StringUtils.unescapeSlashes = function(pValue) 
 {
-  // add another escaped slash if the string ends with an odd
-  // number of escaped slashes which will crash JSON.parse
-  let parsedStr = pValue.replace(/(^|[^\\])(\\\\)*\\$/, "$&\\");
-  // escape "
-  parsedStr = parsedStr.replace(/"/, '\\"');
-  try {
-    parsedStr = JSON.parse('"' + parsedStr + '"');
-  } catch(e) {
-      logging.log(e);
-    return pValue;
-  }
-  return parsedStr ;
+    // add another escaped slash if the string ends with an odd
+    // number of escaped slashes which will crash JSON.parse
+    let parsedStr = pValue.replace(/(^|[^\\])(\\\\)*\\$/, "$&\\");
+    // escape "
+    parsedStr = parsedStr.replace(/"/, '\\"');
+    try {
+        parsedStr = JSON.parse('"' + parsedStr + '"');
+    } catch(e) {
+        logging.log(e);
+        return pValue;
+    }
+    return parsedStr ;
 }
 
 /**
@@ -1058,9 +1147,9 @@ NumberSequencingUtils.validateUniqueNumber = function(pNumber, pColumn, pTable,
 NumberSequencingUtils.getMaxUniqueNumber = function(pColumn, pTable, pCondition) 
 {
     return newSelect(new SqlMaskingUtils().max(pColumn))
-        .from(pTable)
-        .whereIfSet(pCondition)
-        .cell() || "0";
+    .from(pTable)
+    .whereIfSet(pCondition)
+    .cell() || "0";
 }
 
 /**
@@ -1090,7 +1179,9 @@ TreeUtils.sortArrayForTree = function (pArray, pUidIndex, pParentIdIndex)
     var rows = {};
     var allIds = {};
     
-    pArray.forEach(function (row) {allIds[row[pUidIndex]] = true;});
+    pArray.forEach(function (row) {
+        allIds[row[pUidIndex]] = true;
+    });
     var index = 0;
     
     do {
@@ -1104,7 +1195,7 @@ TreeUtils.sortArrayForTree = function (pArray, pUidIndex, pParentIdIndex)
                 };
         }, rows);
         
-        /* stop if no new items were added, otherwise incorrect data (for instance 
+    /* stop if no new items were added, otherwise incorrect data (for instance 
            an item that is it's own parent) could cause an infinite loop           */
     } while (oldIndex != index); 
     var sortedArray = new Array(index);
@@ -1158,7 +1249,7 @@ ConsecutiveCodeUtils.setCode = function(pId, pTable, pIdCol, pCodeCol)
         max = -1;
     
     newWhereIfSet(pTable + "." + pIdCol, pId)
-        .updateData(true, pTable, [pCodeCol], null, [parseInt(max)+1]);
+    .updateData(true, pTable, [pCodeCol], null, [parseInt(max)+1]);
 }
 
 function IdUtils() {}
-- 
GitLab


From 409ae5c245f8c49e54b8c576a46e8987b2e1f97a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Alexander=20V=C3=B6gl?= <a.voegl@adito.de>
Date: Mon, 30 Nov 2020 16:57:40 +0000
Subject: [PATCH 131/184] Quality of Life changes & smaller Fixes due to in
 inconsistency [Projekt: Entwicklung - xRM][TicketNr.: 1067652][Fehler
 Campagin und CampaignParticipants]

---
 .../alter_CampaignParticipantResponsible.xml  |  10 +
 .../Data_alias/basic/2020.2.2/changelog.xml   |   1 +
 .../CampaignAddParticipants_entity.aod        |  24 +-
 .../addparticipants/onActionProcess.js        |   2 +-
 .../CampaignAnalysis_entity.aod               |   1 +
 .../CampaignCostChart_entity.aod              |   1 +
 .../CampaignCost_entity.aod                   |  18 ++
 .../expression.js                             |   3 +
 .../CampaignParticipantChart_entity.aod       |   1 +
 .../CampaignParticipant_entity.aod            | 227 +++++++++++++-----
 .../advertisingban_icon/colorProcess.js       |  15 +-
 .../displayValueProcess.js                    |  11 +-
 .../children/campaignid_param/valueProcess.js |  11 +-
 .../contact_id/displayValueProcess.js         |   8 +-
 .../contact_id/linkedContextProcess.js        |   5 -
 .../entityfields/contact_id/valueProcess.js   |   5 -
 .../stateProcess.js                           |  16 --
 .../onActionProcess.js                        |  36 ---
 .../hasadvertisingban/dropDownProcess.js      |   7 -
 .../displayValueProcess.js                    |   5 +
 .../responsible_contact_id/valueProcess.js    |   6 +
 .../conditionProcess.js                       |   0
 .../recordcontainers/db/fromClauseProcess.js  |   5 +
 .../onDBInsert.js                             |   0
 .../advertisingban_icon.value/expression.js   |   7 +
 .../expression.js                             |   3 +
 .../expression.js                             |  14 ++
 .../expression.js                             |   3 +
 .../expression.js                             |   3 +
 .../expression.js                             |   0
 .../expression.js                             |   0
 .../anycontacts/filterConditionProcess.js     |  10 -
 .../expression.js                             |   3 +
 .../expression.js                             |   3 +
 .../hasadvertisingban.value/expression.js     |  11 -
 .../CampaignPlanning_entity.aod               |   1 +
 .../CampaignStep_entity.aod                   |  56 +++--
 .../valueProcess.js                           |  14 +-
 .../displayValueProcess.js                    |   8 +-
 .../employee_contact_id/valueProcess.js       |   4 +-
 .../onlyactives_param/valueProcess.js         |   2 +
 .../containername_param/valueProcess.js       |   1 -
 .../containername_param/valueProcess.js       |   6 +-
 .../maxparticipants/onValidation.js           |   5 +-
 .../status/displayValueProcess.js             |   6 -
 .../entityfields/status/valueProcess.js       |   4 +-
 .../stepmedium/displayValueProcess.js         |   6 -
 .../expression.js                             |   3 +
 .../expression.js                             |   3 +
 .../status.displayvalue/expression.js         |   3 +-
 .../stepmedium.displayvalue/expression.js     |   5 +
 entity/Campaign_entity/Campaign_entity.aod    | 133 +++-------
 entity/Campaign_entity/afterUiInit.js         |   5 +
 .../copycampaign/onActionProcess.js           |  10 +-
 .../entityfields/description/valueProcess.js  |   8 -
 .../employee_contact_id/valueProcess.js       |   9 +-
 .../entityfields/name/valueProcess.js         |   8 -
 .../status/displayValueProcess.js             |   6 -
 .../entityfields/status/valueProcess.js       |  11 +-
 .../children/objectid_param/valueProcess.js   |   8 +-
 .../children/rowid_param/valueProcess.js      |   6 +-
 .../recordcontainers/db/conditionProcess.js   |   8 +-
 .../filterConditionProcess.js                 |  27 ---
 .../filterValuesProcess.js                    |  11 -
 .../dateend_filter/filterConditionProcess.js  |  17 --
 .../filterConditionProcess.js                 |  17 --
 .../favorite_filter/filterConditionProcess.js |  11 -
 .../favorite_filter/filterValuesProcess.js    |   5 -
 .../member_filter/filterConditionProcess.js   |  26 --
 .../member_filter/filterValuesProcess.js      |  13 -
 .../filterConditionProcess.js                 |  26 --
 .../participant_filter/filterValuesProcess.js |  16 --
 .../recordcontainers/db/fromClauseProcess.js  |  17 --
 .../recordcontainers/db/onDBInsert.js         |   4 +-
 .../date_end.value/expression.js              |  12 +-
 .../date_start.value/expression.js            |  11 +-
 .../expression.js                             |   3 +
 .../status.displayvalue/expression.js         |   4 +-
 .../KeywordEntry_entity.aod                   |   6 +
 .../_____LANGUAGE_de/_____LANGUAGE_de.aod     |   4 +
 .../CampaignParticipant.aod                   |   1 -
 .../CampaignCostChart_view.aod                |   2 +-
 .../CampaignCostExtendedFilter_view.aod       |   2 +
 .../CampaignCostFilter_view.aod               |   5 +
 .../CampaignCostFix_view.aod                  |   2 +
 .../CampaignCostVariable_view.aod             |   4 +
 .../CampaignFilter_view.aod                   |   2 +-
 .../CampaignMain_view/CampaignMain_view.aod   |   5 -
 .../CampaignParticipantEdit_view.aod          |   7 +-
 .../CampaignParticipantFilter_view.aod        |  25 +-
 .../CampaignStepFilter_view.aod               |   7 +-
 .../CampaignStepMembers_view.aod              |  10 +
 .../CampaignStepsGantt_view.aod               |   1 -
 process/Campaign_lib/process.js               |  21 +-
 process/Contact_lib/process.js                |  30 +++
 process/Organisation_lib/process.js           |  15 ++
 96 files changed, 583 insertions(+), 600 deletions(-)
 create mode 100644 .liquibase/Data_alias/basic/2020.2.2/alter_CampaignParticipantResponsible.xml
 create mode 100644 entity/CampaignCost_entity/recordcontainers/db/recordfieldmappings/netperparticipant_aggregate.value/expression.js
 delete mode 100644 entity/CampaignParticipant_entity/entityfields/contact_id/linkedContextProcess.js
 delete mode 100644 entity/CampaignParticipant_entity/entityfields/contact_id/valueProcess.js
 delete mode 100644 entity/CampaignParticipant_entity/entityfields/filterviewactiongroup/children/setsteptoparticipantselection/stateProcess.js
 delete mode 100644 entity/CampaignParticipant_entity/entityfields/filterviewactiongroup/children/startmarketingworkflows/onActionProcess.js
 delete mode 100644 entity/CampaignParticipant_entity/entityfields/hasadvertisingban/dropDownProcess.js
 create mode 100644 entity/CampaignParticipant_entity/entityfields/responsible_contact_id/displayValueProcess.js
 create mode 100644 entity/CampaignParticipant_entity/entityfields/responsible_contact_id/valueProcess.js
 rename entity/CampaignParticipant_entity/recordcontainers/{participantsdbrecordcontainer => db}/conditionProcess.js (100%)
 create mode 100644 entity/CampaignParticipant_entity/recordcontainers/db/fromClauseProcess.js
 rename entity/CampaignParticipant_entity/recordcontainers/{participantsdbrecordcontainer => db}/onDBInsert.js (100%)
 create mode 100644 entity/CampaignParticipant_entity/recordcontainers/db/recordfieldmappings/advertisingban_icon.value/expression.js
 create mode 100644 entity/CampaignParticipant_entity/recordcontainers/db/recordfieldmappings/contact_person_id.displayvalue/expression.js
 create mode 100644 entity/CampaignParticipant_entity/recordcontainers/db/recordfieldmappings/organisation_contact_id.value/expression.js
 create mode 100644 entity/CampaignParticipant_entity/recordcontainers/db/recordfieldmappings/person_contact_id.displayvalue/expression.js
 create mode 100644 entity/CampaignParticipant_entity/recordcontainers/db/recordfieldmappings/responsible_contact_id.displayvalue/expression.js
 rename entity/CampaignParticipant_entity/recordcontainers/{participantsdbrecordcontainer/recordfieldmappings/standard_email_communication.value => db/recordfieldmappings/standard_email_communication.displayvalue}/expression.js (100%)
 rename entity/CampaignParticipant_entity/recordcontainers/{participantsdbrecordcontainer/recordfieldmappings/standard_phone_communication.value => db/recordfieldmappings/standard_phone_communication.displayvalue}/expression.js (100%)
 delete mode 100644 entity/CampaignParticipant_entity/recordcontainers/participantsdbrecordcontainer/recordfieldmappings/anycontacts/filterConditionProcess.js
 create mode 100644 entity/CampaignParticipant_entity/recordcontainers/participantsdbrecordcontainer/recordfieldmappings/campaignstep_id.displayvalue/expression.js
 create mode 100644 entity/CampaignParticipant_entity/recordcontainers/participantsdbrecordcontainer/recordfieldmappings/campaignstepcurrentparticipantcount.value/expression.js
 delete mode 100644 entity/CampaignParticipant_entity/recordcontainers/participantsdbrecordcontainer/recordfieldmappings/hasadvertisingban.value/expression.js
 create mode 100644 entity/CampaignStep_entity/entityfields/employees/children/onlyactives_param/valueProcess.js
 rename entity/CampaignStep_entity/entityfields/{campaignstepmedium => keywordstepmedium}/children/containername_param/valueProcess.js (81%)
 delete mode 100644 entity/CampaignStep_entity/entityfields/status/displayValueProcess.js
 delete mode 100644 entity/CampaignStep_entity/entityfields/stepmedium/displayValueProcess.js
 create mode 100644 entity/CampaignStep_entity/recordcontainers/db/recordfieldmappings/currentparticipantsperstep.value/expression.js
 create mode 100644 entity/CampaignStep_entity/recordcontainers/db/recordfieldmappings/employee_contact_id.displayvalue/expression.js
 create mode 100644 entity/CampaignStep_entity/recordcontainers/db/recordfieldmappings/stepmedium.displayvalue/expression.js
 delete mode 100644 entity/Campaign_entity/entityfields/description/valueProcess.js
 delete mode 100644 entity/Campaign_entity/entityfields/name/valueProcess.js
 delete mode 100644 entity/Campaign_entity/entityfields/status/displayValueProcess.js
 delete mode 100644 entity/Campaign_entity/recordcontainers/db/filterextensions/campaignstep_filter/filterConditionProcess.js
 delete mode 100644 entity/Campaign_entity/recordcontainers/db/filterextensions/campaignstep_filter/filterValuesProcess.js
 delete mode 100644 entity/Campaign_entity/recordcontainers/db/filterextensions/dateend_filter/filterConditionProcess.js
 delete mode 100644 entity/Campaign_entity/recordcontainers/db/filterextensions/datestart_filter/filterConditionProcess.js
 delete mode 100644 entity/Campaign_entity/recordcontainers/db/filterextensions/favorite_filter/filterConditionProcess.js
 delete mode 100644 entity/Campaign_entity/recordcontainers/db/filterextensions/favorite_filter/filterValuesProcess.js
 delete mode 100644 entity/Campaign_entity/recordcontainers/db/filterextensions/member_filter/filterConditionProcess.js
 delete mode 100644 entity/Campaign_entity/recordcontainers/db/filterextensions/member_filter/filterValuesProcess.js
 delete mode 100644 entity/Campaign_entity/recordcontainers/db/filterextensions/participant_filter/filterConditionProcess.js
 delete mode 100644 entity/Campaign_entity/recordcontainers/db/filterextensions/participant_filter/filterValuesProcess.js
 delete mode 100644 entity/Campaign_entity/recordcontainers/db/fromClauseProcess.js
 create mode 100644 entity/Campaign_entity/recordcontainers/db/recordfieldmappings/employee_contact_id.displayvalue/expression.js
 create mode 100644 neonView/CampaignStepMembers_view/CampaignStepMembers_view.aod

diff --git a/.liquibase/Data_alias/basic/2020.2.2/alter_CampaignParticipantResponsible.xml b/.liquibase/Data_alias/basic/2020.2.2/alter_CampaignParticipantResponsible.xml
new file mode 100644
index 00000000000..349148d6651
--- /dev/null
+++ b/.liquibase/Data_alias/basic/2020.2.2/alter_CampaignParticipantResponsible.xml
@@ -0,0 +1,10 @@
+<?xml version="1.1" encoding="UTF-8" standalone="no"?>
+<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd">
+  <changeSet author="a.voegl" id="2a30b35b-9882-468e-98a6-a10f0561a681">
+	<addColumn tableName="CAMPAIGNPARTICIPANT">
+            <column name="RESPONSIBLE_CONTACT_ID" type="CHAR(36)"/>
+	</addColumn> 
+  </changeSet>
+</databaseChangeLog>
\ No newline at end of file
diff --git a/.liquibase/Data_alias/basic/2020.2.2/changelog.xml b/.liquibase/Data_alias/basic/2020.2.2/changelog.xml
index 7f5016480e9..8b27ac25ad0 100644
--- a/.liquibase/Data_alias/basic/2020.2.2/changelog.xml
+++ b/.liquibase/Data_alias/basic/2020.2.2/changelog.xml
@@ -4,6 +4,7 @@
     <include relativeToChangelogFile="true" file="insert_commMediumTitleKeywordAttribute.xml"/>
     <include relativeToChangelogFile="true" file="Knowledgemanagement/changelog_knowledgeManagement.xml"/>
     <include relativeToChangelogFile="true" file="insert_employeeCountAttribute.xml"/>
+    <include relativeToChangelogFile="true" file="alter_CampaignParticipantResponsible.xml"/>
     <include relativeToChangelogFile="true" file="MSTeams/changelog.xml"/>
     <include relativeToChangelogFile="true" file="insert_newsletterAttribute.xml"/>
 </databaseChangeLog>
diff --git a/entity/CampaignAddParticipants_entity/CampaignAddParticipants_entity.aod b/entity/CampaignAddParticipants_entity/CampaignAddParticipants_entity.aod
index 03225b22011..339e6914d5f 100644
--- a/entity/CampaignAddParticipants_entity/CampaignAddParticipants_entity.aod
+++ b/entity/CampaignAddParticipants_entity/CampaignAddParticipants_entity.aod
@@ -6,6 +6,7 @@
   <title>Add participants to Campaign</title>
   <siblings>
     <element>CampaignParticipant_entity</element>
+    <element>Campaign_entity</element>
   </siblings>
   <recordContainer>datalessConfig</recordContainer>
   <entityFields>
@@ -59,6 +60,11 @@
     </entityConsumer>
     <entityConsumer>
       <name>CampaignStepConsumer</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>CampaignStep_entity</entityName>
+        <fieldName>CampaignSteps</fieldName>
+      </dependency>
       <children>
         <entityParameter>
           <name>campaignId_param</name>
@@ -66,12 +72,11 @@
           <expose v="true" />
         </entityParameter>
       </children>
-      <dependency>
-        <name>dependency</name>
-        <entityName>CampaignStep_entity</entityName>
-        <fieldName>CampaignSteps</fieldName>
-      </dependency>
     </entityConsumer>
+    <entityField>
+      <name>UID</name>
+      <state>EDITABLE</state>
+    </entityField>
     <entityParameter>
       <name>currentCampaignId_param</name>
       <expose v="true" />
@@ -152,6 +157,15 @@
     </entityProvider>
   </entityFields>
   <recordContainers>
+    <jDitoRecordContainer>
+      <name>jdito</name>
+      <jDitoRecordAlias>Data_alias</jDitoRecordAlias>
+      <recordFieldMappings>
+        <jDitoRecordFieldMapping>
+          <name>UID.value</name>
+        </jDitoRecordFieldMapping>
+      </recordFieldMappings>
+    </jDitoRecordContainer>
     <datalessRecordContainer>
       <name>datalessConfig</name>
       <alias>Data_alias</alias>
diff --git a/entity/CampaignAddParticipants_entity/entityfields/addparticipants/onActionProcess.js b/entity/CampaignAddParticipants_entity/entityfields/addparticipants/onActionProcess.js
index b2c37dfa07d..f1697b24ba8 100644
--- a/entity/CampaignAddParticipants_entity/entityfields/addparticipants/onActionProcess.js
+++ b/entity/CampaignAddParticipants_entity/entityfields/addparticipants/onActionProcess.js
@@ -31,7 +31,7 @@ else
     participantCondition = JSON.parse(vars.getString("$param.campaignParticipantsCondition_param")).condition;
     _handleCondition(campaignId, conditionSourceTableName, participantCondition);
 }
-
+neon.refreshAll();
 if (!vars.exists("$param.currentCampaignId_param") || !vars.get("$param.currentCampaignId_param"))
     neon.openContext("Campaign", "CampaignMain_view", [campaignId], neon.OPERATINGSTATE_VIEW, null);
 
diff --git a/entity/CampaignAnalysis_entity/CampaignAnalysis_entity.aod b/entity/CampaignAnalysis_entity/CampaignAnalysis_entity.aod
index 137b70c4aa9..ff9e8a25ad8 100644
--- a/entity/CampaignAnalysis_entity/CampaignAnalysis_entity.aod
+++ b/entity/CampaignAnalysis_entity/CampaignAnalysis_entity.aod
@@ -6,6 +6,7 @@
   <siblings>
     <element>CampaignCost_entity</element>
   </siblings>
+  <usePermissions v="false" />
   <recordContainer>jdito</recordContainer>
   <entityFields>
     <entityProvider>
diff --git a/entity/CampaignCostChart_entity/CampaignCostChart_entity.aod b/entity/CampaignCostChart_entity/CampaignCostChart_entity.aod
index de366ec455d..f5d7ee451e4 100644
--- a/entity/CampaignCostChart_entity/CampaignCostChart_entity.aod
+++ b/entity/CampaignCostChart_entity/CampaignCostChart_entity.aod
@@ -6,6 +6,7 @@
   <siblings>
     <element>CampaignCost_entity</element>
   </siblings>
+  <usePermissions v="false" />
   <recordContainer>jdito</recordContainer>
   <entityFields>
     <entityProvider>
diff --git a/entity/CampaignCost_entity/CampaignCost_entity.aod b/entity/CampaignCost_entity/CampaignCost_entity.aod
index 2af24acc0d0..096e8a8d95b 100644
--- a/entity/CampaignCost_entity/CampaignCost_entity.aod
+++ b/entity/CampaignCost_entity/CampaignCost_entity.aod
@@ -7,6 +7,7 @@
     <element>CampaignAnalysis_entity</element>
     <element>CampaignCostChart_entity</element>
   </siblings>
+  <usePermissions v="false" />
   <titlePlural>Cost entries</titlePlural>
   <recordContainer>db</recordContainer>
   <entityFields>
@@ -236,6 +237,14 @@
       <name>#PROVIDER_AGGREGATES</name>
       <useAggregates v="true" />
     </entityProvider>
+    <entityAggregateField>
+      <name>NET_aggregate</name>
+      <parentField>NET</parentField>
+    </entityAggregateField>
+    <entityAggregateField>
+      <name>NETPERPARTICIPANT_aggregate</name>
+      <parentField>netPerParticipant</parentField>
+    </entityAggregateField>
   </entityFields>
   <recordContainers>
     <dbRecordContainer>
@@ -312,6 +321,15 @@
           <name>CURRENCY.value</name>
           <recordfield>CAMPAIGN.CURRENCY</recordfield>
         </dbRecordFieldMapping>
+        <aggregateFieldDbMapping>
+          <name>NET_aggregate.value</name>
+          <recordfield>CAMPAIGNCOST.NET</recordfield>
+          <aggregateType>SUM</aggregateType>
+        </aggregateFieldDbMapping>
+        <aggregateFieldDbMapping>
+          <name>NETPERPARTICIPANT_aggregate.value</name>
+          <expression>%aditoprj%/entity/CampaignCost_entity/recordcontainers/db/recordfieldmappings/netperparticipant_aggregate.value/expression.js</expression>
+        </aggregateFieldDbMapping>
       </recordFieldMappings>
     </dbRecordContainer>
   </recordContainers>
diff --git a/entity/CampaignCost_entity/recordcontainers/db/recordfieldmappings/netperparticipant_aggregate.value/expression.js b/entity/CampaignCost_entity/recordcontainers/db/recordfieldmappings/netperparticipant_aggregate.value/expression.js
new file mode 100644
index 00000000000..18b449265da
--- /dev/null
+++ b/entity/CampaignCost_entity/recordcontainers/db/recordfieldmappings/netperparticipant_aggregate.value/expression.js
@@ -0,0 +1,3 @@
+import("system.result");
+result.string("SUM(CAMPAIGNCOST.NET/(select COUNT(*) from CAMPAIGNPARTICIPANT where CAMPAIGNCOST.CAMPAIGN_ID = CAMPAIGNPARTICIPANT.CAMPAIGN_ID "
+             +" and CAMPAIGNPARTICIPANT.CAMPAIGNSTEP_ID = CAMPAIGNSTEP.CAMPAIGNSTEPID))");
\ No newline at end of file
diff --git a/entity/CampaignParticipantChart_entity/CampaignParticipantChart_entity.aod b/entity/CampaignParticipantChart_entity/CampaignParticipantChart_entity.aod
index 9f4d833b4dd..6291fe367fc 100644
--- a/entity/CampaignParticipantChart_entity/CampaignParticipantChart_entity.aod
+++ b/entity/CampaignParticipantChart_entity/CampaignParticipantChart_entity.aod
@@ -8,6 +8,7 @@
     <element>CampaignStep_entity</element>
     <element>CampaignAddParticipants_entity</element>
   </siblings>
+  <usePermissions v="false" />
   <recordContainer>jdito</recordContainer>
   <entityFields>
     <entityProvider>
diff --git a/entity/CampaignParticipant_entity/CampaignParticipant_entity.aod b/entity/CampaignParticipant_entity/CampaignParticipant_entity.aod
index 42f0af8d639..47b0a225372 100644
--- a/entity/CampaignParticipant_entity/CampaignParticipant_entity.aod
+++ b/entity/CampaignParticipant_entity/CampaignParticipant_entity.aod
@@ -7,34 +7,21 @@
   <siblings>
     <element>CampaignAddParticipants_entity</element>
     <element>CampaignParticipantChart_entity</element>
+    <element>Campaign_entity</element>
   </siblings>
   <afterOperatingState>%aditoprj%/entity/CampaignParticipant_entity/afterOperatingState.js</afterOperatingState>
-  <useFavorites v="true" />
+  <usePermissions v="false" />
   <titlePlural>Participants</titlePlural>
-  <recordContainer>ParticipantsDbRecordContainer</recordContainer>
+  <recordContainer>db</recordContainer>
   <entityFields>
     <entityProvider>
       <name>#PROVIDER</name>
+      <recordContainer>db</recordContainer>
     </entityProvider>
     <entityProvider>
       <name>CampaignParticipantsProvider</name>
-      <targetContextField>CONTACTCONTEXT</targetContextField>
-      <targetIdField>CONTACT_ID</targetIdField>
       <documentation>%aditoprj%/entity/CampaignParticipant_entity/entityfields/campaignparticipantsprovider/documentation.adoc</documentation>
-      <children>
-        <entityParameter>
-          <name>ContactId_param</name>
-          <expose v="true" />
-        </entityParameter>
-        <entityParameter>
-          <name>CampaignId_param</name>
-          <expose v="true" />
-        </entityParameter>
-        <entityParameter>
-          <name>CampaignStepId_param</name>
-          <expose v="true" />
-        </entityParameter>
-      </children>
+      <recordContainer>db</recordContainer>
       <dependencies>
         <entityDependency>
           <name>f28945cd-4613-4dfa-91f7-a7d9d64cef58</name>
@@ -49,6 +36,20 @@
           <isConsumer v="false" />
         </entityDependency>
       </dependencies>
+      <children>
+        <entityParameter>
+          <name>ContactId_param</name>
+          <expose v="true" />
+        </entityParameter>
+        <entityParameter>
+          <name>CampaignId_param</name>
+          <expose v="true" />
+        </entityParameter>
+        <entityParameter>
+          <name>CampaignStepId_param</name>
+          <expose v="true" />
+        </entityParameter>
+      </children>
     </entityProvider>
     <entityParameter>
       <name>CampaignStepId_param</name>
@@ -113,11 +114,9 @@
       <name>CONTACT_ID</name>
       <title>Participant</title>
       <consumer>AnyContacts</consumer>
-      <linkedContextProcess>%aditoprj%/entity/CampaignParticipant_entity/entityfields/contact_id/linkedContextProcess.js</linkedContextProcess>
       <mandatory v="true" />
       <state>READONLY</state>
       <stateProcess>%aditoprj%/entity/CampaignParticipant_entity/entityfields/contact_id/stateProcess.js</stateProcess>
-      <valueProcess>%aditoprj%/entity/CampaignParticipant_entity/entityfields/contact_id/valueProcess.js</valueProcess>
       <displayValueProcess>%aditoprj%/entity/CampaignParticipant_entity/entityfields/contact_id/displayValueProcess.js</displayValueProcess>
     </entityField>
     <entityField>
@@ -145,6 +144,11 @@
     <entityConsumer>
       <name>CampaignSteps</name>
       <refreshParent v="true" />
+      <dependency>
+        <name>dependency</name>
+        <entityName>CampaignStep_entity</entityName>
+        <fieldName>CampaignSteps</fieldName>
+      </dependency>
       <children>
         <entityParameter>
           <name>campaignId_param</name>
@@ -152,11 +156,6 @@
           <expose v="true" />
         </entityParameter>
       </children>
-      <dependency>
-        <name>dependency</name>
-        <entityName>CampaignStep_entity</entityName>
-        <fieldName>CampaignSteps</fieldName>
-      </dependency>
     </entityConsumer>
     <entityField>
       <name>CONTACTCONTEXT</name>
@@ -170,20 +169,12 @@
           <title>Update campaign step</title>
           <onActionProcess>%aditoprj%/entity/CampaignParticipant_entity/entityfields/filterviewactiongroup/children/setsteptoparticipantselection/onActionProcess.js</onActionProcess>
           <isObjectAction v="false" />
-          <isSelectionAction v="false" />
+          <isSelectionAction v="true" />
           <iconId>NEON:GROUP_APPOINTMENT</iconId>
-          <state>DISABLED</state>
-          <stateProcess>%aditoprj%/entity/CampaignParticipant_entity/entityfields/filterviewactiongroup/children/setsteptoparticipantselection/stateProcess.js</stateProcess>
+          <state>AUTO</state>
           <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>
@@ -212,17 +203,17 @@
     </entityConsumer>
     <entityConsumer>
       <name>CommRestrictionIcon</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordAttribute_entity</entityName>
+        <fieldName>SpecificContainerKeyword</fieldName>
+      </dependency>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
           <valueProcess>%aditoprj%/entity/CampaignParticipant_entity/entityfields/commrestrictionicon/children/containername_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-      <dependency>
-        <name>dependency</name>
-        <entityName>KeywordAttribute_entity</entityName>
-        <fieldName>SpecificContainerKeyword</fieldName>
-      </dependency>
     </entityConsumer>
     <entityField>
       <name>STANDARD_EMAIL_COMMUNICATION</name>
@@ -237,29 +228,102 @@
     <entityProvider>
       <name>#PROVIDER_AGGREGATES</name>
       <useAggregates v="true" />
+      <recordContainer>db</recordContainer>
     </entityProvider>
     <entityField>
-      <name>HASADVERTISINGBAN</name>
-      <title>Advertising ban</title>
-      <contentType>BOOLEAN</contentType>
-      <dropDownProcess>%aditoprj%/entity/CampaignParticipant_entity/entityfields/hasadvertisingban/dropDownProcess.js</dropDownProcess>
+      <name>CONTACT_ORGANISATION_ID</name>
+      <title>Organisation</title>
+      <linkedContext>Organisation</linkedContext>
+    </entityField>
+    <entityField>
+      <name>CONTACT_PERSON_ID</name>
+      <title>Participant</title>
+      <linkedContext>Person</linkedContext>
     </entityField>
+    <entityField>
+      <name>PERSON_CONTACT_ID</name>
+      <title>Person</title>
+      <consumer>Persons</consumer>
+      <linkedContext>Person</linkedContext>
+    </entityField>
+    <entityField>
+      <name>ORGANISATION_CONTACT_ID</name>
+      <title>Organisation</title>
+      <consumer>Organisations</consumer>
+      <groupable v="true" />
+      <linkedContext>Organisation</linkedContext>
+    </entityField>
+    <entityConsumer>
+      <name>Persons</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Person_entity</entityName>
+        <fieldName>Contacts</fieldName>
+      </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>Organisations</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Organisation_entity</entityName>
+        <fieldName>Organisations</fieldName>
+      </dependency>
+    </entityConsumer>
+    <entityField>
+      <name>RESPONSIBLE_CONTACT_ID</name>
+      <title>Verantwortlicher</title>
+      <consumer>ResponsibleEmployees</consumer>
+      <groupable v="true" />
+      <linkedContext>Person</linkedContext>
+      <valueProcess>%aditoprj%/entity/CampaignParticipant_entity/entityfields/responsible_contact_id/valueProcess.js</valueProcess>
+      <displayValueProcess>%aditoprj%/entity/CampaignParticipant_entity/entityfields/responsible_contact_id/displayValueProcess.js</displayValueProcess>
+    </entityField>
+    <entityConsumer>
+      <name>ResponsibleEmployees</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Employee_entity</entityName>
+        <fieldName>Employees</fieldName>
+      </dependency>
+    </entityConsumer>
   </entityFields>
   <recordContainers>
     <dbRecordContainer>
-      <name>ParticipantsDbRecordContainer</name>
+      <name>db</name>
       <alias>Data_alias</alias>
       <hasDependentRecords v="true" />
-      <conditionProcess>%aditoprj%/entity/CampaignParticipant_entity/recordcontainers/participantsdbrecordcontainer/conditionProcess.js</conditionProcess>
-      <onDBInsert>%aditoprj%/entity/CampaignParticipant_entity/recordcontainers/participantsdbrecordcontainer/onDBInsert.js</onDBInsert>
+      <fromClauseProcess>%aditoprj%/entity/CampaignParticipant_entity/recordcontainers/db/fromClauseProcess.js</fromClauseProcess>
+      <conditionProcess>%aditoprj%/entity/CampaignParticipant_entity/recordcontainers/db/conditionProcess.js</conditionProcess>
+      <onDBInsert>%aditoprj%/entity/CampaignParticipant_entity/recordcontainers/db/onDBInsert.js</onDBInsert>
       <linkInformation>
         <linkInformation>
-          <name>12b5bf2e-e376-4c40-9799-fb07961a455d</name>
+          <name>02d0ac80-2767-401c-bdc1-aac3e8abf0e4</name>
           <tableName>CAMPAIGNPARTICIPANT</tableName>
           <primaryKey>CAMPAIGNPARTICIPANTID</primaryKey>
           <isUIDTable v="true" />
           <readonly v="false" />
         </linkInformation>
+        <linkInformation>
+          <name>6c320211-601b-47bf-a562-003886666040</name>
+          <tableName>CONTACT</tableName>
+          <primaryKey>CONTACTID</primaryKey>
+          <isUIDTable v="false" />
+          <readonly v="true" />
+        </linkInformation>
+        <linkInformation>
+          <name>e1719eb5-112c-4acd-8f72-58a688d5f058</name>
+          <tableName>PERSON</tableName>
+          <primaryKey>PERSONID</primaryKey>
+          <isUIDTable v="false" />
+          <readonly v="true" />
+        </linkInformation>
+        <linkInformation>
+          <name>8be80af4-69ea-4a5d-b404-8a26c1f8d8da</name>
+          <tableName>ORGANISATION</tableName>
+          <primaryKey>ORGANISATIONID</primaryKey>
+          <isUIDTable v="false" />
+          <readonly v="true" />
+        </linkInformation>
       </linkInformation>
       <recordFieldMappings>
         <dbRecordFieldMapping>
@@ -300,25 +364,68 @@
           <recordfield>CAMPAIGNPARTICIPANT.CAMPAIGNPARTICIPANTID</recordfield>
         </dbRecordFieldMapping>
         <dbRecordFieldMapping>
-          <name>STANDARD_EMAIL_COMMUNICATION.value</name>
-          <expression>%aditoprj%/entity/CampaignParticipant_entity/recordcontainers/participantsdbrecordcontainer/recordfieldmappings/standard_email_communication.value/expression.js</expression>
-          <isFilterable v="true" />
+          <name>STANDARD_PHONE_COMMUNICATION.displayValue</name>
+          <expression>%aditoprj%/entity/CampaignParticipant_entity/recordcontainers/db/recordfieldmappings/standard_phone_communication.displayvalue/expression.js</expression>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>STANDARD_EMAIL_COMMUNICATION.displayValue</name>
+          <expression>%aditoprj%/entity/CampaignParticipant_entity/recordcontainers/db/recordfieldmappings/standard_email_communication.displayvalue/expression.js</expression>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>ADVERTISINGBAN_ICON.value</name>
+          <expression>%aditoprj%/entity/CampaignParticipant_entity/recordcontainers/db/recordfieldmappings/advertisingban_icon.value/expression.js</expression>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>CONTACT_PERSON_ID.displayValue</name>
+          <expression>%aditoprj%/entity/CampaignParticipant_entity/recordcontainers/db/recordfieldmappings/contact_person_id.displayvalue/expression.js</expression>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>CAMPAIGNSTEP_ID.displayValue</name>
+          <expression>%aditoprj%/entity/CampaignParticipant_entity/recordcontainers/participantsdbrecordcontainer/recordfieldmappings/campaignstep_id.displayvalue/expression.js</expression>
         </dbRecordFieldMapping>
         <dbRecordFieldMapping>
-          <name>STANDARD_PHONE_COMMUNICATION.value</name>
-          <expression>%aditoprj%/entity/CampaignParticipant_entity/recordcontainers/participantsdbrecordcontainer/recordfieldmappings/standard_phone_communication.value/expression.js</expression>
+          <name>campaignStepCurrentParticipantCount.value</name>
+          <expression>%aditoprj%/entity/CampaignParticipant_entity/recordcontainers/participantsdbrecordcontainer/recordfieldmappings/campaignstepcurrentparticipantcount.value/expression.js</expression>
         </dbRecordFieldMapping>
-        <consumerMapping>
-          <name>AnyContacts</name>
-          <filterConditionProcess>%aditoprj%/entity/CampaignParticipant_entity/recordcontainers/participantsdbrecordcontainer/recordfieldmappings/anycontacts/filterConditionProcess.js</filterConditionProcess>
+        <dbRecordFieldMapping>
+          <name>ORGANISATION_CONTACT_ID.value</name>
+          <expression>%aditoprj%/entity/CampaignParticipant_entity/recordcontainers/db/recordfieldmappings/organisation_contact_id.value/expression.js</expression>
           <isFilterable v="true" />
-          <filtertype>BASIC</filtertype>
-        </consumerMapping>
+        </dbRecordFieldMapping>
         <dbRecordFieldMapping>
-          <name>HASADVERTISINGBAN.value</name>
-          <expression>%aditoprj%/entity/CampaignParticipant_entity/recordcontainers/participantsdbrecordcontainer/recordfieldmappings/hasadvertisingban.value/expression.js</expression>
+          <name>PERSON_CONTACT_ID.value</name>
+          <recordfield>CONTACT.CONTACTID</recordfield>
           <isFilterable v="true" />
         </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>PERSON_CONTACT_ID.displayValue</name>
+          <expression>%aditoprj%/entity/CampaignParticipant_entity/recordcontainers/db/recordfieldmappings/person_contact_id.displayvalue/expression.js</expression>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>RESPONSIBLE_CONTACT_ID.value</name>
+          <recordfield>CAMPAIGNPARTICIPANT.RESPONSIBLE_CONTACT_ID</recordfield>
+          <isFilterable v="true" />
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>RESPONSIBLE_CONTACT_ID.displayValue</name>
+          <expression>%aditoprj%/entity/CampaignParticipant_entity/recordcontainers/db/recordfieldmappings/responsible_contact_id.displayvalue/expression.js</expression>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>CONTACT_ORGANISATION_ID.displayValue</name>
+          <recordfield>ORGANISATION.NAME</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>CONTACT_ORGANISATION_ID.value</name>
+          <recordfield>CONTACT.ORGANISATION_ID</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>CONTACT_PERSON_ID.value</name>
+          <recordfield>CONTACT.PERSON_ID</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>ORGANISATION_CONTACT_ID.displayValue</name>
+          <recordfield>ORGANISATION.NAME</recordfield>
+        </dbRecordFieldMapping>
       </recordFieldMappings>
     </dbRecordContainer>
   </recordContainers>
diff --git a/entity/CampaignParticipant_entity/entityfields/advertisingban_icon/colorProcess.js b/entity/CampaignParticipant_entity/entityfields/advertisingban_icon/colorProcess.js
index f322e15de7a..1bcf3daac52 100644
--- a/entity/CampaignParticipant_entity/entityfields/advertisingban_icon/colorProcess.js
+++ b/entity/CampaignParticipant_entity/entityfields/advertisingban_icon/colorProcess.js
@@ -1,7 +1,16 @@
-import("Util_lib");
 import("system.result");
+import("Sql_lib");
+import("system.db");
 import("system.vars");
 import("system.neon");
+import("Campaign_lib");
                 
-var hasAdvertisingBan = Utils.toBoolean(vars.get("$field.HASADVERTISINGBAN"));
-result.string(hasAdvertisingBan ? neon.PRIORITY_MEDIUM_COLOR : neon.PRIORITY_LOW_COLOR);
\ No newline at end of file
+if(vars.get("$field.ADVERTISINGBAN_ICON") > 0)
+{
+    result.string(neon.PRIORITY_MEDIUM_COLOR);
+}
+else
+{
+    result.string(neon.PRIORITY_LOW_COLOR);
+}
+
diff --git a/entity/CampaignParticipant_entity/entityfields/advertisingban_icon/displayValueProcess.js b/entity/CampaignParticipant_entity/entityfields/advertisingban_icon/displayValueProcess.js
index 7ff3faa94c8..837878d3b76 100644
--- a/entity/CampaignParticipant_entity/entityfields/advertisingban_icon/displayValueProcess.js
+++ b/entity/CampaignParticipant_entity/entityfields/advertisingban_icon/displayValueProcess.js
@@ -1,7 +1,12 @@
-import("Util_lib");
 import("system.result");
 import("system.vars");
 
 // Now show warning always, if any commrestriction exists. No matter which medium the current step has.
-var hasAdvertisingBan = Utils.toBoolean(vars.get("$field.HASADVERTISINGBAN"));
-result.string(hasAdvertisingBan ? "VAADIN:WARNING" : "VAADIN:CHECK");
\ No newline at end of file
+if (vars.get("$field.ADVERTISINGBAN_ICON") == 0)
+{
+    result.string("VAADIN:CHECK");
+}
+else
+{
+    result.string("VAADIN:WARNING");
+}
\ No newline at end of file
diff --git a/entity/CampaignParticipant_entity/entityfields/campaignsteps/children/campaignid_param/valueProcess.js b/entity/CampaignParticipant_entity/entityfields/campaignsteps/children/campaignid_param/valueProcess.js
index a22fac8bd53..eb6914514d8 100644
--- a/entity/CampaignParticipant_entity/entityfields/campaignsteps/children/campaignid_param/valueProcess.js
+++ b/entity/CampaignParticipant_entity/entityfields/campaignsteps/children/campaignid_param/valueProcess.js
@@ -1,8 +1,9 @@
 import("system.vars");
 import("system.result");
-import("system.neon");
 
-if (vars.get("$sys.viewmode") == neon.FRAME_VIEWMODE_TABLE)
-    result.string(vars.get("$param.CampaignId_param"));
-else
-    result.string(vars.get("$field.CAMPAIGN_ID"));
\ No newline at end of file
+var campaignID = vars.get("$field.CAMPAIGN_ID");
+
+if(!campaignID)
+    campaignID = vars.get("$param.CampaignId_param");
+
+result.string(campaignID);
\ No newline at end of file
diff --git a/entity/CampaignParticipant_entity/entityfields/contact_id/displayValueProcess.js b/entity/CampaignParticipant_entity/entityfields/contact_id/displayValueProcess.js
index 1e3714bbbc7..85822946ab4 100644
--- a/entity/CampaignParticipant_entity/entityfields/contact_id/displayValueProcess.js
+++ b/entity/CampaignParticipant_entity/entityfields/contact_id/displayValueProcess.js
@@ -3,10 +3,4 @@ import("system.vars");
 import("Contact_lib");
 import("system.neon");
 
-let contactId = vars.getString("$field.CONTACT_ID");
-let displayValue = "";
-    
-if(contactId != "")
-    displayValue = ContactUtils.getFullTitleByContactId(contactId);
-
-result.string(displayValue);
+result.string(ContactUtils.getFullTitleByContactId(vars.getString("$field.CONTACT_ID")));
\ No newline at end of file
diff --git a/entity/CampaignParticipant_entity/entityfields/contact_id/linkedContextProcess.js b/entity/CampaignParticipant_entity/entityfields/contact_id/linkedContextProcess.js
deleted file mode 100644
index 2e504d63e3b..00000000000
--- a/entity/CampaignParticipant_entity/entityfields/contact_id/linkedContextProcess.js
+++ /dev/null
@@ -1,5 +0,0 @@
-import("system.vars");
-import("system.result");
-import("Contact_lib");
-
-result.string(ContactUtils.getContextByContactId(vars.getString("$field.CONTACT_ID")));
\ No newline at end of file
diff --git a/entity/CampaignParticipant_entity/entityfields/contact_id/valueProcess.js b/entity/CampaignParticipant_entity/entityfields/contact_id/valueProcess.js
deleted file mode 100644
index 7a0567f6850..00000000000
--- a/entity/CampaignParticipant_entity/entityfields/contact_id/valueProcess.js
+++ /dev/null
@@ -1,5 +0,0 @@
-import("system.result");
-import("system.vars");
-
-if(vars.exists("$param.ContactId_param") && vars.get("$param.ContactId_param"))
-    result.string(vars.get("$param.ContactId_param"));
\ No newline at end of file
diff --git a/entity/CampaignParticipant_entity/entityfields/filterviewactiongroup/children/setsteptoparticipantselection/stateProcess.js b/entity/CampaignParticipant_entity/entityfields/filterviewactiongroup/children/setsteptoparticipantselection/stateProcess.js
deleted file mode 100644
index d55386c662b..00000000000
--- a/entity/CampaignParticipant_entity/entityfields/filterviewactiongroup/children/setsteptoparticipantselection/stateProcess.js
+++ /dev/null
@@ -1,16 +0,0 @@
-import("Campaign_lib");
-import("system.vars");
-import("system.neon");
-import("system.result");
-
-var campaignId = vars.get("$field.CAMPAIGN_ID");
-var participantCount = CampaignUtils.getParticipantCount(campaignId);
-
-if(participantCount > 0)
-{
-    result.string(neon.COMPONENTSTATE_EDITABLE);
-}
-else
-{
-    result.string(neon.COMPONENTSTATE_DISABLED);
-}
\ No newline at end of file
diff --git a/entity/CampaignParticipant_entity/entityfields/filterviewactiongroup/children/startmarketingworkflows/onActionProcess.js b/entity/CampaignParticipant_entity/entityfields/filterviewactiongroup/children/startmarketingworkflows/onActionProcess.js
deleted file mode 100644
index 40e60ff20d2..00000000000
--- a/entity/CampaignParticipant_entity/entityfields/filterviewactiongroup/children/startmarketingworkflows/onActionProcess.js
+++ /dev/null
@@ -1,36 +0,0 @@
-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/CampaignParticipant_entity/entityfields/hasadvertisingban/dropDownProcess.js b/entity/CampaignParticipant_entity/entityfields/hasadvertisingban/dropDownProcess.js
deleted file mode 100644
index 3373b8a886d..00000000000
--- a/entity/CampaignParticipant_entity/entityfields/hasadvertisingban/dropDownProcess.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import("system.translate");
-import("system.result");
-
-result.object([
-    ["1", translate.text("Yes")],
-    ["0", translate.text("No")]
-]);
\ No newline at end of file
diff --git a/entity/CampaignParticipant_entity/entityfields/responsible_contact_id/displayValueProcess.js b/entity/CampaignParticipant_entity/entityfields/responsible_contact_id/displayValueProcess.js
new file mode 100644
index 00000000000..92bb44a696f
--- /dev/null
+++ b/entity/CampaignParticipant_entity/entityfields/responsible_contact_id/displayValueProcess.js
@@ -0,0 +1,5 @@
+import("system.vars");
+import("system.result");
+import("Contact_lib");
+
+result.string(ContactUtils.getTitleByContactId(vars.get("$field.RESPONSIBLE_CONTACT_ID")));
\ No newline at end of file
diff --git a/entity/CampaignParticipant_entity/entityfields/responsible_contact_id/valueProcess.js b/entity/CampaignParticipant_entity/entityfields/responsible_contact_id/valueProcess.js
new file mode 100644
index 00000000000..a952fcd46b8
--- /dev/null
+++ b/entity/CampaignParticipant_entity/entityfields/responsible_contact_id/valueProcess.js
@@ -0,0 +1,6 @@
+import("system.neon");
+import("system.vars");
+import("system.result");
+    
+if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && vars.get("$this.value") == null)
+    result.string(vars.get("$global.user.contactId"));
\ No newline at end of file
diff --git a/entity/CampaignParticipant_entity/recordcontainers/participantsdbrecordcontainer/conditionProcess.js b/entity/CampaignParticipant_entity/recordcontainers/db/conditionProcess.js
similarity index 100%
rename from entity/CampaignParticipant_entity/recordcontainers/participantsdbrecordcontainer/conditionProcess.js
rename to entity/CampaignParticipant_entity/recordcontainers/db/conditionProcess.js
diff --git a/entity/CampaignParticipant_entity/recordcontainers/db/fromClauseProcess.js b/entity/CampaignParticipant_entity/recordcontainers/db/fromClauseProcess.js
new file mode 100644
index 00000000000..8603fcea047
--- /dev/null
+++ b/entity/CampaignParticipant_entity/recordcontainers/db/fromClauseProcess.js
@@ -0,0 +1,5 @@
+import("system.result");
+result.string("CAMPAIGNPARTICIPANT "
+            +" join CONTACT on CONTACTID = CONTACT_ID "
+            +" left join PERSON ON PERSONID = PERSON_ID "
+            +" join ORGANISATION on ORGANISATION_ID = ORGANISATIONiD");
\ No newline at end of file
diff --git a/entity/CampaignParticipant_entity/recordcontainers/participantsdbrecordcontainer/onDBInsert.js b/entity/CampaignParticipant_entity/recordcontainers/db/onDBInsert.js
similarity index 100%
rename from entity/CampaignParticipant_entity/recordcontainers/participantsdbrecordcontainer/onDBInsert.js
rename to entity/CampaignParticipant_entity/recordcontainers/db/onDBInsert.js
diff --git a/entity/CampaignParticipant_entity/recordcontainers/db/recordfieldmappings/advertisingban_icon.value/expression.js b/entity/CampaignParticipant_entity/recordcontainers/db/recordfieldmappings/advertisingban_icon.value/expression.js
new file mode 100644
index 00000000000..3343ac44d8f
--- /dev/null
+++ b/entity/CampaignParticipant_entity/recordcontainers/db/recordfieldmappings/advertisingban_icon.value/expression.js
@@ -0,0 +1,7 @@
+import("system.vars");
+import("Contact_lib");
+import("Sql_lib");
+import("system.result");
+
+// Now show warning always, if any commrestriction exists. No matter which medium the current step has.
+result.string("(" + ContactUtils.getCommRestrictionCount(undefined, vars.get("$sys.date")) + ")");
\ No newline at end of file
diff --git a/entity/CampaignParticipant_entity/recordcontainers/db/recordfieldmappings/contact_person_id.displayvalue/expression.js b/entity/CampaignParticipant_entity/recordcontainers/db/recordfieldmappings/contact_person_id.displayvalue/expression.js
new file mode 100644
index 00000000000..d28cdbab4f0
--- /dev/null
+++ b/entity/CampaignParticipant_entity/recordcontainers/db/recordfieldmappings/contact_person_id.displayvalue/expression.js
@@ -0,0 +1,3 @@
+import("system.result");
+import("Person_lib");
+result.string(PersUtils.getResolvingDisplaySubSql("CONTACT_ID"));
\ No newline at end of file
diff --git a/entity/CampaignParticipant_entity/recordcontainers/db/recordfieldmappings/organisation_contact_id.value/expression.js b/entity/CampaignParticipant_entity/recordcontainers/db/recordfieldmappings/organisation_contact_id.value/expression.js
new file mode 100644
index 00000000000..93edad8b41d
--- /dev/null
+++ b/entity/CampaignParticipant_entity/recordcontainers/db/recordfieldmappings/organisation_contact_id.value/expression.js
@@ -0,0 +1,14 @@
+import("system.SQLTYPES");
+import("Sql_lib");
+import("system.result");
+
+result.string(SqlBuilder.caseWhen(newWhere(newSelect("COUNT(*)")
+                                    .from("CONTACT")
+                                    .where("CONTACT.CONTACTID = CAMPAIGNPARTICIPANT.CONTACT_ID")
+                                    .and("CONTACT.PERSON_ID is null"), "0", SqlBuilder.GREATER(), SQLTYPES.INTEGER))
+                        .then("CAMPAIGNPARTICIPANT.CONTACT_ID")
+                        .elseValue(newSelect("c1.CONTACTID")
+                                        .from("CONTACT", "c1")
+                                        .join("CONTACT", "c1.ORGANISATION_ID = c2.ORGANISATION_ID", "c2")
+                                        .where("c2.CONTACTID = CAMPAIGNPARTICIPANT.CONTACT_ID")
+                                        .and("c1.PERSON_ID is null")).toString())
\ No newline at end of file
diff --git a/entity/CampaignParticipant_entity/recordcontainers/db/recordfieldmappings/person_contact_id.displayvalue/expression.js b/entity/CampaignParticipant_entity/recordcontainers/db/recordfieldmappings/person_contact_id.displayvalue/expression.js
new file mode 100644
index 00000000000..8e485513f89
--- /dev/null
+++ b/entity/CampaignParticipant_entity/recordcontainers/db/recordfieldmappings/person_contact_id.displayvalue/expression.js
@@ -0,0 +1,3 @@
+import("system.result");
+import("Person_lib");
+result.string(PersUtils.getResolvingDisplaySubSql("CAMPAIGNPARTICIPANT.CONTACT_ID"));
\ No newline at end of file
diff --git a/entity/CampaignParticipant_entity/recordcontainers/db/recordfieldmappings/responsible_contact_id.displayvalue/expression.js b/entity/CampaignParticipant_entity/recordcontainers/db/recordfieldmappings/responsible_contact_id.displayvalue/expression.js
new file mode 100644
index 00000000000..29d2f306f74
--- /dev/null
+++ b/entity/CampaignParticipant_entity/recordcontainers/db/recordfieldmappings/responsible_contact_id.displayvalue/expression.js
@@ -0,0 +1,3 @@
+import("system.result");
+import("Person_lib");
+result.string(PersUtils.getResolvingDisplaySubSql("CAMPAIGNPARTICIPANT.RESPONSIBLE_CONTACT_ID"));
\ No newline at end of file
diff --git a/entity/CampaignParticipant_entity/recordcontainers/participantsdbrecordcontainer/recordfieldmappings/standard_email_communication.value/expression.js b/entity/CampaignParticipant_entity/recordcontainers/db/recordfieldmappings/standard_email_communication.displayvalue/expression.js
similarity index 100%
rename from entity/CampaignParticipant_entity/recordcontainers/participantsdbrecordcontainer/recordfieldmappings/standard_email_communication.value/expression.js
rename to entity/CampaignParticipant_entity/recordcontainers/db/recordfieldmappings/standard_email_communication.displayvalue/expression.js
diff --git a/entity/CampaignParticipant_entity/recordcontainers/participantsdbrecordcontainer/recordfieldmappings/standard_phone_communication.value/expression.js b/entity/CampaignParticipant_entity/recordcontainers/db/recordfieldmappings/standard_phone_communication.displayvalue/expression.js
similarity index 100%
rename from entity/CampaignParticipant_entity/recordcontainers/participantsdbrecordcontainer/recordfieldmappings/standard_phone_communication.value/expression.js
rename to entity/CampaignParticipant_entity/recordcontainers/db/recordfieldmappings/standard_phone_communication.displayvalue/expression.js
diff --git a/entity/CampaignParticipant_entity/recordcontainers/participantsdbrecordcontainer/recordfieldmappings/anycontacts/filterConditionProcess.js b/entity/CampaignParticipant_entity/recordcontainers/participantsdbrecordcontainer/recordfieldmappings/anycontacts/filterConditionProcess.js
deleted file mode 100644
index c37a5f4a9b9..00000000000
--- a/entity/CampaignParticipant_entity/recordcontainers/participantsdbrecordcontainer/recordfieldmappings/anycontacts/filterConditionProcess.js
+++ /dev/null
@@ -1,10 +0,0 @@
-import("system.result");
-import("system.vars");
-import("Contact_lib");
-import("Sql_lib");
-
-var condition = newWhere(null, ContactUtils.getFullContactSqlBuilder("CONTACTID")
-    .where("CONTACTID = CAMPAIGNPARTICIPANT.CONTACT_ID")
-    .and(vars.get("$local.condition")), SqlBuilder.EXISTS());
-    
-result.string(condition.toString());
\ No newline at end of file
diff --git a/entity/CampaignParticipant_entity/recordcontainers/participantsdbrecordcontainer/recordfieldmappings/campaignstep_id.displayvalue/expression.js b/entity/CampaignParticipant_entity/recordcontainers/participantsdbrecordcontainer/recordfieldmappings/campaignstep_id.displayvalue/expression.js
new file mode 100644
index 00000000000..c2a7f5503d9
--- /dev/null
+++ b/entity/CampaignParticipant_entity/recordcontainers/participantsdbrecordcontainer/recordfieldmappings/campaignstep_id.displayvalue/expression.js
@@ -0,0 +1,3 @@
+import("system.result");
+import("Sql_lib");
+result.string(newSelect("CAMPAIGNSTEP.NAME").from("CAMPAIGNSTEP").where("CAMPAIGNSTEP.CAMPAIGNSTEPID = CAMPAIGNPARTICIPANT.CAMPAIGNSTEP_ID").toString());
\ No newline at end of file
diff --git a/entity/CampaignParticipant_entity/recordcontainers/participantsdbrecordcontainer/recordfieldmappings/campaignstepcurrentparticipantcount.value/expression.js b/entity/CampaignParticipant_entity/recordcontainers/participantsdbrecordcontainer/recordfieldmappings/campaignstepcurrentparticipantcount.value/expression.js
new file mode 100644
index 00000000000..7d896cba463
--- /dev/null
+++ b/entity/CampaignParticipant_entity/recordcontainers/participantsdbrecordcontainer/recordfieldmappings/campaignstepcurrentparticipantcount.value/expression.js
@@ -0,0 +1,3 @@
+import("system.result");
+import("Sql_lib");
+result.string(newSelect("COUNT(*)").from("CAMPAIGNPARTICIPANT", "p1").where("p1.CAMPAIGNSTEP_ID = CAMPAIGNPARTICIPANT.CAMPAIGNSTEP_ID").toString());
\ No newline at end of file
diff --git a/entity/CampaignParticipant_entity/recordcontainers/participantsdbrecordcontainer/recordfieldmappings/hasadvertisingban.value/expression.js b/entity/CampaignParticipant_entity/recordcontainers/participantsdbrecordcontainer/recordfieldmappings/hasadvertisingban.value/expression.js
deleted file mode 100644
index b1292f54399..00000000000
--- a/entity/CampaignParticipant_entity/recordcontainers/participantsdbrecordcontainer/recordfieldmappings/hasadvertisingban.value/expression.js
+++ /dev/null
@@ -1,11 +0,0 @@
-import("system.vars");
-import("Contact_lib");
-import("Sql_lib");
-import("system.result");
-
-var commRestrictionContactSubSql = newSelect("CONTACT.CONTACTID")
-    .from("CONTACT")
-    .where("CONTACT.CONTACTID = CAMPAIGNPARTICIPANT.CONTACT_ID")
-    .and(ContactUtils.getCommRestrictionCondition());
-
-result.string(SqlBuilder.caseWhen(null, commRestrictionContactSubSql, SqlBuilder.EXISTS()).thenString("1").elseString("0").toString());
\ No newline at end of file
diff --git a/entity/CampaignPlanning_entity/CampaignPlanning_entity.aod b/entity/CampaignPlanning_entity/CampaignPlanning_entity.aod
index 2de87bf6e8c..f274ff68901 100644
--- a/entity/CampaignPlanning_entity/CampaignPlanning_entity.aod
+++ b/entity/CampaignPlanning_entity/CampaignPlanning_entity.aod
@@ -9,6 +9,7 @@
     <element>CampaignStep_entity</element>
   </siblings>
   <iconId>NEON:GROUP_APPOINTMENT</iconId>
+  <usePermissions v="false" />
   <recordContainer>jditoRecordContainer</recordContainer>
   <entityFields>
     <entityProvider>
diff --git a/entity/CampaignStep_entity/CampaignStep_entity.aod b/entity/CampaignStep_entity/CampaignStep_entity.aod
index ef3741b8dfb..ae04d014704 100644
--- a/entity/CampaignStep_entity/CampaignStep_entity.aod
+++ b/entity/CampaignStep_entity/CampaignStep_entity.aod
@@ -14,6 +14,7 @@
   <contentDescriptionProcess>%aditoprj%/entity/CampaignStep_entity/contentDescriptionProcess.js</contentDescriptionProcess>
   <onValidation>%aditoprj%/entity/CampaignStep_entity/onValidation.js</onValidation>
   <imageProcess>%aditoprj%/entity/CampaignStep_entity/imageProcess.js</imageProcess>
+  <usePermissions v="false" />
   <titlePlural>Steps</titlePlural>
   <recordContainer>db</recordContainer>
   <entityFields>
@@ -59,6 +60,7 @@
       <title>Responsible</title>
       <consumer>Employees</consumer>
       <groupable v="true" />
+      <linkedContext>Person</linkedContext>
       <mandatory v="true" />
       <valueProcess>%aditoprj%/entity/CampaignStep_entity/entityfields/employee_contact_id/valueProcess.js</valueProcess>
       <displayValueProcess>%aditoprj%/entity/CampaignStep_entity/entityfields/employee_contact_id/displayValueProcess.js</displayValueProcess>
@@ -96,7 +98,6 @@
       <groupable v="true" />
       <mandatory v="true" />
       <valueProcess>%aditoprj%/entity/CampaignStep_entity/entityfields/status/valueProcess.js</valueProcess>
-      <displayValueProcess>%aditoprj%/entity/CampaignStep_entity/entityfields/status/displayValueProcess.js</displayValueProcess>
     </entityField>
     <entityField>
       <name>SORTING</name>
@@ -245,6 +246,12 @@
         <entityName>Employee_entity</entityName>
         <fieldName>Employees</fieldName>
       </dependency>
+      <children>
+        <entityParameter>
+          <name>OnlyActives_param</name>
+          <valueProcess>%aditoprj%/entity/CampaignStep_entity/entityfields/employees/children/onlyactives_param/valueProcess.js</valueProcess>
+        </entityParameter>
+      </children>
     </entityConsumer>
     <entityConsumer>
       <name>CampaignStepCosts</name>
@@ -376,27 +383,11 @@
       <expose v="true" />
       <description>PARAMETER</description>
     </entityParameter>
-    <entityConsumer>
-      <name>CampaignStepMedium</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>KeywordEntry_entity</entityName>
-        <fieldName>SpecificContainerKeywords</fieldName>
-      </dependency>
-      <children>
-        <entityParameter>
-          <name>ContainerName_param</name>
-          <valueProcess>%aditoprj%/entity/CampaignStep_entity/entityfields/campaignstepmedium/children/containername_param/valueProcess.js</valueProcess>
-          <expose v="false" />
-        </entityParameter>
-      </children>
-    </entityConsumer>
     <entityField>
       <name>STEPMEDIUM</name>
       <title>Medium</title>
-      <consumer>CampaignStepMedium</consumer>
+      <consumer>KeywordStepMedium</consumer>
       <groupable v="true" />
-      <displayValueProcess>%aditoprj%/entity/CampaignStep_entity/entityfields/stepmedium/displayValueProcess.js</displayValueProcess>
     </entityField>
     <entityActionField>
       <name>newBulkMail</name>
@@ -423,6 +414,23 @@
       <name>#PROVIDER_AGGREGATES</name>
       <useAggregates v="true" />
     </entityProvider>
+    <entityField>
+      <name>CurrentParticipantsPerStep</name>
+    </entityField>
+    <entityConsumer>
+      <name>KeywordStepMedium</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>SpecificContainerKeywords</fieldName>
+      </dependency>
+      <children>
+        <entityParameter>
+          <name>ContainerName_param</name>
+          <valueProcess>%aditoprj%/entity/CampaignStep_entity/entityfields/keywordstepmedium/children/containername_param/valueProcess.js</valueProcess>
+        </entityParameter>
+      </children>
+    </entityConsumer>
   </entityFields>
   <recordContainers>
     <dbRecordContainer>
@@ -521,6 +529,18 @@
           <name>STEPMEDIUM.value</name>
           <recordfield>CAMPAIGNSTEP.STEPMEDIUM</recordfield>
         </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>CurrentParticipantsPerStep.value</name>
+          <expression>%aditoprj%/entity/CampaignStep_entity/recordcontainers/db/recordfieldmappings/currentparticipantsperstep.value/expression.js</expression>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>STEPMEDIUM.displayValue</name>
+          <expression>%aditoprj%/entity/CampaignStep_entity/recordcontainers/db/recordfieldmappings/stepmedium.displayvalue/expression.js</expression>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>EMPLOYEE_CONTACT_ID.displayValue</name>
+          <expression>%aditoprj%/entity/CampaignStep_entity/recordcontainers/db/recordfieldmappings/employee_contact_id.displayvalue/expression.js</expression>
+        </dbRecordFieldMapping>
       </recordFieldMappings>
     </dbRecordContainer>
   </recordContainers>
diff --git a/entity/CampaignStep_entity/entityfields/currentmaxparticipantsinfo/valueProcess.js b/entity/CampaignStep_entity/entityfields/currentmaxparticipantsinfo/valueProcess.js
index 86c117c70dd..e9ba9c24747 100644
--- a/entity/CampaignStep_entity/entityfields/currentmaxparticipantsinfo/valueProcess.js
+++ b/entity/CampaignStep_entity/entityfields/currentmaxparticipantsinfo/valueProcess.js
@@ -2,6 +2,14 @@ import("system.result");
 import("system.vars");
 import("Campaign_lib");
 
-let currentParticipantsCount = CampaignUtils.getParticipantCountForStep(vars.get("$field.CAMPAIGNSTEPID"), vars.get("$field.CAMPAIGN_ID"));
-let maxParticipantsStepCount = vars.get("$field.MAXPARTICIPANTS");
-result.string(currentParticipantsCount + "/" + maxParticipantsStepCount);
\ No newline at end of file
+var currentParticipantsCount = vars.get("$field.CurrentParticipantsPerStep");
+var maxParticipantsStepCount = vars.get("$field.MAXPARTICIPANTS");
+var res = [];
+
+if(currentParticipantsCount)
+    res.push(currentParticipantsCount);
+
+if(maxParticipantsStepCount)
+    res.push(maxParticipantsStepCount);
+
+result.string(res.join("/"));
\ No newline at end of file
diff --git a/entity/CampaignStep_entity/entityfields/employee_contact_id/displayValueProcess.js b/entity/CampaignStep_entity/entityfields/employee_contact_id/displayValueProcess.js
index 351d4b3f2c2..037d5e264ba 100644
--- a/entity/CampaignStep_entity/entityfields/employee_contact_id/displayValueProcess.js
+++ b/entity/CampaignStep_entity/entityfields/employee_contact_id/displayValueProcess.js
@@ -1,5 +1,5 @@
-import("system.vars");
-import("system.result");
-import("Contact_lib");
-
+import("system.vars");
+import("system.result");
+import("Contact_lib");
+
 result.string(ContactUtils.getTitleByContactId(vars.get("$field.EMPLOYEE_CONTACT_ID")));
\ No newline at end of file
diff --git a/entity/CampaignStep_entity/entityfields/employee_contact_id/valueProcess.js b/entity/CampaignStep_entity/entityfields/employee_contact_id/valueProcess.js
index 0e00e387dfc..85f342bc9d6 100644
--- a/entity/CampaignStep_entity/entityfields/employee_contact_id/valueProcess.js
+++ b/entity/CampaignStep_entity/entityfields/employee_contact_id/valueProcess.js
@@ -3,5 +3,5 @@ import("system.neon");
 import("system.vars");
 import("Employee_lib");
 
-if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW)
-    result.string(EmployeeUtils.getCurrentContactId());
\ No newline at end of file
+if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && vars.get("$this.value") == null)
+    result.string(EmployeeUtils.getCurrentContactId());
diff --git a/entity/CampaignStep_entity/entityfields/employees/children/onlyactives_param/valueProcess.js b/entity/CampaignStep_entity/entityfields/employees/children/onlyactives_param/valueProcess.js
new file mode 100644
index 00000000000..cda204045d2
--- /dev/null
+++ b/entity/CampaignStep_entity/entityfields/employees/children/onlyactives_param/valueProcess.js
@@ -0,0 +1,2 @@
+import("system.result");
+result.string(true);
\ No newline at end of file
diff --git a/entity/CampaignStep_entity/entityfields/keywordstates/children/containername_param/valueProcess.js b/entity/CampaignStep_entity/entityfields/keywordstates/children/containername_param/valueProcess.js
index 3567518a6da..09fcdcf23e8 100644
--- a/entity/CampaignStep_entity/entityfields/keywordstates/children/containername_param/valueProcess.js
+++ b/entity/CampaignStep_entity/entityfields/keywordstates/children/containername_param/valueProcess.js
@@ -1,5 +1,4 @@
 import("system.result");
-import("Keyword_lib");
 import("KeywordRegistry_basic");
 
 result.string($KeywordRegistry.campaignStepState());
\ No newline at end of file
diff --git a/entity/CampaignStep_entity/entityfields/campaignstepmedium/children/containername_param/valueProcess.js b/entity/CampaignStep_entity/entityfields/keywordstepmedium/children/containername_param/valueProcess.js
similarity index 81%
rename from entity/CampaignStep_entity/entityfields/campaignstepmedium/children/containername_param/valueProcess.js
rename to entity/CampaignStep_entity/entityfields/keywordstepmedium/children/containername_param/valueProcess.js
index a944db32595..87e20a83401 100644
--- a/entity/CampaignStep_entity/entityfields/campaignstepmedium/children/containername_param/valueProcess.js
+++ b/entity/CampaignStep_entity/entityfields/keywordstepmedium/children/containername_param/valueProcess.js
@@ -1,5 +1,3 @@
-import("system.result");
-import("Keyword_lib");
-import("KeywordRegistry_basic");
-
+import("KeywordRegistry_basic");
+import("system.result");
 result.string($KeywordRegistry.communicationMediumCampaign());
\ No newline at end of file
diff --git a/entity/CampaignStep_entity/entityfields/maxparticipants/onValidation.js b/entity/CampaignStep_entity/entityfields/maxparticipants/onValidation.js
index fd6b6aef2f6..de688c4d15d 100644
--- a/entity/CampaignStep_entity/entityfields/maxparticipants/onValidation.js
+++ b/entity/CampaignStep_entity/entityfields/maxparticipants/onValidation.js
@@ -1,3 +1,4 @@
+import("system.translate");
 import("Campaign_lib");
 import("system.result");
 import("Entity_lib");
@@ -7,4 +8,6 @@ var currentParticipantsCount = parseInt(vars.get("$field.CurrentMaxParticipantsI
 var newMaxParticipantsCount = parseInt(vars.get("local.value"));
 
 if(newMaxParticipantsCount < currentParticipantsCount)
-    result.string(CampaignUtils.getMaxParticipantsValidationMessage());
\ No newline at end of file
+    result.string(CampaignUtils.getMaxParticipantsValidationMessage());
+else if(newMaxParticipantsCount <= 0)
+    result.string(translate.text("The max participants count can not be equal or less then 0"));
\ No newline at end of file
diff --git a/entity/CampaignStep_entity/entityfields/status/displayValueProcess.js b/entity/CampaignStep_entity/entityfields/status/displayValueProcess.js
deleted file mode 100644
index d0247bf23ab..00000000000
--- a/entity/CampaignStep_entity/entityfields/status/displayValueProcess.js
+++ /dev/null
@@ -1,6 +0,0 @@
-import("system.result");
-import("system.vars");
-import("Keyword_lib");
-import("KeywordRegistry_basic");
-
-result.string(KeywordUtils.getViewValue($KeywordRegistry.campaignStepState(), vars.get("$field.STATUS")));
\ No newline at end of file
diff --git a/entity/CampaignStep_entity/entityfields/status/valueProcess.js b/entity/CampaignStep_entity/entityfields/status/valueProcess.js
index dc5efe1d6fe..ed6f79285d3 100644
--- a/entity/CampaignStep_entity/entityfields/status/valueProcess.js
+++ b/entity/CampaignStep_entity/entityfields/status/valueProcess.js
@@ -1,7 +1,7 @@
+import("KeywordRegistry_basic");
 import("system.vars");
 import("system.result");
 import("system.neon");
-import("KeywordRegistry_basic");
 
 if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && vars.get("$this.value") == null)
-    result.string($KeywordRegistry.campaignStepState$open());
\ No newline at end of file
+    result.string($KeywordRegistry.campaignStepState$open);
\ No newline at end of file
diff --git a/entity/CampaignStep_entity/entityfields/stepmedium/displayValueProcess.js b/entity/CampaignStep_entity/entityfields/stepmedium/displayValueProcess.js
deleted file mode 100644
index 429287a14cd..00000000000
--- a/entity/CampaignStep_entity/entityfields/stepmedium/displayValueProcess.js
+++ /dev/null
@@ -1,6 +0,0 @@
-import("system.result");
-import("system.vars");
-import("KeywordRegistry_basic");
-import("Keyword_lib");
-
-result.string(KeywordUtils.getViewValue($KeywordRegistry.communicationMediumCampaign(), vars.get("$field.STEPMEDIUM")));
diff --git a/entity/CampaignStep_entity/recordcontainers/db/recordfieldmappings/currentparticipantsperstep.value/expression.js b/entity/CampaignStep_entity/recordcontainers/db/recordfieldmappings/currentparticipantsperstep.value/expression.js
new file mode 100644
index 00000000000..adbfaa81f0f
--- /dev/null
+++ b/entity/CampaignStep_entity/recordcontainers/db/recordfieldmappings/currentparticipantsperstep.value/expression.js
@@ -0,0 +1,3 @@
+import("system.result");
+import("Sql_lib");
+result.string(newSelect("COUNT(*)").from("CAMPAIGNPARTICIPANT").where("CAMPAIGNPARTICIPANT.CAMPAIGNSTEP_ID = CAMPAIGNSTEP.CAMPAIGNSTEPID").toString());
\ No newline at end of file
diff --git a/entity/CampaignStep_entity/recordcontainers/db/recordfieldmappings/employee_contact_id.displayvalue/expression.js b/entity/CampaignStep_entity/recordcontainers/db/recordfieldmappings/employee_contact_id.displayvalue/expression.js
new file mode 100644
index 00000000000..54ff36ce1d1
--- /dev/null
+++ b/entity/CampaignStep_entity/recordcontainers/db/recordfieldmappings/employee_contact_id.displayvalue/expression.js
@@ -0,0 +1,3 @@
+import("system.result");
+import("Person_lib");
+result.string(PersUtils.getResolvingDisplaySubSql("CAMPAIGNSTEP.EMPLOYEE_CONTACT_ID"));
\ No newline at end of file
diff --git a/entity/CampaignStep_entity/recordcontainers/db/recordfieldmappings/status.displayvalue/expression.js b/entity/CampaignStep_entity/recordcontainers/db/recordfieldmappings/status.displayvalue/expression.js
index f0e8a44adee..dd2e2affd49 100644
--- a/entity/CampaignStep_entity/recordcontainers/db/recordfieldmappings/status.displayvalue/expression.js
+++ b/entity/CampaignStep_entity/recordcontainers/db/recordfieldmappings/status.displayvalue/expression.js
@@ -1,6 +1,5 @@
 import("system.result");
 import("Keyword_lib");
-import("KeywordRegistry_basic");
 
-var sql = KeywordUtils.getResolvedTitleSqlPart($KeywordRegistry.campaignStepState(), "CAMPAIGNSTEP.STATUS");
+var sql = KeywordUtils.getResolvedTitleSqlPart("CampaignManagementStepStates", "CAMPAIGNSTEP.STATUS");
 result.string(sql);
\ No newline at end of file
diff --git a/entity/CampaignStep_entity/recordcontainers/db/recordfieldmappings/stepmedium.displayvalue/expression.js b/entity/CampaignStep_entity/recordcontainers/db/recordfieldmappings/stepmedium.displayvalue/expression.js
new file mode 100644
index 00000000000..260b5474d57
--- /dev/null
+++ b/entity/CampaignStep_entity/recordcontainers/db/recordfieldmappings/stepmedium.displayvalue/expression.js
@@ -0,0 +1,5 @@
+import("system.result");
+import("Keyword_lib");
+
+var sql = KeywordUtils.getResolvedTitleSqlPart("CommunicationMediumCampaign", "CAMPAIGNSTEP.STEPMEDIUM");
+result.string(sql);
\ No newline at end of file
diff --git a/entity/Campaign_entity/Campaign_entity.aod b/entity/Campaign_entity/Campaign_entity.aod
index 571096dc232..c2114b2939d 100644
--- a/entity/Campaign_entity/Campaign_entity.aod
+++ b/entity/Campaign_entity/Campaign_entity.aod
@@ -10,6 +10,8 @@
     <element>CampaignCost_entity</element>
     <element>CampaignCostChart_entity</element>
     <element>CampaignStep_entity</element>
+    <element>CampaignAddParticipants_entity</element>
+    <element>CampaignParticipant_entity</element>
   </siblings>
   <grantDeleteProcess>%aditoprj%/entity/Campaign_entity/grantDeleteProcess.js</grantDeleteProcess>
   <contentTitleProcess>%aditoprj%/entity/Campaign_entity/contentTitleProcess.js</contentTitleProcess>
@@ -46,7 +48,6 @@
       <name>NAME</name>
       <title>Name</title>
       <mandatory v="true" />
-      <valueProcess>%aditoprj%/entity/Campaign_entity/entityfields/name/valueProcess.js</valueProcess>
     </entityField>
     <entityField>
       <name>DATE_START</name>
@@ -72,6 +73,7 @@
       <title>Person in charge</title>
       <consumer>Employee</consumer>
       <groupable v="true" />
+      <linkedContext>Person</linkedContext>
       <mandatory v="true" />
       <valueProcess>%aditoprj%/entity/Campaign_entity/entityfields/employee_contact_id/valueProcess.js</valueProcess>
       <displayValueProcess>%aditoprj%/entity/Campaign_entity/entityfields/employee_contact_id/displayValueProcess.js</displayValueProcess>
@@ -80,7 +82,6 @@
       <name>DESCRIPTION</name>
       <title>Description</title>
       <contentType>LONG_TEXT</contentType>
-      <valueProcess>%aditoprj%/entity/Campaign_entity/entityfields/description/valueProcess.js</valueProcess>
     </entityField>
     <entityField>
       <name>USER_NEW</name>
@@ -128,7 +129,6 @@
       <groupable v="true" />
       <mandatory v="true" />
       <valueProcess>%aditoprj%/entity/Campaign_entity/entityfields/status/valueProcess.js</valueProcess>
-      <displayValueProcess>%aditoprj%/entity/Campaign_entity/entityfields/status/displayValueProcess.js</displayValueProcess>
     </entityField>
     <entityConsumer>
       <name>KeywordStates</name>
@@ -185,10 +185,6 @@
         <fieldName>CampaignParticipantsProvider</fieldName>
       </dependency>
       <children>
-        <entityParameter>
-          <name>ContactId_param</name>
-          <expose v="true" />
-        </entityParameter>
         <entityParameter>
           <name>CampaignStepId_param</name>
           <expose v="true" />
@@ -207,6 +203,12 @@
         <entityName>Employee_entity</entityName>
         <fieldName>Employees</fieldName>
       </dependency>
+      <children>
+        <entityParameter>
+          <name>OnlyActives_param</name>
+          <valueProcess>%aditoprj%/entity/Campaign_entity/entityfields/employee/children/onlyactives_param/valueProcess.js</valueProcess>
+        </entityParameter>
+      </children>
     </entityConsumer>
     <entityConsumer>
       <name>CampaignCosts</name>
@@ -272,25 +274,6 @@
         </entityParameter>
       </children>
     </entityConsumer>
-    <entityConsumer>
-      <name>Tasks</name>
-      <title>Tasks</title>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Task_entity</entityName>
-        <fieldName>Tasks</fieldName>
-      </dependency>
-      <children>
-        <entityParameter>
-          <name>ObjectId_param</name>
-          <valueProcess>%aditoprj%/entity/Campaign_entity/entityfields/tasks/children/objectid_param/valueProcess.js</valueProcess>
-        </entityParameter>
-        <entityParameter>
-          <name>RowId_param</name>
-          <valueProcess>%aditoprj%/entity/Campaign_entity/entityfields/tasks/children/rowid_param/valueProcess.js</valueProcess>
-        </entityParameter>
-      </children>
-    </entityConsumer>
     <entityActionField>
       <name>newActivity</name>
       <title>New activity</title>
@@ -440,26 +423,6 @@
       <iconId>VAADIN:CURLY_BRACKETS</iconId>
       <stateProcess>%aditoprj%/entity/Campaign_entity/entityfields/openadminview/stateProcess.js</stateProcess>
     </entityActionField>
-    <entityParameter>
-      <name>originalCampaignIdCopy_param</name>
-      <expose v="true" />
-    </entityParameter>
-    <entityParameter>
-      <name>description_param</name>
-      <expose v="true" />
-    </entityParameter>
-    <entityParameter>
-      <name>emplContactId_param</name>
-      <expose v="true" />
-    </entityParameter>
-    <entityParameter>
-      <name>name_param</name>
-      <expose v="true" />
-    </entityParameter>
-    <entityParameter>
-      <name>state_param</name>
-      <expose v="true" />
-    </entityParameter>
     <entityConsumer>
       <name>Documents</name>
       <dependency>
@@ -517,6 +480,10 @@
           <name>ContainerName_param</name>
           <valueProcess>%aditoprj%/entity/Campaign_entity/entityfields/keywordcurrency/children/containername_param/valueProcess.js</valueProcess>
         </entityParameter>
+        <entityParameter>
+          <name>OnlyActives_param</name>
+          <valueProcess>%aditoprj%/entity/Campaign_entity/entityfields/keywordcurrency/children/onlyactives_param/valueProcess.js</valueProcess>
+        </entityParameter>
       </children>
     </entityConsumer>
     <entityField>
@@ -556,12 +523,33 @@
     <entityField>
       <name>ACTIVE</name>
     </entityField>
+    <entityParameter>
+      <name>Copy_param</name>
+      <expose v="true" />
+    </entityParameter>
+    <entityConsumer>
+      <name>Tasks</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Task_entity</entityName>
+        <fieldName>Tasks</fieldName>
+      </dependency>
+      <children>
+        <entityParameter>
+          <name>ObjectId_param</name>
+          <valueProcess>%aditoprj%/entity/Campaign_entity/entityfields/tasks/children/objectid_param/valueProcess.js</valueProcess>
+        </entityParameter>
+        <entityParameter>
+          <name>RowId_param</name>
+          <valueProcess>%aditoprj%/entity/Campaign_entity/entityfields/tasks/children/rowid_param/valueProcess.js</valueProcess>
+        </entityParameter>
+      </children>
+    </entityConsumer>
   </entityFields>
   <recordContainers>
     <dbRecordContainer>
       <name>db</name>
       <alias>Data_alias</alias>
-      <fromClauseProcess>%aditoprj%/entity/Campaign_entity/recordcontainers/db/fromClauseProcess.js</fromClauseProcess>
       <conditionProcess>%aditoprj%/entity/Campaign_entity/recordcontainers/db/conditionProcess.js</conditionProcess>
       <onDBInsert>%aditoprj%/entity/Campaign_entity/recordcontainers/db/onDBInsert.js</onDBInsert>
       <onDBUpdate>%aditoprj%/entity/Campaign_entity/recordcontainers/db/onDBUpdate.js</onDBUpdate>
@@ -675,6 +663,10 @@
           <name>ACTIVE.value</name>
           <expression>%aditoprj%/entity/Campaign_entity/recordcontainers/db/recordfieldmappings/active.value/expression.js</expression>
         </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>EMPLOYEE_CONTACT_ID.displayValue</name>
+          <expression>%aditoprj%/entity/Campaign_entity/recordcontainers/db/recordfieldmappings/employee_contact_id.displayvalue/expression.js</expression>
+        </dbRecordFieldMapping>
       </recordFieldMappings>
       <filterExtensions>
         <filterExtensionSet>
@@ -684,53 +676,6 @@
           <filterConditionProcess>%aditoprj%/entity/Campaign_entity/recordcontainers/db/filterextensions/attribute_filter/filterConditionProcess.js</filterConditionProcess>
           <filtertype>BASIC</filtertype>
         </filterExtensionSet>
-        <filterExtension>
-          <name>DateStart_filter</name>
-          <title>Startdate</title>
-          <contentType>DATE</contentType>
-          <filterConditionProcess>%aditoprj%/entity/Campaign_entity/recordcontainers/db/filterextensions/datestart_filter/filterConditionProcess.js</filterConditionProcess>
-          <filtertype>BASIC</filtertype>
-        </filterExtension>
-        <filterExtension>
-          <name>DateEnd_filter</name>
-          <title>Enddate</title>
-          <contentType>DATE</contentType>
-          <filterConditionProcess>%aditoprj%/entity/Campaign_entity/recordcontainers/db/filterextensions/dateend_filter/filterConditionProcess.js</filterConditionProcess>
-          <filtertype>BASIC</filtertype>
-        </filterExtension>
-        <filterExtension>
-          <name>Participant_filter</name>
-          <title>Participants</title>
-          <contentType>TEXT</contentType>
-          <filterValuesProcess>%aditoprj%/entity/Campaign_entity/recordcontainers/db/filterextensions/participant_filter/filterValuesProcess.js</filterValuesProcess>
-          <filterConditionProcess>%aditoprj%/entity/Campaign_entity/recordcontainers/db/filterextensions/participant_filter/filterConditionProcess.js</filterConditionProcess>
-          <filtertype>BASIC</filtertype>
-        </filterExtension>
-        <filterExtension>
-          <name>CampaignStep_filter</name>
-          <title>Steps</title>
-          <contentType>TEXT</contentType>
-          <filterValuesProcess>%aditoprj%/entity/Campaign_entity/recordcontainers/db/filterextensions/campaignstep_filter/filterValuesProcess.js</filterValuesProcess>
-          <filterConditionProcess>%aditoprj%/entity/Campaign_entity/recordcontainers/db/filterextensions/campaignstep_filter/filterConditionProcess.js</filterConditionProcess>
-          <filtertype>BASIC</filtertype>
-        </filterExtension>
-        <filterExtension>
-          <name>Member_filter</name>
-          <title>Members</title>
-          <contentType>TEXT</contentType>
-          <filterValuesProcess>%aditoprj%/entity/Campaign_entity/recordcontainers/db/filterextensions/member_filter/filterValuesProcess.js</filterValuesProcess>
-          <filterConditionProcess>%aditoprj%/entity/Campaign_entity/recordcontainers/db/filterextensions/member_filter/filterConditionProcess.js</filterConditionProcess>
-          <filtertype>BASIC</filtertype>
-        </filterExtension>
-        <filterExtension>
-          <name>Favorite_filter</name>
-          <title>Favoritegroup</title>
-          <contentType>TEXT</contentType>
-          <filterValuesProcess>%aditoprj%/entity/Campaign_entity/recordcontainers/db/filterextensions/favorite_filter/filterValuesProcess.js</filterValuesProcess>
-          <filterConditionProcess>%aditoprj%/entity/Campaign_entity/recordcontainers/db/filterextensions/favorite_filter/filterConditionProcess.js</filterConditionProcess>
-          <groupedRecordField></groupedRecordField>
-          <filtertype>BASIC</filtertype>
-        </filterExtension>
       </filterExtensions>
     </dbRecordContainer>
   </recordContainers>
diff --git a/entity/Campaign_entity/afterUiInit.js b/entity/Campaign_entity/afterUiInit.js
index 40048a41371..d71e3ce2b92 100644
--- a/entity/Campaign_entity/afterUiInit.js
+++ b/entity/Campaign_entity/afterUiInit.js
@@ -6,4 +6,9 @@ import("Attribute_lib");
 if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW)
 {
     AttributeRelationUtils.presetMandatoryAttributes(ContextUtils.getCurrentContextId(), "Attributes");
+    
+    if(vars.exists("$param.Copy_param") && vars.get("$param.Copy_param"))
+    {
+        neon.setFieldValues(JSON.parse(vars.get("$param.Copy_param"))["FIELDS"]);      
+    }
 }
diff --git a/entity/Campaign_entity/entityfields/copycampaign/onActionProcess.js b/entity/Campaign_entity/entityfields/copycampaign/onActionProcess.js
index d0e4f15cee9..10b5370070b 100644
--- a/entity/Campaign_entity/entityfields/copycampaign/onActionProcess.js
+++ b/entity/Campaign_entity/entityfields/copycampaign/onActionProcess.js
@@ -1,11 +1,11 @@
 import("system.vars");
 import("Campaign_lib");
 
-var campaignid = vars.getString("$field.CAMPAIGNID");
-var description = vars.getString("$field.DESCRIPTION");
-var emplContactId = vars.getString("$field.EMPLOYEE_CONTACT_ID");
-var name = vars.getString("$field.NAME");
-var state = vars.getString("$field.STATUS");
+var campaignid = vars.get("$field.CAMPAIGNID");
+var description = vars.get("$field.DESCRIPTION");
+var emplContactId = vars.get("$field.EMPLOYEE_CONTACT_ID");
+var name = vars.get("$field.NAME");
+var state = vars.get("$field.STATUS");
 
 CampaignUtils.copyCampaign(campaignid, description, emplContactId, name, state);
     
\ No newline at end of file
diff --git a/entity/Campaign_entity/entityfields/description/valueProcess.js b/entity/Campaign_entity/entityfields/description/valueProcess.js
deleted file mode 100644
index f410607cb79..00000000000
--- a/entity/Campaign_entity/entityfields/description/valueProcess.js
+++ /dev/null
@@ -1,8 +0,0 @@
-import("system.vars");
-import("system.result");
-import("system.neon");
-
-if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && vars.exists("$param.description_param") && vars.get("$param.description_param") && !vars.get("$this.value")) 
-{
-    result.string(vars.get("$param.description_param"));
-}
\ No newline at end of file
diff --git a/entity/Campaign_entity/entityfields/employee_contact_id/valueProcess.js b/entity/Campaign_entity/entityfields/employee_contact_id/valueProcess.js
index 04046053e32..4b00f2d048b 100644
--- a/entity/Campaign_entity/entityfields/employee_contact_id/valueProcess.js
+++ b/entity/Campaign_entity/entityfields/employee_contact_id/valueProcess.js
@@ -3,10 +3,5 @@ import("system.neon");
 import("system.vars");
 import("Employee_lib");
 
-if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW) 
-{
-    if(vars.exists("$param.emplContactId_param") && vars.get("$param.emplContactId_param") && !vars.get("$this.value"))
-        result.string(vars.get("$param.emplContactId_param"));
-    else if(vars.get("$this.value") == null)
-        result.string(EmployeeUtils.getCurrentContactId());
-}
\ No newline at end of file
+if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && vars.get("$this.value") == null)
+        result.string(EmployeeUtils.getCurrentContactId());
\ No newline at end of file
diff --git a/entity/Campaign_entity/entityfields/name/valueProcess.js b/entity/Campaign_entity/entityfields/name/valueProcess.js
deleted file mode 100644
index 2c8e28aa36e..00000000000
--- a/entity/Campaign_entity/entityfields/name/valueProcess.js
+++ /dev/null
@@ -1,8 +0,0 @@
-import("system.vars");
-import("system.result");
-import("system.neon");
-
-if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && vars.exists("$param.name_param") && vars.get("$param.name_param") && !vars.get("$this.value")) 
-{
-    result.string(vars.get("$param.name_param"));
-}
\ No newline at end of file
diff --git a/entity/Campaign_entity/entityfields/status/displayValueProcess.js b/entity/Campaign_entity/entityfields/status/displayValueProcess.js
deleted file mode 100644
index 2b82fe77f1e..00000000000
--- a/entity/Campaign_entity/entityfields/status/displayValueProcess.js
+++ /dev/null
@@ -1,6 +0,0 @@
-import("system.result");
-import("system.vars");
-import("Keyword_lib");
-import("KeywordRegistry_basic");
-
-result.string(KeywordUtils.getViewValue($KeywordRegistry.campaignState(), vars.get("$field.STATUS")));
\ No newline at end of file
diff --git a/entity/Campaign_entity/entityfields/status/valueProcess.js b/entity/Campaign_entity/entityfields/status/valueProcess.js
index e772e08d2c7..c3b6c3a0362 100644
--- a/entity/Campaign_entity/entityfields/status/valueProcess.js
+++ b/entity/Campaign_entity/entityfields/status/valueProcess.js
@@ -1,12 +1,7 @@
+import("KeywordRegistry_basic");
 import("system.neon");
 import("system.vars");
 import("system.result");
-import("KeywordRegistry_basic");
 
-if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW)
-{
-    if(vars.exists("$param.state_param") && vars.get("$param.state_param") && !vars.get("$this.value"))
-        result.string(vars.get("$param.state_param"));
-    else if (vars.get("$this.value") == null)
-        result.string($KeywordRegistry.campaignState$planning());
-}
\ No newline at end of file
+if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && vars.get("$this.value") == null)
+    result.string($KeywordRegistry.campaignState$planning);
\ No newline at end of file
diff --git a/entity/Campaign_entity/entityfields/tasks/children/objectid_param/valueProcess.js b/entity/Campaign_entity/entityfields/tasks/children/objectid_param/valueProcess.js
index 5996e99db23..e8b4e72e74a 100644
--- a/entity/Campaign_entity/entityfields/tasks/children/objectid_param/valueProcess.js
+++ b/entity/Campaign_entity/entityfields/tasks/children/objectid_param/valueProcess.js
@@ -1,4 +1,4 @@
-import("system.result");
-import("Context_lib");
-
-result.string(ContextUtils.getCurrentContextId());
\ No newline at end of file
+import("system.result");
+import("Context_lib");
+
+result.string(ContextUtils.getCurrentContextId());
diff --git a/entity/Campaign_entity/entityfields/tasks/children/rowid_param/valueProcess.js b/entity/Campaign_entity/entityfields/tasks/children/rowid_param/valueProcess.js
index 44d452d9b78..3814648f507 100644
--- a/entity/Campaign_entity/entityfields/tasks/children/rowid_param/valueProcess.js
+++ b/entity/Campaign_entity/entityfields/tasks/children/rowid_param/valueProcess.js
@@ -1,4 +1,4 @@
-import("system.vars");
-import("system.result");
-
+import("system.vars");
+import("system.result");
+
 result.string(vars.get("$field.CAMPAIGNID"));
\ No newline at end of file
diff --git a/entity/Campaign_entity/recordcontainers/db/conditionProcess.js b/entity/Campaign_entity/recordcontainers/db/conditionProcess.js
index ea77837ea6f..e5c5faf2b6e 100644
--- a/entity/Campaign_entity/recordcontainers/db/conditionProcess.js
+++ b/entity/Campaign_entity/recordcontainers/db/conditionProcess.js
@@ -7,11 +7,11 @@ import("Sql_lib");
 
 
 var recordState = vars.get("$sys.recordstate");
-var condition = newWhere();
+var cond = newWhere();
+
 
 if(vars.get("$param.ShowOnlyCurrentUsersCampaigns_param") == 'true')
 {
-    condition.and("CAMPAIGN.EMPLOYEE_CONTACT_ID", EmployeeUtils.getCurrentContactId());
+    cond.and("CAMPAIGN.EMPLOYEE_CONTACT_ID", EmployeeUtils.getCurrentContactId());
 }
-
-result.string(condition.toString());
\ No newline at end of file
+result.string(cond.toString());
\ No newline at end of file
diff --git a/entity/Campaign_entity/recordcontainers/db/filterextensions/campaignstep_filter/filterConditionProcess.js b/entity/Campaign_entity/recordcontainers/db/filterextensions/campaignstep_filter/filterConditionProcess.js
deleted file mode 100644
index d0dddcc8b37..00000000000
--- a/entity/Campaign_entity/recordcontainers/db/filterextensions/campaignstep_filter/filterConditionProcess.js
+++ /dev/null
@@ -1,27 +0,0 @@
-import("system.result");
-import("system.vars");
-import("Sql_lib");
-import("Util_lib");
-import("Campaign_lib");
-
-
-var valueSubSelect = "(select CAMPAIGNSTEPID from CAMPAIGNSTEP where CAMPAIGN.CAMPAIGNID = CAMPAIGNSTEP.CAMPAIGN_ID)";
-var countSubSelect = "(select count(*) from CAMPAIGNSTEP where CAMPAIGNSTEP.CAMPAIGN_ID = CAMPAIGN.CAMPAIGNID)";
-var condition = "";
-
-switch(vars.get("$local.comparison")) {
-    case "ISNOTNULL":
-        condition = countSubSelect + " > 0";
-        break;
-    case "ISNULL":
-        condition = countSubSelect + " = 0";
-        break;
-    case "NOT_EQUAL":
-        condition = vars.get("$local.value") + " not in " + valueSubSelect;
-        break;
-    case "EQUAL":
-        condition = vars.get("$local.value") + " in " + valueSubSelect;
-    break;
-}
-
-result.object(condition);
diff --git a/entity/Campaign_entity/recordcontainers/db/filterextensions/campaignstep_filter/filterValuesProcess.js b/entity/Campaign_entity/recordcontainers/db/filterextensions/campaignstep_filter/filterValuesProcess.js
deleted file mode 100644
index 13b3ff34c39..00000000000
--- a/entity/Campaign_entity/recordcontainers/db/filterextensions/campaignstep_filter/filterValuesProcess.js
+++ /dev/null
@@ -1,11 +0,0 @@
-import("system.result");
-import("Sql_lib");
-
-
-var campaignStepValues = new SqlBuilder()
-    .select("CAMPAIGNSTEPID, NAME")
-    .from("CAMPAIGNSTEP")
-    .orderBy("NAME")
-    .table();
-    
-result.object(campaignStepValues);
\ No newline at end of file
diff --git a/entity/Campaign_entity/recordcontainers/db/filterextensions/dateend_filter/filterConditionProcess.js b/entity/Campaign_entity/recordcontainers/db/filterextensions/dateend_filter/filterConditionProcess.js
deleted file mode 100644
index c5895859892..00000000000
--- a/entity/Campaign_entity/recordcontainers/db/filterextensions/dateend_filter/filterConditionProcess.js
+++ /dev/null
@@ -1,17 +0,0 @@
-import("system.result");
-import("system.vars");
-import("Sql_lib");
-import("Util_lib");
-
-
-var subSelect = new SqlBuilder()
-    .select("max(CAMPAIGNSTEP.DATE_END)")
-    .from("CAMPAIGNSTEP")
-    .where("CAMPAIGNSTEP.CAMPAIGN_ID = CAMPAIGN.CAMPAIGNID")
-    .toString();
-
-subSelect = "(" + subSelect + ")";
-
-var condition = StringUtils.replaceAll(vars.get("$local.condition"), vars.get("$local.columnPlaceholder"), subSelect);
-
-result.object(condition);
diff --git a/entity/Campaign_entity/recordcontainers/db/filterextensions/datestart_filter/filterConditionProcess.js b/entity/Campaign_entity/recordcontainers/db/filterextensions/datestart_filter/filterConditionProcess.js
deleted file mode 100644
index 2d15b9e58f2..00000000000
--- a/entity/Campaign_entity/recordcontainers/db/filterextensions/datestart_filter/filterConditionProcess.js
+++ /dev/null
@@ -1,17 +0,0 @@
-import("system.result");
-import("system.vars");
-import("Sql_lib");
-import("Util_lib");
-
-
-var subSelect = new SqlBuilder()
-    .select("min(CAMPAIGNSTEP.DATE_START)")
-    .from("CAMPAIGNSTEP")
-    .where("CAMPAIGNSTEP.CAMPAIGN_ID = CAMPAIGN.CAMPAIGNID")
-    .toString();
-
-subSelect = "(" + subSelect + ")";
-
-var condition = StringUtils.replaceAll(vars.get("$local.condition"), vars.get("$local.columnPlaceholder"), subSelect);
-
-result.object(condition);
diff --git a/entity/Campaign_entity/recordcontainers/db/filterextensions/favorite_filter/filterConditionProcess.js b/entity/Campaign_entity/recordcontainers/db/filterextensions/favorite_filter/filterConditionProcess.js
deleted file mode 100644
index 5a2fdfdb69a..00000000000
--- a/entity/Campaign_entity/recordcontainers/db/filterextensions/favorite_filter/filterConditionProcess.js
+++ /dev/null
@@ -1,11 +0,0 @@
-import("Favorites_lib");
-import("system.result");
-import("Sql_lib");
-
-var favoFilterCond = newWhere();
-var rowIds = FavoritesUtil.getRowIdsOfFavoriteGroup();
-
-for(i = 0; i < rowIds.length; i++)
-    favoFilterCond.or("CAMPAIGN.CAMPAIGNID", rowIds[i], SqlBuilder.EQUAL());
-
-result.string(favoFilterCond.toString());
\ No newline at end of file
diff --git a/entity/Campaign_entity/recordcontainers/db/filterextensions/favorite_filter/filterValuesProcess.js b/entity/Campaign_entity/recordcontainers/db/filterextensions/favorite_filter/filterValuesProcess.js
deleted file mode 100644
index 419128ca73f..00000000000
--- a/entity/Campaign_entity/recordcontainers/db/filterextensions/favorite_filter/filterValuesProcess.js
+++ /dev/null
@@ -1,5 +0,0 @@
-import("Context_lib");
-import("system.result");
-import("Favorites_lib");
-
-result.object(FavoritesUtil.getUserFavoriteGroupsByContext(ContextUtils.getCurrentContextId()));
\ No newline at end of file
diff --git a/entity/Campaign_entity/recordcontainers/db/filterextensions/member_filter/filterConditionProcess.js b/entity/Campaign_entity/recordcontainers/db/filterextensions/member_filter/filterConditionProcess.js
deleted file mode 100644
index 48c84a8dcbb..00000000000
--- a/entity/Campaign_entity/recordcontainers/db/filterextensions/member_filter/filterConditionProcess.js
+++ /dev/null
@@ -1,26 +0,0 @@
-import("system.result");
-import("system.vars");
-import("Sql_lib");
-import("Util_lib");
-
-
-var valueSubSelect = "(select CONTACT_ID from OBJECTMEMBER where OBJECTMEMBER.OBJECT_ROWID = CAMPAIGN.CAMPAIGNID)";
-var countSubSelect = "(select count(*) from OBJECTMEMBER where OBJECTMEMBER.OBJECT_ROWID = CAMPAIGN.CAMPAIGNID)";
-var condition = "";
-
-switch(vars.get("$local.comparison")) {
-    case "ISNOTNULL":
-        condition = countSubSelect + " > 0";
-        break;
-    case "ISNULL":
-        condition = countSubSelect + " = 0";
-        break;
-    case "NOT_EQUAL":
-        condition = vars.get("$local.value") + " not in " + valueSubSelect;
-        break;
-    case "EQUAL":
-        condition = vars.get("$local.value") + " in " + valueSubSelect;
-    break;
-}
-
-result.object(condition);
diff --git a/entity/Campaign_entity/recordcontainers/db/filterextensions/member_filter/filterValuesProcess.js b/entity/Campaign_entity/recordcontainers/db/filterextensions/member_filter/filterValuesProcess.js
deleted file mode 100644
index 569b13dcd32..00000000000
--- a/entity/Campaign_entity/recordcontainers/db/filterextensions/member_filter/filterValuesProcess.js
+++ /dev/null
@@ -1,13 +0,0 @@
-import("system.result");
-import("Sql_lib");
-import("Person_lib");
-
-
-var query = new SqlBuilder()
-    .select("OBJECTMEMBER.CONTACT_ID, (" + PersUtils.getResolvingDisplaySubSql("OBJECTMEMBER.CONTACT_ID") + ") as C")
-    .from("OBJECTMEMBER")
-    .join("CAMPAIGN", "OBJECTMEMBER.OBJECT_ROWID = CAMPAIGN.CAMPAIGNID")
-    .join("CONTACT", "OBJECTMEMBER.CONTACT_ID = CONTACT.CONTACTID")
-    ;
-    
-result.object(query.table());
\ No newline at end of file
diff --git a/entity/Campaign_entity/recordcontainers/db/filterextensions/participant_filter/filterConditionProcess.js b/entity/Campaign_entity/recordcontainers/db/filterextensions/participant_filter/filterConditionProcess.js
deleted file mode 100644
index be23e1087b3..00000000000
--- a/entity/Campaign_entity/recordcontainers/db/filterextensions/participant_filter/filterConditionProcess.js
+++ /dev/null
@@ -1,26 +0,0 @@
-import("system.result");
-import("system.vars");
-import("Sql_lib");
-import("Util_lib");
-
-
-var valueSubSelect = "(select CONTACT_ID from CAMPAIGNPARTICIPANT where CAMPAIGNPARTICIPANT.CAMPAIGN_ID = CAMPAIGN.CAMPAIGNID)";
-var countSubSelect = "(select count(*) from CAMPAIGNPARTICIPANT where CAMPAIGNPARTICIPANT.CAMPAIGN_ID = CAMPAIGN.CAMPAIGNID)";
-var condition = "";
-
-switch(vars.get("$local.comparison")) {
-    case "ISNOTNULL":
-        condition = countSubSelect + " > 0";
-        break;
-    case "ISNULL":
-        condition = countSubSelect + " = 0";
-        break;
-    case "NOT_EQUAL":
-        condition = vars.get("$local.value") + " not in " + valueSubSelect;
-        break;
-    case "EQUAL":
-        condition = vars.get("$local.value") + " in " + valueSubSelect;
-    break;
-}
-
-result.object(condition);
diff --git a/entity/Campaign_entity/recordcontainers/db/filterextensions/participant_filter/filterValuesProcess.js b/entity/Campaign_entity/recordcontainers/db/filterextensions/participant_filter/filterValuesProcess.js
deleted file mode 100644
index 0ff2d9c975b..00000000000
--- a/entity/Campaign_entity/recordcontainers/db/filterextensions/participant_filter/filterValuesProcess.js
+++ /dev/null
@@ -1,16 +0,0 @@
-import("system.result");
-import("Sql_lib");
-import("Person_lib");
-
-
-var contactDisplaySelect = "case when CONTACT.PERSON_ID is null"
-                            + " then (select ORGANISATION.NAME FROM ORGANISATION join CONTACT on CONTACT.ORGANISATION_ID = ORGANISATION.ORGANISATIONID where CONTACT.CONTACTID = CAMPAIGNPARTICIPANT.CONTACT_ID)"
-                            + " else (" + PersUtils.getResolvingDisplaySubSql("CAMPAIGNPARTICIPANT.CONTACT_ID") + ")"
-                            + " end";
-var query = new SqlBuilder()
-    .select("distinct CAMPAIGNPARTICIPANT.CONTACT_ID, (" + contactDisplaySelect + ") as C")
-    .from("CAMPAIGNPARTICIPANT")
-    .join("CONTACT on CAMPAIGNPARTICIPANT.CONTACT_ID = CONTACT.CONTACTID", "", "", "inner")
-    ;
-    
-result.object(query.table());
\ No newline at end of file
diff --git a/entity/Campaign_entity/recordcontainers/db/fromClauseProcess.js b/entity/Campaign_entity/recordcontainers/db/fromClauseProcess.js
deleted file mode 100644
index f1704c63ce0..00000000000
--- a/entity/Campaign_entity/recordcontainers/db/fromClauseProcess.js
+++ /dev/null
@@ -1,17 +0,0 @@
-import("system.result");
-import("system.neon");
-import("system.vars");
-
-
-var recordState = vars.get("$sys.recordstate");
-var res = "CAMPAIGN";
-
-if (recordState != neon.OPERATINGSTATE_NEW && recordState != neon.OPERATINGSTATE_EDIT) {
-    res +=  " join (select min(DATE_START) as STEPDATESTART_ALIAS, CAMPAIGN_ID from CAMPAIGNSTEP group by CAMPAIGN_ID) STEPDATESTART_TABLEALIAS"
-        + " on STEPDATESTART_TABLEALIAS.CAMPAIGN_ID = CAMPAIGN.CAMPAIGNID "
-        + " join (select max(DATE_END) as STEPDATEEND_ALIAS, CAMPAIGN_ID from CAMPAIGNSTEP group by CAMPAIGN_ID) STEPDATEEND_TABLEALIAS"
-        + " on STEPDATEEND_TABLEALIAS.CAMPAIGN_ID = CAMPAIGN.CAMPAIGNID ";
-
-}
-
-result.string(res);
diff --git a/entity/Campaign_entity/recordcontainers/db/onDBInsert.js b/entity/Campaign_entity/recordcontainers/db/onDBInsert.js
index 3c0830aabed..ecc62088cac 100644
--- a/entity/Campaign_entity/recordcontainers/db/onDBInsert.js
+++ b/entity/Campaign_entity/recordcontainers/db/onDBInsert.js
@@ -12,8 +12,8 @@ import("Campaign_lib");
 var rowdata = vars.get("$local.rowdata");
 var campaignId = vars.get("$local.uid");
 
-if (vars.get("$param.originalCampaignIdCopy_param"))
-    CampaignUtils.copyCampaignSteps(vars.getString("$param.originalCampaignIdCopy_param"), campaignId);
+if (vars.get("$param.Copy_param"))
+    CampaignUtils.copyCampaignSteps(JSON.parse(vars.get("$param.Copy_param"))["CAMPAIGNID"], campaignId);
 else
 {
     var threeWeeks = datetime.ONE_WEEK * 3;
diff --git a/entity/Campaign_entity/recordcontainers/db/recordfieldmappings/date_end.value/expression.js b/entity/Campaign_entity/recordcontainers/db/recordfieldmappings/date_end.value/expression.js
index 510c61f4799..26ead684de6 100644
--- a/entity/Campaign_entity/recordcontainers/db/recordfieldmappings/date_end.value/expression.js
+++ b/entity/Campaign_entity/recordcontainers/db/recordfieldmappings/date_end.value/expression.js
@@ -1,12 +1,4 @@
-import("system.neon");
 import("system.result");
-import("system.vars");
+import("Sql_lib");
 
-
-var recordState = vars.get("$sys.recordstate");
-
-if (recordState != neon.OPERATINGSTATE_NEW && recordState != neon.OPERATINGSTATE_EDIT) {
-    result.string("STEPDATEEND_ALIAS");
-} else {
-    result.string("0");
-}
+result.string(newSelect("max(CAMPAIGNSTEP.DATE_END)").from("CAMPAIGNSTEP").where("CAMPAIGNSTEP.CAMPAIGN_ID = CAMPAIGN.CAMPAIGNID").toString());
\ No newline at end of file
diff --git a/entity/Campaign_entity/recordcontainers/db/recordfieldmappings/date_start.value/expression.js b/entity/Campaign_entity/recordcontainers/db/recordfieldmappings/date_start.value/expression.js
index 77d1b3dde65..4659e92e558 100644
--- a/entity/Campaign_entity/recordcontainers/db/recordfieldmappings/date_start.value/expression.js
+++ b/entity/Campaign_entity/recordcontainers/db/recordfieldmappings/date_start.value/expression.js
@@ -1,12 +1,5 @@
 import("system.neon");
 import("system.result");
-import("system.vars");
+import("Sql_lib");
 
-
-var recordState = vars.get("$sys.recordstate");
-
-if (recordState != neon.OPERATINGSTATE_NEW && recordState != neon.OPERATINGSTATE_EDIT) {
-    result.string("STEPDATESTART_ALIAS");
-} else {
-    result.string("0");
-}
\ No newline at end of file
+result.string(newSelect("min(CAMPAIGNSTEP.DATE_START)").from("CAMPAIGNSTEP").where("CAMPAIGNSTEP.CAMPAIGN_ID = CAMPAIGN.CAMPAIGNID").toString());
\ No newline at end of file
diff --git a/entity/Campaign_entity/recordcontainers/db/recordfieldmappings/employee_contact_id.displayvalue/expression.js b/entity/Campaign_entity/recordcontainers/db/recordfieldmappings/employee_contact_id.displayvalue/expression.js
new file mode 100644
index 00000000000..f0023d115c5
--- /dev/null
+++ b/entity/Campaign_entity/recordcontainers/db/recordfieldmappings/employee_contact_id.displayvalue/expression.js
@@ -0,0 +1,3 @@
+import("Person_lib");
+import("system.result");
+result.string(PersUtils.getResolvingDisplaySubSql("CAMPAIGN.EMPLOYEE_CONTACT_ID"));
\ No newline at end of file
diff --git a/entity/Campaign_entity/recordcontainers/db/recordfieldmappings/status.displayvalue/expression.js b/entity/Campaign_entity/recordcontainers/db/recordfieldmappings/status.displayvalue/expression.js
index f67e50c289f..d5024a1449d 100644
--- a/entity/Campaign_entity/recordcontainers/db/recordfieldmappings/status.displayvalue/expression.js
+++ b/entity/Campaign_entity/recordcontainers/db/recordfieldmappings/status.displayvalue/expression.js
@@ -1,6 +1,6 @@
-import("system.result");
-import("Keyword_lib");
 import("KeywordRegistry_basic");
+import("Keyword_lib");
+import("system.result");
 
 var sql = KeywordUtils.getResolvedTitleSqlPart($KeywordRegistry.campaignState(), "CAMPAIGN.STATUS");
 result.string(sql);
\ No newline at end of file
diff --git a/entity/KeywordEntry_entity/KeywordEntry_entity.aod b/entity/KeywordEntry_entity/KeywordEntry_entity.aod
index ad9c6c66275..198706a9c3b 100644
--- a/entity/KeywordEntry_entity/KeywordEntry_entity.aod
+++ b/entity/KeywordEntry_entity/KeywordEntry_entity.aod
@@ -589,6 +589,12 @@
           <fieldName>KeywordVisitRecommendationSource</fieldName>
           <isConsumer v="false" />
         </entityDependency>
+        <entityDependency>
+          <name>10ced13f-78ae-4e99-a315-82f1f7389029</name>
+          <entityName>CampaignStep_entity</entityName>
+          <fieldName>KeywordStepMedium</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
       </dependencies>
       <children>
         <entityParameter>
diff --git a/language/_____LANGUAGE_de/_____LANGUAGE_de.aod b/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
index 2abce19573c..5fefee70bc8 100644
--- a/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
+++ b/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
@@ -6,6 +6,10 @@
   <country></country>
   <variant></variant>
   <keyValueMap>
+    <entry>
+      <key>The max participants count can not be equal or less then 0</key>
+      <value>Die maximale Teilnehmerzahl muss größer 0 sein!</value>
+    </entry>
     <entry>
       <key>Illegal Parent Operator in buildFilterObj-Function:</key>
       <value>Übergebener Operator ungültig in Funktion "buildFilterObj"</value>
diff --git a/neonContext/CampaignParticipant/CampaignParticipant.aod b/neonContext/CampaignParticipant/CampaignParticipant.aod
index 503b93a8e3b..80eda39dc4d 100644
--- a/neonContext/CampaignParticipant/CampaignParticipant.aod
+++ b/neonContext/CampaignParticipant/CampaignParticipant.aod
@@ -4,7 +4,6 @@
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <filterView>CampaignParticipantFilter_view</filterView>
   <editView>CampaignParticipantEdit_view</editView>
-  <previewView>CampaignParticipantPreview_view</previewView>
   <entity>CampaignParticipant_entity</entity>
   <references>
     <neonViewReference>
diff --git a/neonView/CampaignCostChart_view/CampaignCostChart_view.aod b/neonView/CampaignCostChart_view/CampaignCostChart_view.aod
index 24159367f94..9c8daa4a4eb 100644
--- a/neonView/CampaignCostChart_view/CampaignCostChart_view.aod
+++ b/neonView/CampaignCostChart_view/CampaignCostChart_view.aod
@@ -5,7 +5,7 @@
   <dashletConfigurations>
     <neonDashletConfiguration>
       <name>CampaignCostsChart</name>
-      <title>Campaign Costs</title>
+      <title>Campaign costs</title>
       <description>Shows campaing costs graphically processed</description>
       <fragment>Campaign/full</fragment>
       <singleton v="true" />
diff --git a/neonView/CampaignCostExtendedFilter_view/CampaignCostExtendedFilter_view.aod b/neonView/CampaignCostExtendedFilter_view/CampaignCostExtendedFilter_view.aod
index 15bdd074a0c..bbd116c757e 100644
--- a/neonView/CampaignCostExtendedFilter_view/CampaignCostExtendedFilter_view.aod
+++ b/neonView/CampaignCostExtendedFilter_view/CampaignCostExtendedFilter_view.aod
@@ -13,6 +13,8 @@
     <tableViewTemplate>
       <name>CampaignCost</name>
       <entityField>#ENTITY</entityField>
+      <linkedColumns />
+      <fixedFilterFields />
       <columns>
         <neonTableColumn>
           <name>5202d410-fc4d-4109-93b1-8743954a25e2</name>
diff --git a/neonView/CampaignCostFilter_view/CampaignCostFilter_view.aod b/neonView/CampaignCostFilter_view/CampaignCostFilter_view.aod
index 1cfa11b98bd..058c9bca2a2 100644
--- a/neonView/CampaignCostFilter_view/CampaignCostFilter_view.aod
+++ b/neonView/CampaignCostFilter_view/CampaignCostFilter_view.aod
@@ -12,6 +12,8 @@
     <tableViewTemplate>
       <name>CampaignCost</name>
       <entityField>#ENTITY</entityField>
+      <linkedColumns />
+      <fixedFilterFields />
       <columns>
         <neonTableColumn>
           <name>651c5bd4-8f87-40d4-9d1f-38549b1e5fdf</name>
@@ -26,6 +28,9 @@
     <treeTableViewTemplate>
       <name>Treetable</name>
       <entityField>#ENTITY</entityField>
+      <linkedColumns />
+      <defaultGroupFields />
+      <fixedFilterFields />
       <columns>
         <neonTreeTableColumn>
           <name>9d36a33f-b619-4922-9811-acd73bf67b22</name>
diff --git a/neonView/CampaignCostFix_view/CampaignCostFix_view.aod b/neonView/CampaignCostFix_view/CampaignCostFix_view.aod
index 4397f42cbf1..cd0b9ebdd1b 100644
--- a/neonView/CampaignCostFix_view/CampaignCostFix_view.aod
+++ b/neonView/CampaignCostFix_view/CampaignCostFix_view.aod
@@ -14,6 +14,8 @@
     <tableViewTemplate>
       <name>CampaignCostFix</name>
       <entityField>#ENTITY</entityField>
+      <linkedColumns />
+      <fixedFilterFields />
       <columns>
         <neonTableColumn>
           <name>1b2b3ce3-eaff-472b-a873-5e054adac89a</name>
diff --git a/neonView/CampaignCostVariable_view/CampaignCostVariable_view.aod b/neonView/CampaignCostVariable_view/CampaignCostVariable_view.aod
index c29615b901e..dd68e125ee0 100644
--- a/neonView/CampaignCostVariable_view/CampaignCostVariable_view.aod
+++ b/neonView/CampaignCostVariable_view/CampaignCostVariable_view.aod
@@ -15,9 +15,11 @@
     <treeTableViewTemplate>
       <name>CostTreeTable</name>
       <entityField>#ENTITY</entityField>
+      <linkedColumns />
       <defaultGroupFields>
         <element>CAMPAIGNSTEP_ID</element>
       </defaultGroupFields>
+      <fixedFilterFields />
       <columns>
         <neonTreeTableColumn>
           <name>457caff8-0403-425f-839c-62e5d05fe3a1</name>
@@ -26,10 +28,12 @@
         <neonTreeTableColumn>
           <name>2adbd887-f1df-43ff-bde9-12c8273af7a9</name>
           <entityField>NET</entityField>
+          <aggregateEntityField>NET_aggregate</aggregateEntityField>
         </neonTreeTableColumn>
         <neonTreeTableColumn>
           <name>f8c6439c-9536-477b-af19-26719902e12e</name>
           <entityField>netPerParticipant</entityField>
+          <aggregateEntityField>NETPERPARTICIPANT_aggregate</aggregateEntityField>
         </neonTreeTableColumn>
         <neonTreeTableColumn>
           <name>8239e81b-d69c-4ea9-b55d-83e79d1693cf</name>
diff --git a/neonView/CampaignFilter_view/CampaignFilter_view.aod b/neonView/CampaignFilter_view/CampaignFilter_view.aod
index 4d7c3aac1c1..0dcb198305d 100644
--- a/neonView/CampaignFilter_view/CampaignFilter_view.aod
+++ b/neonView/CampaignFilter_view/CampaignFilter_view.aod
@@ -8,7 +8,7 @@
   <dashletConfigurations>
     <neonDashletConfiguration>
       <name>CurrentUsersOwnedCampaigns</name>
-      <title>My Campaigns</title>
+      <title>My campaigns</title>
       <description>Show my campaigns</description>
       <fragment>Campaign/filter</fragment>
       <singleton v="true" />
diff --git a/neonView/CampaignMain_view/CampaignMain_view.aod b/neonView/CampaignMain_view/CampaignMain_view.aod
index 789dbfbf943..7b18c973408 100644
--- a/neonView/CampaignMain_view/CampaignMain_view.aod
+++ b/neonView/CampaignMain_view/CampaignMain_view.aod
@@ -46,11 +46,6 @@
       <entityField>Activities</entityField>
       <view>ActivityFilter_view</view>
     </neonViewReference>
-    <neonViewReference>
-      <name>e28e5598-9366-4f5a-be8f-70dd3cc0399a</name>
-      <entityField>Tasks</entityField>
-      <view>TaskFilter_view</view>
-    </neonViewReference>
     <neonViewReference>
       <name>3b87a113-aa39-4d20-8902-ad2a9f6aba5f</name>
       <entityField>Documents</entityField>
diff --git a/neonView/CampaignParticipantEdit_view/CampaignParticipantEdit_view.aod b/neonView/CampaignParticipantEdit_view/CampaignParticipantEdit_view.aod
index 6539d7a4d36..f397e74e04e 100644
--- a/neonView/CampaignParticipantEdit_view/CampaignParticipantEdit_view.aod
+++ b/neonView/CampaignParticipantEdit_view/CampaignParticipantEdit_view.aod
@@ -14,6 +14,7 @@
   <children>
     <scoreCardViewTemplate>
       <name>CampaignStepInfos_Score</name>
+      <fieldActions />
       <entityField>#ENTITY</entityField>
       <fields>
         <entityFieldLink>
@@ -41,9 +42,13 @@
           <entityField>CAMPAIGNSTEP_ID</entityField>
         </entityFieldLink>
         <entityFieldLink>
-          <name>94aa9a4d-e2e5-4a1b-b6f8-4d5aed87fe53</name>
+          <name>65fd8c83-7990-4109-8a08-5c0c56cb3426</name>
           <entityField>CONTACT_ID</entityField>
         </entityFieldLink>
+        <entityFieldLink>
+          <name>572ffba6-15c8-4d82-8f78-7e03ca1215ce</name>
+          <entityField>RESPONSIBLE_CONTACT_ID</entityField>
+        </entityFieldLink>
       </fields>
     </genericViewTemplate>
   </children>
diff --git a/neonView/CampaignParticipantFilter_view/CampaignParticipantFilter_view.aod b/neonView/CampaignParticipantFilter_view/CampaignParticipantFilter_view.aod
index 0f7b7272655..f97bbe8c0fb 100644
--- a/neonView/CampaignParticipantFilter_view/CampaignParticipantFilter_view.aod
+++ b/neonView/CampaignParticipantFilter_view/CampaignParticipantFilter_view.aod
@@ -15,6 +15,8 @@
       <name>ParticipantsTable</name>
       <favoriteActionGroup1>FilterViewActionGroup</favoriteActionGroup1>
       <entityField>#ENTITY</entityField>
+      <linkedColumns />
+      <fixedFilterFields />
       <isCreatable v="true" />
       <isEditable v="true" />
       <columns>
@@ -24,12 +26,20 @@
         </neonTableColumn>
         <neonTableColumn>
           <name>0b6dd644-a692-4c1a-9ab7-c38608e63eac</name>
-          <entityField>CONTACT_ID</entityField>
+          <entityField>PERSON_CONTACT_ID</entityField>
+        </neonTableColumn>
+        <neonTableColumn>
+          <name>74ef2d05-72d0-4406-915d-0c0facd351c2</name>
+          <entityField>ORGANISATION_CONTACT_ID</entityField>
         </neonTableColumn>
         <neonTableColumn>
           <name>1649e2e9-e3b3-4a41-960d-39002cb6b2d8</name>
           <entityField>CAMPAIGNSTEP_ID</entityField>
         </neonTableColumn>
+        <neonTableColumn>
+          <name>19da14e0-31c5-4a2a-9291-d0b5b4bd0fc4</name>
+          <entityField>RESPONSIBLE_CONTACT_ID</entityField>
+        </neonTableColumn>
         <neonTableColumn>
           <name>20c9aed5-cf30-484b-a68b-c1f6ca0459db</name>
           <entityField>STANDARD_EMAIL_COMMUNICATION</entityField>
@@ -44,6 +54,9 @@
       <name>Treetable</name>
       <favoriteActionGroup1>FilterViewActionGroup</favoriteActionGroup1>
       <entityField>#ENTITY</entityField>
+      <linkedColumns />
+      <defaultGroupFields />
+      <fixedFilterFields />
       <columns>
         <neonTreeTableColumn>
           <name>9ded1920-58ef-4fc1-ac92-07522c7c06d4</name>
@@ -51,12 +64,20 @@
         </neonTreeTableColumn>
         <neonTreeTableColumn>
           <name>f406134b-b1c3-4fae-9f6d-771827d0fb01</name>
-          <entityField>CONTACT_ID</entityField>
+          <entityField>PERSON_CONTACT_ID</entityField>
+        </neonTreeTableColumn>
+        <neonTreeTableColumn>
+          <name>4c485b2e-bf95-4205-8e01-bcf4edbc5a03</name>
+          <entityField>ORGANISATION_CONTACT_ID</entityField>
         </neonTreeTableColumn>
         <neonTreeTableColumn>
           <name>c7831772-15e4-49bb-ba84-647136c3002e</name>
           <entityField>CAMPAIGNSTEP_ID</entityField>
         </neonTreeTableColumn>
+        <neonTreeTableColumn>
+          <name>8c5c3311-0127-4977-af27-8ab582d08733</name>
+          <entityField>RESPONSIBLE_CONTACT_ID</entityField>
+        </neonTreeTableColumn>
         <neonTreeTableColumn>
           <name>664cb6d0-48f9-48bf-9934-2fdb40501771</name>
           <entityField>STANDARD_EMAIL_COMMUNICATION</entityField>
diff --git a/neonView/CampaignStepFilter_view/CampaignStepFilter_view.aod b/neonView/CampaignStepFilter_view/CampaignStepFilter_view.aod
index dc45eb0e658..39d69eb7a25 100644
--- a/neonView/CampaignStepFilter_view/CampaignStepFilter_view.aod
+++ b/neonView/CampaignStepFilter_view/CampaignStepFilter_view.aod
@@ -4,7 +4,7 @@
   <title>Campaign steps </title>
   <description></description>
   <majorModelMode>DISTRIBUTED</majorModelMode>
-  <filterable v="false" />
+  <filterable v="true" />
   <layout>
     <groupLayout>
       <name>layout</name>
@@ -13,7 +13,6 @@
   <children>
     <tableViewTemplate>
       <name>StepsTable</name>
-      <inlineEdit v="true" />
       <entityField>#ENTITY</entityField>
       <isEditable v="true" />
       <autoNewRow v="true" />
@@ -30,6 +29,10 @@
           <name>d9ca59de-1441-494a-91f0-1cff91c575de</name>
           <entityField>NAME</entityField>
         </neonTableColumn>
+        <neonTableColumn>
+          <name>166b2a17-1142-4c1d-b403-362afb227469</name>
+          <entityField>PREDECESSORSTEP_ID</entityField>
+        </neonTableColumn>
         <neonTableColumn>
           <name>75d15a06-1591-4f5c-9be6-df98e32e3834</name>
           <entityField>EMPLOYEE_CONTACT_ID</entityField>
diff --git a/neonView/CampaignStepMembers_view/CampaignStepMembers_view.aod b/neonView/CampaignStepMembers_view/CampaignStepMembers_view.aod
new file mode 100644
index 00000000000..7d6034293b0
--- /dev/null
+++ b/neonView/CampaignStepMembers_view/CampaignStepMembers_view.aod
@@ -0,0 +1,10 @@
+<?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>CampaignStepMembers_view</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <layout>
+    <noneLayout>
+      <name>layout</name>
+    </noneLayout>
+  </layout>
+</neonView>
diff --git a/neonView/CampaignStepsGantt_view/CampaignStepsGantt_view.aod b/neonView/CampaignStepsGantt_view/CampaignStepsGantt_view.aod
index bc3590f6e3b..f175784272c 100644
--- a/neonView/CampaignStepsGantt_view/CampaignStepsGantt_view.aod
+++ b/neonView/CampaignStepsGantt_view/CampaignStepsGantt_view.aod
@@ -2,7 +2,6 @@
 <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>CampaignStepsGantt_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
-  <filterable v="true" />
   <layout>
     <noneLayout>
       <name>layout</name>
diff --git a/process/Campaign_lib/process.js b/process/Campaign_lib/process.js
index 6902d8c5c76..f3934b93366 100644
--- a/process/Campaign_lib/process.js
+++ b/process/Campaign_lib/process.js
@@ -627,13 +627,20 @@ CampaignUtils.GetContactCountByCondition = function(pCondition, pLookInCampaignO
  */
 CampaignUtils.copyCampaign = function(pCampaignid, pDescription, pEmplContactId, pName, pState)
 {
-    var params = {
-        "originalCampaignIdCopy_param" : pCampaignid,
-        "description_param" : pDescription,
-        "emplContactId_param" : pEmplContactId,
-        "name_param" : pName || "",
-        "state_param" : pState || ""
-    };
+    var fieldValues = {}
+    var preSetValues = {}
+    var params = {}
+
+    preSetValues["$field.DESCRIPTION"] = pDescription
+    preSetValues["$field.EMPLOYEE_CONTACT_ID"] = pEmplContactId
+    preSetValues["$field.NAME"] = pName
+    preSetValues["$field.STATUS"] = pState
+
+    fieldValues["FIELDS"] = preSetValues
+    fieldValues["CAMPAIGNID"] = pCampaignid
+    params["Copy_param"] = JSON.stringify(fieldValues)
+    
+    
     neon.openContext("Campaign", null, null, neon.OPERATINGSTATE_NEW, params);
 }
 
diff --git a/process/Contact_lib/process.js b/process/Contact_lib/process.js
index 4f73f699c57..7bbafdc693a 100644
--- a/process/Contact_lib/process.js
+++ b/process/Contact_lib/process.js
@@ -555,6 +555,36 @@ ContactUtils.getActiveCommRestrictionsSubselect = function()
     return sqlMasking.concatWithSeparator(parts, " ", false);
 }
 
+/**
+ * returns a sql subselect which counts all Commrestrictions from a Person and his Organisation.
+ * The select needs the CONTACT.CONTACTID column.
+ * 
+ * @return {String} the resulting subselect
+ */
+ContactUtils.getCommRestrictionCount = function(pMedium, pStartDate)
+{
+    if (!pStartDate && pStartDate !== 0)
+        pStartDate = datetime.date();
+    var firstLevel = new SqlBuilder()
+        .select("count(*)")
+        .from("COMMRESTRICTION")
+        .whereIfSet("COMMRESTRICTION.MEDIUM", pMedium)
+        .and("COMMRESTRICTION.STARTDATE", pStartDate, SqlBuilder.LESS_OR_EQUAL())
+        .and("COMMRESTRICTION.CONTACT_ID = CONTACT.CONTACTID");
+        
+    var secondLevel = new SqlBuilder()
+        .select("count(*)")
+        .from("COMMRESTRICTION")
+        .whereIfSet("COMMRESTRICTION.MEDIUM", pMedium)
+        .and("COMMRESTRICTION.STARTDATE", pStartDate, SqlBuilder.LESS_OR_EQUAL())
+        .and("COMMRESTRICTION.CONTACT_ID", newSelect("c1.CONTACTID").from("CONTACT", "c1")
+                                          .join("CONTACT", "c2.ORGANISATION_ID = c1.ORGANISATION_ID and c1.PERSON_ID is null", "c2")
+                                          .where("c2.CONTACTID = CONTACT.CONTACTID")
+        , SqlBuilder.IN());
+            
+    return firstLevel.toString() +") + ("+secondLevel.toString(); 
+}
+
 /**
  * object for handling of a single contact
  * provides static- and instance-functions
diff --git a/process/Organisation_lib/process.js b/process/Organisation_lib/process.js
index 5532a6817db..6a5b4e22bf0 100644
--- a/process/Organisation_lib/process.js
+++ b/process/Organisation_lib/process.js
@@ -236,3 +236,18 @@ OrgUtils.openOrgReport = function(pContactId)
 {
     neon.openContext("Organisation", "OrganisationReport_view", [pContactId], neon.OPERATINGSTATE_VIEW, null);
 }
+
+/**
+ * creates an subSql for resolving a org into one string of text
+ * useful for example in an displayValue-expression to resolave a references (which is chosen by Lookups)
+ * 
+ * @param {String} pRelationIdField fieldname for the CONTACTID-condition as TABLEALIAS.COLUMNALIAS;
+ * @return {String} a subsql (without bracets) that can be placed within an SQL
+ */
+OrgUtils.getResolvingDisplaySubSql = function(pRelationIdField)
+{
+    //TODO: verify if there is a better solution for the usage of this as a displayValueExpression --> automatic use of #TITLE | waiting for implementation
+    return newSelect("NAME").from("ORGANISATION")
+        .join("CONTACT", "ORGANISATIONID = ORGANISATION_ID")
+        .where("PERSON_ID is null").and("CONTACT.CONTACTID = "+ pRelationIdField).toString();
+}
-- 
GitLab


From 41e74c6d5f97cf055e56dfe1c0fa63b11caced09 Mon Sep 17 00:00:00 2001
From: Sebastian Listl <s.listl@adito.de>
Date: Tue, 1 Dec 2020 10:03:19 +0100
Subject: [PATCH 132/184] #1065278 Newsletter unsubscription workflow

---
 process/Attribute_lib/process.js              | 63 ++++++++++++-------
 .../SetAttribute_workflowService/process.js   | 25 ++++++--
 .../serviceTaskParameterProcess.js            |  1 +
 .../process.js                                |  6 +-
 4 files changed, 66 insertions(+), 29 deletions(-)

diff --git a/process/Attribute_lib/process.js b/process/Attribute_lib/process.js
index 3e43bcc979b..a5a3d2b7a68 100644
--- a/process/Attribute_lib/process.js
+++ b/process/Attribute_lib/process.js
@@ -1501,8 +1501,6 @@ function AttributeRelationQuery (pObjectRowId, pAttributeId, pObjectType)
     this._attributeTypes = null;
     this._includeFullAttributeName = false;
     this._includeDisplayValue = false;
-    
-    return this;
 }
 
 /**
@@ -1711,6 +1709,41 @@ AttributeRelationQuery.prototype.getAttributeCount = function ()
         .cell() || 0);
 }
 
+AttributeRelationQuery.prototype.getMaxCount = function ()
+{
+    if (!this._objectType || !this._rowId)
+        throw new Error("AttributeRelationQuery: Object type and row id are required");
+    if (!this._attributeIds || this._attributeIds.length !== 1)
+        throw new Error("AttributeRelationQuery: You have to specify a single attribute id");
+    
+    var attributeId = this._attributeIds[0];
+    
+    var maxCount = newSelect("MAX_COUNT")
+        .from("AB_ATTRIBUTEUSAGE")
+        .where("AB_ATTRIBUTEUSAGE.AB_ATTRIBUTE_ID", attributeId)
+        .and("AB_ATTRIBUTEUSAGE.OBJECT_TYPE", this._objectType)
+        .cell();
+    if (maxCount)
+        return Number(maxCount) || null;
+    return null;
+}
+
+AttributeRelationQuery.prototype.getMinCount = function ()
+{
+    if (!this._objectType || !this._rowId)
+        throw new Error("AttributeRelationQuery: Object type and row id are required");
+    if (!this._attributeIds || this._attributeIds.length !== 1)
+        throw new Error("AttributeRelationQuery: You have to specify a single attribute id");
+    
+    var attributeId = this._attributeIds[0];
+    
+    return Number(newSelect("MIN_COUNT")
+        .from("AB_ATTRIBUTEUSAGE")
+        .where("AB_ATTRIBUTEUSAGE.AB_ATTRIBUTE_ID", attributeId)
+        .and("AB_ATTRIBUTEUSAGE.OBJECT_TYPE", this._objectType)
+        .cell());
+}
+
 /**
  * Inserts a new attribute relation.
  * 
@@ -1734,17 +1767,8 @@ AttributeRelationQuery.prototype.insertAttribute = function (pValue, pOmitValida
     
     if (!pOmitValidation)
     {
-        var maxCount = newSelect("MAX_COUNT")
-            .from("AB_ATTRIBUTEUSAGE")
-            .where("AB_ATTRIBUTEUSAGE.AB_ATTRIBUTE_ID", attributeId)
-            .and("AB_ATTRIBUTEUSAGE.OBJECT_TYPE", this._objectType)
-            .arrayColumn();
-
-        if (maxCount.length == 0)
-            return false;
-
-        maxCount = maxCount[0];
-        if (maxCount && maxCount != 0)
+        var maxCount = this.getMaxCount();
+        if (maxCount)
         {
             let timesUsed = this.getAttributeCount();
             if (timesUsed >= maxCount)
@@ -1847,15 +1871,12 @@ AttributeRelation.prototype.deleteAttribute = function (pOmitValidation)
 {
     if (!pOmitValidation)
     {
-        var minCount = newSelect("MIN_COUNT")
-            .from("AB_ATTRIBUTEUSAGE")
-            .where("AB_ATTRIBUTEUSAGE.AB_ATTRIBUTE_ID", this.attributeId)
-            .and("AB_ATTRIBUTEUSAGE.OBJECT_TYPE", this.objectType)
-            .cell();
-
-        if (minCount && minCount != 0)
+        var attributeQuery = new AttributeRelationQuery(this.objectRowId, this.attributeId, this.objectType);
+        var minCount = attributeQuery.getMinCount();
+        
+        if (minCount)
         {
-            let timesUsed = new AttributeRelationQuery(this.objectRowId, this.attributeId, this.objectType).getAttributeCount();
+            let timesUsed = attributeQuery.getAttributeCount();
             if (timesUsed <= minCount)
                 return false;
         }
diff --git a/process/SetAttribute_workflowService/process.js b/process/SetAttribute_workflowService/process.js
index 394ef054248..b79ef56f644 100644
--- a/process/SetAttribute_workflowService/process.js
+++ b/process/SetAttribute_workflowService/process.js
@@ -1,3 +1,4 @@
+import("Util_lib");
 import("Sql_lib");
 import("Attribute_lib");
 import("system.result");
@@ -5,6 +6,7 @@ import("system.vars");
 
 var variables = JSON.parse(vars.get("$local.value"));
 
+var attributeValue = variables.attributeValue;
 var attributeId;
 if (variables.attributeName)
 {
@@ -19,10 +21,23 @@ else
 //attributeValueVariable -> instance variable to use for the attribute value
 if (variables.attributeValueVariable)
 {
-    var attributeValue = variables[variables.attributeValueVariable];
-    if (attributeValue !== null && attributeValue !== undefined && attributeValue !== "")
-        variables.attributeValue = attributeValue;
+    var attributeVal = variables[variables.attributeValueVariable];
+    if (attributeVal !== null && attributeVal !== undefined && attributeVal !== "")
+        attributeValue = attributeVal;
 }
 
-new AttributeRelationQuery(variables.attributeRowId || variables.targetId, attributeId, variables.attributeContext || variables.targetContext)
-    .insertAttribute(variables.attributeValue);
\ No newline at end of file
+var attributeQuery = new AttributeRelationQuery(variables.attributeRowId || variables.targetId, attributeId, 
+    variables.attributeContext || variables.targetContext);
+
+if (variables.isUpdate)
+{
+    var currentAttribute = attributeQuery.getSingleAttribute();
+    if (!currentAttribute)
+        attributeQuery.insertAttribute(attributeValue, true);
+    else
+        currentAttribute.updateAttribute(attributeValue)
+}
+else
+{
+    attributeQuery.insertAttribute(attributeValue);
+}
\ No newline at end of file
diff --git a/process/SetAttribute_workflowService/serviceTaskParameterProcess.js b/process/SetAttribute_workflowService/serviceTaskParameterProcess.js
index 443bc0179a0..0e8f8d8d042 100644
--- a/process/SetAttribute_workflowService/serviceTaskParameterProcess.js
+++ b/process/SetAttribute_workflowService/serviceTaskParameterProcess.js
@@ -79,5 +79,6 @@ if (currentValues.attributeId && currentValues.attributeId.value)
 }
 
 parameters.push(new WorkflowServiceTaskParameter("attributeValueVariable", "Value variable", WorkflowServiceTaskParameter.STRING()));
+parameters.push(new WorkflowServiceTaskParameter("isUpdate", "Overwrite", WorkflowServiceTaskParameter.BOOLEAN()));
 
 result.object(parameters);
\ No newline at end of file
diff --git a/process/SetCampaignStep_workflowService/process.js b/process/SetCampaignStep_workflowService/process.js
index 75067927861..127041b9957 100644
--- a/process/SetCampaignStep_workflowService/process.js
+++ b/process/SetCampaignStep_workflowService/process.js
@@ -16,12 +16,12 @@ var campaignStepQuery = newSelect(["CAMPAIGNPARTICIPANTID", "CAMPAIGNSTEP_ID"])
 
 var [participantId, currentCampaignStep] = campaignStepQuery.arrayRow();
     
-if (currentCampaignStep != campaignStepId)
+if (campaignStepId && currentCampaignStep != campaignStepId)
 {
-    if (!currentCampaignStep)
+    if (!participantId)
     {
         participantId = util.getNewUUID();
-        new SqlBuilder.insertFields({
+        new SqlBuilder().insertFields({
             "CAMPAIGNPARTICIPANTID": participantId,
             "CAMPAIGNSTEP_ID": campaignStepId,
             "CAMPAIGN_ID": campaignId,
-- 
GitLab


From 08a80ad696b2fc16e1740c9ff5c5ffe2ca5eb8c5 Mon Sep 17 00:00:00 2001
From: "a.schindlbeck" <a.schindlbeck@adito.de>
Date: Tue, 1 Dec 2020 10:44:02 +0100
Subject: [PATCH 133/184] #1069685 Favorite: Load Rows Permission Fix

---
 .../jditorecordcontainer/contentProcess.js          | 13 ++++++++++---
 1 file changed, 10 insertions(+), 3 deletions(-)

diff --git a/entity/Favorite_entity/recordcontainers/jditorecordcontainer/contentProcess.js b/entity/Favorite_entity/recordcontainers/jditorecordcontainer/contentProcess.js
index 3bf9fefa02c..eafabfcf64d 100644
--- a/entity/Favorite_entity/recordcontainers/jditorecordcontainer/contentProcess.js
+++ b/entity/Favorite_entity/recordcontainers/jditorecordcontainer/contentProcess.js
@@ -127,10 +127,17 @@ function buildFavorites(favos, objecttype)
     loadConfig.uids(ids);
     loadConfig.count(200);
     loadConfig.fields(["#CONTENTTITLE", "#IMAGE", "#UID"]);
-    var loadedRows = entities.getRows(loadConfig);
     
-    for(z = 0; z < loadedRows.length; z++)
-        getFavoriteWith(loadedRows[z], builtFavos, favos, loadedRows[z]["#UID"], objecttype);
+    try {
+        var loadedRows = entities.getRows(loadConfig);
+
+        for(z = 0; z < loadedRows.length; z++)
+            getFavoriteWith(loadedRows[z], builtFavos, favos, loadedRows[z]["#UID"], objecttype);
+
+    } catch(e)
+    {
+        //maybe a missing permission for entity
+    }
     
     return builtFavos;
 }
-- 
GitLab


From 783403d4763e761201252d81a2a29f3ea9d6daab Mon Sep 17 00:00:00 2001
From: Sebastian Listl <s.listl@adito.de>
Date: Tue, 1 Dec 2020 11:24:12 +0100
Subject: [PATCH 134/184] #1064788 odt table replacing fixed

---
 process/DocumentTemplate_lib/process.js | 25 ++++++++++++++-----------
 1 file changed, 14 insertions(+), 11 deletions(-)

diff --git a/process/DocumentTemplate_lib/process.js b/process/DocumentTemplate_lib/process.js
index 68621c5eef9..2f1507904e3 100644
--- a/process/DocumentTemplate_lib/process.js
+++ b/process/DocumentTemplate_lib/process.js
@@ -745,10 +745,10 @@ DocumentTemplate.prototype._getReplacedODT = function (pReplacements, pTableData
             var bodybegin = contentXml.indexOf("<office:body>");
             var bodyend =  contentXml.indexOf("</office:body>") + 14;
             
-            var bodyTemplate = contentXml.substring(bodybegin, bodyend);
+            var bodyTemplate = contentXml.slice(bodybegin, bodyend);
             var fullBody = "";  //body that contains all pages (required when the replacing is done for several contacts)
-            var beforeBody = contentXml.substring(0, bodybegin);
-            var afterBody = contentXml.substr(bodyend);
+            var beforeBody = contentXml.slice(0, bodybegin);
+            var afterBody = contentXml.slice(bodyend);
             
             for (let i = 0, l = pReplacements.length; i < l; i++)
             {
@@ -767,27 +767,30 @@ DocumentTemplate.prototype._getReplacedODT = function (pReplacements, pTableData
                 
                 
                 let tables = pTableData[i] || [];
-                let fromIndex = 0;
+                let tableEnd = 0;
                 for (let tblIndex = 0; tblIndex < tables.length; tblIndex++) //iterate over all tables in the document
                 {
                     let tableData = tables[tblIndex];
                     if (tableData && tableData.length > 0)
                     {
-                        fromIndex = currentBody.indexOf("</table:table>", fromIndex) + 14;
-                        if (fromIndex === -1) //stop if there is no table
+                        tableEnd = currentBody.indexOf("</table:table>", tableEnd) + 14;
+                        if (tableEnd === -1) //stop if there is no table
                             break;
                         
-                        let rowBegin = currentBody.lastIndexOf("<table:table-row", fromIndex);
+                        let rowBegin = currentBody.slice(0, tableEnd).lastIndexOf("<table:table-row");
                         let rowEnd =  currentBody.indexOf("</table:table-row>", rowBegin) + 18;
                         
-                        let afterTable = currentBody.substr(rowEnd);
-                        let tableRow = currentBody.substring(rowBegin, rowEnd);
-                        currentBody = currentBody.substring(0, rowBegin);
+                        let afterTable = currentBody.slice(rowEnd);
+                        let tableRow = currentBody.slice(rowBegin, rowEnd);
+                        tableEnd -= tableRow.length;
+                        currentBody = currentBody.slice(0, rowBegin);
                         
                         for (let rowIndex = 0; rowIndex < tableData.length; rowIndex++)
                         {
                             let tableRowData = tableData[rowIndex];
-                            currentBody += that._replaceText(tableRow, tableRowData);
+                            let replacedRow = that._replaceText(tableRow, tableRowData);
+                            currentBody += replacedRow;
+                            tableEnd += replacedRow.length;
                         }
                         currentBody += afterTable;
                     }
-- 
GitLab


From 26d401c111aa5b8a67f53574b5173ca3b5018e71 Mon Sep 17 00:00:00 2001
From: Simon Leipold <s.leipold@adito.de>
Date: Tue, 1 Dec 2020 11:51:32 +0100
Subject: [PATCH 135/184] [Projekt: Entwicklung - Neon][TicketNr.:
 1067337][Funktion um Childroles herauszufinden]

---
 .../recordcontainers/jdito/contentProcess.js  |  7 ++-
 entity/Role_entity/Role_entity.aod            | 45 +++++++++----------
 process/Permission_lib/process.js             | 15 +++++++
 3 files changed, 38 insertions(+), 29 deletions(-)

diff --git a/entity/RoleChildren_entity/recordcontainers/jdito/contentProcess.js b/entity/RoleChildren_entity/recordcontainers/jdito/contentProcess.js
index a76ad51dc5d..9a225fe5bc3 100644
--- a/entity/RoleChildren_entity/recordcontainers/jdito/contentProcess.js
+++ b/entity/RoleChildren_entity/recordcontainers/jdito/contentProcess.js
@@ -4,6 +4,8 @@ import("system.db");
 import("system.vars");
 import("system.result");
 import("system.util");
+import("Permission_lib");
+import("system.logging");
 
 var alias = SqlUtils.getSystemAlias();
 var selectedRoleName = vars.exists("$param.RoleId_param") && vars.get("$param.RoleId_param");
@@ -17,10 +19,7 @@ if (selectedRoleType == "" && selectedRoleName != "") {
 
 // roles can only be assigned to CUSTOM roles -> selected role has to be a viable CUSTOM role
 if (selectedRoleName && selectedRoleType == "CUSTOM") {
-    var childRoles = newSelect("ID, CHILD_ROLE", alias)
-        .from("ASYS_ROLES_CHILDREN")
-        .where("ASYS_ROLES_CHILDREN.PARENT_ROLE", selectedRoleName)
-        .table();
+    var childRoles = PermissionUtil.getChildRoles(selectedRoleName);
     
     for each (let childRole in childRoles) {
         children.push([childRole[0], childRole[1], selectedRoleName]);
diff --git a/entity/Role_entity/Role_entity.aod b/entity/Role_entity/Role_entity.aod
index 6bff89e164d..82bc56f08e9 100644
--- a/entity/Role_entity/Role_entity.aod
+++ b/entity/Role_entity/Role_entity.aod
@@ -46,29 +46,30 @@
         <entityName>PermissionDetail_entity</entityName>
         <fieldName>Permissions</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>PermissionOverviews</name>
       <children>
         <entityParameter>
           <name>RoleTitle_param</name>
+          <valueProcess>%aditoprj%/entity/Role_entity/entityfields/permissionoverviews/children/roletitle_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>PermissionOverviews</name>
       <dependency>
         <name>dependency</name>
         <entityName>PermissionOverview_entity</entityName>
         <fieldName>PermissionOverviews</fieldName>
       </dependency>
-      <children>
-        <entityParameter>
-          <name>RoleTitle_param</name>
-          <valueProcess>%aditoprj%/entity/Role_entity/entityfields/permissionoverviews/children/roletitle_param/valueProcess.js</valueProcess>
-        </entityParameter>
-      </children>
     </entityConsumer>
     <entityProvider>
       <name>Roles</name>
       <recordContainer>jDito</recordContainer>
+      <children>
+        <entityParameter>
+          <name>ExcludeRoles_param</name>
+          <expose v="false" />
+        </entityParameter>
+      </children>
       <dependencies>
         <entityDependency>
           <name>64d800d0-4db5-4b95-ab6a-9197b83cc09c</name>
@@ -89,12 +90,6 @@
           <isConsumer v="false" />
         </entityDependency>
       </dependencies>
-      <children>
-        <entityParameter>
-          <name>ExcludeRoles_param</name>
-          <expose v="false" />
-        </entityParameter>
-      </children>
     </entityProvider>
     <entityParameter>
       <name>ExcludeRoles_param</name>
@@ -132,11 +127,6 @@
     <entityConsumer>
       <name>RoleChildrens</name>
       <onValidation>%aditoprj%/entity/Role_entity/entityfields/rolechildrens/onValidation.js</onValidation>
-      <dependency>
-        <name>dependency</name>
-        <entityName>RoleChildren_entity</entityName>
-        <fieldName>RoleChildrens</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>RoleId_param</name>
@@ -147,6 +137,11 @@
           <valueProcess>%aditoprj%/entity/Role_entity/entityfields/rolechildrens/children/roletype_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>RoleChildren_entity</entityName>
+        <fieldName>RoleChildrens</fieldName>
+      </dependency>
     </entityConsumer>
     <entityActionField>
       <name>deleteEverythingLinkedToRole</name>
@@ -157,17 +152,17 @@
     </entityActionField>
     <entityConsumer>
       <name>RoleParents</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>RoleParent_entity</entityName>
-        <fieldName>RoleParents</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>RoleId_param</name>
           <valueProcess>%aditoprj%/entity/Role_entity/entityfields/roleparents/children/roleid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>RoleParent_entity</entityName>
+        <fieldName>RoleParents</fieldName>
+      </dependency>
     </entityConsumer>
     <entityProvider>
       <name>#PROVIDER_AGGREGATES</name>
diff --git a/process/Permission_lib/process.js b/process/Permission_lib/process.js
index fcb7a7086c7..9a4b05adcac 100644
--- a/process/Permission_lib/process.js
+++ b/process/Permission_lib/process.js
@@ -704,6 +704,21 @@ function PermissionUtil () {}
         }
         return false;
     }
+    
+    /**
+     * Returns all child role ids and names of the given role.
+     * 
+     * @param {String} pRoleName parent role name, mandatory
+     * 
+     * @result {String[]} array with ids and names of child roles
+     */
+    PermissionUtil.getChildRoles = function(pRoleName) {
+        // hierarchies where pRoleName is parent
+        return newSelect("ID, CHILD_ROLE", alias)
+        .from("ASYS_ROLES_CHILDREN")
+        .where("ASYS_ROLES_CHILDREN.PARENT_ROLE", pRoleName)
+        .table();
+    }
 
     /**
      * Delete all links to child roles of pRoleName.
-- 
GitLab


From 435ed00afec4d784762f211b99eb0b712cb8f096 Mon Sep 17 00:00:00 2001
From: Simon Leipold <s.leipold@adito.de>
Date: Tue, 1 Dec 2020 11:51:32 +0100
Subject: [PATCH 136/184] [Projekt: Entwicklung - Neon][TicketNr.:
 1067337][Funktion um Childroles herauszufinden]

---
 .../recordcontainers/jdito/contentProcess.js  |  7 ++-
 entity/Role_entity/Role_entity.aod            | 45 +++++++++----------
 process/Permission_lib/process.js             | 15 +++++++
 3 files changed, 38 insertions(+), 29 deletions(-)

diff --git a/entity/RoleChildren_entity/recordcontainers/jdito/contentProcess.js b/entity/RoleChildren_entity/recordcontainers/jdito/contentProcess.js
index a76ad51dc5d..9a225fe5bc3 100644
--- a/entity/RoleChildren_entity/recordcontainers/jdito/contentProcess.js
+++ b/entity/RoleChildren_entity/recordcontainers/jdito/contentProcess.js
@@ -4,6 +4,8 @@ import("system.db");
 import("system.vars");
 import("system.result");
 import("system.util");
+import("Permission_lib");
+import("system.logging");
 
 var alias = SqlUtils.getSystemAlias();
 var selectedRoleName = vars.exists("$param.RoleId_param") && vars.get("$param.RoleId_param");
@@ -17,10 +19,7 @@ if (selectedRoleType == "" && selectedRoleName != "") {
 
 // roles can only be assigned to CUSTOM roles -> selected role has to be a viable CUSTOM role
 if (selectedRoleName && selectedRoleType == "CUSTOM") {
-    var childRoles = newSelect("ID, CHILD_ROLE", alias)
-        .from("ASYS_ROLES_CHILDREN")
-        .where("ASYS_ROLES_CHILDREN.PARENT_ROLE", selectedRoleName)
-        .table();
+    var childRoles = PermissionUtil.getChildRoles(selectedRoleName);
     
     for each (let childRole in childRoles) {
         children.push([childRole[0], childRole[1], selectedRoleName]);
diff --git a/entity/Role_entity/Role_entity.aod b/entity/Role_entity/Role_entity.aod
index 6bff89e164d..82bc56f08e9 100644
--- a/entity/Role_entity/Role_entity.aod
+++ b/entity/Role_entity/Role_entity.aod
@@ -46,29 +46,30 @@
         <entityName>PermissionDetail_entity</entityName>
         <fieldName>Permissions</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>PermissionOverviews</name>
       <children>
         <entityParameter>
           <name>RoleTitle_param</name>
+          <valueProcess>%aditoprj%/entity/Role_entity/entityfields/permissionoverviews/children/roletitle_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>PermissionOverviews</name>
       <dependency>
         <name>dependency</name>
         <entityName>PermissionOverview_entity</entityName>
         <fieldName>PermissionOverviews</fieldName>
       </dependency>
-      <children>
-        <entityParameter>
-          <name>RoleTitle_param</name>
-          <valueProcess>%aditoprj%/entity/Role_entity/entityfields/permissionoverviews/children/roletitle_param/valueProcess.js</valueProcess>
-        </entityParameter>
-      </children>
     </entityConsumer>
     <entityProvider>
       <name>Roles</name>
       <recordContainer>jDito</recordContainer>
+      <children>
+        <entityParameter>
+          <name>ExcludeRoles_param</name>
+          <expose v="false" />
+        </entityParameter>
+      </children>
       <dependencies>
         <entityDependency>
           <name>64d800d0-4db5-4b95-ab6a-9197b83cc09c</name>
@@ -89,12 +90,6 @@
           <isConsumer v="false" />
         </entityDependency>
       </dependencies>
-      <children>
-        <entityParameter>
-          <name>ExcludeRoles_param</name>
-          <expose v="false" />
-        </entityParameter>
-      </children>
     </entityProvider>
     <entityParameter>
       <name>ExcludeRoles_param</name>
@@ -132,11 +127,6 @@
     <entityConsumer>
       <name>RoleChildrens</name>
       <onValidation>%aditoprj%/entity/Role_entity/entityfields/rolechildrens/onValidation.js</onValidation>
-      <dependency>
-        <name>dependency</name>
-        <entityName>RoleChildren_entity</entityName>
-        <fieldName>RoleChildrens</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>RoleId_param</name>
@@ -147,6 +137,11 @@
           <valueProcess>%aditoprj%/entity/Role_entity/entityfields/rolechildrens/children/roletype_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>RoleChildren_entity</entityName>
+        <fieldName>RoleChildrens</fieldName>
+      </dependency>
     </entityConsumer>
     <entityActionField>
       <name>deleteEverythingLinkedToRole</name>
@@ -157,17 +152,17 @@
     </entityActionField>
     <entityConsumer>
       <name>RoleParents</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>RoleParent_entity</entityName>
-        <fieldName>RoleParents</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>RoleId_param</name>
           <valueProcess>%aditoprj%/entity/Role_entity/entityfields/roleparents/children/roleid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>RoleParent_entity</entityName>
+        <fieldName>RoleParents</fieldName>
+      </dependency>
     </entityConsumer>
     <entityProvider>
       <name>#PROVIDER_AGGREGATES</name>
diff --git a/process/Permission_lib/process.js b/process/Permission_lib/process.js
index fcb7a7086c7..9a4b05adcac 100644
--- a/process/Permission_lib/process.js
+++ b/process/Permission_lib/process.js
@@ -704,6 +704,21 @@ function PermissionUtil () {}
         }
         return false;
     }
+    
+    /**
+     * Returns all child role ids and names of the given role.
+     * 
+     * @param {String} pRoleName parent role name, mandatory
+     * 
+     * @result {String[]} array with ids and names of child roles
+     */
+    PermissionUtil.getChildRoles = function(pRoleName) {
+        // hierarchies where pRoleName is parent
+        return newSelect("ID, CHILD_ROLE", alias)
+        .from("ASYS_ROLES_CHILDREN")
+        .where("ASYS_ROLES_CHILDREN.PARENT_ROLE", pRoleName)
+        .table();
+    }
 
     /**
      * Delete all links to child roles of pRoleName.
-- 
GitLab


From 3a35564e63439cc9b9d1fef3026927dc56cf6e69 Mon Sep 17 00:00:00 2001
From: "a.schindlbeck" <a.schindlbeck@adito.de>
Date: Tue, 1 Dec 2020 15:30:26 +0100
Subject: [PATCH 137/184] #1068648 Notifications:
 deleteMultipleContentsIfOrphan replaces deleteContentIfOrphan

---
 entity/Notification_entity/recordcontainers/db/onDBDelete.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/entity/Notification_entity/recordcontainers/db/onDBDelete.js b/entity/Notification_entity/recordcontainers/db/onDBDelete.js
index 633f720b18b..ecd41a4a7a4 100644
--- a/entity/Notification_entity/recordcontainers/db/onDBDelete.js
+++ b/entity/Notification_entity/recordcontainers/db/onDBDelete.js
@@ -4,4 +4,4 @@ import("system.notification");
 // Deletes notificationContents from its table, if there are no user notification left
 // Only AppointmentContents need to stay, because they would appear again after every deletion.
 if(vars.get("$field.TYPECODE") != "_____SYSTEM_NOTIFICATION_APPOINTMENT")
-    notification.deleteContentIfOrphan([vars.get("$field.CONTENTID")]);
\ No newline at end of file
+    notification.deleteMultipleContentsIfOrphan([vars.get("$field.CONTENTID")]);
\ No newline at end of file
-- 
GitLab


From 3d6573a35ac8ae61478f0a66e49df61d40ed4bd2 Mon Sep 17 00:00:00 2001
From: "a.schindlbeck" <a.schindlbeck@adito.de>
Date: Tue, 1 Dec 2020 15:32:07 +0100
Subject: [PATCH 138/184] Revert "#1068647 Favorite: Removed from
 contactmanagement"

This reverts commit 069b372314ea04b35b6c11adb67cf2c9c46789c2.
---
 .../_____SYSTEM_APPLICATION_NEON.aod                          | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/application/_____SYSTEM_APPLICATION_NEON/_____SYSTEM_APPLICATION_NEON.aod b/application/_____SYSTEM_APPLICATION_NEON/_____SYSTEM_APPLICATION_NEON.aod
index adb51ef4372..9e61fe62da3 100644
--- a/application/_____SYSTEM_APPLICATION_NEON/_____SYSTEM_APPLICATION_NEON.aod
+++ b/application/_____SYSTEM_APPLICATION_NEON/_____SYSTEM_APPLICATION_NEON.aod
@@ -38,6 +38,10 @@
                 <name>Task</name>
                 <kind v="10077" />
               </entityNode>
+              <entityNode>
+                <name>Favorite</name>
+                <kind v="10077" />
+              </entityNode>
             </childNodes>
           </entityNode>
         </childNodes>
-- 
GitLab


From aa482a872b0fd937fcd66fa5111318b873fb0faa Mon Sep 17 00:00:00 2001
From: "a.schindlbeck" <a.schindlbeck@adito.de>
Date: Tue, 1 Dec 2020 15:32:07 +0100
Subject: [PATCH 139/184] Revert "#1068647 Favorite: Removed from
 contactmanagement"

This reverts commit 069b372314ea04b35b6c11adb67cf2c9c46789c2.
---
 .../_____SYSTEM_APPLICATION_NEON.aod                          | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/application/_____SYSTEM_APPLICATION_NEON/_____SYSTEM_APPLICATION_NEON.aod b/application/_____SYSTEM_APPLICATION_NEON/_____SYSTEM_APPLICATION_NEON.aod
index adb51ef4372..9e61fe62da3 100644
--- a/application/_____SYSTEM_APPLICATION_NEON/_____SYSTEM_APPLICATION_NEON.aod
+++ b/application/_____SYSTEM_APPLICATION_NEON/_____SYSTEM_APPLICATION_NEON.aod
@@ -38,6 +38,10 @@
                 <name>Task</name>
                 <kind v="10077" />
               </entityNode>
+              <entityNode>
+                <name>Favorite</name>
+                <kind v="10077" />
+              </entityNode>
             </childNodes>
           </entityNode>
         </childNodes>
-- 
GitLab


From c31af093469d040fd8e92ab91a728616fa97d79b Mon Sep 17 00:00:00 2001
From: "a.schindlbeck" <a.schindlbeck@adito.de>
Date: Tue, 1 Dec 2020 15:30:26 +0100
Subject: [PATCH 140/184] #1068648 Notifications:
 deleteMultipleContentsIfOrphan replaces deleteContentIfOrphan

---
 entity/Notification_entity/recordcontainers/db/onDBDelete.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/entity/Notification_entity/recordcontainers/db/onDBDelete.js b/entity/Notification_entity/recordcontainers/db/onDBDelete.js
index 633f720b18b..ecd41a4a7a4 100644
--- a/entity/Notification_entity/recordcontainers/db/onDBDelete.js
+++ b/entity/Notification_entity/recordcontainers/db/onDBDelete.js
@@ -4,4 +4,4 @@ import("system.notification");
 // Deletes notificationContents from its table, if there are no user notification left
 // Only AppointmentContents need to stay, because they would appear again after every deletion.
 if(vars.get("$field.TYPECODE") != "_____SYSTEM_NOTIFICATION_APPOINTMENT")
-    notification.deleteContentIfOrphan([vars.get("$field.CONTENTID")]);
\ No newline at end of file
+    notification.deleteMultipleContentsIfOrphan([vars.get("$field.CONTENTID")]);
\ No newline at end of file
-- 
GitLab


From 9f1c22253613110d8e7dfe806dc2d46ee77448bd Mon Sep 17 00:00:00 2001
From: "a.schindlbeck" <a.schindlbeck@adito.de>
Date: Tue, 1 Dec 2020 10:44:02 +0100
Subject: [PATCH 141/184] #1069685 Favorite: Load Rows Permission Fix

---
 .../jditorecordcontainer/contentProcess.js          | 13 ++++++++++---
 1 file changed, 10 insertions(+), 3 deletions(-)

diff --git a/entity/Favorite_entity/recordcontainers/jditorecordcontainer/contentProcess.js b/entity/Favorite_entity/recordcontainers/jditorecordcontainer/contentProcess.js
index 3bf9fefa02c..eafabfcf64d 100644
--- a/entity/Favorite_entity/recordcontainers/jditorecordcontainer/contentProcess.js
+++ b/entity/Favorite_entity/recordcontainers/jditorecordcontainer/contentProcess.js
@@ -127,10 +127,17 @@ function buildFavorites(favos, objecttype)
     loadConfig.uids(ids);
     loadConfig.count(200);
     loadConfig.fields(["#CONTENTTITLE", "#IMAGE", "#UID"]);
-    var loadedRows = entities.getRows(loadConfig);
     
-    for(z = 0; z < loadedRows.length; z++)
-        getFavoriteWith(loadedRows[z], builtFavos, favos, loadedRows[z]["#UID"], objecttype);
+    try {
+        var loadedRows = entities.getRows(loadConfig);
+
+        for(z = 0; z < loadedRows.length; z++)
+            getFavoriteWith(loadedRows[z], builtFavos, favos, loadedRows[z]["#UID"], objecttype);
+
+    } catch(e)
+    {
+        //maybe a missing permission for entity
+    }
     
     return builtFavos;
 }
-- 
GitLab


From 0074002f15314b7ec36a99895f44a7c4771911a6 Mon Sep 17 00:00:00 2001
From: "a.schindlbeck" <a.schindlbeck@adito.de>
Date: Mon, 30 Nov 2020 16:48:15 +0100
Subject: [PATCH 142/184] #1067434 Notifications: adding subcategory on various
 .addNotification(...) calls

---
 process/buildSerialLetter_serverProcess/process.js | 2 +-
 process/importLead_serverProcess/process.js        | 2 +-
 process/sendBulkMail_serverProcess/process.js      | 2 +-
 3 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/process/buildSerialLetter_serverProcess/process.js b/process/buildSerialLetter_serverProcess/process.js
index 1d5cff1f394..b3210e860db 100644
--- a/process/buildSerialLetter_serverProcess/process.js
+++ b/process/buildSerialLetter_serverProcess/process.js
@@ -21,4 +21,4 @@ SingleBinaryUtils.set("SERIALLETTER", "SERIALLETTERFILE", letterId, document.con
 
 var message = translate.text("Download ready");
 var description = translate.withArguments("Serial letter \"%0\" can now be downloaded", [document.title]);
-notification.addNotification(util.getNewUUID(), text.encodeMS(["SerialLetter", letterId]), null, null, "DownloadReady", notification.PRIO_NORMAL, 2, notification.STATE_UNSEEN, [user], message, description);
\ No newline at end of file
+notification.addNotification(util.getNewUUID(), text.encodeMS(["SerialLetter", letterId]), null, null, "DownloadReady", null, notification.PRIO_NORMAL, 2, notification.STATE_UNSEEN, [user], message, description);
\ No newline at end of file
diff --git a/process/importLead_serverProcess/process.js b/process/importLead_serverProcess/process.js
index a24b084a933..35ac42b2b31 100644
--- a/process/importLead_serverProcess/process.js
+++ b/process/importLead_serverProcess/process.js
@@ -192,7 +192,7 @@ if(exeptions != "")//insert error document
 if (userId)// if there is an user - show a notification to this user when the import is complete
 {
     var description = translate.withArguments("%0 leads imported, %1 errors", [rows, errorCount]);
-    notification.addNotification(util.getNewUUID(), null, null, null, "LeadImport_Notification", notification.PRIO_NORMAL, 2, notification.STATE_UNSEEN, [userId], importName, description);
+    notification.addNotification(util.getNewUUID(), null, null, null, "LeadImport_Notification", null, notification.PRIO_NORMAL, 2, notification.STATE_UNSEEN, [userId], importName, description);
 }
 
 
diff --git a/process/sendBulkMail_serverProcess/process.js b/process/sendBulkMail_serverProcess/process.js
index 711120feb20..7ed237beffb 100644
--- a/process/sendBulkMail_serverProcess/process.js
+++ b/process/sendBulkMail_serverProcess/process.js
@@ -23,5 +23,5 @@ if (user && !testRecipients)
     var message = translate.withArguments("Bulk mail \"%0\" was sent!", [mailName]);
     var description = translate.withArguments("%0 mails sent sucessfully, %1 mails failed. Process took %2 s.", 
         [res.sucessful, res.failed, Math.round((datetime.date() - startTime) / datetime.ONE_SECOND)]);
-    notification.addNotification(util.getNewUUID(), null, null, null, "BulkMailSent", notification.PRIO_NORMAL, 2, notification.STATE_UNSEEN, [user], message, description);
+    notification.addNotification(util.getNewUUID(), null, null, null, "BulkMailSent", null, notification.PRIO_NORMAL, 2, notification.STATE_UNSEEN, [user], message, description);
 }
\ No newline at end of file
-- 
GitLab


From abb019f1efc94af60d3a8907999f41e54fd66e9e Mon Sep 17 00:00:00 2001
From: "a.schindlbeck" <a.schindlbeck@adito.de>
Date: Mon, 30 Nov 2020 16:18:18 +0100
Subject: [PATCH 143/184] #1067434 Notifications: Subcategory added

---
 .../create_asys_notificationcontents.xml      |  1 +
 .../_____SYSTEMALIAS/_____SYSTEMALIAS.aod     | 14 ++++++++++
 .../Notification_entity.aod                   | 26 +++++++++++++------
 .../NotificationFilter_view.aod               | 11 +++++++-
 4 files changed, 43 insertions(+), 9 deletions(-)

diff --git a/.liquibase/_____SYSTEMALIAS/basic/init/struct/create_asys_notificationcontents.xml b/.liquibase/_____SYSTEMALIAS/basic/init/struct/create_asys_notificationcontents.xml
index fb1ae2f5ee8..448a4c3063e 100644
--- a/.liquibase/_____SYSTEMALIAS/basic/init/struct/create_asys_notificationcontents.xml
+++ b/.liquibase/_____SYSTEMALIAS/basic/init/struct/create_asys_notificationcontents.xml
@@ -17,6 +17,7 @@
         <column name="RECIPIENTUSERIDS" type="CLOB"/>
         <column name="TYPECODE" type="VARCHAR(63)"/>
         <column name="VERSION" type="INTEGER"/>
+        <column name="SUBCATEGORY" type="VARCHAR(256)"/>
     </createTable>
     
     <createIndex indexName="idx_asysnoticontents_contid" tableName="ASYS_NOTIFICATIONCONTENTS">
diff --git a/aliasDefinition/_____SYSTEMALIAS/_____SYSTEMALIAS.aod b/aliasDefinition/_____SYSTEMALIAS/_____SYSTEMALIAS.aod
index 6f4f1b2dca5..9eaa60af5ab 100644
--- a/aliasDefinition/_____SYSTEMALIAS/_____SYSTEMALIAS.aod
+++ b/aliasDefinition/_____SYSTEMALIAS/_____SYSTEMALIAS.aod
@@ -1707,6 +1707,20 @@
                 <title></title>
                 <description></description>
               </entityFieldDb>
+              <entityFieldDb>
+                <name>SUBCATEGORY</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="12" />
+                <size v="256" />
+                <scale v="0" />
+                <notNull v="true" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
             </entityFields>
           </entityDb>
           <entityDb>
diff --git a/entity/Notification_entity/Notification_entity.aod b/entity/Notification_entity/Notification_entity.aod
index cf3203213ac..2668a0419e9 100644
--- a/entity/Notification_entity/Notification_entity.aod
+++ b/entity/Notification_entity/Notification_entity.aod
@@ -132,31 +132,31 @@
     </entityField>
     <entityConsumer>
       <name>StateKeywords</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>KeywordEntry_entity</entityName>
-        <fieldName>#PROVIDER</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
           <valueProcess>%aditoprj%/entity/Notification_entity/entityfields/statekeywords/children/containername_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>PrioKeywords</name>
       <dependency>
         <name>dependency</name>
         <entityName>KeywordEntry_entity</entityName>
         <fieldName>#PROVIDER</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>PrioKeywords</name>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
           <valueProcess>%aditoprj%/entity/Notification_entity/entityfields/priokeywords/children/containername_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>#PROVIDER</fieldName>
+      </dependency>
     </entityConsumer>
     <entityProvider>
       <name>#PROVIDER_AGGREGATES</name>
@@ -170,6 +170,10 @@
       <outputFormat>dd.MM.yyyy</outputFormat>
       <inputFormat>dd.MM.yyyy</inputFormat>
     </entityField>
+    <entityField>
+      <name>SUBCATEGORY</name>
+      <title>Subcategory</title>
+    </entityField>
   </entityFields>
   <recordContainers>
     <dbRecordContainer>
@@ -281,6 +285,12 @@
           <name>CREATEDAY.value</name>
           <recordfield>ASYS_NOTIFICATIONCONTENTS.CREATEDATE</recordfield>
         </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>SUBCATEGORY.value</name>
+          <recordfield>ASYS_NOTIFICATIONCONTENTS.SUBCATEGORY</recordfield>
+          <isFilterable v="true" />
+          <isLookupFilter v="true" />
+        </dbRecordFieldMapping>
       </recordFieldMappings>
     </dbRecordContainer>
   </recordContainers>
diff --git a/neonView/NotificationFilter_view/NotificationFilter_view.aod b/neonView/NotificationFilter_view/NotificationFilter_view.aod
index 26ee281b76c..6517c2f9eff 100644
--- a/neonView/NotificationFilter_view/NotificationFilter_view.aod
+++ b/neonView/NotificationFilter_view/NotificationFilter_view.aod
@@ -32,7 +32,7 @@
       <dateField>CREATEDAY</dateField>
       <titleField>CAPTION</titleField>
       <descriptionField>DESCRIPTION</descriptionField>
-      <subdescriptionField>CREATEDATE</subdescriptionField>
+      <subdescriptionField>SUBCATEGORY</subdescriptionField>
       <iconIdField>ICON</iconIdField>
       <additionalInfoField>STATE</additionalInfoField>
       <entityField>#ENTITY</entityField>
@@ -50,6 +50,7 @@
       <entityField>#ENTITY</entityField>
       <isEditable v="false" />
       <isSaveable v="false" />
+      <informationField>SUBCATEGORY</informationField>
       <columns>
         <neonTableColumn>
           <name>1cff3be1-523d-4a5a-b7d1-389d7cbb726f</name>
@@ -67,6 +68,10 @@
           <name>ff33a6c1-7ac6-4acd-a083-e56a36f89977</name>
           <entityField>DESCRIPTION</entityField>
         </neonTableColumn>
+        <neonTableColumn>
+          <name>0e3756eb-05f6-4ab2-a6e9-984f5215f542</name>
+          <entityField>SUBCATEGORY</entityField>
+        </neonTableColumn>
         <neonTableColumn>
           <name>5cb09de4-4413-41e5-8a7c-4970a3cf6a62</name>
           <entityField>STATE</entityField>
@@ -95,6 +100,10 @@
           <name>446c3d62-efa4-4f1a-85d4-e4f6a45019c7</name>
           <entityField>DESCRIPTION</entityField>
         </neonTreeTableColumn>
+        <neonTreeTableColumn>
+          <name>6caff937-2e67-4b28-b630-ae1dd5860f3b</name>
+          <entityField>SUBCATEGORY</entityField>
+        </neonTreeTableColumn>
         <neonTreeTableColumn>
           <name>4c82b79e-4c15-4298-bfbb-186c76fc5189</name>
           <entityField>STATE</entityField>
-- 
GitLab


From 05ee2ef97429becb7453aaf3e4b49299afd87674 Mon Sep 17 00:00:00 2001
From: Sebastian Listl <s.listl@adito.de>
Date: Tue, 1 Dec 2020 15:52:35 +0100
Subject: [PATCH 144/184] #1069305 Systemalias liquibase corrections

---
 .../init/struct/create_asys_aliasconfig.xml   |  5 +-
 .../struct/create_asys_calendarbackend.xml    | 29 +++++++
 .../init/struct/create_asys_calendarlink.xml  | 18 ++--
 .../struct/create_asys_collector_data.xml     |  3 +
 .../struct/create_asys_collector_tags.xml     | 11 ++-
 .../create_asys_dashletconfigurations.xml     | 18 ++--
 .../init/struct/create_asys_dashlets.xml      | 10 +--
 .../create_asys_notificationcontents.xml      |  8 +-
 .../init/struct/create_asys_notifications.xml |  2 +-
 .../init/struct/create_asys_recordgroup.xml   |  3 -
 .../basic/init/struct/create_asys_roles.xml   |  6 +-
 .../struct/create_asys_roles_children.xml     |  2 +-
 .../init/struct/create_asys_sequences.xml     |  3 +
 .../struct/create_asys_timers_serverruns.xml  |  2 +-
 .../basic/init/struct/create_asys_users.xml   | 69 ++++++++--------
 .../_____SYSTEMALIAS/_____SYSTEMALIAS.aod     | 82 +++++++++----------
 16 files changed, 157 insertions(+), 114 deletions(-)

diff --git a/.liquibase/_____SYSTEMALIAS/basic/init/struct/create_asys_aliasconfig.xml b/.liquibase/_____SYSTEMALIAS/basic/init/struct/create_asys_aliasconfig.xml
index 84b8857d8d5..8da963bc989 100644
--- a/.liquibase/_____SYSTEMALIAS/basic/init/struct/create_asys_aliasconfig.xml
+++ b/.liquibase/_____SYSTEMALIAS/basic/init/struct/create_asys_aliasconfig.xml
@@ -13,7 +13,7 @@
             <constraints nullable="false"/>
         </column>
         <column name="NAME" type="NVARCHAR(63)">
-            <constraints nullable="false"/>
+            <constraints nullable="false" unique="true"/>
         </column>
         <column name="TITLE" type="NVARCHAR(63)"/>
         <column name="DESCRIPTION" type="NVARCHAR(255)"/>
@@ -26,5 +26,8 @@
     <createIndex tableName="ASYS_ALIASCONFIG" indexName="IDX_ASYS_ALIASCONFIG_SERVERID">
         <column name="SERVERID"/>
     </createIndex>
+    <createIndex tableName="ASYS_ALIASCONFIG" indexName="IDX_ASYS_ALIASCONFIG_ALIASID">
+        <column name="ALIASID"/>
+    </createIndex>
 </changeSet>
 </databaseChangeLog>
\ No newline at end of file
diff --git a/.liquibase/_____SYSTEMALIAS/basic/init/struct/create_asys_calendarbackend.xml b/.liquibase/_____SYSTEMALIAS/basic/init/struct/create_asys_calendarbackend.xml
index e037c40bd68..939fc396efe 100644
--- a/.liquibase/_____SYSTEMALIAS/basic/init/struct/create_asys_calendarbackend.xml
+++ b/.liquibase/_____SYSTEMALIAS/basic/init/struct/create_asys_calendarbackend.xml
@@ -23,5 +23,34 @@
         <column name="TRANSP" type="CHAR(1)"/>
         <column name="VCOMPONENT" type="CLOB"/>
     </createTable>
+    <createIndex tableName="ASYS_CALENDARBACKEND" indexName="IDX_CALENDARBACK_ENTRYTYPE">
+        <column name="ENTRYTYPE"/>
+    </createIndex>
+    <createIndex tableName="ASYS_CALENDARBACKEND" indexName="IDX_CALENDARBACK_STARTTIME">
+        <column name="STARTTIME"/>
+    </createIndex>
+    <createIndex tableName="ASYS_CALENDARBACKEND" indexName="IDX_CALENDARBACK_STATUS">
+        <column name="STATUS"/>
+    </createIndex>
+    <createIndex tableName="ASYS_CALENDARBACKEND" indexName="IDX_CALENDARBACK_ENDTIME">
+        <column name="ENDTIME"/>
+    </createIndex>
+    <createIndex tableName="ASYS_CALENDARBACKEND" indexName="IDX_CALENDARBACK_MAILBOX">
+        <column name="MAILBOX"/>
+    </createIndex>
+    <createIndex tableName="ASYS_CALENDARBACKEND" indexName="IDX_CALENDARBACK_LASTMOD">
+        <column name="LASTMODIFIED"/>
+    </createIndex>
+    <createIndex tableName="ASYS_CALENDARBACKEND" indexName="IDX_CALENDARBACK_DTSTART">
+        <column name="DTSTART"/>
+    </createIndex>
+    <createIndex tableName="ASYS_CALENDARBACKEND" indexName="IDX_CALENDARBACK_DTEND">
+        <column name="DTEND"/>
+    </createIndex>
+</changeSet>
+<changeSet id="4810b7c6-50f6-44f6-a0b5-83a3adfae6f7" author="s.listl" dbms="!mssql,!mysql,!mariadb">
+    <createIndex tableName="ASYS_CALENDARBACKEND" indexName="IDX_CALENDARBACK_ELEMENTUID">
+        <column name="ELEMENTUID"/>
+    </createIndex>
 </changeSet>
 </databaseChangeLog>
diff --git a/.liquibase/_____SYSTEMALIAS/basic/init/struct/create_asys_calendarlink.xml b/.liquibase/_____SYSTEMALIAS/basic/init/struct/create_asys_calendarlink.xml
index 4e0f73a0b10..a9535f3f3ac 100644
--- a/.liquibase/_____SYSTEMALIAS/basic/init/struct/create_asys_calendarlink.xml
+++ b/.liquibase/_____SYSTEMALIAS/basic/init/struct/create_asys_calendarlink.xml
@@ -2,19 +2,25 @@
 <databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd">
 <changeSet author="a.schindlbeck" id="c31ed111-b98d-46b6-b7bf-845420624e28">
     <createTable tableName="ASYS_CALENDARLINK">
-        <column name="DBALIAS" type="VARCHAR(127)"/>
-        <column name="DBID" type="VARCHAR(191)">
-            <constraints primaryKey="true" primaryKeyName="PK_ASYS_CALENDARLINK_DBID"/>
+        <column name="ID" type="CHAR(36)">
+            <constraints nullable="false" primaryKey="true" primaryKeyName="PK_ASYS_CALENDARLINK_ID"/>
         </column>
+        <column name="DBALIAS" type="VARCHAR(127)"/>
+        <column name="DBID" type="VARCHAR(1023)"/>
         <column name="DBIDCOLUMN" type="VARCHAR(127)"/>
         <column name="DBTABLENAME" type="VARCHAR(127)"/>
         <column name="ENTRYID" type="VARCHAR(512)"/>
         <column name="ENTRYSTORE" type="VARCHAR(255)"/>
         <column name="FRAME" type="VARCHAR(1023)"/>
-        <column name="ID" type="CHAR(36)">
-            <constraints nullable="false"/>
-        </column>
         <column name="TITLE" type="VARCHAR(2000)"/>
     </createTable>
 </changeSet>
+<changeSet id="bf6546b4-67e3-4996-bcd9-77a534127b01" author="s.listl" dbms="!mssql,!mysql,!mariadb">
+    <createIndex tableName="ASYS_CALENDARLINK" indexName="IDX_ASYS_CALENDARLINK_ENTRYID">
+        <column name="ENTRYID"/>
+    </createIndex>
+    <createIndex tableName="ASYS_CALENDARLINK" indexName="IDX_ASYS_CALENDARLINK_DBID">
+        <column name="DBID"/>
+    </createIndex>
+</changeSet>
 </databaseChangeLog>
diff --git a/.liquibase/_____SYSTEMALIAS/basic/init/struct/create_asys_collector_data.xml b/.liquibase/_____SYSTEMALIAS/basic/init/struct/create_asys_collector_data.xml
index 5f8ddc0ed26..6fcc0199332 100644
--- a/.liquibase/_____SYSTEMALIAS/basic/init/struct/create_asys_collector_data.xml
+++ b/.liquibase/_____SYSTEMALIAS/basic/init/struct/create_asys_collector_data.xml
@@ -10,5 +10,8 @@
             <column name="PARENTID" type="CHAR(63)"/>
             <column name="METRICS" type="CLOB"/>
         </createTable>
+        <createIndex tableName="ASYS_COLLECTOR_DATA" indexName="IDX_COLLECTORDATA_TIMECOLLECT">
+            <column name="TIMECOLLECTED"/>
+        </createIndex>
     </changeSet>
 </databaseChangeLog>
\ No newline at end of file
diff --git a/.liquibase/_____SYSTEMALIAS/basic/init/struct/create_asys_collector_tags.xml b/.liquibase/_____SYSTEMALIAS/basic/init/struct/create_asys_collector_tags.xml
index 1fcaf740d8a..133aff97c34 100644
--- a/.liquibase/_____SYSTEMALIAS/basic/init/struct/create_asys_collector_tags.xml
+++ b/.liquibase/_____SYSTEMALIAS/basic/init/struct/create_asys_collector_tags.xml
@@ -3,10 +3,15 @@
     <changeSet author="j.hoermann" id="4fe7309e-e131-4f3d-8e65-fb399fcd7090">
         <createTable tableName="ASYS_COLLECTOR_TAGS">
             <column name="COLLECTORDATAID" type="CHAR(63)">
-                <constraints primaryKey="true" primaryKeyName="PK_ASYS_COLLECTOR_TAGS_ID"/>
+                <constraints nullable="false"/>
+            </column>
+            <column name="TAGNAME" type="VARCHAR(63)">
+                <constraints nullable="false"/>
+            </column>
+            <column name="TAGVALUE" type="VARCHAR(63)">
+                <constraints nullable="false"/>
             </column>
-            <column name="TAGNAME" type="VARCHAR(63)"/>
-            <column name="TAGVALUE" type="VARCHAR(63)"/>
         </createTable>
+        <addPrimaryKey tableName="ASYS_COLLECTOR_TAGS" columnNames="COLLECTORDATAID, TAGNAME, TAGVALUE" constraintName="PK_ASYS_COLLECTOR_TAGS"/>
     </changeSet>
 </databaseChangeLog>
\ No newline at end of file
diff --git a/.liquibase/_____SYSTEMALIAS/basic/init/struct/create_asys_dashletconfigurations.xml b/.liquibase/_____SYSTEMALIAS/basic/init/struct/create_asys_dashletconfigurations.xml
index 6ecf84fd630..369537c606f 100644
--- a/.liquibase/_____SYSTEMALIAS/basic/init/struct/create_asys_dashletconfigurations.xml
+++ b/.liquibase/_____SYSTEMALIAS/basic/init/struct/create_asys_dashletconfigurations.xml
@@ -2,22 +2,22 @@
 <databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd">
 <changeSet author="j.hoermann" id="a510b5e9-e599-4503-8bcd-4ef2465f56c6">
     <createTable tableName="ASYS_DASHLETCONFIGURATIONS">
-        <column name="ID" type="CHAR(36)">
+        <column name="ID" type="CHAR(63)">
             <constraints primaryKey="true" primaryKeyName="PK_ASYS_ASYS_DASHLETCONFIGURATIONS_ID"/>
         </column>
-        <column name="CATEGORIES" type="CLOB"/>
+        <column name="NAME" type="VARCHAR(63)"/>
+        <column name="TITLE" type="VARCHAR(63)"/>
+        <column name="VIEW_NAME" type="VARCHAR(512)"/>
         <column name="DESCRIPTION" type="VARCHAR(512)"/>
-        <column name="FRAGMENT" type="VARCHAR(1023)"/>
-        <column name="FRAGMENT_CUSTOMIZABLE" type="INTEGER"/>
         <column name="ICON" type="VARCHAR(63)"/>
-        <column name="NAME" type="VARCHAR(63)"/>
-        <column name="PARAMETERS" type="CLOB"/>
+        <column name="FRAGMENT" type="VARCHAR(1023)"/>
         <column name="PREVIEW" type="CLOB"/>
-        <column name="REQUIRES_CONFIGURATION" type="INTEGER"/>
         <column name="SINGLETON" type="INTEGER"/>
+        <column name="FRAGMENT_CUSTOMIZABLE" type="INTEGER"/>
+        <column name="REQUIRES_CONFIGURATION" type="INTEGER"/>
+        <column name="CATEGORIES" type="CLOB"/>
+        <column name="PARAMETERS" type="CLOB"/>
         <column name="STORE_ROLES" type="VARCHAR(1023)"/>
-        <column name="TITLE" type="VARCHAR(63)"/>
-        <column name="VIEW_NAME" type="VARCHAR(63)"/>
     </createTable>
 </changeSet>
 </databaseChangeLog>
\ No newline at end of file
diff --git a/.liquibase/_____SYSTEMALIAS/basic/init/struct/create_asys_dashlets.xml b/.liquibase/_____SYSTEMALIAS/basic/init/struct/create_asys_dashlets.xml
index f5ea6eb9088..5b3d2d5a60b 100644
--- a/.liquibase/_____SYSTEMALIAS/basic/init/struct/create_asys_dashlets.xml
+++ b/.liquibase/_____SYSTEMALIAS/basic/init/struct/create_asys_dashlets.xml
@@ -2,18 +2,18 @@
 <databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd">
 <changeSet author="j.hoermann" id="dbdfa16c-8e62-4fc6-8d79-2a14a0d863c5">
     <createTable tableName="ASYS_DASHLETS">
-        <column name="ID" type="CHAR(36)">
+        <column name="ID" type="CHAR(63)">
             <constraints primaryKey="true" primaryKeyName="PK_ASYS_DASHLETS_ID"/>
         </column>
-        <column name="COLSPAN" type="INTEGER"/>
-        <column name="CONFIGURATION_ID" type="VARCHAR(63)"/>
         <column name="DASHBOARD_ID" type="VARCHAR(63)"/>
+        <column name="CONFIGURATION_ID" type="VARCHAR(63)"/>
+        <column name="TITLE" type="VARCHAR(63)"/>
         <column name="FRAGMENT" type="VARCHAR(1023)"/>
         <column name="PARAMETERS" type="CLOB"/>
-        <column name="ROWSPAN" type="INTEGER"/>
-        <column name="TITLE" type="VARCHAR(63)"/>
         <column name="X" type="INTEGER"/>
         <column name="Y" type="INTEGER"/>
+        <column name="COLSPAN" type="INTEGER"/>
+        <column name="ROWSPAN" type="INTEGER"/>
     </createTable>
 </changeSet>
 </databaseChangeLog>
\ No newline at end of file
diff --git a/.liquibase/_____SYSTEMALIAS/basic/init/struct/create_asys_notificationcontents.xml b/.liquibase/_____SYSTEMALIAS/basic/init/struct/create_asys_notificationcontents.xml
index 448a4c3063e..e77db9a1c3d 100644
--- a/.liquibase/_____SYSTEMALIAS/basic/init/struct/create_asys_notificationcontents.xml
+++ b/.liquibase/_____SYSTEMALIAS/basic/init/struct/create_asys_notificationcontents.xml
@@ -7,11 +7,11 @@
         </column>
         <column name="BACKPACK" type="CLOB"/>
         <column name="CAPTION" type="VARCHAR(512)"/>
-        <column name="CREATEDATE" type="TIMESTAMP"/>
-        <column name="DELETEDATE" type="TIMESTAMP"/>
+        <column name="CREATEDATE" type="DATETIME"/>
         <column name="DESCRIPTION" type="VARCHAR(1023)"/>
         <column name="FORCEDPRIORITY" type="VARCHAR(15)"/>
         <column name="ICON_INFO" type="VARCHAR(1023)"/>
+        <column name="DELETEDATE" type="DATETIME"/>
         <column name="LINK_INFO" type="VARCHAR(1023)"/>
         <column name="ORIGINATORNAME" type="VARCHAR(63)"/>
         <column name="RECIPIENTUSERIDS" type="CLOB"/>
@@ -19,9 +19,5 @@
         <column name="VERSION" type="INTEGER"/>
         <column name="SUBCATEGORY" type="VARCHAR(256)"/>
     </createTable>
-    
-    <createIndex indexName="idx_asysnoticontents_contid" tableName="ASYS_NOTIFICATIONCONTENTS">
-        <column name="CONTENTID"/>
-    </createIndex>
 </changeSet>
 </databaseChangeLog>
\ No newline at end of file
diff --git a/.liquibase/_____SYSTEMALIAS/basic/init/struct/create_asys_notifications.xml b/.liquibase/_____SYSTEMALIAS/basic/init/struct/create_asys_notifications.xml
index f3ff1e9ae1c..5ecd347c487 100644
--- a/.liquibase/_____SYSTEMALIAS/basic/init/struct/create_asys_notifications.xml
+++ b/.liquibase/_____SYSTEMALIAS/basic/init/struct/create_asys_notifications.xml
@@ -6,7 +6,7 @@
             <constraints primaryKey="true" primaryKeyName="PK_ASYS_NOTIFICATIONS_ID"/>
         </column>
         <column name="CONTENTID" type="CHAR(36)"/>
-        <column name="STATE" type="VARCHAR(15)"/>
+        <column name="STATE" type="VARCHAR(16)"/>
         <column name="USERID" type="VARCHAR(63)"/>
         <column name="RESOLVEDPRIORITY" type="VARCHAR(15)"/>
     </createTable>
diff --git a/.liquibase/_____SYSTEMALIAS/basic/init/struct/create_asys_recordgroup.xml b/.liquibase/_____SYSTEMALIAS/basic/init/struct/create_asys_recordgroup.xml
index c8fae3a479e..35ddb98cb9b 100644
--- a/.liquibase/_____SYSTEMALIAS/basic/init/struct/create_asys_recordgroup.xml
+++ b/.liquibase/_____SYSTEMALIAS/basic/init/struct/create_asys_recordgroup.xml
@@ -9,9 +9,6 @@
         <column name="TITLE" type="VARCHAR(256)"/>
         <column name="GROUP_TYPE" type="VARCHAR(64)"/>
     </createTable>
-    <createIndex indexName="idx_asysrecordgroup_id" tableName="ASYS_RECORDGROUP">
-        <column name="ID"/>
-    </createIndex>
     <createIndex indexName="idx_asysrecordgroup_userid" tableName="ASYS_RECORDGROUP">
         <column name="USER_ID"/>
     </createIndex>
diff --git a/.liquibase/_____SYSTEMALIAS/basic/init/struct/create_asys_roles.xml b/.liquibase/_____SYSTEMALIAS/basic/init/struct/create_asys_roles.xml
index 4ea33eeb65b..9f54423b467 100644
--- a/.liquibase/_____SYSTEMALIAS/basic/init/struct/create_asys_roles.xml
+++ b/.liquibase/_____SYSTEMALIAS/basic/init/struct/create_asys_roles.xml
@@ -5,10 +5,10 @@
             <column name="ROLENAME" type="VARCHAR(63)">
                 <constraints primaryKey="true" primaryKeyName="PK_ASYS_ROLES_ID"/>
             </column>
-            <column name="ROLETITLE" type="VARCHAR(63)"/>
+            <column name="ROLETITLE" type="NVARCHAR(63)"/>
             <column name="ROLEDESCRIPTION" type="VARCHAR(255)"/>
-            <column name="ASSIGNABLE" type="INTEGER"/>
-            <column name="CHILDREN" type="CLOB"/>
+            <column name="ASSIGNABLE" type="TINYINT"/>
+            <column name="CHILDREN" type="NCLOB"/>
         </createTable>
     </changeSet>
 </databaseChangeLog>
\ No newline at end of file
diff --git a/.liquibase/_____SYSTEMALIAS/basic/init/struct/create_asys_roles_children.xml b/.liquibase/_____SYSTEMALIAS/basic/init/struct/create_asys_roles_children.xml
index 9dd2c8b7d6d..83fff19bd00 100644
--- a/.liquibase/_____SYSTEMALIAS/basic/init/struct/create_asys_roles_children.xml
+++ b/.liquibase/_____SYSTEMALIAS/basic/init/struct/create_asys_roles_children.xml
@@ -6,7 +6,7 @@
                 <constraints primaryKey="true" primaryKeyName="PK_ASYS_ROLES_CHILDREN_ID"/>
             </column>
             <column name="PARENT_ROLE" type="VARCHAR(63)"/>
-            <column name="CHILD_ROLE" type="VARCHAR(63)"/>
+            <column name="CHILD_ROLE" type="NVARCHAR(63)"/>
         </createTable>
     </changeSet>
 </databaseChangeLog>
\ No newline at end of file
diff --git a/.liquibase/_____SYSTEMALIAS/basic/init/struct/create_asys_sequences.xml b/.liquibase/_____SYSTEMALIAS/basic/init/struct/create_asys_sequences.xml
index 4e001416ea8..ec0459b46b9 100644
--- a/.liquibase/_____SYSTEMALIAS/basic/init/struct/create_asys_sequences.xml
+++ b/.liquibase/_____SYSTEMALIAS/basic/init/struct/create_asys_sequences.xml
@@ -13,5 +13,8 @@
             <constraints nullable="false"/>
         </column>
     </createTable>
+    <createIndex tableName="ASYS_SEQUENCES" indexName="IDX_ASYS_SEQUENCES_ID_GUID">
+        <column name="ID_GUID"/>
+    </createIndex>
 </changeSet>
 </databaseChangeLog>
diff --git a/.liquibase/_____SYSTEMALIAS/basic/init/struct/create_asys_timers_serverruns.xml b/.liquibase/_____SYSTEMALIAS/basic/init/struct/create_asys_timers_serverruns.xml
index fea891c550d..fb86982a286 100644
--- a/.liquibase/_____SYSTEMALIAS/basic/init/struct/create_asys_timers_serverruns.xml
+++ b/.liquibase/_____SYSTEMALIAS/basic/init/struct/create_asys_timers_serverruns.xml
@@ -13,6 +13,6 @@
     </createTable>
     <addPrimaryKey tableName="ASYS_TIMERS_SERVERRUNS"
                    columnNames="SERVERID, TIMERID"
-                   constraintName="PK_ASYS_TIMERS_SERVERRUNS_SERVERID_TIMERID"/>
+                   constraintName="PK_ASYS_TIMERS_SERVERRUNS"/>
 </changeSet>
 </databaseChangeLog>
\ No newline at end of file
diff --git a/.liquibase/_____SYSTEMALIAS/basic/init/struct/create_asys_users.xml b/.liquibase/_____SYSTEMALIAS/basic/init/struct/create_asys_users.xml
index c8d26b66bf9..c2064247aa6 100644
--- a/.liquibase/_____SYSTEMALIAS/basic/init/struct/create_asys_users.xml
+++ b/.liquibase/_____SYSTEMALIAS/basic/init/struct/create_asys_users.xml
@@ -1,37 +1,38 @@
 <?xml version="1.1" encoding="UTF-8" standalone="no"?>
 <databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd">
-<changeSet author="j.hoermann" id="77e5fc97-1e89-45e2-a00f-29742d28ab7e">
-    <createTable tableName="ASYS_USERS">
-        <column name="ID" type="CHAR(36)">
-            <constraints primaryKey="true" primaryKeyName="PK_ASYS_USERS_ID"/>
-        </column>
-        <column name="DATE_NEW" type="DATETIME"/>
-        <column name="DATE_EDIT" type="DATETIME"/>
-        <column name="NAME" type="NVARCHAR(63)">
-            <constraints nullable="false"/>
-        </column>
-        <column name="GROUPID" type="NVARCHAR(63)">
-            <constraints nullable="false"/>
-        </column>
-        <column name="PROPKEY" type="VARCHAR(1024)">
-            <constraints nullable="false"/>
-        </column>
-        <column name="PROPVAL" type="VARCHAR(1024)"/>
-        <column name="PROPVAL_CLOB" type="CLOB"/>
-    </createTable>
-    <createIndex indexName="IDX_ASYS_USERS_NAME" tableName="ASYS_USERS">
-        <column name="NAME"/>
-    </createIndex>
-    <createIndex indexName="idx_asysusers_groupid" tableName="ASYS_USERS">
-        <column name="GROUPID"/>
-    </createIndex>
-    <!--normally a index should be created for propkey and propval but this causes due to it's length problems on some dbms-->
-    <!--<createIndex indexName="idx_asysusers_propkey" tableName="ASYS_USERS">
-        <column name="PROPKEY"/>
-    </createIndex>
-    <createIndex indexName="idx_asysusers_propval" tableName="ASYS_USERS">
-        <column name="PROPVAL"/>
-    </createIndex>-->
-    
-</changeSet>
+    <changeSet author="j.hoermann" id="77e5fc97-1e89-45e2-a00f-29742d28ab7e">
+        <createTable tableName="ASYS_USERS">
+            <column name="ID" type="CHAR(36)">
+                <constraints primaryKey="true" primaryKeyName="PK_ASYS_USERS_ID"/>
+            </column>
+            <column name="DATE_NEW" type="DATETIME"/>
+            <column name="DATE_EDIT" type="DATETIME"/>
+            <column name="NAME" type="NVARCHAR(63)">
+                <constraints nullable="false"/>
+            </column>
+            <column name="GROUPID" type="NVARCHAR(63)">
+                <constraints nullable="false"/>
+            </column>
+            <column name="PROPKEY" type="VARCHAR(1024)">
+                <constraints nullable="false"/>
+            </column>
+            <column name="PROPVAL" type="VARCHAR(1024)"/>
+            <column name="PROPVAL_CLOB" type="CLOB"/>
+        </createTable>
+        <createIndex indexName="IDX_ASYS_USERS_NAME" tableName="ASYS_USERS">
+            <column name="NAME"/>
+        </createIndex>
+        <createIndex indexName="idx_asysusers_groupid" tableName="ASYS_USERS">
+            <column name="GROUPID"/>
+        </createIndex>
+    </changeSet>
+    <changeSet id="4d1dc8cd-2bca-4501-9458-9178287a4f38" author="s.listl" dbms="!mssql,!mysql,!mariadb">
+        <!--index can't be created on all dbms because of size restrictions-->
+        <createIndex indexName="idx_asysusers_propkey" tableName="ASYS_USERS">
+            <column name="PROPKEY"/>
+        </createIndex>
+        <createIndex indexName="idx_asysusers_propval" tableName="ASYS_USERS">
+            <column name="PROPVAL"/>
+        </createIndex>
+    </changeSet>
 </databaseChangeLog>
\ No newline at end of file
diff --git a/aliasDefinition/_____SYSTEMALIAS/_____SYSTEMALIAS.aod b/aliasDefinition/_____SYSTEMALIAS/_____SYSTEMALIAS.aod
index 9eaa60af5ab..6407da1b96a 100644
--- a/aliasDefinition/_____SYSTEMALIAS/_____SYSTEMALIAS.aod
+++ b/aliasDefinition/_____SYSTEMALIAS/_____SYSTEMALIAS.aod
@@ -101,7 +101,7 @@
                 <scale v="0" />
                 <notNull v="true" />
                 <isUnique v="false" />
-                <index v="false" />
+                <index v="true" />
                 <title></title>
                 <description></description>
               </entityFieldDb>
@@ -174,7 +174,7 @@
                 <scale v="0" />
                 <notNull v="false" />
                 <isUnique v="false" />
-                <index v="false" />
+                <index v="true" />
                 <title></title>
                 <description></description>
               </entityFieldDb>
@@ -477,7 +477,7 @@
                 <scale v="9" />
                 <notNull v="false" />
                 <isUnique v="false" />
-                <index v="false" />
+                <index v="true" />
                 <title></title>
                 <description></description>
               </entityFieldDb>
@@ -490,7 +490,7 @@
                 <scale v="9" />
                 <notNull v="false" />
                 <isUnique v="false" />
-                <index v="false" />
+                <index v="true" />
                 <title></title>
                 <description></description>
               </entityFieldDb>
@@ -503,7 +503,7 @@
                 <scale v="0" />
                 <notNull v="false" />
                 <isUnique v="false" />
-                <index v="false" />
+                <index v="true" />
                 <title></title>
                 <description></description>
               </entityFieldDb>
@@ -516,7 +516,7 @@
                 <scale v="9" />
                 <notNull v="false" />
                 <isUnique v="false" />
-                <index v="false" />
+                <index v="true" />
                 <title></title>
                 <description></description>
               </entityFieldDb>
@@ -529,7 +529,7 @@
                 <scale v="0" />
                 <notNull v="false" />
                 <isUnique v="false" />
-                <index v="false" />
+                <index v="true" />
                 <title></title>
                 <description></description>
               </entityFieldDb>
@@ -568,7 +568,7 @@
                 <scale v="9" />
                 <notNull v="false" />
                 <isUnique v="false" />
-                <index v="false" />
+                <index v="true" />
                 <title></title>
                 <description></description>
               </entityFieldDb>
@@ -581,7 +581,7 @@
                 <scale v="0" />
                 <notNull v="false" />
                 <isUnique v="false" />
-                <index v="false" />
+                <index v="true" />
                 <title></title>
                 <description></description>
               </entityFieldDb>
@@ -620,7 +620,7 @@
                 <scale v="9" />
                 <notNull v="false" />
                 <isUnique v="false" />
-                <index v="false" />
+                <index v="true" />
                 <title></title>
                 <description></description>
               </entityFieldDb>
@@ -633,7 +633,7 @@
                 <scale v="0" />
                 <notNull v="false" />
                 <isUnique v="false" />
-                <index v="false" />
+                <index v="true" />
                 <title></title>
                 <description></description>
               </entityFieldDb>
@@ -700,12 +700,12 @@
               <entityFieldDb>
                 <name>DBID</name>
                 <dbName></dbName>
-                <primaryKey v="true" />
+                <primaryKey v="false" />
                 <columnType v="12" />
-                <size v="191" />
+                <size v="1023" />
                 <scale v="0" />
-                <notNull v="true" />
-                <isUnique v="true" />
+                <notNull v="false" />
+                <isUnique v="false" />
                 <index v="true" />
                 <title></title>
                 <description></description>
@@ -745,7 +745,7 @@
                 <scale v="0" />
                 <notNull v="false" />
                 <isUnique v="false" />
-                <index v="false" />
+                <index v="true" />
                 <title></title>
                 <description></description>
               </entityFieldDb>
@@ -778,13 +778,13 @@
               <entityFieldDb>
                 <name>ID</name>
                 <dbName></dbName>
-                <primaryKey v="false" />
+                <primaryKey v="true" />
                 <columnType v="1" />
                 <size v="36" />
                 <scale v="0" />
                 <notNull v="true" />
-                <isUnique v="false" />
-                <index v="false" />
+                <isUnique v="true" />
+                <index v="true" />
                 <title></title>
                 <description></description>
               </entityFieldDb>
@@ -883,7 +883,7 @@
                 <scale v="0" />
                 <notNull v="true" />
                 <isUnique v="false" />
-                <index v="false" />
+                <index v="true" />
                 <title></title>
                 <description></description>
               </entityFieldDb>
@@ -896,7 +896,7 @@
                 <scale v="0" />
                 <notNull v="false" />
                 <isUnique v="false" />
-                <index v="false" />
+                <index v="true" />
                 <title></title>
                 <description></description>
               </entityFieldDb>
@@ -930,7 +930,7 @@
                 <scale v="0" />
                 <notNull v="false" />
                 <isUnique v="false" />
-                <index v="false" />
+                <index v="true" />
                 <title></title>
                 <description></description>
               </entityFieldDb>
@@ -964,8 +964,8 @@
                 <name>DESCRIPTION</name>
                 <dbName></dbName>
                 <primaryKey v="false" />
-                <columnType v="2005" />
-                <size v="2147483647" />
+                <columnType v="12" />
+                <size v="255" />
                 <scale v="0" />
                 <notNull v="false" />
                 <isUnique v="false" />
@@ -1020,8 +1020,8 @@
                 <size v="63" />
                 <scale v="0" />
                 <notNull v="true" />
-                <isUnique v="false" />
-                <index v="false" />
+                <isUnique v="true" />
+                <index v="true" />
                 <title></title>
                 <description></description>
               </entityFieldDb>
@@ -1034,7 +1034,7 @@
                 <scale v="0" />
                 <notNull v="false" />
                 <isUnique v="false" />
-                <index v="false" />
+                <index v="true" />
                 <title></title>
                 <description></description>
               </entityFieldDb>
@@ -1142,7 +1142,7 @@
                 <dbName></dbName>
                 <primaryKey v="false" />
                 <columnType v="12" />
-                <size v="15" />
+                <size v="16" />
                 <scale v="0" />
                 <notNull v="false" />
                 <isUnique v="false" />
@@ -1242,7 +1242,7 @@
                 <dbName></dbName>
                 <primaryKey v="true" />
                 <columnType v="1" />
-                <size v="36" />
+                <size v="63" />
                 <scale v="0" />
                 <notNull v="true" />
                 <isUnique v="true" />
@@ -1393,7 +1393,7 @@
                 <dbName></dbName>
                 <primaryKey v="true" />
                 <columnType v="1" />
-                <size v="36" />
+                <size v="63" />
                 <scale v="0" />
                 <notNull v="true" />
                 <isUnique v="true" />
@@ -1497,7 +1497,7 @@
                 <dbName></dbName>
                 <primaryKey v="false" />
                 <columnType v="12" />
-                <size v="63" />
+                <size v="512" />
                 <scale v="0" />
                 <notNull v="false" />
                 <isUnique v="false" />
@@ -1714,7 +1714,7 @@
                 <columnType v="12" />
                 <size v="256" />
                 <scale v="0" />
-                <notNull v="true" />
+                <notNull v="false" />
                 <isUnique v="false" />
                 <index v="false" />
                 <documentation></documentation>
@@ -2063,8 +2063,8 @@
                 <name>ASSIGNABLE</name>
                 <dbName></dbName>
                 <primaryKey v="false" />
-                <columnType v="4" />
-                <size v="10" />
+                <columnType v="5" />
+                <size v="5" />
                 <scale v="0" />
                 <notNull v="false" />
                 <isUnique v="false" />
@@ -2318,7 +2318,7 @@
                 <scale v="9" />
                 <notNull v="false" />
                 <isUnique v="false" />
-                <index v="false" />
+                <index v="true" />
                 <documentation></documentation>
                 <title></title>
                 <description></description>
@@ -2629,8 +2629,8 @@
                 <size v="63" />
                 <scale v="0" />
                 <notNull v="true" />
-                <isUnique v="true" />
-                <index v="true" />
+                <isUnique v="false" />
+                <index v="false" />
                 <documentation></documentation>
                 <title></title>
                 <description></description>
@@ -2638,11 +2638,11 @@
               <entityFieldDb>
                 <name>TAGNAME</name>
                 <dbName></dbName>
-                <primaryKey v="false" />
+                <primaryKey v="true" />
                 <columnType v="12" />
                 <size v="63" />
                 <scale v="0" />
-                <notNull v="false" />
+                <notNull v="true" />
                 <isUnique v="false" />
                 <index v="false" />
                 <documentation></documentation>
@@ -2652,11 +2652,11 @@
               <entityFieldDb>
                 <name>TAGVALUE</name>
                 <dbName></dbName>
-                <primaryKey v="false" />
+                <primaryKey v="true" />
                 <columnType v="12" />
                 <size v="63" />
                 <scale v="0" />
-                <notNull v="false" />
+                <notNull v="true" />
                 <isUnique v="false" />
                 <index v="false" />
                 <documentation></documentation>
-- 
GitLab


From 0ace142c793e8cd34a14c8b9b656c458de3c29ee Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Alexander=20V=C3=B6gl?= <a.voegl@adito.de>
Date: Tue, 1 Dec 2020 15:06:57 +0000
Subject: [PATCH 145/184] =?UTF-8?q?refactor=20displayValueProcess=20[Proje?=
 =?UTF-8?q?kt:=20Entwicklung=20-=20xRM][TicketNr.:=201069724][Anrede=20kan?=
 =?UTF-8?q?n=20in=20der=20gro=C3=9Fen=20Edit=20View=20nicht=20bearbeitet?=
 =?UTF-8?q?=20werden]?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 entity/Person_entity/Person_entity.aod                    | 1 +
 .../entityfields/salutation/displayValueProcess.js        | 5 +++++
 .../entityfields/title/displayValueProcess.js             | 8 ++------
 3 files changed, 8 insertions(+), 6 deletions(-)
 create mode 100644 entity/Person_entity/entityfields/salutation/displayValueProcess.js

diff --git a/entity/Person_entity/Person_entity.aod b/entity/Person_entity/Person_entity.aod
index 92985df6633..ccb951171b0 100644
--- a/entity/Person_entity/Person_entity.aod
+++ b/entity/Person_entity/Person_entity.aod
@@ -62,6 +62,7 @@
       <title>Salutation</title>
       <consumer>Salutations</consumer>
       <mandatory v="true" />
+      <displayValueProcess>%aditoprj%/entity/Person_entity/entityfields/salutation/displayValueProcess.js</displayValueProcess>
     </entityField>
     <entityField>
       <name>TITLE</name>
diff --git a/entity/Person_entity/entityfields/salutation/displayValueProcess.js b/entity/Person_entity/entityfields/salutation/displayValueProcess.js
new file mode 100644
index 00000000000..275e5fb9a51
--- /dev/null
+++ b/entity/Person_entity/entityfields/salutation/displayValueProcess.js
@@ -0,0 +1,5 @@
+import("system.vars");
+import("system.result");
+
+if(vars.get("$field.SALUTATION"))
+    result.string(vars.get("$field.SALUTATION"));
\ No newline at end of file
diff --git a/entity/Person_entity/entityfields/title/displayValueProcess.js b/entity/Person_entity/entityfields/title/displayValueProcess.js
index 3682b56b29c..9023d1aa7e5 100644
--- a/entity/Person_entity/entityfields/title/displayValueProcess.js
+++ b/entity/Person_entity/entityfields/title/displayValueProcess.js
@@ -1,9 +1,5 @@
 import("system.result");
-import("system.neon");
 import("system.vars");
 
-if((vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW || vars.get("$sys.recordstate") == neon.OPERATINGSTATE_EDIT))
-{
-    if (!vars.get("$field.TITLE"))
-        result.string("")
-}
\ No newline at end of file
+if (vars.get("$field.TITLE"))
+    result.string(vars.get("$field.TITLE"));
-- 
GitLab


From 8081b6efca4754f6139712d05247c122af94e204 Mon Sep 17 00:00:00 2001
From: Sebastian Listl <s.listl@adito.de>
Date: Tue, 1 Dec 2020 16:37:34 +0100
Subject: [PATCH 146/184] Provider documentation added

---
 entity/Attribute_entity/Attribute_entity.aod  | 154 +++++++++---------
 .../attributegroups/documentation.adoc        |   3 +
 .../specificattribute/documentation.adoc      |   4 +
 .../AuditLogHistory_entity.aod                |   1 +
 .../AuditLogHistory_entity/documentation.adoc |   3 +
 .../WorkflowDefinition_entity.aod             |  51 +++---
 .../workflowversions/documentation.adoc       |   4 +
 .../WorkflowInstanceHistory_entity.aod        |  11 +-
 .../documentation.adoc                        |   3 +
 .../WorkflowInstance_entity.aod               |  51 +++---
 .../instancesofworkflow/documentation.adoc    |   3 +
 .../WorkflowLauncher_entity.aod               |  11 +-
 .../documentation.adoc                        |   3 +
 .../WorkflowSignal_entity.aod                 |  21 +--
 .../documentation.adoc                        |   3 +
 15 files changed, 180 insertions(+), 146 deletions(-)
 create mode 100644 entity/Attribute_entity/entityfields/attributegroups/documentation.adoc
 create mode 100644 entity/Attribute_entity/entityfields/specificattribute/documentation.adoc
 create mode 100644 entity/AuditLogHistory_entity/documentation.adoc
 create mode 100644 entity/WorkflowDefinition_entity/entityfields/workflowversions/documentation.adoc
 create mode 100644 entity/WorkflowInstanceHistory_entity/entityfields/historyforworkflowinstance/documentation.adoc
 create mode 100644 entity/WorkflowInstance_entity/entityfields/instancesofworkflow/documentation.adoc
 create mode 100644 entity/WorkflowLauncher_entity/documentation.adoc
 create mode 100644 entity/WorkflowSignal_entity/entityfields/processdefinitionsignals/documentation.adoc

diff --git a/entity/Attribute_entity/Attribute_entity.aod b/entity/Attribute_entity/Attribute_entity.aod
index f85aaaa9515..76187e39273 100644
--- a/entity/Attribute_entity/Attribute_entity.aod
+++ b/entity/Attribute_entity/Attribute_entity.aod
@@ -61,11 +61,6 @@
       <name>AttributeUsages</name>
       <refreshParent v="true" />
       <stateProcess>%aditoprj%/entity/Attribute_entity/entityfields/attributeusages/stateProcess.js</stateProcess>
-      <dependency>
-        <name>dependency</name>
-        <entityName>AttributeUsage_entity</entityName>
-        <fieldName>SpecificAttribute</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>AttributeId_param</name>
@@ -81,6 +76,11 @@
           <valueProcess>%aditoprj%/entity/Attribute_entity/entityfields/attributeusages/children/disablemincount_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>AttributeUsage_entity</entityName>
+        <fieldName>SpecificAttribute</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>ATTRIBUTE_ACTIVE</name>
@@ -92,11 +92,6 @@
     </entityField>
     <entityConsumer>
       <name>KeywordAttributeTypes</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>KeywordEntry_entity</entityName>
-        <fieldName>SpecificContainerKeywords</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
@@ -108,6 +103,11 @@
           <valueProcess>%aditoprj%/entity/Attribute_entity/entityfields/keywordattributetypes/children/whitelistids_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>SpecificContainerKeywords</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>DROPDOWNDEFINITION</name>
@@ -131,6 +131,34 @@
     <entityProvider>
       <name>SpecificAttribute</name>
       <lookupIdfield>UID</lookupIdfield>
+      <documentation>%aditoprj%/entity/Attribute_entity/entityfields/specificattribute/documentation.adoc</documentation>
+      <children>
+        <entityParameter>
+          <name>ObjectType_param</name>
+          <expose v="true" />
+        </entityParameter>
+        <entityParameter>
+          <name>FilteredAttributeIds_param</name>
+          <expose v="true" />
+        </entityParameter>
+        <entityParameter>
+          <name>DisplaySimpleName_param</name>
+          <valueProcess>%aditoprj%/entity/Attribute_entity/entityfields/specificattribute/children/displaysimplename_param/valueProcess.js</valueProcess>
+          <expose v="false" />
+        </entityParameter>
+        <entityParameter>
+          <name>ChildId_param</name>
+          <expose v="false" />
+        </entityParameter>
+        <entityParameter>
+          <name>ChildType_param</name>
+          <expose v="false" />
+        </entityParameter>
+        <entityParameter>
+          <name>ParentId_param</name>
+          <description>parent id, this is used for filtering by the parent in the content process</description>
+        </entityParameter>
+      </children>
       <dependencies>
         <entityDependency>
           <name>ba3b4d47-7385-49df-bf61-54c99f5b2c81</name>
@@ -163,33 +191,6 @@
           <isConsumer v="false" />
         </entityDependency>
       </dependencies>
-      <children>
-        <entityParameter>
-          <name>ObjectType_param</name>
-          <expose v="true" />
-        </entityParameter>
-        <entityParameter>
-          <name>FilteredAttributeIds_param</name>
-          <expose v="true" />
-        </entityParameter>
-        <entityParameter>
-          <name>DisplaySimpleName_param</name>
-          <valueProcess>%aditoprj%/entity/Attribute_entity/entityfields/specificattribute/children/displaysimplename_param/valueProcess.js</valueProcess>
-          <expose v="false" />
-        </entityParameter>
-        <entityParameter>
-          <name>ChildId_param</name>
-          <expose v="false" />
-        </entityParameter>
-        <entityParameter>
-          <name>ChildType_param</name>
-          <expose v="false" />
-        </entityParameter>
-        <entityParameter>
-          <name>ParentId_param</name>
-          <description>parent id, this is used for filtering by the parent in the content process</description>
-        </entityParameter>
-      </children>
     </entityProvider>
     <entityField>
       <name>FULL_ATTRIBUTE_NAME</name>
@@ -214,6 +215,7 @@
     </entityField>
     <entityProvider>
       <name>AttributeGroups</name>
+      <documentation>%aditoprj%/entity/Attribute_entity/entityfields/attributegroups/documentation.adoc</documentation>
       <children>
         <entityParameter>
           <name>ThemeObjectRowId_param</name>
@@ -240,11 +242,6 @@
     <entityConsumer>
       <name>AttributeGroup</name>
       <description>Used for the selection of the parent attribute</description>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Attribute_entity</entityName>
-        <fieldName>AttributeGroups</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ChildId_param</name>
@@ -259,6 +256,11 @@
           <valueProcess>%aditoprj%/entity/Attribute_entity/entityfields/attributegroup/children/displaysimplename_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Attribute_entity</entityName>
+        <fieldName>AttributeGroups</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>ICON</name>
@@ -309,11 +311,6 @@
     </entityField>
     <entityConsumer>
       <name>Contexts</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Context_entity</entityName>
-        <fieldName>Exclusive</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>Blacklist_param</name>
@@ -324,6 +321,11 @@
           <valueProcess>%aditoprj%/entity/Attribute_entity/entityfields/contexts/children/invertblacklist_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Context_entity</entityName>
+        <fieldName>Exclusive</fieldName>
+      </dependency>
     </entityConsumer>
     <entityActionGroup>
       <name>AttributeActions</name>
@@ -355,14 +357,6 @@
     </entityActionField>
     <entityProvider>
       <name>ThemeProvider</name>
-      <dependencies>
-        <entityDependency>
-          <name>6e314038-62de-4f0c-b89a-92f029c10933</name>
-          <entityName>Activity_entity</entityName>
-          <fieldName>ActivityAtrributes</fieldName>
-          <isConsumer v="false" />
-        </entityDependency>
-      </dependencies>
       <children>
         <entityParameter>
           <name>AttributeCount_param</name>
@@ -381,6 +375,14 @@
           <expose v="false" />
         </entityParameter>
       </children>
+      <dependencies>
+        <entityDependency>
+          <name>6e314038-62de-4f0c-b89a-92f029c10933</name>
+          <entityName>Activity_entity</entityName>
+          <fieldName>ActivityAtrributes</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+      </dependencies>
     </entityProvider>
     <entityParameter>
       <name>ParentId_param</name>
@@ -397,14 +399,6 @@
       <sortingField>SORTING</sortingField>
       <documentation>%aditoprj%/entity/Attribute_entity/entityfields/attributechildren/documentation.adoc</documentation>
       <titlePlural>Child Attributes</titlePlural>
-      <dependencies>
-        <entityDependency>
-          <name>80023321-1954-483f-a4be-b7207557c068</name>
-          <entityName>Attribute_entity</entityName>
-          <fieldName>ChildAttributes</fieldName>
-          <isConsumer v="false" />
-        </entityDependency>
-      </dependencies>
       <children>
         <entityParameter>
           <name>ChildId_param</name>
@@ -444,16 +438,19 @@
           <mandatory v="true" />
         </entityParameter>
       </children>
+      <dependencies>
+        <entityDependency>
+          <name>80023321-1954-483f-a4be-b7207557c068</name>
+          <entityName>Attribute_entity</entityName>
+          <fieldName>ChildAttributes</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+      </dependencies>
     </entityProvider>
     <entityConsumer>
       <name>ChildAttributes</name>
       <refreshParent v="true" />
       <stateProcess>%aditoprj%/entity/Attribute_entity/entityfields/childattributes/stateProcess.js</stateProcess>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Attribute_entity</entityName>
-        <fieldName>AttributeChildren</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>DisplaySimpleName_param</name>
@@ -468,6 +465,11 @@
           <valueProcess>%aditoprj%/entity/Attribute_entity/entityfields/childattributes/children/parenttype_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Attribute_entity</entityName>
+        <fieldName>AttributeChildren</fieldName>
+      </dependency>
     </entityConsumer>
     <entityParameter>
       <name>GetOnlyFirstLevelChildren_param</name>
@@ -483,14 +485,6 @@
     </entityProvider>
     <entityProvider>
       <name>SpecificFilterAttributes</name>
-      <dependencies>
-        <entityDependency>
-          <name>9b2b5f2e-229d-4a10-a54f-cbf77aafe512</name>
-          <entityName>AttributeRelation_entity</entityName>
-          <fieldName>SpecificFilterAttributes</fieldName>
-          <isConsumer v="false" />
-        </entityDependency>
-      </dependencies>
       <children>
         <entityParameter>
           <name>DisplaySimpleName_param</name>
@@ -501,6 +495,14 @@
           <expose v="false" />
         </entityParameter>
       </children>
+      <dependencies>
+        <entityDependency>
+          <name>9b2b5f2e-229d-4a10-a54f-cbf77aafe512</name>
+          <entityName>AttributeRelation_entity</entityName>
+          <fieldName>SpecificFilterAttributes</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+      </dependencies>
     </entityProvider>
   </entityFields>
   <recordContainers>
diff --git a/entity/Attribute_entity/entityfields/attributegroups/documentation.adoc b/entity/Attribute_entity/entityfields/attributegroups/documentation.adoc
new file mode 100644
index 00000000000..6af9c11f0f7
--- /dev/null
+++ b/entity/Attribute_entity/entityfields/attributegroups/documentation.adoc
@@ -0,0 +1,3 @@
+= AttributeGroups
+
+This provider provides only attribute groups, it is used for the selection of an attribute parent.
\ No newline at end of file
diff --git a/entity/Attribute_entity/entityfields/specificattribute/documentation.adoc b/entity/Attribute_entity/entityfields/specificattribute/documentation.adoc
new file mode 100644
index 00000000000..5084132f04b
--- /dev/null
+++ b/entity/Attribute_entity/entityfields/specificattribute/documentation.adoc
@@ -0,0 +1,4 @@
+= SpecificAttribute
+
+This provider is used for selecting an attribute, for example to create an attribute relation in AttributeRelation_entity.
+The attributes are usually filtered by the ObjectType_param parameter to show only attributes that can be used in a specific context.
\ No newline at end of file
diff --git a/entity/AuditLogHistory_entity/AuditLogHistory_entity.aod b/entity/AuditLogHistory_entity/AuditLogHistory_entity.aod
index 26336d2da24..2ed69d3a313 100644
--- a/entity/AuditLogHistory_entity/AuditLogHistory_entity.aod
+++ b/entity/AuditLogHistory_entity/AuditLogHistory_entity.aod
@@ -2,6 +2,7 @@
 <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>AuditLogHistory_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
+  <documentation>%aditoprj%/entity/AuditLogHistory_entity/documentation.adoc</documentation>
   <icon>VAADIN:LINES_LIST</icon>
   <title>Audit Log</title>
   <grantCreate v="false" />
diff --git a/entity/AuditLogHistory_entity/documentation.adoc b/entity/AuditLogHistory_entity/documentation.adoc
new file mode 100644
index 00000000000..2c0a2a12eb8
--- /dev/null
+++ b/entity/AuditLogHistory_entity/documentation.adoc
@@ -0,0 +1,3 @@
+= AuditLogHistory_entity
+
+This is an entity for loading all log history entries from all contexts.
\ No newline at end of file
diff --git a/entity/WorkflowDefinition_entity/WorkflowDefinition_entity.aod b/entity/WorkflowDefinition_entity/WorkflowDefinition_entity.aod
index ab10357478f..b523e8b8d09 100644
--- a/entity/WorkflowDefinition_entity/WorkflowDefinition_entity.aod
+++ b/entity/WorkflowDefinition_entity/WorkflowDefinition_entity.aod
@@ -77,17 +77,17 @@
     <entityConsumer>
       <name>Instances</name>
       <selectionMode>MULTI</selectionMode>
-      <dependency>
-        <name>dependency</name>
-        <entityName>WorkflowInstance_entity</entityName>
-        <fieldName>InstancesOfWorkflow</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>WorkflowDefinitionKey_param</name>
           <valueProcess>%aditoprj%/entity/WorkflowDefinition_entity/entityfields/instances/children/workflowdefinitionkey_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>WorkflowInstance_entity</entityName>
+        <fieldName>InstancesOfWorkflow</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>KEY</name>
@@ -135,11 +135,6 @@
     </entityParameter>
     <entityConsumer>
       <name>OtherVersions</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>WorkflowDefinition_entity</entityName>
-        <fieldName>WorkflowVersions</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ProcessDefinitionKey_param</name>
@@ -150,9 +145,15 @@
           <valueProcess>%aditoprj%/entity/WorkflowDefinition_entity/entityfields/otherversions/children/currentversion_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>WorkflowDefinition_entity</entityName>
+        <fieldName>WorkflowVersions</fieldName>
+      </dependency>
     </entityConsumer>
     <entityProvider>
       <name>WorkflowVersions</name>
+      <documentation>%aditoprj%/entity/WorkflowDefinition_entity/entityfields/workflowversions/documentation.adoc</documentation>
       <titlePlural>Other versions</titlePlural>
       <children>
         <entityParameter>
@@ -171,17 +172,17 @@
     </entityField>
     <entityConsumer>
       <name>StartConfigs</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>WorkflowStartConfig_entity</entityName>
-        <fieldName>StartConfig</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ProcessDefinitionKey_param</name>
           <valueProcess>%aditoprj%/entity/WorkflowDefinition_entity/entityfields/startconfigs/children/processdefinitionkey_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>WorkflowStartConfig_entity</entityName>
+        <fieldName>StartConfig</fieldName>
+      </dependency>
     </entityConsumer>
     <entityParameter>
       <name>Context_param</name>
@@ -195,11 +196,6 @@
     </entityActionField>
     <entityConsumer>
       <name>Signals</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>WorkflowSignal_entity</entityName>
-        <fieldName>ProcessDefinitionSignals</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ProcessDefinitionId_param</name>
@@ -210,6 +206,11 @@
           <valueProcess>%aditoprj%/entity/WorkflowDefinition_entity/entityfields/signals/children/processdefinitionkey_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>WorkflowSignal_entity</entityName>
+        <fieldName>ProcessDefinitionSignals</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>VERSION_TITLE</name>
@@ -231,17 +232,17 @@
     </entityField>
     <entityConsumer>
       <name>CategoryKeyword</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>KeywordEntry_entity</entityName>
-        <fieldName>SpecificContainerKeywords</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
           <valueProcess>%aditoprj%/entity/WorkflowDefinition_entity/entityfields/categorykeyword/children/containername_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>SpecificContainerKeywords</fieldName>
+      </dependency>
     </entityConsumer>
     <entityProvider>
       <name>#PROVIDER_AGGREGATES</name>
diff --git a/entity/WorkflowDefinition_entity/entityfields/workflowversions/documentation.adoc b/entity/WorkflowDefinition_entity/entityfields/workflowversions/documentation.adoc
new file mode 100644
index 00000000000..3ea3eb5f375
--- /dev/null
+++ b/entity/WorkflowDefinition_entity/entityfields/workflowversions/documentation.adoc
@@ -0,0 +1,4 @@
+= WorkflowVersions
+
+Loads all other versions of a workflow definition to show the version history. For that, the process key (ProcessDefinitionKey_param) is required and
+the CurrentVersion_param can be used for excluding the currently opened version from the list.
\ No newline at end of file
diff --git a/entity/WorkflowInstanceHistory_entity/WorkflowInstanceHistory_entity.aod b/entity/WorkflowInstanceHistory_entity/WorkflowInstanceHistory_entity.aod
index 8c35ddbe8c3..4b33d427532 100644
--- a/entity/WorkflowInstanceHistory_entity/WorkflowInstanceHistory_entity.aod
+++ b/entity/WorkflowInstanceHistory_entity/WorkflowInstanceHistory_entity.aod
@@ -51,6 +51,7 @@
       <name>HistoryForWorkflowInstance</name>
       <targetContextField>TARGET_CONTEXT</targetContextField>
       <targetIdField>TASK_ID</targetIdField>
+      <documentation>%aditoprj%/entity/WorkflowInstanceHistory_entity/entityfields/historyforworkflowinstance/documentation.adoc</documentation>
       <titlePlural>History</titlePlural>
       <dependencies>
         <entityDependency>
@@ -77,17 +78,17 @@
     </entityField>
     <entityConsumer>
       <name>ActivityTypeKeyword</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>KeywordEntry_entity</entityName>
-        <fieldName>SpecificContainerKeywords</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
           <valueProcess>%aditoprj%/entity/WorkflowInstanceHistory_entity/entityfields/activitytypekeyword/children/containername_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>SpecificContainerKeywords</fieldName>
+      </dependency>
     </entityConsumer>
     <entityProvider>
       <name>#PROVIDER_AGGREGATES</name>
diff --git a/entity/WorkflowInstanceHistory_entity/entityfields/historyforworkflowinstance/documentation.adoc b/entity/WorkflowInstanceHistory_entity/entityfields/historyforworkflowinstance/documentation.adoc
new file mode 100644
index 00000000000..8e0c3662b76
--- /dev/null
+++ b/entity/WorkflowInstanceHistory_entity/entityfields/historyforworkflowinstance/documentation.adoc
@@ -0,0 +1,3 @@
+= HistoryForWorkflowInstance
+
+Provides a history of the given workflow instance. This includes all the finished activities and tasks of that workflow.
\ No newline at end of file
diff --git a/entity/WorkflowInstance_entity/WorkflowInstance_entity.aod b/entity/WorkflowInstance_entity/WorkflowInstance_entity.aod
index 566506952d1..baf0056902e 100644
--- a/entity/WorkflowInstance_entity/WorkflowInstance_entity.aod
+++ b/entity/WorkflowInstance_entity/WorkflowInstance_entity.aod
@@ -18,6 +18,7 @@
     </entityField>
     <entityProvider>
       <name>InstancesOfWorkflow</name>
+      <documentation>%aditoprj%/entity/WorkflowInstance_entity/entityfields/instancesofworkflow/documentation.adoc</documentation>
       <dependencies>
         <entityDependency>
           <name>96f047cf-7f3b-417e-ac08-9dc231c5d0ac</name>
@@ -79,31 +80,31 @@
     </entityField>
     <entityConsumer>
       <name>Tasks</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>WorkflowTask_entity</entityName>
-        <fieldName>InstanceTasks</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>WorkflowInstanceId_param</name>
           <valueProcess>%aditoprj%/entity/WorkflowInstance_entity/entityfields/tasks/children/workflowinstanceid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>WorkflowDefinitions</name>
       <dependency>
         <name>dependency</name>
-        <entityName>WorkflowDefinition_entity</entityName>
-        <fieldName>#PROVIDER</fieldName>
+        <entityName>WorkflowTask_entity</entityName>
+        <fieldName>InstanceTasks</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>WorkflowDefinitions</name>
       <children>
         <entityParameter>
           <name>Context_param</name>
           <valueProcess>%aditoprj%/entity/WorkflowInstance_entity/entityfields/workflowdefinitions/children/context_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>WorkflowDefinition_entity</entityName>
+        <fieldName>#PROVIDER</fieldName>
+      </dependency>
     </entityConsumer>
     <entityParameter>
       <name>ProcessVariables_param</name>
@@ -131,11 +132,6 @@
     </entityActionField>
     <entityConsumer>
       <name>FinishedTasks</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>WorkflowTask_entity</entityName>
-        <fieldName>FinishedInstanceTasks</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>WorkflowInstanceId_param</name>
@@ -146,6 +142,11 @@
           <valueProcess>%aditoprj%/entity/WorkflowInstance_entity/entityfields/finishedtasks/children/includeservicetasks_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>WorkflowTask_entity</entityName>
+        <fieldName>FinishedInstanceTasks</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>ICON</name>
@@ -153,17 +154,17 @@
     </entityField>
     <entityConsumer>
       <name>History</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>WorkflowInstanceHistory_entity</entityName>
-        <fieldName>HistoryForWorkflowInstance</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ProcessInstanceId_param</name>
           <valueProcess>%aditoprj%/entity/WorkflowInstance_entity/entityfields/history/children/processinstanceid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>WorkflowInstanceHistory_entity</entityName>
+        <fieldName>HistoryForWorkflowInstance</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>ISFINISHED</name>
@@ -174,17 +175,17 @@
     <entityConsumer>
       <name>Variables</name>
       <stateProcess>%aditoprj%/entity/WorkflowInstance_entity/entityfields/variables/stateProcess.js</stateProcess>
-      <dependency>
-        <name>dependency</name>
-        <entityName>WorkflowVariableValue_entity</entityName>
-        <fieldName>VariablesOfInstance</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>WorkflowInstanceId_param</name>
           <valueProcess>%aditoprj%/entity/WorkflowInstance_entity/entityfields/variables/children/workflowinstanceid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>WorkflowVariableValue_entity</entityName>
+        <fieldName>VariablesOfInstance</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>DIAGRAM</name>
diff --git a/entity/WorkflowInstance_entity/entityfields/instancesofworkflow/documentation.adoc b/entity/WorkflowInstance_entity/entityfields/instancesofworkflow/documentation.adoc
new file mode 100644
index 00000000000..41f9fecfaec
--- /dev/null
+++ b/entity/WorkflowInstance_entity/entityfields/instancesofworkflow/documentation.adoc
@@ -0,0 +1,3 @@
+= InstancesOfWorkflow
+
+Provider for all workflow instances started from a specific workflow definition
\ No newline at end of file
diff --git a/entity/WorkflowLauncher_entity/WorkflowLauncher_entity.aod b/entity/WorkflowLauncher_entity/WorkflowLauncher_entity.aod
index e5749fe5101..cb1c24289be 100644
--- a/entity/WorkflowLauncher_entity/WorkflowLauncher_entity.aod
+++ b/entity/WorkflowLauncher_entity/WorkflowLauncher_entity.aod
@@ -2,6 +2,7 @@
 <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>WorkflowLauncher_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
+  <documentation>%aditoprj%/entity/WorkflowLauncher_entity/documentation.adoc</documentation>
   <recordContainer>dataLess</recordContainer>
   <entityFields>
     <entityProvider>
@@ -61,17 +62,17 @@
     </entityProvider>
     <entityConsumer>
       <name>WorkflowDefinitions</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>WorkflowDefinition_entity</entityName>
-        <fieldName>#PROVIDER</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>Context_param</name>
           <valueProcess>%aditoprj%/entity/WorkflowLauncher_entity/entityfields/workflowdefinitions/children/context_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>WorkflowDefinition_entity</entityName>
+        <fieldName>#PROVIDER</fieldName>
+      </dependency>
     </entityConsumer>
     <entityParameter>
       <name>Validationerrors_param</name>
diff --git a/entity/WorkflowLauncher_entity/documentation.adoc b/entity/WorkflowLauncher_entity/documentation.adoc
new file mode 100644
index 00000000000..2b9731f8a4e
--- /dev/null
+++ b/entity/WorkflowLauncher_entity/documentation.adoc
@@ -0,0 +1,3 @@
+= WorkflowLauncher_entity
+
+An entity with dataless recordcontainer to create a dialog that starts workflow instances.
\ No newline at end of file
diff --git a/entity/WorkflowSignal_entity/WorkflowSignal_entity.aod b/entity/WorkflowSignal_entity/WorkflowSignal_entity.aod
index 0482a952cde..1e857118e9c 100644
--- a/entity/WorkflowSignal_entity/WorkflowSignal_entity.aod
+++ b/entity/WorkflowSignal_entity/WorkflowSignal_entity.aod
@@ -47,11 +47,6 @@
     </entityField>
     <entityConsumer>
       <name>Contexts</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Context_entity</entityName>
-        <fieldName>Exclusive</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>Blacklist_param</name>
@@ -62,23 +57,29 @@
           <valueProcess>%aditoprj%/entity/WorkflowSignal_entity/entityfields/contexts/children/invertblacklist_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>TriggerKeyword</name>
       <dependency>
         <name>dependency</name>
-        <entityName>KeywordEntry_entity</entityName>
-        <fieldName>SpecificContainerKeywords</fieldName>
+        <entityName>Context_entity</entityName>
+        <fieldName>Exclusive</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>TriggerKeyword</name>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
           <valueProcess>%aditoprj%/entity/WorkflowSignal_entity/entityfields/triggerkeyword/children/containername_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>SpecificContainerKeywords</fieldName>
+      </dependency>
     </entityConsumer>
     <entityProvider>
       <name>ProcessDefinitionSignals</name>
+      <documentation>%aditoprj%/entity/WorkflowSignal_entity/entityfields/processdefinitionsignals/documentation.adoc</documentation>
       <dependencies>
         <entityDependency>
           <name>f08ff63c-296a-4b1f-8264-b6b1e6c1d748</name>
diff --git a/entity/WorkflowSignal_entity/entityfields/processdefinitionsignals/documentation.adoc b/entity/WorkflowSignal_entity/entityfields/processdefinitionsignals/documentation.adoc
new file mode 100644
index 00000000000..7d279f26c91
--- /dev/null
+++ b/entity/WorkflowSignal_entity/entityfields/processdefinitionsignals/documentation.adoc
@@ -0,0 +1,3 @@
+= ProcessDefinitionSignals
+
+Provides all signals defined in the given workflow definition.
\ No newline at end of file
-- 
GitLab


From d558e900dba773beae1e60a69f6a927379df5721 Mon Sep 17 00:00:00 2001
From: "j.goderbauer" <j.goderbauer@adito.de>
Date: Tue, 1 Dec 2020 16:27:01 +0100
Subject: [PATCH 147/184] =?UTF-8?q?[Projekt:=20Entwicklung=20-=20xRM][Tick?=
 =?UTF-8?q?etNr.:=201069274][Dubletten=20-=20Fehlermeldung=20bei=20Dublett?=
 =?UTF-8?q?enaktion=20"Integriere=20ausgew=C3=A4hlten=20in=20aktuellen"]?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../integrateselectedintocurrentaction/onActionProcess.js  | 5 ++++-
 .../integrateselectedintocurrentaction/onActionProcess.js  | 7 ++++---
 2 files changed, 8 insertions(+), 4 deletions(-)

diff --git a/entity/Organisation_entity/entityfields/duplicateactions/children/integrateselectedintocurrentaction/onActionProcess.js b/entity/Organisation_entity/entityfields/duplicateactions/children/integrateselectedintocurrentaction/onActionProcess.js
index 1f3a9e3ddfc..6bb5f4cde71 100644
--- a/entity/Organisation_entity/entityfields/duplicateactions/children/integrateselectedintocurrentaction/onActionProcess.js
+++ b/entity/Organisation_entity/entityfields/duplicateactions/children/integrateselectedintocurrentaction/onActionProcess.js
@@ -16,5 +16,8 @@ if(mergeSuccess)
     if(currentContactId == null)
         currentContactId = "";
     DuplicateScannerUtils.createMergeSuccessActivity(sourceContactId, targetContactId, currentContactId, "Organisation");
-    neon.refreshAll();
+    //neon.refresh() with no fields will refresh the current image (and all sub images) but NOT the preview. neon.refreshAll() would refresh both,
+    //why it would lead to an error because it's trying to load the already opened preview of the duplicateContact which just got deleted 
+    //and does not exist any more which results in an exception
+    neon.refresh();
 }
\ No newline at end of file
diff --git a/entity/Person_entity/entityfields/duplicateactions/children/integrateselectedintocurrentaction/onActionProcess.js b/entity/Person_entity/entityfields/duplicateactions/children/integrateselectedintocurrentaction/onActionProcess.js
index 2930a65370d..6a9f2ac39a7 100644
--- a/entity/Person_entity/entityfields/duplicateactions/children/integrateselectedintocurrentaction/onActionProcess.js
+++ b/entity/Person_entity/entityfields/duplicateactions/children/integrateselectedintocurrentaction/onActionProcess.js
@@ -26,7 +26,8 @@ if(mergeSuccess)
     if(currentContactId == null)
         currentContactId = "";
     DuplicateScannerUtils.createMergeSuccessActivity(sourceContactId, targetContactId, currentContactId, "Person");
-// openContext due to the fact, that openContext will lead to an error 'due'cause it's trying to load the already opened preview 
-// of the duplicateContact which just got deleted = nullpointException
-    neon.openContext("Person", null, [targetContactId], neon.OPERATINGSTATE_VIEW, null, null);
+    //neon.refresh() with no fields will refresh the current image (and all sub images) but NOT the preview. neon.refreshAll() would refresh both,
+    //why it would lead to an error because it's trying to load the already opened preview of the duplicateContact which just got deleted 
+    //and does not exist any more which results in an exception
+    neon.refresh();
 }
\ No newline at end of file
-- 
GitLab


From 8d159233bbb4ca50eeaca021a23c2df25d30bbbf Mon Sep 17 00:00:00 2001
From: "a.schindlbeck" <a.schindlbeck@adito.de>
Date: Tue, 1 Dec 2020 16:50:38 +0100
Subject: [PATCH 148/184] Revert "#1067434 Notifications: adding subcategory on
 various .addNotification(...) calls"

This reverts commit 0074002f15314b7ec36a99895f44a7c4771911a6.
---
 process/buildSerialLetter_serverProcess/process.js | 2 +-
 process/importLead_serverProcess/process.js        | 2 +-
 process/sendBulkMail_serverProcess/process.js      | 2 +-
 3 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/process/buildSerialLetter_serverProcess/process.js b/process/buildSerialLetter_serverProcess/process.js
index b3210e860db..1d5cff1f394 100644
--- a/process/buildSerialLetter_serverProcess/process.js
+++ b/process/buildSerialLetter_serverProcess/process.js
@@ -21,4 +21,4 @@ SingleBinaryUtils.set("SERIALLETTER", "SERIALLETTERFILE", letterId, document.con
 
 var message = translate.text("Download ready");
 var description = translate.withArguments("Serial letter \"%0\" can now be downloaded", [document.title]);
-notification.addNotification(util.getNewUUID(), text.encodeMS(["SerialLetter", letterId]), null, null, "DownloadReady", null, notification.PRIO_NORMAL, 2, notification.STATE_UNSEEN, [user], message, description);
\ No newline at end of file
+notification.addNotification(util.getNewUUID(), text.encodeMS(["SerialLetter", letterId]), null, null, "DownloadReady", notification.PRIO_NORMAL, 2, notification.STATE_UNSEEN, [user], message, description);
\ No newline at end of file
diff --git a/process/importLead_serverProcess/process.js b/process/importLead_serverProcess/process.js
index 35ac42b2b31..a24b084a933 100644
--- a/process/importLead_serverProcess/process.js
+++ b/process/importLead_serverProcess/process.js
@@ -192,7 +192,7 @@ if(exeptions != "")//insert error document
 if (userId)// if there is an user - show a notification to this user when the import is complete
 {
     var description = translate.withArguments("%0 leads imported, %1 errors", [rows, errorCount]);
-    notification.addNotification(util.getNewUUID(), null, null, null, "LeadImport_Notification", null, notification.PRIO_NORMAL, 2, notification.STATE_UNSEEN, [userId], importName, description);
+    notification.addNotification(util.getNewUUID(), null, null, null, "LeadImport_Notification", notification.PRIO_NORMAL, 2, notification.STATE_UNSEEN, [userId], importName, description);
 }
 
 
diff --git a/process/sendBulkMail_serverProcess/process.js b/process/sendBulkMail_serverProcess/process.js
index 7ed237beffb..711120feb20 100644
--- a/process/sendBulkMail_serverProcess/process.js
+++ b/process/sendBulkMail_serverProcess/process.js
@@ -23,5 +23,5 @@ if (user && !testRecipients)
     var message = translate.withArguments("Bulk mail \"%0\" was sent!", [mailName]);
     var description = translate.withArguments("%0 mails sent sucessfully, %1 mails failed. Process took %2 s.", 
         [res.sucessful, res.failed, Math.round((datetime.date() - startTime) / datetime.ONE_SECOND)]);
-    notification.addNotification(util.getNewUUID(), null, null, null, "BulkMailSent", null, notification.PRIO_NORMAL, 2, notification.STATE_UNSEEN, [user], message, description);
+    notification.addNotification(util.getNewUUID(), null, null, null, "BulkMailSent", notification.PRIO_NORMAL, 2, notification.STATE_UNSEEN, [user], message, description);
 }
\ No newline at end of file
-- 
GitLab


From b1a9b4206c05d78200ab15326787500c29206278 Mon Sep 17 00:00:00 2001
From: "j.luginger" <j.luginger@adito.de>
Date: Wed, 2 Dec 2020 08:18:39 +0100
Subject: [PATCH 149/184] [Projekt: Entwicklung - xRM][TicketNr.:
 1069809][ImporterMappingFunction iAttribute - Attribut wird zu oft angelegt]

---
 process/ImporterMappingFunctions_lib/process.js | 10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/process/ImporterMappingFunctions_lib/process.js b/process/ImporterMappingFunctions_lib/process.js
index 1598b0c0d19..f85d4a3f1b1 100644
--- a/process/ImporterMappingFunctions_lib/process.js
+++ b/process/ImporterMappingFunctions_lib/process.js
@@ -142,7 +142,7 @@ function iAttribute(pObject)
             
             if (i == 0) 
             {
-                var parent = "NULL";
+                var parent = null;
                 // select ab_attributeid from AB_ATTRIBUTE where ATTRIBUTE_NAME = 'Subordinate campaign of' and attribute_parent_id is null
                 id = newSelect(ab_attributeId, alias).from(ab_attribute).where(attribute_name, attributes[i])
                         .and(attribute_parent_id + " is null").cell();
@@ -158,10 +158,18 @@ function iAttribute(pObject)
             {
                 id = util.getNewUUID();
                 if (attributes.length == i+1) type = attributeType;
+                
                 //TODO: add insertNoWait to instantly add AB_ATTRIBUTE records; 
                 //this ensures that nothing is in the funcBuffer that does not exist in the database
                 //TODO: check: are COMOB-values added automatically?
                 var values = [id, parent, attributes[i], type, "1"];
+                
+                if(parent == null)
+                {
+                    values = [id, attributes[i], type, "1"];
+                    columns = [ab_attributeId, attribute_name, attribute_type, attribute_active];
+                }
+                
                 this.insertData(ab_attribute, columns, null, values, alias);
             }   
             pathToFollow["childs"][attributes[i]]["id"] = id;   
-- 
GitLab


From f46f2b4444e300dc9900e208bf116569a3a9cf16 Mon Sep 17 00:00:00 2001
From: Sebastian Listl <s.listl@adito.de>
Date: Wed, 2 Dec 2020 13:17:14 +0100
Subject: [PATCH 150/184] MSTeams actions stateProcesses

---
 .../CampaignParticipant_entity.aod            | 50 ++++++------
 .../synchronizedocuments/stateProcess.js      | 11 +--
 .../children/addapp/onActionProcess.js        |  2 +-
 .../children/addapp/stateProcess.js           | 21 +----
 .../children/deleteteam/stateProcess.js       | 22 +----
 .../children/editteam/stateProcess.js         | 26 +-----
 .../children/openmsteams/onActionProcess.js   | 11 +--
 .../children/openmsteams/stateProcess.js      | 18 +----
 .../children/restoreteam/stateProcess.js      | 23 +-----
 .../_____LANGUAGE_EXTRA.aod                   |  6 ++
 .../_____LANGUAGE_en/_____LANGUAGE_en.aod     |  6 ++
 .../CampaignCostChart_view.aod                |  2 +-
 .../CampaignFilter_view.aod                   |  2 +-
 process/MSTeams_lib/process.js                | 80 +++++++++++++++++--
 14 files changed, 136 insertions(+), 144 deletions(-)

diff --git a/entity/CampaignParticipant_entity/CampaignParticipant_entity.aod b/entity/CampaignParticipant_entity/CampaignParticipant_entity.aod
index 47b0a225372..c83cda0bd56 100644
--- a/entity/CampaignParticipant_entity/CampaignParticipant_entity.aod
+++ b/entity/CampaignParticipant_entity/CampaignParticipant_entity.aod
@@ -22,20 +22,6 @@
       <name>CampaignParticipantsProvider</name>
       <documentation>%aditoprj%/entity/CampaignParticipant_entity/entityfields/campaignparticipantsprovider/documentation.adoc</documentation>
       <recordContainer>db</recordContainer>
-      <dependencies>
-        <entityDependency>
-          <name>f28945cd-4613-4dfa-91f7-a7d9d64cef58</name>
-          <entityName>Campaign_entity</entityName>
-          <fieldName>CampaignParticipants</fieldName>
-          <isConsumer v="false" />
-        </entityDependency>
-        <entityDependency>
-          <name>7ad08378-b36f-4512-8891-db727c6ddcd7</name>
-          <entityName>CampaignStep_entity</entityName>
-          <fieldName>CampaignParticipantsConsumer</fieldName>
-          <isConsumer v="false" />
-        </entityDependency>
-      </dependencies>
       <children>
         <entityParameter>
           <name>ContactId_param</name>
@@ -50,6 +36,20 @@
           <expose v="true" />
         </entityParameter>
       </children>
+      <dependencies>
+        <entityDependency>
+          <name>f28945cd-4613-4dfa-91f7-a7d9d64cef58</name>
+          <entityName>Campaign_entity</entityName>
+          <fieldName>CampaignParticipants</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+        <entityDependency>
+          <name>7ad08378-b36f-4512-8891-db727c6ddcd7</name>
+          <entityName>CampaignStep_entity</entityName>
+          <fieldName>CampaignParticipantsConsumer</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+      </dependencies>
     </entityProvider>
     <entityParameter>
       <name>CampaignStepId_param</name>
@@ -144,11 +144,6 @@
     <entityConsumer>
       <name>CampaignSteps</name>
       <refreshParent v="true" />
-      <dependency>
-        <name>dependency</name>
-        <entityName>CampaignStep_entity</entityName>
-        <fieldName>CampaignSteps</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>campaignId_param</name>
@@ -156,6 +151,11 @@
           <expose v="true" />
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>CampaignStep_entity</entityName>
+        <fieldName>CampaignSteps</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>CONTACTCONTEXT</name>
@@ -203,17 +203,17 @@
     </entityConsumer>
     <entityConsumer>
       <name>CommRestrictionIcon</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>KeywordAttribute_entity</entityName>
-        <fieldName>SpecificContainerKeyword</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
           <valueProcess>%aditoprj%/entity/CampaignParticipant_entity/entityfields/commrestrictionicon/children/containername_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordAttribute_entity</entityName>
+        <fieldName>SpecificContainerKeyword</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>STANDARD_EMAIL_COMMUNICATION</name>
@@ -271,7 +271,7 @@
     </entityConsumer>
     <entityField>
       <name>RESPONSIBLE_CONTACT_ID</name>
-      <title>Verantwortlicher</title>
+      <title>Responsible</title>
       <consumer>ResponsibleEmployees</consumer>
       <groupable v="true" />
       <linkedContext>Person</linkedContext>
diff --git a/entity/Document_entity/entityfields/msteam/children/synchronizedocuments/stateProcess.js b/entity/Document_entity/entityfields/msteam/children/synchronizedocuments/stateProcess.js
index f5e9edcd5d6..0bd4c4c544c 100644
--- a/entity/Document_entity/entityfields/msteam/children/synchronizedocuments/stateProcess.js
+++ b/entity/Document_entity/entityfields/msteam/children/synchronizedocuments/stateProcess.js
@@ -1,12 +1,7 @@
-import("Util_lib");
+import("MSTeams_lib");
 import("system.vars");
 import("system.neon");
 import("system.result");
-import("Sql_lib");
 
-var isArchived = Utils.toBoolean(newSelect("IS_ARCHIVED")
-    .from("MST_TEAM")
-    .whereIfSet("MST_TEAM.MST_TEAMID", "$param.MSTTeamId_param")
-    .cell(true));
-
-result.string(isArchived ? neon.COMPONENTSTATE_DISABLED : neon.COMPONENTSTATE_EDITABLE);
\ No newline at end of file
+var isEnabled = MSTeamsUtils.isTeamsEnabled() && MSTeamsUtils.isTeamActive(vars.get("$param.MSTTeamId_param"));
+result.string(isEnabled ? neon.COMPONENTSTATE_EDITABLE : neon.COMPONENTSTATE_DISABLED);
\ No newline at end of file
diff --git a/entity/Member_entity/entityfields/msteamsactiongroup/children/addapp/onActionProcess.js b/entity/Member_entity/entityfields/msteamsactiongroup/children/addapp/onActionProcess.js
index 826e42316f9..f53cd7c87d1 100644
--- a/entity/Member_entity/entityfields/msteamsactiongroup/children/addapp/onActionProcess.js
+++ b/entity/Member_entity/entityfields/msteamsactiongroup/children/addapp/onActionProcess.js
@@ -3,5 +3,5 @@ import("system.project");
 import("system.vars");
 
 var appId = project.getInstanceConfigValue("teamsAppId", null);
-if (appId != null)
+if (appId)
     teams.addApp(vars.get("$param.MSTTeamId_param"), appId);
\ No newline at end of file
diff --git a/entity/Member_entity/entityfields/msteamsactiongroup/children/addapp/stateProcess.js b/entity/Member_entity/entityfields/msteamsactiongroup/children/addapp/stateProcess.js
index 8c22d355887..f1febe96416 100644
--- a/entity/Member_entity/entityfields/msteamsactiongroup/children/addapp/stateProcess.js
+++ b/entity/Member_entity/entityfields/msteamsactiongroup/children/addapp/stateProcess.js
@@ -5,27 +5,12 @@ import("system.result");
 import("Sql_lib");
 
 var res = neon.COMPONENTSTATE_DISABLED;
-var teamId = vars.exists("$param.MSTTeamId_param") ? vars.get("$param.MSTTeamId_param") : null;
+var teamId = vars.get("$param.MSTTeamId_param");
 if (teamId && MSTeamsUtils.isTeamsEnabled())
 {    
-    var isArchived, serviceUrl;
-    var teamData = newSelect("IS_ARCHIVED, SERVICE_URL")
-        .from("MST_TEAM")
-        .whereIfSet("MST_TEAM.MST_TEAMID", teamId)
-        .arrayRow(true);
-
-    if (teamData)
-        [isArchived, serviceUrl] = teamData;
-
-
-    if (isArchived == 1 || serviceUrl) 
-    {
-        res = neon.COMPONENTSTATE_DISABLED;
-    }
-    else
-    {
+    var teamInfo = MSTeamsUtils.getTeamInfo(teamId);
+    if (teamInfo && !teamInfo.isArchived && !teamInfo.serviceUrl)
         res = neon.COMPONENTSTATE_EDITABLE;
-    }
 }
 
 result.string(res);
\ No newline at end of file
diff --git a/entity/Member_entity/entityfields/msteamsactiongroup/children/deleteteam/stateProcess.js b/entity/Member_entity/entityfields/msteamsactiongroup/children/deleteteam/stateProcess.js
index ff7327ea214..dcaec1cc02a 100644
--- a/entity/Member_entity/entityfields/msteamsactiongroup/children/deleteteam/stateProcess.js
+++ b/entity/Member_entity/entityfields/msteamsactiongroup/children/deleteteam/stateProcess.js
@@ -2,30 +2,14 @@ import("MSTeams_lib");
 import("system.vars");
 import("system.neon");
 import("system.result");
-import("Sql_lib");
 
 var res = neon.COMPONENTSTATE_DISABLED;
-var teamId = vars.exists("$param.MSTTeamId_param") ? vars.get("$param.MSTTeamId_param") : null;
+var teamId = vars.get("$param.MSTTeamId_param");
 if (teamId && MSTeamsUtils.isTeamsEnabled())
 {    
-    var isArchived, serviceUrl;
-    var teamData = newSelect("IS_ARCHIVED, SERVICE_URL")
-    .from("MST_TEAM")
-    .whereIfSet("MST_TEAM.MST_TEAMID", teamId)
-    .arrayRow(true);
-
-    if (teamData)
-        [isArchived, serviceUrl] = teamData;
-
-
-    if (isArchived == 1 || serviceUrl || !MSTeamsUtils.isUserTeamOwner(teamId)) 
-    {
-        res = neon.COMPONENTSTATE_DISABLED;
-    }
-    else
-    {
+    var teamInfo = MSTeamsUtils.getTeamInfo(teamId);
+    if (teamInfo && !teamInfo.isArchived && !teamInfo.serviceUrl && MSTeamsUtils.isUserTeamOwner(teamId))
         res = neon.COMPONENTSTATE_EDITABLE;
-    }
 }
 
 result.string(res);
\ No newline at end of file
diff --git a/entity/Member_entity/entityfields/msteamsactiongroup/children/editteam/stateProcess.js b/entity/Member_entity/entityfields/msteamsactiongroup/children/editteam/stateProcess.js
index 19d44a29c7a..7aa4197a0d2 100644
--- a/entity/Member_entity/entityfields/msteamsactiongroup/children/editteam/stateProcess.js
+++ b/entity/Member_entity/entityfields/msteamsactiongroup/children/editteam/stateProcess.js
@@ -2,30 +2,12 @@ import("MSTeams_lib");
 import("system.vars");
 import("system.neon");
 import("system.result");
-import("Sql_lib");
 
 var res = neon.COMPONENTSTATE_DISABLED;
-var teamId = vars.exists("$param.MSTTeamId_param") ? vars.get("$param.MSTTeamId_param") : null;
-if (teamId && MSTeamsUtils.isTeamsEnabled())
-{    
-    var isArchived, serviceUrl;
-    var teamData = newSelect("IS_ARCHIVED, SERVICE_URL")
-    .from("MST_TEAM")
-    .whereIfSet("MST_TEAM.MST_TEAMID", teamId)
-    .arrayRow(true);
-
-    if (teamData)
-        [isArchived, serviceUrl] = teamData;
-
-
-    if (isArchived == 1 || !MSTeamsUtils.isUserTeamOwner(teamId)) 
-    {
-        res = neon.COMPONENTSTATE_DISABLED;
-    }
-    else
-    {
-        res = neon.COMPONENTSTATE_EDITABLE;
-    }
+var teamId = vars.get("$param.MSTTeamId_param");
+if (teamId && MSTeamsUtils.isTeamsEnabled() && MSTeamsUtils.isTeamActive(teamId) && MSTeamsUtils.isUserTeamOwner(teamId))
+{
+    res = neon.COMPONENTSTATE_EDITABLE;
 }
 
 result.string(res);
\ No newline at end of file
diff --git a/entity/Member_entity/entityfields/msteamsactiongroup/children/openmsteams/onActionProcess.js b/entity/Member_entity/entityfields/msteamsactiongroup/children/openmsteams/onActionProcess.js
index 19f20d51a62..dd6293385c5 100644
--- a/entity/Member_entity/entityfields/msteamsactiongroup/children/openmsteams/onActionProcess.js
+++ b/entity/Member_entity/entityfields/msteamsactiongroup/children/openmsteams/onActionProcess.js
@@ -1,11 +1,8 @@
-import("Sql_lib");
+import("MSTeams_lib");
 import("system.vars");
 import("system.neon");
 
-var webUrl = newSelect("WEB_URL")
-    .from("MST_TEAM")
-    .whereIfSet("MST_TEAM.MST_TEAMID", "$param.MSTTeamId_param")
-    .cell(true);
+var teamInfo = MSTeamsUtils.getTeamInfo(vars.get("$param.MSTTeamId_param"));
 
-if (webUrl)
-    neon.openUrl(webUrl, true);
+if (teamInfo && teamInfo.webUrl)
+    neon.openUrl(teamInfo.webUrl, true);
diff --git a/entity/Member_entity/entityfields/msteamsactiongroup/children/openmsteams/stateProcess.js b/entity/Member_entity/entityfields/msteamsactiongroup/children/openmsteams/stateProcess.js
index 43b7cdd5ead..ce25c1feb1a 100644
--- a/entity/Member_entity/entityfields/msteamsactiongroup/children/openmsteams/stateProcess.js
+++ b/entity/Member_entity/entityfields/msteamsactiongroup/children/openmsteams/stateProcess.js
@@ -5,22 +5,10 @@ import("system.result");
 import("Sql_lib");
 
 var res = neon.COMPONENTSTATE_DISABLED;
-var teamId = vars.exists("$param.MSTTeamId_param") ? vars.get("$param.MSTTeamId_param") : null;
-if (teamId && MSTeamsUtils.isTeamsEnabled())
+var teamId = vars.get("$param.MSTTeamId_param");
+if (teamId && MSTeamsUtils.isTeamsEnabled() && MSTeamsUtils.isTeamActive(teamId))
 {    
-    var isArchived = newSelect("IS_ARCHIVED")
-        .from("MST_TEAM")
-        .whereIfSet("MST_TEAM.MST_TEAMID", teamId)
-        .cell(true);
-    
-    if (isArchived == 1) 
-    {
-        res = neon.COMPONENTSTATE_DISABLED;
-    }
-    else
-    {
-        res = neon.COMPONENTSTATE_EDITABLE;
-    }
+    res = neon.COMPONENTSTATE_EDITABLE;
 }
 
 result.string(res);
\ No newline at end of file
diff --git a/entity/Member_entity/entityfields/msteamsactiongroup/children/restoreteam/stateProcess.js b/entity/Member_entity/entityfields/msteamsactiongroup/children/restoreteam/stateProcess.js
index f6f0a5da097..45ca08b1622 100644
--- a/entity/Member_entity/entityfields/msteamsactiongroup/children/restoreteam/stateProcess.js
+++ b/entity/Member_entity/entityfields/msteamsactiongroup/children/restoreteam/stateProcess.js
@@ -5,27 +5,12 @@ import("system.result");
 import("Sql_lib");
 
 var res = neon.COMPONENTSTATE_DISABLED;
-var teamId = vars.exists("$param.MSTTeamId_param") ? vars.get("$param.MSTTeamId_param") : null;
+var teamId = vars.get("$param.MSTTeamId_param");
 if (teamId && MSTeamsUtils.isTeamsEnabled())
-{    
-    var isArchived, serviceUrl;
-    var teamData = newSelect("IS_ARCHIVED, SERVICE_URL")
-    .from("MST_TEAM")
-    .whereIfSet("MST_TEAM.MST_TEAMID", teamId)
-    .arrayRow(true);
-
-    if (teamData)
-        [isArchived, serviceUrl] = teamData;
-
-
-    if (isArchived == 0) 
-    {
-        res = neon.COMPONENTSTATE_DISABLED;
-    }
-    else
-    {
+{   
+    var teamInfo = MSTeamsUtils.getTeamInfo(teamId);
+    if (teamInfo && teamInfo.isArchived)
         res = neon.COMPONENTSTATE_EDITABLE;
-    }
 }
 
 result.string(res);
\ No newline at end of file
diff --git a/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod b/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod
index 6e143f7c08f..fe22a9591a1 100644
--- a/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod
+++ b/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod
@@ -7566,6 +7566,12 @@
     <entry>
       <key>Exports the knowledge entry as a html file</key>
     </entry>
+    <entry>
+      <key>The max participants count can not be equal or less then 0</key>
+    </entry>
+    <entry>
+      <key>Illegal Parent Operator in buildFilterObj-Function:</key>
+    </entry>
   </keyValueMap>
   <font name="Dialog" style="0" size="11" />
   <sqlModels>
diff --git a/language/_____LANGUAGE_en/_____LANGUAGE_en.aod b/language/_____LANGUAGE_en/_____LANGUAGE_en.aod
index 867c0450057..eaad07dadb7 100644
--- a/language/_____LANGUAGE_en/_____LANGUAGE_en.aod
+++ b/language/_____LANGUAGE_en/_____LANGUAGE_en.aod
@@ -7647,6 +7647,12 @@
     <entry>
       <key>Exports the knowledge entry as a html file</key>
     </entry>
+    <entry>
+      <key>The max participants count can not be equal or less then 0</key>
+    </entry>
+    <entry>
+      <key>Illegal Parent Operator in buildFilterObj-Function:</key>
+    </entry>
   </keyValueMap>
   <font name="Dialog" style="0" size="11" />
 </language>
diff --git a/neonView/CampaignCostChart_view/CampaignCostChart_view.aod b/neonView/CampaignCostChart_view/CampaignCostChart_view.aod
index 9c8daa4a4eb..24159367f94 100644
--- a/neonView/CampaignCostChart_view/CampaignCostChart_view.aod
+++ b/neonView/CampaignCostChart_view/CampaignCostChart_view.aod
@@ -5,7 +5,7 @@
   <dashletConfigurations>
     <neonDashletConfiguration>
       <name>CampaignCostsChart</name>
-      <title>Campaign costs</title>
+      <title>Campaign Costs</title>
       <description>Shows campaing costs graphically processed</description>
       <fragment>Campaign/full</fragment>
       <singleton v="true" />
diff --git a/neonView/CampaignFilter_view/CampaignFilter_view.aod b/neonView/CampaignFilter_view/CampaignFilter_view.aod
index 0dcb198305d..4d7c3aac1c1 100644
--- a/neonView/CampaignFilter_view/CampaignFilter_view.aod
+++ b/neonView/CampaignFilter_view/CampaignFilter_view.aod
@@ -8,7 +8,7 @@
   <dashletConfigurations>
     <neonDashletConfiguration>
       <name>CurrentUsersOwnedCampaigns</name>
-      <title>My campaigns</title>
+      <title>My Campaigns</title>
       <description>Show my campaigns</description>
       <fragment>Campaign/filter</fragment>
       <singleton v="true" />
diff --git a/process/MSTeams_lib/process.js b/process/MSTeams_lib/process.js
index 16d41e7efaf..95db6db28b0 100644
--- a/process/MSTeams_lib/process.js
+++ b/process/MSTeams_lib/process.js
@@ -195,7 +195,10 @@ MSTeamsUtils.getLinkedTeam = function (pRowId, pObjectType)
 }
 
 /**
+ * Loads the contactIds associated with the given azureIds
  * 
+ * @param {String[]} pAzureIds      azureIds of the users
+ * @return {Object} object with the azureIds as keys and the corresponding contactIds as values
  */
 MSTeamsUtils.getContactIdsByAzureIds = function (pAzureIds)
 {
@@ -213,21 +216,32 @@ MSTeamsUtils.getContactIdsByAzureIds = function (pAzureIds)
 }
 
 /**
+ * Generates a sql expression to resolve the roles in a team for the contacts
  * 
+ * @param {String} pTeamId          id of the team
+ * @param {String} pContactIdField  sql field that contains the contactId that is used for selecting the role
+ * @return {String} sql expression
  */
 MSTeamsUtils.getTeamRoleSubSql = function (pTeamId, pContactIdField)
 {
     if (!pTeamId)
         return "''";
     
-    var ownerIds = Object.keys(teams.getAllOwners(pTeamId));
-    var ownerContactIds = MSTeamsUtils.getContactIdsByAzureIds(ownerIds);
-    ownerContactIds = Utils.objectValues(ownerContactIds);
-    
-    var members = teams.getAllMembers(pTeamId);
-    var memberIds = Object.keys(members);
-    var memberContactIds = MSTeamsUtils.getContactIdsByAzureIds(memberIds);
-    memberContactIds = Utils.objectValues(memberContactIds);
+    try {
+        var ownerIds = Object.keys(teams.getAllOwners(pTeamId));
+        var ownerContactIds = MSTeamsUtils.getContactIdsByAzureIds(ownerIds);
+        ownerContactIds = Utils.objectValues(ownerContactIds);
+
+        var members = teams.getAllMembers(pTeamId);
+        var memberIds = Object.keys(members);
+        var memberContactIds = MSTeamsUtils.getContactIdsByAzureIds(memberIds);
+        memberContactIds = Utils.objectValues(memberContactIds);
+    } 
+    catch (err)
+    {
+        logging.log(err, logging.ERROR);
+        return "''";
+    }
     
     if (ownerContactIds.length === 0 && memberContactIds.length === 0)
         return "''";
@@ -246,7 +260,11 @@ MSTeamsUtils.getTeamRoleSubSql = function (pTeamId, pContactIdField)
 }
 
 /**
+ * Checks if the user is an owner of the team
  * 
+ * @param {String} pTeamId                  the id of the team
+ * @param {String} [pUserId=current user]   the userId of the user
+ * @return {Boolean} true if the user is an owner
  */
 MSTeamsUtils.isUserTeamOwner = function (pTeamId, pUserId)
 {
@@ -259,4 +277,50 @@ MSTeamsUtils.isUserTeamOwner = function (pTeamId, pUserId)
     if (!user)
         return false;
     return user[tools.PARAMS][tools.TEAMS_AZUREID] in teams.getAllOwners(pTeamId);
+}
+
+/**
+ * Loads the properties of the team from the database.
+ * 
+ * @param {String} pTeamId      the id of the team
+ * @return {Object} Object with these properties:
+ *  <ul>
+ *      <li>teamName</li>
+ *      <li>webUrl</li>
+ *      <li>serviceUrl</li>
+ *      <li>isArchived</li>
+ *      <li>generalChannelId</li>
+ *  </ul>
+ *  If the team was not found, null is returned.
+ */
+MSTeamsUtils.getTeamInfo = function (pTeamId)
+{
+    var teamInfo = new SqlBuilder("Data_alias")
+        .select(["TEAMNAME", "WEB_URL", "SERVICE_URL", "IS_ARCHIVED", "GENERAL_CHANNELID"])
+        .from("MST_TEAM")
+        .whereIfSet("MST_TEAM.MST_TEAMID", pTeamId)
+        .arrayRow(true);
+    
+    if (teamInfo.length === 0)
+        return null;
+    
+    return {
+        teamName: teamInfo[0],
+        webUrl: teamInfo[1],
+        serviceUrl: teamInfo[2],
+        isArchived: Utils.toBoolean(teamInfo[3]),
+        generalChannelId: teamInfo[4]
+    };
+}
+
+/**
+ * Checks if the team is active
+ * 
+ * @param {String} pTeamId      the id of the team
+ * @return {Boolean} true, if the team exists and is not archived
+ */
+MSTeamsUtils.isTeamActive = function (pTeamId)
+{
+    var teamInfo = MSTeamsUtils.getTeamInfo(pTeamId);
+    return teamInfo != null && !teamInfo.isArchived;
 }
\ No newline at end of file
-- 
GitLab


From 53a2d55b8fc9b1af5f107b1775253decefd06882 Mon Sep 17 00:00:00 2001
From: Sebastian Listl <s.listl@adito.de>
Date: Wed, 2 Dec 2020 13:38:36 +0100
Subject: [PATCH 151/184] Scan services

---
 entity/Contract_entity/Contract_entity.aod    | 105 +++++++++---------
 .../entityfields/contracts/documentation.adoc |   3 +
 .../ObjectProxy_entity/ObjectProxy_entity.aod |   1 +
 .../filteredobjects/documentation.adoc        |   3 +
 .../recordcontainers/db/onDBUpdate.js         |   2 -
 .../WorkflowTask_entity.aod                   |  42 +++----
 .../finishedinstancetasks/documentation.adoc  |   3 +
 .../instancetasks/documentation.adoc          |   3 +
 .../WorkflowVariableValue_entity.aod          |   1 +
 .../variablesofinstance/documentation.adoc    |   3 +
 .../_____LANGUAGE_EXTRA.aod                   |   3 +
 .../_____LANGUAGE_de/_____LANGUAGE_de.aod     |   5 +
 .../_____LANGUAGE_en/_____LANGUAGE_en.aod     |   3 +
 13 files changed, 103 insertions(+), 74 deletions(-)
 create mode 100644 entity/Contract_entity/entityfields/contracts/documentation.adoc
 create mode 100644 entity/ObjectProxy_entity/entityfields/filteredobjects/documentation.adoc
 create mode 100644 entity/WorkflowTask_entity/entityfields/finishedinstancetasks/documentation.adoc
 create mode 100644 entity/WorkflowTask_entity/entityfields/instancetasks/documentation.adoc
 create mode 100644 entity/WorkflowVariableValue_entity/entityfields/variablesofinstance/documentation.adoc

diff --git a/entity/Contract_entity/Contract_entity.aod b/entity/Contract_entity/Contract_entity.aod
index a31e274eac6..3281aae04f0 100644
--- a/entity/Contract_entity/Contract_entity.aod
+++ b/entity/Contract_entity/Contract_entity.aod
@@ -102,7 +102,14 @@
     </entityField>
     <entityProvider>
       <name>Contracts</name>
+      <documentation>%aditoprj%/entity/Contract_entity/entityfields/contracts/documentation.adoc</documentation>
       <recordContainer>db</recordContainer>
+      <children>
+        <entityParameter>
+          <name>ContactId_param</name>
+          <expose v="true" />
+        </entityParameter>
+      </children>
       <dependencies>
         <entityDependency>
           <name>6d7c7166-84b4-4da2-9a48-cc1e390ac987</name>
@@ -117,12 +124,6 @@
           <isConsumer v="false" />
         </entityDependency>
       </dependencies>
-      <children>
-        <entityParameter>
-          <name>ContactId_param</name>
-          <expose v="true" />
-        </entityParameter>
-      </children>
     </entityProvider>
     <entityParameter>
       <name>ContactId_param</name>
@@ -148,11 +149,6 @@
     </entityFieldGroup>
     <entityConsumer>
       <name>Activities</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Activity_entity</entityName>
-        <fieldName>LinkedObjects</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>RowId_param</name>
@@ -167,6 +163,11 @@
           <valueProcess>%aditoprj%/entity/Contract_entity/entityfields/activities/children/presetlinks_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Activity_entity</entityName>
+        <fieldName>LinkedObjects</fieldName>
+      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>AnyContacts</name>
@@ -207,11 +208,6 @@
     <entityConsumer>
       <name>Documents</name>
       <selectionMode>MULTI</selectionMode>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Document_entity</entityName>
-        <fieldName>Documents</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>AssignmentRowId_param</name>
@@ -222,15 +218,15 @@
           <valueProcess>%aditoprj%/entity/Contract_entity/entityfields/documents/children/assignmenttable_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>MainDocuments</name>
-      <stateProcess>%aditoprj%/entity/Contract_entity/entityfields/maindocuments/stateProcess.js</stateProcess>
       <dependency>
         <name>dependency</name>
         <entityName>Document_entity</entityName>
-        <fieldName>MainDocuments</fieldName>
+        <fieldName>Documents</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>MainDocuments</name>
+      <stateProcess>%aditoprj%/entity/Contract_entity/entityfields/maindocuments/stateProcess.js</stateProcess>
       <children>
         <entityParameter>
           <name>AssignmentRowId_param</name>
@@ -241,14 +237,14 @@
           <valueProcess>%aditoprj%/entity/Contract_entity/entityfields/maindocuments/children/assignmenttable_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>ContractPayments</name>
       <dependency>
         <name>dependency</name>
-        <entityName>KeywordEntry_entity</entityName>
-        <fieldName>SpecificContainerKeywords</fieldName>
+        <entityName>Document_entity</entityName>
+        <fieldName>MainDocuments</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>ContractPayments</name>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
@@ -256,14 +252,14 @@
           <expose v="false" />
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>ContractStates</name>
       <dependency>
         <name>dependency</name>
         <entityName>KeywordEntry_entity</entityName>
         <fieldName>SpecificContainerKeywords</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>ContractStates</name>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
@@ -271,14 +267,14 @@
           <expose v="false" />
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>ContractTypes</name>
       <dependency>
         <name>dependency</name>
         <entityName>KeywordEntry_entity</entityName>
         <fieldName>SpecificContainerKeywords</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>ContractTypes</name>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
@@ -286,6 +282,11 @@
           <expose v="false" />
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>SpecificContainerKeywords</fieldName>
+      </dependency>
     </entityConsumer>
     <entityActionField>
       <name>newActivity</name>
@@ -299,11 +300,6 @@
       <name>Attributes</name>
       <stateProcess>%aditoprj%/entity/Contract_entity/entityfields/attributes/stateProcess.js</stateProcess>
       <onValidation>%aditoprj%/entity/Contract_entity/entityfields/attributes/onValidation.js</onValidation>
-      <dependency>
-        <name>dependency</name>
-        <entityName>AttributeRelation_entity</entityName>
-        <fieldName>AttributeRelations</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ObjectRowId_param</name>
@@ -316,15 +312,15 @@
           <expose v="false" />
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>AttributeTree</name>
-      <stateProcess>%aditoprj%/entity/Contract_entity/entityfields/attributetree/stateProcess.js</stateProcess>
       <dependency>
         <name>dependency</name>
         <entityName>AttributeRelation_entity</entityName>
-        <fieldName>TreeProvider</fieldName>
+        <fieldName>AttributeRelations</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>AttributeTree</name>
+      <stateProcess>%aditoprj%/entity/Contract_entity/entityfields/attributetree/stateProcess.js</stateProcess>
       <children>
         <entityParameter>
           <name>ObjectType_param</name>
@@ -335,15 +331,15 @@
           <valueProcess>%aditoprj%/entity/Contract_entity/entityfields/attributetree/children/objectrowid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>AttributeRelation_entity</entityName>
+        <fieldName>TreeProvider</fieldName>
+      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>Tasks</name>
       <stateProcess>%aditoprj%/entity/Contract_entity/entityfields/tasks/stateProcess.js</stateProcess>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Task_entity</entityName>
-        <fieldName>Tasks</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ObjectId_param</name>
@@ -358,6 +354,11 @@
           <valueProcess>%aditoprj%/entity/Contract_entity/entityfields/tasks/children/presetlinks_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Task_entity</entityName>
+        <fieldName>Tasks</fieldName>
+      </dependency>
     </entityConsumer>
     <entityActionField>
       <name>newTask</name>
@@ -367,17 +368,17 @@
     </entityActionField>
     <entityConsumer>
       <name>LogHistories</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>LogHistory_entity</entityName>
-        <fieldName>LogHistoryProvider</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>tablenames_param</name>
           <valueProcess>%aditoprj%/entity/Contract_entity/entityfields/loghistories/children/tablenames_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>LogHistory_entity</entityName>
+        <fieldName>LogHistoryProvider</fieldName>
+      </dependency>
     </entityConsumer>
     <entityActionField>
       <name>openAdminView</name>
diff --git a/entity/Contract_entity/entityfields/contracts/documentation.adoc b/entity/Contract_entity/entityfields/contracts/documentation.adoc
new file mode 100644
index 00000000000..d329bb27a71
--- /dev/null
+++ b/entity/Contract_entity/entityfields/contracts/documentation.adoc
@@ -0,0 +1,3 @@
+= Contracts
+
+Provides the contracts that are linked with a contact.
\ No newline at end of file
diff --git a/entity/ObjectProxy_entity/ObjectProxy_entity.aod b/entity/ObjectProxy_entity/ObjectProxy_entity.aod
index e197c4de792..8eb6e53ec1f 100644
--- a/entity/ObjectProxy_entity/ObjectProxy_entity.aod
+++ b/entity/ObjectProxy_entity/ObjectProxy_entity.aod
@@ -18,6 +18,7 @@
     <entityProvider>
       <name>FilteredObjects</name>
       <targetConsumerProcess>%aditoprj%/entity/ObjectProxy_entity/entityfields/filteredobjects/targetConsumerProcess.js</targetConsumerProcess>
+      <documentation>%aditoprj%/entity/ObjectProxy_entity/entityfields/filteredobjects/documentation.adoc</documentation>
       <dependencies>
         <entityDependency>
           <name>92e21c48-19aa-402c-b75f-96cad75d8a14</name>
diff --git a/entity/ObjectProxy_entity/entityfields/filteredobjects/documentation.adoc b/entity/ObjectProxy_entity/entityfields/filteredobjects/documentation.adoc
new file mode 100644
index 00000000000..1c4b46dd5e5
--- /dev/null
+++ b/entity/ObjectProxy_entity/entityfields/filteredobjects/documentation.adoc
@@ -0,0 +1,3 @@
+= FilteredObjects
+
+This provider can retrieve objects of the given entity, the results can be filtered.
\ No newline at end of file
diff --git a/entity/SerialLetter_entity/recordcontainers/db/onDBUpdate.js b/entity/SerialLetter_entity/recordcontainers/db/onDBUpdate.js
index 9b94cb43201..20c7fc0a0dd 100644
--- a/entity/SerialLetter_entity/recordcontainers/db/onDBUpdate.js
+++ b/entity/SerialLetter_entity/recordcontainers/db/onDBUpdate.js
@@ -18,8 +18,6 @@ var template = DocumentTemplate.fromUpload(bindata);
 if (template.content)
 {
     SingleBinaryUtils.set("SERIALLETTER", "DOCUMENT", letterId, template.content, template.filename, "");
-    
-    neon.refresh(["$field.content"]);
 }
 
 WorkflowSignalSender.updated();
\ No newline at end of file
diff --git a/entity/WorkflowTask_entity/WorkflowTask_entity.aod b/entity/WorkflowTask_entity/WorkflowTask_entity.aod
index 96272fe5f1d..5a9cabd4bea 100644
--- a/entity/WorkflowTask_entity/WorkflowTask_entity.aod
+++ b/entity/WorkflowTask_entity/WorkflowTask_entity.aod
@@ -76,14 +76,7 @@
     </entityField>
     <entityProvider>
       <name>InstanceTasks</name>
-      <dependencies>
-        <entityDependency>
-          <name>5913327f-1bb4-48b8-846e-639274290cee</name>
-          <entityName>WorkflowInstance_entity</entityName>
-          <fieldName>Tasks</fieldName>
-          <isConsumer v="false" />
-        </entityDependency>
-      </dependencies>
+      <documentation>%aditoprj%/entity/WorkflowTask_entity/entityfields/instancetasks/documentation.adoc</documentation>
       <children>
         <entityParameter>
           <name>OnlyFinishedTasks_param</name>
@@ -94,6 +87,14 @@
           <expose v="false" />
         </entityParameter>
       </children>
+      <dependencies>
+        <entityDependency>
+          <name>5913327f-1bb4-48b8-846e-639274290cee</name>
+          <entityName>WorkflowInstance_entity</entityName>
+          <fieldName>Tasks</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+      </dependencies>
     </entityProvider>
     <entityParameter>
       <name>WorkflowInstanceId_param</name>
@@ -183,6 +184,14 @@
     </entityParameter>
     <entityProvider>
       <name>FinishedInstanceTasks</name>
+      <documentation>%aditoprj%/entity/WorkflowTask_entity/entityfields/finishedinstancetasks/documentation.adoc</documentation>
+      <children>
+        <entityParameter>
+          <name>OnlyFinishedTasks_param</name>
+          <valueProcess>%aditoprj%/entity/WorkflowTask_entity/entityfields/finishedinstancetasks/children/onlyfinishedtasks_param/valueProcess.js</valueProcess>
+          <expose v="false" />
+        </entityParameter>
+      </children>
       <dependencies>
         <entityDependency>
           <name>d5d39281-0183-42fa-960a-01347cddc85a</name>
@@ -191,13 +200,6 @@
           <isConsumer v="false" />
         </entityDependency>
       </dependencies>
-      <children>
-        <entityParameter>
-          <name>OnlyFinishedTasks_param</name>
-          <valueProcess>%aditoprj%/entity/WorkflowTask_entity/entityfields/finishedinstancetasks/children/onlyfinishedtasks_param/valueProcess.js</valueProcess>
-          <expose v="false" />
-        </entityParameter>
-      </children>
     </entityProvider>
     <entityParameter>
       <name>IncludeServiceTasks_param</name>
@@ -205,17 +207,17 @@
     </entityParameter>
     <entityConsumer>
       <name>LinkedObject</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>ObjectProxy_entity</entityName>
-        <fieldName>FilteredObjects</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>Entity_param</name>
           <valueProcess>%aditoprj%/entity/WorkflowTask_entity/entityfields/linkedobject/children/entity_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>ObjectProxy_entity</entityName>
+        <fieldName>FilteredObjects</fieldName>
+      </dependency>
     </entityConsumer>
     <entityActionGroup>
       <name>tableActions</name>
diff --git a/entity/WorkflowTask_entity/entityfields/finishedinstancetasks/documentation.adoc b/entity/WorkflowTask_entity/entityfields/finishedinstancetasks/documentation.adoc
new file mode 100644
index 00000000000..9c6e27a4c53
--- /dev/null
+++ b/entity/WorkflowTask_entity/entityfields/finishedinstancetasks/documentation.adoc
@@ -0,0 +1,3 @@
+= FinishedInstanceTasks
+
+Provides all finished tasks for one process instance.
\ No newline at end of file
diff --git a/entity/WorkflowTask_entity/entityfields/instancetasks/documentation.adoc b/entity/WorkflowTask_entity/entityfields/instancetasks/documentation.adoc
new file mode 100644
index 00000000000..1d64bc1c9b0
--- /dev/null
+++ b/entity/WorkflowTask_entity/entityfields/instancetasks/documentation.adoc
@@ -0,0 +1,3 @@
+= InstanceTasks
+
+Provides all active tasks for one workflow instance.
\ No newline at end of file
diff --git a/entity/WorkflowVariableValue_entity/WorkflowVariableValue_entity.aod b/entity/WorkflowVariableValue_entity/WorkflowVariableValue_entity.aod
index df6d2af4a4f..21b68b882b8 100644
--- a/entity/WorkflowVariableValue_entity/WorkflowVariableValue_entity.aod
+++ b/entity/WorkflowVariableValue_entity/WorkflowVariableValue_entity.aod
@@ -31,6 +31,7 @@
     </entityParameter>
     <entityProvider>
       <name>VariablesOfInstance</name>
+      <documentation>%aditoprj%/entity/WorkflowVariableValue_entity/entityfields/variablesofinstance/documentation.adoc</documentation>
       <dependencies>
         <entityDependency>
           <name>b10924d7-0ba4-4268-8b2f-383e7cf6045c</name>
diff --git a/entity/WorkflowVariableValue_entity/entityfields/variablesofinstance/documentation.adoc b/entity/WorkflowVariableValue_entity/entityfields/variablesofinstance/documentation.adoc
new file mode 100644
index 00000000000..a65691e2574
--- /dev/null
+++ b/entity/WorkflowVariableValue_entity/entityfields/variablesofinstance/documentation.adoc
@@ -0,0 +1,3 @@
+= VariablesOfInstance
+
+Provides all variables contained in a specific workflow instance.
\ No newline at end of file
diff --git a/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod b/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod
index fe22a9591a1..4616b56c93c 100644
--- a/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod
+++ b/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod
@@ -7572,6 +7572,9 @@
     <entry>
       <key>Illegal Parent Operator in buildFilterObj-Function:</key>
     </entry>
+    <entry>
+      <key>Subcategory</key>
+    </entry>
   </keyValueMap>
   <font name="Dialog" style="0" size="11" />
   <sqlModels>
diff --git a/language/_____LANGUAGE_de/_____LANGUAGE_de.aod b/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
index 5fefee70bc8..05205d3403c 100644
--- a/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
+++ b/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
@@ -8375,6 +8375,10 @@ Bitte Datumseingabe prüfen</value>
       <key>The radius has to be %0 or lesser.</key>
       <value>Der Radius muss %0 km oder weniger betragen.</value>
     </entry>
+    <entry>
+      <key>Subcategory</key>
+      <value>Unterkategorie</value>
+    </entry>
     <entry>
       <key>The radius has to be at least %0.</key>
       <value>Der Radius muss mindestens %0 km betragen.</value>
@@ -9864,6 +9868,7 @@ Bitte Datumseingabe prüfen</value>
     </entry>
     <entry>
       <key>Start workflows</key>
+      <value>Workflows starten</value>
     </entry>
     <entry>
       <key>edited</key>
diff --git a/language/_____LANGUAGE_en/_____LANGUAGE_en.aod b/language/_____LANGUAGE_en/_____LANGUAGE_en.aod
index eaad07dadb7..42fd76a7caa 100644
--- a/language/_____LANGUAGE_en/_____LANGUAGE_en.aod
+++ b/language/_____LANGUAGE_en/_____LANGUAGE_en.aod
@@ -7653,6 +7653,9 @@
     <entry>
       <key>Illegal Parent Operator in buildFilterObj-Function:</key>
     </entry>
+    <entry>
+      <key>Subcategory</key>
+    </entry>
   </keyValueMap>
   <font name="Dialog" style="0" size="11" />
 </language>
-- 
GitLab


From 8468fb195b71640bbb3350cb56eec46ea62c9641 Mon Sep 17 00:00:00 2001
From: "j.goderbauer" <j.goderbauer@adito.de>
Date: Wed, 2 Dec 2020 15:21:41 +0100
Subject: [PATCH 152/184] several Scanservice fixes

---
 .../Data_alias/basic/2020.2.2/changelog.xml   |  3 +-
 .../2020.2.2/readd_ExporttemplateIndizes.xml  | 36 +++++++++++++++++++
 aliasDefinition/Data_alias/Data_alias.aod     | 20 +++++++++--
 .../_____LANGUAGE_EXTRA.aod                   |  9 +++++
 .../_____LANGUAGE_de/_____LANGUAGE_de.aod     | 12 +++++++
 .../_____LANGUAGE_en/_____LANGUAGE_en.aod     |  9 +++++
 6 files changed, 85 insertions(+), 4 deletions(-)
 create mode 100644 .liquibase/Data_alias/basic/2020.2.2/readd_ExporttemplateIndizes.xml

diff --git a/.liquibase/Data_alias/basic/2020.2.2/changelog.xml b/.liquibase/Data_alias/basic/2020.2.2/changelog.xml
index 8b27ac25ad0..f1519ab694e 100644
--- a/.liquibase/Data_alias/basic/2020.2.2/changelog.xml
+++ b/.liquibase/Data_alias/basic/2020.2.2/changelog.xml
@@ -7,4 +7,5 @@
     <include relativeToChangelogFile="true" file="alter_CampaignParticipantResponsible.xml"/>
     <include relativeToChangelogFile="true" file="MSTeams/changelog.xml"/>
     <include relativeToChangelogFile="true" file="insert_newsletterAttribute.xml"/>
-</databaseChangeLog>
+    <include relativeToChangelogFile="true" file="readd_ExporttemplateIndizes.xml"/>
+</databaseChangeLog>
\ No newline at end of file
diff --git a/.liquibase/Data_alias/basic/2020.2.2/readd_ExporttemplateIndizes.xml b/.liquibase/Data_alias/basic/2020.2.2/readd_ExporttemplateIndizes.xml
new file mode 100644
index 00000000000..67891291f5b
--- /dev/null
+++ b/.liquibase/Data_alias/basic/2020.2.2/readd_ExporttemplateIndizes.xml
@@ -0,0 +1,36 @@
+<?xml version="1.1" encoding="UTF-8" standalone="no"?>
+<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd">
+  <!-- in some cases -->
+  <changeSet author="j.goderbauer" id="140794d8-eb75-4087-a45a-71b0f547e60a">
+      <preConditions  onFail="MARK_RAN">
+          <not>
+            <indexExists indexName="idx_exprttmpfld_tmpltid" />
+          </not>
+      </preConditions>
+      <createIndex indexName="idx_exprttmpfld_tmpltid" tableName="EXPORTTEMPLATEFIELD">
+          <column name="EXPORTTEMPLATE_ID"/>
+      </createIndex>
+  </changeSet>
+  <changeSet author="j.goderbauer" id="e952abd0-29f4-4d6c-b650-ef925248ae18">
+      <preConditions  onFail="MARK_RAN">
+          <not>
+              <indexExists indexName="idx_exprttmppou_tmpltid" />
+          </not>
+      </preConditions>
+      <createIndex indexName="idx_exprttmppou_tmpltid" tableName="EXPORTTEMPLATEPLACEOFUSE">
+          <column name="EXPORTTEMPLATE_ID"/>
+      </createIndex>
+  </changeSet>
+  <changeSet author="j.goderbauer" id="b49a1ac9-80b2-4cfd-b7cd-bdfee4bc0cd8">
+      <preConditions  onFail="MARK_RAN">
+          <not>
+              <indexExists indexName="idx_exprttmpselection_tmpltid" />
+          </not>
+      </preConditions>
+      <createIndex indexName="idx_exprttmpselection_tmpltid" tableName="EXPORTTEMPLATESELECTION">
+          <column name="EXPORTTEMPLATE_ID"/>
+      </createIndex>
+  </changeSet>
+</databaseChangeLog>
\ No newline at end of file
diff --git a/aliasDefinition/Data_alias/Data_alias.aod b/aliasDefinition/Data_alias/Data_alias.aod
index 2b11aae7aa4..ba9127b5445 100644
--- a/aliasDefinition/Data_alias/Data_alias.aod
+++ b/aliasDefinition/Data_alias/Data_alias.aod
@@ -8338,6 +8338,20 @@
                   </entityDependency>
                 </dependencies>
               </entityFieldDb>
+              <entityFieldDb>
+                <name>RESPONSIBLE_CONTACT_ID</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="1" />
+                <size v="36" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
             </entityFields>
           </entityDb>
           <entityDb>
@@ -14162,7 +14176,7 @@
                 <scale v="0" />
                 <notNull v="false" />
                 <isUnique v="false" />
-                <index v="false" />
+                <index v="true" />
                 <documentation></documentation>
                 <title></title>
                 <description></description>
@@ -14488,7 +14502,7 @@
                 <scale v="0" />
                 <notNull v="false" />
                 <isUnique v="false" />
-                <index v="false" />
+                <index v="true" />
                 <documentation></documentation>
                 <title></title>
                 <description></description>
@@ -14543,7 +14557,7 @@
                 <scale v="0" />
                 <notNull v="false" />
                 <isUnique v="false" />
-                <index v="false" />
+                <index v="true" />
                 <documentation></documentation>
                 <title></title>
                 <description></description>
diff --git a/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod b/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod
index 4616b56c93c..46ad514d97d 100644
--- a/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod
+++ b/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod
@@ -7572,9 +7572,18 @@
     <entry>
       <key>Illegal Parent Operator in buildFilterObj-Function:</key>
     </entry>
+    <entry>
+      <key>My campaigns</key>
+    </entry>
     <entry>
       <key>Subcategory</key>
     </entry>
+    <entry>
+      <key>Campaign costs</key>
+    </entry>
+    <entry>
+      <key>Verantwortlicher</key>
+    </entry>
   </keyValueMap>
   <font name="Dialog" style="0" size="11" />
   <sqlModels>
diff --git a/language/_____LANGUAGE_de/_____LANGUAGE_de.aod b/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
index 05205d3403c..2ebdace2b72 100644
--- a/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
+++ b/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
@@ -9993,6 +9993,18 @@ Bitte Datumseingabe prüfen</value>
     <entry>
       <key>Exports the knowledge entry as a html file</key>
     </entry>
+    <entry>
+      <key>My campaigns</key>
+    </entry>
+    <entry>
+      <key>Subcategory</key>
+    </entry>
+    <entry>
+      <key>Campaign costs</key>
+    </entry>
+    <entry>
+      <key>Verantwortlicher</key>
+    </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 42fd76a7caa..b1927645977 100644
--- a/language/_____LANGUAGE_en/_____LANGUAGE_en.aod
+++ b/language/_____LANGUAGE_en/_____LANGUAGE_en.aod
@@ -7653,9 +7653,18 @@
     <entry>
       <key>Illegal Parent Operator in buildFilterObj-Function:</key>
     </entry>
+    <entry>
+      <key>My campaigns</key>
+    </entry>
     <entry>
       <key>Subcategory</key>
     </entry>
+    <entry>
+      <key>Campaign costs</key>
+    </entry>
+    <entry>
+      <key>Verantwortlicher</key>
+    </entry>
   </keyValueMap>
   <font name="Dialog" style="0" size="11" />
 </language>
-- 
GitLab


From 63f45896cb0cf69310e4ae31b3d5f505d904e4e0 Mon Sep 17 00:00:00 2001
From: Sebastian Listl <s.listl@adito.de>
Date: Wed, 2 Dec 2020 15:21:28 +0100
Subject: [PATCH 153/184] MS Teams fixes

---
 .../MSTTeamLink_entity/MSTTeamLink_entity.aod   |  1 +
 entity/MSTTeamLink_entity/documentation.adoc    |  3 +++
 .../MSTTeamMember_entity.aod                    |  7 +++++++
 .../entityfields/azure_data/valueProcess.js     | 16 ++++++++++++++++
 .../entityfields/azureid/valueProcess.js        |  7 ++++++-
 .../entityfields/azureupn/valueProcess.js       |  7 ++++++-
 .../entityfields/isextern/valueProcess.js       | 14 +++-----------
 .../recordcontainers/jdito/onInsert.js          |  6 +++---
 .../MSTeamsDocument_entity.aod                  |  1 +
 .../MSTeamsMessage_entity.aod                   |  2 --
 .../MSTTeamMemberMultiEdit_view.aod             | 12 ++++++++++++
 process/MSTeams_lib/process.js                  | 17 +++++++++++++++--
 12 files changed, 73 insertions(+), 20 deletions(-)
 create mode 100644 entity/MSTTeamLink_entity/documentation.adoc
 create mode 100644 entity/MSTTeamMember_entity/entityfields/azure_data/valueProcess.js

diff --git a/entity/MSTTeamLink_entity/MSTTeamLink_entity.aod b/entity/MSTTeamLink_entity/MSTTeamLink_entity.aod
index eec88fc693d..d2df3a1cd3f 100644
--- a/entity/MSTTeamLink_entity/MSTTeamLink_entity.aod
+++ b/entity/MSTTeamLink_entity/MSTTeamLink_entity.aod
@@ -2,6 +2,7 @@
 <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>MSTTeamLink_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
+  <documentation>%aditoprj%/entity/MSTTeamLink_entity/documentation.adoc</documentation>
   <siblings>
     <element>Salesproject_entity</element>
     <element>Member_entity</element>
diff --git a/entity/MSTTeamLink_entity/documentation.adoc b/entity/MSTTeamLink_entity/documentation.adoc
new file mode 100644
index 00000000000..55fcd72aba9
--- /dev/null
+++ b/entity/MSTTeamLink_entity/documentation.adoc
@@ -0,0 +1,3 @@
+= MSTTeamLink_entity
+
+This entity represents a relation between a MST team and an object (e. g. a Sales Project).
\ No newline at end of file
diff --git a/entity/MSTTeamMember_entity/MSTTeamMember_entity.aod b/entity/MSTTeamMember_entity/MSTTeamMember_entity.aod
index ec5ee48818d..d436ee7ef42 100644
--- a/entity/MSTTeamMember_entity/MSTTeamMember_entity.aod
+++ b/entity/MSTTeamMember_entity/MSTTeamMember_entity.aod
@@ -59,6 +59,7 @@
     </entityConsumer>
     <entityField>
       <name>ISEXTERN</name>
+      <state>INVISIBLE</state>
       <valueProcess>%aditoprj%/entity/MSTTeamMember_entity/entityfields/isextern/valueProcess.js</valueProcess>
     </entityField>
     <entityField>
@@ -109,12 +110,18 @@
     </entityProvider>
     <entityField>
       <name>AZUREID</name>
+      <state>INVISIBLE</state>
       <valueProcess>%aditoprj%/entity/MSTTeamMember_entity/entityfields/azureid/valueProcess.js</valueProcess>
     </entityField>
     <entityField>
       <name>AZUREUPN</name>
+      <state>INVISIBLE</state>
       <valueProcess>%aditoprj%/entity/MSTTeamMember_entity/entityfields/azureupn/valueProcess.js</valueProcess>
     </entityField>
+    <entityField>
+      <name>AZURE_DATA</name>
+      <valueProcess>%aditoprj%/entity/MSTTeamMember_entity/entityfields/azure_data/valueProcess.js</valueProcess>
+    </entityField>
   </entityFields>
   <recordContainers>
     <jDitoRecordContainer>
diff --git a/entity/MSTTeamMember_entity/entityfields/azure_data/valueProcess.js b/entity/MSTTeamMember_entity/entityfields/azure_data/valueProcess.js
new file mode 100644
index 00000000000..2df756b62a2
--- /dev/null
+++ b/entity/MSTTeamMember_entity/entityfields/azure_data/valueProcess.js
@@ -0,0 +1,16 @@
+import("system.result");
+import("system.neon");
+import("system.tools");
+import("system.vars");
+import("Employee_lib");
+
+var contactId = vars.get("$field.CONTACT_ID");
+var user = EmployeeUtils.getUserByContactId(contactId);
+var azureId = user ? user[tools.PARAMS][tools.TEAMS_AZUREID] : "";
+var azureUpn = user ? user[tools.PARAMS][tools.TEAMS_AZUREUPN] : "";
+
+var azureData = {
+    azureId: azureId,
+    azureUpn: azureUpn
+};
+result.string(JSON.stringify(azureData));
\ No newline at end of file
diff --git a/entity/MSTTeamMember_entity/entityfields/azureid/valueProcess.js b/entity/MSTTeamMember_entity/entityfields/azureid/valueProcess.js
index a2578b0245c..7744184c730 100644
--- a/entity/MSTTeamMember_entity/entityfields/azureid/valueProcess.js
+++ b/entity/MSTTeamMember_entity/entityfields/azureid/valueProcess.js
@@ -1 +1,6 @@
-//The value is set by ISEXTERN.valueProcess
\ No newline at end of file
+import("system.result");
+import("Util_lib");
+import("system.vars");
+
+var azureData = Utils.parseJSON(vars.get("$field.AZURE_DATA"));
+result.string(azureData ? azureData.azureId : "");
\ No newline at end of file
diff --git a/entity/MSTTeamMember_entity/entityfields/azureupn/valueProcess.js b/entity/MSTTeamMember_entity/entityfields/azureupn/valueProcess.js
index a2578b0245c..554d4e72732 100644
--- a/entity/MSTTeamMember_entity/entityfields/azureupn/valueProcess.js
+++ b/entity/MSTTeamMember_entity/entityfields/azureupn/valueProcess.js
@@ -1 +1,6 @@
-//The value is set by ISEXTERN.valueProcess
\ No newline at end of file
+import("system.result");
+import("Util_lib");
+import("system.vars");
+
+var azureData = Utils.parseJSON(vars.get("$field.AZURE_DATA"));
+result.string(azureData ? azureData.azureUpn : "");
\ No newline at end of file
diff --git a/entity/MSTTeamMember_entity/entityfields/isextern/valueProcess.js b/entity/MSTTeamMember_entity/entityfields/isextern/valueProcess.js
index 79c7037eb74..c2bd7034a52 100644
--- a/entity/MSTTeamMember_entity/entityfields/isextern/valueProcess.js
+++ b/entity/MSTTeamMember_entity/entityfields/isextern/valueProcess.js
@@ -1,14 +1,6 @@
 import("system.result");
-import("system.neon");
-import("system.tools");
+import("Util_lib");
 import("system.vars");
-import("Employee_lib");
 
-var contactId = vars.get("$field.CONTACT_ID");
-var user = EmployeeUtils.getUserByContactId(contactId);
-var azureId = user ? user[tools.PARAMS][tools.TEAMS_AZUREID] : "";
-var azureUpn = user ? user[tools.PARAMS][tools.TEAMS_AZUREUPN] : "";
-
-neon.setFieldValue("$field.AZUREUPN", azureUpn);
-neon.setFieldValue("$field.AZUREID", azureId);
-result.string(!azureId && !azureUpn);
\ No newline at end of file
+var azureData = Utils.parseJSON(vars.get("$field.AZURE_DATA"));
+result.string(!azureData || !(azureData.azureId || azureData.azureUpn));
\ No newline at end of file
diff --git a/entity/MSTTeam_entity/recordcontainers/jdito/onInsert.js b/entity/MSTTeam_entity/recordcontainers/jdito/onInsert.js
index 3a4b2c76861..8a1c6e0c83d 100644
--- a/entity/MSTTeam_entity/recordcontainers/jdito/onInsert.js
+++ b/entity/MSTTeam_entity/recordcontainers/jdito/onInsert.js
@@ -20,9 +20,6 @@ teamMembers.forEach(function (teamMember)
     var contactId = teamMember["CONTACT_ID"];
     var isExtern = Utils.toBoolean(teamMember["ISEXTERN"]);
     var isInvite = Utils.toBoolean(teamMember["INVITE"]);
-    var isOwner = teamMember["ROLE"] == "owner";
-    var memberAzureId = teamMember["AZUREID"];
-    var memberUpn = teamMember["AZUREUPN"];
     if (isExtern)
     {
         var memberEmail = CommUtil.getStandardMail(contactId);
@@ -35,6 +32,9 @@ teamMembers.forEach(function (teamMember)
         }
         return;
     }
+    var memberAzureId = teamMember["AZUREID"];
+    var memberUpn = teamMember["AZUREUPN"];
+    var isOwner = teamMember["ROLE"] == "owner";
     if (!memberAzureId && memberUpn)
         memberAzureId = teams.getInternalAzureId(memberUpn);
     if (memberAzureId)
diff --git a/entity/MSTeamsDocument_entity/MSTeamsDocument_entity.aod b/entity/MSTeamsDocument_entity/MSTeamsDocument_entity.aod
index ac694130ae5..7b63c5f0e10 100644
--- a/entity/MSTeamsDocument_entity/MSTeamsDocument_entity.aod
+++ b/entity/MSTeamsDocument_entity/MSTeamsDocument_entity.aod
@@ -4,6 +4,7 @@
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <documentation>%aditoprj%/entity/MSTeamsDocument_entity/documentation.adoc</documentation>
   <siblings />
+  <recordContainer>dataless</recordContainer>
   <entityFields>
     <entityProvider>
       <name>#PROVIDER</name>
diff --git a/entity/MSTeamsMessage_entity/MSTeamsMessage_entity.aod b/entity/MSTeamsMessage_entity/MSTeamsMessage_entity.aod
index c8c2fea856f..437ba4f0175 100644
--- a/entity/MSTeamsMessage_entity/MSTeamsMessage_entity.aod
+++ b/entity/MSTeamsMessage_entity/MSTeamsMessage_entity.aod
@@ -28,8 +28,6 @@
       <dependencies>
         <entityDependency>
           <name>89048e4d-32bc-4531-9b45-b0c0d9de82b1</name>
-          <entityName>MSTTeamChat_entity</entityName>
-          <fieldName>Consumer</fieldName>
           <isConsumer v="false" />
         </entityDependency>
         <entityDependency>
diff --git a/neonView/MSTTeamMemberMultiEdit_view/MSTTeamMemberMultiEdit_view.aod b/neonView/MSTTeamMemberMultiEdit_view/MSTTeamMemberMultiEdit_view.aod
index 7b50927fe8a..ec552dc14c2 100644
--- a/neonView/MSTTeamMemberMultiEdit_view/MSTTeamMemberMultiEdit_view.aod
+++ b/neonView/MSTTeamMemberMultiEdit_view/MSTTeamMemberMultiEdit_view.aod
@@ -24,6 +24,18 @@
           <name>b85c25c8-09dd-4f9a-b0b4-31c0b8a8f12c</name>
           <entityField>INVITE</entityField>
         </neonGenericMultipleTableColumn>
+        <neonGenericMultipleTableColumn>
+          <name>82cdb323-6c1a-428f-a01e-e29da9f338ec</name>
+          <entityField>AZUREID</entityField>
+        </neonGenericMultipleTableColumn>
+        <neonGenericMultipleTableColumn>
+          <name>3f766fe4-119d-40df-b071-b7a578af2a71</name>
+          <entityField>AZUREUPN</entityField>
+        </neonGenericMultipleTableColumn>
+        <neonGenericMultipleTableColumn>
+          <name>0b3ac2a1-91ad-4761-9a1d-7231d5b55169</name>
+          <entityField>ISEXTERN</entityField>
+        </neonGenericMultipleTableColumn>
       </columns>
     </genericMultipleViewTemplate>
   </children>
diff --git a/process/MSTeams_lib/process.js b/process/MSTeams_lib/process.js
index 95db6db28b0..98728cf49ab 100644
--- a/process/MSTeams_lib/process.js
+++ b/process/MSTeams_lib/process.js
@@ -133,6 +133,10 @@ MSTeamsUtils.insertTeamIfMissing = function (pTeam)
 
 /**
  * Creates a new teamLink.
+ * 
+ * @param {String} pTeamId      id of the team
+ * @param {String} pRowId       uid of the linked object
+ * @param {String} pObjectType  context of the linked object
  */
 MSTeamsUtils.createTeamLink = function (pTeamId, pRowId, pObjectType)
 {
@@ -163,7 +167,11 @@ MSTeamsUtils.createTeamLink = function (pTeamId, pRowId, pObjectType)
 }
 
 /**
+ * Gets all linked teams of an object
  * 
+ * @param {String} pRowId       uid of the linked object
+ * @param {String} pObjectType  context of the linked object
+ * @return {Object[]} array of {teamLinkId, teamId}
  */
 MSTeamsUtils.getLinkedTeams = function (pRowId, pObjectType)
 {
@@ -184,7 +192,11 @@ MSTeamsUtils.getLinkedTeams = function (pRowId, pObjectType)
 }
 
 /**
+ * Gets the linked team of an object
  * 
+ * @param {String} pRowId       uid of the linked object
+ * @param {String} pObjectType  context of the linked object
+ * @return {String} id of the linked team, or null if ther is none
  */
 MSTeamsUtils.getLinkedTeam = function (pRowId, pObjectType)
 {
@@ -274,9 +286,10 @@ MSTeamsUtils.isUserTeamOwner = function (pTeamId, pUserId)
     else
         user = tools.getUserByAttribute(tools.NAME, pUserId);
     
-    if (!user)
+    var azureId = user ? user[tools.PARAMS][tools.TEAMS_AZUREID] : null;
+    if (!azureId)
         return false;
-    return user[tools.PARAMS][tools.TEAMS_AZUREID] in teams.getAllOwners(pTeamId);
+    return azureId in teams.getAllOwners(pTeamId);
 }
 
 /**
-- 
GitLab


From 4e11160b98ac3e27abddf7460e4fd7ce85efc7a0 Mon Sep 17 00:00:00 2001
From: Sebastian Listl <s.listl@adito.de>
Date: Wed, 2 Dec 2020 15:57:48 +0100
Subject: [PATCH 154/184] Obsolete todo comments removed

---
 .../recordcontainers/db/conditionProcess.js   |   1 -
 .../recordcontainers/db/conditionProcess.js   |   1 -
 .../recordcontainers/db/conditionProcess.js   |   1 -
 entity/Address_entity/Address_entity.aod      | 146 +++++++++---------
 .../recordcontainers/db/conditionProcess.js   |   9 +-
 .../recordcontainers/db/conditionProcess.js   |   1 -
 .../recordcontainers/db/conditionProcess.js   |   1 -
 .../recordcontainers/db/conditionProcess.js   |   1 -
 .../recordcontainers/db/conditionProcess.js   |   1 -
 .../recordcontainers/db/conditionProcess.js   |   1 -
 .../onActionProcess.js                        |   3 +-
 .../recordcontainers/db/conditionProcess.js   |   1 -
 .../recordcontainers/db/conditionProcess.js   |   1 -
 .../recordcontainers/db/conditionProcess.js   |   1 -
 .../recordcontainers/db/conditionProcess.js   |   1 -
 .../entityfields/addr/contentTypeProcess.js   |   1 -
 .../recordcontainers/db/conditionProcess.js   |   1 -
 .../recordcontainers/db/conditionProcess.js   |   1 -
 .../recordcontainers/db/conditionProcess.js   |   1 -
 .../recordcontainers/db/conditionProcess.js   |   1 -
 .../recordcontainers/db/conditionProcess.js   |   1 -
 .../recordcontainers/db/conditionProcess.js   |   3 +-
 .../recordcontainers/db/conditionProcess.js   |   1 -
 .../recordcontainers/db/conditionProcess.js   |   1 -
 .../recordcontainers/db/conditionProcess.js   |   1 -
 .../recordcontainers/db/conditionProcess.js   |   1 -
 .../recordcontainers/db/conditionProcess.js   |   1 -
 .../recordcontainers/db/conditionProcess.js   |   1 -
 .../recordcontainers/db/conditionProcess.js   |   1 -
 .../MSTTeamMember_entity.aod                  |   2 -
 .../MSTeamsAddMembers_entity.aod              |  72 ---------
 .../documentation.adoc                        |  14 --
 .../objectrowid_param/valueProcess.js         |   4 -
 .../children/objecttype_param/valueProcess.js |   4 -
 .../entityfields/mst_team_id/valueProcess.js  |   7 -
 .../entityfields/mst_teamname/valueProcess.js |   7 -
 .../recordcontainers/jdito/contentProcess.js  |   9 --
 .../recordcontainers/jdito/onInsert.js        |  43 ------
 .../recordcontainers/db/conditionProcess.js   |   1 -
 .../recordcontainers/db/conditionProcess.js   |   1 -
 .../recordcontainers/db/conditionProcess.js   |   1 -
 .../recordcontainers/db/conditionProcess.js   |   1 -
 .../recordcontainers/db/conditionProcess.js   |   1 -
 .../recordcontainers/db/conditionProcess.js   |   1 -
 .../recordcontainers/db/conditionProcess.js   |   1 -
 .../recordcontainers/db/conditionProcess.js   |   1 -
 .../excludedproducts_param/valueProcess.js    |   1 -
 .../recordcontainers/db/conditionProcess.js   |   1 -
 .../recordcontainers/db/conditionProcess.js   |   1 -
 .../recordcontainers/db/conditionProcess.js   |   1 -
 .../recordcontainers/db/conditionProcess.js   |   1 -
 .../recordcontainers/db/conditionProcess.js   |   1 -
 .../recordcontainers/db/conditionProcess.js   |   1 -
 .../recordcontainers/db/conditionProcess.js   |   1 -
 .../recordcontainers/db/conditionProcess.js   |   1 -
 .../recordcontainers/db/conditionProcess.js   |   1 -
 .../recordcontainers/db/conditionProcess.js   |   1 -
 .../customcomponents/button/imageData.png     | Bin 411 -> 0 bytes
 .../customcomponents/button/onClick.js        |  44 ------
 .../customcomponents/button/imageData.png     | Bin 411 -> 0 bytes
 .../customcomponents/button/onClick.js        |  46 ------
 61 files changed, 77 insertions(+), 380 deletions(-)
 delete mode 100644 entity/MSTeamsAddMembers_entity/MSTeamsAddMembers_entity.aod
 delete mode 100644 entity/MSTeamsAddMembers_entity/documentation.adoc
 delete mode 100644 entity/MSTeamsAddMembers_entity/entityfields/members/children/objectrowid_param/valueProcess.js
 delete mode 100644 entity/MSTeamsAddMembers_entity/entityfields/members/children/objecttype_param/valueProcess.js
 delete mode 100644 entity/MSTeamsAddMembers_entity/entityfields/mst_team_id/valueProcess.js
 delete mode 100644 entity/MSTeamsAddMembers_entity/entityfields/mst_teamname/valueProcess.js
 delete mode 100644 entity/MSTeamsAddMembers_entity/recordcontainers/jdito/contentProcess.js
 delete mode 100644 entity/MSTeamsAddMembers_entity/recordcontainers/jdito/onInsert.js
 delete mode 100644 report/Offer_report/ribbon/ribbontasks/task_report/customcomponents/button/imageData.png
 delete mode 100644 report/Offer_report/ribbon/ribbontasks/task_report/customcomponents/button/onClick.js
 delete mode 100644 report/Salesorder_report/ribbon/ribbontasks/task_report/customcomponents/button/imageData.png
 delete mode 100644 report/Salesorder_report/ribbon/ribbontasks/task_report/customcomponents/button/onClick.js

diff --git a/entity/ActivityLink_entity/recordcontainers/db/conditionProcess.js b/entity/ActivityLink_entity/recordcontainers/db/conditionProcess.js
index 8c0ab0e94b1..62c7fcc7146 100644
--- a/entity/ActivityLink_entity/recordcontainers/db/conditionProcess.js
+++ b/entity/ActivityLink_entity/recordcontainers/db/conditionProcess.js
@@ -5,5 +5,4 @@ import("Sql_lib");
 
 var cond = newWhereIfSet("ACTIVITYLINK.ACTIVITY_ID", "$param.ActivityId_param", SqlBuilder.EQUAL());
 
-//TODO: use a preparedCondition (.build instead of .toString) when available #1030812 #1034026
 result.string(cond.toString());
\ No newline at end of file
diff --git a/entity/Activity_entity/recordcontainers/db/conditionProcess.js b/entity/Activity_entity/recordcontainers/db/conditionProcess.js
index 0b11a5004b5..950fcd1f1dc 100644
--- a/entity/Activity_entity/recordcontainers/db/conditionProcess.js
+++ b/entity/Activity_entity/recordcontainers/db/conditionProcess.js
@@ -59,5 +59,4 @@ if (Utils.toBoolean(vars.get("$param.OnlyInnate_param")))
 condition.andIfSet("ACTIVITY.PARENT_ID", "$param.ParentId_param");
 condition.andIfSet("ACTIVITY.PARENT_CONTEXT", "$param.ParentContext_param");
 
-//TODO: use a preparedCondition (.build instead of .toString) when available #1030812 #1034026
 result.string(condition.toString());
\ No newline at end of file
diff --git a/entity/AddressType_entity/recordcontainers/db/conditionProcess.js b/entity/AddressType_entity/recordcontainers/db/conditionProcess.js
index 19180612ce1..6e937ecf4c2 100644
--- a/entity/AddressType_entity/recordcontainers/db/conditionProcess.js
+++ b/entity/AddressType_entity/recordcontainers/db/conditionProcess.js
@@ -18,5 +18,4 @@ if (usageFilter)
             SqlBuilder.IN())
 }
 
-//TODO: use a preparedCondition (.build instead of .toString) when available #1030812 #1034026
 result.string(cond.toString());
\ No newline at end of file
diff --git a/entity/Address_entity/Address_entity.aod b/entity/Address_entity/Address_entity.aod
index b1cf501940c..c6e2d95af9f 100644
--- a/entity/Address_entity/Address_entity.aod
+++ b/entity/Address_entity/Address_entity.aod
@@ -90,14 +90,6 @@
     <entityProvider>
       <name>OrganisationAddresses</name>
       <documentation>%aditoprj%/entity/Address_entity/entityfields/organisationaddresses/documentation.adoc</documentation>
-      <dependencies>
-        <entityDependency>
-          <name>b484b43c-16f6-4875-9787-f0813dd200cb</name>
-          <entityName>Organisation_entity</entityName>
-          <fieldName>Addresses</fieldName>
-          <isConsumer v="false" />
-        </entityDependency>
-      </dependencies>
       <children>
         <entityParameter>
           <name>ContactType_param</name>
@@ -118,6 +110,14 @@
           <expose v="false" />
         </entityParameter>
       </children>
+      <dependencies>
+        <entityDependency>
+          <name>b484b43c-16f6-4875-9787-f0813dd200cb</name>
+          <entityName>Organisation_entity</entityName>
+          <fieldName>Addresses</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+      </dependencies>
     </entityProvider>
     <entityParameter>
       <name>ContactId_param</name>
@@ -128,20 +128,6 @@
     <entityProvider>
       <name>ContactAddresses</name>
       <documentation>%aditoprj%/entity/Address_entity/entityfields/contactaddresses/documentation.adoc</documentation>
-      <dependencies>
-        <entityDependency>
-          <name>efdb2f19-ab41-4f49-941a-843610e2b31b</name>
-          <entityName>Person_entity</entityName>
-          <fieldName>PersAddresses</fieldName>
-          <isConsumer v="false" />
-        </entityDependency>
-        <entityDependency>
-          <name>aecd30a8-b80e-42c5-be09-3042b75a3fa2</name>
-          <entityName>Contact_entity</entityName>
-          <fieldName>ContactAddresses</fieldName>
-          <isConsumer v="false" />
-        </entityDependency>
-      </dependencies>
       <children>
         <entityParameter>
           <name>ContactType_param</name>
@@ -162,6 +148,20 @@
           <expose v="false" />
         </entityParameter>
       </children>
+      <dependencies>
+        <entityDependency>
+          <name>efdb2f19-ab41-4f49-941a-843610e2b31b</name>
+          <entityName>Person_entity</entityName>
+          <fieldName>PersAddresses</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+        <entityDependency>
+          <name>aecd30a8-b80e-42c5-be09-3042b75a3fa2</name>
+          <entityName>Contact_entity</entityName>
+          <fieldName>ContactAddresses</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+      </dependencies>
     </entityProvider>
     <entityProvider>
       <name>#PROVIDER</name>
@@ -178,14 +178,6 @@
       <name>OrganisationAddressesByContact</name>
       <documentation>%aditoprj%/entity/Address_entity/entityfields/organisationaddressesbycontact/documentation.adoc</documentation>
       <titlePlural>Company Addresses</titlePlural>
-      <dependencies>
-        <entityDependency>
-          <name>388f6ad3-b817-4dc0-a5d5-a41eec485357</name>
-          <entityName>Person_entity</entityName>
-          <fieldName>OrgAddresses</fieldName>
-          <isConsumer v="false" />
-        </entityDependency>
-      </dependencies>
       <children>
         <entityParameter>
           <name>ContactType_param</name>
@@ -198,6 +190,14 @@
           <expose v="false" />
         </entityParameter>
       </children>
+      <dependencies>
+        <entityDependency>
+          <name>388f6ad3-b817-4dc0-a5d5-a41eec485357</name>
+          <entityName>Person_entity</entityName>
+          <fieldName>OrgAddresses</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+      </dependencies>
     </entityProvider>
     <entityField>
       <name>IS_STANDARD</name>
@@ -223,26 +223,6 @@
     <entityProvider>
       <name>OrganisationAndContactAddresses</name>
       <documentation>%aditoprj%/entity/Address_entity/entityfields/organisationandcontactaddresses/documentation.adoc</documentation>
-      <dependencies>
-        <entityDependency>
-          <name>4d7e3b3a-abba-4429-9f1e-18e11788c0f2</name>
-          <entityName>Person_entity</entityName>
-          <fieldName>ContactAndOrganisationAddresses</fieldName>
-          <isConsumer v="false" />
-        </entityDependency>
-        <entityDependency>
-          <name>daa41953-8e95-46f2-b08a-6c843ab87985</name>
-          <entityName>Offer_entity</entityName>
-          <fieldName>PossibleAddresses</fieldName>
-          <isConsumer v="false" />
-        </entityDependency>
-        <entityDependency>
-          <name>2f162626-bd99-4e2a-b9cf-e95864d9ed0e</name>
-          <entityName>Order_entity</entityName>
-          <fieldName>PossibleAddresses</fieldName>
-          <isConsumer v="false" />
-        </entityDependency>
-      </dependencies>
       <children>
         <entityParameter>
           <name>DefaultAddressId_param</name>
@@ -264,6 +244,26 @@
           <expose v="true" />
         </entityParameter>
       </children>
+      <dependencies>
+        <entityDependency>
+          <name>4d7e3b3a-abba-4429-9f1e-18e11788c0f2</name>
+          <entityName>Person_entity</entityName>
+          <fieldName>ContactAndOrganisationAddresses</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+        <entityDependency>
+          <name>daa41953-8e95-46f2-b08a-6c843ab87985</name>
+          <entityName>Offer_entity</entityName>
+          <fieldName>PossibleAddresses</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+        <entityDependency>
+          <name>2f162626-bd99-4e2a-b9cf-e95864d9ed0e</name>
+          <entityName>Order_entity</entityName>
+          <fieldName>PossibleAddresses</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+      </dependencies>
     </entityProvider>
     <entityParameter>
       <name>OrganisationId_param</name>
@@ -272,17 +272,17 @@
     </entityParameter>
     <entityConsumer>
       <name>KeywordAddressTypes</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>AddressType_entity</entityName>
-        <fieldName>ByCategory</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>UsageFilter_param</name>
           <valueProcess>%aditoprj%/entity/Address_entity/entityfields/keywordaddresstypes/children/usagefilter_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>AddressType_entity</entityName>
+        <fieldName>ByCategory</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>USER_NEW</name>
@@ -309,11 +309,6 @@
     </entityField>
     <entityConsumer>
       <name>ZipValidation</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>AddressValidation_entity</entityName>
-        <fieldName>ZipValidaton</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>Country_param</name>
@@ -324,14 +319,14 @@
           <valueProcess>%aditoprj%/entity/Address_entity/entityfields/zipvalidation/children/currentvalue_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>CityValidation</name>
       <dependency>
         <name>dependency</name>
         <entityName>AddressValidation_entity</entityName>
-        <fieldName>CityValidation</fieldName>
+        <fieldName>ZipValidaton</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>CityValidation</name>
       <children>
         <entityParameter>
           <name>CurrentValue_param</name>
@@ -342,6 +337,11 @@
           <valueProcess>%aditoprj%/entity/Address_entity/entityfields/cityvalidation/children/country_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>AddressValidation_entity</entityName>
+        <fieldName>CityValidation</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>AddressSearch</name>
@@ -357,11 +357,6 @@
     </entityField>
     <entityConsumer>
       <name>FullAddressValidation</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>AddressValidation_entity</entityName>
-        <fieldName>FullAddressValidation</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>CurrentValue_param</name>
@@ -372,14 +367,14 @@
           <valueProcess>%aditoprj%/entity/Address_entity/entityfields/fulladdressvalidation/children/country_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>StreetValidation</name>
       <dependency>
         <name>dependency</name>
         <entityName>AddressValidation_entity</entityName>
-        <fieldName>StreetValidation</fieldName>
+        <fieldName>FullAddressValidation</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>StreetValidation</name>
       <children>
         <entityParameter>
           <name>City_param</name>
@@ -394,6 +389,11 @@
           <valueProcess>%aditoprj%/entity/Address_entity/entityfields/streetvalidation/children/currentvalue_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>AddressValidation_entity</entityName>
+        <fieldName>StreetValidation</fieldName>
+      </dependency>
     </entityConsumer>
     <entityParameter>
       <name>ShowDsgvoMessage_param</name>
diff --git a/entity/Address_entity/recordcontainers/db/conditionProcess.js b/entity/Address_entity/recordcontainers/db/conditionProcess.js
index a938934f9b9..24b457e53de 100644
--- a/entity/Address_entity/recordcontainers/db/conditionProcess.js
+++ b/entity/Address_entity/recordcontainers/db/conditionProcess.js
@@ -4,13 +4,9 @@ import("system.db");
 import("Sql_lib");
 
 var cond = newWhere()
+    .andIfSet("ADDRESS.CONTACT_ID", "$param.ContactId_param");
 
-if (vars.exists("$param.ContactId_param")) // Todo: shouldn't be needed, but sometimes in the filter view of pers / org the param doesn't exist?? --> It should be null if it's not set...
-    cond.andIfSet("ADDRESS.CONTACT_ID", "$param.ContactId_param");
-
-if (vars.exists("$param.OrganisationId_param")) // Todo: shouldn't be needed, but sometimes in the filter view of pers / org the param doesn't exist??' --> It should be null if it's not set...
-    var organisationId = vars.get("$param.OrganisationId_param");
-
+var organisationId = vars.get("$param.OrganisationId_param");
 if (organisationId)
 {
     var organisationContactId = newSelect("CONTACT.CONTACTID")
@@ -21,5 +17,4 @@ if (organisationId)
     cond.orIfSet("ADDRESS.CONTACT_ID", organisationContactId);
 }
 
-//TODO: use a preparedCondition (.build instead of .toString) when available #1030812 #1034026
 result.string(cond.toString());
\ No newline at end of file
diff --git a/entity/AnyContact_entity/recordcontainers/db/conditionProcess.js b/entity/AnyContact_entity/recordcontainers/db/conditionProcess.js
index a793d04a1b1..e063f85110e 100644
--- a/entity/AnyContact_entity/recordcontainers/db/conditionProcess.js
+++ b/entity/AnyContact_entity/recordcontainers/db/conditionProcess.js
@@ -32,5 +32,4 @@ var contactIds = vars.exists("$param.ContactIds_param") && vars.get("$param.Cont
 if (contactIds) 
     cond.andIfSet("CONTACT.CONTACTID", JSON.parse(contactIds), SqlBuilder.IN());
 
-//TODO: use a preparedCondition (.build instead of .toString) when available #1030812 #1034026
 result.string(cond.toString());
\ No newline at end of file
diff --git a/entity/AppointmentLink_entity/recordcontainers/db/conditionProcess.js b/entity/AppointmentLink_entity/recordcontainers/db/conditionProcess.js
index b9a9cafdcba..b44b0652bd7 100644
--- a/entity/AppointmentLink_entity/recordcontainers/db/conditionProcess.js
+++ b/entity/AppointmentLink_entity/recordcontainers/db/conditionProcess.js
@@ -4,5 +4,4 @@ import("Sql_lib");
 
 var cond = newWhereIfSet("AB_APPOINTMENTLINK.APPOINTMENT_ID", "$param.AppointmentId_param")
 
-//TODO: use a preparedCondition (.build instead of .toString) when available #1030812 #1034026
 result.string(cond.toString());
\ No newline at end of file
diff --git a/entity/AttributeUsage_entity/recordcontainers/db/conditionProcess.js b/entity/AttributeUsage_entity/recordcontainers/db/conditionProcess.js
index 4c333a888b1..854e2896ae3 100644
--- a/entity/AttributeUsage_entity/recordcontainers/db/conditionProcess.js
+++ b/entity/AttributeUsage_entity/recordcontainers/db/conditionProcess.js
@@ -2,6 +2,5 @@ import("Sql_lib");
 import("system.db");
 import("system.result");
 
-//TODO: use a preparedCondition (.build instead of .toString) when available #1030812 #1034026
 result.string(newWhereIfSet("AB_ATTRIBUTEUSAGE.AB_ATTRIBUTE_ID", "$param.AttributeId_param")
                 .toString());  
diff --git a/entity/BulkMailRecipient_entity/recordcontainers/db/conditionProcess.js b/entity/BulkMailRecipient_entity/recordcontainers/db/conditionProcess.js
index a2473cad7ca..01d4a5dc9c7 100644
--- a/entity/BulkMailRecipient_entity/recordcontainers/db/conditionProcess.js
+++ b/entity/BulkMailRecipient_entity/recordcontainers/db/conditionProcess.js
@@ -2,5 +2,4 @@ import("system.db");
 import("system.result");
 import("Sql_lib");
 
-//TODO: use a preparedCondition (.build instead of .toString) when available #1030812 #1034026
 result.string(newWhere("BULKMAILRECIPIENT.BULKMAIL_ID", "$param.BulkMailId_param").toString());
\ No newline at end of file
diff --git a/entity/CampaignCost_entity/recordcontainers/db/conditionProcess.js b/entity/CampaignCost_entity/recordcontainers/db/conditionProcess.js
index 0d440b32736..41159ac8696 100644
--- a/entity/CampaignCost_entity/recordcontainers/db/conditionProcess.js
+++ b/entity/CampaignCost_entity/recordcontainers/db/conditionProcess.js
@@ -19,5 +19,4 @@ else
     cond.and("CAMPAIGNCOST.CAMPAIGNSTEP_ID is null");
 }
 
-//TODO: use a preparedCondition (.build instead of .toString) when available #1030812 #1034026
 result.string(cond.toString());
\ No newline at end of file
diff --git a/entity/CampaignParticipant_entity/entityfields/filterviewactiongroup/children/setsteptoparticipantselection/onActionProcess.js b/entity/CampaignParticipant_entity/entityfields/filterviewactiongroup/children/setsteptoparticipantselection/onActionProcess.js
index 5f2f7a2cfa2..fbba2db18aa 100644
--- a/entity/CampaignParticipant_entity/entityfields/filterviewactiongroup/children/setsteptoparticipantselection/onActionProcess.js
+++ b/entity/CampaignParticipant_entity/entityfields/filterviewactiongroup/children/setsteptoparticipantselection/onActionProcess.js
@@ -13,6 +13,5 @@ if(sysSelection.length > 0) //selektierte IDs als Array
 }
 else
 {
-    let sysFilter = vars.get("$sys.filter");//todo change name
-    CampaignUtils.openSetCampaignStepViewByCondition(JSON.stringify(sysFilter), campaignId, campaignStepId);
+    CampaignUtils.openSetCampaignStepViewByCondition(JSON.stringify(vars.get("$sys.filter")), campaignId, campaignStepId);
 }
\ No newline at end of file
diff --git a/entity/CampaignStep_entity/recordcontainers/db/conditionProcess.js b/entity/CampaignStep_entity/recordcontainers/db/conditionProcess.js
index d3d9bfc8c7b..c28e929a43d 100644
--- a/entity/CampaignStep_entity/recordcontainers/db/conditionProcess.js
+++ b/entity/CampaignStep_entity/recordcontainers/db/conditionProcess.js
@@ -6,5 +6,4 @@ import("system.result");
 var cond = newWhereIfSet("CAMPAIGNSTEP.CAMPAIGN_ID", "$param.campaignId_param")
                 .andIfSet("CAMPAIGNSTEP.SORTING","$param.maxSort_param", SqlBuilder.LESS_OR_EQUAL());
 
-//TODO: use a preparedCondition (.build instead of .toString) when available #1030812 #1034026
 result.string(cond.toString());
\ No newline at end of file
diff --git a/entity/ClassificationGroup_entity/recordcontainers/db/conditionProcess.js b/entity/ClassificationGroup_entity/recordcontainers/db/conditionProcess.js
index 2d43dba815c..e0b27324457 100644
--- a/entity/ClassificationGroup_entity/recordcontainers/db/conditionProcess.js
+++ b/entity/ClassificationGroup_entity/recordcontainers/db/conditionProcess.js
@@ -16,5 +16,4 @@ if (objectType)
                                                             .from("CLASSIFICATIONTYPE")
                                                             .where("CLASSIFICATIONTYPE.OBJECT_TYPE", objectType), SqlBuilder.IN());
 
-//TODO: use a preparedCondition (.build instead of .toString) when available #1030812 #1034026
 result.string(cond.toString());
\ No newline at end of file
diff --git a/entity/ClassificationScore_entity/recordcontainers/db/conditionProcess.js b/entity/ClassificationScore_entity/recordcontainers/db/conditionProcess.js
index 10dbbac6efb..2cc442f6f75 100644
--- a/entity/ClassificationScore_entity/recordcontainers/db/conditionProcess.js
+++ b/entity/ClassificationScore_entity/recordcontainers/db/conditionProcess.js
@@ -3,5 +3,4 @@ import("Sql_lib");
 import("system.db");
 import("system.result");
 
-//TODO: use a preparedCondition (.build instead of .toString) when available #1030812 #1034026
 result.string(newWhereIfSet("CLASSIFICATIONSCORE.CLASSIFICATIONTYPE_ID", "$param.ClassificationTypeId_param").toString());
\ No newline at end of file
diff --git a/entity/CommRestriction_Entity/recordcontainers/db/conditionProcess.js b/entity/CommRestriction_Entity/recordcontainers/db/conditionProcess.js
index 4a714c57054..035d01b5f3e 100644
--- a/entity/CommRestriction_Entity/recordcontainers/db/conditionProcess.js
+++ b/entity/CommRestriction_Entity/recordcontainers/db/conditionProcess.js
@@ -4,5 +4,4 @@ import("Sql_lib");
 
 var cond = newWhereIfSet("COMMRESTRICTION.CONTACT_ID", "$param.ContactId_param");
 
-//TODO: use a preparedCondition (.build instead of .toString) when available #1030812 #1034026
 result.string(cond.toString());
\ No newline at end of file
diff --git a/entity/Communication_entity/entityfields/addr/contentTypeProcess.js b/entity/Communication_entity/entityfields/addr/contentTypeProcess.js
index 25141c53776..249c9ed0275 100644
--- a/entity/Communication_entity/entityfields/addr/contentTypeProcess.js
+++ b/entity/Communication_entity/entityfields/addr/contentTypeProcess.js
@@ -4,7 +4,6 @@ import("system.vars");
 import("system.result");
 import("system.neon");
 
-//TODO: add constants for contentTypes #1022547
 var medium = vars.get("$field.MEDIUM_ID");
 var contentType;
 if (medium)
diff --git a/entity/Communication_entity/recordcontainers/db/conditionProcess.js b/entity/Communication_entity/recordcontainers/db/conditionProcess.js
index 39f447f1fe7..ec18465d42f 100644
--- a/entity/Communication_entity/recordcontainers/db/conditionProcess.js
+++ b/entity/Communication_entity/recordcontainers/db/conditionProcess.js
@@ -13,5 +13,4 @@ if (vars.getString("$param.CommMediumIds_param"))
     var mediumIds = JSON.parse(vars.getString("$param.CommMediumIds_param"));
     cond.andIfSet("COMMUNICATION.MEDIUM_ID", mediumIds, SqlBuilder.IN());
 }
-//TODO: use a preparedCondition (.build instead of .toString) when available #1030812 #1034026
 result.string(cond.toString());
\ No newline at end of file
diff --git a/entity/Competition_entity/recordcontainers/db/conditionProcess.js b/entity/Competition_entity/recordcontainers/db/conditionProcess.js
index 7fdde447ee0..79b1357d5be 100644
--- a/entity/Competition_entity/recordcontainers/db/conditionProcess.js
+++ b/entity/Competition_entity/recordcontainers/db/conditionProcess.js
@@ -6,5 +6,4 @@ var cond = newWhere()
             .andIfSet("COMPETITION.OBJECT_ROWID", "$param.ObjectRowId_param")
             .andIfSet("COMPETITION.OBJECT_TYPE", "$param.ObjectType_param");
 
-//TODO: use a preparedCondition (.build instead of .toString) when available #1030812 #1034026
 result.string(cond.toString());
diff --git a/entity/Contact_entity/recordcontainers/db/conditionProcess.js b/entity/Contact_entity/recordcontainers/db/conditionProcess.js
index 6f1b0fc9fbb..80af2eaae28 100644
--- a/entity/Contact_entity/recordcontainers/db/conditionProcess.js
+++ b/entity/Contact_entity/recordcontainers/db/conditionProcess.js
@@ -7,5 +7,4 @@ var cond = newWhere()
             .andIfSet("CONTACT.CONTACTID", "$param.OwnContactId_param", SqlBuilder.NOT_EQUAL())
             .andIfSet("CONTACT.PERSON_ID", "$param.PersonId_param");
 
-//TODO: use a preparedCondition (.build instead of .toString) when available #1030812 #1034026
 result.string(cond.toString());
\ No newline at end of file
diff --git a/entity/Contract_entity/recordcontainers/db/conditionProcess.js b/entity/Contract_entity/recordcontainers/db/conditionProcess.js
index 0fc49f960a0..80390ca2afc 100644
--- a/entity/Contract_entity/recordcontainers/db/conditionProcess.js
+++ b/entity/Contract_entity/recordcontainers/db/conditionProcess.js
@@ -5,5 +5,4 @@ import("Sql_lib");
 
 var cond = newWhereIfSet("CONTRACT.CONTACT_ID", "$param.ContactId_param");
 
-//TODO: use a preparedCondition (.build instead of .toString) when available #1030812 #1034026
 result.string(cond.toString()); 
diff --git a/entity/DSGVOInfo_entity/recordcontainers/db/conditionProcess.js b/entity/DSGVOInfo_entity/recordcontainers/db/conditionProcess.js
index 0135f590498..14a93daf75f 100644
--- a/entity/DSGVOInfo_entity/recordcontainers/db/conditionProcess.js
+++ b/entity/DSGVOInfo_entity/recordcontainers/db/conditionProcess.js
@@ -2,6 +2,5 @@ import("system.db");
 import("system.result");
 import("Sql_lib");
 
-//TODO: use a preparedCondition (.build instead of .toString) when available #1030812 #1034026
 result.string(newWhere("DSGVOINFO.CONTACT_ID", "$param.ContactId_param").toString())
                
\ No newline at end of file
diff --git a/entity/DescriptionTranslation_entity/recordcontainers/db/conditionProcess.js b/entity/DescriptionTranslation_entity/recordcontainers/db/conditionProcess.js
index 9b60a2f7aec..daa85fa01b4 100644
--- a/entity/DescriptionTranslation_entity/recordcontainers/db/conditionProcess.js
+++ b/entity/DescriptionTranslation_entity/recordcontainers/db/conditionProcess.js
@@ -4,6 +4,5 @@ import("Sql_lib");
 var cond = newWhere()
             .andIfSet("DESCRIPTIONTRANSLATION.OBJECT_TYPE", "$param.ObjectType_param")
             .andIfSet("DESCRIPTIONTRANSLATION.OBJECT_ROWID", "$param.ObjectRowid_param");
-                       
-//TODO: use a preparedCondition (.build instead of .toString) when available #1030812 #1034026
+
 result.string(cond.toString());
\ No newline at end of file
diff --git a/entity/DocumentTemplateLink_entity/recordcontainers/db/conditionProcess.js b/entity/DocumentTemplateLink_entity/recordcontainers/db/conditionProcess.js
index 72212f07978..0c634187ccb 100644
--- a/entity/DocumentTemplateLink_entity/recordcontainers/db/conditionProcess.js
+++ b/entity/DocumentTemplateLink_entity/recordcontainers/db/conditionProcess.js
@@ -4,5 +4,4 @@ import("Sql_lib");
 
 var cond = newWhereIfSet("DOCUMENTTEMPLATELINK.DOCUMENTTEMPLATE_ID_PARENT", "$param.DocumentId_param");
 
-//TODO: use a preparedCondition (.build instead of .toString) when available #1030812 #1034026
 result.string(cond.toString());
\ No newline at end of file
diff --git a/entity/DocumentTemplateTypeCategory_entity/recordcontainers/db/conditionProcess.js b/entity/DocumentTemplateTypeCategory_entity/recordcontainers/db/conditionProcess.js
index 42e83fc6e02..0cec405b433 100644
--- a/entity/DocumentTemplateTypeCategory_entity/recordcontainers/db/conditionProcess.js
+++ b/entity/DocumentTemplateTypeCategory_entity/recordcontainers/db/conditionProcess.js
@@ -19,5 +19,4 @@ if (usageFilter)
             , SqlBuilder.IN());
 }
 
-//TODO: use a preparedCondition (.build instead of .toString) when available #1030812 #1034026
 result.string(cond.toString());
\ No newline at end of file
diff --git a/entity/Forecast_entity/recordcontainers/db/conditionProcess.js b/entity/Forecast_entity/recordcontainers/db/conditionProcess.js
index a4ec9464001..0c0805ca637 100644
--- a/entity/Forecast_entity/recordcontainers/db/conditionProcess.js
+++ b/entity/Forecast_entity/recordcontainers/db/conditionProcess.js
@@ -7,5 +7,4 @@ var cond = newWhere()
             .andIfSet("FORECAST.OBJECT_ROWID", "$param.ObjectRowId_param")
             .andIfSet("FORECAST.OBJECT_TYPE", "$param.ObjectType_param");
 
-//TODO: use a preparedCondition (.build instead of .toString) when available #1030812 #1034026
 result.string(cond.toString());
\ No newline at end of file
diff --git a/entity/KeywordAttributeRelation_entity/recordcontainers/db/conditionProcess.js b/entity/KeywordAttributeRelation_entity/recordcontainers/db/conditionProcess.js
index 88a371d6230..08a73e06535 100644
--- a/entity/KeywordAttributeRelation_entity/recordcontainers/db/conditionProcess.js
+++ b/entity/KeywordAttributeRelation_entity/recordcontainers/db/conditionProcess.js
@@ -6,5 +6,4 @@ import("Sql_lib");
 
 var cond = newWhereIfSet("AB_KEYWORD_ATTRIBUTERELATION.AB_KEYWORD_ENTRY_ID", "$param.KeywordEntryId_param");
 
-//TODO: use a preparedCondition (.build instead of .toString) when available #1030812 #1034026
 result.string(cond.toString());
\ No newline at end of file
diff --git a/entity/KeywordAttribute_entity/recordcontainers/db/conditionProcess.js b/entity/KeywordAttribute_entity/recordcontainers/db/conditionProcess.js
index 823c3d4a924..15f1ee62a40 100644
--- a/entity/KeywordAttribute_entity/recordcontainers/db/conditionProcess.js
+++ b/entity/KeywordAttribute_entity/recordcontainers/db/conditionProcess.js
@@ -16,5 +16,4 @@ if (entryIdForFilter)
                 SqlBuilder.NOT_IN())
 }
 
-//TODO: use a preparedCondition (.build instead of .toString) when available #1030812 #1034026
 result.string(cond.toString());
\ No newline at end of file
diff --git a/entity/KeywordEntry_entity/recordcontainers/db/conditionProcess.js b/entity/KeywordEntry_entity/recordcontainers/db/conditionProcess.js
index 6fcb81de353..c2921e933ff 100644
--- a/entity/KeywordEntry_entity/recordcontainers/db/conditionProcess.js
+++ b/entity/KeywordEntry_entity/recordcontainers/db/conditionProcess.js
@@ -23,5 +23,4 @@ if (vars.getString("$param.WhitelistIds_param"))
         cond.noResult(); // force empty result if whitelist is empty
 }
 
-//TODO: use a preparedCondition (.build instead of .toString) when available #1030812 #1034026
 result.string(cond.toString());
diff --git a/entity/Language_entity/recordcontainers/db/conditionProcess.js b/entity/Language_entity/recordcontainers/db/conditionProcess.js
index 9e0e3a69ce2..f36ae3e0f8d 100644
--- a/entity/Language_entity/recordcontainers/db/conditionProcess.js
+++ b/entity/Language_entity/recordcontainers/db/conditionProcess.js
@@ -10,5 +10,4 @@ if (vars.getString("$param.ExcludedIds_param"))
     cond.andIfSet("AB_LANGUAGE.ISO3", JSON.parse(vars.getString("$param.ExcludedIds_param")), SqlBuilder.NOT_IN())
 }
 
-//TODO: use a preparedCondition (.build instead of .toString) when available #1030812 #1034026
 result.string(cond.toString())
\ No newline at end of file
diff --git a/entity/MSTTeamMember_entity/MSTTeamMember_entity.aod b/entity/MSTTeamMember_entity/MSTTeamMember_entity.aod
index d436ee7ef42..72dead10e1d 100644
--- a/entity/MSTTeamMember_entity/MSTTeamMember_entity.aod
+++ b/entity/MSTTeamMember_entity/MSTTeamMember_entity.aod
@@ -13,8 +13,6 @@
       <dependencies>
         <entityDependency>
           <name>335d30c4-7beb-4dcb-8a0f-de85108530a9</name>
-          <entityName>MSTeamsAddMembers_entity</entityName>
-          <fieldName>Members</fieldName>
           <isConsumer v="false" />
         </entityDependency>
       </dependencies>
diff --git a/entity/MSTeamsAddMembers_entity/MSTeamsAddMembers_entity.aod b/entity/MSTeamsAddMembers_entity/MSTeamsAddMembers_entity.aod
deleted file mode 100644
index b3a788b7b01..00000000000
--- a/entity/MSTeamsAddMembers_entity/MSTeamsAddMembers_entity.aod
+++ /dev/null
@@ -1,72 +0,0 @@
-<?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>MSTeamsAddMembers_entity</name>
-  <majorModelMode>DISTRIBUTED</majorModelMode>
-  <documentation>%aditoprj%/entity/MSTeamsAddMembers_entity/documentation.adoc</documentation>
-  <title>Add members</title>
-  <siblings />
-  <recordContainer>jdito</recordContainer>
-  <entityFields>
-    <entityProvider>
-      <name>#PROVIDER</name>
-    </entityProvider>
-    <entityField>
-      <name>UID</name>
-    </entityField>
-    <entityConsumer>
-      <name>Members</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>MSTTeamMember_entity</entityName>
-        <fieldName>#PROVIDER</fieldName>
-      </dependency>
-      <children>
-        <entityParameter>
-          <name>ObjectRowId_param</name>
-          <valueProcess>%aditoprj%/entity/MSTeamsAddMembers_entity/entityfields/members/children/objectrowid_param/valueProcess.js</valueProcess>
-        </entityParameter>
-        <entityParameter>
-          <name>ObjectType_param</name>
-          <valueProcess>%aditoprj%/entity/MSTeamsAddMembers_entity/entityfields/members/children/objecttype_param/valueProcess.js</valueProcess>
-        </entityParameter>
-      </children>
-    </entityConsumer>
-    <entityField>
-      <name>MST_TEAMNAME</name>
-      <title>Team name</title>
-      <valueProcess>%aditoprj%/entity/MSTeamsAddMembers_entity/entityfields/mst_teamname/valueProcess.js</valueProcess>
-    </entityField>
-    <entityField>
-      <name>MST_TEAM_ID</name>
-      <valueProcess>%aditoprj%/entity/MSTeamsAddMembers_entity/entityfields/mst_team_id/valueProcess.js</valueProcess>
-    </entityField>
-    <entityParameter>
-      <name>ObjectRowId_param</name>
-      <expose v="true" />
-    </entityParameter>
-    <entityParameter>
-      <name>ObjectType_param</name>
-      <expose v="true" />
-    </entityParameter>
-    <entityProvider>
-      <name>#PROVIDER_AGGREGATES</name>
-      <useAggregates v="true" />
-    </entityProvider>
-  </entityFields>
-  <recordContainers>
-    <jDitoRecordContainer>
-      <name>jdito</name>
-      <jDitoRecordAlias>Data_alias</jDitoRecordAlias>
-      <contentProcess>%aditoprj%/entity/MSTeamsAddMembers_entity/recordcontainers/jdito/contentProcess.js</contentProcess>
-      <onInsert>%aditoprj%/entity/MSTeamsAddMembers_entity/recordcontainers/jdito/onInsert.js</onInsert>
-      <recordFieldMappings>
-        <jDitoRecordFieldMapping>
-          <name>UID.value</name>
-        </jDitoRecordFieldMapping>
-        <jDitoRecordFieldMapping>
-          <name>MST_TEAM_ID.value</name>
-        </jDitoRecordFieldMapping>
-      </recordFieldMappings>
-    </jDitoRecordContainer>
-  </recordContainers>
-</entity>
diff --git a/entity/MSTeamsAddMembers_entity/documentation.adoc b/entity/MSTeamsAddMembers_entity/documentation.adoc
deleted file mode 100644
index 228acd4d940..00000000000
--- a/entity/MSTeamsAddMembers_entity/documentation.adoc
+++ /dev/null
@@ -1,14 +0,0 @@
-MSTeamsAddMembers
-============
-
-== Overview ==
-MSTeamsAddMembers is used to add Members 
-
-== A MSTeamsAddMembers consists of some modules: ==
-- MSTeamsAddMembers itself
-
-== BestPractice ==
-
-== FAQ ==
-
-
diff --git a/entity/MSTeamsAddMembers_entity/entityfields/members/children/objectrowid_param/valueProcess.js b/entity/MSTeamsAddMembers_entity/entityfields/members/children/objectrowid_param/valueProcess.js
deleted file mode 100644
index dc0d70ccbe7..00000000000
--- a/entity/MSTeamsAddMembers_entity/entityfields/members/children/objectrowid_param/valueProcess.js
+++ /dev/null
@@ -1,4 +0,0 @@
-import("system.vars");
-import("system.result");
-
-result.string(vars.get("$param.ObjectRowId_param"));
\ No newline at end of file
diff --git a/entity/MSTeamsAddMembers_entity/entityfields/members/children/objecttype_param/valueProcess.js b/entity/MSTeamsAddMembers_entity/entityfields/members/children/objecttype_param/valueProcess.js
deleted file mode 100644
index 95c8514f3bb..00000000000
--- a/entity/MSTeamsAddMembers_entity/entityfields/members/children/objecttype_param/valueProcess.js
+++ /dev/null
@@ -1,4 +0,0 @@
-import("system.vars");
-import("system.result");
-
-result.string(vars.get("$param.ObjectType_param"));
\ No newline at end of file
diff --git a/entity/MSTeamsAddMembers_entity/entityfields/mst_team_id/valueProcess.js b/entity/MSTeamsAddMembers_entity/entityfields/mst_team_id/valueProcess.js
deleted file mode 100644
index 3db681dd8d2..00000000000
--- a/entity/MSTeamsAddMembers_entity/entityfields/mst_team_id/valueProcess.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import("system.result");
-import("Sql_lib");
-
-result.string(newSelect("MST_TEAM_ID")
-    .from("SALESPROJECT")
-    .where("SALESPROJECT.SALESPROJECTID", "$param.SalesprojectId_param")
-    .cell());
\ No newline at end of file
diff --git a/entity/MSTeamsAddMembers_entity/entityfields/mst_teamname/valueProcess.js b/entity/MSTeamsAddMembers_entity/entityfields/mst_teamname/valueProcess.js
deleted file mode 100644
index 7945448b1d2..00000000000
--- a/entity/MSTeamsAddMembers_entity/entityfields/mst_teamname/valueProcess.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import("system.result");
-import("Sql_lib");
-
-result.string(newSelect("TEAMNAME")
-    .from("MST_TEAM")
-    .where("MST_TEAM.MST_TEAMID", "$field.MST_TEAM_ID")
-    .cell());
\ No newline at end of file
diff --git a/entity/MSTeamsAddMembers_entity/recordcontainers/jdito/contentProcess.js b/entity/MSTeamsAddMembers_entity/recordcontainers/jdito/contentProcess.js
deleted file mode 100644
index af9ece7caa7..00000000000
--- a/entity/MSTeamsAddMembers_entity/recordcontainers/jdito/contentProcess.js
+++ /dev/null
@@ -1,9 +0,0 @@
-import("system.result");
-import("system.vars");
-
-//TODO: This dummy implementation shouldn't be nescessary here. Remove this process eventually. #1051003
-var rows = [];
-if (vars.get("$local.idvalues"))
-    rows = vars.get("$local.idvalues").map(function (id) {return [id, ""];});
-
-result.object(rows);
\ No newline at end of file
diff --git a/entity/MSTeamsAddMembers_entity/recordcontainers/jdito/onInsert.js b/entity/MSTeamsAddMembers_entity/recordcontainers/jdito/onInsert.js
deleted file mode 100644
index 584fbcf9708..00000000000
--- a/entity/MSTeamsAddMembers_entity/recordcontainers/jdito/onInsert.js
+++ /dev/null
@@ -1,43 +0,0 @@
-import("Communication_lib");
-import("Sql_lib");
-import("system.vars");
-import("system.teams");
-import("system.tools");
-import("Employee_lib");
-
-var rowdata = vars.get("$local.rowdata");
-var teamId = rowdata["MST_TEAM_ID.value"];
-var teamMembers = vars.get("$field.Members.insertedRows");
-
-var internalMembers = [];
-var externalMembers = [];
-teamMembers.forEach(function (teamMember)
-{
-    var memberUser = EmployeeUtils.getUserByContactId(teamMember.MEMBER);
-    if (!memberUser)
-    {
-        var memberEmail = CommUtil.getStandardMail(teamMember.MEMBER);
-        if (memberEmail)
-        {
-            externalMembers.push(
-                teams.createExternalUserConfig(memberEmail)
-                    .sendInvitation(teamMember.ROLE_OR_INVITE == "invite")
-            );
-        }
-        return;
-    }
-    var memberAzureId = memberUser[tools.PARAMS][tools.TEAMS_AZUREID];
-    var memberUpn = memberUser[tools.PARAMS][tools.TEAMS_AZUREUPN];
-    if (!memberAzureId && memberUpn)
-        memberAzureId = teams.getInternalAzureId(memberUpn);
-    if (memberAzureId)
-    {
-        internalMembers.push(teams.createInternalUserConfig(memberAzureId).setOwner(teamMember.ROLE_OR_INVITE == "isOwner"));
-    }
-});
-
-if (internalMembers.length !== 0)
-    teams.addInternalMembers(teamId, internalMembers);
-
-if (externalMembers.length !== 0)
-    teams.addExternalMembers(teamId, externalMembers);
\ No newline at end of file
diff --git a/entity/Member_entity/recordcontainers/db/conditionProcess.js b/entity/Member_entity/recordcontainers/db/conditionProcess.js
index 8ea033217e4..ce742b4d37a 100644
--- a/entity/Member_entity/recordcontainers/db/conditionProcess.js
+++ b/entity/Member_entity/recordcontainers/db/conditionProcess.js
@@ -6,5 +6,4 @@ var cond = newWhere()
             .andIfSet("OBJECTMEMBER.OBJECT_ROWID", "$param.ObjectRowId_param")
             .andIfSet("OBJECTMEMBER.OBJECT_TYPE", "$param.ObjectType_param");
 
-//TODO: use a preparedCondition (.build instead of .toString) when available #1030812 #1034026
 result.string(cond.toString());
\ No newline at end of file
diff --git a/entity/Offer_entity/recordcontainers/db/conditionProcess.js b/entity/Offer_entity/recordcontainers/db/conditionProcess.js
index 001612ec194..eabc7f24541 100644
--- a/entity/Offer_entity/recordcontainers/db/conditionProcess.js
+++ b/entity/Offer_entity/recordcontainers/db/conditionProcess.js
@@ -14,5 +14,4 @@ else {
 
 cond.andIfSet("OFFER.STATUS", "$param.OfferStatus_param")
 
-//TODO: use a preparedCondition (.build instead of .toString) when available #1030812 #1034026
 result.string(cond.toString());
\ No newline at end of file
diff --git a/entity/Offeritem_entity/recordcontainers/db/conditionProcess.js b/entity/Offeritem_entity/recordcontainers/db/conditionProcess.js
index 82c536561aa..ee1e6cbd847 100644
--- a/entity/Offeritem_entity/recordcontainers/db/conditionProcess.js
+++ b/entity/Offeritem_entity/recordcontainers/db/conditionProcess.js
@@ -5,5 +5,4 @@ import("system.vars");
 
 var cond = newWhereIfSet("OFFERITEM.OFFER_ID", "$param.OfferId_param")
 
-//TODO: use a preparedCondition (.build instead of .toString) when available #1030812 #1034026
 result.string(cond.toString());
\ No newline at end of file
diff --git a/entity/Order_entity/recordcontainers/db/conditionProcess.js b/entity/Order_entity/recordcontainers/db/conditionProcess.js
index d799cf12382..572d8249ded 100644
--- a/entity/Order_entity/recordcontainers/db/conditionProcess.js
+++ b/entity/Order_entity/recordcontainers/db/conditionProcess.js
@@ -11,5 +11,4 @@ else {
     cond.andIfSet("SALESORDER.OBJECT_ROWID", "$param.ObjectRowId_param")
         .andIfSet("SALESORDER.OBJECT_TYPE", "$param.ObjectType_param");
 }
-//TODO: use a preparedCondition (.build instead of .toString) when available #1030812 #1034026
 result.string(cond.toString());
\ No newline at end of file
diff --git a/entity/Orderitem_entity/recordcontainers/db/conditionProcess.js b/entity/Orderitem_entity/recordcontainers/db/conditionProcess.js
index 59572077570..6794f43bc98 100644
--- a/entity/Orderitem_entity/recordcontainers/db/conditionProcess.js
+++ b/entity/Orderitem_entity/recordcontainers/db/conditionProcess.js
@@ -5,5 +5,4 @@ import("system.vars");
 
 var cond = newWhereIfSet("SALESORDERITEM.SALESORDER_ID", "$param.OrderId_param")
 
-//TODO: use a preparedCondition (.build instead of .toString) when available #1030812 #1034026
 result.string(cond.toString());
\ No newline at end of file
diff --git a/entity/Organisation_entity/recordcontainers/db/conditionProcess.js b/entity/Organisation_entity/recordcontainers/db/conditionProcess.js
index 7ef4fdefa4f..a38a50972c0 100644
--- a/entity/Organisation_entity/recordcontainers/db/conditionProcess.js
+++ b/entity/Organisation_entity/recordcontainers/db/conditionProcess.js
@@ -55,5 +55,4 @@ if (vars.exists("$param.OnlyOwnSupervised_param") && vars.get("$param.OnlyOwnSup
         SqlBuilder.EXISTS()
     );
 }
-//TODO: use a preparedCondition (.build instead of .toString) when available #1030812 #1034026
 result.string(cond.toString());
\ No newline at end of file
diff --git a/entity/Person_entity/recordcontainers/db/conditionProcess.js b/entity/Person_entity/recordcontainers/db/conditionProcess.js
index 04f984cbc56..33881115836 100644
--- a/entity/Person_entity/recordcontainers/db/conditionProcess.js
+++ b/entity/Person_entity/recordcontainers/db/conditionProcess.js
@@ -41,5 +41,4 @@ if (vars.exists("$param.OnlyOwnSupervised_param") && vars.get("$param.OnlyOwnSup
     );
 }
 
-//TODO: use a preparedCondition (.build instead of .toString) when available #1030812 #1034026
 result.string(cond.toString());
\ No newline at end of file
diff --git a/entity/PrivatePerson_entity/recordcontainers/db/conditionProcess.js b/entity/PrivatePerson_entity/recordcontainers/db/conditionProcess.js
index d7230024504..69206e0479d 100644
--- a/entity/PrivatePerson_entity/recordcontainers/db/conditionProcess.js
+++ b/entity/PrivatePerson_entity/recordcontainers/db/conditionProcess.js
@@ -11,5 +11,4 @@ if (vars.get("$param.ExcludedPersonIds_param"))
     cond.andIfSet("PERSON.PERSONID", excludedPersons, SqlBuilder.NOT_IN());
 }
 
-//TODO: use a preparedCondition (.build instead of .toString) when available #1030812 #1034026
 result.string(cond.toString());
\ No newline at end of file
diff --git a/entity/Prod2prod_entity/entityfields/products/children/excludedproducts_param/valueProcess.js b/entity/Prod2prod_entity/entityfields/products/children/excludedproducts_param/valueProcess.js
index bbca2049205..ca417dc781a 100644
--- a/entity/Prod2prod_entity/entityfields/products/children/excludedproducts_param/valueProcess.js
+++ b/entity/Prod2prod_entity/entityfields/products/children/excludedproducts_param/valueProcess.js
@@ -31,7 +31,6 @@ else
 
 result.object(excludeIDs);
 
-// TODO: remove code duplication, better param naming and using SqlBuilder
 function _getParentID(pID, pIDs)
 {
     //Ermitteln welche Produkte ausgeschlossen werden müssen.
diff --git a/entity/Product_entity/recordcontainers/db/conditionProcess.js b/entity/Product_entity/recordcontainers/db/conditionProcess.js
index 3602fca8eb0..d2f79f17d27 100644
--- a/entity/Product_entity/recordcontainers/db/conditionProcess.js
+++ b/entity/Product_entity/recordcontainers/db/conditionProcess.js
@@ -11,5 +11,4 @@ if (vars.exists("$param.ExcludedProducts_param") && vars.get("$param.ExcludedPro
     productCond.andIfSet("PRODUCT.PRODUCTID", excludedIds, SqlBuilder.NOT_IN());
 }
 
-//TODO: use a preparedCondition (.build instead of .toString) when available #1030812 #1034026
 result.string(productCond.toString());
\ No newline at end of file
diff --git a/entity/Productprice_entity/recordcontainers/db/conditionProcess.js b/entity/Productprice_entity/recordcontainers/db/conditionProcess.js
index a68cf9891b4..869e14a88e9 100644
--- a/entity/Productprice_entity/recordcontainers/db/conditionProcess.js
+++ b/entity/Productprice_entity/recordcontainers/db/conditionProcess.js
@@ -5,5 +5,4 @@ var cond = newWhere()
                 .andIfSet("PRODUCTPRICE.PRODUCT_ID", "$param.ProductId_param")
                 .andIfSet("PRODUCTPRICE.CONTACT_ID", "$param.ContactId_param");
 
-//TODO: use a preparedCondition (.build instead of .toString) when available #1030812 #1034026
 result.string(cond.toString());
\ No newline at end of file
diff --git a/entity/SalesprojectMilestone_entity/recordcontainers/db/conditionProcess.js b/entity/SalesprojectMilestone_entity/recordcontainers/db/conditionProcess.js
index 9a21e39ea75..06315b6b320 100644
--- a/entity/SalesprojectMilestone_entity/recordcontainers/db/conditionProcess.js
+++ b/entity/SalesprojectMilestone_entity/recordcontainers/db/conditionProcess.js
@@ -5,5 +5,4 @@ var cond = newWhere()
             .andIfSet("SALESPROJECT_MILESTONE.SALESPROJECT_ID", "$param.SalesprojectId_param")
             .andIfSet("SALESPROJECT_MILESTONE.KIND", "$param.Kind_param");
 
-//TODO: use a preparedCondition (.build instead of .toString) when available #1030812 #1034026
 result.string(cond.toString());
\ No newline at end of file
diff --git a/entity/SalesprojectSource_entity/recordcontainers/db/conditionProcess.js b/entity/SalesprojectSource_entity/recordcontainers/db/conditionProcess.js
index bad867525a1..ab13b330a62 100644
--- a/entity/SalesprojectSource_entity/recordcontainers/db/conditionProcess.js
+++ b/entity/SalesprojectSource_entity/recordcontainers/db/conditionProcess.js
@@ -4,5 +4,4 @@ import("Sql_lib");
 
 var cond = newWhereIfSet("SALESPROJECT_TOUCHPOINT.SALESPROJECT_ID", "$param.SalesprojectId_param");
 
-//TODO: use a preparedCondition (.build instead of .toString) when available #1030812 #1034026
 result.string(cond.toString());
\ No newline at end of file
diff --git a/entity/Salesproject_entity/recordcontainers/db/conditionProcess.js b/entity/Salesproject_entity/recordcontainers/db/conditionProcess.js
index 507cd54e83a..94792e06054 100644
--- a/entity/Salesproject_entity/recordcontainers/db/conditionProcess.js
+++ b/entity/Salesproject_entity/recordcontainers/db/conditionProcess.js
@@ -3,7 +3,6 @@ import("system.result");
 import("system.vars");
 import("Sql_lib");
 
-//TODO: use a preparedCondition (.build instead of .toString) when available #1030812 #1034026
 result.string(newWhereIfSet("SALESPROJECT.CONTACT_ID", "$param.ContactId_param")
                 .andIfSet("SALESPROJECT.STATUS", "$param.Status_param")
                 .toString());
\ No newline at end of file
diff --git a/entity/Stock_entity/recordcontainers/db/conditionProcess.js b/entity/Stock_entity/recordcontainers/db/conditionProcess.js
index eb881a660fe..b0ca1d729b5 100644
--- a/entity/Stock_entity/recordcontainers/db/conditionProcess.js
+++ b/entity/Stock_entity/recordcontainers/db/conditionProcess.js
@@ -1,6 +1,5 @@
 import("system.result");
 import("Sql_lib");
 
-//TODO: use a preparedCondition (.build instead of .toString) when available #1030812 #1034026
 result.string(newWhereIfSet("STOCK.PRODUCT_ID", "$param.ProductId_param")
                 .toString());
\ No newline at end of file
diff --git a/entity/SupportTicket_entity/recordcontainers/db/conditionProcess.js b/entity/SupportTicket_entity/recordcontainers/db/conditionProcess.js
index 1cc6eb48ac1..058d0ec0694 100644
--- a/entity/SupportTicket_entity/recordcontainers/db/conditionProcess.js
+++ b/entity/SupportTicket_entity/recordcontainers/db/conditionProcess.js
@@ -31,5 +31,4 @@ if (vars.get("$param.RowId_param") && vars.get("$param.ObjectId_param"))
 cond.andIfSet("TASK.PARENT_ID", "$param.ParentId_param");
 cond.andIfSet("TASK.PARENT_CONTEXT", "$param.ParentContext_param");
 
-//TODO: use a preparedCondition (.build instead of .toString) when available #1030812 #1034026
 result.string(cond.toString());
\ No newline at end of file
diff --git a/entity/TaskLink_entity/recordcontainers/db/conditionProcess.js b/entity/TaskLink_entity/recordcontainers/db/conditionProcess.js
index 1b4535c9556..2b98b257ac0 100644
--- a/entity/TaskLink_entity/recordcontainers/db/conditionProcess.js
+++ b/entity/TaskLink_entity/recordcontainers/db/conditionProcess.js
@@ -3,5 +3,4 @@ import("Sql_lib");
 
 var cond = newWhereIfSet("TASKLINK.TASK_ID", "$param.TaskId_param");
 
-//TODO: use a preparedCondition (.build instead of .toString) when available #1030812 #1034026
 result.string(cond.toString());
\ No newline at end of file
diff --git a/entity/Task_entity/recordcontainers/db/conditionProcess.js b/entity/Task_entity/recordcontainers/db/conditionProcess.js
index d8acb4d11fe..c74072623eb 100644
--- a/entity/Task_entity/recordcontainers/db/conditionProcess.js
+++ b/entity/Task_entity/recordcontainers/db/conditionProcess.js
@@ -48,6 +48,5 @@ else
     }
     cond.and(protectionLevelCondition);
   
-    //TODO: use a preparedCondition (.build instead of .toString) when available #1030812 #1034026
     result.string(cond.toString());
 }
\ No newline at end of file
diff --git a/entity/Timetracking_entity/recordcontainers/db/conditionProcess.js b/entity/Timetracking_entity/recordcontainers/db/conditionProcess.js
index 958be571623..9b3b9ce6518 100644
--- a/entity/Timetracking_entity/recordcontainers/db/conditionProcess.js
+++ b/entity/Timetracking_entity/recordcontainers/db/conditionProcess.js
@@ -3,7 +3,6 @@ import("system.db");
 import("system.result");
 import("Sql_lib");
 
-//TODO: use a preparedCondition (.build instead of .toString) when available #1030812 #1034026
 result.string(newWhereIfSet("TIMETRACKING.OBJECT_ID", "$param.ObjectId_param")
                 .andIfSet("TIMETRACKING.ROW_ID", "$param.RowId_param")
                 .toString());
diff --git a/report/Offer_report/ribbon/ribbontasks/task_report/customcomponents/button/imageData.png b/report/Offer_report/ribbon/ribbontasks/task_report/customcomponents/button/imageData.png
deleted file mode 100644
index 49cda7d673d367ab30051c9aa9dda1dcfad22177..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 411
zcmV;M0c8G(P)<h;3K|Lk000e1NJLTq000;O000;W1^@s6;CDUv0004ENkl<ZcwV)X
zVX?wM41{X|3(Qmj7M=wxU;ztQzycPq@GM{f3+2ATcDA`(VVLq`q20@6lg;(IVHmn!
zq9WEtMXZgk@B2@1EI1Vm4Y0nC``!s`3(l4V{P)jfLR`NU{Jr)s3Q$d~Fvd6z1$T=d
zMOp%G#id}A#AKjjiSWP41Uxy<;&)+9c3}z6SVbJ2OkGC-x5blVk9aEM{c0TW0jrB^
z6i_w%XUVb4<K1(&QQ|WJZ;fX-JQar>p4<hZFtL>YL6B?`=bkeIPr|#_;t3OfasgGN
zVL6vo@7B?&c%S250&az>!PBV{OQ5xuxcr|TQy0kmj~2+zDDGX2c`^atpei|4!~jnY
zsF+xv*Hln8gVqsskSyLof*hy>Jega<Y4OX=2kLyZu@Yc#`p}}t*N9&-)wzhS=6Kl=
z2QQnvt3?5U&3+9m!9UCjEdfE5W|$4Lg;9W?U!o$`#slT_6Hz3TKg9q5002ovPDHLk
FV1ff@vj_kH

diff --git a/report/Offer_report/ribbon/ribbontasks/task_report/customcomponents/button/onClick.js b/report/Offer_report/ribbon/ribbontasks/task_report/customcomponents/button/onClick.js
deleted file mode 100644
index 354885d3893..00000000000
--- a/report/Offer_report/ribbon/ribbontasks/task_report/customcomponents/button/onClick.js
+++ /dev/null
@@ -1,44 +0,0 @@
-import("system.text");
-import("system.swing");
-import("system.translate");
-import("system.question");
-import("system.vars");
-import("system.db");
-
-//@TODO: remove
-
-var details = vars.get("$global.RptOfferOrderDetails");
-var orgid = db.cell("select ORGANISATION_ID from CONTACT where CONTACTID = '" + details[1] + "'");
-if (orgid.substr(0, 2) == '0 ') // Privatperson
-{
-    var count = db.cell("select count(*) from COMMUNICATION where medium_id = 3 and ISSTANDARD = 1 and CONTACT_ID = '" + details[1] + "'");
-    if (count == "0") question.showMessage(translate.text("no standard email office"));
-    else
-        sendAutoMail( translate.text("Offer") + " " + details[0], details[1], "Email_Angebot", details[2], "AGB", [], [["SPNR", details[5]]] );
-}
-else // Funktion - Person in Firma
-{
-    var orgrelid = db.cell("select CONTACTID from CONTACT where ORGANISATION_ID = '" + orgid + "'");
-    var relobjid = db.array(db.COLUMN, "select ORGANISATION_ID from OBJECTRELATION join CONTACT on CONTACTID = DEST_ID where SOURCE_ID = '" + orgrelid + "' and RELVALUE = 9");
-       contactid = db.array(db.COLUMN, "select CONTACTID from CONTACT left join PERSON on PERSONID = PERSON_ID"
-        + " where CONTACT.STATUS = 1 and ORGANISATION_ID in ('" + orgid + "', '" + relobjid.join("','") + "')");
-    
-    vars.set("$local.relids", "'" + contactid.join("','") + "'");
-        vars.set("$local.cmb_person_to", details[1]); //Empfänger vorbelegen
-    contactid = swing.askUserQuestion("Email", "DLG_CHOOSE_PERSON_FOREMAIL")
-    if ( contactid == null )	contactid = ""; //Abbruch geklickt
-    else
-    {
-        var reltoid = contactid["DLG_CHOOSE_PERSON_FOREMAIL.cmb_person_to"];
-
-        var relccid = text.decodeMS(contactid["DLG_CHOOSE_PERSON_FOREMAIL.tbl_person_cc"]);
-        if (relccid.length == 0)	contactid = ""; // keine Person markiert und OK geklickt
-        else	
-            relccid = db.array(db.COLUMN, "select ADDR from COMMUNICATION where MEDIUM_ID = 3 and ISSTANDARD = 1 and "
-                + "CONTACT_ID in ('" + relccid.join("','") + "') and CONTACT_ID <> '" + reltoid + "'");
-
-        if ( reltoid != "" ) 
-            sendAutoMail( translate.text(details[3]) + " " + details[0], reltoid, "Email_" + details[3], details[2], "AGB", relccid, [["SPNR", details[5]]] );
-        else question.showMessage(translate.text("Put Reciever Into To"));
-    }
-}
\ No newline at end of file
diff --git a/report/Salesorder_report/ribbon/ribbontasks/task_report/customcomponents/button/imageData.png b/report/Salesorder_report/ribbon/ribbontasks/task_report/customcomponents/button/imageData.png
deleted file mode 100644
index 49cda7d673d367ab30051c9aa9dda1dcfad22177..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 411
zcmV;M0c8G(P)<h;3K|Lk000e1NJLTq000;O000;W1^@s6;CDUv0004ENkl<ZcwV)X
zVX?wM41{X|3(Qmj7M=wxU;ztQzycPq@GM{f3+2ATcDA`(VVLq`q20@6lg;(IVHmn!
zq9WEtMXZgk@B2@1EI1Vm4Y0nC``!s`3(l4V{P)jfLR`NU{Jr)s3Q$d~Fvd6z1$T=d
zMOp%G#id}A#AKjjiSWP41Uxy<;&)+9c3}z6SVbJ2OkGC-x5blVk9aEM{c0TW0jrB^
z6i_w%XUVb4<K1(&QQ|WJZ;fX-JQar>p4<hZFtL>YL6B?`=bkeIPr|#_;t3OfasgGN
zVL6vo@7B?&c%S250&az>!PBV{OQ5xuxcr|TQy0kmj~2+zDDGX2c`^atpei|4!~jnY
zsF+xv*Hln8gVqsskSyLof*hy>Jega<Y4OX=2kLyZu@Yc#`p}}t*N9&-)wzhS=6Kl=
z2QQnvt3?5U&3+9m!9UCjEdfE5W|$4Lg;9W?U!o$`#slT_6Hz3TKg9q5002ovPDHLk
FV1ff@vj_kH

diff --git a/report/Salesorder_report/ribbon/ribbontasks/task_report/customcomponents/button/onClick.js b/report/Salesorder_report/ribbon/ribbontasks/task_report/customcomponents/button/onClick.js
deleted file mode 100644
index dad46b278af..00000000000
--- a/report/Salesorder_report/ribbon/ribbontasks/task_report/customcomponents/button/onClick.js
+++ /dev/null
@@ -1,46 +0,0 @@
-import("system.text");
-import("system.question");
-import("system.translate");
-import("system.swing");
-import("system.vars");
-import("system.db");
-
-//@TODO: remove
-
-var details = vars.get("$global.RptOfferOrderDetails");
-var orgid = db.array(db.ROW, "select ORG_ID, LANG from RELATION where RELATIONID = '" + details[1] + "'");
-if (orgid[0].substr(0, 2) == '0 ') // Privatperson
-{
-    var count = db.cell("select count(*) from COMM where medium_id = 3 and STANDARD = 1 and RELATION_ID = '" + details[1] + "'");
-    if (count == "0") question.showMessage(translate.text("No Standard-E-Mail available!"));
-    else
-        sendAutoMail( translate.text(details[3]) + " " + details[0], details[1], details[4], details[2], details[5], relccid, [["SPNR", details[6]]], orgid[1] );
-}
-else // Funktion - Person in Firma
-{
-    var orgrelid = db.cell("select RELATIONID from RELATION where ORG_ID = '" + orgid + "'");
-    var relobjid = db.array(db.COLUMN, "select ORG_ID from OBJECTRELATION join RELATION on RELATIONID = DEST_ID where SOURCE_ID = '" + orgrelid + "' and RELVALUE = 9");
-    relationid = db.array(db.COLUMN, "select RELATIONID from RELATION left join PERS on PERSID = PERS_ID"
-        + " where RELATION.STATUS = 1 and ORG_ID in ('" + orgid[0] + "', '" + relobjid.join("','") + "')");
-    
-    vars.set("$local.relids", "'" + relationid.join("','") + "'");
-    vars.set("$local.cmb_pers_to", details[1]); //Empfänger vorbelegen
-        
-    relationid = swing.askUserQuestion("Email", "DLG_CHOOSE_PERS_FOREMAIL")
-    if ( relationid == null ) relationid = ""; //Abbruch geklickt
-    else
-    {
-        var reltoid = relationid["DLG_CHOOSE_PERS_FOREMAIL.cmb_pers_to"];
-        var language = db.cell("select LANG from RELATION where RELATIONID = '" + reltoid + "'")
-
-        var relccid = text.decodeMS(relationid["DLG_CHOOSE_PERS_FOREMAIL.tbl_pers_cc"]);
-        if (relccid.length == 0) relationid = ""; // keine Person markiert und OK geklickt
-        else	
-            relccid = db.array(db.COLUMN, "select ADDR from COMM where MEDIUM_ID = 3 and STANDARD = 1 and "
-                + "RELATION_ID in ('" + relccid.join("','") + "') and RELATION_ID <> '" + reltoid + "'");
-
-        if ( reltoid != "" ) 
-            sendAutoMail( translate.text(details[3]) + " " + details[0], reltoid, details[4], details[2], details[5], relccid, [["SPNR", details[6]]], language );
-        else question.showMessage(translate.text("Please enter Addressee in 'to'"));
-    }
-}
\ No newline at end of file
-- 
GitLab


From d19b35a25b0202799ae7303d24c1f526d9a393ff Mon Sep 17 00:00:00 2001
From: Sebastian Listl <s.listl@adito.de>
Date: Wed, 2 Dec 2020 16:49:54 +0100
Subject: [PATCH 155/184] Scan services report fix

---
 report/Offer_report/Offer_report.aod           | 8 --------
 report/Offer_report/reportData.jrxml           | 6 +++---
 report/Salesorder_report/Salesorder_report.aod | 8 --------
 report/Salesorder_report/reportData.jrxml      | 2 +-
 4 files changed, 4 insertions(+), 20 deletions(-)

diff --git a/report/Offer_report/Offer_report.aod b/report/Offer_report/Offer_report.aod
index 737a6889a7a..b273251e794 100644
--- a/report/Offer_report/Offer_report.aod
+++ b/report/Offer_report/Offer_report.aod
@@ -33,14 +33,6 @@
         <icon>REPORT_24</icon>
         <enabled v="true" />
         <layoutPosition>POSITION_TOP</layoutPosition>
-        <customComponents>
-          <rcCommandButton>
-            <name>Button</name>
-            <onClick>%aditoprj%/report/Offer_report/ribbon/ribbontasks/task_report/customcomponents/button/onClick.js</onClick>
-            <title>Senden per E-Mail</title>
-            <imageData>%aditoprj%/report/Offer_report/ribbon/ribbontasks/task_report/customcomponents/button/imageData.png</imageData>
-          </rcCommandButton>
-        </customComponents>
       </ribbonTask>
     </ribbonTasks>
   </ribbon>
diff --git a/report/Offer_report/reportData.jrxml b/report/Offer_report/reportData.jrxml
index f2afe827513..2f3a25316e0 100644
--- a/report/Offer_report/reportData.jrxml
+++ b/report/Offer_report/reportData.jrxml
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <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="report1" 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="1.9487171000000014"/>
+	<property name="ireport.zoom" value="1.0"/>
 	<property name="ireport.x" value="0"/>
-	<property name="ireport.y" value="190"/>
+	<property name="ireport.y" value="0"/>
 	<parameter name="myAddr" class="java.lang.String"/>
 	<parameter name="Pos" class="java.lang.String"/>
 	<parameter name="Articledescription" class="java.lang.String"/>
@@ -24,7 +24,7 @@
 	<parameter name="OfferDeliveryTerm" class="java.lang.String"/>
 	<parameter name="responsible" class="java.lang.String"/>
 	<parameter name="SUBREPORT_DIR" class="java.lang.String" isForPrompting="false">
-		<defaultValueExpression><![CDATA["C:\\Entwicklung\\0.0\\project\\basic2\\report\\Offer_report\\"]]></defaultValueExpression>
+		<defaultValueExpression><![CDATA["C:\\dev\\project\\basic\\report\\Offer_report\\"]]></defaultValueExpression>
 	</parameter>
 	<parameter name="adito.datasource.subdata" class="java.lang.Object"/>
 	<parameter name="SUMITEMSUM" class="java.lang.Double"/>
diff --git a/report/Salesorder_report/Salesorder_report.aod b/report/Salesorder_report/Salesorder_report.aod
index 51a1a8215ca..764967a65bf 100644
--- a/report/Salesorder_report/Salesorder_report.aod
+++ b/report/Salesorder_report/Salesorder_report.aod
@@ -32,14 +32,6 @@
         <icon>REPORT_24</icon>
         <enabled v="true" />
         <layoutPosition>POSITION_TOP</layoutPosition>
-        <customComponents>
-          <rcCommandButton>
-            <name>Button</name>
-            <onClick>%aditoprj%/report/Salesorder_report/ribbon/ribbontasks/task_report/customcomponents/button/onClick.js</onClick>
-            <title>Senden per E-Mail</title>
-            <imageData>%aditoprj%/report/Salesorder_report/ribbon/ribbontasks/task_report/customcomponents/button/imageData.png</imageData>
-          </rcCommandButton>
-        </customComponents>
       </ribbonTask>
     </ribbonTasks>
   </ribbon>
diff --git a/report/Salesorder_report/reportData.jrxml b/report/Salesorder_report/reportData.jrxml
index 496fcde2e9e..dddb5cf7b47 100644
--- a/report/Salesorder_report/reportData.jrxml
+++ b/report/Salesorder_report/reportData.jrxml
@@ -27,7 +27,7 @@
 	<parameter name="SUMITEMSUM" class="java.lang.Double"/>
 	<parameter name="TOTAL" class="java.lang.String"/>
 	<parameter name="SUBREPORT_DIR" class="java.lang.String" isForPrompting="false">
-		<defaultValueExpression><![CDATA["C:\\Entwicklung\\stable2019\\project\\basic\\report\\Salesorder_report\\"]]></defaultValueExpression>
+		<defaultValueExpression><![CDATA["C:\\dev\\project\\basic\\report\\Salesorder_report\\"]]></defaultValueExpression>
 	</parameter>
 	<parameter name="adito.datasource.subdata" class="java.lang.Object" isForPrompting="false"/>
 	<parameter name="adito.image.myLogo" class="java.lang.String"/>
-- 
GitLab


From dd979f4f0defe527e3a49580e2106ace3cf399ef Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Alexander=20V=C3=B6gl?= <a.voegl@adito.de>
Date: Thu, 3 Dec 2020 11:44:48 +0000
Subject: [PATCH 156/184] [Projekt: Entwicklung - xRM][TicketNr.: 1061957][360
 Grad: Umbenennung ViewTemplate Treetable -> Tree] [Projekt: Entwicklung -
 xRM][TicketNr.: 1053175][Erweiterte 360-Grad Ansicht]

---
 entity/Contract_entity/contentDescriptionProcess.js | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/entity/Contract_entity/contentDescriptionProcess.js b/entity/Contract_entity/contentDescriptionProcess.js
index 03f72c03ff0..c1836a1fcb2 100644
--- a/entity/Contract_entity/contentDescriptionProcess.js
+++ b/entity/Contract_entity/contentDescriptionProcess.js
@@ -6,10 +6,10 @@ import("system.result");
 var res = [translate.text("Payment method") + ": " + vars.get("$field.PAYMENT.displayValue")];
 
 if(vars.get("$field.CONTRACTDUE"))
-    res.push(translate.text("Next due date") + ": " + vars.get("$field.CONTRACTDUE"));
+    res.push(translate.text("Next due date") + ": " + datetime.toDate(vars.get("$field.CONTRACTDUE"), translate.text("dd.MM.yyyy")));
 
 if(vars.get("$field.CONTRACTEND"))
-    res.push(translate.text("Contract expiry date") + ": " + vars.get("$field.CONTRACTEND"))
+    res.push(translate.text("Contract expiry date") + ": " + datetime.toDate(vars.get("$field.CONTRACTEND"), translate.text("dd.MM.yyyy")))
                       
 res.push(translate.text("Creation date") + ": " + datetime.toDate(vars.get("$field.DATE_NEW"), translate.text("dd.MM.yyyy")));
 
-- 
GitLab


From 9d6e5f902dc00cff784ffe1e04873b3e290ce6ae Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Alexander=20V=C3=B6gl?= <a.voegl@adito.de>
Date: Thu, 3 Dec 2020 14:23:55 +0000
Subject: [PATCH 157/184] #1067652 CampaingParticipant filter

---
 .../campaignparticipantcontactids/valueProcess.js |  2 +-
 .../CampaignParticipant_entity.aod                |  8 +++++++-
 .../setsteptoparticipantselection/stateProcess.js | 15 +++++++++++++++
 .../valueProcess.js                               | 12 ++++++++++++
 entity/Employee_entity/Employee_entity.aod        |  4 ++++
 .../recordcontainers/jdito/contentProcess.js      |  5 +++++
 6 files changed, 44 insertions(+), 2 deletions(-)
 create mode 100644 entity/CampaignParticipant_entity/entityfields/filterviewactiongroup/children/setsteptoparticipantselection/stateProcess.js
 create mode 100644 entity/CampaignParticipant_entity/entityfields/responsibleemployees/children/employeecontactidwhitelist_param/valueProcess.js

diff --git a/entity/CampaignAddParticipants_entity/entityfields/campaignparticipantcontactids/valueProcess.js b/entity/CampaignAddParticipants_entity/entityfields/campaignparticipantcontactids/valueProcess.js
index ff279849ceb..d1c7824536e 100644
--- a/entity/CampaignAddParticipants_entity/entityfields/campaignparticipantcontactids/valueProcess.js
+++ b/entity/CampaignAddParticipants_entity/entityfields/campaignparticipantcontactids/valueProcess.js
@@ -29,7 +29,7 @@ if(vars.get("$field.CAMPAIGN_ID"))
         if (vars.get("$param.campaignParticipantsCondition_param"))
         {
             var contactFilterCondition = JSON.parse(vars.get("$param.campaignParticipantsCondition_param")).condition;
-            contactIds = CampaignUtils.GetContactIdsNotInCampaignByCondition(vars.get("$field.CAMPAIGN_ID"), contactFilterCondition, comingfrom);
+            contactIds = CampaignUtils.GetContactIdsInCampaignByCondition(vars.get("$field.CAMPAIGN_ID"), contactFilterCondition);
         } 
         else
         {
diff --git a/entity/CampaignParticipant_entity/CampaignParticipant_entity.aod b/entity/CampaignParticipant_entity/CampaignParticipant_entity.aod
index c83cda0bd56..92f21ead904 100644
--- a/entity/CampaignParticipant_entity/CampaignParticipant_entity.aod
+++ b/entity/CampaignParticipant_entity/CampaignParticipant_entity.aod
@@ -169,9 +169,9 @@
           <title>Update campaign step</title>
           <onActionProcess>%aditoprj%/entity/CampaignParticipant_entity/entityfields/filterviewactiongroup/children/setsteptoparticipantselection/onActionProcess.js</onActionProcess>
           <isObjectAction v="false" />
-          <isSelectionAction v="true" />
           <iconId>NEON:GROUP_APPOINTMENT</iconId>
           <state>AUTO</state>
+          <stateProcess>%aditoprj%/entity/CampaignParticipant_entity/entityfields/filterviewactiongroup/children/setsteptoparticipantselection/stateProcess.js</stateProcess>
           <tooltip>Update campaign step</tooltip>
           <tooltipProcess>%aditoprj%/entity/CampaignParticipant_entity/entityfields/filterviewactiongroup/children/setsteptoparticipantselection/tooltipProcess.js</tooltipProcess>
         </entityActionField>
@@ -280,6 +280,12 @@
     </entityField>
     <entityConsumer>
       <name>ResponsibleEmployees</name>
+      <children>
+        <entityParameter>
+          <name>EmployeeContactIdWhitelist_param</name>
+          <valueProcess>%aditoprj%/entity/CampaignParticipant_entity/entityfields/responsibleemployees/children/employeecontactidwhitelist_param/valueProcess.js</valueProcess>
+        </entityParameter>
+      </children>
       <dependency>
         <name>dependency</name>
         <entityName>Employee_entity</entityName>
diff --git a/entity/CampaignParticipant_entity/entityfields/filterviewactiongroup/children/setsteptoparticipantselection/stateProcess.js b/entity/CampaignParticipant_entity/entityfields/filterviewactiongroup/children/setsteptoparticipantselection/stateProcess.js
new file mode 100644
index 00000000000..78eb0e84628
--- /dev/null
+++ b/entity/CampaignParticipant_entity/entityfields/filterviewactiongroup/children/setsteptoparticipantselection/stateProcess.js
@@ -0,0 +1,15 @@
+import("Campaign_lib");
+import("system.vars");
+import("system.neon");
+import("system.result");
+
+var participantCount = vars.get("$sys.datarowcountfull");
+
+if(participantCount > 0)
+{
+    result.string(neon.COMPONENTSTATE_EDITABLE);
+}
+else
+{
+    result.string(neon.COMPONENTSTATE_DISABLED);
+}
\ No newline at end of file
diff --git a/entity/CampaignParticipant_entity/entityfields/responsibleemployees/children/employeecontactidwhitelist_param/valueProcess.js b/entity/CampaignParticipant_entity/entityfields/responsibleemployees/children/employeecontactidwhitelist_param/valueProcess.js
new file mode 100644
index 00000000000..2aacdbde971
--- /dev/null
+++ b/entity/CampaignParticipant_entity/entityfields/responsibleemployees/children/employeecontactidwhitelist_param/valueProcess.js
@@ -0,0 +1,12 @@
+import("system.vars");
+import("system.result");
+import("Sql_lib");
+import("system.neon");
+
+if(vars.get("$sys.presentationmode") == neon.CONTEXT_PRESENTATIONMODE_FILTER)
+{
+    result.string(JSON.stringify(newSelect("DISTINCT CAMPAIGNPARTICIPANT.RESPONSIBLE_CONTACT_ID")
+        .from("CAMPAIGNPARTICIPANT")
+        .where("CAMPAIGNPARTICIPANT.CAMPAIGN_ID", vars.get("$param.CampaignId_param"))
+        .arrayColumn()));
+}
\ No newline at end of file
diff --git a/entity/Employee_entity/Employee_entity.aod b/entity/Employee_entity/Employee_entity.aod
index c6c1df49e89..bc177161e35 100644
--- a/entity/Employee_entity/Employee_entity.aod
+++ b/entity/Employee_entity/Employee_entity.aod
@@ -410,6 +410,10 @@
         </entityParameter>
       </children>
     </entityConsumer>
+    <entityParameter>
+      <name>EmployeeContactIdWhitelist_param</name>
+      <expose v="true" />
+    </entityParameter>
   </entityFields>
   <recordContainers>
     <jDitoRecordContainer>
diff --git a/entity/Employee_entity/recordcontainers/jdito/contentProcess.js b/entity/Employee_entity/recordcontainers/jdito/contentProcess.js
index 42ea78f8cac..8970fd6bd60 100644
--- a/entity/Employee_entity/recordcontainers/jdito/contentProcess.js
+++ b/entity/Employee_entity/recordcontainers/jdito/contentProcess.js
@@ -1,3 +1,4 @@
+import("system.logging");
 import("Sql_lib");
 import("system.db");
 import("Attribute_lib");
@@ -12,6 +13,10 @@ import("Employee_lib");
 var users;
 if (vars.exists("$local.idvalues") && vars.get("$local.idvalues"))
     users = tools.getUsersByAttribute(tools.NAME, vars.get("$local.idvalues"), tools.PROFILE_FULL);
+else if(vars.exists("$param.EmployeeContactIdWhitelist_param") && vars.get("$param.EmployeeContactIdWhitelist_param"))
+{
+    users = tools.getUsersByAttribute(tools.CONTACTID, JSON.parse(vars.get("$param.EmployeeContactIdWhitelist_param")), tools.PROFILE_DEFAULT);
+}
 else
 {
     var values = ["true", "false"];
-- 
GitLab


From 23409835ba358a8fb485c8d34e8abd50fc300370 Mon Sep 17 00:00:00 2001
From: Tom Lutzenberger <t.lutzenberger@adito.de>
Date: Thu, 3 Dec 2020 15:44:07 +0100
Subject: [PATCH 158/184] #1068644: Add IndexSearchAlias for seamless Upgrade

---
 aliasDefinition/IndexSearchAlias/IndexSearchAlias.aod | 6 ++++++
 1 file changed, 6 insertions(+)
 create mode 100644 aliasDefinition/IndexSearchAlias/IndexSearchAlias.aod

diff --git a/aliasDefinition/IndexSearchAlias/IndexSearchAlias.aod b/aliasDefinition/IndexSearchAlias/IndexSearchAlias.aod
new file mode 100644
index 00000000000..79981226f95
--- /dev/null
+++ b/aliasDefinition/IndexSearchAlias/IndexSearchAlias.aod
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<aliasDefinition xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.0" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/aliasDefinition/1.2.0">
+  <name>IndexSearchAlias</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <datasourceType v="18" />
+</aliasDefinition>
-- 
GitLab


From 4fb16aa16071d9af615a2b6fc176bb8368fbd7ff Mon Sep 17 00:00:00 2001
From: Sebastian Listl <s.listl@adito.de>
Date: Thu, 3 Dec 2020 17:07:45 +0100
Subject: [PATCH 159/184] Scan services

---
 .aditoprj/ignoredScanServiceTasks.json        |  36 +++-
 entity/Campaign_entity/Campaign_entity.aod    | 170 +++++++++---------
 .../ClassificationGrading_entity.aod          |  13 +-
 .../valueProcess.js                           |   4 -
 .../DocumentTemplatePlaceOfUse_entity.aod     |  24 ++-
 .../valueProcess.js                           |   4 -
 .../valueProcess.js                           |   4 -
 .../ExportTemplateField_entity.aod            |   7 -
 .../exporttemplatefield_param/valueProcess.js |   4 -
 .../exporttemplatefield_param/valueProcess.js |   4 -
 .../ExportTemplatePlaceOfUse_entity.aod       |  24 ++-
 .../valueProcess.js                           |   4 -
 .../valueProcess.js                           |   4 -
 .../recordcontainers/db/onDBUpdate.js         |  11 --
 .../contentTitleProcess.js                    |   4 +-
 .../containername_param/valueProcess.js       |   2 +-
 .../milestonevalue/titleProcess.js            |   4 +-
 .../groupQueryProcess.js                      |   2 +-
 .../_____LANGUAGE_EXTRA.aod                   |   3 +
 .../_____LANGUAGE_de/_____LANGUAGE_de.aod     |   8 +-
 .../_____LANGUAGE_en/_____LANGUAGE_en.aod     |   3 +
 21 files changed, 154 insertions(+), 185 deletions(-)
 delete mode 100644 entity/ClassificationGrading_entity/entityfields/classificationgradings/children/classificationtypeid_param/valueProcess.js
 delete mode 100644 entity/DocumentTemplatePlaceOfUse_entity/entityfields/documenttemplateplaceofuse/children/documenttemplateplaceofuse_param/valueProcess.js
 delete mode 100644 entity/DocumentTemplatePlaceOfUse_entity/entityfields/documenttemplateplaceofuse_param/valueProcess.js
 delete mode 100644 entity/ExportTemplateField_entity/entityfields/exporttemplatefield_param/valueProcess.js
 delete mode 100644 entity/ExportTemplateField_entity/entityfields/exporttemplatefields/children/exporttemplatefield_param/valueProcess.js
 delete mode 100644 entity/ExportTemplatePlaceOfUse_entity/entityfields/exporttemplateplaceofuse_param/valueProcess.js
 delete mode 100644 entity/ExportTemplatePlaceOfUse_entity/entityfields/exporttemplateplaceofuser/children/exporttemplateplaceofuse_param/valueProcess.js

diff --git a/.aditoprj/ignoredScanServiceTasks.json b/.aditoprj/ignoredScanServiceTasks.json
index 876fa8e7755..bad77c8c7df 100644
--- a/.aditoprj/ignoredScanServiceTasks.json
+++ b/.aditoprj/ignoredScanServiceTasks.json
@@ -1,11 +1,5 @@
 {
   "entries": [
-    {
-      "target": "aliasDefinition/Data_alias/Data_alias.aod",
-      "line": -1,
-      "description": "The table \"AB_LOGHISTORY\" has no primary key [65]",
-      "groupName": "nb-tasklist-warning"
-    },
     {
       "target": "aliasDefinition/Data_alias/Data_alias.aod",
       "line": -1,
@@ -41,6 +35,36 @@
       "line": -1,
       "description": "There is no index for the column \"DEPLOYMENT_ID\" in the table \"DATABASECHANGELOG\" [59]",
       "groupName": "nb-tasklist-warning"
+    },
+    {
+      "target": "neonView/SalesprojectAnalysesPhases_view/SalesprojectAnalysesPhases_view.aod",
+      "line": -1,
+      "description": "Dead Reference \"#EXTENSION.Phase_filterExtention.Phase_filterExtention#TEXT\" located in: PhaseFunnelChart/defaultGroupFields/#EXTENSION.Phase_filterExtention.Phase_filterExtention#TEXT [67]",
+      "groupName": "nb-tasklist-warning"
+    },
+    {
+      "target": "neonView/SalesprojectAnalysesPhases_view/SalesprojectAnalysesPhases_view.aod",
+      "line": -1,
+      "description": "Dead Reference \"#EXTENSION.Phase_filterExtention.Phase_filterExtention#TEXT\" located in: PhasePieChart/defaultGroupFields/#EXTENSION.Phase_filterExtention.Phase_filterExtention#TEXT [67]",
+      "groupName": "nb-tasklist-warning"
+    },
+    {
+      "target": "neonView/SalesprojectAnalysesPhases_view/SalesprojectAnalysesPhases_view.aod",
+      "line": -1,
+      "description": "Dead Reference \"#EXTENSION.Phase_filterExtention.Phase_filterExtention#TEXT\" located in: PhasePyramidChart/defaultGroupFields/#EXTENSION.Phase_filterExtention.Phase_filterExtention#TEXT [67]",
+      "groupName": "nb-tasklist-warning"
+    },
+    {
+      "target": "neonView/SalesprojectConversionRate_view/SalesprojectConversionRate_view.aod",
+      "line": -1,
+      "description": "Dead Reference \"#EXTENSION.Month.Month#NUMBER\" located in: TreeTable/defaultGroupFields/#EXTENSION.Month.Month#NUMBER [67]",
+      "groupName": "nb-tasklist-warning"
+    },
+    {
+      "target": "neonView/SalesprojectConversionRate_view/SalesprojectConversionRate_view.aod",
+      "line": -1,
+      "description": "Dead Reference \"#EXTENSION.Month.Month#NUMBER\" located in: dynamicChart/defaultGroupFields/#EXTENSION.Month.Month#NUMBER [67]",
+      "groupName": "nb-tasklist-warning"
     }
   ]
 }
\ No newline at end of file
diff --git a/entity/Campaign_entity/Campaign_entity.aod b/entity/Campaign_entity/Campaign_entity.aod
index c2114b2939d..0fba3da6c0f 100644
--- a/entity/Campaign_entity/Campaign_entity.aod
+++ b/entity/Campaign_entity/Campaign_entity.aod
@@ -108,11 +108,6 @@
     <entityConsumer>
       <name>CampaignSteps</name>
       <state>EDITABLE</state>
-      <dependency>
-        <name>dependency</name>
-        <entityName>CampaignStep_entity</entityName>
-        <fieldName>CampaignSteps</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>campaignId_param</name>
@@ -121,6 +116,11 @@
           <mandatory v="true" />
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>CampaignStep_entity</entityName>
+        <fieldName>CampaignSteps</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>STATUS</name>
@@ -132,17 +132,17 @@
     </entityField>
     <entityConsumer>
       <name>KeywordStates</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>KeywordEntry_entity</entityName>
-        <fieldName>SpecificContainerKeywords</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
           <valueProcess>%aditoprj%/entity/Campaign_entity/entityfields/keywordstates/children/containername_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>SpecificContainerKeywords</fieldName>
+      </dependency>
     </entityConsumer>
     <entityProvider>
       <name>Campaigns</name>
@@ -179,11 +179,6 @@
       <name>CampaignParticipants</name>
       <refreshParent v="false" />
       <selectionMode>MULTI</selectionMode>
-      <dependency>
-        <name>dependency</name>
-        <entityName>CampaignParticipant_entity</entityName>
-        <fieldName>CampaignParticipantsProvider</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>CampaignStepId_param</name>
@@ -195,6 +190,11 @@
           <expose v="true" />
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>CampaignParticipant_entity</entityName>
+        <fieldName>CampaignParticipantsProvider</fieldName>
+      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>Employee</name>
@@ -203,26 +203,20 @@
         <entityName>Employee_entity</entityName>
         <fieldName>Employees</fieldName>
       </dependency>
-      <children>
-        <entityParameter>
-          <name>OnlyActives_param</name>
-          <valueProcess>%aditoprj%/entity/Campaign_entity/entityfields/employee/children/onlyactives_param/valueProcess.js</valueProcess>
-        </entityParameter>
-      </children>
     </entityConsumer>
     <entityConsumer>
       <name>CampaignCosts</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>CampaignCost_entity</entityName>
-        <fieldName>CampaignCosts</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>CampaignId_param</name>
           <valueProcess>%aditoprj%/entity/Campaign_entity/entityfields/campaigncosts/children/campaignid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>CampaignCost_entity</entityName>
+        <fieldName>CampaignCosts</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>COST</name>
@@ -233,17 +227,17 @@
     </entityField>
     <entityConsumer>
       <name>CampaignStepCosts</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>CampaignCost_entity</entityName>
-        <fieldName>StepCosts</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>CampaignId_param</name>
           <valueProcess>%aditoprj%/entity/Campaign_entity/entityfields/campaignstepcosts/children/campaignid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>CampaignCost_entity</entityName>
+        <fieldName>StepCosts</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>stepCount</name>
@@ -258,11 +252,6 @@
     <entityConsumer>
       <name>Activities</name>
       <title>Activities</title>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Activity_entity</entityName>
-        <fieldName>LinkedObjects</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ObjectId_param</name>
@@ -273,6 +262,11 @@
           <valueProcess>%aditoprj%/entity/Campaign_entity/entityfields/activities/children/rowid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Activity_entity</entityName>
+        <fieldName>LinkedObjects</fieldName>
+      </dependency>
     </entityConsumer>
     <entityActionField>
       <name>newActivity</name>
@@ -291,32 +285,32 @@
     <entityConsumer>
       <name>CampaignCostsChart</name>
       <title>Charts</title>
-      <dependency>
-        <name>dependency</name>
-        <entityName>CampaignCostChart_entity</entityName>
-        <fieldName>CostChart</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>CampaignId_param</name>
           <valueProcess>%aditoprj%/entity/Campaign_entity/entityfields/campaigncostschart/children/campaignid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>CampaignCostChart_entity</entityName>
+        <fieldName>CostChart</fieldName>
+      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>CampaignParticipantsChart</name>
       <title>Chart 2</title>
-      <dependency>
-        <name>dependency</name>
-        <entityName>CampaignParticipantChart_entity</entityName>
-        <fieldName>ParticipantChart</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>CampaignId_param</name>
           <valueProcess>%aditoprj%/entity/Campaign_entity/entityfields/campaignparticipantschart/children/campaignid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>CampaignParticipantChart_entity</entityName>
+        <fieldName>ParticipantChart</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>remainingRuntime</name>
@@ -326,27 +320,22 @@
     <entityConsumer>
       <name>CampaignStepsReadonly</name>
       <state>READONLY</state>
-      <dependency>
-        <name>dependency</name>
-        <entityName>CampaignStep_entity</entityName>
-        <fieldName>CampaignSteps</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>campaignId_param</name>
           <valueProcess>%aditoprj%/entity/Campaign_entity/entityfields/campaignstepsreadonly/children/campaignid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>CampaignStep_entity</entityName>
+        <fieldName>CampaignSteps</fieldName>
+      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>Attributes</name>
       <stateProcess>%aditoprj%/entity/Campaign_entity/entityfields/attributes/stateProcess.js</stateProcess>
       <onValidation>%aditoprj%/entity/Campaign_entity/entityfields/attributes/onValidation.js</onValidation>
-      <dependency>
-        <name>dependency</name>
-        <entityName>AttributeRelation_entity</entityName>
-        <fieldName>AttributeRelations</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ObjectRowId_param</name>
@@ -357,6 +346,11 @@
           <valueProcess>%aditoprj%/entity/Campaign_entity/entityfields/attributes/children/objecttype_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>AttributeRelation_entity</entityName>
+        <fieldName>AttributeRelations</fieldName>
+      </dependency>
     </entityConsumer>
     <entityActionField>
       <name>newCampaignStep</name>
@@ -366,11 +360,6 @@
     </entityActionField>
     <entityConsumer>
       <name>CampaignAnalysisConsumer</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>CampaignAnalysis_entity</entityName>
-        <fieldName>CampaignAnalysisProvider</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>CampaignId_param</name>
@@ -386,14 +375,14 @@
           <valueProcess>%aditoprj%/entity/Campaign_entity/entityfields/campaignanalysisconsumer/children/datestart_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>MemberConsumer</name>
       <dependency>
         <name>dependency</name>
-        <entityName>Member_entity</entityName>
-        <fieldName>Links</fieldName>
+        <entityName>CampaignAnalysis_entity</entityName>
+        <fieldName>CampaignAnalysisProvider</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>MemberConsumer</name>
       <children>
         <entityParameter>
           <name>ObjectType_param</name>
@@ -404,6 +393,11 @@
           <valueProcess>%aditoprj%/entity/Campaign_entity/entityfields/memberconsumer/children/objectrowid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Member_entity</entityName>
+        <fieldName>Links</fieldName>
+      </dependency>
     </entityConsumer>
     <entityParameter>
       <name>ShowOnlyCurrentUsersCampaigns_param</name>
@@ -425,11 +419,6 @@
     </entityActionField>
     <entityConsumer>
       <name>Documents</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Document_entity</entityName>
-        <fieldName>Documents</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>AssignmentTable_param</name>
@@ -440,15 +429,15 @@
           <valueProcess>%aditoprj%/entity/Campaign_entity/entityfields/documents/children/assignmentrowid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Document_entity</entityName>
+        <fieldName>Documents</fieldName>
+      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>AttributeTree</name>
       <stateProcess>%aditoprj%/entity/Campaign_entity/entityfields/attributetree/stateProcess.js</stateProcess>
-      <dependency>
-        <name>dependency</name>
-        <entityName>AttributeRelation_entity</entityName>
-        <fieldName>TreeProvider</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ObjectRowId_param</name>
@@ -459,6 +448,11 @@
           <valueProcess>%aditoprj%/entity/Campaign_entity/entityfields/attributetree/children/objecttype_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>AttributeRelation_entity</entityName>
+        <fieldName>TreeProvider</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>CURRENCY</name>
@@ -470,21 +464,17 @@
     </entityField>
     <entityConsumer>
       <name>KeywordCurrency</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>KeywordEntry_entity</entityName>
-        <fieldName>SpecificContainerKeywords</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
           <valueProcess>%aditoprj%/entity/Campaign_entity/entityfields/keywordcurrency/children/containername_param/valueProcess.js</valueProcess>
         </entityParameter>
-        <entityParameter>
-          <name>OnlyActives_param</name>
-          <valueProcess>%aditoprj%/entity/Campaign_entity/entityfields/keywordcurrency/children/onlyactives_param/valueProcess.js</valueProcess>
-        </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>SpecificContainerKeywords</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>CAMPAIGN_OBEJCTTYPE</name>
@@ -529,11 +519,6 @@
     </entityParameter>
     <entityConsumer>
       <name>Tasks</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Task_entity</entityName>
-        <fieldName>Tasks</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ObjectId_param</name>
@@ -544,6 +529,11 @@
           <valueProcess>%aditoprj%/entity/Campaign_entity/entityfields/tasks/children/rowid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Task_entity</entityName>
+        <fieldName>Tasks</fieldName>
+      </dependency>
     </entityConsumer>
   </entityFields>
   <recordContainers>
diff --git a/entity/ClassificationGrading_entity/ClassificationGrading_entity.aod b/entity/ClassificationGrading_entity/ClassificationGrading_entity.aod
index fdf4e999952..39144723e62 100644
--- a/entity/ClassificationGrading_entity/ClassificationGrading_entity.aod
+++ b/entity/ClassificationGrading_entity/ClassificationGrading_entity.aod
@@ -40,6 +40,12 @@
     <entityProvider>
       <name>ClassificationGradings</name>
       <documentation>%aditoprj%/entity/ClassificationGrading_entity/entityfields/classificationgradings/documentation.adoc</documentation>
+      <children>
+        <entityParameter>
+          <name>ClassificationTypeId_param</name>
+          <expose v="true" />
+        </entityParameter>
+      </children>
       <dependencies>
         <entityDependency>
           <name>e0c6b86e-dcc1-43e1-9581-2b10c5c3d0cd</name>
@@ -48,13 +54,6 @@
           <isConsumer v="false" />
         </entityDependency>
       </dependencies>
-      <children>
-        <entityParameter>
-          <name>ClassificationTypeId_param</name>
-          <valueProcess>%aditoprj%/entity/ClassificationGrading_entity/entityfields/classificationgradings/children/classificationtypeid_param/valueProcess.js</valueProcess>
-          <expose v="true" />
-        </entityParameter>
-      </children>
     </entityProvider>
     <entityProvider>
       <name>#PROVIDER_AGGREGATES</name>
diff --git a/entity/ClassificationGrading_entity/entityfields/classificationgradings/children/classificationtypeid_param/valueProcess.js b/entity/ClassificationGrading_entity/entityfields/classificationgradings/children/classificationtypeid_param/valueProcess.js
deleted file mode 100644
index b11d099579d..00000000000
--- a/entity/ClassificationGrading_entity/entityfields/classificationgradings/children/classificationtypeid_param/valueProcess.js
+++ /dev/null
@@ -1,4 +0,0 @@
-import("system.vars");
-import("system.result");
-
-result.string(vars.get("$field.CLASSIFICATIONTYPEID"));
\ No newline at end of file
diff --git a/entity/DocumentTemplatePlaceOfUse_entity/DocumentTemplatePlaceOfUse_entity.aod b/entity/DocumentTemplatePlaceOfUse_entity/DocumentTemplatePlaceOfUse_entity.aod
index 3e77638a51c..ecc59747094 100644
--- a/entity/DocumentTemplatePlaceOfUse_entity/DocumentTemplatePlaceOfUse_entity.aod
+++ b/entity/DocumentTemplatePlaceOfUse_entity/DocumentTemplatePlaceOfUse_entity.aod
@@ -29,11 +29,6 @@
     </entityField>
     <entityConsumer>
       <name>ContextDocumentTemplatePlaceOfUse</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Context_entity</entityName>
-        <fieldName>ContextTemplatePlaceOfUse</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>InvertBlacklist_param</name>
@@ -44,10 +39,21 @@
           <valueProcess>%aditoprj%/entity/DocumentTemplatePlaceOfUse_entity/entityfields/contextdocumenttemplateplaceofuse/children/blacklist_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Context_entity</entityName>
+        <fieldName>ContextTemplatePlaceOfUse</fieldName>
+      </dependency>
     </entityConsumer>
     <entityProvider>
       <name>DocumentTemplatePlaceOfUse</name>
       <documentation>%aditoprj%/entity/DocumentTemplatePlaceOfUse_entity/entityfields/documenttemplateplaceofuse/documentation.adoc</documentation>
+      <children>
+        <entityParameter>
+          <name>DocumentTemplatePlaceOfUse_param</name>
+          <documentation>%aditoprj%/entity/DocumentTemplatePlaceOfUse_entity/entityfields/documenttemplateplaceofuse/children/documenttemplateplaceofuse_param/documentation.adoc</documentation>
+        </entityParameter>
+      </children>
       <dependencies>
         <entityDependency>
           <name>bc05b556-ecca-478c-9a92-b77e4d98d6f3</name>
@@ -56,17 +62,9 @@
           <isConsumer v="false" />
         </entityDependency>
       </dependencies>
-      <children>
-        <entityParameter>
-          <name>DocumentTemplatePlaceOfUse_param</name>
-          <valueProcess>%aditoprj%/entity/DocumentTemplatePlaceOfUse_entity/entityfields/documenttemplateplaceofuse/children/documenttemplateplaceofuse_param/valueProcess.js</valueProcess>
-          <documentation>%aditoprj%/entity/DocumentTemplatePlaceOfUse_entity/entityfields/documenttemplateplaceofuse/children/documenttemplateplaceofuse_param/documentation.adoc</documentation>
-        </entityParameter>
-      </children>
     </entityProvider>
     <entityParameter>
       <name>DocumentTemplatePlaceOfUse_param</name>
-      <valueProcess>%aditoprj%/entity/DocumentTemplatePlaceOfUse_entity/entityfields/documenttemplateplaceofuse_param/valueProcess.js</valueProcess>
       <expose v="true" />
     </entityParameter>
     <entityProvider>
diff --git a/entity/DocumentTemplatePlaceOfUse_entity/entityfields/documenttemplateplaceofuse/children/documenttemplateplaceofuse_param/valueProcess.js b/entity/DocumentTemplatePlaceOfUse_entity/entityfields/documenttemplateplaceofuse/children/documenttemplateplaceofuse_param/valueProcess.js
deleted file mode 100644
index f786c8c7b18..00000000000
--- a/entity/DocumentTemplatePlaceOfUse_entity/entityfields/documenttemplateplaceofuse/children/documenttemplateplaceofuse_param/valueProcess.js
+++ /dev/null
@@ -1,4 +0,0 @@
-import("system.result");
-import("system.vars");
-
-result.string(vars.get("$field.DOCUMENTTEMPLATEID"));
\ No newline at end of file
diff --git a/entity/DocumentTemplatePlaceOfUse_entity/entityfields/documenttemplateplaceofuse_param/valueProcess.js b/entity/DocumentTemplatePlaceOfUse_entity/entityfields/documenttemplateplaceofuse_param/valueProcess.js
deleted file mode 100644
index f786c8c7b18..00000000000
--- a/entity/DocumentTemplatePlaceOfUse_entity/entityfields/documenttemplateplaceofuse_param/valueProcess.js
+++ /dev/null
@@ -1,4 +0,0 @@
-import("system.result");
-import("system.vars");
-
-result.string(vars.get("$field.DOCUMENTTEMPLATEID"));
\ No newline at end of file
diff --git a/entity/ExportTemplateField_entity/ExportTemplateField_entity.aod b/entity/ExportTemplateField_entity/ExportTemplateField_entity.aod
index e010ab9f6c1..ae07c537a21 100644
--- a/entity/ExportTemplateField_entity/ExportTemplateField_entity.aod
+++ b/entity/ExportTemplateField_entity/ExportTemplateField_entity.aod
@@ -41,16 +41,9 @@
           <isConsumer v="false" />
         </entityDependency>
       </dependencies>
-      <children>
-        <entityParameter>
-          <name>ExportTemplateField_param</name>
-          <valueProcess>%aditoprj%/entity/ExportTemplateField_entity/entityfields/exporttemplatefields/children/exporttemplatefield_param/valueProcess.js</valueProcess>
-        </entityParameter>
-      </children>
     </entityProvider>
     <entityParameter>
       <name>ExportTemplateField_param</name>
-      <valueProcess>%aditoprj%/entity/ExportTemplateField_entity/entityfields/exporttemplatefield_param/valueProcess.js</valueProcess>
       <expose v="true" />
     </entityParameter>
     <entityField>
diff --git a/entity/ExportTemplateField_entity/entityfields/exporttemplatefield_param/valueProcess.js b/entity/ExportTemplateField_entity/entityfields/exporttemplatefield_param/valueProcess.js
deleted file mode 100644
index 3cbc4900564..00000000000
--- a/entity/ExportTemplateField_entity/entityfields/exporttemplatefield_param/valueProcess.js
+++ /dev/null
@@ -1,4 +0,0 @@
-import("system.vars");
-import("system.result");
-
-result.string(vars.get("$field.EXPORTTEMPLATEID"));
\ No newline at end of file
diff --git a/entity/ExportTemplateField_entity/entityfields/exporttemplatefields/children/exporttemplatefield_param/valueProcess.js b/entity/ExportTemplateField_entity/entityfields/exporttemplatefields/children/exporttemplatefield_param/valueProcess.js
deleted file mode 100644
index 3cbc4900564..00000000000
--- a/entity/ExportTemplateField_entity/entityfields/exporttemplatefields/children/exporttemplatefield_param/valueProcess.js
+++ /dev/null
@@ -1,4 +0,0 @@
-import("system.vars");
-import("system.result");
-
-result.string(vars.get("$field.EXPORTTEMPLATEID"));
\ No newline at end of file
diff --git a/entity/ExportTemplatePlaceOfUse_entity/ExportTemplatePlaceOfUse_entity.aod b/entity/ExportTemplatePlaceOfUse_entity/ExportTemplatePlaceOfUse_entity.aod
index 0dc5e1fc3a6..91964c2b417 100644
--- a/entity/ExportTemplatePlaceOfUse_entity/ExportTemplatePlaceOfUse_entity.aod
+++ b/entity/ExportTemplatePlaceOfUse_entity/ExportTemplatePlaceOfUse_entity.aod
@@ -32,11 +32,6 @@
     </entityField>
     <entityConsumer>
       <name>ContextExportTemplatePlaceOfUse</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Context_entity</entityName>
-        <fieldName>ContextTemplatePlaceOfUse</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>InvertBlacklist_param</name>
@@ -47,15 +42,25 @@
           <valueProcess>%aditoprj%/entity/ExportTemplatePlaceOfUse_entity/entityfields/contextexporttemplateplaceofuse/children/blacklist_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Context_entity</entityName>
+        <fieldName>ContextTemplatePlaceOfUse</fieldName>
+      </dependency>
     </entityConsumer>
     <entityParameter>
       <name>ExportTemplatePlaceOfUse_param</name>
-      <valueProcess>%aditoprj%/entity/ExportTemplatePlaceOfUse_entity/entityfields/exporttemplateplaceofuse_param/valueProcess.js</valueProcess>
       <expose v="true" />
     </entityParameter>
     <entityProvider>
       <name>ExportTemplatePlaceOfUser</name>
       <documentation>%aditoprj%/entity/ExportTemplatePlaceOfUse_entity/entityfields/exporttemplateplaceofuser/documentation.adoc</documentation>
+      <children>
+        <entityParameter>
+          <name>ExportTemplatePlaceOfUse_param</name>
+          <expose v="true" />
+        </entityParameter>
+      </children>
       <dependencies>
         <entityDependency>
           <name>c60a238a-51f0-4538-8c53-6921481ddd4c</name>
@@ -64,13 +69,6 @@
           <isConsumer v="false" />
         </entityDependency>
       </dependencies>
-      <children>
-        <entityParameter>
-          <name>ExportTemplatePlaceOfUse_param</name>
-          <valueProcess>%aditoprj%/entity/ExportTemplatePlaceOfUse_entity/entityfields/exporttemplateplaceofuser/children/exporttemplateplaceofuse_param/valueProcess.js</valueProcess>
-          <expose v="true" />
-        </entityParameter>
-      </children>
     </entityProvider>
     <entityProvider>
       <name>#PROVIDER_AGGREGATES</name>
diff --git a/entity/ExportTemplatePlaceOfUse_entity/entityfields/exporttemplateplaceofuse_param/valueProcess.js b/entity/ExportTemplatePlaceOfUse_entity/entityfields/exporttemplateplaceofuse_param/valueProcess.js
deleted file mode 100644
index 3cbc4900564..00000000000
--- a/entity/ExportTemplatePlaceOfUse_entity/entityfields/exporttemplateplaceofuse_param/valueProcess.js
+++ /dev/null
@@ -1,4 +0,0 @@
-import("system.vars");
-import("system.result");
-
-result.string(vars.get("$field.EXPORTTEMPLATEID"));
\ No newline at end of file
diff --git a/entity/ExportTemplatePlaceOfUse_entity/entityfields/exporttemplateplaceofuser/children/exporttemplateplaceofuse_param/valueProcess.js b/entity/ExportTemplatePlaceOfUse_entity/entityfields/exporttemplateplaceofuser/children/exporttemplateplaceofuse_param/valueProcess.js
deleted file mode 100644
index 3cbc4900564..00000000000
--- a/entity/ExportTemplatePlaceOfUse_entity/entityfields/exporttemplateplaceofuser/children/exporttemplateplaceofuse_param/valueProcess.js
+++ /dev/null
@@ -1,4 +0,0 @@
-import("system.vars");
-import("system.result");
-
-result.string(vars.get("$field.EXPORTTEMPLATEID"));
\ No newline at end of file
diff --git a/entity/Product_entity/recordcontainers/db/onDBUpdate.js b/entity/Product_entity/recordcontainers/db/onDBUpdate.js
index 01a6d02f7e5..2e53f3cad9a 100644
--- a/entity/Product_entity/recordcontainers/db/onDBUpdate.js
+++ b/entity/Product_entity/recordcontainers/db/onDBUpdate.js
@@ -1,14 +1,3 @@
 import("Workflow_lib");
-import("system.vars");
-import("Product_lib");
-import("Entity_lib");
-
-// TODO: this is a workaround for missing possibility to react on changes of fields not connected to record Contqainer #1030023
-FieldChanges.assimilateChangeAndDispose("$field.IMAGE", function(state, value){
-    if (state == FieldChanges.STATE_CHANGED())
-        ProductUtils.setImage(vars.get("$local.uid"), value);
-    else
-        ProductUtils.removeImage(vars.get("$local.uid"));
-});
 
 WorkflowSignalSender.updated();
\ No newline at end of file
diff --git a/entity/SalesprojectMilestone_entity/contentTitleProcess.js b/entity/SalesprojectMilestone_entity/contentTitleProcess.js
index 474d304708c..27695c3f691 100644
--- a/entity/SalesprojectMilestone_entity/contentTitleProcess.js
+++ b/entity/SalesprojectMilestone_entity/contentTitleProcess.js
@@ -2,9 +2,9 @@ import("system.vars");
 import("system.translate");
 import("system.result");
 
-if (vars.exists("$field.TYPE") && vars.get("$field.TYPE"))
+if (vars.get("$field.KIND"))
 {
-    result.string(translate.text("Milestones") + " " + translate.text(vars.get("$field.TYPE")));
+    result.string(translate.text("Milestones") + " " + translate.text(vars.get("$field.KIND")));
 }
 else
     result.string(translate.text("Milestones"));
\ No newline at end of file
diff --git a/entity/SalesprojectMilestone_entity/entityfields/keywords/children/containername_param/valueProcess.js b/entity/SalesprojectMilestone_entity/entityfields/keywords/children/containername_param/valueProcess.js
index 1b532aec630..ff40ad745a0 100644
--- a/entity/SalesprojectMilestone_entity/entityfields/keywords/children/containername_param/valueProcess.js
+++ b/entity/SalesprojectMilestone_entity/entityfields/keywords/children/containername_param/valueProcess.js
@@ -1,4 +1,4 @@
 import("system.vars");
 import("system.result");
 
-result.string(vars.get("$field.TYPE"));
\ No newline at end of file
+result.string(vars.get("$field.KIND"));
\ No newline at end of file
diff --git a/entity/SalesprojectMilestone_entity/entityfields/milestonevalue/titleProcess.js b/entity/SalesprojectMilestone_entity/entityfields/milestonevalue/titleProcess.js
index f02879713e4..38663022e20 100644
--- a/entity/SalesprojectMilestone_entity/entityfields/milestonevalue/titleProcess.js
+++ b/entity/SalesprojectMilestone_entity/entityfields/milestonevalue/titleProcess.js
@@ -2,9 +2,9 @@ import("system.vars");
 import("system.translate");
 import("system.result");
 
-if (vars.exists("$field.TYPE") && vars.get("$field.TYPE"))
+if (vars.get("$field.KIND"))
 {
-    result.string(translate.text(vars.get("$field.TYPE")));
+    result.string(translate.text(vars.get("$field.KIND")));
 }
 else
     result.string(translate.text("Milestones"));
\ No newline at end of file
diff --git a/entity/Salesproject_entity/recordcontainers/db/filterextensions/phase_filterextention/groupQueryProcess.js b/entity/Salesproject_entity/recordcontainers/db/filterextensions/phase_filterextention/groupQueryProcess.js
index 341994efdf2..308e821efaa 100644
--- a/entity/Salesproject_entity/recordcontainers/db/filterextensions/phase_filterextention/groupQueryProcess.js
+++ b/entity/Salesproject_entity/recordcontainers/db/filterextensions/phase_filterextention/groupQueryProcess.js
@@ -25,7 +25,7 @@ else
 {
     stmt.select([groupedList , KeywordUtils.getResolvedTitleSqlPart($KeywordRegistry.salesprojectPhase(),"AB_KEYWORD_ENTRY.KEYID"), "count(*)", "count(*)"])
     if (order != null)
-        stmt.orderBy("AB_KEYWORD_ENTRY.SORTING, " +order);
+        stmt.orderBy("AB_KEYWORD_ENTRY.SORTING, " + order);
 }
 
 result.string(stmt.toString());
\ No newline at end of file
diff --git a/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod b/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod
index 46ad514d97d..375e6f26967 100644
--- a/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod
+++ b/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod
@@ -7584,6 +7584,9 @@
     <entry>
       <key>Verantwortlicher</key>
     </entry>
+    <entry>
+      <key>The team must have at least one owner</key>
+    </entry>
   </keyValueMap>
   <font name="Dialog" style="0" size="11" />
   <sqlModels>
diff --git a/language/_____LANGUAGE_de/_____LANGUAGE_de.aod b/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
index 2ebdace2b72..9efeb9f1343 100644
--- a/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
+++ b/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
@@ -74,6 +74,10 @@
       <key>Favoritegroup</key>
       <value>Favoritengruppe</value>
     </entry>
+    <entry>
+      <key>The team must have at least one owner</key>
+      <value>Das Team muss mindestens einen Besitzer haben</value>
+    </entry>
     <entry>
       <key>Data imported. Contact not found.</key>
       <value>Daten importiert. Keine weiteren Personendaten gefunden.</value>
@@ -8377,7 +8381,6 @@ Bitte Datumseingabe prüfen</value>
     </entry>
     <entry>
       <key>Subcategory</key>
-      <value>Unterkategorie</value>
     </entry>
     <entry>
       <key>The radius has to be at least %0.</key>
@@ -9996,9 +9999,6 @@ Bitte Datumseingabe prüfen</value>
     <entry>
       <key>My campaigns</key>
     </entry>
-    <entry>
-      <key>Subcategory</key>
-    </entry>
     <entry>
       <key>Campaign costs</key>
     </entry>
diff --git a/language/_____LANGUAGE_en/_____LANGUAGE_en.aod b/language/_____LANGUAGE_en/_____LANGUAGE_en.aod
index b1927645977..e27607261ac 100644
--- a/language/_____LANGUAGE_en/_____LANGUAGE_en.aod
+++ b/language/_____LANGUAGE_en/_____LANGUAGE_en.aod
@@ -7665,6 +7665,9 @@
     <entry>
       <key>Verantwortlicher</key>
     </entry>
+    <entry>
+      <key>The team must have at least one owner</key>
+    </entry>
   </keyValueMap>
   <font name="Dialog" style="0" size="11" />
 </language>
-- 
GitLab


From e7ae421b4cacee442270a9047ff43c65bb8fc858 Mon Sep 17 00:00:00 2001
From: Sebastian Listl <s.listl@adito.de>
Date: Thu, 3 Dec 2020 17:30:04 +0100
Subject: [PATCH 160/184] Knowledgemanagement db indexes added

---
 .../struct/create_KnowledgeRoles.xml                   |  5 ++++-
 .../struct/knowledgeDiscussion_table.xml               |  3 +++
 .../Knowledgemanagement/struct/knowledgeLink_table.xml |  5 ++++-
 .../struct/knowledgeTagLink_table.xml                  |  6 ++++++
 .liquibase/Data_alias/changelog.xml                    |  2 +-
 aliasDefinition/Data_alias/Data_alias.aod              | 10 +++++-----
 6 files changed, 23 insertions(+), 8 deletions(-)

diff --git a/.liquibase/Data_alias/basic/2020.2.2/Knowledgemanagement/struct/create_KnowledgeRoles.xml b/.liquibase/Data_alias/basic/2020.2.2/Knowledgemanagement/struct/create_KnowledgeRoles.xml
index 7a44ef7aefa..1987399adb2 100644
--- a/.liquibase/Data_alias/basic/2020.2.2/Knowledgemanagement/struct/create_KnowledgeRoles.xml
+++ b/.liquibase/Data_alias/basic/2020.2.2/Knowledgemanagement/struct/create_KnowledgeRoles.xml
@@ -6,8 +6,11 @@
             <column name="KNOWLEDGEROLESID" type="CHAR(36)">
                 <constraints primaryKey="true" primaryKeyName="PK_KNOWLEDGEROLES_KNOWLEDGEROLESID"/>
             </column>
-            <column name="KNOWLEDGEMANAGEMENT_ID" type="CHAR(36)"></column>
+            <column name="KNOWLEDGEMANAGEMENT_ID" type="CHAR(36)"/>
             <column name="ROLENAME" type="VARCHAR(100)"/>
         </createTable>
+        <createIndex tableName="KNOWLEDGEROLES" indexName="IDX_KNOWLEDGEROLES_KM_ID">
+            <column name="KNOWLEDGEMANAGEMENT_ID"/>
+        </createIndex>
     </changeSet>
 </databaseChangeLog>
diff --git a/.liquibase/Data_alias/basic/2020.2.2/Knowledgemanagement/struct/knowledgeDiscussion_table.xml b/.liquibase/Data_alias/basic/2020.2.2/Knowledgemanagement/struct/knowledgeDiscussion_table.xml
index c4b9698f688..0f3de5603a8 100644
--- a/.liquibase/Data_alias/basic/2020.2.2/Knowledgemanagement/struct/knowledgeDiscussion_table.xml
+++ b/.liquibase/Data_alias/basic/2020.2.2/Knowledgemanagement/struct/knowledgeDiscussion_table.xml
@@ -16,5 +16,8 @@
             <column name="DISCUSSIONTEXT" type="LONGTEXT"/>
             <column name="PARENTENTRY" type="CHAR(36)"/>
         </createTable>
+        <createIndex tableName="KNOWLEDGEDISCUSSION" indexName="IDX_KNOWLEDGEDISCUSSION_KM_ID">
+            <column name="KNOWLEDGEMANAGEMENT_ID"/>
+        </createIndex>
     </changeSet>
 </databaseChangeLog>
diff --git a/.liquibase/Data_alias/basic/2020.2.2/Knowledgemanagement/struct/knowledgeLink_table.xml b/.liquibase/Data_alias/basic/2020.2.2/Knowledgemanagement/struct/knowledgeLink_table.xml
index cdf69919e23..f600fb7e878 100644
--- a/.liquibase/Data_alias/basic/2020.2.2/Knowledgemanagement/struct/knowledgeLink_table.xml
+++ b/.liquibase/Data_alias/basic/2020.2.2/Knowledgemanagement/struct/knowledgeLink_table.xml
@@ -1,7 +1,7 @@
 <?xml version="1.1" encoding="UTF-8" standalone="no"?>
 <databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
                    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd">
-    <changeSet author="e.pollinger" id="1261195c-ffc1-4abb-a31f-0732823ee0cb">
+    <changeSet author="e.pollinger" id="bee4e42e-9103-4464-849e-59d8b11c542e">
         <createTable tableName="KNOWLEDGELINK">
             <column name="KNOWLEDGELINKID" type="CHAR(36)">
                 <constraints primaryKey="true" primaryKeyName="PK_KNOWLEDGELINK_KNOWLEDGELINKID"/>
@@ -14,5 +14,8 @@
             <column name="ROW_ID" type="CHAR(36)"/>
             <column name="OBJECT_TYPE" type="NVARCHAR(100)"/>
         </createTable>
+        <createIndex tableName="KNOWLEDGELINK" indexName="IDX_KNOWLEDGELINK_KM_ID">
+            <column name="KNOWLEDGEMANAGEMENT_ID"/>
+        </createIndex>
     </changeSet>
 </databaseChangeLog>
diff --git a/.liquibase/Data_alias/basic/2020.2.2/Knowledgemanagement/struct/knowledgeTagLink_table.xml b/.liquibase/Data_alias/basic/2020.2.2/Knowledgemanagement/struct/knowledgeTagLink_table.xml
index a6b9b631d5d..ba1e74c9fcb 100644
--- a/.liquibase/Data_alias/basic/2020.2.2/Knowledgemanagement/struct/knowledgeTagLink_table.xml
+++ b/.liquibase/Data_alias/basic/2020.2.2/Knowledgemanagement/struct/knowledgeTagLink_table.xml
@@ -13,5 +13,11 @@
             <column name="USER_NEW" type="nvarchar(50)"/>
             <column name="USER_EDIT" type="nvarchar(50)"/>
         </createTable>
+        <createIndex tableName="KNOWLEDGETAGLINK" indexName="IDX_KNOWLEDGETAGLINK_TAG_ID">
+            <column name="KNOWLEDGETAG_ID"/>
+        </createIndex>
+        <createIndex tableName="KNOWLEDGETAGLINK" indexName="IDX_KNOWLEDGETAGLINK_KM_ID">
+            <column name="KNOWLEDGEMANAGEMENT_ID"/>
+        </createIndex>
     </changeSet>
 </databaseChangeLog>
diff --git a/.liquibase/Data_alias/changelog.xml b/.liquibase/Data_alias/changelog.xml
index 3f25ca1dbb1..06e1b534695 100644
--- a/.liquibase/Data_alias/changelog.xml
+++ b/.liquibase/Data_alias/changelog.xml
@@ -20,5 +20,5 @@
     <include relativeToChangelogFile="true" file="basic/2020.2.2/changelog.xml"/>
 
     <!--enable this only when you definetly want to overwrite the existing data with demo records:-->
-    <!--<include relativeToChangelogFile="true" file="basic/_demoData/changelog.xml" context="example"/>-->
+    <include relativeToChangelogFile="true" file="basic/_demoData/changelog.xml" context="example"/>
 </databaseChangeLog>
\ No newline at end of file
diff --git a/aliasDefinition/Data_alias/Data_alias.aod b/aliasDefinition/Data_alias/Data_alias.aod
index ba9127b5445..db98769eac6 100644
--- a/aliasDefinition/Data_alias/Data_alias.aod
+++ b/aliasDefinition/Data_alias/Data_alias.aod
@@ -15876,7 +15876,7 @@
                 <scale v="0" />
                 <notNull v="false" />
                 <isUnique v="false" />
-                <index v="false" />
+                <index v="true" />
                 <documentation></documentation>
                 <title></title>
                 <description></description>
@@ -15994,7 +15994,7 @@
                 <scale v="0" />
                 <notNull v="false" />
                 <isUnique v="false" />
-                <index v="false" />
+                <index v="true" />
                 <documentation></documentation>
                 <title></title>
                 <description></description>
@@ -16328,7 +16328,7 @@
                 <scale v="0" />
                 <notNull v="false" />
                 <isUnique v="false" />
-                <index v="false" />
+                <index v="true" />
                 <documentation></documentation>
                 <title></title>
                 <description></description>
@@ -16688,7 +16688,7 @@
                 <scale v="0" />
                 <notNull v="false" />
                 <isUnique v="false" />
-                <index v="false" />
+                <index v="true" />
                 <documentation></documentation>
                 <title></title>
                 <description></description>
@@ -16730,7 +16730,7 @@
                 <scale v="0" />
                 <notNull v="false" />
                 <isUnique v="false" />
-                <index v="false" />
+                <index v="true" />
                 <documentation></documentation>
                 <title></title>
                 <description></description>
-- 
GitLab


From 1957ada18353ad057d80f0eaf6428f064b928c50 Mon Sep 17 00:00:00 2001
From: Erik Pollinger <e.pollinger@adito.de>
Date: Fri, 4 Dec 2020 09:28:54 +0000
Subject: [PATCH 161/184] Fixed "Dead References" ScanService messages Fixed
 Index query

---
 .../KnowledgeDiscussion_entity.aod            | 12 ++-
 .../documentation.adoc                        |  3 +
 .../byknowledgeid/documentation.adoc          |  3 +
 .../KnowledgeLink_entity.aod                  | 33 +++----
 .../KnowledgeLink_entity/documentation.adoc   |  1 +
 .../byknowledgeid/documentation.adoc          |  1 +
 .../KnowledgeManagementTagList_entity.aod     |  2 +
 .../documentation.adoc                        |  1 +
 .../completelist/documentation.adoc           |  1 +
 .../KnowledgeManagementTags_entity.aod        | 14 +--
 .../documentation.adoc                        |  5 +
 .../documentation.adoc                        |  3 +
 .../KnowledgeManagement_entity.aod            | 96 +++++++++----------
 .../documentation.adoc                        |  3 +
 .../entityfields/provider/documentation.adoc  |  1 +
 .../indexsearchknowledgebase/query.js         |  8 +-
 .../KnowledgeRole_entity.aod                  | 12 ++-
 .../KnowledgeRole_entity/documentation.adoc   |  5 +
 .../knowledgerole/documentation.adoc          |  2 +
 19 files changed, 115 insertions(+), 91 deletions(-)
 create mode 100644 entity/KnowledgeDiscussion_entity/documentation.adoc
 create mode 100644 entity/KnowledgeDiscussion_entity/entityfields/byknowledgeid/documentation.adoc
 create mode 100644 entity/KnowledgeLink_entity/documentation.adoc
 create mode 100644 entity/KnowledgeLink_entity/entityfields/byknowledgeid/documentation.adoc
 create mode 100644 entity/KnowledgeManagementTagList_entity/documentation.adoc
 create mode 100644 entity/KnowledgeManagementTagList_entity/entityfields/completelist/documentation.adoc
 create mode 100644 entity/KnowledgeManagementTags_entity/documentation.adoc
 create mode 100644 entity/KnowledgeManagementTags_entity/entityfields/byknowledgemanagementid/documentation.adoc
 create mode 100644 entity/KnowledgeManagement_entity/documentation.adoc
 create mode 100644 entity/KnowledgeManagement_entity/entityfields/provider/documentation.adoc
 create mode 100644 entity/KnowledgeRole_entity/documentation.adoc
 create mode 100644 entity/KnowledgeRole_entity/entityfields/knowledgerole/documentation.adoc

diff --git a/entity/KnowledgeDiscussion_entity/KnowledgeDiscussion_entity.aod b/entity/KnowledgeDiscussion_entity/KnowledgeDiscussion_entity.aod
index 0b70f5dfc1e..79d764acc09 100644
--- a/entity/KnowledgeDiscussion_entity/KnowledgeDiscussion_entity.aod
+++ b/entity/KnowledgeDiscussion_entity/KnowledgeDiscussion_entity.aod
@@ -2,6 +2,7 @@
 <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>KnowledgeDiscussion_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
+  <documentation>%aditoprj%/entity/KnowledgeDiscussion_entity/documentation.adoc</documentation>
   <title>Discussion</title>
   <grantCreateProcess>%aditoprj%/entity/KnowledgeDiscussion_entity/grantCreateProcess.js</grantCreateProcess>
   <grantUpdateProcess>%aditoprj%/entity/KnowledgeDiscussion_entity/grantUpdateProcess.js</grantUpdateProcess>
@@ -61,6 +62,11 @@
     </entityField>
     <entityConsumer>
       <name>StatusKeyword</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>SpecificContainerKeywords</fieldName>
+      </dependency>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
@@ -71,14 +77,10 @@
           <valueProcess>%aditoprj%/entity/KnowledgeDiscussion_entity/entityfields/statuskeyword/children/onlyactives_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-      <dependency>
-        <name>dependency</name>
-        <entityName>KeywordEntry_entity</entityName>
-        <fieldName>SpecificContainerKeywords</fieldName>
-      </dependency>
     </entityConsumer>
     <entityProvider>
       <name>ByKnowledgeId</name>
+      <documentation>%aditoprj%/entity/KnowledgeDiscussion_entity/entityfields/byknowledgeid/documentation.adoc</documentation>
       <dependencies>
         <entityDependency>
           <name>fbacb136-2690-495a-82c5-b6ab1576d3f9</name>
diff --git a/entity/KnowledgeDiscussion_entity/documentation.adoc b/entity/KnowledgeDiscussion_entity/documentation.adoc
new file mode 100644
index 00000000000..d2fa0a728ff
--- /dev/null
+++ b/entity/KnowledgeDiscussion_entity/documentation.adoc
@@ -0,0 +1,3 @@
+This entity manages the discussion "forum" which is linked to a knowledge entry
+It uses a JDito recordcontainer to build the tree.
+The tree is always sorted by latest action. So the dicussion where an answer was added last, is put on top
\ No newline at end of file
diff --git a/entity/KnowledgeDiscussion_entity/entityfields/byknowledgeid/documentation.adoc b/entity/KnowledgeDiscussion_entity/entityfields/byknowledgeid/documentation.adoc
new file mode 100644
index 00000000000..f57edf8c453
--- /dev/null
+++ b/entity/KnowledgeDiscussion_entity/entityfields/byknowledgeid/documentation.adoc
@@ -0,0 +1,3 @@
+This provider needs the id of a knowledge entry to deliver all discussions of it
+
+Always fill KnowledgeId_param
\ No newline at end of file
diff --git a/entity/KnowledgeLink_entity/KnowledgeLink_entity.aod b/entity/KnowledgeLink_entity/KnowledgeLink_entity.aod
index 81ffc1da3d8..93ad79b6566 100644
--- a/entity/KnowledgeLink_entity/KnowledgeLink_entity.aod
+++ b/entity/KnowledgeLink_entity/KnowledgeLink_entity.aod
@@ -2,6 +2,7 @@
 <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>KnowledgeLink_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
+  <documentation>%aditoprj%/entity/KnowledgeLink_entity/documentation.adoc</documentation>
   <title>Link</title>
   <iconIdProcess>%aditoprj%/entity/KnowledgeLink_entity/iconIdProcess.js</iconIdProcess>
   <titlePlural>Links</titlePlural>
@@ -57,17 +58,17 @@
     </entityConsumer>
     <entityConsumer>
       <name>Objects</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>ObjectProxy_entity</entityName>
+        <fieldName>FilteredObjects</fieldName>
+      </dependency>
       <children>
         <entityParameter>
           <name>Entity_param</name>
           <valueProcess>%aditoprj%/entity/KnowledgeLink_entity/entityfields/objects/children/entity_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-      <dependency>
-        <name>dependency</name>
-        <entityName>ObjectProxy_entity</entityName>
-        <fieldName>FilteredObjects</fieldName>
-      </dependency>
     </entityConsumer>
     <entityParameter>
       <name>KnowledgeManagementId_param</name>
@@ -77,16 +78,7 @@
       <name>ByKnowledgeId</name>
       <targetContextField>OBJECT_TYPE</targetContextField>
       <targetIdField>ROW_ID</targetIdField>
-      <children>
-        <entityParameter>
-          <name>ObjectType_param</name>
-          <expose v="false" />
-        </entityParameter>
-        <entityParameter>
-          <name>RowId_param</name>
-          <expose v="false" />
-        </entityParameter>
-      </children>
+      <documentation>%aditoprj%/entity/KnowledgeLink_entity/entityfields/byknowledgeid/documentation.adoc</documentation>
       <dependencies>
         <entityDependency>
           <name>c3ed10c1-db55-4e55-9c18-2b8d400df033</name>
@@ -95,14 +87,13 @@
           <isConsumer v="false" />
         </entityDependency>
       </dependencies>
-    </entityProvider>
-    <entityProvider>
-      <name>ByLink</name>
-      <targetContextField>OBJECT_TYPE</targetContextField>
-      <targetIdField>ROW_ID</targetIdField>
       <children>
         <entityParameter>
-          <name>KnowledgeManagementId_param</name>
+          <name>ObjectType_param</name>
+          <expose v="false" />
+        </entityParameter>
+        <entityParameter>
+          <name>RowId_param</name>
           <expose v="false" />
         </entityParameter>
       </children>
diff --git a/entity/KnowledgeLink_entity/documentation.adoc b/entity/KnowledgeLink_entity/documentation.adoc
new file mode 100644
index 00000000000..32310ca526d
--- /dev/null
+++ b/entity/KnowledgeLink_entity/documentation.adoc
@@ -0,0 +1 @@
+This entity is used to manage links to other objects, that are read from ObjectProxy_entity via a consumer
\ No newline at end of file
diff --git a/entity/KnowledgeLink_entity/entityfields/byknowledgeid/documentation.adoc b/entity/KnowledgeLink_entity/entityfields/byknowledgeid/documentation.adoc
new file mode 100644
index 00000000000..94bf48727d7
--- /dev/null
+++ b/entity/KnowledgeLink_entity/entityfields/byknowledgeid/documentation.adoc
@@ -0,0 +1 @@
+Delivers all links to other objects that are linked to a knowledge entry
\ No newline at end of file
diff --git a/entity/KnowledgeManagementTagList_entity/KnowledgeManagementTagList_entity.aod b/entity/KnowledgeManagementTagList_entity/KnowledgeManagementTagList_entity.aod
index c7b24df7f14..3a8e46df4e9 100644
--- a/entity/KnowledgeManagementTagList_entity/KnowledgeManagementTagList_entity.aod
+++ b/entity/KnowledgeManagementTagList_entity/KnowledgeManagementTagList_entity.aod
@@ -2,6 +2,7 @@
 <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>KnowledgeManagementTagList_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
+  <documentation>%aditoprj%/entity/KnowledgeManagementTagList_entity/documentation.adoc</documentation>
   <contentTitleProcess>%aditoprj%/entity/KnowledgeManagementTagList_entity/contentTitleProcess.js</contentTitleProcess>
   <recordContainer>JDito_TagList</recordContainer>
   <entityFields>
@@ -16,6 +17,7 @@
     </entityField>
     <entityProvider>
       <name>CompleteList</name>
+      <documentation>%aditoprj%/entity/KnowledgeManagementTagList_entity/entityfields/completelist/documentation.adoc</documentation>
       <dependencies>
         <entityDependency>
           <name>85925baa-5edc-4908-804e-f7ec4c5a2a0c</name>
diff --git a/entity/KnowledgeManagementTagList_entity/documentation.adoc b/entity/KnowledgeManagementTagList_entity/documentation.adoc
new file mode 100644
index 00000000000..d2eef458aba
--- /dev/null
+++ b/entity/KnowledgeManagementTagList_entity/documentation.adoc
@@ -0,0 +1 @@
+The entity provides a complete list of all existing tags and is consumed where tags can be chosen
\ No newline at end of file
diff --git a/entity/KnowledgeManagementTagList_entity/entityfields/completelist/documentation.adoc b/entity/KnowledgeManagementTagList_entity/entityfields/completelist/documentation.adoc
new file mode 100644
index 00000000000..d26c90a04d7
--- /dev/null
+++ b/entity/KnowledgeManagementTagList_entity/entityfields/completelist/documentation.adoc
@@ -0,0 +1 @@
+provides a complete list of all possible tags, so they can be chosen when you add tags
\ No newline at end of file
diff --git a/entity/KnowledgeManagementTags_entity/KnowledgeManagementTags_entity.aod b/entity/KnowledgeManagementTags_entity/KnowledgeManagementTags_entity.aod
index 10b75658ad1..14f18612c20 100644
--- a/entity/KnowledgeManagementTags_entity/KnowledgeManagementTags_entity.aod
+++ b/entity/KnowledgeManagementTags_entity/KnowledgeManagementTags_entity.aod
@@ -2,6 +2,7 @@
 <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>KnowledgeManagementTags_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
+  <documentation>%aditoprj%/entity/KnowledgeManagementTags_entity/documentation.adoc</documentation>
   <recordContainer>JDito_KnowledgeManagementKeywords</recordContainer>
   <entityFields>
     <entityProvider>
@@ -13,12 +14,7 @@
     </entityParameter>
     <entityProvider>
       <name>ByKnowledgeManagementId</name>
-      <children>
-        <entityParameter>
-          <name>KnowledgeManagementId_param</name>
-          <mandatory v="true" />
-        </entityParameter>
-      </children>
+      <documentation>%aditoprj%/entity/KnowledgeManagementTags_entity/entityfields/byknowledgemanagementid/documentation.adoc</documentation>
       <dependencies>
         <entityDependency>
           <name>8d86a61b-0fe3-44c4-a512-e044c990fded</name>
@@ -27,6 +23,12 @@
           <isConsumer v="false" />
         </entityDependency>
       </dependencies>
+      <children>
+        <entityParameter>
+          <name>KnowledgeManagementId_param</name>
+          <mandatory v="true" />
+        </entityParameter>
+      </children>
     </entityProvider>
     <entityField>
       <name>TAG</name>
diff --git a/entity/KnowledgeManagementTags_entity/documentation.adoc b/entity/KnowledgeManagementTags_entity/documentation.adoc
new file mode 100644
index 00000000000..ca20973196d
--- /dev/null
+++ b/entity/KnowledgeManagementTags_entity/documentation.adoc
@@ -0,0 +1,5 @@
+This entity represents the tags of a knowledge entry and handles adding, editing and deleting of linked tags
+
+If a tag, which doesn't exist yet is entered, the tag is created and then added to the knowledge entry
+
+Always fill KnowledgeManagementId_param
\ No newline at end of file
diff --git a/entity/KnowledgeManagementTags_entity/entityfields/byknowledgemanagementid/documentation.adoc b/entity/KnowledgeManagementTags_entity/entityfields/byknowledgemanagementid/documentation.adoc
new file mode 100644
index 00000000000..76bdf005461
--- /dev/null
+++ b/entity/KnowledgeManagementTags_entity/entityfields/byknowledgemanagementid/documentation.adoc
@@ -0,0 +1,3 @@
+This provider delivers the list of tags of a knowledge entry
+
+KnowledgeManagementId_param has to be filled, otherwise it won't work
\ No newline at end of file
diff --git a/entity/KnowledgeManagement_entity/KnowledgeManagement_entity.aod b/entity/KnowledgeManagement_entity/KnowledgeManagement_entity.aod
index f52fc433f41..ca44262effc 100644
--- a/entity/KnowledgeManagement_entity/KnowledgeManagement_entity.aod
+++ b/entity/KnowledgeManagement_entity/KnowledgeManagement_entity.aod
@@ -2,6 +2,7 @@
 <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>KnowledgeManagement_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
+  <documentation>%aditoprj%/entity/KnowledgeManagement_entity/documentation.adoc</documentation>
   <icon>VAADIN:ACADEMY_CAP</icon>
   <title>Knowledge</title>
   <grantUpdateProcess>%aditoprj%/entity/KnowledgeManagement_entity/grantUpdateProcess.js</grantUpdateProcess>
@@ -16,13 +17,6 @@
   <entityFields>
     <entityProvider>
       <name>#PROVIDER</name>
-      <dependencies>
-        <entityDependency>
-          <name>40cf66ca-421f-47f6-8ecc-8360657e0640</name>
-          <entityName>KnowledgeNewsFeed_entity</entityName>
-          <isConsumer v="false" />
-        </entityDependency>
-      </dependencies>
     </entityProvider>
     <entityField>
       <name>KNOWLEDGEMANAGEMENTID</name>
@@ -108,35 +102,36 @@
       <refreshParent v="true" />
       <state>EDITABLE</state>
       <onValidation>%aditoprj%/entity/KnowledgeManagement_entity/entityfields/tagsbyknowledgeid/onValidation.js</onValidation>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KnowledgeManagementTags_entity</entityName>
+        <fieldName>ByKnowledgeManagementId</fieldName>
+      </dependency>
       <children>
         <entityParameter>
           <name>KnowledgeManagementId_param</name>
           <valueProcess>%aditoprj%/entity/KnowledgeManagement_entity/entityfields/tagsbyknowledgeid/children/knowledgemanagementid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-      <dependency>
-        <name>dependency</name>
-        <entityName>KnowledgeManagementTags_entity</entityName>
-        <fieldName>ByKnowledgeManagementId</fieldName>
-      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>DiscussionsByKnowledgeId</name>
       <refreshParent v="true" />
+      <dependency>
+        <name>dependency</name>
+        <entityName>KnowledgeDiscussion_entity</entityName>
+        <fieldName>ByKnowledgeId</fieldName>
+      </dependency>
       <children>
         <entityParameter>
           <name>KnowledgeId_param</name>
           <valueProcess>%aditoprj%/entity/KnowledgeManagement_entity/entityfields/discussionsbyknowledgeid/children/knowledgeid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-      <dependency>
-        <name>dependency</name>
-        <entityName>KnowledgeDiscussion_entity</entityName>
-        <fieldName>ByKnowledgeId</fieldName>
-      </dependency>
     </entityConsumer>
     <entityProvider>
       <name>Provider</name>
+      <documentation>%aditoprj%/entity/KnowledgeManagement_entity/entityfields/provider/documentation.adoc</documentation>
     </entityProvider>
     <entityConsumer>
       <name>PersonContacts</name>
@@ -148,37 +143,42 @@
     </entityConsumer>
     <entityConsumer>
       <name>KeywordKnowledgeType</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>SpecificContainerKeywords</fieldName>
+      </dependency>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
           <valueProcess>%aditoprj%/entity/KnowledgeManagement_entity/entityfields/keywordknowledgetype/children/containername_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+    </entityConsumer>
+    <entityConsumer>
+      <name>KeywordPublish</name>
       <dependency>
         <name>dependency</name>
         <entityName>KeywordEntry_entity</entityName>
         <fieldName>SpecificContainerKeywords</fieldName>
       </dependency>
-    </entityConsumer>
-    <entityConsumer>
-      <name>KeywordPublish</name>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
           <valueProcess>%aditoprj%/entity/KnowledgeManagement_entity/entityfields/keywordpublish/children/containername_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-      <dependency>
-        <name>dependency</name>
-        <entityName>KeywordEntry_entity</entityName>
-        <fieldName>SpecificContainerKeywords</fieldName>
-      </dependency>
     </entityConsumer>
     <entityField>
       <name>indexTag</name>
     </entityField>
     <entityConsumer>
       <name>LinkedDocuments</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Document_entity</entityName>
+        <fieldName>Documents</fieldName>
+      </dependency>
       <children>
         <entityParameter>
           <name>AssignmentTable_param</name>
@@ -189,11 +189,6 @@
           <valueProcess>%aditoprj%/entity/KnowledgeManagement_entity/entityfields/linkeddocuments/children/assignmentrowid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Document_entity</entityName>
-        <fieldName>Documents</fieldName>
-      </dependency>
     </entityConsumer>
     <entityActionField>
       <name>openEntryAsMail</name>
@@ -206,17 +201,17 @@
     <entityConsumer>
       <name>LinksByKnowledgeId</name>
       <refreshParent v="true" />
+      <dependency>
+        <name>dependency</name>
+        <entityName>KnowledgeLink_entity</entityName>
+        <fieldName>ByKnowledgeId</fieldName>
+      </dependency>
       <children>
         <entityParameter>
           <name>KnowledgeManagementId_param</name>
           <valueProcess>%aditoprj%/entity/KnowledgeManagement_entity/entityfields/linksbyknowledgeid/children/knowledgemanagementid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-      <dependency>
-        <name>dependency</name>
-        <entityName>KnowledgeLink_entity</entityName>
-        <fieldName>ByKnowledgeId</fieldName>
-      </dependency>
     </entityConsumer>
     <entityField>
       <name>LastChange</name>
@@ -225,17 +220,17 @@
     </entityField>
     <entityConsumer>
       <name>LogHistories</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>LogHistory_entity</entityName>
+        <fieldName>LogHistoryProvider</fieldName>
+      </dependency>
       <children>
         <entityParameter>
           <name>tablenames_param</name>
           <valueProcess>%aditoprj%/entity/KnowledgeManagement_entity/entityfields/loghistories/children/tablenames_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-      <dependency>
-        <name>dependency</name>
-        <entityName>LogHistory_entity</entityName>
-        <fieldName>LogHistoryProvider</fieldName>
-      </dependency>
     </entityConsumer>
     <entityActionField>
       <name>exportHTML_action</name>
@@ -277,6 +272,11 @@
       <name>KnowledgeRoles</name>
       <stateProcess>%aditoprj%/entity/KnowledgeManagement_entity/entityfields/knowledgeroles/stateProcess.js</stateProcess>
       <onValidation>%aditoprj%/entity/KnowledgeManagement_entity/entityfields/knowledgeroles/onValidation.js</onValidation>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KnowledgeRole_entity</entityName>
+        <fieldName>KnowledgeRole</fieldName>
+      </dependency>
       <children>
         <entityParameter>
           <name>KnowledgeManagement_param</name>
@@ -288,14 +288,14 @@
           <expose v="true" />
         </entityParameter>
       </children>
-      <dependency>
-        <name>dependency</name>
-        <entityName>KnowledgeRole_entity</entityName>
-        <fieldName>KnowledgeRole</fieldName>
-      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>Tasks</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Task_entity</entityName>
+        <fieldName>Tasks</fieldName>
+      </dependency>
       <children>
         <entityParameter>
           <name>ObjectId_param</name>
@@ -310,11 +310,6 @@
           <valueProcess>%aditoprj%/entity/KnowledgeManagement_entity/entityfields/tasks/children/presetlinks_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Task_entity</entityName>
-        <fieldName>Tasks</fieldName>
-      </dependency>
     </entityConsumer>
     <entityField>
       <name>RESPONSIBLE_CONTACT_ID</name>
@@ -328,6 +323,7 @@
       <name>PUBLISH</name>
       <title>Publishing level</title>
       <consumer>KeywordPublish</consumer>
+      <state>INVISIBLE</state>
       <valueProcess>%aditoprj%/entity/KnowledgeManagement_entity/entityfields/publish/valueProcess.js</valueProcess>
       <displayValueProcess>%aditoprj%/entity/KnowledgeManagement_entity/entityfields/publish/displayValueProcess.js</displayValueProcess>
     </entityField>
diff --git a/entity/KnowledgeManagement_entity/documentation.adoc b/entity/KnowledgeManagement_entity/documentation.adoc
new file mode 100644
index 00000000000..db9002b6103
--- /dev/null
+++ b/entity/KnowledgeManagement_entity/documentation.adoc
@@ -0,0 +1,3 @@
+The main entity of the knowledgemanagement
+
+manages the content and consumes discussions, links, log history, documents 
\ No newline at end of file
diff --git a/entity/KnowledgeManagement_entity/entityfields/provider/documentation.adoc b/entity/KnowledgeManagement_entity/entityfields/provider/documentation.adoc
new file mode 100644
index 00000000000..d72ef5f6730
--- /dev/null
+++ b/entity/KnowledgeManagement_entity/entityfields/provider/documentation.adoc
@@ -0,0 +1 @@
+This provider is used by dashlets which set isDashlet_param
\ No newline at end of file
diff --git a/entity/KnowledgeManagement_entity/recordcontainers/indexsearchknowledgebase/query.js b/entity/KnowledgeManagement_entity/recordcontainers/indexsearchknowledgebase/query.js
index b13c3cdc15d..29d30e242c2 100644
--- a/entity/KnowledgeManagement_entity/recordcontainers/indexsearchknowledgebase/query.js
+++ b/entity/KnowledgeManagement_entity/recordcontainers/indexsearchknowledgebase/query.js
@@ -12,13 +12,13 @@ var sql = newSelect([
                     .join("KNOWLEDGETAGLINK", "KNOWLEDGEMANAGEMENTID = KNOWLEDGEMANAGEMENT_ID")
                     .join("KNOWLEDGETAG", "KNOWLEDGETAGID = KNOWLEDGETAG_ID")
                     .where("KNOWLEDGETAG.TAG", "News")
-                    .and("KNOWLEDGEMANAGEMENT.KNOWLEDGEMANAGEMENTID = km1.KNOWLEDGEMANAGEMENTID"))
+                    .and("KNOWLEDGEMANAGEMENT.KNOWLEDGEMANAGEMENTID = km1.KNOWLEDGEMANAGEMENTID"), SqlBuilder.EXISTS())
                 .thenString("News")
-            .when(newWhere("GITPATH is null").and("TYPE = 1"))
+            .when(newWhere("TYPE = '1'"))
                 .thenString("Knowledgebase")
-            .when(newWhere("GITPATH is not null").and("TYPE = 2"))
+            .when(newWhere("TYPE = '2'"))
                 .thenString("Editorial")
-            .when("TYPE = 3")
+            .when(newWhere("TYPE = '3'"))
                 .thenString("Business process"),
         "''"
     ]).from("KNOWLEDGEMANAGEMENT", "km1")
diff --git a/entity/KnowledgeRole_entity/KnowledgeRole_entity.aod b/entity/KnowledgeRole_entity/KnowledgeRole_entity.aod
index eb1b5a2d876..427a175e7b5 100644
--- a/entity/KnowledgeRole_entity/KnowledgeRole_entity.aod
+++ b/entity/KnowledgeRole_entity/KnowledgeRole_entity.aod
@@ -2,6 +2,7 @@
 <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>KnowledgeRole_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
+  <documentation>%aditoprj%/entity/KnowledgeRole_entity/documentation.adoc</documentation>
   <title>Knowledge Role</title>
   <recordContainer>db</recordContainer>
   <entityFields>
@@ -16,21 +17,22 @@
     </entityField>
     <entityConsumer>
       <name>NewsRole</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Role_entity</entityName>
+        <fieldName>FilterRolesWithoutPermission</fieldName>
+      </dependency>
       <children>
         <entityParameter>
           <name>ExcludeRoles_param</name>
           <valueProcess>%aditoprj%/entity/KnowledgeRole_entity/entityfields/newsrole/children/excluderoles_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Role_entity</entityName>
-        <fieldName>FilterRolesWithoutPermission</fieldName>
-      </dependency>
     </entityConsumer>
     <entityProvider>
       <name>KnowledgeRole</name>
       <lookupIdfield>ROLES</lookupIdfield>
+      <documentation>%aditoprj%/entity/KnowledgeRole_entity/entityfields/knowledgerole/documentation.adoc</documentation>
       <titlePlural>KnowledgeRoles</titlePlural>
       <recordContainer>db</recordContainer>
       <dependencies>
diff --git a/entity/KnowledgeRole_entity/documentation.adoc b/entity/KnowledgeRole_entity/documentation.adoc
new file mode 100644
index 00000000000..6b291538809
--- /dev/null
+++ b/entity/KnowledgeRole_entity/documentation.adoc
@@ -0,0 +1,5 @@
+This entity handles the roles, that are linked to a knowledge entry
+The roles are used to create notifications and newsfeed entries for specific roles when the switches are set
+
+KnowledgeManagement_param needs the id of a knowledge entry
+PublishLevelRoles_param takes an array of role names which get excluded from the role list
\ No newline at end of file
diff --git a/entity/KnowledgeRole_entity/entityfields/knowledgerole/documentation.adoc b/entity/KnowledgeRole_entity/entityfields/knowledgerole/documentation.adoc
new file mode 100644
index 00000000000..781e59c7597
--- /dev/null
+++ b/entity/KnowledgeRole_entity/entityfields/knowledgerole/documentation.adoc
@@ -0,0 +1,2 @@
+KnowledgeManagement_param needs the id of a knowledge entry
+PublishLevelRoles_param takes an array of role names which get excluded from the role list
\ No newline at end of file
-- 
GitLab


From 6504e6ac18c5b1d668e5d516bc89e11e952a3980 Mon Sep 17 00:00:00 2001
From: Sebastian Listl <s.listl@adito.de>
Date: Fri, 4 Dec 2020 10:23:01 +0100
Subject: [PATCH 162/184] #1069751 ExportTemplate delete relations in
 onDBDelete

---
 .../ExportTemplate_entity.aod                 | 35 ++++++++++---------
 .../recordcontainers/db/onDBDelete.js         |  8 +++++
 .../ExportTemplateFieldList_view.aod          |  4 +--
 .../ExportTemplatePlaceOfUseList_view.aod     |  4 +--
 .../ExportTemplatePreview_view.aod            |  2 ++
 5 files changed, 32 insertions(+), 21 deletions(-)
 create mode 100644 entity/ExportTemplate_entity/recordcontainers/db/onDBDelete.js

diff --git a/entity/ExportTemplate_entity/ExportTemplate_entity.aod b/entity/ExportTemplate_entity/ExportTemplate_entity.aod
index a38388bbd5d..473d4f9dbd3 100644
--- a/entity/ExportTemplate_entity/ExportTemplate_entity.aod
+++ b/entity/ExportTemplate_entity/ExportTemplate_entity.aod
@@ -73,11 +73,6 @@
     <entityConsumer>
       <name>ExportTemplateFields</name>
       <state>EDITABLE</state>
-      <dependency>
-        <name>dependency</name>
-        <entityName>ExportTemplateField_entity</entityName>
-        <fieldName>ExportTemplateFields</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ExportTemplateField_param</name>
@@ -86,6 +81,11 @@
           <documentation>%aditoprj%/entity/ExportTemplate_entity/entityfields/exporttemplatefields/children/exporttemplatefield_param/documentation.adoc</documentation>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>ExportTemplateField_entity</entityName>
+        <fieldName>ExportTemplateFields</fieldName>
+      </dependency>
     </entityConsumer>
     <entityParameter>
       <name>ExportTemplateIDs_param</name>
@@ -94,11 +94,6 @@
     </entityParameter>
     <entityConsumer>
       <name>ExportTemplateplaceOfUseCon</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>ExportTemplatePlaceOfUse_entity</entityName>
-        <fieldName>ExportTemplatePlaceOfUser</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ExportTemplatePlaceOfUse_param</name>
@@ -106,11 +101,23 @@
           <expose v="true" />
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>ExportTemplatePlaceOfUse_entity</entityName>
+        <fieldName>ExportTemplatePlaceOfUser</fieldName>
+      </dependency>
     </entityConsumer>
     <entityProvider>
       <name>ExportTemplateIDs</name>
       <documentation>%aditoprj%/entity/ExportTemplate_entity/entityfields/exporttemplateids/documentation.adoc</documentation>
       <recordContainer>db</recordContainer>
+      <children>
+        <entityParameter>
+          <name>ExportTemplateIDs_param</name>
+          <valueProcess>%aditoprj%/entity/ExportTemplate_entity/entityfields/exporttemplateids/children/exporttemplateids_param/valueProcess.js</valueProcess>
+          <expose v="true" />
+        </entityParameter>
+      </children>
       <dependencies>
         <entityDependency>
           <name>1b692618-b800-47ae-a48c-3d4164d68401</name>
@@ -119,13 +126,6 @@
           <isConsumer v="false" />
         </entityDependency>
       </dependencies>
-      <children>
-        <entityParameter>
-          <name>ExportTemplateIDs_param</name>
-          <valueProcess>%aditoprj%/entity/ExportTemplate_entity/entityfields/exporttemplateids/children/exporttemplateids_param/valueProcess.js</valueProcess>
-          <expose v="true" />
-        </entityParameter>
-      </children>
     </entityProvider>
     <entityParameter>
       <name>comingFrom_param</name>
@@ -160,6 +160,7 @@
       <alias>Data_alias</alias>
       <isReadOnly v="false" />
       <conditionProcess>%aditoprj%/entity/ExportTemplate_entity/recordcontainers/db/conditionProcess.js</conditionProcess>
+      <onDBDelete>%aditoprj%/entity/ExportTemplate_entity/recordcontainers/db/onDBDelete.js</onDBDelete>
       <linkInformation>
         <linkInformation>
           <name>ce410f40-846b-43e6-9c30-150393cee43d</name>
diff --git a/entity/ExportTemplate_entity/recordcontainers/db/onDBDelete.js b/entity/ExportTemplate_entity/recordcontainers/db/onDBDelete.js
new file mode 100644
index 00000000000..571ed49a75e
--- /dev/null
+++ b/entity/ExportTemplate_entity/recordcontainers/db/onDBDelete.js
@@ -0,0 +1,8 @@
+import("system.vars");
+import("Sql_lib");
+
+var exportTemplateId = vars.get("$local.uid");
+
+newWhere("EXPORTTEMPLATEPLACEOFUSE.EXPORTTEMPLATE_ID", exportTemplateId).deleteData();
+newWhere("EXPORTTEMPLATESELECTION.EXPORTTEMPLATE_ID", exportTemplateId).deleteData();
+newWhere("EXPORTTEMPLATEFIELD.EXPORTTEMPLATE_ID", exportTemplateId).deleteData();
\ No newline at end of file
diff --git a/neonView/ExportTemplateFieldList_view/ExportTemplateFieldList_view.aod b/neonView/ExportTemplateFieldList_view/ExportTemplateFieldList_view.aod
index c76b3911ada..c7dfb01e23a 100644
--- a/neonView/ExportTemplateFieldList_view/ExportTemplateFieldList_view.aod
+++ b/neonView/ExportTemplateFieldList_view/ExportTemplateFieldList_view.aod
@@ -5,9 +5,9 @@
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <filterable v="false" />
   <layout>
-    <boxLayout>
+    <noneLayout>
       <name>layout</name>
-    </boxLayout>
+    </noneLayout>
   </layout>
   <children>
     <titledListViewTemplate>
diff --git a/neonView/ExportTemplatePlaceOfUseList_view/ExportTemplatePlaceOfUseList_view.aod b/neonView/ExportTemplatePlaceOfUseList_view/ExportTemplatePlaceOfUseList_view.aod
index 45306dbb723..ca711428be6 100644
--- a/neonView/ExportTemplatePlaceOfUseList_view/ExportTemplatePlaceOfUseList_view.aod
+++ b/neonView/ExportTemplatePlaceOfUseList_view/ExportTemplatePlaceOfUseList_view.aod
@@ -3,9 +3,9 @@
   <name>ExportTemplatePlaceOfUseList_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
-    <boxLayout>
+    <noneLayout>
       <name>layout</name>
-    </boxLayout>
+    </noneLayout>
   </layout>
   <children>
     <titledListViewTemplate>
diff --git a/neonView/ExportTemplatePreview_view/ExportTemplatePreview_view.aod b/neonView/ExportTemplatePreview_view/ExportTemplatePreview_view.aod
index 06bcfe9edfd..79713725747 100644
--- a/neonView/ExportTemplatePreview_view/ExportTemplatePreview_view.aod
+++ b/neonView/ExportTemplatePreview_view/ExportTemplatePreview_view.aod
@@ -24,6 +24,8 @@
     </favoriteViewTemplate>
     <genericViewTemplate>
       <name>generic</name>
+      <showDrawer v="true" />
+      <drawerCaption>Details</drawerCaption>
       <entityField>#ENTITY</entityField>
       <fields>
         <entityFieldLink>
-- 
GitLab


From e1bf9a46f2509342bcda907fec24cb20b1b5dd08 Mon Sep 17 00:00:00 2001
From: Simon Leipold <s.leipold@adito.de>
Date: Fri, 4 Dec 2020 11:23:28 +0100
Subject: [PATCH 163/184] upgrade nach merge von 2020.2

---
 neonView/CampaignStepMembers_view/CampaignStepMembers_view.aod  | 2 +-
 neonView/MSTTeamChannelEdit_view/MSTTeamChannelEdit_view.aod    | 2 +-
 neonView/MSTTeamEditMembers_view/MSTTeamEditMembers_view.aod    | 2 +-
 neonView/MSTTeamEdit_view/MSTTeamEdit_view.aod                  | 2 +-
 neonView/MSTTeamLinkEdit_view/MSTTeamLinkEdit_view.aod          | 2 +-
 neonView/MSTTeamMemberList_view/MSTTeamMemberList_view.aod      | 2 +-
 .../MSTTeamMemberMultiEdit_view/MSTTeamMemberMultiEdit_view.aod | 2 +-
 neonView/MSTTeamPreview_view/MSTTeamPreview_view.aod            | 2 +-
 .../MSTeamsActivityImportEdit_view.aod                          | 2 +-
 neonView/MSTeamsChannelList_view/MSTeamsChannelList_view.aod    | 2 +-
 neonView/MSTeamsDocumentEdit_view/MSTeamsDocumentEdit_view.aod  | 2 +-
 .../MSTeamsMessageFilter_view/MSTeamsMessageFilter_view.aod     | 2 +-
 neonView/MemberLookup_view/MemberLookup_view.aod                | 2 +-
 13 files changed, 13 insertions(+), 13 deletions(-)

diff --git a/neonView/CampaignStepMembers_view/CampaignStepMembers_view.aod b/neonView/CampaignStepMembers_view/CampaignStepMembers_view.aod
index 7d6034293b0..716e6056c13 100644
--- a/neonView/CampaignStepMembers_view/CampaignStepMembers_view.aod
+++ b/neonView/CampaignStepMembers_view/CampaignStepMembers_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>CampaignStepMembers_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/MSTTeamChannelEdit_view/MSTTeamChannelEdit_view.aod b/neonView/MSTTeamChannelEdit_view/MSTTeamChannelEdit_view.aod
index 360a058b7da..c27de99f559 100644
--- a/neonView/MSTTeamChannelEdit_view/MSTTeamChannelEdit_view.aod
+++ b/neonView/MSTTeamChannelEdit_view/MSTTeamChannelEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>MSTTeamChannelEdit_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/MSTTeamEditMembers_view/MSTTeamEditMembers_view.aod b/neonView/MSTTeamEditMembers_view/MSTTeamEditMembers_view.aod
index 37d7d19c886..9474c7ad093 100644
--- a/neonView/MSTTeamEditMembers_view/MSTTeamEditMembers_view.aod
+++ b/neonView/MSTTeamEditMembers_view/MSTTeamEditMembers_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>MSTTeamEditMembers_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <size>SMALL</size>
diff --git a/neonView/MSTTeamEdit_view/MSTTeamEdit_view.aod b/neonView/MSTTeamEdit_view/MSTTeamEdit_view.aod
index 867c7a8fa07..9d1ffde69b9 100644
--- a/neonView/MSTTeamEdit_view/MSTTeamEdit_view.aod
+++ b/neonView/MSTTeamEdit_view/MSTTeamEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>MSTTeamEdit_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <size>SMALL</size>
diff --git a/neonView/MSTTeamLinkEdit_view/MSTTeamLinkEdit_view.aod b/neonView/MSTTeamLinkEdit_view/MSTTeamLinkEdit_view.aod
index acb23701eb4..7afbe62185e 100644
--- a/neonView/MSTTeamLinkEdit_view/MSTTeamLinkEdit_view.aod
+++ b/neonView/MSTTeamLinkEdit_view/MSTTeamLinkEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>MSTTeamLinkEdit_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <size>SMALL</size>
diff --git a/neonView/MSTTeamMemberList_view/MSTTeamMemberList_view.aod b/neonView/MSTTeamMemberList_view/MSTTeamMemberList_view.aod
index 55a8b3dda3b..168947cdb47 100644
--- a/neonView/MSTTeamMemberList_view/MSTTeamMemberList_view.aod
+++ b/neonView/MSTTeamMemberList_view/MSTTeamMemberList_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>MSTTeamMemberList_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/MSTTeamMemberMultiEdit_view/MSTTeamMemberMultiEdit_view.aod b/neonView/MSTTeamMemberMultiEdit_view/MSTTeamMemberMultiEdit_view.aod
index ec552dc14c2..5fe30d6a86a 100644
--- a/neonView/MSTTeamMemberMultiEdit_view/MSTTeamMemberMultiEdit_view.aod
+++ b/neonView/MSTTeamMemberMultiEdit_view/MSTTeamMemberMultiEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>MSTTeamMemberMultiEdit_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/MSTTeamPreview_view/MSTTeamPreview_view.aod b/neonView/MSTTeamPreview_view/MSTTeamPreview_view.aod
index d543b83e6b1..fbc295e90e4 100644
--- a/neonView/MSTTeamPreview_view/MSTTeamPreview_view.aod
+++ b/neonView/MSTTeamPreview_view/MSTTeamPreview_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>MSTTeamPreview_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/MSTeamsActivityImportEdit_view/MSTeamsActivityImportEdit_view.aod b/neonView/MSTeamsActivityImportEdit_view/MSTeamsActivityImportEdit_view.aod
index a2f72666621..c089822821e 100644
--- a/neonView/MSTeamsActivityImportEdit_view/MSTeamsActivityImportEdit_view.aod
+++ b/neonView/MSTeamsActivityImportEdit_view/MSTeamsActivityImportEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>MSTeamsActivityImportEdit_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <size>NORMAL</size>
diff --git a/neonView/MSTeamsChannelList_view/MSTeamsChannelList_view.aod b/neonView/MSTeamsChannelList_view/MSTeamsChannelList_view.aod
index 514bf2098ee..253fe017d8f 100644
--- a/neonView/MSTeamsChannelList_view/MSTeamsChannelList_view.aod
+++ b/neonView/MSTeamsChannelList_view/MSTeamsChannelList_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>MSTeamsChannelList_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/MSTeamsDocumentEdit_view/MSTeamsDocumentEdit_view.aod b/neonView/MSTeamsDocumentEdit_view/MSTeamsDocumentEdit_view.aod
index c13a80654c3..017eb32c7d6 100644
--- a/neonView/MSTeamsDocumentEdit_view/MSTeamsDocumentEdit_view.aod
+++ b/neonView/MSTeamsDocumentEdit_view/MSTeamsDocumentEdit_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>MSTeamsDocumentEdit_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <size>SMALL</size>
diff --git a/neonView/MSTeamsMessageFilter_view/MSTeamsMessageFilter_view.aod b/neonView/MSTeamsMessageFilter_view/MSTeamsMessageFilter_view.aod
index c9cae5e66e2..469ba0bec31 100644
--- a/neonView/MSTeamsMessageFilter_view/MSTeamsMessageFilter_view.aod
+++ b/neonView/MSTeamsMessageFilter_view/MSTeamsMessageFilter_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>MSTeamsMessageFilter_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
diff --git a/neonView/MemberLookup_view/MemberLookup_view.aod b/neonView/MemberLookup_view/MemberLookup_view.aod
index 705d1bde99d..03833892bc2 100644
--- a/neonView/MemberLookup_view/MemberLookup_view.aod
+++ b/neonView/MemberLookup_view/MemberLookup_view.aod
@@ -1,5 +1,5 @@
 <?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">
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.7">
   <name>MemberLookup_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
-- 
GitLab


From 7319421d88c9ba01f8757bdec2bdc6402678ec8e Mon Sep 17 00:00:00 2001
From: Sebastian Pongratz <s.pongratz@adito.de>
Date: Tue, 8 Dec 2020 07:35:33 +0000
Subject: [PATCH 164/184] Bugfix leadimport

---
 .../Data_alias/basic/2020.2.2/alter_TableLeadStatus.xml     | 6 ++++++
 .liquibase/Data_alias/basic/2020.2.2/changelog.xml          | 1 +
 .../recordcontainers/dbrecordcontainer/onDBUpdate.js        | 4 +++-
 process/Leadimport_lib/process.js                           | 1 +
 4 files changed, 11 insertions(+), 1 deletion(-)
 create mode 100644 .liquibase/Data_alias/basic/2020.2.2/alter_TableLeadStatus.xml

diff --git a/.liquibase/Data_alias/basic/2020.2.2/alter_TableLeadStatus.xml b/.liquibase/Data_alias/basic/2020.2.2/alter_TableLeadStatus.xml
new file mode 100644
index 00000000000..9f11810890c
--- /dev/null
+++ b/.liquibase/Data_alias/basic/2020.2.2/alter_TableLeadStatus.xml
@@ -0,0 +1,6 @@
+<?xml version="1.1" encoding="UTF-8" standalone="no"?>
+<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd">
+    <changeSet author="d.nowack" id="bcd6cb02-d074-444f-a307-34973b3dd4dn">
+        <modifyDataType tableName="LEAD" columnName="STATUS" newDataType="VARCHAR(36)"/>
+    </changeSet>
+</databaseChangeLog>
\ No newline at end of file
diff --git a/.liquibase/Data_alias/basic/2020.2.2/changelog.xml b/.liquibase/Data_alias/basic/2020.2.2/changelog.xml
index f1519ab694e..302d930f6b0 100644
--- a/.liquibase/Data_alias/basic/2020.2.2/changelog.xml
+++ b/.liquibase/Data_alias/basic/2020.2.2/changelog.xml
@@ -5,6 +5,7 @@
     <include relativeToChangelogFile="true" file="Knowledgemanagement/changelog_knowledgeManagement.xml"/>
     <include relativeToChangelogFile="true" file="insert_employeeCountAttribute.xml"/>
     <include relativeToChangelogFile="true" file="alter_CampaignParticipantResponsible.xml"/>
+    <include relativeToChangelogFile="true" file="alter_TableLeadStatus.xml"/>
     <include relativeToChangelogFile="true" file="MSTeams/changelog.xml"/>
     <include relativeToChangelogFile="true" file="insert_newsletterAttribute.xml"/>
     <include relativeToChangelogFile="true" file="readd_ExporttemplateIndizes.xml"/>
diff --git a/entity/DuplicateScanner_entity/recordcontainers/dbrecordcontainer/onDBUpdate.js b/entity/DuplicateScanner_entity/recordcontainers/dbrecordcontainer/onDBUpdate.js
index c8e53ac00d7..c752ef5850f 100644
--- a/entity/DuplicateScanner_entity/recordcontainers/dbrecordcontainer/onDBUpdate.js
+++ b/entity/DuplicateScanner_entity/recordcontainers/dbrecordcontainer/onDBUpdate.js
@@ -1,3 +1,4 @@
+import("Sql_lib");
 import("system.vars");
 
 var rowdata = vars.get("$local.rowdata");
@@ -6,5 +7,6 @@ let scanPattern = JSON.parse(rowdata["DUPLICATESCANNER.SCAN_PATTERN"]);
 if (scanPattern.provider == undefined) 
 { 
     scanPattern.provider = "indexP";
-    vars.set("$field.SCAN_PATTERN", JSON.stringify(scanPattern));
+    newWhere("DUPLICATESCANNER.ID", vars.get("$local.uid"))
+    .updateData(true, "DUPLICATESCANNER", ["DUPLICATESCANNER.SCAN_PATTERN"], null,[JSON.stringify(scanPattern)]);
 }
\ No newline at end of file
diff --git a/process/Leadimport_lib/process.js b/process/Leadimport_lib/process.js
index de9d13b2c7b..6e902b7f0a5 100644
--- a/process/Leadimport_lib/process.js
+++ b/process/Leadimport_lib/process.js
@@ -349,6 +349,7 @@ LeadImportUtils.setValues  = function(pFields, pFieldDef, pFieldValues)
  * @return {String} outputvalue
  */
 LeadImportUtils.getMappedOutputvalue = function (pField, pInputValue) {
+    pInputValue = pInputValue.replace("/ß/gi", "ss");
     if (LeadImportUtils.mapping != undefined && 
         LeadImportUtils.mapping[pField] != undefined && 
         LeadImportUtils.mapping[pField][pInputValue] != undefined) 
-- 
GitLab


From a8486eee4e4f29ad0b65bc0e3467bbb86932cd1d Mon Sep 17 00:00:00 2001
From: "b.ulrich" <b.ulrich@adito.de>
Date: Tue, 8 Dec 2020 09:57:55 +0100
Subject: [PATCH 165/184] =?UTF-8?q?[Projekt:=20Entwicklung=20-=20xRM][Tick?=
 =?UTF-8?q?etNr.:=201066799][Firma=20-=20Beziehungen=20k=C3=B6nnen=20bei?=
 =?UTF-8?q?=20einem=20Teil=20der=20Typen=20nicht=20mehr=20bearbeitet=20wer?=
 =?UTF-8?q?den]?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../entityfields/target_context/valueProcess.js             | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/entity/ObjectTree_entity/entityfields/target_context/valueProcess.js b/entity/ObjectTree_entity/entityfields/target_context/valueProcess.js
index 700dc7461b5..cd4083fad2f 100644
--- a/entity/ObjectTree_entity/entityfields/target_context/valueProcess.js
+++ b/entity/ObjectTree_entity/entityfields/target_context/valueProcess.js
@@ -5,5 +5,9 @@ import("ObjectRelation_lib");
 
 if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW || vars.get("$sys.recordstate") == neon.OPERATINGSTATE_EDIT)
 {
-    result.string(ObjectRelationUtils.getRelationType(vars.get("$field.OBJECTRELATIONTYPEID"))[6]);
+    var relationType = ObjectRelationUtils.getRelationType(vars.get("$field.OBJECTRELATIONTYPEID"));
+    if(relationType[3] == "reverse")
+        result.string(ObjectRelationUtils.getRelationType(vars.get("$field.OBJECTRELATIONTYPEID"))[5]);
+    else
+        result.string(ObjectRelationUtils.getRelationType(vars.get("$field.OBJECTRELATIONTYPEID"))[6]);
 }
\ No newline at end of file
-- 
GitLab


From fcf888c1329b95c4a5921b7a3f542f9a828801df Mon Sep 17 00:00:00 2001
From: Sebastian Pongratz <s.pongratz@adito.de>
Date: Tue, 8 Dec 2020 10:37:50 +0000
Subject: [PATCH 166/184] #1070022 Revert Changes Bugfix_Leadimport

---
 process/Leadimport_lib/process.js | 1 -
 1 file changed, 1 deletion(-)

diff --git a/process/Leadimport_lib/process.js b/process/Leadimport_lib/process.js
index 6e902b7f0a5..de9d13b2c7b 100644
--- a/process/Leadimport_lib/process.js
+++ b/process/Leadimport_lib/process.js
@@ -349,7 +349,6 @@ LeadImportUtils.setValues  = function(pFields, pFieldDef, pFieldValues)
  * @return {String} outputvalue
  */
 LeadImportUtils.getMappedOutputvalue = function (pField, pInputValue) {
-    pInputValue = pInputValue.replace("/ß/gi", "ss");
     if (LeadImportUtils.mapping != undefined && 
         LeadImportUtils.mapping[pField] != undefined && 
         LeadImportUtils.mapping[pField][pInputValue] != undefined) 
-- 
GitLab


From c7ff8376e59342af334863d0d0c6f40d98ef980a Mon Sep 17 00:00:00 2001
From: "a.voegl" <a.voegl@adito.de>
Date: Tue, 8 Dec 2020 14:40:19 +0100
Subject: [PATCH 167/184] [Projekt: Entwicklung - xRM][TicketNr.:
 1053175][Erweiterte 360-Grad Ansicht]

---
 entity/360Degree_entity/documentation.adoc | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/entity/360Degree_entity/documentation.adoc b/entity/360Degree_entity/documentation.adoc
index b2ad150c078..f19f7f1c59b 100644
--- a/entity/360Degree_entity/documentation.adoc
+++ b/entity/360Degree_entity/documentation.adoc
@@ -23,14 +23,14 @@ Heres is a list of what you need to do whenever you want to do this:
         - #CONTENTTITLE, this will be the main display Text and the blue Link
         - #CONTENTDESCRIPTION, this will be the smaller, mostly longer, Text beneath the #CONTENTTITLE 
         
-- Add an elemnt (with the name of the context you want to add) in the process of the `ObjectType_param` in the *corresponding provider* which is located in the `360Degree_entity`. _We would extend the JSON-Object which is returned in the `PersonObjects`-provider by the name of our t-shirt-context: "TShirt" in our example
-- 
+- Add an element (with the name of the context you want to add) in the process of the `ObjectType_param` in the *corresponding provider* which is located in the `360Degree_entity`. _We would extend the JSON-Object which is returned in the `PersonObjects`-provider by the name of our t-shirt-context: "TShirt" in our example
+
 - In that JSON-Object can also add some Configuration Elements to change the results.
     - setGroupBy: here you can declare a DB-Column that will be used as the new group by of that context. A good example is Order. We want to group by the Ordertype so we have to declare ORDERTYPE as our groupBy. 
         - If your DB-Value is related to a Keyword you also have to use groupByKeyword and add the Container as Value
 
-- If you have a Connection of 1:N in your Database Schema (like Activity and ActivityLink) you have to add specific Properties in your Context Object. Lets take ActivityLink as a Example.
-    - subContext: the Name of the "Link"-Context -> ActivityLink
-    - childField: The Field where the LinkID to your Parent is stored -> ACTIVITY_ID
-    - parentField: The field in your Parent Context where your Connection to your Child is stored -> ACTIVITYID
+- If you have a Connection of 1:N in your Database Schema (like Task and TaskLink) you have to add specific Properties in your Context Object. Lets take TaskLink as a Example.
+    - subContext: the Name of the "Link"-Context -> TaskLink
+    - childField: The Field where the LinkID to your Parent is stored -> TASK_ID
+    - parentField: The field in your Parent Context where your Connection to your Child is stored -> TASKID
     - contactIdField: The Field in the Link Context where your Contactid is stored -> OBJECT_ROWID
\ No newline at end of file
-- 
GitLab


From d01d408a72b024f3ba08dcbd3320893dea946166 Mon Sep 17 00:00:00 2001
From: Sebastian Listl <s.listl@adito.de>
Date: Fri, 4 Dec 2020 11:35:23 +0100
Subject: [PATCH 168/184] SqlBuilder only add 'from' when there is a
 select-part

---
 process/Sql_lib/process.js | 16 +++++++++-------
 1 file changed, 9 insertions(+), 7 deletions(-)

diff --git a/process/Sql_lib/process.js b/process/Sql_lib/process.js
index d4d8afdaa40..52a7aac39ba 100644
--- a/process/Sql_lib/process.js
+++ b/process/Sql_lib/process.js
@@ -1054,7 +1054,7 @@ SqlBuilder.prototype.tableName = function (pTable)
  */
 SqlBuilder.prototype.from = function(pTable, pTableAlias)
 {
-    this._from = SqlBuilder._getStatement(pTable, "from", pTableAlias, false, (pTableAlias ? false : true));
+    this._from = SqlBuilder._getStatement(pTable, "", pTableAlias, false, (pTableAlias ? false : true));
     if (typeof(pTable) === "string")
         this._tableName = pTable;
     return this;
@@ -2193,10 +2193,7 @@ SqlBuilder.prototype.whereWasCalled = function() {
  */
 SqlBuilder.prototype.isFullSelect = function() 
 {
-    if (!this._select || !this._from)
-        return false;
-    
-    return true;
+    return !(!this._select || !this._from);
 }
 
 /**
@@ -2375,9 +2372,14 @@ SqlBuilder.prototype.buildCondition = function()
 SqlBuilder.prototype.build = function(pDefaultConditionIfNone)
 {
     var wherePrefix = "";
+    var fromObj = this._from;
     
     if (this.isFullSelect())
     {
+        fromObj = {
+            sqlStorage: "from " + this._from.sqlStorage,
+            preparedValues: this._from.preparedValues
+        };
         if (this._where.sqlStorage)
             wherePrefix = "where ";
     }
@@ -2390,11 +2392,11 @@ SqlBuilder.prototype.build = function(pDefaultConditionIfNone)
     var whereObj = {
         sqlStorage : wherePrefix + whereSql,
         preparedValues : this._where.preparedValues
-    }
+    };
     
     var allParts = [
         this._select,
-        this._from,
+        fromObj
         ].concat(this._joins).concat([
         whereObj,
         this._groupBy,
-- 
GitLab


From 72c00e3ef8ff60fde7346a2448004f1e436c8890 Mon Sep 17 00:00:00 2001
From: Sebastian Listl <s.listl@adito.de>
Date: Fri, 4 Dec 2020 16:52:09 +0100
Subject: [PATCH 169/184] Refactoring, scan services

---
 entity/BulkMail_entity/BulkMail_entity.aod    | 75 ++++++++++---------
 .../bulkmailsnotsent/documentation.adoc       |  3 +
 .../recordcontainers/db/fromClauseProcess.js  | 10 ++-
 entity/Document_entity/Document_entity.aod    | 32 +-------
 .../entityfields/documents/documentation.adoc |  3 +
 .../ExportTemplate_entity.aod                 |  8 ++
 .../openadminview/onActionProcess.js          |  4 +
 .../openadminview/stateProcess.js             |  4 +
 .../KeywordEntry_entity.aod                   | 33 ++++----
 .../documentation.adoc                        |  3 +
 .../ExportTemplatePlaceOfUseList_view.aod     |  1 +
 11 files changed, 88 insertions(+), 88 deletions(-)
 create mode 100644 entity/BulkMail_entity/entityfields/bulkmailsnotsent/documentation.adoc
 create mode 100644 entity/Document_entity/entityfields/documents/documentation.adoc
 create mode 100644 entity/ExportTemplate_entity/entityfields/openadminview/onActionProcess.js
 create mode 100644 entity/ExportTemplate_entity/entityfields/openadminview/stateProcess.js
 create mode 100644 entity/KeywordEntry_entity/entityfields/specificcontainerkeywords/documentation.adoc

diff --git a/entity/BulkMail_entity/BulkMail_entity.aod b/entity/BulkMail_entity/BulkMail_entity.aod
index a6e8b3db47b..cc5791ce3ab 100644
--- a/entity/BulkMail_entity/BulkMail_entity.aod
+++ b/entity/BulkMail_entity/BulkMail_entity.aod
@@ -56,25 +56,20 @@
     <entityConsumer>
       <name>Recipients</name>
       <stateProcess>%aditoprj%/entity/BulkMail_entity/entityfields/recipients/stateProcess.js</stateProcess>
-      <dependency>
-        <name>dependency</name>
-        <entityName>BulkMailRecipient_entity</entityName>
-        <fieldName>BulkMailRecipients</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>BulkMailId_param</name>
           <valueProcess>%aditoprj%/entity/BulkMail_entity/entityfields/recipients/children/bulkmailid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>Templates</name>
       <dependency>
         <name>dependency</name>
-        <entityName>DocumentTemplate_entity</entityName>
-        <fieldName>DocumentTemplateProvider</fieldName>
+        <entityName>BulkMailRecipient_entity</entityName>
+        <fieldName>BulkMailRecipients</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>Templates</name>
       <children>
         <entityParameter>
           <name>DocumentTemplateType_param</name>
@@ -85,6 +80,11 @@
           <valueProcess>%aditoprj%/entity/BulkMail_entity/entityfields/templates/children/documenttemplatetypeclassification_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>DocumentTemplate_entity</entityName>
+        <fieldName>DocumentTemplateProvider</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>STATUS</name>
@@ -108,17 +108,17 @@
     </entityField>
     <entityConsumer>
       <name>StatusKeyword</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>KeywordEntry_entity</entityName>
-        <fieldName>SpecificContainerKeywords</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
           <valueProcess>%aditoprj%/entity/BulkMail_entity/entityfields/statuskeyword/children/containername_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>SpecificContainerKeywords</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>bindata</name>
@@ -155,17 +155,17 @@
     </entityField>
     <entityConsumer>
       <name>LogHistories</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>LogHistory_entity</entityName>
-        <fieldName>LogHistoryProvider</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>tablenames_param</name>
           <valueProcess>%aditoprj%/entity/BulkMail_entity/entityfields/loghistories/children/tablenames_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>LogHistory_entity</entityName>
+        <fieldName>LogHistoryProvider</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>CREATEACTIVITIES</name>
@@ -176,17 +176,17 @@
     </entityField>
     <entityConsumer>
       <name>RecipientStatusChart</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>BulkMailStatusChart_entity</entityName>
-        <fieldName>RecipientStatusChart</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>BulkMailId_param</name>
           <valueProcess>%aditoprj%/entity/BulkMail_entity/entityfields/recipientstatuschart/children/bulkmailid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>BulkMailStatusChart_entity</entityName>
+        <fieldName>RecipientStatusChart</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>TESTING_CONTACT_ID</name>
@@ -213,11 +213,6 @@
     </entityConsumer>
     <entityConsumer>
       <name>Activities</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Activity_entity</entityName>
-        <fieldName>LinkedObjects</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ObjectId_param</name>
@@ -228,6 +223,11 @@
           <valueProcess>%aditoprj%/entity/BulkMail_entity/entityfields/activities/children/rowid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Activity_entity</entityName>
+        <fieldName>LinkedObjects</fieldName>
+      </dependency>
     </entityConsumer>
     <entityActionField>
       <name>sendMail</name>
@@ -290,6 +290,14 @@
     </entityParameter>
     <entityProvider>
       <name>BulkMailsNotSent</name>
+      <documentation>%aditoprj%/entity/BulkMail_entity/entityfields/bulkmailsnotsent/documentation.adoc</documentation>
+      <children>
+        <entityParameter>
+          <name>BulkMailStatus_param</name>
+          <valueProcess>%aditoprj%/entity/BulkMail_entity/entityfields/bulkmailsnotsent/children/bulkmailstatus_param/valueProcess.js</valueProcess>
+          <expose v="false" />
+        </entityParameter>
+      </children>
       <dependencies>
         <entityDependency>
           <name>16cdf326-0b43-4d72-bf19-21434e047e85</name>
@@ -298,13 +306,6 @@
           <isConsumer v="false" />
         </entityDependency>
       </dependencies>
-      <children>
-        <entityParameter>
-          <name>BulkMailStatus_param</name>
-          <valueProcess>%aditoprj%/entity/BulkMail_entity/entityfields/bulkmailsnotsent/children/bulkmailstatus_param/valueProcess.js</valueProcess>
-          <expose v="false" />
-        </entityParameter>
-      </children>
     </entityProvider>
     <entityParameter>
       <name>BulkMailStatus_param</name>
diff --git a/entity/BulkMail_entity/entityfields/bulkmailsnotsent/documentation.adoc b/entity/BulkMail_entity/entityfields/bulkmailsnotsent/documentation.adoc
new file mode 100644
index 00000000000..256cf217d71
--- /dev/null
+++ b/entity/BulkMail_entity/entityfields/bulkmailsnotsent/documentation.adoc
@@ -0,0 +1,3 @@
+= BulkMailsNotSent
+
+Provides only BulkMails with the status 'not sent'.
\ No newline at end of file
diff --git a/entity/Communication_entity/recordcontainers/db/fromClauseProcess.js b/entity/Communication_entity/recordcontainers/db/fromClauseProcess.js
index 611aa890f75..bafe6c4d617 100644
--- a/entity/Communication_entity/recordcontainers/db/fromClauseProcess.js
+++ b/entity/Communication_entity/recordcontainers/db/fromClauseProcess.js
@@ -1,8 +1,10 @@
-import("system.logging");
 import("Sql_lib");
 import("system.result");
 import("KeywordRegistry_basic");
 
-result.string("COMMUNICATION " + new SqlBuilder().leftJoin("AB_KEYWORD_ENTRY", newWhere("COMMUNICATION.MEDIUM_ID = AB_KEYWORD_ENTRY.KEYID")
-                                                                .and("AB_KEYWORD_ENTRY.CONTAINER", $KeywordRegistry.communicationMedium()))
-                                                                .toString());
\ No newline at end of file
+result.string(new SqlBuilder()
+    .from("COMMUNICATION")
+    .leftJoin("AB_KEYWORD_ENTRY", newWhere("COMMUNICATION.MEDIUM_ID = AB_KEYWORD_ENTRY.KEYID")
+        .and("AB_KEYWORD_ENTRY.CONTAINER", $KeywordRegistry.communicationMedium()))
+    .toString()
+);
\ No newline at end of file
diff --git a/entity/Document_entity/Document_entity.aod b/entity/Document_entity/Document_entity.aod
index b4b41354a69..f1dda1cc413 100644
--- a/entity/Document_entity/Document_entity.aod
+++ b/entity/Document_entity/Document_entity.aod
@@ -143,6 +143,7 @@
     </entityActionField>
     <entityProvider>
       <name>Documents</name>
+      <documentation>%aditoprj%/entity/Document_entity/entityfields/documents/documentation.adoc</documentation>
       <recordContainer>jdito</recordContainer>
       <children>
         <entityParameter>
@@ -337,37 +338,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>
-        <entityParameter>
-          <name>MSTTeamId_param</name>
-          <expose v="false" />
-        </entityParameter>
-      </children>
     </entityProvider>
     <entityParameter>
       <name>DisallowCreate_param</name>
diff --git a/entity/Document_entity/entityfields/documents/documentation.adoc b/entity/Document_entity/entityfields/documents/documentation.adoc
new file mode 100644
index 00000000000..e2c292d974f
--- /dev/null
+++ b/entity/Document_entity/entityfields/documents/documentation.adoc
@@ -0,0 +1,3 @@
+= Documents
+
+Provider for getting all documents linked to an object.
\ No newline at end of file
diff --git a/entity/ExportTemplate_entity/ExportTemplate_entity.aod b/entity/ExportTemplate_entity/ExportTemplate_entity.aod
index 473d4f9dbd3..65ba57734b7 100644
--- a/entity/ExportTemplate_entity/ExportTemplate_entity.aod
+++ b/entity/ExportTemplate_entity/ExportTemplate_entity.aod
@@ -61,6 +61,7 @@
     <entityField>
       <name>DESCRIPTION</name>
       <title>Description</title>
+      <contentType>LONG_TEXT</contentType>
     </entityField>
     <entityConsumer>
       <name>Languages</name>
@@ -153,6 +154,13 @@
       <name>#PROVIDER_AGGREGATES</name>
       <useAggregates v="true" />
     </entityProvider>
+    <entityActionField>
+      <name>openAdminView</name>
+      <title>Open admin view</title>
+      <onActionProcess>%aditoprj%/entity/ExportTemplate_entity/entityfields/openadminview/onActionProcess.js</onActionProcess>
+      <iconId>VAADIN:CURLY_BRACKETS</iconId>
+      <stateProcess>%aditoprj%/entity/ExportTemplate_entity/entityfields/openadminview/stateProcess.js</stateProcess>
+    </entityActionField>
   </entityFields>
   <recordContainers>
     <dbRecordContainer>
diff --git a/entity/ExportTemplate_entity/entityfields/openadminview/onActionProcess.js b/entity/ExportTemplate_entity/entityfields/openadminview/onActionProcess.js
new file mode 100644
index 00000000000..34ed41f947d
--- /dev/null
+++ b/entity/ExportTemplate_entity/entityfields/openadminview/onActionProcess.js
@@ -0,0 +1,4 @@
+import("system.vars");
+import("Context_lib");
+
+AdminViewUtils.open("EXPORTTEMPLATEID", ["DATE_NEW", "DATE_EDIT", "USER_NEW", "USER_EDIT"]);
\ No newline at end of file
diff --git a/entity/ExportTemplate_entity/entityfields/openadminview/stateProcess.js b/entity/ExportTemplate_entity/entityfields/openadminview/stateProcess.js
new file mode 100644
index 00000000000..38f2298db73
--- /dev/null
+++ b/entity/ExportTemplate_entity/entityfields/openadminview/stateProcess.js
@@ -0,0 +1,4 @@
+import("Context_lib");
+import("system.result");
+
+result.string(AdminViewUtils.getActionState());
\ No newline at end of file
diff --git a/entity/KeywordEntry_entity/KeywordEntry_entity.aod b/entity/KeywordEntry_entity/KeywordEntry_entity.aod
index 198706a9c3b..3472852e898 100644
--- a/entity/KeywordEntry_entity/KeywordEntry_entity.aod
+++ b/entity/KeywordEntry_entity/KeywordEntry_entity.aod
@@ -95,7 +95,19 @@
     <entityProvider>
       <name>SpecificContainerKeywords</name>
       <lookupIdfield>KEYID</lookupIdfield>
+      <documentation>%aditoprj%/entity/KeywordEntry_entity/entityfields/specificcontainerkeywords/documentation.adoc</documentation>
       <recordContainer>db</recordContainer>
+      <children>
+        <entityParameter>
+          <name>OnlyActives_param</name>
+          <valueProcess>%aditoprj%/entity/KeywordEntry_entity/entityfields/specificcontainerkeywords/children/onlyactives_param/valueProcess.js</valueProcess>
+          <expose v="true" />
+        </entityParameter>
+        <entityParameter>
+          <name>ContainerName_param</name>
+          <expose v="true" />
+        </entityParameter>
+      </children>
       <dependencies>
         <entityDependency>
           <name>bb48a3ee-f340-4fd4-8c80-ef73b765ab58</name>
@@ -596,17 +608,6 @@
           <isConsumer v="false" />
         </entityDependency>
       </dependencies>
-      <children>
-        <entityParameter>
-          <name>OnlyActives_param</name>
-          <valueProcess>%aditoprj%/entity/KeywordEntry_entity/entityfields/specificcontainerkeywords/children/onlyactives_param/valueProcess.js</valueProcess>
-          <expose v="true" />
-        </entityParameter>
-        <entityParameter>
-          <name>ContainerName_param</name>
-          <expose v="true" />
-        </entityParameter>
-      </children>
     </entityProvider>
     <entityField>
       <name>TITLE_TRANSLATED</name>
@@ -621,11 +622,6 @@
     <entityConsumer>
       <name>KeywordAttributeRelations</name>
       <onValidation>%aditoprj%/entity/KeywordEntry_entity/entityfields/keywordattributerelations/onValidation.js</onValidation>
-      <dependency>
-        <name>dependency</name>
-        <entityName>KeywordAttributeRelation_entity</entityName>
-        <fieldName>AttributesForKeywordEntry</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>KeywordEntryId_param</name>
@@ -633,6 +629,11 @@
           <expose v="true" />
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordAttributeRelation_entity</entityName>
+        <fieldName>AttributesForKeywordEntry</fieldName>
+      </dependency>
     </entityConsumer>
     <entityParameter>
       <name>ExcludedKeyIdsSubquery_param</name>
diff --git a/entity/KeywordEntry_entity/entityfields/specificcontainerkeywords/documentation.adoc b/entity/KeywordEntry_entity/entityfields/specificcontainerkeywords/documentation.adoc
new file mode 100644
index 00000000000..0525588e240
--- /dev/null
+++ b/entity/KeywordEntry_entity/entityfields/specificcontainerkeywords/documentation.adoc
@@ -0,0 +1,3 @@
+= SpecificContainerKeywords
+
+Delivers only keywords of a specific container for a keyword selection.
\ No newline at end of file
diff --git a/neonView/ExportTemplatePlaceOfUseList_view/ExportTemplatePlaceOfUseList_view.aod b/neonView/ExportTemplatePlaceOfUseList_view/ExportTemplatePlaceOfUseList_view.aod
index ca711428be6..bcbd58b13a6 100644
--- a/neonView/ExportTemplatePlaceOfUseList_view/ExportTemplatePlaceOfUseList_view.aod
+++ b/neonView/ExportTemplatePlaceOfUseList_view/ExportTemplatePlaceOfUseList_view.aod
@@ -11,6 +11,7 @@
     <titledListViewTemplate>
       <name>titledList</name>
       <titleField>PLACEOFUSE</titleField>
+      <titleFieldFullWidth v="true" />
       <entityField>#ENTITY</entityField>
     </titledListViewTemplate>
   </children>
-- 
GitLab


From 9245ab901bf88d7af01727b6f7b59bf80f0a142e Mon Sep 17 00:00:00 2001
From: Sebastian Listl <s.listl@adito.de>
Date: Tue, 8 Dec 2020 08:46:27 +0100
Subject: [PATCH 170/184] #1069604 NumberUtils.validateIsBetweenFloat
 correction

---
 process/Util_lib/process.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/process/Util_lib/process.js b/process/Util_lib/process.js
index ca3962c9236..00ddb82a71b 100644
--- a/process/Util_lib/process.js
+++ b/process/Util_lib/process.js
@@ -716,7 +716,7 @@ NumberUtils.validateIsBetweenFloat = function(pTitle, pValue, pMin, pMax, pIgnor
     if(isNaN(discount))
         return false;
     
-    if (!NumberUtils.isInside(discount, 0, 100, pIgnoreNull))
+    if (!NumberUtils.isInside(discount, pMin, pMax, pIgnoreNull))
     {
         return (translate.withArguments("${MIN_MAX_ERROR} field: %0, value: %1, min: %2, max: %3", [translate.text(pTitle), discount, pMin, pMax]));
     }
-- 
GitLab


From b5f8e9421769c5842985914ef473948e07d71ade Mon Sep 17 00:00:00 2001
From: Sebastian Listl <s.listl@adito.de>
Date: Tue, 8 Dec 2020 10:36:18 +0100
Subject: [PATCH 171/184] #1070093 Objectselection attributes in preview

---
 .../entityfields/value_lookup/stateProcess.js                | 5 ++++-
 .../AttributeRelationPreviewList.aod                         | 4 ++++
 2 files changed, 8 insertions(+), 1 deletion(-)

diff --git a/entity/AttributeRelation_entity/entityfields/value_lookup/stateProcess.js b/entity/AttributeRelation_entity/entityfields/value_lookup/stateProcess.js
index e0ce90c1753..051e58a290e 100644
--- a/entity/AttributeRelation_entity/entityfields/value_lookup/stateProcess.js
+++ b/entity/AttributeRelation_entity/entityfields/value_lookup/stateProcess.js
@@ -4,8 +4,11 @@ import("system.result");
 import("Attribute_lib");
 
 var fieldState;
-if (AttributeTypeUtil.useLookup(vars.get("$field.ATTRIBUTE_TYPE")))
+if ((vars.get("$sys.recordstate") == neon.OPERATINGSTATE_EDIT || vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW)
+    && AttributeTypeUtil.useLookup(vars.get("$field.ATTRIBUTE_TYPE")))
+{
     fieldState = neon.COMPONENTSTATE_EDITABLE;
+}
 else 
     fieldState = neon.COMPONENTSTATE_INVISIBLE;
 
diff --git a/neonView/AttributeRelationPreviewList/AttributeRelationPreviewList.aod b/neonView/AttributeRelationPreviewList/AttributeRelationPreviewList.aod
index 3ecddbf8b49..2c17aad789a 100644
--- a/neonView/AttributeRelationPreviewList/AttributeRelationPreviewList.aod
+++ b/neonView/AttributeRelationPreviewList/AttributeRelationPreviewList.aod
@@ -18,6 +18,10 @@
           <name>ec5ceac7-a2d4-4912-b04b-adc83d3e9589</name>
           <entityField>VALUE</entityField>
         </neonTitledListTableColumn>
+        <neonTitledListTableColumn>
+          <name>2ec9274b-a800-4a38-8139-418543161be2</name>
+          <entityField>VALUE_LOOKUP</entityField>
+        </neonTitledListTableColumn>
       </columns>
     </titledListViewTemplate>
   </children>
-- 
GitLab


From d5eb6097106bb18e65381c013608646d608ce88e Mon Sep 17 00:00:00 2001
From: "a.voegl" <a.voegl@adito.de>
Date: Tue, 8 Dec 2020 18:41:43 +0100
Subject: [PATCH 172/184] Fix documentation and make the Context_lib more
 dynamic in therms of former Object Structure

---
 entity/360Degree_entity/documentation.adoc |  4 ++--
 process/Context_lib/process.js             | 15 ++++++++++-----
 2 files changed, 12 insertions(+), 7 deletions(-)

diff --git a/entity/360Degree_entity/documentation.adoc b/entity/360Degree_entity/documentation.adoc
index f19f7f1c59b..b07c00500ce 100644
--- a/entity/360Degree_entity/documentation.adoc
+++ b/entity/360Degree_entity/documentation.adoc
@@ -16,7 +16,6 @@ Heres is a list of what you need to do whenever you want to do this:
 
 - At first you have to fill/add certain Fields/Processes in your new Context.
     - Add (These have to be written exactly like that, if not already existing):
-        - CONTACT_ID, this Field has to contain a CONTACTID. That will be used to find the Connection to your Person or your Organisation.
         - DATE_NEW, this Field has to contain a Date as a Long Value. That will be used as the Date Value you can see in the Timeline View-Template.
         - ACTIVE, in this Field you can specify which Datasets are active or not. You have to declare that in the Value Expression as a Case-When due to the Filter
     - Fill (these can be filled in the specific Entity as a Process)
@@ -25,7 +24,8 @@ Heres is a list of what you need to do whenever you want to do this:
         
 - Add an element (with the name of the context you want to add) in the process of the `ObjectType_param` in the *corresponding provider* which is located in the `360Degree_entity`. _We would extend the JSON-Object which is returned in the `PersonObjects`-provider by the name of our t-shirt-context: "TShirt" in our example
 
-- In that JSON-Object can also add some Configuration Elements to change the results.
+- In that JSON-Object you can/have to add some Configuration Elements to change the results.
+    - connectionField, here you have to declare a Field that writes exactly like the one in your Entity (Standard is CONTACT_ID!!!). The Value of this Field will be used to compare it with the Object_Rowid. 
     - setGroupBy: here you can declare a DB-Column that will be used as the new group by of that context. A good example is Order. We want to group by the Ordertype so we have to declare ORDERTYPE as our groupBy. 
         - If your DB-Value is related to a Keyword you also have to use groupByKeyword and add the Container as Value
 
diff --git a/process/Context_lib/process.js b/process/Context_lib/process.js
index b7bf2e8a17a..40e6e00d4c2 100644
--- a/process/Context_lib/process.js
+++ b/process/Context_lib/process.js
@@ -355,10 +355,15 @@ ContextUtils.getTitleByContext = function(pContextId, pRowId)
  * @param {Object} [pFilterObj] prepeared Filter Object
  * @param {String[]} [pContactId] Array of all the Contactids you want to search through
  * 
- * @return {String[][]} An Array of Fields (["#UID", "#TITLE", "#MAPPING", "#CONTENTDESCRIPTION", "#CONTENTTITLE", "CONTACT_ID", "DATE_NEW"]) for a certain Context
+ * @return {String[][]} An Array of Fields (["#UID", "#TITLE", "#MAPPING", "#CONTENTDESCRIPTION", "#CONTENTTITLE", CONNECTIONFIELD, "DATE_NEW"]) for a certain Context
  */
 ContextUtils.getContextDataViaReadEntity = function(pContextId, pContextConfig, pFilterObj, pContactId)
 {     
+
+    var connectionField = "CONTACT_ID";
+    if(pContextConfig.connectionField)
+        connectionField = pContextConfig.connectionField;
+
     if(pContextConfig.childField && pContextConfig.parentField && pContextConfig.contactIdField && pContextConfig.subContext)
     {
         var prefilter = Utils.buildFilterObj({}, pContextConfig.contactIdField, "IN", "TEXT", JSON.stringify(pContactId), JSON.stringify(pContactId), "OR");
@@ -377,10 +382,10 @@ ContextUtils.getContextDataViaReadEntity = function(pContextId, pContextConfig,
     }
     else
     {
-        pFilterObj = Utils.buildFilterObj(pFilterObj, "CONTACT_ID", "IN", "TEXT", JSON.stringify(pContactId), JSON.stringify(pContactId), "AND"); 
+        pFilterObj = Utils.buildFilterObj(pFilterObj, connectionField, "IN", "TEXT", JSON.stringify(pContactId), JSON.stringify(pContactId), "AND"); 
     }
     
-    var fields = ["#UID", "#TITLE", "#MAPPING", "#CONTENTDESCRIPTION", "#CONTENTTITLE", "CONTACT_ID", "DATE_NEW", "ACTIVE"];
+    var fields = ["#UID", "#TITLE", "#MAPPING", "#CONTENTDESCRIPTION", "#CONTENTTITLE", connectionField, "DATE_NEW", "ACTIVE"];
     if(pContextConfig.setGroupBy)
         fields.push(pContextConfig.setGroupBy);
     
@@ -410,8 +415,8 @@ ContextUtils.getContextDataViaReadEntity = function(pContextId, pContextConfig,
                 throw new Error(translate.text("Some prereserved EntityFields which are necessary fot 360° are not available. Context: "+pContextId
                     +" Data: "+JSON.stringify(res)));
         }
-        else if(res[0]["CONTACT_ID"] == undefined)
-            throw new Error(translate.text("CONTACT_ID is not defined! Context: "+pContextId));
+        else if(res[0][connectionField] == undefined)
+            throw new Error(translate.text(connectionField+" is not defined! Context: "+pContextId));
     }
     return res;
 }
-- 
GitLab


From 379cb2cb816af87923c7b8ad45128650a51357dd Mon Sep 17 00:00:00 2001
From: Sebastian Listl <s.listl@adito.de>
Date: Wed, 9 Dec 2020 12:51:43 +0000
Subject: [PATCH 173/184] 360Degree_entity wrong titlePlural removed

---
 entity/360Degree_entity/360Degree_entity.aod | 1 -
 1 file changed, 1 deletion(-)

diff --git a/entity/360Degree_entity/360Degree_entity.aod b/entity/360Degree_entity/360Degree_entity.aod
index f527d3b4ebb..35b812776eb 100644
--- a/entity/360Degree_entity/360Degree_entity.aod
+++ b/entity/360Degree_entity/360Degree_entity.aod
@@ -15,7 +15,6 @@
   </siblings>
   <grantUpdate v="false" />
   <grantDelete v="false" />
-  <titlePlural>Links</titlePlural>
   <recordContainer>jdito</recordContainer>
   <entityFields>
     <entityProvider>
-- 
GitLab


From f9e0b9f55e6a49bef906b8ac6b10e6676c570aa0 Mon Sep 17 00:00:00 2001
From: "j.luginger" <j.luginger@adito.de>
Date: Thu, 10 Dec 2020 08:03:52 +0100
Subject: [PATCH 174/184] =?UTF-8?q?[Projekt:=20Entwicklung=20-=20Pool][Tic?=
 =?UTF-8?q?ketNr.:=201070360][Angebot=20kann=20in=20Beleg=20nicht=20ausgew?=
 =?UTF-8?q?=C3=A4hlt=20werden]?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../offers/children/contactid_param/valueProcess.js       | 8 +-------
 1 file changed, 1 insertion(+), 7 deletions(-)

diff --git a/entity/Order_entity/entityfields/offers/children/contactid_param/valueProcess.js b/entity/Order_entity/entityfields/offers/children/contactid_param/valueProcess.js
index 7b92c1bb14a..cf4b6cd38a6 100644
--- a/entity/Order_entity/entityfields/offers/children/contactid_param/valueProcess.js
+++ b/entity/Order_entity/entityfields/offers/children/contactid_param/valueProcess.js
@@ -1,10 +1,4 @@
 import("system.result");
 import("system.vars");
-import("Contact_lib");
 
-if (vars.get("$field.CONTACT_ID"))
-{
-    var ids = ContactUtils.getPersOrgIds(vars.getString("$field.CONTACT_ID"));
-    if (ids.length >= 3 && ids[2])
-        result.string(ids[2]);
-}
\ No newline at end of file
+result.string(vars.get("$field.CONTACT_ID"));
-- 
GitLab


From b12de51a4197cf4f14ad7e3d0f00d6e4b4fd55c7 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Alexander=20V=C3=B6gl?= <a.voegl@adito.de>
Date: Thu, 10 Dec 2020 07:50:05 +0000
Subject: [PATCH 175/184] [Projekt: Entwicklung - xRM][TicketNr.:
 1069881][Beleg - Es kann kein neuer Beleg angelegt werden] & add missing
 Index on new Column

---
 .../alter_CampaignParticipantResponsibleIndex.xml   | 10 ++++++++++
 .liquibase/Data_alias/basic/2020.2.2/changelog.xml  |  1 +
 process/Sql_lib/process.js                          | 13 ++++++++++---
 3 files changed, 21 insertions(+), 3 deletions(-)
 create mode 100644 .liquibase/Data_alias/basic/2020.2.2/alter_CampaignParticipantResponsibleIndex.xml

diff --git a/.liquibase/Data_alias/basic/2020.2.2/alter_CampaignParticipantResponsibleIndex.xml b/.liquibase/Data_alias/basic/2020.2.2/alter_CampaignParticipantResponsibleIndex.xml
new file mode 100644
index 00000000000..6360542b2df
--- /dev/null
+++ b/.liquibase/Data_alias/basic/2020.2.2/alter_CampaignParticipantResponsibleIndex.xml
@@ -0,0 +1,10 @@
+<?xml version="1.1" encoding="UTF-8" standalone="no"?>
+<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd">
+  <changeSet author="a.voegl" id="6d545d51-b838-4325-9573-5fe51eade79b">
+        <createIndex indexName="IDX_CAMPAIGNPART_RES_CONTACT" tableName="CAMPAIGNPARTICIPANT">
+            <column name="RESPONSIBLE_CONTACT_ID"/>
+        </createIndex>
+  </changeSet>
+</databaseChangeLog>
\ No newline at end of file
diff --git a/.liquibase/Data_alias/basic/2020.2.2/changelog.xml b/.liquibase/Data_alias/basic/2020.2.2/changelog.xml
index 302d930f6b0..2a4bea7a4e0 100644
--- a/.liquibase/Data_alias/basic/2020.2.2/changelog.xml
+++ b/.liquibase/Data_alias/basic/2020.2.2/changelog.xml
@@ -6,6 +6,7 @@
     <include relativeToChangelogFile="true" file="insert_employeeCountAttribute.xml"/>
     <include relativeToChangelogFile="true" file="alter_CampaignParticipantResponsible.xml"/>
     <include relativeToChangelogFile="true" file="alter_TableLeadStatus.xml"/>
+    <include relativeToChangelogFile="true" file="alter_CampaignParticipantResponsibleIndex.xml"/>
     <include relativeToChangelogFile="true" file="MSTeams/changelog.xml"/>
     <include relativeToChangelogFile="true" file="insert_newsletterAttribute.xml"/>
     <include relativeToChangelogFile="true" file="readd_ExporttemplateIndizes.xml"/>
diff --git a/process/Sql_lib/process.js b/process/Sql_lib/process.js
index d4d8afdaa40..08f4d90d0b5 100644
--- a/process/Sql_lib/process.js
+++ b/process/Sql_lib/process.js
@@ -4253,10 +4253,11 @@ SqlUtils.getSqlInStatement = function(pFieldname, pData, pQuoteSymbol, pAsPrepar
 }
 
 /**
-* resolves key-value pairs (of strings) into a case when expression
+* resolves key-value pairs (of strings) into a case when expression; 
+* This function tries to get the columntype for better type comparison
 * 
 * @param {String[][]} pKeyValueArray you've to pass a 2D-Array where each element has at pos0 the key and pos1 the value
-* @param {String} pDbFieldName name fo the database field where the KEY-value is stored
+* @param {String} pDbFieldName name fo the database field where the KEY-value is stored; prefers TABLENAME.COLUMNNAME
 * @param {String} [pLocale=current client language] specifies the locale for translating the title; can be false if nothing shalle be translated
 * 
 * @return {String} a SQL-expression (case-when-statement) that resolves the KEYID into the title -> as preparedSatement-elements
@@ -4278,7 +4279,13 @@ SqlUtils.getResolvingCaseWhen = function(pKeyValueArray, pDbFieldName, pLocale)
     };
     //!SqlBuilder
     var resSql = "case ", preparedValues = [];
-    var colTypeKeyId = SQLTYPES.CHAR;
+    
+    var colTypeKeyId = SQLTYPES.CHAR; //the standard type is char
+    var fields = SqlUtils._parseFieldQualifier(pDbFieldName); //validate the DB-field for proper form (CONTACT.CONTACTID)
+    if (!(fields instanceof TypeError))
+        colTypeKeyId = SqlUtils.getSingleColumnType(pDbFieldName, undefined, this.alias); 
+     //some databases dont auto cast on their own so we need the proper type
+    
     var colTypeTitle = SQLTYPES.NVARCHAR;
     for (var i = 0, l = keyData.length; i < l; i++) 
     {
-- 
GitLab


From 987f23e681f0fdb8827854afd34818cbc281597b Mon Sep 17 00:00:00 2001
From: Johannes Goderbauer <j.goderbauer@adito.de>
Date: Thu, 10 Dec 2020 08:38:36 +0000
Subject: [PATCH 176/184] Disable product permissions

---
 entity/Product_entity/Product_entity.aod | 1 -
 1 file changed, 1 deletion(-)

diff --git a/entity/Product_entity/Product_entity.aod b/entity/Product_entity/Product_entity.aod
index b5487036312..b8443f6c3fe 100644
--- a/entity/Product_entity/Product_entity.aod
+++ b/entity/Product_entity/Product_entity.aod
@@ -14,7 +14,6 @@
   <useFavorites v="true" />
   <iconId>VAADIN:HAMMER</iconId>
   <imageProcess>%aditoprj%/entity/Product_entity/imageProcess.js</imageProcess>
-  <usePermissions v="true" />
   <titlePlural>Products</titlePlural>
   <recordContainer>db</recordContainer>
   <entityFields>
-- 
GitLab


From 3434b0e7976da2bac198c00a8eabef844901edef Mon Sep 17 00:00:00 2001
From: Johannes Goderbauer <j.goderbauer@adito.de>
Date: Thu, 10 Dec 2020 08:42:01 +0000
Subject: [PATCH 177/184] Disable knowledgeManagement permissions

---
 entity/KnowledgeManagement_entity/KnowledgeManagement_entity.aod | 1 -
 1 file changed, 1 deletion(-)

diff --git a/entity/KnowledgeManagement_entity/KnowledgeManagement_entity.aod b/entity/KnowledgeManagement_entity/KnowledgeManagement_entity.aod
index ca44262effc..0d58306fea5 100644
--- a/entity/KnowledgeManagement_entity/KnowledgeManagement_entity.aod
+++ b/entity/KnowledgeManagement_entity/KnowledgeManagement_entity.aod
@@ -11,7 +11,6 @@
   <afterOperatingState>%aditoprj%/entity/KnowledgeManagement_entity/afterOperatingState.js</afterOperatingState>
   <useFavorites v="true" />
   <iconIdProcess>%aditoprj%/entity/KnowledgeManagement_entity/iconIdProcess.js</iconIdProcess>
-  <usePermissions v="true" />
   <titlePlural>Knowledge entries</titlePlural>
   <recordContainer>db</recordContainer>
   <entityFields>
-- 
GitLab


From 9a41988bf1a9987f5e67934648bb3bf105c27b02 Mon Sep 17 00:00:00 2001
From: Fabian Adler <f.adler@adito.de>
Date: Thu, 10 Dec 2020 11:20:42 +0100
Subject: [PATCH 178/184] Fixing the uncommented demodata & status update

---
 .../basic/2020.2.2/alter_TableLeadStatus.xml      | 15 ++++++++++++++-
 .liquibase/Data_alias/changelog.xml               |  2 +-
 2 files changed, 15 insertions(+), 2 deletions(-)

diff --git a/.liquibase/Data_alias/basic/2020.2.2/alter_TableLeadStatus.xml b/.liquibase/Data_alias/basic/2020.2.2/alter_TableLeadStatus.xml
index 9f11810890c..a6625db2f2f 100644
--- a/.liquibase/Data_alias/basic/2020.2.2/alter_TableLeadStatus.xml
+++ b/.liquibase/Data_alias/basic/2020.2.2/alter_TableLeadStatus.xml
@@ -1,6 +1,19 @@
 <?xml version="1.1" encoding="UTF-8" standalone="no"?>
 <databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd">
-    <changeSet author="d.nowack" id="bcd6cb02-d074-444f-a307-34973b3dd4dn">
+    <changeSet dbms="derby" author="s.pongratz" id="539e6d12-5ba4-424b-a29d-f63a48d07288">
+        <sql>
+            ALTER TABLE LEAD ADD COLUMN STATUS_NEW VARCHAR(36);
+            UPDATE LEAD SET STATUS_NEW = CAST ( CAST (STATUS as CHAR(36)) as VARCHAR(36) );
+            ALTER TABLE LEAD DROP COLUMN STATUS;
+            RENAME COLUMN LEAD.STATUS_NEW TO STATUS;
+        </sql>
+    </changeSet>
+    <changeSet author="s.pongratz" id="be79e660-b112-4f58-b53d-d9e36ecd145b">
+        <preConditions onFail="CONTINUE">
+            <not>
+                <dbms type="derby" />
+            </not>
+        </preConditions>
         <modifyDataType tableName="LEAD" columnName="STATUS" newDataType="VARCHAR(36)"/>
     </changeSet>
 </databaseChangeLog>
\ No newline at end of file
diff --git a/.liquibase/Data_alias/changelog.xml b/.liquibase/Data_alias/changelog.xml
index 06e1b534695..3f25ca1dbb1 100644
--- a/.liquibase/Data_alias/changelog.xml
+++ b/.liquibase/Data_alias/changelog.xml
@@ -20,5 +20,5 @@
     <include relativeToChangelogFile="true" file="basic/2020.2.2/changelog.xml"/>
 
     <!--enable this only when you definetly want to overwrite the existing data with demo records:-->
-    <include relativeToChangelogFile="true" file="basic/_demoData/changelog.xml" context="example"/>
+    <!--<include relativeToChangelogFile="true" file="basic/_demoData/changelog.xml" context="example"/>-->
 </databaseChangeLog>
\ No newline at end of file
-- 
GitLab


From bb185c1c9e43f6678fc37b59a35e67e34974679d Mon Sep 17 00:00:00 2001
From: "j.luginger" <j.luginger@adito.de>
Date: Thu, 10 Dec 2020 11:29:28 +0100
Subject: [PATCH 179/184] [Projekt: Entwicklung - Pool][TicketNr.: 1070393][In
 Angebot und Beleg werden die Zahlungskondition und Lieferbedingung nicht
 richtig anhand der Firma vorbelegt]

---
 .../deliveryterms/valueProcess.js             |  2 +-
 .../entityfields/paymentterms/valueProcess.js |  2 +-
 .../deliveryterms/valueProcess.js             |  2 +-
 .../entityfields/paymentterms/valueProcess.js | 32 +++++++++----------
 4 files changed, 19 insertions(+), 19 deletions(-)

diff --git a/entity/Offer_entity/entityfields/deliveryterms/valueProcess.js b/entity/Offer_entity/entityfields/deliveryterms/valueProcess.js
index ff143a3b866..58333ceee85 100644
--- a/entity/Offer_entity/entityfields/deliveryterms/valueProcess.js
+++ b/entity/Offer_entity/entityfields/deliveryterms/valueProcess.js
@@ -11,7 +11,7 @@ if (vars.exists("$param.OfferDeliveryTerm_param") && vars.get("$param.OfferDeliv
 {
     result.string(vars.get("$param.OfferDeliveryTerm_param"));
 } 
-else if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW)
+else if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && vars.get("$this.value") == null && vars.get("$field.CONTACT_ID"))
 {
     var presetValue = "";
     var contactIds = ContactUtils.getPersOrgIds(vars.getString("$field.CONTACT_ID"))
diff --git a/entity/Offer_entity/entityfields/paymentterms/valueProcess.js b/entity/Offer_entity/entityfields/paymentterms/valueProcess.js
index 4b13796a10e..b9fd6cd7aee 100644
--- a/entity/Offer_entity/entityfields/paymentterms/valueProcess.js
+++ b/entity/Offer_entity/entityfields/paymentterms/valueProcess.js
@@ -11,7 +11,7 @@ if (vars.exists("$param.OfferPaymentTerm_param") && vars.get("$param.OfferPaymen
 {
     result.string(vars.get("$param.OfferPaymentTerm_param"));
 }
-else if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW)
+else if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && vars.get("$this.value") == null && vars.get("$field.CONTACT_ID"))
 {
     var presetValue = "";
     var contactIds = ContactUtils.getPersOrgIds(vars.getString("$field.CONTACT_ID"))
diff --git a/entity/Order_entity/entityfields/deliveryterms/valueProcess.js b/entity/Order_entity/entityfields/deliveryterms/valueProcess.js
index 8e6fb1be5bc..ed78d05852c 100644
--- a/entity/Order_entity/entityfields/deliveryterms/valueProcess.js
+++ b/entity/Order_entity/entityfields/deliveryterms/valueProcess.js
@@ -9,7 +9,7 @@ import("Contact_lib");
 
 
 
-if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && vars.get("$this.value") == null)
+if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && vars.get("$this.value") == null && vars.get("$field.CONTACT_ID"))
 {
     var presetValue = "";
     var contactIds = ContactUtils.getPersOrgIds(vars.getString("$field.CONTACT_ID"));
diff --git a/entity/Order_entity/entityfields/paymentterms/valueProcess.js b/entity/Order_entity/entityfields/paymentterms/valueProcess.js
index 7501b966d14..8cf77fdb2b6 100644
--- a/entity/Order_entity/entityfields/paymentterms/valueProcess.js
+++ b/entity/Order_entity/entityfields/paymentterms/valueProcess.js
@@ -7,23 +7,23 @@ import("system.result");
 import("system.vars");
 import("Attribute_lib");
 
-if (vars.get("$this.value") == null) {
-    if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && vars.get("$this.value") == null)
+
+if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && vars.get("$this.value") == null && vars.get("$field.CONTACT_ID"))
+{
+    var presetValue = "";
+    var contactIds = ContactUtils.getPersOrgIds(vars.getString("$field.CONTACT_ID"));
+    if (contactIds.length >= 3 && contactIds[2])
     {
-        var presetValue = "";
-        var contactIds = ContactUtils.getPersOrgIds(vars.getString("$field.CONTACT_ID"));
-        if (contactIds.length >= 3 && contactIds[2])
-        {
-            var orgContactId = ContactUtils.getOrgContactId(contactIds[2]);
-            if (orgContactId)
-            { 
-                presetValue = new AttributeRelationQuery(orgContactId, $AttributeRegistry.paymentTerm()).getSingleAttributeValue();
-            }
+        var orgContactId = ContactUtils.getOrgContactId(contactIds[2]);
+        if (orgContactId)
+        { 
+            presetValue = new AttributeRelationQuery(orgContactId, $AttributeRegistry.paymentTerm()).getSingleAttributeValue();
         }
-
-        if (presetValue)
-            result.string(presetValue);
-        else
-            result.string(KeywordUtils.getFirst($KeywordRegistry.paymentTerm()));
     }
+
+    if (presetValue)
+        result.string(presetValue);
+    else
+        result.string(KeywordUtils.getFirst($KeywordRegistry.paymentTerm()));
 }
+
-- 
GitLab


From ecaceb40f9c799e1c87b5a9a5fc2cad10035e60b Mon Sep 17 00:00:00 2001
From: "j.goderbauer" <j.goderbauer@adito.de>
Date: Thu, 10 Dec 2020 12:22:46 +0100
Subject: [PATCH 180/184] Updated Data_alias

---
 aliasDefinition/Data_alias/Data_alias.aod | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/aliasDefinition/Data_alias/Data_alias.aod b/aliasDefinition/Data_alias/Data_alias.aod
index db98769eac6..1b90bea7f65 100644
--- a/aliasDefinition/Data_alias/Data_alias.aod
+++ b/aliasDefinition/Data_alias/Data_alias.aod
@@ -8347,7 +8347,7 @@
                 <scale v="0" />
                 <notNull v="false" />
                 <isUnique v="false" />
-                <index v="false" />
+                <index v="true" />
                 <documentation></documentation>
                 <title></title>
                 <description></description>
@@ -13166,8 +13166,8 @@
                 <name>STATUS</name>
                 <dbName></dbName>
                 <primaryKey v="false" />
-                <columnType v="4" />
-                <size v="10" />
+                <columnType v="12" />
+                <size v="36" />
                 <scale v="0" />
                 <notNull v="false" />
                 <isUnique v="false" />
-- 
GitLab


From 2d783f9864c1f05fde7c7a5218ee56ae4f104850 Mon Sep 17 00:00:00 2001
From: Tobias Wosegien <t.wosegien@adito.de>
Date: Tue, 15 Dec 2020 14:39:41 +0000
Subject: [PATCH 181/184] 1052783 rename User Administration ->
 Useradministration

---
 .../_____SYSTEM_APPLICATION_NEON.aod                            | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/application/_____SYSTEM_APPLICATION_NEON/_____SYSTEM_APPLICATION_NEON.aod b/application/_____SYSTEM_APPLICATION_NEON/_____SYSTEM_APPLICATION_NEON.aod
index 9e61fe62da3..12e1b3dbc18 100644
--- a/application/_____SYSTEM_APPLICATION_NEON/_____SYSTEM_APPLICATION_NEON.aod
+++ b/application/_____SYSTEM_APPLICATION_NEON/_____SYSTEM_APPLICATION_NEON.aod
@@ -345,7 +345,7 @@
         </childNodes>
       </entityNode>
       <entityNode>
-        <name>User Administration</name>
+        <name>Useradministration</name>
         <kind v="123" />
         <title>User Administration</title>
         <icon>VAADIN:UNLINK</icon>
-- 
GitLab


From d510e53e2a5c82a67eec950c5f9d9c94b86837c6 Mon Sep 17 00:00:00 2001
From: Simon Leipold <s.leipold@adito.de>
Date: Tue, 15 Dec 2020 15:40:01 +0100
Subject: [PATCH 182/184] fixed #1068363 #1066690 - value process of parameter
 role title was missing

---
 entity/Role_entity/Role_entity.aod                          | 6 ++++++
 .../children/roletitle_param/valueProcess.js                | 4 ++++
 2 files changed, 10 insertions(+)
 create mode 100644 entity/Role_entity/entityfields/theirpermissions/children/roletitle_param/valueProcess.js

diff --git a/entity/Role_entity/Role_entity.aod b/entity/Role_entity/Role_entity.aod
index 82bc56f08e9..cb7d090b650 100644
--- a/entity/Role_entity/Role_entity.aod
+++ b/entity/Role_entity/Role_entity.aod
@@ -41,6 +41,12 @@
     </entityField>
     <entityConsumer>
       <name>TheirPermissions</name>
+      <children>
+        <entityParameter>
+          <name>RoleTitle_param</name>
+          <valueProcess>%aditoprj%/entity/Role_entity/entityfields/theirpermissions/children/roletitle_param/valueProcess.js</valueProcess>
+        </entityParameter>
+      </children>
       <dependency>
         <name>dependency</name>
         <entityName>PermissionDetail_entity</entityName>
diff --git a/entity/Role_entity/entityfields/theirpermissions/children/roletitle_param/valueProcess.js b/entity/Role_entity/entityfields/theirpermissions/children/roletitle_param/valueProcess.js
new file mode 100644
index 00000000000..7b3054d1905
--- /dev/null
+++ b/entity/Role_entity/entityfields/theirpermissions/children/roletitle_param/valueProcess.js
@@ -0,0 +1,4 @@
+import("system.vars");
+import("system.result");
+
+result.string(vars.get("$field.ROLENAME"));
\ No newline at end of file
-- 
GitLab


From 15dfef413e1fc855e5751e37ad24bad60137a19b Mon Sep 17 00:00:00 2001
From: Tobias Wosegien <t.wosegien@adito.de>
Date: Tue, 15 Dec 2020 14:48:10 +0000
Subject: [PATCH 183/184] 1069233 PersonSimpleList_view: linkedColumns setzen

---
 .../PersonSimpleList_view/PersonSimpleList_view.aod    | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/neonView/PersonSimpleList_view/PersonSimpleList_view.aod b/neonView/PersonSimpleList_view/PersonSimpleList_view.aod
index fe2cf08a2a9..0407e8cccc2 100644
--- a/neonView/PersonSimpleList_view/PersonSimpleList_view.aod
+++ b/neonView/PersonSimpleList_view/PersonSimpleList_view.aod
@@ -17,7 +17,10 @@
       <subtitleField>LANGUAGE</subtitleField>
       <descriptionField>DEPARTMENT</descriptionField>
       <entityField>#ENTITY</entityField>
-      <linkedColumns />
+      <linkedColumns>
+        <element>FIRSTNAME</element>
+        <element>LASTNAME</element>
+      </linkedColumns>
       <fixedFilterFields />
       <columns>
         <neonTableColumn>
@@ -66,7 +69,10 @@
       <name>tree</name>
       <favoriteActionGroup1>filterViewActionGroup</favoriteActionGroup1>
       <entityField>#ENTITY</entityField>
-      <linkedColumns />
+      <linkedColumns>
+        <element>FIRSTNAME</element>
+        <element>LASTNAME</element>
+      </linkedColumns>
       <defaultGroupFields />
       <fixedFilterFields />
       <columns>
-- 
GitLab


From cc73a6045bb1cee9a1b83a5feb1cc720320fa4ac Mon Sep 17 00:00:00 2001
From: Sebastian Listl <s.listl@adito.de>
Date: Thu, 17 Dec 2020 11:10:49 +0100
Subject: [PATCH 184/184] Project upgrade to 6.2.1

---
 .aditoprj/project.version                     |   4 +-
 entity/360Degree_entity/360Degree_entity.aod  |  32 +--
 .../ActivityLink_entity.aod                   |  22 +-
 .../AddressType_entity/AddressType_entity.aod |  14 +-
 .../AppointmentLink_entity.aod                |  22 +-
 .../AroundLocation_entity.aod                 |  10 +-
 .../AttributeUsage_entity.aod                 |  10 +-
 .../BulkMailRecipient_entity.aod              |  20 +-
 .../CampaignAddParticipants_entity.aod        |  10 +-
 .../CampaignAnalysis_entity.aod               |  16 +-
 .../CampaignCost_entity.aod                   |  60 ++---
 .../CampaignPlanning_entity.aod               |  10 +-
 .../CampaignStep_entity.aod                   |  94 +++----
 .../ClassificationGroup_entity.aod            |  10 +-
 .../ClassificationType_entity.aod             |  10 +-
 .../Classification_entity.aod                 |  20 +-
 .../CommRestriction_Entity.aod                |  20 +-
 .../Competition_entity/Competition_entity.aod |  90 +++----
 entity/Contact_entity/Contact_entity.aod      |  66 ++---
 entity/Context_entity/Context_entity.aod      |  64 ++---
 entity/Countries_Entity/Countries_Entity.aod  |  24 +-
 entity/DSGVOInfo_entity/DSGVOInfo_entity.aod  |  26 +-
 entity/DSGVO_entity/DSGVO_entity.aod          |  26 +-
 .../DescriptionTranslation_entity.aod         |  10 +-
 .../DistrictResponsible_entity.aod            |  58 ++--
 entity/District_entity/District_entity.aod    |  68 ++---
 .../DocumentTemplateLink_entity.aod           |  26 +-
 .../DocumentTemplateTypeCategory_entity.aod   |  12 +-
 .../DocumentTemplate_entity.aod               |  72 ++---
 .../DuplicateScanner_entity.aod               |  10 +-
 .../Duplicates_entity/Duplicates_entity.aod   |  60 ++---
 .../EmployeeRole_entity.aod                   |  24 +-
 entity/Employee_entity/Employee_entity.aod    |  98 +++----
 .../ExportTemplateSelection_entity.aod        |  10 +-
 entity/Forecast_entity/Forecast_entity.aod    |  20 +-
 .../ImportField_Entity/ImportField_Entity.aod |  10 +-
 .../KeywordAttributeRelation_entity.aod       |  24 +-
 .../KeywordAttribute_entity.aod               |  10 +-
 .../KnowledgeDiscussion_entity.aod            |  10 +-
 .../KnowledgeLink_entity.aod                  |  26 +-
 .../KnowledgeManagementTags_entity.aod        |  12 +-
 .../KnowledgeManagement_entity.aod            |  86 +++---
 .../KnowledgeRole_entity.aod                  |  10 +-
 entity/Language_entity/Language_entity.aod    |  24 +-
 entity/LeadLog_entity/LeadLog_entity.aod      |  10 +-
 entity/Lead_entity/Lead_entity.aod            |  20 +-
 .../LeadimportMappingAssistant_entity.aod     |  10 +-
 .../Leadimport_entity/Leadimport_entity.aod   |  98 +++----
 entity/Letter_entity/Letter_entity.aod        |  10 +-
 .../MarketingWorkflowLauncher_entity.aod      |  20 +-
 .../ModuleTree_entity/ModuleTree_entity.aod   |  20 +-
 .../ObjectRelationType_entity.aod             |  14 +-
 .../ObjectTree_entity/ObjectTree_entity.aod   |  40 +--
 entity/Object_entity/Object_entity.aod        | 122 ++++-----
 entity/Offer_entity/Offer_entity.aod          | 238 ++++++++---------
 entity/Offeritem_entity/Offeritem_entity.aod  |  32 +--
 entity/Order_entity/Order_entity.aod          | 194 +++++++-------
 entity/Orderitem_entity/Orderitem_entity.aod  |  44 +--
 .../PermissionCalendar_entity.aod             |  20 +-
 .../PermissionDetail_entity.aod               |  26 +-
 .../PermissionMetaData_entity.aod             |  32 +--
 .../PrivatePerson_entity.aod                  |  10 +-
 entity/Prod2prod_entity/Prod2prod_entity.aod  |  26 +-
 entity/Product_entity/Product_entity.aod      | 158 +++++------
 .../Productprice_entity.aod                   |  36 +--
 .../QuickEntry_entity/QuickEntry_entity.aod   |  90 +++----
 .../Salesproject_entity.aod                   | 252 +++++++++---------
 .../SalutationDistinct_entity.aod             |  12 +-
 .../SalutationTitleDistinct_entity.aod        |  16 +-
 .../Salutation_entity/Salutation_entity.aod   |  10 +-
 .../SerialLetter_entity.aod                   |  60 ++---
 entity/Stock_entity/Stock_entity.aod          |  22 +-
 .../SupportTicket_entity.aod                  |  96 +++----
 entity/TaskLink_entity/TaskLink_entity.aod    |  22 +-
 .../Timetracking_entity.aod                   |  16 +-
 .../TurnoverTree_entity.aod                   |  12 +-
 entity/Turnover_entity/Turnover_entity.aod    |  26 +-
 .../UniversalFileProcessor_entity.aod         |  10 +-
 .../UnlinkedMailMappingWrapper_entity.aod     |  10 +-
 .../VisitPlanEntry_entity.aod                 |  20 +-
 .../VisitRecommendation_entity.aod            |  30 +--
 .../WorkflowStartConfig_entity.aod            |  20 +-
 .../360DegreeFilter_view.aod                  |   1 -
 .../CampaignStepsGantt_view.aod               |   2 +-
 .../AISalesproject_lib/AISalesproject_lib.aod |   2 +-
 process/AI_lib/AI_lib.aod                     |   2 +-
 process/ActivityTask_lib/ActivityTask_lib.aod |   2 +-
 .../AddressEntity_lib/AddressEntity_lib.aod   |   2 +-
 process/Address_lib/Address_lib.aod           |   2 +-
 process/Appointment_lib/Appointment_lib.aod   |   2 +-
 .../AttributeFilter_lib.aod                   |   2 +-
 .../AttributeRegistry_basic.aod               |   2 +-
 process/Attribute_lib/Attribute_lib.aod       |   2 +-
 process/Binary_lib/Binary_lib.aod             |   2 +-
 process/Bulkmail_lib/Bulkmail_lib.aod         |   2 +-
 .../CachedRecordContainer_lib.aod             |   2 +-
 process/Calendar_lib/Calendar_lib.aod         |   2 +-
 process/Campaign_lib/Campaign_lib.aod         |   2 +-
 .../ClassificationFilter_lib.aod              |   2 +-
 .../Classification_lib/Classification_lib.aod |   2 +-
 .../Communication_lib/Communication_lib.aod   |   2 +-
 process/Contact_lib/Contact_lib.aod           |   2 +-
 process/Context_lib/Context_lib.aod           |   2 +-
 process/Contract_lib/Contract_lib.aod         |   2 +-
 .../CountryInfoData_lib.aod                   |   2 +-
 process/CountryInfo_lib/CountryInfo_lib.aod   |   2 +-
 .../CreateActivity_workflowService.aod        |   2 +-
 .../CreateNotification_workflowService.aod    |   2 +-
 ...SalesprojectTouchpoint_workflowService.aod |   2 +-
 .../CreateSalesproject_workflowService.aod    |   2 +-
 .../CustomPlaceholder_lib.aod                 |   2 +-
 process/DataCaching_lib/DataCaching_lib.aod   |   2 +-
 process/DataPrivacy_lib/DataPrivacy_lib.aod   |   2 +-
 process/Data_lib/Data_lib.aod                 |   2 +-
 process/Date_lib/Date_lib.aod                 |   2 +-
 process/Dependency_lib/Dependency_lib.aod     |   2 +-
 .../DocumentTemplate_lib.aod                  |   2 +-
 process/Document_lib/Document_lib.aod         |   2 +-
 .../DocxTemplater_lib/DocxTemplater_lib.aod   |   2 +-
 .../DuplicateScanner_lib.aod                  |   2 +-
 process/EmailUtil_lib/EmailUtil_lib.aod       |   2 +-
 process/Email_lib/Email_lib.aod               |   2 +-
 process/Employee_lib/Employee_lib.aod         |   2 +-
 process/Entity_lib/Entity_lib.aod             |   2 +-
 process/EwsClient_lib/EwsClient_lib.aod       |   2 +-
 .../ExportTemplate_lib/ExportTemplate_lib.aod |   2 +-
 process/Favorites_lib/Favorites_lib.aod       |   2 +-
 .../FilterCondition_lib.aod                   |   2 +-
 .../FilterViewAction_lib.aod                  |   2 +-
 process/Html_lib/Html_lib.aod                 |   2 +-
 .../ImporterCustomMappingFunctions_lib.aod    |   2 +-
 .../ImporterMappingFunctions_lib.aod          |   2 +-
 process/ImporterTest_lib/ImporterTest_lib.aod |   2 +-
 process/Importer_lib/Importer_lib.aod         |   2 +-
 .../IncomingCallExecutor_lib.aod              |   2 +-
 .../IncomingEmailExecutor_lib.aod             |   2 +-
 process/IndexSearch_lib/IndexSearch_lib.aod   |   2 +-
 process/JditoFilter_lib/JditoFilter_lib.aod   |   2 +-
 .../KeywordAttribute_test.aod                 |   2 +-
 process/KeywordData_lib/KeywordData_lib.aod   |   2 +-
 .../KeywordRegistry_basic.aod                 |   2 +-
 process/Keyword_lib/Keyword_lib.aod           |   2 +-
 process/Keyword_test/Keyword_test.aod         |   2 +-
 .../KnowledgeManagement_lib.aod               |   2 +-
 .../LeadQuickAcquisition_lib.aod              |   2 +-
 process/Leadimport_lib/Leadimport_lib.aod     |   2 +-
 process/Liquibase_lib/Liquibase_lib.aod       |   2 +-
 process/Location_lib/Location_lib.aod         |   2 +-
 process/Loghistory_lib/Loghistory_lib.aod     |   2 +-
 process/MSTeams_lib/MSTeams_lib.aod           |   2 +-
 process/MimeType_lib/MimeType_lib.aod         |   2 +-
 process/Money_lib/Money_lib.aod               |   2 +-
 process/Neon_lib/Neon_lib.aod                 |   2 +-
 process/NewsSystem_lib/NewsSystem_lib.aod     |   2 +-
 process/Notification_lib/Notification_lib.aod |   2 +-
 .../ObjectRelationTypeRegistry_basic.aod      |   2 +-
 .../ObjectRelation_lib/ObjectRelation_lib.aod |   2 +-
 process/OfferOrder_lib/OfferOrder_lib.aod     |   2 +-
 process/Offer_lib/Offer_lib.aod               |   2 +-
 process/Order_lib/Order_lib.aod               |   2 +-
 process/Organisation_lib/Organisation_lib.aod |   2 +-
 .../PermissionCalendar_lib.aod                |   2 +-
 process/Permission_lib/Permission_lib.aod     |   2 +-
 process/Person_lib/Person_lib.aod             |   2 +-
 process/Placeholder_lib/Placeholder_lib.aod   |   2 +-
 .../PostalAddress_lib/PostalAddress_lib.aod   |   2 +-
 process/Product_lib/Product_lib.aod           |   2 +-
 process/Proto_lib/Proto_lib.aod               |   2 +-
 ...ebuildAllDuplicateCaches_serverProcess.aod |   2 +-
 .../RebuildDuplicatesCache_serverProcess.aod  |   2 +-
 .../RemoveFromCampaign_workflowService.aod    |   2 +-
 process/Report_lib/Report_lib.aod             |   2 +-
 process/Salesproject_lib/Salesproject_lib.aod |   2 +-
 .../SendEmail_workflowService.aod             |   2 +-
 .../SetAttribute_workflowService.aod          |   2 +-
 .../SetCampaignStep_workflowService.aod       |   2 +-
 .../SetSalesprojectPhase_workflowService.aod  |   2 +-
 process/SqlBuilder_test/SqlBuilder_test.aod   |   2 +-
 .../SqlMaskingUtils_test.aod                  |   2 +-
 process/Sql_lib/Sql_lib.aod                   |   2 +-
 .../StandardObject_lib/StandardObject_lib.aod |   2 +-
 .../TempRebuildIndexPerson_serverProcess.aod  |   2 +-
 process/Terminal_lib/Terminal_lib.aod         |   2 +-
 process/TestIndexSearch/TestIndexSearch.aod   |   2 +-
 process/Ticket_lib/Ticket_lib.aod             |   2 +-
 process/Timetracking_lib/Timetracking_lib.aod |   2 +-
 process/Turnover_lib/Turnover_lib.aod         |   2 +-
 process/UnitTest_lib/UnitTest_lib.aod         |   2 +-
 process/UnitTest_test/UnitTest_test.aod       |   2 +-
 .../UpdateOffer_workflowService.aod           |   2 +-
 process/UserSettings_lib/UserSettings_lib.aod |   2 +-
 process/Util_lib/Util_lib.aod                 |   2 +-
 .../ViewTemplateData_lib.aod                  |   2 +-
 process/Workflow_lib/Workflow_lib.aod         |   2 +-
 process/WsValidation_lib/WsValidation_lib.aod |   2 +-
 process/_all_test/_all_test.aod               |   2 +-
 .../_test_clientProcess.aod                   |   6 +-
 process/_test_importer/_test_importer.aod     |   2 +-
 process/autostartNeon/autostartNeon.aod       |   2 +-
 process/blobHandler/blobHandler.aod           |   2 +-
 .../buildSerialLetter_serverProcess.aod       |   2 +-
 process/ctiCall/ctiCall.aod                   |   2 +-
 process/ctiServerEvents/ctiServerEvents.aod   |   2 +-
 process/emailWrite/emailWrite.aod             |   2 +-
 ...sSyncCalendarPermissions_serverProcess.aod |   2 +-
 .../exportLiquibaseContent_serverProcess.aod  |   2 +-
 ...portLiquibaseSystemalias_serverProcess.aod |   2 +-
 .../getDocxDocument_serverProcess.aod         |   2 +-
 .../importLead_serverProcess.aod              |   2 +-
 process/mailbridge/mailbridge.aod             |   2 +-
 ...recordcontainers_invalid_serverProcess.aod |   2 +-
 process/mstBot_rest/mstBot_rest.aod           |   6 +-
 process/process_audit/process_audit.aod       |   2 +-
 .../rebuildIndex_serverProcess.aod            |   2 +-
 process/redirect_rest/redirect_rest.aod       |   6 +-
 .../removeMSTTeams_serverProcess.aod          |   2 +-
 .../sendBulkMail_serverProcess.aod            |   2 +-
 ...tMissingAddressLocations_serverProcess.aod |   2 +-
 .../startWorkflowInstances_serverProcess.aod  |   2 +-
 .../test_iCommRestriction.aod                 |   2 +-
 .../updateActivities_serverProzess.aod        |   2 +-
 ...pdateAllAddressLocations_serverProcess.aod |   2 +-
 .../updateClassifications_serverProcess.aod   |   2 +-
 .../workflowDeploy_rest.aod                   |   2 +-
 .../workflowExtension_serverProcess.aod       |   2 +-
 .../workflowLinkTracking_rest.aod             |   6 +-
 .../workflowPrivileges_rest.aod               |   2 +-
 .../workflowRoles_rest/workflowRoles_rest.aod |   2 +-
 .../workflowServiceTaskParams_rest.aod        |   2 +-
 .../workflowServiceTasks_rest.aod             |   2 +-
 .../workflowSignal_rest.aod                   |   2 +-
 .../workflowUsers_rest/workflowUsers_rest.aod |   2 +-
 232 files changed, 1793 insertions(+), 1786 deletions(-)

diff --git a/.aditoprj/project.version b/.aditoprj/project.version
index b4940e7b136..94b3c6aab89 100644
--- a/.aditoprj/project.version
+++ b/.aditoprj/project.version
@@ -1,3 +1,3 @@
 #This file is generated by ADITO designer. Do NOT delete or modify!
-#Tue Sep 08 15:42:02 CEST 2020
-version=6.2.0
+#Thu Dec 17 10:59:19 CET 2020
+version=6.2.1
diff --git a/entity/360Degree_entity/360Degree_entity.aod b/entity/360Degree_entity/360Degree_entity.aod
index 35b812776eb..730a2527675 100644
--- a/entity/360Degree_entity/360Degree_entity.aod
+++ b/entity/360Degree_entity/360Degree_entity.aod
@@ -43,14 +43,6 @@
       <targetContextField>TARGET_CONTEXT</targetContextField>
       <targetIdField>TARGET_ID</targetIdField>
       <documentation>%aditoprj%/entity/360Degree_entity/entityfields/organisationobjects/documentation.adoc</documentation>
-      <dependencies>
-        <entityDependency>
-          <name>15488007-165c-4630-828a-447cf2c27899</name>
-          <entityName>Organisation_entity</entityName>
-          <fieldName>360DegreeObjects</fieldName>
-          <isConsumer v="false" />
-        </entityDependency>
-      </dependencies>
       <children>
         <entityParameter>
           <name>ObjectType_param</name>
@@ -62,6 +54,14 @@
           <valueProcess>%aditoprj%/entity/360Degree_entity/entityfields/organisationobjects/children/basecontextid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependencies>
+        <entityDependency>
+          <name>15488007-165c-4630-828a-447cf2c27899</name>
+          <entityName>Organisation_entity</entityName>
+          <fieldName>360DegreeObjects</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+      </dependencies>
     </entityProvider>
     <entityField>
       <name>TARGET_CONTEXT</name>
@@ -85,14 +85,6 @@
       <targetContextField>TARGET_CONTEXT</targetContextField>
       <targetIdField>TARGET_ID</targetIdField>
       <documentation>%aditoprj%/entity/360Degree_entity/entityfields/personobjects/documentation.adoc</documentation>
-      <dependencies>
-        <entityDependency>
-          <name>1d931ae6-137a-4db3-b02c-eb8872d349c6</name>
-          <entityName>Person_entity</entityName>
-          <fieldName>360DegreeObjects</fieldName>
-          <isConsumer v="false" />
-        </entityDependency>
-      </dependencies>
       <children>
         <entityParameter>
           <name>ObjectType_param</name>
@@ -104,6 +96,14 @@
           <valueProcess>%aditoprj%/entity/360Degree_entity/entityfields/personobjects/children/basecontextid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependencies>
+        <entityDependency>
+          <name>1d931ae6-137a-4db3-b02c-eb8872d349c6</name>
+          <entityName>Person_entity</entityName>
+          <fieldName>360DegreeObjects</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+      </dependencies>
     </entityProvider>
     <entityActionGroup>
       <name>newModule</name>
diff --git a/entity/ActivityLink_entity/ActivityLink_entity.aod b/entity/ActivityLink_entity/ActivityLink_entity.aod
index e5518fff2fa..7603602585d 100644
--- a/entity/ActivityLink_entity/ActivityLink_entity.aod
+++ b/entity/ActivityLink_entity/ActivityLink_entity.aod
@@ -40,6 +40,12 @@
       <targetIdField>OBJECT_ROWID</targetIdField>
       <documentation>%aditoprj%/entity/ActivityLink_entity/entityfields/links/documentation.adoc</documentation>
       <recordContainer>db</recordContainer>
+      <children>
+        <entityParameter>
+          <name>ActivityId_param</name>
+          <expose v="true" />
+        </entityParameter>
+      </children>
       <dependencies>
         <entityDependency>
           <name>148c98ea-a24b-453a-afe9-975555486b2c</name>
@@ -48,26 +54,20 @@
           <isConsumer v="false" />
         </entityDependency>
       </dependencies>
-      <children>
-        <entityParameter>
-          <name>ActivityId_param</name>
-          <expose v="true" />
-        </entityParameter>
-      </children>
     </entityProvider>
     <entityConsumer>
       <name>Objects</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Object_entity</entityName>
-        <fieldName>AllObjects</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ObjectType_param</name>
           <valueProcess>%aditoprj%/entity/ActivityLink_entity/entityfields/objects/children/objecttype_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Object_entity</entityName>
+        <fieldName>AllObjects</fieldName>
+      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>Context</name>
diff --git a/entity/AddressType_entity/AddressType_entity.aod b/entity/AddressType_entity/AddressType_entity.aod
index 44fe6f29155..843afd1e218 100644
--- a/entity/AddressType_entity/AddressType_entity.aod
+++ b/entity/AddressType_entity/AddressType_entity.aod
@@ -22,6 +22,13 @@
       <name>ByCategory</name>
       <lookupIdfield>KEYID</lookupIdfield>
       <documentation>%aditoprj%/entity/AddressType_entity/entityfields/bycategory/documentation.adoc</documentation>
+      <children>
+        <entityParameter>
+          <name>UsageFilter_param</name>
+          <expose v="true" />
+          <mandatory v="true" />
+        </entityParameter>
+      </children>
       <dependencies>
         <entityDependency>
           <name>0956b1f3-8b67-4f82-b04a-70be88aff19f</name>
@@ -30,13 +37,6 @@
           <isConsumer v="false" />
         </entityDependency>
       </dependencies>
-      <children>
-        <entityParameter>
-          <name>UsageFilter_param</name>
-          <expose v="true" />
-          <mandatory v="true" />
-        </entityParameter>
-      </children>
     </entityProvider>
     <entityParameter>
       <name>UsageFilter_param</name>
diff --git a/entity/AppointmentLink_entity/AppointmentLink_entity.aod b/entity/AppointmentLink_entity/AppointmentLink_entity.aod
index a60f3736b97..1d6a1b12b34 100644
--- a/entity/AppointmentLink_entity/AppointmentLink_entity.aod
+++ b/entity/AppointmentLink_entity/AppointmentLink_entity.aod
@@ -51,6 +51,12 @@
       <targetIdField>OBJECTID</targetIdField>
       <documentation>%aditoprj%/entity/AppointmentLink_entity/entityfields/links/documentation.adoc</documentation>
       <recordContainer>db</recordContainer>
+      <children>
+        <entityParameter>
+          <name>AppointmentId_param</name>
+          <expose v="true" />
+        </entityParameter>
+      </children>
       <dependencies>
         <entityDependency>
           <name>3dde1745-18a1-4499-83d0-61e414086997</name>
@@ -59,12 +65,6 @@
           <isConsumer v="false" />
         </entityDependency>
       </dependencies>
-      <children>
-        <entityParameter>
-          <name>AppointmentId_param</name>
-          <expose v="true" />
-        </entityParameter>
-      </children>
     </entityProvider>
     <entityConsumer>
       <name>Context</name>
@@ -76,17 +76,17 @@
     </entityConsumer>
     <entityConsumer>
       <name>Objects</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Object_entity</entityName>
-        <fieldName>AllObjects</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ObjectType_param</name>
           <valueProcess>%aditoprj%/entity/AppointmentLink_entity/entityfields/objects/children/objecttype_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Object_entity</entityName>
+        <fieldName>AllObjects</fieldName>
+      </dependency>
     </entityConsumer>
     <entityActionField>
       <name>opencontext</name>
diff --git a/entity/AroundLocation_entity/AroundLocation_entity.aod b/entity/AroundLocation_entity/AroundLocation_entity.aod
index c91531dc4c4..227c9fc268c 100644
--- a/entity/AroundLocation_entity/AroundLocation_entity.aod
+++ b/entity/AroundLocation_entity/AroundLocation_entity.aod
@@ -21,17 +21,17 @@
     <entityConsumer>
       <name>Organisations</name>
       <state>READONLY</state>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Organisation_entity</entityName>
-        <fieldName>OrganisationsViaIndex</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>OnlyShowContactIds_param</name>
           <valueProcess>%aditoprj%/entity/AroundLocation_entity/entityfields/organisations/children/onlyshowcontactids_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Organisation_entity</entityName>
+        <fieldName>OrganisationsViaIndex</fieldName>
+      </dependency>
     </entityConsumer>
     <entityActionField>
       <name>Open</name>
diff --git a/entity/AttributeUsage_entity/AttributeUsage_entity.aod b/entity/AttributeUsage_entity/AttributeUsage_entity.aod
index 24f5a40c608..166b6b8423d 100644
--- a/entity/AttributeUsage_entity/AttributeUsage_entity.aod
+++ b/entity/AttributeUsage_entity/AttributeUsage_entity.aod
@@ -72,11 +72,6 @@
     </entityField>
     <entityConsumer>
       <name>Context</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Context_entity</entityName>
-        <fieldName>Exclusive</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>Blacklist_param</name>
@@ -87,6 +82,11 @@
           <valueProcess>%aditoprj%/entity/AttributeUsage_entity/entityfields/context/children/invertblacklist_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Context_entity</entityName>
+        <fieldName>Exclusive</fieldName>
+      </dependency>
     </entityConsumer>
     <entityParameter>
       <name>SingleSelection_param</name>
diff --git a/entity/BulkMailRecipient_entity/BulkMailRecipient_entity.aod b/entity/BulkMailRecipient_entity/BulkMailRecipient_entity.aod
index 60d85496e22..0e5fdd626ed 100644
--- a/entity/BulkMailRecipient_entity/BulkMailRecipient_entity.aod
+++ b/entity/BulkMailRecipient_entity/BulkMailRecipient_entity.aod
@@ -67,17 +67,17 @@
     </entityConsumer>
     <entityConsumer>
       <name>StatusKeyword</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>KeywordEntry_entity</entityName>
-        <fieldName>SpecificContainerKeywords</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
           <valueProcess>%aditoprj%/entity/BulkMailRecipient_entity/entityfields/statuskeyword/children/containername_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>SpecificContainerKeywords</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>EMAIL_ADDRESS</name>
@@ -136,17 +136,17 @@
     </entityField>
     <entityConsumer>
       <name>EmailAdresses</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Communication_entity</entityName>
-        <fieldName>EmailCommunications</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContactId_param</name>
           <valueProcess>%aditoprj%/entity/BulkMailRecipient_entity/entityfields/emailadresses/children/contactid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Communication_entity</entityName>
+        <fieldName>EmailCommunications</fieldName>
+      </dependency>
     </entityConsumer>
     <entityProvider>
       <name>#PROVIDER_AGGREGATES</name>
diff --git a/entity/CampaignAddParticipants_entity/CampaignAddParticipants_entity.aod b/entity/CampaignAddParticipants_entity/CampaignAddParticipants_entity.aod
index 339e6914d5f..5a45ceab9f7 100644
--- a/entity/CampaignAddParticipants_entity/CampaignAddParticipants_entity.aod
+++ b/entity/CampaignAddParticipants_entity/CampaignAddParticipants_entity.aod
@@ -60,11 +60,6 @@
     </entityConsumer>
     <entityConsumer>
       <name>CampaignStepConsumer</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>CampaignStep_entity</entityName>
-        <fieldName>CampaignSteps</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>campaignId_param</name>
@@ -72,6 +67,11 @@
           <expose v="true" />
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>CampaignStep_entity</entityName>
+        <fieldName>CampaignSteps</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>UID</name>
diff --git a/entity/CampaignAnalysis_entity/CampaignAnalysis_entity.aod b/entity/CampaignAnalysis_entity/CampaignAnalysis_entity.aod
index ff9e8a25ad8..8aae1d74b98 100644
--- a/entity/CampaignAnalysis_entity/CampaignAnalysis_entity.aod
+++ b/entity/CampaignAnalysis_entity/CampaignAnalysis_entity.aod
@@ -15,14 +15,6 @@
     <entityProvider>
       <name>CampaignAnalysisProvider</name>
       <documentation>%aditoprj%/entity/CampaignAnalysis_entity/entityfields/campaignanalysisprovider/documentation.adoc</documentation>
-      <dependencies>
-        <entityDependency>
-          <name>bd130613-f0e4-4591-8035-2c2491b08c50</name>
-          <entityName>Campaign_entity</entityName>
-          <fieldName>CampaignAnalysisConsumer</fieldName>
-          <isConsumer v="false" />
-        </entityDependency>
-      </dependencies>
       <children>
         <entityParameter>
           <name>DateEnd_param</name>
@@ -40,6 +32,14 @@
           <mandatory v="true" />
         </entityParameter>
       </children>
+      <dependencies>
+        <entityDependency>
+          <name>bd130613-f0e4-4591-8035-2c2491b08c50</name>
+          <entityName>Campaign_entity</entityName>
+          <fieldName>CampaignAnalysisConsumer</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+      </dependencies>
     </entityProvider>
     <entityParameter>
       <name>CampaignId_param</name>
diff --git a/entity/CampaignCost_entity/CampaignCost_entity.aod b/entity/CampaignCost_entity/CampaignCost_entity.aod
index 096e8a8d95b..3f3d974f90d 100644
--- a/entity/CampaignCost_entity/CampaignCost_entity.aod
+++ b/entity/CampaignCost_entity/CampaignCost_entity.aod
@@ -80,14 +80,6 @@
     <entityProvider>
       <name>CampaignCosts</name>
       <documentation>%aditoprj%/entity/CampaignCost_entity/entityfields/campaigncosts/documentation.adoc</documentation>
-      <dependencies>
-        <entityDependency>
-          <name>7131288b-af5c-4914-96f5-c5d70217fc23</name>
-          <entityName>Campaign_entity</entityName>
-          <fieldName>CampaignCosts</fieldName>
-          <isConsumer v="false" />
-        </entityDependency>
-      </dependencies>
       <children>
         <entityParameter>
           <name>CampaignStepId_param</name>
@@ -107,24 +99,18 @@
           <expose v="false" />
         </entityParameter>
       </children>
-    </entityProvider>
-    <entityProvider>
-      <name>StepCosts</name>
-      <documentation>%aditoprj%/entity/CampaignCost_entity/entityfields/stepcosts/documentation.adoc</documentation>
       <dependencies>
         <entityDependency>
-          <name>af147f3e-a1bd-4eb0-9ac8-325dbdaba17d</name>
-          <entityName>CampaignStep_entity</entityName>
-          <fieldName>CampaignStepCosts</fieldName>
-          <isConsumer v="false" />
-        </entityDependency>
-        <entityDependency>
-          <name>2a92b738-c0bb-4c14-9915-aff9e18effaf</name>
+          <name>7131288b-af5c-4914-96f5-c5d70217fc23</name>
           <entityName>Campaign_entity</entityName>
-          <fieldName>CampaignStepCosts</fieldName>
+          <fieldName>CampaignCosts</fieldName>
           <isConsumer v="false" />
         </entityDependency>
       </dependencies>
+    </entityProvider>
+    <entityProvider>
+      <name>StepCosts</name>
+      <documentation>%aditoprj%/entity/CampaignCost_entity/entityfields/stepcosts/documentation.adoc</documentation>
       <children>
         <entityParameter>
           <name>CampaignStepId_param</name>
@@ -144,6 +130,20 @@
           <expose v="false" />
         </entityParameter>
       </children>
+      <dependencies>
+        <entityDependency>
+          <name>af147f3e-a1bd-4eb0-9ac8-325dbdaba17d</name>
+          <entityName>CampaignStep_entity</entityName>
+          <fieldName>CampaignStepCosts</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+        <entityDependency>
+          <name>2a92b738-c0bb-4c14-9915-aff9e18effaf</name>
+          <entityName>Campaign_entity</entityName>
+          <fieldName>CampaignStepCosts</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+      </dependencies>
     </entityProvider>
     <entityConsumer>
       <name>Campaigns</name>
@@ -155,25 +155,20 @@
     </entityConsumer>
     <entityConsumer>
       <name>CampaignSteps</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>CampaignStep_entity</entityName>
-        <fieldName>CampaignSteps</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>campaignId_param</name>
           <valueProcess>%aditoprj%/entity/CampaignCost_entity/entityfields/campaignsteps/children/campaignid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>KeywordCampaignManagementCostCategory</name>
       <dependency>
         <name>dependency</name>
-        <entityName>KeywordEntry_entity</entityName>
-        <fieldName>SpecificContainerKeywords</fieldName>
+        <entityName>CampaignStep_entity</entityName>
+        <fieldName>CampaignSteps</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>KeywordCampaignManagementCostCategory</name>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
@@ -184,6 +179,11 @@
           <valueProcess>%aditoprj%/entity/CampaignCost_entity/entityfields/keywordcampaignmanagementcostcategory/children/excludedkeyidssubquery_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>SpecificContainerKeywords</fieldName>
+      </dependency>
     </entityConsumer>
     <entityParameter>
       <name>CampaignId_param</name>
diff --git a/entity/CampaignPlanning_entity/CampaignPlanning_entity.aod b/entity/CampaignPlanning_entity/CampaignPlanning_entity.aod
index f274ff68901..44826e7cfe2 100644
--- a/entity/CampaignPlanning_entity/CampaignPlanning_entity.aod
+++ b/entity/CampaignPlanning_entity/CampaignPlanning_entity.aod
@@ -81,17 +81,17 @@
     </entityField>
     <entityConsumer>
       <name>CampaignStatusKeyword</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>KeywordEntry_entity</entityName>
-        <fieldName>SpecificContainerKeywords</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
           <valueProcess>%aditoprj%/entity/CampaignPlanning_entity/entityfields/campaignstatuskeyword/children/containername_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>SpecificContainerKeywords</fieldName>
+      </dependency>
     </entityConsumer>
     <entityProvider>
       <name>#PROVIDER_AGGREGATES</name>
diff --git a/entity/CampaignStep_entity/CampaignStep_entity.aod b/entity/CampaignStep_entity/CampaignStep_entity.aod
index ae04d014704..3632eda854e 100644
--- a/entity/CampaignStep_entity/CampaignStep_entity.aod
+++ b/entity/CampaignStep_entity/CampaignStep_entity.aod
@@ -131,6 +131,13 @@
       <name>CampaignSteps</name>
       <documentation>%aditoprj%/entity/CampaignStep_entity/entityfields/campaignsteps/documentation.adoc</documentation>
       <recordContainer>db</recordContainer>
+      <children>
+        <entityParameter>
+          <name>campaignId_param</name>
+          <expose v="true" />
+          <mandatory v="true" />
+        </entityParameter>
+      </children>
       <dependencies>
         <entityDependency>
           <name>421e6cc2-f874-4834-b022-fe1b253d50af</name>
@@ -169,13 +176,6 @@
           <isConsumer v="false" />
         </entityDependency>
       </dependencies>
-      <children>
-        <entityParameter>
-          <name>campaignId_param</name>
-          <expose v="true" />
-          <mandatory v="true" />
-        </entityParameter>
-      </children>
     </entityProvider>
     <entityParameter>
       <name>campaignId_param</name>
@@ -184,17 +184,17 @@
     </entityParameter>
     <entityConsumer>
       <name>KeywordStates</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>KeywordEntry_entity</entityName>
-        <fieldName>SpecificContainerKeywords</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
           <valueProcess>%aditoprj%/entity/CampaignStep_entity/entityfields/keywordstates/children/containername_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>SpecificContainerKeywords</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>MAXPARTICIPANTS</name>
@@ -206,11 +206,6 @@
     <entityConsumer>
       <name>CampaignParticipantsConsumer</name>
       <selectionMode>MULTI</selectionMode>
-      <dependency>
-        <name>dependency</name>
-        <entityName>CampaignParticipant_entity</entityName>
-        <fieldName>CampaignParticipantsProvider</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>CampaignId_param</name>
@@ -221,6 +216,11 @@
           <valueProcess>%aditoprj%/entity/CampaignStep_entity/entityfields/campaignparticipantsconsumer/children/campaignstepid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>CampaignParticipant_entity</entityName>
+        <fieldName>CampaignParticipantsProvider</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>CurrentMaxParticipantsInfo</name>
@@ -241,25 +241,20 @@
     </entityField>
     <entityConsumer>
       <name>Employees</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Employee_entity</entityName>
-        <fieldName>Employees</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>OnlyActives_param</name>
           <valueProcess>%aditoprj%/entity/CampaignStep_entity/entityfields/employees/children/onlyactives_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>CampaignStepCosts</name>
       <dependency>
         <name>dependency</name>
-        <entityName>CampaignCost_entity</entityName>
-        <fieldName>StepCosts</fieldName>
+        <entityName>Employee_entity</entityName>
+        <fieldName>Employees</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>CampaignStepCosts</name>
       <children>
         <entityParameter>
           <name>CampaignId_param</name>
@@ -270,6 +265,11 @@
           <valueProcess>%aditoprj%/entity/CampaignStep_entity/entityfields/campaignstepcosts/children/campaignstepid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>CampaignCost_entity</entityName>
+        <fieldName>StepCosts</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>COST</name>
@@ -289,11 +289,6 @@
     <entityConsumer>
       <name>Activities</name>
       <title>Activities</title>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Activity_entity</entityName>
-        <fieldName>LinkedObjects</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>RowId_param</name>
@@ -304,16 +299,16 @@
           <valueProcess>%aditoprj%/entity/CampaignStep_entity/entityfields/activities/children/objectid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Activity_entity</entityName>
+        <fieldName>LinkedObjects</fieldName>
+      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>Tasks</name>
       <title>Tasks</title>
       <stateProcess>%aditoprj%/entity/CampaignStep_entity/entityfields/tasks/stateProcess.js</stateProcess>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Task_entity</entityName>
-        <fieldName>Tasks</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>RowId_param</name>
@@ -324,6 +319,11 @@
           <valueProcess>%aditoprj%/entity/CampaignStep_entity/entityfields/tasks/children/objectid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Task_entity</entityName>
+        <fieldName>Tasks</fieldName>
+      </dependency>
     </entityConsumer>
     <entityActionField>
       <name>newActivity</name>
@@ -357,11 +357,6 @@
     </entityField>
     <entityConsumer>
       <name>CampaignStepsConsumer</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>CampaignStep_entity</entityName>
-        <fieldName>CampaignSteps</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>campaignId_param</name>
@@ -373,6 +368,11 @@
           <valueProcess>%aditoprj%/entity/CampaignStep_entity/entityfields/campaignstepsconsumer/children/maxsort_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>CampaignStep_entity</entityName>
+        <fieldName>CampaignSteps</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>CampaignName</name>
@@ -419,17 +419,17 @@
     </entityField>
     <entityConsumer>
       <name>KeywordStepMedium</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>KeywordEntry_entity</entityName>
-        <fieldName>SpecificContainerKeywords</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
           <valueProcess>%aditoprj%/entity/CampaignStep_entity/entityfields/keywordstepmedium/children/containername_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>SpecificContainerKeywords</fieldName>
+      </dependency>
     </entityConsumer>
   </entityFields>
   <recordContainers>
diff --git a/entity/ClassificationGroup_entity/ClassificationGroup_entity.aod b/entity/ClassificationGroup_entity/ClassificationGroup_entity.aod
index 546a64d9480..c37f1f7de65 100644
--- a/entity/ClassificationGroup_entity/ClassificationGroup_entity.aod
+++ b/entity/ClassificationGroup_entity/ClassificationGroup_entity.aod
@@ -30,17 +30,17 @@
     </entityConsumer>
     <entityConsumer>
       <name>ClassificationGradings</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>ClassificationGrading_entity</entityName>
-        <fieldName>ClassificationGradings</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ClassificationTypeId_param</name>
           <valueProcess>%aditoprj%/entity/ClassificationGroup_entity/entityfields/classificationgradings/children/classificationtypeid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>ClassificationGrading_entity</entityName>
+        <fieldName>ClassificationGradings</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>SORTING</name>
diff --git a/entity/ClassificationType_entity/ClassificationType_entity.aod b/entity/ClassificationType_entity/ClassificationType_entity.aod
index faf8305ab81..2434fa0a53d 100644
--- a/entity/ClassificationType_entity/ClassificationType_entity.aod
+++ b/entity/ClassificationType_entity/ClassificationType_entity.aod
@@ -40,11 +40,6 @@
     <entityConsumer>
       <name>ClassificationScores</name>
       <refreshParent v="true" />
-      <dependency>
-        <name>dependency</name>
-        <entityName>ClassificationScore_entity</entityName>
-        <fieldName>ClassificationScores</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ClassificationTypeId_param</name>
@@ -55,6 +50,11 @@
           <valueProcess>%aditoprj%/entity/ClassificationType_entity/entityfields/classificationscores/children/classificationgroup_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>ClassificationScore_entity</entityName>
+        <fieldName>ClassificationScores</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>infoField</name>
diff --git a/entity/Classification_entity/Classification_entity.aod b/entity/Classification_entity/Classification_entity.aod
index 0ffc7c02987..61c825296a1 100644
--- a/entity/Classification_entity/Classification_entity.aod
+++ b/entity/Classification_entity/Classification_entity.aod
@@ -88,11 +88,6 @@
     </entityField>
     <entityConsumer>
       <name>ClassificationScores</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>ClassificationScore_entity</entityName>
-        <fieldName>ClassificationScores</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ClassificationGroup_param</name>
@@ -107,6 +102,11 @@
           <valueProcess>%aditoprj%/entity/Classification_entity/entityfields/classificationscores/children/classificationtype_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>ClassificationScore_entity</entityName>
+        <fieldName>ClassificationScores</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>CLASSIFICATIONTYPE</name>
@@ -130,17 +130,17 @@
     </entityField>
     <entityConsumer>
       <name>KeywordClassificationTypes</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>KeywordEntry_entity</entityName>
-        <fieldName>SpecificContainerKeywords</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
           <valueProcess>%aditoprj%/entity/Classification_entity/entityfields/keywordclassificationtypes/children/containername_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>SpecificContainerKeywords</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>SCORETYPE</name>
diff --git a/entity/CommRestriction_Entity/CommRestriction_Entity.aod b/entity/CommRestriction_Entity/CommRestriction_Entity.aod
index 102c450de9e..60d0a7e5c51 100644
--- a/entity/CommRestriction_Entity/CommRestriction_Entity.aod
+++ b/entity/CommRestriction_Entity/CommRestriction_Entity.aod
@@ -55,11 +55,6 @@
     </entityConsumer>
     <entityConsumer>
       <name>CommRestrictionMedium</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>KeywordEntry_entity</entityName>
-        <fieldName>SpecificContainerKeywords</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
@@ -71,6 +66,11 @@
           <valueProcess>%aditoprj%/entity/CommRestriction_Entity/entityfields/commrestrictionmedium/children/excludedkeyidssubquery_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>SpecificContainerKeywords</fieldName>
+      </dependency>
     </entityConsumer>
     <entityProvider>
       <name>CommRestrictions</name>
@@ -103,17 +103,17 @@
     </entityField>
     <entityConsumer>
       <name>MediumKeywordAttribute</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>KeywordAttribute_entity</entityName>
-        <fieldName>SpecificContainerKeyword</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
           <valueProcess>%aditoprj%/entity/CommRestriction_Entity/entityfields/mediumkeywordattribute/children/containername_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordAttribute_entity</entityName>
+        <fieldName>SpecificContainerKeyword</fieldName>
+      </dependency>
     </entityConsumer>
     <entityProvider>
       <name>#PROVIDER_AGGREGATES</name>
diff --git a/entity/Competition_entity/Competition_entity.aod b/entity/Competition_entity/Competition_entity.aod
index 7e7298fd9a7..50d4bcf3096 100644
--- a/entity/Competition_entity/Competition_entity.aod
+++ b/entity/Competition_entity/Competition_entity.aod
@@ -79,11 +79,6 @@
     </entityConsumer>
     <entityConsumer>
       <name>Organisations</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Organisation_entity</entityName>
-        <fieldName>WithAttribute</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>AttributeId_param</name>
@@ -102,15 +97,15 @@
           <title></title>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Organisation_entity</entityName>
+        <fieldName>WithAttribute</fieldName>
+      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>KeywordWonLost</name>
       <selectionMode>MULTI</selectionMode>
-      <dependency>
-        <name>dependency</name>
-        <entityName>KeywordEntry_entity</entityName>
-        <fieldName>SpecificContainerKeywords</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
@@ -118,6 +113,11 @@
           <expose v="false" />
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>SpecificContainerKeywords</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>PHASE</name>
@@ -127,11 +127,6 @@
     </entityField>
     <entityConsumer>
       <name>KeywordPricePolitics</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>KeywordEntry_entity</entityName>
-        <fieldName>SpecificContainerKeywords</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
@@ -139,14 +134,14 @@
           <expose v="false" />
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>KeywordWeaknesses</name>
       <dependency>
         <name>dependency</name>
         <entityName>KeywordEntry_entity</entityName>
         <fieldName>SpecificContainerKeywords</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>KeywordWeaknesses</name>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
@@ -154,14 +149,14 @@
           <expose v="false" />
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>KeywordStrenghts</name>
       <dependency>
         <name>dependency</name>
         <entityName>KeywordEntry_entity</entityName>
         <fieldName>SpecificContainerKeywords</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>KeywordStrenghts</name>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
@@ -169,14 +164,14 @@
           <expose v="false" />
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>KeywordPhases</name>
       <dependency>
         <name>dependency</name>
         <entityName>KeywordEntry_entity</entityName>
         <fieldName>SpecificContainerKeywords</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>KeywordPhases</name>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
@@ -184,14 +179,14 @@
           <expose v="false" />
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>KeywordStates</name>
       <dependency>
         <name>dependency</name>
         <entityName>KeywordEntry_entity</entityName>
         <fieldName>SpecificContainerKeywords</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>KeywordStates</name>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
@@ -199,15 +194,15 @@
           <expose v="false" />
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>SpecificContainerKeywords</fieldName>
+      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>Attributes</name>
       <state>DISABLED</state>
-      <dependency>
-        <name>dependency</name>
-        <entityName>AttributeRelation_entity</entityName>
-        <fieldName>AttributeRelations</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ObjectRowId_param</name>
@@ -222,6 +217,11 @@
           <valueProcess>%aditoprj%/entity/Competition_entity/entityfields/attributes/children/displaysimplename_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>AttributeRelation_entity</entityName>
+        <fieldName>AttributeRelations</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>IMAGE</name>
@@ -254,11 +254,6 @@
     </entityConsumer>
     <entityConsumer>
       <name>Objects</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Object_entity</entityName>
-        <fieldName>AllObjects</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ObjectType_param</name>
@@ -267,18 +262,15 @@
           <mandatory v="true" />
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Object_entity</entityName>
+        <fieldName>AllObjects</fieldName>
+      </dependency>
     </entityConsumer>
     <entityProvider>
       <name>Links</name>
       <recordContainer>db</recordContainer>
-      <dependencies>
-        <entityDependency>
-          <name>be977304-6623-42eb-a8bd-80ef43831204</name>
-          <entityName>Salesproject_entity</entityName>
-          <fieldName>Competitions</fieldName>
-          <isConsumer v="false" />
-        </entityDependency>
-      </dependencies>
       <children>
         <entityParameter>
           <name>ObjectRowId_param</name>
@@ -289,6 +281,14 @@
           <expose v="true" />
         </entityParameter>
       </children>
+      <dependencies>
+        <entityDependency>
+          <name>be977304-6623-42eb-a8bd-80ef43831204</name>
+          <entityName>Salesproject_entity</entityName>
+          <fieldName>Competitions</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+      </dependencies>
     </entityProvider>
     <entityProvider>
       <name>#PROVIDER_AGGREGATES</name>
diff --git a/entity/Contact_entity/Contact_entity.aod b/entity/Contact_entity/Contact_entity.aod
index 41a386bd8dc..051d569c5b1 100644
--- a/entity/Contact_entity/Contact_entity.aod
+++ b/entity/Contact_entity/Contact_entity.aod
@@ -65,17 +65,17 @@
     </entityField>
     <entityConsumer>
       <name>Organisations</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Organisation_entity</entityName>
-        <fieldName>WithPersonIdFilter</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ExcludeOrganisationsByPersonId</name>
           <valueProcess>%aditoprj%/entity/Contact_entity/entityfields/organisations/children/excludeorganisationsbypersonid/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Organisation_entity</entityName>
+        <fieldName>WithPersonIdFilter</fieldName>
+      </dependency>
     </entityConsumer>
     <entityParameter>
       <name>PersonId_param</name>
@@ -86,6 +86,12 @@
       <name>PersonRelated</name>
       <targetContextField>targetContext</targetContextField>
       <targetIdField>CONTACTID</targetIdField>
+      <children>
+        <entityParameter>
+          <name>OwnContactId_param</name>
+          <expose v="false" />
+        </entityParameter>
+      </children>
       <dependencies>
         <entityDependency>
           <name>14975dad-907c-4f8c-bd39-243508ede721</name>
@@ -94,12 +100,6 @@
           <isConsumer v="false" />
         </entityDependency>
       </dependencies>
-      <children>
-        <entityParameter>
-          <name>OwnContactId_param</name>
-          <expose v="false" />
-        </entityParameter>
-      </children>
     </entityProvider>
     <entityField>
       <name>ADDRESS_ID</name>
@@ -115,31 +115,31 @@
     </entityField>
     <entityConsumer>
       <name>Communications</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Communication_entity</entityName>
-        <fieldName>AllCommunications</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContactId_param</name>
           <valueProcess>%aditoprj%/entity/Contact_entity/entityfields/communications/children/contactid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>ContactAddresses</name>
       <dependency>
         <name>dependency</name>
-        <entityName>Address_entity</entityName>
-        <fieldName>ContactAddresses</fieldName>
+        <entityName>Communication_entity</entityName>
+        <fieldName>AllCommunications</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>ContactAddresses</name>
       <children>
         <entityParameter>
           <name>ContactId_param</name>
           <valueProcess>%aditoprj%/entity/Contact_entity/entityfields/contactaddresses/children/contactid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Address_entity</entityName>
+        <fieldName>ContactAddresses</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>LANGUAGE</name>
@@ -163,6 +163,13 @@
       <targetContextField>targetContext</targetContextField>
       <targetIdField>CONTACTID</targetIdField>
       <titlePlural>Other Contactroles</titlePlural>
+      <children>
+        <entityParameter>
+          <name>PersonId_param</name>
+          <valueProcess>%aditoprj%/entity/Contact_entity/entityfields/personscontactsexceptown/children/personid_param/valueProcess.js</valueProcess>
+          <expose v="false" />
+        </entityParameter>
+      </children>
       <dependencies>
         <entityDependency>
           <name>34cc85f4-5555-4631-94fc-f3ad35b7ce7e</name>
@@ -171,13 +178,6 @@
           <isConsumer v="false" />
         </entityDependency>
       </dependencies>
-      <children>
-        <entityParameter>
-          <name>PersonId_param</name>
-          <valueProcess>%aditoprj%/entity/Contact_entity/entityfields/personscontactsexceptown/children/personid_param/valueProcess.js</valueProcess>
-          <expose v="false" />
-        </entityParameter>
-      </children>
     </entityProvider>
     <entityParameter>
       <name>OwnContactId_param</name>
@@ -198,17 +198,17 @@
     </entityField>
     <entityConsumer>
       <name>KeywordContactStates</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>KeywordEntry_entity</entityName>
-        <fieldName>SpecificContainerKeywords</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
           <valueProcess>%aditoprj%/entity/Contact_entity/entityfields/keywordcontactstates/children/containername_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>SpecificContainerKeywords</fieldName>
+      </dependency>
     </entityConsumer>
     <entityParameter>
       <name>LanguageKey_param</name>
diff --git a/entity/Context_entity/Context_entity.aod b/entity/Context_entity/Context_entity.aod
index a8e3222ec7e..8e8f8d01c34 100644
--- a/entity/Context_entity/Context_entity.aod
+++ b/entity/Context_entity/Context_entity.aod
@@ -30,6 +30,16 @@
     </entityField>
     <entityProvider>
       <name>Context</name>
+      <children>
+        <entityParameter>
+          <name>InvertBlacklist_param</name>
+          <expose v="false" />
+        </entityParameter>
+        <entityParameter>
+          <name>Blacklist_param</name>
+          <expose v="false" />
+        </entityParameter>
+      </children>
       <dependencies>
         <entityDependency>
           <name>dab09827-2eeb-403d-a070-ba805d2640ee</name>
@@ -56,16 +66,6 @@
           <isConsumer v="false" />
         </entityDependency>
       </dependencies>
-      <children>
-        <entityParameter>
-          <name>InvertBlacklist_param</name>
-          <expose v="false" />
-        </entityParameter>
-        <entityParameter>
-          <name>Blacklist_param</name>
-          <expose v="false" />
-        </entityParameter>
-      </children>
     </entityProvider>
     <entityParameter>
       <name>Blacklist_param</name>
@@ -74,6 +74,13 @@
     </entityParameter>
     <entityProvider>
       <name>ActivityLinkable</name>
+      <children>
+        <entityParameter>
+          <name>Blacklist_param</name>
+          <valueProcess>%aditoprj%/entity/Context_entity/entityfields/activitylinkable/children/blacklist_param/valueProcess.js</valueProcess>
+          <expose v="false" />
+        </entityParameter>
+      </children>
       <dependencies>
         <entityDependency>
           <name>de50f67e-5ed0-46aa-b007-8c086cf5fea5</name>
@@ -82,16 +89,16 @@
           <isConsumer v="false" />
         </entityDependency>
       </dependencies>
+    </entityProvider>
+    <entityProvider>
+      <name>TaskLinkable</name>
       <children>
         <entityParameter>
           <name>Blacklist_param</name>
-          <valueProcess>%aditoprj%/entity/Context_entity/entityfields/activitylinkable/children/blacklist_param/valueProcess.js</valueProcess>
+          <valueProcess>%aditoprj%/entity/Context_entity/entityfields/tasklinkable/children/blacklist_param/valueProcess.js</valueProcess>
           <expose v="false" />
         </entityParameter>
       </children>
-    </entityProvider>
-    <entityProvider>
-      <name>TaskLinkable</name>
       <dependencies>
         <entityDependency>
           <name>ff8925da-b69a-46dd-8fe2-d6707da8808e</name>
@@ -100,13 +107,6 @@
           <isConsumer v="false" />
         </entityDependency>
       </dependencies>
-      <children>
-        <entityParameter>
-          <name>Blacklist_param</name>
-          <valueProcess>%aditoprj%/entity/Context_entity/entityfields/tasklinkable/children/blacklist_param/valueProcess.js</valueProcess>
-          <expose v="false" />
-        </entityParameter>
-      </children>
     </entityProvider>
     <entityParameter>
       <name>InvertBlacklist_param</name>
@@ -157,6 +157,17 @@
     </entityProvider>
     <entityProvider>
       <name>ContextTemplatePlaceOfUse</name>
+      <children>
+        <entityParameter>
+          <name>InvertBlacklist_param</name>
+          <valueProcess>%aditoprj%/entity/Context_entity/entityfields/contexttemplateplaceofuse/children/invertblacklist_param/valueProcess.js</valueProcess>
+          <expose v="true" />
+        </entityParameter>
+        <entityParameter>
+          <name>Blacklist_param</name>
+          <expose v="true" />
+        </entityParameter>
+      </children>
       <dependencies>
         <entityDependency>
           <name>423a7a33-02f4-4975-94fd-fa0c21278e3b</name>
@@ -171,17 +182,6 @@
           <isConsumer v="false" />
         </entityDependency>
       </dependencies>
-      <children>
-        <entityParameter>
-          <name>InvertBlacklist_param</name>
-          <valueProcess>%aditoprj%/entity/Context_entity/entityfields/contexttemplateplaceofuse/children/invertblacklist_param/valueProcess.js</valueProcess>
-          <expose v="true" />
-        </entityParameter>
-        <entityParameter>
-          <name>Blacklist_param</name>
-          <expose v="true" />
-        </entityParameter>
-      </children>
     </entityProvider>
     <entityProvider>
       <name>#PROVIDER_AGGREGATES</name>
diff --git a/entity/Countries_Entity/Countries_Entity.aod b/entity/Countries_Entity/Countries_Entity.aod
index 9a4408cb03c..1b19a2841ca 100644
--- a/entity/Countries_Entity/Countries_Entity.aod
+++ b/entity/Countries_Entity/Countries_Entity.aod
@@ -16,6 +16,18 @@
       <name>ISO2Name</name>
       <lookupIdfield>ISO2</lookupIdfield>
       <documentation>%aditoprj%/entity/Countries_Entity/entityfields/iso2name/documentation.adoc</documentation>
+      <children>
+        <entityParameter>
+          <name>Key_param</name>
+          <valueProcess>%aditoprj%/entity/Countries_Entity/entityfields/iso2name/children/key_param/valueProcess.js</valueProcess>
+          <expose v="false" />
+        </entityParameter>
+        <entityParameter>
+          <name>Value_param</name>
+          <valueProcess>%aditoprj%/entity/Countries_Entity/entityfields/iso2name/children/value_param/valueProcess.js</valueProcess>
+          <expose v="false" />
+        </entityParameter>
+      </children>
       <dependencies>
         <entityDependency>
           <name>83e8a2e6-aa80-4b35-a0ad-8dad483ed428</name>
@@ -30,18 +42,6 @@
           <isConsumer v="false" />
         </entityDependency>
       </dependencies>
-      <children>
-        <entityParameter>
-          <name>Key_param</name>
-          <valueProcess>%aditoprj%/entity/Countries_Entity/entityfields/iso2name/children/key_param/valueProcess.js</valueProcess>
-          <expose v="false" />
-        </entityParameter>
-        <entityParameter>
-          <name>Value_param</name>
-          <valueProcess>%aditoprj%/entity/Countries_Entity/entityfields/iso2name/children/value_param/valueProcess.js</valueProcess>
-          <expose v="false" />
-        </entityParameter>
-      </children>
     </entityProvider>
     <entityParameter>
       <name>Key_param</name>
diff --git a/entity/DSGVOInfo_entity/DSGVOInfo_entity.aod b/entity/DSGVOInfo_entity/DSGVOInfo_entity.aod
index 9a090c1ee2c..c170fcd06fc 100644
--- a/entity/DSGVOInfo_entity/DSGVOInfo_entity.aod
+++ b/entity/DSGVOInfo_entity/DSGVOInfo_entity.aod
@@ -83,31 +83,31 @@
     </entityField>
     <entityConsumer>
       <name>KeywordDeadline</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>KeywordEntry_entity</entityName>
-        <fieldName>SpecificContainerKeywords</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
           <valueProcess>%aditoprj%/entity/DSGVOInfo_entity/entityfields/keyworddeadline/children/containername_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>KeywordTransmission</name>
       <dependency>
         <name>dependency</name>
         <entityName>KeywordEntry_entity</entityName>
         <fieldName>SpecificContainerKeywords</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>KeywordTransmission</name>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
           <valueProcess>%aditoprj%/entity/DSGVOInfo_entity/entityfields/keywordtransmission/children/containername_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>SpecificContainerKeywords</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>TRANSMISSION</name>
@@ -140,17 +140,17 @@
     </entityConsumer>
     <entityConsumer>
       <name>KeywordGuarantee</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>KeywordEntry_entity</entityName>
-        <fieldName>SpecificContainerKeywords</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
           <valueProcess>%aditoprj%/entity/DSGVOInfo_entity/entityfields/keywordguarantee/children/containername_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>SpecificContainerKeywords</fieldName>
+      </dependency>
     </entityConsumer>
     <entityProvider>
       <name>#PROVIDER_AGGREGATES</name>
diff --git a/entity/DSGVO_entity/DSGVO_entity.aod b/entity/DSGVO_entity/DSGVO_entity.aod
index 19cefc3a19e..a6445e18ca6 100644
--- a/entity/DSGVO_entity/DSGVO_entity.aod
+++ b/entity/DSGVO_entity/DSGVO_entity.aod
@@ -84,11 +84,6 @@
     </entityField>
     <entityConsumer>
       <name>KeywordDSGVOPurpose</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>KeywordEntry_entity</entityName>
-        <fieldName>SpecificContainerKeywords</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
@@ -96,20 +91,25 @@
           <valueProcess>%aditoprj%/entity/DSGVO_entity/entityfields/keyworddsgvopurpose/children/containername_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>KeywordDSGVOStatuoritysource</name>
       <dependency>
         <name>dependency</name>
         <entityName>KeywordEntry_entity</entityName>
         <fieldName>SpecificContainerKeywords</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>KeywordDSGVOStatuoritysource</name>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
           <valueProcess>%aditoprj%/entity/DSGVO_entity/entityfields/keyworddsgvostatuoritysource/children/containername_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>SpecificContainerKeywords</fieldName>
+      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>Communications</name>
@@ -181,17 +181,17 @@
     </entityField>
     <entityConsumer>
       <name>KeywordDSGVOType</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>KeywordEntry_entity</entityName>
-        <fieldName>SpecificContainerKeywords</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
           <valueProcess>%aditoprj%/entity/DSGVO_entity/entityfields/keyworddsgvotype/children/containername_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>SpecificContainerKeywords</fieldName>
+      </dependency>
     </entityConsumer>
     <entityProvider>
       <name>DSGVOEntries</name>
diff --git a/entity/DescriptionTranslation_entity/DescriptionTranslation_entity.aod b/entity/DescriptionTranslation_entity/DescriptionTranslation_entity.aod
index 83aa32b9731..125b89eb929 100644
--- a/entity/DescriptionTranslation_entity/DescriptionTranslation_entity.aod
+++ b/entity/DescriptionTranslation_entity/DescriptionTranslation_entity.aod
@@ -40,17 +40,17 @@
     </entityField>
     <entityConsumer>
       <name>Languages</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Language_entity</entityName>
-        <fieldName>ISO3NameFiltered</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ExcludedIds_param</name>
           <valueProcess>%aditoprj%/entity/DescriptionTranslation_entity/entityfields/languages/children/excludedids_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Language_entity</entityName>
+        <fieldName>ISO3NameFiltered</fieldName>
+      </dependency>
     </entityConsumer>
     <entityParameter>
       <name>ObjectType_param</name>
diff --git a/entity/DistrictResponsible_entity/DistrictResponsible_entity.aod b/entity/DistrictResponsible_entity/DistrictResponsible_entity.aod
index 4062bb8fd40..542e050c641 100644
--- a/entity/DistrictResponsible_entity/DistrictResponsible_entity.aod
+++ b/entity/DistrictResponsible_entity/DistrictResponsible_entity.aod
@@ -37,11 +37,6 @@
     </entityField>
     <entityConsumer>
       <name>Departments</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Attribute_entity</entityName>
-        <fieldName>SpecificAttribute</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ParentId_param</name>
@@ -49,6 +44,11 @@
           <description>parent id, this is used for filtering by the parent in the content process</description>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Attribute_entity</entityName>
+        <fieldName>SpecificAttribute</fieldName>
+      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>Employees</name>
@@ -90,14 +90,6 @@
       <lookupIdfield>DISTRICTRESPONSIBLEID</lookupIdfield>
       <documentation>%aditoprj%/entity/DistrictResponsible_entity/entityfields/districtresponsibles/documentation.adoc</documentation>
       <titlePlural>Responsibles</titlePlural>
-      <dependencies>
-        <entityDependency>
-          <name>ef26fdb6-5fcf-416e-bcc8-380b5751b523</name>
-          <entityName>District_entity</entityName>
-          <fieldName>DistrictResponsibles</fieldName>
-          <isConsumer v="false" />
-        </entityDependency>
-      </dependencies>
       <children>
         <entityParameter>
           <name>DistrictId_param</name>
@@ -108,6 +100,14 @@
           <expose v="false" />
         </entityParameter>
       </children>
+      <dependencies>
+        <entityDependency>
+          <name>ef26fdb6-5fcf-416e-bcc8-380b5751b523</name>
+          <entityName>District_entity</entityName>
+          <fieldName>DistrictResponsibles</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+      </dependencies>
     </entityProvider>
     <entityParameter>
       <name>DistrictId_param</name>
@@ -116,25 +116,20 @@
     </entityParameter>
     <entityConsumer>
       <name>LogHistories</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>LogHistory_entity</entityName>
-        <fieldName>LogHistoryProvider</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>tablenames_param</name>
           <valueProcess>%aditoprj%/entity/DistrictResponsible_entity/entityfields/loghistories/children/tablenames_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>Documents</name>
       <dependency>
         <name>dependency</name>
-        <entityName>Document_entity</entityName>
-        <fieldName>Documents</fieldName>
+        <entityName>LogHistory_entity</entityName>
+        <fieldName>LogHistoryProvider</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>Documents</name>
       <children>
         <entityParameter>
           <name>AssignmentRowId_param</name>
@@ -145,6 +140,11 @@
           <valueProcess>%aditoprj%/entity/DistrictResponsible_entity/entityfields/documents/children/assignmenttable_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Document_entity</entityName>
+        <fieldName>Documents</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>departmentAttributeName</name>
@@ -159,6 +159,12 @@
       <targetContextField>targetContext</targetContextField>
       <targetIdField>EMPLOYEE_CONTACT_ID</targetIdField>
       <documentation>%aditoprj%/entity/DistrictResponsible_entity/entityfields/organisationresponsibles/documentation.adoc</documentation>
+      <children>
+        <entityParameter>
+          <name>DistrictId_param</name>
+          <expose v="false" />
+        </entityParameter>
+      </children>
       <dependencies>
         <entityDependency>
           <name>9c2fe0da-9456-44ef-ac6c-28ac234b35f7</name>
@@ -173,12 +179,6 @@
           <isConsumer v="false" />
         </entityDependency>
       </dependencies>
-      <children>
-        <entityParameter>
-          <name>DistrictId_param</name>
-          <expose v="false" />
-        </entityParameter>
-      </children>
     </entityProvider>
     <entityParameter>
       <name>OrgUid_param</name>
diff --git a/entity/District_entity/District_entity.aod b/entity/District_entity/District_entity.aod
index e775acd3c22..8ae74f7b156 100644
--- a/entity/District_entity/District_entity.aod
+++ b/entity/District_entity/District_entity.aod
@@ -82,14 +82,6 @@
       <documentation>%aditoprj%/entity/District_entity/entityfields/responsibledistricts/documentation.adoc</documentation>
       <titlePlural>Responsible Districts</titlePlural>
       <recordContainer>db</recordContainer>
-      <dependencies>
-        <entityDependency>
-          <name>291c0ca4-5a68-45f5-80a7-745c7df56d7c</name>
-          <entityName>DistrictResponsible_entity</entityName>
-          <fieldName>Districts</fieldName>
-          <isConsumer v="false" />
-        </entityDependency>
-      </dependencies>
       <children>
         <entityParameter>
           <name>ExcludedDistrictIds_param</name>
@@ -100,6 +92,14 @@
           <mandatory v="true" />
         </entityParameter>
       </children>
+      <dependencies>
+        <entityDependency>
+          <name>291c0ca4-5a68-45f5-80a7-745c7df56d7c</name>
+          <entityName>DistrictResponsible_entity</entityName>
+          <fieldName>Districts</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+      </dependencies>
     </entityProvider>
     <entityConsumer>
       <name>Languages</name>
@@ -111,17 +111,17 @@
     </entityConsumer>
     <entityConsumer>
       <name>DistrictResponsibles</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>DistrictResponsible_entity</entityName>
-        <fieldName>DistrictResponsibles</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>DistrictId_param</name>
           <valueProcess>%aditoprj%/entity/District_entity/entityfields/districtresponsibles/children/districtid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>DistrictResponsible_entity</entityName>
+        <fieldName>DistrictResponsibles</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>USER_NEW</name>
@@ -142,17 +142,17 @@
     <entityConsumer>
       <name>Organisations</name>
       <refreshParent v="true" />
-      <dependency>
-        <name>dependency</name>
-        <entityName>Organisation_entity</entityName>
-        <fieldName>Organisations</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>FilterPreSet_param</name>
           <valueProcess>%aditoprj%/entity/District_entity/entityfields/organisations/children/filterpreset_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Organisation_entity</entityName>
+        <fieldName>Organisations</fieldName>
+      </dependency>
     </entityConsumer>
     <entityFieldGroup>
       <name>DISTRICT_NUMBER_fieldGroup</name>
@@ -164,11 +164,6 @@
     </entityFieldGroup>
     <entityConsumer>
       <name>Documents</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Document_entity</entityName>
-        <fieldName>Documents</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>AssignmentRowId_param</name>
@@ -179,6 +174,11 @@
           <valueProcess>%aditoprj%/entity/District_entity/entityfields/documents/children/assignmenttable_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Document_entity</entityName>
+        <fieldName>Documents</fieldName>
+      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>LogHistories</name>
@@ -217,21 +217,27 @@
     </entityProvider>
     <entityConsumer>
       <name>ParentDistricts</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>#ENTITY</entityName>
-        <fieldName>ValidParentDistricts</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ExcludedDistrictIds_param</name>
           <valueProcess>%aditoprj%/entity/District_entity/entityfields/parentdistricts/children/excludeddistrictids_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>#ENTITY</entityName>
+        <fieldName>ValidParentDistricts</fieldName>
+      </dependency>
     </entityConsumer>
     <entityProvider>
       <name>ValidParentDistricts</name>
       <documentation>%aditoprj%/entity/District_entity/entityfields/validparentdistricts/documentation.adoc</documentation>
+      <children>
+        <entityParameter>
+          <name>DistrictsByContactId_param</name>
+          <expose v="false" />
+        </entityParameter>
+      </children>
       <dependencies>
         <entityDependency>
           <name>8b0738a4-e4cd-4f9e-8df1-f499046c81bf</name>
@@ -240,12 +246,6 @@
           <isConsumer v="false" />
         </entityDependency>
       </dependencies>
-      <children>
-        <entityParameter>
-          <name>DistrictsByContactId_param</name>
-          <expose v="false" />
-        </entityParameter>
-      </children>
     </entityProvider>
     <entityParameter>
       <name>ExcludedDistrictIds_param</name>
diff --git a/entity/DocumentTemplateLink_entity/DocumentTemplateLink_entity.aod b/entity/DocumentTemplateLink_entity/DocumentTemplateLink_entity.aod
index e848d6cbed3..045e605d322 100644
--- a/entity/DocumentTemplateLink_entity/DocumentTemplateLink_entity.aod
+++ b/entity/DocumentTemplateLink_entity/DocumentTemplateLink_entity.aod
@@ -51,11 +51,6 @@
     </entityParameter>
     <entityConsumer>
       <name>Attachments</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>DocumentTemplate_entity</entityName>
-        <fieldName>Attachments</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>DocumentTemplateType_param</name>
@@ -63,20 +58,17 @@
           <valueProcess>%aditoprj%/entity/DocumentTemplateLink_entity/entityfields/attachments/children/documenttemplatetype_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>DocumentTemplate_entity</entityName>
+        <fieldName>Attachments</fieldName>
+      </dependency>
     </entityConsumer>
     <entityProvider>
       <name>Links</name>
       <targetIdField>DOCUMENTTEMPLATE_ID_CHILD</targetIdField>
       <documentation>%aditoprj%/entity/DocumentTemplateLink_entity/entityfields/links/documentation.adoc</documentation>
       <recordContainer>db</recordContainer>
-      <dependencies>
-        <entityDependency>
-          <name>db3b7e04-ca3b-4205-a1d3-5e5e5cb13073</name>
-          <entityName>DocumentTemplate_entity</entityName>
-          <fieldName>Links</fieldName>
-          <isConsumer v="false" />
-        </entityDependency>
-      </dependencies>
       <children>
         <entityParameter>
           <name>DocumentId_param</name>
@@ -87,6 +79,14 @@
           <expose v="true" />
         </entityParameter>
       </children>
+      <dependencies>
+        <entityDependency>
+          <name>db3b7e04-ca3b-4205-a1d3-5e5e5cb13073</name>
+          <entityName>DocumentTemplate_entity</entityName>
+          <fieldName>Links</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+      </dependencies>
     </entityProvider>
     <entityParameter>
       <name>Type_param</name>
diff --git a/entity/DocumentTemplateTypeCategory_entity/DocumentTemplateTypeCategory_entity.aod b/entity/DocumentTemplateTypeCategory_entity/DocumentTemplateTypeCategory_entity.aod
index bea4c1751d8..c6fa4c852db 100644
--- a/entity/DocumentTemplateTypeCategory_entity/DocumentTemplateTypeCategory_entity.aod
+++ b/entity/DocumentTemplateTypeCategory_entity/DocumentTemplateTypeCategory_entity.aod
@@ -32,6 +32,12 @@
       <lookupIdfield>KEYID</lookupIdfield>
       <documentation>%aditoprj%/entity/DocumentTemplateTypeCategory_entity/entityfields/bycategory/documentation.adoc</documentation>
       <recordContainer>db</recordContainer>
+      <children>
+        <entityParameter>
+          <name>usageFilter_param</name>
+          <expose v="true" />
+        </entityParameter>
+      </children>
       <dependencies>
         <entityDependency>
           <name>5eb6b17c-8c13-48df-84d5-a949b7d21cf3</name>
@@ -40,12 +46,6 @@
           <isConsumer v="false" />
         </entityDependency>
       </dependencies>
-      <children>
-        <entityParameter>
-          <name>usageFilter_param</name>
-          <expose v="true" />
-        </entityParameter>
-      </children>
     </entityProvider>
     <entityProvider>
       <name>#PROVIDER_AGGREGATES</name>
diff --git a/entity/DocumentTemplate_entity/DocumentTemplate_entity.aod b/entity/DocumentTemplate_entity/DocumentTemplate_entity.aod
index dbb9e49a3b6..b19bc7ae52f 100644
--- a/entity/DocumentTemplate_entity/DocumentTemplate_entity.aod
+++ b/entity/DocumentTemplate_entity/DocumentTemplate_entity.aod
@@ -94,11 +94,6 @@
     </entityField>
     <entityConsumer>
       <name>Documents</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Document_entity</entityName>
-        <fieldName>Documents</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>AssignmentTable_param</name>
@@ -109,6 +104,11 @@
           <valueProcess>%aditoprj%/entity/DocumentTemplate_entity/entityfields/documents/children/assignmentrowid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Document_entity</entityName>
+        <fieldName>Documents</fieldName>
+      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>Languages</name>
@@ -120,27 +120,22 @@
     </entityConsumer>
     <entityConsumer>
       <name>KeywordDocumentTemplateType</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>KeywordEntry_entity</entityName>
-        <fieldName>SpecificContainerKeywords</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
           <valueProcess>%aditoprj%/entity/DocumentTemplate_entity/entityfields/keyworddocumenttemplatetype/children/containername_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>SpecificContainerKeywords</fieldName>
+      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>Attributes</name>
       <stateProcess>%aditoprj%/entity/DocumentTemplate_entity/entityfields/attributes/stateProcess.js</stateProcess>
       <onValidation>%aditoprj%/entity/DocumentTemplate_entity/entityfields/attributes/onValidation.js</onValidation>
-      <dependency>
-        <name>dependency</name>
-        <entityName>AttributeRelation_entity</entityName>
-        <fieldName>AttributeRelations</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ObjectRowId_param</name>
@@ -151,6 +146,11 @@
           <valueProcess>%aditoprj%/entity/DocumentTemplate_entity/entityfields/attributes/children/objecttype_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>AttributeRelation_entity</entityName>
+        <fieldName>AttributeRelations</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>Content</name>
@@ -176,11 +176,6 @@
     </entityField>
     <entityConsumer>
       <name>DocumentTemplateTypeCategory</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>DocumentTemplateTypeCategory_entity</entityName>
-        <fieldName>ByCategory</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>usageFilter_param</name>
@@ -188,6 +183,11 @@
           <expose v="true" />
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>DocumentTemplateTypeCategory_entity</entityName>
+        <fieldName>ByCategory</fieldName>
+      </dependency>
     </entityConsumer>
     <entityProvider>
       <name>Attachments</name>
@@ -208,11 +208,6 @@
     <entityConsumer>
       <name>Links</name>
       <stateProcess>%aditoprj%/entity/DocumentTemplate_entity/entityfields/links/stateProcess.js</stateProcess>
-      <dependency>
-        <name>dependency</name>
-        <entityName>DocumentTemplateLink_entity</entityName>
-        <fieldName>Links</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>DocumentId_param</name>
@@ -225,6 +220,11 @@
           <expose v="true" />
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>DocumentTemplateLink_entity</entityName>
+        <fieldName>Links</fieldName>
+      </dependency>
     </entityConsumer>
     <entityParameter>
       <name>DocumentTemplateTypeClassification_param</name>
@@ -234,6 +234,12 @@
     <entityProvider>
       <name>DocumentTemplateProvider</name>
       <documentation>%aditoprj%/entity/DocumentTemplate_entity/entityfields/documenttemplateprovider/documentation.adoc</documentation>
+      <children>
+        <entityParameter>
+          <name>ComingFrom_param</name>
+          <expose v="true" />
+        </entityParameter>
+      </children>
       <dependencies>
         <entityDependency>
           <name>9c10883d-eb73-4587-b758-693a66367a4c</name>
@@ -278,12 +284,6 @@
           <isConsumer v="false" />
         </entityDependency>
       </dependencies>
-      <children>
-        <entityParameter>
-          <name>ComingFrom_param</name>
-          <expose v="true" />
-        </entityParameter>
-      </children>
     </entityProvider>
     <entityParameter>
       <name>DocumentTemplateType_param</name>
@@ -322,11 +322,6 @@
       <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>
-        <fieldName>DocumentTemplatePlaceOfUse</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>DocumentTemplatePlaceOfUse_param</name>
@@ -334,6 +329,11 @@
           <expose v="true" />
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>DocumentTemplatePlaceOfUse_entity</entityName>
+        <fieldName>DocumentTemplatePlaceOfUse</fieldName>
+      </dependency>
     </entityConsumer>
     <entityParameter>
       <name>ComingFrom_param</name>
diff --git a/entity/DuplicateScanner_entity/DuplicateScanner_entity.aod b/entity/DuplicateScanner_entity/DuplicateScanner_entity.aod
index fb343c9aa35..b03785e2839 100644
--- a/entity/DuplicateScanner_entity/DuplicateScanner_entity.aod
+++ b/entity/DuplicateScanner_entity/DuplicateScanner_entity.aod
@@ -74,17 +74,17 @@
     </entityField>
     <entityConsumer>
       <name>ScannerResultFieldsConfig_Consumer</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>DuplicateScannerResultFieldConfig_entity</entityName>
-        <fieldName>ScannerResultFieldConfigProvider</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>DuplicateScannerId_param</name>
           <valueProcess>%aditoprj%/entity/DuplicateScanner_entity/entityfields/scannerresultfieldsconfig_consumer/children/duplicatescannerid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>DuplicateScannerResultFieldConfig_entity</entityName>
+        <fieldName>ScannerResultFieldConfigProvider</fieldName>
+      </dependency>
     </entityConsumer>
     <entityActionGroup>
       <name>RunActionGroup</name>
diff --git a/entity/Duplicates_entity/Duplicates_entity.aod b/entity/Duplicates_entity/Duplicates_entity.aod
index 54ee932a323..01016698641 100644
--- a/entity/Duplicates_entity/Duplicates_entity.aod
+++ b/entity/Duplicates_entity/Duplicates_entity.aod
@@ -42,11 +42,6 @@
     </entityProvider>
     <entityConsumer>
       <name>SelfPersonDuplicatesConsumer</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Duplicates_entity</entityName>
-        <fieldName>SelfPersonDuplicatesProvider</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>TargetEntity</name>
@@ -58,6 +53,11 @@
           <valueProcess>%aditoprj%/entity/Duplicates_entity/entityfields/selfpersonduplicatesconsumer/children/clusterid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Duplicates_entity</entityName>
+        <fieldName>SelfPersonDuplicatesProvider</fieldName>
+      </dependency>
     </entityConsumer>
     <entityParameter>
       <name>TargetEntity</name>
@@ -66,11 +66,6 @@
     </entityParameter>
     <entityConsumer>
       <name>SelfOrganisationDuplicatesConsumer</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Duplicates_entity</entityName>
-        <fieldName>SelfOrganisationDuplicatesProvider</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>TargetEntity</name>
@@ -81,6 +76,11 @@
           <valueProcess>%aditoprj%/entity/Duplicates_entity/entityfields/selforganisationduplicatesconsumer/children/clusterid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Duplicates_entity</entityName>
+        <fieldName>SelfOrganisationDuplicatesProvider</fieldName>
+      </dependency>
     </entityConsumer>
     <entityProvider>
       <name>SelfOrganisationDuplicatesProvider</name>
@@ -88,11 +88,6 @@
     </entityProvider>
     <entityConsumer>
       <name>DuplicatesUnrelatedPersonConsumer</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>DuplicatesUnrelated_entity</entityName>
-        <fieldName>UnrelatedPersonsProvider</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>TargetEntity</name>
@@ -103,17 +98,17 @@
           <valueProcess>%aditoprj%/entity/Duplicates_entity/entityfields/duplicatesunrelatedpersonconsumer/children/clusterid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>DuplicatesUnrelated_entity</entityName>
+        <fieldName>UnrelatedPersonsProvider</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>CLUSTER_ID</name>
     </entityField>
     <entityConsumer>
       <name>DuplicatePersonsConsumer</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Person_entity</entityName>
-        <fieldName>NonselfDuplicates</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>OnlyShowContactIds_param</name>
@@ -124,6 +119,11 @@
           <valueProcess>%aditoprj%/entity/Duplicates_entity/entityfields/duplicatepersonsconsumer/children/duplicateactionscontrol_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Person_entity</entityName>
+        <fieldName>NonselfDuplicates</fieldName>
+      </dependency>
     </entityConsumer>
     <entityActionGroup>
       <name>DuplicateClusterActionGroup</name>
@@ -140,11 +140,6 @@
     </entityActionGroup>
     <entityConsumer>
       <name>DuplicatesUnrelatedOrganisationConsumer</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>DuplicatesUnrelated_entity</entityName>
-        <fieldName>UnrelatedOrganisationsProvider</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>TargetEntity</name>
@@ -155,6 +150,11 @@
           <valueProcess>%aditoprj%/entity/Duplicates_entity/entityfields/duplicatesunrelatedorganisationconsumer/children/clusterid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>DuplicatesUnrelated_entity</entityName>
+        <fieldName>UnrelatedOrganisationsProvider</fieldName>
+      </dependency>
     </entityConsumer>
     <entityActionGroup>
       <name>PersonOpenClusterDetailActionGroup</name>
@@ -186,11 +186,6 @@
     </entityActionGroup>
     <entityConsumer>
       <name>DuplicateOrganisationsConsumer</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Organisation_entity</entityName>
-        <fieldName>NonselfDuplicates</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>DuplicateActionsControl_param</name>
@@ -201,6 +196,11 @@
           <valueProcess>%aditoprj%/entity/Duplicates_entity/entityfields/duplicateorganisationsconsumer/children/onlyshowcontactids_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Organisation_entity</entityName>
+        <fieldName>NonselfDuplicates</fieldName>
+      </dependency>
     </entityConsumer>
     <entityProvider>
       <name>#PROVIDER_AGGREGATES</name>
diff --git a/entity/EmployeeRole_entity/EmployeeRole_entity.aod b/entity/EmployeeRole_entity/EmployeeRole_entity.aod
index 8bf5d69b236..a3ed777f95a 100644
--- a/entity/EmployeeRole_entity/EmployeeRole_entity.aod
+++ b/entity/EmployeeRole_entity/EmployeeRole_entity.aod
@@ -26,6 +26,13 @@
       <name>EmployeeRoles</name>
       <targetContextField>TARGETCONTEXT</targetContextField>
       <targetIdField>UID</targetIdField>
+      <children>
+        <entityParameter>
+          <name>UserTitle_param</name>
+          <expose v="true" />
+          <mandatory v="true" />
+        </entityParameter>
+      </children>
       <dependencies>
         <entityDependency>
           <name>3bcec57a-7165-4773-9253-5ecab26ee3f4</name>
@@ -34,13 +41,6 @@
           <isConsumer v="false" />
         </entityDependency>
       </dependencies>
-      <children>
-        <entityParameter>
-          <name>UserTitle_param</name>
-          <expose v="true" />
-          <mandatory v="true" />
-        </entityParameter>
-      </children>
     </entityProvider>
     <entityField>
       <name>ROLE</name>
@@ -51,17 +51,17 @@
     </entityField>
     <entityConsumer>
       <name>Roles</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Role_entity</entityName>
-        <fieldName>FilteredRoles</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ExcludeRoles_param</name>
           <valueProcess>%aditoprj%/entity/EmployeeRole_entity/entityfields/roles/children/excluderoles_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Role_entity</entityName>
+        <fieldName>FilteredRoles</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>TARGETCONTEXT</name>
diff --git a/entity/Employee_entity/Employee_entity.aod b/entity/Employee_entity/Employee_entity.aod
index bc177161e35..c17ea53f45b 100644
--- a/entity/Employee_entity/Employee_entity.aod
+++ b/entity/Employee_entity/Employee_entity.aod
@@ -111,11 +111,6 @@
     <entityConsumer>
       <name>Attributes</name>
       <onValidation>%aditoprj%/entity/Employee_entity/entityfields/attributes/onValidation.js</onValidation>
-      <dependency>
-        <name>dependency</name>
-        <entityName>AttributeRelation_entity</entityName>
-        <fieldName>AttributeRelations</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ObjectRowId_param</name>
@@ -126,6 +121,11 @@
           <valueProcess>%aditoprj%/entity/Employee_entity/entityfields/attributes/children/objecttype_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>AttributeRelation_entity</entityName>
+        <fieldName>AttributeRelations</fieldName>
+      </dependency>
     </entityConsumer>
     <entityFieldGroup>
       <name>NAME_fieldGroup</name>
@@ -156,25 +156,20 @@
     </entityField>
     <entityConsumer>
       <name>EmployeeRoles</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>EmployeeRole_entity</entityName>
-        <fieldName>EmployeeRoles</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>UserTitle_param</name>
           <valueProcess>%aditoprj%/entity/Employee_entity/entityfields/employeeroles/children/usertitle_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>AttributeTree</name>
       <dependency>
         <name>dependency</name>
-        <entityName>AttributeRelation_entity</entityName>
-        <fieldName>TreeProvider</fieldName>
+        <entityName>EmployeeRole_entity</entityName>
+        <fieldName>EmployeeRoles</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>AttributeTree</name>
       <children>
         <entityParameter>
           <name>ObjectRowId_param</name>
@@ -185,15 +180,15 @@
           <valueProcess>%aditoprj%/entity/Employee_entity/entityfields/attributetree/children/objecttype_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>AttributeRelation_entity</entityName>
+        <fieldName>TreeProvider</fieldName>
+      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>Documents</name>
       <selectionMode>MULTI</selectionMode>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Document_entity</entityName>
-        <fieldName>Documents</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>AssignmentTable_param</name>
@@ -204,11 +199,22 @@
           <valueProcess>%aditoprj%/entity/Employee_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>Employees</name>
       <lookupIdfield>CONTACT_ID</lookupIdfield>
       <filterVariablesProcess>%aditoprj%/entity/Employee_entity/entityfields/employees/filterVariablesProcess.js</filterVariablesProcess>
+      <children>
+        <entityParameter>
+          <name>OnlyActives_param</name>
+          <valueProcess>%aditoprj%/entity/Employee_entity/entityfields/employees/children/onlyactives_param/valueProcess.js</valueProcess>
+        </entityParameter>
+      </children>
       <dependencies>
         <entityDependency>
           <name>0ca415b9-a940-424e-bee8-05c007b20659</name>
@@ -271,26 +277,20 @@
           <isConsumer v="false" />
         </entityDependency>
       </dependencies>
-      <children>
-        <entityParameter>
-          <name>OnlyActives_param</name>
-          <valueProcess>%aditoprj%/entity/Employee_entity/entityfields/employees/children/onlyactives_param/valueProcess.js</valueProcess>
-        </entityParameter>
-      </children>
     </entityProvider>
     <entityConsumer>
       <name>Departments</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Attribute_entity</entityName>
-        <fieldName>SpecificAttribute</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ParentId_param</name>
           <valueProcess>%aditoprj%/entity/Employee_entity/entityfields/departments/children/parentid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Attribute_entity</entityName>
+        <fieldName>SpecificAttribute</fieldName>
+      </dependency>
     </entityConsumer>
     <entityActionField>
       <name>openAdminView</name>
@@ -301,17 +301,17 @@
     </entityActionField>
     <entityConsumer>
       <name>PossibleRoles</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Role_entity</entityName>
-        <fieldName>FilteredRoles</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ExcludeRoles_param</name>
           <valueProcess>%aditoprj%/entity/Employee_entity/entityfields/possibleroles/children/excluderoles_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Role_entity</entityName>
+        <fieldName>FilteredRoles</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>SHORT_UID</name>
@@ -352,31 +352,31 @@
     <entityConsumer>
       <name>MyPermission</name>
       <refreshParent v="false" />
-      <dependency>
-        <name>dependency</name>
-        <entityName>PermissionCalendar_entity</entityName>
-        <fieldName>Permissions</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>PermissionProcurer_param</name>
           <valueProcess>%aditoprj%/entity/Employee_entity/entityfields/mypermission/children/permissionprocurer_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>TheirPermissions</name>
       <dependency>
         <name>dependency</name>
         <entityName>PermissionCalendar_entity</entityName>
         <fieldName>Permissions</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>TheirPermissions</name>
       <children>
         <entityParameter>
           <name>PermissionDealer_param</name>
           <valueProcess>%aditoprj%/entity/Employee_entity/entityfields/theirpermissions/children/permissiondealer_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>PermissionCalendar_entity</entityName>
+        <fieldName>Permissions</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>PICTURE</name>
@@ -398,17 +398,17 @@
     </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>
+      <dependency>
+        <name>dependency</name>
+        <entityName>EmployeeToken_entity</entityName>
+        <fieldName>EmployeeTokenProvider</fieldName>
+      </dependency>
     </entityConsumer>
     <entityParameter>
       <name>EmployeeContactIdWhitelist_param</name>
diff --git a/entity/ExportTemplateSelection_entity/ExportTemplateSelection_entity.aod b/entity/ExportTemplateSelection_entity/ExportTemplateSelection_entity.aod
index 2840322c0f7..b8dcbc15cc2 100644
--- a/entity/ExportTemplateSelection_entity/ExportTemplateSelection_entity.aod
+++ b/entity/ExportTemplateSelection_entity/ExportTemplateSelection_entity.aod
@@ -29,11 +29,6 @@
     </entityParameter>
     <entityConsumer>
       <name>ExportTemplateComsumer</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>ExportTemplate_entity</entityName>
-        <fieldName>ExportTemplateIDs</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ExportTemplateIDs_param</name>
@@ -44,6 +39,11 @@
           <valueProcess>%aditoprj%/entity/ExportTemplateSelection_entity/entityfields/exporttemplatecomsumer/children/comingfrom_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>ExportTemplate_entity</entityName>
+        <fieldName>ExportTemplateIDs</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>UID</name>
diff --git a/entity/Forecast_entity/Forecast_entity.aod b/entity/Forecast_entity/Forecast_entity.aod
index 75fd4c7ae92..7487314f355 100644
--- a/entity/Forecast_entity/Forecast_entity.aod
+++ b/entity/Forecast_entity/Forecast_entity.aod
@@ -53,11 +53,6 @@
     </entityField>
     <entityConsumer>
       <name>KeywordProductGroupcodes</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>KeywordEntry_entity</entityName>
-        <fieldName>SpecificContainerKeywords</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
@@ -65,6 +60,11 @@
           <expose v="false" />
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>SpecificContainerKeywords</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>OBJECT_TYPE</name>
@@ -75,11 +75,6 @@
     </entityField>
     <entityConsumer>
       <name>Objects</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Object_entity</entityName>
-        <fieldName>AllObjects</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ObjectType_param</name>
@@ -88,6 +83,11 @@
           <mandatory v="true" />
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Object_entity</entityName>
+        <fieldName>AllObjects</fieldName>
+      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>Contexts</name>
diff --git a/entity/ImportField_Entity/ImportField_Entity.aod b/entity/ImportField_Entity/ImportField_Entity.aod
index cb5bb3fb643..8b47e84bc5d 100644
--- a/entity/ImportField_Entity/ImportField_Entity.aod
+++ b/entity/ImportField_Entity/ImportField_Entity.aod
@@ -72,17 +72,17 @@
     </entityParameter>
     <entityConsumer>
       <name>KeywordImportFields</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>KeywordEntry_entity</entityName>
-        <fieldName>SpecificContainerKeywords</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
           <valueProcess>%aditoprj%/entity/ImportField_Entity/entityfields/keywordimportfields/children/containername_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>SpecificContainerKeywords</fieldName>
+      </dependency>
     </entityConsumer>
     <entityProvider>
       <name>#PROVIDER_AGGREGATES</name>
diff --git a/entity/KeywordAttributeRelation_entity/KeywordAttributeRelation_entity.aod b/entity/KeywordAttributeRelation_entity/KeywordAttributeRelation_entity.aod
index 81be338ad38..16bede930f3 100644
--- a/entity/KeywordAttributeRelation_entity/KeywordAttributeRelation_entity.aod
+++ b/entity/KeywordAttributeRelation_entity/KeywordAttributeRelation_entity.aod
@@ -51,6 +51,13 @@
       <name>AttributesForKeywordEntry</name>
       <titlePlural></titlePlural>
       <recordContainer>db</recordContainer>
+      <children>
+        <entityParameter>
+          <name>KeywordEntryId_param</name>
+          <expose v="true" />
+          <mandatory v="false" />
+        </entityParameter>
+      </children>
       <dependencies>
         <entityDependency>
           <name>490d12c0-6ace-42e5-89e1-d40b25322161</name>
@@ -59,13 +66,6 @@
           <isConsumer v="false" />
         </entityDependency>
       </dependencies>
-      <children>
-        <entityParameter>
-          <name>KeywordEntryId_param</name>
-          <expose v="true" />
-          <mandatory v="false" />
-        </entityParameter>
-      </children>
     </entityProvider>
     <entityParameter>
       <name>ContainerName_param</name>
@@ -75,11 +75,6 @@
     </entityParameter>
     <entityConsumer>
       <name>KeywordAttributes</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>KeywordAttribute_entity</entityName>
-        <fieldName>SpecificContainerKeyword</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
@@ -92,6 +87,11 @@
           <expose v="false" />
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordAttribute_entity</entityName>
+        <fieldName>SpecificContainerKeyword</fieldName>
+      </dependency>
     </entityConsumer>
     <entityParameter>
       <name>KeywordEntryId_param</name>
diff --git a/entity/KeywordAttribute_entity/KeywordAttribute_entity.aod b/entity/KeywordAttribute_entity/KeywordAttribute_entity.aod
index 660467e301e..13cb14c44b1 100644
--- a/entity/KeywordAttribute_entity/KeywordAttribute_entity.aod
+++ b/entity/KeywordAttribute_entity/KeywordAttribute_entity.aod
@@ -69,11 +69,6 @@
     </entityParameter>
     <entityConsumer>
       <name>KeywordAttributeTypes</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>KeywordEntry_entity</entityName>
-        <fieldName>SpecificContainerKeywords</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
@@ -81,6 +76,11 @@
           <expose v="false" />
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>SpecificContainerKeywords</fieldName>
+      </dependency>
     </entityConsumer>
     <entityProvider>
       <name>#PROVIDER_AGGREGATES</name>
diff --git a/entity/KnowledgeDiscussion_entity/KnowledgeDiscussion_entity.aod b/entity/KnowledgeDiscussion_entity/KnowledgeDiscussion_entity.aod
index 79d764acc09..81246e32ac3 100644
--- a/entity/KnowledgeDiscussion_entity/KnowledgeDiscussion_entity.aod
+++ b/entity/KnowledgeDiscussion_entity/KnowledgeDiscussion_entity.aod
@@ -62,11 +62,6 @@
     </entityField>
     <entityConsumer>
       <name>StatusKeyword</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>KeywordEntry_entity</entityName>
-        <fieldName>SpecificContainerKeywords</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
@@ -77,6 +72,11 @@
           <valueProcess>%aditoprj%/entity/KnowledgeDiscussion_entity/entityfields/statuskeyword/children/onlyactives_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>SpecificContainerKeywords</fieldName>
+      </dependency>
     </entityConsumer>
     <entityProvider>
       <name>ByKnowledgeId</name>
diff --git a/entity/KnowledgeLink_entity/KnowledgeLink_entity.aod b/entity/KnowledgeLink_entity/KnowledgeLink_entity.aod
index 93ad79b6566..e77405dfb65 100644
--- a/entity/KnowledgeLink_entity/KnowledgeLink_entity.aod
+++ b/entity/KnowledgeLink_entity/KnowledgeLink_entity.aod
@@ -58,17 +58,17 @@
     </entityConsumer>
     <entityConsumer>
       <name>Objects</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>ObjectProxy_entity</entityName>
-        <fieldName>FilteredObjects</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>Entity_param</name>
           <valueProcess>%aditoprj%/entity/KnowledgeLink_entity/entityfields/objects/children/entity_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>ObjectProxy_entity</entityName>
+        <fieldName>FilteredObjects</fieldName>
+      </dependency>
     </entityConsumer>
     <entityParameter>
       <name>KnowledgeManagementId_param</name>
@@ -79,14 +79,6 @@
       <targetContextField>OBJECT_TYPE</targetContextField>
       <targetIdField>ROW_ID</targetIdField>
       <documentation>%aditoprj%/entity/KnowledgeLink_entity/entityfields/byknowledgeid/documentation.adoc</documentation>
-      <dependencies>
-        <entityDependency>
-          <name>c3ed10c1-db55-4e55-9c18-2b8d400df033</name>
-          <entityName>KnowledgeManagement_entity</entityName>
-          <fieldName>LinksByKnowledgeId</fieldName>
-          <isConsumer v="false" />
-        </entityDependency>
-      </dependencies>
       <children>
         <entityParameter>
           <name>ObjectType_param</name>
@@ -97,6 +89,14 @@
           <expose v="false" />
         </entityParameter>
       </children>
+      <dependencies>
+        <entityDependency>
+          <name>c3ed10c1-db55-4e55-9c18-2b8d400df033</name>
+          <entityName>KnowledgeManagement_entity</entityName>
+          <fieldName>LinksByKnowledgeId</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+      </dependencies>
     </entityProvider>
     <entityParameter>
       <name>RowId_param</name>
diff --git a/entity/KnowledgeManagementTags_entity/KnowledgeManagementTags_entity.aod b/entity/KnowledgeManagementTags_entity/KnowledgeManagementTags_entity.aod
index 14f18612c20..94e8106d88d 100644
--- a/entity/KnowledgeManagementTags_entity/KnowledgeManagementTags_entity.aod
+++ b/entity/KnowledgeManagementTags_entity/KnowledgeManagementTags_entity.aod
@@ -15,6 +15,12 @@
     <entityProvider>
       <name>ByKnowledgeManagementId</name>
       <documentation>%aditoprj%/entity/KnowledgeManagementTags_entity/entityfields/byknowledgemanagementid/documentation.adoc</documentation>
+      <children>
+        <entityParameter>
+          <name>KnowledgeManagementId_param</name>
+          <mandatory v="true" />
+        </entityParameter>
+      </children>
       <dependencies>
         <entityDependency>
           <name>8d86a61b-0fe3-44c4-a512-e044c990fded</name>
@@ -23,12 +29,6 @@
           <isConsumer v="false" />
         </entityDependency>
       </dependencies>
-      <children>
-        <entityParameter>
-          <name>KnowledgeManagementId_param</name>
-          <mandatory v="true" />
-        </entityParameter>
-      </children>
     </entityProvider>
     <entityField>
       <name>TAG</name>
diff --git a/entity/KnowledgeManagement_entity/KnowledgeManagement_entity.aod b/entity/KnowledgeManagement_entity/KnowledgeManagement_entity.aod
index 0d58306fea5..93e235fcee3 100644
--- a/entity/KnowledgeManagement_entity/KnowledgeManagement_entity.aod
+++ b/entity/KnowledgeManagement_entity/KnowledgeManagement_entity.aod
@@ -101,32 +101,32 @@
       <refreshParent v="true" />
       <state>EDITABLE</state>
       <onValidation>%aditoprj%/entity/KnowledgeManagement_entity/entityfields/tagsbyknowledgeid/onValidation.js</onValidation>
-      <dependency>
-        <name>dependency</name>
-        <entityName>KnowledgeManagementTags_entity</entityName>
-        <fieldName>ByKnowledgeManagementId</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>KnowledgeManagementId_param</name>
           <valueProcess>%aditoprj%/entity/KnowledgeManagement_entity/entityfields/tagsbyknowledgeid/children/knowledgemanagementid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KnowledgeManagementTags_entity</entityName>
+        <fieldName>ByKnowledgeManagementId</fieldName>
+      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>DiscussionsByKnowledgeId</name>
       <refreshParent v="true" />
-      <dependency>
-        <name>dependency</name>
-        <entityName>KnowledgeDiscussion_entity</entityName>
-        <fieldName>ByKnowledgeId</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>KnowledgeId_param</name>
           <valueProcess>%aditoprj%/entity/KnowledgeManagement_entity/entityfields/discussionsbyknowledgeid/children/knowledgeid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KnowledgeDiscussion_entity</entityName>
+        <fieldName>ByKnowledgeId</fieldName>
+      </dependency>
     </entityConsumer>
     <entityProvider>
       <name>Provider</name>
@@ -142,42 +142,37 @@
     </entityConsumer>
     <entityConsumer>
       <name>KeywordKnowledgeType</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>KeywordEntry_entity</entityName>
-        <fieldName>SpecificContainerKeywords</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
           <valueProcess>%aditoprj%/entity/KnowledgeManagement_entity/entityfields/keywordknowledgetype/children/containername_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>KeywordPublish</name>
       <dependency>
         <name>dependency</name>
         <entityName>KeywordEntry_entity</entityName>
         <fieldName>SpecificContainerKeywords</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>KeywordPublish</name>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
           <valueProcess>%aditoprj%/entity/KnowledgeManagement_entity/entityfields/keywordpublish/children/containername_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>SpecificContainerKeywords</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>indexTag</name>
     </entityField>
     <entityConsumer>
       <name>LinkedDocuments</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Document_entity</entityName>
-        <fieldName>Documents</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>AssignmentTable_param</name>
@@ -188,6 +183,11 @@
           <valueProcess>%aditoprj%/entity/KnowledgeManagement_entity/entityfields/linkeddocuments/children/assignmentrowid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Document_entity</entityName>
+        <fieldName>Documents</fieldName>
+      </dependency>
     </entityConsumer>
     <entityActionField>
       <name>openEntryAsMail</name>
@@ -200,17 +200,17 @@
     <entityConsumer>
       <name>LinksByKnowledgeId</name>
       <refreshParent v="true" />
-      <dependency>
-        <name>dependency</name>
-        <entityName>KnowledgeLink_entity</entityName>
-        <fieldName>ByKnowledgeId</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>KnowledgeManagementId_param</name>
           <valueProcess>%aditoprj%/entity/KnowledgeManagement_entity/entityfields/linksbyknowledgeid/children/knowledgemanagementid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KnowledgeLink_entity</entityName>
+        <fieldName>ByKnowledgeId</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>LastChange</name>
@@ -219,17 +219,17 @@
     </entityField>
     <entityConsumer>
       <name>LogHistories</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>LogHistory_entity</entityName>
-        <fieldName>LogHistoryProvider</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>tablenames_param</name>
           <valueProcess>%aditoprj%/entity/KnowledgeManagement_entity/entityfields/loghistories/children/tablenames_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>LogHistory_entity</entityName>
+        <fieldName>LogHistoryProvider</fieldName>
+      </dependency>
     </entityConsumer>
     <entityActionField>
       <name>exportHTML_action</name>
@@ -271,11 +271,6 @@
       <name>KnowledgeRoles</name>
       <stateProcess>%aditoprj%/entity/KnowledgeManagement_entity/entityfields/knowledgeroles/stateProcess.js</stateProcess>
       <onValidation>%aditoprj%/entity/KnowledgeManagement_entity/entityfields/knowledgeroles/onValidation.js</onValidation>
-      <dependency>
-        <name>dependency</name>
-        <entityName>KnowledgeRole_entity</entityName>
-        <fieldName>KnowledgeRole</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>KnowledgeManagement_param</name>
@@ -287,14 +282,14 @@
           <expose v="true" />
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>Tasks</name>
       <dependency>
         <name>dependency</name>
-        <entityName>Task_entity</entityName>
-        <fieldName>Tasks</fieldName>
+        <entityName>KnowledgeRole_entity</entityName>
+        <fieldName>KnowledgeRole</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>Tasks</name>
       <children>
         <entityParameter>
           <name>ObjectId_param</name>
@@ -309,6 +304,11 @@
           <valueProcess>%aditoprj%/entity/KnowledgeManagement_entity/entityfields/tasks/children/presetlinks_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Task_entity</entityName>
+        <fieldName>Tasks</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>RESPONSIBLE_CONTACT_ID</name>
diff --git a/entity/KnowledgeRole_entity/KnowledgeRole_entity.aod b/entity/KnowledgeRole_entity/KnowledgeRole_entity.aod
index 427a175e7b5..fe16e94a9f9 100644
--- a/entity/KnowledgeRole_entity/KnowledgeRole_entity.aod
+++ b/entity/KnowledgeRole_entity/KnowledgeRole_entity.aod
@@ -17,17 +17,17 @@
     </entityField>
     <entityConsumer>
       <name>NewsRole</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Role_entity</entityName>
-        <fieldName>FilterRolesWithoutPermission</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ExcludeRoles_param</name>
           <valueProcess>%aditoprj%/entity/KnowledgeRole_entity/entityfields/newsrole/children/excluderoles_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Role_entity</entityName>
+        <fieldName>FilterRolesWithoutPermission</fieldName>
+      </dependency>
     </entityConsumer>
     <entityProvider>
       <name>KnowledgeRole</name>
diff --git a/entity/Language_entity/Language_entity.aod b/entity/Language_entity/Language_entity.aod
index 2afefb3f30b..6c74b7472d2 100644
--- a/entity/Language_entity/Language_entity.aod
+++ b/entity/Language_entity/Language_entity.aod
@@ -33,6 +33,12 @@
       <lookupIdfield>ISO3</lookupIdfield>
       <documentation>%aditoprj%/entity/Language_entity/entityfields/iso3name/documentation.adoc</documentation>
       <recordContainer>db</recordContainer>
+      <children>
+        <entityParameter>
+          <name>ExcludedIds_param</name>
+          <expose v="false" />
+        </entityParameter>
+      </children>
       <dependencies>
         <entityDependency>
           <name>471b099a-03ab-4c49-8372-729b1e789ecc</name>
@@ -95,17 +101,17 @@
           <isConsumer v="false" />
         </entityDependency>
       </dependencies>
-      <children>
-        <entityParameter>
-          <name>ExcludedIds_param</name>
-          <expose v="false" />
-        </entityParameter>
-      </children>
     </entityProvider>
     <entityProvider>
       <name>ISO3NameFiltered</name>
       <lookupIdfield>ISO3</lookupIdfield>
       <documentation>%aditoprj%/entity/Language_entity/entityfields/iso3namefiltered/documentation.adoc</documentation>
+      <children>
+        <entityParameter>
+          <name>ExcludedIds_param</name>
+          <expose v="true" />
+        </entityParameter>
+      </children>
       <dependencies>
         <entityDependency>
           <name>2df9d0ed-c26b-4166-9667-786a55146e05</name>
@@ -114,12 +120,6 @@
           <isConsumer v="false" />
         </entityDependency>
       </dependencies>
-      <children>
-        <entityParameter>
-          <name>ExcludedIds_param</name>
-          <expose v="true" />
-        </entityParameter>
-      </children>
     </entityProvider>
     <entityParameter>
       <name>ExcludedIds_param</name>
diff --git a/entity/LeadLog_entity/LeadLog_entity.aod b/entity/LeadLog_entity/LeadLog_entity.aod
index ca424a627c7..c5d2fde11e0 100644
--- a/entity/LeadLog_entity/LeadLog_entity.aod
+++ b/entity/LeadLog_entity/LeadLog_entity.aod
@@ -61,11 +61,6 @@
     </entityField>
     <entityConsumer>
       <name>LogDocuments</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Document_entity</entityName>
-        <fieldName>Documents</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>AssignmentName_param</name>
@@ -80,6 +75,11 @@
           <valueProcess>%aditoprj%/entity/LeadLog_entity/entityfields/logdocuments/children/assignmenttable_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/Lead_entity/Lead_entity.aod b/entity/Lead_entity/Lead_entity.aod
index 6a8a9fed949..1889a635743 100644
--- a/entity/Lead_entity/Lead_entity.aod
+++ b/entity/Lead_entity/Lead_entity.aod
@@ -77,17 +77,17 @@
     </entityField>
     <entityConsumer>
       <name>ContactId</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Person_entity</entityName>
-        <fieldName>Contact</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContactId_param</name>
           <valueProcess>%aditoprj%/entity/Lead_entity/entityfields/contactid/children/contactid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Person_entity</entityName>
+        <fieldName>Contact</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>LEADDUP_STATUS</name>
@@ -108,11 +108,6 @@
     </entityField>
     <entityConsumer>
       <name>KeywordDupStatus</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>KeywordEntry_entity</entityName>
-        <fieldName>SpecificContainerKeywords</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
@@ -120,6 +115,11 @@
           <expose v="true" />
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>SpecificContainerKeywords</fieldName>
+      </dependency>
     </entityConsumer>
     <entityProvider>
       <name>#PROVIDER_AGGREGATES</name>
diff --git a/entity/LeadimportMappingAssistant_entity/LeadimportMappingAssistant_entity.aod b/entity/LeadimportMappingAssistant_entity/LeadimportMappingAssistant_entity.aod
index f985150a0e1..f525794d52d 100644
--- a/entity/LeadimportMappingAssistant_entity/LeadimportMappingAssistant_entity.aod
+++ b/entity/LeadimportMappingAssistant_entity/LeadimportMappingAssistant_entity.aod
@@ -70,17 +70,17 @@
     </entityParameter>
     <entityConsumer>
       <name>KeywordImportFields</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>KeywordEntry_entity</entityName>
-        <fieldName>SpecificContainerKeywords</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
           <valueProcess>%aditoprj%/entity/LeadimportMappingAssistant_entity/entityfields/keywordimportfields/children/containername_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>SpecificContainerKeywords</fieldName>
+      </dependency>
     </entityConsumer>
     <entityProvider>
       <name>#PROVIDER_AGGREGATES</name>
diff --git a/entity/Leadimport_entity/Leadimport_entity.aod b/entity/Leadimport_entity/Leadimport_entity.aod
index e14d1cf8eba..141e0c172a3 100644
--- a/entity/Leadimport_entity/Leadimport_entity.aod
+++ b/entity/Leadimport_entity/Leadimport_entity.aod
@@ -105,17 +105,17 @@
     </entityField>
     <entityConsumer>
       <name>KeywordImportStatus</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>KeywordEntry_entity</entityName>
-        <fieldName>SpecificContainerKeywords</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
           <valueProcess>%aditoprj%/entity/Leadimport_entity/entityfields/keywordimportstatus/children/containername_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>SpecificContainerKeywords</fieldName>
+      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>Leadimport_Empl</name>
@@ -154,25 +154,20 @@
     </entityProvider>
     <entityConsumer>
       <name>ImportFieldID</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>ImportField_Entity</entityName>
-        <fieldName>LeadImportIds</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>LeadImportID</name>
           <valueProcess>%aditoprj%/entity/Leadimport_entity/entityfields/importfieldid/children/leadimportid/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>DocumentC</name>
       <dependency>
         <name>dependency</name>
-        <entityName>Document_entity</entityName>
-        <fieldName>Documents</fieldName>
+        <entityName>ImportField_Entity</entityName>
+        <fieldName>LeadImportIds</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>DocumentC</name>
       <children>
         <entityParameter>
           <name>AssignmentRowId_param</name>
@@ -183,28 +178,28 @@
           <valueProcess>%aditoprj%/entity/Leadimport_entity/entityfields/documentc/children/assignmenttable_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>LogHistoryC</name>
       <dependency>
         <name>dependency</name>
-        <entityName>LogHistory_entity</entityName>
-        <fieldName>LogHistoryProvider</fieldName>
+        <entityName>Document_entity</entityName>
+        <fieldName>Documents</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>LogHistoryC</name>
       <children>
         <entityParameter>
           <name>tablenames_param</name>
           <valueProcess>%aditoprj%/entity/Leadimport_entity/entityfields/loghistoryc/children/tablenames_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>Tasks</name>
       <dependency>
         <name>dependency</name>
-        <entityName>Task_entity</entityName>
-        <fieldName>Tasks</fieldName>
+        <entityName>LogHistory_entity</entityName>
+        <fieldName>LogHistoryProvider</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>Tasks</name>
       <children>
         <entityParameter>
           <name>ObjectId_param</name>
@@ -215,15 +210,15 @@
           <valueProcess>%aditoprj%/entity/Leadimport_entity/entityfields/tasks/children/rowid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Task_entity</entityName>
+        <fieldName>Tasks</fieldName>
+      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>Attributes</name>
       <onValidation>%aditoprj%/entity/Leadimport_entity/entityfields/attributes/onValidation.js</onValidation>
-      <dependency>
-        <name>dependency</name>
-        <entityName>AttributeRelation_entity</entityName>
-        <fieldName>AttributeRelations</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ObjectRowId_param</name>
@@ -234,6 +229,11 @@
           <valueProcess>%aditoprj%/entity/Leadimport_entity/entityfields/attributes/children/objecttype_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>AttributeRelation_entity</entityName>
+        <fieldName>AttributeRelations</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>UID</name>
@@ -266,45 +266,45 @@
     </entityActionField>
     <entityConsumer>
       <name>LeadTempC</name>
+      <children>
+        <entityParameter>
+          <name>LeadImportId</name>
+          <valueProcess>%aditoprj%/entity/Leadimport_entity/entityfields/leadtempc/children/leadimportid/valueProcess.js</valueProcess>
+        </entityParameter>
+      </children>
       <dependency>
         <name>dependency</name>
         <entityName>LeadTemp_entity</entityName>
         <fieldName>LeadTempP</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>LeadC</name>
       <children>
         <entityParameter>
           <name>LeadImportId</name>
-          <valueProcess>%aditoprj%/entity/Leadimport_entity/entityfields/leadtempc/children/leadimportid/valueProcess.js</valueProcess>
+          <valueProcess>%aditoprj%/entity/Leadimport_entity/entityfields/leadc/children/leadimportid/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>LeadC</name>
       <dependency>
         <name>dependency</name>
         <entityName>Lead_entity</entityName>
         <fieldName>LeadP</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>LeadLogC</name>
       <children>
         <entityParameter>
           <name>LeadImportId</name>
-          <valueProcess>%aditoprj%/entity/Leadimport_entity/entityfields/leadc/children/leadimportid/valueProcess.js</valueProcess>
+          <valueProcess>%aditoprj%/entity/Leadimport_entity/entityfields/leadlogc/children/leadimportid/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>LeadLogC</name>
       <dependency>
         <name>dependency</name>
         <entityName>LeadLog_entity</entityName>
         <fieldName>LeadLogP</fieldName>
       </dependency>
-      <children>
-        <entityParameter>
-          <name>LeadImportId</name>
-          <valueProcess>%aditoprj%/entity/Leadimport_entity/entityfields/leadlogc/children/leadimportid/valueProcess.js</valueProcess>
-        </entityParameter>
-      </children>
     </entityConsumer>
     <entityActionField>
       <name>LeadimportReset</name>
@@ -316,17 +316,17 @@
     </entityActionField>
     <entityConsumer>
       <name>LeadimportMappings</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>LeadimportMappingAssistant_entity</entityName>
-        <fieldName>LeadimportMapping</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>Leadimport_ID_param</name>
           <valueProcess>%aditoprj%/entity/Leadimport_entity/entityfields/leadimportmappings/children/leadimport_id_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>LeadimportMappingAssistant_entity</entityName>
+        <fieldName>LeadimportMapping</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>LEADIMPORT_OBJECTTYPE</name>
diff --git a/entity/Letter_entity/Letter_entity.aod b/entity/Letter_entity/Letter_entity.aod
index 5e357ba6660..6140a981138 100644
--- a/entity/Letter_entity/Letter_entity.aod
+++ b/entity/Letter_entity/Letter_entity.aod
@@ -22,11 +22,6 @@
     </entityField>
     <entityConsumer>
       <name>DocumentTemplates</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>DocumentTemplate_entity</entityName>
-        <fieldName>DocumentTemplateProvider</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>DocumentTemplateType_param</name>
@@ -37,6 +32,11 @@
           <valueProcess>%aditoprj%/entity/Letter_entity/entityfields/documenttemplates/children/comingfrom_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>DocumentTemplate_entity</entityName>
+        <fieldName>DocumentTemplateProvider</fieldName>
+      </dependency>
     </entityConsumer>
     <entityParameter>
       <name>ContactId_param</name>
diff --git a/entity/MarketingWorkflowLauncher_entity/MarketingWorkflowLauncher_entity.aod b/entity/MarketingWorkflowLauncher_entity/MarketingWorkflowLauncher_entity.aod
index 791b08d72b2..8efdde1d70c 100644
--- a/entity/MarketingWorkflowLauncher_entity/MarketingWorkflowLauncher_entity.aod
+++ b/entity/MarketingWorkflowLauncher_entity/MarketingWorkflowLauncher_entity.aod
@@ -22,11 +22,6 @@
     <entityConsumer>
       <name>WorkflowLauncherIntegration</name>
       <isOneToOneRelationship v="true" />
-      <dependency>
-        <name>dependency</name>
-        <entityName>WorkflowLauncher_entity</entityName>
-        <fieldName>Integration</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>Validationerrors_param</name>
@@ -45,6 +40,11 @@
           <valueProcess>%aditoprj%/entity/MarketingWorkflowLauncher_entity/entityfields/workflowlauncherintegration/children/targetcontext_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>WorkflowLauncher_entity</entityName>
+        <fieldName>Integration</fieldName>
+      </dependency>
     </entityConsumer>
     <entityParameter>
       <name>ObjectType_param</name>
@@ -60,11 +60,6 @@
     </entityParameter>
     <entityConsumer>
       <name>EmailTemplates</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>DocumentTemplate_entity</entityName>
-        <fieldName>DocumentTemplateProvider</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>DocumentTemplateType_param</name>
@@ -75,6 +70,11 @@
           <valueProcess>%aditoprj%/entity/MarketingWorkflowLauncher_entity/entityfields/emailtemplates/children/comingfrom_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>DocumentTemplate_entity</entityName>
+        <fieldName>DocumentTemplateProvider</fieldName>
+      </dependency>
     </entityConsumer>
   </entityFields>
   <recordContainers>
diff --git a/entity/ModuleTree_entity/ModuleTree_entity.aod b/entity/ModuleTree_entity/ModuleTree_entity.aod
index 576d1171a84..4340bcf1919 100644
--- a/entity/ModuleTree_entity/ModuleTree_entity.aod
+++ b/entity/ModuleTree_entity/ModuleTree_entity.aod
@@ -26,6 +26,16 @@
       <targetContextField>TYPE</targetContextField>
       <targetIdField>ROW_ID</targetIdField>
       <recordContainer>jdito</recordContainer>
+      <children>
+        <entityParameter>
+          <name>ContextName_param</name>
+          <expose v="true" />
+        </entityParameter>
+        <entityParameter>
+          <name>ID_param</name>
+          <expose v="true" />
+        </entityParameter>
+      </children>
       <dependencies>
         <entityDependency>
           <name>7da88ffb-4292-4fe2-88e2-dda2dc4aa625</name>
@@ -46,16 +56,6 @@
           <isConsumer v="false" />
         </entityDependency>
       </dependencies>
-      <children>
-        <entityParameter>
-          <name>ContextName_param</name>
-          <expose v="true" />
-        </entityParameter>
-        <entityParameter>
-          <name>ID_param</name>
-          <expose v="true" />
-        </entityParameter>
-      </children>
     </entityProvider>
     <entityField>
       <name>PARENT_ID</name>
diff --git a/entity/ObjectRelationType_entity/ObjectRelationType_entity.aod b/entity/ObjectRelationType_entity/ObjectRelationType_entity.aod
index a2a47eb12c2..4488b7e9c3c 100644
--- a/entity/ObjectRelationType_entity/ObjectRelationType_entity.aod
+++ b/entity/ObjectRelationType_entity/ObjectRelationType_entity.aod
@@ -30,6 +30,13 @@
     </entityParameter>
     <entityProvider>
       <name>ObjectRelationTypes</name>
+      <children>
+        <entityParameter>
+          <name>OnlyFirstSide_param</name>
+          <valueProcess>%aditoprj%/entity/ObjectRelationType_entity/entityfields/objectrelationtypes/children/onlyfirstside_param/valueProcess.js</valueProcess>
+          <expose v="false" />
+        </entityParameter>
+      </children>
       <dependencies>
         <entityDependency>
           <name>81f4567a-fc89-49fc-be86-77600cb66305</name>
@@ -38,13 +45,6 @@
           <isConsumer v="false" />
         </entityDependency>
       </dependencies>
-      <children>
-        <entityParameter>
-          <name>OnlyFirstSide_param</name>
-          <valueProcess>%aditoprj%/entity/ObjectRelationType_entity/entityfields/objectrelationtypes/children/onlyfirstside_param/valueProcess.js</valueProcess>
-          <expose v="false" />
-        </entityParameter>
-      </children>
     </entityProvider>
     <entityParameter>
       <name>OnlyFirstSide_param</name>
diff --git a/entity/ObjectTree_entity/ObjectTree_entity.aod b/entity/ObjectTree_entity/ObjectTree_entity.aod
index 4266919a6b4..7edb15c3b6b 100644
--- a/entity/ObjectTree_entity/ObjectTree_entity.aod
+++ b/entity/ObjectTree_entity/ObjectTree_entity.aod
@@ -17,6 +17,16 @@
       <name>TreeProvider</name>
       <targetContextField>TARGET_CONTEXT</targetContextField>
       <targetIdField>TARGET_ID</targetIdField>
+      <children>
+        <entityParameter>
+          <name>Uid_param</name>
+          <expose v="false" />
+        </entityParameter>
+        <entityParameter>
+          <name>RelationTypes_param</name>
+          <expose v="false" />
+        </entityParameter>
+      </children>
       <dependencies>
         <entityDependency>
           <name>f4c0605f-3ccb-4ff1-b460-7268e8553857</name>
@@ -31,16 +41,6 @@
           <isConsumer v="false" />
         </entityDependency>
       </dependencies>
-      <children>
-        <entityParameter>
-          <name>Uid_param</name>
-          <expose v="false" />
-        </entityParameter>
-        <entityParameter>
-          <name>RelationTypes_param</name>
-          <expose v="false" />
-        </entityParameter>
-      </children>
     </entityProvider>
     <entityParameter>
       <name>ObjectIds_param</name>
@@ -68,17 +68,17 @@
     </entityField>
     <entityConsumer>
       <name>ObjectRelationTypes</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>ObjectRelationType_entity</entityName>
-        <fieldName>ObjectRelationTypes</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>SourceObjectTypes_param</name>
           <valueProcess>%aditoprj%/entity/ObjectTree_entity/entityfields/objectrelationtypes/children/sourceobjecttypes_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>ObjectRelationType_entity</entityName>
+        <fieldName>ObjectRelationTypes</fieldName>
+      </dependency>
     </entityConsumer>
     <entityParameter>
       <name>ObjectTypes_param</name>
@@ -126,11 +126,6 @@
     </entityField>
     <entityConsumer>
       <name>Objects</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Object_entity</entityName>
-        <fieldName>FilteredObjects</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ObjectType_param</name>
@@ -142,6 +137,11 @@
           <valueProcess>%aditoprj%/entity/ObjectTree_entity/entityfields/objects/children/excludedobjectids_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Object_entity</entityName>
+        <fieldName>FilteredObjects</fieldName>
+      </dependency>
     </entityConsumer>
     <entityActionGroup>
       <name>alter</name>
diff --git a/entity/Object_entity/Object_entity.aod b/entity/Object_entity/Object_entity.aod
index e3633e2483c..884a3a733c3 100644
--- a/entity/Object_entity/Object_entity.aod
+++ b/entity/Object_entity/Object_entity.aod
@@ -27,6 +27,21 @@
       <targetConsumerProcess>%aditoprj%/entity/Object_entity/entityfields/allobjects/targetConsumerProcess.js</targetConsumerProcess>
       <documentation>%aditoprj%/entity/Object_entity/entityfields/allobjects/documentation.adoc</documentation>
       <recordContainer>jdito</recordContainer>
+      <children>
+        <entityParameter>
+          <name>ObjectType_param</name>
+          <expose v="true" />
+          <mandatory v="true" />
+        </entityParameter>
+        <entityParameter>
+          <name>ExcludedObjectIds_param</name>
+          <expose v="false" />
+        </entityParameter>
+        <entityParameter>
+          <name>ContactId_param</name>
+          <expose v="false" />
+        </entityParameter>
+      </children>
       <dependencies>
         <entityDependency>
           <name>445b79b3-e826-40d1-b6c2-46d62daf0818</name>
@@ -65,43 +80,23 @@
           <isConsumer v="false" />
         </entityDependency>
       </dependencies>
-      <children>
-        <entityParameter>
-          <name>ObjectType_param</name>
-          <expose v="true" />
-          <mandatory v="true" />
-        </entityParameter>
-        <entityParameter>
-          <name>ExcludedObjectIds_param</name>
-          <expose v="false" />
-        </entityParameter>
-        <entityParameter>
-          <name>ContactId_param</name>
-          <expose v="false" />
-        </entityParameter>
-      </children>
     </entityProvider>
     <entityConsumer>
       <name>Organisations</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Organisation_entity</entityName>
-        <fieldName>#PROVIDER</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ExcludedContactIds_param</name>
           <valueProcess>%aditoprj%/entity/Object_entity/entityfields/organisations/children/excludedcontactids_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>Persons</name>
       <dependency>
         <name>dependency</name>
-        <entityName>Person_entity</entityName>
+        <entityName>Organisation_entity</entityName>
         <fieldName>#PROVIDER</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>Persons</name>
       <children>
         <entityParameter>
           <name>ExcludedContactIds_param</name>
@@ -112,34 +107,39 @@
           <valueProcess>%aditoprj%/entity/Object_entity/entityfields/persons/children/contactid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>Offers</name>
       <dependency>
         <name>dependency</name>
-        <entityName>Offer_entity</entityName>
+        <entityName>Person_entity</entityName>
         <fieldName>#PROVIDER</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>Offers</name>
       <children>
         <entityParameter>
           <name>ContactId_param</name>
           <valueProcess>%aditoprj%/entity/Object_entity/entityfields/offers/children/contactid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>Orders</name>
       <dependency>
         <name>dependency</name>
-        <entityName>Order_entity</entityName>
+        <entityName>Offer_entity</entityName>
         <fieldName>#PROVIDER</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>Orders</name>
       <children>
         <entityParameter>
           <name>ContactId_param</name>
           <valueProcess>%aditoprj%/entity/Object_entity/entityfields/orders/children/contactid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Order_entity</entityName>
+        <fieldName>#PROVIDER</fieldName>
+      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>Products</name>
@@ -151,31 +151,31 @@
     </entityConsumer>
     <entityConsumer>
       <name>Contracts</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Contract_entity</entityName>
-        <fieldName>#PROVIDER</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContactId_param</name>
           <valueProcess>%aditoprj%/entity/Object_entity/entityfields/contracts/children/contactid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>Salesprojects</name>
       <dependency>
         <name>dependency</name>
-        <entityName>Salesproject_entity</entityName>
+        <entityName>Contract_entity</entityName>
         <fieldName>#PROVIDER</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>Salesprojects</name>
       <children>
         <entityParameter>
           <name>ContactId_param</name>
           <valueProcess>%aditoprj%/entity/Object_entity/entityfields/salesprojects/children/contactid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Salesproject_entity</entityName>
+        <fieldName>#PROVIDER</fieldName>
+      </dependency>
     </entityConsumer>
     <entityParameter>
       <name>ExcludedObjectIds_param</name>
@@ -185,6 +185,21 @@
     <entityProvider>
       <name>FilteredObjects</name>
       <targetConsumerProcess>%aditoprj%/entity/Object_entity/entityfields/filteredobjects/targetConsumerProcess.js</targetConsumerProcess>
+      <children>
+        <entityParameter>
+          <name>ExcludedObjectIds_param</name>
+          <expose v="true" />
+        </entityParameter>
+        <entityParameter>
+          <name>ObjectType_param</name>
+          <expose v="true" />
+          <mandatory v="true" />
+        </entityParameter>
+        <entityParameter>
+          <name>ContactId_param</name>
+          <expose v="true" />
+        </entityParameter>
+      </children>
       <dependencies>
         <entityDependency>
           <name>e644a709-cc8f-425e-bef2-9c51eea9bbe9</name>
@@ -205,21 +220,6 @@
           <isConsumer v="false" />
         </entityDependency>
       </dependencies>
-      <children>
-        <entityParameter>
-          <name>ExcludedObjectIds_param</name>
-          <expose v="true" />
-        </entityParameter>
-        <entityParameter>
-          <name>ObjectType_param</name>
-          <expose v="true" />
-          <mandatory v="true" />
-        </entityParameter>
-        <entityParameter>
-          <name>ContactId_param</name>
-          <expose v="true" />
-        </entityParameter>
-      </children>
     </entityProvider>
     <entityConsumer>
       <name>Campaigns</name>
@@ -243,17 +243,17 @@
     </entityParameter>
     <entityConsumer>
       <name>PrivatePersons</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>PrivatePerson_entity</entityName>
-        <fieldName>#PROVIDER</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ExcludedPersonIds_param</name>
           <valueProcess>%aditoprj%/entity/Object_entity/entityfields/privatepersons/children/excludedpersonids_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>PrivatePerson_entity</entityName>
+        <fieldName>#PROVIDER</fieldName>
+      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>Activities</name>
diff --git a/entity/Offer_entity/Offer_entity.aod b/entity/Offer_entity/Offer_entity.aod
index e486ce29844..5349b4d8fd4 100644
--- a/entity/Offer_entity/Offer_entity.aod
+++ b/entity/Offer_entity/Offer_entity.aod
@@ -117,11 +117,6 @@
       <name>Offeritems</name>
       <refreshParent v="true" />
       <description></description>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Offeritem_entity</entityName>
-        <fieldName>OfferItems</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>OfferId_param</name>
@@ -151,6 +146,11 @@
           <valueProcess>%aditoprj%/entity/Offer_entity/entityfields/offeritems/children/language_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Offeritem_entity</entityName>
+        <fieldName>OfferItems</fieldName>
+      </dependency>
     </entityConsumer>
     <entityActionField>
       <name>newOfferVersion</name>
@@ -247,27 +247,22 @@
     </entityField>
     <entityConsumer>
       <name>AnyContacts</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>AnyContact_entity</entityName>
-        <fieldName>OnlySameCompany</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContactId_param</name>
           <valueProcess>%aditoprj%/entity/Offer_entity/entityfields/anycontacts/children/contactid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>AnyContact_entity</entityName>
+        <fieldName>OnlySameCompany</fieldName>
+      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>Documents</name>
       <selectionMode>MULTI</selectionMode>
       <stateProcess>%aditoprj%/entity/Offer_entity/entityfields/documents/stateProcess.js</stateProcess>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Document_entity</entityName>
-        <fieldName>Documents</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>AssignmentRowId_param</name>
@@ -278,15 +273,15 @@
           <valueProcess>%aditoprj%/entity/Offer_entity/entityfields/documents/children/assignmenttable_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>MainDocuments</name>
-      <stateProcess>%aditoprj%/entity/Offer_entity/entityfields/maindocuments/stateProcess.js</stateProcess>
       <dependency>
         <name>dependency</name>
         <entityName>Document_entity</entityName>
-        <fieldName>MainDocuments</fieldName>
+        <fieldName>Documents</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>MainDocuments</name>
+      <stateProcess>%aditoprj%/entity/Offer_entity/entityfields/maindocuments/stateProcess.js</stateProcess>
       <children>
         <entityParameter>
           <name>AssignmentRowId_param</name>
@@ -297,6 +292,11 @@
           <valueProcess>%aditoprj%/entity/Offer_entity/entityfields/maindocuments/children/assignmenttable_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Document_entity</entityName>
+        <fieldName>MainDocuments</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>ADDRESS</name>
@@ -323,11 +323,6 @@
     </entityField>
     <entityConsumer>
       <name>KeywordCurrencies</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>KeywordEntry_entity</entityName>
-        <fieldName>SpecificContainerKeywords</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
@@ -335,14 +330,14 @@
           <expose v="false" />
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>KeywordOfferStates</name>
       <dependency>
         <name>dependency</name>
         <entityName>KeywordEntry_entity</entityName>
         <fieldName>SpecificContainerKeywords</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>KeywordOfferStates</name>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
@@ -350,6 +345,11 @@
           <expose v="false" />
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>SpecificContainerKeywords</fieldName>
+      </dependency>
     </entityConsumer>
     <entityActionField>
       <name>newOrder</name>
@@ -367,11 +367,6 @@
     </entityConsumer>
     <entityConsumer>
       <name>KeywordProbabilities</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>KeywordEntry_entity</entityName>
-        <fieldName>SpecificContainerKeywords</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
@@ -379,14 +374,14 @@
           <expose v="false" />
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>Activities</name>
       <dependency>
         <name>dependency</name>
-        <entityName>Activity_entity</entityName>
-        <fieldName>LinkedObjects</fieldName>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>SpecificContainerKeywords</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>Activities</name>
       <children>
         <entityParameter>
           <name>ObjectId_param</name>
@@ -401,6 +396,11 @@
           <valueProcess>%aditoprj%/entity/Offer_entity/entityfields/activities/children/presetlinks_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Activity_entity</entityName>
+        <fieldName>LinkedObjects</fieldName>
+      </dependency>
     </entityConsumer>
     <entityActionField>
       <name>newActivity</name>
@@ -412,26 +412,6 @@
     </entityActionField>
     <entityProvider>
       <name>ContactOffers</name>
-      <dependencies>
-        <entityDependency>
-          <name>5c9720b5-1288-4a30-88fd-6dcff6359083</name>
-          <entityName>Person_entity</entityName>
-          <fieldName>Offers</fieldName>
-          <isConsumer v="false" />
-        </entityDependency>
-        <entityDependency>
-          <name>b308795f-3c81-4e60-99ca-3b5f8e82f62a</name>
-          <entityName>Organisation_entity</entityName>
-          <fieldName>Offers</fieldName>
-          <isConsumer v="false" />
-        </entityDependency>
-        <entityDependency>
-          <name>a74b02c4-bdb3-4ba8-9207-66a0af528b1b</name>
-          <entityName>Order_entity</entityName>
-          <fieldName>Offers</fieldName>
-          <isConsumer v="false" />
-        </entityDependency>
-      </dependencies>
       <children>
         <entityParameter>
           <name>ContactId_param</name>
@@ -482,6 +462,26 @@
           <expose v="false" />
         </entityParameter>
       </children>
+      <dependencies>
+        <entityDependency>
+          <name>5c9720b5-1288-4a30-88fd-6dcff6359083</name>
+          <entityName>Person_entity</entityName>
+          <fieldName>Offers</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+        <entityDependency>
+          <name>b308795f-3c81-4e60-99ca-3b5f8e82f62a</name>
+          <entityName>Organisation_entity</entityName>
+          <fieldName>Offers</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+        <entityDependency>
+          <name>a74b02c4-bdb3-4ba8-9207-66a0af528b1b</name>
+          <entityName>Order_entity</entityName>
+          <fieldName>Offers</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+      </dependencies>
     </entityProvider>
     <entityParameter>
       <name>OfferCurrency_param</name>
@@ -551,40 +551,35 @@
     </entityField>
     <entityConsumer>
       <name>KeywordPaymentTerm</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>KeywordEntry_entity</entityName>
-        <fieldName>SpecificContainerKeywords</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
           <valueProcess>%aditoprj%/entity/Offer_entity/entityfields/keywordpaymentterm/children/containername_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>KeywordDeliveryTerm</name>
       <dependency>
         <name>dependency</name>
         <entityName>KeywordEntry_entity</entityName>
         <fieldName>SpecificContainerKeywords</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>KeywordDeliveryTerm</name>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
           <valueProcess>%aditoprj%/entity/Offer_entity/entityfields/keyworddeliveryterm/children/containername_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>SpecificContainerKeywords</fieldName>
+      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>Tasks</name>
       <stateProcess>%aditoprj%/entity/Offer_entity/entityfields/tasks/stateProcess.js</stateProcess>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Task_entity</entityName>
-        <fieldName>Tasks</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>RowId_param</name>
@@ -599,6 +594,11 @@
           <valueProcess>%aditoprj%/entity/Offer_entity/entityfields/tasks/children/presetlinks_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Task_entity</entityName>
+        <fieldName>Tasks</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>INFO</name>
@@ -610,11 +610,6 @@
       <name>Attributes</name>
       <stateProcess>%aditoprj%/entity/Offer_entity/entityfields/attributes/stateProcess.js</stateProcess>
       <onValidation>%aditoprj%/entity/Offer_entity/entityfields/attributes/onValidation.js</onValidation>
-      <dependency>
-        <name>dependency</name>
-        <entityName>AttributeRelation_entity</entityName>
-        <fieldName>AttributeRelations</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ObjectRowId_param</name>
@@ -625,6 +620,11 @@
           <valueProcess>%aditoprj%/entity/Offer_entity/entityfields/attributes/children/objecttype_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>AttributeRelation_entity</entityName>
+        <fieldName>AttributeRelations</fieldName>
+      </dependency>
     </entityConsumer>
     <entityParameter>
       <name>OfferPaymentTerm_param</name>
@@ -664,17 +664,17 @@
     </entityField>
     <entityConsumer>
       <name>PossibleAddresses</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Address_entity</entityName>
-        <fieldName>OrganisationAndContactAddresses</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContactId_param</name>
           <valueProcess>%aditoprj%/entity/Offer_entity/entityfields/possibleaddresses/children/contactid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Address_entity</entityName>
+        <fieldName>OrganisationAndContactAddresses</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>ChoosenTEXHeader</name>
@@ -716,11 +716,6 @@
     </entityField>
     <entityConsumer>
       <name>Objects</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Object_entity</entityName>
-        <fieldName>FilteredObjects</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ObjectType_param</name>
@@ -731,14 +726,14 @@
           <valueProcess>%aditoprj%/entity/Offer_entity/entityfields/objects/children/contactid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>Contexts</name>
       <dependency>
         <name>dependency</name>
-        <entityName>Context_entity</entityName>
-        <fieldName>Exclusive</fieldName>
+        <entityName>Object_entity</entityName>
+        <fieldName>FilteredObjects</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>Contexts</name>
       <children>
         <entityParameter>
           <name>Blacklist_param</name>
@@ -749,18 +744,15 @@
           <valueProcess>%aditoprj%/entity/Offer_entity/entityfields/contexts/children/invertblacklist_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Context_entity</entityName>
+        <fieldName>Exclusive</fieldName>
+      </dependency>
     </entityConsumer>
     <entityProvider>
       <name>Links</name>
       <recordContainer>db</recordContainer>
-      <dependencies>
-        <entityDependency>
-          <name>88a166e6-ccd0-4d51-b554-e3327f66d834</name>
-          <entityName>Salesproject_entity</entityName>
-          <fieldName>Offers</fieldName>
-          <isConsumer v="false" />
-        </entityDependency>
-      </dependencies>
       <children>
         <entityParameter>
           <name>OfferDeliveryTerm_param</name>
@@ -816,6 +808,14 @@
           <expose v="false" />
         </entityParameter>
       </children>
+      <dependencies>
+        <entityDependency>
+          <name>88a166e6-ccd0-4d51-b554-e3327f66d834</name>
+          <entityName>Salesproject_entity</entityName>
+          <fieldName>Offers</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+      </dependencies>
     </entityProvider>
     <entityParameter>
       <name>ObjectRowId_param</name>
@@ -833,11 +833,6 @@
     </entityField>
     <entityConsumer>
       <name>DocumentTemplateTexHeader</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>DocumentTemplate_entity</entityName>
-        <fieldName>DocumentTemplateProvider</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>DocumentTemplateType_param</name>
@@ -848,20 +843,25 @@
           <valueProcess>%aditoprj%/entity/Offer_entity/entityfields/documenttemplatetexheader/children/documenttemplatetypeclassification_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>LogHistories</name>
       <dependency>
         <name>dependency</name>
-        <entityName>LogHistory_entity</entityName>
-        <fieldName>LogHistoryProvider</fieldName>
+        <entityName>DocumentTemplate_entity</entityName>
+        <fieldName>DocumentTemplateProvider</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>LogHistories</name>
       <children>
         <entityParameter>
           <name>tablenames_param</name>
           <valueProcess>%aditoprj%/entity/Offer_entity/entityfields/loghistories/children/tablenames_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>LogHistory_entity</entityName>
+        <fieldName>LogHistoryProvider</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>FOOTER</name>
@@ -888,11 +888,6 @@
     </entityField>
     <entityConsumer>
       <name>DocumentTemplateTexFooter</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>DocumentTemplate_entity</entityName>
-        <fieldName>DocumentTemplateProvider</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>DocumentTemplateType_param</name>
@@ -903,20 +898,25 @@
           <valueProcess>%aditoprj%/entity/Offer_entity/entityfields/documenttemplatetexfooter/children/documenttemplatetypeclassification_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>Salesprojects</name>
       <dependency>
         <name>dependency</name>
-        <entityName>Salesproject_entity</entityName>
-        <fieldName>Salesprojects</fieldName>
+        <entityName>DocumentTemplate_entity</entityName>
+        <fieldName>DocumentTemplateProvider</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>Salesprojects</name>
       <children>
         <entityParameter>
           <name>ContactId_param</name>
           <valueProcess>%aditoprj%/entity/Offer_entity/entityfields/salesprojects/children/contactid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Salesproject_entity</entityName>
+        <fieldName>Salesprojects</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>CONTACT_ID</name>
diff --git a/entity/Offeritem_entity/Offeritem_entity.aod b/entity/Offeritem_entity/Offeritem_entity.aod
index a900e6473e8..281231dc1f8 100644
--- a/entity/Offeritem_entity/Offeritem_entity.aod
+++ b/entity/Offeritem_entity/Offeritem_entity.aod
@@ -163,14 +163,6 @@
     <entityProvider>
       <name>OfferItems</name>
       <recordContainer>db</recordContainer>
-      <dependencies>
-        <entityDependency>
-          <name>7810e350-d011-4d95-8d0b-883f3a0e519c</name>
-          <entityName>Offer_entity</entityName>
-          <fieldName>Offeritems</fieldName>
-          <isConsumer v="false" />
-        </entityDependency>
-      </dependencies>
       <children>
         <entityParameter>
           <name>ContactId_param</name>
@@ -194,6 +186,14 @@
           <expose v="true" />
         </entityParameter>
       </children>
+      <dependencies>
+        <entityDependency>
+          <name>7810e350-d011-4d95-8d0b-883f3a0e519c</name>
+          <entityName>Offer_entity</entityName>
+          <fieldName>Offeritems</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+      </dependencies>
     </entityProvider>
     <entityField>
       <name>INFO</name>
@@ -204,11 +204,6 @@
     </entityField>
     <entityConsumer>
       <name>KeywordProductGroupcodes</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>KeywordEntry_entity</entityName>
-        <fieldName>SpecificContainerKeywords</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
@@ -216,14 +211,14 @@
           <expose v="false" />
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>KeywordQuantityUnits</name>
       <dependency>
         <name>dependency</name>
         <entityName>KeywordEntry_entity</entityName>
         <fieldName>SpecificContainerKeywords</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>KeywordQuantityUnits</name>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
@@ -231,6 +226,11 @@
           <expose v="false" />
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>SpecificContainerKeywords</fieldName>
+      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>Products</name>
diff --git a/entity/Order_entity/Order_entity.aod b/entity/Order_entity/Order_entity.aod
index 64b551ee2df..0bda9d9f780 100644
--- a/entity/Order_entity/Order_entity.aod
+++ b/entity/Order_entity/Order_entity.aod
@@ -107,11 +107,6 @@
     <entityConsumer>
       <name>Orderitems</name>
       <description></description>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Orderitem_entity</entityName>
-        <fieldName>Orderitems</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>OrderId_param</name>
@@ -137,6 +132,11 @@
           <mandatory v="true" />
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Orderitem_entity</entityName>
+        <fieldName>Orderitems</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>NET</name>
@@ -198,11 +198,6 @@
     <entityConsumer>
       <name>Documents</name>
       <selectionMode>MULTI</selectionMode>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Document_entity</entityName>
-        <fieldName>Documents</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>AssignmentRowId_param</name>
@@ -213,15 +208,15 @@
           <valueProcess>%aditoprj%/entity/Order_entity/entityfields/documents/children/assignmenttable_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>MainDocuments</name>
-      <stateProcess>%aditoprj%/entity/Order_entity/entityfields/maindocuments/stateProcess.js</stateProcess>
       <dependency>
         <name>dependency</name>
         <entityName>Document_entity</entityName>
-        <fieldName>MainDocuments</fieldName>
+        <fieldName>Documents</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>MainDocuments</name>
+      <stateProcess>%aditoprj%/entity/Order_entity/entityfields/maindocuments/stateProcess.js</stateProcess>
       <children>
         <entityParameter>
           <name>AssignmentRowId_param</name>
@@ -232,28 +227,28 @@
           <valueProcess>%aditoprj%/entity/Order_entity/entityfields/maindocuments/children/assignmenttable_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>Salesprojects</name>
       <dependency>
         <name>dependency</name>
-        <entityName>Salesproject_entity</entityName>
-        <fieldName>Salesprojects</fieldName>
+        <entityName>Document_entity</entityName>
+        <fieldName>MainDocuments</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>Salesprojects</name>
       <children>
         <entityParameter>
           <name>ContactId_param</name>
           <valueProcess>%aditoprj%/entity/Order_entity/entityfields/salesprojects/children/contactid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>KeywordCurrencies</name>
       <dependency>
         <name>dependency</name>
-        <entityName>KeywordEntry_entity</entityName>
-        <fieldName>SpecificContainerKeywords</fieldName>
+        <entityName>Salesproject_entity</entityName>
+        <fieldName>Salesprojects</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>KeywordCurrencies</name>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
@@ -261,14 +256,14 @@
           <expose v="false" />
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>KeywordStates</name>
       <dependency>
         <name>dependency</name>
         <entityName>KeywordEntry_entity</entityName>
         <fieldName>SpecificContainerKeywords</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>KeywordStates</name>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
@@ -276,6 +271,11 @@
           <expose v="false" />
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>SpecificContainerKeywords</fieldName>
+      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>Languages</name>
@@ -294,11 +294,6 @@
     </entityParameter>
     <entityConsumer>
       <name>Activities</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Activity_entity</entityName>
-        <fieldName>LinkedObjects</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>RowId_param</name>
@@ -313,6 +308,11 @@
           <valueProcess>%aditoprj%/entity/Order_entity/entityfields/activities/children/presetlinks_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Activity_entity</entityName>
+        <fieldName>LinkedObjects</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>OFFER_ID</name>
@@ -326,11 +326,6 @@
     <entityConsumer>
       <name>Tasks</name>
       <stateProcess>%aditoprj%/entity/Order_entity/entityfields/tasks/stateProcess.js</stateProcess>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Task_entity</entityName>
-        <fieldName>Tasks</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>RowId_param</name>
@@ -345,15 +340,15 @@
           <valueProcess>%aditoprj%/entity/Order_entity/entityfields/tasks/children/presetlinks_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Task_entity</entityName>
+        <fieldName>Tasks</fieldName>
+      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>Attributes</name>
       <onValidation>%aditoprj%/entity/Order_entity/entityfields/attributes/onValidation.js</onValidation>
-      <dependency>
-        <name>dependency</name>
-        <entityName>AttributeRelation_entity</entityName>
-        <fieldName>AttributeRelations</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ObjectRowId_param</name>
@@ -364,15 +359,15 @@
           <valueProcess>%aditoprj%/entity/Order_entity/entityfields/attributes/children/objecttype_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>AttributeTree</name>
-      <stateProcess>%aditoprj%/entity/Order_entity/entityfields/attributetree/stateProcess.js</stateProcess>
       <dependency>
         <name>dependency</name>
         <entityName>AttributeRelation_entity</entityName>
-        <fieldName>TreeProvider</fieldName>
+        <fieldName>AttributeRelations</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>AttributeTree</name>
+      <stateProcess>%aditoprj%/entity/Order_entity/entityfields/attributetree/stateProcess.js</stateProcess>
       <children>
         <entityParameter>
           <name>ObjectType_param</name>
@@ -383,20 +378,25 @@
           <valueProcess>%aditoprj%/entity/Order_entity/entityfields/attributetree/children/objectrowid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>LogHistories</name>
       <dependency>
         <name>dependency</name>
-        <entityName>LogHistory_entity</entityName>
-        <fieldName>LogHistoryProvider</fieldName>
+        <entityName>AttributeRelation_entity</entityName>
+        <fieldName>TreeProvider</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>LogHistories</name>
       <children>
         <entityParameter>
           <name>tablenames_param</name>
           <valueProcess>%aditoprj%/entity/Order_entity/entityfields/loghistories/children/tablenames_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>LogHistory_entity</entityName>
+        <fieldName>LogHistoryProvider</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>ORDERTYPE</name>
@@ -474,31 +474,31 @@
     </entityField>
     <entityConsumer>
       <name>KeywordOrderTypes</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>KeywordEntry_entity</entityName>
-        <fieldName>SpecificContainerKeywords</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
           <valueProcess>%aditoprj%/entity/Order_entity/entityfields/keywordordertypes/children/containername_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>KeywordDunningLevels</name>
       <dependency>
         <name>dependency</name>
         <entityName>KeywordEntry_entity</entityName>
         <fieldName>SpecificContainerKeywords</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>KeywordDunningLevels</name>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
           <valueProcess>%aditoprj%/entity/Order_entity/entityfields/keyworddunninglevels/children/containername_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>SpecificContainerKeywords</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>OBJECT_ROWID</name>
@@ -526,11 +526,6 @@
     </entityField>
     <entityConsumer>
       <name>Objects</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Object_entity</entityName>
-        <fieldName>FilteredObjects</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContactId_param</name>
@@ -541,14 +536,14 @@
           <valueProcess>%aditoprj%/entity/Order_entity/entityfields/objects/children/objecttype_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>Contexts</name>
       <dependency>
         <name>dependency</name>
-        <entityName>Context_entity</entityName>
-        <fieldName>Exclusive</fieldName>
+        <entityName>Object_entity</entityName>
+        <fieldName>FilteredObjects</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>Contexts</name>
       <children>
         <entityParameter>
           <name>Blacklist_param</name>
@@ -559,6 +554,11 @@
           <valueProcess>%aditoprj%/entity/Order_entity/entityfields/contexts/children/invertblacklist_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Context_entity</entityName>
+        <fieldName>Exclusive</fieldName>
+      </dependency>
     </entityConsumer>
     <entityParameter>
       <name>PossibleConnectionTypes</name>
@@ -611,46 +611,46 @@
     </entityField>
     <entityConsumer>
       <name>KeywordPaymentTerms</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>KeywordEntry_entity</entityName>
-        <fieldName>SpecificContainerKeywords</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
           <valueProcess>%aditoprj%/entity/Order_entity/entityfields/keywordpaymentterms/children/containername_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>KeywordDeliveryTerms</name>
       <dependency>
         <name>dependency</name>
         <entityName>KeywordEntry_entity</entityName>
         <fieldName>SpecificContainerKeywords</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>KeywordDeliveryTerms</name>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
           <valueProcess>%aditoprj%/entity/Order_entity/entityfields/keyworddeliveryterms/children/containername_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>SpecificContainerKeywords</fieldName>
+      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>PossibleAddresses</name>
       <documentation>%aditoprj%/entity/Order_entity/entityfields/possibleaddresses/documentation.adoc</documentation>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Address_entity</entityName>
-        <fieldName>OrganisationAndContactAddresses</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContactId_param</name>
           <valueProcess>%aditoprj%/entity/Order_entity/entityfields/possibleaddresses/children/contactid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Address_entity</entityName>
+        <fieldName>OrganisationAndContactAddresses</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>NOTICE</name>
@@ -667,25 +667,20 @@
     </entityField>
     <entityConsumer>
       <name>Offers</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Offer_entity</entityName>
-        <fieldName>ContactOffers</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContactId_param</name>
           <valueProcess>%aditoprj%/entity/Order_entity/entityfields/offers/children/contactid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>DocumentTemplateTexHeader</name>
       <dependency>
         <name>dependency</name>
-        <entityName>DocumentTemplate_entity</entityName>
-        <fieldName>DocumentTemplateProvider</fieldName>
+        <entityName>Offer_entity</entityName>
+        <fieldName>ContactOffers</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>DocumentTemplateTexHeader</name>
       <children>
         <entityParameter>
           <name>DocumentTemplateType_param</name>
@@ -696,14 +691,14 @@
           <valueProcess>%aditoprj%/entity/Order_entity/entityfields/documenttemplatetexheader/children/documenttemplatetypeclassification_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>DocumentTemplateTexFooter</name>
       <dependency>
         <name>dependency</name>
         <entityName>DocumentTemplate_entity</entityName>
         <fieldName>DocumentTemplateProvider</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>DocumentTemplateTexFooter</name>
       <children>
         <entityParameter>
           <name>DocumentTemplateType_param</name>
@@ -714,6 +709,11 @@
           <valueProcess>%aditoprj%/entity/Order_entity/entityfields/documenttemplatetexfooter/children/documenttemplatetypeclassification_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>DocumentTemplate_entity</entityName>
+        <fieldName>DocumentTemplateProvider</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>ChosenTexHeader</name>
diff --git a/entity/Orderitem_entity/Orderitem_entity.aod b/entity/Orderitem_entity/Orderitem_entity.aod
index 888a4532258..1f80cb9b609 100644
--- a/entity/Orderitem_entity/Orderitem_entity.aod
+++ b/entity/Orderitem_entity/Orderitem_entity.aod
@@ -144,20 +144,6 @@
     <entityProvider>
       <name>Orderitems</name>
       <recordContainer>db</recordContainer>
-      <dependencies>
-        <entityDependency>
-          <name>7810e350-d011-4d95-8d0b-883f3a0e519c</name>
-          <entityName>Order_entity</entityName>
-          <fieldName>Orderitems</fieldName>
-          <isConsumer v="false" />
-        </entityDependency>
-        <entityDependency>
-          <name>911de4a4-0e85-4d50-93ee-6f8f2308589e</name>
-          <entityName>Order_entity</entityName>
-          <fieldName>Orderitems</fieldName>
-          <isConsumer v="false" />
-        </entityDependency>
-      </dependencies>
       <children>
         <entityParameter>
           <name>ContactId_param</name>
@@ -180,6 +166,20 @@
           <expose v="true" />
         </entityParameter>
       </children>
+      <dependencies>
+        <entityDependency>
+          <name>7810e350-d011-4d95-8d0b-883f3a0e519c</name>
+          <entityName>Order_entity</entityName>
+          <fieldName>Orderitems</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+        <entityDependency>
+          <name>911de4a4-0e85-4d50-93ee-6f8f2308589e</name>
+          <entityName>Order_entity</entityName>
+          <fieldName>Orderitems</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+      </dependencies>
     </entityProvider>
     <entityField>
       <name>INFO</name>
@@ -188,11 +188,6 @@
     </entityField>
     <entityConsumer>
       <name>KeywordProductGroupcodes</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>KeywordEntry_entity</entityName>
-        <fieldName>SpecificContainerKeywords</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
@@ -200,14 +195,14 @@
           <expose v="false" />
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>KeywordQuantityUnits</name>
       <dependency>
         <name>dependency</name>
         <entityName>KeywordEntry_entity</entityName>
         <fieldName>SpecificContainerKeywords</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>KeywordQuantityUnits</name>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
@@ -215,6 +210,11 @@
           <expose v="false" />
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>SpecificContainerKeywords</fieldName>
+      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>Products</name>
diff --git a/entity/PermissionCalendar_entity/PermissionCalendar_entity.aod b/entity/PermissionCalendar_entity/PermissionCalendar_entity.aod
index 6fd9cfebf50..c4614de9721 100644
--- a/entity/PermissionCalendar_entity/PermissionCalendar_entity.aod
+++ b/entity/PermissionCalendar_entity/PermissionCalendar_entity.aod
@@ -147,11 +147,6 @@
     </entityField>
     <entityConsumer>
       <name>Departments</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Attribute_entity</entityName>
-        <fieldName>SpecificAttribute</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ParentId_param</name>
@@ -162,6 +157,11 @@
           <valueProcess>%aditoprj%/entity/PermissionCalendar_entity/entityfields/departments/children/includeparentrecord_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Attribute_entity</entityName>
+        <fieldName>SpecificAttribute</fieldName>
+      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>User</name>
@@ -184,17 +184,17 @@
     </entityField>
     <entityConsumer>
       <name>KeywordPermissionCalendarTypes</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>KeywordEntry_entity</entityName>
-        <fieldName>SpecificContainerKeywords</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
           <valueProcess>%aditoprj%/entity/PermissionCalendar_entity/entityfields/keywordpermissioncalendartypes/children/containername_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>SpecificContainerKeywords</fieldName>
+      </dependency>
     </entityConsumer>
     <entityParameter>
       <name>PermissionDealer_param</name>
diff --git a/entity/PermissionDetail_entity/PermissionDetail_entity.aod b/entity/PermissionDetail_entity/PermissionDetail_entity.aod
index e18801ffb9c..afc95caa0ed 100644
--- a/entity/PermissionDetail_entity/PermissionDetail_entity.aod
+++ b/entity/PermissionDetail_entity/PermissionDetail_entity.aod
@@ -139,11 +139,6 @@
     </entityParameter>
     <entityConsumer>
       <name>KeywordConditionType</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>KeywordEntry_entity</entityName>
-        <fieldName>SpecificContainerKeywords</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
@@ -151,14 +146,14 @@
           <expose v="false" />
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>KeywordAccessType</name>
       <dependency>
         <name>dependency</name>
         <entityName>KeywordEntry_entity</entityName>
         <fieldName>SpecificContainerKeywords</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>KeywordAccessType</name>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
@@ -166,17 +161,17 @@
           <expose v="false" />
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>SpecificContainerKeywords</fieldName>
+      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>PermissionActions</name>
       <refreshParent v="true" />
       <stateProcess>%aditoprj%/entity/PermissionDetail_entity/entityfields/permissionactions/stateProcess.js</stateProcess>
       <onValidation>%aditoprj%/entity/PermissionDetail_entity/entityfields/permissionactions/onValidation.js</onValidation>
-      <dependency>
-        <name>dependency</name>
-        <entityName>PermissionAction_entity</entityName>
-        <fieldName>PermissionActions</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>PermissionId_param</name>
@@ -195,6 +190,11 @@
           <valueProcess>%aditoprj%/entity/PermissionDetail_entity/entityfields/permissionactions/children/fullpermissions_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>PermissionAction_entity</entityName>
+        <fieldName>PermissionActions</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>FULLPERMISSIONS</name>
diff --git a/entity/PermissionMetaData_entity/PermissionMetaData_entity.aod b/entity/PermissionMetaData_entity/PermissionMetaData_entity.aod
index b2006b9d74a..6c80e3e90f0 100644
--- a/entity/PermissionMetaData_entity/PermissionMetaData_entity.aod
+++ b/entity/PermissionMetaData_entity/PermissionMetaData_entity.aod
@@ -32,6 +32,12 @@
     <entityProvider>
       <name>MetaData</name>
       <recordContainer>jDito</recordContainer>
+      <children>
+        <entityParameter>
+          <name>EntityName_param</name>
+          <valueProcess>%aditoprj%/entity/PermissionMetaData_entity/entityfields/metadata/children/entityname_param/valueProcess.js</valueProcess>
+        </entityParameter>
+      </children>
       <dependencies>
         <entityDependency>
           <name>3b2c9421-5ff0-49a3-99f0-6790f17bd76c</name>
@@ -40,42 +46,36 @@
           <isConsumer v="false" />
         </entityDependency>
       </dependencies>
-      <children>
-        <entityParameter>
-          <name>EntityName_param</name>
-          <valueProcess>%aditoprj%/entity/PermissionMetaData_entity/entityfields/metadata/children/entityname_param/valueProcess.js</valueProcess>
-        </entityParameter>
-      </children>
     </entityProvider>
     <entityConsumer>
       <name>PermissionOverviews</name>
       <refreshParent v="true" />
-      <dependency>
-        <name>dependency</name>
-        <entityName>PermissionOverview_entity</entityName>
-        <fieldName>PermissionOverviews</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>EntityTitle_param</name>
           <valueProcess>%aditoprj%/entity/PermissionMetaData_entity/entityfields/permissionoverviews/children/entitytitle_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>PermissionOverview_entity</entityName>
+        <fieldName>PermissionOverviews</fieldName>
+      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>PermissionDetails</name>
       <refreshParent v="true" />
-      <dependency>
-        <name>dependency</name>
-        <entityName>PermissionDetail_entity</entityName>
-        <fieldName>Permissions</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>EntityTitle_param</name>
           <valueProcess>%aditoprj%/entity/PermissionMetaData_entity/entityfields/permissiondetails/children/entitytitle_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>PermissionDetail_entity</entityName>
+        <fieldName>Permissions</fieldName>
+      </dependency>
     </entityConsumer>
     <entityParameter>
       <name>EntityName_param</name>
diff --git a/entity/PrivatePerson_entity/PrivatePerson_entity.aod b/entity/PrivatePerson_entity/PrivatePerson_entity.aod
index e3cc784be65..4739b80b0fe 100644
--- a/entity/PrivatePerson_entity/PrivatePerson_entity.aod
+++ b/entity/PrivatePerson_entity/PrivatePerson_entity.aod
@@ -60,11 +60,6 @@
     </entityParameter>
     <entityConsumer>
       <name>Persons</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Contact_entity</entityName>
-        <fieldName>PersonRelated</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>PersonId_param</name>
@@ -75,6 +70,11 @@
           <valueProcess>%aditoprj%/entity/PrivatePerson_entity/entityfields/persons/children/readonly_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Contact_entity</entityName>
+        <fieldName>PersonRelated</fieldName>
+      </dependency>
     </entityConsumer>
     <entityProvider>
       <name>#PROVIDER_AGGREGATES</name>
diff --git a/entity/Prod2prod_entity/Prod2prod_entity.aod b/entity/Prod2prod_entity/Prod2prod_entity.aod
index 824ac6d55ed..06bfbd33787 100644
--- a/entity/Prod2prod_entity/Prod2prod_entity.aod
+++ b/entity/Prod2prod_entity/Prod2prod_entity.aod
@@ -64,14 +64,6 @@
       <name>ProductLinks</name>
       <targetContextField>targetContext</targetContextField>
       <targetIdField>SOURCE_ID</targetIdField>
-      <dependencies>
-        <entityDependency>
-          <name>4bd06e3b-17a0-483e-a61c-818ff7e86be3</name>
-          <entityName>Product_entity</entityName>
-          <fieldName>ProductLinks</fieldName>
-          <isConsumer v="false" />
-        </entityDependency>
-      </dependencies>
       <children>
         <entityParameter>
           <name>ProductId_param</name>
@@ -82,6 +74,14 @@
           <expose v="false" />
         </entityParameter>
       </children>
+      <dependencies>
+        <entityDependency>
+          <name>4bd06e3b-17a0-483e-a61c-818ff7e86be3</name>
+          <entityName>Product_entity</entityName>
+          <fieldName>ProductLinks</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+      </dependencies>
     </entityProvider>
     <entityField>
       <name>PRODUCTCODE</name>
@@ -104,11 +104,6 @@
     </entityActionGroup>
     <entityConsumer>
       <name>Products</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Product_entity</entityName>
-        <fieldName>Products</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ExcludedProducts_param</name>
@@ -116,6 +111,11 @@
           <expose v="true" />
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Product_entity</entityName>
+        <fieldName>Products</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>PRODUCTID</name>
diff --git a/entity/Product_entity/Product_entity.aod b/entity/Product_entity/Product_entity.aod
index b8443f6c3fe..f9026b60de2 100644
--- a/entity/Product_entity/Product_entity.aod
+++ b/entity/Product_entity/Product_entity.aod
@@ -89,46 +89,46 @@
     </entityField>
     <entityConsumer>
       <name>Organisations</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Organisation_entity</entityName>
-        <fieldName>Organisations</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>OrganisationType_param</name>
           <valueProcess>%aditoprj%/entity/Product_entity/entityfields/organisations/children/organisationtype_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>Productprices</name>
       <dependency>
         <name>dependency</name>
-        <entityName>Productprice_entity</entityName>
-        <fieldName>Productprices</fieldName>
+        <entityName>Organisation_entity</entityName>
+        <fieldName>Organisations</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>Productprices</name>
       <children>
         <entityParameter>
           <name>ProductId_param</name>
           <valueProcess>%aditoprj%/entity/Product_entity/entityfields/productprices/children/productid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Productprice_entity</entityName>
+        <fieldName>Productprices</fieldName>
+      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>Stocks</name>
       <selectionMode>SINGLE</selectionMode>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Stock_entity</entityName>
-        <fieldName>Stocks</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ProductId_param</name>
           <valueProcess>%aditoprj%/entity/Product_entity/entityfields/stocks/children/productid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Stock_entity</entityName>
+        <fieldName>Stocks</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>PICTURE</name>
@@ -137,17 +137,17 @@
     <entityConsumer>
       <name>StockCounts</name>
       <state>READONLY</state>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Stock_entity</entityName>
-        <fieldName>Stocks</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ProductId_param</name>
           <valueProcess>%aditoprj%/entity/Product_entity/entityfields/stockcounts/children/productid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Stock_entity</entityName>
+        <fieldName>Stocks</fieldName>
+      </dependency>
     </entityConsumer>
     <entityProvider>
       <name>#PROVIDER</name>
@@ -181,11 +181,6 @@
     </entityProvider>
     <entityConsumer>
       <name>ProductLinks</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Prod2prod_entity</entityName>
-        <fieldName>ProductLinks</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ProductId_param</name>
@@ -194,6 +189,11 @@
           <mandatory v="true" />
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Prod2prod_entity</entityName>
+        <fieldName>ProductLinks</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>CONTACT_ID</name>
@@ -211,11 +211,6 @@
     <entityConsumer>
       <name>Documents</name>
       <selectionMode>MULTI</selectionMode>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Document_entity</entityName>
-        <fieldName>Documents</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>AssignmentRowId_param</name>
@@ -226,15 +221,15 @@
           <valueProcess>%aditoprj%/entity/Product_entity/entityfields/documents/children/assignmenttable_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>MainDocuments</name>
-      <stateProcess>%aditoprj%/entity/Product_entity/entityfields/maindocuments/stateProcess.js</stateProcess>
       <dependency>
         <name>dependency</name>
         <entityName>Document_entity</entityName>
-        <fieldName>MainDocuments</fieldName>
+        <fieldName>Documents</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>MainDocuments</name>
+      <stateProcess>%aditoprj%/entity/Product_entity/entityfields/maindocuments/stateProcess.js</stateProcess>
       <children>
         <entityParameter>
           <name>AssignmentRowId_param</name>
@@ -245,14 +240,14 @@
           <valueProcess>%aditoprj%/entity/Product_entity/entityfields/maindocuments/children/assignmenttable_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>KeywordProductGroupcodes</name>
       <dependency>
         <name>dependency</name>
-        <entityName>KeywordEntry_entity</entityName>
-        <fieldName>SpecificContainerKeywords</fieldName>
+        <entityName>Document_entity</entityName>
+        <fieldName>MainDocuments</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>KeywordProductGroupcodes</name>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
@@ -260,14 +255,14 @@
           <expose v="false" />
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>KeywordQuantityUnits</name>
       <dependency>
         <name>dependency</name>
         <entityName>KeywordEntry_entity</entityName>
         <fieldName>SpecificContainerKeywords</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>KeywordQuantityUnits</name>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
@@ -275,14 +270,14 @@
           <expose v="false" />
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>Activities</name>
       <dependency>
         <name>dependency</name>
-        <entityName>Activity_entity</entityName>
-        <fieldName>LinkedObjects</fieldName>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>SpecificContainerKeywords</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>Activities</name>
       <children>
         <entityParameter>
           <name>ObjectId_param</name>
@@ -293,6 +288,11 @@
           <valueProcess>%aditoprj%/entity/Product_entity/entityfields/activities/children/rowid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Activity_entity</entityName>
+        <fieldName>LinkedObjects</fieldName>
+      </dependency>
     </entityConsumer>
     <entityActionField>
       <name>newActivity</name>
@@ -306,11 +306,6 @@
       <name>Attributes</name>
       <stateProcess>%aditoprj%/entity/Product_entity/entityfields/attributes/stateProcess.js</stateProcess>
       <onValidation>%aditoprj%/entity/Product_entity/entityfields/attributes/onValidation.js</onValidation>
-      <dependency>
-        <name>dependency</name>
-        <entityName>AttributeRelation_entity</entityName>
-        <fieldName>AttributeRelations</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ObjectRowId_param</name>
@@ -323,6 +318,11 @@
           <expose v="false" />
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>AttributeRelation_entity</entityName>
+        <fieldName>AttributeRelations</fieldName>
+      </dependency>
     </entityConsumer>
     <entityParameter>
       <name>ExcludedProducts_param</name>
@@ -331,6 +331,12 @@
     </entityParameter>
     <entityProvider>
       <name>Products</name>
+      <children>
+        <entityParameter>
+          <name>ExcludedProducts_param</name>
+          <expose v="true" />
+        </entityParameter>
+      </children>
       <dependencies>
         <entityDependency>
           <name>1b12e8ef-74ba-4294-bd2b-9d4afa80798c</name>
@@ -345,12 +351,6 @@
           <isConsumer v="false" />
         </entityDependency>
       </dependencies>
-      <children>
-        <entityParameter>
-          <name>ExcludedProducts_param</name>
-          <expose v="true" />
-        </entityParameter>
-      </children>
     </entityProvider>
     <entityActionField>
       <name>newTask</name>
@@ -361,11 +361,6 @@
     <entityConsumer>
       <name>Tasks</name>
       <stateProcess>%aditoprj%/entity/Product_entity/entityfields/tasks/stateProcess.js</stateProcess>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Task_entity</entityName>
-        <fieldName>Tasks</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>RowId_param</name>
@@ -376,15 +371,15 @@
           <valueProcess>%aditoprj%/entity/Product_entity/entityfields/tasks/children/objectid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Task_entity</entityName>
+        <fieldName>Tasks</fieldName>
+      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>AttributeTree</name>
       <stateProcess>%aditoprj%/entity/Product_entity/entityfields/attributetree/stateProcess.js</stateProcess>
-      <dependency>
-        <name>dependency</name>
-        <entityName>AttributeRelation_entity</entityName>
-        <fieldName>TreeProvider</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ObjectRowId_param</name>
@@ -395,6 +390,11 @@
           <valueProcess>%aditoprj%/entity/Product_entity/entityfields/attributetree/children/objecttype_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>AttributeRelation_entity</entityName>
+        <fieldName>TreeProvider</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>USER_NEW</name>
@@ -418,17 +418,17 @@
     </entityField>
     <entityConsumer>
       <name>LogHistories</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>LogHistory_entity</entityName>
-        <fieldName>LogHistoryProvider</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>tablenames_param</name>
           <valueProcess>%aditoprj%/entity/Product_entity/entityfields/loghistories/children/tablenames_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>LogHistory_entity</entityName>
+        <fieldName>LogHistoryProvider</fieldName>
+      </dependency>
     </entityConsumer>
     <entityParameter>
       <name>ProductText_param</name>
@@ -436,11 +436,6 @@
     </entityParameter>
     <entityConsumer>
       <name>DescriptionTranslations</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>DescriptionTranslation_entity</entityName>
-        <fieldName>DescriptionTranslations</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ObjectRowid_param</name>
@@ -451,6 +446,11 @@
           <valueProcess>%aditoprj%/entity/Product_entity/entityfields/descriptiontranslations/children/objecttype_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>DescriptionTranslation_entity</entityName>
+        <fieldName>DescriptionTranslations</fieldName>
+      </dependency>
     </entityConsumer>
     <entityActionField>
       <name>openAdminView</name>
diff --git a/entity/Productprice_entity/Productprice_entity.aod b/entity/Productprice_entity/Productprice_entity.aod
index 61bf5454ab3..26dbe5048b3 100644
--- a/entity/Productprice_entity/Productprice_entity.aod
+++ b/entity/Productprice_entity/Productprice_entity.aod
@@ -143,6 +143,16 @@
       <name>Productprices</name>
       <titlePluralProcess>%aditoprj%/entity/Productprice_entity/entityfields/productprices/titlePluralProcess.js</titlePluralProcess>
       <recordContainer>db</recordContainer>
+      <children>
+        <entityParameter>
+          <name>ContactId_param</name>
+          <expose v="true" />
+        </entityParameter>
+        <entityParameter>
+          <name>ProductId_param</name>
+          <expose v="true" />
+        </entityParameter>
+      </children>
       <dependencies>
         <entityDependency>
           <name>d5f4c7c4-cd21-4075-bd56-c479672dc09a</name>
@@ -163,24 +173,9 @@
           <isConsumer v="false" />
         </entityDependency>
       </dependencies>
-      <children>
-        <entityParameter>
-          <name>ContactId_param</name>
-          <expose v="true" />
-        </entityParameter>
-        <entityParameter>
-          <name>ProductId_param</name>
-          <expose v="true" />
-        </entityParameter>
-      </children>
     </entityProvider>
     <entityConsumer>
       <name>KeywordCurrencies</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>KeywordEntry_entity</entityName>
-        <fieldName>SpecificContainerKeywords</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
@@ -188,14 +183,14 @@
           <expose v="false" />
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>KeywordPricelists</name>
       <dependency>
         <name>dependency</name>
         <entityName>KeywordEntry_entity</entityName>
         <fieldName>SpecificContainerKeywords</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>KeywordPricelists</name>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
@@ -203,6 +198,11 @@
           <expose v="false" />
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>SpecificContainerKeywords</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>DELIVERYTERM</name>
diff --git a/entity/QuickEntry_entity/QuickEntry_entity.aod b/entity/QuickEntry_entity/QuickEntry_entity.aod
index fe83641faf9..8f84148e24f 100644
--- a/entity/QuickEntry_entity/QuickEntry_entity.aod
+++ b/entity/QuickEntry_entity/QuickEntry_entity.aod
@@ -22,11 +22,6 @@
     </entityField>
     <entityConsumer>
       <name>Adresses</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Address_entity</entityName>
-        <fieldName>QuickEntryAdresses</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContactId_param</name>
@@ -37,14 +32,14 @@
           <valueProcess>%aditoprj%/entity/QuickEntry_entity/entityfields/adresses/children/contacttype_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>Communications</name>
       <dependency>
         <name>dependency</name>
-        <entityName>Communication_entity</entityName>
-        <fieldName>QuickEntryCommunications</fieldName>
+        <entityName>Address_entity</entityName>
+        <fieldName>QuickEntryAdresses</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>Communications</name>
       <children>
         <entityParameter>
           <name>ContactId_param</name>
@@ -55,6 +50,11 @@
           <valueProcess>%aditoprj%/entity/QuickEntry_entity/entityfields/communications/children/additionalcontactids_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Communication_entity</entityName>
+        <fieldName>QuickEntryCommunications</fieldName>
+      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>Languages</name>
@@ -94,25 +94,20 @@
     </entityField>
     <entityConsumer>
       <name>Salutations</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>SalutationDistinct_entity</entityName>
-        <fieldName>Salutations</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>Language_param</name>
           <valueProcess>%aditoprj%/entity/QuickEntry_entity/entityfields/salutations/children/language_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>SalutationTitles</name>
       <dependency>
         <name>dependency</name>
-        <entityName>SalutationTitleDistinct_entity</entityName>
-        <fieldName>SalutationTitles</fieldName>
+        <entityName>SalutationDistinct_entity</entityName>
+        <fieldName>Salutations</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>SalutationTitles</name>
       <children>
         <entityParameter>
           <name>Language_param</name>
@@ -123,20 +118,25 @@
           <valueProcess>%aditoprj%/entity/QuickEntry_entity/entityfields/salutationtitles/children/salutation_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>Contacts</name>
       <dependency>
         <name>dependency</name>
-        <entityName>Person_entity</entityName>
-        <fieldName>QuickEntryContacts</fieldName>
+        <entityName>SalutationTitleDistinct_entity</entityName>
+        <fieldName>SalutationTitles</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>Contacts</name>
       <children>
         <entityParameter>
           <name>OrgId_param</name>
           <valueProcess>%aditoprj%/entity/QuickEntry_entity/entityfields/contacts/children/orgid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Person_entity</entityName>
+        <fieldName>QuickEntryContacts</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>ISOLANGUAGE</name>
@@ -147,11 +147,6 @@
     </entityField>
     <entityConsumer>
       <name>Activities</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Activity_entity</entityName>
-        <fieldName>LinkedObjects</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>Direction_param</name>
@@ -170,6 +165,11 @@
           <valueProcess>%aditoprj%/entity/QuickEntry_entity/entityfields/activities/children/objectid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Activity_entity</entityName>
+        <fieldName>LinkedObjects</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>DATE_NEW</name>
@@ -185,11 +185,6 @@
     </entityField>
     <entityConsumer>
       <name>Salesprojects</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Salesproject_entity</entityName>
-        <fieldName>QuickEntrySalesprojects</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContactId_param</name>
@@ -200,14 +195,14 @@
           <valueProcess>%aditoprj%/entity/QuickEntry_entity/entityfields/salesprojects/children/presettitle_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>OrgAddresses</name>
       <dependency>
         <name>dependency</name>
-        <entityName>Address_entity</entityName>
-        <fieldName>QuickEntryAdresses</fieldName>
+        <entityName>Salesproject_entity</entityName>
+        <fieldName>QuickEntrySalesprojects</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>OrgAddresses</name>
       <children>
         <entityParameter>
           <name>ContactId_param</name>
@@ -218,6 +213,11 @@
           <valueProcess>%aditoprj%/entity/QuickEntry_entity/entityfields/orgaddresses/children/contacttype_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Address_entity</entityName>
+        <fieldName>QuickEntryAdresses</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>leadQuickAcquisition</name>
@@ -228,11 +228,6 @@
     </entityField>
     <entityConsumer>
       <name>OrgAndPersDuplicates</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>AnyContact_entity</entityName>
-        <fieldName>ContactsByIds</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContactIds_param</name>
@@ -243,6 +238,11 @@
           <valueProcess>%aditoprj%/entity/QuickEntry_entity/entityfields/organdpersduplicates/children/withprivatepersons_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>AnyContact_entity</entityName>
+        <fieldName>ContactsByIds</fieldName>
+      </dependency>
     </entityConsumer>
     <entityProvider>
       <name>#PROVIDER_AGGREGATES</name>
diff --git a/entity/Salesproject_entity/Salesproject_entity.aod b/entity/Salesproject_entity/Salesproject_entity.aod
index bbe19fd7cf0..59562dd82e0 100644
--- a/entity/Salesproject_entity/Salesproject_entity.aod
+++ b/entity/Salesproject_entity/Salesproject_entity.aod
@@ -147,39 +147,34 @@
     </entityField>
     <entityConsumer>
       <name>SalesprojectSources</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>SalesprojectSource_entity</entityName>
-        <fieldName>SalesprojectSouces</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>SalesprojectId_param</name>
           <valueProcess>%aditoprj%/entity/Salesproject_entity/entityfields/salesprojectsources/children/salesprojectid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>SalesprojectPhaseMilestones</name>
       <dependency>
         <name>dependency</name>
-        <entityName>SalesprojectMilestone_entity</entityName>
-        <fieldName>PhaseMilestones</fieldName>
+        <entityName>SalesprojectSource_entity</entityName>
+        <fieldName>SalesprojectSouces</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>SalesprojectPhaseMilestones</name>
       <children>
         <entityParameter>
           <name>SalesprojectId_param</name>
           <valueProcess>%aditoprj%/entity/Salesproject_entity/entityfields/salesprojectphasemilestones/children/salesprojectid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>Forecasts</name>
       <dependency>
         <name>dependency</name>
-        <entityName>Forecast_entity</entityName>
-        <fieldName>Links</fieldName>
+        <entityName>SalesprojectMilestone_entity</entityName>
+        <fieldName>PhaseMilestones</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>Forecasts</name>
       <children>
         <entityParameter>
           <name>ObjectType_param</name>
@@ -192,15 +187,15 @@
           <expose v="true" />
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>Competitions</name>
-      <selectionMode>MULTI</selectionMode>
       <dependency>
         <name>dependency</name>
-        <entityName>Competition_entity</entityName>
+        <entityName>Forecast_entity</entityName>
         <fieldName>Links</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>Competitions</name>
+      <selectionMode>MULTI</selectionMode>
       <children>
         <entityParameter>
           <name>ObjectRowId_param</name>
@@ -213,14 +208,14 @@
           <expose v="true" />
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>Offers</name>
       <dependency>
         <name>dependency</name>
-        <entityName>Offer_entity</entityName>
+        <entityName>Competition_entity</entityName>
         <fieldName>Links</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>Offers</name>
       <children>
         <entityParameter>
           <name>ObjectRowId_param</name>
@@ -233,14 +228,14 @@
           <expose v="true" />
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>Activities</name>
       <dependency>
         <name>dependency</name>
-        <entityName>Activity_entity</entityName>
-        <fieldName>LinkedObjects</fieldName>
+        <entityName>Offer_entity</entityName>
+        <fieldName>Links</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>Activities</name>
       <children>
         <entityParameter>
           <name>PresetLinks_param</name>
@@ -255,14 +250,14 @@
           <valueProcess>%aditoprj%/entity/Salesproject_entity/entityfields/activities/children/objectid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>Members</name>
       <dependency>
         <name>dependency</name>
-        <entityName>Member_entity</entityName>
-        <fieldName>WithDistrictResponsibles</fieldName>
+        <entityName>Activity_entity</entityName>
+        <fieldName>LinkedObjects</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>Members</name>
       <children>
         <entityParameter>
           <name>ObjectRowId_param</name>
@@ -287,6 +282,11 @@
           <valueProcess>%aditoprj%/entity/Salesproject_entity/entityfields/members/children/salesprojectcode_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Member_entity</entityName>
+        <fieldName>WithDistrictResponsibles</fieldName>
+      </dependency>
     </entityConsumer>
     <entityActionField>
       <name>newOffer</name>
@@ -299,11 +299,6 @@
     <entityConsumer>
       <name>Timetrackings</name>
       <refreshParent v="true" />
-      <dependency>
-        <name>dependency</name>
-        <entityName>Timetracking_entity</entityName>
-        <fieldName>Timetrackings</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ObjectId_param</name>
@@ -314,6 +309,11 @@
           <valueProcess>%aditoprj%/entity/Salesproject_entity/entityfields/timetrackings/children/rowid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Timetracking_entity</entityName>
+        <fieldName>Timetrackings</fieldName>
+      </dependency>
     </entityConsumer>
     <entityParameter>
       <name>ContactId_param</name>
@@ -337,11 +337,6 @@
     <entityConsumer>
       <name>Documents</name>
       <selectionMode>MULTI</selectionMode>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Document_entity</entityName>
-        <fieldName>Documents</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>AssignmentRowId_param</name>
@@ -356,15 +351,15 @@
           <valueProcess>%aditoprj%/entity/Salesproject_entity/entityfields/documents/children/mstteamid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>MainDocuments</name>
-      <stateProcess>%aditoprj%/entity/Salesproject_entity/entityfields/maindocuments/stateProcess.js</stateProcess>
       <dependency>
         <name>dependency</name>
         <entityName>Document_entity</entityName>
-        <fieldName>MainDocuments</fieldName>
+        <fieldName>Documents</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>MainDocuments</name>
+      <stateProcess>%aditoprj%/entity/Salesproject_entity/entityfields/maindocuments/stateProcess.js</stateProcess>
       <children>
         <entityParameter>
           <name>AssignmentRowId_param</name>
@@ -375,6 +370,11 @@
           <valueProcess>%aditoprj%/entity/Salesproject_entity/entityfields/maindocuments/children/assignmenttable_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Document_entity</entityName>
+        <fieldName>MainDocuments</fieldName>
+      </dependency>
     </entityConsumer>
     <entityActionField>
       <name>newTimetracking</name>
@@ -385,11 +385,6 @@
     </entityActionField>
     <entityConsumer>
       <name>KeywordProbabilties</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>KeywordEntry_entity</entityName>
-        <fieldName>SpecificContainerKeywords</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
@@ -398,14 +393,14 @@
           <expose v="false" />
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>KeywordStates</name>
       <dependency>
         <name>dependency</name>
         <entityName>KeywordEntry_entity</entityName>
         <fieldName>SpecificContainerKeywords</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>KeywordStates</name>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
@@ -413,6 +408,11 @@
           <expose v="false" />
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>SpecificContainerKeywords</fieldName>
+      </dependency>
     </entityConsumer>
     <entityActionField>
       <name>newActivity</name>
@@ -432,17 +432,17 @@
     <entityConsumer>
       <name>KeywordWonLost</name>
       <selectionMode>MULTI</selectionMode>
-      <dependency>
-        <name>dependency</name>
-        <entityName>KeywordEntry_entity</entityName>
-        <fieldName>SpecificContainerKeywords</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
           <valueProcess>%aditoprj%/entity/Salesproject_entity/entityfields/keywordwonlost/children/containername_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>SpecificContainerKeywords</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>REASONS</name>
@@ -459,6 +459,17 @@
     </entityField>
     <entityProvider>
       <name>Salesprojects</name>
+      <children>
+        <entityParameter>
+          <name>ContactId_param</name>
+          <expose v="true" />
+          <mandatory v="true" />
+        </entityParameter>
+        <entityParameter>
+          <name>PresetTitle_param</name>
+          <expose v="false" />
+        </entityParameter>
+      </children>
       <dependencies>
         <entityDependency>
           <name>0925d17f-a26a-4641-aaf4-0f74796fefa7</name>
@@ -479,17 +490,6 @@
           <isConsumer v="false" />
         </entityDependency>
       </dependencies>
-      <children>
-        <entityParameter>
-          <name>ContactId_param</name>
-          <expose v="true" />
-          <mandatory v="true" />
-        </entityParameter>
-        <entityParameter>
-          <name>PresetTitle_param</name>
-          <expose v="false" />
-        </entityParameter>
-      </children>
     </entityProvider>
     <entityActionField>
       <name>newTask</name>
@@ -500,11 +500,6 @@
     <entityConsumer>
       <name>Tasks</name>
       <stateProcess>%aditoprj%/entity/Salesproject_entity/entityfields/tasks/stateProcess.js</stateProcess>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Task_entity</entityName>
-        <fieldName>Tasks</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>RowId_param</name>
@@ -519,17 +514,14 @@
           <valueProcess>%aditoprj%/entity/Salesproject_entity/entityfields/tasks/children/objectid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Task_entity</entityName>
+        <fieldName>Tasks</fieldName>
+      </dependency>
     </entityConsumer>
     <entityProvider>
       <name>OpenSalesprojects</name>
-      <dependencies>
-        <entityDependency>
-          <name>631f55f9-fb0f-4205-bdb8-6e3476268ab4</name>
-          <entityName>Offer_entity</entityName>
-          <fieldName>Salesprojects</fieldName>
-          <isConsumer v="false" />
-        </entityDependency>
-      </dependencies>
       <children>
         <entityParameter>
           <name>Status_param</name>
@@ -540,6 +532,14 @@
           <expose v="false" />
         </entityParameter>
       </children>
+      <dependencies>
+        <entityDependency>
+          <name>631f55f9-fb0f-4205-bdb8-6e3476268ab4</name>
+          <entityName>Offer_entity</entityName>
+          <fieldName>Salesprojects</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+      </dependencies>
     </entityProvider>
     <entityParameter>
       <name>Status_param</name>
@@ -548,27 +548,22 @@
     </entityParameter>
     <entityConsumer>
       <name>SalesprojectStateMilestones</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>SalesprojectMilestone_entity</entityName>
-        <fieldName>StateMilestones</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>SalesprojectId_param</name>
           <valueProcess>%aditoprj%/entity/Salesproject_entity/entityfields/salesprojectstatemilestones/children/salesprojectid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>SalesprojectMilestone_entity</entityName>
+        <fieldName>StateMilestones</fieldName>
+      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>Attributes</name>
       <stateProcess>%aditoprj%/entity/Salesproject_entity/entityfields/attributes/stateProcess.js</stateProcess>
       <onValidation>%aditoprj%/entity/Salesproject_entity/entityfields/attributes/onValidation.js</onValidation>
-      <dependency>
-        <name>dependency</name>
-        <entityName>AttributeRelation_entity</entityName>
-        <fieldName>AttributeRelations</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ObjectType_param</name>
@@ -579,15 +574,15 @@
           <valueProcess>%aditoprj%/entity/Salesproject_entity/entityfields/attributes/children/objectrowid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>AttributeTree</name>
-      <stateProcess>%aditoprj%/entity/Salesproject_entity/entityfields/attributetree/stateProcess.js</stateProcess>
       <dependency>
         <name>dependency</name>
         <entityName>AttributeRelation_entity</entityName>
-        <fieldName>TreeProvider</fieldName>
+        <fieldName>AttributeRelations</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>AttributeTree</name>
+      <stateProcess>%aditoprj%/entity/Salesproject_entity/entityfields/attributetree/stateProcess.js</stateProcess>
       <children>
         <entityParameter>
           <name>ObjectType_param</name>
@@ -598,29 +593,29 @@
           <valueProcess>%aditoprj%/entity/Salesproject_entity/entityfields/attributetree/children/objectrowid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>LogHistories</name>
       <dependency>
         <name>dependency</name>
-        <entityName>LogHistory_entity</entityName>
-        <fieldName>LogHistoryProvider</fieldName>
+        <entityName>AttributeRelation_entity</entityName>
+        <fieldName>TreeProvider</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>LogHistories</name>
       <children>
         <entityParameter>
           <name>tablenames_param</name>
           <valueProcess>%aditoprj%/entity/Salesproject_entity/entityfields/loghistories/children/tablenames_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>LogHistory_entity</entityName>
+        <fieldName>LogHistoryProvider</fieldName>
+      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>Classifications</name>
       <refreshParent v="true" />
-      <dependency>
-        <name>dependency</name>
-        <entityName>Classification_entity</entityName>
-        <fieldName>Classifications</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ObjectRowid_param</name>
@@ -635,6 +630,11 @@
           <valueProcess>%aditoprj%/entity/Salesproject_entity/entityfields/classifications/children/classificationtype_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Classification_entity</entityName>
+        <fieldName>Classifications</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>RemainingTime</name>
@@ -648,11 +648,6 @@
     </entityField>
     <entityConsumer>
       <name>SalesprojectForecastCharts</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Turnover_entity</entityName>
-        <fieldName>FilteredTurnovers</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>SalesprojectId_param</name>
@@ -671,20 +666,25 @@
           <valueProcess>%aditoprj%/entity/Salesproject_entity/entityfields/salesprojectforecastcharts/children/yearcounttoshow_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>SalesprojectPhaseStepper</name>
       <dependency>
         <name>dependency</name>
-        <entityName>SalesprojectPhase_entity</entityName>
-        <fieldName>Phases</fieldName>
+        <entityName>Turnover_entity</entityName>
+        <fieldName>FilteredTurnovers</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>SalesprojectPhaseStepper</name>
       <children>
         <entityParameter>
           <name>CurrentPhase_param</name>
           <valueProcess>%aditoprj%/entity/Salesproject_entity/entityfields/salesprojectphasestepper/children/currentphase_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>SalesprojectPhase_entity</entityName>
+        <fieldName>Phases</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>PHASEINFO</name>
@@ -707,17 +707,17 @@
     </entityField>
     <entityConsumer>
       <name>ProjectTypeAttribute</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Attribute_entity</entityName>
-        <fieldName>SpecificAttribute</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ObjectType_param</name>
           <valueProcess>%aditoprj%/entity/Salesproject_entity/entityfields/projecttypeattribute/children/objecttype_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Attribute_entity</entityName>
+        <fieldName>SpecificAttribute</fieldName>
+      </dependency>
     </entityConsumer>
     <entityProvider>
       <name>QuickEntrySalesprojects</name>
diff --git a/entity/SalutationDistinct_entity/SalutationDistinct_entity.aod b/entity/SalutationDistinct_entity/SalutationDistinct_entity.aod
index bacd4cd101b..8109ebac747 100644
--- a/entity/SalutationDistinct_entity/SalutationDistinct_entity.aod
+++ b/entity/SalutationDistinct_entity/SalutationDistinct_entity.aod
@@ -14,6 +14,12 @@
     </entityField>
     <entityProvider>
       <name>Salutations</name>
+      <children>
+        <entityParameter>
+          <name>Language_param</name>
+          <expose v="true" />
+        </entityParameter>
+      </children>
       <dependencies>
         <entityDependency>
           <name>2f56ee5c-0f54-4d26-a4d8-a598c136967b</name>
@@ -22,12 +28,6 @@
           <isConsumer v="false" />
         </entityDependency>
       </dependencies>
-      <children>
-        <entityParameter>
-          <name>Language_param</name>
-          <expose v="true" />
-        </entityParameter>
-      </children>
     </entityProvider>
     <entityParameter>
       <name>Language_param</name>
diff --git a/entity/SalutationTitleDistinct_entity/SalutationTitleDistinct_entity.aod b/entity/SalutationTitleDistinct_entity/SalutationTitleDistinct_entity.aod
index e23ed314f9c..1919f07f0a8 100644
--- a/entity/SalutationTitleDistinct_entity/SalutationTitleDistinct_entity.aod
+++ b/entity/SalutationTitleDistinct_entity/SalutationTitleDistinct_entity.aod
@@ -19,14 +19,6 @@
     </entityParameter>
     <entityProvider>
       <name>SalutationTitles</name>
-      <dependencies>
-        <entityDependency>
-          <name>3514c1fb-09f5-485f-884b-2e21e4e85490</name>
-          <entityName>QuickEntry_entity</entityName>
-          <fieldName>SalutationTitles</fieldName>
-          <isConsumer v="false" />
-        </entityDependency>
-      </dependencies>
       <children>
         <entityParameter>
           <name>Language_param</name>
@@ -37,6 +29,14 @@
           <expose v="true" />
         </entityParameter>
       </children>
+      <dependencies>
+        <entityDependency>
+          <name>3514c1fb-09f5-485f-884b-2e21e4e85490</name>
+          <entityName>QuickEntry_entity</entityName>
+          <fieldName>SalutationTitles</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+      </dependencies>
     </entityProvider>
     <entityParameter>
       <name>Language_param</name>
diff --git a/entity/Salutation_entity/Salutation_entity.aod b/entity/Salutation_entity/Salutation_entity.aod
index 48def7ff858..0d2090d7740 100644
--- a/entity/Salutation_entity/Salutation_entity.aod
+++ b/entity/Salutation_entity/Salutation_entity.aod
@@ -59,17 +59,17 @@
     </entityField>
     <entityConsumer>
       <name>KeywordGenders</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>KeywordEntry_entity</entityName>
-        <fieldName>SpecificContainerKeywords</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
           <valueProcess>%aditoprj%/entity/Salutation_entity/entityfields/keywordgenders/children/containername_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>SpecificContainerKeywords</fieldName>
+      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>KeywordLanguages</name>
diff --git a/entity/SerialLetter_entity/SerialLetter_entity.aod b/entity/SerialLetter_entity/SerialLetter_entity.aod
index 315503bad3d..558eb8a4b6c 100644
--- a/entity/SerialLetter_entity/SerialLetter_entity.aod
+++ b/entity/SerialLetter_entity/SerialLetter_entity.aod
@@ -39,17 +39,17 @@
     </entityField>
     <entityConsumer>
       <name>Recipients</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>LetterRecipient_entity</entityName>
-        <fieldName>SerialLetterRecipients</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>SerialLetterId_param</name>
           <valueProcess>%aditoprj%/entity/SerialLetter_entity/entityfields/recipients/children/serialletterid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>LetterRecipient_entity</entityName>
+        <fieldName>SerialLetterRecipients</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>ICON</name>
@@ -59,11 +59,6 @@
     </entityField>
     <entityConsumer>
       <name>Templates</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>DocumentTemplate_entity</entityName>
-        <fieldName>DocumentTemplateProvider</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>DocumentTemplateType_param</name>
@@ -74,6 +69,11 @@
           <valueProcess>%aditoprj%/entity/SerialLetter_entity/entityfields/templates/children/documenttemplatetypeclassification_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>DocumentTemplate_entity</entityName>
+        <fieldName>DocumentTemplateProvider</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>TITLE</name>
@@ -88,17 +88,17 @@
     </entityField>
     <entityConsumer>
       <name>LogHistories</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>LogHistory_entity</entityName>
-        <fieldName>LogHistoryProvider</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>tablenames_param</name>
           <valueProcess>%aditoprj%/entity/SerialLetter_entity/entityfields/loghistories/children/tablenames_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>LogHistory_entity</entityName>
+        <fieldName>LogHistoryProvider</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>bindata</name>
@@ -114,26 +114,21 @@
     </entityField>
     <entityConsumer>
       <name>StatusKeyword</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>KeywordEntry_entity</entityName>
-        <fieldName>SpecificContainerKeywords</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
           <valueProcess>%aditoprj%/entity/SerialLetter_entity/entityfields/statuskeyword/children/containername_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>SpecificContainerKeywords</fieldName>
+      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>Activities</name>
       <state>INVISIBLE</state>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Activity_entity</entityName>
-        <fieldName>LinkedObjects</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ObjectId_param</name>
@@ -144,6 +139,11 @@
           <valueProcess>%aditoprj%/entity/SerialLetter_entity/entityfields/activities/children/rowid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Activity_entity</entityName>
+        <fieldName>LinkedObjects</fieldName>
+      </dependency>
     </entityConsumer>
     <entityActionField>
       <name>downloadLetter</name>
@@ -174,11 +174,6 @@
     <entityConsumer>
       <name>Documents</name>
       <refreshParent v="true" />
-      <dependency>
-        <name>dependency</name>
-        <entityName>Document_entity</entityName>
-        <fieldName>SingleDocument</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>AssignmentRowId_param</name>
@@ -197,6 +192,11 @@
           <valueProcess>%aditoprj%/entity/SerialLetter_entity/entityfields/documents/children/disallowcreate_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Document_entity</entityName>
+        <fieldName>SingleDocument</fieldName>
+      </dependency>
     </entityConsumer>
     <entityActionField>
       <name>generateLetter</name>
diff --git a/entity/Stock_entity/Stock_entity.aod b/entity/Stock_entity/Stock_entity.aod
index 79a929f5a6b..b77312e1cbb 100644
--- a/entity/Stock_entity/Stock_entity.aod
+++ b/entity/Stock_entity/Stock_entity.aod
@@ -53,6 +53,12 @@
     <entityProvider>
       <name>Stocks</name>
       <recordContainer>db</recordContainer>
+      <children>
+        <entityParameter>
+          <name>ProductId_param</name>
+          <expose v="true" />
+        </entityParameter>
+      </children>
       <dependencies>
         <entityDependency>
           <name>aa9264c8-2c96-4a7a-94c7-e38bc0ae7df3</name>
@@ -67,12 +73,6 @@
           <isConsumer v="false" />
         </entityDependency>
       </dependencies>
-      <children>
-        <entityParameter>
-          <name>ProductId_param</name>
-          <expose v="true" />
-        </entityParameter>
-      </children>
     </entityProvider>
     <entityField>
       <name>IMAGE</name>
@@ -95,11 +95,6 @@
     </entityProvider>
     <entityConsumer>
       <name>KeywordWarehouses</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>KeywordEntry_entity</entityName>
-        <fieldName>SpecificContainerKeywords</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
@@ -107,6 +102,11 @@
           <expose v="false" />
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>SpecificContainerKeywords</fieldName>
+      </dependency>
     </entityConsumer>
     <entityProvider>
       <name>#PROVIDER_AGGREGATES</name>
diff --git a/entity/SupportTicket_entity/SupportTicket_entity.aod b/entity/SupportTicket_entity/SupportTicket_entity.aod
index 7449b209441..4b3790f9967 100644
--- a/entity/SupportTicket_entity/SupportTicket_entity.aod
+++ b/entity/SupportTicket_entity/SupportTicket_entity.aod
@@ -128,27 +128,22 @@
     </entityParameter>
     <entityConsumer>
       <name>Links</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>TaskLink_entity</entityName>
-        <fieldName>Link</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>TaskId_param</name>
           <valueProcess>%aditoprj%/entity/SupportTicket_entity/entityfields/links/children/taskid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>TaskLink_entity</entityName>
+        <fieldName>Link</fieldName>
+      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>Attributes</name>
       <stateProcess>%aditoprj%/entity/SupportTicket_entity/entityfields/attributes/stateProcess.js</stateProcess>
       <onValidation>%aditoprj%/entity/SupportTicket_entity/entityfields/attributes/onValidation.js</onValidation>
-      <dependency>
-        <name>dependency</name>
-        <entityName>AttributeRelation_entity</entityName>
-        <fieldName>AttributeRelations</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ObjectRowId_param</name>
@@ -171,15 +166,15 @@
           <valueProcess>%aditoprj%/entity/SupportTicket_entity/entityfields/attributes/children/displaysimplename_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>AttributeRelation_entity</entityName>
+        <fieldName>AttributeRelations</fieldName>
+      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>MainDocuments</name>
       <stateProcess>%aditoprj%/entity/SupportTicket_entity/entityfields/maindocuments/stateProcess.js</stateProcess>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Document_entity</entityName>
-        <fieldName>MainDocuments</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>AssignmentRowId_param</name>
@@ -190,15 +185,15 @@
           <valueProcess>%aditoprj%/entity/SupportTicket_entity/entityfields/maindocuments/children/assignmenttable_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>Documents</name>
-      <selectionMode>MULTI</selectionMode>
       <dependency>
         <name>dependency</name>
         <entityName>Document_entity</entityName>
-        <fieldName>Documents</fieldName>
+        <fieldName>MainDocuments</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>Documents</name>
+      <selectionMode>MULTI</selectionMode>
       <children>
         <entityParameter>
           <name>AssignmentRowId_param</name>
@@ -209,20 +204,25 @@
           <valueProcess>%aditoprj%/entity/SupportTicket_entity/entityfields/documents/children/assignmenttable_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>LogHistories</name>
       <dependency>
         <name>dependency</name>
-        <entityName>LogHistory_entity</entityName>
-        <fieldName>LogHistoryProvider</fieldName>
+        <entityName>Document_entity</entityName>
+        <fieldName>Documents</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>LogHistories</name>
       <children>
         <entityParameter>
           <name>tablenames_param</name>
           <valueProcess>%aditoprj%/entity/SupportTicket_entity/entityfields/loghistories/children/tablenames_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>LogHistory_entity</entityName>
+        <fieldName>LogHistoryProvider</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>TASK_PROGRESS</name>
@@ -234,17 +234,17 @@
     </entityField>
     <entityConsumer>
       <name>KeywordProgress</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>KeywordEntry_entity</entityName>
-        <fieldName>SpecificContainerKeywords</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
           <valueProcess>%aditoprj%/entity/SupportTicket_entity/entityfields/keywordprogress/children/containername_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>SpecificContainerKeywords</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>TICKETTYPE</name>
@@ -274,25 +274,20 @@
     </entityField>
     <entityConsumer>
       <name>KeywordTickettype</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>KeywordEntry_entity</entityName>
-        <fieldName>SpecificContainerKeywords</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
           <valueProcess>%aditoprj%/entity/SupportTicket_entity/entityfields/keywordtickettype/children/containername_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>KeywordTaskState</name>
       <dependency>
         <name>dependency</name>
         <entityName>KeywordEntry_entity</entityName>
         <fieldName>SpecificContainerKeywords</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>KeywordTaskState</name>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
@@ -303,6 +298,11 @@
           <valueProcess>%aditoprj%/entity/SupportTicket_entity/entityfields/keywordtaskstate/children/whitelistids_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>SpecificContainerKeywords</fieldName>
+      </dependency>
     </entityConsumer>
     <entityParameter>
       <name>TicketType_param</name>
@@ -311,17 +311,17 @@
     </entityParameter>
     <entityConsumer>
       <name>KeywordTaskPriority</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>KeywordEntry_entity</entityName>
-        <fieldName>SpecificContainerKeywords</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
           <valueProcess>%aditoprj%/entity/SupportTicket_entity/entityfields/keywordtaskpriority/children/containername_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>SpecificContainerKeywords</fieldName>
+      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>ContactEditors</name>
@@ -354,11 +354,6 @@
     </entityActionField>
     <entityConsumer>
       <name>ModuleTrees</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>ModuleTree_entity</entityName>
-        <fieldName>TreeProviders</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContextName_param</name>
@@ -369,6 +364,11 @@
           <valueProcess>%aditoprj%/entity/SupportTicket_entity/entityfields/moduletrees/children/id_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>ModuleTree_entity</entityName>
+        <fieldName>TreeProviders</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>TASK_PARENT_ID</name>
diff --git a/entity/TaskLink_entity/TaskLink_entity.aod b/entity/TaskLink_entity/TaskLink_entity.aod
index 759282daf39..90fc5bd3378 100644
--- a/entity/TaskLink_entity/TaskLink_entity.aod
+++ b/entity/TaskLink_entity/TaskLink_entity.aod
@@ -39,6 +39,12 @@
       <targetIdField>OBJECT_ROWID</targetIdField>
       <documentation>%aditoprj%/entity/TaskLink_entity/entityfields/link/documentation.adoc</documentation>
       <recordContainer>db</recordContainer>
+      <children>
+        <entityParameter>
+          <name>TaskId_param</name>
+          <expose v="true" />
+        </entityParameter>
+      </children>
       <dependencies>
         <entityDependency>
           <name>40cc8bcd-c178-4a77-a968-642e1d8e1f70</name>
@@ -53,12 +59,6 @@
           <isConsumer v="false" />
         </entityDependency>
       </dependencies>
-      <children>
-        <entityParameter>
-          <name>TaskId_param</name>
-          <expose v="true" />
-        </entityParameter>
-      </children>
     </entityProvider>
     <entityParameter>
       <name>TaskId_param</name>
@@ -75,17 +75,17 @@
     </entityConsumer>
     <entityConsumer>
       <name>Objects</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Object_entity</entityName>
-        <fieldName>AllObjects</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ObjectType_param</name>
           <valueProcess>%aditoprj%/entity/TaskLink_entity/entityfields/objects/children/objecttype_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Object_entity</entityName>
+        <fieldName>AllObjects</fieldName>
+      </dependency>
     </entityConsumer>
     <entityProvider>
       <name>#PROVIDER_AGGREGATES</name>
diff --git a/entity/Timetracking_entity/Timetracking_entity.aod b/entity/Timetracking_entity/Timetracking_entity.aod
index fc202492285..f4b7bc52682 100644
--- a/entity/Timetracking_entity/Timetracking_entity.aod
+++ b/entity/Timetracking_entity/Timetracking_entity.aod
@@ -75,14 +75,6 @@
     <entityProvider>
       <name>Timetrackings</name>
       <recordContainer>db</recordContainer>
-      <dependencies>
-        <entityDependency>
-          <name>3636c414-fbc9-4144-a8b1-8e4ca0a146b2</name>
-          <entityName>Salesproject_entity</entityName>
-          <fieldName>Timetrackings</fieldName>
-          <isConsumer v="false" />
-        </entityDependency>
-      </dependencies>
       <children>
         <entityParameter>
           <name>ObjectId_param</name>
@@ -93,6 +85,14 @@
           <expose v="true" />
         </entityParameter>
       </children>
+      <dependencies>
+        <entityDependency>
+          <name>3636c414-fbc9-4144-a8b1-8e4ca0a146b2</name>
+          <entityName>Salesproject_entity</entityName>
+          <fieldName>Timetrackings</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+      </dependencies>
     </entityProvider>
     <entityConsumer>
       <name>Employees</name>
diff --git a/entity/TurnoverTree_entity/TurnoverTree_entity.aod b/entity/TurnoverTree_entity/TurnoverTree_entity.aod
index d275ce95c96..d8624334458 100644
--- a/entity/TurnoverTree_entity/TurnoverTree_entity.aod
+++ b/entity/TurnoverTree_entity/TurnoverTree_entity.aod
@@ -57,6 +57,12 @@
     <entityProvider>
       <name>FilteredTurnovers</name>
       <documentation>%aditoprj%/entity/TurnoverTree_entity/entityfields/filteredturnovers/documentation.adoc</documentation>
+      <children>
+        <entityParameter>
+          <name>YearCountToShow_param</name>
+          <expose v="true" />
+        </entityParameter>
+      </children>
       <dependencies>
         <entityDependency>
           <name>0ea4ad47-985b-4a9c-81d8-946be324ae04</name>
@@ -65,12 +71,6 @@
           <isConsumer v="false" />
         </entityDependency>
       </dependencies>
-      <children>
-        <entityParameter>
-          <name>YearCountToShow_param</name>
-          <expose v="true" />
-        </entityParameter>
-      </children>
     </entityProvider>
     <entityField>
       <name>PARENT</name>
diff --git a/entity/Turnover_entity/Turnover_entity.aod b/entity/Turnover_entity/Turnover_entity.aod
index 0737e151be2..81fdfb8dd00 100644
--- a/entity/Turnover_entity/Turnover_entity.aod
+++ b/entity/Turnover_entity/Turnover_entity.aod
@@ -54,14 +54,6 @@
     <entityProvider>
       <name>FilteredTurnovers</name>
       <documentation>%aditoprj%/entity/Turnover_entity/entityfields/filteredturnovers/documentation.adoc</documentation>
-      <dependencies>
-        <entityDependency>
-          <name>51106aba-bd82-4ac5-8de6-fc56d53c6117</name>
-          <entityName>Salesproject_entity</entityName>
-          <fieldName>SalesprojectForecastCharts</fieldName>
-          <isConsumer v="false" />
-        </entityDependency>
-      </dependencies>
       <children>
         <entityParameter>
           <name>MaxYear_param</name>
@@ -72,14 +64,17 @@
           <expose v="true" />
         </entityParameter>
       </children>
+      <dependencies>
+        <entityDependency>
+          <name>51106aba-bd82-4ac5-8de6-fc56d53c6117</name>
+          <entityName>Salesproject_entity</entityName>
+          <fieldName>SalesprojectForecastCharts</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+      </dependencies>
     </entityProvider>
     <entityConsumer>
       <name>Turnover_tree</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>TurnoverTree_entity</entityName>
-        <fieldName>FilteredTurnovers</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>MaxYear_param</name>
@@ -98,6 +93,11 @@
           <valueProcess>%aditoprj%/entity/Turnover_entity/entityfields/turnover_tree/children/showturnover_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>TurnoverTree_entity</entityName>
+        <fieldName>FilteredTurnovers</fieldName>
+      </dependency>
     </entityConsumer>
     <entityParameter>
       <name>SalesprojectId_param</name>
diff --git a/entity/UniversalFileProcessor_entity/UniversalFileProcessor_entity.aod b/entity/UniversalFileProcessor_entity/UniversalFileProcessor_entity.aod
index 1abb59ffc8b..57fdcb96a60 100644
--- a/entity/UniversalFileProcessor_entity/UniversalFileProcessor_entity.aod
+++ b/entity/UniversalFileProcessor_entity/UniversalFileProcessor_entity.aod
@@ -24,17 +24,17 @@
     </entityParameter>
     <entityConsumer>
       <name>Activities</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Activity_entity</entityName>
-        <fieldName>LinkedObjects</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ActivityIDs_param</name>
           <valueProcess>%aditoprj%/entity/UniversalFileProcessor_entity/entityfields/activities/children/activityids_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Activity_entity</entityName>
+        <fieldName>LinkedObjects</fieldName>
+      </dependency>
     </entityConsumer>
     <entityProvider>
       <name>#PROVIDER_AGGREGATES</name>
diff --git a/entity/UnlinkedMailMappingWrapper_entity/UnlinkedMailMappingWrapper_entity.aod b/entity/UnlinkedMailMappingWrapper_entity/UnlinkedMailMappingWrapper_entity.aod
index 42eb73a718a..29ba9b689d5 100644
--- a/entity/UnlinkedMailMappingWrapper_entity/UnlinkedMailMappingWrapper_entity.aod
+++ b/entity/UnlinkedMailMappingWrapper_entity/UnlinkedMailMappingWrapper_entity.aod
@@ -49,17 +49,17 @@
     <entityConsumer>
       <name>UnlinkedMailMappingLinks</name>
       <documentation>%aditoprj%/entity/UnlinkedMailMappingWrapper_entity/entityfields/unlinkedmailmappinglinks/documentation.adoc</documentation>
-      <dependency>
-        <name>dependency</name>
-        <entityName>UnlinkedMailMappingLink_entity</entityName>
-        <fieldName>#PROVIDER</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>MailAsText_param</name>
           <valueProcess>%aditoprj%/entity/UnlinkedMailMappingWrapper_entity/entityfields/unlinkedmailmappinglinks/children/mailastext_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>UnlinkedMailMappingLink_entity</entityName>
+        <fieldName>#PROVIDER</fieldName>
+      </dependency>
     </entityConsumer>
     <entityProvider>
       <name>#PROVIDER_AGGREGATES</name>
diff --git a/entity/VisitPlanEntry_entity/VisitPlanEntry_entity.aod b/entity/VisitPlanEntry_entity/VisitPlanEntry_entity.aod
index f059c7a9862..bdb4144e03c 100644
--- a/entity/VisitPlanEntry_entity/VisitPlanEntry_entity.aod
+++ b/entity/VisitPlanEntry_entity/VisitPlanEntry_entity.aod
@@ -119,11 +119,6 @@
     <entityConsumer>
       <name>KeywordVisitPlanEntryStatus</name>
       <documentation>%aditoprj%/entity/VisitPlanEntry_entity/entityfields/keywordvisitplanentrystatus/documentation.adoc</documentation>
-      <dependency>
-        <name>dependency</name>
-        <entityName>KeywordEntry_entity</entityName>
-        <fieldName>SpecificContainerKeywords</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
@@ -131,6 +126,11 @@
           <expose v="true" />
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>SpecificContainerKeywords</fieldName>
+      </dependency>
     </entityConsumer>
     <entityParameter>
       <name>Entries_param</name>
@@ -186,11 +186,6 @@
     </entityField>
     <entityConsumer>
       <name>Persons</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Person_entity</entityName>
-        <fieldName>Contacts</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ExcludedContactIds_param</name>
@@ -201,6 +196,11 @@
           <valueProcess>%aditoprj%/entity/VisitPlanEntry_entity/entityfields/persons/children/onlyshowcontactids_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Person_entity</entityName>
+        <fieldName>Contacts</fieldName>
+      </dependency>
     </entityConsumer>
     <entityParameter>
       <name>ContactId_param</name>
diff --git a/entity/VisitRecommendation_entity/VisitRecommendation_entity.aod b/entity/VisitRecommendation_entity/VisitRecommendation_entity.aod
index 6010af87879..bccac7cc316 100644
--- a/entity/VisitRecommendation_entity/VisitRecommendation_entity.aod
+++ b/entity/VisitRecommendation_entity/VisitRecommendation_entity.aod
@@ -89,11 +89,6 @@
     <entityConsumer>
       <name>KeywordVisitRecommendationPriority</name>
       <documentation>%aditoprj%/entity/VisitRecommendation_entity/entityfields/keywordvisitrecommendationpriority/documentation.adoc</documentation>
-      <dependency>
-        <name>dependency</name>
-        <entityName>KeywordEntry_entity</entityName>
-        <fieldName>SpecificContainerKeywords</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
@@ -101,6 +96,11 @@
           <expose v="true" />
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>SpecificContainerKeywords</fieldName>
+      </dependency>
     </entityConsumer>
     <entityConsumer>
       <name>OrganisationConsumer</name>
@@ -112,11 +112,6 @@
     </entityConsumer>
     <entityConsumer>
       <name>PersonConsumer</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Person_entity</entityName>
-        <fieldName>#PROVIDER</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContactId_param</name>
@@ -124,6 +119,11 @@
           <mandatory v="true" />
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Person_entity</entityName>
+        <fieldName>#PROVIDER</fieldName>
+      </dependency>
     </entityConsumer>
     <entityParameter>
       <name>ContactId_param</name>
@@ -164,17 +164,17 @@
     </entityProvider>
     <entityConsumer>
       <name>KeywordVisitRecommendationSource</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>KeywordEntry_entity</entityName>
-        <fieldName>SpecificContainerKeywords</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
           <valueProcess>%aditoprj%/entity/VisitRecommendation_entity/entityfields/keywordvisitrecommendationsource/children/containername_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>SpecificContainerKeywords</fieldName>
+      </dependency>
     </entityConsumer>
     <entityField>
       <name>ADDRESS_ZIP</name>
diff --git a/entity/WorkflowStartConfig_entity/WorkflowStartConfig_entity.aod b/entity/WorkflowStartConfig_entity/WorkflowStartConfig_entity.aod
index e57032a87e2..2d30eb85c0a 100644
--- a/entity/WorkflowStartConfig_entity/WorkflowStartConfig_entity.aod
+++ b/entity/WorkflowStartConfig_entity/WorkflowStartConfig_entity.aod
@@ -49,11 +49,6 @@
     </entityProvider>
     <entityConsumer>
       <name>Contexts</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Context_entity</entityName>
-        <fieldName>Exclusive</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>Blacklist_param</name>
@@ -64,20 +59,25 @@
           <valueProcess>%aditoprj%/entity/WorkflowStartConfig_entity/entityfields/contexts/children/invertblacklist_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>TriggerKeyword</name>
       <dependency>
         <name>dependency</name>
-        <entityName>KeywordEntry_entity</entityName>
-        <fieldName>SpecificContainerKeywords</fieldName>
+        <entityName>Context_entity</entityName>
+        <fieldName>Exclusive</fieldName>
       </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>TriggerKeyword</name>
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
           <valueProcess>%aditoprj%/entity/WorkflowStartConfig_entity/entityfields/triggerkeyword/children/containername_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>SpecificContainerKeywords</fieldName>
+      </dependency>
     </entityConsumer>
     <entityProvider>
       <name>#PROVIDER_AGGREGATES</name>
diff --git a/neonView/360DegreeFilter_view/360DegreeFilter_view.aod b/neonView/360DegreeFilter_view/360DegreeFilter_view.aod
index f214b8b117e..5bc07ac524d 100644
--- a/neonView/360DegreeFilter_view/360DegreeFilter_view.aod
+++ b/neonView/360DegreeFilter_view/360DegreeFilter_view.aod
@@ -17,7 +17,6 @@
       <iconField>ICON</iconField>
       <hideContentSearch v="false" />
       <entityField>#ENTITY</entityField>
-      <linkedColumns />
       <defaultGroupFields>
         <element>GROUP</element>
       </defaultGroupFields>
diff --git a/neonView/CampaignStepsGantt_view/CampaignStepsGantt_view.aod b/neonView/CampaignStepsGantt_view/CampaignStepsGantt_view.aod
index 1931907f2f4..3219f78a4aa 100644
--- a/neonView/CampaignStepsGantt_view/CampaignStepsGantt_view.aod
+++ b/neonView/CampaignStepsGantt_view/CampaignStepsGantt_view.aod
@@ -18,13 +18,13 @@
       <predecessorIdField>PREDECESSORSTEP_ID</predecessorIdField>
       <entityField>#ENTITY</entityField>
       <isDeletable v="true" />
-      <isEditable v="true" />
       <title></title>
       <devices>
         <element>TABLET</element>
         <element>DESKTOP</element>
       </devices>
       <isCreatable v="true" />
+      <isEditable v="true" />
       <columns>
         <neonTableColumn>
           <name>9469e2f2-35ac-4f87-a4a7-959b47a5e7bb</name>
diff --git a/process/AISalesproject_lib/AISalesproject_lib.aod b/process/AISalesproject_lib/AISalesproject_lib.aod
index 13b8a275db5..a6f99a40249 100644
--- a/process/AISalesproject_lib/AISalesproject_lib.aod
+++ b/process/AISalesproject_lib/AISalesproject_lib.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>AISalesproject_lib</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <process>%aditoprj%/process/AISalesproject_lib/process.js</process>
diff --git a/process/AI_lib/AI_lib.aod b/process/AI_lib/AI_lib.aod
index 153e8fc6b66..7ae40f7d1ad 100644
--- a/process/AI_lib/AI_lib.aod
+++ b/process/AI_lib/AI_lib.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>AI_lib</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <process>%aditoprj%/process/AI_lib/process.js</process>
diff --git a/process/ActivityTask_lib/ActivityTask_lib.aod b/process/ActivityTask_lib/ActivityTask_lib.aod
index 141c9c3f934..75bb8811f6e 100644
--- a/process/ActivityTask_lib/ActivityTask_lib.aod
+++ b/process/ActivityTask_lib/ActivityTask_lib.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>ActivityTask_lib</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <process>%aditoprj%/process/ActivityTask_lib/process.js</process>
diff --git a/process/AddressEntity_lib/AddressEntity_lib.aod b/process/AddressEntity_lib/AddressEntity_lib.aod
index 4ecf49e2e70..432deaa1e5b 100644
--- a/process/AddressEntity_lib/AddressEntity_lib.aod
+++ b/process/AddressEntity_lib/AddressEntity_lib.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>AddressEntity_lib</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <process>%aditoprj%/process/AddressEntity_lib/process.js</process>
diff --git a/process/Address_lib/Address_lib.aod b/process/Address_lib/Address_lib.aod
index dc170bb2e02..8b4c8d490fc 100644
--- a/process/Address_lib/Address_lib.aod
+++ b/process/Address_lib/Address_lib.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>Address_lib</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <documentation>%aditoprj%/process/Address_lib/documentation.adoc</documentation>
diff --git a/process/Appointment_lib/Appointment_lib.aod b/process/Appointment_lib/Appointment_lib.aod
index 5b832c601af..048b24bb744 100644
--- a/process/Appointment_lib/Appointment_lib.aod
+++ b/process/Appointment_lib/Appointment_lib.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>Appointment_lib</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <process>%aditoprj%/process/Appointment_lib/process.js</process>
diff --git a/process/AttributeFilter_lib/AttributeFilter_lib.aod b/process/AttributeFilter_lib/AttributeFilter_lib.aod
index 57e3edcba2b..0e96ad73bb4 100644
--- a/process/AttributeFilter_lib/AttributeFilter_lib.aod
+++ b/process/AttributeFilter_lib/AttributeFilter_lib.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>AttributeFilter_lib</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <process>%aditoprj%/process/AttributeFilter_lib/process.js</process>
diff --git a/process/AttributeRegistry_basic/AttributeRegistry_basic.aod b/process/AttributeRegistry_basic/AttributeRegistry_basic.aod
index d4917ea14ea..3ed840c1e53 100644
--- a/process/AttributeRegistry_basic/AttributeRegistry_basic.aod
+++ b/process/AttributeRegistry_basic/AttributeRegistry_basic.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>AttributeRegistry_basic</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <process>%aditoprj%/process/AttributeRegistry_basic/process.js</process>
diff --git a/process/Attribute_lib/Attribute_lib.aod b/process/Attribute_lib/Attribute_lib.aod
index 7d9936e8182..0d46a6a7dc9 100644
--- a/process/Attribute_lib/Attribute_lib.aod
+++ b/process/Attribute_lib/Attribute_lib.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>Attribute_lib</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <process>%aditoprj%/process/Attribute_lib/process.js</process>
diff --git a/process/Binary_lib/Binary_lib.aod b/process/Binary_lib/Binary_lib.aod
index 39de483b5c2..338211a33b6 100644
--- a/process/Binary_lib/Binary_lib.aod
+++ b/process/Binary_lib/Binary_lib.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>Binary_lib</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <process>%aditoprj%/process/Binary_lib/process.js</process>
diff --git a/process/Bulkmail_lib/Bulkmail_lib.aod b/process/Bulkmail_lib/Bulkmail_lib.aod
index 0befb2a7348..6bc2e64de1b 100644
--- a/process/Bulkmail_lib/Bulkmail_lib.aod
+++ b/process/Bulkmail_lib/Bulkmail_lib.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>Bulkmail_lib</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <process>%aditoprj%/process/Bulkmail_lib/process.js</process>
diff --git a/process/CachedRecordContainer_lib/CachedRecordContainer_lib.aod b/process/CachedRecordContainer_lib/CachedRecordContainer_lib.aod
index 07b3e2150f4..7257f6acb05 100644
--- a/process/CachedRecordContainer_lib/CachedRecordContainer_lib.aod
+++ b/process/CachedRecordContainer_lib/CachedRecordContainer_lib.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>CachedRecordContainer_lib</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <process>%aditoprj%/process/CachedRecordContainer_lib/process.js</process>
diff --git a/process/Calendar_lib/Calendar_lib.aod b/process/Calendar_lib/Calendar_lib.aod
index ba466c5bf5f..657f6034dea 100644
--- a/process/Calendar_lib/Calendar_lib.aod
+++ b/process/Calendar_lib/Calendar_lib.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>Calendar_lib</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <process>%aditoprj%/process/Calendar_lib/process.js</process>
diff --git a/process/Campaign_lib/Campaign_lib.aod b/process/Campaign_lib/Campaign_lib.aod
index 6cff8443c74..1018469206a 100644
--- a/process/Campaign_lib/Campaign_lib.aod
+++ b/process/Campaign_lib/Campaign_lib.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>Campaign_lib</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <process>%aditoprj%/process/Campaign_lib/process.js</process>
diff --git a/process/ClassificationFilter_lib/ClassificationFilter_lib.aod b/process/ClassificationFilter_lib/ClassificationFilter_lib.aod
index 9b182044a87..705efe2d662 100644
--- a/process/ClassificationFilter_lib/ClassificationFilter_lib.aod
+++ b/process/ClassificationFilter_lib/ClassificationFilter_lib.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>ClassificationFilter_lib</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <process>%aditoprj%/process/ClassificationFilter_lib/process.js</process>
diff --git a/process/Classification_lib/Classification_lib.aod b/process/Classification_lib/Classification_lib.aod
index 659223c9d3b..5b4114c59ea 100644
--- a/process/Classification_lib/Classification_lib.aod
+++ b/process/Classification_lib/Classification_lib.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>Classification_lib</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <process>%aditoprj%/process/Classification_lib/process.js</process>
diff --git a/process/Communication_lib/Communication_lib.aod b/process/Communication_lib/Communication_lib.aod
index a69299aa2aa..1bc1f16ef81 100644
--- a/process/Communication_lib/Communication_lib.aod
+++ b/process/Communication_lib/Communication_lib.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>Communication_lib</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <process>%aditoprj%/process/Communication_lib/process.js</process>
diff --git a/process/Contact_lib/Contact_lib.aod b/process/Contact_lib/Contact_lib.aod
index ea8e5020017..3f85ffbdb21 100644
--- a/process/Contact_lib/Contact_lib.aod
+++ b/process/Contact_lib/Contact_lib.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>Contact_lib</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <process>%aditoprj%/process/Contact_lib/process.js</process>
diff --git a/process/Context_lib/Context_lib.aod b/process/Context_lib/Context_lib.aod
index 88f0211eaca..85bdd8cc4de 100644
--- a/process/Context_lib/Context_lib.aod
+++ b/process/Context_lib/Context_lib.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>Context_lib</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <process>%aditoprj%/process/Context_lib/process.js</process>
diff --git a/process/Contract_lib/Contract_lib.aod b/process/Contract_lib/Contract_lib.aod
index f7e066be340..080920179a5 100644
--- a/process/Contract_lib/Contract_lib.aod
+++ b/process/Contract_lib/Contract_lib.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>Contract_lib</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <process>%aditoprj%/process/Contract_lib/process.js</process>
diff --git a/process/CountryInfoData_lib/CountryInfoData_lib.aod b/process/CountryInfoData_lib/CountryInfoData_lib.aod
index d1612a9f77a..ecc2eedbcd9 100644
--- a/process/CountryInfoData_lib/CountryInfoData_lib.aod
+++ b/process/CountryInfoData_lib/CountryInfoData_lib.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>CountryInfoData_lib</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <process>%aditoprj%/process/CountryInfoData_lib/process.js</process>
diff --git a/process/CountryInfo_lib/CountryInfo_lib.aod b/process/CountryInfo_lib/CountryInfo_lib.aod
index d078970229a..69b0a804f39 100644
--- a/process/CountryInfo_lib/CountryInfo_lib.aod
+++ b/process/CountryInfo_lib/CountryInfo_lib.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>CountryInfo_lib</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <process>%aditoprj%/process/CountryInfo_lib/process.js</process>
diff --git a/process/CreateActivity_workflowService/CreateActivity_workflowService.aod b/process/CreateActivity_workflowService/CreateActivity_workflowService.aod
index 0241a4b95bb..d58e8547041 100644
--- a/process/CreateActivity_workflowService/CreateActivity_workflowService.aod
+++ b/process/CreateActivity_workflowService/CreateActivity_workflowService.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>CreateActivity_workflowService</name>
   <title>Create activity</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/process/CreateNotification_workflowService/CreateNotification_workflowService.aod b/process/CreateNotification_workflowService/CreateNotification_workflowService.aod
index e6455f2cd5a..d2630a2a563 100644
--- a/process/CreateNotification_workflowService/CreateNotification_workflowService.aod
+++ b/process/CreateNotification_workflowService/CreateNotification_workflowService.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>CreateNotification_workflowService</name>
   <title>Create notification</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/process/CreateSalesprojectTouchpoint_workflowService/CreateSalesprojectTouchpoint_workflowService.aod b/process/CreateSalesprojectTouchpoint_workflowService/CreateSalesprojectTouchpoint_workflowService.aod
index df1d296af52..6e44f166f64 100644
--- a/process/CreateSalesprojectTouchpoint_workflowService/CreateSalesprojectTouchpoint_workflowService.aod
+++ b/process/CreateSalesprojectTouchpoint_workflowService/CreateSalesprojectTouchpoint_workflowService.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>CreateSalesprojectTouchpoint_workflowService</name>
   <title>Create salesproject touchpoint</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/process/CreateSalesproject_workflowService/CreateSalesproject_workflowService.aod b/process/CreateSalesproject_workflowService/CreateSalesproject_workflowService.aod
index 8b41b437136..fa5f2a849d6 100644
--- a/process/CreateSalesproject_workflowService/CreateSalesproject_workflowService.aod
+++ b/process/CreateSalesproject_workflowService/CreateSalesproject_workflowService.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>CreateSalesproject_workflowService</name>
   <title>Create salesproject</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/process/CustomPlaceholder_lib/CustomPlaceholder_lib.aod b/process/CustomPlaceholder_lib/CustomPlaceholder_lib.aod
index 8e915687a2a..1a6e6266888 100644
--- a/process/CustomPlaceholder_lib/CustomPlaceholder_lib.aod
+++ b/process/CustomPlaceholder_lib/CustomPlaceholder_lib.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>CustomPlaceholder_lib</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <process>%aditoprj%/process/CustomPlaceholder_lib/process.js</process>
diff --git a/process/DataCaching_lib/DataCaching_lib.aod b/process/DataCaching_lib/DataCaching_lib.aod
index 732c9784be4..06e4baffd56 100644
--- a/process/DataCaching_lib/DataCaching_lib.aod
+++ b/process/DataCaching_lib/DataCaching_lib.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>DataCaching_lib</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <process>%aditoprj%/process/DataCaching_lib/process.js</process>
diff --git a/process/DataPrivacy_lib/DataPrivacy_lib.aod b/process/DataPrivacy_lib/DataPrivacy_lib.aod
index 87e4a73a1b3..229eb4f8965 100644
--- a/process/DataPrivacy_lib/DataPrivacy_lib.aod
+++ b/process/DataPrivacy_lib/DataPrivacy_lib.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>DataPrivacy_lib</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <process>%aditoprj%/process/DataPrivacy_lib/process.js</process>
diff --git a/process/Data_lib/Data_lib.aod b/process/Data_lib/Data_lib.aod
index 7e6dc0e007d..316134e4f97 100644
--- a/process/Data_lib/Data_lib.aod
+++ b/process/Data_lib/Data_lib.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>Data_lib</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <process>%aditoprj%/process/Data_lib/process.js</process>
diff --git a/process/Date_lib/Date_lib.aod b/process/Date_lib/Date_lib.aod
index 9833cb86c53..4442988df03 100644
--- a/process/Date_lib/Date_lib.aod
+++ b/process/Date_lib/Date_lib.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>Date_lib</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <process>%aditoprj%/process/Date_lib/process.js</process>
diff --git a/process/Dependency_lib/Dependency_lib.aod b/process/Dependency_lib/Dependency_lib.aod
index 3475b073c30..be3eec18d19 100644
--- a/process/Dependency_lib/Dependency_lib.aod
+++ b/process/Dependency_lib/Dependency_lib.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>Dependency_lib</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <process>%aditoprj%/process/Dependency_lib/process.js</process>
diff --git a/process/DocumentTemplate_lib/DocumentTemplate_lib.aod b/process/DocumentTemplate_lib/DocumentTemplate_lib.aod
index f7dede09487..65a45cc2df2 100644
--- a/process/DocumentTemplate_lib/DocumentTemplate_lib.aod
+++ b/process/DocumentTemplate_lib/DocumentTemplate_lib.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>DocumentTemplate_lib</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <documentation>%aditoprj%/process/DocumentTemplate_lib/documentation.adoc</documentation>
diff --git a/process/Document_lib/Document_lib.aod b/process/Document_lib/Document_lib.aod
index 9f2ede3e40f..cc120d3f86f 100644
--- a/process/Document_lib/Document_lib.aod
+++ b/process/Document_lib/Document_lib.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>Document_lib</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <process>%aditoprj%/process/Document_lib/process.js</process>
diff --git a/process/DocxTemplater_lib/DocxTemplater_lib.aod b/process/DocxTemplater_lib/DocxTemplater_lib.aod
index 3c96ec6b826..8dfbdd5ebc9 100644
--- a/process/DocxTemplater_lib/DocxTemplater_lib.aod
+++ b/process/DocxTemplater_lib/DocxTemplater_lib.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>DocxTemplater_lib</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <process>%aditoprj%/process/DocxTemplater_lib/process.js</process>
diff --git a/process/DuplicateScanner_lib/DuplicateScanner_lib.aod b/process/DuplicateScanner_lib/DuplicateScanner_lib.aod
index 17d38fd00ac..6b45659f204 100644
--- a/process/DuplicateScanner_lib/DuplicateScanner_lib.aod
+++ b/process/DuplicateScanner_lib/DuplicateScanner_lib.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>DuplicateScanner_lib</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <process>%aditoprj%/process/DuplicateScanner_lib/process.js</process>
diff --git a/process/EmailUtil_lib/EmailUtil_lib.aod b/process/EmailUtil_lib/EmailUtil_lib.aod
index 04b24ec7e10..694639f440c 100644
--- a/process/EmailUtil_lib/EmailUtil_lib.aod
+++ b/process/EmailUtil_lib/EmailUtil_lib.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>EmailUtil_lib</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <process>%aditoprj%/process/EmailUtil_lib/process.js</process>
diff --git a/process/Email_lib/Email_lib.aod b/process/Email_lib/Email_lib.aod
index 6022256dea0..d1b4a5a2f48 100644
--- a/process/Email_lib/Email_lib.aod
+++ b/process/Email_lib/Email_lib.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>Email_lib</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <process>%aditoprj%/process/Email_lib/process.js</process>
diff --git a/process/Employee_lib/Employee_lib.aod b/process/Employee_lib/Employee_lib.aod
index 1a08f91b6ef..bf491daa912 100644
--- a/process/Employee_lib/Employee_lib.aod
+++ b/process/Employee_lib/Employee_lib.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>Employee_lib</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <process>%aditoprj%/process/Employee_lib/process.js</process>
diff --git a/process/Entity_lib/Entity_lib.aod b/process/Entity_lib/Entity_lib.aod
index d106b77a163..81c2102218a 100644
--- a/process/Entity_lib/Entity_lib.aod
+++ b/process/Entity_lib/Entity_lib.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>Entity_lib</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <process>%aditoprj%/process/Entity_lib/process.js</process>
diff --git a/process/EwsClient_lib/EwsClient_lib.aod b/process/EwsClient_lib/EwsClient_lib.aod
index 6343b20344c..988c9f615a2 100644
--- a/process/EwsClient_lib/EwsClient_lib.aod
+++ b/process/EwsClient_lib/EwsClient_lib.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>EwsClient_lib</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <process>%aditoprj%/process/EwsClient_lib/process.js</process>
diff --git a/process/ExportTemplate_lib/ExportTemplate_lib.aod b/process/ExportTemplate_lib/ExportTemplate_lib.aod
index 7caa047e49c..347c2bddef0 100644
--- a/process/ExportTemplate_lib/ExportTemplate_lib.aod
+++ b/process/ExportTemplate_lib/ExportTemplate_lib.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>ExportTemplate_lib</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <process>%aditoprj%/process/ExportTemplate_lib/process.js</process>
diff --git a/process/Favorites_lib/Favorites_lib.aod b/process/Favorites_lib/Favorites_lib.aod
index cae0fb68bab..1512c3b435d 100644
--- a/process/Favorites_lib/Favorites_lib.aod
+++ b/process/Favorites_lib/Favorites_lib.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>Favorites_lib</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <process>%aditoprj%/process/Favorites_lib/process.js</process>
diff --git a/process/FilterCondition_lib/FilterCondition_lib.aod b/process/FilterCondition_lib/FilterCondition_lib.aod
index 501b03729ea..a69dbb1ec75 100644
--- a/process/FilterCondition_lib/FilterCondition_lib.aod
+++ b/process/FilterCondition_lib/FilterCondition_lib.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>FilterCondition_lib</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <process>%aditoprj%/process/FilterCondition_lib/process.js</process>
diff --git a/process/FilterViewAction_lib/FilterViewAction_lib.aod b/process/FilterViewAction_lib/FilterViewAction_lib.aod
index 48c19eee90b..83be35832aa 100644
--- a/process/FilterViewAction_lib/FilterViewAction_lib.aod
+++ b/process/FilterViewAction_lib/FilterViewAction_lib.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>FilterViewAction_lib</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <process>%aditoprj%/process/FilterViewAction_lib/process.js</process>
diff --git a/process/Html_lib/Html_lib.aod b/process/Html_lib/Html_lib.aod
index 98ca38b6fb0..52d9fb2676c 100644
--- a/process/Html_lib/Html_lib.aod
+++ b/process/Html_lib/Html_lib.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>Html_lib</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <process>%aditoprj%/process/Html_lib/process.js</process>
diff --git a/process/ImporterCustomMappingFunctions_lib/ImporterCustomMappingFunctions_lib.aod b/process/ImporterCustomMappingFunctions_lib/ImporterCustomMappingFunctions_lib.aod
index bda7727edbe..e5e687932c1 100644
--- a/process/ImporterCustomMappingFunctions_lib/ImporterCustomMappingFunctions_lib.aod
+++ b/process/ImporterCustomMappingFunctions_lib/ImporterCustomMappingFunctions_lib.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>ImporterCustomMappingFunctions_lib</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <documentation>%aditoprj%/process/ImporterCustomMappingFunctions_lib/documentation.adoc</documentation>
diff --git a/process/ImporterMappingFunctions_lib/ImporterMappingFunctions_lib.aod b/process/ImporterMappingFunctions_lib/ImporterMappingFunctions_lib.aod
index 8a5c80a490d..9c1fdace0d7 100644
--- a/process/ImporterMappingFunctions_lib/ImporterMappingFunctions_lib.aod
+++ b/process/ImporterMappingFunctions_lib/ImporterMappingFunctions_lib.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>ImporterMappingFunctions_lib</name>
   <comment></comment>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/process/ImporterTest_lib/ImporterTest_lib.aod b/process/ImporterTest_lib/ImporterTest_lib.aod
index e1204321106..18c823d8efb 100644
--- a/process/ImporterTest_lib/ImporterTest_lib.aod
+++ b/process/ImporterTest_lib/ImporterTest_lib.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>ImporterTest_lib</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <process>%aditoprj%/process/ImporterTest_lib/process.js</process>
diff --git a/process/Importer_lib/Importer_lib.aod b/process/Importer_lib/Importer_lib.aod
index 157f0d47a73..1d6a37d39b4 100644
--- a/process/Importer_lib/Importer_lib.aod
+++ b/process/Importer_lib/Importer_lib.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>Importer_lib</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <documentation>%aditoprj%/process/Importer_lib/documentation.adoc</documentation>
diff --git a/process/IncomingCallExecutor_lib/IncomingCallExecutor_lib.aod b/process/IncomingCallExecutor_lib/IncomingCallExecutor_lib.aod
index 9d36946fdfe..6659a5fab6a 100644
--- a/process/IncomingCallExecutor_lib/IncomingCallExecutor_lib.aod
+++ b/process/IncomingCallExecutor_lib/IncomingCallExecutor_lib.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>IncomingCallExecutor_lib</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <process>%aditoprj%/process/IncomingCallExecutor_lib/process.js</process>
diff --git a/process/IncomingEmailExecutor_lib/IncomingEmailExecutor_lib.aod b/process/IncomingEmailExecutor_lib/IncomingEmailExecutor_lib.aod
index 1dbef1a8825..5d940a9124d 100644
--- a/process/IncomingEmailExecutor_lib/IncomingEmailExecutor_lib.aod
+++ b/process/IncomingEmailExecutor_lib/IncomingEmailExecutor_lib.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>IncomingEmailExecutor_lib</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <process>%aditoprj%/process/IncomingEmailExecutor_lib/process.js</process>
diff --git a/process/IndexSearch_lib/IndexSearch_lib.aod b/process/IndexSearch_lib/IndexSearch_lib.aod
index bfc314526ea..b5a2aacd8c3 100644
--- a/process/IndexSearch_lib/IndexSearch_lib.aod
+++ b/process/IndexSearch_lib/IndexSearch_lib.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>IndexSearch_lib</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <process>%aditoprj%/process/IndexSearch_lib/process.js</process>
diff --git a/process/JditoFilter_lib/JditoFilter_lib.aod b/process/JditoFilter_lib/JditoFilter_lib.aod
index e6721ea4e24..1276959dc46 100644
--- a/process/JditoFilter_lib/JditoFilter_lib.aod
+++ b/process/JditoFilter_lib/JditoFilter_lib.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>JditoFilter_lib</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <documentation>%aditoprj%/process/JditoFilter_lib/documentation.adoc</documentation>
diff --git a/process/KeywordAttribute_test/KeywordAttribute_test.aod b/process/KeywordAttribute_test/KeywordAttribute_test.aod
index 5956980e85a..d22a7e77434 100644
--- a/process/KeywordAttribute_test/KeywordAttribute_test.aod
+++ b/process/KeywordAttribute_test/KeywordAttribute_test.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>KeywordAttribute_test</name>
   <title>[TEST] KeywordAttribute_lib</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/process/KeywordData_lib/KeywordData_lib.aod b/process/KeywordData_lib/KeywordData_lib.aod
index a4aab38ec5e..6955ec39f1f 100644
--- a/process/KeywordData_lib/KeywordData_lib.aod
+++ b/process/KeywordData_lib/KeywordData_lib.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>KeywordData_lib</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <process>%aditoprj%/process/KeywordData_lib/process.js</process>
diff --git a/process/KeywordRegistry_basic/KeywordRegistry_basic.aod b/process/KeywordRegistry_basic/KeywordRegistry_basic.aod
index f16c2160c96..3e8c6225484 100644
--- a/process/KeywordRegistry_basic/KeywordRegistry_basic.aod
+++ b/process/KeywordRegistry_basic/KeywordRegistry_basic.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>KeywordRegistry_basic</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <process>%aditoprj%/process/KeywordRegistry_basic/process.js</process>
diff --git a/process/Keyword_lib/Keyword_lib.aod b/process/Keyword_lib/Keyword_lib.aod
index 2dd2a647ff9..641f19343bb 100644
--- a/process/Keyword_lib/Keyword_lib.aod
+++ b/process/Keyword_lib/Keyword_lib.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>Keyword_lib</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <process>%aditoprj%/process/Keyword_lib/process.js</process>
diff --git a/process/Keyword_test/Keyword_test.aod b/process/Keyword_test/Keyword_test.aod
index e654f56663b..fa9513b2863 100644
--- a/process/Keyword_test/Keyword_test.aod
+++ b/process/Keyword_test/Keyword_test.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>Keyword_test</name>
   <title>[TEST] Keyword_lib</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/process/KnowledgeManagement_lib/KnowledgeManagement_lib.aod b/process/KnowledgeManagement_lib/KnowledgeManagement_lib.aod
index 7119bdb3846..38b9d6a998f 100644
--- a/process/KnowledgeManagement_lib/KnowledgeManagement_lib.aod
+++ b/process/KnowledgeManagement_lib/KnowledgeManagement_lib.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>KnowledgeManagement_lib</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <process>%aditoprj%/process/KnowledgeManagement_lib/process.js</process>
diff --git a/process/LeadQuickAcquisition_lib/LeadQuickAcquisition_lib.aod b/process/LeadQuickAcquisition_lib/LeadQuickAcquisition_lib.aod
index dd1aecc728e..2ac6bab47ac 100644
--- a/process/LeadQuickAcquisition_lib/LeadQuickAcquisition_lib.aod
+++ b/process/LeadQuickAcquisition_lib/LeadQuickAcquisition_lib.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>LeadQuickAcquisition_lib</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <process>%aditoprj%/process/LeadQuickAcquisition_lib/process.js</process>
diff --git a/process/Leadimport_lib/Leadimport_lib.aod b/process/Leadimport_lib/Leadimport_lib.aod
index 2b0a6ccc761..6426e096502 100644
--- a/process/Leadimport_lib/Leadimport_lib.aod
+++ b/process/Leadimport_lib/Leadimport_lib.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>Leadimport_lib</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <process>%aditoprj%/process/Leadimport_lib/process.js</process>
diff --git a/process/Liquibase_lib/Liquibase_lib.aod b/process/Liquibase_lib/Liquibase_lib.aod
index 5fc68808e15..31fe997666b 100644
--- a/process/Liquibase_lib/Liquibase_lib.aod
+++ b/process/Liquibase_lib/Liquibase_lib.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>Liquibase_lib</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <process>%aditoprj%/process/Liquibase_lib/process.js</process>
diff --git a/process/Location_lib/Location_lib.aod b/process/Location_lib/Location_lib.aod
index 1a9a229f653..81211576721 100644
--- a/process/Location_lib/Location_lib.aod
+++ b/process/Location_lib/Location_lib.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>Location_lib</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <process>%aditoprj%/process/Location_lib/process.js</process>
diff --git a/process/Loghistory_lib/Loghistory_lib.aod b/process/Loghistory_lib/Loghistory_lib.aod
index 454f37cd2f2..bcbd876cc0f 100644
--- a/process/Loghistory_lib/Loghistory_lib.aod
+++ b/process/Loghistory_lib/Loghistory_lib.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>Loghistory_lib</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <process>%aditoprj%/process/Loghistory_lib/process.js</process>
diff --git a/process/MSTeams_lib/MSTeams_lib.aod b/process/MSTeams_lib/MSTeams_lib.aod
index 466fb42fa29..8572851b599 100644
--- a/process/MSTeams_lib/MSTeams_lib.aod
+++ b/process/MSTeams_lib/MSTeams_lib.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>MSTeams_lib</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <process>%aditoprj%/process/MSTeams_lib/process.js</process>
diff --git a/process/MimeType_lib/MimeType_lib.aod b/process/MimeType_lib/MimeType_lib.aod
index 01ad226f611..dbc01a017d0 100644
--- a/process/MimeType_lib/MimeType_lib.aod
+++ b/process/MimeType_lib/MimeType_lib.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>MimeType_lib</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <process>%aditoprj%/process/MimeType_lib/process.js</process>
diff --git a/process/Money_lib/Money_lib.aod b/process/Money_lib/Money_lib.aod
index 9c27e1c6deb..5232420c51a 100644
--- a/process/Money_lib/Money_lib.aod
+++ b/process/Money_lib/Money_lib.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>Money_lib</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <process>%aditoprj%/process/Money_lib/process.js</process>
diff --git a/process/Neon_lib/Neon_lib.aod b/process/Neon_lib/Neon_lib.aod
index 6c99555616c..0a51cffca15 100644
--- a/process/Neon_lib/Neon_lib.aod
+++ b/process/Neon_lib/Neon_lib.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>Neon_lib</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <documentation>%aditoprj%/process/Neon_lib/documentation.adoc</documentation>
diff --git a/process/NewsSystem_lib/NewsSystem_lib.aod b/process/NewsSystem_lib/NewsSystem_lib.aod
index f4907ecd213..8c226c330e0 100644
--- a/process/NewsSystem_lib/NewsSystem_lib.aod
+++ b/process/NewsSystem_lib/NewsSystem_lib.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>NewsSystem_lib</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <process>%aditoprj%/process/NewsSystem_lib/process.js</process>
diff --git a/process/Notification_lib/Notification_lib.aod b/process/Notification_lib/Notification_lib.aod
index 41cd1071d9d..28beacbb0d8 100644
--- a/process/Notification_lib/Notification_lib.aod
+++ b/process/Notification_lib/Notification_lib.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>Notification_lib</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <process>%aditoprj%/process/Notification_lib/process.js</process>
diff --git a/process/ObjectRelationTypeRegistry_basic/ObjectRelationTypeRegistry_basic.aod b/process/ObjectRelationTypeRegistry_basic/ObjectRelationTypeRegistry_basic.aod
index fe86c4d1f97..65ad5b0b0b2 100644
--- a/process/ObjectRelationTypeRegistry_basic/ObjectRelationTypeRegistry_basic.aod
+++ b/process/ObjectRelationTypeRegistry_basic/ObjectRelationTypeRegistry_basic.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>ObjectRelationTypeRegistry_basic</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <process>%aditoprj%/process/ObjectRelationTypeRegistry_basic/process.js</process>
diff --git a/process/ObjectRelation_lib/ObjectRelation_lib.aod b/process/ObjectRelation_lib/ObjectRelation_lib.aod
index e5a4d95eb35..b48e1daede5 100644
--- a/process/ObjectRelation_lib/ObjectRelation_lib.aod
+++ b/process/ObjectRelation_lib/ObjectRelation_lib.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>ObjectRelation_lib</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <process>%aditoprj%/process/ObjectRelation_lib/process.js</process>
diff --git a/process/OfferOrder_lib/OfferOrder_lib.aod b/process/OfferOrder_lib/OfferOrder_lib.aod
index 0df9d9a624d..353cb8ca017 100644
--- a/process/OfferOrder_lib/OfferOrder_lib.aod
+++ b/process/OfferOrder_lib/OfferOrder_lib.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>OfferOrder_lib</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <process>%aditoprj%/process/OfferOrder_lib/process.js</process>
diff --git a/process/Offer_lib/Offer_lib.aod b/process/Offer_lib/Offer_lib.aod
index 41247d62423..d1f79adeeb6 100644
--- a/process/Offer_lib/Offer_lib.aod
+++ b/process/Offer_lib/Offer_lib.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>Offer_lib</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <process>%aditoprj%/process/Offer_lib/process.js</process>
diff --git a/process/Order_lib/Order_lib.aod b/process/Order_lib/Order_lib.aod
index 3e225851b15..5f4e4c315b8 100644
--- a/process/Order_lib/Order_lib.aod
+++ b/process/Order_lib/Order_lib.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>Order_lib</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <process>%aditoprj%/process/Order_lib/process.js</process>
diff --git a/process/Organisation_lib/Organisation_lib.aod b/process/Organisation_lib/Organisation_lib.aod
index 47bca652458..1f0d01aabbd 100644
--- a/process/Organisation_lib/Organisation_lib.aod
+++ b/process/Organisation_lib/Organisation_lib.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>Organisation_lib</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <process>%aditoprj%/process/Organisation_lib/process.js</process>
diff --git a/process/PermissionCalendar_lib/PermissionCalendar_lib.aod b/process/PermissionCalendar_lib/PermissionCalendar_lib.aod
index 8f5c6970ce7..1b2ab4f4651 100644
--- a/process/PermissionCalendar_lib/PermissionCalendar_lib.aod
+++ b/process/PermissionCalendar_lib/PermissionCalendar_lib.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>PermissionCalendar_lib</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <process>%aditoprj%/process/PermissionCalendar_lib/process.js</process>
diff --git a/process/Permission_lib/Permission_lib.aod b/process/Permission_lib/Permission_lib.aod
index 00dceca9751..642b9b00218 100644
--- a/process/Permission_lib/Permission_lib.aod
+++ b/process/Permission_lib/Permission_lib.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>Permission_lib</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <process>%aditoprj%/process/Permission_lib/process.js</process>
diff --git a/process/Person_lib/Person_lib.aod b/process/Person_lib/Person_lib.aod
index 04c0795c9a2..80e4dc8248f 100644
--- a/process/Person_lib/Person_lib.aod
+++ b/process/Person_lib/Person_lib.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>Person_lib</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <process>%aditoprj%/process/Person_lib/process.js</process>
diff --git a/process/Placeholder_lib/Placeholder_lib.aod b/process/Placeholder_lib/Placeholder_lib.aod
index 1cc12d42bd4..2af9f3a9ab1 100644
--- a/process/Placeholder_lib/Placeholder_lib.aod
+++ b/process/Placeholder_lib/Placeholder_lib.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>Placeholder_lib</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <process>%aditoprj%/process/Placeholder_lib/process.js</process>
diff --git a/process/PostalAddress_lib/PostalAddress_lib.aod b/process/PostalAddress_lib/PostalAddress_lib.aod
index f7af81f2c9b..a07348310e4 100644
--- a/process/PostalAddress_lib/PostalAddress_lib.aod
+++ b/process/PostalAddress_lib/PostalAddress_lib.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>PostalAddress_lib</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <process>%aditoprj%/process/PostalAddress_lib/process.js</process>
diff --git a/process/Product_lib/Product_lib.aod b/process/Product_lib/Product_lib.aod
index 9c72fa0f0cd..a1197452b92 100644
--- a/process/Product_lib/Product_lib.aod
+++ b/process/Product_lib/Product_lib.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>Product_lib</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <process>%aditoprj%/process/Product_lib/process.js</process>
diff --git a/process/Proto_lib/Proto_lib.aod b/process/Proto_lib/Proto_lib.aod
index dd8841dc7ab..ce167574ad6 100644
--- a/process/Proto_lib/Proto_lib.aod
+++ b/process/Proto_lib/Proto_lib.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>Proto_lib</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <process>%aditoprj%/process/Proto_lib/process.js</process>
diff --git a/process/RebuildAllDuplicateCaches_serverProcess/RebuildAllDuplicateCaches_serverProcess.aod b/process/RebuildAllDuplicateCaches_serverProcess/RebuildAllDuplicateCaches_serverProcess.aod
index 7d7d887aa09..11432054cc7 100644
--- a/process/RebuildAllDuplicateCaches_serverProcess/RebuildAllDuplicateCaches_serverProcess.aod
+++ b/process/RebuildAllDuplicateCaches_serverProcess/RebuildAllDuplicateCaches_serverProcess.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>RebuildAllDuplicateCaches_serverProcess</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <process>%aditoprj%/process/RebuildAllDuplicateCaches_serverProcess/process.js</process>
diff --git a/process/RebuildDuplicatesCache_serverProcess/RebuildDuplicatesCache_serverProcess.aod b/process/RebuildDuplicatesCache_serverProcess/RebuildDuplicatesCache_serverProcess.aod
index 21d05594806..078550c7200 100644
--- a/process/RebuildDuplicatesCache_serverProcess/RebuildDuplicatesCache_serverProcess.aod
+++ b/process/RebuildDuplicatesCache_serverProcess/RebuildDuplicatesCache_serverProcess.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>RebuildDuplicatesCache_serverProcess</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <process>%aditoprj%/process/RebuildDuplicatesCache_serverProcess/process.js</process>
diff --git a/process/RemoveFromCampaign_workflowService/RemoveFromCampaign_workflowService.aod b/process/RemoveFromCampaign_workflowService/RemoveFromCampaign_workflowService.aod
index 8dde3d1708e..9a2e06c6e71 100644
--- a/process/RemoveFromCampaign_workflowService/RemoveFromCampaign_workflowService.aod
+++ b/process/RemoveFromCampaign_workflowService/RemoveFromCampaign_workflowService.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>RemoveFromCampaign_workflowService</name>
   <title>Remove from Campaign</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/process/Report_lib/Report_lib.aod b/process/Report_lib/Report_lib.aod
index b847e04de62..a7caa940389 100644
--- a/process/Report_lib/Report_lib.aod
+++ b/process/Report_lib/Report_lib.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>Report_lib</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <process>%aditoprj%/process/Report_lib/process.js</process>
diff --git a/process/Salesproject_lib/Salesproject_lib.aod b/process/Salesproject_lib/Salesproject_lib.aod
index 06956e42708..32fb545354a 100644
--- a/process/Salesproject_lib/Salesproject_lib.aod
+++ b/process/Salesproject_lib/Salesproject_lib.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>Salesproject_lib</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <process>%aditoprj%/process/Salesproject_lib/process.js</process>
diff --git a/process/SendEmail_workflowService/SendEmail_workflowService.aod b/process/SendEmail_workflowService/SendEmail_workflowService.aod
index d58abf46337..2dbab69e62e 100644
--- a/process/SendEmail_workflowService/SendEmail_workflowService.aod
+++ b/process/SendEmail_workflowService/SendEmail_workflowService.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>SendEmail_workflowService</name>
   <title>Send email</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/process/SetAttribute_workflowService/SetAttribute_workflowService.aod b/process/SetAttribute_workflowService/SetAttribute_workflowService.aod
index 0816609206a..17c234d1ae4 100644
--- a/process/SetAttribute_workflowService/SetAttribute_workflowService.aod
+++ b/process/SetAttribute_workflowService/SetAttribute_workflowService.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>SetAttribute_workflowService</name>
   <title>Set attribute</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/process/SetCampaignStep_workflowService/SetCampaignStep_workflowService.aod b/process/SetCampaignStep_workflowService/SetCampaignStep_workflowService.aod
index 708612a5a1a..202fd456008 100644
--- a/process/SetCampaignStep_workflowService/SetCampaignStep_workflowService.aod
+++ b/process/SetCampaignStep_workflowService/SetCampaignStep_workflowService.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>SetCampaignStep_workflowService</name>
   <title>Set Campaign Step</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/process/SetSalesprojectPhase_workflowService/SetSalesprojectPhase_workflowService.aod b/process/SetSalesprojectPhase_workflowService/SetSalesprojectPhase_workflowService.aod
index cd9e8f63d12..19550d2d6b5 100644
--- a/process/SetSalesprojectPhase_workflowService/SetSalesprojectPhase_workflowService.aod
+++ b/process/SetSalesprojectPhase_workflowService/SetSalesprojectPhase_workflowService.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>SetSalesprojectPhase_workflowService</name>
   <title>Set salesproject phase</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/process/SqlBuilder_test/SqlBuilder_test.aod b/process/SqlBuilder_test/SqlBuilder_test.aod
index 39922829116..c8c1620c9e4 100644
--- a/process/SqlBuilder_test/SqlBuilder_test.aod
+++ b/process/SqlBuilder_test/SqlBuilder_test.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>SqlBuilder_test</name>
   <title>[TEST] Sql_lib - SqlBuilder</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/process/SqlMaskingUtils_test/SqlMaskingUtils_test.aod b/process/SqlMaskingUtils_test/SqlMaskingUtils_test.aod
index 8636a3707b1..e3fbcc2640d 100644
--- a/process/SqlMaskingUtils_test/SqlMaskingUtils_test.aod
+++ b/process/SqlMaskingUtils_test/SqlMaskingUtils_test.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>SqlMaskingUtils_test</name>
   <title>[TEST] Sql_lib - SqlMaskingUtils</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/process/Sql_lib/Sql_lib.aod b/process/Sql_lib/Sql_lib.aod
index 8e786ba49ef..9ecdf3e0cef 100644
--- a/process/Sql_lib/Sql_lib.aod
+++ b/process/Sql_lib/Sql_lib.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>Sql_lib</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <documentation>%aditoprj%/process/Sql_lib/documentation.adoc</documentation>
diff --git a/process/StandardObject_lib/StandardObject_lib.aod b/process/StandardObject_lib/StandardObject_lib.aod
index 94c1fcc045a..c69d626eb8d 100644
--- a/process/StandardObject_lib/StandardObject_lib.aod
+++ b/process/StandardObject_lib/StandardObject_lib.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>StandardObject_lib</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <documentation>%aditoprj%/process/StandardObject_lib/documentation.adoc</documentation>
diff --git a/process/TempRebuildIndexPerson_serverProcess/TempRebuildIndexPerson_serverProcess.aod b/process/TempRebuildIndexPerson_serverProcess/TempRebuildIndexPerson_serverProcess.aod
index bffee7201af..3d6e25db86c 100644
--- a/process/TempRebuildIndexPerson_serverProcess/TempRebuildIndexPerson_serverProcess.aod
+++ b/process/TempRebuildIndexPerson_serverProcess/TempRebuildIndexPerson_serverProcess.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>TempRebuildIndexPerson_serverProcess</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <process>%aditoprj%/process/TempRebuildIndexPerson_serverProcess/process.js</process>
diff --git a/process/Terminal_lib/Terminal_lib.aod b/process/Terminal_lib/Terminal_lib.aod
index 9fa0811425e..fee1f093874 100644
--- a/process/Terminal_lib/Terminal_lib.aod
+++ b/process/Terminal_lib/Terminal_lib.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>Terminal_lib</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <documentation>%aditoprj%/process/Terminal_lib/documentation.adoc</documentation>
diff --git a/process/TestIndexSearch/TestIndexSearch.aod b/process/TestIndexSearch/TestIndexSearch.aod
index 9dfabc2aa4b..66107b82c66 100644
--- a/process/TestIndexSearch/TestIndexSearch.aod
+++ b/process/TestIndexSearch/TestIndexSearch.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>TestIndexSearch</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <process>%aditoprj%/process/TestIndexSearch/process.js</process>
diff --git a/process/Ticket_lib/Ticket_lib.aod b/process/Ticket_lib/Ticket_lib.aod
index 5ce9c41505c..f8dd6fe8f2e 100644
--- a/process/Ticket_lib/Ticket_lib.aod
+++ b/process/Ticket_lib/Ticket_lib.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>Ticket_lib</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <process>%aditoprj%/process/Ticket_lib/process.js</process>
diff --git a/process/Timetracking_lib/Timetracking_lib.aod b/process/Timetracking_lib/Timetracking_lib.aod
index b514721991f..140b9a95c1b 100644
--- a/process/Timetracking_lib/Timetracking_lib.aod
+++ b/process/Timetracking_lib/Timetracking_lib.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>Timetracking_lib</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <process>%aditoprj%/process/Timetracking_lib/process.js</process>
diff --git a/process/Turnover_lib/Turnover_lib.aod b/process/Turnover_lib/Turnover_lib.aod
index 28bacd7d8ea..12dbb916887 100644
--- a/process/Turnover_lib/Turnover_lib.aod
+++ b/process/Turnover_lib/Turnover_lib.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>Turnover_lib</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <process>%aditoprj%/process/Turnover_lib/process.js</process>
diff --git a/process/UnitTest_lib/UnitTest_lib.aod b/process/UnitTest_lib/UnitTest_lib.aod
index a4499316765..25bd7badb37 100644
--- a/process/UnitTest_lib/UnitTest_lib.aod
+++ b/process/UnitTest_lib/UnitTest_lib.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>UnitTest_lib</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <icon>VAADIN:CHECK_CIRCLE_O</icon>
diff --git a/process/UnitTest_test/UnitTest_test.aod b/process/UnitTest_test/UnitTest_test.aod
index 095a395529b..853608a4031 100644
--- a/process/UnitTest_test/UnitTest_test.aod
+++ b/process/UnitTest_test/UnitTest_test.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>UnitTest_test</name>
   <title>[TEST] UnitTest_lib</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/process/UpdateOffer_workflowService/UpdateOffer_workflowService.aod b/process/UpdateOffer_workflowService/UpdateOffer_workflowService.aod
index 6afa7117eb9..39149b2c28f 100644
--- a/process/UpdateOffer_workflowService/UpdateOffer_workflowService.aod
+++ b/process/UpdateOffer_workflowService/UpdateOffer_workflowService.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>UpdateOffer_workflowService</name>
   <title>Update offer</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/process/UserSettings_lib/UserSettings_lib.aod b/process/UserSettings_lib/UserSettings_lib.aod
index 41d85657ed0..c1470052e9c 100644
--- a/process/UserSettings_lib/UserSettings_lib.aod
+++ b/process/UserSettings_lib/UserSettings_lib.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>UserSettings_lib</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <process>%aditoprj%/process/UserSettings_lib/process.js</process>
diff --git a/process/Util_lib/Util_lib.aod b/process/Util_lib/Util_lib.aod
index 6a28f6ac135..67bbab87069 100644
--- a/process/Util_lib/Util_lib.aod
+++ b/process/Util_lib/Util_lib.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>Util_lib</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <process>%aditoprj%/process/Util_lib/process.js</process>
diff --git a/process/ViewTemplateData_lib/ViewTemplateData_lib.aod b/process/ViewTemplateData_lib/ViewTemplateData_lib.aod
index 5bb45484658..c176378fed5 100644
--- a/process/ViewTemplateData_lib/ViewTemplateData_lib.aod
+++ b/process/ViewTemplateData_lib/ViewTemplateData_lib.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>ViewTemplateData_lib</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <process>%aditoprj%/process/ViewTemplateData_lib/process.js</process>
diff --git a/process/Workflow_lib/Workflow_lib.aod b/process/Workflow_lib/Workflow_lib.aod
index 3045e31bec2..bff9603a4c8 100644
--- a/process/Workflow_lib/Workflow_lib.aod
+++ b/process/Workflow_lib/Workflow_lib.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>Workflow_lib</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <process>%aditoprj%/process/Workflow_lib/process.js</process>
diff --git a/process/WsValidation_lib/WsValidation_lib.aod b/process/WsValidation_lib/WsValidation_lib.aod
index a896dd2fdc1..fcb5a966b0d 100644
--- a/process/WsValidation_lib/WsValidation_lib.aod
+++ b/process/WsValidation_lib/WsValidation_lib.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>WsValidation_lib</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <documentation>%aditoprj%/process/WsValidation_lib/documentation.adoc</documentation>
diff --git a/process/_all_test/_all_test.aod b/process/_all_test/_all_test.aod
index 4336a9ddb94..f65a8c72b0b 100644
--- a/process/_all_test/_all_test.aod
+++ b/process/_all_test/_all_test.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>_all_test</name>
   <title>[TEST] .All</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/process/_test_clientProcess/_test_clientProcess.aod b/process/_test_clientProcess/_test_clientProcess.aod
index d003fb54e12..083128043b0 100644
--- a/process/_test_clientProcess/_test_clientProcess.aod
+++ b/process/_test_clientProcess/_test_clientProcess.aod
@@ -1,12 +1,14 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>_test_clientProcess</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <documentation>%aditoprj%/process/_test_clientProcess/documentation.adoc</documentation>
   <process>%aditoprj%/process/_test_clientProcess/process.js</process>
   <publishAsWebservice v="true" />
   <wsdl>%aditoprj%/process/_test_clientProcess/wsdl.wsdl</wsdl>
-  <loginTypeId>internal.none</loginTypeId>
+  <loginTypeId>
+    <element>internal.none</element>
+  </loginTypeId>
   <alias>Data_alias</alias>
   <variants>
     <element>EXECUTABLE</element>
diff --git a/process/_test_importer/_test_importer.aod b/process/_test_importer/_test_importer.aod
index 609067fbad2..86b1e22c42f 100644
--- a/process/_test_importer/_test_importer.aod
+++ b/process/_test_importer/_test_importer.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>_test_importer</name>
   <title>Importer</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/process/autostartNeon/autostartNeon.aod b/process/autostartNeon/autostartNeon.aod
index 5cae2b54c4d..53cfbced037 100644
--- a/process/autostartNeon/autostartNeon.aod
+++ b/process/autostartNeon/autostartNeon.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>autostartNeon</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <process>%aditoprj%/process/autostartNeon/process.js</process>
diff --git a/process/blobHandler/blobHandler.aod b/process/blobHandler/blobHandler.aod
index ea16fe91642..df5da687878 100644
--- a/process/blobHandler/blobHandler.aod
+++ b/process/blobHandler/blobHandler.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>blobHandler</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <process>%aditoprj%/process/blobHandler/process.js</process>
diff --git a/process/buildSerialLetter_serverProcess/buildSerialLetter_serverProcess.aod b/process/buildSerialLetter_serverProcess/buildSerialLetter_serverProcess.aod
index 5474adbf834..c5fa5bae70e 100644
--- a/process/buildSerialLetter_serverProcess/buildSerialLetter_serverProcess.aod
+++ b/process/buildSerialLetter_serverProcess/buildSerialLetter_serverProcess.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>buildSerialLetter_serverProcess</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <documentation>%aditoprj%/process/buildSerialLetter_serverProcess/documentation.adoc</documentation>
diff --git a/process/ctiCall/ctiCall.aod b/process/ctiCall/ctiCall.aod
index efab080bf75..6614528e038 100644
--- a/process/ctiCall/ctiCall.aod
+++ b/process/ctiCall/ctiCall.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>ctiCall</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <process>%aditoprj%/process/ctiCall/process.js</process>
diff --git a/process/ctiServerEvents/ctiServerEvents.aod b/process/ctiServerEvents/ctiServerEvents.aod
index 0b6ce1bf162..4f02a720a23 100644
--- a/process/ctiServerEvents/ctiServerEvents.aod
+++ b/process/ctiServerEvents/ctiServerEvents.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>ctiServerEvents</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <process>%aditoprj%/process/ctiServerEvents/process.js</process>
diff --git a/process/emailWrite/emailWrite.aod b/process/emailWrite/emailWrite.aod
index 60d3efe9f57..a752349818c 100644
--- a/process/emailWrite/emailWrite.aod
+++ b/process/emailWrite/emailWrite.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>emailWrite</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <process>%aditoprj%/process/emailWrite/process.js</process>
diff --git a/process/ewsSyncCalendarPermissions_serverProcess/ewsSyncCalendarPermissions_serverProcess.aod b/process/ewsSyncCalendarPermissions_serverProcess/ewsSyncCalendarPermissions_serverProcess.aod
index 703deab5221..353165e368d 100644
--- a/process/ewsSyncCalendarPermissions_serverProcess/ewsSyncCalendarPermissions_serverProcess.aod
+++ b/process/ewsSyncCalendarPermissions_serverProcess/ewsSyncCalendarPermissions_serverProcess.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>ewsSyncCalendarPermissions_serverProcess</name>
   <title>Synchronize calendar permissions from Exchange to ADITO</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/process/exportLiquibaseContent_serverProcess/exportLiquibaseContent_serverProcess.aod b/process/exportLiquibaseContent_serverProcess/exportLiquibaseContent_serverProcess.aod
index 117726612c9..81c78189574 100644
--- a/process/exportLiquibaseContent_serverProcess/exportLiquibaseContent_serverProcess.aod
+++ b/process/exportLiquibaseContent_serverProcess/exportLiquibaseContent_serverProcess.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>exportLiquibaseContent_serverProcess</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <documentation>%aditoprj%/process/exportLiquibaseContent_serverProcess/documentation.adoc</documentation>
diff --git a/process/exportLiquibaseSystemalias_serverProcess/exportLiquibaseSystemalias_serverProcess.aod b/process/exportLiquibaseSystemalias_serverProcess/exportLiquibaseSystemalias_serverProcess.aod
index 9437d3b3053..2f46ffd47d1 100644
--- a/process/exportLiquibaseSystemalias_serverProcess/exportLiquibaseSystemalias_serverProcess.aod
+++ b/process/exportLiquibaseSystemalias_serverProcess/exportLiquibaseSystemalias_serverProcess.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>exportLiquibaseSystemalias_serverProcess</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <process>%aditoprj%/process/exportLiquibaseSystemalias_serverProcess/process.js</process>
diff --git a/process/getDocxDocument_serverProcess/getDocxDocument_serverProcess.aod b/process/getDocxDocument_serverProcess/getDocxDocument_serverProcess.aod
index cb4430fb0bc..fe54f57b76a 100644
--- a/process/getDocxDocument_serverProcess/getDocxDocument_serverProcess.aod
+++ b/process/getDocxDocument_serverProcess/getDocxDocument_serverProcess.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>getDocxDocument_serverProcess</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <documentation>%aditoprj%/process/getDocxDocument_serverProcess/documentation.adoc</documentation>
diff --git a/process/importLead_serverProcess/importLead_serverProcess.aod b/process/importLead_serverProcess/importLead_serverProcess.aod
index 4316e412717..a73a9e8246f 100644
--- a/process/importLead_serverProcess/importLead_serverProcess.aod
+++ b/process/importLead_serverProcess/importLead_serverProcess.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>importLead_serverProcess</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <process>%aditoprj%/process/importLead_serverProcess/process.js</process>
diff --git a/process/mailbridge/mailbridge.aod b/process/mailbridge/mailbridge.aod
index 254ff35492e..079dab4650b 100644
--- a/process/mailbridge/mailbridge.aod
+++ b/process/mailbridge/mailbridge.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>mailbridge</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <documentation>%aditoprj%/process/mailbridge/documentation.adoc</documentation>
diff --git a/process/mark_cachedrecordcontainers_invalid_serverProcess/mark_cachedrecordcontainers_invalid_serverProcess.aod b/process/mark_cachedrecordcontainers_invalid_serverProcess/mark_cachedrecordcontainers_invalid_serverProcess.aod
index cfd92c97942..a6d4fe24cf1 100644
--- a/process/mark_cachedrecordcontainers_invalid_serverProcess/mark_cachedrecordcontainers_invalid_serverProcess.aod
+++ b/process/mark_cachedrecordcontainers_invalid_serverProcess/mark_cachedrecordcontainers_invalid_serverProcess.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>mark_cachedrecordcontainers_invalid_serverProcess</name>
   <title>Mark all cached record containers as invalid</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/process/mstBot_rest/mstBot_rest.aod b/process/mstBot_rest/mstBot_rest.aod
index dd88fc1a4c1..64a88b44527 100644
--- a/process/mstBot_rest/mstBot_rest.aod
+++ b/process/mstBot_rest/mstBot_rest.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>mstBot_rest</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <process>%aditoprj%/process/mstBot_rest/process.js</process>
@@ -7,7 +7,9 @@
   <style>REST</style>
   <restAcceptedMimeType>application/json</restAcceptedMimeType>
   <restDeliveredMimeType>application/json</restDeliveredMimeType>
-  <loginTypeId>internal.none</loginTypeId>
+  <loginTypeId>
+    <element>internal.none</element>
+  </loginTypeId>
   <publishAsClientWebservice v="true" />
   <alias>Data_alias</alias>
 </process>
diff --git a/process/process_audit/process_audit.aod b/process/process_audit/process_audit.aod
index 55b53099a0f..fb5dcd8da90 100644
--- a/process/process_audit/process_audit.aod
+++ b/process/process_audit/process_audit.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>process_audit</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <process>%aditoprj%/process/process_audit/process.js</process>
diff --git a/process/rebuildIndex_serverProcess/rebuildIndex_serverProcess.aod b/process/rebuildIndex_serverProcess/rebuildIndex_serverProcess.aod
index 71006318489..106c678f9ad 100644
--- a/process/rebuildIndex_serverProcess/rebuildIndex_serverProcess.aod
+++ b/process/rebuildIndex_serverProcess/rebuildIndex_serverProcess.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>rebuildIndex_serverProcess</name>
   <title>rebuild Index</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/process/redirect_rest/redirect_rest.aod b/process/redirect_rest/redirect_rest.aod
index 3087b0ad4b7..bda233f7990 100644
--- a/process/redirect_rest/redirect_rest.aod
+++ b/process/redirect_rest/redirect_rest.aod
@@ -1,11 +1,13 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>redirect_rest</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <process>%aditoprj%/process/redirect_rest/process.js</process>
   <publishAsWebservice v="true" />
   <style>REST</style>
-  <loginTypeId>internal.none</loginTypeId>
+  <loginTypeId>
+    <element>internal.none</element>
+  </loginTypeId>
   <variants>
     <element>EXECUTABLE</element>
   </variants>
diff --git a/process/removeMSTTeams_serverProcess/removeMSTTeams_serverProcess.aod b/process/removeMSTTeams_serverProcess/removeMSTTeams_serverProcess.aod
index f8b67e0fdd0..c120e20c39f 100644
--- a/process/removeMSTTeams_serverProcess/removeMSTTeams_serverProcess.aod
+++ b/process/removeMSTTeams_serverProcess/removeMSTTeams_serverProcess.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>removeMSTTeams_serverProcess</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <process>%aditoprj%/process/removeMSTTeams_serverProcess/process.js</process>
diff --git a/process/sendBulkMail_serverProcess/sendBulkMail_serverProcess.aod b/process/sendBulkMail_serverProcess/sendBulkMail_serverProcess.aod
index 645ed890444..8357bb2adf8 100644
--- a/process/sendBulkMail_serverProcess/sendBulkMail_serverProcess.aod
+++ b/process/sendBulkMail_serverProcess/sendBulkMail_serverProcess.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>sendBulkMail_serverProcess</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <documentation>%aditoprj%/process/sendBulkMail_serverProcess/documentation.adoc</documentation>
diff --git a/process/setMissingAddressLocations_serverProcess/setMissingAddressLocations_serverProcess.aod b/process/setMissingAddressLocations_serverProcess/setMissingAddressLocations_serverProcess.aod
index 3752f6718de..23c67a18a2d 100644
--- a/process/setMissingAddressLocations_serverProcess/setMissingAddressLocations_serverProcess.aod
+++ b/process/setMissingAddressLocations_serverProcess/setMissingAddressLocations_serverProcess.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>setMissingAddressLocations_serverProcess</name>
   <title>Set missing address locations</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/process/startWorkflowInstances_serverProcess/startWorkflowInstances_serverProcess.aod b/process/startWorkflowInstances_serverProcess/startWorkflowInstances_serverProcess.aod
index 5d5de80f53c..e1cb70568a3 100644
--- a/process/startWorkflowInstances_serverProcess/startWorkflowInstances_serverProcess.aod
+++ b/process/startWorkflowInstances_serverProcess/startWorkflowInstances_serverProcess.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>startWorkflowInstances_serverProcess</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <process>%aditoprj%/process/startWorkflowInstances_serverProcess/process.js</process>
diff --git a/process/test_iCommRestriction/test_iCommRestriction.aod b/process/test_iCommRestriction/test_iCommRestriction.aod
index cc954a462d0..6d894bcf6be 100644
--- a/process/test_iCommRestriction/test_iCommRestriction.aod
+++ b/process/test_iCommRestriction/test_iCommRestriction.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>test_iCommRestriction</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <process>%aditoprj%/process/test_iCommRestriction/process.js</process>
diff --git a/process/updateActivities_serverProzess/updateActivities_serverProzess.aod b/process/updateActivities_serverProzess/updateActivities_serverProzess.aod
index 51684eaceb2..8d14a4c15d8 100644
--- a/process/updateActivities_serverProzess/updateActivities_serverProzess.aod
+++ b/process/updateActivities_serverProzess/updateActivities_serverProzess.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>updateActivities_serverProzess</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <process>%aditoprj%/process/updateActivities_serverProzess/process.js</process>
diff --git a/process/updateAllAddressLocations_serverProcess/updateAllAddressLocations_serverProcess.aod b/process/updateAllAddressLocations_serverProcess/updateAllAddressLocations_serverProcess.aod
index e0b953cac1c..3b386451841 100644
--- a/process/updateAllAddressLocations_serverProcess/updateAllAddressLocations_serverProcess.aod
+++ b/process/updateAllAddressLocations_serverProcess/updateAllAddressLocations_serverProcess.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>updateAllAddressLocations_serverProcess</name>
   <title>Set all address locations</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/process/updateClassifications_serverProcess/updateClassifications_serverProcess.aod b/process/updateClassifications_serverProcess/updateClassifications_serverProcess.aod
index 52e9c03b7cf..c3142850326 100644
--- a/process/updateClassifications_serverProcess/updateClassifications_serverProcess.aod
+++ b/process/updateClassifications_serverProcess/updateClassifications_serverProcess.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>updateClassifications_serverProcess</name>
   <title>Update all Classification entries in the system</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/process/workflowDeploy_rest/workflowDeploy_rest.aod b/process/workflowDeploy_rest/workflowDeploy_rest.aod
index 05c891a9028..ad6fb04bf23 100644
--- a/process/workflowDeploy_rest/workflowDeploy_rest.aod
+++ b/process/workflowDeploy_rest/workflowDeploy_rest.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>workflowDeploy_rest</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <process>%aditoprj%/process/workflowDeploy_rest/process.js</process>
diff --git a/process/workflowExtension_serverProcess/workflowExtension_serverProcess.aod b/process/workflowExtension_serverProcess/workflowExtension_serverProcess.aod
index d9ed92e0f4d..195a4cd633e 100644
--- a/process/workflowExtension_serverProcess/workflowExtension_serverProcess.aod
+++ b/process/workflowExtension_serverProcess/workflowExtension_serverProcess.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>workflowExtension_serverProcess</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <process>%aditoprj%/process/workflowExtension_serverProcess/process.js</process>
diff --git a/process/workflowLinkTracking_rest/workflowLinkTracking_rest.aod b/process/workflowLinkTracking_rest/workflowLinkTracking_rest.aod
index 9d33ad87327..c52adefed8b 100644
--- a/process/workflowLinkTracking_rest/workflowLinkTracking_rest.aod
+++ b/process/workflowLinkTracking_rest/workflowLinkTracking_rest.aod
@@ -1,11 +1,13 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>workflowLinkTracking_rest</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <process>%aditoprj%/process/workflowLinkTracking_rest/process.js</process>
   <publishAsWebservice v="false" />
   <style>REST</style>
-  <loginTypeId>internal.none</loginTypeId>
+  <loginTypeId>
+    <element>internal.none</element>
+  </loginTypeId>
   <restrictedRoles />
   <alias>Data_alias</alias>
   <variants>
diff --git a/process/workflowPrivileges_rest/workflowPrivileges_rest.aod b/process/workflowPrivileges_rest/workflowPrivileges_rest.aod
index 5a75e4758d9..5ea1497835d 100644
--- a/process/workflowPrivileges_rest/workflowPrivileges_rest.aod
+++ b/process/workflowPrivileges_rest/workflowPrivileges_rest.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>workflowPrivileges_rest</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <process>%aditoprj%/process/workflowPrivileges_rest/process.js</process>
diff --git a/process/workflowRoles_rest/workflowRoles_rest.aod b/process/workflowRoles_rest/workflowRoles_rest.aod
index 4f15d52de42..6cfb124a661 100644
--- a/process/workflowRoles_rest/workflowRoles_rest.aod
+++ b/process/workflowRoles_rest/workflowRoles_rest.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>workflowRoles_rest</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <documentation>%aditoprj%/process/workflowRoles_rest/documentation.adoc</documentation>
diff --git a/process/workflowServiceTaskParams_rest/workflowServiceTaskParams_rest.aod b/process/workflowServiceTaskParams_rest/workflowServiceTaskParams_rest.aod
index 7922e7f73b3..24c524d5bbe 100644
--- a/process/workflowServiceTaskParams_rest/workflowServiceTaskParams_rest.aod
+++ b/process/workflowServiceTaskParams_rest/workflowServiceTaskParams_rest.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>workflowServiceTaskParams_rest</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <documentation>%aditoprj%/process/workflowServiceTaskParams_rest/documentation.adoc</documentation>
diff --git a/process/workflowServiceTasks_rest/workflowServiceTasks_rest.aod b/process/workflowServiceTasks_rest/workflowServiceTasks_rest.aod
index ea3dfbea15a..189d4377abe 100644
--- a/process/workflowServiceTasks_rest/workflowServiceTasks_rest.aod
+++ b/process/workflowServiceTasks_rest/workflowServiceTasks_rest.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>workflowServiceTasks_rest</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <documentation>%aditoprj%/process/workflowServiceTasks_rest/documentation.adoc</documentation>
diff --git a/process/workflowSignal_rest/workflowSignal_rest.aod b/process/workflowSignal_rest/workflowSignal_rest.aod
index 3006dce1189..db28e29d522 100644
--- a/process/workflowSignal_rest/workflowSignal_rest.aod
+++ b/process/workflowSignal_rest/workflowSignal_rest.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>workflowSignal_rest</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <process>%aditoprj%/process/workflowSignal_rest/process.js</process>
diff --git a/process/workflowUsers_rest/workflowUsers_rest.aod b/process/workflowUsers_rest/workflowUsers_rest.aod
index 6669992f8a6..ff6c8aa88c1 100644
--- a/process/workflowUsers_rest/workflowUsers_rest.aod
+++ b/process/workflowUsers_rest/workflowUsers_rest.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2">
   <name>workflowUsers_rest</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <documentation>%aditoprj%/process/workflowUsers_rest/documentation.adoc</documentation>
-- 
GitLab