diff --git a/.liquibase/Data_alias/basic/2019.1.4/Salesprojectmilestone_add_parent.xml b/.liquibase/Data_alias/basic/2019.1.4/Salesprojectmilestone_add_parent.xml
new file mode 100644
index 0000000000000000000000000000000000000000..8e47cb4925bb3a7a4e714f74364e8a8fbe39d64d
--- /dev/null
+++ b/.liquibase/Data_alias/basic/2019.1.4/Salesprojectmilestone_add_parent.xml
@@ -0,0 +1,8 @@
+<?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="m.mansour" id="33eeb249-49e8-4304-90f7-d188179b4f81">
+	<addColumn tableName="SALESPROJECT_MILESTONE">
+            <column name="PARENT_ID" type="CHAR(36)"/>
+        </addColumn>
+    </changeSet>
+</databaseChangeLog>
\ No newline at end of file
diff --git a/.liquibase/Data_alias/basic/2019.1.4/changelog.xml b/.liquibase/Data_alias/basic/2019.1.4/changelog.xml
index c4533ded9096b14e80c1fc7dabdb8a54530db0dc..4069900e1fe53b9a32b4ad33a934295d2019d7c0 100644
--- a/.liquibase/Data_alias/basic/2019.1.4/changelog.xml
+++ b/.liquibase/Data_alias/basic/2019.1.4/changelog.xml
@@ -169,4 +169,6 @@
     <include relativeToChangelogFile="true" file="update_Keyword_Essentials.xml"/>
     
     <include relativeToChangelogFile="true" file="Salesproject_Phase_icons.xml"/>
+    
+    <include relativeToChangelogFile="true" file="Salesprojectmilestone_add_parent.xml"/>
 </databaseChangeLog>
diff --git a/aliasDefinition/Data_alias/Data_alias.aod b/aliasDefinition/Data_alias/Data_alias.aod
index baa669c2022589903136cce68f98ef609791fd19..bd9c2644864f4c579b35fbaa4664818b01735f5b 100644
--- a/aliasDefinition/Data_alias/Data_alias.aod
+++ b/aliasDefinition/Data_alias/Data_alias.aod
@@ -7865,6 +7865,20 @@
                 <title>Salesproject milestone Id</title>
                 <description></description>
               </entityFieldDb>
+              <entityFieldDb>
+                <name>PARENT_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>
diff --git a/entity/Activity_entity/Activity_entity.aod b/entity/Activity_entity/Activity_entity.aod
index 40b966dcea0559b9cd6e9e2ab6d84db718f9db5d..c6e7347ac673140a29509b5b733fa7102f3c33c6 100644
--- a/entity/Activity_entity/Activity_entity.aod
+++ b/entity/Activity_entity/Activity_entity.aod
@@ -285,8 +285,8 @@
         <entityParameter>
           <name>ID_param</name>
           <valueProcess>%aditoprj%/entity/Activity_entity/entityfields/moduletrees/children/id_param/valueProcess.js</valueProcess>
-          <expose v="false" />
-          <mandatory v="false" />
+          <expose v="true" />
+          <mandatory v="true" />
         </entityParameter>
       </children>
     </entityConsumer>
@@ -453,6 +453,19 @@
         </entityParameter>
       </children>
     </entityConsumer>
+    <entityActionField>
+      <name>newSupportticket</name>
+      <title>New Supportticket</title>
+      <onActionProcess>%aditoprj%/entity/Activity_entity/entityfields/newsupportticket/onActionProcess.js</onActionProcess>
+      <iconId>VAADIN:QUESTION</iconId>
+    </entityActionField>
+    <entityActionField>
+      <name>openAdminView</name>
+      <title>Open admin view</title>
+      <onActionProcess>%aditoprj%/entity/Activity_entity/entityfields/openadminview/onActionProcess.js</onActionProcess>
+      <iconId>VAADIN:CURLY_BRACKETS</iconId>
+      <stateProcess>%aditoprj%/entity/Activity_entity/entityfields/openadminview/stateProcess.js</stateProcess>
+    </entityActionField>
   </entityFields>
   <recordContainers>
     <dbRecordContainer>
diff --git a/entity/Activity_entity/entityfields/newsupportticket/onActionProcess.js b/entity/Activity_entity/entityfields/newsupportticket/onActionProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..6bcfaddd9b44df49ff440fca43cfec2d19cd5958
--- /dev/null
+++ b/entity/Activity_entity/entityfields/newsupportticket/onActionProcess.js
@@ -0,0 +1,6 @@
+import("system.vars");
+import("ActivityTask_lib");
+import("Context_lib");
+import("Ticket_lib")
+
+TicketUtils.createNewTicket(undefined, undefined, ContextUtils.getCurrentContextId(), vars.get("$field.ACTIVITYID"))
\ No newline at end of file
diff --git a/entity/Activity_entity/entityfields/openadminview/onActionProcess.js b/entity/Activity_entity/entityfields/openadminview/onActionProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..2421bcf840468a2ac89ea751cec95d99dea8c1a9
--- /dev/null
+++ b/entity/Activity_entity/entityfields/openadminview/onActionProcess.js
@@ -0,0 +1,11 @@
+import("system.vars");
+import("Context_lib");
+
+AdminViewUtils.open("ACTIVITYID", [
+    ["PARENT_ID", vars.get("$field.PARENT_ID")],
+    ["PARENT_CONTEXT", vars.get("$field.PARENT_CONTEXT")],
+    ["DATE_NEW", vars.get("$field.DATE_NEW")],
+    ["DATE_EDIT", vars.get("$field.DATE_EDIT")],
+    ["USER_NEW", vars.get("$field.USER_NEW")],
+    ["USER_EDIT", vars.get("$field.USER_EDIT")]
+]);
\ No newline at end of file
diff --git a/entity/Activity_entity/entityfields/openadminview/stateProcess.js b/entity/Activity_entity/entityfields/openadminview/stateProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..38f2298db7304b4d44a15fbad7f720558c02da99
--- /dev/null
+++ b/entity/Activity_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/AdminViewRow_entity/AdminViewRow_entity.aod b/entity/AdminViewRow_entity/AdminViewRow_entity.aod
new file mode 100644
index 0000000000000000000000000000000000000000..eeccc7e11713b48aa8be18b4690ee35520c0b605
--- /dev/null
+++ b/entity/AdminViewRow_entity/AdminViewRow_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.9" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.9">
+  <name>AdminViewRow_entity</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <recordContainer>jdito</recordContainer>
+  <entityFields>
+    <entityProvider>
+      <name>#PROVIDER</name>
+    </entityProvider>
+    <entityField>
+      <name>UID</name>
+    </entityField>
+    <entityField>
+      <name>TITLE</name>
+    </entityField>
+    <entityField>
+      <name>VALUE</name>
+      <contentTypeProcess>%aditoprj%/entity/AdminViewRow_entity/entityfields/value/contentTypeProcess.js</contentTypeProcess>
+    </entityField>
+    <entityParameter>
+      <name>Rows_param</name>
+      <expose v="true" />
+      <mandatory v="true" />
+    </entityParameter>
+    <entityProvider>
+      <name>AdminViewRows</name>
+      <dependencies>
+        <entityDependency>
+          <name>b5788fdf-1c82-45e2-8545-994c5e515476</name>
+          <entityName>DefaultAdminView_entity</entityName>
+          <fieldName>Rows</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+      </dependencies>
+    </entityProvider>
+    <entityField>
+      <name>CONTENTTYPE</name>
+    </entityField>
+  </entityFields>
+  <recordContainers>
+    <jDitoRecordContainer>
+      <name>jdito</name>
+      <contentProcess>%aditoprj%/entity/AdminViewRow_entity/recordcontainers/jdito/contentProcess.js</contentProcess>
+      <recordFieldMappings>
+        <jDitoRecordFieldMapping>
+          <name>UID.value</name>
+        </jDitoRecordFieldMapping>
+        <jDitoRecordFieldMapping>
+          <name>TITLE.value</name>
+        </jDitoRecordFieldMapping>
+        <jDitoRecordFieldMapping>
+          <name>VALUE.value</name>
+        </jDitoRecordFieldMapping>
+        <jDitoRecordFieldMapping>
+          <name>CONTENTTYPE.value</name>
+        </jDitoRecordFieldMapping>
+      </recordFieldMappings>
+    </jDitoRecordContainer>
+  </recordContainers>
+</entity>
diff --git a/entity/AdminViewRow_entity/entityfields/value/contentTypeProcess.js b/entity/AdminViewRow_entity/entityfields/value/contentTypeProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..00ce5cfd3a1e2ae3cb6fb4fce05d3c92ff62c41e
--- /dev/null
+++ b/entity/AdminViewRow_entity/entityfields/value/contentTypeProcess.js
@@ -0,0 +1,4 @@
+import("system.vars");
+import("system.result");
+
+result.string(vars.get("$field.CONTENTTYPE"));
\ No newline at end of file
diff --git a/entity/AdminViewRow_entity/recordcontainers/jdito/contentProcess.js b/entity/AdminViewRow_entity/recordcontainers/jdito/contentProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..1aa381774a2bfaf28ac963e84c63dda45cbf7192
--- /dev/null
+++ b/entity/AdminViewRow_entity/recordcontainers/jdito/contentProcess.js
@@ -0,0 +1,4 @@
+import("system.vars");
+import("system.result");
+
+result.object(JSON.parse(vars.getString("$param.Rows_param")));
\ No newline at end of file
diff --git a/entity/AnyContact_entity/contentTitleProcess.js b/entity/AnyContact_entity/contentTitleProcess.js
index a3a5bff300afa4fefc933c828813d8c7cea08afb..40ed0f5ed1acdc67a9833d7c2855383cfd2edfa1 100644
--- a/entity/AnyContact_entity/contentTitleProcess.js
+++ b/entity/AnyContact_entity/contentTitleProcess.js
@@ -11,5 +11,5 @@ contact.firstname = vars.get("$field.PERSON_FIRSTNAME");
 contact.middlename = vars.get("$field.PERSON_MIDDLENAME");
 contact.lastname = vars.get("$field.PERSON_LASTNAME");
 
-var renderer = new ContactTitleRenderer(contact);
+var renderer = new ContactTitleRenderer(contact, ContactTitleRenderer.OPTIONS.IncludeOrganisation);
 result.string(renderer.asString());
\ 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 82afab12a9f65c35207a6cbb1352a38c984cd0b8..c13cda25c21f4704cdc9e39fbf9b6e0843395c13 100644
--- a/entity/AttributeRelation_entity/recordcontainers/jdito/contentProcess.js
+++ b/entity/AttributeRelation_entity/recordcontainers/jdito/contentProcess.js
@@ -18,8 +18,9 @@ var showEmpty = vars.exists("$param.ShowEmpty_param") && vars.getString("$param.
 
 var displaySimpleName = vars.exists("$param.DisplaySimpleName_param") && vars.get("$param.DisplaySimpleName_param");
 
-var sqlCondition = new SqlCondition();
-var subCondition = new SqlCondition();
+var sqlCondition = new SqlCondition(); //where-condition (condition for the Attribute)
+var joinCondition = new SqlCondition(); //condition for the joined values (for AttributeRelation)
+//=> these are two distinct conditions because if showEmpty is true, a left join is used for the relations
 
 if (vars.exists("$local.idvalues") && vars.get("$local.idvalues"))
 {
@@ -51,28 +52,29 @@ else if (showEmpty || rowId)
     {
         let filteredIds = JSON.parse(vars.getString("$param.FilteredAttributeIds_param"));
 
-        subCondition.clear();
+        let filteredCondition = new SqlCondition();
         let filteredIdChildren = AttributeUtil.getAllChildren(filteredIds);
         
-        subCondition.andIn("AB_ATTRIBUTE.AB_ATTRIBUTEID", filteredIdChildren);
-        subCondition.andPrepare("AB_ATTRIBUTE.ATTRIBUTE_TYPE", $AttributeTypes.COMBOVALUE, "# != ?")
+        filteredCondition.andIn("AB_ATTRIBUTE.AB_ATTRIBUTEID", filteredIdChildren);
+        filteredCondition.andPrepare("AB_ATTRIBUTE.ATTRIBUTE_TYPE", $AttributeTypes.COMBOVALUE, "# != ?")
     
         // return nothing if filteredAttributeIds is an empty array. (--> and 1=2)
-        sqlCondition.andSqlCondition(subCondition, "1=2");
+        sqlCondition.andSqlCondition(filteredCondition, "1=2");
     }
 }
-var joinCondition = "";
+
 if (rowId)
 {
-    subCondition.andPrepare("AB_ATTRIBUTERELATION.OBJECT_ROWID", rowId);
+    joinCondition.andPrepare("AB_ATTRIBUTERELATION.OBJECT_ROWID", rowId);
     if (objectType != null)
-        subCondition.andPrepare("AB_ATTRIBUTERELATION.OBJECT_TYPE", objectType);
-    if (subCondition.isSet())
-        joinCondition = " and " + db.translateCondition(subCondition.build("1=1"));
+        joinCondition.andPrepare("AB_ATTRIBUTERELATION.OBJECT_TYPE", objectType);
+    
     // add condition to match all returned by joins (override default 1=2 of build)
     sqlCondition.and("1=1");
 }
 
+joinCondition.and("AB_ATTRIBUTERELATION.AB_ATTRIBUTE_ID = AB_ATTRIBUTE.AB_ATTRIBUTEID");
+
 var defaultFields = [
     "AB_ATTRIBUTERELATIONID",
     "AB_ATTRIBUTE.AB_ATTRIBUTEID", 
@@ -84,14 +86,19 @@ var defaultFields = [
 ];
 //these fields hold the attributeRelation value, depending on the attribute type
 var valueFields = AttributeTypeUtil.getAllDatabaseFields();
-var attributeSql = sqlCondition.buildSql("select " + defaultFields.join(", ") + ", " + valueFields.join(", ")
-    + " from AB_ATTRIBUTE "
-    + (showEmpty ? "left " : "") + "join AB_ATTRIBUTERELATION on AB_ATTRIBUTERELATION.AB_ATTRIBUTE_ID = AB_ATTRIBUTE.AB_ATTRIBUTEID " + joinCondition
-    + " left join AB_ATTRIBUTE COMBOVAL on " + $AttributeTypes.COMBO.databaseField + " = COMBOVAL.AB_ATTRIBUTEID" //for the view value of combobox attributes
-    , "1=2"
-);
-
-var attributeValues = db.table(attributeSql).map(function (row) 
+var attributeSql = SqlBuilder.begin()
+    .select(defaultFields.concat(valueFields))
+    .from("AB_ATTRIBUTE")
+    .where(sqlCondition);
+    
+if (showEmpty)
+    attributeSql.leftJoin("AB_ATTRIBUTERELATION", joinCondition.build("1=2"));
+else
+    attributeSql.join("AB_ATTRIBUTERELATION", joinCondition.build("1=2"));
+
+attributeSql.leftJoin("AB_ATTRIBUTE", "COMBOVAL.AB_ATTRIBUTEID = " + $AttributeTypes.COMBO.databaseField, "COMBOVAL");
+
+var attributeValues = db.table(attributeSql.build()).map(function (row) 
 {
     var attributeId = row[1];
     var attributeName = translate.text(row[4]);
@@ -149,4 +156,4 @@ function _fetchAttributes (pAttributeIds)
             
     if (nextIds.length)
         _fetchAttributes(nextIds);
-}
+}
\ No newline at end of file
diff --git a/entity/Attribute_entity/Attribute_entity.aod b/entity/Attribute_entity/Attribute_entity.aod
index 8d5f1d9867c8c6421aa53602bcc874b865298fb1..9f785f0280bb0fa739fb2bceab6f87abeff79a64 100644
--- a/entity/Attribute_entity/Attribute_entity.aod
+++ b/entity/Attribute_entity/Attribute_entity.aod
@@ -329,6 +329,13 @@
       <name>expanded</name>
       <valueProcess>%aditoprj%/entity/Attribute_entity/entityfields/expanded/valueProcess.js</valueProcess>
     </entityField>
+    <entityActionField>
+      <name>openAdminView</name>
+      <title>Open admin view</title>
+      <onActionProcess>%aditoprj%/entity/Attribute_entity/entityfields/openadminview/onActionProcess.js</onActionProcess>
+      <iconId>VAADIN:CURLY_BRACKETS</iconId>
+      <stateProcess>%aditoprj%/entity/Attribute_entity/entityfields/openadminview/stateProcess.js</stateProcess>
+    </entityActionField>
   </entityFields>
   <recordContainers>
     <jDitoRecordContainer>
diff --git a/entity/Attribute_entity/entityfields/openadminview/onActionProcess.js b/entity/Attribute_entity/entityfields/openadminview/onActionProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..2405febf9b19c521aa76b395b28c7664d84e6357
--- /dev/null
+++ b/entity/Attribute_entity/entityfields/openadminview/onActionProcess.js
@@ -0,0 +1,6 @@
+import("system.vars");
+import("Context_lib");
+
+AdminViewUtils.open("ATTRIBUTEID", [
+    ["ATTRIBUTE_PARENT_ID", vars.get("$field.ATTRIBUTE_PARENT_ID")]
+]);
\ No newline at end of file
diff --git a/entity/Attribute_entity/entityfields/openadminview/stateProcess.js b/entity/Attribute_entity/entityfields/openadminview/stateProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..38f2298db7304b4d44a15fbad7f720558c02da99
--- /dev/null
+++ b/entity/Attribute_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/BulkMailAddRecipients_entity/recordcontainers/jdito/onInsert.js b/entity/BulkMailAddRecipients_entity/recordcontainers/jdito/onInsert.js
index 527bf07cc5f786bc9dbf18cd0747408362473f04..43e723ea8761fff4ee989456474714b411d667e1 100644
--- a/entity/BulkMailAddRecipients_entity/recordcontainers/jdito/onInsert.js
+++ b/entity/BulkMailAddRecipients_entity/recordcontainers/jdito/onInsert.js
@@ -28,4 +28,4 @@ for (let i = 0, l = contactIds.length; i < l; i++)
 {
     inserts.push(["BULKMAILRECIPIENT", columns, null, [util.getNewUUID(), bulkMailId, contactIds[i], $KeywordRegistry.bulkMailRecipientStatus$pending()]]);
 }
-db.inserts(inserts);
\ No newline at end of file
+db.inserts(inserts);
diff --git a/entity/BulkMailRecipient_entity/BulkMailRecipient_entity.aod b/entity/BulkMailRecipient_entity/BulkMailRecipient_entity.aod
index 14ec8a459047d055534c8138b13812ec31da3a26..f6363bd4668cfd1e551dda17059854bc0a6d1bcb 100644
--- a/entity/BulkMailRecipient_entity/BulkMailRecipient_entity.aod
+++ b/entity/BulkMailRecipient_entity/BulkMailRecipient_entity.aod
@@ -78,6 +78,7 @@
     </entityField>
     <entityField>
       <name>ICON</name>
+      <colorProcess>%aditoprj%/entity/BulkMailRecipient_entity/entityfields/icon/colorProcess.js</colorProcess>
       <contentType>IMAGE</contentType>
       <valueProcess>%aditoprj%/entity/BulkMailRecipient_entity/entityfields/icon/valueProcess.js</valueProcess>
     </entityField>
@@ -94,6 +95,9 @@
       <resolution>MINUTE</resolution>
       <outputFormat>dd.MM.yyyy HH:mm</outputFormat>
     </entityField>
+    <entityField>
+      <name>HASCOMMRESTRICTION</name>
+    </entityField>
   </entityFields>
   <recordContainers>
     <dbRecordContainer>
@@ -134,10 +138,6 @@
           <name>STATUS.value</name>
           <recordfield>BULKMAILRECIPIENT.STATUS</recordfield>
         </dbRecordFieldMapping>
-        <dbRecordFieldMapping>
-          <name>EMAIL_ADDRESS.displayValue</name>
-          <expression>%aditoprj%/entity/BulkMailRecipient_entity/recordcontainers/db/recordfieldmappings/email_address.displayvalue/expression.js</expression>
-        </dbRecordFieldMapping>
         <dbRecordFieldMapping>
           <name>ORGANISATION_ID.value</name>
           <recordfield>CONTACT.ORGANISATION_ID</recordfield>
@@ -162,6 +162,14 @@
           <name>CONTACT_ID.displayValue</name>
           <expression>%aditoprj%/entity/BulkMailRecipient_entity/recordcontainers/db/recordfieldmappings/contact_id.displayvalue/expression.js</expression>
         </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>HASCOMMRESTRICTION.value</name>
+          <expression>%aditoprj%/entity/BulkMailRecipient_entity/recordcontainers/db/recordfieldmappings/hascommrestriction.value/expression.js</expression>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>EMAIL_ADDRESS.value</name>
+          <expression>%aditoprj%/entity/BulkMailRecipient_entity/recordcontainers/db/recordfieldmappings/email_address.value/expression.js</expression>
+        </dbRecordFieldMapping>
       </recordFieldMappings>
     </dbRecordContainer>
   </recordContainers>
diff --git a/entity/BulkMailRecipient_entity/entityfields/icon/colorProcess.js b/entity/BulkMailRecipient_entity/entityfields/icon/colorProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..f4a5d6a797f85b33b0d1d819d44e0015a28d24c9
--- /dev/null
+++ b/entity/BulkMailRecipient_entity/entityfields/icon/colorProcess.js
@@ -0,0 +1,6 @@
+import("system.vars");
+import("system.result");
+import("system.neon");
+
+if (vars.get("$field.HASCOMMRESTRICTION") == "true" || !vars.get("$field.EMAIL_ADDRESS"))
+    result.string(neon.PRIORITY_HIGH_COLOR);
\ No newline at end of file
diff --git a/entity/BulkMailRecipient_entity/entityfields/icon/valueProcess.js b/entity/BulkMailRecipient_entity/entityfields/icon/valueProcess.js
index 39145d32a6d62713f9ace17190890fe223f734f4..c67e7c5712da325df0f23f47eee957ce28a3ed54 100644
--- a/entity/BulkMailRecipient_entity/entityfields/icon/valueProcess.js
+++ b/entity/BulkMailRecipient_entity/entityfields/icon/valueProcess.js
@@ -4,7 +4,9 @@ import("Contact_lib");
 
 var type = ContactUtils.getContactTypeByPersOrg(vars.get("$field.PERSON_ID"), vars.get("$field.ORGANISATION_ID"));
 var icon;
-if (type == 1)
+if (vars.get("$field.HASCOMMRESTRICTION") == "true")
+    icon = "VAADIN:BAN";
+else if (type == 1)
     icon = "VAADIN:BUILDING";
 else if (type >= 2)
     icon = "VAADIN:USER";
diff --git a/entity/BulkMailRecipient_entity/recordcontainers/db/recordfieldmappings/email_address.displayvalue/expression.js b/entity/BulkMailRecipient_entity/recordcontainers/db/recordfieldmappings/email_address.value/expression.js
similarity index 100%
rename from entity/BulkMailRecipient_entity/recordcontainers/db/recordfieldmappings/email_address.displayvalue/expression.js
rename to entity/BulkMailRecipient_entity/recordcontainers/db/recordfieldmappings/email_address.value/expression.js
diff --git a/entity/BulkMailRecipient_entity/recordcontainers/db/recordfieldmappings/hascommrestriction.value/expression.js b/entity/BulkMailRecipient_entity/recordcontainers/db/recordfieldmappings/hascommrestriction.value/expression.js
new file mode 100644
index 0000000000000000000000000000000000000000..6cc149b9f3bb9b42be4c06cb6c4666a8fa624653
--- /dev/null
+++ b/entity/BulkMailRecipient_entity/recordcontainers/db/recordfieldmappings/hascommrestriction.value/expression.js
@@ -0,0 +1,7 @@
+import("system.db");
+import("Bulkmail_lib");
+import("system.result");
+
+var commRestrictionCond = BulkMailUtils.getCommRestrictionCondition(true).build();
+var sql = "case when (" + db.translateStatement(commRestrictionCond) + ") then 'true' else 'false' end";
+result.string(sql);
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 92fb534f8ba741d4dacd9e69cfb9273085d8c684..3d19d9481e17454133e865bdadf7e04f3f6fb0fb 100644
--- a/entity/BulkMailRecipient_entity/recordcontainers/db/recordfieldmappings/status.displayvalue/expression.js
+++ b/entity/BulkMailRecipient_entity/recordcontainers/db/recordfieldmappings/status.displayvalue/expression.js
@@ -1,6 +1,13 @@
+import("system.translate");
+import("system.db");
+import("Bulkmail_lib");
 import("system.result");
 import("Keyword_lib");
 import("KeywordRegistry_basic");
 
-var sql = KeywordUtils.getResolvedTitleSqlPart($KeywordRegistry.bulkMailRecipientStatus(), "BULKMAILRECIPIENT.STATUS");
+var commRestrictionCond = BulkMailUtils.getCommRestrictionCondition(true).build();
+var keywordSql = KeywordUtils.getResolvedTitleSqlPart($KeywordRegistry.bulkMailRecipientStatus(), "BULKMAILRECIPIENT.STATUS");
+var sql = "case when (" + db.translateStatement(commRestrictionCond)
+    + ") then '" + translate.text("Advertising ban")
+    + "' else (" + keywordSql + ") end";
 result.string(sql);
diff --git a/entity/BulkMail_entity/BulkMail_entity.aod b/entity/BulkMail_entity/BulkMail_entity.aod
index 155528efdd22eeae5cab9feabc58605d01316dec..7cc97c3e9f3a3e32a64b18caa64dea74906c3773 100644
--- a/entity/BulkMail_entity/BulkMail_entity.aod
+++ b/entity/BulkMail_entity/BulkMail_entity.aod
@@ -133,6 +133,13 @@
         <element>SUBJECT</element>
       </fields>
     </entityFieldGroup>
+    <entityActionField>
+      <name>openAdminView</name>
+      <title>Open admin view</title>
+      <onActionProcess>%aditoprj%/entity/BulkMail_entity/entityfields/openadminview/onActionProcess.js</onActionProcess>
+      <iconId>VAADIN:CURLY_BRACKETS</iconId>
+      <stateProcess>%aditoprj%/entity/BulkMail_entity/entityfields/openadminview/stateProcess.js</stateProcess>
+    </entityActionField>
   </entityFields>
   <recordContainers>
     <dbRecordContainer>
diff --git a/entity/BulkMail_entity/entityfields/openadminview/onActionProcess.js b/entity/BulkMail_entity/entityfields/openadminview/onActionProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..83560a4da795605d3ab671137742afc66b18e091
--- /dev/null
+++ b/entity/BulkMail_entity/entityfields/openadminview/onActionProcess.js
@@ -0,0 +1,6 @@
+import("system.vars");
+import("Context_lib");
+
+AdminViewUtils.open("BULKMAILID", [
+    ["DOCUMENTTEMPLATE_ID", vars.get("$field.DOCUMENTTEMPLATE_ID")]
+]);
\ No newline at end of file
diff --git a/entity/BulkMail_entity/entityfields/openadminview/stateProcess.js b/entity/BulkMail_entity/entityfields/openadminview/stateProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..38f2298db7304b4d44a15fbad7f720558c02da99
--- /dev/null
+++ b/entity/BulkMail_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/CampaignAddParticipants_entity/entityfields/isoperationvalid/valueProcess.js b/entity/CampaignAddParticipants_entity/entityfields/isoperationvalid/valueProcess.js
index b4bf3c912004332a45e08dc5ecd3adb4ecac9ecd..c0689ca0aa2ecf419c001d1461c673d2b5f076d7 100644
--- a/entity/CampaignAddParticipants_entity/entityfields/isoperationvalid/valueProcess.js
+++ b/entity/CampaignAddParticipants_entity/entityfields/isoperationvalid/valueProcess.js
@@ -88,7 +88,11 @@ if(selectedCampaignId != '')
     }
     countValidParticipantsToAdd = countParticipantsToAdd - countParticipantsAlreadyInCampaign;
     
-    if(countValidParticipantsToAdd <= 0)
+    if(countParticipantsToAdd <= 0)
+    {
+            messageString = translate.text("No contacts selected");
+    }
+    else if(countValidParticipantsToAdd <= 0)
     {
             messageString = translate.text("All selected participants already are in the campaign");
     }
diff --git a/entity/CampaignParticipant_entity/CampaignParticipant_entity.aod b/entity/CampaignParticipant_entity/CampaignParticipant_entity.aod
index 1d20c0877f43174e64a3d1fb3ec1de4efc994263..93a8f5fbcc697c1698fab222e1051be8310b41b9 100644
--- a/entity/CampaignParticipant_entity/CampaignParticipant_entity.aod
+++ b/entity/CampaignParticipant_entity/CampaignParticipant_entity.aod
@@ -162,11 +162,15 @@
       <children>
         <entityActionField>
           <name>SetStepToParticipantSelection</name>
-          <title>Set campaign step</title>
+          <title>Update campaign step</title>
           <onActionProcess>%aditoprj%/entity/CampaignParticipant_entity/entityfields/filterviewactiongroup/children/setsteptoparticipantselection/onActionProcess.js</onActionProcess>
           <isObjectAction v="false" />
           <isSelectionAction v="false" />
           <iconId>NEON:GROUP_APPOINTMENT</iconId>
+          <state>DISABLED</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>
       </children>
     </entityActionGroup>
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 0000000000000000000000000000000000000000..d55386c662b50138c9a582d15dfcd103d2200e20
--- /dev/null
+++ b/entity/CampaignParticipant_entity/entityfields/filterviewactiongroup/children/setsteptoparticipantselection/stateProcess.js
@@ -0,0 +1,16 @@
+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/setsteptoparticipantselection/tooltipProcess.js b/entity/CampaignParticipant_entity/entityfields/filterviewactiongroup/children/setsteptoparticipantselection/tooltipProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..2809cd2e10b98d5dffdf68a57485d3edd675b0f7
--- /dev/null
+++ b/entity/CampaignParticipant_entity/entityfields/filterviewactiongroup/children/setsteptoparticipantselection/tooltipProcess.js
@@ -0,0 +1,4 @@
+import("system.translate");
+import("system.result");
+
+result.string(translate.text("Update campaign step"));
\ No newline at end of file
diff --git a/entity/Campaign_entity/Campaign_entity.aod b/entity/Campaign_entity/Campaign_entity.aod
index 562889587aaa52565ad4c4122fc71fa54df8b6f0..f2b0010993ecd9dd0387ecd8b323530b3a6fa531 100644
--- a/entity/Campaign_entity/Campaign_entity.aod
+++ b/entity/Campaign_entity/Campaign_entity.aod
@@ -410,11 +410,24 @@
         </entityParameter>
       </children>
     </entityConsumer>
+    <entityParameter>
+      <name>ShowOnlyCurrentUsersCampaigns_param</name>
+      <title>Nur eigene anzeigen</title>
+      <expose v="true" />
+    </entityParameter>
+    <entityActionField>
+      <name>openAdminView</name>
+      <title>Open admin view</title>
+      <onActionProcess>%aditoprj%/entity/Campaign_entity/entityfields/openadminview/onActionProcess.js</onActionProcess>
+      <iconId>VAADIN:CURLY_BRACKETS</iconId>
+      <stateProcess>%aditoprj%/entity/Campaign_entity/entityfields/openadminview/stateProcess.js</stateProcess>
+    </entityActionField>
   </entityFields>
   <recordContainers>
     <dbRecordContainer>
       <name>db</name>
       <alias>Data_alias</alias>
+      <conditionProcess>%aditoprj%/entity/Campaign_entity/recordcontainers/db/conditionProcess.js</conditionProcess>
       <onDBInsert>%aditoprj%/entity/Campaign_entity/recordcontainers/db/onDBInsert.js</onDBInsert>
       <onDBDelete>%aditoprj%/entity/Campaign_entity/recordcontainers/db/onDBDelete.js</onDBDelete>
       <linkInformation>
diff --git a/entity/Campaign_entity/entityfields/openadminview/onActionProcess.js b/entity/Campaign_entity/entityfields/openadminview/onActionProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..e499f2c9eb69997395c5227e2df347b3dc86441d
--- /dev/null
+++ b/entity/Campaign_entity/entityfields/openadminview/onActionProcess.js
@@ -0,0 +1,10 @@
+import("system.vars");
+import("Context_lib");
+
+AdminViewUtils.open("CAMPAIGNID", [
+    ["EMPLOYEE_CONTACT_ID", vars.get("$field.EMPLOYEE_CONTACT_ID")],
+    ["DATE_NEW", vars.get("$field.DATE_NEW")],
+    ["DATE_EDIT", vars.get("$field.DATE_EDIT")],
+    ["USER_NEW", vars.get("$field.USER_NEW")],
+    ["USER_EDIT", vars.get("$field.USER_EDIT")]
+]);
\ No newline at end of file
diff --git a/entity/Campaign_entity/entityfields/openadminview/stateProcess.js b/entity/Campaign_entity/entityfields/openadminview/stateProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..38f2298db7304b4d44a15fbad7f720558c02da99
--- /dev/null
+++ b/entity/Campaign_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/Campaign_entity/recordcontainers/db/conditionProcess.js b/entity/Campaign_entity/recordcontainers/db/conditionProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..e2736c04e6c8e8231e524311c3733b49239dd775
--- /dev/null
+++ b/entity/Campaign_entity/recordcontainers/db/conditionProcess.js
@@ -0,0 +1,12 @@
+import("system.logging");
+import("Employee_lib");
+import("system.db");
+import("system.result");
+import("Sql_lib");
+import("system.vars");
+
+if(vars.get("$param.ShowOnlyCurrentUsersCampaigns_param") == 'true')
+{
+    //TODO: use a preparedCondition when available #1030812 #1034026
+    result.string("CAMPAIGN.EMPLOYEE_CONTACT_ID = '" + EmployeeUtils.getCurrentContactId() + "'");
+}
\ No newline at end of file
diff --git a/entity/Contract_entity/Contract_entity.aod b/entity/Contract_entity/Contract_entity.aod
index 2426e1820b9599084c69a69860e07f3db940cb20..298a23b16fb53517a9ab1fba04202755c05b95cf 100644
--- a/entity/Contract_entity/Contract_entity.aod
+++ b/entity/Contract_entity/Contract_entity.aod
@@ -196,9 +196,6 @@
         <fieldName>Documents</fieldName>
       </dependency>
       <children>
-        <entityParameter>
-          <name>AssignmentName_param</name>
-        </entityParameter>
         <entityParameter>
           <name>AssignmentRowId_param</name>
           <valueProcess>%aditoprj%/entity/Contract_entity/entityfields/documents/children/assignmentrowid_param/valueProcess.js</valueProcess>
@@ -363,6 +360,13 @@
         </entityParameter>
       </children>
     </entityConsumer>
+    <entityActionField>
+      <name>openAdminView</name>
+      <title>Open admin view</title>
+      <onActionProcess>%aditoprj%/entity/Contract_entity/entityfields/openadminview/onActionProcess.js</onActionProcess>
+      <iconId>VAADIN:CURLY_BRACKETS</iconId>
+      <stateProcess>%aditoprj%/entity/Contract_entity/entityfields/openadminview/stateProcess.js</stateProcess>
+    </entityActionField>
   </entityFields>
   <recordContainers>
     <dbRecordContainer>
diff --git a/entity/Contract_entity/entityfields/openadminview/onActionProcess.js b/entity/Contract_entity/entityfields/openadminview/onActionProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..e9021a0b9f29937e17815d99b61c687d74f74973
--- /dev/null
+++ b/entity/Contract_entity/entityfields/openadminview/onActionProcess.js
@@ -0,0 +1,8 @@
+import("system.vars");
+import("Context_lib");
+
+AdminViewUtils.open("CONTRACTID", [
+    ["CONTACT_ID", vars.get("$field.CONTACT_ID")],
+    ["CONTACT_ORG_ID", vars.get("$field.CONTACT_ORG_ID")],
+    ["CONTACT_PERSON_ID", vars.get("$field.CONTACT_PERSON_ID")]
+]);
\ No newline at end of file
diff --git a/entity/Contract_entity/entityfields/openadminview/stateProcess.js b/entity/Contract_entity/entityfields/openadminview/stateProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..38f2298db7304b4d44a15fbad7f720558c02da99
--- /dev/null
+++ b/entity/Contract_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/DefaultAdminView_entity/DefaultAdminView_entity.aod b/entity/DefaultAdminView_entity/DefaultAdminView_entity.aod
new file mode 100644
index 0000000000000000000000000000000000000000..34f1999a062ab1a4388c4097b2d582005e157cd7
--- /dev/null
+++ b/entity/DefaultAdminView_entity/DefaultAdminView_entity.aod
@@ -0,0 +1,50 @@
+<?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.9" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.9">
+  <name>DefaultAdminView_entity</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <recordContainer>jdito</recordContainer>
+  <entityFields>
+    <entityProvider>
+      <name>#PROVIDER</name>
+    </entityProvider>
+    <entityField>
+      <name>UID</name>
+    </entityField>
+    <entityParameter>
+      <name>Rows_param</name>
+      <expose v="true" />
+      <mandatory v="true" />
+    </entityParameter>
+    <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>
+    </entityConsumer>
+    <entityParameter>
+      <name>Uid_param</name>
+      <expose v="true" />
+      <mandatory v="true" />
+    </entityParameter>
+  </entityFields>
+  <recordContainers>
+    <jDitoRecordContainer>
+      <name>jdito</name>
+      <contentProcess>%aditoprj%/entity/DefaultAdminView_entity/recordcontainers/jdito/contentProcess.js</contentProcess>
+      <recordFieldMappings>
+        <jDitoRecordFieldMapping>
+          <name>UID.value</name>
+        </jDitoRecordFieldMapping>
+      </recordFieldMappings>
+    </jDitoRecordContainer>
+  </recordContainers>
+</entity>
diff --git a/entity/DefaultAdminView_entity/entityfields/rows/children/rows_param/valueProcess.js b/entity/DefaultAdminView_entity/entityfields/rows/children/rows_param/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..38779881db7511d72573b62e3331790e78cda5be
--- /dev/null
+++ b/entity/DefaultAdminView_entity/entityfields/rows/children/rows_param/valueProcess.js
@@ -0,0 +1,9 @@
+import("system.translate");
+import("system.tools");
+import("system.vars");
+import("system.result");
+
+if (tools.currentUserHasRole("INTERNAL_ADMINISTRATOR"))
+    result.string(vars.get("$param.Rows_param"));
+else  //this should not be the case since the action should be invisible
+    result.string(JSON.stringify([["0", "", translate.text("You don't have permission for this view."), "TEXT"]]));
\ No newline at end of file
diff --git a/entity/DefaultAdminView_entity/recordcontainers/jdito/contentProcess.js b/entity/DefaultAdminView_entity/recordcontainers/jdito/contentProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..b6f288f713ee37fdc2431d8713d06ab465528c88
--- /dev/null
+++ b/entity/DefaultAdminView_entity/recordcontainers/jdito/contentProcess.js
@@ -0,0 +1,4 @@
+import("system.vars");
+import("system.result");
+
+result.object([[vars.get("$param.Uid_param")]]);
\ No newline at end of file
diff --git a/entity/DocumentTemplate_entity/DocumentTemplate_entity.aod b/entity/DocumentTemplate_entity/DocumentTemplate_entity.aod
index 3bf1f40c2ac5c981506510e5b1f1ee853bae8ed1..cbea53d43a3478605e5aa352ceec4bcd1ae16386 100644
--- a/entity/DocumentTemplate_entity/DocumentTemplate_entity.aod
+++ b/entity/DocumentTemplate_entity/DocumentTemplate_entity.aod
@@ -255,6 +255,13 @@
       <searchable v="false" />
       <valueProcess>%aditoprj%/entity/DocumentTemplate_entity/entityfields/target_context/valueProcess.js</valueProcess>
     </entityField>
+    <entityActionField>
+      <name>openAdminView</name>
+      <title>Open admin view</title>
+      <onActionProcess>%aditoprj%/entity/DocumentTemplate_entity/entityfields/openadminview/onActionProcess.js</onActionProcess>
+      <iconId>VAADIN:CURLY_BRACKETS</iconId>
+      <stateProcess>%aditoprj%/entity/DocumentTemplate_entity/entityfields/openadminview/stateProcess.js</stateProcess>
+    </entityActionField>
   </entityFields>
   <recordContainers>
     <dbRecordContainer>
diff --git a/entity/DocumentTemplate_entity/entityfields/openadminview/onActionProcess.js b/entity/DocumentTemplate_entity/entityfields/openadminview/onActionProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..30d10d0a087957cdc1a2c6fc64fea75897528028
--- /dev/null
+++ b/entity/DocumentTemplate_entity/entityfields/openadminview/onActionProcess.js
@@ -0,0 +1,4 @@
+import("system.vars");
+import("Context_lib");
+
+AdminViewUtils.open("DOCUMENTTEMPLATEID");
\ No newline at end of file
diff --git a/entity/DocumentTemplate_entity/entityfields/openadminview/stateProcess.js b/entity/DocumentTemplate_entity/entityfields/openadminview/stateProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..38f2298db7304b4d44a15fbad7f720558c02da99
--- /dev/null
+++ b/entity/DocumentTemplate_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/Document_entity/Document_entity.aod b/entity/Document_entity/Document_entity.aod
index 077b4c5f163f836e2c73402d2ee1f48ea69531ca..9b7b8008c36385dc47f87a4e4213933690cba16c 100644
--- a/entity/Document_entity/Document_entity.aod
+++ b/entity/Document_entity/Document_entity.aod
@@ -92,7 +92,6 @@
     <entityField>
       <name>UID</name>
       <searchable v="false" />
-      <valueProcess>%aditoprj%/entity/Document_entity/entityfields/uid/valueProcess.js</valueProcess>
     </entityField>
     <entityField>
       <name>DESCRIPTION</name>
diff --git a/entity/Document_entity/entityfields/uid/valueProcess.js b/entity/Document_entity/entityfields/uid/valueProcess.js
deleted file mode 100644
index cb202a4d661d58a69eaba5744ae3bb7f264682fe..0000000000000000000000000000000000000000
--- a/entity/Document_entity/entityfields/uid/valueProcess.js
+++ /dev/null
@@ -1,4 +0,0 @@
-import("system.util");
-import("system.result");
-var uid = util.getNewUUID();
-result.string(uid)
\ No newline at end of file
diff --git a/entity/Document_entity/recordcontainers/jdito/onInsert.js b/entity/Document_entity/recordcontainers/jdito/onInsert.js
index a938789f38f6b0d6ff43f78c51280feab2a92af2..99bcdc3cb62d9a1f3c1830416e54b9a537026640 100644
--- a/entity/Document_entity/recordcontainers/jdito/onInsert.js
+++ b/entity/Document_entity/recordcontainers/jdito/onInsert.js
@@ -19,5 +19,5 @@ if(bindata != '' && filename != ''){
     
     var uid = db.insertBinary(assignmentTable, assignmentName, assignmentRowId, "", 
         bindata, filename, description, keyword, alias, id);
-   
+    
 }
diff --git a/entity/EmployeeRole_entity/EmployeeRole_entity.aod b/entity/EmployeeRole_entity/EmployeeRole_entity.aod
index 4598f76d646cc4b59d7be29b8a4e885d7e813769..22a050dcddbcf8d4999fe79d5d57457dcefc4ea3 100644
--- a/entity/EmployeeRole_entity/EmployeeRole_entity.aod
+++ b/entity/EmployeeRole_entity/EmployeeRole_entity.aod
@@ -39,8 +39,17 @@
     <entityField>
       <name>ROLE</name>
       <title>Role</title>
-      <dropDownProcess>%aditoprj%/entity/EmployeeRole_entity/entityfields/role/dropDownProcess.js</dropDownProcess>
+      <consumer>Roles</consumer>
+      <linkedContext>Role</linkedContext>
     </entityField>
+    <entityConsumer>
+      <name>Roles</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Role_entity</entityName>
+        <fieldName>#PROVIDER</fieldName>
+      </dependency>
+    </entityConsumer>
   </entityFields>
   <recordContainers>
     <jDitoRecordContainer>
diff --git a/entity/EmployeeRole_entity/entityfields/role/dropDownProcess.js b/entity/EmployeeRole_entity/entityfields/role/dropDownProcess.js
deleted file mode 100644
index 2c33a21e965fb2fbac61c15ea5db3604b5a83ae0..0000000000000000000000000000000000000000
--- a/entity/EmployeeRole_entity/entityfields/role/dropDownProcess.js
+++ /dev/null
@@ -1,28 +0,0 @@
-import("system.translate");
-import("system.vars");
-import("system.result");
-import("system.tools");
-
-var selectedRole = vars.get("$field.ROLE");
-var roles = [];
-var allRoles = tools.getAllRoles([tools.ROLE_INTERNAL, tools.ROLE_PROJECT, tools.ROLE_XMPP]);
-var excludeRoles = {
-    "INTERNAL_GROUPWARE" : true, 
-    "INTERNAL_SNMP" : true, 
-    "INTERNAL_DESIGNER" : true, 
-    "INTERNAL_TECHNICAL" : true,
-    "INTERNAL_EVERYONE" : true
-};
-
-if (tools.existUsers(vars.get("$param.UserTitle_param")))
-{
-    var userRoles = tools.getRoles(vars.get("$param.UserTitle_param"));
-    for (let i in userRoles)
-        excludeRoles[userRoles[i]] = true;
-}
-
-for (let roleId in allRoles)
-    if (!excludeRoles[roleId] || roleId == selectedRole)
-        roles.push([roleId, translate.text(allRoles[roleId][0])]);
-
-result.object(roles);
\ No newline at end of file
diff --git a/entity/Employee_entity/Employee_entity.aod b/entity/Employee_entity/Employee_entity.aod
index 0e50e826a992efa788f2b6f283746d33de7e0970..d9f3919ce7b7831511c01aa797e366c72b204a0a 100644
--- a/entity/Employee_entity/Employee_entity.aod
+++ b/entity/Employee_entity/Employee_entity.aod
@@ -281,6 +281,13 @@
         </entityParameter>
       </children>
     </entityConsumer>
+    <entityActionField>
+      <name>openAdminView</name>
+      <title>Open admin view</title>
+      <onActionProcess>%aditoprj%/entity/Employee_entity/entityfields/openadminview/onActionProcess.js</onActionProcess>
+      <iconId>VAADIN:CURLY_BRACKETS</iconId>
+      <stateProcess>%aditoprj%/entity/Employee_entity/entityfields/openadminview/stateProcess.js</stateProcess>
+    </entityActionField>
   </entityFields>
   <recordContainers>
     <jDitoRecordContainer>
diff --git a/entity/Employee_entity/entityfields/openadminview/onActionProcess.js b/entity/Employee_entity/entityfields/openadminview/onActionProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..53f2ae98b70e5490aa9237de28f3d47fe1a27616
--- /dev/null
+++ b/entity/Employee_entity/entityfields/openadminview/onActionProcess.js
@@ -0,0 +1,6 @@
+import("system.vars");
+import("Context_lib");
+
+AdminViewUtils.open("name", [
+    ["CONTACT_ID", vars.get("$field.CONTACT_ID")]
+]);
\ No newline at end of file
diff --git a/entity/Employee_entity/entityfields/openadminview/stateProcess.js b/entity/Employee_entity/entityfields/openadminview/stateProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..38f2298db7304b4d44a15fbad7f720558c02da99
--- /dev/null
+++ b/entity/Employee_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 928aff1ebd77e9d4990af130753a6e5c13176d67..207554b1301c632d5e4300c6632d0927eed2b699 100644
--- a/entity/KeywordEntry_entity/KeywordEntry_entity.aod
+++ b/entity/KeywordEntry_entity/KeywordEntry_entity.aod
@@ -513,6 +513,13 @@
       <name>expanded</name>
       <valueProcess>%aditoprj%/entity/KeywordEntry_entity/entityfields/expanded/valueProcess.js</valueProcess>
     </entityField>
+    <entityActionField>
+      <name>openAdminView</name>
+      <title>Open admin view</title>
+      <onActionProcess>%aditoprj%/entity/KeywordEntry_entity/entityfields/openadminview/onActionProcess.js</onActionProcess>
+      <iconId>VAADIN:CURLY_BRACKETS</iconId>
+      <stateProcess>%aditoprj%/entity/KeywordEntry_entity/entityfields/openadminview/stateProcess.js</stateProcess>
+    </entityActionField>
   </entityFields>
   <recordContainers>
     <dbRecordContainer>
diff --git a/entity/KeywordEntry_entity/entityfields/openadminview/onActionProcess.js b/entity/KeywordEntry_entity/entityfields/openadminview/onActionProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..d564b4d76feb764e6f7db9d65f92c66db58a1a28
--- /dev/null
+++ b/entity/KeywordEntry_entity/entityfields/openadminview/onActionProcess.js
@@ -0,0 +1,6 @@
+import("system.vars");
+import("Context_lib");
+
+AdminViewUtils.open("AB_KEYWORD_ENTRYID", [
+    ["KEYID", vars.get("$field.KEYID")]
+]);
\ No newline at end of file
diff --git a/entity/KeywordEntry_entity/entityfields/openadminview/stateProcess.js b/entity/KeywordEntry_entity/entityfields/openadminview/stateProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..38f2298db7304b4d44a15fbad7f720558c02da99
--- /dev/null
+++ b/entity/KeywordEntry_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/ModuleTree_entity/ModuleTree_entity.aod b/entity/ModuleTree_entity/ModuleTree_entity.aod
index 04d6372a08d4b79170921e669e5669767658c428..af088a8e5feba7318fb75858a9ea61f1b552f2c1 100644
--- a/entity/ModuleTree_entity/ModuleTree_entity.aod
+++ b/entity/ModuleTree_entity/ModuleTree_entity.aod
@@ -36,6 +36,12 @@
           <fieldName>ModuleTrees</fieldName>
           <isConsumer v="false" />
         </entityDependency>
+        <entityDependency>
+          <name>3132e321-3b6a-4828-b600-01897ae83646</name>
+          <entityName>SupportTicket_entity</entityName>
+          <fieldName>ModuleTrees</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
       </dependencies>
       <children>
         <entityParameter>
diff --git a/entity/ModuleTree_entity/recordcontainers/jdito/contentProcess.js b/entity/ModuleTree_entity/recordcontainers/jdito/contentProcess.js
index c3d1948fc0f63ce91316285cc1f08f00e04a657e..73393d631a5190c32e7837fd7e4de8ec01613b1a 100644
--- a/entity/ModuleTree_entity/recordcontainers/jdito/contentProcess.js
+++ b/entity/ModuleTree_entity/recordcontainers/jdito/contentProcess.js
@@ -1,3 +1,4 @@
+import("KeywordRegistry_basic");
 import("system.vars");
 import("Sql_lib")
 import("system.result");
@@ -8,8 +9,10 @@ var fixedID = vars.get("$param.ID_param");
 
 let resArray = [];
 
+var cond = new SqlCondition();
 // Query root element
 var root = queryRootElement(fixedContextName, fixedID, true);
+
 if (root !== null) {
     // Push root element
     resArray.push(root);
@@ -20,10 +23,7 @@ if (root !== null) {
     if (children !== null) {
      
        // Push each children
-       for(let i = 0; i < children.length; i++) {
-           resArray.push(children[i]);
-       }
-
+       resArray = resArray.concat(children);
        result.object(resArray);
     }
 }
@@ -36,9 +36,24 @@ if (root !== null) {
  * @param pID ID of the parent element.
  */
 function queryChildrenElements (pContextName, pID) {
-    var taskResult = db.table("select TASKID, PARENT_ID, PARENT_CONTEXT, SUBJECT, DESCRIPTION from TASK where PARENT_ID = '" + pID +"' and PARENT_CONTEXT = '" + pContextName + "'");
-    var activityResult = db.table("select ACTIVITYID, PARENT_ID, PARENT_CONTEXT, SUBJECT, INFO from ACTIVITY where PARENT_ID = '" + pID +"' and PARENT_CONTEXT = '" + pContextName + "'");
-  
+    
+    var taskResult = db.table(SqlCondition.begin()
+    .andPrepare("TASK.PARENT_ID", pID)
+    .andPrepare("TASK.PARENT_CONTEXT", pContextName)
+    .andPrepare("TASK.TYPE", $KeywordRegistry.taskType$task())
+    .buildSql("select TASKID, PARENT_ID, PARENT_CONTEXT, SUBJECT, DESCRIPTION from TASK"));
+    
+    
+     var ticketResult = db.table(SqlCondition.begin()
+    .andPrepare("TASK.PARENT_ID", pID)
+    .andPrepare("TASK.PARENT_CONTEXT", pContextName)
+    .buildSql("select TICKETID, PARENT_ID, PARENT_CONTEXT, SUBJECT, DESCRIPTION from TICKET left join TASK on TASK_ID = TASKID"));
+    
+    var activityResult = db.table(SqlCondition.begin()
+    .andPrepare("ACTIVITY.PARENT_ID", pID)
+    .andPrepare("ACTIVITY.PARENT_CONTEXT", pContextName)
+    .buildSql("select ACTIVITYID, PARENT_ID, PARENT_CONTEXT, SUBJECT, INFO from ACTIVITY"));
+    
     var res = []
   
     for (let i = 0; i < taskResult.length; i++) {
@@ -60,6 +75,16 @@ function queryChildrenElements (pContextName, pID) {
         let children = queryChildrenElements("Activity", activityResult[i][0]);
         res = res.concat(children);
     }
+    
+    for (let i = 0; i < ticketResult.length; i++) {
+        // Augment data
+        ticketResult[i] = augmentData(ticketResult[i], "SupportTicket");
+        res.push(ticketResult[i]);
+        
+        // Query children
+        let children = queryChildrenElements("SupportTicket", ticketResult[i][0]);
+        res = res.concat(children);
+    }
       
     return res;
 }
@@ -99,7 +124,21 @@ function queryRootElement (pContextName, pID, pGetFirst) {
             fixedID = resultArray[0];
         }
         return augmentData(resultArray, "Activity");
-    } else {
+    }
+    else if (pContextName === "SupportTicket") {
+        resultArray = db.array(db.ROW, "select TICKETID, PARENT_ID, PARENT_CONTEXT, SUBJECT, DESCRIPTION from TICKET left join TASK on TASK_ID = TASKID where TICKETID = '" + pID +"'");
+        if (resultArray.length === 0) {
+            return null;
+        }
+        if (pGetFirst && resultArray[1] && resultArray[2])
+            return queryRootElement(resultArray[2], resultArray[1], pGetFirst);
+        if (pGetFirst)
+        {
+            fixedContextName = "SupportTicket";
+            fixedID = resultArray[0];
+        }
+        return augmentData(resultArray, "SupportTicket");}
+    else {
         return null;
     }
 }
@@ -121,7 +160,7 @@ function augmentData (pDataRow, pType) {
     if (pDataRow.length === 0)
         return null;
     
-    if (pType !== "Task" && pType !== "Activity")
+    if (pType !== "Task" && pType !== "Activity" && pType !="SupportTicket")
         return null;
     
     // PARENT_ID check
@@ -136,7 +175,7 @@ function augmentData (pDataRow, pType) {
     pDataRow.splice(1, 0, pType);
     
     // Insert icon
-    pDataRow.splice(6, 0, pType === "Task" ? "VAADIN:TASKS" : pType === "Activity" ? "VAADIN:HOURGLASS_END": null);
+    pDataRow.splice(6, 0, pType === "Task" ? "VAADIN:TASKS" : pType === "Activity" ? "VAADIN:HOURGLASS_END": pType==="SupportTicket" ? "VAADIN:QUESTION": null);
     
     return pDataRow;
 }
\ No newline at end of file
diff --git a/entity/Offer_entity/Offer_entity.aod b/entity/Offer_entity/Offer_entity.aod
index f7d1884b6ac421736dcd3d72384b39928e7bb7b8..df06c88b7a21d3e0f87670c25e2236dc1c998fdc 100644
--- a/entity/Offer_entity/Offer_entity.aod
+++ b/entity/Offer_entity/Offer_entity.aod
@@ -884,6 +884,13 @@
       <title>Letter salutation</title>
       <valueProcess>%aditoprj%/entity/Offer_entity/entityfields/lettersalutation/valueProcess.js</valueProcess>
     </entityField>
+    <entityActionField>
+      <name>openAdminView</name>
+      <title>Open admin view</title>
+      <onActionProcess>%aditoprj%/entity/Offer_entity/entityfields/openadminview/onActionProcess.js</onActionProcess>
+      <iconId>VAADIN:CURLY_BRACKETS</iconId>
+      <stateProcess>%aditoprj%/entity/Offer_entity/entityfields/openadminview/stateProcess.js</stateProcess>
+    </entityActionField>
   </entityFields>
   <recordContainers>
     <dbRecordContainer>
diff --git a/entity/Offer_entity/entityfields/contact_id/onValueChange.js b/entity/Offer_entity/entityfields/contact_id/onValueChange.js
index e0a100eeab30aaf88b169b1983628f54cf092441..933b3192f785834e9c600315ee2d16465cf50dd8 100644
--- a/entity/Offer_entity/entityfields/contact_id/onValueChange.js
+++ b/entity/Offer_entity/entityfields/contact_id/onValueChange.js
@@ -1,3 +1,4 @@
+import("system.logging");
 import("system.neon");
 import("system.vars");
 import("system.db");
@@ -23,5 +24,7 @@ else
     neon.setFieldValue("$field.LANGUAGE", "");
 }
 
-if(!vars.exists("$param.ObjectRowId_param") && !vars.get("$param.ObjectRowId_param"))
+if(!vars.get("$param.ObjectRowId_param"))
+{
     neon.setFieldValue("$field.OBJECT_ROWID", "");
+}
\ No newline at end of file
diff --git a/entity/Offer_entity/entityfields/openadminview/onActionProcess.js b/entity/Offer_entity/entityfields/openadminview/onActionProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..9257ff40784f0d506f2b68484ae292b951c069bd
--- /dev/null
+++ b/entity/Offer_entity/entityfields/openadminview/onActionProcess.js
@@ -0,0 +1,13 @@
+import("system.vars");
+import("Context_lib");
+import("system.result");
+
+result.string(AdminViewUtils.open("OFFERID", [
+    ["CONTACT_ID", vars.get("$field.CONTACT_ID")],
+    ["CONTACT_ORG_ID", vars.get("$field.CONTACT_ORG_ID")],
+    ["CONTACT_PERSON_ID", vars.get("$field.CONTACT_PERSON_ID")],
+    ["DATE_NEW", vars.get("$field.DATE_NEW")],
+    ["DATE_EDIT", vars.get("$field.DATE_EDIT")],
+    ["USER_NEW", vars.get("$field.USER_NEW")],
+    ["USER_EDIT", vars.get("$field.USER_EDIT")]
+]));
\ No newline at end of file
diff --git a/entity/Offer_entity/entityfields/openadminview/stateProcess.js b/entity/Offer_entity/entityfields/openadminview/stateProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..38f2298db7304b4d44a15fbad7f720558c02da99
--- /dev/null
+++ b/entity/Offer_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/Order_entity/Order_entity.aod b/entity/Order_entity/Order_entity.aod
index 55d9f1bbd66fc7525298e84f0d016a6e9f70aed5..6181f04db534cb2ab56c6985c2a03d8dc579df9e 100644
--- a/entity/Order_entity/Order_entity.aod
+++ b/entity/Order_entity/Order_entity.aod
@@ -471,6 +471,13 @@
         </entityParameter>
       </children>
     </entityConsumer>
+    <entityActionField>
+      <name>openAdminView</name>
+      <title>Open admin view</title>
+      <onActionProcess>%aditoprj%/entity/Order_entity/entityfields/openadminview/onActionProcess.js</onActionProcess>
+      <iconId>VAADIN:CURLY_BRACKETS</iconId>
+      <stateProcess>%aditoprj%/entity/Order_entity/entityfields/openadminview/stateProcess.js</stateProcess>
+    </entityActionField>
   </entityFields>
   <recordContainers>
     <dbRecordContainer>
diff --git a/entity/Order_entity/entityfields/openadminview/onActionProcess.js b/entity/Order_entity/entityfields/openadminview/onActionProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..a253442813b4782139e4af275015c1fffc7f2e14
--- /dev/null
+++ b/entity/Order_entity/entityfields/openadminview/onActionProcess.js
@@ -0,0 +1,10 @@
+import("system.vars");
+import("Context_lib");
+
+AdminViewUtils.open("SALESORDERID", [
+    ["SALESPROJECT_ID", vars.get("$field.SALESPROJECT_ID")],
+    ["OFFER_ID", vars.get("$field.OFFER_ID")],
+    ["CONTACT_ID", vars.get("$field.CONTACT_ID")],
+    ["CONTACT_ORG_ID", vars.get("$field.CONTACT_ORG_ID")],
+    ["CONTACT_PERSON_ID", vars.get("$field.CONTACT_PERSON_ID")]
+]);
\ No newline at end of file
diff --git a/entity/Order_entity/entityfields/openadminview/stateProcess.js b/entity/Order_entity/entityfields/openadminview/stateProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..38f2298db7304b4d44a15fbad7f720558c02da99
--- /dev/null
+++ b/entity/Order_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/Organisation_entity/Organisation_entity.aod b/entity/Organisation_entity/Organisation_entity.aod
index dbcf7f0a06f43142cc4157693163ccbc29c1a82d..924c7ba3d2b3a1824d007cf4999c7d825855cce8 100644
--- a/entity/Organisation_entity/Organisation_entity.aod
+++ b/entity/Organisation_entity/Organisation_entity.aod
@@ -751,6 +751,8 @@
     </entityParameter>
     <entityActionGroup>
       <name>campaignActionGroup</name>
+      <title>Campaign</title>
+      <iconId>NEON:GROUP_APPOINTMENT</iconId>
       <children>
         <entityActionField>
           <name>addToCampaignFromTable</name>
@@ -759,11 +761,13 @@
           <isObjectAction v="false" />
           <isSelectionAction v="false" />
           <iconId>NEON:GROUP_APPOINTMENT</iconId>
+          <stateProcess>%aditoprj%/entity/Organisation_entity/entityfields/campaignactiongroup/children/addtocampaignfromtable/stateProcess.js</stateProcess>
           <tooltip>Add the selection to a campaign</tooltip>
           <tooltipProcess>%aditoprj%/entity/Organisation_entity/entityfields/campaignactiongroup/children/addtocampaignfromtable/tooltipProcess.js</tooltipProcess>
         </entityActionField>
         <entityActionField>
           <name>addToBulkMailFromTable</name>
+          <title>Add to Bulkmail</title>
           <onActionProcess>%aditoprj%/entity/Organisation_entity/entityfields/campaignactiongroup/children/addtobulkmailfromtable/onActionProcess.js</onActionProcess>
           <isObjectAction v="false" />
           <isSelectionAction v="true" />
@@ -820,6 +824,7 @@
       <title>Open admin view</title>
       <onActionProcess>%aditoprj%/entity/Organisation_entity/entityfields/openadminview/onActionProcess.js</onActionProcess>
       <iconId>VAADIN:CURLY_BRACKETS</iconId>
+      <stateProcess>%aditoprj%/entity/Organisation_entity/entityfields/openadminview/stateProcess.js</stateProcess>
     </entityActionField>
     <entityConsumer>
       <name>LinkedAppointments</name>
diff --git a/entity/Organisation_entity/entityfields/campaignactiongroup/children/addtocampaignfromtable/stateProcess.js b/entity/Organisation_entity/entityfields/campaignactiongroup/children/addtocampaignfromtable/stateProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..9d2caf19d33cc0a8be852883401ff256e06fe5b9
--- /dev/null
+++ b/entity/Organisation_entity/entityfields/campaignactiongroup/children/addtocampaignfromtable/stateProcess.js
@@ -0,0 +1,16 @@
+import("system.db");
+import("system.vars");
+import("system.neon");
+import("system.result");
+
+var query = "select count(*) from ORGANISATION where ORGANISATIONID != '0'"
+var contactCount = db.cell(query);
+
+if(contactCount > 0)
+{
+    result.string(neon.COMPONENTSTATE_EDITABLE);
+}
+else
+{
+    result.string(neon.COMPONENTSTATE_DISABLED);
+}
\ No newline at end of file
diff --git a/entity/Organisation_entity/entityfields/openadminview/onActionProcess.js b/entity/Organisation_entity/entityfields/openadminview/onActionProcess.js
index 01ced877c1b8e747137b46cebc1ac042dee51ddd..8a1b220f1e40e5d36f51e6d5afec394b6d9f8b52 100644
--- a/entity/Organisation_entity/entityfields/openadminview/onActionProcess.js
+++ b/entity/Organisation_entity/entityfields/openadminview/onActionProcess.js
@@ -1,12 +1,13 @@
-import("system.neon");
+import("system.vars");
 import("Context_lib");
 
-openAdminView();
-
-function openAdminView (pViewName)
-{
-    var context = ContextUtils.getCurrentContextId();
-    if (!pViewName)
-        pViewName = context + "Admin_view"
-    neon.openContext(context, pViewName, id, neon.OPERATINGSTATE_VIEW, null);
-}
\ No newline at end of file
+AdminViewUtils.open("CONTACTID", [
+    ["ORGANISATION_ID", vars.get("$field.ORGANISATION_ID")],
+    ["ADDRESS_ID", vars.get("$field.ADDRESS_ID")],
+    ["DATE_NEW", vars.get("$field.DATE_NEW")],
+    ["DATE_EDIT", vars.get("$field.DATE_EDIT")],
+    ["DATE_NEW_CONTACT", vars.get("$field.DATE_NEW_CONTACT")],
+    ["USER_NEW", vars.get("$field.USER_NEW")],
+    ["USER_EDIT", vars.get("$field.USER_EDIT")],
+    ["USER_NEW_CONTACT", vars.get("$field.USER_NEW_CONTACT")],
+]);
\ No newline at end of file
diff --git a/entity/Organisation_entity/entityfields/openadminview/stateProcess.js b/entity/Organisation_entity/entityfields/openadminview/stateProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..38f2298db7304b4d44a15fbad7f720558c02da99
--- /dev/null
+++ b/entity/Organisation_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/Person_entity/Person_entity.aod b/entity/Person_entity/Person_entity.aod
index 131f57a342976a436e6c5f6f6e0d870ab166f993..395d2c1450d1c6419131221807b949f49004f905 100644
--- a/entity/Person_entity/Person_entity.aod
+++ b/entity/Person_entity/Person_entity.aod
@@ -812,6 +812,7 @@ Usually this is used for filtering COMMUNICATION-entries by a specified contact
     <entityActionGroup>
       <name>campaignActionGroup</name>
       <title>Campaign</title>
+      <iconId>NEON:GROUP_APPOINTMENT</iconId>
       <children>
         <entityActionField>
           <name>addToCampaignFromTable</name>
@@ -821,11 +822,13 @@ Usually this is used for filtering COMMUNICATION-entries by a specified contact
           <isObjectAction v="false" />
           <isSelectionAction v="false" />
           <iconId>NEON:GROUP_APPOINTMENT</iconId>
+          <stateProcess>%aditoprj%/entity/Person_entity/entityfields/campaignactiongroup/children/addtocampaignfromtable/stateProcess.js</stateProcess>
           <tooltip>Add the selection to a campaign</tooltip>
           <tooltipProcess>%aditoprj%/entity/Person_entity/entityfields/campaignactiongroup/children/addtocampaignfromtable/tooltipProcess.js</tooltipProcess>
         </entityActionField>
         <entityActionField>
           <name>addToBulkMailFromTable</name>
+          <title>Add to Bulkmail</title>
           <onActionProcess>%aditoprj%/entity/Person_entity/entityfields/campaignactiongroup/children/addtobulkmailfromtable/onActionProcess.js</onActionProcess>
           <isObjectAction v="false" />
           <isSelectionAction v="true" />
@@ -873,11 +876,11 @@ Usually this is used for filtering COMMUNICATION-entries by a specified contact
       <iconId>VAADIN:ENVELOPE</iconId>
     </entityActionField>
     <entityActionField>
-      <name>openAdminInfo</name>
+      <name>openAdminView</name>
       <title>Open admin view</title>
-      <onActionProcess>%aditoprj%/entity/Person_entity/entityfields/openadmininfo/onActionProcess.js</onActionProcess>
+      <onActionProcess>%aditoprj%/entity/Person_entity/entityfields/openadminview/onActionProcess.js</onActionProcess>
       <iconId>VAADIN:CURLY_BRACKETS</iconId>
-      <stateProcess>%aditoprj%/entity/Person_entity/entityfields/openadmininfo/stateProcess.js</stateProcess>
+      <stateProcess>%aditoprj%/entity/Person_entity/entityfields/openadminview/stateProcess.js</stateProcess>
     </entityActionField>
     <entityConsumer>
       <name>DSGVOEntries</name>
diff --git a/entity/Person_entity/entityfields/campaignactiongroup/children/addtocampaignfromtable/stateProcess.js b/entity/Person_entity/entityfields/campaignactiongroup/children/addtocampaignfromtable/stateProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..eedb470bf2e3dace60da9a626a9a910d3455675c
--- /dev/null
+++ b/entity/Person_entity/entityfields/campaignactiongroup/children/addtocampaignfromtable/stateProcess.js
@@ -0,0 +1,16 @@
+import("system.db");
+import("system.vars");
+import("system.neon");
+import("system.result");
+
+var query = "select count(*) from PERSON"
+var contactCount = db.cell(query);
+
+if(contactCount > 0)
+{
+    result.string(neon.COMPONENTSTATE_EDITABLE);
+}
+else
+{
+    result.string(neon.COMPONENTSTATE_DISABLED);
+}
\ No newline at end of file
diff --git a/entity/Person_entity/entityfields/openadmininfo/onActionProcess.js b/entity/Person_entity/entityfields/openadmininfo/onActionProcess.js
deleted file mode 100644
index 9242625e42712c8511a62e51c49113056026965e..0000000000000000000000000000000000000000
--- a/entity/Person_entity/entityfields/openadmininfo/onActionProcess.js
+++ /dev/null
@@ -1,13 +0,0 @@
-import("system.vars");
-import("Context_lib");
-import("system.neon");
-
-var openAdminView = function (pViewName) 
-{
-    var context = ContextUtils.getCurrentContextId();
-    if (!pViewName)
-        pViewName = context + "Admin_view";
-    neon.openContext(context, pViewName, [vars.get("$sys.uid")], neon.OPERATINGSTATE_VIEW, null);
-}
-
-openAdminView();
diff --git a/entity/Person_entity/entityfields/openadmininfo/stateProcess.js b/entity/Person_entity/entityfields/openadmininfo/stateProcess.js
deleted file mode 100644
index 474d74b2ba06b587feef99332fc360ea8c184955..0000000000000000000000000000000000000000
--- a/entity/Person_entity/entityfields/openadmininfo/stateProcess.js
+++ /dev/null
@@ -1,13 +0,0 @@
-import("system.result");
-import("system.tools");
-import("system.neon");
-
-function isAdmin ()
-{
-    return tools.currentUserHasRole("INTERNAL_ADMINISTRATOR");
-}
-
-if (isAdmin())
-    result.string(neon.COMPONENTSTATE_EDITABLE);
-else
-    result.string(neon.COMPONENTSTATE_INVISIBLE);
\ No newline at end of file
diff --git a/entity/Person_entity/entityfields/openadminview/onActionProcess.js b/entity/Person_entity/entityfields/openadminview/onActionProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..b56b52a65ff35e86346bb7966b3cca71e3bed711
--- /dev/null
+++ b/entity/Person_entity/entityfields/openadminview/onActionProcess.js
@@ -0,0 +1,14 @@
+import("system.vars");
+import("Context_lib");
+
+AdminViewUtils.open("CONTACTID", [
+    ["PERSON_ID", vars.get("$field.PERSON_ID")],
+    ["ORGANISATION_ID", vars.get("$field.ORGANISATION_ID")],
+    ["ADDRESS_ID", vars.get("$field.ADDRESS_ID")],
+    ["DATE_NEW", vars.get("$field.DATE_NEW")],
+    ["DATE_EDIT", vars.get("$field.DATE_EDIT")],
+    ["DATE_NEW_CONTACT", vars.get("$field.DATE_NEW_CONTACT")],
+    ["USER_NEW", vars.get("$field.USER_NEW")],
+    ["USER_EDIT", vars.get("$field.USER_EDIT")],
+    ["USER_NEW_CONTACT", vars.get("$field.USER_NEW_CONTACT")],
+]);
\ No newline at end of file
diff --git a/entity/Person_entity/entityfields/openadminview/stateProcess.js b/entity/Person_entity/entityfields/openadminview/stateProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..38f2298db7304b4d44a15fbad7f720558c02da99
--- /dev/null
+++ b/entity/Person_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/Prod2prod_entity/Prod2prod_entity.aod b/entity/Prod2prod_entity/Prod2prod_entity.aod
index 63a7816bbe839fa69fa802663c320bbf79785872..c8d8cddf6460088c621a11411b917f6834ef88c4 100644
--- a/entity/Prod2prod_entity/Prod2prod_entity.aod
+++ b/entity/Prod2prod_entity/Prod2prod_entity.aod
@@ -158,6 +158,9 @@
         <jDitoRecordFieldMapping>
           <name>TAKEPRICE.value</name>
         </jDitoRecordFieldMapping>
+        <jDitoRecordFieldMapping>
+          <name>SOURCE_ID.displayValue</name>
+        </jDitoRecordFieldMapping>
       </recordFieldMappings>
     </jDitoRecordContainer>
   </recordContainers>
diff --git a/entity/Prod2prod_entity/recordcontainers/jdito/contentProcess.js b/entity/Prod2prod_entity/recordcontainers/jdito/contentProcess.js
index a06514c8f8c855531d3b59e0a435121dd5c2783c..549dd18c52b622b1419a23e002b166558d30623c 100644
--- a/entity/Prod2prod_entity/recordcontainers/jdito/contentProcess.js
+++ b/entity/Prod2prod_entity/recordcontainers/jdito/contentProcess.js
@@ -1,3 +1,4 @@
+import("system.logging");
 import("system.neon");
 import("system.result");
 import("system.vars");
@@ -124,7 +125,7 @@ var prodid = vars.exists("$param.ProductId_param")
 if(prodid != "")
 {
     // First 3 columns are crucial, the rest is optional.
-    var data = db.table("select PROD2PRODID, SOURCE_ID, DEST_ID, QUANTITY, PRODUCTCODE, PRODUCTID, PROD2PRODID, OPTIONAL, TAKEPRICE "
+    var data = db.table("select PROD2PRODID, SOURCE_ID, DEST_ID, QUANTITY, PRODUCTCODE, PRODUCTID, PROD2PRODID, OPTIONAL, TAKEPRICE, PRODUCTNAME "
                 + "from PROD2PROD join PRODUCT on PROD2PROD.SOURCE_ID = PRODUCTID "
                 + "order by PRODUCTCODE");
 
@@ -139,5 +140,6 @@ if(prodid != "")
         graphData.forEach(function (gd) { allData.push(gd); })
     })
 
+    logging.log(JSON.stringify(allData, null, "\t"))
     result.object(allData);
 }
\ No newline at end of file
diff --git a/entity/Product_entity/Product_entity.aod b/entity/Product_entity/Product_entity.aod
index a187dc29370693cc39c689596d2b00178e6dc36a..631c68ce9e7dd046284afa113fa6150eb5c92f60 100644
--- a/entity/Product_entity/Product_entity.aod
+++ b/entity/Product_entity/Product_entity.aod
@@ -442,6 +442,13 @@
         </entityParameter>
       </children>
     </entityConsumer>
+    <entityActionField>
+      <name>openAdminView</name>
+      <title>Open admin view</title>
+      <onActionProcess>%aditoprj%/entity/Product_entity/entityfields/openadminview/onActionProcess.js</onActionProcess>
+      <iconId>VAADIN:CURLY_BRACKETS</iconId>
+      <stateProcess>%aditoprj%/entity/Product_entity/entityfields/openadminview/stateProcess.js</stateProcess>
+    </entityActionField>
   </entityFields>
   <recordContainers>
     <dbRecordContainer>
diff --git a/entity/Product_entity/entityfields/openadminview/onActionProcess.js b/entity/Product_entity/entityfields/openadminview/onActionProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..f3bc924625a437b26dbcb3a019d95a4535c99637
--- /dev/null
+++ b/entity/Product_entity/entityfields/openadminview/onActionProcess.js
@@ -0,0 +1,10 @@
+import("system.vars");
+import("Context_lib");
+
+AdminViewUtils.open("PRODUCTID", [
+    ["CONTACT_ID", vars.get("$field.CONTACT_ID")],
+    ["DATE_NEW", vars.get("$field.DATE_NEW")],
+    ["DATE_EDIT", vars.get("$field.DATE_EDIT")],
+    ["USER_NEW", vars.get("$field.USER_NEW")],
+    ["USER_EDIT", vars.get("$field.USER_EDIT")]
+]);
\ No newline at end of file
diff --git a/entity/Product_entity/entityfields/openadminview/stateProcess.js b/entity/Product_entity/entityfields/openadminview/stateProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..38f2298db7304b4d44a15fbad7f720558c02da99
--- /dev/null
+++ b/entity/Product_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/Role_entity/Role_entity.aod b/entity/Role_entity/Role_entity.aod
index 9d09bd1aa18c49150ce2cf1504acefac0390280f..f6f3b52b8345bc3a535cddc9c57a69c375523fc6 100644
--- a/entity/Role_entity/Role_entity.aod
+++ b/entity/Role_entity/Role_entity.aod
@@ -10,6 +10,14 @@
   <entityFields>
     <entityProvider>
       <name>#PROVIDER</name>
+      <dependencies>
+        <entityDependency>
+          <name>69cd98b9-9cb4-4892-b60e-0c3e93a1773d</name>
+          <entityName>EmployeeRole_entity</entityName>
+          <fieldName>Roles</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+      </dependencies>
     </entityProvider>
     <entityField>
       <name>ROLETITLE</name>
diff --git a/entity/SalesprojectMilestone_entity/SalesprojectMilestone_entity.aod b/entity/SalesprojectMilestone_entity/SalesprojectMilestone_entity.aod
index a440d99c1eb9d4a218a05ad98ecb1dd289bd77bb..2e2402e44fa73292fa12ff1840ed36389f8bcbd7 100644
--- a/entity/SalesprojectMilestone_entity/SalesprojectMilestone_entity.aod
+++ b/entity/SalesprojectMilestone_entity/SalesprojectMilestone_entity.aod
@@ -3,6 +3,9 @@
   <name>SalesprojectMilestone_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <title></title>
+  <grantCreate v="false" />
+  <grantUpdate v="false" />
+  <grantDelete v="false" />
   <contentTitleProcess>%aditoprj%/entity/SalesprojectMilestone_entity/contentTitleProcess.js</contentTitleProcess>
   <recordContainer>db</recordContainer>
   <entityFields>
@@ -74,9 +77,6 @@
       <title>Days count</title>
       <valueProcess>%aditoprj%/entity/SalesprojectMilestone_entity/entityfields/dayscount/valueProcess.js</valueProcess>
     </entityField>
-    <entityField>
-      <name>PARENT</name>
-    </entityField>
     <entityConsumer>
       <name>Keywords</name>
       <dependency>
@@ -132,6 +132,21 @@
         </entityParameter>
       </children>
     </entityProvider>
+    <entityConsumer>
+      <name>SalesProjectPhases</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>SalesprojectPhase_entity</entityName>
+        <fieldName>Phases</fieldName>
+      </dependency>
+    </entityConsumer>
+    <entityField>
+      <name>PARENT_ID</name>
+    </entityField>
+    <entityField>
+      <name>dateEndGantt</name>
+      <valueProcess>%aditoprj%/entity/SalesprojectMilestone_entity/entityfields/dateendgantt/valueProcess.js</valueProcess>
+    </entityField>
   </entityFields>
   <recordContainers>
     <dbRecordContainer>
@@ -176,8 +191,8 @@
           <recordfield>SALESPROJECT_MILESTONE.SALESPROJECT_ID</recordfield>
         </dbRecordFieldMapping>
         <dbRecordFieldMapping>
-          <name>PARENT.value</name>
-          <expression>%aditoprj%/entity/SalesprojectMilestone_entity/recordcontainers/db/recordfieldmappings/parent.value/expression.js</expression>
+          <name>PARENT_ID.value</name>
+          <recordfield>SALESPROJECT_MILESTONE.PARENT_ID</recordfield>
         </dbRecordFieldMapping>
       </recordFieldMappings>
     </dbRecordContainer>
diff --git a/entity/SalesprojectMilestone_entity/entityfields/dateendgantt/valueProcess.js b/entity/SalesprojectMilestone_entity/entityfields/dateendgantt/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..ee9ef0f40067fc309f940d6b2ef7e7fc90d35f2f
--- /dev/null
+++ b/entity/SalesprojectMilestone_entity/entityfields/dateendgantt/valueProcess.js
@@ -0,0 +1,9 @@
+import("system.result");
+import("system.vars");
+
+if (!vars.get("$field.DATE_END"))
+{
+    result.string(vars.get("$sys.date"));
+} else {
+    result.string(vars.get("$field.DATE_END"));
+}
\ No newline at end of file
diff --git a/entity/SalesprojectMilestone_entity/recordcontainers/db/recordfieldmappings/parent.value/expression.js b/entity/SalesprojectMilestone_entity/recordcontainers/db/recordfieldmappings/parent.value/expression.js
deleted file mode 100644
index e5c82e9c86a2c395736339cb57fe1e2fede85a2e..0000000000000000000000000000000000000000
--- a/entity/SalesprojectMilestone_entity/recordcontainers/db/recordfieldmappings/parent.value/expression.js
+++ /dev/null
@@ -1,2 +0,0 @@
-import("system.result");
-result.string("''")
\ No newline at end of file
diff --git a/entity/SalesprojectPhase_entity/SalesprojectPhase_entity.aod b/entity/SalesprojectPhase_entity/SalesprojectPhase_entity.aod
index ef583549d67921890ca9c1b35d265af872c307c0..087a77e360c37e172ddc0c03195bc978203493ae 100644
--- a/entity/SalesprojectPhase_entity/SalesprojectPhase_entity.aod
+++ b/entity/SalesprojectPhase_entity/SalesprojectPhase_entity.aod
@@ -3,6 +3,9 @@
   <name>SalesprojectPhase_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <title>Phase</title>
+  <siblings>
+    <element>SalesprojectMilestone_entity</element>
+  </siblings>
   <titlePlural>Phases</titlePlural>
   <recordContainer>jdito</recordContainer>
   <entityFields>
@@ -35,6 +38,12 @@
           <fieldName>SalesprojectPhaseStepper</fieldName>
           <isConsumer v="false" />
         </entityDependency>
+        <entityDependency>
+          <name>26a15e56-6ce6-4d6a-9e46-793c10ac3aa6</name>
+          <entityName>SalesprojectMilestone_entity</entityName>
+          <fieldName>SalesProjectPhases</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
       </dependencies>
     </entityProvider>
   </entityFields>
diff --git a/entity/SalesprojectPhase_entity/recordcontainers/jdito/contentProcess.js b/entity/SalesprojectPhase_entity/recordcontainers/jdito/contentProcess.js
index 38fe36fcf5a06ce3ad5c65dfa486ebd6fdf70f36..686167534bfb92567678789679443ec38d8bc940 100644
--- a/entity/SalesprojectPhase_entity/recordcontainers/jdito/contentProcess.js
+++ b/entity/SalesprojectPhase_entity/recordcontainers/jdito/contentProcess.js
@@ -1,4 +1,3 @@
-import("system.logging");
 import("Sql_lib");
 import("system.db");
 import("Keyword_lib");
@@ -8,9 +7,8 @@ import("system.vars");
 
 var steps = KeywordUtils.getEntryNamesAndIdsByContainer($KeywordRegistry.salesprojectPhase());
 var selection = vars.get("$sys.selection");
-logging.log(selection.toSource());
 var selected = vars.exists("$param.CurrentPhase_param") && vars.get("$param.CurrentPhase_param");
-logging.log(selected);
+
 
 var res = [];
 steps.forEach(function ([stepId, title])
@@ -20,7 +18,7 @@ steps.forEach(function ([stepId, title])
     else
         res.push([stepId, stepId === selected ? "ACTIVE" : "EDITABLE", title, _getIcon(stepId)]);
 });
-logging.log(res.toSource())
+
 result.object(res);
 
 function _getIcon (pPhase)
diff --git a/entity/Salesproject_entity/Salesproject_entity.aod b/entity/Salesproject_entity/Salesproject_entity.aod
index 1539e8243b6c9fe1b705c2098c7bf183c3bd8bdf..35672a93d575c510f6f060b3588be9cee4a8ddb6 100644
--- a/entity/Salesproject_entity/Salesproject_entity.aod
+++ b/entity/Salesproject_entity/Salesproject_entity.aod
@@ -3,6 +3,9 @@
   <name>Salesproject_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <title>Salesproject</title>
+  <siblings>
+    <element>SalesprojectMilestone_entity</element>
+  </siblings>
   <contentTitleProcess>%aditoprj%/entity/Salesproject_entity/contentTitleProcess.js</contentTitleProcess>
   <afterUiInit>%aditoprj%/entity/Salesproject_entity/afterUiInit.js</afterUiInit>
   <onValidation>%aditoprj%/entity/Salesproject_entity/onValidation.js</onValidation>
@@ -667,6 +670,13 @@
       <contentType>HTML</contentType>
       <valueProcess>%aditoprj%/entity/Salesproject_entity/entityfields/phaseinfo/valueProcess.js</valueProcess>
     </entityField>
+    <entityActionField>
+      <name>openAdminView</name>
+      <title>Open admin view</title>
+      <onActionProcess>%aditoprj%/entity/Salesproject_entity/entityfields/openadminview/onActionProcess.js</onActionProcess>
+      <iconId>VAADIN:CURLY_BRACKETS</iconId>
+      <stateProcess>%aditoprj%/entity/Salesproject_entity/entityfields/openadminview/stateProcess.js</stateProcess>
+    </entityActionField>
   </entityFields>
   <recordContainers>
     <dbRecordContainer>
diff --git a/entity/Salesproject_entity/entityfields/openadminview/onActionProcess.js b/entity/Salesproject_entity/entityfields/openadminview/onActionProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..246f5181a434a2f382ae05fadc22a3e57d4cf765
--- /dev/null
+++ b/entity/Salesproject_entity/entityfields/openadminview/onActionProcess.js
@@ -0,0 +1,6 @@
+import("system.vars");
+import("Context_lib");
+
+AdminViewUtils.open("SALESPROJECTID", [
+    ["CONTACT_ID", vars.get("$field.CONTACT_ID")]
+]);
\ No newline at end of file
diff --git a/entity/Salesproject_entity/entityfields/openadminview/stateProcess.js b/entity/Salesproject_entity/entityfields/openadminview/stateProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..38f2298db7304b4d44a15fbad7f720558c02da99
--- /dev/null
+++ b/entity/Salesproject_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/Salesproject_entity/entityfields/salesprojectforecastcharts/children/yearcounttoshow_param/valueProcess.js b/entity/Salesproject_entity/entityfields/salesprojectforecastcharts/children/yearcounttoshow_param/valueProcess.js
index cfe5e471ffaccae236fa2eb676a3a3e4979edfa4..4b8bb66ab4e67c1042fa9c62ba85e37c230e451d 100644
--- a/entity/Salesproject_entity/entityfields/salesprojectforecastcharts/children/yearcounttoshow_param/valueProcess.js
+++ b/entity/Salesproject_entity/entityfields/salesprojectforecastcharts/children/yearcounttoshow_param/valueProcess.js
@@ -1,4 +1,3 @@
-import("system.logging");
 import("system.vars");
 import("system.result");
 import("system.datetime");
diff --git a/entity/SupportTicket_entity/SupportTicket_entity.aod b/entity/SupportTicket_entity/SupportTicket_entity.aod
index cfb5e2f208ebc097a37f1142fda6c9a3c916a89d..c70b106a92077b5fb48505b20418251d75e6decb 100644
--- a/entity/SupportTicket_entity/SupportTicket_entity.aod
+++ b/entity/SupportTicket_entity/SupportTicket_entity.aod
@@ -310,6 +310,59 @@
         <fieldName>Employees</fieldName>
       </dependency>
     </entityConsumer>
+    <entityActionField>
+      <name>newActivity</name>
+      <title>New activity</title>
+      <onActionProcess>%aditoprj%/entity/SupportTicket_entity/entityfields/newactivity/onActionProcess.js</onActionProcess>
+      <iconId>VAADIN:HOURGLASS_END</iconId>
+      <tooltipProcess>%aditoprj%/entity/SupportTicket_entity/entityfields/newactivity/tooltipProcess.js</tooltipProcess>
+    </entityActionField>
+    <entityActionField>
+      <name>newTask</name>
+      <title>New task</title>
+      <onActionProcess>%aditoprj%/entity/SupportTicket_entity/entityfields/newtask/onActionProcess.js</onActionProcess>
+      <iconId>VAADIN:TASKS</iconId>
+    </entityActionField>
+    <entityConsumer>
+      <name>ModuleTrees</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>ModuleTree_entity</entityName>
+        <fieldName>TreeProviders</fieldName>
+      </dependency>
+      <children>
+        <entityParameter>
+          <name>ContextName_param</name>
+          <valueProcess>%aditoprj%/entity/SupportTicket_entity/entityfields/moduletrees/children/contextname_param/valueProcess.js</valueProcess>
+        </entityParameter>
+        <entityParameter>
+          <name>ID_param</name>
+          <valueProcess>%aditoprj%/entity/SupportTicket_entity/entityfields/moduletrees/children/id_param/valueProcess.js</valueProcess>
+        </entityParameter>
+      </children>
+    </entityConsumer>
+    <entityField>
+      <name>TASK_PARENT_ID</name>
+      <valueProcess>%aditoprj%/entity/SupportTicket_entity/entityfields/task_parent_id/valueProcess.js</valueProcess>
+    </entityField>
+    <entityField>
+      <name>TASK_PARENT_CONTEXT</name>
+      <valueProcess>%aditoprj%/entity/SupportTicket_entity/entityfields/task_parent_context/valueProcess.js</valueProcess>
+    </entityField>
+    <entityParameter>
+      <name>ParentContext_param</name>
+      <expose v="true" />
+    </entityParameter>
+    <entityParameter>
+      <name>ParentId_param</name>
+      <expose v="true" />
+    </entityParameter>
+    <entityActionField>
+      <name>newSupportticket</name>
+      <title>New Supportticket</title>
+      <onActionProcess>%aditoprj%/entity/SupportTicket_entity/entityfields/newsupportticket/onActionProcess.js</onActionProcess>
+      <iconId>VAADIN:QUESTION</iconId>
+    </entityActionField>
   </entityFields>
   <recordContainers>
     <dbRecordContainer>
@@ -323,14 +376,14 @@
       <onDBDelete>%aditoprj%/entity/SupportTicket_entity/recordcontainers/db/onDBDelete.js</onDBDelete>
       <linkInformation>
         <linkInformation>
-          <name>ec5c2cd3-f05b-467f-88c6-c1d4d7de87cc</name>
+          <name>512c662b-33f6-4491-bd24-a8b862f2de84</name>
           <tableName>TICKET</tableName>
           <primaryKey>TICKETID</primaryKey>
           <isUIDTable v="true" />
           <readonly v="false" />
         </linkInformation>
         <linkInformation>
-          <name>d73da2b3-bc44-4909-9bc0-9298cf57e7d7</name>
+          <name>4e818524-bb9c-46e7-a336-e48da60c06d1</name>
           <tableName>TASK</tableName>
           <primaryKey>TASKID</primaryKey>
           <isUIDTable v="false" />
@@ -418,6 +471,14 @@
           <name>TICKETTYPE.value</name>
           <recordfield>TICKET.TICKETTYPE</recordfield>
         </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>TASK_PARENT_ID.value</name>
+          <recordfield>TASK.PARENT_ID</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>TASK_PARENT_CONTEXT.value</name>
+          <recordfield>TASK.PARENT_CONTEXT</recordfield>
+        </dbRecordFieldMapping>
       </recordFieldMappings>
     </dbRecordContainer>
   </recordContainers>
diff --git a/entity/SupportTicket_entity/entityfields/keywordtaskstate/children/whitelistids_param/valueProcess.js b/entity/SupportTicket_entity/entityfields/keywordtaskstate/children/whitelistids_param/valueProcess.js
index 4ee2bf21d31ab11aeeb48c898fc04fc05561bb47..0035c1d5e5ed84739103be35b6bf248bbddd8a61 100644
--- a/entity/SupportTicket_entity/entityfields/keywordtaskstate/children/whitelistids_param/valueProcess.js
+++ b/entity/SupportTicket_entity/entityfields/keywordtaskstate/children/whitelistids_param/valueProcess.js
@@ -1,6 +1,4 @@
-import("system.logging");
 import("system.vars");
 import("system.result");
 import("Ticket_lib");
-logging.log(TicketUtils.begin(vars.get("$field.TICKETTYPE")).getAvailableStatus())
 result.object(TicketUtils.begin(vars.get("$field.TICKETTYPE")).getAvailableStatus())
\ No newline at end of file
diff --git a/entity/SupportTicket_entity/entityfields/moduletrees/children/contextname_param/valueProcess.js b/entity/SupportTicket_entity/entityfields/moduletrees/children/contextname_param/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..5996e99db232db8df50f155732110608e5abff4e
--- /dev/null
+++ b/entity/SupportTicket_entity/entityfields/moduletrees/children/contextname_param/valueProcess.js
@@ -0,0 +1,4 @@
+import("system.result");
+import("Context_lib");
+
+result.string(ContextUtils.getCurrentContextId());
\ No newline at end of file
diff --git a/entity/SupportTicket_entity/entityfields/moduletrees/children/id_param/valueProcess.js b/entity/SupportTicket_entity/entityfields/moduletrees/children/id_param/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..9a7beeda9976ba10d5b1a62b4ed4da94ecb88be8
--- /dev/null
+++ b/entity/SupportTicket_entity/entityfields/moduletrees/children/id_param/valueProcess.js
@@ -0,0 +1,4 @@
+import("system.result");
+import("system.vars");
+
+result.string(vars.get("$field.TICKETID"));
\ No newline at end of file
diff --git a/entity/SupportTicket_entity/entityfields/newactivity/onActionProcess.js b/entity/SupportTicket_entity/entityfields/newactivity/onActionProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..eef55adcac837abb1557202539e0fabc2c0ae815
--- /dev/null
+++ b/entity/SupportTicket_entity/entityfields/newactivity/onActionProcess.js
@@ -0,0 +1,5 @@
+import("system.vars");
+import("ActivityTask_lib");
+import("Context_lib");
+
+ActivityUtils.createNewActivity(undefined, undefined, ContextUtils.getCurrentContextId(), vars.get("$field.TICKETID"));
\ No newline at end of file
diff --git a/entity/SupportTicket_entity/entityfields/newactivity/tooltipProcess.js b/entity/SupportTicket_entity/entityfields/newactivity/tooltipProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..2cdf4480a4bb519f955eb0f5a3c84ddd7bf3e5f7
--- /dev/null
+++ b/entity/SupportTicket_entity/entityfields/newactivity/tooltipProcess.js
@@ -0,0 +1,4 @@
+import("system.translate");
+import("system.result");
+
+result.string(translate.text("New activity"));
\ No newline at end of file
diff --git a/entity/SupportTicket_entity/entityfields/newsupportticket/onActionProcess.js b/entity/SupportTicket_entity/entityfields/newsupportticket/onActionProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..b4a52cb145e6a84b79dfb72ba4ef97e2f981efce
--- /dev/null
+++ b/entity/SupportTicket_entity/entityfields/newsupportticket/onActionProcess.js
@@ -0,0 +1,6 @@
+import("system.vars");
+import("ActivityTask_lib");
+import("Context_lib");
+import("Ticket_lib")
+
+TicketUtils.createNewTicket(undefined, undefined, ContextUtils.getCurrentContextId(), vars.get("$field.TICKETID"))
\ No newline at end of file
diff --git a/entity/SupportTicket_entity/entityfields/newtask/onActionProcess.js b/entity/SupportTicket_entity/entityfields/newtask/onActionProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..be994af3d1ae682b70b4dacdd41dd60805761258
--- /dev/null
+++ b/entity/SupportTicket_entity/entityfields/newtask/onActionProcess.js
@@ -0,0 +1,5 @@
+import("system.vars");
+import("ActivityTask_lib");
+import("Context_lib");
+
+TaskUtils.createNewTask(undefined, undefined, ContextUtils.getCurrentContextId(), vars.get("$field.TICKETID"));
\ No newline at end of file
diff --git a/entity/SupportTicket_entity/entityfields/task_parent_context/valueProcess.js b/entity/SupportTicket_entity/entityfields/task_parent_context/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..a9e15f730fb836d07ab0f258ac89fa0e91e69e22
--- /dev/null
+++ b/entity/SupportTicket_entity/entityfields/task_parent_context/valueProcess.js
@@ -0,0 +1,4 @@
+import("system.vars");
+import("system.result");
+
+result.string(vars.get("$param.ParentContext_param"));
diff --git a/entity/SupportTicket_entity/entityfields/task_parent_id/valueProcess.js b/entity/SupportTicket_entity/entityfields/task_parent_id/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..6de1c77ad4afafc727dff8caf06ee047aaeb2758
--- /dev/null
+++ b/entity/SupportTicket_entity/entityfields/task_parent_id/valueProcess.js
@@ -0,0 +1,4 @@
+import("system.vars");
+import("system.result");
+
+result.string(vars.get("$param.ParentId_param"));
diff --git a/entity/SupportTicket_entity/recordcontainers/db/conditionProcess.js b/entity/SupportTicket_entity/recordcontainers/db/conditionProcess.js
index 7aed878b9c800335d8ba7d6747eb5f84d99e0459..ee924d8bf89b12b609a37e7428ca01f99d6566b4 100644
--- a/entity/SupportTicket_entity/recordcontainers/db/conditionProcess.js
+++ b/entity/SupportTicket_entity/recordcontainers/db/conditionProcess.js
@@ -1,4 +1,3 @@
-import("system.logging");
 import("Employee_lib");
 import("system.vars");
 import("system.db");
@@ -23,11 +22,11 @@ if (vars.getString("$param.FilterOnlyOwnTicket_param") == "true")
 
 if (vars.exists("$param.RowId_param") && vars.get("$param.RowId_param") && vars.exists("$param.ObjectId_param") && vars.get("$param.ObjectId_param"))
 {
-    var activityLinkCond = SqlCondition.begin().andPrepareVars("TASKLINK.OBJECT_ROWID", "$param.RowId_param")
+    var taskLinkCond = SqlCondition.begin().andPrepareVars("TASKLINK.OBJECT_ROWID", "$param.RowId_param")
                                                .andPrepareVars("TASKLINK.OBJECT_TYPE", "$param.ObjectId_param");
 
                                                             // TODO: more performant way than IN. Maybe a join?
-    cond.and(db.translateStatement(activityLinkCond.buildSql("TASK.TASKID in (select TASKLINK.TASK_ID from TASKLINK", "1=2", ")")))
+    cond.and(db.translateStatement(taskLinkCond.buildSql("TASK.TASKID in (select TASKLINK.TASK_ID from TASKLINK", "1=2", ")")))
 }
 
 if (loadNothing) 
@@ -38,6 +37,5 @@ else
 {
     //TODO: use a preparedCondition when available #1030812 #1034026
     var resCond = db.translateCondition(cond.build("1=1"));
-    logging.log(resCond)
     result.string(resCond);
 }
\ No newline at end of file
diff --git a/entity/SupportTicket_entity/recordcontainers/db/onDBDelete.js b/entity/SupportTicket_entity/recordcontainers/db/onDBDelete.js
index 533e52691a63b864202ef1d916048b1f7d289144..0245f4ad4d081303f5d24769a09a9ef11b745ed6 100644
--- a/entity/SupportTicket_entity/recordcontainers/db/onDBDelete.js
+++ b/entity/SupportTicket_entity/recordcontainers/db/onDBDelete.js
@@ -1,9 +1,7 @@
-import("system.logging");
 import("system.vars");
 import("system.db");
 import("Sql_lib");
 
 var condition = SqlCondition.begin()
     .andPrepareVars("TASKLINK.TASK_ID", "$field.TASK_TASKID");
-logging.log("delete " + vars.get("$field.TASK_TASKID"))
 db.deleteData("TASKLINK", condition.build("1=2"));
\ No newline at end of file
diff --git a/entity/Task_entity/Task_entity.aod b/entity/Task_entity/Task_entity.aod
index 4703d5dcdba710183cff3f004e32fb211206ea3d..5029c02d1f7d08be17c89e5514fd4a202f66bbb1 100644
--- a/entity/Task_entity/Task_entity.aod
+++ b/entity/Task_entity/Task_entity.aod
@@ -1,521 +1,529 @@
-<?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.9" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.9">
-  <name>Task_entity</name>
-  <majorModelMode>DISTRIBUTED</majorModelMode>
-  <documentation>%aditoprj%/entity/Task_entity/documentation.adoc</documentation>
-  <title>Task</title>
-  <contentTitleProcess>%aditoprj%/entity/Task_entity/contentTitleProcess.js</contentTitleProcess>
-  <afterUiInit>%aditoprj%/entity/Task_entity/afterUiInit.js</afterUiInit>
-  <onValidation>%aditoprj%/entity/Task_entity/onValidation.js</onValidation>
-  <iconId>VAADIN:TASKS</iconId>
-  <iconIdProcess>%aditoprj%/entity/Task_entity/iconIdProcess.js</iconIdProcess>
-  <titlePlural>Tasks</titlePlural>
-  <recordContainer>db</recordContainer>
-  <entityFields>
-    <entityProvider>
-      <name>#PROVIDER</name>
-      <recordContainer>db</recordContainer>
-    </entityProvider>
-    <entityField>
-      <name>SUBJECT</name>
-      <title>subject</title>
-      <mandatory v="true" />
-    </entityField>
-    <entityField>
-      <name>STATUS</name>
-      <title>{$TASK_STATUS}</title>
-      <consumer>KeywordStates</consumer>
-      <groupable v="true" />
-      <mandatory v="true" />
-      <valueProcess>%aditoprj%/entity/Task_entity/entityfields/status/valueProcess.js</valueProcess>
-      <displayValueProcess>%aditoprj%/entity/Task_entity/entityfields/status/displayValueProcess.js</displayValueProcess>
-    </entityField>
-    <entityField>
-      <name>PRIORITY</name>
-      <title>Priority</title>
-      <consumer>KeywordPriorities</consumer>
-      <groupable v="true" />
-      <mandatory v="true" />
-      <valueProcess>%aditoprj%/entity/Task_entity/entityfields/priority/valueProcess.js</valueProcess>
-      <displayValueProcess>%aditoprj%/entity/Task_entity/entityfields/priority/displayValueProcess.js</displayValueProcess>
-    </entityField>
-    <entityField>
-      <name>REQUESTOR_CONTACT_ID</name>
-      <title>{$TASK_REQUESTOR}</title>
-      <consumer>ContactRequestors</consumer>
-      <linkedContext>Person</linkedContext>
-      <mandatory v="true" />
-      <valueProcess>%aditoprj%/entity/Task_entity/entityfields/requestor_contact_id/valueProcess.js</valueProcess>
-      <displayValueProcess>%aditoprj%/entity/Task_entity/entityfields/requestor_contact_id/displayValueProcess.js</displayValueProcess>
-    </entityField>
-    <entityField>
-      <name>EDITOR_CONTACT_ID</name>
-      <title>{$TASK_EDITOR}</title>
-      <consumer>ContactEditors</consumer>
-      <linkedContext>Person</linkedContext>
-      <displayValueProcess>%aditoprj%/entity/Task_entity/entityfields/editor_contact_id/displayValueProcess.js</displayValueProcess>
-    </entityField>
-    <entityField>
-      <name>START_DATE</name>
-      <title>Begin</title>
-      <contentType>DATE</contentType>
-      <resolution>MINUTE</resolution>
-      <outputFormat>dd.MM.yyyy HH:mm</outputFormat>
-      <inputFormat>dd.MM.yyyy HH:mm</inputFormat>
-      <groupable v="true" />
-      <valueProcess>%aditoprj%/entity/Task_entity/entityfields/start_date/valueProcess.js</valueProcess>
-    </entityField>
-    <entityField>
-      <name>MATURITY_DATE</name>
-      <title>Maturity</title>
-      <contentType>DATE</contentType>
-      <resolution>MINUTE</resolution>
-      <outputFormat>dd.MM.yyyy HH:mm</outputFormat>
-      <inputFormat>dd.MM.yyyy HH:mm</inputFormat>
-      <valueProcess>%aditoprj%/entity/Task_entity/entityfields/maturity_date/valueProcess.js</valueProcess>
-    </entityField>
-    <entityField>
-      <name>DESCRIPTION</name>
-      <title>description</title>
-      <contentType>LONG_TEXT</contentType>
-    </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>
-      <valueProcess>%aditoprj%/entity/Task_entity/entityfields/protectionlevel/valueProcess.js</valueProcess>
-    </entityField>
-    <entityField>
-      <name>TASKID</name>
-      <title>TASKID (UID)</title>
-      <mandatory v="true" />
-      <searchable v="false" />
-      <valueProcess>%aditoprj%/entity/Task_entity/entityfields/taskid/valueProcess.js</valueProcess>
-    </entityField>
-    <entityConsumer>
-      <name>ContactEditors</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Employee_entity</entityName>
-        <fieldName>Employees</fieldName>
-      </dependency>
-      <children>
-        <entityParameter>
-          <name>OnlyActives_param</name>
-        </entityParameter>
-      </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>ContactRequestors</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Employee_entity</entityName>
-        <fieldName>Employees</fieldName>
-      </dependency>
-    </entityConsumer>
-    <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>
-          <valueProcess>%aditoprj%/entity/Task_entity/entityfields/maindocuments/children/assignmentrowid_param/valueProcess.js</valueProcess>
-        </entityParameter>
-        <entityParameter>
-          <name>AssignmentTable_param</name>
-          <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>
-      </dependency>
-      <children>
-        <entityParameter>
-          <name>ContainerName_param</name>
-          <valueProcess>%aditoprj%/entity/Task_entity/entityfields/keywordstates/children/containername_param/valueProcess.js</valueProcess>
-          <expose v="false" />
-        </entityParameter>
-        <entityParameter>
-          <name>WhitelistIds_param</name>
-          <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>
-      </dependency>
-      <children>
-        <entityParameter>
-          <name>ID_param</name>
-          <valueProcess>%aditoprj%/entity/Task_entity/entityfields/moduletrees/children/id_param/valueProcess.js</valueProcess>
-          <expose v="false" />
-          <mandatory v="false" />
-        </entityParameter>
-        <entityParameter>
-          <name>ContextName_param</name>
-          <valueProcess>%aditoprj%/entity/Task_entity/entityfields/moduletrees/children/contextname_param/valueProcess.js</valueProcess>
-          <expose v="false" />
-          <mandatory v="false" />
-        </entityParameter>
-      </children>
-    </entityConsumer>
-    <entityField>
-      <name>PARENT_CONTEXT</name>
-      <searchable v="false" />
-      <valueProcess>%aditoprj%/entity/Task_entity/entityfields/parent_context/valueProcess.js</valueProcess>
-    </entityField>
-    <entityField>
-      <name>PARENT_ID</name>
-      <searchable v="false" />
-      <valueProcess>%aditoprj%/entity/Task_entity/entityfields/parent_id/valueProcess.js</valueProcess>
-    </entityField>
-    <entityParameter>
-      <name>ParentId_param</name>
-      <expose v="true" />
-      <description>PARAMETER</description>
-    </entityParameter>
-    <entityParameter>
-      <name>ParentContext_param</name>
-      <expose v="true" />
-      <description>PARAMETER</description>
-    </entityParameter>
-    <entityActionField>
-      <name>newActivity</name>
-      <title>New activity</title>
-      <onActionProcess>%aditoprj%/entity/Task_entity/entityfields/newactivity/onActionProcess.js</onActionProcess>
-      <iconId>VAADIN:HOURGLASS_END</iconId>
-      <tooltip>New activity</tooltip>
-      <tooltipProcess>%aditoprj%/entity/Task_entity/entityfields/newactivity/tooltipProcess.js</tooltipProcess>
-    </entityActionField>
-    <entityActionField>
-      <name>newTask</name>
-      <title>New task</title>
-      <onActionProcess>%aditoprj%/entity/Task_entity/entityfields/newtask/onActionProcess.js</onActionProcess>
-      <actionOrder v="1" />
-      <iconId>VAADIN:TASKS</iconId>
-    </entityActionField>
-    <entityParameter>
-      <name>RowId_param</name>
-      <expose v="true" />
-      <description>PARAMETER</description>
-    </entityParameter>
-    <entityParameter>
-      <name>ObjectId_param</name>
-      <expose v="true" />
-      <description>PARAMETER</description>
-    </entityParameter>
-    <entityConsumer>
-      <name>KeywordPriorities</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/keywordpriorities/children/containername_param/valueProcess.js</valueProcess>
-          <expose v="false" />
-        </entityParameter>
-      </children>
-    </entityConsumer>
-    <entityActionField>
-      <name>newOffer</name>
-      <title>New offer</title>
-      <onActionProcess>%aditoprj%/entity/Task_entity/entityfields/newoffer/onActionProcess.js</onActionProcess>
-      <actionOrder v="0" />
-      <iconId>VAADIN:CART</iconId>
-    </entityActionField>
-    <entityField>
-      <name>PROGRESS</name>
-      <title>Progress</title>
-      <consumer>KeywordProgress</consumer>
-      <mandatory v="true" />
-      <valueProcess>%aditoprj%/entity/Task_entity/entityfields/progress/valueProcess.js</valueProcess>
-      <displayValueProcess>%aditoprj%/entity/Task_entity/entityfields/progress/displayValueProcess.js</displayValueProcess>
-    </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>
-    </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>
-    </entityConsumer>
-    <entityProvider>
-      <name>Tasks</name>
-      <dependencies>
-        <entityDependency>
-          <name>dd79df43-264c-494b-9c92-cadf19e61db6</name>
-          <entityName>Organisation_entity</entityName>
-          <fieldName>Tasks</fieldName>
-          <isConsumer v="false" />
-        </entityDependency>
-        <entityDependency>
-          <name>dc29832e-15da-4f64-b17a-f1dd978ef47b</name>
-          <entityName>Person_entity</entityName>
-          <fieldName>Tasks</fieldName>
-          <isConsumer v="false" />
-        </entityDependency>
-        <entityDependency>
-          <name>c6507834-cd91-4202-bdf7-6566f968edb4</name>
-          <entityName>Salesproject_entity</entityName>
-          <fieldName>Tasks</fieldName>
-          <isConsumer v="false" />
-        </entityDependency>
-        <entityDependency>
-          <name>26b9b221-de02-40ef-a400-d4b5e356da0b</name>
-          <entityName>Offer_entity</entityName>
-          <fieldName>Tasks</fieldName>
-          <isConsumer v="false" />
-        </entityDependency>
-        <entityDependency>
-          <name>b2bb448a-b647-40c8-baec-16356f3e23f5</name>
-          <entityName>Order_entity</entityName>
-          <fieldName>Tasks</fieldName>
-          <isConsumer v="false" />
-        </entityDependency>
-        <entityDependency>
-          <name>a93f1e7e-f929-438f-8f37-21e4af8b53b6</name>
-          <entityName>Product_entity</entityName>
-          <fieldName>Tasks</fieldName>
-          <isConsumer v="false" />
-        </entityDependency>
-        <entityDependency>
-          <name>2b0c15eb-fa9a-4ee8-a8b1-5d0f344ddad6</name>
-          <entityName>Contract_entity</entityName>
-          <fieldName>Tasks</fieldName>
-          <isConsumer v="false" />
-        </entityDependency>
-        <entityDependency>
-          <name>335e31ad-ab67-4567-b4ea-3668f04922b2</name>
-          <entityName>Campaign_entity</entityName>
-          <fieldName>Tasks</fieldName>
-          <isConsumer v="false" />
-        </entityDependency>
-        <entityDependency>
-          <name>fbaa2f6c-0ba1-4c93-acae-d7b636581679</name>
-          <entityName>CampaignStep_entity</entityName>
-          <fieldName>Tasks</fieldName>
-          <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>
-      <expose v="true" />
-      <documentation>%aditoprj%/entity/Task_entity/entityfields/presetlinks_param/documentation.adoc</documentation>
-      <description>PARAMETER</description>
-    </entityParameter>
-    <entityField>
-      <name>SUBJECT_DETAILS</name>
-      <title>subject</title>
-      <linkedContext>Task</linkedContext>
-      <valueProcess>%aditoprj%/entity/Task_entity/entityfields/subject_details/valueProcess.js</valueProcess>
-    </entityField>
-    <entityParameter>
-      <name>FilterOnlyOwnTask_param</name>
-      <valueProcess>%aditoprj%/entity/Task_entity/entityfields/filteronlyowntask_param/valueProcess.js</valueProcess>
-      <expose v="true" />
-      <description>PARAMETER</description>
-    </entityParameter>
-    <entityField>
-      <name>PRIORITY_ICON</name>
-      <colorProcess>%aditoprj%/entity/Task_entity/entityfields/priority_icon/colorProcess.js</colorProcess>
-      <contentType>IMAGE</contentType>
-      <valueProcess>%aditoprj%/entity/Task_entity/entityfields/priority_icon/valueProcess.js</valueProcess>
-    </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>
-    </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>
-          <valueProcess>%aditoprj%/entity/Task_entity/entityfields/documents/children/assignmentrowid_param/valueProcess.js</valueProcess>
-        </entityParameter>
-        <entityParameter>
-          <name>AssignmentTable_param</name>
-          <valueProcess>%aditoprj%/entity/Task_entity/entityfields/documents/children/assignmenttable_param/valueProcess.js</valueProcess>
-        </entityParameter>
-      </children>
-    </entityConsumer>
-    <entityField>
-      <name>TYPE</name>
-      <valueProcess>%aditoprj%/entity/Task_entity/entityfields/type/valueProcess.js</valueProcess>
-    </entityField>
-  </entityFields>
-  <recordContainers>
-    <dbRecordContainer>
-      <name>db</name>
-      <alias>Data_alias</alias>
-      <conditionProcess>%aditoprj%/entity/Task_entity/recordcontainers/db/conditionProcess.js</conditionProcess>
-      <orderClauseProcess>%aditoprj%/entity/Task_entity/recordcontainers/db/orderClauseProcess.js</orderClauseProcess>
-      <onDBDelete>%aditoprj%/entity/Task_entity/recordcontainers/db/onDBDelete.js</onDBDelete>
-      <linkInformation>
-        <linkInformation>
-          <name>6dfe6f25-2b83-413b-89e4-5c5b9839be2e</name>
-          <tableName>TASK</tableName>
-          <primaryKey>TASKID</primaryKey>
-          <isUIDTable v="true" />
-          <readonly v="false" />
-        </linkInformation>
-      </linkInformation>
-      <recordFieldMappings>
-        <dbRecordFieldMapping>
-          <name>DESCRIPTION.value</name>
-          <recordfield>TASK.DESCRIPTION</recordfield>
-        </dbRecordFieldMapping>
-        <dbRecordFieldMapping>
-          <name>EDITOR_CONTACT_ID.value</name>
-          <recordfield>TASK.EDITOR_CONTACT_ID</recordfield>
-        </dbRecordFieldMapping>
-        <dbRecordFieldMapping>
-          <name>MATURITY_DATE.value</name>
-          <recordfield>TASK.MATURITY_DATE</recordfield>
-        </dbRecordFieldMapping>
-        <dbRecordFieldMapping>
-          <name>PRIORITY.value</name>
-          <recordfield>TASK.PRIORITY</recordfield>
-        </dbRecordFieldMapping>
-        <dbRecordFieldMapping>
-          <name>PROTECTIONLEVEL.value</name>
-          <recordfield>TASK.PROTECTIONLEVEL</recordfield>
-        </dbRecordFieldMapping>
-        <dbRecordFieldMapping>
-          <name>REQUESTOR_CONTACT_ID.value</name>
-          <recordfield>TASK.REQUESTOR_CONTACT_ID</recordfield>
-        </dbRecordFieldMapping>
-        <dbRecordFieldMapping>
-          <name>START_DATE.value</name>
-          <recordfield>TASK.START_DATE</recordfield>
-        </dbRecordFieldMapping>
-        <dbRecordFieldMapping>
-          <name>STATUS.value</name>
-          <recordfield>TASK.STATUS</recordfield>
-        </dbRecordFieldMapping>
-        <dbRecordFieldMapping>
-          <name>SUBJECT.value</name>
-          <recordfield>TASK.SUBJECT</recordfield>
-        </dbRecordFieldMapping>
-        <dbRecordFieldMapping>
-          <name>TASKID.value</name>
-          <recordfield>TASK.TASKID</recordfield>
-        </dbRecordFieldMapping>
-        <dbRecordFieldMapping>
-          <name>EDITOR_CONTACT_ID.displayValue</name>
-          <expression>%aditoprj%/entity/Task_entity/recordcontainers/db/recordfieldmappings/editor_contact_id.displayvalue/expression.js</expression>
-        </dbRecordFieldMapping>
-        <dbRecordFieldMapping>
-          <name>REQUESTOR_CONTACT_ID.displayValue</name>
-          <expression>%aditoprj%/entity/Task_entity/recordcontainers/db/recordfieldmappings/requestor_contact_id.displayvalue/expression.js</expression>
-        </dbRecordFieldMapping>
-        <dbRecordFieldMapping>
-          <name>PARENT_CONTEXT.value</name>
-          <recordfield>TASK.PARENT_CONTEXT</recordfield>
-        </dbRecordFieldMapping>
-        <dbRecordFieldMapping>
-          <name>PARENT_ID.value</name>
-          <recordfield>TASK.PARENT_ID</recordfield>
-        </dbRecordFieldMapping>
-        <dbRecordFieldMapping>
-          <name>PRIORITY.displayValue</name>
-          <expression>%aditoprj%/entity/Task_entity/recordcontainers/db/recordfieldmappings/priority.displayvalue/expression.js</expression>
-        </dbRecordFieldMapping>
-        <dbRecordFieldMapping>
-          <name>PROGRESS.value</name>
-          <recordfield>TASK.PROGRESS</recordfield>
-        </dbRecordFieldMapping>
-        <dbRecordFieldMapping>
-          <name>PROGRESS.displayValue</name>
-          <expression>%aditoprj%/entity/Task_entity/recordcontainers/db/recordfieldmappings/progress.displayvalue/expression.js</expression>
-        </dbRecordFieldMapping>
-        <dbRecordFieldMapping>
-          <name>STATUS.displayValue</name>
-          <expression>%aditoprj%/entity/Task_entity/recordcontainers/db/recordfieldmappings/status.displayvalue/expression.js</expression>
-        </dbRecordFieldMapping>
-        <dbRecordFieldMapping>
-          <name>TYPE.value</name>
-          <recordfield>TASK.TYPE</recordfield>
-        </dbRecordFieldMapping>
-      </recordFieldMappings>
-    </dbRecordContainer>
-  </recordContainers>
-</entity>
+<?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.9" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.9">
+  <name>Task_entity</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <documentation>%aditoprj%/entity/Task_entity/documentation.adoc</documentation>
+  <title>Task</title>
+  <contentTitleProcess>%aditoprj%/entity/Task_entity/contentTitleProcess.js</contentTitleProcess>
+  <afterUiInit>%aditoprj%/entity/Task_entity/afterUiInit.js</afterUiInit>
+  <onValidation>%aditoprj%/entity/Task_entity/onValidation.js</onValidation>
+  <iconId>VAADIN:TASKS</iconId>
+  <iconIdProcess>%aditoprj%/entity/Task_entity/iconIdProcess.js</iconIdProcess>
+  <titlePlural>Tasks</titlePlural>
+  <recordContainer>db</recordContainer>
+  <entityFields>
+    <entityProvider>
+      <name>#PROVIDER</name>
+      <recordContainer>db</recordContainer>
+    </entityProvider>
+    <entityField>
+      <name>SUBJECT</name>
+      <title>subject</title>
+      <mandatory v="true" />
+    </entityField>
+    <entityField>
+      <name>STATUS</name>
+      <title>{$TASK_STATUS}</title>
+      <consumer>KeywordStates</consumer>
+      <groupable v="true" />
+      <mandatory v="true" />
+      <valueProcess>%aditoprj%/entity/Task_entity/entityfields/status/valueProcess.js</valueProcess>
+      <displayValueProcess>%aditoprj%/entity/Task_entity/entityfields/status/displayValueProcess.js</displayValueProcess>
+    </entityField>
+    <entityField>
+      <name>PRIORITY</name>
+      <title>Priority</title>
+      <consumer>KeywordPriorities</consumer>
+      <groupable v="true" />
+      <mandatory v="true" />
+      <valueProcess>%aditoprj%/entity/Task_entity/entityfields/priority/valueProcess.js</valueProcess>
+      <displayValueProcess>%aditoprj%/entity/Task_entity/entityfields/priority/displayValueProcess.js</displayValueProcess>
+    </entityField>
+    <entityField>
+      <name>REQUESTOR_CONTACT_ID</name>
+      <title>{$TASK_REQUESTOR}</title>
+      <consumer>ContactRequestors</consumer>
+      <linkedContext>Person</linkedContext>
+      <mandatory v="true" />
+      <valueProcess>%aditoprj%/entity/Task_entity/entityfields/requestor_contact_id/valueProcess.js</valueProcess>
+      <displayValueProcess>%aditoprj%/entity/Task_entity/entityfields/requestor_contact_id/displayValueProcess.js</displayValueProcess>
+    </entityField>
+    <entityField>
+      <name>EDITOR_CONTACT_ID</name>
+      <title>{$TASK_EDITOR}</title>
+      <consumer>ContactEditors</consumer>
+      <linkedContext>Person</linkedContext>
+      <displayValueProcess>%aditoprj%/entity/Task_entity/entityfields/editor_contact_id/displayValueProcess.js</displayValueProcess>
+    </entityField>
+    <entityField>
+      <name>START_DATE</name>
+      <title>Begin</title>
+      <contentType>DATE</contentType>
+      <resolution>MINUTE</resolution>
+      <outputFormat>dd.MM.yyyy HH:mm</outputFormat>
+      <inputFormat>dd.MM.yyyy HH:mm</inputFormat>
+      <groupable v="true" />
+      <valueProcess>%aditoprj%/entity/Task_entity/entityfields/start_date/valueProcess.js</valueProcess>
+    </entityField>
+    <entityField>
+      <name>MATURITY_DATE</name>
+      <title>Maturity</title>
+      <contentType>DATE</contentType>
+      <resolution>MINUTE</resolution>
+      <outputFormat>dd.MM.yyyy HH:mm</outputFormat>
+      <inputFormat>dd.MM.yyyy HH:mm</inputFormat>
+      <valueProcess>%aditoprj%/entity/Task_entity/entityfields/maturity_date/valueProcess.js</valueProcess>
+    </entityField>
+    <entityField>
+      <name>DESCRIPTION</name>
+      <title>description</title>
+      <contentType>LONG_TEXT</contentType>
+    </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>
+      <valueProcess>%aditoprj%/entity/Task_entity/entityfields/protectionlevel/valueProcess.js</valueProcess>
+    </entityField>
+    <entityField>
+      <name>TASKID</name>
+      <title>TASKID (UID)</title>
+      <mandatory v="true" />
+      <searchable v="false" />
+      <valueProcess>%aditoprj%/entity/Task_entity/entityfields/taskid/valueProcess.js</valueProcess>
+    </entityField>
+    <entityConsumer>
+      <name>ContactEditors</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Employee_entity</entityName>
+        <fieldName>Employees</fieldName>
+      </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>ContactRequestors</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Employee_entity</entityName>
+        <fieldName>Employees</fieldName>
+      </dependency>
+    </entityConsumer>
+    <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>
+          <valueProcess>%aditoprj%/entity/Task_entity/entityfields/maindocuments/children/assignmentrowid_param/valueProcess.js</valueProcess>
+        </entityParameter>
+        <entityParameter>
+          <name>AssignmentTable_param</name>
+          <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>
+      </dependency>
+      <children>
+        <entityParameter>
+          <name>ContainerName_param</name>
+          <valueProcess>%aditoprj%/entity/Task_entity/entityfields/keywordstates/children/containername_param/valueProcess.js</valueProcess>
+          <expose v="false" />
+        </entityParameter>
+        <entityParameter>
+          <name>WhitelistIds_param</name>
+          <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>
+      </dependency>
+      <children>
+        <entityParameter>
+          <name>ID_param</name>
+          <valueProcess>%aditoprj%/entity/Task_entity/entityfields/moduletrees/children/id_param/valueProcess.js</valueProcess>
+          <expose v="true" />
+          <mandatory v="false" />
+        </entityParameter>
+        <entityParameter>
+          <name>ContextName_param</name>
+          <valueProcess>%aditoprj%/entity/Task_entity/entityfields/moduletrees/children/contextname_param/valueProcess.js</valueProcess>
+          <expose v="false" />
+          <mandatory v="false" />
+        </entityParameter>
+      </children>
+    </entityConsumer>
+    <entityField>
+      <name>PARENT_CONTEXT</name>
+      <searchable v="false" />
+      <valueProcess>%aditoprj%/entity/Task_entity/entityfields/parent_context/valueProcess.js</valueProcess>
+    </entityField>
+    <entityField>
+      <name>PARENT_ID</name>
+      <searchable v="false" />
+      <valueProcess>%aditoprj%/entity/Task_entity/entityfields/parent_id/valueProcess.js</valueProcess>
+    </entityField>
+    <entityParameter>
+      <name>ParentId_param</name>
+      <expose v="true" />
+      <description>PARAMETER</description>
+    </entityParameter>
+    <entityParameter>
+      <name>ParentContext_param</name>
+      <expose v="true" />
+      <description>PARAMETER</description>
+    </entityParameter>
+    <entityActionField>
+      <name>newActivity</name>
+      <title>New activity</title>
+      <onActionProcess>%aditoprj%/entity/Task_entity/entityfields/newactivity/onActionProcess.js</onActionProcess>
+      <iconId>VAADIN:HOURGLASS_END</iconId>
+      <tooltip>New activity</tooltip>
+      <tooltipProcess>%aditoprj%/entity/Task_entity/entityfields/newactivity/tooltipProcess.js</tooltipProcess>
+    </entityActionField>
+    <entityActionField>
+      <name>newTask</name>
+      <title>New task</title>
+      <onActionProcess>%aditoprj%/entity/Task_entity/entityfields/newtask/onActionProcess.js</onActionProcess>
+      <actionOrder v="1" />
+      <iconId>VAADIN:TASKS</iconId>
+    </entityActionField>
+    <entityParameter>
+      <name>RowId_param</name>
+      <expose v="true" />
+      <description>PARAMETER</description>
+    </entityParameter>
+    <entityParameter>
+      <name>ObjectId_param</name>
+      <expose v="true" />
+      <description>PARAMETER</description>
+    </entityParameter>
+    <entityConsumer>
+      <name>KeywordPriorities</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/keywordpriorities/children/containername_param/valueProcess.js</valueProcess>
+          <expose v="false" />
+        </entityParameter>
+      </children>
+    </entityConsumer>
+    <entityActionField>
+      <name>newOffer</name>
+      <title>New offer</title>
+      <onActionProcess>%aditoprj%/entity/Task_entity/entityfields/newoffer/onActionProcess.js</onActionProcess>
+      <actionOrder v="0" />
+      <iconId>VAADIN:CART</iconId>
+    </entityActionField>
+    <entityField>
+      <name>PROGRESS</name>
+      <title>Progress</title>
+      <consumer>KeywordProgress</consumer>
+      <mandatory v="true" />
+      <valueProcess>%aditoprj%/entity/Task_entity/entityfields/progress/valueProcess.js</valueProcess>
+      <displayValueProcess>%aditoprj%/entity/Task_entity/entityfields/progress/displayValueProcess.js</displayValueProcess>
+    </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>
+    </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>
+    </entityConsumer>
+    <entityProvider>
+      <name>Tasks</name>
+      <dependencies>
+        <entityDependency>
+          <name>dd79df43-264c-494b-9c92-cadf19e61db6</name>
+          <entityName>Organisation_entity</entityName>
+          <fieldName>Tasks</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+        <entityDependency>
+          <name>dc29832e-15da-4f64-b17a-f1dd978ef47b</name>
+          <entityName>Person_entity</entityName>
+          <fieldName>Tasks</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+        <entityDependency>
+          <name>c6507834-cd91-4202-bdf7-6566f968edb4</name>
+          <entityName>Salesproject_entity</entityName>
+          <fieldName>Tasks</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+        <entityDependency>
+          <name>26b9b221-de02-40ef-a400-d4b5e356da0b</name>
+          <entityName>Offer_entity</entityName>
+          <fieldName>Tasks</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+        <entityDependency>
+          <name>b2bb448a-b647-40c8-baec-16356f3e23f5</name>
+          <entityName>Order_entity</entityName>
+          <fieldName>Tasks</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+        <entityDependency>
+          <name>a93f1e7e-f929-438f-8f37-21e4af8b53b6</name>
+          <entityName>Product_entity</entityName>
+          <fieldName>Tasks</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+        <entityDependency>
+          <name>2b0c15eb-fa9a-4ee8-a8b1-5d0f344ddad6</name>
+          <entityName>Contract_entity</entityName>
+          <fieldName>Tasks</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+        <entityDependency>
+          <name>335e31ad-ab67-4567-b4ea-3668f04922b2</name>
+          <entityName>Campaign_entity</entityName>
+          <fieldName>Tasks</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+        <entityDependency>
+          <name>fbaa2f6c-0ba1-4c93-acae-d7b636581679</name>
+          <entityName>CampaignStep_entity</entityName>
+          <fieldName>Tasks</fieldName>
+          <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>
+      <expose v="true" />
+      <documentation>%aditoprj%/entity/Task_entity/entityfields/presetlinks_param/documentation.adoc</documentation>
+      <description>PARAMETER</description>
+    </entityParameter>
+    <entityField>
+      <name>SUBJECT_DETAILS</name>
+      <title>subject</title>
+      <linkedContext>Task</linkedContext>
+      <valueProcess>%aditoprj%/entity/Task_entity/entityfields/subject_details/valueProcess.js</valueProcess>
+    </entityField>
+    <entityParameter>
+      <name>FilterOnlyOwnTask_param</name>
+      <valueProcess>%aditoprj%/entity/Task_entity/entityfields/filteronlyowntask_param/valueProcess.js</valueProcess>
+      <expose v="true" />
+      <description>PARAMETER</description>
+    </entityParameter>
+    <entityField>
+      <name>PRIORITY_ICON</name>
+      <colorProcess>%aditoprj%/entity/Task_entity/entityfields/priority_icon/colorProcess.js</colorProcess>
+      <contentType>IMAGE</contentType>
+      <valueProcess>%aditoprj%/entity/Task_entity/entityfields/priority_icon/valueProcess.js</valueProcess>
+    </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>
+    </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>
+          <valueProcess>%aditoprj%/entity/Task_entity/entityfields/documents/children/assignmentrowid_param/valueProcess.js</valueProcess>
+        </entityParameter>
+        <entityParameter>
+          <name>AssignmentTable_param</name>
+          <valueProcess>%aditoprj%/entity/Task_entity/entityfields/documents/children/assignmenttable_param/valueProcess.js</valueProcess>
+        </entityParameter>
+      </children>
+    </entityConsumer>
+    <entityField>
+      <name>TYPE</name>
+      <valueProcess>%aditoprj%/entity/Task_entity/entityfields/type/valueProcess.js</valueProcess>
+    </entityField>
+    <entityActionField>
+      <name>newSupportticket</name>
+      <title>New Supportticket</title>
+      <onActionProcess>%aditoprj%/entity/Task_entity/entityfields/newsupportticket/onActionProcess.js</onActionProcess>
+      <iconId>VAADIN:QUESTION</iconId>
+    </entityActionField>
+    <entityActionField>
+      <name>openAdminView</name>
+      <title>Open admin view</title>
+      <onActionProcess>%aditoprj%/entity/Task_entity/entityfields/openadminview/onActionProcess.js</onActionProcess>
+      <iconId>VAADIN:CURLY_BRACKETS</iconId>
+      <stateProcess>%aditoprj%/entity/Task_entity/entityfields/openadminview/stateProcess.js</stateProcess>
+    </entityActionField>
+  </entityFields>
+  <recordContainers>
+    <dbRecordContainer>
+      <name>db</name>
+      <alias>Data_alias</alias>
+      <conditionProcess>%aditoprj%/entity/Task_entity/recordcontainers/db/conditionProcess.js</conditionProcess>
+      <orderClauseProcess>%aditoprj%/entity/Task_entity/recordcontainers/db/orderClauseProcess.js</orderClauseProcess>
+      <onDBDelete>%aditoprj%/entity/Task_entity/recordcontainers/db/onDBDelete.js</onDBDelete>
+      <linkInformation>
+        <linkInformation>
+          <name>6dfe6f25-2b83-413b-89e4-5c5b9839be2e</name>
+          <tableName>TASK</tableName>
+          <primaryKey>TASKID</primaryKey>
+          <isUIDTable v="true" />
+          <readonly v="false" />
+        </linkInformation>
+      </linkInformation>
+      <recordFieldMappings>
+        <dbRecordFieldMapping>
+          <name>DESCRIPTION.value</name>
+          <recordfield>TASK.DESCRIPTION</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>EDITOR_CONTACT_ID.value</name>
+          <recordfield>TASK.EDITOR_CONTACT_ID</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>MATURITY_DATE.value</name>
+          <recordfield>TASK.MATURITY_DATE</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>PRIORITY.value</name>
+          <recordfield>TASK.PRIORITY</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>PROTECTIONLEVEL.value</name>
+          <recordfield>TASK.PROTECTIONLEVEL</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>REQUESTOR_CONTACT_ID.value</name>
+          <recordfield>TASK.REQUESTOR_CONTACT_ID</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>START_DATE.value</name>
+          <recordfield>TASK.START_DATE</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>STATUS.value</name>
+          <recordfield>TASK.STATUS</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>SUBJECT.value</name>
+          <recordfield>TASK.SUBJECT</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>TASKID.value</name>
+          <recordfield>TASK.TASKID</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>EDITOR_CONTACT_ID.displayValue</name>
+          <expression>%aditoprj%/entity/Task_entity/recordcontainers/db/recordfieldmappings/editor_contact_id.displayvalue/expression.js</expression>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>REQUESTOR_CONTACT_ID.displayValue</name>
+          <expression>%aditoprj%/entity/Task_entity/recordcontainers/db/recordfieldmappings/requestor_contact_id.displayvalue/expression.js</expression>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>PARENT_CONTEXT.value</name>
+          <recordfield>TASK.PARENT_CONTEXT</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>PARENT_ID.value</name>
+          <recordfield>TASK.PARENT_ID</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>PRIORITY.displayValue</name>
+          <expression>%aditoprj%/entity/Task_entity/recordcontainers/db/recordfieldmappings/priority.displayvalue/expression.js</expression>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>PROGRESS.value</name>
+          <recordfield>TASK.PROGRESS</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>PROGRESS.displayValue</name>
+          <expression>%aditoprj%/entity/Task_entity/recordcontainers/db/recordfieldmappings/progress.displayvalue/expression.js</expression>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>STATUS.displayValue</name>
+          <expression>%aditoprj%/entity/Task_entity/recordcontainers/db/recordfieldmappings/status.displayvalue/expression.js</expression>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>TYPE.value</name>
+          <recordfield>TASK.TYPE</recordfield>
+        </dbRecordFieldMapping>
+      </recordFieldMappings>
+    </dbRecordContainer>
+  </recordContainers>
+</entity>
diff --git a/entity/Task_entity/entityfields/newsupportticket/onActionProcess.js b/entity/Task_entity/entityfields/newsupportticket/onActionProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..500687bbf40310a5633b3c9e040e0e3df5eabad3
--- /dev/null
+++ b/entity/Task_entity/entityfields/newsupportticket/onActionProcess.js
@@ -0,0 +1,6 @@
+import("system.vars");
+import("ActivityTask_lib");
+import("Context_lib");
+import("Ticket_lib")
+
+TicketUtils.createNewTicket(undefined, undefined, ContextUtils.getCurrentContextId(), vars.get("$field.TASKID"))
\ No newline at end of file
diff --git a/entity/Task_entity/entityfields/openadminview/onActionProcess.js b/entity/Task_entity/entityfields/openadminview/onActionProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..f665fe2dca8da956fc5faee4d60b6fb3e4edddb6
--- /dev/null
+++ b/entity/Task_entity/entityfields/openadminview/onActionProcess.js
@@ -0,0 +1,9 @@
+import("system.vars");
+import("Context_lib");
+
+AdminViewUtils.open("TASKID", [
+    ["PARENT_ID", vars.get("$field.PARENT_ID")],
+    ["PARENT_CONTEXT", vars.get("$field.PARENT_CONTEXT")],
+    ["REQUESTOR_CONTACT_ID", vars.get("$field.REQUESTOR_CONTACT_ID")],
+    ["EDITOR_CONTACT_ID", vars.get("$field.EDITOR_CONTACT_ID")]
+]);
\ No newline at end of file
diff --git a/entity/Task_entity/entityfields/openadminview/stateProcess.js b/entity/Task_entity/entityfields/openadminview/stateProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..38f2298db7304b4d44a15fbad7f720558c02da99
--- /dev/null
+++ b/entity/Task_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/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod b/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod
index b98c1eb559d05e4336f2e07dabb01003b297f999..f0aeeeaa62a4e6e85ec9acf85030061de57d33f8 100644
--- a/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod
+++ b/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod
@@ -4495,115 +4495,109 @@
       <key>Support Ticket</key>
     </entry>
     <entry>
-      <key>DSGVO Information</key>
+      <key>CC</key>
     </entry>
     <entry>
-      <key>Xing</key>
-    </entry>
-    <entry>
-      <key>consent</key>
+      <key>Remarks</key>
     </entry>
     <entry>
-      <key>Information Report</key>
-    </entry>
-    <entry>
-      <key>Data Privacy</key>
+      <key>Xing</key>
     </entry>
     <entry>
-      <key>Attribute data</key>
+      <key>Organisation</key>
     </entry>
     <entry>
-      <key>other personal data</key>
+      <key>Km</key>
     </entry>
     <entry>
-      <key>LinkedIn</key>
+      <key>Billed</key>
     </entry>
     <entry>
-      <key>Kommunikationsdaten</key>
+      <key>Km Fee</key>
     </entry>
     <entry>
-      <key>Es wurden keine Daten anonymisiert.</key>
+      <key>Credit Card</key>
     </entry>
     <entry>
-      <key>Anonymization</key>
+      <key>Taxi</key>
     </entry>
     <entry>
-      <key>Data Privacies</key>
+      <key>Overnight stay</key>
     </entry>
     <entry>
-      <key>advertising consent</key>
+      <key>LinkedIn</key>
     </entry>
     <entry>
-      <key>Sonstige personenbezogene Daten</key>
+      <key>In creation</key>
     </entry>
     <entry>
-      <key>DSGVO Anonymisierung</key>
+      <key>Rented car</key>
     </entry>
     <entry>
-      <key>Names</key>
+      <key>Update</key>
     </entry>
     <entry>
-      <key>Namen</key>
+      <key>The contact has an advertising ban for emails!</key>
     </entry>
     <entry>
-      <key>Update</key>
+      <key>Blog</key>
     </entry>
     <entry>
-      <key>The contact has an advertising ban for emails!</key>
+      <key>Until</key>
     </entry>
     <entry>
-      <key>Adressdaten</key>
+      <key>From</key>
     </entry>
     <entry>
-      <key>Blog</key>
+      <key>Park fees</key>
     </entry>
     <entry>
-      <key>DSGVO Disclosure</key>
+      <key>Abscences</key>
     </entry>
     <entry>
-      <key>Disclosure Report</key>
+      <key>Expense Report</key>
     </entry>
     <entry>
-      <key>newsletter dispatch</key>
+      <key>Special displays</key>
     </entry>
     <entry>
-      <key>Folgende Daten wurden anonymisiert: </key>
+      <key>Transport cost</key>
     </entry>
     <entry>
-      <key>DataPrivacy Right</key>
+      <key>Day Fee</key>
     </entry>
     <entry>
-      <key>Address data</key>
+      <key>Fuel</key>
     </entry>
     <entry>
-      <key>contract of sale</key>
+      <key>Month</key>
     </entry>
     <entry>
-      <key>balancing of interests</key>
+      <key>Working material</key>
     </entry>
     <entry>
-      <key>DataPrivacy Use</key>
+      <key>Hospitality</key>
     </entry>
     <entry>
-      <key>Personal data</key>
+      <key>Trip purpose</key>
     </entry>
     <entry>
-      <key>Source</key>
+      <key>Bed and Breakfast</key>
     </entry>
     <entry>
-      <key>No data has been anonymized.</key>
+      <key>Update campaign step</key>
     </entry>
     <entry>
-      <key>The following data has been anonymised: %0</key>
+      <key>No contacts selected</key>
     </entry>
     <entry>
-      <key>DSGVO anonymisation</key>
+      <key>Show my campaigns</key>
     </entry>
     <entry>
-      <key>Your changes have an impact on the data privacy information (DSGVO).</key>
+      <key>My campaigns</key>
     </entry>
     <entry>
-      <key>Update data privacy information</key>
+      <key>Add to Bulkmail</key>
     </entry>
   </keyValueMap>
   <font name="Dialog" style="0" size="11" />
diff --git a/language/_____LANGUAGE_de/_____LANGUAGE_de.aod b/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
index 2c4da2716f16c94eef43ab32f2ff875adbd9b2ec..b80c6bdd8332307e558ab6127acb06593e977404 100644
--- a/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
+++ b/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
@@ -34,10 +34,6 @@
       <key>Sender address</key>
       <value>Senderadresse</value>
     </entry>
-    <entry>
-      <key>Your changes may have an impact on the data privacy information (DSGVO).\n Please update these.</key>
-      <value>Ihre Änderungen könnten Auswirkungen auf die Datenschutzerklärung (DSGVO) haben. Bitte aktualisieren Sie diese.</value>
-    </entry>
     <entry>
       <key>Failed</key>
       <value>Fehlgeschlagen</value>
@@ -856,10 +852,6 @@
       <key>No</key>
       <value>Nein</value>
     </entry>
-    <entry>
-      <key>Birthday</key>
-      <value>Geburtstag</value>
-    </entry>
     <entry>
       <key>Service</key>
       <value>Service</value>
@@ -5641,142 +5633,9 @@
     <entry>
       <key>USER_NEW_CONTACT</key>
     </entry>
-    <entry>
-      <key>Update data privacy information</key>
-      <value>Datenschutzerklärung aktualisieren</value>
-    </entry>
     <entry>
       <key>Bulk mail was sent!</key>
     </entry>
-    <entry>
-      <key>Support Ticket</key>
-      <value>Support Ticket</value>
-    </entry>
-    <entry>
-      <key>DSGVO Information</key>
-      <value>DSGVO Information</value>
-    </entry>
-    <entry>
-      <key>Xing</key>
-    </entry>
-    <entry>
-      <key>consent</key>
-      <value>Einwilligung</value>
-    </entry>
-    <entry>
-      <key>Information Report</key>
-      <value>Informationsbericht</value>
-    </entry>
-    <entry>
-      <key>Data Privacy</key>
-      <value>Datenschutzerklärung</value>
-    </entry>
-    <entry>
-      <key>other personal data</key>
-      <value>sonstige Persönliche Daten</value>
-    </entry>
-    <entry>
-      <key>LinkedIn</key>
-    </entry>
-    <entry>
-      <key>No data has been anonymized.</key>
-      <value>Es wurden keine Daten anonymisiert.</value>
-    </entry>
-    <entry>
-      <key>Anonymization</key>
-      <value>Anonymisierung</value>
-    </entry>
-    <entry>
-      <key>advertising consent</key>
-      <value>Werbeeinwilligung</value>
-    </entry>
-    <entry>
-      <key>DSGVO anonymisation</key>
-      <value>DSGVO anonymisierung</value>
-    </entry>
-    <entry>
-      <key>Names</key>
-      <value>Namen</value>
-    </entry>
-    <entry>
-      <key>The contact has an advertising ban for emails!</key>
-      <value>Der Kontakt hat eine Werbemail-Sperre!</value>
-    </entry>
-    <entry>
-      <key>Blog</key>
-    </entry>
-    <entry>
-      <key>DSGVO Disclosure</key>
-    </entry>
-    <entry>
-      <key>Disclosure Report</key>
-    </entry>
-    <entry>
-      <key>newsletter dispatch</key>
-      <value>Newsletterversand</value>
-    </entry>
-    <entry>
-      <key>The following data has been anonymised: %0</key>
-      <value>Folgende Daten wurden anonymisiert: %0</value>
-    </entry>
-    <entry>
-      <key>DataPrivacy Right</key>
-      <value>Datenschutzrecht</value>
-    </entry>
-    <entry>
-      <key>Address data</key>
-      <value>Addressdaten</value>
-    </entry>
-    <entry>
-      <key>contract of sale</key>
-      <value>Kaufvertrag</value>
-    </entry>
-    <entry>
-      <key>balancing of interests</key>
-      <value>Interessensabwägung</value>
-    </entry>
-    <entry>
-      <key>DataPrivacy Use</key>
-      <value>Interessensabwägung</value>
-    </entry>
-    <entry>
-      <key>Personal data</key>
-      <value>Persönliche Daten</value>
-    </entry>
-    <entry>
-      <key>Source</key>
-      <value>Herkunft</value>
-    </entry>
-    <entry>
-      <key>Attribute data</key>
-    </entry>
-    <entry>
-      <key>Kommunikationsdaten</key>
-    </entry>
-    <entry>
-      <key>Es wurden keine Daten anonymisiert.</key>
-    </entry>
-    <entry>
-      <key>Data Privacies</key>
-    </entry>
-    <entry>
-      <key>Sonstige personenbezogene Daten</key>
-    </entry>
-    <entry>
-      <key>DSGVO Anonymisierung</key>
-    </entry>
-    <entry>
-      <key>Namen</key>
-    </entry>
-    <entry>
-      <key>Adressdaten</key>
-    </entry>
-    <entry>
-      <key>Folgende Daten wurden anonymisiert: </key>
-    </entry>
-    <entry>
-      <key>Update</key>
-    </entry>
     <entry>
       <key>All selected participants already are in the campaign</key>
       <value>Alle selektierten Teilnehmer sind bereits in der Kampagne</value>
diff --git a/language/_____LANGUAGE_en/_____LANGUAGE_en.aod b/language/_____LANGUAGE_en/_____LANGUAGE_en.aod
index 73426a4f78286b2834f84561e4799c04073f5f53..5a18e05f465a75547ae8672dae17adebee31a130 100644
--- a/language/_____LANGUAGE_en/_____LANGUAGE_en.aod
+++ b/language/_____LANGUAGE_en/_____LANGUAGE_en.aod
@@ -4654,6 +4654,114 @@
     <entry>
       <key>Update data privacy information</key>
     </entry>
+    <entry>
+      <key>Support Ticket</key>
+    </entry>
+    <entry>
+      <key>CC</key>
+    </entry>
+    <entry>
+      <key>Remarks</key>
+    </entry>
+    <entry>
+      <key>Xing</key>
+    </entry>
+    <entry>
+      <key>Organisation</key>
+    </entry>
+    <entry>
+      <key>Km</key>
+    </entry>
+    <entry>
+      <key>Billed</key>
+    </entry>
+    <entry>
+      <key>Km Fee</key>
+    </entry>
+    <entry>
+      <key>Credit Card</key>
+    </entry>
+    <entry>
+      <key>Taxi</key>
+    </entry>
+    <entry>
+      <key>Overnight stay</key>
+    </entry>
+    <entry>
+      <key>LinkedIn</key>
+    </entry>
+    <entry>
+      <key>In creation</key>
+    </entry>
+    <entry>
+      <key>Rented car</key>
+    </entry>
+    <entry>
+      <key>Update</key>
+    </entry>
+    <entry>
+      <key>The contact has an advertising ban for emails!</key>
+    </entry>
+    <entry>
+      <key>Blog</key>
+    </entry>
+    <entry>
+      <key>Until</key>
+    </entry>
+    <entry>
+      <key>From</key>
+    </entry>
+    <entry>
+      <key>Park fees</key>
+    </entry>
+    <entry>
+      <key>Abscences</key>
+    </entry>
+    <entry>
+      <key>Expense Report</key>
+    </entry>
+    <entry>
+      <key>Special displays</key>
+    </entry>
+    <entry>
+      <key>Transport cost</key>
+    </entry>
+    <entry>
+      <key>Day Fee</key>
+    </entry>
+    <entry>
+      <key>Fuel</key>
+    </entry>
+    <entry>
+      <key>Month</key>
+    </entry>
+    <entry>
+      <key>Working material</key>
+    </entry>
+    <entry>
+      <key>Hospitality</key>
+    </entry>
+    <entry>
+      <key>Trip purpose</key>
+    </entry>
+    <entry>
+      <key>Bed and Breakfast</key>
+    </entry>
+    <entry>
+      <key>Update campaign step</key>
+    </entry>
+    <entry>
+      <key>No contacts selected</key>
+    </entry>
+    <entry>
+      <key>Show my campaigns</key>
+    </entry>
+    <entry>
+      <key>My campaigns</key>
+    </entry>
+    <entry>
+      <key>Add to Bulkmail</key>
+    </entry>
   </keyValueMap>
   <font name="Dialog" style="0" size="11" />
 </language>
diff --git a/neonContext/AdminViewRow/AdminViewRow.aod b/neonContext/AdminViewRow/AdminViewRow.aod
new file mode 100644
index 0000000000000000000000000000000000000000..8e2bf5f8b0a06d538afac1a6313a207a8a9825e9
--- /dev/null
+++ b/neonContext/AdminViewRow/AdminViewRow.aod
@@ -0,0 +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.0" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonContext/1.1.0">
+  <name>AdminViewRow</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <entity>AdminViewRow_entity</entity>
+  <references>
+    <neonViewReference>
+      <name>4c6208ab-61d4-415e-af31-16d0409f541e</name>
+      <view>AdminViewRow_view</view>
+    </neonViewReference>
+  </references>
+</neonContext>
diff --git a/neonContext/DefaultAdminView/DefaultAdminView.aod b/neonContext/DefaultAdminView/DefaultAdminView.aod
new file mode 100644
index 0000000000000000000000000000000000000000..ab55b276419f274d56172dfd21cf7a6176c0e493
--- /dev/null
+++ b/neonContext/DefaultAdminView/DefaultAdminView.aod
@@ -0,0 +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.0" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonContext/1.1.0">
+  <name>DefaultAdminView</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <entity>DefaultAdminView_entity</entity>
+  <references>
+    <neonViewReference>
+      <name>b37b1c3c-6eb7-4d5c-89c6-239011878452</name>
+      <view>DefaultAdminView_view</view>
+    </neonViewReference>
+  </references>
+</neonContext>
diff --git a/neonContext/Organisation/Organisation.aod b/neonContext/Organisation/Organisation.aod
index 4f3f5585095eaa4754949ae9b06f3c4d78f6bbff..bddc5f4e9dc436f799d3c90e933597a84c4d3a4c 100644
--- a/neonContext/Organisation/Organisation.aod
+++ b/neonContext/Organisation/Organisation.aod
@@ -43,14 +43,6 @@
       <name>c4548cdb-479e-4f08-bc8e-de893f509637</name>
       <view>OrganisationConditionPricelist_view</view>
     </neonViewReference>
-    <neonViewReference>
-      <name>4f4aa991-0544-4d24-bc63-76b03c738b79</name>
-      <view>OrganisationAdmin_view</view>
-    </neonViewReference>
-    <neonViewReference>
-      <name>512e3b17-d91d-4ed3-8fc8-f1e2607d3b44</name>
-      <view>OrganisationAdmin_view</view>
-    </neonViewReference>
     <neonViewReference>
       <name>51a18051-fcb8-4d90-9075-802fdce12f9c</name>
       <view>OrganisationTaskAppointment_view</view>
diff --git a/neonContext/Person/Person.aod b/neonContext/Person/Person.aod
index 26861e84934a45fab69fd92f418641445045958e..07f8c24364ee6b4716b75d392b44c9d5116f9f98 100644
--- a/neonContext/Person/Person.aod
+++ b/neonContext/Person/Person.aod
@@ -42,14 +42,6 @@
       <name>d2fe8cd9-e3fc-4f4e-bd61-f762e3315798</name>
       <view>PersonSimpleList_view</view>
     </neonViewReference>
-    <neonViewReference>
-      <name>b1ef43d1-ce20-4a67-bace-ed59e5527842</name>
-      <view>PersonAdmin_view</view>
-    </neonViewReference>
-    <neonViewReference>
-      <name>b0105010-457a-4866-a9cd-277d183ea130</name>
-      <view>PersonAdmin_view</view>
-    </neonViewReference>
     <neonViewReference>
       <name>fc7e2546-b42a-48c0-8670-2d4033ad0598</name>
       <view>PersonTaskAppointment_view</view>
diff --git a/neonContext/Salesproject/Salesproject.aod b/neonContext/Salesproject/Salesproject.aod
index 9b104d93a7002621e32a85a3a1c148e5588f17a8..93eddff13862c77ac7d29a6470c8d70a519099e6 100644
--- a/neonContext/Salesproject/Salesproject.aod
+++ b/neonContext/Salesproject/Salesproject.aod
@@ -75,9 +75,5 @@
       <name>1c957028-bf6b-4b9c-9b46-60f8b53f9edd</name>
       <view>SaleprojectOverviewCharts_view</view>
     </neonViewReference>
-    <neonViewReference>
-      <name>fb935080-9328-48ad-a5ce-9ec966fb526a</name>
-      <view>SalesprojectMilestoneInfo_view</view>
-    </neonViewReference>
   </references>
 </neonContext>
diff --git a/neonContext/SalesprojectMilestone/SalesprojectMilestone.aod b/neonContext/SalesprojectMilestone/SalesprojectMilestone.aod
index d4ad5d6d3e6f841493e091ce12a4e19c506fd682..08aae3b687227450b3c4c886e03285a58e17cae9 100644
--- a/neonContext/SalesprojectMilestone/SalesprojectMilestone.aod
+++ b/neonContext/SalesprojectMilestone/SalesprojectMilestone.aod
@@ -10,5 +10,9 @@
       <name>54bee07a-f45d-458a-bfc6-56ba4992b63d</name>
       <view>SalesprojectMilestoneChart_view</view>
     </neonViewReference>
+    <neonViewReference>
+      <name>8efe4695-9e0c-43e5-876c-374338a346af</name>
+      <view>SalesprojectMilestoneInfo_view</view>
+    </neonViewReference>
   </references>
 </neonContext>
diff --git a/neonContext/SupportTicket/SupportTicket.aod b/neonContext/SupportTicket/SupportTicket.aod
index fb9473deb5c21fd15bffcc129018e86d46867cdf..feb7436edc5f4781d26b169918d4e1732e6807f2 100644
--- a/neonContext/SupportTicket/SupportTicket.aod
+++ b/neonContext/SupportTicket/SupportTicket.aod
@@ -3,7 +3,6 @@
   <name>SupportTicket</name>
   <title>Support Ticket</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
-  <icon>VAADIN:QUESTION</icon>
   <mainview>SupportTicketMain_view</mainview>
   <filterview>SupportTicketFilter_view</filterview>
   <editview>SupportTicketEdit_view</editview>
diff --git a/neonView/AdminViewRow_view/AdminViewRow_view.aod b/neonView/AdminViewRow_view/AdminViewRow_view.aod
new file mode 100644
index 0000000000000000000000000000000000000000..d148b24efeef7728f6025ccca9a30663bacffba5
--- /dev/null
+++ b/neonView/AdminViewRow_view/AdminViewRow_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.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.1">
+  <name>AdminViewRow_view</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <layout>
+    <noneLayout>
+      <name>layout</name>
+    </noneLayout>
+  </layout>
+  <children>
+    <titledListViewTemplate>
+      <name>TitledList</name>
+      <fixedDrawer v="true" />
+      <entityField>#ENTITY</entityField>
+      <columns>
+        <neonTableColumn>
+          <name>4296ac54-2661-4405-898d-7583d6f2803e</name>
+          <entityField>TITLE</entityField>
+        </neonTableColumn>
+        <neonTableColumn>
+          <name>d42ddaa4-1996-41b3-be19-2f3c721f9536</name>
+          <entityField>VALUE</entityField>
+        </neonTableColumn>
+      </columns>
+    </titledListViewTemplate>
+  </children>
+</neonView>
diff --git a/neonView/CampaignFilter_view/CampaignFilter_view.aod b/neonView/CampaignFilter_view/CampaignFilter_view.aod
index 92a0a4185572b65a2e3f126c17ddc359fe204008..3d850abf8d2a02023b2b8d392e5f0f17a6478d20 100644
--- a/neonView/CampaignFilter_view/CampaignFilter_view.aod
+++ b/neonView/CampaignFilter_view/CampaignFilter_view.aod
@@ -5,6 +5,32 @@
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <icon>VAADIN:GROUP</icon>
   <filterable v="true" />
+  <dashletConfigurations>
+    <neonDashletConfiguration>
+      <name>CurrentUsersOwnedCampaigns</name>
+      <title>My campaigns</title>
+      <description>Show my campaigns</description>
+      <fragment>Campaign/filter</fragment>
+      <singleton v="true" />
+      <icon>NEON:GROUP_APPOINTMENT</icon>
+      <categories>
+        <neonDashletCategory>
+          <name>marketingcampaign</name>
+          <title>MarketingCampaign</title>
+        </neonDashletCategory>
+        <neonDashletCategory>
+          <name>campaignmanagement</name>
+          <title>CampaignManagement</title>
+        </neonDashletCategory>
+      </categories>
+      <parameters>
+        <neonDashletParameter>
+          <name>ShowOnlyCurrentUsersCampaigns_param</name>
+          <value>true</value>
+        </neonDashletParameter>
+      </parameters>
+    </neonDashletConfiguration>
+  </dashletConfigurations>
   <layout>
     <boxLayout>
       <name>layout</name>
diff --git a/neonView/CampaignStepFilter_view/CampaignStepFilter_view.aod b/neonView/CampaignStepFilter_view/CampaignStepFilter_view.aod
index 6a77b103cd1e0e2fc7cf584263658122d6e4b759..a2d5712767622a78b7a4f667568cb66aa70e7291 100644
--- a/neonView/CampaignStepFilter_view/CampaignStepFilter_view.aod
+++ b/neonView/CampaignStepFilter_view/CampaignStepFilter_view.aod
@@ -6,9 +6,9 @@
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <filterable v="false" />
   <layout>
-    <groupLayout>
+    <boxLayout>
       <name>layout</name>
-    </groupLayout>
+    </boxLayout>
   </layout>
   <children>
     <tableViewTemplate>
@@ -56,14 +56,5 @@
         </neonTableColumn>
       </columns>
     </tableViewTemplate>
-    <ganttViewTemplate>
-      <name>StepGantt</name>
-      <beginDateField>DATE_START</beginDateField>
-      <endDateField>DATE_END</endDateField>
-      <titleField>NAME</titleField>
-      <descriptionField>DESCRIPTION</descriptionField>
-      <uidField>CAMPAIGNSTEPID</uidField>
-      <entityField>#ENTITY</entityField>
-    </ganttViewTemplate>
   </children>
 </neonView>
diff --git a/neonView/DefaultAdminView_view/DefaultAdminView_view.aod b/neonView/DefaultAdminView_view/DefaultAdminView_view.aod
new file mode 100644
index 0000000000000000000000000000000000000000..157109c00c4788f8d41428305e05987cbf8eb94e
--- /dev/null
+++ b/neonView/DefaultAdminView_view/DefaultAdminView_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.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.1">
+  <name>DefaultAdminView_view</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <isSmall v="true" />
+  <layout>
+    <noneLayout>
+      <name>layout</name>
+    </noneLayout>
+  </layout>
+  <children>
+    <neonViewReference>
+      <name>80206d15-7132-45c1-9cf5-e2236d0f2fdb</name>
+      <entityField>Rows</entityField>
+      <view>AdminViewRow_view</view>
+    </neonViewReference>
+  </children>
+</neonView>
diff --git a/neonView/OrganisationAdmin_view/OrganisationAdmin_view.aod b/neonView/OrganisationAdmin_view/OrganisationAdmin_view.aod
deleted file mode 100644
index d8ff404d6909f3124d217b4b310aa46ec7ede13e..0000000000000000000000000000000000000000
--- a/neonView/OrganisationAdmin_view/OrganisationAdmin_view.aod
+++ /dev/null
@@ -1,5 +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.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.1">
-  <name>OrganisationAdmin_view</name>
-  <majorModelMode>DISTRIBUTED</majorModelMode>
-</neonView>
diff --git a/neonView/PersonAdmin_view/PersonAdmin_view.aod b/neonView/PersonAdmin_view/PersonAdmin_view.aod
deleted file mode 100644
index 8709028fd5e9cb9930e7e2078645257df353c348..0000000000000000000000000000000000000000
--- a/neonView/PersonAdmin_view/PersonAdmin_view.aod
+++ /dev/null
@@ -1,65 +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.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.1">
-  <name>PersonAdmin_view</name>
-  <majorModelMode>DISTRIBUTED</majorModelMode>
-  <isSmall v="true" />
-  <layout>
-    <noneLayout>
-      <name>layout</name>
-    </noneLayout>
-  </layout>
-  <children>
-    <genericViewTemplate>
-      <name>Info</name>
-      <entityField>#ENTITY</entityField>
-      <fields>
-        <entityFieldLink>
-          <name>fb53347a-00e7-4b10-a84d-7ee022ca5c20</name>
-          <entityField>CONTACTID</entityField>
-        </entityFieldLink>
-        <entityFieldLink>
-          <name>11dbf6a2-b795-4e94-b1e0-09f4d14e28b1</name>
-          <entityField>PERSON_ID</entityField>
-        </entityFieldLink>
-        <entityFieldLink>
-          <name>1792811a-107c-408c-91fb-3539325cf72c</name>
-          <entityField>ORGANISATION_ID</entityField>
-        </entityFieldLink>
-        <entityFieldLink>
-          <name>9dee9668-ce14-496e-b9cb-840f0b18d876</name>
-          <entityField>ADDRESS_ID</entityField>
-        </entityFieldLink>
-      </fields>
-    </genericViewTemplate>
-    <genericViewTemplate>
-      <name>Info2</name>
-      <entityField>#ENTITY</entityField>
-      <fields>
-        <entityFieldLink>
-          <name>363e8c8c-7670-4ff1-b4f9-c8ff46d8744e</name>
-          <entityField>DATE_NEW</entityField>
-        </entityFieldLink>
-        <entityFieldLink>
-          <name>3d41529d-f9ae-4cf3-8ab5-4b490bc82566</name>
-          <entityField>DATE_EDIT</entityField>
-        </entityFieldLink>
-        <entityFieldLink>
-          <name>21c3b6fd-0203-440e-a6f7-ee8950fbf854</name>
-          <entityField>DATE_NEW_CONTACT</entityField>
-        </entityFieldLink>
-        <entityFieldLink>
-          <name>d1703ed2-cf89-4afd-83bf-ff350611336d</name>
-          <entityField>USER_NEW</entityField>
-        </entityFieldLink>
-        <entityFieldLink>
-          <name>8e23c269-28dd-4f87-a040-ec687bbdbd62</name>
-          <entityField>USER_EDIT</entityField>
-        </entityFieldLink>
-        <entityFieldLink>
-          <name>578cd57b-963a-4882-870a-d4e82889106f</name>
-          <entityField>USER_NEW_CONTACT</entityField>
-        </entityFieldLink>
-      </fields>
-    </genericViewTemplate>
-  </children>
-</neonView>
diff --git a/neonView/SalesprojectMilestoneInfo_view/SalesprojectMilestoneInfo_view.aod b/neonView/SalesprojectMilestoneInfo_view/SalesprojectMilestoneInfo_view.aod
index 5a42f75cb2c7d54959405f592672604de9b2a55a..40940270b8025b9329988c4ccb7289442ffff1a5 100644
--- a/neonView/SalesprojectMilestoneInfo_view/SalesprojectMilestoneInfo_view.aod
+++ b/neonView/SalesprojectMilestoneInfo_view/SalesprojectMilestoneInfo_view.aod
@@ -5,30 +5,27 @@
   <layout>
     <boxLayout>
       <name>layout</name>
-      <direction>HORIZONTAL</direction>
-      <maxDirectionElements v="2" />
     </boxLayout>
   </layout>
   <children>
-    <neonViewReference>
-      <name>04fca7a3-55a5-44b6-9e35-9dbd34153128</name>
-      <entityField>SalesprojectPhaseMilestones</entityField>
-      <view>SalesprojectMilestoneChart_view</view>
-    </neonViewReference>
-    <genericViewTemplate>
-      <name>PhaseInfo</name>
-      <editMode v="false" />
-      <showDrawer v="true" />
-      <drawerCaption>phase information</drawerCaption>
-      <fixedDrawer v="false" />
-      <hideLabels v="true" />
+    <ganttViewTemplate>
+      <name>MilestoneGantt</name>
+      <beginDateField>DATE_START</beginDateField>
+      <endDateField>dateEndGantt</endDateField>
+      <titleField>VALUE</titleField>
+      <uidField>SALESPROJECT_MILESTONEID</uidField>
+      <stepPredecessorIdField>PARENT_ID</stepPredecessorIdField>
       <entityField>#ENTITY</entityField>
-      <fields>
-        <entityFieldLink>
-          <name>10b31cdf-44c7-499d-8f4c-ac3b538b4c06</name>
-          <entityField>PHASEINFO</entityField>
-        </entityFieldLink>
-      </fields>
-    </genericViewTemplate>
+      <columns>
+        <neonTableColumn>
+          <name>4c261b96-17d3-424e-8297-3ff46d780516</name>
+          <entityField>VALUE</entityField>
+        </neonTableColumn>
+        <neonTableColumn>
+          <name>c055c340-0f7b-4c91-a0a6-22e20511d2a9</name>
+          <entityField>DATE_END</entityField>
+        </neonTableColumn>
+      </columns>
+    </ganttViewTemplate>
   </children>
 </neonView>
diff --git a/neonView/SalesprojectOverview_view/SalesprojectOverview_view.aod b/neonView/SalesprojectOverview_view/SalesprojectOverview_view.aod
index 2e629e3ebd7d3c01ad173ca89250e5e99c9e7dd1..64da4f86a4186fedf651a74ac93b4b275ba317d6 100644
--- a/neonView/SalesprojectOverview_view/SalesprojectOverview_view.aod
+++ b/neonView/SalesprojectOverview_view/SalesprojectOverview_view.aod
@@ -16,8 +16,8 @@
       <view>SalesprojectPhase_view</view>
     </neonViewReference>
     <neonViewReference>
-      <name>176485e7-c79c-4fb4-8c59-26c2bfb29a46</name>
-      <entityField>#ENTITY</entityField>
+      <name>7c365878-0f88-4bc3-aed4-0667951e70af</name>
+      <entityField>SalesprojectPhaseMilestones</entityField>
       <view>SalesprojectMilestoneInfo_view</view>
     </neonViewReference>
     <neonViewReference>
diff --git a/neonView/SupportTicketMain_view/SupportTicketMain_view.aod b/neonView/SupportTicketMain_view/SupportTicketMain_view.aod
index f8a2b93f796506b432000baee9ff2e8c3d258d28..1628c81ae4b6e56cfad711019fe5609bff3b449b 100644
--- a/neonView/SupportTicketMain_view/SupportTicketMain_view.aod
+++ b/neonView/SupportTicketMain_view/SupportTicketMain_view.aod
@@ -24,6 +24,11 @@
         </entityFieldLink>
       </fields>
     </genericViewTemplate>
+    <neonViewReference>
+      <name>e3dbf148-8d3d-4a62-ac20-17c878c0a669</name>
+      <entityField>ModuleTrees</entityField>
+      <view>ModuleTree_view</view>
+    </neonViewReference>
     <neonViewReference>
       <name>6846f680-84ef-46da-a0ea-6797044cf693</name>
       <entityField>Documents</entityField>
diff --git a/others/guide/HowToSqlBuilder.adoc b/others/guide/HowToSqlBuilder.adoc
new file mode 100644
index 0000000000000000000000000000000000000000..b0abf230413b16363354c5fe2b8a0d40f5848886
--- /dev/null
+++ b/others/guide/HowToSqlBuilder.adoc
@@ -0,0 +1,48 @@
+How to use the SqlBuilder (state: 10.07.2019)
+==============================================
+:toc2: left
+:numbered:
+
+
+== What is SqlBuilder? ==
+A SqlBuilder object helps to build sql queries.
+
+== Why would I need that? ==
+SqlBuilder makes it easier to build complex queries while maintaining clean code,
+especially if you want to append sql parts dynamically. With SqlBuilder you can also use SqlCondition
+objects in many parts of the query at the same time, for example in join, where or having clauses.
+
+== How to use it ==
+* import the lib:
+[source,javascript]
+----
+import("Sql_lib");
+----
+* create an object ()
+[source,javascript]
+----
+var myDescriptiveNameOfTheQuery = new SqlBuilder();
+// or
+var myDescriptiveNameOfTheQuery = SqlBuilder.begin();
+----
+* use the object, set clauses
+[source,javascript]
+----
+myDescriptiveNameOfTheQuery.select(["PERSON.FIRSTNAME", "PERSON.LASTNAME"]) //you can use an array or a string here
+    .from("PERSON")
+    .join("CONTACT", SqlCondition.begin()
+        .and("CONTACT.PERSON_ID = PERSON.PERSONID"))
+    .where(SqlCondition.begin()
+        .andPrepare("CONTACT.CONTACTID", contactId)
+        .build("1=1")); 
+----
+* Using .build on the SqlCondition is optional, but you could use it to set the alternative condition.
+* Before using the sql, call .build():
+[source,javascript]
+----
+var names = db.table(myDescriptiveNameOfTheQuery.build());
+----
+
+== available methods ==
+see the comments and documentation in the lib
+
diff --git a/process/Bulkmail_lib/process.js b/process/Bulkmail_lib/process.js
index 0f60eb164cb65562896e41009d5f0cc57ee09e7e..1d5bb47ac0e20040994892cacdd6b38ed03fd5b9 100644
--- a/process/Bulkmail_lib/process.js
+++ b/process/Bulkmail_lib/process.js
@@ -52,8 +52,9 @@ BulkMailUtils.sendBulkMail = function (pBulkMailId)
     var recipientData = db.table(SqlCondition.begin()
         .andPrepare("BULKMAILRECIPIENT.BULKMAIL_ID", pBulkMailId)
         .andPrepare("BULKMAILRECIPIENT.STATUS", $KeywordRegistry.bulkMailRecipientStatus$sent(), "# != ?")
-        //and no advertising ban
-        .buildSql("select BULKMAILRECIPIENTID, CONTACT_ID, '' from BULKMAILRECIPIENT", "1=2")
+        .andSqlCondition(BulkMailUtils.getCommRestrictionCondition())
+        .buildSql("select BULKMAILRECIPIENTID, BULKMAILRECIPIENT.CONTACT_ID, '' from BULKMAILRECIPIENT \n\
+            join CONTACT on BULKMAILRECIPIENT.CONTACT_ID = CONTACT.CONTACTID", "1=2")
     );
     var contactIds = recipientData.map(function (e) {return e[1];});
     var successIds = [];
@@ -69,12 +70,11 @@ BulkMailUtils.sendBulkMail = function (pBulkMailId)
         let isSuccess = false;
         let contactId = recipientData[i][1];
         let email = mails[contactId];
-        if (email !== undefined)
+        if (email !== undefined && recipientData[i][2])
         {
             email.toRecipients = [recipientData[i][2]]; //TODO: email address missing
             email.sender = emailSender;
             email.subject = subjects[contactId];
-            email.sender = sender;
 
             isSuccess = email.send();
         }
@@ -115,14 +115,17 @@ BulkMailUtils.openAddRecipientView = function (pContactIds)
 BulkMailUtils.getCommRestrictionCondition = function (pPositive)
 {
     var currentDate = datetime.date();
-    var existsQuery = SqlCondition.begin()
-        .andPrepare("COMMRESTRICTION.MEDIUM", $KeywordRegistry.communicationMediumCampaign$mail())
-        .andPrepare("COMMRESTRICTION.STARTDATE", currentDate, "# <= ?")
-        .and("COMMRESTRICTION.CONTACT_ID = CONTACT.CONTACTID or COMMRESTRICTION.CONTACT_ID = CONTACT.PERSON_ID")
-        .buildSql("exists(select COMMRESTRICTIONID from COMMRESTRICTION", "1=2", ")");
-    existsQuery = db.translateCondition(existsQuery);
+    var existsQuery = SqlBuilder.begin()
+        .select("COMMRESTRICTIONID")
+        .from("COMMRESTRICTION")
+        .where(SqlCondition.begin()
+            .andPrepare("COMMRESTRICTION.MEDIUM", $KeywordRegistry.communicationMediumCampaign$mail())
+            .andPrepare("COMMRESTRICTION.STARTDATE", currentDate, "# <= ?")
+            .and("COMMRESTRICTION.CONTACT_ID = CONTACT.CONTACTID or COMMRESTRICTION.CONTACT_ID = CONTACT.PERSON_ID")
+            .build("1=2"));
+            
+    var cond = "exists";
     if (!pPositive)
-        existsQuery = "not " + existsQuery;
-    
-    return SqlCondition.begin().and(existsQuery);
-}
\ No newline at end of file
+        cond = "not " + cond;
+    return SqlCondition.begin().andSqlBuilder(existsQuery, cond);
+}
diff --git a/process/Contact_lib/process.js b/process/Contact_lib/process.js
index 3ea1aece0b5db28903cd7bb956432c8dff4d2e4a..6ba5c64fdb7375d0a0d7dff9579bfb986c5ac9ce 100644
--- a/process/Contact_lib/process.js
+++ b/process/Contact_lib/process.js
@@ -1,3 +1,4 @@
+import("system.logging");
 import("system.translate");
 import("system.neon");
 import("system.vars");
@@ -512,7 +513,7 @@ function ContactTitleRenderer(pContact, pOptions)
         this._options = pOptions;
     else 
         this._options = ContactTitleRenderer.OPTIONS.IncludeOrganisation;
-    
+        
     //function that renders the contact into a sql expression (e.g. for a subselect)
     this._asSqlFn = function(){
         var maskingUtil = new SqlMaskingUtils();
diff --git a/process/Context_lib/process.js b/process/Context_lib/process.js
index eb26eb95de977fa00f1f05bb991aa7468358111b..179cb9b79349b7cb53a988ddf70736b9e22ef544 100644
--- a/process/Context_lib/process.js
+++ b/process/Context_lib/process.js
@@ -1,3 +1,5 @@
+import("system.tools");
+import("system.neon");
 import("system.logging");
 import("system.db");
 import("system.translate");
@@ -600,4 +602,44 @@ ContextUtils.getCountByContactId = function(pContextId, pContactId)
         return count;
     }
     return 0;
+}
+
+function AdminViewUtils () {}
+
+/**
+ * opens the admin view
+ * 
+ * @param {String} [pUidField=UID] the title of the uid field (just the title, the uid itself is fetched automatically)
+ * @param {String[][]} pFields Additional fields as an two dimensional array, the structure should be [[title, value, contenttype]],
+ *                              the contenttype is optional (default is TEXT).
+ */
+AdminViewUtils.open = function (pUidField, pFields)
+{
+    var uid = vars.get("$sys.uid");
+    if (!pUidField)
+        pUidField = "UID";
+    else
+        pUidField += " (UID)";
+    var rows = [
+        [pUidField, pUidField, uid, "TEXT"]
+    ];
+    if (pFields)
+    {
+        pFields.forEach(function (field)
+        {
+            rows.push([field[0], field[0], field[1], field[2] || "TEXT"]);
+        });
+    }
+    var params = {
+        "Uid_param" : uid,
+        "Rows_param" : JSON.stringify(rows)
+    };
+    neon.openContext("DefaultAdminView", "DefaultAdminView_view", [uid], neon.OPERATINGSTATE_VIEW, params);
+}
+
+AdminViewUtils.getActionState = function ()
+{
+    if (tools.currentUserHasRole("INTERNAL_ADMINISTRATOR"))
+        return neon.COMPONENTSTATE_EDITABLE;
+    return neon.COMPONENTSTATE_INVISIBLE;
 }
\ No newline at end of file
diff --git a/process/KeywordRegistry_basic/process.js b/process/KeywordRegistry_basic/process.js
index 6491ed23f08d9e7b81be6eb78e999b614fd38aaa..5c3e9854245af3468be05aa97b23387af52e4d3a 100644
--- a/process/KeywordRegistry_basic/process.js
+++ b/process/KeywordRegistry_basic/process.js
@@ -66,7 +66,7 @@ $KeywordRegistry.ticketType = function(){return "TicketType";};
 $KeywordRegistry.ticketType$supportTicket = function(){return "SUPPORTTICKET                       ";};
 
 $KeywordRegistry.productPricelist = function(){return "ProductPricelist";};
-$KeywordRegistry.productPricelist$standardList = function(){return "02553fc7-4611-4914-8ff5-0b7c4e7531c9";};
+$KeywordRegistry.productPricelist$standardList = function(){return "PRICELISTDEFAULT                    ";};
 
 $KeywordRegistry.quantityUnit = function(){return "QuantityUnit";};
 $KeywordRegistry.quantityUnit$pieces = function(){return "QUANTITYPIECES";};
@@ -97,12 +97,12 @@ $KeywordRegistry.salesprojectState$lost = function(){return "SALPROJSTATLOST
 $KeywordRegistry.salesprojectPhase = function(){return "SalesprojectPhase";};
 $KeywordRegistry.salesprojectPhase$nqc = function(){return "SALPROJPHASENQC                     ";};
 $KeywordRegistry.taskPriority = function(){return "TaskPriority";};
-$KeywordRegistry.taskPriority$none = function(){return "TASKPRIONONE";};
-$KeywordRegistry.taskPriority$low = function(){return "TASKPRIOLOW";};
-$KeywordRegistry.taskPriority$medium = function(){return "TASKPRIOMEDIUM";};
-$KeywordRegistry.taskPriority$high = function(){return "TASKPRIOHIGH";};
+$KeywordRegistry.taskPriority$none = function(){return "TASKPRIONONE                        ";};
+$KeywordRegistry.taskPriority$low = function(){return "TASKPRIOLOW                         ";};
+$KeywordRegistry.taskPriority$medium = function(){return "TASKPRIOMEDIUM                      ";};
+$KeywordRegistry.taskPriority$high = function(){return "TASKPRIOHIGH                        ";};
 $KeywordRegistry.taskProgress = function(){return "TaskProgress";};
-$KeywordRegistry.taskProgress$0 = function(){return "ec92271b-eac2-4ec2-be24-ab4abde7e939";};
+$KeywordRegistry.taskProgress$0 = function(){return "TASKPROG0                           ";};
 $KeywordRegistry.CompetitionState = function(){return "CompetitionState";};
 $KeywordRegistry.objectRelationType = function(){return "ObjectRelationType";};
 $KeywordRegistry.deliveryTerm = function(){return "DeliveryTerm";};
diff --git a/process/Offer_lib/process.js b/process/Offer_lib/process.js
index 3c526221f7c96f469faeb7bfee1e9f24d94010f3..10328c4da9f2586247b32099f3c6d830bfa2cebf 100644
--- a/process/Offer_lib/process.js
+++ b/process/Offer_lib/process.js
@@ -62,13 +62,13 @@ OfferUtils.getOfferNumberValidationFailString = function() {
 OfferUtils.isEditable = function(status) {
     // TODO: Administrator darf immer ändern, warten auf neue Berechtigungslogik?
     // Offer should be editable if offer state not equals "Sent", "Won" or "Lost"
-    return status != $KeywordRegistry.offerStatus$sent() && status != $KeywordRegistry.offerStatus$won() && status != $KeywordRegistry.offerStatus$lost();
+    return status != $KeywordRegistry.offerStatus$won() && status != $KeywordRegistry.offerStatus$lost();
 }
 
 OfferUtils.isDeletable = function(status) {
     // TODO: Administrator darf immer ändern, warten auf neue Berechtigungslogik?
     // Offer should be editable if offer state not equals "Sent", "Won" or "Lost"
-    return status != $KeywordRegistry.offerStatus$won() && status != $KeywordRegistry.offerStatus$lost();
+    return status != $KeywordRegistry.offerStatus$sent() && status != $KeywordRegistry.offerStatus$won() && status != $KeywordRegistry.offerStatus$lost();
 }
 
 /**
diff --git a/process/Product_lib/process.js b/process/Product_lib/process.js
index 1cd3c94982b3164bfae3f19f99b69349921d1824..8f96db44736d2078070910d37bef26cead064c05 100644
--- a/process/Product_lib/process.js
+++ b/process/Product_lib/process.js
@@ -39,7 +39,7 @@ ProductUtils.getCurrentProductPrice = function(pid, buySell, onlyStandard) {
         
         if (onlyStandard != undefined && onlyStandard)
         {
-            actualPriceCondition.andPrepare("PRODUCTPRICE.PRICELIST", "02553fc7-4611-4914-8ff5-0b7c4e7531c9");
+            actualPriceCondition.andPrepare("PRODUCTPRICE.PRICELIST", $KeywordRegistry.productPricelist$standardList());
         }
                     
         actualPriceCondition.andPrepare("PRODUCTPRICE.BUYSELL", buySell)
diff --git a/process/Salesproject_lib/process.js b/process/Salesproject_lib/process.js
index 2a49ec8798cd0180c3f264d7f6e8a7159c49e5c5..c2258732e3551f554af14495792969ae98735cdc 100644
--- a/process/Salesproject_lib/process.js
+++ b/process/Salesproject_lib/process.js
@@ -1,3 +1,4 @@
+import("system.logging");
 import("Sql_lib");
 import("system.neon");
 import("system.vars");
@@ -49,6 +50,14 @@ Salesproject.validateProjectNumber = function(projectNumber) {
  */
 Salesproject.insertMilestone = function(salesprojectId, type, value, notifyForecast) {
     if (KeywordUtils.exists(value, type)) {
+        var id= db.cell(SqlCondition.begin()
+                        .andPrepare("SALESPROJECT_MILESTONE.SALESPROJECT_ID", salesprojectId)
+                        .andPrepare("SALESPROJECT_MILESTONE.TYPE", type)
+                        .and("SALESPROJECT_MILESTONE.DATE_END is null")
+                        .buildSql("select SALESPROJECT_MILESTONE.SALESPROJECT_MILESTONEID from SALESPROJECT_MILESTONE "));
+        
+        logging.log("id = " + id)
+        
         db.updateData(
             "SALESPROJECT_MILESTONE",
             ["DATE_END"],
@@ -62,9 +71,9 @@ Salesproject.insertMilestone = function(salesprojectId, type, value, notifyForec
         
         db.insertData(
             "SALESPROJECT_MILESTONE",
-            ["SALESPROJECT_MILESTONEID", "SALESPROJECT_ID", "TYPE", "VALUE", "DATE_START"],
+            ["SALESPROJECT_MILESTONEID", "SALESPROJECT_ID", "TYPE", "VALUE", "DATE_START", "PARENT_ID"],
             null,
-            [util.getNewUUID(), salesprojectId, type, value, vars.get("$sys.date")]);
+            [util.getNewUUID(), salesprojectId, type, value, vars.get("$sys.date"), id]);
         if (notifyForecast) {
             Salesproject.notifyToUpdateForecast()
         }
diff --git a/process/Sql_lib/process.js b/process/Sql_lib/process.js
index c77ee066f09443fc807bbd71a5a18ec0fb93b88b..bc8e3cdaff76696243e3ef8095277694f70b33c8 100644
--- a/process/Sql_lib/process.js
+++ b/process/Sql_lib/process.js
@@ -1,3 +1,4 @@
+import("system.logging");
 import("system.translate");
 import("system.vars");
 import("system.util");
@@ -180,6 +181,42 @@ SqlCondition.prototype.orSqlCondition = function(cond, alternativeCond) {
     return this;
 }
 
+/**
+ * append an condition that uses a subQuery with SQL-and
+ * 
+ * @param {SqlBuilder} subQuery the SqlBuilder object that will be used as a subquery
+ * @param {String} [cond="exists"] condition that is used (e. g. exists, not exists, COLUMN = any, COLUMN in, ...)
+ * @return {SqlCondition} current SqlCondition-object
+ */
+SqlCondition.prototype.andSqlBuilder = function(subQuery, cond) {
+    if (!cond)
+        cond = "exists";
+    
+    var preparedObj = subQuery.build();
+    preparedObj[0] = cond + " ( " + preparedObj[0] + " ) ";
+    this.andAttachPrepared(preparedObj);
+    
+    return this;
+}
+
+/**
+ * append an condition that uses a subQuery with SQL-or
+ * 
+ * @param {SqlBuilder} subQuery the SqlBuilder object that will be used as a subquery
+ * @param {String} [cond="exists"] condition that is used (e. g. exists, not exists, COLUMN = any, COLUMN in, ...)
+ * @return {SqlCondition} current SqlCondition-object
+ */
+SqlCondition.prototype.orSqlBuilder = function(subQuery, cond) {
+    if (!cond)
+        cond = "exists";
+    
+    var preparedObj = subQuery.build();
+    preparedObj[0] = cond + " ( " + preparedObj[0] + " ) ";
+    this.orAttachPrepared(preparedObj);
+    
+    return this;
+}
+
 /**
  * same as the "and"-function but with preparedStatement functionality
  * @param {String | String[]} field the database field as "tablename.columnname"; e.g. "ORGANISATION.NAME" or as array with column-alias: ["ORGANISATION", "NAME", "myorgAlias"]
@@ -601,7 +638,17 @@ SqlCondition.equalsNot = function(pField, pValue, pAlternativeCond, pAlias) {
  */
 function SqlBuilder ()
 {
-    this._query = [];
+    if(!(this instanceof SqlBuilder)) 
+        throw new Error(translate.text("SqlBuilder must be instanciated with 'new'"));
+    this._sqlStr = "";
+    this._select = null;
+    this._from = null;
+    this._joins = [];
+    this._where = null;
+    this._groupBy = null;
+    this._having = null;
+    this._orderBy = null;
+    this._unions = [];
 }
 
 /**
@@ -609,6 +656,22 @@ function SqlBuilder ()
  * methods on it directly without having to put brackets around it
  * 
  * @return {SqlBuilder} a new SqlBuilder object
+ * 
+ * @example 
+ * var query = SqlBuilder.begin()
+ *   .select("ORGANISATION.NAME, FIRSTNAME, LASTNAME")
+ *   .from("PERSON")
+ *   .join("CONTACT", "CONTACT.PERSON_ID = PERSON.PERSONID")
+ *   .leftJoin("ORGANISATION", SqlCondition.begin()
+ *       .and("CONTACT.ORGANISATION_ID = ORGANISATION.ORGANISATIONID")
+ *       .andPrepare("ORGANISATION.NAME", "S%", "# like ?")
+ *       .build("1=2))
+ *   .where(SqlCondition.begin()
+ *       .andPrepare("CONTACT.STATUS", $KeywordRegistry.contactStatus$active())
+ *       .build("1=2))
+ *   .build();
+ *
+ * var data = db.table(query);
  */
 SqlBuilder.begin = function ()
 {
@@ -625,29 +688,29 @@ SqlBuilder.prototype.toString = function ()
 }
 
 /**
- * Adds a select clause to the sql.
+ * Sets the select clause of the sql.
  * @param {String|String[]} pFields
  * @return {SqlBuilder} current SqlBuilder object
  */
 SqlBuilder.prototype.select = function (pFields)
 {
-    this._append(pFields, "select", true);
+    this._select = this._getClause(pFields, "select", true);
     return this;
 }
 
 /**
- * Adds a select distinct clause to the sql.
+ * Sets the select clause of the sql with distinct.
  * @param {String|String[]} pFields
  * @return {SqlBuilder} current SqlBuilder object
  */
 SqlBuilder.prototype.selectDistinct = function (pFields)
 {
-    this._append(pFields, "select distinct", true);
+    this._select = this._getClause(pFields, "select distinct", true);
     return this;
 }
 
 /**
- * Adds a from clause to the sql.
+ * Sets the from clause of the sql.
  * @param {String} pTable
  * @param {String} [pAlias] table alias
  * @return {SqlBuilder} current SqlBuilder object
@@ -656,15 +719,15 @@ SqlBuilder.prototype.from = function (pTable, pAlias)
 {
     if (pAlias)
         pTable += " " + pAlias;
-    this._append(pTable, "from");
+    this._from = this._getClause(pTable, "from");
     return this;
 }
 
 /**
  * Adds a join clause to the sql.
  * @param {String} pTable
- * @param {String|String[]} pCondition The where condition. This can be
- *          a string (without the where keyword) or an array (for prepared queries).
+ * @param {String|String[]|SqlCondition} pCondition The where condition. This can be
+ *          a string (without the where keyword), a SqlCondition or an array (for prepared queries).
  * @param {String} [pAlias] table alias
  * @return {SqlBuilder} current SqlBuilder object
  */
@@ -673,16 +736,15 @@ SqlBuilder.prototype.join = function (pTable, pCondition, pAlias)
     var joinStr = "join " + pTable;
     if (pAlias)
         joinStr += " " + pAlias;
-    this._append(joinStr + " on");
-    this._append(pCondition);
+    this._joins.push(this._getClause(pCondition, joinStr + " on"));
     return this;
 }
 
 /**
  * Adds a left join clause to the sql.
  * @param {String} pTable
- * @param {String|String[]} pCondition The where condition. This can be
- *          a string (without the where keyword) or an array (for prepared queries).
+ * @param {String|String[]|SqlCondition} pCondition The where condition. This can be
+ *          a string (without the where keyword), a SqlCondition or an array (for prepared queries).
  * @param {String} [pAlias] table alias
  * @return {SqlBuilder} current SqlBuilder object
  */
@@ -691,56 +753,43 @@ SqlBuilder.prototype.leftJoin = function (pTable, pCondition, pAlias)
     var joinStr = "left join " + pTable;
     if (pAlias)
         joinStr += " " + pAlias;
-    this._append(joinStr + " on");
-    this._append(pCondition);
+    this._joins.push(this._getClause(pCondition, joinStr + " on"));
     return this;
 }
 
 /**
- * Adds a where clause to the sql.
+ * Sets the where clause of the sql.
  * 
- * @param {String|String[]} pCondition The where condition. This can be
- *          a string (without the where keyword) or an array (for prepared queries).
+ * @param {String|String[]|SqlCondition} pCondition The where condition. This can be
+ *          a string (without the where keyword), a SqlCondition or an array (for prepared queries).
  *          
  * @return {SqlBuilder} current SqlBuilder object
  */
 SqlBuilder.prototype.where = function (pCondition)
 {
-    this._append("where");
-    this._append(pCondition);
+    this._where = this._getClause(pCondition, "where");
     return this;
 }
 
 /**
- * Adds a order by clause to the sql.
+ * Sets the order by clause of the sql.
  * @param {String} pOrderBy
  * @return {SqlBuilder} current SqlBuilder object
  */
 SqlBuilder.prototype.orderBy = function (pOrderBy)
 {
-    this._append(pOrderBy, "order by");
+    this.orderBy = this._getClause(pOrderBy, "order by");
     return this;
 }
 
 /**
- * Adds another SqlBuilder object as a subquery.
- * @param {SqlBuilder} pSubSelect
- * @return {SqlBuilder} current SqlBuilder object
- */
-SqlBuilder.prototype.subSelect = function (pSubSelect)
-{
-    this._append(pSubSelect);
-    return this;
-}
-
-/**
- * Adds a group by clause to the sql.
+ * Sets the group by clause of the sql.
  * @param {String|String[]} pFields
  * @return {SqlBuilder} current SqlBuilder object
  */
 SqlBuilder.prototype.groupBy = function (pFields)
 {
-    this._append(pFields, "group by", true);
+    this._groupBy = this._getClause(pFields, "group by", true);
     return this;
 }
 
@@ -751,8 +800,7 @@ SqlBuilder.prototype.groupBy = function (pFields)
  */
 SqlBuilder.prototype.union = function (pSelect)
 {
-    this._append("union");
-    this._append(pSelect);
+    this._unions.push(this._getClause(pSelect, "union"));
     return this;
 }
 
@@ -763,43 +811,72 @@ SqlBuilder.prototype.union = function (pSelect)
  */
 SqlBuilder.prototype.unionAll = function (pSelect)
 {
-    this._append("union all");
-    this._append(pSelect);
+    this._unions.push(this._getClause(pSelect, "union all"));
     return this;
 }
 
 /**
  * Adds a having clause to the sql.
  * 
- * @param {String|String[]} pCondition The where condition. This can be
- *          a string (without the where keyword) or an array (for prepared queries).
+ * @param {String|String[]|SqlCondition} pCondition The where condition. This can be
+ *          a string (without the where keyword), a SqlCondition or an array (for prepared queries).
  *          
  * @return {SqlBuilder} current SqlBuilder object
  */
 SqlBuilder.prototype.having = function (pCondition)
 {
-    this._append("having");
-    this._append(pCondition);
+    this._having = this._getClause(pCondition, "having");
     return this;
 }
 
 /**
- * adds an element
+ * generates a part of the sql
  * 
- * @param {String|String[]|SqlBuilder} pElement the element to append
+ * @param {String|String[]|SqlBuilder|SqlCondition} pElement the element to append
  * @param {String} [pPrefix] string to be added before pElement
  * @param {Boolean} [pAutoJoin] if this is true and pElement is an array, it will be automatically
  *                               joined together to a string
  * 
  * @private
  */
-SqlBuilder.prototype._append = function (pElement, pPrefix, pAutoJoin)
+SqlBuilder.prototype._getClause = function (pElement, pPrefix, pAutoJoin)
 {
-    if (pAutoJoin && pElement && typeof pElement !== "string" && pElement.length !== undefined)
-        pElement = pElement.join(", ");
+    var preparedValues = [];
+    if (pElement instanceof SqlBuilder || pElement instanceof SqlCondition)
+    {
+        pElement = _getElement(pElement);
+    }
+    else if (typeof pElement !== "string" && pElement.length !== undefined) //array
+    {
+        if (pAutoJoin)
+        {
+            for (let i = 0, l = pElement.length; i < l; i++)
+            {
+                if (pElement[i] instanceof SqlBuilder)
+                    pElement[i] = _getElement(pElement);
+            }
+            pElement = pElement.join(", ");
+        }
+        else
+        {
+            preparedValues = preparedValues.concat(pElement[1]);
+            pElement = pElement[0];
+        }
+    }
+    
     if (pPrefix)
         pElement = pPrefix + " " + pElement;
-    this._query.push(pPrefix + " " + pElement);
+    
+    return [pElement.toString(), preparedValues];
+    
+    function _getElement (element)
+    {
+        element = element.build();
+        preparedValues = preparedValues.concat(element[1]);
+        if (element instanceof SqlBuilder)
+            return "(" + element[0] + ")";
+        return element[0];
+    }
 }
 
 /**
@@ -809,27 +886,36 @@ SqlBuilder.prototype._append = function (pElement, pPrefix, pAutoJoin)
  */
 SqlBuilder.prototype.build = function ()
 {
-    var sqlStr = "";
-    var preparedValues = [];
+    if (!this._select)
+        throw new Error(translate.text("SqlBuilder must contain a select clause!"));
+    if (!this._from)
+        throw new Error(translate.text("SqlBuilder must contain a from clause!"));
     
-    for (let i = 0, l = this._query.length; i < l; i++)
+    var sqlStr = "";
+    var preparedVals = [];
+    var allParts = [
+        this._select,
+        this._from
+        ].concat(this._joins).concat([
+        this._where,
+        this._groupBy,
+        this._having,
+        this._orderBy,
+        this._unions
+        ]).concat(this._unions);
+        
+    for (let i = 0, l = allParts.length; i < l; i++)
     {
-        let sqlPart = this._query[i];
-        if (sqlPart instanceof SqlBuilder)
-        {
-            let condition = sqlPart.build();
-            sqlPart = "(" + condition[0] + ")";
-            preparedValues = preparedValues.concat(condition[1]);
-        }
-        //array => prepared statement
-        else if (typeof pElement !== "string" && pElement.length === 2 && pElement[1].length !== undefined) 
+        let part = allParts[i];
+        if (part && part.length)
         {
-            preparedValues = preparedValues.concat(sqlPart[1]);
-            sqlPart = sqlPart[0];
+            if (sqlStr)
+                sqlStr += " ";
+            sqlStr += part[0];
+            preparedVals = preparedVals.concat(part[1]);
         }
-        sqlStr += " " + sqlPart;
     }
-    return [sqlStr.trim(), preparedValues];
+    return [sqlStr, preparedVals];
 }
 
 
diff --git a/process/Ticket_lib/process.js b/process/Ticket_lib/process.js
index f5bb788424d40875e07031e69b10fc3dd4e8d727..e23e3daa74632a107bb3c192d9f8e42db4b3c8bf 100644
--- a/process/Ticket_lib/process.js
+++ b/process/Ticket_lib/process.js
@@ -61,9 +61,9 @@ TicketUtils.addLinkRecords= function(pObjectIdField, pRowIdField, pAdditionalLin
 /**
  * Create a new ticket
  */
-TicketUtils.prototype.createNewTicket = function(pRowId, pAdditionalLinks, pParentContext, pParentId, pParams)
+TicketUtils.createNewTicket = function(pRowId, pAdditionalLinks, pParentContext, pParentId, pParams)
 {
-    throw Error("Not implemented yet");
+    _ActivityTaskUtils._createNew("SupportTicket", pRowId, pAdditionalLinks, pParentContext, pParentId, pParams)
 }
 
 /**
diff --git a/process/sendBulkMail_serverProcess/process.js b/process/sendBulkMail_serverProcess/process.js
index 40bd252ef6a43197982835d8211d9b60171115cf..0403cb3f69f8223ece7216225bf9f0518720fa78 100644
--- a/process/sendBulkMail_serverProcess/process.js
+++ b/process/sendBulkMail_serverProcess/process.js
@@ -1,3 +1,4 @@
+import("system.datetime");
 import("Sql_lib");
 import("system.db");
 import("system.util");
@@ -6,6 +7,7 @@ import("Bulkmail_lib");
 import("system.vars");
 import("system.notification");
 
+var startTime = datetime.date();
 var bulkMailId = vars.get("$local.bulkMailId");
 var user = vars.get("$local.user");
 var res = BulkMailUtils.sendBulkMail(bulkMailId);
@@ -17,6 +19,7 @@ if (user)
         .buildSql("select NAME from BULKMAIL")
     );
     var message = translate.withArguments("Bulk mail \"%0\" was sent!", [mailName]);
-    var description = translate.withArguments("%0 mails sent sucessfully, %1 mails failed", [res.sucessful, res.failed]);
+    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);
 }
\ No newline at end of file