diff --git a/.aditoprj/project.version b/.aditoprj/project.version
index c7740156ef666297b2b8bd79e6415568165b5c34..77248a98d35b3a662e3f84ab23a14062e553f082 100644
--- a/.aditoprj/project.version
+++ b/.aditoprj/project.version
@@ -1,3 +1,3 @@
 #This file is generated by ADITO designer. Do NOT delete or modify!
-#Thu Jun 13 16:55:33 CEST 2019
-version=5.1.16
+#Tue Jun 18 13:20:50 CEST 2019
+version=5.1.17
diff --git a/.liquibase/Data_alias/basic/2019.1.4/AditoBasic/create_ab_loghistory.xml b/.liquibase/Data_alias/basic/2019.1.4/AditoBasic/create_ab_loghistory.xml
index d7d65e6c6fc084edc1edd6173ce131458d314848..415726712dac155f4b8cda1d97117e6b316318b3 100644
--- a/.liquibase/Data_alias/basic/2019.1.4/AditoBasic/create_ab_loghistory.xml
+++ b/.liquibase/Data_alias/basic/2019.1.4/AditoBasic/create_ab_loghistory.xml
@@ -15,5 +15,9 @@
             <column name="TABLENAME" type="NVARCHAR(30)"/>
             <column name="TABLENAMEID" type="CHAR(36)"/>
         </createTable>
+        <createIndex indexName="IDX_AB_LOGHISTORY_TABLES" tableName="AB_LOGHISTORY">
+            <column name="TABLENAME"/>
+            <column name="TABLENAMEID"/>
+        </createIndex>
     </changeSet>
 </databaseChangeLog>
\ No newline at end of file
diff --git a/.liquibase/Data_alias/basic/2019.1.4/AditoBasic/init_AttributeKeyword_target_group.xml b/.liquibase/Data_alias/basic/2019.1.4/AditoBasic/init_AttributeKeyword_target_group.xml
index f8515fb50122a8812e7a0f974511d40592ceff61..693645c7e9078c01318458182c8be9d598527419 100644
--- a/.liquibase/Data_alias/basic/2019.1.4/AditoBasic/init_AttributeKeyword_target_group.xml
+++ b/.liquibase/Data_alias/basic/2019.1.4/AditoBasic/init_AttributeKeyword_target_group.xml
@@ -7,7 +7,7 @@
             <column name="ATTRIBUTE_NAME" value="Zielgruppe"/>
             <column name="ATTRIBUTE_PARENT_ID"/>
             <column name="ATTRIBUTE_TYPE" value="KEYWORD                             "/>
-            <column name="KEYWORD_CONTAINER" value="TargetGroup"/>
+            <column name="DROPDOWNDEFINITION" value="TargetGroup"/>
         </insert>
         
         <insert tableName="AB_ATTRIBUTEUSAGE">
diff --git a/.liquibase/Data_alias/basic/2019.1.4/AditoBasic/init_AttributeType.xml b/.liquibase/Data_alias/basic/2019.1.4/AditoBasic/init_AttributeType.xml
index afce4587bceb283ab111c963a2d16390135a3240..a168eafe5bfdc7246c898f476ff5a6b77743a480 100644
--- a/.liquibase/Data_alias/basic/2019.1.4/AditoBasic/init_AttributeType.xml
+++ b/.liquibase/Data_alias/basic/2019.1.4/AditoBasic/init_AttributeType.xml
@@ -34,6 +34,15 @@
             <column name="SORTING" valueNumeric="9"/>
             <column name="ISACTIVE" valueNumeric="1"/>
             <column name="ISESSENTIAL" valueNumeric="1"/>
+        </insert>
+        <insert tableName="AB_KEYWORD_ENTRY">
+            <column name="AB_KEYWORD_ENTRYID" value="00a61337-d3d3-4e7e-bc48-cb08cabe01b3"/>
+            <column name="KEYID" value="OBJECTSELECTION"/>
+            <column name="TITLE" value="Object selection"/>
+            <column name="CONTAINER" value="AttributeType"/>
+            <column name="SORTING" valueNumeric="10"/>
+            <column name="ISACTIVE" valueNumeric="1"/>
+            <column name="ISESSENTIAL" valueNumeric="1"/>
         </insert>
                 <insert tableName="AB_KEYWORD_ATTRIBUTE">
                 <column name="AB_KEYWORD_ATTRIBUTEID" value="307ecfc6-15c8-4ab9-8afa-e97b90a00c5f"/>
@@ -101,46 +110,11 @@
                 <column name="AB_KEYWORD_ATTRIBUTE_ID" value="307ecfc6-15c8-4ab9-8afa-e97b90a00c5f"/>
                 <column name="CHAR_VALUE" value="VAADIN:TAG"/>
         </insert>
-        <rollback>
-            <delete tableName="AB_KEYWORD_ENTRY">
-                <where>AB_KEYWORD_ENTRYID = ?</where>
-                <whereParams>
-                    <param value="9d2f9605-1a5e-47d3-8920-168f5637e37f"/>
-                </whereParams>
-            </delete>
-            <delete tableName="AB_KEYWORD_ENTRY">
-                <where>AB_KEYWORD_ENTRYID = ?</where>
-                <whereParams>
-                    <param value="ee893a1c-d007-46fe-a190-727124c4467b"/>
-                </whereParams>
-            </delete>
-            <delete tableName="AB_KEYWORD_ENTRY">
-                <where>AB_KEYWORD_ENTRYID = ?</where>
-                <whereParams>
-                    <param value="191d7293-3b3f-4dc7-bbe2-9da1a897f7df"/>
-                </whereParams>
-            </delete>
-            <delete tableName="AB_KEYWORD_ATTRIBUTE">
-                <where>AB_KEYWORD_ATTRIBUTEID = ?</where>
-                <whereParams>
-                    <param value="307ecfc6-15c8-4ab9-8afa-e97b90a00c5f"/>
-                </whereParams>
-            </delete>
-            <delete tableName="AB_KEYWORD_ATTRIBUTERELATION">
-                <where>AB_KEYWORD_ATTRIBUTERELATIONID in (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)</where>
-                <whereParams>
-                    <param value="0c537ea0-6ba2-4d9a-a27c-7c6a6920e303"/>
-                    <param value="8ada9b1e-2f23-4e07-bbd6-16a3b76c5b62"/>
-                    <param value="2ef73c53-30b4-47f9-94fb-87825e14743a"/>
-                    <param value="c4cdd0dc-fc7e-443c-9c2f-c3d400ce3a1b"/>
-                    <param value="5afb11f5-e0eb-45f2-8018-cdf85078a236"/>
-                    <param value="0954628d-e40e-45e0-a808-3194594b431e"/>
-                    <param value="1516db79-6f15-4683-9314-cddebb29f995"/>
-                    <param value="091bf881-e599-4baf-915a-e756ae75c52e"/>
-                    <param value="a85fd75f-7346-41d0-b7fe-6c677bd3f392"/>
-                    <param value="a35c73d5-2719-422b-872b-1c6c1e0707a0"/>
-                </whereParams>
-            </delete>
-        </rollback>
+        <insert tableName="AB_KEYWORD_ATTRIBUTERELATION">
+                <column name="AB_KEYWORD_ATTRIBUTERELATIONID" value="49f0e116-e32b-4391-8a39-121e7a1ad580"/>
+                <column name="AB_KEYWORD_ENTRY_ID" value="00a61337-d3d3-4e7e-bc48-cb08cabe01b3"/>
+                <column name="AB_KEYWORD_ATTRIBUTE_ID" value="307ecfc6-15c8-4ab9-8afa-e97b90a00c5f"/>
+                <column name="CHAR_VALUE" value="VAADIN:COMBOBOX"/>
+        </insert>
     </changeSet>
 </databaseChangeLog>
\ No newline at end of file
diff --git a/.liquibase/Data_alias/basic/2019.1.4/AttributeKeyword.xml b/.liquibase/Data_alias/basic/2019.1.4/AttributeKeyword.xml
index d924ad24ca2252b9d37a5cd90f35c45b66c18b7d..dba5cdc84a7f3fc3ad29b646e6a42ed5e781cdc7 100644
--- a/.liquibase/Data_alias/basic/2019.1.4/AttributeKeyword.xml
+++ b/.liquibase/Data_alias/basic/2019.1.4/AttributeKeyword.xml
@@ -2,7 +2,7 @@
 <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="s.listl" id="f527a5cc-f1e5-497f-a069-33aee944d421">
 	<addColumn tableName="AB_ATTRIBUTE">
-            <column name="KEYWORD_CONTAINER" type="VARCHAR(80)"/>
+            <column name="DROPDOWNDEFINITION" type="VARCHAR(80)"/>
             <column name="ATTRIBUTE_INFO" type="NCLOB"/>
             <column name="SORTING" type="INTEGER"/>
 	</addColumn>
diff --git a/.liquibase/Data_alias/basic/2019.1.4/BulkMail/bulkMail_keywords.xml b/.liquibase/Data_alias/basic/2019.1.4/BulkMail/bulkMail_keywords.xml
new file mode 100644
index 0000000000000000000000000000000000000000..e970a26e5417dddbbbed5407fc254a5ee93e44e9
--- /dev/null
+++ b/.liquibase/Data_alias/basic/2019.1.4/BulkMail/bulkMail_keywords.xml
@@ -0,0 +1,30 @@
+<?xml version="1.1" encoding="UTF-8" standalone="no"?>
+<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
+                   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd">
+    <changeSet author="s.listl" id="c652301e-5510-4e1a-a39d-cdc6a3356d62">
+        <insert tableName="AB_KEYWORD_ENTRY">
+            <column name="AB_KEYWORD_ENTRYID" value="2710c44b-73a7-4da5-b828-c7ac572ab79c"/>
+            <column name="KEYID" value="9a0c5608-070e-49fb-92cd-f6abece9242d"/>
+            <column name="TITLE" value="Pending"/>
+            <column name="CONTAINER" value="BulkMailSentStatus"/>
+            <column name="SORTING" valueNumeric="1"/>
+            <column name="ISACTIVE" valueNumeric="1"/>
+        </insert>
+        <insert tableName="AB_KEYWORD_ENTRY">
+            <column name="AB_KEYWORD_ENTRYID" value="82d04090-3ef1-4eaf-9836-0490733a078f"/>
+            <column name="KEYID" value="147211fb-a1cf-49c8-8e08-c3cfe0404f9b"/>
+            <column name="TITLE" value="Sent"/>
+            <column name="CONTAINER" value="BulkMailSentStatus"/>
+            <column name="SORTING" valueNumeric="2"/>
+            <column name="ISACTIVE" valueNumeric="1"/>
+        </insert>
+        <insert tableName="AB_KEYWORD_ENTRY">
+            <column name="AB_KEYWORD_ENTRYID" value="d1d6a461-1bbf-4f03-ac99-33a2d38a36e3"/>
+            <column name="KEYID" value="353e27e9-7491-4bfd-b9f9-f18f2cb2a36c"/>
+            <column name="TITLE" value="Failed"/>
+            <column name="CONTAINER" value="BulkMailSentStatus"/>
+            <column name="SORTING" valueNumeric="3"/>
+            <column name="ISACTIVE" valueNumeric="1"/>
+        </insert>
+    </changeSet>
+</databaseChangeLog>
diff --git a/.liquibase/Data_alias/basic/2019.1.4/BulkMail/create_bulkMailRecipient.xml b/.liquibase/Data_alias/basic/2019.1.4/BulkMail/create_bulkMailRecipient.xml
new file mode 100644
index 0000000000000000000000000000000000000000..69a2328ff422b7ca7bc82f221c83ac554ca454e8
--- /dev/null
+++ b/.liquibase/Data_alias/basic/2019.1.4/BulkMail/create_bulkMailRecipient.xml
@@ -0,0 +1,14 @@
+<?xml version="1.1" encoding="UTF-8" standalone="no"?>
+<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
+                   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd">
+    <changeSet author="s.listl" id="e6532ebb-6ee3-4f89-a5b9-792cb55cb7e5">
+        <createTable tableName="BULKMAILRECIPIENT">
+            <column name="BULKMAILRECIPIENTID" type="CHAR(36)">
+                <constraints primaryKey="true" primaryKeyName="PK_BULKMAILRECIPIENT_BULKMAILRECIPIENTID"/>
+            </column>
+            <column name="BULKMAIL_ID" type="CHAR(36)"/>
+            <column name="CONTACT_ID" type="CHAR(36)"/>
+            <column name="STATUS" type="CHAR(36)"/>
+        </createTable>
+    </changeSet>
+</databaseChangeLog>
diff --git a/.liquibase/Data_alias/basic/2019.1.4/BulkMail/create_bulkmail.xml b/.liquibase/Data_alias/basic/2019.1.4/BulkMail/create_bulkmail.xml
new file mode 100644
index 0000000000000000000000000000000000000000..6c500af3c2d0ec618f539ebe65922e3265da74c6
--- /dev/null
+++ b/.liquibase/Data_alias/basic/2019.1.4/BulkMail/create_bulkmail.xml
@@ -0,0 +1,15 @@
+<?xml version="1.1" encoding="UTF-8" standalone="no"?>
+<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
+                   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd">
+    <changeSet author="s.listl" id="4dc221ce-202c-437f-ab5f-f732a40f4151">
+        <createTable tableName="BULKMAIL">
+            <column name="BULKMAILID" type="CHAR(36)">
+                <constraints primaryKey="true" primaryKeyName="PK_BULKMAIL_BULKMAILID"/>
+            </column>
+            <column name="DOCUMENTTEMPLATE_ID" type="CHAR(36)"/>
+            <column name="DESCRIPTION" type="NVARCHAR(500)"/>
+            <column name="NAME" type="NVARCHAR(50)"/>
+            <column name="SUBJECT" type="NVARCHAR(100)"/>
+        </createTable>
+    </changeSet>
+</databaseChangeLog>
diff --git a/.liquibase/Data_alias/basic/2019.1.4/Ticketmanagement/insertTicketAttributes_TaskType_Task.xml b/.liquibase/Data_alias/basic/2019.1.4/Ticketmanagement/insertTicketAttributes_TaskType_Task.xml
index 2bb5f919999069d48cea1a3330092ce23ebe2149..9a1e4f3e239c6211270045024ba6a7fa0918d341 100644
--- a/.liquibase/Data_alias/basic/2019.1.4/Ticketmanagement/insertTicketAttributes_TaskType_Task.xml
+++ b/.liquibase/Data_alias/basic/2019.1.4/Ticketmanagement/insertTicketAttributes_TaskType_Task.xml
@@ -6,7 +6,7 @@
       <column name="ATTRIBUTE_TYPE" value="GROUP                               "/>
       <column name="ATTRIBUTE_NAME" value="Ticket"/>
       <column name="ATTRIBUTE_ACTIVE" valueNumeric="1"/>
-      <column name="KEYWORD_CONTAINER"/>
+      <column name="DROPDOWNDEFINITION"/>
       <column name="ATTRIBUTE_INFO"/>
       <column name="SORTING"/>
     </insert>
@@ -16,7 +16,7 @@
       <column name="ATTRIBUTE_TYPE" value="GROUP                               "/>
       <column name="ATTRIBUTE_NAME" value="Reklamation"/>
       <column name="ATTRIBUTE_ACTIVE" valueNumeric="1"/>
-      <column name="KEYWORD_CONTAINER"/>
+      <column name="DROPDOWNDEFINITION"/>
       <column name="ATTRIBUTE_INFO"/>
       <column name="SORTING" valueNumeric="1"/>
     </insert>
@@ -26,7 +26,7 @@
       <column name="ATTRIBUTE_TYPE" value="COMBO                               "/>
       <column name="ATTRIBUTE_NAME" value="Regulierung"/>
       <column name="ATTRIBUTE_ACTIVE" valueNumeric="1"/>
-      <column name="KEYWORD_CONTAINER"/>
+      <column name="DROPDOWNDEFINITION"/>
       <column name="ATTRIBUTE_INFO"/>
       <column name="SORTING" valueNumeric="1"/>
     </insert>
@@ -36,7 +36,7 @@
       <column name="ATTRIBUTE_TYPE" value="COMBOVALUE                          "/>
       <column name="ATTRIBUTE_NAME" value="Vollberechnung"/>
       <column name="ATTRIBUTE_ACTIVE" valueNumeric="1"/>
-      <column name="KEYWORD_CONTAINER"/>
+      <column name="DROPDOWNDEFINITION"/>
       <column name="ATTRIBUTE_INFO"/>
       <column name="SORTING" valueNumeric="1"/>
     </insert>
@@ -46,7 +46,7 @@
       <column name="ATTRIBUTE_TYPE" value="COMBOVALUE                          "/>
       <column name="ATTRIBUTE_NAME" value="Teilberechnung"/>
       <column name="ATTRIBUTE_ACTIVE" valueNumeric="1"/>
-      <column name="KEYWORD_CONTAINER"/>
+      <column name="DROPDOWNDEFINITION"/>
       <column name="ATTRIBUTE_INFO"/>
       <column name="SORTING" valueNumeric="2"/>
     </insert>
@@ -56,7 +56,7 @@
       <column name="ATTRIBUTE_TYPE" value="COMBOVALUE                          "/>
       <column name="ATTRIBUTE_NAME" value="Kulanz"/>
       <column name="ATTRIBUTE_ACTIVE" valueNumeric="1"/>
-      <column name="KEYWORD_CONTAINER"/>
+      <column name="DROPDOWNDEFINITION"/>
       <column name="ATTRIBUTE_INFO"/>
       <column name="SORTING" valueNumeric="3"/>
     </insert>
@@ -67,7 +67,7 @@
       <column name="ATTRIBUTE_TYPE" value="COMBO                               "/>
       <column name="ATTRIBUTE_NAME" value="Schadensart"/>
       <column name="ATTRIBUTE_ACTIVE" valueNumeric="1"/>
-      <column name="KEYWORD_CONTAINER"/>
+      <column name="DROPDOWNDEFINITION"/>
       <column name="ATTRIBUTE_INFO"/>
       <column name="SORTING" valueNumeric="2"/>
     </insert>
@@ -77,7 +77,7 @@
       <column name="ATTRIBUTE_TYPE" value="COMBOVALUE                          "/>
       <column name="ATTRIBUTE_NAME" value="Transportschaden"/>
       <column name="ATTRIBUTE_ACTIVE" valueNumeric="1"/>
-      <column name="KEYWORD_CONTAINER"/>
+      <column name="DROPDOWNDEFINITION"/>
       <column name="ATTRIBUTE_INFO"/>
       <column name="SORTING" valueNumeric="1"/>
     </insert>
@@ -87,7 +87,7 @@
       <column name="ATTRIBUTE_TYPE" value="COMBOVALUE                          "/>
       <column name="ATTRIBUTE_NAME" value="Qualitätsbeanstandung"/>
       <column name="ATTRIBUTE_ACTIVE" valueNumeric="1"/>
-      <column name="KEYWORD_CONTAINER"/>
+      <column name="DROPDOWNDEFINITION"/>
       <column name="ATTRIBUTE_INFO"/>
       <column name="SORTING" valueNumeric="2"/>
     </insert>
@@ -97,7 +97,7 @@
       <column name="ATTRIBUTE_TYPE" value="COMBOVALUE                          "/>
       <column name="ATTRIBUTE_NAME" value="fehlerhafte Lieferung"/>
       <column name="ATTRIBUTE_ACTIVE" valueNumeric="1"/>
-      <column name="KEYWORD_CONTAINER"/>
+      <column name="DROPDOWNDEFINITION"/>
       <column name="ATTRIBUTE_INFO"/>
       <column name="SORTING" valueNumeric="3"/>
     </insert>
@@ -107,7 +107,7 @@
       <column name="ATTRIBUTE_TYPE" value="COMBOVALUE                          "/>
       <column name="ATTRIBUTE_NAME" value="unvollständige Lieferung"/>
       <column name="ATTRIBUTE_ACTIVE" valueNumeric="1"/>
-      <column name="KEYWORD_CONTAINER"/>
+      <column name="DROPDOWNDEFINITION"/>
       <column name="ATTRIBUTE_INFO"/>
       <column name="SORTING" valueNumeric="4"/>
     </insert>
@@ -118,7 +118,7 @@
       <column name="ATTRIBUTE_TYPE" value="GROUP                               "/>
       <column name="ATTRIBUTE_NAME" value="Support Ticket"/>
       <column name="ATTRIBUTE_ACTIVE" valueNumeric="1"/>
-      <column name="KEYWORD_CONTAINER"/>
+      <column name="DROPDOWNDEFINITION"/>
       <column name="ATTRIBUTE_INFO"/>
       <column name="SORTING" valueNumeric="2"/>
     </insert>
diff --git a/.liquibase/Data_alias/basic/2019.1.4/changelog.xml b/.liquibase/Data_alias/basic/2019.1.4/changelog.xml
index ba83461f2e35d2f35f73a8d720cc5af484883285..31ef6c3a237ecb7ea047a88abb6719ec480872ca 100644
--- a/.liquibase/Data_alias/basic/2019.1.4/changelog.xml
+++ b/.liquibase/Data_alias/basic/2019.1.4/changelog.xml
@@ -183,9 +183,6 @@
     <include relativeToChangelogFile="true" file="AditoBasic/insert_permission_keyword.xml"/>
     
     <include relativeToChangelogFile="true" file="AditoBasic/ab_keyword_attributerelation_add_longtext_type.xml"/>
-    <include relativeToChangelogFile="true" file="Ticketmanagement/insertTicketAttributes_TaskType_Task.xml"/>
-    <include relativeToChangelogFile="true" file="Ticketmanagement/insert_TaskType_Task.xml"/>
-    <include relativeToChangelogFile="true" file="Ticketmanagement/update_TaskStatus_add_icon_and_new_status.xml"/>
     
     <include relativeToChangelogFile="true" file="AditoBasic/salesprojectsource_add_icon_attr.xml"/>
     
@@ -194,8 +191,15 @@
     <!-- the next generation of data -->
     <include relativeToChangelogFile="true" file="newExampleData/changelog.xml" context="example"/>
     
+    <include relativeToChangelogFile="true" file="Ticketmanagement/insertTicketAttributes_TaskType_Task.xml"/>
+    <include relativeToChangelogFile="true" file="Ticketmanagement/insert_TaskType_Task.xml"/>
+    <include relativeToChangelogFile="true" file="Ticketmanagement/update_TaskStatus_add_icon_and_new_status.xml"/>
+    
     <include relativeToChangelogFile="true" file="longerProductName_Code.xml"/>
     
+    <include relativeToChangelogFile="true" file="BulkMail/create_bulkMail.xml"/>
+    <include relativeToChangelogFile="true" file="BulkMail/create_bulkMailRecipient.xml"/>
+    
     <include relativeToChangelogFile="true" file="DSGVO/create_DSGVO.xml"/>
     <include relativeToChangelogFile="true" file="DSGVO/insert_DSGVO.xml"/>
     <include relativeToChangelogFile="true" file="DSGVO/init_statuoritysource_keyword.xml"/>
diff --git a/.liquibase/Data_alias/basic/2019.1.4/data/example_attribute/Attribute.xml b/.liquibase/Data_alias/basic/2019.1.4/data/example_attribute/Attribute.xml
index 7d0bb354a6dcec9a529f415e6b9911be1e3a88c2..77d21d7bb85aebc0bd786052caaf54a680f59810 100644
--- a/.liquibase/Data_alias/basic/2019.1.4/data/example_attribute/Attribute.xml
+++ b/.liquibase/Data_alias/basic/2019.1.4/data/example_attribute/Attribute.xml
@@ -618,7 +618,7 @@
 	<column name="ATTRIBUTE_NAME" value="Preispolitik"/>
 	<column name="ATTRIBUTE_PARENT_ID" value="752d7706-ac6e-4b51-a918-4265531794a4"/>
 	<column name="ATTRIBUTE_TYPE" value="KEYWORD                             "/>
-	<column name="KEYWORD_CONTAINER" value="SalesprojectPricePolitics"/>
+	<column name="DROPDOWNDEFINITION" value="SalesprojectPricePolitics"/>
 </insert>
 <insert tableName="AB_ATTRIBUTE">
 	<column name="AB_ATTRIBUTEID" value="558419b2-6113-4060-b88d-cc6324754765"/>
@@ -626,7 +626,7 @@
 	<column name="ATTRIBUTE_NAME" value="Stärke"/>
 	<column name="ATTRIBUTE_PARENT_ID" value="752d7706-ac6e-4b51-a918-4265531794a4"/>
 	<column name="ATTRIBUTE_TYPE" value="KEYWORD                             "/>
-	<column name="KEYWORD_CONTAINER" value="SalesprojectStrength"/>
+	<column name="DROPDOWNDEFINITION" value="SalesprojectStrength"/>
 </insert>
 <insert tableName="AB_ATTRIBUTE">
 	<column name="AB_ATTRIBUTEID" value="71226196-2812-4d70-b90f-c3e2c14fd4d1"/>
@@ -634,7 +634,7 @@
 	<column name="ATTRIBUTE_NAME" value="Schwäche"/>
 	<column name="ATTRIBUTE_PARENT_ID" value="752d7706-ac6e-4b51-a918-4265531794a4"/>
 	<column name="ATTRIBUTE_TYPE" value="KEYWORD                             "/>
-	<column name="KEYWORD_CONTAINER" value="SalesprojectWeakness"/>
+	<column name="DROPDOWNDEFINITION" value="SalesprojectWeakness"/>
 </insert>
 <insert tableName="AB_ATTRIBUTE">
 	<column name="AB_ATTRIBUTEID" value="0644222a-2b3b-4f5e-a85a-d24c32fa0e72"/>
@@ -1394,7 +1394,7 @@
 	<column name="ATTRIBUTE_NAME" value="Zahlungskondition"/>
 	<column name="ATTRIBUTE_PARENT_ID" value="ab545654-1fce-4993-b763-0ec469781302"/>
 	<column name="ATTRIBUTE_TYPE" value="KEYWORD                             "/>
-	<column name="KEYWORD_CONTAINER" value="PaymentTerm"/>
+	<column name="DROPDOWNDEFINITION" value="PaymentTerm"/>
 </insert>
 <insert tableName="AB_ATTRIBUTE">
 	<column name="AB_ATTRIBUTEID" value="3a6e11fc-b00a-4cf3-975a-a5e8b60fc5cb"/>
@@ -1402,7 +1402,7 @@
 	<column name="ATTRIBUTE_NAME" value="Lieferkondition"/>
 	<column name="ATTRIBUTE_PARENT_ID" value="ab545654-1fce-4993-b763-0ec469781302"/>
 	<column name="ATTRIBUTE_TYPE" value="KEYWORD                             "/>
-	<column name="KEYWORD_CONTAINER" value="DeliveryTerm"/>
+	<column name="DROPDOWNDEFINITION" value="DeliveryTerm"/>
 </insert>
 <insert tableName="AB_ATTRIBUTE">
 	<column name="AB_ATTRIBUTEID" value="97b449a5-d9b4-42ff-b9b0-4f8b27b8a9ec"/>
@@ -1410,7 +1410,7 @@
 	<column name="ATTRIBUTE_NAME" value="Preisliste"/>
 	<column name="ATTRIBUTE_PARENT_ID" value="ab545654-1fce-4993-b763-0ec469781302"/>
 	<column name="ATTRIBUTE_TYPE" value="KEYWORD                             "/>
-        <column name="KEYWORD_CONTAINER" value="ProductPricelist"/>
+        <column name="DROPDOWNDEFINITION" value="ProductPricelist"/>
 </insert>
 
 <insert tableName="AB_ATTRIBUTE">
diff --git a/.liquibase/Data_alias/basic/2019.1.4/indicesRefactor/Activity.xml b/.liquibase/Data_alias/basic/2019.1.4/indicesRefactor/Activity.xml
index 47c79e3e92f61ef8231836069d31171fe96f9884..10d3ae93878302167e803b2ae9d1b1692b648718 100644
--- a/.liquibase/Data_alias/basic/2019.1.4/indicesRefactor/Activity.xml
+++ b/.liquibase/Data_alias/basic/2019.1.4/indicesRefactor/Activity.xml
@@ -14,8 +14,8 @@
 			<column name="ACTIVITY_ID" />
 		</createIndex>
 		<createIndex indexName="IDX_ACTIVITYLINK_OBJECT" tableName="ACTIVITYLINK">
-			<column name="OBJECT_ROWID"/>
 			<column name="OBJECT_TYPE"/>
+			<column name="OBJECT_ROWID"/>
 		</createIndex>
 	</changeSet>
 </databaseChangeLog>
\ No newline at end of file
diff --git a/.liquibase/Data_alias/basic/2019.1.4/newExampleData/generatedData/AB_ATTRIBUTE.xml b/.liquibase/Data_alias/basic/2019.1.4/newExampleData/generatedData/AB_ATTRIBUTE.xml
index 0291f2affa9c68371296accb549bca09b3db0484..bf68ac002b052207cef5ac003b28c8913cfd85e8 100644
--- a/.liquibase/Data_alias/basic/2019.1.4/newExampleData/generatedData/AB_ATTRIBUTE.xml
+++ b/.liquibase/Data_alias/basic/2019.1.4/newExampleData/generatedData/AB_ATTRIBUTE.xml
@@ -619,7 +619,7 @@
       <column name="ATTRIBUTE_NAME" value="Preispolitik"/>
       <column name="ATTRIBUTE_PARENT_ID" value="752d7706-ac6e-4b51-a918-4265531794a4"/>
       <column name="ATTRIBUTE_TYPE" value="KEYWORD                             "/>
-      <column name="KEYWORD_CONTAINER" value="SalesprojectPricePolitics"/>
+      <column name="DROPDOWNDEFINITION" value="SalesprojectPricePolitics"/>
     </insert>
     <insert tableName="AB_ATTRIBUTE">
       <column name="AB_ATTRIBUTEID" value="558419b2-6113-4060-b88d-cc6324754765"/>
@@ -627,7 +627,7 @@
       <column name="ATTRIBUTE_NAME" value="Stärke"/>
       <column name="ATTRIBUTE_PARENT_ID" value="752d7706-ac6e-4b51-a918-4265531794a4"/>
       <column name="ATTRIBUTE_TYPE" value="KEYWORD                             "/>
-      <column name="KEYWORD_CONTAINER" value="SalesprojectStrength"/>
+      <column name="DROPDOWNDEFINITION" value="SalesprojectStrength"/>
     </insert>
     <insert tableName="AB_ATTRIBUTE">
       <column name="AB_ATTRIBUTEID" value="71226196-2812-4d70-b90f-c3e2c14fd4d1"/>
@@ -635,7 +635,7 @@
       <column name="ATTRIBUTE_NAME" value="Schwäche"/>
       <column name="ATTRIBUTE_PARENT_ID" value="752d7706-ac6e-4b51-a918-4265531794a4"/>
       <column name="ATTRIBUTE_TYPE" value="KEYWORD                             "/>
-      <column name="KEYWORD_CONTAINER" value="SalesprojectWeakness"/>
+      <column name="DROPDOWNDEFINITION" value="SalesprojectWeakness"/>
     </insert>
     <insert tableName="AB_ATTRIBUTE">
       <column name="AB_ATTRIBUTEID" value="0644222a-2b3b-4f5e-a85a-d24c32fa0e72"/>
@@ -1395,7 +1395,7 @@
       <column name="ATTRIBUTE_NAME" value="Zahlungskondition"/>
       <column name="ATTRIBUTE_PARENT_ID" value="ab545654-1fce-4993-b763-0ec469781302"/>
       <column name="ATTRIBUTE_TYPE" value="KEYWORD                             "/>
-      <column name="KEYWORD_CONTAINER" value="PaymentTerm"/>
+      <column name="DROPDOWNDEFINITION" value="PaymentTerm"/>
     </insert>
     <insert tableName="AB_ATTRIBUTE">
       <column name="AB_ATTRIBUTEID" value="3a6e11fc-b00a-4cf3-975a-a5e8b60fc5cb"/>
@@ -1403,7 +1403,7 @@
       <column name="ATTRIBUTE_NAME" value="Lieferkondition"/>
       <column name="ATTRIBUTE_PARENT_ID" value="ab545654-1fce-4993-b763-0ec469781302"/>
       <column name="ATTRIBUTE_TYPE" value="KEYWORD                             "/>
-      <column name="KEYWORD_CONTAINER" value="DeliveryTerm"/>
+      <column name="DROPDOWNDEFINITION" value="DeliveryTerm"/>
     </insert>
     <insert tableName="AB_ATTRIBUTE">
       <column name="AB_ATTRIBUTEID" value="97b449a5-d9b4-42ff-b9b0-4f8b27b8a9ec"/>
@@ -1411,7 +1411,7 @@
       <column name="ATTRIBUTE_NAME" value="Preisliste"/>
       <column name="ATTRIBUTE_PARENT_ID" value="ab545654-1fce-4993-b763-0ec469781302"/>
       <column name="ATTRIBUTE_TYPE" value="KEYWORD                             "/>
-      <column name="KEYWORD_CONTAINER" value="ProductPricelist"/>
+      <column name="DROPDOWNDEFINITION" value="ProductPricelist"/>
     </insert>
     <insert tableName="AB_ATTRIBUTE">
       <column name="AB_ATTRIBUTEID" value="e7886e41-252e-414c-a169-5d1481d010c8"/>
@@ -1437,13 +1437,15 @@
       <column name="AB_ATTRIBUTEID" value="33cb83f1-aee2-469e-b57d-666ac6725f61"/>
       <column name="ATTRIBUTE_ACTIVE" valueNumeric="0"/>
       <column name="ATTRIBUTE_NAME" value="Unterkampagne von"/>
-      <column name="ATTRIBUTE_TYPE" value="TEXT                                "/>
+      <column name="ATTRIBUTE_TYPE" value="OBJECTSELECTION                     "/>
+      <column name="DROPDOWNDEFINITION" value="Campaign"/>
     </insert>
     <insert tableName="AB_ATTRIBUTE">
       <column name="AB_ATTRIBUTEID" value="093c7337-c134-4be5-a215-dc94804c3511"/>
       <column name="ATTRIBUTE_ACTIVE" valueNumeric="0"/>
       <column name="ATTRIBUTE_NAME" value="übergeordnete Kampagne von"/>
-      <column name="ATTRIBUTE_TYPE" value="TEXT                                "/>
+      <column name="ATTRIBUTE_TYPE" value="OBJECTSELECTION                     "/>
+      <column name="DROPDOWNDEFINITION" value="Campaign"/>
     </insert>
     <insert tableName="AB_ATTRIBUTE">
       <column name="AB_ATTRIBUTEID" value="28fd7a4b-72d8-40ff-a893-a9479abcf19e"/>
diff --git a/.liquibase/Data_alias/basic/2019.1.4/update_Keyword_Essentials.xml b/.liquibase/Data_alias/basic/2019.1.4/update_Keyword_Essentials.xml
index f9e3cb33a23bef6fd498164e20d1bd0ac1cbc16f..c390891c147e17a7184e9c5f656db6f0167a3b2e 100644
--- a/.liquibase/Data_alias/basic/2019.1.4/update_Keyword_Essentials.xml
+++ b/.liquibase/Data_alias/basic/2019.1.4/update_Keyword_Essentials.xml
@@ -3,14 +3,14 @@
   <changeSet author="a.loreth" id="b1629529-92ab-437d-b864-0fd68fe5ceab">
     <update tableName="AB_KEYWORD_ENTRY">
       <column name="ISESSENTIAL" valueNumeric="1" />
-      <where>KEYID in ('BSICacti-0dir-0inc-b8a3-f43e2c73df65', 'BSICacti-0dir-outg-8337-909b0f93143a', 'BSIC0rel-stat-actv-ae03-b6b04430e90b', '21bc4d20-1a87-4247-8f7c-8d3a09631850', '4dee8727-8299-422e-ae41-6cdf9de2dfd7', '02553fc7-4611-4914-8ff5-0b7c4e7531c9', '09072b59-d12f-469b-acbd-18a28232ff70', 'ec92271b-eac2-4ec2-be24-ab4abde7e939')</where>
+      <where>KEYID in ('548ffe3b-466b-4c8f-97d6-e3ad23e33344', 'BSICacti-0dir-0inc-b8a3-f43e2c73df65', 'BSICacti-0dir-outg-8337-909b0f93143a', 'BSIC0rel-stat-actv-ae03-b6b04430e90b', '21bc4d20-1a87-4247-8f7c-8d3a09631850', '4dee8727-8299-422e-ae41-6cdf9de2dfd7', '02553fc7-4611-4914-8ff5-0b7c4e7531c9', '09072b59-d12f-469b-acbd-18a28232ff70', 'ec92271b-eac2-4ec2-be24-ab4abde7e939')</where>
     </update>
 
 
     <rollback>
       <update tableName="AB_KEYWORD_ENTRY">
         <column name="ISESSENTIAL" valueNumeric="0" />
-        <where>KEYID in ('BSICacti-0dir-0inc-b8a3-f43e2c73df65', 'BSICacti-0dir-outg-8337-909b0f93143a', 'BSIC0rel-stat-actv-ae03-b6b04430e90b', '21bc4d20-1a87-4247-8f7c-8d3a09631850', '4dee8727-8299-422e-ae41-6cdf9de2dfd7', '02553fc7-4611-4914-8ff5-0b7c4e7531c9', '09072b59-d12f-469b-acbd-18a28232ff70', 'ec92271b-eac2-4ec2-be24-ab4abde7e939')</where>
+        <where>KEYID in ('548ffe3b-466b-4c8f-97d6-e3ad23e33344', 'BSICacti-0dir-0inc-b8a3-f43e2c73df65', 'BSICacti-0dir-outg-8337-909b0f93143a', 'BSIC0rel-stat-actv-ae03-b6b04430e90b', '21bc4d20-1a87-4247-8f7c-8d3a09631850', '4dee8727-8299-422e-ae41-6cdf9de2dfd7', '02553fc7-4611-4914-8ff5-0b7c4e7531c9', '09072b59-d12f-469b-acbd-18a28232ff70', 'ec92271b-eac2-4ec2-be24-ab4abde7e939')</where>
       </update>
     </rollback>
   </changeSet>
diff --git a/aliasDefinition/Data_alias/Data_alias.aod b/aliasDefinition/Data_alias/Data_alias.aod
index 458e54ec9bec0a9aaa788979a420af38996804eb..e84f7e59b7409231612c3515eed2b621a94178da 100644
--- a/aliasDefinition/Data_alias/Data_alias.aod
+++ b/aliasDefinition/Data_alias/Data_alias.aod
@@ -5724,7 +5724,7 @@
                 </customProperties>
               </entityFieldDb>
               <entityFieldDb>
-                <name>KEYWORD_CONTAINER</name>
+                <name>DROPDOWNDEFINITION</name>
                 <dbName></dbName>
                 <primaryKey v="false" />
                 <columnType v="12" />
@@ -9736,6 +9736,172 @@
               </entityFieldDb>
             </entityFields>
           </entityDb>
+          <entityDb>
+            <name>BULKMAIL</name>
+            <dbName></dbName>
+            <idColumn>BULKMAILID</idColumn>
+            <idGeneratorType v="0" />
+            <idGeneratorInterval v="1" />
+            <documentation></documentation>
+            <title></title>
+            <description></description>
+            <auditSyncConfig>
+              <name>auditSyncConfig</name>
+              <auditMode v="0" />
+              <syncActive v="false" />
+              <syncComplete v="true" />
+              <syncDirection v="1" />
+              <syncIds></syncIds>
+            </auditSyncConfig>
+            <entityFields>
+              <entityFieldDb>
+                <name>DOCUMENTTEMPLATE_ID</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="1" />
+                <size v="36" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>BULKMAILID</name>
+                <dbName></dbName>
+                <primaryKey v="true" />
+                <columnType v="1" />
+                <size v="36" />
+                <scale v="0" />
+                <notNull v="true" />
+                <isUnique v="true" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>DESCRIPTION</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="12" />
+                <size v="500" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>SUBJECT</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="12" />
+                <size v="100" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>NAME</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="12" />
+                <size v="50" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+            </entityFields>
+          </entityDb>
+          <entityDb>
+            <name>BULKMAILRECIPIENT</name>
+            <dbName></dbName>
+            <idColumn>BULKMAILRECIPIENTID</idColumn>
+            <idGeneratorType v="0" />
+            <idGeneratorInterval v="1" />
+            <documentation></documentation>
+            <title></title>
+            <description></description>
+            <auditSyncConfig>
+              <name>auditSyncConfig</name>
+              <auditMode v="0" />
+              <syncActive v="false" />
+              <syncComplete v="true" />
+              <syncDirection v="1" />
+              <syncIds></syncIds>
+            </auditSyncConfig>
+            <entityFields>
+              <entityFieldDb>
+                <name>STATUS</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="1" />
+                <size v="36" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>BULKMAIL_ID</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="1" />
+                <size v="36" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>BULKMAILRECIPIENTID</name>
+                <dbName></dbName>
+                <primaryKey v="true" />
+                <columnType v="1" />
+                <size v="36" />
+                <scale v="0" />
+                <notNull v="true" />
+                <isUnique v="true" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>CONTACT_ID</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="1" />
+                <size v="36" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+            </entityFields>
+          </entityDb>
           <entityDb>
             <name>DSGVO</name>
             <dbName></dbName>
diff --git a/application/_____SYSTEM_APPLICATION_NEON/_____SYSTEM_APPLICATION_NEON.aod b/application/_____SYSTEM_APPLICATION_NEON/_____SYSTEM_APPLICATION_NEON.aod
index e56198b633c06b1ac2022de0510753e70e060fcb..11bf4ef5b69285c21f0561b1e5798867002a99e1 100644
--- a/application/_____SYSTEM_APPLICATION_NEON/_____SYSTEM_APPLICATION_NEON.aod
+++ b/application/_____SYSTEM_APPLICATION_NEON/_____SYSTEM_APPLICATION_NEON.aod
@@ -103,6 +103,11 @@
                 <name>Campaign</name>
                 <kind v="10077" />
               </entityNode>
+              <entityNode>
+                <name>BulkMail</name>
+                <kind v="10077" />
+                <title></title>
+              </entityNode>
               <entityNode>
                 <name>INTERNAL_ADMINISTRATOR</name>
                 <kind v="159" />
diff --git a/entity/360Degree_entity/360Degree_entity.aod b/entity/360Degree_entity/360Degree_entity.aod
index 6f98e33cf4e6dfa4ea75e3b8e16a0f28c7a46e64..0978ad120ab3cf5973995bf388121c14e2c1ff0e 100644
--- a/entity/360Degree_entity/360Degree_entity.aod
+++ b/entity/360Degree_entity/360Degree_entity.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.7">
+<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.8" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.8">
   <name>360Degree_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <title>360 Degree</title>
@@ -148,7 +148,7 @@
       <name>jdito</name>
       <jDitoRecordAlias>Data_alias</jDitoRecordAlias>
       <isFilterable v="true" />
-      <isRequireContainerFiltering v="true" />
+      <isRequireContainerFiltering v="false" />
       <contentProcess>%aditoprj%/entity/360Degree_entity/recordcontainers/jdito/contentProcess.js</contentProcess>
       <recordFields>
         <element>UID.value</element>
diff --git a/entity/ActivityLink_entity/ActivityLink_entity.aod b/entity/ActivityLink_entity/ActivityLink_entity.aod
index 76a95ad5c466279ad636195be477ae733815ed8a..79528f384bb8b92da89b10d828e3c63bd5b478b0 100644
--- a/entity/ActivityLink_entity/ActivityLink_entity.aod
+++ b/entity/ActivityLink_entity/ActivityLink_entity.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.7">
+<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.8" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.8">
   <name>ActivityLink_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <title>Connection</title>
@@ -65,7 +65,6 @@
           <name>ObjectType_param</name>
           <valueProcess>%aditoprj%/entity/ActivityLink_entity/entityfields/objects/children/objecttype_param/valueProcess.js</valueProcess>
           <expose v="true" />
-          <triggerRecalculation v="true" />
         </entityParameter>
       </children>
     </entityConsumer>
diff --git a/entity/Activity_entity/Activity_entity.aod b/entity/Activity_entity/Activity_entity.aod
index 37b1d10481a017e98656e8b1f24c8e67f1b536bb..cc5fc88774f1e1efd760203fc800b83afdf5aec2 100644
--- a/entity/Activity_entity/Activity_entity.aod
+++ b/entity/Activity_entity/Activity_entity.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.7">
+<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.8" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.8">
   <name>Activity_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <documentation>%aditoprj%/entity/Activity_entity/documentation.adoc</documentation>
@@ -59,7 +59,6 @@
     <entityParameter>
       <name>RowId_param</name>
       <expose v="true" />
-      <triggerRecalculation v="true" />
       <mandatory v="false" />
       <description>PARAMETER</description>
     </entityParameter>
@@ -86,14 +85,12 @@
       <name>OnlyInnate_param</name>
       <title>Nur Eigene anzeigen</title>
       <expose v="true" />
-      <triggerRecalculation v="true" />
       <mandatory v="false" />
       <documentation>%aditoprj%/entity/Activity_entity/entityfields/onlyinnate_param/documentation.adoc</documentation>
     </entityParameter>
     <entityParameter>
       <name>ObjectId_param</name>
       <expose v="true" />
-      <triggerRecalculation v="true" />
       <mandatory v="false" />
       <documentation>%aditoprj%/entity/Activity_entity/entityfields/objectid_param/documentation.adoc</documentation>
     </entityParameter>
@@ -404,12 +401,10 @@
         <entityParameter>
           <name>ObjectRowId_param</name>
           <valueProcess>%aditoprj%/entity/Activity_entity/entityfields/attributetree/children/objectrowid_param/valueProcess.js</valueProcess>
-          <triggerRecalculation v="true" />
         </entityParameter>
         <entityParameter>
           <name>ObjectType_param</name>
           <valueProcess>%aditoprj%/entity/Activity_entity/entityfields/attributetree/children/objecttype_param/valueProcess.js</valueProcess>
-          <triggerRecalculation v="true" />
         </entityParameter>
       </children>
     </entityConsumer>
diff --git a/entity/AddressType_entity/AddressType_entity.aod b/entity/AddressType_entity/AddressType_entity.aod
index ddc58c48c3d2ab5e336a58f14f548a916e3b6433..c8d3a2cb7b160f5398b1f041b76901835cfd5f85 100644
--- a/entity/AddressType_entity/AddressType_entity.aod
+++ b/entity/AddressType_entity/AddressType_entity.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.7">
+<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.8" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.8">
   <name>AddressType_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <contentTitleProcess>%aditoprj%/entity/AddressType_entity/contentTitleProcess.js</contentTitleProcess>
diff --git a/entity/AddressValidation_entity/AddressValidation_entity.aod b/entity/AddressValidation_entity/AddressValidation_entity.aod
index 2ee090147246b798b33359749a0159cddcd79332..c45c994d0c67aa20e81788f929ca307c3dc631cc 100644
--- a/entity/AddressValidation_entity/AddressValidation_entity.aod
+++ b/entity/AddressValidation_entity/AddressValidation_entity.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.7">
+<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.8" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.8">
   <name>AddressValidation_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <contentTitleProcess>%aditoprj%/entity/AddressValidation_entity/contentTitleProcess.js</contentTitleProcess>
@@ -40,7 +40,6 @@
     <entityParameter>
       <name>Country_param</name>
       <expose v="true" />
-      <triggerRecalculation v="true" />
       <description>PARAMETER</description>
     </entityParameter>
     <entityField>
@@ -92,7 +91,6 @@
     <entityParameter>
       <name>CurrentValue_param</name>
       <expose v="true" />
-      <triggerRecalculation v="true" />
       <description>PARAMETER</description>
     </entityParameter>
     <entityProvider>
diff --git a/entity/Address_entity/Address_entity.aod b/entity/Address_entity/Address_entity.aod
index bfa692364fa7b2edb5483a8889c4becc8d464d14..7693958037a0ab5a4896deea5fbf03d80074f9d1 100644
--- a/entity/Address_entity/Address_entity.aod
+++ b/entity/Address_entity/Address_entity.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.7">
+<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.8" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.8">
   <name>Address_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <documentation>%aditoprj%/entity/Address_entity/documentation.adoc</documentation>
@@ -154,7 +154,6 @@
           <name>ContactType_param</name>
           <valueProcess>%aditoprj%/entity/Address_entity/entityfields/contactaddresses/children/contacttype_param/valueProcess.js</valueProcess>
           <expose v="false" />
-          <triggerRecalculation v="true" />
           <description>TODO: expose auf false. aktuell wird der Code nicht ausgeführt, wenn Expose false ist.</description>
         </entityParameter>
         <entityParameter>
diff --git a/entity/Analyses_entity/Analyses_entity.aod b/entity/Analyses_entity/Analyses_entity.aod
index b40df2f577c21e07c6c768f4c0a895a55f8a43fd..6658661779bf92d385590e5425de5bb2e199a973 100644
--- a/entity/Analyses_entity/Analyses_entity.aod
+++ b/entity/Analyses_entity/Analyses_entity.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.7">
+<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.8" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.8">
   <name>Analyses_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <icon>VAADIN:GRID_BIG_O</icon>
diff --git a/entity/AnyContact_entity/AnyContact_entity.aod b/entity/AnyContact_entity/AnyContact_entity.aod
index 95fb9654ff98bf40eb1bd3243d924860a0cc524b..7c98fe14a763e4978957c60582c69a45d7c5d1e3 100644
--- a/entity/AnyContact_entity/AnyContact_entity.aod
+++ b/entity/AnyContact_entity/AnyContact_entity.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.7">
+<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.8" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.8">
   <name>AnyContact_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <contentTitleProcess>%aditoprj%/entity/AnyContact_entity/contentTitleProcess.js</contentTitleProcess>
@@ -32,6 +32,12 @@
           <fieldName>AnyContacts</fieldName>
           <isConsumer v="false" />
         </entityDependency>
+        <entityDependency>
+          <name>b2895709-2ebf-46ec-a46d-6b2e9a4575a3</name>
+          <entityName>BulkMailRecipient_entity</entityName>
+          <fieldName>Contacts</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
       </dependencies>
     </entityProvider>
     <entityField>
@@ -70,7 +76,7 @@ See ContactUtils.getRelationTypeByPersOrg for possible values</description>
     </entityField>
     <entityField>
       <name>ORGANISATION_NAME</name>
-      <title>Organisation name</title>
+      <title>Company</title>
     </entityField>
     <entityField>
       <name>PERSON_FIRSTNAME</name>
diff --git a/entity/AppointmentLink_entity/AppointmentLink_entity.aod b/entity/AppointmentLink_entity/AppointmentLink_entity.aod
index f475ae1631c0aa89e8eda3e315a41ce2ddc8c113..b9bf4f38675b7d3d5da90acb41947c3fb6f3b01c 100644
--- a/entity/AppointmentLink_entity/AppointmentLink_entity.aod
+++ b/entity/AppointmentLink_entity/AppointmentLink_entity.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.7">
+<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.8" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.8">
   <name>AppointmentLink_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <recordContainer>db</recordContainer>
@@ -57,7 +57,6 @@
         <entityParameter>
           <name>AppointmentId_param</name>
           <expose v="true" />
-          <triggerRecalculation v="true" />
         </entityParameter>
       </children>
     </entityProvider>
@@ -81,7 +80,6 @@
           <name>ObjectType_param</name>
           <valueProcess>%aditoprj%/entity/AppointmentLink_entity/entityfields/objects/children/objecttype_param/valueProcess.js</valueProcess>
           <expose v="true" />
-          <triggerRecalculation v="true" />
         </entityParameter>
       </children>
     </entityConsumer>
diff --git a/entity/Appointment_entity/Appointment_entity.aod b/entity/Appointment_entity/Appointment_entity.aod
index 82f3bb5093af6d5fbacfe227cee4c2620c915b34..65a2df205cddbace6781708828173da88c9d8db6 100644
--- a/entity/Appointment_entity/Appointment_entity.aod
+++ b/entity/Appointment_entity/Appointment_entity.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.7">
+<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.8" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.8">
   <name>Appointment_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <documentation>%aditoprj%/entity/Appointment_entity/documentation.adoc</documentation>
diff --git a/entity/AttributeRelation_entity/AttributeRelation_entity.aod b/entity/AttributeRelation_entity/AttributeRelation_entity.aod
index dc81d329d7296b2a4559cb0274fc1f93da5adb91..5ef3a514824139ad2decbba39f3efea99b9d2935 100644
--- a/entity/AttributeRelation_entity/AttributeRelation_entity.aod
+++ b/entity/AttributeRelation_entity/AttributeRelation_entity.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.7">
+<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.8" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.8">
   <name>AttributeRelation_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <title>Attribute</title>
@@ -129,7 +129,6 @@
         <entityParameter>
           <name>ObjectType_param</name>
           <valueProcess>%aditoprj%/entity/AttributeRelation_entity/entityfields/specificattribute/children/objecttype_param/valueProcess.js</valueProcess>
-          <triggerRecalculation v="true" />
         </entityParameter>
         <entityParameter>
           <name>AttributeCount_param</name>
@@ -159,7 +158,6 @@
     <entityParameter>
       <name>GetTree_param</name>
       <expose v="true" />
-      <triggerRecalculation v="true" />
       <description>PARAMETER</description>
     </entityParameter>
     <entityProvider>
@@ -273,7 +271,6 @@
     <entityParameter>
       <name>FilteredAttributeIds_param</name>
       <expose v="true" />
-      <triggerRecalculation v="false" />
       <description>PARAMETER</description>
     </entityParameter>
     <entityParameter>
diff --git a/entity/AttributeRelation_entity/entityfields/value/displayValueProcess.js b/entity/AttributeRelation_entity/entityfields/value/displayValueProcess.js
index 0221c92526a7b91af3e98af04c5eb6e84bc1dcb7..771696f538471395d9e0012ab3397d7964414feb 100644
--- a/entity/AttributeRelation_entity/entityfields/value/displayValueProcess.js
+++ b/entity/AttributeRelation_entity/entityfields/value/displayValueProcess.js
@@ -1,26 +1,17 @@
-import("system.db");
-import("system.result");
-import("system.vars");
-import("Attribute_lib");
-import("Keyword_lib");
-
-var attrType = AttributeUtil.getAttributeType(vars.get("$field.AB_ATTRIBUTE_ID"));
-var value;
-if (attrType == $AttributeTypes.COMBO)
-    value = AttributeUtil.getSimpleAttributeName(vars.get("$field.VALUE"));
-
-//TODO this is a workaround for keywords, when it's possible to use the consumer remove this else if
-else if (attrType == $AttributeTypes.KEYWORD)
-{
-    var keywordContainer = db.cell(
-        SqlCondition.begin()
-            .andPrepareVars("AB_ATTRIBUTE.AB_ATTRIBUTEID", "$field.AB_ATTRIBUTE_ID")
-            .buildSql("select KEYWORD_CONTAINER from AB_ATTRIBUTE")
-    );
-    value = KeywordUtils.getViewValue(keywordContainer, vars.get("$field.VALUE"));
-}
-
-else
-    value = vars.get("$field.VALUE");
-
-result.string(value);
+import("Context_lib");
+import("system.db");
+import("system.result");
+import("system.vars");
+import("Attribute_lib");
+import("Keyword_lib");
+import("system.tools");
+import("Sql_lib");
+
+var attrType = AttributeUtil.getAttributeType(vars.get("$field.AB_ATTRIBUTE_ID"));
+var dropDownDef = db.cell(
+    SqlCondition.begin()
+        .andPrepareVars("AB_ATTRIBUTE.AB_ATTRIBUTEID", "$field.AB_ATTRIBUTE_ID")
+        .buildSql("select DROPDOWNDEFINITION from AB_ATTRIBUTE")
+);
+
+result.string(AttributeTypeUtil.getAttributeViewValue(attrType, vars.get("$field.VALUE"), dropDownDef));
diff --git a/entity/AttributeRelation_entity/entityfields/value/dropDownProcess.js b/entity/AttributeRelation_entity/entityfields/value/dropDownProcess.js
index 7fff32ea3e3cd6ec08ffa32a0060f011364f857a..a5a2f6d468a4d17d44c1447167c9262e5c9a9ce2 100644
--- a/entity/AttributeRelation_entity/entityfields/value/dropDownProcess.js
+++ b/entity/AttributeRelation_entity/entityfields/value/dropDownProcess.js
@@ -1,3 +1,4 @@
+import("Context_lib");
 import("system.translate");
 import("system.db");
 import("system.result");
@@ -29,7 +30,7 @@ else if (attrType == $AttributeTypes.BOOLEAN)
 //TODO this is a workaround for keywords, when it's possible to use the consumer remove this
 else if (attrType == $AttributeTypes.KEYWORD)
 {
-    var attrKeywordSelect = "select KEYWORD_CONTAINER from AB_ATTRIBUTE";
+    var attrKeywordSelect = "select DROPDOWNDEFINITION from AB_ATTRIBUTE";
     attrKeywordSelect = SqlCondition.begin()
         .andPrepareVars("AB_ATTRIBUTE.AB_ATTRIBUTEID", "$field.AB_ATTRIBUTE_ID")
         .buildSql(attrKeywordSelect);
@@ -44,5 +45,16 @@ else if (attrType == $AttributeTypes.KEYWORD)
     
     result.object(keywords);
 }
+else if (attrType == $AttributeTypes.OBJECTSELECTION)
+{
+    var module = db.cell(SqlCondition.begin()
+        .andPrepareVars("AB_ATTRIBUTE.AB_ATTRIBUTEID", "$field.AB_ATTRIBUTE_ID")
+        .buildSql("select DROPDOWNDEFINITION from AB_ATTRIBUTE")
+    );
+    var objects = [];
+    objects = db.table(ContextUtils.getContextDataSql(module));
+    
+    result.object(objects);
+}
 else
     result.object(null)
\ 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 5e9c75f3a355c2f532a258157d1db54717418d2d..3bcc421bbfe42766d93ed4b3c27b2369f001f36d 100644
--- a/entity/AttributeRelation_entity/recordcontainers/jdito/contentProcess.js
+++ b/entity/AttributeRelation_entity/recordcontainers/jdito/contentProcess.js
@@ -1,151 +1,151 @@
-import("system.util");
-import("Util_lib");
-import("system.vars");
-import("system.result");
-import("system.db");
-import("Attribute_lib");
-import("Sql_lib");
-
-var objectType = vars.exists("$param.ObjectType_param") && vars.get("$param.ObjectType_param");
-var rowId = vars.exists("$param.ObjectRowId_param") && vars.get("$param.ObjectRowId_param");
-
-//getTree: if true, the attribute groups are loaded as parents
-var getTree = vars.exists("$param.GetTree_param") && vars.getString("$param.GetTree_param") == "true";
-
-//showEmpty: if true, all selectable attributes are loaded as records, even if they don't have a attributeRelation
-var showEmpty = vars.exists("$param.ShowEmpty_param") && vars.getString("$param.ShowEmpty_param") == "true";
-
-var displaySimpleName = vars.exists("$param.DisplaySimpleName_param") && vars.get("$param.DisplaySimpleName_param");
-var sqlSelect = "select AB_ATTRIBUTEID, ATTRIBUTE_PARENT_ID, '', '', '', ATTRIBUTE_NAME from AB_ATTRIBUTE";
-
-var attributeRelationJoin = "join AB_ATTRIBUTERELATION on AB_ATTRIBUTERELATION.AB_ATTRIBUTE_ID = AB_ATTRIBUTE.AB_ATTRIBUTEID";
-var sqlCondition = new SqlCondition();
-var subCondition = new SqlCondition();
-
-if (vars.exists("$local.idvalues") && vars.get("$local.idvalues"))
-{
-    let idVals = vars.get("$local.idvalues");
-    let idCond = new SqlCondition();
-    idVals.forEach(function (id)
-    {
-        this.orPrepare("AB_ATTRIBUTERELATION.AB_ATTRIBUTERELATIONID", id);
-    }, subCondition);
-    sqlCondition.andSqlCondition(subCondition);
-    getTree = false;
-}
-else if (showEmpty || rowId)
-{
-    if (showEmpty)
-    {
-        let idCond = new SqlCondition();
-        let possibleAttributes = AttributeUtil.getPossibleAttributes(objectType);
-        possibleAttributes.forEach(function (attributeId)
-        {
-            this.orPrepare("AB_ATTRIBUTE.AB_ATTRIBUTEID", attributeId);
-        }, idCond);
-        sqlCondition.andSqlCondition(idCond);
-        
-        attributeRelationJoin = "left " + attributeRelationJoin;
-    }
-    if (rowId)
-    {
-        subCondition.andPrepare("AB_ATTRIBUTERELATION.OBJECT_ROWID", rowId);
-        if (objectType != null)
-            subCondition.andPrepare("AB_ATTRIBUTERELATION.OBJECT_TYPE", objectType);
-        if (subCondition.isSet())
-            attributeRelationJoin += " and " + db.translateCondition(subCondition.build("1=1"));
-        // add condition to match all returned by joins (override default 1=2 of build)
-        sqlCondition.and("1=1");
-    }
-    if (vars.exists("$param.FilteredAttributeIds_param") && vars.getString("$param.FilteredAttributeIds_param"))
-    {
-        let filteredIds = JSON.parse(vars.getString("$param.FilteredAttributeIds_param"));
-
-        subCondition.clear();
-        let filteredIdChildren = AttributeUtil.getAllChildren(filteredIds);
-
-        filteredIds.concat(filteredIdChildren).forEach(function(id) 
-        {
-            this.orPrepare("AB_ATTRIBUTE.AB_ATTRIBUTEID", id);
-        }, subCondition);
-    
-        // return nothing if filteredAttributeIds is an empty array. (--> and 1=2)
-        sqlCondition.andSqlCondition(subCondition, "1=2");
-    }
-}
-
-//these fields are always required
-var defaultFields = [
-    "AB_ATTRIBUTERELATIONID",
-    "AB_ATTRIBUTE.AB_ATTRIBUTEID", 
-    "AB_ATTRIBUTE.ATTRIBUTE_PARENT_ID", 
-    "AB_ATTRIBUTE.ATTRIBUTE_TYPE", 
-    "AB_ATTRIBUTE.ATTRIBUTE_NAME", 
-    "AB_ATTRIBUTE.KEYWORD_CONTAINER", 
-    "COMBOVAL.ATTRIBUTE_NAME"
-];
-//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 "
-    + attributeRelationJoin
-    + " 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) 
-{
-    let attributeId = row[1];
-    let attributeName = row[4];
-    if (!getTree && !displaySimpleName && row[2])
-    {
-        let parentName = AttributeUtil.getFullAttributeName(row[2]);
-        attributeName = (parentName ? parentName + " / " : "") + attributeName;
-    }
-    let value = row[AttributeTypeUtil.getTypeColumnIndex(row[3]) + defaultFields.length];
-    let viewValue;
-    if (row[3].trim() == $AttributeTypes.COMBO)
-        viewValue = row[6];
-    else 
-        viewValue = AttributeTypeUtil.getAttributeViewValue(row[3].trim(), value, row[5]);
-    
-    //TODO: what should be the uid if showEmpty is true?
-    //                 V-- set "," to mark this as new generated UUID
-    return [row[0] || "," + util.getNewUUID(), row[2], value, viewValue, attributeId, attributeName];
-});
-
-
-var parentAttributes = [];
-var attributeObj = {}; //object of attribute ids to avoid duplicates
-if (getTree)
-    _fetchAttributes(attributeValues.map(function (row) {return row[1]}));
-
-allAttributes = TreeUtils.sortArrayForTree(parentAttributes, 0, 1).concat(attributeValues);
-
-result.object(allAttributes);
-
-/*
- * recursive function that loads all superordinate attributes for the tree
- */
-function _fetchAttributes (pAttributeIds)
-{
-    var sqlCondition = SqlCondition.begin();
-    var nextIds = [];
-    pAttributeIds.forEach(function (id)
-    {
-        if (!(id in this))
-            sqlCondition.orPrepare("AB_ATTRIBUTE.AB_ATTRIBUTEID", id);
-    }, attributeObj);
-    db.table(sqlCondition.buildSql(sqlSelect, "1=2"))
-        .forEach(function (row)
-            {
-                this[row[0]] = true;
-                if (row[1])
-                    nextIds.push(row[1]);
-                else
-                    row[1] = null;
-                parentAttributes.push(row);
-            }, attributeObj);
-    if (nextIds.length)
-        _fetchAttributes(nextIds);
-}
+import("system.util");
+import("Util_lib");
+import("system.vars");
+import("system.result");
+import("system.db");
+import("Attribute_lib");
+import("Sql_lib");
+
+var objectType = vars.exists("$param.ObjectType_param") && vars.get("$param.ObjectType_param");
+var rowId = vars.exists("$param.ObjectRowId_param") && vars.get("$param.ObjectRowId_param");
+
+//getTree: if true, the attribute groups are loaded as parents
+var getTree = vars.exists("$param.GetTree_param") && vars.getString("$param.GetTree_param") == "true";
+
+//showEmpty: if true, all selectable attributes are loaded as records, even if they don't have a attributeRelation
+var showEmpty = vars.exists("$param.ShowEmpty_param") && vars.getString("$param.ShowEmpty_param") == "true";
+
+var displaySimpleName = vars.exists("$param.DisplaySimpleName_param") && vars.get("$param.DisplaySimpleName_param");
+var sqlSelect = "select AB_ATTRIBUTEID, ATTRIBUTE_PARENT_ID, '', '', '', ATTRIBUTE_NAME from AB_ATTRIBUTE";
+
+var attributeRelationJoin = "join AB_ATTRIBUTERELATION on AB_ATTRIBUTERELATION.AB_ATTRIBUTE_ID = AB_ATTRIBUTE.AB_ATTRIBUTEID";
+var sqlCondition = new SqlCondition();
+var subCondition = new SqlCondition();
+
+if (vars.exists("$local.idvalues") && vars.get("$local.idvalues"))
+{
+    let idVals = vars.get("$local.idvalues");
+    let idCond = new SqlCondition();
+    idVals.forEach(function (id)
+    {
+        this.orPrepare("AB_ATTRIBUTERELATION.AB_ATTRIBUTERELATIONID", id);
+    }, subCondition);
+    sqlCondition.andSqlCondition(subCondition);
+    getTree = false;
+}
+else if (showEmpty || rowId)
+{
+    if (showEmpty)
+    {
+        let idCond = new SqlCondition();
+        let possibleAttributes = AttributeUtil.getPossibleAttributes(objectType);
+        possibleAttributes.forEach(function (attributeId)
+        {
+            this.orPrepare("AB_ATTRIBUTE.AB_ATTRIBUTEID", attributeId);
+        }, idCond);
+        sqlCondition.andSqlCondition(idCond);
+        
+        attributeRelationJoin = "left " + attributeRelationJoin;
+    }
+    if (rowId)
+    {
+        subCondition.andPrepare("AB_ATTRIBUTERELATION.OBJECT_ROWID", rowId);
+        if (objectType != null)
+            subCondition.andPrepare("AB_ATTRIBUTERELATION.OBJECT_TYPE", objectType);
+        if (subCondition.isSet())
+            attributeRelationJoin += " and " + db.translateCondition(subCondition.build("1=1"));
+        // add condition to match all returned by joins (override default 1=2 of build)
+        sqlCondition.and("1=1");
+    }
+    if (vars.exists("$param.FilteredAttributeIds_param") && vars.getString("$param.FilteredAttributeIds_param"))
+    {
+        let filteredIds = JSON.parse(vars.getString("$param.FilteredAttributeIds_param"));
+
+        subCondition.clear();
+        let filteredIdChildren = AttributeUtil.getAllChildren(filteredIds);
+
+        filteredIds.concat(filteredIdChildren).forEach(function(id) 
+        {
+            this.orPrepare("AB_ATTRIBUTE.AB_ATTRIBUTEID", id);
+        }, subCondition);
+    
+        // return nothing if filteredAttributeIds is an empty array. (--> and 1=2)
+        sqlCondition.andSqlCondition(subCondition, "1=2");
+    }
+}
+
+//these fields are always required
+var defaultFields = [
+    "AB_ATTRIBUTERELATIONID",
+    "AB_ATTRIBUTE.AB_ATTRIBUTEID", 
+    "AB_ATTRIBUTE.ATTRIBUTE_PARENT_ID", 
+    "AB_ATTRIBUTE.ATTRIBUTE_TYPE", 
+    "AB_ATTRIBUTE.ATTRIBUTE_NAME", 
+    "AB_ATTRIBUTE.DROPDOWNDEFINITION", 
+    "COMBOVAL.ATTRIBUTE_NAME"
+];
+//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 "
+    + attributeRelationJoin
+    + " 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) 
+{
+    let attributeId = row[1];
+    let attributeName = row[4];
+    if (!getTree && !displaySimpleName && row[2])
+    {
+        let parentName = AttributeUtil.getFullAttributeName(row[2]);
+        attributeName = (parentName ? parentName + " / " : "") + attributeName;
+    }
+    let value = row[AttributeTypeUtil.getTypeColumnIndex(row[3]) + defaultFields.length];
+    let viewValue;
+    if (row[3].trim() == $AttributeTypes.COMBO)
+        viewValue = row[6];
+    else 
+        viewValue = AttributeTypeUtil.getAttributeViewValue(row[3].trim(), value, row[5]);
+    
+    //TODO: what should be the uid if showEmpty is true?
+    //                 V-- set "," to mark this as new generated UUID
+    return [row[0] || "," + util.getNewUUID(), row[2], value, viewValue, attributeId, attributeName];
+});
+
+
+var parentAttributes = [];
+var attributeObj = {}; //object of attribute ids to avoid duplicates
+if (getTree)
+    _fetchAttributes(attributeValues.map(function (row) {return row[1]}));
+
+allAttributes = TreeUtils.sortArrayForTree(parentAttributes, 0, 1).concat(attributeValues);
+
+result.object(allAttributes);
+
+/*
+ * recursive function that loads all superordinate attributes for the tree
+ */
+function _fetchAttributes (pAttributeIds)
+{
+    var sqlCondition = SqlCondition.begin();
+    var nextIds = [];
+    pAttributeIds.forEach(function (id)
+    {
+        if (!(id in this))
+            sqlCondition.orPrepare("AB_ATTRIBUTE.AB_ATTRIBUTEID", id);
+    }, attributeObj);
+    db.table(sqlCondition.buildSql(sqlSelect, "1=2"))
+        .forEach(function (row)
+            {
+                this[row[0]] = true;
+                if (row[1])
+                    nextIds.push(row[1]);
+                else
+                    row[1] = null;
+                parentAttributes.push(row);
+            }, attributeObj);
+    if (nextIds.length)
+        _fetchAttributes(nextIds);
+}
diff --git a/entity/AttributeUsage_entity/AttributeUsage_entity.aod b/entity/AttributeUsage_entity/AttributeUsage_entity.aod
index 847cf2690b9c893a65ba6dba8c6435ed60da7cb1..5a78d2334bfb3e4b7f7139c4b48ca8f6f3983b14 100644
--- a/entity/AttributeUsage_entity/AttributeUsage_entity.aod
+++ b/entity/AttributeUsage_entity/AttributeUsage_entity.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.7">
+<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.8" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.8">
   <name>AttributeUsage_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <documentation>%aditoprj%/entity/AttributeUsage_entity/documentation.adoc</documentation>
@@ -55,6 +55,7 @@
       <searchable v="false" />
       <stateProcess>%aditoprj%/entity/AttributeUsage_entity/entityfields/min_count/stateProcess.js</stateProcess>
       <valueProcess>%aditoprj%/entity/AttributeUsage_entity/entityfields/min_count/valueProcess.js</valueProcess>
+      <displayValueProcess>%aditoprj%/entity/AttributeUsage_entity/entityfields/min_count/displayValueProcess.js</displayValueProcess>
       <onValidation>%aditoprj%/entity/AttributeUsage_entity/entityfields/min_count/onValidation.js</onValidation>
     </entityField>
     <entityField>
@@ -64,6 +65,7 @@
       <searchable v="false" />
       <stateProcess>%aditoprj%/entity/AttributeUsage_entity/entityfields/max_count/stateProcess.js</stateProcess>
       <valueProcess>%aditoprj%/entity/AttributeUsage_entity/entityfields/max_count/valueProcess.js</valueProcess>
+      <displayValueProcess>%aditoprj%/entity/AttributeUsage_entity/entityfields/max_count/displayValueProcess.js</displayValueProcess>
       <onValidation>%aditoprj%/entity/AttributeUsage_entity/entityfields/max_count/onValidation.js</onValidation>
     </entityField>
     <entityConsumer>
@@ -91,13 +93,11 @@
     <entityParameter>
       <name>SingleSelection_param</name>
       <expose v="true" />
-      <triggerRecalculation v="true" />
       <description>PARAMETER</description>
     </entityParameter>
     <entityParameter>
       <name>DisableMinCount_param</name>
       <expose v="true" />
-      <triggerRecalculation v="true" />
       <description>PARAMETER</description>
     </entityParameter>
   </entityFields>
diff --git a/entity/AttributeUsage_entity/entityfields/max_count/displayValueProcess.js b/entity/AttributeUsage_entity/entityfields/max_count/displayValueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..8d45182f23c7ed4583c8b410ab827802792cf959
--- /dev/null
+++ b/entity/AttributeUsage_entity/entityfields/max_count/displayValueProcess.js
@@ -0,0 +1,6 @@
+import("system.translate");
+import("system.result");
+import("system.vars");
+
+var minCount = vars.get("$this.value");
+result.string(minCount != 0 ? translate.text("Maximal") + " " + minCount : "");
\ No newline at end of file
diff --git a/entity/AttributeUsage_entity/entityfields/min_count/displayValueProcess.js b/entity/AttributeUsage_entity/entityfields/min_count/displayValueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..891ef3951fb86a9caa2840f3d731797fdbb3577f
--- /dev/null
+++ b/entity/AttributeUsage_entity/entityfields/min_count/displayValueProcess.js
@@ -0,0 +1,6 @@
+import("system.translate");
+import("system.result");
+import("system.vars");
+
+var minCount = vars.get("$this.value");
+result.string(minCount != 0 ? translate.text("Minimal") + " " + minCount : "");
\ No newline at end of file
diff --git a/entity/Attribute_entity/Attribute_entity.aod b/entity/Attribute_entity/Attribute_entity.aod
index 5f7eb10769343718a61d8b871de45995b1431769..29caffcaf3d3b86706021b45f79b3b332ec3f566 100644
--- a/entity/Attribute_entity/Attribute_entity.aod
+++ b/entity/Attribute_entity/Attribute_entity.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.7">
+<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.8" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.8">
   <name>Attribute_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <documentation>%aditoprj%/entity/Attribute_entity/documentation.adoc</documentation>
@@ -60,13 +60,11 @@
           <name>AttrParentId_param</name>
           <valueProcess>%aditoprj%/entity/Attribute_entity/entityfields/attributechildren/children/attrparentid_param/valueProcess.js</valueProcess>
           <expose v="false" />
-          <triggerRecalculation v="true" />
         </entityParameter>
         <entityParameter>
           <name>AttrParentType_param</name>
           <valueProcess>%aditoprj%/entity/Attribute_entity/entityfields/attributechildren/children/attrparenttype_param/valueProcess.js</valueProcess>
           <expose v="false" />
-          <triggerRecalculation v="true" />
         </entityParameter>
       </children>
     </entityConsumer>
@@ -118,7 +116,6 @@
           <name>AttributeId_param</name>
           <valueProcess>%aditoprj%/entity/Attribute_entity/entityfields/attributeusages/children/attributeid_param/valueProcess.js</valueProcess>
           <expose v="false" />
-          <triggerRecalculation v="true" />
         </entityParameter>
         <entityParameter>
           <name>SingleSelection_param</name>
@@ -150,21 +147,20 @@
           <name>ContainerName_param</name>
           <valueProcess>%aditoprj%/entity/Attribute_entity/entityfields/keywordattributetypes/children/containername_param/valueProcess.js</valueProcess>
           <expose v="true" />
-          <triggerRecalculation v="true" />
         </entityParameter>
       </children>
     </entityConsumer>
     <entityField>
-      <name>KEYWORD_CONTAINER</name>
+      <name>DROPDOWNDEFINITION</name>
       <title>Keyword</title>
-      <dropDownProcess>%aditoprj%/entity/Attribute_entity/entityfields/keyword_container/dropDownProcess.js</dropDownProcess>
+      <dropDownProcess>%aditoprj%/entity/Attribute_entity/entityfields/dropdowndefinition/dropDownProcess.js</dropDownProcess>
       <searchable v="false" />
-      <stateProcess>%aditoprj%/entity/Attribute_entity/entityfields/keyword_container/stateProcess.js</stateProcess>
+      <stateProcess>%aditoprj%/entity/Attribute_entity/entityfields/dropdowndefinition/stateProcess.js</stateProcess>
+      <titleProcess>%aditoprj%/entity/Attribute_entity/entityfields/dropdowndefinition/titleProcess.js</titleProcess>
     </entityField>
     <entityParameter>
       <name>AttrParentType_param</name>
       <expose v="true" />
-      <triggerRecalculation v="true" />
       <description>PARAMETER</description>
     </entityParameter>
     <entityParameter>
@@ -331,7 +327,7 @@
         <element>UID.value</element>
         <element>ATTRIBUTE_PARENT_ID.value</element>
         <element>ATTRIBUTE_ACTIVE.value</element>
-        <element>KEYWORD_CONTAINER.value</element>
+        <element>DROPDOWNDEFINITION.value</element>
         <element>SORTING.value</element>
         <element>ATTRIBUTE_TYPE.value</element>
         <element>ATTRIBUTE_TYPE.displayValue</element>
diff --git a/entity/Attribute_entity/entityfields/attribute_type/onValueChange.js b/entity/Attribute_entity/entityfields/attribute_type/onValueChange.js
index 1e41dcc648582d40537797bbf22e7d475b5424a4..680e7f2e1063cd169abc39d20c8f69490eace3f4 100644
--- a/entity/Attribute_entity/entityfields/attribute_type/onValueChange.js
+++ b/entity/Attribute_entity/entityfields/attribute_type/onValueChange.js
@@ -4,5 +4,5 @@ import("Attribute_lib");
 import("Entity_lib");
 
 var type = ProcessHandlingUtils.getOnValidationValue(vars.get("$field.ATTRIBUTE_TYPE")) || "";
-if (type.trim() != $AttributeTypes.KEYWORD && vars.get("$field.KEYWORD_CONTAINER"))
-    neon.setFieldValue("$field.KEYWORD_CONTAINER", "");
\ No newline at end of file
+if (type.trim() != $AttributeTypes.KEYWORD && vars.get("$field.DROPDOWNDEFINITION"))
+    neon.setFieldValue("$field.DROPDOWNDEFINITION", "");
\ No newline at end of file
diff --git a/entity/Attribute_entity/entityfields/attributetypestate_param/valueProcess.js b/entity/Attribute_entity/entityfields/attributetypestate_param/valueProcess.js
index 797792acfabfc8b1dce1c7af42b8a78a4dc9422e..146213fa8e56751c89aa0d7c84bc133d5db01943 100644
--- a/entity/Attribute_entity/entityfields/attributetypestate_param/valueProcess.js
+++ b/entity/Attribute_entity/entityfields/attributetypestate_param/valueProcess.js
@@ -18,14 +18,11 @@ if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_EDIT)
     else if (AttributeTypeUtil.isGroupType(type))
     {
         var hasSubordinate = db.cell(SqlCondition.begin()
-            .andPrepareVars("AB_ATTRIBUTE.AB_ATTRIBUTEID", "$field.UID")
+            .andPrepareVars("AB_ATTRIBUTE.ATTRIBUTE_PARENT_ID", "$field.UID")
             .buildSql(
-                "select exists ("
-                +    "select SUB.AB_ATTRIBUTEID from AB_ATTRIBUTE SUB "
-                +    "where SUB.ATTRIBUTE_PARENT_ID = AB_ATTRIBUTE.AB_ATTRIBUTEID"
-                + ") from AB_ATTRIBUTE", "1=2"
+                "select count(AB_ATTRIBUTEID) from AB_ATTRIBUTE", "1=2"
                 )
-            ) == "true";
+            ) > 0;
         if (hasSubordinate)
             state = neon.COMPONENTSTATE_READONLY;
     }
diff --git a/entity/Attribute_entity/entityfields/keyword_container/dropDownProcess.js b/entity/Attribute_entity/entityfields/dropdowndefinition/dropDownProcess.js
similarity index 55%
rename from entity/Attribute_entity/entityfields/keyword_container/dropDownProcess.js
rename to entity/Attribute_entity/entityfields/dropdowndefinition/dropDownProcess.js
index 53d4ce097815409c81e0f6b778eba652137b2b72..413cfa7747294ec669a2457c17b562b6a0877c54 100644
--- a/entity/Attribute_entity/entityfields/keyword_container/dropDownProcess.js
+++ b/entity/Attribute_entity/entityfields/dropdowndefinition/dropDownProcess.js
@@ -1,12 +1,21 @@
-import("system.vars");
-import("system.result");
-import("Keyword_lib");
-import("Attribute_lib");
-
-var res = [];
-if (vars.get("$field.ATTRIBUTE_TYPE").trim() == $AttributeTypes.KEYWORD)
-    res = KeywordUtils.getContainerNames().map(function (e)
-    {
-        return [e, e];//currently the first column is ID, second view value - which is the same because there is no ID for keyword-containers
-    });
-result.object(res);
\ No newline at end of file
+import("system.translate");
+import("Context_lib");
+import("system.vars");
+import("system.result");
+import("Keyword_lib");
+import("Attribute_lib");
+
+var res = [];
+var type = vars.get("$field.ATTRIBUTE_TYPE").trim();
+if (type == $AttributeTypes.KEYWORD)
+{
+    res = KeywordUtils.getContainerNames().map(function (e)
+    {
+        return [e, e];//currently the first column is ID, second view value - which is the same because there is no ID for keyword-containers
+    });
+}
+else if (type == $AttributeTypes.OBJECTSELECTION)
+{
+    res = ContextUtils.getContexts(true);
+}
+result.object(res);
diff --git a/entity/Attribute_entity/entityfields/keyword_container/stateProcess.js b/entity/Attribute_entity/entityfields/dropdowndefinition/stateProcess.js
similarity index 61%
rename from entity/Attribute_entity/entityfields/keyword_container/stateProcess.js
rename to entity/Attribute_entity/entityfields/dropdowndefinition/stateProcess.js
index cbe854fdd8770b66f3b660089035cbfb38fd9aa1..8335f36cceeaf1148dfe2e88e50b9ef1d8b565ec 100644
--- a/entity/Attribute_entity/entityfields/keyword_container/stateProcess.js
+++ b/entity/Attribute_entity/entityfields/dropdowndefinition/stateProcess.js
@@ -1,14 +1,15 @@
-import("system.neon");
-import("system.vars");
-import("system.result");
-import("Attribute_lib");
-
-var fieldState;
-if (vars.get("$field.ATTRIBUTE_TYPE").trim() == $AttributeTypes.KEYWORD && !AttributeUtil.hasRelations(vars.get("$field.UID")))
-    fieldState = neon.COMPONENTSTATE_EDITABLE;
-else if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_VIEW)
-    fieldState = neon.COMPONENTSTATE_INVISIBLE;
-else
-    fieldState = neon.COMPONENTSTATE_READONLY;
-
+import("system.neon");
+import("system.vars");
+import("system.result");
+import("Attribute_lib");
+
+var fieldState;
+if ((vars.get("$field.ATTRIBUTE_TYPE").trim() == $AttributeTypes.KEYWORD || vars.get("$field.ATTRIBUTE_TYPE").trim() == $AttributeTypes.OBJECTSELECTION) 
+        && !AttributeUtil.hasRelations(vars.get("$field.UID")))
+    fieldState = neon.COMPONENTSTATE_EDITABLE;
+else if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_VIEW)
+    fieldState = neon.COMPONENTSTATE_INVISIBLE;
+else
+    fieldState = neon.COMPONENTSTATE_READONLY;
+
 result.string(fieldState);
\ No newline at end of file
diff --git a/entity/Attribute_entity/entityfields/dropdowndefinition/titleProcess.js b/entity/Attribute_entity/entityfields/dropdowndefinition/titleProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..f00cbd82e67e091c167605b83a160416e4b83853
--- /dev/null
+++ b/entity/Attribute_entity/entityfields/dropdowndefinition/titleProcess.js
@@ -0,0 +1,11 @@
+import("system.translate");
+import("system.neon");
+import("system.vars");
+import("system.result");
+import("Attribute_lib");
+
+var type = vars.get("$field.ATTRIBUTE_TYPE").trim();
+if (type == $AttributeTypes.KEYWORD)
+    result.string(translate.text("Keyword"));
+else if (type == $AttributeTypes.OBJECTSELECTION)
+    result.string(translate.text("Module"));
diff --git a/entity/Attribute_entity/entityfields/icon/colorProcess.js b/entity/Attribute_entity/entityfields/icon/colorProcess.js
index 302ce429bcdf61217ffa97c1b5b40051b5838f21..16a333ea2d60fe6b0abe35d82d40928889b5e3d3 100644
--- a/entity/Attribute_entity/entityfields/icon/colorProcess.js
+++ b/entity/Attribute_entity/entityfields/icon/colorProcess.js
@@ -1,6 +1,6 @@
-import("system.vars");
-import("system.result");
-import("system.neon");
-
-if (vars.getString("$field.ATTRIBUTE_ACTIVE") != "1")
-    result.string(neon.PRIORITY_LOW_COLOR);
\ No newline at end of file
+import("system.vars");
+import("system.result");
+import("system.neon");
+
+if (vars.getString("$field.ATTRIBUTE_ACTIVE") != "1")
+    result.string(neon.PRIORITY_LOW_COLOR);
diff --git a/entity/Attribute_entity/recordcontainers/jdito/contentProcess.js b/entity/Attribute_entity/recordcontainers/jdito/contentProcess.js
index 85ec8b3390e8d92172565db1488e356f6b4c0387..4aa2fc2aac11e228e042b757019152b6ee802d5f 100644
--- a/entity/Attribute_entity/recordcontainers/jdito/contentProcess.js
+++ b/entity/Attribute_entity/recordcontainers/jdito/contentProcess.js
@@ -1,3 +1,5 @@
+import("system.logging");
+import("system.translate");
 import("Util_lib");
 import("JditoFilter_lib");
 import("KeywordRegistry_basic");
@@ -12,8 +14,10 @@ var getGroups = vars.exists("$param.GetGroups_param") && vars.get("$param.GetGro
 var objectType = vars.exists("$param.ObjectType_param") && vars.get("$param.ObjectType_param");
 var parentType = vars.exists("$param.AttrParentType_param") && vars.get("$param.AttrParentType_param");
 
+logging.log([getGroups, objectType, parentType])
+
 var uidTableAlias = "UIDROW";
-var sqlSelect = "select UIDROW.AB_ATTRIBUTEID, UIDROW.ATTRIBUTE_PARENT_ID, UIDROW.ATTRIBUTE_ACTIVE, UIDROW.KEYWORD_CONTAINER, UIDROW.SORTING, UIDROW.ATTRIBUTE_TYPE, " 
+var sqlSelect = "select UIDROW.AB_ATTRIBUTEID, UIDROW.ATTRIBUTE_PARENT_ID, UIDROW.ATTRIBUTE_ACTIVE, UIDROW.DROPDOWNDEFINITION, UIDROW.SORTING, UIDROW.ATTRIBUTE_TYPE, " 
     + KeywordUtils.getResolvedTitleSqlPart($KeywordRegistry.attributeType(), "UIDROW.ATTRIBUTE_TYPE") //3
     + ", '', UIDROW.ATTRIBUTE_NAME, PARENT1.ATTRIBUTE_NAME, PARENT2.ATTRIBUTE_NAME, PARENT3.ATTRIBUTE_NAME, PARENT3.ATTRIBUTE_PARENT_ID " 
     + "from AB_ATTRIBUTE UIDROW "
@@ -62,7 +66,7 @@ else if (objectType)  //if there's an objectType, it comes from the AttributeRel
 
     if (ids.length > 0)
         condition.and("UIDROW.AB_ATTRIBUTEID in ('" + ids.join("','") + "')");
-    else if (filteredAttributes != null) // do not return anything, if parameter is there but an empty array
+    else  // do not return anything, if parameter is there but an empty array
         condition.and("1=2");
 
         
@@ -138,7 +142,10 @@ function _buildAttributeTable (pAttributes, pUsages)
         let rowData = rows[i].data;
         if (rowData[5].trim() != $AttributeTypes.COMBOVALUE && i in pUsages)
         {
-            rowData[7] = pUsages[i].join(", ");
+            rowData[7] = pUsages[i].map(function (usage)
+            {
+                return translate.text(usage);
+            }).join(", ");
         }
         var fullName = displaySimpleName 
             ? rowData[8]
diff --git a/entity/Attribute_entity/recordcontainers/jdito/onInsert.js b/entity/Attribute_entity/recordcontainers/jdito/onInsert.js
index 1409f43794007ac09be06eb16a823a15a24edf50..40e10e11b533fc5ccee823daad6872941beebaf7 100644
--- a/entity/Attribute_entity/recordcontainers/jdito/onInsert.js
+++ b/entity/Attribute_entity/recordcontainers/jdito/onInsert.js
@@ -1,23 +1,23 @@
-import("system.db");
-import("system.vars");
-
-var columns = [
-    "AB_ATTRIBUTEID",
-    "ATTRIBUTE_ACTIVE",
-    "ATTRIBUTE_NAME",
-    "ATTRIBUTE_PARENT_ID",
-    "ATTRIBUTE_TYPE",
-    "KEYWORD_CONTAINER",
-    "SORTING"
-];
-var values = [
-    vars.get("$field.UID"),
-    vars.get("$field.ATTRIBUTE_ACTIVE"),
-    vars.get("$field.ATTRIBUTE_NAME"),
-    vars.get("$field.ATTRIBUTE_PARENT_ID"),
-    vars.get("$field.ATTRIBUTE_TYPE"),
-    vars.get("$field.KEYWORD_CONTAINER"),
-    vars.get("$field.SORTING")
-];
-
+import("system.db");
+import("system.vars");
+
+var columns = [
+    "AB_ATTRIBUTEID",
+    "ATTRIBUTE_ACTIVE",
+    "ATTRIBUTE_NAME",
+    "ATTRIBUTE_PARENT_ID",
+    "ATTRIBUTE_TYPE",
+    "DROPDOWNDEFINITION",
+    "SORTING"
+];
+var values = [
+    vars.get("$field.UID"),
+    vars.get("$field.ATTRIBUTE_ACTIVE"),
+    vars.get("$field.ATTRIBUTE_NAME"),
+    vars.get("$field.ATTRIBUTE_PARENT_ID"),
+    vars.get("$field.ATTRIBUTE_TYPE"),
+    vars.get("$field.DROPDOWNDEFINITION"),
+    vars.get("$field.SORTING")
+];
+
 db.insertData("AB_ATTRIBUTE", columns, null, values);
\ No newline at end of file
diff --git a/entity/Attribute_entity/recordcontainers/jdito/onUpdate.js b/entity/Attribute_entity/recordcontainers/jdito/onUpdate.js
index 32f0f0d8de80a70ce6cf3e87f947b759ca44fc3f..af114d5a96bcef11470b6da3b48910bb0b5ef555 100644
--- a/entity/Attribute_entity/recordcontainers/jdito/onUpdate.js
+++ b/entity/Attribute_entity/recordcontainers/jdito/onUpdate.js
@@ -7,7 +7,7 @@ var columns = [
     "ATTRIBUTE_NAME",
     "ATTRIBUTE_PARENT_ID",
     "ATTRIBUTE_TYPE",
-    "KEYWORD_CONTAINER",
+    "DROPDOWNDEFINITION",
     "SORTING"
 ];
 var values = [
@@ -15,7 +15,7 @@ var values = [
     vars.get("$field.ATTRIBUTE_NAME"),
     vars.get("$field.ATTRIBUTE_PARENT_ID"),
     vars.get("$field.ATTRIBUTE_TYPE"),
-    vars.get("$field.KEYWORD_CONTAINER"),
+    vars.get("$field.DROPDOWNDEFINITION"),
     vars.get("$field.SORTING")
 ];
 
diff --git a/entity/BulkMailRecipient_entity/BulkMailRecipient_entity.aod b/entity/BulkMailRecipient_entity/BulkMailRecipient_entity.aod
new file mode 100644
index 0000000000000000000000000000000000000000..5589bd9878f1183e93cc6c37ae291d03d87a8bcf
--- /dev/null
+++ b/entity/BulkMailRecipient_entity/BulkMailRecipient_entity.aod
@@ -0,0 +1,110 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.8" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.8">
+  <name>BulkMailRecipient_entity</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <title>Recipient</title>
+  <titlePlural>Recipients</titlePlural>
+  <recordContainer>db</recordContainer>
+  <entityFields>
+    <entityProvider>
+      <name>#PROVIDER</name>
+    </entityProvider>
+    <entityField>
+      <name>BULKMAIL_ID</name>
+      <valueProcess>%aditoprj%/entity/BulkMailRecipient_entity/entityfields/bulkmail_id/valueProcess.js</valueProcess>
+    </entityField>
+    <entityField>
+      <name>CONTACT_ID</name>
+      <title>Contact</title>
+      <consumer>Contacts</consumer>
+      <linkedContextProcess>%aditoprj%/entity/BulkMailRecipient_entity/entityfields/contact_id/linkedContextProcess.js</linkedContextProcess>
+      <displayValueProcess>%aditoprj%/entity/BulkMailRecipient_entity/entityfields/contact_id/displayValueProcess.js</displayValueProcess>
+    </entityField>
+    <entityField>
+      <name>STATUS</name>
+      <title>Status</title>
+      <consumer>StatusKeyword</consumer>
+      <valueProcess>%aditoprj%/entity/BulkMailRecipient_entity/entityfields/status/valueProcess.js</valueProcess>
+    </entityField>
+    <entityProvider>
+      <name>BulkMailRecipients</name>
+      <targetContextField>targetContext</targetContextField>
+      <targetIdField>CONTACT_ID</targetIdField>
+      <dependencies>
+        <entityDependency>
+          <name>575e04ed-14aa-456c-8236-0bd284b1315f</name>
+          <entityName>BulkMail_entity</entityName>
+          <fieldName>Recipients</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+      </dependencies>
+    </entityProvider>
+    <entityParameter>
+      <name>BulkMailId_param</name>
+      <expose v="true" />
+    </entityParameter>
+    <entityField>
+      <name>BULKMAILRECIPIENTID</name>
+    </entityField>
+    <entityField>
+      <name>targetContext</name>
+      <valueProcess>%aditoprj%/entity/BulkMailRecipient_entity/entityfields/targetcontext/valueProcess.js</valueProcess>
+    </entityField>
+    <entityConsumer>
+      <name>Contacts</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>AnyContact_entity</entityName>
+        <fieldName>#PROVIDER</fieldName>
+      </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>StatusKeyword</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>SpecificContainerKeywords</fieldName>
+      </dependency>
+      <children>
+        <entityParameter>
+          <name>ContainerName_param</name>
+          <valueProcess>%aditoprj%/entity/BulkMailRecipient_entity/entityfields/statuskeyword/children/containername_param/valueProcess.js</valueProcess>
+        </entityParameter>
+      </children>
+    </entityConsumer>
+  </entityFields>
+  <recordContainers>
+    <dbRecordContainer>
+      <name>db</name>
+      <alias>Data_alias</alias>
+      <conditionProcess>%aditoprj%/entity/BulkMailRecipient_entity/recordcontainers/db/conditionProcess.js</conditionProcess>
+      <linkInformation>
+        <linkInformation>
+          <name>760deb9b-6b31-48b5-a339-595d3d104bb5</name>
+          <tableName>BULKMAILRECIPIENT</tableName>
+          <primaryKey>BULKMAILRECIPIENTID</primaryKey>
+          <isUIDTable v="true" />
+          <readonly v="false" />
+        </linkInformation>
+      </linkInformation>
+      <recordFieldMappings>
+        <dbRecordFieldMapping>
+          <name>BULKMAIL_ID.value</name>
+          <recordfield>BULKMAILRECIPIENT.BULKMAIL_ID</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>BULKMAILRECIPIENTID.value</name>
+          <recordfield>BULKMAILRECIPIENT.BULKMAILRECIPIENTID</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>CONTACT_ID.value</name>
+          <recordfield>BULKMAILRECIPIENT.CONTACT_ID</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>STATUS.value</name>
+          <recordfield>BULKMAILRECIPIENT.STATUS</recordfield>
+        </dbRecordFieldMapping>
+      </recordFieldMappings>
+    </dbRecordContainer>
+  </recordContainers>
+</entity>
diff --git a/entity/BulkMailRecipient_entity/entityfields/bulkmail_id/valueProcess.js b/entity/BulkMailRecipient_entity/entityfields/bulkmail_id/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..cea362d78f9084fe85f7764b09d0a1fde3065017
--- /dev/null
+++ b/entity/BulkMailRecipient_entity/entityfields/bulkmail_id/valueProcess.js
@@ -0,0 +1,10 @@
+import("system.result");
+import("system.neon");
+import("system.vars");
+
+if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW)
+{
+    if (vars.exists("$param.BulkMailId_param") && vars.get("$param.BulkMailId_param"))
+        result.string(vars.getString("$param.BulkMailId_param"));    
+}
+
diff --git a/entity/BulkMailRecipient_entity/entityfields/contact_id/displayValueProcess.js b/entity/BulkMailRecipient_entity/entityfields/contact_id/displayValueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..85822946ab4fe0ba7730ca93fd6fca69250a5b33
--- /dev/null
+++ b/entity/BulkMailRecipient_entity/entityfields/contact_id/displayValueProcess.js
@@ -0,0 +1,6 @@
+import("system.result");
+import("system.vars");
+import("Contact_lib");
+import("system.neon");
+
+result.string(ContactUtils.getFullTitleByContactId(vars.getString("$field.CONTACT_ID")));
\ No newline at end of file
diff --git a/entity/BulkMailRecipient_entity/entityfields/contact_id/linkedContextProcess.js b/entity/BulkMailRecipient_entity/entityfields/contact_id/linkedContextProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..2e504d63e3b5a3f71b54b072798b3ad09c50984b
--- /dev/null
+++ b/entity/BulkMailRecipient_entity/entityfields/contact_id/linkedContextProcess.js
@@ -0,0 +1,5 @@
+import("system.vars");
+import("system.result");
+import("Contact_lib");
+
+result.string(ContactUtils.getContextByContactId(vars.getString("$field.CONTACT_ID")));
\ No newline at end of file
diff --git a/entity/BulkMailRecipient_entity/entityfields/status/valueProcess.js b/entity/BulkMailRecipient_entity/entityfields/status/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..1c341faf48f943058c829be897c929c77001147c
--- /dev/null
+++ b/entity/BulkMailRecipient_entity/entityfields/status/valueProcess.js
@@ -0,0 +1,2 @@
+
+//preset pending
\ No newline at end of file
diff --git a/entity/BulkMailRecipient_entity/entityfields/statuskeyword/children/containername_param/valueProcess.js b/entity/BulkMailRecipient_entity/entityfields/statuskeyword/children/containername_param/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..ed3b8531d70d092278f787ddb54e289b20931b4e
--- /dev/null
+++ b/entity/BulkMailRecipient_entity/entityfields/statuskeyword/children/containername_param/valueProcess.js
@@ -0,0 +1,3 @@
+import("system.result");
+
+result.string("BulkMailSentStatus"); //TODO: keyword registry
\ No newline at end of file
diff --git a/entity/BulkMailRecipient_entity/entityfields/targetcontext/valueProcess.js b/entity/BulkMailRecipient_entity/entityfields/targetcontext/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..a15d38343e1dfbb1e1e80999aa6f9440cef261ea
--- /dev/null
+++ b/entity/BulkMailRecipient_entity/entityfields/targetcontext/valueProcess.js
@@ -0,0 +1,4 @@
+import("system.result");
+import("Context_lib");
+
+result.string(ContextUtils.getContextName("Person"));
\ No newline at end of file
diff --git a/entity/BulkMailRecipient_entity/recordcontainers/db/conditionProcess.js b/entity/BulkMailRecipient_entity/recordcontainers/db/conditionProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..ca4a5c0748545f13847d1a5993051065553804f6
--- /dev/null
+++ b/entity/BulkMailRecipient_entity/recordcontainers/db/conditionProcess.js
@@ -0,0 +1,8 @@
+import("system.db");
+import("system.result");
+import("Sql_lib");
+
+var condition = SqlCondition.begin()
+    .andPrepareVars("BULKMAILRECIPIENT.BULKMAIL_ID", "$param.BulkMailId_param");
+    
+result.string(db.translateCondition(condition.build("1=2")));
\ No newline at end of file
diff --git a/entity/BulkMail_entity/BulkMail_entity.aod b/entity/BulkMail_entity/BulkMail_entity.aod
new file mode 100644
index 0000000000000000000000000000000000000000..b5380f1f61ed0ebb81fb451ec16431c9f369c349
--- /dev/null
+++ b/entity/BulkMail_entity/BulkMail_entity.aod
@@ -0,0 +1,98 @@
+<?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.8" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.8">
+  <name>BulkMail_entity</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <icon>VAADIN:ENVELOPES</icon>
+  <title>Bulk mail</title>
+  <recordContainer>db</recordContainer>
+  <entityFields>
+    <entityProvider>
+      <name>#PROVIDER</name>
+    </entityProvider>
+    <entityField>
+      <name>BULKMAILID</name>
+    </entityField>
+    <entityField>
+      <name>NAME</name>
+      <title>Name</title>
+    </entityField>
+    <entityField>
+      <name>SUBJECT</name>
+      <title>Subject</title>
+    </entityField>
+    <entityField>
+      <name>DESCRIPTION</name>
+      <title>Description</title>
+    </entityField>
+    <entityField>
+      <name>DOCUMENTTEMPLATE_ID</name>
+      <title>Document Template</title>
+      <consumer>Templates</consumer>
+    </entityField>
+    <entityConsumer>
+      <name>Recipients</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>BulkMailRecipient_entity</entityName>
+        <fieldName>BulkMailRecipients</fieldName>
+      </dependency>
+      <children>
+        <entityParameter>
+          <name>BulkMailId_param</name>
+          <valueProcess>%aditoprj%/entity/BulkMail_entity/entityfields/recipients/children/bulkmailid_param/valueProcess.js</valueProcess>
+        </entityParameter>
+      </children>
+    </entityConsumer>
+    <entityConsumer>
+      <name>Templates</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>DocumentTemplate_entity</entityName>
+        <fieldName>DocumentTemplateProvider</fieldName>
+      </dependency>
+    </entityConsumer>
+    <entityField>
+      <name>STATUS</name>
+    </entityField>
+    <entityField>
+      <name>SENDER</name>
+    </entityField>
+  </entityFields>
+  <recordContainers>
+    <dbRecordContainer>
+      <name>db</name>
+      <alias>Data_alias</alias>
+      <linkInformation>
+        <linkInformation>
+          <name>bccfb408-864f-41e3-b9ac-eef18f1f53c4</name>
+          <tableName>BULKMAIL</tableName>
+          <primaryKey>BULKMAILID</primaryKey>
+          <isUIDTable v="true" />
+          <readonly v="false" />
+        </linkInformation>
+      </linkInformation>
+      <recordFieldMappings>
+        <dbRecordFieldMapping>
+          <name>BULKMAILID.value</name>
+          <recordfield>BULKMAIL.BULKMAILID</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>DESCRIPTION.value</name>
+          <recordfield>BULKMAIL.DESCRIPTION</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>DOCUMENTTEMPLATE_ID.value</name>
+          <recordfield>BULKMAIL.DOCUMENTTEMPLATE_ID</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>NAME.value</name>
+          <recordfield>BULKMAIL.NAME</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>SUBJECT.value</name>
+          <recordfield>BULKMAIL.SUBJECT</recordfield>
+        </dbRecordFieldMapping>
+      </recordFieldMappings>
+    </dbRecordContainer>
+  </recordContainers>
+</entity>
diff --git a/entity/BulkMail_entity/entityfields/recipients/children/bulkmailid_param/valueProcess.js b/entity/BulkMail_entity/entityfields/recipients/children/bulkmailid_param/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..2a12b8389ba83e397d6b9ae10eb59989a25590fe
--- /dev/null
+++ b/entity/BulkMail_entity/entityfields/recipients/children/bulkmailid_param/valueProcess.js
@@ -0,0 +1,4 @@
+import("system.vars");
+import("system.result");
+
+result.string(vars.get("$field.BULKMAILID"));
\ No newline at end of file
diff --git a/entity/CampaignAddParticipants_entity/CampaignAddParticipants_entity.aod b/entity/CampaignAddParticipants_entity/CampaignAddParticipants_entity.aod
index 6999aa6d83f40c68feb35600006c8139c3435ea3..84f549db4a81ff69e3572a152c2a2115f7d27e5f 100644
--- a/entity/CampaignAddParticipants_entity/CampaignAddParticipants_entity.aod
+++ b/entity/CampaignAddParticipants_entity/CampaignAddParticipants_entity.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.7">
+<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.8" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.8">
   <name>CampaignAddParticipants_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <title>Add participants to Campaign</title>
@@ -62,7 +62,6 @@
           <name>campaignId_param</name>
           <valueProcess>%aditoprj%/entity/CampaignAddParticipants_entity/entityfields/campaignstepconsumer/children/campaignid_param/valueProcess.js</valueProcess>
           <expose v="true" />
-          <triggerRecalculation v="true" />
         </entityParameter>
       </children>
     </entityConsumer>
@@ -95,12 +94,10 @@
         <entityParameter>
           <name>campaignParticipants_param</name>
           <valueProcess>%aditoprj%/entity/CampaignAddParticipants_entity/entityfields/campaignanalyses/children/campaignparticipants_param/valueProcess.js</valueProcess>
-          <triggerRecalculation v="true" />
         </entityParameter>
         <entityParameter>
           <name>campaignStepId_param</name>
           <valueProcess>%aditoprj%/entity/CampaignAddParticipants_entity/entityfields/campaignanalyses/children/campaignstepid_param/valueProcess.js</valueProcess>
-          <triggerRecalculation v="true" />
         </entityParameter>
       </children>
     </entityConsumer>
diff --git a/entity/CampaignAnalysis_entity/CampaignAnalysis_entity.aod b/entity/CampaignAnalysis_entity/CampaignAnalysis_entity.aod
index c52609e15377d231b79f68e9da5b6f737612eedd..69cb219cfd312afc22b9cea0fb43b0c6eed8826e 100644
--- a/entity/CampaignAnalysis_entity/CampaignAnalysis_entity.aod
+++ b/entity/CampaignAnalysis_entity/CampaignAnalysis_entity.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.7">
+<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.8" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.8">
   <name>CampaignAnalysis_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <recordContainer>jdito</recordContainer>
diff --git a/entity/CampaignCostChart_entity/CampaignCostChart_entity.aod b/entity/CampaignCostChart_entity/CampaignCostChart_entity.aod
index eca39381b498caeca64c4e275adb059c16e5643f..f7a27c33ac15ae5eb0c9161aaea372531cd17dfc 100644
--- a/entity/CampaignCostChart_entity/CampaignCostChart_entity.aod
+++ b/entity/CampaignCostChart_entity/CampaignCostChart_entity.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.7">
+<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.8" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.8">
   <name>CampaignCostChart_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <recordContainer>jdito</recordContainer>
diff --git a/entity/CampaignCost_entitiy/CampaignCost_entitiy.aod b/entity/CampaignCost_entitiy/CampaignCost_entitiy.aod
index 1c35951407533bf81ae89a12e87b57fa33ebcd1b..1bace191a21df6819ecf6e85dd26e426793faf89 100644
--- a/entity/CampaignCost_entitiy/CampaignCost_entitiy.aod
+++ b/entity/CampaignCost_entitiy/CampaignCost_entitiy.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.7">
+<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.8" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.8">
   <name>CampaignCost_entitiy</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <afterOperatingState>%aditoprj%/entity/CampaignCost_entitiy/afterOperatingState.js</afterOperatingState>
diff --git a/entity/CampaignCost_entity/CampaignCost_entity.aod b/entity/CampaignCost_entity/CampaignCost_entity.aod
index 663e19dff74016452c99141aa28d925322a2e7d7..c50f744a3c5d9eb96cc95685de523c0a2361c059 100644
--- a/entity/CampaignCost_entity/CampaignCost_entity.aod
+++ b/entity/CampaignCost_entity/CampaignCost_entity.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.7">
+<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.8" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.8">
   <name>CampaignCost_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <afterOperatingState>%aditoprj%/entity/CampaignCost_entity/afterOperatingState.js</afterOperatingState>
diff --git a/entity/CampaignParticipantChart_entity/CampaignParticipantChart_entity.aod b/entity/CampaignParticipantChart_entity/CampaignParticipantChart_entity.aod
index bc388fa15464cd123b8a9d517314e23af3df1e89..f30172a7deac43064afd53df1323901e7e26dd43 100644
--- a/entity/CampaignParticipantChart_entity/CampaignParticipantChart_entity.aod
+++ b/entity/CampaignParticipantChart_entity/CampaignParticipantChart_entity.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.7">
+<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.8" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.8">
   <name>CampaignParticipantChart_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <recordContainer>jdito</recordContainer>
diff --git a/entity/CampaignParticipant_entity/CampaignParticipant_entity.aod b/entity/CampaignParticipant_entity/CampaignParticipant_entity.aod
index 3841ed1b0c35257c44fd88c153db724a7d6e64d5..8415479efcab29b2fd7a0304154ec135c9578f50 100644
--- a/entity/CampaignParticipant_entity/CampaignParticipant_entity.aod
+++ b/entity/CampaignParticipant_entity/CampaignParticipant_entity.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.7">
+<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.8" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.8">
   <name>CampaignParticipant_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <title>Participant</title>
@@ -49,14 +49,12 @@
     <entityParameter>
       <name>CampaignStepId_param</name>
       <expose v="true" />
-      <triggerRecalculation v="true" />
       <mandatory v="true" />
       <description>PARAMETER</description>
     </entityParameter>
     <entityParameter>
       <name>CampaignId_param</name>
       <expose v="true" />
-      <triggerRecalculation v="true" />
       <mandatory v="true" />
       <description>PARAMETER</description>
     </entityParameter>
@@ -104,7 +102,6 @@
     <entityParameter>
       <name>ContactId_param</name>
       <expose v="true" />
-      <triggerRecalculation v="true" />
       <description>PARAMETER</description>
     </entityParameter>
     <entityField>
@@ -152,7 +149,6 @@
           <name>campaignId_param</name>
           <valueProcess>%aditoprj%/entity/CampaignParticipant_entity/entityfields/campaignsteps/children/campaignid_param/valueProcess.js</valueProcess>
           <expose v="true" />
-          <triggerRecalculation v="true" />
         </entityParameter>
       </children>
     </entityConsumer>
@@ -183,6 +179,25 @@
       <title>Max participants</title>
       <displayValueProcess>%aditoprj%/entity/CampaignParticipant_entity/entityfields/campaignstepmaxparticipantcount/displayValueProcess.js</displayValueProcess>
     </entityField>
+    <entityField>
+      <name>ADVERTISINGBAN_ICON</name>
+      <contentType>TEXT</contentType>
+      <valueProcess>%aditoprj%/entity/CampaignParticipant_entity/entityfields/advertisingban_icon/valueProcess.js</valueProcess>
+    </entityField>
+    <entityConsumer>
+      <name>ParticipantsCommRestiction</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>CommRestriction_Entity</entityName>
+        <fieldName>PersonsCommRestriction</fieldName>
+      </dependency>
+      <children>
+        <entityParameter>
+          <name>ContactId_param</name>
+          <valueProcess>%aditoprj%/entity/CampaignParticipant_entity/entityfields/participantscommrestiction/children/contactid_param/valueProcess.js</valueProcess>
+        </entityParameter>
+      </children>
+    </entityConsumer>
   </entityFields>
   <recordContainers>
     <dbRecordContainer>
diff --git a/entity/CampaignParticipant_entity/entityfields/advertisingban_icon/valueProcess.js b/entity/CampaignParticipant_entity/entityfields/advertisingban_icon/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..07627fcdb556afcdbc40e12910b3f3e923eec814
--- /dev/null
+++ b/entity/CampaignParticipant_entity/entityfields/advertisingban_icon/valueProcess.js
@@ -0,0 +1,14 @@
+import("system.result");
+import("Sql_lib");
+import("system.logging");
+import("system.vars");
+import("system.db");
+
+var contact = vars.get("$field.CONTACT_ID");
+var commres = db.table(SqlCondition.begin()
+                .andPrepareVars("COMMRESTRICTION.CONTACT_ID", "$field.CONTACT_ID")
+                .buildSql("select MEDIUM from COMMRESTRICTION", "1=2"));
+
+logging.log(commres.toSource());
+
+result.string(commres);
diff --git a/entity/CampaignStep_entity/CampaignStep_entity.aod b/entity/CampaignStep_entity/CampaignStep_entity.aod
index 8e574ce76ab900547a1e3b137fc6778d84b1f86a..80f03f5a37a44f9d51299501c93bed89c1dd448b 100644
--- a/entity/CampaignStep_entity/CampaignStep_entity.aod
+++ b/entity/CampaignStep_entity/CampaignStep_entity.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.7">
+<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.8" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.8">
   <name>CampaignStep_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <icon>NEON:GROUP_APPOINTMENT</icon>
@@ -144,7 +144,6 @@
         <entityParameter>
           <name>campaignId_param</name>
           <expose v="true" />
-          <triggerRecalculation v="false" />
           <mandatory v="true" />
         </entityParameter>
       </children>
@@ -152,7 +151,6 @@
     <entityParameter>
       <name>campaignId_param</name>
       <expose v="true" />
-      <triggerRecalculation v="true" />
       <description>PARAMETER</description>
     </entityParameter>
     <entityConsumer>
diff --git a/entity/Campaign_entity/Campaign_entity.aod b/entity/Campaign_entity/Campaign_entity.aod
index c7de7e7b77a3bd6d461c051a8df896aa68b75f90..328e9a0af0deb7ba95f8b76e0cf6f90bbf1cf606 100644
--- a/entity/Campaign_entity/Campaign_entity.aod
+++ b/entity/Campaign_entity/Campaign_entity.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.7">
+<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.8" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.8">
   <name>Campaign_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <icon>VAADIN:GROUP</icon>
@@ -104,7 +104,6 @@
           <name>campaignId_param</name>
           <valueProcess>%aditoprj%/entity/Campaign_entity/entityfields/campaignsteps/children/campaignid_param/valueProcess.js</valueProcess>
           <expose v="true" />
-          <triggerRecalculation v="false" />
           <mandatory v="true" />
         </entityParameter>
       </children>
diff --git a/entity/ClassificationAdmin_entity/ClassificationAdmin_entity.aod b/entity/ClassificationAdmin_entity/ClassificationAdmin_entity.aod
index e3cded7f7c29c8a7186004384fe671b604f63945..b42f3d43475016789581492e3cf7c11af77ab6b7 100644
--- a/entity/ClassificationAdmin_entity/ClassificationAdmin_entity.aod
+++ b/entity/ClassificationAdmin_entity/ClassificationAdmin_entity.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.7">
+<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.8" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.8">
   <name>ClassificationAdmin_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <icon>VAADIN:LIST_OL</icon>
@@ -52,7 +52,6 @@
     <entityField>
       <name>CLASSIFICATIONTYPEID</name>
       <searchable v="false" />
-      <valueProcess>%aditoprj%/entity/ClassificationAdmin_entity/entityfields/classificationtypeid/valueProcess.js</valueProcess>
     </entityField>
     <entityField>
       <name>CLASSIFICATIONGROUP</name>
diff --git a/entity/ClassificationAdmin_entity/entityfields/classificationtypeid/valueProcess.js b/entity/ClassificationAdmin_entity/entityfields/classificationtypeid/valueProcess.js
deleted file mode 100644
index 16c47d8b58490ac63829673a531ffce4e6896745..0000000000000000000000000000000000000000
--- a/entity/ClassificationAdmin_entity/entityfields/classificationtypeid/valueProcess.js
+++ /dev/null
@@ -1,10 +0,0 @@
-import("system.util");
-import("system.result");
-import("system.neon");
-import("system.vars");
-
-if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW)
-{
-    var newId = util.getNewUUID();
-    result.string(newId);
-}
\ No newline at end of file
diff --git a/entity/ClassificationAdmin_entity/recordcontainers/jdito/contentProcess.js b/entity/ClassificationAdmin_entity/recordcontainers/jdito/contentProcess.js
index c2b453ca932d02b33f33aac2fb385217d73feb8f..52a61eb71abaeb31c3468bf91027f2167d1f47a1 100644
--- a/entity/ClassificationAdmin_entity/recordcontainers/jdito/contentProcess.js
+++ b/entity/ClassificationAdmin_entity/recordcontainers/jdito/contentProcess.js
@@ -1,3 +1,4 @@
+import("system.logging");
 import("JditoFilter_lib");
 import("Classification_lib");
 import("system.vars");
@@ -8,17 +9,12 @@ import("system.result");
 var classificationId;
 var classificationTypeId;
 
-// if the id starts with "C," it is a classificationId. If it starts with "T,", it is a classificationtypeId
 if (vars.exists("$local.idvalues") && vars.get("$local.idvalues") && vars.get("$local.idvalues").length > 0)
 {
-    var selected = vars.get("$local.idvalues")[0].split(",");
-    if (selected.length == 2)
-    {
-        if (selected[0] == 'C')
-            classificationId = selected[1]
-        else if (selected[0] == 'T')
-            classificationTypeId = selected[1]
-    }
+    var selected = vars.get("$local.idvalues")[0];
+    logging.log(selected.toSource())
+    
+    classificationTypeId = selected;
 }
 
 var cond = SqlCondition.begin()
@@ -42,7 +38,7 @@ if (vars.exists("$local.filter") && vars.get("$local.filter"))
 }
 
 var masking = new SqlMaskingUtils();
-result.object(db.table(cond.buildSql("select case when CLASSIFICATIONID is not null then " + masking.concat(["'C,'", "CLASSIFICATIONID"], "", false) + " else " + masking.concat(["'T,'", "CLASSIFICATIONTYPEID"], "", false) + " end, CLASSIFICATIONID, CLASSIFICATIONGROUP, CLASSIFICATIONSCORE_ID, CLASSIFICATIONTYPEID, CLASSIFICATIONTYPE_ID, OBJECT_TYPE, OBJECT_ROWID, SCORETYPE, CLASSIFICATIONTYPE.CLASSIFICATIONTYPE from CLASSIFICATION \n\
+result.object(db.table(cond.buildSql("select CLASSIFICATIONTYPEID, CLASSIFICATIONID, CLASSIFICATIONGROUP, CLASSIFICATIONSCORE_ID, CLASSIFICATIONTYPEID, CLASSIFICATIONTYPE_ID, OBJECT_TYPE, OBJECT_ROWID, SCORETYPE, CLASSIFICATIONTYPE.CLASSIFICATIONTYPE from CLASSIFICATION \n\
                 right join CLASSIFICATIONTYPE on " + db.translateCondition(SqlCondition.begin()
                     .and("CLASSIFICATIONTYPE_ID = CLASSIFICATIONTYPEID")
                     .andPrepareVars("CLASSIFICATION.OBJECT_TYPE", "$param.ObjectType_param")
diff --git a/entity/ClassificationAdmin_entity/recordcontainers/jdito/onInsert.js b/entity/ClassificationAdmin_entity/recordcontainers/jdito/onInsert.js
index 5abae8836df8a9065da11605f54e2ca73902aa91..7245a3d2d8f9830c28f851d410c42566a721ad0f 100644
--- a/entity/ClassificationAdmin_entity/recordcontainers/jdito/onInsert.js
+++ b/entity/ClassificationAdmin_entity/recordcontainers/jdito/onInsert.js
@@ -3,7 +3,7 @@ import("system.util");
 import("system.vars");
 
 db.insertData("CLASSIFICATIONTYPE", ["CLASSIFICATIONTYPEID", "CLASSIFICATIONTYPE", "SCORETYPE", "CLASSIFICATIONGROUP"], null, [
-    vars.get("$field.CLASSIFICATIONTYPEID"),
+    vars.get("$field.UID"),
     vars.get("$field.CLASSIFICATIONTYPE"),
     vars.get("$field.SCORETYPE"),
     vars.get("$field.CLASSIFICATIONGROUP"),
diff --git a/entity/ClassificationScore_entity/ClassificationScore_entity.aod b/entity/ClassificationScore_entity/ClassificationScore_entity.aod
index 8dc6d4f366c40e6a0ac4bd381982d58cbcf1c53e..810874d91a119469eaa6ebc521bf45d28331bf7d 100644
--- a/entity/ClassificationScore_entity/ClassificationScore_entity.aod
+++ b/entity/ClassificationScore_entity/ClassificationScore_entity.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.7">
+<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.8" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.8">
   <name>ClassificationScore_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <title>Possible Value</title>
@@ -44,19 +44,16 @@
         <entityParameter>
           <name>ClassificationGroup_param</name>
           <expose v="true" />
-          <triggerRecalculation v="true" />
           <mandatory v="true" />
         </entityParameter>
         <entityParameter>
           <name>ClassificationTypeId_param</name>
           <expose v="true" />
-          <triggerRecalculation v="true" />
           <mandatory v="true" />
         </entityParameter>
         <entityParameter>
           <name>ClassificationType_param</name>
           <expose v="true" />
-          <triggerRecalculation v="true" />
           <mandatory v="true" />
         </entityParameter>
       </children>
@@ -64,7 +61,6 @@
     <entityParameter>
       <name>ClassificationTypeId_param</name>
       <expose v="true" />
-      <triggerRecalculation v="true" />
       <description>PARAMETER</description>
     </entityParameter>
     <entityField>
@@ -74,7 +70,6 @@
     <entityParameter>
       <name>ClassificationGroup_param</name>
       <expose v="true" />
-      <triggerRecalculation v="true" />
       <description>PARAMETER</description>
     </entityParameter>
     <entityParameter>
diff --git a/entity/ClassificationType_entity/ClassificationType_entity.aod b/entity/ClassificationType_entity/ClassificationType_entity.aod
index 87518872dc661a4517ff86c0907b8cdf4aad9e12..33db4fa7f5461f87b68cbfc30ab7c0636f173539 100644
--- a/entity/ClassificationType_entity/ClassificationType_entity.aod
+++ b/entity/ClassificationType_entity/ClassificationType_entity.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.7">
+<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.8" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.8">
   <name>ClassificationType_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <entityFields>
diff --git a/entity/Classification_entity/Classification_entity.aod b/entity/Classification_entity/Classification_entity.aod
index d38b34d7155f9db1a6812c423b852d52b6e5069b..41ecaaf9d7ec40aeeab5edf7ab6b2213842efd25 100644
--- a/entity/Classification_entity/Classification_entity.aod
+++ b/entity/Classification_entity/Classification_entity.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.7">
+<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.8" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.8">
   <name>Classification_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <title>Classification</title>
diff --git a/entity/CommRestriction_Entity/CommRestriction_Entity.aod b/entity/CommRestriction_Entity/CommRestriction_Entity.aod
index 9b56ec04b3adeaa4b247d6a1f4aa77b0acf81e55..ef0e6d0b71796f32427d09c76681e6ae5cf13ebd 100644
--- a/entity/CommRestriction_Entity/CommRestriction_Entity.aod
+++ b/entity/CommRestriction_Entity/CommRestriction_Entity.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.7">
+<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.8" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.8">
   <name>CommRestriction_Entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <title>Advertising ban</title>
@@ -82,7 +82,6 @@
         <entityParameter>
           <name>PersonId_param</name>
           <expose v="true" />
-          <triggerRecalculation v="true" />
           <mandatory v="true" />
         </entityParameter>
       </children>
@@ -90,7 +89,6 @@
     <entityParameter>
       <name>PersonId_param</name>
       <expose v="true" />
-      <triggerRecalculation v="true" />
       <mandatory v="true" />
     </entityParameter>
     <entityField>
diff --git a/entity/Communication_entity/Communication_entity.aod b/entity/Communication_entity/Communication_entity.aod
index db82db07eeff1ad87ae8cf1b4d8774aec2770ab3..39af552b0f331027b89b35f390e78db421b355a9 100644
--- a/entity/Communication_entity/Communication_entity.aod
+++ b/entity/Communication_entity/Communication_entity.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.7">
+<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.8" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.8">
   <name>Communication_entity</name>
   <description>former Comm</description>
   <majorModelMode>DISTRIBUTED</majorModelMode>
@@ -182,7 +182,6 @@ Usually this is used for filtering COMMUNICATION-entries by a specified contact
     <entityParameter>
       <name>CommMediumIds_param</name>
       <valueProcess>%aditoprj%/entity/Communication_entity/entityfields/commmediumids_param/valueProcess.js</valueProcess>
-      <triggerRecalculation v="true" />
       <description>PARAMETER</description>
     </entityParameter>
     <entityConsumer>
diff --git a/entity/Competition_entity/Competition_entity.aod b/entity/Competition_entity/Competition_entity.aod
index a4c7e2042f93d9efc99cab70a093650b2bae8986..8d1b7c6bd8b95a044b221fa7736f329489cc8eb6 100644
--- a/entity/Competition_entity/Competition_entity.aod
+++ b/entity/Competition_entity/Competition_entity.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.7">
+<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.8" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.8">
   <name>Competition_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <title>Competition</title>
@@ -78,7 +78,6 @@
         <entityParameter>
           <name>ContactId_param</name>
           <expose v="true" />
-          <triggerRecalculation v="true" />
         </entityParameter>
       </children>
     </entityConsumer>
@@ -217,7 +216,6 @@
         <entityParameter>
           <name>ObjectRowId_param</name>
           <valueProcess>%aditoprj%/entity/Competition_entity/entityfields/attributes/children/objectrowid_param/valueProcess.js</valueProcess>
-          <triggerRecalculation v="true" />
         </entityParameter>
         <entityParameter>
           <name>ObjectType_param</name>
@@ -247,13 +245,11 @@
     <entityParameter>
       <name>ObjectRowId_param</name>
       <expose v="true" />
-      <triggerRecalculation v="true" />
       <description>PARAMETER</description>
     </entityParameter>
     <entityParameter>
       <name>ObjectType_param</name>
       <expose v="true" />
-      <triggerRecalculation v="true" />
       <description>PARAMETER</description>
     </entityParameter>
     <entityConsumer>
@@ -276,7 +272,6 @@
           <name>ObjectType_param</name>
           <valueProcess>%aditoprj%/entity/Competition_entity/entityfields/objects/children/objecttype_param/valueProcess.js</valueProcess>
           <expose v="true" />
-          <triggerRecalculation v="true" />
           <mandatory v="true" />
         </entityParameter>
       </children>
@@ -296,12 +291,10 @@
         <entityParameter>
           <name>ObjectRowId_param</name>
           <expose v="true" />
-          <triggerRecalculation v="true" />
         </entityParameter>
         <entityParameter>
           <name>ObjectType_param</name>
           <expose v="true" />
-          <triggerRecalculation v="true" />
         </entityParameter>
       </children>
     </entityProvider>
diff --git a/entity/Competition_entity/fromClauseProcess.js b/entity/Competition_entity/fromClauseProcess.js
index 93e25f58bf5e95ba49314fa1cd20000066dac054..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644
--- a/entity/Competition_entity/fromClauseProcess.js
+++ b/entity/Competition_entity/fromClauseProcess.js
@@ -1,4 +0,0 @@
-import("system.result");
-
-result.string("COMPETITION left join CONTACT on (CONTACT.CONTACTID = COMPETITION.CONTACT_ID) "
-            + "left join ORGANISATION on (ORGANISATION.ORGANISATIONID = CONTACT.ORGANISATION_ID)");
\ No newline at end of file
diff --git a/entity/Competition_entity/recordcontainers/db/fromClauseProcess.js b/entity/Competition_entity/recordcontainers/db/fromClauseProcess.js
index 0384058046ec3037b95e40f9517af1f0949550e8..8242beefbb6bfe56cd7644e540f382077854b05c 100644
--- a/entity/Competition_entity/recordcontainers/db/fromClauseProcess.js
+++ b/entity/Competition_entity/recordcontainers/db/fromClauseProcess.js
@@ -1,4 +1,5 @@
 import("system.result");
 
-result.string("COMPETITION "
-            + "left join ORGANISATION on (ORGANISATION.ORGANISATIONID = COMPETITION.CONTACT_ID)");
\ No newline at end of file
+result.string("COMPETITION \n\
+    left join CONTACT on (COMPETITION.CONTACT_ID = CONTACT.CONTACTID) \n\
+    left join ORGANISATION on (CONTACT.ORGANISATION_ID = ORGANISATION.ORGANISATIONID)");
\ No newline at end of file
diff --git a/entity/Contact_entity/Contact_entity.aod b/entity/Contact_entity/Contact_entity.aod
index 73255156b682645361317cd9a095483199426899..c03d2f2816f42fa855a010247046ba8c9315152b 100644
--- a/entity/Contact_entity/Contact_entity.aod
+++ b/entity/Contact_entity/Contact_entity.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.7">
+<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.8" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.8">
   <name>Contact_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <documentation>%aditoprj%/entity/Contact_entity/documentation.adoc</documentation>
diff --git a/entity/Context_entity/Context_entity.aod b/entity/Context_entity/Context_entity.aod
index 77dc95ff5caa799c426b231a4854066031698684..d0893562e2044051c534d795f2ac6655a11ccedd 100644
--- a/entity/Context_entity/Context_entity.aod
+++ b/entity/Context_entity/Context_entity.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.7">
+<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.8" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.8">
   <name>Context_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <documentation>%aditoprj%/entity/Context_entity/documentation.adoc</documentation>
diff --git a/entity/Contract_entity/Contract_entity.aod b/entity/Contract_entity/Contract_entity.aod
index f23de4fe3fe842672ef30652d30b1bc40354b645..8a808064792cd913e1b49a847d3fe01324475527 100644
--- a/entity/Contract_entity/Contract_entity.aod
+++ b/entity/Contract_entity/Contract_entity.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.7">
+<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.8" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.8">
   <name>Contract_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <documentation>%aditoprj%/entity/Contract_entity/documentation.adoc</documentation>
@@ -79,7 +79,7 @@
     <entityField>
       <name>CONTACT_ID</name>
       <documentation>%aditoprj%/entity/Contract_entity/entityfields/contact_id/documentation.adoc</documentation>
-      <title>Connection</title>
+      <title>Contact</title>
       <consumer>AnyContacts</consumer>
       <linkedContextProcess>%aditoprj%/entity/Contract_entity/entityfields/contact_id/linkedContextProcess.js</linkedContextProcess>
       <mandatory v="true" />
@@ -180,12 +180,12 @@
     </entityProvider>
     <entityField>
       <name>CONTACT_ORG_ID</name>
-      <title>CONTACT_ORG_ID</title>
+      <title>Company</title>
       <searchable v="false" />
     </entityField>
     <entityField>
       <name>CONTACT_PERSON_ID</name>
-      <title>CONTACT_PERSON_ID</title>
+      <title>Person</title>
       <searchable v="false" />
     </entityField>
     <entityConsumer>
@@ -199,17 +199,14 @@
       <children>
         <entityParameter>
           <name>AssignmentName_param</name>
-          <triggerRecalculation v="false" />
         </entityParameter>
         <entityParameter>
           <name>AssignmentRowId_param</name>
           <valueProcess>%aditoprj%/entity/Contract_entity/entityfields/documents/children/assignmentrowid_param/valueProcess.js</valueProcess>
-          <triggerRecalculation v="false" />
         </entityParameter>
         <entityParameter>
           <name>AssignmentTable_param</name>
           <valueProcess>%aditoprj%/entity/Contract_entity/entityfields/documents/children/assignmenttable_param/valueProcess.js</valueProcess>
-          <triggerRecalculation v="false" />
         </entityParameter>
       </children>
     </entityConsumer>
@@ -298,13 +295,11 @@
           <name>ObjectRowId_param</name>
           <valueProcess>%aditoprj%/entity/Contract_entity/entityfields/attributes/children/objectrowid_param/valueProcess.js</valueProcess>
           <expose v="false" />
-          <triggerRecalculation v="true" />
         </entityParameter>
         <entityParameter>
           <name>ObjectType_param</name>
           <valueProcess>%aditoprj%/entity/Contract_entity/entityfields/attributes/children/objecttype_param/valueProcess.js</valueProcess>
           <expose v="false" />
-          <triggerRecalculation v="true" />
         </entityParameter>
       </children>
     </entityConsumer>
@@ -319,12 +314,10 @@
         <entityParameter>
           <name>ObjectType_param</name>
           <valueProcess>%aditoprj%/entity/Contract_entity/entityfields/attributetree/children/objecttype_param/valueProcess.js</valueProcess>
-          <triggerRecalculation v="true" />
         </entityParameter>
         <entityParameter>
           <name>ObjectRowId_param</name>
           <valueProcess>%aditoprj%/entity/Contract_entity/entityfields/attributetree/children/objectrowid_param/valueProcess.js</valueProcess>
-          <triggerRecalculation v="true" />
         </entityParameter>
       </children>
     </entityConsumer>
@@ -479,6 +472,14 @@
           <name>CONTRACTTYPE.displayValue</name>
           <expression>%aditoprj%/entity/Contract_entity/recordcontainers/db/recordfieldmappings/contracttype.displayvalue/expression.js</expression>
         </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>CONTACT_ORG_ID.displayValue</name>
+          <recordfield>ORGANISATION.NAME</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>CONTACT_PERSON_ID.displayValue</name>
+          <expression>%aditoprj%/entity/Contract_entity/recordcontainers/db/recordfieldmappings/contact_person_id.displayvalue/expression.js</expression>
+        </dbRecordFieldMapping>
       </recordFieldMappings>
     </dbRecordContainer>
   </recordContainers>
diff --git a/entity/Contract_entity/recordcontainers/db/fromClauseProcess.js b/entity/Contract_entity/recordcontainers/db/fromClauseProcess.js
index d48c1c87c7ab0ff8273e2d7ff400ecb96fe87c1f..e247a2acf8970cdbcb522e91f1d089239394498b 100644
--- a/entity/Contract_entity/recordcontainers/db/fromClauseProcess.js
+++ b/entity/Contract_entity/recordcontainers/db/fromClauseProcess.js
@@ -1,4 +1,6 @@
 import("system.result");
 
-result.string("CONTRACT left join CONTACT on CONTACTID = CONTACT_ID \n\
-left join ORGANISATION on ORGANISATIONID = ORGANISATION_ID left join PERSON on PERSONID = PERSON_ID");
\ No newline at end of file
+result.string("CONTRACT \n\
+    left join CONTACT on CONTACT.CONTACTID = CONTRACT.CONTACT_ID \n\
+    left join ORGANISATION on ORGANISATION.ORGANISATIONID = CONTACT.ORGANISATION_ID\n\
+    left join PERSON on PERSON.PERSONID = CONTACT.PERSON_ID");
\ No newline at end of file
diff --git a/entity/Contract_entity/recordcontainers/db/recordfieldmappings/contact_person_id.displayvalue/expression.js b/entity/Contract_entity/recordcontainers/db/recordfieldmappings/contact_person_id.displayvalue/expression.js
new file mode 100644
index 0000000000000000000000000000000000000000..e5f6d2a4902ec5e2ffaa71188b089757bb66701e
--- /dev/null
+++ b/entity/Contract_entity/recordcontainers/db/recordfieldmappings/contact_person_id.displayvalue/expression.js
@@ -0,0 +1,4 @@
+import("Person_lib");
+import("system.result");
+
+result.string(PersUtils.getDisplaySqlExpression());
\ No newline at end of file
diff --git a/entity/Countries_Entity/Countries_Entity.aod b/entity/Countries_Entity/Countries_Entity.aod
index e0c86529b2ae290b46619408911cbe8f5a4b2408..3c4da9d1e85cd7b0effe440b4e7a30455616d4a8 100644
--- a/entity/Countries_Entity/Countries_Entity.aod
+++ b/entity/Countries_Entity/Countries_Entity.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.7">
+<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.8" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.8">
   <name>Countries_Entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <documentation>%aditoprj%/entity/Countries_Entity/documentation.adoc</documentation>
@@ -106,6 +106,7 @@
     <dbRecordContainer>
       <name>db</name>
       <alias>Data_alias</alias>
+      <isPageable v="false" />
       <orderClauseProcess>%aditoprj%/entity/Countries_Entity/recordcontainers/db/orderClauseProcess.js</orderClauseProcess>
       <linkInformation>
         <linkInformation>
diff --git a/entity/DSGVO_entity/recordcontainers/db/onDBInsert.js b/entity/DSGVO_entity/recordcontainers/db/onDBInsert.js
new file mode 100644
index 0000000000000000000000000000000000000000..09754cf5860927f9a6380fa0a8dad7fa1c185b87
--- /dev/null
+++ b/entity/DSGVO_entity/recordcontainers/db/onDBInsert.js
@@ -0,0 +1,43 @@
+import("KeywordRegistry_basic");
+import("Keyword_lib");
+import("system.db");
+import("system.neon");
+import("system.vars");
+import("system.util");
+
+
+if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW)
+{
+    var cols = ["USER_NEW" , "USER_EDIT" , "DSGVOID" , "ROW_ID" , "DATE_NEW" , 
+        "TABLENAME" , "DATE_EDIT" , "RIGHT" , "VALID_TO" , "CONTACT_ID" , "USE"];
+    
+    var vals = [vars.get("$sys.user"), null, util.getNewUUID(), 
+        vars.get("$field.ROW_ID"), vars.get("$sys.date"), vars.get("$field.TABLENAME"),
+        null,  KeywordUtils. vars.get("$field.RIGHT").valueOf(), vars.get("$field.VALID_TO"), 
+        vars.get("$field.CONTACT_ID"), vars.get("$field.USE").valueOf()];
+    // KeywordUtils.getResolvedTitleSqlPart($KeywordRegistry.DSGVOUse(), "DSGVO.USE");
+    db.insertData("DSGVO", cols, null, vals);
+}
+    // TODO Eintrag in DSGVO Tabelle
+    
+    /*
+     * 
+     var InputMapping = {
+        "OFFERITEM": {
+            condition: "OFFER_ID = '" + pSourceOfferId + "' order by ITEMSORT",
+            ValueMapping: {
+                "OFFER_ID" : pTargetOfferId
+            }
+        }
+    };
+    CopyModuleUtils.copyModule(InputMapping);
+    
+    var oiUtils = new OfferItemUtils(pTargetOfferId);
+    
+    //update order price
+    cols = ["NET", "VAT"];
+    var vals = oiUtils.getNetAndVat();
+    
+    db.updateData("OFFER", cols, null, vals, SqlCondition.equals("OFFER.OFFERID", pTargetOfferId, "1 = 2"));
+     * 
+     */
\ No newline at end of file
diff --git a/entity/DocumentTemplateLink_entity/DocumentTemplateLink_entity.aod b/entity/DocumentTemplateLink_entity/DocumentTemplateLink_entity.aod
index 3a6a4f24d554c6915c8d013b11ee00dec57ec270..6f4ab549ba6c4dd42e4d6edd3ce3fe6f963b70ed 100644
--- a/entity/DocumentTemplateLink_entity/DocumentTemplateLink_entity.aod
+++ b/entity/DocumentTemplateLink_entity/DocumentTemplateLink_entity.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.7">
+<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.8" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.8">
   <name>DocumentTemplateLink_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <title>Attachment</title>
@@ -46,7 +46,6 @@
     <entityParameter>
       <name>DocumentId_param</name>
       <expose v="true" />
-      <triggerRecalculation v="true" />
       <description>PARAMETER</description>
     </entityParameter>
     <entityConsumer>
@@ -80,19 +79,16 @@
         <entityParameter>
           <name>DocumentId_param</name>
           <expose v="true" />
-          <triggerRecalculation v="true" />
         </entityParameter>
         <entityParameter>
           <name>Type_param</name>
           <expose v="true" />
-          <triggerRecalculation v="true" />
         </entityParameter>
       </children>
     </entityProvider>
     <entityParameter>
       <name>Type_param</name>
       <expose v="true" />
-      <triggerRecalculation v="true" />
       <description>PARAMETER</description>
     </entityParameter>
     <entityActionField>
diff --git a/entity/DocumentTemplateTypeCategory_entity/DocumentTemplateTypeCategory_entity.aod b/entity/DocumentTemplateTypeCategory_entity/DocumentTemplateTypeCategory_entity.aod
index 5cf2a393d37c16253555bcad5c575683ce3ab26b..35f0c344adee45cf3eeb9bacc714671322a7c1cb 100644
--- a/entity/DocumentTemplateTypeCategory_entity/DocumentTemplateTypeCategory_entity.aod
+++ b/entity/DocumentTemplateTypeCategory_entity/DocumentTemplateTypeCategory_entity.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.7">
+<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.8" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.8">
   <name>DocumentTemplateTypeCategory_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <contentTitleProcess>%aditoprj%/entity/DocumentTemplateTypeCategory_entity/contentTitleProcess.js</contentTitleProcess>
@@ -11,7 +11,6 @@
     <entityParameter>
       <name>usageFilter_param</name>
       <expose v="true" />
-      <triggerRecalculation v="true" />
       <description>PARAMETER</description>
     </entityParameter>
     <entityField>
diff --git a/entity/DocumentTemplate_entity/DocumentTemplate_entity.aod b/entity/DocumentTemplate_entity/DocumentTemplate_entity.aod
index 29cc3a7787ce8f5731acdb8b555a1ef27a3ed963..3b8bcc92f0429cc34ae54a105b72f1bef40cca44 100644
--- a/entity/DocumentTemplate_entity/DocumentTemplate_entity.aod
+++ b/entity/DocumentTemplate_entity/DocumentTemplate_entity.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.7">
+<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.8" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.8">
   <name>DocumentTemplate_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <icon>VAADIN:FILE_FONT</icon>
@@ -197,13 +197,11 @@
           <name>DocumentId_param</name>
           <valueProcess>%aditoprj%/entity/DocumentTemplate_entity/entityfields/links/children/documentid_param/valueProcess.js</valueProcess>
           <expose v="true" />
-          <triggerRecalculation v="true" />
         </entityParameter>
         <entityParameter>
           <name>Type_param</name>
           <valueProcess>%aditoprj%/entity/DocumentTemplate_entity/entityfields/links/children/type_param/valueProcess.js</valueProcess>
           <expose v="true" />
-          <triggerRecalculation v="true" />
         </entityParameter>
       </children>
     </entityConsumer>
@@ -239,12 +237,17 @@
           <fieldName>DocumentTemplates</fieldName>
           <isConsumer v="false" />
         </entityDependency>
+        <entityDependency>
+          <name>233d356c-c81b-41e6-8489-440ca8c81dfa</name>
+          <entityName>BulkMail_entity</entityName>
+          <fieldName>Templates</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
       </dependencies>
     </entityProvider>
     <entityParameter>
       <name>DocumentTemplateType_param</name>
       <expose v="true" />
-      <triggerRecalculation v="true" />
       <description>PARAMETER</description>
     </entityParameter>
     <entityField>
diff --git a/entity/Document_entity/Document_entity.aod b/entity/Document_entity/Document_entity.aod
index a55d8a3546b5f5b92f669e2ce412af4488003eb2..c9316e69006fff9e898478648ed1f4e7a69481d1 100644
--- a/entity/Document_entity/Document_entity.aod
+++ b/entity/Document_entity/Document_entity.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.7">
+<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.8" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.8">
   <name>Document_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <title>Document</title>
@@ -92,6 +92,7 @@
     <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
new file mode 100644
index 0000000000000000000000000000000000000000..cb202a4d661d58a69eaba5744ae3bb7f264682fe
--- /dev/null
+++ b/entity/Document_entity/entityfields/uid/valueProcess.js
@@ -0,0 +1,4 @@
+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/contentProcess.js b/entity/Document_entity/recordcontainers/jdito/contentProcess.js
index d58680419fb0222dbafbccafa1e60bb03cce7c8a..a4ad1b837c44901630593abd843a4467f6ca8707 100644
--- a/entity/Document_entity/recordcontainers/jdito/contentProcess.js
+++ b/entity/Document_entity/recordcontainers/jdito/contentProcess.js
@@ -5,7 +5,8 @@ import("system.db");
 // Check if assignment parameters are present
 if(vars.exists("$param.AssignmentTable_param") &&
     vars.exists("$param.AssignmentName_param") &&
-    vars.exists("$param.AssignmentRowId_param")) {
+    vars.exists("$param.AssignmentRowId_param") 
+    || vars.exists("$local.idvalues") && vars.get("$local.idvalues")) {
     var assignmentTable = vars.get("$param.AssignmentTable_param");
     var assignmentName = vars.get("$param.AssignmentName_param");
     var assignmentRowId = vars.get("$param.AssignmentRowId_param");
diff --git a/entity/Document_entity/recordcontainers/jdito/onInsert.js b/entity/Document_entity/recordcontainers/jdito/onInsert.js
index 2654a171563317095fb786d8cb233d3853431055..a938789f38f6b0d6ff43f78c51280feab2a92af2 100644
--- a/entity/Document_entity/recordcontainers/jdito/onInsert.js
+++ b/entity/Document_entity/recordcontainers/jdito/onInsert.js
@@ -9,6 +9,7 @@ var bindata = DocumentUtil.getBindataFromUpload(vars.get("$field.BINDATA_UPLOAD"
 var filename = vars.get("$field.NAME");
 var description = vars.get("$field.DESCRIPTION");
 var alias = db.getCurrentAlias();
+var id = vars.get("$field.UID");
 
 if(bindata != '' && filename != ''){
     var keyword = '';
@@ -16,6 +17,7 @@ if(bindata != '' && filename != ''){
         keyword = 'MAINDOCUMENT';
     }
     
-    db.insertBinary(assignmentTable, assignmentName, assignmentRowId, "", 
-        bindata, filename, description, keyword, alias);
+    var uid = db.insertBinary(assignmentTable, assignmentName, assignmentRowId, "", 
+        bindata, filename, description, keyword, alias, id);
+   
 }
diff --git a/entity/Email_entity/Email_entity.aod b/entity/Email_entity/Email_entity.aod
index 41ec35f5990331ced3c34c80804788279f4e4d92..214f3a2f015256651be7a635a63b2b8adf302d6a 100644
--- a/entity/Email_entity/Email_entity.aod
+++ b/entity/Email_entity/Email_entity.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.7">
+<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.8" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.8">
   <name>Email_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <recordContainer>jdito</recordContainer>
diff --git a/entity/Email_entity/recordcontainers/jdito/onInsert.js b/entity/Email_entity/recordcontainers/jdito/onInsert.js
index 857bf055dd9ef564ac8a107327423919f10b0bcc..a4a6db2b00da0ebb8ffa004876a78a4a6edc75ca 100644
--- a/entity/Email_entity/recordcontainers/jdito/onInsert.js
+++ b/entity/Email_entity/recordcontainers/jdito/onInsert.js
@@ -1,5 +1,18 @@
+import("ActivityTask_lib");
+import("system.neon");
 import("Employee_lib");
 import("system.vars");
 import("Email_lib");
 
-EmailUtils.openMailTemplate(vars.get("$field.RECIPIENT"), EmployeeUtils.getCurrentContactId(), vars.get("$field.DOCUMENT_TEMPLATE"), vars.get("$param.ContactId_param"));
\ No newline at end of file
+EmailUtils.openMailTemplate(
+    vars.get("$field.RECIPIENT"), 
+    EmployeeUtils.getCurrentContactId(), 
+    vars.get("$field.DOCUMENT_TEMPLATE"), 
+    vars.get("$param.ContactId_param")
+);
+
+var links = [];
+if (contactId)
+    links.push(["Person", contactId]); //TODO: dynamic
+
+ActivityUtils.createNewActivity(null, links);
\ No newline at end of file
diff --git a/entity/EmployeeRole_entity/EmployeeRole_entity.aod b/entity/EmployeeRole_entity/EmployeeRole_entity.aod
index 8e857dd2e41febfaa6b2c768251588185d3596dc..46fae34883dddaadb7d684fb29e9270a129507f6 100644
--- a/entity/EmployeeRole_entity/EmployeeRole_entity.aod
+++ b/entity/EmployeeRole_entity/EmployeeRole_entity.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.7">
+<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.8" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.8">
   <name>EmployeeRole_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <title>Role</title>
diff --git a/entity/Employee_entity/Employee_entity.aod b/entity/Employee_entity/Employee_entity.aod
index c736a4686a4f6fe91a8b9029950d91021ecc7d51..a98051a68509722f2bdc9806789ba247cb2e92fe 100644
--- a/entity/Employee_entity/Employee_entity.aod
+++ b/entity/Employee_entity/Employee_entity.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.7">
+<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.8" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.8">
   <name>Employee_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <title>Employee</title>
diff --git a/entity/Forecast_entity/Forecast_entity.aod b/entity/Forecast_entity/Forecast_entity.aod
index 4f4e90e52f09daab6a3dea708c8aa0b297d2d7d1..093a7112c79901472998ab645af4588eabf0033c 100644
--- a/entity/Forecast_entity/Forecast_entity.aod
+++ b/entity/Forecast_entity/Forecast_entity.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.7">
+<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.8" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.8">
   <name>Forecast_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <title>${FORECAST_ENGLISH}</title>
@@ -81,7 +81,6 @@
           <name>ObjectType_param</name>
           <valueProcess>%aditoprj%/entity/Forecast_entity/entityfields/objects/children/objecttype_param/valueProcess.js</valueProcess>
           <expose v="true" />
-          <triggerRecalculation v="true" />
           <mandatory v="true" />
         </entityParameter>
       </children>
@@ -109,7 +108,6 @@
     <entityParameter>
       <name>ObjectRowId_param</name>
       <expose v="true" />
-      <triggerRecalculation v="true" />
       <description>PARAMETER</description>
     </entityParameter>
     <entityParameter>
diff --git a/entity/Gender_keyword/Gender_keyword.aod b/entity/Gender_keyword/Gender_keyword.aod
index 5c54120690055e7f9d0a3f410fa5983b3a7adeb4..810415127d19efe204101c65be4b833234baeb8d 100644
--- a/entity/Gender_keyword/Gender_keyword.aod
+++ b/entity/Gender_keyword/Gender_keyword.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.7">
+<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.8" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.8">
   <name>Gender_keyword</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <contentTitleProcess>%aditoprj%/entity/Gender_keyword/contentTitleProcess.js</contentTitleProcess>
diff --git a/entity/IndexSearchEntity/IndexSearchEntity.aod b/entity/IndexSearchEntity/IndexSearchEntity.aod
index 8fe6cbc235ec8cf5b20ddd424b853cd1d6fb8783..1dddc5b340cf1762f94ade04d8de8c2805b60887 100644
--- a/entity/IndexSearchEntity/IndexSearchEntity.aod
+++ b/entity/IndexSearchEntity/IndexSearchEntity.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.7">
+<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.8" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.8">
   <name>IndexSearchEntity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <entityFields>
diff --git a/entity/KeywordAttributeRelation_entity/KeywordAttributeRelation_entity.aod b/entity/KeywordAttributeRelation_entity/KeywordAttributeRelation_entity.aod
index 61aefa5705ae195959b0d874e8fbd7b855e0175f..cb4c9ac863324c6b391b749314298c191441d6ad 100644
--- a/entity/KeywordAttributeRelation_entity/KeywordAttributeRelation_entity.aod
+++ b/entity/KeywordAttributeRelation_entity/KeywordAttributeRelation_entity.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.7">
+<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.8" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.8">
   <name>KeywordAttributeRelation_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <documentation>%aditoprj%/entity/KeywordAttributeRelation_entity/documentation.adoc</documentation>
@@ -61,7 +61,6 @@
         <entityParameter>
           <name>KeywordEntryId_param</name>
           <expose v="true" />
-          <triggerRecalculation v="false" />
           <mandatory v="false" />
         </entityParameter>
       </children>
@@ -69,7 +68,6 @@
     <entityParameter>
       <name>ContainerName_param</name>
       <valueProcess>%aditoprj%/entity/KeywordAttributeRelation_entity/entityfields/containername_param/valueProcess.js</valueProcess>
-      <triggerRecalculation v="true" />
       <mandatory v="false" />
       <description>PARAMETER</description>
     </entityParameter>
@@ -85,7 +83,6 @@
           <name>ContainerName_param</name>
           <valueProcess>%aditoprj%/entity/KeywordAttributeRelation_entity/entityfields/keywordattributes/children/containername_param/valueProcess.js</valueProcess>
           <expose v="false" />
-          <triggerRecalculation v="false" />
         </entityParameter>
         <entityParameter>
           <name>FilterAlreadyUsedByEntryId_param</name>
@@ -97,7 +94,6 @@
     <entityParameter>
       <name>KeywordEntryId_param</name>
       <expose v="true" />
-      <triggerRecalculation v="true" />
       <mandatory v="true" />
       <description>PARAMETER</description>
     </entityParameter>
@@ -122,6 +118,8 @@
     <dbRecordContainer>
       <name>db</name>
       <alias>Data_alias</alias>
+      <isPageable v="false" />
+      <isRequireContainerFiltering v="false" />
       <conditionProcess>%aditoprj%/entity/KeywordAttributeRelation_entity/recordcontainers/db/conditionProcess.js</conditionProcess>
       <linkInformation>
         <linkInformation>
diff --git a/entity/KeywordAttribute_entity/KeywordAttribute_entity.aod b/entity/KeywordAttribute_entity/KeywordAttribute_entity.aod
index 5cc7415766a4a8cc19902937efb0dee66187b8b1..e49e6791888f9cb63814b16164abcc8be77a9958 100644
--- a/entity/KeywordAttribute_entity/KeywordAttribute_entity.aod
+++ b/entity/KeywordAttribute_entity/KeywordAttribute_entity.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.7">
+<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.8" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.8">
   <name>KeywordAttribute_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <documentation>%aditoprj%/entity/KeywordAttribute_entity/documentation.adoc</documentation>
@@ -57,7 +57,6 @@
       <children>
         <entityParameter>
           <name>ContainerName_param</name>
-          <triggerRecalculation v="false" />
         </entityParameter>
         <entityParameter>
           <name>FilterAlreadyUsedByEntryId_param</name>
@@ -67,7 +66,6 @@
     <entityParameter>
       <name>ContainerName_param</name>
       <expose v="true" />
-      <triggerRecalculation v="true" />
       <description>PARAMETER</description>
     </entityParameter>
     <entityParameter>
@@ -97,6 +95,7 @@
     <dbRecordContainer>
       <name>db</name>
       <alias>Data_alias</alias>
+      <isPageable v="false" />
       <conditionProcess>%aditoprj%/entity/KeywordAttribute_entity/recordcontainers/db/conditionProcess.js</conditionProcess>
       <onDBDelete>%aditoprj%/entity/KeywordAttribute_entity/recordcontainers/db/onDBDelete.js</onDBDelete>
       <linkInformation>
diff --git a/entity/KeywordEntry_entity/KeywordEntry_entity.aod b/entity/KeywordEntry_entity/KeywordEntry_entity.aod
index c40b460a6d7df3d1fd33289ee07c43fa6f243532..6cf04b0a03f31112d5118b4a763c271062c88504 100644
--- a/entity/KeywordEntry_entity/KeywordEntry_entity.aod
+++ b/entity/KeywordEntry_entity/KeywordEntry_entity.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.7">
+<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.8" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.8">
   <name>KeywordEntry_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <documentation>%aditoprj%/entity/KeywordEntry_entity/documentation.adoc</documentation>
@@ -315,12 +315,6 @@
           <fieldName>KeywordPhases</fieldName>
           <isConsumer v="false" />
         </entityDependency>
-        <entityDependency>
-          <name>f672b4a5-7d68-46c8-9834-4f706d0d8720</name>
-          <entityName>Salesproject_entity</entityName>
-          <fieldName>KeywordPhases</fieldName>
-          <isConsumer v="false" />
-        </entityDependency>
         <entityDependency>
           <name>1053a90d-574a-4ca2-b41d-42b513db0fd2</name>
           <entityName>Task_entity</entityName>
@@ -405,6 +399,12 @@
           <fieldName>CommRestrictionMedium</fieldName>
           <isConsumer v="false" />
         </entityDependency>
+        <entityDependency>
+          <name>eb7c17de-3057-45c5-96c0-f863551cc049</name>
+          <entityName>BulkMailRecipient_entity</entityName>
+          <fieldName>StatusKeyword</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
         <entityDependency>
           <name>3ab18dc8-b702-49d9-9cbc-4b8d8ffaea2e</name>
           <entityName>DSGVO_entity</entityName>
@@ -429,7 +429,6 @@
           <name>OnlyActives_param</name>
           <valueProcess>%aditoprj%/entity/KeywordEntry_entity/entityfields/specificcontainerkeywords/children/onlyactives_param/valueProcess.js</valueProcess>
           <expose v="true" />
-          <triggerRecalculation v="false" />
         </entityParameter>
         <entityParameter>
           <name>ContainerName_param</name>
@@ -445,7 +444,6 @@
       <name>OnlyActives_param</name>
       <valueProcess>%aditoprj%/entity/KeywordEntry_entity/entityfields/onlyactives_param/valueProcess.js</valueProcess>
       <expose v="true" />
-      <triggerRecalculation v="true" />
       <description>PARAMETER</description>
     </entityParameter>
     <entityConsumer>
diff --git a/entity/Language_entity/Language_entity.aod b/entity/Language_entity/Language_entity.aod
index 829e36adc6e63efce34d7d23f435b488b254b6a1..e2e65cf810e2c82b788bd7fc9dbcc2fcf614b6fc 100644
--- a/entity/Language_entity/Language_entity.aod
+++ b/entity/Language_entity/Language_entity.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.7">
+<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.8" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.8">
   <name>Language_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <contentTitleProcess>%aditoprj%/entity/Language_entity/contentTitleProcess.js</contentTitleProcess>
diff --git a/entity/Letter_entity/Letter_entity.aod b/entity/Letter_entity/Letter_entity.aod
index 0387ac0541736306ad4b4135bd898974ce89f9ad..3b7ae585372f79da24c7dd54b8b4efa987dbecbe 100644
--- a/entity/Letter_entity/Letter_entity.aod
+++ b/entity/Letter_entity/Letter_entity.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.7">
+<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.8" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.8">
   <name>Letter_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <recordContainer>jdito</recordContainer>
diff --git a/entity/Letter_entity/recordcontainers/jdito/onInsert.js b/entity/Letter_entity/recordcontainers/jdito/onInsert.js
index 6c26e3a267e63b881b0eceb3510a405f235017a8..35bc3b14d02877310488934385dc9a5e7472ade0 100644
--- a/entity/Letter_entity/recordcontainers/jdito/onInsert.js
+++ b/entity/Letter_entity/recordcontainers/jdito/onInsert.js
@@ -7,9 +7,8 @@ var template = DocumentTemplate.loadTemplate(vars.get("$field.DOCUMENT_TEMPLATE"
 var contactId = vars.get("$param.ContactId_param");
 neon.download(template.getReplacedContentByContactId(contactId), template.filename);
 
-var params = {
-    "ObjectId_param" : "Person", //TODO: dynamic
-    "RowId_param" : contactId
-};
+var links = [];
+if (contactId)
+    links.push(["Person", contactId]); //TODO: dynamic
 
-neon.openContext("Activity", null, null, neon.OPERATINGSTATE_NEW, params);
+ActivityUtils.createNewActivity(null, links);
diff --git a/entity/LogHistory_entity/LogHistory_entity.aod b/entity/LogHistory_entity/LogHistory_entity.aod
index e349a252894be4b6f4ac746ec3b7a9f121716d8f..d68c31fbc8107a5ecffb9e8fab549f4340d552c1 100644
--- a/entity/LogHistory_entity/LogHistory_entity.aod
+++ b/entity/LogHistory_entity/LogHistory_entity.aod
@@ -1,8 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.7">
+<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.8" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.8">
   <name>LogHistory_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <title>Log</title>
+  <grantUpdate v="false" />
   <grantDelete v="false" />
   <iconId>NEON:HISTORY</iconId>
   <imageProcess>%aditoprj%/entity/LogHistory_entity/imageProcess.js</imageProcess>
@@ -90,7 +91,6 @@
     <entityParameter>
       <name>tablenames_param</name>
       <expose v="true" />
-      <triggerRecalculation v="true" />
       <mandatory v="true" />
       <description>PARAMETER</description>
     </entityParameter>
diff --git a/entity/Member_entity/Member_entity.aod b/entity/Member_entity/Member_entity.aod
index 644ffef17a5732f61f21ed1d20aeb429e576fe56..0921bcc6d1d675e6e93f0e44013aa8dbd67f34e0 100644
--- a/entity/Member_entity/Member_entity.aod
+++ b/entity/Member_entity/Member_entity.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.7">
+<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.8" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.8">
   <name>Member_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <title>${SALESPROJECT_MEMBER}</title>
@@ -164,13 +164,11 @@ TODO: intuitive möglichkeit, auf dend Stand aus Relation zurückzusetzen... akt
     <entityParameter>
       <name>ObjectRowId_param</name>
       <expose v="true" />
-      <triggerRecalculation v="true" />
       <description>PARAMETER</description>
     </entityParameter>
     <entityParameter>
       <name>ObjectType_param</name>
       <expose v="true" />
-      <triggerRecalculation v="true" />
       <description>PARAMETER</description>
     </entityParameter>
     <entityConsumer>
@@ -185,7 +183,6 @@ TODO: intuitive möglichkeit, auf dend Stand aus Relation zurückzusetzen... akt
           <name>ObjectType_param</name>
           <valueProcess>%aditoprj%/entity/Member_entity/entityfields/objects/children/objecttype_param/valueProcess.js</valueProcess>
           <expose v="true" />
-          <triggerRecalculation v="true" />
           <mandatory v="true" />
         </entityParameter>
       </children>
diff --git a/entity/Member_entity/fromClauseProcess.js b/entity/Member_entity/fromClauseProcess.js
index edff7462ed28f71c7e85a667f69468eacf1e5af9..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644
--- a/entity/Member_entity/fromClauseProcess.js
+++ b/entity/Member_entity/fromClauseProcess.js
@@ -1,5 +0,0 @@
-import("system.result");
-
-result.string("MEMBER join CONTACT on (CONTACT.CONTACTID = MEMBER.CONTACT_ID) "
-            + "left join ORGANISATION on (ORGANISATION.ORGANISATIONID = CONTACT.ORGANISATION_ID) "
-            + "left join PERSON on (PERSON.PERSONID = CONTACT.PERSON_ID)");
\ No newline at end of file
diff --git a/entity/ModuleTree_entity/ModuleTree_entity.aod b/entity/ModuleTree_entity/ModuleTree_entity.aod
index 37dae997765d3bbe35e97abfa1f10b0ab6f219ac..23d46663cc5e67af385e3a170299439d62afe753 100644
--- a/entity/ModuleTree_entity/ModuleTree_entity.aod
+++ b/entity/ModuleTree_entity/ModuleTree_entity.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.7">
+<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.8" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.8">
   <name>ModuleTree_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <title>History</title>
diff --git a/entity/Notification_entity/Notification_entity.aod b/entity/Notification_entity/Notification_entity.aod
index d4ebfd6e05eca274d8e606401e4bf99765119b2a..b850f824fefd1c0fe7974e6ba16f5d398ae21a0f 100644
--- a/entity/Notification_entity/Notification_entity.aod
+++ b/entity/Notification_entity/Notification_entity.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.7">
+<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.8" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.8">
   <name>Notification_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <title>Notifications</title>
diff --git a/entity/ObjectRelationType_entity/ObjectRelationType_entity.aod b/entity/ObjectRelationType_entity/ObjectRelationType_entity.aod
index 3c309a6583e745e077c48b2610fc6d0f94b8a2f9..d0c14753f16c05a67770f61087f51496daf0372f 100644
--- a/entity/ObjectRelationType_entity/ObjectRelationType_entity.aod
+++ b/entity/ObjectRelationType_entity/ObjectRelationType_entity.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.7">
+<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.8" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.8">
   <name>ObjectRelationType_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <icon>VAADIN:SPLIT</icon>
@@ -23,7 +23,6 @@
     <entityParameter>
       <name>SourceObjectType_param</name>
       <expose v="true" />
-      <triggerRecalculation v="true" />
       <description>PARAMETER</description>
     </entityParameter>
     <entityProvider>
@@ -40,7 +39,6 @@
         <entityParameter>
           <name>SourceObjectType_param</name>
           <expose v="true" />
-          <triggerRecalculation v="true" />
         </entityParameter>
         <entityParameter>
           <name>OnlyFirstSide_param</name>
diff --git a/entity/ObjectRelationType_entity/recordcontainers/jdito/contentProcess.js b/entity/ObjectRelationType_entity/recordcontainers/jdito/contentProcess.js
index e3b5147b2a0d188cc8121b65f5748eb67200edf7..5344cbdce607cc638cfa2edde885fd7da7649b5b 100644
--- a/entity/ObjectRelationType_entity/recordcontainers/jdito/contentProcess.js
+++ b/entity/ObjectRelationType_entity/recordcontainers/jdito/contentProcess.js
@@ -8,5 +8,10 @@ if (vars.exists("$local.idvalues") && vars.get("$local.idvalues"))
 }
 else
 {
-    result.object(ObjectRelationUtils.getPossibleRelationTypes(vars.get("$param.SourceObjectType_param"), true, vars.get("$param.OnlyFirstSide_param") == "1", undefined, true));
+        result.object(ObjectRelationUtils.getPossibleRelationTypes(
+            vars.exists("$param.SourceObjectType_param") ? vars.get("$param.SourceObjectType_param") : undefined,
+            true,
+            (vars.exists("$param.OnlyFirstSide_param") ? vars.get("$param.OnlyFirstSide_param") : "0") == "1",
+            undefined,
+            true));
 }
\ No newline at end of file
diff --git a/entity/ObjectRelationType_entity/recordcontainers/jdito/onInsert.js b/entity/ObjectRelationType_entity/recordcontainers/jdito/onInsert.js
index 9c7155c513a43eef2afadf630ee6b6ef12bad3c9..a1d965ad67fb37dc0b62709e784c8d6b20e5e328 100644
--- a/entity/ObjectRelationType_entity/recordcontainers/jdito/onInsert.js
+++ b/entity/ObjectRelationType_entity/recordcontainers/jdito/onInsert.js
@@ -23,8 +23,7 @@ db.insertData("AB_OBJECTRELATIONTYPE", [
 ]);
 
 if (vars.getString("$field.Type2Enabled_proxy") == "1" 
-    && (vars.get("$field.SOURCE_RELATION_TITLE") != vars.get("$field.DEST_RELATION_TITLE") 
-    && vars.get("$field.SOURCE_OBJECT_TYPE") != vars.get("$field.DEST_OBJECT_TYPE")))
+    && vars.get("$field.SOURCE_RELATION_TITLE") != vars.get("$field.DEST_RELATION_TITLE"))
 {
     db.insertData("AB_OBJECTRELATIONTYPE", [
         "AB_OBJECTRELATIONTYPEID",
diff --git a/entity/ObjectTree_entity/ObjectTree_entity.aod b/entity/ObjectTree_entity/ObjectTree_entity.aod
index 6fac866bdcae94bd2d26fc0a85f9ac2f42098143..acc265e37cecd39a8c996f12a3a39a5d23ce3394 100644
--- a/entity/ObjectTree_entity/ObjectTree_entity.aod
+++ b/entity/ObjectTree_entity/ObjectTree_entity.aod
@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.7">
+<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.8" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.8">
   <name>ObjectTree_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <title>Object relation</title>
-  <grantDeleteProcess>%aditoprj%/entity/ObjectTree_entity/grantDeleteProcess.js</grantDeleteProcess>
+  <grantUpdateProcess>%aditoprj%/entity/ObjectTree_entity/grantUpdateProcess.js</grantUpdateProcess>
   <titlePlural>Relations</titlePlural>
   <recordContainer>jdito</recordContainer>
   <entityFields>
@@ -149,7 +149,6 @@
           <name>ObjectType_param</name>
           <title></title>
           <valueProcess>%aditoprj%/entity/ObjectTree_entity/entityfields/objects/children/objecttype_param/valueProcess.js</valueProcess>
-          <triggerRecalculation v="true" />
         </entityParameter>
         <entityParameter>
           <name>ExcludedObjectIds_param</name>
diff --git a/entity/ObjectTree_entity/grantUpdateProcess.js b/entity/ObjectTree_entity/grantUpdateProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..105ebb440b8a5084799523a1615266a7727dcab4
--- /dev/null
+++ b/entity/ObjectTree_entity/grantUpdateProcess.js
@@ -0,0 +1,26 @@
+import("system.result");
+import("system.neon");
+import("system.vars");
+
+if (vars.exists("$sys.selection") && vars.getString("$sys.selection"))
+{    
+    var selectedRows = vars.get("$sys.selection");
+    var isObjectRelationNode = false;
+    
+    if (selectedRows.length > 0 && selectedRows[0] && selectedRows[0].length > 0 && selectedRows[0][0] == "[")
+    {
+        var uid = JSON.parse(selectedRows[0]);
+        isObjectRelationNode = typeof uid[2] == "string";
+    }  
+
+    if (isObjectRelationNode)
+    {
+        result.string(true)
+    }
+    else
+    {
+        result.string(false)
+    }
+}
+else
+    result.string(false)
\ No newline at end of file
diff --git a/entity/Object_entity/Object_entity.aod b/entity/Object_entity/Object_entity.aod
index 434e477b1fdd70dbe01c74ec9d265e5972ae18c1..38aacf3ee882ff4d486bfe6003ae052abab84d94 100644
--- a/entity/Object_entity/Object_entity.aod
+++ b/entity/Object_entity/Object_entity.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.7">
+<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.8" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.8">
   <name>Object_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <documentation>%aditoprj%/entity/Object_entity/documentation.adoc</documentation>
@@ -19,7 +19,6 @@
     <entityParameter>
       <name>ObjectType_param</name>
       <expose v="true" />
-      <triggerRecalculation v="true" />
       <mandatory v="true" />
       <description>PARAMETER</description>
     </entityParameter>
@@ -70,7 +69,6 @@
         <entityParameter>
           <name>ObjectType_param</name>
           <expose v="true" />
-          <triggerRecalculation v="true" />
           <mandatory v="true" />
         </entityParameter>
         <entityParameter>
@@ -209,7 +207,6 @@
         <entityParameter>
           <name>ObjectType_param</name>
           <expose v="true" />
-          <triggerRecalculation v="true" />
           <mandatory v="true" />
         </entityParameter>
         <entityParameter>
diff --git a/entity/Offer_entity/Offer_entity.aod b/entity/Offer_entity/Offer_entity.aod
index 6ec8fe5d3d7f4fa6545dae454edfa9c65086bf08..b83566310c0b892a02ff9f9d8f90e8f65007e355 100644
--- a/entity/Offer_entity/Offer_entity.aod
+++ b/entity/Offer_entity/Offer_entity.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.7">
+<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.8" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.8">
   <name>Offer_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <documentation>%aditoprj%/entity/Offer_entity/documentation.adoc</documentation>
@@ -101,27 +101,23 @@
           <name>OfferId_param</name>
           <valueProcess>%aditoprj%/entity/Offer_entity/entityfields/offeritems/children/offerid_param/valueProcess.js</valueProcess>
           <expose v="true" />
-          <triggerRecalculation v="true" />
           <mandatory v="true" />
         </entityParameter>
         <entityParameter>
           <name>Currency_param</name>
           <valueProcess>%aditoprj%/entity/Offer_entity/entityfields/offeritems/children/currency_param/valueProcess.js</valueProcess>
           <expose v="true" />
-          <triggerRecalculation v="true" />
         </entityParameter>
         <entityParameter>
           <name>ContactId_param</name>
           <valueProcess>%aditoprj%/entity/Offer_entity/entityfields/offeritems/children/ContactId_param/valueProcess.js</valueProcess>
           <expose v="true" />
-          <triggerRecalculation v="true" />
           <mandatory v="true" />
         </entityParameter>
         <entityParameter>
           <name>OfferStatus_param</name>
           <valueProcess>%aditoprj%/entity/Offer_entity/entityfields/offeritems/children/offerstatus_param/valueProcess.js</valueProcess>
           <expose v="true" />
-          <triggerRecalculation v="true" />
           <mandatory v="true" />
         </entityParameter>
       </children>
@@ -190,7 +186,6 @@
     <entityParameter>
       <name>ContactId_param</name>
       <expose v="true" />
-      <triggerRecalculation v="true" />
       <mandatory v="true" />
       <description>PARAMETER</description>
     </entityParameter>
@@ -203,12 +198,12 @@
     </entityActionField>
     <entityField>
       <name>CONTACT_ORG_ID</name>
-      <title>CONTACT_ORG_ID</title>
+      <title>Company</title>
       <searchable v="false" />
     </entityField>
     <entityField>
       <name>CONTACT_PERSON_ID</name>
-      <title>CONTACT_PERSON_ID</title>
+      <title>Person</title>
       <searchable v="false" />
     </entityField>
     <entityConsumer>
@@ -448,49 +443,42 @@
     <entityParameter>
       <name>OfferCurrency_param</name>
       <expose v="true" />
-      <triggerRecalculation v="true" />
       <mandatory v="false" />
       <description>PARAMETER</description>
     </entityParameter>
     <entityParameter>
       <name>OfferLanguage_param</name>
       <expose v="true" />
-      <triggerRecalculation v="true" />
       <mandatory v="false" />
       <description>PARAMETER</description>
     </entityParameter>
     <entityParameter>
       <name>OfferHeader_param</name>
       <expose v="true" />
-      <triggerRecalculation v="true" />
       <mandatory v="false" />
       <description>PARAMETER</description>
     </entityParameter>
     <entityParameter>
       <name>OfferOriginal_Id_param</name>
       <expose v="true" />
-      <triggerRecalculation v="true" />
       <mandatory v="false" />
       <description>PARAMETER</description>
     </entityParameter>
     <entityParameter>
       <name>OfferAddress_param</name>
       <expose v="true" />
-      <triggerRecalculation v="true" />
       <mandatory v="false" />
       <description>PARAMETER</description>
     </entityParameter>
     <entityParameter>
       <name>OfferCode_param</name>
       <expose v="true" />
-      <triggerRecalculation v="true" />
       <mandatory v="false" />
       <description>PARAMETER</description>
     </entityParameter>
     <entityParameter>
       <name>OfferVersnr_param</name>
       <expose v="true" />
-      <triggerRecalculation v="true" />
       <mandatory v="false" />
       <description>PARAMETER</description>
     </entityParameter>
@@ -683,7 +671,6 @@
         <entityParameter>
           <name>ContactId_param</name>
           <valueProcess>%aditoprj%/entity/Offer_entity/entityfields/objects/children/contactid_param/valueProcess.js</valueProcess>
-          <triggerRecalculation v="true" />
         </entityParameter>
       </children>
     </entityConsumer>
@@ -771,7 +758,6 @@
     <entityParameter>
       <name>ObjectRowId_param</name>
       <expose v="true" />
-      <triggerRecalculation v="true" />
       <description>PARAMETER</description>
     </entityParameter>
     <entityParameter>
@@ -824,7 +810,6 @@
     <entityParameter>
       <name>OfferFooter_param</name>
       <expose v="true" />
-      <triggerRecalculation v="true" />
       <description>PARAMETER</description>
     </entityParameter>
     <entityField>
@@ -905,26 +890,40 @@
       <onDBDelete>%aditoprj%/entity/Offer_entity/recordcontainers/db/onDBDelete.js</onDBDelete>
       <linkInformation>
         <linkInformation>
-          <name>681f6893-d11a-430c-a8ca-87215054d86f</name>
+          <name>69b62a9f-95bf-48be-8891-b6c2524f6ea1</name>
           <tableName>OFFER</tableName>
           <primaryKey>OFFERID</primaryKey>
           <isUIDTable v="true" />
           <readonly v="false" />
         </linkInformation>
         <linkInformation>
-          <name>acdf69f0-c6ad-431a-90c7-5bd0b3dc3d8e</name>
+          <name>d2334c28-1be0-4377-b13a-062bb1613c5a</name>
           <tableName>CONTACT</tableName>
           <primaryKey>CONTACTID</primaryKey>
           <isUIDTable v="false" />
           <readonly v="true" />
         </linkInformation>
         <linkInformation>
-          <name>b129928e-886e-4482-99da-463135008fef</name>
+          <name>16e5d66a-f156-4855-9da4-b9dee497c3f3</name>
           <tableName>SALESPROJECT</tableName>
           <primaryKey>SALESPROJECTID</primaryKey>
           <isUIDTable v="false" />
           <readonly v="true" />
         </linkInformation>
+        <linkInformation>
+          <name>6b708a89-8864-433b-bdec-4edcedb3d7d1</name>
+          <tableName>ORGANISATION</tableName>
+          <primaryKey>ORGANISATIONID</primaryKey>
+          <isUIDTable v="false" />
+          <readonly v="true" />
+        </linkInformation>
+        <linkInformation>
+          <name>4cdfe047-48d0-409e-8b01-e2c1312e8a5b</name>
+          <tableName>PERSON</tableName>
+          <primaryKey>PERSONID</primaryKey>
+          <isUIDTable v="false" />
+          <readonly v="true" />
+        </linkInformation>
       </linkInformation>
       <recordFieldMappings>
         <dbRecordFieldMapping>
@@ -1055,14 +1054,18 @@
           <name>CONTACT_ID.value</name>
           <recordfield>OFFER.CONTACT_ID</recordfield>
         </dbRecordFieldMapping>
-        <dbRecordFieldMapping>
-          <name>CONTACT_ID.displayValue</name>
-          <expression>%aditoprj%/entity/Offer_entity/recordcontainers/db/recordfieldmappings/contact_id.displayvalue/expression.js</expression>
-        </dbRecordFieldMapping>
         <dbRecordFieldMapping>
           <name>LETTERSALUTATION.value</name>
           <recordfield>OFFER.LETTERSALUTATION</recordfield>
         </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>CONTACT_ORG_ID.displayValue</name>
+          <recordfield>ORGANISATION.NAME</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>CONTACT_PERSON_ID.displayValue</name>
+          <expression>%aditoprj%/entity/Offer_entity/recordcontainers/db/recordfieldmappings/contact_person_id.displayvalue/expression.js</expression>
+        </dbRecordFieldMapping>
       </recordFieldMappings>
     </dbRecordContainer>
   </recordContainers>
diff --git a/entity/Offer_entity/entityfields/contact_id/onValidation.js b/entity/Offer_entity/entityfields/contact_id/onValidation.js
index 1497b00d0eae900100739cdf5db6bdd7b65d8957..cd4f2d8bb99c59f2c909a1b7f8d5247db00309a7 100644
--- a/entity/Offer_entity/entityfields/contact_id/onValidation.js
+++ b/entity/Offer_entity/entityfields/contact_id/onValidation.js
@@ -4,7 +4,9 @@ import("system.translate");
 import("system.vars");
 import("Context_lib");
 import("Entity_lib");
+import("Contact_lib");
 
-if (ContextUtils.getCountByContactId(vars.get("$field.OBJECT_TYPE"), ProcessHandlingUtils.getOnValidationValue(vars.get("$field.CONTACT_ID"))) == 0) {
+if (ContactUtils.getContactTypeByContactId(ProcessHandlingUtils.getOnValidationValue(vars.get("$field.CONTACT_ID"))) != 2 && ContextUtils.getCountByContactId(vars.get("$field.OBJECT_TYPE"), ProcessHandlingUtils.getOnValidationValue(vars.get("$field.CONTACT_ID"))) == 0) {
+    logging.log(ContextUtils.getCountByContactId(vars.get("$field.OBJECT_TYPE"), ProcessHandlingUtils.getOnValidationValue(vars.get("$field.CONTACT_ID"))));
     result.string(translate.text("This contact has no possible link."))
 }
\ No newline at end of file
diff --git a/entity/Offer_entity/recordcontainers/db/fromClauseProcess.js b/entity/Offer_entity/recordcontainers/db/fromClauseProcess.js
index 1fd88578ab3b01fffc36b918f8a9ceb951a4f5bd..99dbfd903855059d2b7c9b66a9ae087ffc5abae3 100644
--- a/entity/Offer_entity/recordcontainers/db/fromClauseProcess.js
+++ b/entity/Offer_entity/recordcontainers/db/fromClauseProcess.js
@@ -1,4 +1,7 @@
 import("system.result");
 
-result.string("OFFER left join CONTACT on CONTACTID = CONTACT_ID \n\
-left join SALESPROJECT on SALESPROJECTID = OBJECT_ROWID");
\ No newline at end of file
+result.string("OFFER \n\
+    left join CONTACT on CONTACT.CONTACTID = OFFER.CONTACT_ID \n\
+    left join ORGANISATION on ORGANISATION.ORGANISATIONID = CONTACT.ORGANISATION_ID \n\
+    left join PERSON on PERSON.PERSONID = CONTACT.PERSON_ID \n\
+    left join SALESPROJECT on SALESPROJECT.SALESPROJECTID = OFFER.OBJECT_ROWID");
\ No newline at end of file
diff --git a/entity/Offer_entity/recordcontainers/db/recordfieldmappings/contact_person_id.displayvalue/expression.js b/entity/Offer_entity/recordcontainers/db/recordfieldmappings/contact_person_id.displayvalue/expression.js
new file mode 100644
index 0000000000000000000000000000000000000000..e5f6d2a4902ec5e2ffaa71188b089757bb66701e
--- /dev/null
+++ b/entity/Offer_entity/recordcontainers/db/recordfieldmappings/contact_person_id.displayvalue/expression.js
@@ -0,0 +1,4 @@
+import("Person_lib");
+import("system.result");
+
+result.string(PersUtils.getDisplaySqlExpression());
\ No newline at end of file
diff --git a/entity/Offeritem_entity/Offeritem_entity.aod b/entity/Offeritem_entity/Offeritem_entity.aod
index 5855a86980d2fbad2e4c662fd57c113a1c85b9ce..d65c83bfe0c264e1f3be07ff335a483bfc93287f 100644
--- a/entity/Offeritem_entity/Offeritem_entity.aod
+++ b/entity/Offeritem_entity/Offeritem_entity.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.7">
+<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.8" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.8">
   <name>Offeritem_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <documentation>%aditoprj%/entity/Offeritem_entity/documentation.adoc</documentation>
@@ -16,10 +16,10 @@
     </entityField>
     <entityField>
       <name>DISCOUNT</name>
-      <title>Discount %</title>
+      <title>Discount</title>
       <contentType>NUMBER</contentType>
-      <outputFormat>#,##0.00</outputFormat>
-      <inputFormat>#,##0.00</inputFormat>
+      <outputFormat>0.00'%'</outputFormat>
+      <inputFormat>0.00</inputFormat>
       <onValidation>%aditoprj%/entity/Offeritem_entity/entityfields/discount/onValidation.js</onValidation>
     </entityField>
     <entityField>
@@ -111,27 +111,24 @@
       <name>VAT</name>
       <title>VAT</title>
       <contentType>NUMBER</contentType>
+      <outputFormat>0.00'%'</outputFormat>
       <inputFormat>0.00</inputFormat>
       <state>READONLY</state>
-      <displayValueProcess>%aditoprj%/entity/Offeritem_entity/entityfields/vat/displayValueProcess.js</displayValueProcess>
     </entityField>
     <entityParameter>
       <name>OfferId_param</name>
       <expose v="true" />
-      <triggerRecalculation v="true" />
       <mandatory v="true" />
       <description>PARAMETER</description>
     </entityParameter>
     <entityParameter>
       <name>ContactId_param</name>
       <expose v="true" />
-      <triggerRecalculation v="true" />
       <description>PARAMETER</description>
     </entityParameter>
     <entityParameter>
       <name>Currency_param</name>
       <expose v="true" />
-      <triggerRecalculation v="true" />
       <description>PARAMETER</description>
     </entityParameter>
     <entityField>
@@ -153,7 +150,6 @@
     <entityParameter>
       <name>OfferStatus_param</name>
       <expose v="true" />
-      <triggerRecalculation v="true" />
       <description>PARAMETER</description>
     </entityParameter>
     <entityProvider>
diff --git a/entity/Offeritem_entity/entityfields/vat/displayValueProcess.js b/entity/Offeritem_entity/entityfields/vat/displayValueProcess.js
deleted file mode 100644
index 9ed18437e1748ebc5e978224847214e739b4febd..0000000000000000000000000000000000000000
--- a/entity/Offeritem_entity/entityfields/vat/displayValueProcess.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import("system.text");
-import("system.vars");
-import("system.translate");
-import("system.result");
-
-if (vars.get("$this.value"))
-    result.string(text.formatDouble(vars.get("$this.value"), "0.00") + "%");
diff --git a/entity/Offeritem_entity/recordcontainers/db/conditionProcess.js b/entity/Offeritem_entity/recordcontainers/db/conditionProcess.js
index 810d73b91164b9eee3e9ec78ae7734dfd422b001..155a103a7d45a2dd589c72a6b79bd6c27cc32145 100644
--- a/entity/Offeritem_entity/recordcontainers/db/conditionProcess.js
+++ b/entity/Offeritem_entity/recordcontainers/db/conditionProcess.js
@@ -1,7 +1,9 @@
+import("system.db");
+import("Sql_lib");
 import("system.result");
 import("system.vars");
 
-if(vars.exists("$param.OfferId_param") && vars.get("$param.OfferId_param") != "")
-    result.string("OFFERITEM.OFFER_ID = ('" + vars.get("$param.OfferId_param") + "')");  
-else
-    result.string("");
\ No newline at end of file
+var cond = SqlCondition.begin()
+                       .andPrepareVars("OFFERITEM.OFFER_ID", "$param.OfferId_param")
+
+result.string(db.translateCondition(cond.build("1=1")));
\ No newline at end of file
diff --git a/entity/Options_Entity/Options_Entity.aod b/entity/Options_Entity/Options_Entity.aod
index db10d9f26cac216d35fb5235fd9038aad78e8234..b93f25bcf77fd8ddb95eb8ebb0640ff931220f6e 100644
--- a/entity/Options_Entity/Options_Entity.aod
+++ b/entity/Options_Entity/Options_Entity.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.7">
+<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.8" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.8">
   <name>Options_Entity</name>
   <description></description>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/entity/Order_entity/Order_entity.aod b/entity/Order_entity/Order_entity.aod
index 1a6d4d2ae0a3d8ed7fe4366887d1e51869f60608..1e2f501fdadcb5f0e3288244fc4c419ece95e78e 100644
--- a/entity/Order_entity/Order_entity.aod
+++ b/entity/Order_entity/Order_entity.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.7">
+<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.8" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.8">
   <name>Order_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <documentation>%aditoprj%/entity/Order_entity/documentation.adoc</documentation>
@@ -118,27 +118,23 @@
           <name>OrderId_param</name>
           <valueProcess>%aditoprj%/entity/Order_entity/entityfields/orderitems/children/orderid_param/valueProcess.js</valueProcess>
           <expose v="true" />
-          <triggerRecalculation v="true" />
           <mandatory v="true" />
         </entityParameter>
         <entityParameter>
           <name>Currency_param</name>
           <valueProcess>%aditoprj%/entity/Order_entity/entityfields/orderitems/children/currency_param/valueProcess.js</valueProcess>
           <expose v="true" />
-          <triggerRecalculation v="true" />
         </entityParameter>
         <entityParameter>
           <name>ContactId_param</name>
           <valueProcess>%aditoprj%/entity/Order_entity/entityfields/orderitems/children/ContactId_param/valueProcess.js</valueProcess>
           <expose v="true" />
-          <triggerRecalculation v="true" />
           <mandatory v="true" />
         </entityParameter>
         <entityParameter>
           <name>OrderStatus_param</name>
           <valueProcess>%aditoprj%/entity/Order_entity/entityfields/orderitems/children/orderstatus_param/valueProcess.js</valueProcess>
           <expose v="true" />
-          <triggerRecalculation v="true" />
           <mandatory v="true" />
         </entityParameter>
       </children>
@@ -169,7 +165,6 @@
     <entityParameter>
       <name>SalesprojectId_param</name>
       <expose v="true" />
-      <triggerRecalculation v="true" />
       <mandatory v="false" />
       <description>PARAMETER</description>
     </entityParameter>
@@ -213,18 +208,17 @@
     <entityParameter>
       <name>ContactId_param</name>
       <expose v="true" />
-      <triggerRecalculation v="true" />
       <mandatory v="false" />
       <description>PARAMETER</description>
     </entityParameter>
     <entityField>
       <name>CONTACT_ORG_ID</name>
-      <title>CONTACT_ORG_ID</title>
+      <title>Company</title>
       <searchable v="false" />
     </entityField>
     <entityField>
       <name>CONTACT_PERSON_ID</name>
-      <title>CONTACT_PERSON_ID</title>
+      <title>Person</title>
       <searchable v="false" />
     </entityField>
     <entityConsumer>
@@ -323,28 +317,24 @@
     <entityParameter>
       <name>OrderCurrency_param</name>
       <expose v="true" />
-      <triggerRecalculation v="true" />
       <mandatory v="false" />
       <description>PARAMETER</description>
     </entityParameter>
     <entityParameter>
       <name>OrderLanguage_param</name>
       <expose v="true" />
-      <triggerRecalculation v="true" />
       <mandatory v="false" />
       <description>PARAMETER</description>
     </entityParameter>
     <entityParameter>
       <name>OrderHeader_param</name>
       <expose v="true" />
-      <triggerRecalculation v="true" />
       <mandatory v="false" />
       <description>PARAMETER</description>
     </entityParameter>
     <entityParameter>
       <name>OrderAddress_param</name>
       <expose v="true" />
-      <triggerRecalculation v="true" />
       <mandatory v="false" />
       <description>PARAMETER</description>
     </entityParameter>
@@ -359,7 +349,6 @@
     <entityParameter>
       <name>OfferId_param</name>
       <expose v="true" />
-      <triggerRecalculation v="true" />
       <mandatory v="false" />
       <description>PARAMETER</description>
     </entityParameter>
@@ -494,26 +483,40 @@
       <onDBDelete>%aditoprj%/entity/Order_entity/recordcontainers/db/onDBDelete.js</onDBDelete>
       <linkInformation>
         <linkInformation>
-          <name>c1a83567-58d0-44bd-ae08-14018311a6ae</name>
+          <name>39d6d76d-8c8f-40aa-b2ed-4684de5d0050</name>
           <tableName>SALESORDER</tableName>
           <primaryKey>SALESORDERID</primaryKey>
           <isUIDTable v="true" />
           <readonly v="false" />
         </linkInformation>
         <linkInformation>
-          <name>7d433584-df9f-4b5b-bae4-f3b0a1962d59</name>
+          <name>c67be87c-ef41-4b01-bc74-95c46a101536</name>
           <tableName>CONTACT</tableName>
           <primaryKey>CONTACTID</primaryKey>
           <isUIDTable v="false" />
           <readonly v="true" />
         </linkInformation>
         <linkInformation>
-          <name>33653e5e-df52-413c-9a91-349fd989ab89</name>
+          <name>6c333196-ff8c-4fef-a85f-0fee8e408661</name>
           <tableName>SALESPROJECT</tableName>
           <primaryKey>SALESPROJECTID</primaryKey>
           <isUIDTable v="false" />
           <readonly v="true" />
         </linkInformation>
+        <linkInformation>
+          <name>04cf409d-daeb-41be-ba24-9b7779ac4231</name>
+          <tableName>PERSON</tableName>
+          <primaryKey>PERSONID</primaryKey>
+          <isUIDTable v="false" />
+          <readonly v="true" />
+        </linkInformation>
+        <linkInformation>
+          <name>a807abec-8815-4b57-a039-d53d24b90331</name>
+          <tableName>ORGANISATION</tableName>
+          <primaryKey>ORGANISATIONID</primaryKey>
+          <isUIDTable v="false" />
+          <readonly v="true" />
+        </linkInformation>
       </linkInformation>
       <recordFieldMappings>
         <dbRecordFieldMapping>
@@ -600,6 +603,14 @@
           <name>SALESPROJECT_ID.displayValue</name>
           <recordfield>SALESPROJECT.PROJECTTITLE</recordfield>
         </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>CONTACT_ORG_ID.displayValue</name>
+          <recordfield>ORGANISATION.NAME</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>CONTACT_PERSON_ID.displayValue</name>
+          <expression>%aditoprj%/entity/Order_entity/recordcontainers/db/recordfieldmappings/contact_person_id.displayvalue/expression.js</expression>
+        </dbRecordFieldMapping>
       </recordFieldMappings>
     </dbRecordContainer>
   </recordContainers>
diff --git a/entity/Order_entity/recordcontainers/db/fromClauseProcess.js b/entity/Order_entity/recordcontainers/db/fromClauseProcess.js
index 5972289c6996fa45ee4b680dfa87ef3d2e0c2048..4b856fef61de20128e1110bf14de27b0fa400d97 100644
--- a/entity/Order_entity/recordcontainers/db/fromClauseProcess.js
+++ b/entity/Order_entity/recordcontainers/db/fromClauseProcess.js
@@ -1,4 +1,7 @@
 import("system.result");
 
-result.string("SALESORDER left join CONTACT on CONTACTID = CONTACT_ID \n\
-left join SALESPROJECT on SALESPROJECTID = SALESPROJECT_ID");
\ No newline at end of file
+result.string("SALESORDER \n\
+    left join CONTACT on CONTACT.CONTACTID = SALESORDER.CONTACT_ID \n\
+    left join ORGANISATION on ORGANISATION.ORGANISATIONID = CONTACT.ORGANISATION_ID \n\
+    left join PERSON on PERSON.PERSONID = CONTACT.PERSON_ID \n\
+    left join SALESPROJECT on SALESPROJECTID = SALESPROJECT_ID");
\ No newline at end of file
diff --git a/entity/Order_entity/recordcontainers/db/recordfieldmappings/contact_person_id.displayvalue/expression.js b/entity/Order_entity/recordcontainers/db/recordfieldmappings/contact_person_id.displayvalue/expression.js
new file mode 100644
index 0000000000000000000000000000000000000000..e5f6d2a4902ec5e2ffaa71188b089757bb66701e
--- /dev/null
+++ b/entity/Order_entity/recordcontainers/db/recordfieldmappings/contact_person_id.displayvalue/expression.js
@@ -0,0 +1,4 @@
+import("Person_lib");
+import("system.result");
+
+result.string(PersUtils.getDisplaySqlExpression());
\ No newline at end of file
diff --git a/entity/Orderitem_entity/Orderitem_entity.aod b/entity/Orderitem_entity/Orderitem_entity.aod
index f1e572cd8e213b960543204710dca8c09c2a10c4..85977e91be06a4f902992ebee12798910ead511c 100644
--- a/entity/Orderitem_entity/Orderitem_entity.aod
+++ b/entity/Orderitem_entity/Orderitem_entity.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.7">
+<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.8" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.8">
   <name>Orderitem_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <documentation>%aditoprj%/entity/Orderitem_entity/documentation.adoc</documentation>
@@ -105,20 +105,17 @@
     <entityParameter>
       <name>OrderId_param</name>
       <expose v="true" />
-      <triggerRecalculation v="true" />
       <mandatory v="true" />
       <description>PARAMETER</description>
     </entityParameter>
     <entityParameter>
       <name>ContactId_param</name>
       <expose v="true" />
-      <triggerRecalculation v="true" />
       <description>PARAMETER</description>
     </entityParameter>
     <entityParameter>
       <name>Currency_param</name>
       <expose v="true" />
-      <triggerRecalculation v="true" />
       <description>PARAMETER</description>
     </entityParameter>
     <entityField>
@@ -141,7 +138,6 @@
     <entityParameter>
       <name>OrderStatus_param</name>
       <expose v="true" />
-      <triggerRecalculation v="true" />
       <description>PARAMETER</description>
     </entityParameter>
     <entityProvider>
diff --git a/entity/Organisation_entity/Organisation_entity.aod b/entity/Organisation_entity/Organisation_entity.aod
index e21c7b789ab9ff0d8a218b889a6034a706f47e78..ac2e0d37071ad4bf7f8e7fbc673939e097702481 100644
--- a/entity/Organisation_entity/Organisation_entity.aod
+++ b/entity/Organisation_entity/Organisation_entity.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.7">
+<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.8" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.8">
   <name>Organisation_entity</name>
   <description>former Org</description>
   <majorModelMode>DISTRIBUTED</majorModelMode>
@@ -76,7 +76,6 @@
         <entityParameter>
           <name>RowId_param</name>
           <valueProcess>%aditoprj%/entity/Organisation_entity/entityfields/activities/children/rowid_param/valueProcess.js</valueProcess>
-          <triggerRecalculation v="true" />
         </entityParameter>
         <entityParameter>
           <name>ObjectId_param</name>
@@ -96,7 +95,6 @@
         <entityParameter>
           <name>OrgId_param</name>
           <valueProcess>%aditoprj%/entity/Organisation_entity/entityfields/contact/children/orgid_param/valueProcess.js</valueProcess>
-          <triggerRecalculation v="true" />
         </entityParameter>
       </children>
     </entityConsumer>
@@ -129,7 +127,6 @@
         <entityParameter>
           <name>WithPrivate_param</name>
           <expose v="true" />
-          <triggerRecalculation v="true" />
         </entityParameter>
         <entityParameter>
           <name>ExcludeOrganisationsByPersonId</name>
@@ -160,13 +157,11 @@
         <entityParameter>
           <name>DefaultAddressId_param</name>
           <valueProcess>%aditoprj%/entity/Organisation_entity/entityfields/addresses/children/defaultaddressid_param/valueProcess.js</valueProcess>
-          <triggerRecalculation v="true" />
         </entityParameter>
         <entityParameter>
           <name>ContactId_param</name>
           <valueProcess>%aditoprj%/entity/Organisation_entity/entityfields/addresses/children/contactid_param/valueProcess.js</valueProcess>
           <expose v="false" />
-          <triggerRecalculation v="true" />
         </entityParameter>
       </children>
     </entityConsumer>
@@ -191,7 +186,6 @@
           <name>ContactId_param</name>
           <valueProcess>%aditoprj%/entity/Organisation_entity/entityfields/communications/children/contactid_param/valueProcess.js</valueProcess>
           <expose v="false" />
-          <triggerRecalculation v="true" />
         </entityParameter>
       </children>
     </entityConsumer>
@@ -208,7 +202,6 @@
           <name>ContactId_param</name>
           <valueProcess>%aditoprj%/entity/Organisation_entity/entityfields/contracts/children/contactid_param/valueProcess.js</valueProcess>
           <expose v="false" />
-          <triggerRecalculation v="true" />
           <mandatory v="true" />
         </entityParameter>
       </children>
@@ -225,7 +218,6 @@
           <name>ContactId_param</name>
           <valueProcess>%aditoprj%/entity/Organisation_entity/entityfields/productprices/children/contactid_param/valueProcess.js</valueProcess>
           <expose v="false" />
-          <triggerRecalculation v="false" />
           <mandatory v="true" />
         </entityParameter>
       </children>
@@ -373,12 +365,10 @@
           <name>ObjectRowId_param</name>
           <title></title>
           <valueProcess>%aditoprj%/entity/Organisation_entity/entityfields/attributes/children/objectrowid_param/valueProcess.js</valueProcess>
-          <triggerRecalculation v="true" />
         </entityParameter>
         <entityParameter>
           <name>ObjectType_param</name>
           <valueProcess>%aditoprj%/entity/Organisation_entity/entityfields/attributes/children/objecttype_param/valueProcess.js</valueProcess>
-          <triggerRecalculation v="true" />
         </entityParameter>
       </children>
     </entityConsumer>
@@ -516,7 +506,6 @@
           <name>ContactId_param</name>
           <valueProcess>%aditoprj%/entity/Organisation_entity/entityfields/offers/children/contactid_param/valueProcess.js</valueProcess>
           <expose v="true" />
-          <triggerRecalculation v="true" />
           <mandatory v="true" />
         </entityParameter>
       </children>
@@ -544,7 +533,6 @@
       <name>WithPrivate_param</name>
       <valueProcess>%aditoprj%/entity/Organisation_entity/entityfields/withprivate_param/valueProcess.js</valueProcess>
       <expose v="true" />
-      <triggerRecalculation v="true" />
       <documentation>%aditoprj%/entity/Organisation_entity/entityfields/withprivate_param/documentation.adoc</documentation>
       <description>PARAMETER</description>
     </entityParameter>
@@ -585,7 +573,6 @@
           <name>tablenames_param</name>
           <valueProcess>%aditoprj%/entity/Organisation_entity/entityfields/loghistoryconsumer/children/tablenames_param/valueProcess.js</valueProcess>
           <expose v="true" />
-          <triggerRecalculation v="true" />
           <mandatory v="true" />
         </entityParameter>
       </children>
@@ -724,12 +711,10 @@
         <entityParameter>
           <name>ObjectRowId_param</name>
           <valueProcess>%aditoprj%/entity/Organisation_entity/entityfields/attributetree/children/objectrowid_param/valueProcess.js</valueProcess>
-          <triggerRecalculation v="true" />
         </entityParameter>
         <entityParameter>
           <name>ObjectType_param</name>
           <valueProcess>%aditoprj%/entity/Organisation_entity/entityfields/attributetree/children/objecttype_param/valueProcess.js</valueProcess>
-          <triggerRecalculation v="true" />
         </entityParameter>
       </children>
     </entityConsumer>
@@ -821,17 +806,14 @@
         <entityParameter>
           <name>ObjectRowId_param</name>
           <valueProcess>%aditoprj%/entity/Organisation_entity/entityfields/attributeconditions/children/objectrowid_param/valueProcess.js</valueProcess>
-          <triggerRecalculation v="true" />
         </entityParameter>
         <entityParameter>
           <name>ObjectType_param</name>
           <valueProcess>%aditoprj%/entity/Organisation_entity/entityfields/attributeconditions/children/objecttype_param/valueProcess.js</valueProcess>
-          <triggerRecalculation v="true" />
         </entityParameter>
         <entityParameter>
           <name>DisplaySimpleName_param</name>
           <valueProcess>%aditoprj%/entity/Organisation_entity/entityfields/attributeconditions/children/displaysimplename_param/valueProcess.js</valueProcess>
-          <triggerRecalculation v="true" />
         </entityParameter>
         <entityParameter>
           <name>FilteredAttributeIds_param</name>
@@ -860,21 +842,21 @@
       <onDBUpdate>%aditoprj%/entity/Organisation_entity/recordcontainers/db/onDBUpdate.js</onDBUpdate>
       <linkInformation>
         <linkInformation>
-          <name>f745a13c-6fbe-4cab-99d8-3cb7d599005a</name>
+          <name>5808a4a3-f2c1-4ccd-bad1-4e8a834ec7a4</name>
           <tableName>ORGANISATION</tableName>
           <primaryKey>ORGANISATIONID</primaryKey>
-          <isUIDTable v="true" />
+          <isUIDTable v="false" />
           <readonly v="false" />
         </linkInformation>
         <linkInformation>
-          <name>31f03bd6-83c1-4185-a9a7-4e6d94469fd2</name>
+          <name>5cd93c60-47e5-4eaa-90a4-69990f6a7d00</name>
           <tableName>CONTACT</tableName>
           <primaryKey>CONTACTID</primaryKey>
-          <isUIDTable v="false" />
+          <isUIDTable v="true" />
           <readonly v="false" />
         </linkInformation>
         <linkInformation>
-          <name>695731e1-879d-4fb1-a1bb-56ecfd6f7c03</name>
+          <name>23fa4717-b401-48db-92ed-285aeab71f08</name>
           <tableName>ADDRESS</tableName>
           <primaryKey>ADDRESSID</primaryKey>
           <isUIDTable v="false" />
diff --git a/entity/Organisation_entity/entityfields/360degreeobjects/children/objectrowid_param/valueProcess.js b/entity/Organisation_entity/entityfields/360degreeobjects/children/objectrowid_param/valueProcess.js
index c52b656d2fdd6ac1d409ce40987c4e9149f0b883..1610ade0360e9fab87e7730b6578905eb1e5309e 100644
--- a/entity/Organisation_entity/entityfields/360degreeobjects/children/objectrowid_param/valueProcess.js
+++ b/entity/Organisation_entity/entityfields/360degreeobjects/children/objectrowid_param/valueProcess.js
@@ -1,4 +1,4 @@
 import("system.vars");
 import("system.result");
 
-result.string(vars.getString("$field.ORGANISATIONID"));
\ No newline at end of file
+result.string(vars.getString("$field.CONTACTID"));//TODO: CONTACTID/ORGANISATIONID: review if this should be the CONTACTID or the ORGANISATIONID
\ No newline at end of file
diff --git a/entity/Organisation_entity/entityfields/attributeconditions/children/objectrowid_param/valueProcess.js b/entity/Organisation_entity/entityfields/attributeconditions/children/objectrowid_param/valueProcess.js
index bcfda44fe71eac93b3f8c11cc0c85a496f2cd51c..59af8506d7c8ff241823ba185c646366667521c0 100644
--- a/entity/Organisation_entity/entityfields/attributeconditions/children/objectrowid_param/valueProcess.js
+++ b/entity/Organisation_entity/entityfields/attributeconditions/children/objectrowid_param/valueProcess.js
@@ -1,4 +1,4 @@
 import("system.vars");
 import("system.result");
 
-result.string(vars.get("$field.ORGANISATIONID"));
\ No newline at end of file
+result.string(vars.get("$field.CONTACTID"));//TODO: CONTACTID/ORGANISATIONID: review if this should be the CONTACTID or the ORGANISATIONID
\ No newline at end of file
diff --git a/entity/Organisation_entity/entityfields/attributetree/children/objectrowid_param/valueProcess.js b/entity/Organisation_entity/entityfields/attributetree/children/objectrowid_param/valueProcess.js
index 957f645b377f903d61ab5ecab7a1a48ee34d0eab..59af8506d7c8ff241823ba185c646366667521c0 100644
--- a/entity/Organisation_entity/entityfields/attributetree/children/objectrowid_param/valueProcess.js
+++ b/entity/Organisation_entity/entityfields/attributetree/children/objectrowid_param/valueProcess.js
@@ -1,4 +1,4 @@
-import("system.vars");
-import("system.result");
-
-result.string(vars.get("$field.ORGANISATIONID"));
\ No newline at end of file
+import("system.vars");
+import("system.result");
+
+result.string(vars.get("$field.CONTACTID"));//TODO: CONTACTID/ORGANISATIONID: review if this should be the CONTACTID or the ORGANISATIONID
\ No newline at end of file
diff --git a/entity/Organisation_entity/entityfields/contactid/valueProcess.js b/entity/Organisation_entity/entityfields/contactid/valueProcess.js
index 8c08f09dbe9cede6f76346843dd65528181931c7..86ef789e064a4016f2d12c432498dc23474807aa 100644
--- a/entity/Organisation_entity/entityfields/contactid/valueProcess.js
+++ b/entity/Organisation_entity/entityfields/contactid/valueProcess.js
@@ -1,6 +1,7 @@
+import("system.util");
 import("system.vars");
 import("system.result");
 import("system.neon");
 
 if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW)
-    result.string(vars.get("$field.ORGANISATIONID"));
\ No newline at end of file
+    result.string(util.getNewUUID());
\ No newline at end of file
diff --git a/entity/Organisation_entity/entityfields/newtask/onActionProcess.js b/entity/Organisation_entity/entityfields/newtask/onActionProcess.js
index 1f63a9595bd528908ee2b8731a5ebbc9925c2d45..9bd58b362d48804d508fe385a94ee347b7af57ca 100644
--- a/entity/Organisation_entity/entityfields/newtask/onActionProcess.js
+++ b/entity/Organisation_entity/entityfields/newtask/onActionProcess.js
@@ -1,4 +1,4 @@
 import("system.vars");
 import("ActivityTask_lib");
 
-TaskUtils.createNewTask(vars.get("$field.ORGANISATIONID"));
\ No newline at end of file
+TaskUtils.createNewTask(vars.get("$field.CONTACTID"));//TODO: CONTACTID/ORGANISATIONID: review if this should be the CONTACTID or the ORGANISATIONID
\ No newline at end of file
diff --git a/entity/Organisation_entity/entityfields/objectrelations/children/objectrowid_param/valueProcess.js b/entity/Organisation_entity/entityfields/objectrelations/children/objectrowid_param/valueProcess.js
index bcfda44fe71eac93b3f8c11cc0c85a496f2cd51c..59af8506d7c8ff241823ba185c646366667521c0 100644
--- a/entity/Organisation_entity/entityfields/objectrelations/children/objectrowid_param/valueProcess.js
+++ b/entity/Organisation_entity/entityfields/objectrelations/children/objectrowid_param/valueProcess.js
@@ -1,4 +1,4 @@
 import("system.vars");
 import("system.result");
 
-result.string(vars.get("$field.ORGANISATIONID"));
\ No newline at end of file
+result.string(vars.get("$field.CONTACTID"));//TODO: CONTACTID/ORGANISATIONID: review if this should be the CONTACTID or the ORGANISATIONID
\ No newline at end of file
diff --git a/entity/Organisation_entity/entityfields/salesprojects/children/contactid_param/valueProcess.js b/entity/Organisation_entity/entityfields/salesprojects/children/contactid_param/valueProcess.js
index 835140d0bee877176a6fd5a8e94460e5b5e776d1..7b6137b4d105e9ba592cf8ef6e796fb838a32b09 100644
--- a/entity/Organisation_entity/entityfields/salesprojects/children/contactid_param/valueProcess.js
+++ b/entity/Organisation_entity/entityfields/salesprojects/children/contactid_param/valueProcess.js
@@ -1,3 +1,4 @@
 import("system.vars");
 import("system.result");
-result.string(vars.get("$field.ORGANISATIONID"));
\ No newline at end of file
+
+result.string(vars.get("$field.CONTACTID"));
\ No newline at end of file
diff --git a/entity/Organisation_entity/entityfields/tasks/stateProcess.js b/entity/Organisation_entity/entityfields/tasks/stateProcess.js
index 2d6a0eb24444a21440ea2433c6acd0e252c6e68d..fc227febcf322b829a554a1a953de51435e4db1c 100644
--- a/entity/Organisation_entity/entityfields/tasks/stateProcess.js
+++ b/entity/Organisation_entity/entityfields/tasks/stateProcess.js
@@ -4,7 +4,7 @@ import("system.vars");
 import("ActivityTask_lib");
 import("Context_lib");
 
-if(TaskUtils.hasTasks(vars.get("$field.ORGANISATIONID"), ContextUtils.getCurrentContextId()))
+if(TaskUtils.hasTasks(vars.get("$field.CONTACTID"), ContextUtils.getCurrentContextId()))//TODO: CONTACTID/ORGANISATIONID: review if this should be the CONTACTID or the ORGANISATIONID
     result.string(neon.COMPONENTSTATE_EDITABLE);
 else
     result.string(neon.COMPONENTSTATE_INVISIBLE);
\ No newline at end of file
diff --git a/entity/Organisation_entity/fromClauseProcess.js b/entity/Organisation_entity/fromClauseProcess.js
index fd4f9ce328d42a3ef11efbd7b6454d99d6b3f30c..866a616c6ae9a7c4b96b7afbe773a266009fbe59 100644
--- a/entity/Organisation_entity/fromClauseProcess.js
+++ b/entity/Organisation_entity/fromClauseProcess.js
@@ -1,3 +1,4 @@
 import("system.result");
 
-result.string("ORGANISATION join CONTACT on (ORGANISATION.ORGANISATIONID = CONTACT.ORGANISATION_ID and CONTACT.PERSON_ID is null)");
\ No newline at end of file
+result.string("ORGANISATION \n\
+    join CONTACT on (ORGANISATION.ORGANISATIONID = CONTACT.ORGANISATION_ID and CONTACT.PERSON_ID is null)");
\ No newline at end of file
diff --git a/entity/PermissionDetail_entity/PermissionDetail_entity.aod b/entity/PermissionDetail_entity/PermissionDetail_entity.aod
index 4f49c00083fa4ed69241ed8b60cbbae13e3a3bcc..c85bbb5bfeea2d8dcf8bcb6770807962cd0261e3 100644
--- a/entity/PermissionDetail_entity/PermissionDetail_entity.aod
+++ b/entity/PermissionDetail_entity/PermissionDetail_entity.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.7">
+<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.8" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.8">
   <name>PermissionDetail_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <title>Permission Detail</title>
diff --git a/entity/PermissionMetaData_entity/PermissionMetaData_entity.aod b/entity/PermissionMetaData_entity/PermissionMetaData_entity.aod
index 735f8f741f0cb515a2e5b3b39d0be80d86e0f3ea..0a4fc544a9a1bb2e8bef0b77475806db2ec7e2b6 100644
--- a/entity/PermissionMetaData_entity/PermissionMetaData_entity.aod
+++ b/entity/PermissionMetaData_entity/PermissionMetaData_entity.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.7">
+<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.8" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.8">
   <name>PermissionMetaData_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <icon>VAADIN:CONNECT</icon>
diff --git a/entity/PermissionOverview_entity/PermissionOverview_entity.aod b/entity/PermissionOverview_entity/PermissionOverview_entity.aod
index 859006193ee50014d2a655f558575b5d79e21983..ac436c852402ed3b34168c1016a343fc81b875ee 100644
--- a/entity/PermissionOverview_entity/PermissionOverview_entity.aod
+++ b/entity/PermissionOverview_entity/PermissionOverview_entity.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.7">
+<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.8" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.8">
   <name>PermissionOverview_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <title>Permission Overview</title>
diff --git a/entity/Person_entity/Person_entity.aod b/entity/Person_entity/Person_entity.aod
index 64939000764563609747f46b8b82d5d87568f49a..03d152da50b1dbecdf2fd40697936696a91a4015 100644
--- a/entity/Person_entity/Person_entity.aod
+++ b/entity/Person_entity/Person_entity.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.7">
+<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.8" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.8">
   <name>Person_entity</name>
   <description>former Pers</description>
   <majorModelMode>DISTRIBUTED</majorModelMode>
@@ -72,7 +72,6 @@
     <entityParameter>
       <name>OrgId_param</name>
       <expose v="true" />
-      <triggerRecalculation v="true" />
       <mandatory v="false" />
       <description>PARAMETER</description>
     </entityParameter>
@@ -164,13 +163,11 @@
         <entityParameter>
           <name>DefaultAddressId_param</name>
           <valueProcess>%aditoprj%/entity/Person_entity/entityfields/persaddresses/children/defaultaddressid_param/valueProcess.js</valueProcess>
-          <triggerRecalculation v="true" />
         </entityParameter>
         <entityParameter>
           <name>ContactId_param</name>
           <valueProcess>%aditoprj%/entity/Person_entity/entityfields/persaddresses/children/contactid_param/valueProcess.js</valueProcess>
           <expose v="false" />
-          <triggerRecalculation v="true" />
         </entityParameter>
       </children>
     </entityConsumer>
@@ -186,7 +183,6 @@
           <name>ContactId_param</name>
           <valueProcess>%aditoprj%/entity/Person_entity/entityfields/communications/children/contactid_param/valueProcess.js</valueProcess>
           <expose v="false" />
-          <triggerRecalculation v="true" />
           <description>This parameter is used for specifing a related &amp;quot;CONTACTID&amp;quot; to a COMMUNICATION-entry. 
 Usually this is used for filtering COMMUNICATION-entries by a specified contact or creating a new entry that is related to a contact.</description>
         </entityParameter>
@@ -219,7 +215,6 @@ Usually this is used for filtering COMMUNICATION-entries by a specified contact
           <name>ContactId_param</name>
           <valueProcess>%aditoprj%/entity/Person_entity/entityfields/contracts/children/contactid_param/valueProcess.js</valueProcess>
           <expose v="false" />
-          <triggerRecalculation v="true" />
           <mandatory v="true" />
         </entityParameter>
       </children>
@@ -238,7 +233,6 @@ Usually this is used for filtering COMMUNICATION-entries by a specified contact
           <name>ContactId_param</name>
           <valueProcess>%aditoprj%/entity/Person_entity/entityfields/pricelists/children/contactid_param/valueProcess.js</valueProcess>
           <expose v="false" />
-          <triggerRecalculation v="false" />
           <mandatory v="true" />
         </entityParameter>
       </children>
@@ -296,7 +290,6 @@ Usually this is used for filtering COMMUNICATION-entries by a specified contact
     <entityParameter>
       <name>ContactId_param</name>
       <expose v="true" />
-      <triggerRecalculation v="true" />
       <mandatory v="false" />
       <description>PARAMETER</description>
     </entityParameter>
@@ -354,7 +347,6 @@ Usually this is used for filtering COMMUNICATION-entries by a specified contact
           <name>ContactId_param</name>
           <valueProcess>%aditoprj%/entity/Person_entity/entityfields/orgaddresses/children/contactid_param/valueProcess.js</valueProcess>
           <expose v="false" />
-          <triggerRecalculation v="true" />
         </entityParameter>
         <entityParameter>
           <name>DefaultAddressId_param</name>
@@ -518,7 +510,6 @@ Usually this is used for filtering COMMUNICATION-entries by a specified contact
         <entityParameter>
           <name>Language_param</name>
           <valueProcess>%aditoprj%/entity/Person_entity/entityfields/salutations/children/language_param/valueProcess.js</valueProcess>
-          <triggerRecalculation v="true" />
         </entityParameter>
       </children>
     </entityConsumer>
@@ -534,12 +525,10 @@ Usually this is used for filtering COMMUNICATION-entries by a specified contact
         <entityParameter>
           <name>ObjectRowId_param</name>
           <valueProcess>%aditoprj%/entity/Person_entity/entityfields/attributes/children/objectrowid_param/valueProcess.js</valueProcess>
-          <triggerRecalculation v="true" />
         </entityParameter>
         <entityParameter>
           <name>ObjectType_param</name>
           <valueProcess>%aditoprj%/entity/Person_entity/entityfields/attributes/children/objecttype_param/valueProcess.js</valueProcess>
-          <triggerRecalculation v="true" />
         </entityParameter>
       </children>
     </entityConsumer>
@@ -640,7 +629,6 @@ Usually this is used for filtering COMMUNICATION-entries by a specified contact
         <entityParameter>
           <name>ContactId_param</name>
           <valueProcess>%aditoprj%/entity/Person_entity/entityfields/contactandorganisationaddresses/children/contactid_param/valueProcess.js</valueProcess>
-          <triggerRecalculation v="true" />
         </entityParameter>
         <entityParameter>
           <name>OrganisationId_param</name>
@@ -678,7 +666,6 @@ Usually this is used for filtering COMMUNICATION-entries by a specified contact
           <name>tablenames_param</name>
           <valueProcess>%aditoprj%/entity/Person_entity/entityfields/loghistoryconsumer/children/tablenames_param/valueProcess.js</valueProcess>
           <expose v="true" />
-          <triggerRecalculation v="true" />
           <mandatory v="true" />
         </entityParameter>
       </children>
@@ -774,12 +761,10 @@ Usually this is used for filtering COMMUNICATION-entries by a specified contact
         <entityParameter>
           <name>ObjectRowId_param</name>
           <valueProcess>%aditoprj%/entity/Person_entity/entityfields/attributetree/children/objectrowid_param/valueProcess.js</valueProcess>
-          <triggerRecalculation v="true" />
         </entityParameter>
         <entityParameter>
           <name>ObjectType_param</name>
           <valueProcess>%aditoprj%/entity/Person_entity/entityfields/attributetree/children/objecttype_param/valueProcess.js</valueProcess>
-          <triggerRecalculation v="true" />
         </entityParameter>
       </children>
     </entityConsumer>
@@ -882,7 +867,6 @@ Usually this is used for filtering COMMUNICATION-entries by a specified contact
           <name>PersonId_param</name>
           <valueProcess>%aditoprj%/entity/Person_entity/entityfields/commrestrictions/children/personid_param/valueProcess.js</valueProcess>
           <expose v="true" />
-          <triggerRecalculation v="true" />
           <mandatory v="true" />
         </entityParameter>
       </children>
diff --git a/entity/Person_entity/entityfields/language/valueProcess.js b/entity/Person_entity/entityfields/language/valueProcess.js
index 1af70be4c971c334dbd2b777f26c3f051bd02aa4..44dcbc3f04bb4fc3788fb890bf97db622e520008 100644
--- a/entity/Person_entity/entityfields/language/valueProcess.js
+++ b/entity/Person_entity/entityfields/language/valueProcess.js
@@ -3,5 +3,5 @@ import("system.vars");
 import("system.db");
 import("system.result");
 
-if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && vars.getString("$field.LANGUAGE") == "")
+if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && !vars.getString("$this.value"))
     result.string("deu");
\ No newline at end of file
diff --git a/entity/Person_entity/fromClauseProcess.js b/entity/Person_entity/fromClauseProcess.js
index ce2f7eb850a73316a2aecd84f0ef7c968124d5d9..bea9bd3897f01eb07fe79bc7d953770d17b0a88e 100644
--- a/entity/Person_entity/fromClauseProcess.js
+++ b/entity/Person_entity/fromClauseProcess.js
@@ -1,4 +1,6 @@
 import("system.vars");
 import("system.result");
 
-result.string("PERSON join CONTACT on (CONTACT.PERSON_ID = PERSON.PERSONID) join ORGANISATION on ORGANISATIONID = ORGANISATION_ID ");
\ No newline at end of file
+result.string("PERSON \n\
+    join CONTACT on (CONTACT.PERSON_ID = PERSON.PERSONID) \n\
+    join ORGANISATION on (ORGANISATION.ORGANISATIONID = CONTACT.ORGANISATION_ID) ");
\ No newline at end of file
diff --git a/entity/Person_entity/recordcontainers/db/fromClauseProcess.js b/entity/Person_entity/recordcontainers/db/fromClauseProcess.js
index 96d05d16af027f62abf95a8cb65c6d30b71530cd..ee43318317813db5384c2a13bba96181b447a6be 100644
--- a/entity/Person_entity/recordcontainers/db/fromClauseProcess.js
+++ b/entity/Person_entity/recordcontainers/db/fromClauseProcess.js
@@ -3,5 +3,6 @@ import("system.result");
 
 //ADDRESS is necessary to display standard address fast within contact lists
 result.string("PERSON \n\
-    join CONTACT on (CONTACT.PERSON_ID = PERSON.PERSONID) join ORGANISATION on ORGANISATIONID = ORGANISATION_ID\n\
+    join CONTACT on (CONTACT.PERSON_ID = PERSON.PERSONID) \n\
+    join ORGANISATION on (ORGANISATION.ORGANISATIONID = CONTACT.ORGANISATION_ID) \n\
     left join ADDRESS on (ADDRESS.ADDRESSID = CONTACT.ADDRESS_ID)");
\ No newline at end of file
diff --git a/entity/Prod2prod_entity/Prod2prod_entity.aod b/entity/Prod2prod_entity/Prod2prod_entity.aod
index 2f761efb4e97d3fcec2b4fabfd8a6c8899048f49..e7e2b6362f099256302d0fde50550f5cd73fa09f 100644
--- a/entity/Prod2prod_entity/Prod2prod_entity.aod
+++ b/entity/Prod2prod_entity/Prod2prod_entity.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.7">
+<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.8" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.8">
   <name>Prod2prod_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <documentation>%aditoprj%/entity/Prod2prod_entity/documentation.adoc</documentation>
@@ -50,7 +50,6 @@
     <entityParameter>
       <name>ProductId_param</name>
       <expose v="true" />
-      <triggerRecalculation v="true" />
       <description>PARAMETER</description>
     </entityParameter>
     <entityField>
diff --git a/entity/Product_entity/Product_entity.aod b/entity/Product_entity/Product_entity.aod
index 1622ede9a651c92be17af4371eef94f69c577d2d..eb95bd1a677a88d5454600e586044a60cec80ab5 100644
--- a/entity/Product_entity/Product_entity.aod
+++ b/entity/Product_entity/Product_entity.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.7">
+<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.8" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.8">
   <name>Product_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <documentation>%aditoprj%/entity/Product_entity/documentation.adoc</documentation>
@@ -66,6 +66,7 @@
       <title>Unit</title>
       <consumer>KeywordQuantityUnits</consumer>
       <mandatory v="true" />
+      <valueProcess>%aditoprj%/entity/Product_entity/entityfields/unit/valueProcess.js</valueProcess>
       <displayValueProcess>%aditoprj%/entity/Product_entity/entityfields/unit/displayValueProcess.js</displayValueProcess>
     </entityField>
     <entityField>
@@ -185,7 +186,6 @@
           <name>ProductId_param</name>
           <valueProcess>%aditoprj%/entity/Product_entity/entityfields/productlinks/children/productid_param/valueProcess.js</valueProcess>
           <expose v="true" />
-          <triggerRecalculation v="true" />
           <mandatory v="true" />
         </entityParameter>
       </children>
@@ -280,6 +280,7 @@
       <consumer>Languages</consumer>
       <searchable v="false" />
       <titleProcess>%aditoprj%/entity/Product_entity/entityfields/language/titleProcess.js</titleProcess>
+      <valueProcess>%aditoprj%/entity/Product_entity/entityfields/language/valueProcess.js</valueProcess>
       <displayValueProcess>%aditoprj%/entity/Product_entity/entityfields/language/displayValueProcess.js</displayValueProcess>
     </entityField>
     <entityConsumer>
@@ -395,12 +396,10 @@
         <entityParameter>
           <name>ObjectRowId_param</name>
           <valueProcess>%aditoprj%/entity/Product_entity/entityfields/attributetree/children/objectrowid_param/valueProcess.js</valueProcess>
-          <triggerRecalculation v="true" />
         </entityParameter>
         <entityParameter>
           <name>ObjectType_param</name>
           <valueProcess>%aditoprj%/entity/Product_entity/entityfields/attributetree/children/objecttype_param/valueProcess.js</valueProcess>
-          <triggerRecalculation v="true" />
         </entityParameter>
       </children>
     </entityConsumer>
@@ -459,12 +458,26 @@
       <onDBDelete>%aditoprj%/entity/Product_entity/recordcontainers/db/onDBDelete.js</onDBDelete>
       <linkInformation>
         <linkInformation>
-          <name>67ca4a6c-a613-4ee7-bd9d-6ebc17c43944</name>
+          <name>0c8977f6-8d3d-4377-adb4-3ddde463ab1a</name>
           <tableName>PRODUCT</tableName>
           <primaryKey>PRODUCTID</primaryKey>
           <isUIDTable v="true" />
           <readonly v="false" />
         </linkInformation>
+        <linkInformation>
+          <name>6d77303b-6d0f-4636-b230-bb498470eec7</name>
+          <tableName>CONTACT</tableName>
+          <primaryKey>CONTACTID</primaryKey>
+          <isUIDTable v="false" />
+          <readonly v="true" />
+        </linkInformation>
+        <linkInformation>
+          <name>a4cc4ee2-e913-4c1a-bfe8-bdd83ccb3b5e</name>
+          <tableName>ORGANISATION</tableName>
+          <primaryKey>ORGANISATIONID</primaryKey>
+          <isUIDTable v="false" />
+          <readonly v="true" />
+        </linkInformation>
       </linkInformation>
       <recordFieldMappings>
         <dbRecordFieldMapping>
@@ -543,6 +556,10 @@
           <name>DATE_EDIT.value</name>
           <recordfield>PRODUCT.DATE_EDIT</recordfield>
         </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>CONTACT_ID.displayValue</name>
+          <recordfield>ORGANISATION.NAME</recordfield>
+        </dbRecordFieldMapping>
       </recordFieldMappings>
     </dbRecordContainer>
   </recordContainers>
diff --git a/entity/Product_entity/entityfields/language/valueProcess.js b/entity/Product_entity/entityfields/language/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..fef47cfe6e7315f7dad5f4864bbe69e1276f7f38
--- /dev/null
+++ b/entity/Product_entity/entityfields/language/valueProcess.js
@@ -0,0 +1,7 @@
+import("system.neon");
+import("system.vars");
+import("system.db");
+import("system.result");
+
+if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && !vars.getString("$field.LANGUAGE"))
+    result.string("deu");
\ No newline at end of file
diff --git a/entity/Product_entity/entityfields/unit/valueProcess.js b/entity/Product_entity/entityfields/unit/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..680bcb0016ceba4de1b98d2b92924a820ba2bc4d
--- /dev/null
+++ b/entity/Product_entity/entityfields/unit/valueProcess.js
@@ -0,0 +1,8 @@
+import("system.neon");
+import("system.vars");
+import("system.db");
+import("system.result");
+import("KeywordRegistry_basic");
+
+if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && !vars.getString("$this.value"))
+    result.string($KeywordRegistry.quantityUnit$pieces());
\ No newline at end of file
diff --git a/entity/Product_entity/recordcontainers/db/fromClauseProcess.js b/entity/Product_entity/recordcontainers/db/fromClauseProcess.js
index 18cb9431c0932a67570dba8ae0f22b0de85e3e9e..40deb580b141603aec2649fd0a75d35f3d8a1b2b 100644
--- a/entity/Product_entity/recordcontainers/db/fromClauseProcess.js
+++ b/entity/Product_entity/recordcontainers/db/fromClauseProcess.js
@@ -1,4 +1,5 @@
 import("system.result");
 
-result.string("PRODUCT left join CONTACT on CONTACT.CONTACTID = PRODUCT.CONTACT_ID \n\
-left join ORGANISATION on ORGANISATION.ORGANISATIONID = CONTACT.ORGANISATION_ID");
\ No newline at end of file
+result.string("PRODUCT \n\
+    left join CONTACT on CONTACT.CONTACTID = PRODUCT.CONTACT_ID \n\
+    left join ORGANISATION on ORGANISATION.ORGANISATIONID = CONTACT.ORGANISATION_ID");
\ No newline at end of file
diff --git a/entity/Productprice_entity/Productprice_entity.aod b/entity/Productprice_entity/Productprice_entity.aod
index 9fe2e97fcc940a603c2b99bedc86f0863317ea11..e45c613aa87e47a9393c254cfb4abfb07fa67268 100644
--- a/entity/Productprice_entity/Productprice_entity.aod
+++ b/entity/Productprice_entity/Productprice_entity.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.7">
+<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.8" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.8">
   <name>Productprice_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <documentation>%aditoprj%/entity/Productprice_entity/documentation.adoc</documentation>
@@ -105,14 +105,12 @@
     <entityParameter>
       <name>ProductId_param</name>
       <expose v="true" />
-      <triggerRecalculation v="true" />
       <mandatory v="false" />
       <description>PARAMETER</description>
     </entityParameter>
     <entityParameter>
       <name>ContactId_param</name>
       <expose v="true" />
-      <triggerRecalculation v="true" />
       <mandatory v="false" />
       <description>PARAMETER</description>
     </entityParameter>
diff --git a/entity/Productprice_entity/recordcontainers/db/conditionProcess.js b/entity/Productprice_entity/recordcontainers/db/conditionProcess.js
index 0019feb30c21ff68602d2db757f5c8cab5c626e6..6dfa481d2964da773d5bb96a89928c1474f2c877 100644
--- a/entity/Productprice_entity/recordcontainers/db/conditionProcess.js
+++ b/entity/Productprice_entity/recordcontainers/db/conditionProcess.js
@@ -8,4 +8,4 @@ var cond = SqlCondition.begin()
                        .andPrepareVars("PRODUCTPRICE.CONTACT_ID", "$param.ContactId_param");
                        
 //TODO: use a preparedCondition when available #1030812 #1034026
-result.string(db.translateCondition(cond.build("1 = 2")));
\ No newline at end of file
+result.string(db.translateCondition(cond.build("1 = 1")));
\ No newline at end of file
diff --git a/entity/Role_entity/Role_entity.aod b/entity/Role_entity/Role_entity.aod
index 3b82d36323afe1f3e4fbe73fad094c7bf63b5ec0..3ff601b2a139f8ba3a1ac486dc21e4033bb8038d 100644
--- a/entity/Role_entity/Role_entity.aod
+++ b/entity/Role_entity/Role_entity.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.7">
+<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.8" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.8">
   <name>Role_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <icon>VAADIN:USER_CHECK</icon>
diff --git a/entity/SalesprojectAnalyses_entity/SalesprojectAnalyses_entity.aod b/entity/SalesprojectAnalyses_entity/SalesprojectAnalyses_entity.aod
index 3f624271fb92529e8a78967f4dc96ef79cd51340..6f1edfeb29534e11941f27cd63779633e43944fc 100644
--- a/entity/SalesprojectAnalyses_entity/SalesprojectAnalyses_entity.aod
+++ b/entity/SalesprojectAnalyses_entity/SalesprojectAnalyses_entity.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.7">
+<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.8" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.8">
   <name>SalesprojectAnalyses_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <documentation>%aditoprj%/entity/SalesprojectAnalyses_entity/documentation.adoc</documentation>
diff --git a/entity/SalesprojectMilestone_entity/SalesprojectMilestone_entity.aod b/entity/SalesprojectMilestone_entity/SalesprojectMilestone_entity.aod
index d9ad0461fbde4c67796c623da51276fba04f23d1..08b05153f37a910cb6c95f53527a8fb09109b4a2 100644
--- a/entity/SalesprojectMilestone_entity/SalesprojectMilestone_entity.aod
+++ b/entity/SalesprojectMilestone_entity/SalesprojectMilestone_entity.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.7">
+<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.8" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.8">
   <name>SalesprojectMilestone_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <title></title>
@@ -52,7 +52,6 @@
     <entityParameter>
       <name>SalesprojectId_param</name>
       <expose v="true" />
-      <triggerRecalculation v="true" />
       <mandatory v="true" />
       <description>PARAMETER</description>
     </entityParameter>
diff --git a/entity/SalesprojectPhase_entity/SalesprojectPhase_entity.aod b/entity/SalesprojectPhase_entity/SalesprojectPhase_entity.aod
new file mode 100644
index 0000000000000000000000000000000000000000..20d329a42037cbec6fdae0ee7c1c625af9c54ad2
--- /dev/null
+++ b/entity/SalesprojectPhase_entity/SalesprojectPhase_entity.aod
@@ -0,0 +1,54 @@
+<?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.8" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.8">
+  <name>SalesprojectPhase_entity</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <title>Phase</title>
+  <titlePlural>Phases</titlePlural>
+  <recordContainer>jdito</recordContainer>
+  <entityFields>
+    <entityProvider>
+      <name>#PROVIDER</name>
+    </entityProvider>
+    <entityParameter>
+      <name>CurrentPhase_param</name>
+      <expose v="true" />
+    </entityParameter>
+    <entityField>
+      <name>UID</name>
+    </entityField>
+    <entityField>
+      <name>TITLE</name>
+    </entityField>
+    <entityField>
+      <name>ICON</name>
+      <contentType>IMAGE</contentType>
+    </entityField>
+    <entityField>
+      <name>STATE</name>
+    </entityField>
+    <entityProvider>
+      <name>Phases</name>
+      <dependencies>
+        <entityDependency>
+          <name>22c52a24-f1ad-4035-9567-1b5e99c7b5be</name>
+          <entityName>Salesproject_entity</entityName>
+          <fieldName>SalesprojectPhaseStepper</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+      </dependencies>
+    </entityProvider>
+  </entityFields>
+  <recordContainers>
+    <jDitoRecordContainer>
+      <name>jdito</name>
+      <jDitoRecordAlias>Data_alias</jDitoRecordAlias>
+      <contentProcess>%aditoprj%/entity/SalesprojectPhase_entity/recordcontainers/jdito/contentProcess.js</contentProcess>
+      <recordFields>
+        <element>UID.value</element>
+        <element>STATE.value</element>
+        <element>TITLE.value</element>
+        <element>ICON.value</element>
+      </recordFields>
+    </jDitoRecordContainer>
+  </recordContainers>
+</entity>
diff --git a/entity/SalesprojectPhase_entity/recordcontainers/jdito/contentProcess.js b/entity/SalesprojectPhase_entity/recordcontainers/jdito/contentProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..38fe36fcf5a06ce3ad5c65dfa486ebd6fdf70f36
--- /dev/null
+++ b/entity/SalesprojectPhase_entity/recordcontainers/jdito/contentProcess.js
@@ -0,0 +1,30 @@
+import("system.logging");
+import("Sql_lib");
+import("system.db");
+import("Keyword_lib");
+import("KeywordRegistry_basic");
+import("system.result");
+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])
+{
+    if (selection.length > 0)
+        res.push([stepId, selection.indexOf(stepId) > -1  ? "ACTIVE" : "EDITABLE", title, _getIcon(stepId)]);
+    else
+        res.push([stepId, stepId === selected ? "ACTIVE" : "EDITABLE", title, _getIcon(stepId)]);
+});
+logging.log(res.toSource())
+result.object(res);
+
+function _getIcon (pPhase)
+{
+    var phaseIconAttr = new KeywordAttribute($KeywordRegistry.salesprojectPhase(), "icon", "VAADIN:BOOK_DOLLAR");
+    return phaseIconAttr.getValue(pPhase);
+}
\ No newline at end of file
diff --git a/entity/SalesprojectSource_entity/SalesprojectSource_entity.aod b/entity/SalesprojectSource_entity/SalesprojectSource_entity.aod
index 950e10b5c26d830b65b9e94645c65462fba2f772..cce18079de31c377a2a8783e25551be0e1cead4f 100644
--- a/entity/SalesprojectSource_entity/SalesprojectSource_entity.aod
+++ b/entity/SalesprojectSource_entity/SalesprojectSource_entity.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.7">
+<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.8" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.8">
   <name>SalesprojectSource_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <title>Touchpoint</title>
@@ -31,7 +31,6 @@
     <entityParameter>
       <name>SalesprojectId_param</name>
       <expose v="true" />
-      <triggerRecalculation v="true" />
       <mandatory v="true" />
       <description>PARAMETER</description>
     </entityParameter>
diff --git a/entity/Salesproject_entity/Salesproject_entity.aod b/entity/Salesproject_entity/Salesproject_entity.aod
index 2f53f4fdd52245c313896d6feb94338e8d809412..2885c8c71d50dadbc3a4dfe136ecefa1ef01e84c 100644
--- a/entity/Salesproject_entity/Salesproject_entity.aod
+++ b/entity/Salesproject_entity/Salesproject_entity.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.7">
+<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.8" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.8">
   <name>Salesproject_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <title>Salesproject</title>
@@ -45,8 +45,9 @@
     <entityField>
       <name>PHASE</name>
       <title>Phase</title>
-      <consumer>KeywordPhases</consumer>
+      <consumer>SalesprojectPhaseStepper</consumer>
       <mandatory v="true" />
+      <state>EDITABLE</state>
       <valueProcess>%aditoprj%/entity/Salesproject_entity/entityfields/phase/valueProcess.js</valueProcess>
       <displayValueProcess>%aditoprj%/entity/Salesproject_entity/entityfields/phase/displayValueProcess.js</displayValueProcess>
     </entityField>
@@ -134,7 +135,6 @@
         <entityParameter>
           <name>SalesprojectId_param</name>
           <valueProcess>%aditoprj%/entity/Salesproject_entity/entityfields/salesprojectsources/children/salesprojectid_param/valueProcess.js</valueProcess>
-          <triggerRecalculation v="true" />
         </entityParameter>
       </children>
     </entityConsumer>
@@ -149,7 +149,6 @@
         <entityParameter>
           <name>SalesprojectId_param</name>
           <valueProcess>%aditoprj%/entity/Salesproject_entity/entityfields/salesprojectphasemilestones/children/salesprojectid_param/valueProcess.js</valueProcess>
-          <triggerRecalculation v="true" />
         </entityParameter>
       </children>
     </entityConsumer>
@@ -165,13 +164,11 @@
           <name>ObjectType_param</name>
           <valueProcess>%aditoprj%/entity/Salesproject_entity/entityfields/forecasts/children/objecttype_param/valueProcess.js</valueProcess>
           <expose v="true" />
-          <triggerRecalculation v="true" />
         </entityParameter>
         <entityParameter>
           <name>ObjectRowId_param</name>
           <valueProcess>%aditoprj%/entity/Salesproject_entity/entityfields/forecasts/children/objectrowid_param/valueProcess.js</valueProcess>
           <expose v="true" />
-          <triggerRecalculation v="true" />
         </entityParameter>
       </children>
     </entityConsumer>
@@ -188,13 +185,11 @@
           <name>ObjectRowId_param</name>
           <valueProcess>%aditoprj%/entity/Salesproject_entity/entityfields/competitions/children/objectrowid_param/valueProcess.js</valueProcess>
           <expose v="true" />
-          <triggerRecalculation v="true" />
         </entityParameter>
         <entityParameter>
           <name>ObjectType_param</name>
           <valueProcess>%aditoprj%/entity/Salesproject_entity/entityfields/competitions/children/objecttype_param/valueProcess.js</valueProcess>
           <expose v="true" />
-          <triggerRecalculation v="true" />
         </entityParameter>
       </children>
     </entityConsumer>
@@ -210,13 +205,11 @@
           <name>ObjectRowId_param</name>
           <valueProcess>%aditoprj%/entity/Salesproject_entity/entityfields/offers/children/objectrowid_param/valueProcess.js</valueProcess>
           <expose v="true" />
-          <triggerRecalculation v="true" />
         </entityParameter>
         <entityParameter>
           <name>ObjectType_param</name>
           <valueProcess>%aditoprj%/entity/Salesproject_entity/entityfields/offers/children/objecttype_param/valueProcess.js</valueProcess>
           <expose v="true" />
-          <triggerRecalculation v="true" />
         </entityParameter>
       </children>
     </entityConsumer>
@@ -231,17 +224,14 @@
         <entityParameter>
           <name>PresetLinks_param</name>
           <valueProcess>%aditoprj%/entity/Salesproject_entity/entityfields/activities/children/presetlinks_param/valueProcess.js</valueProcess>
-          <triggerRecalculation v="true" />
         </entityParameter>
         <entityParameter>
           <name>RowId_param</name>
           <valueProcess>%aditoprj%/entity/Salesproject_entity/entityfields/activities/children/rowid_param/valueProcess.js</valueProcess>
-          <triggerRecalculation v="true" />
         </entityParameter>
         <entityParameter>
           <name>ObjectId_param</name>
           <valueProcess>%aditoprj%/entity/Salesproject_entity/entityfields/activities/children/objectid_param/valueProcess.js</valueProcess>
-          <triggerRecalculation v="true" />
         </entityParameter>
       </children>
     </entityConsumer>
@@ -257,13 +247,11 @@
           <name>ObjectRowId_param</name>
           <valueProcess>%aditoprj%/entity/Salesproject_entity/entityfields/members/children/objectrowid_param/valueProcess.js</valueProcess>
           <expose v="true" />
-          <triggerRecalculation v="true" />
         </entityParameter>
         <entityParameter>
           <name>ObjectType_param</name>
           <valueProcess>%aditoprj%/entity/Salesproject_entity/entityfields/members/children/objecttype_param/valueProcess.js</valueProcess>
           <expose v="true" />
-          <triggerRecalculation v="true" />
         </entityParameter>
       </children>
     </entityConsumer>
@@ -286,12 +274,10 @@
         <entityParameter>
           <name>ObjectId_param</name>
           <valueProcess>%aditoprj%/entity/Salesproject_entity/entityfields/timetrackings/children/objectid_param/valueProcess.js</valueProcess>
-          <triggerRecalculation v="true" />
         </entityParameter>
         <entityParameter>
           <name>RowId_param</name>
           <valueProcess>%aditoprj%/entity/Salesproject_entity/entityfields/timetrackings/children/rowid_param/valueProcess.js</valueProcess>
-          <triggerRecalculation v="true" />
         </entityParameter>
       </children>
     </entityConsumer>
@@ -400,8 +386,6 @@
       <name>KeywordPhases</name>
       <dependency>
         <name>dependency</name>
-        <entityName>KeywordEntry_entity</entityName>
-        <fieldName>SpecificContainerKeywords</fieldName>
       </dependency>
       <children>
         <entityParameter>
@@ -646,6 +630,20 @@
         </entityParameter>
       </children>
     </entityConsumer>
+    <entityConsumer>
+      <name>SalesprojectPhaseStepper</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>SalesprojectPhase_entity</entityName>
+        <fieldName>Phases</fieldName>
+      </dependency>
+      <children>
+        <entityParameter>
+          <name>CurrentPhase_param</name>
+          <valueProcess>%aditoprj%/entity/Salesproject_entity/entityfields/salesprojectphasestepper/children/currentphase_param/valueProcess.js</valueProcess>
+        </entityParameter>
+      </children>
+    </entityConsumer>
   </entityFields>
   <recordContainers>
     <dbRecordContainer>
diff --git a/entity/Salesproject_entity/entityfields/keywordphases/children/containername_param/valueProcess.js b/entity/Salesproject_entity/entityfields/keywordphases/children/containername_param/valueProcess.js
deleted file mode 100644
index d74e92060b4f3939402f40b792aee139e5f73b00..0000000000000000000000000000000000000000
--- a/entity/Salesproject_entity/entityfields/keywordphases/children/containername_param/valueProcess.js
+++ /dev/null
@@ -1,5 +0,0 @@
-import("system.result");
-import("Keyword_lib");
-import("KeywordRegistry_basic");
-
-result.string($KeywordRegistry.salesprojectPhase());
diff --git a/entity/Salesproject_entity/entityfields/salesprojectphasestepper/children/currentphase_param/valueProcess.js b/entity/Salesproject_entity/entityfields/salesprojectphasestepper/children/currentphase_param/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..7d27814e727ef51078645ba0c65fa52b22dc4a3d
--- /dev/null
+++ b/entity/Salesproject_entity/entityfields/salesprojectphasestepper/children/currentphase_param/valueProcess.js
@@ -0,0 +1,4 @@
+import("system.vars");
+import("system.result");
+
+result.string(vars.get("$field.PHASE"));
\ No newline at end of file
diff --git a/entity/Salesproject_entity/recordcontainers/db/fromClauseProcess.js b/entity/Salesproject_entity/recordcontainers/db/fromClauseProcess.js
index 18dead55d190447fd1b51dc319abe52f8479776a..3537c33492c3ea6e636b0fd9970e90d681ba6291 100644
--- a/entity/Salesproject_entity/recordcontainers/db/fromClauseProcess.js
+++ b/entity/Salesproject_entity/recordcontainers/db/fromClauseProcess.js
@@ -1,4 +1,6 @@
 import("system.vars");
 import("system.result");
 
-result.string("SALESPROJECT left join ORGANISATION on CONTACT_ID = ORGANISATIONID ");
\ No newline at end of file
+result.string("SALESPROJECT \n\
+    left join CONTACT on (SALESPROJECT.CONTACT_ID = CONTACT.CONTACTID) \n\
+    left join ORGANISATION on (CONTACT.ORGANISATION_ID = ORGANISATION.ORGANISATIONID)");
\ No newline at end of file
diff --git a/entity/SalutationDistinct_entity/SalutationDistinct_entity.aod b/entity/SalutationDistinct_entity/SalutationDistinct_entity.aod
index a3aff9b8bd464e2612795ee4890616452ac3b8cb..0a6a256317f22fd7de2b5b8d62e88096003d13f1 100644
--- a/entity/SalutationDistinct_entity/SalutationDistinct_entity.aod
+++ b/entity/SalutationDistinct_entity/SalutationDistinct_entity.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.7">
+<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.8" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.8">
   <name>SalutationDistinct_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <contentTitleProcess>%aditoprj%/entity/SalutationDistinct_entity/contentTitleProcess.js</contentTitleProcess>
@@ -17,7 +17,6 @@
         <entityParameter>
           <name>Language_param</name>
           <expose v="true" />
-          <triggerRecalculation v="true" />
         </entityParameter>
       </children>
     </entityProvider>
diff --git a/entity/SalutationTitleDistinct_entity/SalutationTitleDistinct_entity.aod b/entity/SalutationTitleDistinct_entity/SalutationTitleDistinct_entity.aod
index 4cac488db7cef13e591570e6c29c519156d4e11a..40fc7c5802eecae6db4771dd50266ac372c66080 100644
--- a/entity/SalutationTitleDistinct_entity/SalutationTitleDistinct_entity.aod
+++ b/entity/SalutationTitleDistinct_entity/SalutationTitleDistinct_entity.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.7">
+<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.8" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.8">
   <name>SalutationTitleDistinct_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <contentTitleProcess>%aditoprj%/entity/SalutationTitleDistinct_entity/contentTitleProcess.js</contentTitleProcess>
@@ -22,12 +22,10 @@
         <entityParameter>
           <name>Language_param</name>
           <expose v="true" />
-          <triggerRecalculation v="true" />
         </entityParameter>
         <entityParameter>
           <name>Salutation_param</name>
           <expose v="true" />
-          <triggerRecalculation v="true" />
         </entityParameter>
       </children>
     </entityProvider>
diff --git a/entity/Salutation_entity/Salutation_entity.aod b/entity/Salutation_entity/Salutation_entity.aod
index 5dca28e87312a6aa0df7b97b8022b6083e434e1a..2520d3835bd2fe79017253f489a093b57e25d285 100644
--- a/entity/Salutation_entity/Salutation_entity.aod
+++ b/entity/Salutation_entity/Salutation_entity.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.7">
+<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.8" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.8">
   <name>Salutation_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <title>Salutation</title>
diff --git a/entity/Social_entity/Social_entity.aod b/entity/Social_entity/Social_entity.aod
index 35128b37f5d02de38162ae98e5e102712be6dbd4..475990d3b8f7eac3b1c8e26f0514ab17acd6031d 100644
--- a/entity/Social_entity/Social_entity.aod
+++ b/entity/Social_entity/Social_entity.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.7">
+<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.8" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.8">
   <name>Social_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <title>Social Media</title>
diff --git a/entity/Stock_entity/Stock_entity.aod b/entity/Stock_entity/Stock_entity.aod
index 62f6af1d845db1443d3ca543fbbb3a7292ce5023..9ab05b379c2dff4ae500cdc65982f9b7fa9ebd35 100644
--- a/entity/Stock_entity/Stock_entity.aod
+++ b/entity/Stock_entity/Stock_entity.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.7">
+<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.8" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.8">
   <name>Stock_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <documentation>%aditoprj%/entity/Stock_entity/documentation.adoc</documentation>
@@ -88,7 +88,6 @@
     <entityParameter>
       <name>ProductId_param</name>
       <expose v="true" />
-      <triggerRecalculation v="true" />
       <description>PARAMETER</description>
     </entityParameter>
     <entityProvider>
diff --git a/entity/TaskLink_entity/TaskLink_entity.aod b/entity/TaskLink_entity/TaskLink_entity.aod
index 0b6531eaad9ab494e2ce700374d240324de591eb..81535cc22679535d2b5e00c8929ed1f42a59107e 100644
--- a/entity/TaskLink_entity/TaskLink_entity.aod
+++ b/entity/TaskLink_entity/TaskLink_entity.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.7">
+<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.8" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.8">
   <name>TaskLink_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <title>Connection</title>
@@ -74,7 +74,6 @@
         <entityParameter>
           <name>ObjectType_param</name>
           <valueProcess>%aditoprj%/entity/TaskLink_entity/entityfields/objects/children/objecttype_param/valueProcess.js</valueProcess>
-          <triggerRecalculation v="true" />
         </entityParameter>
       </children>
     </entityConsumer>
diff --git a/entity/Task_entity/Task_entity.aod b/entity/Task_entity/Task_entity.aod
index 0551f9b8d08df178091b6377e74b8a7fc79bf9e6..03fd7028b4dd7a6d70627caf4f5bbdaf5b01b2dc 100644
--- a/entity/Task_entity/Task_entity.aod
+++ b/entity/Task_entity/Task_entity.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.7">
+<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.8" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.8">
   <name>Task_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <documentation>%aditoprj%/entity/Task_entity/documentation.adoc</documentation>
diff --git a/entity/Timetracking_entity/Timetracking_entity.aod b/entity/Timetracking_entity/Timetracking_entity.aod
index cdc401c8f8dd4fb34a3a527f5e281b43998776f9..cd6526511adeb5213171bc485c955ab5a8230ae7 100644
--- a/entity/Timetracking_entity/Timetracking_entity.aod
+++ b/entity/Timetracking_entity/Timetracking_entity.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.7">
+<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.8" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.8">
   <name>Timetracking_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <title>Timetracking</title>
diff --git a/entity/TurnoverTree_entity/TurnoverTree_entity.aod b/entity/TurnoverTree_entity/TurnoverTree_entity.aod
index dc2a01e59f81aa5f81ae14a14ba5aa7170ecf3e3..11425f028190fd30ae2f1777e03b39e949f81629 100644
--- a/entity/TurnoverTree_entity/TurnoverTree_entity.aod
+++ b/entity/TurnoverTree_entity/TurnoverTree_entity.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.7">
+<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.8" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.8">
   <name>TurnoverTree_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <title>Tree</title>
@@ -27,7 +27,6 @@
       <name>YearCountToShow_param</name>
       <valueProcess>%aditoprj%/entity/TurnoverTree_entity/entityfields/yearcounttoshow_param/valueProcess.js</valueProcess>
       <expose v="true" />
-      <triggerRecalculation v="true" />
       <mandatory v="false" />
       <documentation>%aditoprj%/entity/TurnoverTree_entity/entityfields/yearcounttoshow_param/documentation.adoc</documentation>
       <description>PARAMETER</description>
@@ -36,7 +35,6 @@
       <name>MaxYear_param</name>
       <valueProcess>%aditoprj%/entity/TurnoverTree_entity/entityfields/maxyear_param/valueProcess.js</valueProcess>
       <expose v="true" />
-      <triggerRecalculation v="true" />
       <mandatory v="false" />
       <documentation>%aditoprj%/entity/TurnoverTree_entity/entityfields/maxyear_param/documentation.adoc</documentation>
       <description>PARAMETER</description>
diff --git a/entity/Turnover_entity/Turnover_entity.aod b/entity/Turnover_entity/Turnover_entity.aod
index 2f4ccbe0eefe90e74f26b6a2b561ec4a86c80ef2..7eaa1fe042fde2d59529e36e73965f4ff326945c 100644
--- a/entity/Turnover_entity/Turnover_entity.aod
+++ b/entity/Turnover_entity/Turnover_entity.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.7">
+<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.8" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.8">
   <name>Turnover_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <documentation>%aditoprj%/entity/Turnover_entity/documentation.adoc</documentation>
@@ -36,7 +36,6 @@
       <name>YearCountToShow_param</name>
       <valueProcess>%aditoprj%/entity/Turnover_entity/entityfields/yearcounttoshow_param/valueProcess.js</valueProcess>
       <expose v="true" />
-      <triggerRecalculation v="true" />
       <mandatory v="false" />
       <documentation>%aditoprj%/entity/Turnover_entity/entityfields/yearcounttoshow_param/documentation.adoc</documentation>
       <description>PARAMETER</description>
@@ -45,7 +44,6 @@
       <name>MaxYear_param</name>
       <valueProcess>%aditoprj%/entity/Turnover_entity/entityfields/maxyear_param/valueProcess.js</valueProcess>
       <expose v="true" />
-      <triggerRecalculation v="true" />
       <mandatory v="false" />
       <documentation>%aditoprj%/entity/Turnover_entity/entityfields/maxyear_param/documentation.adoc</documentation>
       <description>PARAMETER</description>
diff --git a/entity/Turnover_entity/entityfields/y/titleProcess.js b/entity/Turnover_entity/entityfields/y/titleProcess.js
index 93172094849a46feb91b0e37b52387dcbd47a020..064dd703467efa6f65e449d11368770d3d56bf5f 100644
--- a/entity/Turnover_entity/entityfields/y/titleProcess.js
+++ b/entity/Turnover_entity/entityfields/y/titleProcess.js
@@ -1,4 +1,4 @@
-import("system.translate");
-import("system.result");
-
-result.string(translate.text("Turnover") + " " + translate.text("in") + " " + translate.text("${EURO_SIGN}"));
\ No newline at end of file
+import("system.translate");
+import("system.result");
+
+result.string(translate.text("Sum") + " " + translate.text("in") + " " + translate.text("${EURO_SIGN}"));
\ No newline at end of file
diff --git a/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod b/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod
index db5c7d00ffb5728a657c9267ad1be1bd97f10b33..9a8d001a9d1c787c22d3d659019605b98315b0ff 100644
--- a/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod
+++ b/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod
@@ -3759,6 +3759,21 @@
     <entry>
       <key>Permission</key>
     </entry>
+    <entry>
+      <key>SalesprojectPhase</key>
+    </entry>
+    <entry>
+      <key>SalesprojectState</key>
+    </entry>
+    <entry>
+      <key>Maximal</key>
+    </entry>
+    <entry>
+      <key>Minimal</key>
+    </entry>
+    <entry>
+      <key>Object selection</key>
+    </entry>
   </keyValueMap>
   <font name="Dialog" style="0" size="11" />
   <sqlModels>
diff --git a/language/_____LANGUAGE_de/_____LANGUAGE_de.aod b/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
index 37d7953da29ff5663c7332d3df943c021cd1c0ff..24b3587e8601093d56386cf3a0e54cfb6434f7d0 100644
--- a/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
+++ b/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
@@ -26,6 +26,10 @@
       <key>ARCHIVE</key>
       <value>Archiviert</value>
     </entry>
+    <entry>
+      <key>Maximal</key>
+      <value></value>
+    </entry>
     <entry>
       <key>SalesprojectPhase</key>
       <value>Phase</value>
@@ -57,6 +61,10 @@
       <key>Long string value</key>
       <value>Langer String-Wert</value>
     </entry>
+    <entry>
+      <key>Object selection</key>
+      <value>Objektauswahl</value>
+    </entry>
     <entry>
       <key>CONFIRMED</key>
       <value>Gelesen</value>
@@ -69,6 +77,10 @@
       <key>Add to Campaign</key>
       <value>Zu Kampagne hinzufügen</value>
     </entry>
+    <entry>
+      <key>Bulk mail</key>
+      <value>Serienmail</value>
+    </entry>
     <entry>
       <key>No fax</key>
       <value>Kein Fax</value>
@@ -2604,6 +2616,10 @@
       <key>Project_reference</key>
       <value>Projekt_Referenz</value>
     </entry>
+    <entry>
+      <key>Minimal</key>
+      <value></value>
+    </entry>
     <entry>
       <key>Vanuatu</key>
       <value>Vanuatu</value>
@@ -3485,6 +3501,10 @@
       <key>Sales manager</key>
       <value>Vertriebsleiter</value>
     </entry>
+    <entry>
+      <key>Recipients</key>
+      <value>Empfänger</value>
+    </entry>
     <entry>
       <key>IT</key>
     </entry>
@@ -4615,6 +4635,7 @@
     </entry>
     <entry>
       <key>Price Condition</key>
+      <value>Preis Konditionen</value>
     </entry>
     <entry>
       <key>Entität</key>
diff --git a/language/_____LANGUAGE_en/_____LANGUAGE_en.aod b/language/_____LANGUAGE_en/_____LANGUAGE_en.aod
index a4197c775800f861ec33b3110ba16b716ad07d5f..876933f4e0a2d0a54aa3885e1ebe7449c4b500af 100644
--- a/language/_____LANGUAGE_en/_____LANGUAGE_en.aod
+++ b/language/_____LANGUAGE_en/_____LANGUAGE_en.aod
@@ -3808,6 +3808,21 @@
     <entry>
       <key>Permission</key>
     </entry>
+    <entry>
+      <key>SalesprojectPhase</key>
+    </entry>
+    <entry>
+      <key>SalesprojectState</key>
+    </entry>
+    <entry>
+      <key>Maximal</key>
+    </entry>
+    <entry>
+      <key>Minimal</key>
+    </entry>
+    <entry>
+      <key>Object selection</key>
+    </entry>
   </keyValueMap>
   <font name="Dialog" style="0" size="11" />
 </language>
diff --git a/neonContext/Attribute/Attribute.aod b/neonContext/Attribute/Attribute.aod
index a31d17c07bf37316a20816416bfe5f95c89099cd..b5df2588451587bfb01da4465a6211ce5bdd4988 100644
--- a/neonContext/Attribute/Attribute.aod
+++ b/neonContext/Attribute/Attribute.aod
@@ -1,34 +1,29 @@
-<?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>Attribute</name>
-  <title>Attributes</title>
-  <majorModelMode>DISTRIBUTED</majorModelMode>
-  <icon>VAADIN:TAGS</icon>
-  <mainview>AttributeMain_view</mainview>
-  <filterview>AttributeFilter_view</filterview>
-  <editview>AttributeEdit_view</editview>
-  <preview>AttributePreview_view</preview>
-  <entity>Attribute_entity</entity>
-  <references>
-    <neonViewReference>
-      <name>058f2577-b598-4d92-90ad-628342302a9c</name>
-      <view>AttributeFilter_view</view>
-    </neonViewReference>
-    <neonViewReference>
-      <name>96bf484d-dc8d-42ad-9242-dfefacc87956</name>
-      <view>AttributePreview_view</view>
-    </neonViewReference>
-    <neonViewReference>
-      <name>59089acc-a6db-48c2-8061-2d3ca8246e37</name>
-      <view>AttributeEdit_view</view>
-    </neonViewReference>
-    <neonViewReference>
-      <name>05d998e7-7364-4425-aefe-3cf284933d52</name>
-      <view>AttributeMain_view</view>
-    </neonViewReference>
-    <neonViewReference>
-      <name>6ab8d733-544c-4e48-ade9-b5210a5e5355</name>
-      <view>AttributeTree_view</view>
-    </neonViewReference>
-  </references>
-</neonContext>
+<?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>Attribute</name>
+  <title>Attributes</title>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <icon>VAADIN:TAGS</icon>
+  <filterview>AttributeFilter_view</filterview>
+  <editview>AttributeEdit_view</editview>
+  <preview>AttributePreview_view</preview>
+  <entity>Attribute_entity</entity>
+  <references>
+    <neonViewReference>
+      <name>058f2577-b598-4d92-90ad-628342302a9c</name>
+      <view>AttributeFilter_view</view>
+    </neonViewReference>
+    <neonViewReference>
+      <name>96bf484d-dc8d-42ad-9242-dfefacc87956</name>
+      <view>AttributePreview_view</view>
+    </neonViewReference>
+    <neonViewReference>
+      <name>59089acc-a6db-48c2-8061-2d3ca8246e37</name>
+      <view>AttributeEdit_view</view>
+    </neonViewReference>
+    <neonViewReference>
+      <name>6ab8d733-544c-4e48-ade9-b5210a5e5355</name>
+      <view>AttributeTree_view</view>
+    </neonViewReference>
+  </references>
+</neonContext>
diff --git a/neonContext/AttributeUsage/AttributeUsage.aod b/neonContext/AttributeUsage/AttributeUsage.aod
index fa7176fd2d24ad706d0703a320654287498cd21d..68db5e8e6f8d9bba0689af8253da09b148fd378a 100644
--- a/neonContext/AttributeUsage/AttributeUsage.aod
+++ b/neonContext/AttributeUsage/AttributeUsage.aod
@@ -1,16 +1,20 @@
-<?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>AttributeUsage</name>
-  <majorModelMode>DISTRIBUTED</majorModelMode>
-  <entity>AttributeUsage_entity</entity>
-  <references>
-    <neonViewReference>
-      <name>6f384e66-886a-4a88-90b2-3fa74447b485</name>
-      <view>AttributeUsageFilter_view</view>
-    </neonViewReference>
-    <neonViewReference>
-      <name>db6545ff-cbf4-4c47-aa52-30ae7e203448</name>
-      <view>AttributeUsageMultiEdit_view</view>
-    </neonViewReference>
-  </references>
-</neonContext>
+<?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>AttributeUsage</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <entity>AttributeUsage_entity</entity>
+  <references>
+    <neonViewReference>
+      <name>6f384e66-886a-4a88-90b2-3fa74447b485</name>
+      <view>AttributeUsageFilter_view</view>
+    </neonViewReference>
+    <neonViewReference>
+      <name>db6545ff-cbf4-4c47-aa52-30ae7e203448</name>
+      <view>AttributeUsageMultiEdit_view</view>
+    </neonViewReference>
+    <neonViewReference>
+      <name>d6bd1bbe-cdba-4322-835b-4176308c4a03</name>
+      <view>AttributeUsageList_view</view>
+    </neonViewReference>
+  </references>
+</neonContext>
diff --git a/neonContext/BulkMail/BulkMail.aod b/neonContext/BulkMail/BulkMail.aod
new file mode 100644
index 0000000000000000000000000000000000000000..5671a98946abec37c4a4fc1c9fa5da370688a107
--- /dev/null
+++ b/neonContext/BulkMail/BulkMail.aod
@@ -0,0 +1,29 @@
+<?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>BulkMail</name>
+  <title>Bulk mail</title>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <mainview>BulkMailMain_view</mainview>
+  <filterview>BulkMailFilter_view</filterview>
+  <editview>BulkMailEdit_view</editview>
+  <preview>BulkMailPreview_view</preview>
+  <entity>BulkMail_entity</entity>
+  <references>
+    <neonViewReference>
+      <name>b3d943fa-80ad-4588-8788-2005908677c5</name>
+      <view>BulkMailMain_view</view>
+    </neonViewReference>
+    <neonViewReference>
+      <name>45358c68-0dbc-47e9-809f-c4d32f8b6f0c</name>
+      <view>BulkMailPreview_view</view>
+    </neonViewReference>
+    <neonViewReference>
+      <name>bc34fcf6-fd65-40c0-a9d9-ee30ab08e5f4</name>
+      <view>BulkMailEdit_view</view>
+    </neonViewReference>
+    <neonViewReference>
+      <name>d9462c8d-f0ad-4d9f-9c0c-80bca19cbb7f</name>
+      <view>BulkMailFilter_view</view>
+    </neonViewReference>
+  </references>
+</neonContext>
diff --git a/neonContext/BulkMailRecipient/BulkMailRecipient.aod b/neonContext/BulkMailRecipient/BulkMailRecipient.aod
new file mode 100644
index 0000000000000000000000000000000000000000..9f5d116664adcaa2ad8d5621f158c2538046bc4b
--- /dev/null
+++ b/neonContext/BulkMailRecipient/BulkMailRecipient.aod
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<neonContext xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.0" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonContext/1.1.0">
+  <name>BulkMailRecipient</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <filterview>BulkMailRecipientFilter_view</filterview>
+  <editview>BulkMailRecipientEdit_view</editview>
+  <entity>BulkMailRecipient_entity</entity>
+  <references>
+    <neonViewReference>
+      <name>f8ad11ce-9b5a-424f-a3eb-333c767ffb2a</name>
+      <view>BulkMailRecipientFilter_view</view>
+    </neonViewReference>
+    <neonViewReference>
+      <name>55526723-ba65-45d5-8025-20e6d6a688bc</name>
+      <view>BulkMailRecipientEdit_view</view>
+    </neonViewReference>
+  </references>
+</neonContext>
diff --git a/neonContext/Productprice/Productprice.aod b/neonContext/Productprice/Productprice.aod
index 5385e3c1cb27bf2f4217a831622eb7770d5d7873..705012cef4192bf010547b88fdacc2242bf92dd7 100644
--- a/neonContext/Productprice/Productprice.aod
+++ b/neonContext/Productprice/Productprice.aod
@@ -1,22 +1,27 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<neonContext xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.0" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonContext/1.1.0">
-  <name>Productprice</name>
-  <majorModelMode>DISTRIBUTED</majorModelMode>
-  <filterview>ProductpriceFilter_view</filterview>
-  <editview>ProductpriceEdit_view</editview>
-  <entity>Productprice_entity</entity>
-  <references>
-    <neonViewReference>
-      <name>cb76925e-63da-45c8-b332-e0fd2faff26e</name>
-      <view>ProductpriceFilter_view</view>
-    </neonViewReference>
-    <neonViewReference>
-      <name>5d987a22-773d-4353-87d5-8da2427f4239</name>
-      <view>ProductpriceEdit_view</view>
-    </neonViewReference>
-    <neonViewReference>
-      <name>d1c8b084-a20b-49ae-88fe-7a578396d4a5</name>
-      <view>ProductpriceRelation_view</view>
-    </neonViewReference>
-  </references>
-</neonContext>
+<?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>Productprice</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <filterview>ProductpriceFilter_view</filterview>
+  <editview>ProductpriceEdit_view</editview>
+  <preview>ProductpricePreview_view</preview>
+  <entity>Productprice_entity</entity>
+  <references>
+    <neonViewReference>
+      <name>cb76925e-63da-45c8-b332-e0fd2faff26e</name>
+      <view>ProductpriceFilter_view</view>
+    </neonViewReference>
+    <neonViewReference>
+      <name>5d987a22-773d-4353-87d5-8da2427f4239</name>
+      <view>ProductpriceEdit_view</view>
+    </neonViewReference>
+    <neonViewReference>
+      <name>d1c8b084-a20b-49ae-88fe-7a578396d4a5</name>
+      <view>ProductpriceRelation_view</view>
+    </neonViewReference>
+    <neonViewReference>
+      <name>590ab927-5303-451b-824a-c16adfb00772</name>
+      <view>ProductpricePreview_view</view>
+    </neonViewReference>
+  </references>
+</neonContext>
diff --git a/neonContext/Salesproject/Salesproject.aod b/neonContext/Salesproject/Salesproject.aod
index 7132036f9565f46312c7cf84234512dc2c6d92a1..8a1b6992cbbbb4612c5db429bf040432333bd81e 100644
--- a/neonContext/Salesproject/Salesproject.aod
+++ b/neonContext/Salesproject/Salesproject.aod
@@ -52,15 +52,19 @@
     </neonViewReference>
     <neonViewReference>
       <name>68e9257b-d402-4edc-8345-7da46c3b63f9</name>
-      <view>SalesprojectClassificationAttribute_view</view>
+      <view>SalesprojectClassificationAndChart_view</view>
     </neonViewReference>
     <neonViewReference>
       <name>99f70216-c195-4c08-a6ab-3a4d5acc759b</name>
-      <view>SalesprojectClassScoreAttribute_view</view>
+      <view>SalesprojectClassificationAttribute_view</view>
     </neonViewReference>
     <neonViewReference>
       <name>b3e34681-eef6-48d3-a4e6-975a6fe77e7b</name>
       <view>SalesprojectOfferForecastChart_view</view>
     </neonViewReference>
+    <neonViewReference>
+      <name>f23558c0-b0e7-42f6-8307-5e70c130a5f1</name>
+      <view>SalesprojectPhase_view</view>
+    </neonViewReference>
   </references>
 </neonContext>
diff --git a/neonContext/SalesprojectPhase/SalesprojectPhase.aod b/neonContext/SalesprojectPhase/SalesprojectPhase.aod
new file mode 100644
index 0000000000000000000000000000000000000000..4c826c6554e20442dd93ec182f2f0cefb633f440
--- /dev/null
+++ b/neonContext/SalesprojectPhase/SalesprojectPhase.aod
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<neonContext xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.0" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonContext/1.1.0">
+  <name>SalesprojectPhase</name>
+  <title>Phase</title>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <lookupview>SalesprojectPhaseStep_view</lookupview>
+  <entity>SalesprojectPhase_entity</entity>
+  <references>
+    <neonViewReference>
+      <name>b875ea44-3ca5-4b19-95e1-aca307dc0068</name>
+      <view>SalesprojectPhaseStep_view</view>
+    </neonViewReference>
+  </references>
+</neonContext>
diff --git a/neonContext/Timetracking/Timetracking.aod b/neonContext/Timetracking/Timetracking.aod
index 1cd5118750a6c5d10e0cda5a363edabdb0709682..899b249d7201e72d601aa41d2632bd091cda0fa6 100644
--- a/neonContext/Timetracking/Timetracking.aod
+++ b/neonContext/Timetracking/Timetracking.aod
@@ -35,5 +35,9 @@
       <name>1290dad5-f796-4847-9510-05607e079f30</name>
       <view>TimetrackingAnalysesDrawer_view</view>
     </neonViewReference>
+    <neonViewReference>
+      <name>9f848d8a-5dee-4388-8ade-6aa2c3f6c21f</name>
+      <view>TimetrackingFilterAnalyses</view>
+    </neonViewReference>
   </references>
 </neonContext>
diff --git a/neonView/AttributeEdit_view/AttributeEdit_view.aod b/neonView/AttributeEdit_view/AttributeEdit_view.aod
index 38144c9d34953a7c8183f7654ab666f811310945..a36a3eeedeb3f1058062f8b60b4bddc7c114f424 100644
--- a/neonView/AttributeEdit_view/AttributeEdit_view.aod
+++ b/neonView/AttributeEdit_view/AttributeEdit_view.aod
@@ -1,49 +1,49 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.1">
-  <name>AttributeEdit_view</name>
-  <majorModelMode>DISTRIBUTED</majorModelMode>
-  <isSmall v="true" />
-  <layout>
-    <noneLayout>
-      <name>layout</name>
-    </noneLayout>
-  </layout>
-  <children>
-    <genericViewTemplate>
-      <name>Edit</name>
-      <editMode v="true" />
-      <entityField>#ENTITY</entityField>
-      <fields>
-        <entityFieldLink>
-          <name>2d269ed7-a664-40c3-aadb-f274f7c00a66</name>
-          <entityField>ATTRIBUTE_PARENT_ID</entityField>
-        </entityFieldLink>
-        <entityFieldLink>
-          <name>0c6cd7c6-cced-4719-b0c5-08f8e3d13f2f</name>
-          <entityField>ATTRIBUTE_NAME</entityField>
-        </entityFieldLink>
-        <entityFieldLink>
-          <name>8cbc6049-2530-4960-b45f-830f3220889e</name>
-          <entityField>ATTRIBUTE_TYPE</entityField>
-        </entityFieldLink>
-        <entityFieldLink>
-          <name>529f9734-182e-46f3-ad89-14dc5656f307</name>
-          <entityField>KEYWORD_CONTAINER</entityField>
-        </entityFieldLink>
-        <entityFieldLink>
-          <name>d26696ac-199c-45f0-9147-b75dee3f4b65</name>
-          <entityField>ATTRIBUTE_ACTIVE</entityField>
-        </entityFieldLink>
-        <entityFieldLink>
-          <name>c8a5f45e-8092-45f4-ac22-681700447235</name>
-          <entityField>ATTRIBUTE_LEVEL</entityField>
-        </entityFieldLink>
-      </fields>
-    </genericViewTemplate>
-    <neonViewReference>
-      <name>8387ef27-9565-400f-a0d5-ef1d2019b722</name>
-      <entityField>AttributeUsages</entityField>
-      <view>AttributeUsageMultiEdit_view</view>
-    </neonViewReference>
-  </children>
-</neonView>
+<?xml version="1.0" 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>AttributeEdit_view</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <isSmall v="true" />
+  <layout>
+    <noneLayout>
+      <name>layout</name>
+    </noneLayout>
+  </layout>
+  <children>
+    <genericViewTemplate>
+      <name>Edit</name>
+      <editMode v="true" />
+      <entityField>#ENTITY</entityField>
+      <fields>
+        <entityFieldLink>
+          <name>2d269ed7-a664-40c3-aadb-f274f7c00a66</name>
+          <entityField>ATTRIBUTE_PARENT_ID</entityField>
+        </entityFieldLink>
+        <entityFieldLink>
+          <name>0c6cd7c6-cced-4719-b0c5-08f8e3d13f2f</name>
+          <entityField>ATTRIBUTE_NAME</entityField>
+        </entityFieldLink>
+        <entityFieldLink>
+          <name>8cbc6049-2530-4960-b45f-830f3220889e</name>
+          <entityField>ATTRIBUTE_TYPE</entityField>
+        </entityFieldLink>
+        <entityFieldLink>
+          <name>529f9734-182e-46f3-ad89-14dc5656f307</name>
+          <entityField>DROPDOWNDEFINITION</entityField>
+        </entityFieldLink>
+        <entityFieldLink>
+          <name>d26696ac-199c-45f0-9147-b75dee3f4b65</name>
+          <entityField>ATTRIBUTE_ACTIVE</entityField>
+        </entityFieldLink>
+        <entityFieldLink>
+          <name>c8a5f45e-8092-45f4-ac22-681700447235</name>
+          <entityField>ATTRIBUTE_LEVEL</entityField>
+        </entityFieldLink>
+      </fields>
+    </genericViewTemplate>
+    <neonViewReference>
+      <name>8387ef27-9565-400f-a0d5-ef1d2019b722</name>
+      <entityField>AttributeUsages</entityField>
+      <view>AttributeUsageMultiEdit_view</view>
+    </neonViewReference>
+  </children>
+</neonView>
diff --git a/neonView/AttributePreview_view/AttributePreview_view.aod b/neonView/AttributePreview_view/AttributePreview_view.aod
index e710ffaa582ce6ed96579096870168f1ffb72766..17503eac3db6f7b892a08e923a7b91225fcef5de 100644
--- a/neonView/AttributePreview_view/AttributePreview_view.aod
+++ b/neonView/AttributePreview_view/AttributePreview_view.aod
@@ -1,43 +1,48 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.1">
-  <name>AttributePreview_view</name>
-  <majorModelMode>DISTRIBUTED</majorModelMode>
-  <layout>
-    <headerFooterLayout>
-      <name>layout</name>
-      <header>Head</header>
-    </headerFooterLayout>
-  </layout>
-  <children>
-    <cardViewTemplate>
-      <name>Head</name>
-      <iconField>ICON</iconField>
-      <titleField>FULL_ATTRIBUTE_NAME</titleField>
-      <subtitleField>ATTRIBUTE_TYPE</subtitleField>
-      <entityField>#ENTITY</entityField>
-    </cardViewTemplate>
-    <genericViewTemplate>
-      <name>Details</name>
-      <showDrawer v="true" />
-      <entityField>#ENTITY</entityField>
-      <fields>
-        <entityFieldLink>
-          <name>3de869e9-936b-4215-86de-b1e24f6bfd78</name>
-          <entityField>ATTRIBUTE_PARENT_ID</entityField>
-        </entityFieldLink>
-        <entityFieldLink>
-          <name>39cf159f-2c34-41a1-bf6d-210d2d1f8df9</name>
-          <entityField>KEYWORD_CONTAINER</entityField>
-        </entityFieldLink>
-        <entityFieldLink>
-          <name>70953962-9472-484b-ac95-567d2249f42e</name>
-          <entityField>ATTRIBUTE_ACTIVE</entityField>
-        </entityFieldLink>
-        <entityFieldLink>
-          <name>1b1cfdcb-fcab-4ca9-b0e0-b69fe88b65f0</name>
-          <entityField>SORTING</entityField>
-        </entityFieldLink>
-      </fields>
-    </genericViewTemplate>
-  </children>
-</neonView>
+<?xml version="1.0" 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>AttributePreview_view</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <layout>
+    <headerFooterLayout>
+      <name>layout</name>
+      <header>Head</header>
+    </headerFooterLayout>
+  </layout>
+  <children>
+    <cardViewTemplate>
+      <name>Head</name>
+      <iconField>ICON</iconField>
+      <titleField>FULL_ATTRIBUTE_NAME</titleField>
+      <subtitleField>ATTRIBUTE_TYPE</subtitleField>
+      <entityField>#ENTITY</entityField>
+    </cardViewTemplate>
+    <genericViewTemplate>
+      <name>Details</name>
+      <showDrawer v="true" />
+      <entityField>#ENTITY</entityField>
+      <fields>
+        <entityFieldLink>
+          <name>3de869e9-936b-4215-86de-b1e24f6bfd78</name>
+          <entityField>ATTRIBUTE_PARENT_ID</entityField>
+        </entityFieldLink>
+        <entityFieldLink>
+          <name>39cf159f-2c34-41a1-bf6d-210d2d1f8df9</name>
+          <entityField>DROPDOWNDEFINITION</entityField>
+        </entityFieldLink>
+        <entityFieldLink>
+          <name>70953962-9472-484b-ac95-567d2249f42e</name>
+          <entityField>ATTRIBUTE_ACTIVE</entityField>
+        </entityFieldLink>
+        <entityFieldLink>
+          <name>1b1cfdcb-fcab-4ca9-b0e0-b69fe88b65f0</name>
+          <entityField>SORTING</entityField>
+        </entityFieldLink>
+      </fields>
+    </genericViewTemplate>
+    <neonViewReference>
+      <name>8ecf4cfd-a1a0-49fa-9650-575f32c48840</name>
+      <entityField>AttributeUsages</entityField>
+      <view>AttributeUsageList_view</view>
+    </neonViewReference>
+  </children>
+</neonView>
diff --git a/neonView/AttributeUsageList_view/AttributeUsageList_view.aod b/neonView/AttributeUsageList_view/AttributeUsageList_view.aod
new file mode 100644
index 0000000000000000000000000000000000000000..5c3f2347266b67eccdb7de9bc23798762f0bff5d
--- /dev/null
+++ b/neonView/AttributeUsageList_view/AttributeUsageList_view.aod
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.1">
+  <name>AttributeUsageList_view</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <layout>
+    <noneLayout>
+      <name>layout</name>
+    </noneLayout>
+  </layout>
+  <children>
+    <titledListViewTemplate>
+      <name>Usages</name>
+      <entityField>#ENTITY</entityField>
+      <columns>
+        <neonTableColumn>
+          <name>dad2eee7-ccfb-4795-8574-5fae64033271</name>
+          <entityField>OBJECT_TYPE</entityField>
+        </neonTableColumn>
+        <neonTableColumn>
+          <name>eb87855e-c5b1-45c9-aa84-d566f2493bc0</name>
+          <entityField>MIN_COUNT</entityField>
+        </neonTableColumn>
+        <neonTableColumn>
+          <name>a8876438-3152-4d39-9e1f-35735b4890d5</name>
+          <entityField>MAX_COUNT</entityField>
+        </neonTableColumn>
+      </columns>
+    </titledListViewTemplate>
+  </children>
+</neonView>
diff --git a/neonView/BulkMailEdit_view/BulkMailEdit_view.aod b/neonView/BulkMailEdit_view/BulkMailEdit_view.aod
new file mode 100644
index 0000000000000000000000000000000000000000..19e453d3cb60342db7f680a84facb923ca05d166
--- /dev/null
+++ b/neonView/BulkMailEdit_view/BulkMailEdit_view.aod
@@ -0,0 +1,35 @@
+<?xml version="1.0" 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>BulkMailEdit_view</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <layout>
+    <boxLayout>
+      <name>layout</name>
+    </boxLayout>
+  </layout>
+  <children>
+    <genericViewTemplate>
+      <name>BulkMail</name>
+      <editMode v="true" />
+      <entityField>#ENTITY</entityField>
+      <fields>
+        <entityFieldLink>
+          <name>e363bda2-d8bf-456e-bcae-d1870408022a</name>
+          <entityField>NAME</entityField>
+        </entityFieldLink>
+        <entityFieldLink>
+          <name>06f08869-5a81-41cb-8c7e-51be6a7041a7</name>
+          <entityField>DESCRIPTION</entityField>
+        </entityFieldLink>
+        <entityFieldLink>
+          <name>c73d0fb7-b740-48ac-8f3e-fd4199f169da</name>
+          <entityField>SUBJECT</entityField>
+        </entityFieldLink>
+        <entityFieldLink>
+          <name>b68c65de-4ecd-4a23-9242-f85e7b708b1e</name>
+          <entityField>DOCUMENTTEMPLATE_ID</entityField>
+        </entityFieldLink>
+      </fields>
+    </genericViewTemplate>
+  </children>
+</neonView>
diff --git a/neonView/BulkMailFilter_view/BulkMailFilter_view.aod b/neonView/BulkMailFilter_view/BulkMailFilter_view.aod
new file mode 100644
index 0000000000000000000000000000000000000000..b47381e310e88d97e189352fad7644cb5873debe
--- /dev/null
+++ b/neonView/BulkMailFilter_view/BulkMailFilter_view.aod
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.1">
+  <name>BulkMailFilter_view</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <layout>
+    <boxLayout>
+      <name>layout</name>
+    </boxLayout>
+  </layout>
+  <children>
+    <tableViewTemplate>
+      <name>Table</name>
+      <entityField>#ENTITY</entityField>
+      <columns>
+        <neonTableColumn>
+          <name>4d9c0321-a9d9-409b-8839-d1a5b9a19215</name>
+          <entityField>NAME</entityField>
+        </neonTableColumn>
+        <neonTableColumn>
+          <name>9ad2e3dd-5496-43f4-b6ff-5b2b8c1fb6db</name>
+          <entityField>SUBJECT</entityField>
+        </neonTableColumn>
+        <neonTableColumn>
+          <name>d8f9dce6-8c10-4235-b3c3-2d15d01586bc</name>
+          <entityField>DESCRIPTION</entityField>
+        </neonTableColumn>
+      </columns>
+    </tableViewTemplate>
+  </children>
+</neonView>
diff --git a/neonView/AttributeMain_view/AttributeMain_view.aod b/neonView/BulkMailMain_view/BulkMailMain_view.aod
similarity index 50%
rename from neonView/AttributeMain_view/AttributeMain_view.aod
rename to neonView/BulkMailMain_view/BulkMailMain_view.aod
index 8e3efc3dcc725ba52bd5a16c38c49cc5f2d2f13c..b13921e7858eb60a0b3df9c0ae8eeb3b247df45c 100644
--- a/neonView/AttributeMain_view/AttributeMain_view.aod
+++ b/neonView/BulkMailMain_view/BulkMailMain_view.aod
@@ -1,28 +1,23 @@
-<?xml version="1.0" 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>AttributeMain_view</name>
-  <majorModelMode>DISTRIBUTED</majorModelMode>
-  <layout>
-    <masterSlaveLayout>
-      <name>layout</name>
-      <master>b8e5b606-4fbb-4a74-b7c4-ac612a9797f2</master>
-    </masterSlaveLayout>
-  </layout>
-  <children>
-    <neonViewReference>
-      <name>b8e5b606-4fbb-4a74-b7c4-ac612a9797f2</name>
-      <entityField>#ENTITY</entityField>
-      <view>AttributePreview_view</view>
-    </neonViewReference>
-    <neonViewReference>
-      <name>981059c6-2f57-4c6b-86bb-45e5a0a8f138</name>
-      <entityField>AttributeChildren</entityField>
-      <view>AttributeFilter_view</view>
-    </neonViewReference>
-    <neonViewReference>
-      <name>5dee1c0b-c670-4eb9-bd95-6f6474709aa2</name>
-      <entityField>AttributeUsages</entityField>
-      <view>AttributeUsageFilter_view</view>
-    </neonViewReference>
-  </children>
-</neonView>
+<?xml version="1.0" 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>BulkMailMain_view</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <layout>
+    <masterSlaveLayout>
+      <name>layout</name>
+      <master>9f5528f7-230e-42e5-8831-66bdee9a9588</master>
+    </masterSlaveLayout>
+  </layout>
+  <children>
+    <neonViewReference>
+      <name>9f5528f7-230e-42e5-8831-66bdee9a9588</name>
+      <entityField>#ENTITY</entityField>
+      <view>BulkMailPreview_view</view>
+    </neonViewReference>
+    <neonViewReference>
+      <name>8be4ed02-1c54-41d0-9bba-3b785346a550</name>
+      <entityField>Recipients</entityField>
+      <view>BulkMailRecipientFilter_view</view>
+    </neonViewReference>
+  </children>
+</neonView>
diff --git a/neonView/BulkMailPreview_view/BulkMailPreview_view.aod b/neonView/BulkMailPreview_view/BulkMailPreview_view.aod
new file mode 100644
index 0000000000000000000000000000000000000000..60b64ff404000d53c4df4ade238752f60acb39b1
--- /dev/null
+++ b/neonView/BulkMailPreview_view/BulkMailPreview_view.aod
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.1">
+  <name>BulkMailPreview_view</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <layout>
+    <headerFooterLayout>
+      <name>layout</name>
+      <header>Card</header>
+    </headerFooterLayout>
+  </layout>
+  <children>
+    <cardViewTemplate>
+      <name>Card</name>
+      <titleField>NAME</titleField>
+      <descriptionField>SUBJECT</descriptionField>
+      <entityField>#ENTITY</entityField>
+    </cardViewTemplate>
+    <genericViewTemplate>
+      <name>Generic</name>
+      <entityField>#ENTITY</entityField>
+      <fields>
+        <entityFieldLink>
+          <name>edbeea4d-019f-4661-b0d7-c07468e747cc</name>
+          <entityField>DOCUMENTTEMPLATE_ID</entityField>
+        </entityFieldLink>
+      </fields>
+    </genericViewTemplate>
+  </children>
+</neonView>
diff --git a/neonView/BulkMailRecipientEdit_view/BulkMailRecipientEdit_view.aod b/neonView/BulkMailRecipientEdit_view/BulkMailRecipientEdit_view.aod
new file mode 100644
index 0000000000000000000000000000000000000000..bbb1b90f1c9bf7719ea982819ce95d0b70018c81
--- /dev/null
+++ b/neonView/BulkMailRecipientEdit_view/BulkMailRecipientEdit_view.aod
@@ -0,0 +1,24 @@
+<?xml version="1.0" 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>BulkMailRecipientEdit_view</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <isSmall v="true" />
+  <layout>
+    <boxLayout>
+      <name>layout</name>
+    </boxLayout>
+  </layout>
+  <children>
+    <genericViewTemplate>
+      <name>Generic</name>
+      <editMode v="true" />
+      <entityField>#ENTITY</entityField>
+      <fields>
+        <entityFieldLink>
+          <name>49dec5a0-161c-4392-a764-65e183d1c1ce</name>
+          <entityField>CONTACT_ID</entityField>
+        </entityFieldLink>
+      </fields>
+    </genericViewTemplate>
+  </children>
+</neonView>
diff --git a/neonView/BulkMailRecipientFilter_view/BulkMailRecipientFilter_view.aod b/neonView/BulkMailRecipientFilter_view/BulkMailRecipientFilter_view.aod
new file mode 100644
index 0000000000000000000000000000000000000000..d2933b291153beb33c82d04272a685af7f612cb6
--- /dev/null
+++ b/neonView/BulkMailRecipientFilter_view/BulkMailRecipientFilter_view.aod
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.1">
+  <name>BulkMailRecipientFilter_view</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <layout>
+    <boxLayout>
+      <name>layout</name>
+    </boxLayout>
+  </layout>
+  <children>
+    <tableViewTemplate>
+      <name>Table</name>
+      <entityField>#ENTITY</entityField>
+      <columns>
+        <neonTableColumn>
+          <name>d18adeb8-352a-4b87-83a7-19959c73f718</name>
+          <entityField>CONTACT_ID</entityField>
+        </neonTableColumn>
+        <neonTableColumn>
+          <name>f311e8da-4139-48bd-a792-6df572dce7ad</name>
+          <entityField>STATUS</entityField>
+        </neonTableColumn>
+      </columns>
+    </tableViewTemplate>
+  </children>
+</neonView>
diff --git a/neonView/CampaignFilter_view/CampaignFilter_view.aod b/neonView/CampaignFilter_view/CampaignFilter_view.aod
index 60d0e80e43a98f15b94592d9a35cd4ab4354db32..92a0a4185572b65a2e3f126c17ddc359fe204008 100644
--- a/neonView/CampaignFilter_view/CampaignFilter_view.aod
+++ b/neonView/CampaignFilter_view/CampaignFilter_view.aod
@@ -1,45 +1,53 @@
-<?xml version="1.0" 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>CampaignFilter_view</name>
-  <title>Campaign</title>
-  <majorModelMode>DISTRIBUTED</majorModelMode>
-  <icon>VAADIN:GROUP</icon>
-  <filterable v="true" />
-  <layout>
-    <boxLayout>
-      <name>layout</name>
-    </boxLayout>
-  </layout>
-  <children>
-    <tableViewTemplate>
-      <name>Campaigns</name>
-      <entityField>#ENTITY</entityField>
-      <isEditable v="false" />
-      <columns>
-        <neonTableColumn>
-          <name>8fd2c7a2-37ad-43be-b37a-3cf9d07e71c8</name>
-          <entityField>#IMAGE</entityField>
-        </neonTableColumn>
-        <neonTableColumn>
-          <name>c384e4df-3f29-45b8-b86d-2c6aa253833f</name>
-          <entityField>NAME</entityField>
-          <width v="100" />
-        </neonTableColumn>
-        <neonTableColumn>
-          <name>a66574f0-f104-4579-b1fe-e9f33cd200be</name>
-          <entityField>DATE_START</entityField>
-          <width v="100" />
-        </neonTableColumn>
-        <neonTableColumn>
-          <name>0153b107-544e-4f9a-a734-431d343abc8e</name>
-          <entityField>DATE_END</entityField>
-          <width v="100" />
-        </neonTableColumn>
-        <neonTableColumn>
-          <name>3f075c57-e61a-4db2-a402-141da6bbf29d</name>
-          <entityField>STATE</entityField>
-        </neonTableColumn>
-      </columns>
-    </tableViewTemplate>
-  </children>
-</neonView>
+<?xml version="1.0" 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>CampaignFilter_view</name>
+  <title>Campaign</title>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <icon>VAADIN:GROUP</icon>
+  <filterable v="true" />
+  <layout>
+    <boxLayout>
+      <name>layout</name>
+    </boxLayout>
+  </layout>
+  <children>
+    <tableViewTemplate>
+      <name>Campaigns</name>
+      <entityField>#ENTITY</entityField>
+      <isEditable v="false" />
+      <columns>
+        <neonTableColumn>
+          <name>8fd2c7a2-37ad-43be-b37a-3cf9d07e71c8</name>
+          <entityField>#IMAGE</entityField>
+        </neonTableColumn>
+        <neonTableColumn>
+          <name>c384e4df-3f29-45b8-b86d-2c6aa253833f</name>
+          <entityField>NAME</entityField>
+          <width v="100" />
+        </neonTableColumn>
+        <neonTableColumn>
+          <name>87caf58d-c77a-47b4-a2ba-55b6e77672d8</name>
+          <entityField>EMPLOYEE_CONTACT_ID</entityField>
+        </neonTableColumn>
+        <neonTableColumn>
+          <name>a66574f0-f104-4579-b1fe-e9f33cd200be</name>
+          <entityField>DATE_START</entityField>
+          <width v="100" />
+        </neonTableColumn>
+        <neonTableColumn>
+          <name>0153b107-544e-4f9a-a734-431d343abc8e</name>
+          <entityField>DATE_END</entityField>
+          <width v="100" />
+        </neonTableColumn>
+        <neonTableColumn>
+          <name>3f075c57-e61a-4db2-a402-141da6bbf29d</name>
+          <entityField>STATE</entityField>
+        </neonTableColumn>
+        <neonTableColumn>
+          <name>f5fc40b2-c6d3-4f03-9ffa-b7e269323b4d</name>
+          <entityField>DESCRIPTION</entityField>
+        </neonTableColumn>
+      </columns>
+    </tableViewTemplate>
+  </children>
+</neonView>
diff --git a/neonView/CampaignStepFilter_view/CampaignStepFilter_view.aod b/neonView/CampaignStepFilter_view/CampaignStepFilter_view.aod
index a9ab180e53b4330cff6f740024f3585b2454c869..e9d6fdecb1bc417725219df008a1835078b50032 100644
--- a/neonView/CampaignStepFilter_view/CampaignStepFilter_view.aod
+++ b/neonView/CampaignStepFilter_view/CampaignStepFilter_view.aod
@@ -28,6 +28,10 @@
           <name>d9ca59de-1441-494a-91f0-1cff91c575de</name>
           <entityField>NAME</entityField>
         </neonTableColumn>
+        <neonTableColumn>
+          <name>75d15a06-1591-4f5c-9be6-df98e32e3834</name>
+          <entityField>EMPLOYEE_CONTACT_ID</entityField>
+        </neonTableColumn>
         <neonTableColumn>
           <name>0ffcc021-2b58-49f6-91d0-21f4029f744f</name>
           <entityField>DATE_START</entityField>
diff --git a/neonView/ContractFilter_view/ContractFilter_view.aod b/neonView/ContractFilter_view/ContractFilter_view.aod
index 5ef1fa5e8c38cfa14fc5ec48bbdaa8095071c378..36402f58995033b150be327e14f5310cd2fa46b1 100644
--- a/neonView/ContractFilter_view/ContractFilter_view.aod
+++ b/neonView/ContractFilter_view/ContractFilter_view.aod
@@ -1,68 +1,72 @@
-<?xml version="1.0" 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>ContractFilter_view</name>
-  <majorModelMode>DISTRIBUTED</majorModelMode>
-  <filterable v="true" />
-  <dashletConfigurations>
-    <neonDashletConfiguration>
-      <name>AllContractsDashlet</name>
-      <title>Contracts</title>
-      <description>Show all contracts</description>
-      <fragment>Contract/filter</fragment>
-      <singleton v="true" />
-      <requiresConfiguration v="false" />
-      <icon>vaadin:form</icon>
-      <categories>
-        <neonDashletCategory>
-          <name>sales</name>
-          <title>Sales</title>
-        </neonDashletCategory>
-        <neonDashletCategory>
-          <name>contract</name>
-          <title>Contract</title>
-        </neonDashletCategory>
-      </categories>
-    </neonDashletConfiguration>
-  </dashletConfigurations>
-  <layout>
-    <boxLayout>
-      <name>layout</name>
-    </boxLayout>
-  </layout>
-  <children>
-    <tableViewTemplate>
-      <name>Contracts</name>
-      <entityField>#ENTITY</entityField>
-      <columns>
-        <neonTableColumn>
-          <name>67ceacc5-6238-496a-9bc6-ccc52ce91cd3</name>
-          <entityField>IMAGE</entityField>
-        </neonTableColumn>
-        <neonTableColumn>
-          <name>1a610a45-8c8c-48d4-bc0b-905655afa016</name>
-          <entityField>CONTRACTCODE</entityField>
-        </neonTableColumn>
-        <neonTableColumn>
-          <name>ea38d067-af86-4936-8311-f64305fc5576</name>
-          <entityField>CONTRACTTYPE</entityField>
-        </neonTableColumn>
-        <neonTableColumn>
-          <name>0ec4c5ee-4af2-4530-8fc3-fbecef7983b7</name>
-          <entityField>CONTACT_ID</entityField>
-        </neonTableColumn>
-        <neonTableColumn>
-          <name>05f745fe-6f29-4536-9794-8ddfefd2b369</name>
-          <entityField>CONTRACTSTATUS</entityField>
-        </neonTableColumn>
-        <neonTableColumn>
-          <name>ef313bd9-b3a3-4c60-b7d5-9cf2e208aade</name>
-          <entityField>CONTRACTSTART</entityField>
-        </neonTableColumn>
-        <neonTableColumn>
-          <name>845c3a71-0fa9-4299-9b85-8fa25f92436d</name>
-          <entityField>CONTRACTEND</entityField>
-        </neonTableColumn>
-      </columns>
-    </tableViewTemplate>
-  </children>
-</neonView>
+<?xml version="1.0" 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>ContractFilter_view</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <filterable v="true" />
+  <dashletConfigurations>
+    <neonDashletConfiguration>
+      <name>AllContractsDashlet</name>
+      <title>Contracts</title>
+      <description>Show all contracts</description>
+      <fragment>Contract/filter</fragment>
+      <singleton v="true" />
+      <requiresConfiguration v="false" />
+      <icon>vaadin:form</icon>
+      <categories>
+        <neonDashletCategory>
+          <name>sales</name>
+          <title>Sales</title>
+        </neonDashletCategory>
+        <neonDashletCategory>
+          <name>contract</name>
+          <title>Contract</title>
+        </neonDashletCategory>
+      </categories>
+    </neonDashletConfiguration>
+  </dashletConfigurations>
+  <layout>
+    <boxLayout>
+      <name>layout</name>
+    </boxLayout>
+  </layout>
+  <children>
+    <tableViewTemplate>
+      <name>Contracts</name>
+      <entityField>#ENTITY</entityField>
+      <columns>
+        <neonTableColumn>
+          <name>67ceacc5-6238-496a-9bc6-ccc52ce91cd3</name>
+          <entityField>IMAGE</entityField>
+        </neonTableColumn>
+        <neonTableColumn>
+          <name>1a610a45-8c8c-48d4-bc0b-905655afa016</name>
+          <entityField>CONTRACTCODE</entityField>
+        </neonTableColumn>
+        <neonTableColumn>
+          <name>ea38d067-af86-4936-8311-f64305fc5576</name>
+          <entityField>CONTRACTTYPE</entityField>
+        </neonTableColumn>
+        <neonTableColumn>
+          <name>0ec4c5ee-4af2-4530-8fc3-fbecef7983b7</name>
+          <entityField>CONTACT_ORG_ID</entityField>
+        </neonTableColumn>
+        <neonTableColumn>
+          <name>d9382527-d322-45f6-8a61-9a8ada6b9fa2</name>
+          <entityField>CONTACT_PERSON_ID</entityField>
+        </neonTableColumn>
+        <neonTableColumn>
+          <name>05f745fe-6f29-4536-9794-8ddfefd2b369</name>
+          <entityField>CONTRACTSTATUS</entityField>
+        </neonTableColumn>
+        <neonTableColumn>
+          <name>ef313bd9-b3a3-4c60-b7d5-9cf2e208aade</name>
+          <entityField>CONTRACTSTART</entityField>
+        </neonTableColumn>
+        <neonTableColumn>
+          <name>845c3a71-0fa9-4299-9b85-8fa25f92436d</name>
+          <entityField>CONTRACTEND</entityField>
+        </neonTableColumn>
+      </columns>
+    </tableViewTemplate>
+  </children>
+</neonView>
diff --git a/neonView/KeywordEntryFilter_view/KeywordEntryFilter_view.aod b/neonView/KeywordEntryFilter_view/KeywordEntryFilter_view.aod
index 2224a8959900a10c9264f328a6458d88f8d92425..e18ac930066433f9273a6bbb2ba2574e89b5a702 100644
--- a/neonView/KeywordEntryFilter_view/KeywordEntryFilter_view.aod
+++ b/neonView/KeywordEntryFilter_view/KeywordEntryFilter_view.aod
@@ -1,61 +1,69 @@
-<?xml version="1.0" 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>KeywordEntryFilter_view</name>
-  <majorModelMode>DISTRIBUTED</majorModelMode>
-  <filterable v="true" />
-  <layout>
-    <groupLayout>
-      <name>layout</name>
-    </groupLayout>
-  </layout>
-  <children>
-    <treeTableViewTemplate>
-      <name>EntriesTreeTable</name>
-      <defaultGroupFields>
-        <element>CONTAINER</element>
-      </defaultGroupFields>
-      <entityField>#ENTITY</entityField>
-      <columns>
-        <neonTableColumn>
-          <name>aa5612b4-997e-4f0f-8fb1-91e18e32051d</name>
-          <entityField>TITLE</entityField>
-        </neonTableColumn>
-        <neonTableColumn>
-          <name>6100879d-dc6a-4c7e-b750-f5b7e627f48a</name>
-          <entityField>KEYID</entityField>
-        </neonTableColumn>
-      </columns>
-    </treeTableViewTemplate>
-    <tableViewTemplate>
-      <name>EntriesTable</name>
-      <entityField>#ENTITY</entityField>
-      <title></title>
-      <columns>
-        <neonTableColumn>
-          <name>0e85b64c-6ce8-4221-8544-b8b5152a1292</name>
-          <entityField>#ICON</entityField>
-        </neonTableColumn>
-        <neonTableColumn>
-          <name>7f8c3b75-62dc-4826-bad3-99aa9d471067</name>
-          <entityField>CONTAINER</entityField>
-        </neonTableColumn>
-        <neonTableColumn>
-          <name>4dc50d75-d856-4fca-bd4d-d79eb3c8769f</name>
-          <entityField>KEYID</entityField>
-        </neonTableColumn>
-        <neonTableColumn>
-          <name>42d1d488-8739-4101-9aee-087dcc34d51a</name>
-          <entityField>TITLE</entityField>
-        </neonTableColumn>
-        <neonTableColumn>
-          <name>f4241fa3-907e-4542-b01d-6efa95ac4d0f</name>
-          <entityField>ISACTIVE</entityField>
-        </neonTableColumn>
-        <neonTableColumn>
-          <name>64a15e98-c6da-4c36-b20b-af1867b15602</name>
-          <entityField>SORTING</entityField>
-        </neonTableColumn>
-      </columns>
-    </tableViewTemplate>
-  </children>
-</neonView>
+<?xml version="1.0" 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>KeywordEntryFilter_view</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <filterable v="true" />
+  <layout>
+    <groupLayout>
+      <name>layout</name>
+    </groupLayout>
+  </layout>
+  <children>
+    <treeTableViewTemplate>
+      <name>EntriesTreeTable</name>
+      <defaultGroupFields>
+        <element>CONTAINER</element>
+      </defaultGroupFields>
+      <entityField>#ENTITY</entityField>
+      <columns>
+        <neonTableColumn>
+          <name>6100879d-dc6a-4c7e-b750-f5b7e627f48a</name>
+          <entityField>KEYID</entityField>
+        </neonTableColumn>
+        <neonTableColumn>
+          <name>aa5612b4-997e-4f0f-8fb1-91e18e32051d</name>
+          <entityField>TITLE</entityField>
+        </neonTableColumn>
+        <neonTableColumn>
+          <name>eea7891c-81bd-4c1b-9d9b-fd81c6bc49b2</name>
+          <entityField>ISACTIVE</entityField>
+        </neonTableColumn>
+        <neonTableColumn>
+          <name>1739a6c3-14fb-4b86-941e-28d165f1b8bd</name>
+          <entityField>ISESSENTIAL</entityField>
+        </neonTableColumn>
+      </columns>
+    </treeTableViewTemplate>
+    <tableViewTemplate>
+      <name>EntriesTable</name>
+      <entityField>#ENTITY</entityField>
+      <title></title>
+      <columns>
+        <neonTableColumn>
+          <name>0e85b64c-6ce8-4221-8544-b8b5152a1292</name>
+          <entityField>#ICON</entityField>
+        </neonTableColumn>
+        <neonTableColumn>
+          <name>7f8c3b75-62dc-4826-bad3-99aa9d471067</name>
+          <entityField>CONTAINER</entityField>
+        </neonTableColumn>
+        <neonTableColumn>
+          <name>4dc50d75-d856-4fca-bd4d-d79eb3c8769f</name>
+          <entityField>KEYID</entityField>
+        </neonTableColumn>
+        <neonTableColumn>
+          <name>42d1d488-8739-4101-9aee-087dcc34d51a</name>
+          <entityField>TITLE</entityField>
+        </neonTableColumn>
+        <neonTableColumn>
+          <name>f4241fa3-907e-4542-b01d-6efa95ac4d0f</name>
+          <entityField>ISACTIVE</entityField>
+        </neonTableColumn>
+        <neonTableColumn>
+          <name>64a15e98-c6da-4c36-b20b-af1867b15602</name>
+          <entityField>SORTING</entityField>
+        </neonTableColumn>
+      </columns>
+    </tableViewTemplate>
+  </children>
+</neonView>
diff --git a/neonView/OfferCoverLetter_view/OfferCoverLetter_view.aod b/neonView/OfferCoverLetter_view/OfferCoverLetter_view.aod
index 7033e20f42372476b758a070490c9f36b428f095..a2f745cf473bb46657565aca058de8903dae3ce8 100644
--- a/neonView/OfferCoverLetter_view/OfferCoverLetter_view.aod
+++ b/neonView/OfferCoverLetter_view/OfferCoverLetter_view.aod
@@ -30,6 +30,10 @@
       <hideLabels v="true" />
       <entityField>#ENTITY</entityField>
       <fields>
+        <entityFieldLink>
+          <name>68ea43c8-fb8d-47bb-83d5-d756a62f6256</name>
+          <entityField>ChoosenTEXHeader</entityField>
+        </entityFieldLink>
         <entityFieldLink>
           <name>ea40e259-0920-4ba1-8a26-8c84c6ba3b61</name>
           <entityField>HEADER</entityField>
@@ -43,6 +47,10 @@
       <hideLabels v="true" />
       <entityField>#ENTITY</entityField>
       <fields>
+        <entityFieldLink>
+          <name>a702eef3-b285-44e2-ba27-68377e83e882</name>
+          <entityField>ChoosenTEXFooter</entityField>
+        </entityFieldLink>
         <entityFieldLink>
           <name>aec6d9a1-dfae-4e74-a48a-3303884c121a</name>
           <entityField>FOOTER</entityField>
diff --git a/neonView/OfferFilter_view/OfferFilter_view.aod b/neonView/OfferFilter_view/OfferFilter_view.aod
index 233e57008b83b305dcba9430866f4093dda4caf2..792e13eb6190078c112baea3af283b4d1a9c4223 100644
--- a/neonView/OfferFilter_view/OfferFilter_view.aod
+++ b/neonView/OfferFilter_view/OfferFilter_view.aod
@@ -63,10 +63,14 @@
         </neonTableColumn>
         <neonTableColumn>
           <name>780087e7-ff3c-4592-90be-607357168295</name>
-          <entityField>CONTACT_ID</entityField>
+          <entityField>CONTACT_ORG_ID</entityField>
           <width v="75" />
           <expandRatio v="100" />
         </neonTableColumn>
+        <neonTableColumn>
+          <name>1556a6e6-f147-4573-82da-7a59f39a81e5</name>
+          <entityField>CONTACT_PERSON_ID</entityField>
+        </neonTableColumn>
         <neonTableColumn>
           <name>c5780864-ac2c-4650-8630-2690a9a074ea</name>
           <entityField>STATUS</entityField>
diff --git a/neonView/OrderFilter_view/OrderFilter_view.aod b/neonView/OrderFilter_view/OrderFilter_view.aod
index c93d94888edcbd43127f1e8711aedc96db0635e4..ecf2e155081c89ca14f364ea201a2780f2c8ac7b 100644
--- a/neonView/OrderFilter_view/OrderFilter_view.aod
+++ b/neonView/OrderFilter_view/OrderFilter_view.aod
@@ -64,10 +64,14 @@
         </neonTableColumn>
         <neonTableColumn>
           <name>5688908f-7c50-46a3-8899-2767ea5b4a90</name>
-          <entityField>CONTACT_ID</entityField>
+          <entityField>CONTACT_ORG_ID</entityField>
           <width v="75" />
           <expandRatio v="100" />
         </neonTableColumn>
+        <neonTableColumn>
+          <name>6fdca295-2e0a-4f89-a386-1ddda8a3090c</name>
+          <entityField>CONTACT_PERSON_ID</entityField>
+        </neonTableColumn>
         <neonTableColumn>
           <name>443c8480-5676-43a3-9617-f86dae39c960</name>
           <entityField>SALESORDERDATE</entityField>
diff --git a/neonView/ProductpricePreview_view/ProductpricePreview_view.aod b/neonView/ProductpricePreview_view/ProductpricePreview_view.aod
new file mode 100644
index 0000000000000000000000000000000000000000..4353f66b64422eb7aa3d9294f996840ebb2ef4e1
--- /dev/null
+++ b/neonView/ProductpricePreview_view/ProductpricePreview_view.aod
@@ -0,0 +1,53 @@
+<?xml version="1.0" 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>ProductpricePreview_view</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <layout>
+    <headerFooterLayout>
+      <name>layout</name>
+      <header>Header</header>
+    </headerFooterLayout>
+  </layout>
+  <children>
+    <genericViewTemplate>
+      <name>PriceInfo</name>
+      <entityField>#ENTITY</entityField>
+      <fields>
+        <entityFieldLink>
+          <name>017828ab-b638-48fe-9ce0-cd9f0a85320d</name>
+          <entityField>VALID_FROM</entityField>
+        </entityFieldLink>
+        <entityFieldLink>
+          <name>e34a8afc-7dc2-49eb-97a8-5b7e1345ea3c</name>
+          <entityField>VALID_TO</entityField>
+        </entityFieldLink>
+        <entityFieldLink>
+          <name>e7a79993-a075-415f-9d39-712884f1167d</name>
+          <entityField>PRICE</entityField>
+        </entityFieldLink>
+        <entityFieldLink>
+          <name>264eb382-5e41-4c8b-a2fa-ce93398c844b</name>
+          <entityField>CURRENCY</entityField>
+        </entityFieldLink>
+        <entityFieldLink>
+          <name>9584102a-f0a1-4d44-934a-9dd6087a7ff4</name>
+          <entityField>BUYSELL</entityField>
+        </entityFieldLink>
+        <entityFieldLink>
+          <name>75bd282e-2782-49da-bbd8-d835a47356f0</name>
+          <entityField>FROMQUANTITY</entityField>
+        </entityFieldLink>
+        <entityFieldLink>
+          <name>276f4380-51e4-4268-bb96-9d95778eb852</name>
+          <entityField>VAT</entityField>
+        </entityFieldLink>
+      </fields>
+    </genericViewTemplate>
+    <cardViewTemplate>
+      <name>Header</name>
+      <iconField>IMAGE</iconField>
+      <titleField>PRICELIST</titleField>
+      <entityField>#ENTITY</entityField>
+    </cardViewTemplate>
+  </children>
+</neonView>
diff --git a/neonView/ProductpricePreview_views/ProductpricePreview_view.aod b/neonView/ProductpricePreview_views/ProductpricePreview_view.aod
new file mode 100644
index 0000000000000000000000000000000000000000..3bc608ee66b871fe29ce9f87e4a82fcecaf50f21
--- /dev/null
+++ b/neonView/ProductpricePreview_views/ProductpricePreview_view.aod
@@ -0,0 +1,5 @@
+<?xml version="1.0" 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>ProductpricePreview_view</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+</neonView>
diff --git a/neonView/SalesprojectClassificationAndChart_view/SalesprojectClassificationAndChart_view.aod b/neonView/SalesprojectClassificationAndChart_view/SalesprojectClassificationAndChart_view.aod
new file mode 100644
index 0000000000000000000000000000000000000000..5e697d1cc59bd998ebffa273865be89022733ebe
--- /dev/null
+++ b/neonView/SalesprojectClassificationAndChart_view/SalesprojectClassificationAndChart_view.aod
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.1">
+  <name>SalesprojectClassificationAndChart_view</name>
+  <title></title>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <layout>
+    <boxLayout>
+      <name>layout</name>
+      <direction>HORIZONTAL</direction>
+      <maxDirectionElements v="2" />
+    </boxLayout>
+  </layout>
+  <children>
+    <neonViewReference>
+      <name>b2bbddb9-1a44-4926-9707-7052f96e5963</name>
+      <entityField>Classifications</entityField>
+      <view>ClassificationTree_view</view>
+    </neonViewReference>
+    <neonViewReference>
+      <name>0442c345-d0a3-4778-a906-c5ef86dacd16</name>
+      <entityField>Classifications</entityField>
+      <view>ClassificationChart_view</view>
+    </neonViewReference>
+  </children>
+</neonView>
diff --git a/neonView/SalesprojectClassificationAttribute_view/SalesprojectClassificationAttribute_view.aod b/neonView/SalesprojectClassificationAttribute_view/SalesprojectClassificationAttribute_view.aod
index bfe23f33231cc821af46d6439d5a9446a8b3695b..9ceb8b366343ca0043e462b5367d008516712ad4 100644
--- a/neonView/SalesprojectClassificationAttribute_view/SalesprojectClassificationAttribute_view.aod
+++ b/neonView/SalesprojectClassificationAttribute_view/SalesprojectClassificationAttribute_view.aod
@@ -1,25 +1,24 @@
-<?xml version="1.0" 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>SalesprojectClassificationAttribute_view</name>
-  <title></title>
-  <majorModelMode>DISTRIBUTED</majorModelMode>
-  <layout>
-    <boxLayout>
-      <name>layout</name>
-      <direction>HORIZONTAL</direction>
-      <maxDirectionElements v="2" />
-    </boxLayout>
-  </layout>
-  <children>
-    <neonViewReference>
-      <name>793ed21a-147f-4ca0-a86a-ddbf79db92b6</name>
-      <entityField>Classifications</entityField>
-      <view>ClassificationDrawer_view</view>
-    </neonViewReference>
-    <neonViewReference>
-      <name>0442c345-d0a3-4778-a906-c5ef86dacd16</name>
-      <entityField>Classifications</entityField>
-      <view>ClassificationChart_view</view>
-    </neonViewReference>
-  </children>
-</neonView>
+<?xml version="1.0" 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>SalesprojectClassificationAttribute_view</name>
+  <title>Classification</title>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <layout>
+    <boxLayout>
+      <name>layout</name>
+      <direction>VERTICAL</direction>
+    </boxLayout>
+  </layout>
+  <children>
+    <neonViewReference>
+      <name>1af0e58c-db49-41c3-b7ce-d69498070699</name>
+      <entityField>#ENTITY</entityField>
+      <view>SalesprojectClassificationAndChart_view</view>
+    </neonViewReference>
+    <neonViewReference>
+      <name>523e3855-eade-4cce-842d-9b272b028cbb</name>
+      <entityField>AttributeTree</entityField>
+      <view>AttributeRelationTreeDrawer_view</view>
+    </neonViewReference>
+  </children>
+</neonView>
diff --git a/neonView/SalesprojectFurtherInfo_view/SalesprojectFurtherInfo_view.aod b/neonView/SalesprojectFurtherInfo_view/SalesprojectFurtherInfo_view.aod
index 2aff0cef7c723beb6fd590c0b53c7209f7c80f64..b23e3bfd1d4659454c56cc97bde3e8d5b5fd2fd9 100644
--- a/neonView/SalesprojectFurtherInfo_view/SalesprojectFurtherInfo_view.aod
+++ b/neonView/SalesprojectFurtherInfo_view/SalesprojectFurtherInfo_view.aod
@@ -6,8 +6,8 @@
   <layout>
     <boxLayout>
       <name>layout</name>
-      <direction>HORIZONTAL</direction>
-      <maxDirectionElements v="2" />
+      <direction>VERTICAL</direction>
+      <maxDirectionElements v="0" />
     </boxLayout>
   </layout>
   <children>
@@ -16,11 +16,6 @@
       <entityField>Timetrackings</entityField>
       <view>TimetrackingDrawer_view</view>
     </neonViewReference>
-    <neonViewReference>
-      <name>5d00dd5a-7c80-41b4-a53e-29375be4f806</name>
-      <entityField>Timetrackings</entityField>
-      <view>TimetrackingAnalyses_view</view>
-    </neonViewReference>
     <neonViewReference>
       <name>4dcc3fdd-6683-435c-95c1-a59597fc3e71</name>
       <entityField>Competitions</entityField>
diff --git a/neonView/SalesprojectMain_view/SalesprojectMain_view.aod b/neonView/SalesprojectMain_view/SalesprojectMain_view.aod
index d3967c08b2b64f507a61eb540387ef2f5c75011f..614e3fec5e03066e769bdf811726dc8379e95a4f 100644
--- a/neonView/SalesprojectMain_view/SalesprojectMain_view.aod
+++ b/neonView/SalesprojectMain_view/SalesprojectMain_view.aod
@@ -14,20 +14,25 @@
       <entityField>#ENTITY</entityField>
       <view>SalesprojectPreview_view</view>
     </neonViewReference>
+    <neonViewReference>
+      <name>9fe0e309-b367-479b-81d4-da06496b805a</name>
+      <entityField>#ENTITY</entityField>
+      <view>SalesprojectPhase_view</view>
+    </neonViewReference>
     <neonViewReference>
       <name>57b93e84-fcb9-4f9d-bbad-1d7fdf16cc77</name>
       <entityField>#ENTITY</entityField>
       <view>SalesprojectMemberActivity_view</view>
     </neonViewReference>
     <neonViewReference>
-      <name>8a83afee-e02c-4714-9641-13b62c95cea1</name>
+      <name>67659a20-068f-4522-ad33-2c35e29f929a</name>
       <entityField>#ENTITY</entityField>
-      <view>SalesprojectMilestoneSource_view</view>
+      <view>SalesprojectClassificationAttribute_view</view>
     </neonViewReference>
     <neonViewReference>
-      <name>67659a20-068f-4522-ad33-2c35e29f929a</name>
+      <name>8a83afee-e02c-4714-9641-13b62c95cea1</name>
       <entityField>#ENTITY</entityField>
-      <view>SalesprojectClassScoreAttribute_view</view>
+      <view>SalesprojectMilestoneSource_view</view>
     </neonViewReference>
     <neonViewReference>
       <name>3da4532a-716f-4ff2-a8bc-c29d4f7cb9fb</name>
diff --git a/neonView/SalesprojectMilestone_view/SalesprojectMilestone_view.aod b/neonView/SalesprojectMilestone_view/SalesprojectMilestone_view.aod
index 22a77ded18bff79861784a97fe69ab15e40e6335..0eec94ee7c019424c3248579fc68b9562d4a4d01 100644
--- a/neonView/SalesprojectMilestone_view/SalesprojectMilestone_view.aod
+++ b/neonView/SalesprojectMilestone_view/SalesprojectMilestone_view.aod
@@ -1,24 +1,25 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.1">
-  <name>SalesprojectMilestone_view</name>
-  <title>Milestones</title>
-  <majorModelMode>DISTRIBUTED</majorModelMode>
-  <layout>
-    <boxLayout>
-      <name>layout</name>
-      <direction>HORIZONTAL</direction>
-    </boxLayout>
-  </layout>
-  <children>
-    <neonViewReference>
-      <name>30c775ea-7488-4dfd-8e6d-c65b7982849d</name>
-      <entityField>SalesprojectStateMilestones</entityField>
-      <view>SalesprojectMilestoneChart_view</view>
-    </neonViewReference>
-    <neonViewReference>
-      <name>cc8f1469-805f-4e2c-aa4f-d55f932c6deb</name>
-      <entityField>SalesprojectPhaseMilestones</entityField>
-      <view>SalesprojectMilestoneChart_view</view>
-    </neonViewReference>
-  </children>
-</neonView>
+<?xml version="1.0" 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>SalesprojectMilestone_view</name>
+  <title>Milestones</title>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <layout>
+    <boxLayout>
+      <name>layout</name>
+      <direction>HORIZONTAL</direction>
+      <maxDirectionElements v="2" />
+    </boxLayout>
+  </layout>
+  <children>
+    <neonViewReference>
+      <name>30c775ea-7488-4dfd-8e6d-c65b7982849d</name>
+      <entityField>SalesprojectStateMilestones</entityField>
+      <view>SalesprojectMilestoneChart_view</view>
+    </neonViewReference>
+    <neonViewReference>
+      <name>cc8f1469-805f-4e2c-aa4f-d55f932c6deb</name>
+      <entityField>SalesprojectPhaseMilestones</entityField>
+      <view>SalesprojectMilestoneChart_view</view>
+    </neonViewReference>
+  </children>
+</neonView>
diff --git a/neonView/SalesprojectOfferForecast_view/SalesprojectOfferForecast_view.aod b/neonView/SalesprojectOfferForecast_view/SalesprojectOfferForecast_view.aod
index 06ec1cd5206e5ceada8e4a063254c1e9cd7e0ecc..ffb635e533832e66346cb7a0fe688178db687a10 100644
--- a/neonView/SalesprojectOfferForecast_view/SalesprojectOfferForecast_view.aod
+++ b/neonView/SalesprojectOfferForecast_view/SalesprojectOfferForecast_view.aod
@@ -12,9 +12,9 @@
   </layout>
   <children>
     <neonViewReference>
-      <name>c399a9ac-e0ad-490c-8ffb-247fc806233b</name>
+      <name>e192d0d6-8d36-437a-a9cf-775c811c2761</name>
       <entityField>Forecasts</entityField>
-      <view>ForecastDrawer_view</view>
+      <view>ForecastFilter_view</view>
     </neonViewReference>
     <neonViewReference>
       <name>ca2581ac-0987-4fa4-a45a-c33ea4cd61e1</name>
diff --git a/neonView/SalesprojectPhaseStep_view/SalesprojectPhaseStep_view.aod b/neonView/SalesprojectPhaseStep_view/SalesprojectPhaseStep_view.aod
new file mode 100644
index 0000000000000000000000000000000000000000..08638092fd114f45bccefde343d905542045cb8e
--- /dev/null
+++ b/neonView/SalesprojectPhaseStep_view/SalesprojectPhaseStep_view.aod
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.1">
+  <name>SalesprojectPhaseStep_view</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <layout>
+    <boxLayout>
+      <name>layout</name>
+    </boxLayout>
+  </layout>
+  <children>
+    <stepperViewTemplate>
+      <name>Phases</name>
+      <stateField>STATE</stateField>
+      <titleField>TITLE</titleField>
+      <iconField>ICON</iconField>
+      <entityField>#ENTITY</entityField>
+    </stepperViewTemplate>
+  </children>
+</neonView>
diff --git a/neonView/SalesprojectPhase_view/SalesprojectPhase_view.aod b/neonView/SalesprojectPhase_view/SalesprojectPhase_view.aod
new file mode 100644
index 0000000000000000000000000000000000000000..d046bb9b4fa8e43b41fbf168be9795332b4fabf4
--- /dev/null
+++ b/neonView/SalesprojectPhase_view/SalesprojectPhase_view.aod
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.1">
+  <name>SalesprojectPhase_view</name>
+  <title>Overview</title>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <layout>
+    <boxLayout>
+      <name>layout</name>
+    </boxLayout>
+  </layout>
+  <children>
+    <lookupViewTemplate>
+      <name>Phases</name>
+      <consumerField>PHASE</consumerField>
+      <consumerPresentationMode>EMBEDDED</consumerPresentationMode>
+      <entityField>#ENTITY</entityField>
+    </lookupViewTemplate>
+  </children>
+</neonView>
diff --git a/neonView/TimetrackingDrawer_view/TimetrackingDrawer_view.aod b/neonView/TimetrackingDrawer_view/TimetrackingDrawer_view.aod
index eaaa35e64364e5872a26a37e262849ddabd47966..894a9056ba56da8901f00981b982b84ea2cc8823 100644
--- a/neonView/TimetrackingDrawer_view/TimetrackingDrawer_view.aod
+++ b/neonView/TimetrackingDrawer_view/TimetrackingDrawer_view.aod
@@ -10,9 +10,9 @@
   </layout>
   <children>
     <neonViewReference>
-      <name>463458e6-fb6a-4550-b4b4-04b61969f9f2</name>
+      <name>c6133a75-f87d-448f-bf52-e360373aa7f7</name>
       <entityField>#ENTITY</entityField>
-      <view>TimetrackingFilter_view</view>
+      <view>TimetrackingFilterAnalyses</view>
     </neonViewReference>
   </children>
 </neonView>
diff --git a/neonView/SalesprojectClassScoreAttribute_view/SalesprojectClassScoreAttribute_view.aod b/neonView/TimetrackingFilterAnalyses/TimetrackingFilterAnalyses.aod
similarity index 58%
rename from neonView/SalesprojectClassScoreAttribute_view/SalesprojectClassScoreAttribute_view.aod
rename to neonView/TimetrackingFilterAnalyses/TimetrackingFilterAnalyses.aod
index e7b905232b0012988ebd7d3562df992fbe2b9daa..92aaadacea0dc78c08c08783d652724ecec3f439 100644
--- a/neonView/SalesprojectClassScoreAttribute_view/SalesprojectClassScoreAttribute_view.aod
+++ b/neonView/TimetrackingFilterAnalyses/TimetrackingFilterAnalyses.aod
@@ -1,24 +1,24 @@
-<?xml version="1.0" 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>SalesprojectClassScoreAttribute_view</name>
-  <title>Classification</title>
-  <majorModelMode>DISTRIBUTED</majorModelMode>
-  <layout>
-    <boxLayout>
-      <name>layout</name>
-      <direction>VERTICAL</direction>
-    </boxLayout>
-  </layout>
-  <children>
-    <neonViewReference>
-      <name>1af0e58c-db49-41c3-b7ce-d69498070699</name>
-      <entityField>#ENTITY</entityField>
-      <view>SalesprojectClassificationAttribute_view</view>
-    </neonViewReference>
-    <neonViewReference>
-      <name>523e3855-eade-4cce-842d-9b272b028cbb</name>
-      <entityField>AttributeTree</entityField>
-      <view>AttributeRelationTreeDrawer_view</view>
-    </neonViewReference>
-  </children>
-</neonView>
+<?xml version="1.0" 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>TimetrackingFilterAnalyses</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <layout>
+    <boxLayout>
+      <name>layout</name>
+      <direction>HORIZONTAL</direction>
+      <maxDirectionElements v="2" />
+    </boxLayout>
+  </layout>
+  <children>
+    <neonViewReference>
+      <name>373d9986-ad06-4a86-9f5d-801ecee6139c</name>
+      <entityField>#ENTITY</entityField>
+      <view>TimetrackingFilter_view</view>
+    </neonViewReference>
+    <neonViewReference>
+      <name>9b1e339c-70aa-4841-8e8f-b66fd2e9f9f5</name>
+      <entityField>#ENTITY</entityField>
+      <view>TimetrackingAnalyses_view</view>
+    </neonViewReference>
+  </children>
+</neonView>
diff --git a/process/Address_lib/process.js b/process/Address_lib/process.js
index 03e8d5d77a95eca6f0fa232ccdc5c7a321153971..a694f7a3d47e8cb06566318eb06dc133ea98b302 100644
--- a/process/Address_lib/process.js
+++ b/process/Address_lib/process.js
@@ -1,475 +1,475 @@
-import("Employee_lib");
-import("system.swing");
-import("system.text");
-import("system.db");
-import("system.logging");
-import("system.vars");
-import("system.translate");
-import("Attribute_lib");
-import("Sql_lib");
-import("Util_lib");
-import("DocumentTemplate_lib");
-
-/*
-* Creates a Address Object
-* 
-* @param {String} pContactId req relationid for which address should be retrieved
-* @param {String} pAddressId opt addressid for which address should be retrieved
-* @param {boolean} pPerson whether the address is from a person, not an organisation
-*  
-* @return {String} the formatted address
-*/
-
-function AddrObject(pContactId, pPerson, pAddressId)
-{
-    this.Data = fetchAddressData([pContactId], [new Placeholder("", Placeholder.types.ADDRESSFORMAT, "")], pAddressId, pPerson);
-    this.fmt = this.Data[0][0][26]; 
-	
-    /*
-    * creates a formatted address
-    * 
-    * @param {boolean} pCountry whether the country should be displayed
-    * @param {String} pFormat a fixed format for the address
-    * 
-    * @return {String} formatted address
-    */
-    this.getFormattedAddress = function( pCountry, pFormat )
-    {	
-        return _formatAddrData( _getAddrData(  this.Data[0][0] ), pFormat, pCountry );
-    }
-}
-
-/*
-* creates address data
-* 
-* @param {String} pCondition req SQL-Where-Condition  
-* @param {Object []} pConfig req ( name, functionality, details )
-* @param {String} pSenderID opt UserRelationID
-* @param {String} pAddressID opt addressid
-* 
-* @return {[]}  Daten 
-*/
-function getAddressesData( pCondition, pConfig, pSenderID, pAddressID )
-{ 
-    var returndata = [];
-    var senderconfig = [];
-    var employeeconfig = [];
-    var config = [];
-    for (let i = 0; i < pConfig.length; i++)
-    {
-        switch (pConfig[i].target)
-        {
-            case Placeholder.targets.EMPLOYEE:
-                employeeconfig.push(pConfig[i]);
-                break;
-            case Placeholder.targets.SENDER:
-                senderconfig.push(pConfig[i]);
-                break;
-            case Placeholder.targets.RECIPIENT:
-            default:
-                config.push(pConfig[i]);
-                break;
-        } 
-    }
-    var data = getAddressData(pCondition, config, pAddressID);
-    if (pSenderID == undefined)  pSenderID = vars.get("$global.user").relationid;
-    if (senderconfig.length > 0) 
-        var senderdata = getAddressData([pSenderID], senderconfig);
-    if (employeeconfig.length > 0) 
-        var employeedata = getAddressData([EmployeeUtils.getCurrentContactId()], employeeconfig);
-    if (data.length > 0 && (senderconfig.length > 0 || employeeconfig.length > 0))
-    { 
-        var ze = data[0];
-        if (employeeconfig.length > 0) ze = ze.concat(employeedata[0]);
-        if (senderconfig.length > 0) ze = ze.concat(senderdata[0]); 
-        returndata.push(ze);
-        for (let i = 1; i < data.length; i++)
-        {
-            ze = data[i];
-            if (employeeconfig.length > 0) ze = ze.concat(employeedata[1]);
-            if (senderconfig.length > 0) ze = ze.concat(senderdata[1]); 
-            returndata.push(ze);
-        }
-        return returndata;
-    }
-    else return data;
-}
-
-/*
-* creates
-* 
-* @param {String} pCondition req SQL-Where-Condition  
-* @param {Placeholder[]} pConfig req array of placeholders
-* @param {String} AddressID opt addressid
-* 
-* @return {[]}  Daten 
-*/
-function getAddressData( pCondition, pConfig, AddressID )
-{ 
-    return setAddressData( fetchAddressData( pCondition, pConfig, AddressID ) );
-}
-
-/*
-* reads data from the database
-* 
-* @param {String} pCondition req SQL-Where-Condition  
-* @param {Placeholder[]} pConfig req array of placeholders
-* @param {String} AddressID opt addressid
-* @param {boolean} pPerson opt if private person
-* 
-* @return {Array} 2d-Array, structure: [[ data, output, header, addrfields ]]
-*/
-function fetchAddressData( pCondition, pConfig, AddressID, pPerson )
-{ 
-    if ( typeof(pCondition) == "object") pCondition = "CONTACT.CONTACTID in ('" + pCondition.join("','") + "')";
-    if ( pConfig.length > 0 )
-    { 
-        var header = [];
-        var fields = [];
-        var output = [];
-        var pos = 0;
-        var posaddrfields = -1;
-        var functionCalls = [];
-        var addrfields = ["case when CONTACT.PERSON_ID is null then 1 else case when " + SqlMaskingUtils.prototype.trim("CONTACT.ORGANISATION_ID") + " = '0' then 2 else 3 end end", //0
-        "ADDRESS.ADDRESS", "ADDRESS.BUILDINGNO", "ADDRESS.ZIP", "ADDRESS.CITY", "ADDRESS.COUNTRY", "ADDRESS.ADDRESSADDITION",  // 1-6
-        "ADDRESS.ADDRIDENTIFIER", "ADDRESS.DISTRICT", "ADDRESS.REGION", "ADDRESS.STATE", "CONTACT.DEPARTMENT", "CONTACT.CONTACTROLE", // 7-12
-        "CONTACT.POSITION", "CONTACT.LETTERSALUTATION", "ORGANISATION.NAME", "PERSON.FIRSTNAME", "PERSON.MIDDLENAME", "PERSON.LASTNAME",  // 13-18
-        "PERSON.SALUTATION", "PERSON.TITLE", "PERSON.TITLESUFFIX", // 19-21
-        "coalesce( CONTACT.LANGUAGE, (select C.LANGUAGE from CONTACT C where C.ORGANISATION_ID = CONTACT.ORGANISATION_ID and PERSON_ID is null))", // 22
-        "''", "''", "''", "(select ADDR_FORMAT from AB_COUNTRYINFO where ISO2 = ADDRESS.COUNTRY)", "ADDRESS.ADDR_TYPE"]; // 23-27
-											
-        for (let i=0; i < pConfig.length; i++ )
-        {
-            switch( pConfig[i].type )
-            {
-                case Placeholder.types.SQLPART: //sql part
-                    fields.push( pConfig[i].valueDefinition ); //TODO: maybe do vars.resolveVariables
-                    output.push([pos++, pConfig[i].type]);
-                    header.push( pConfig[i].placeholderName );
-                    break;
-                case Placeholder.types.SQLPARTFUNCTION: // adito SQL functions
-                    fields.push("(" + pConfig[i].valueDefinition.call() + ")");
-                    output.push([pos++, pConfig[i].type]);
-                    header.push( pConfig[i].placeholderName );
-                    break;
-                case "afunction": // adito functions
-                    try
-                    {
-                        fields.push( "'" + evalScript("Address_lib.fetchAddressData", vars.resolveVariables(pConfig[i].valueDefinition), {}, ["Attribute_lib", "Sql_lib", "Keyword_lib", "Person_lib"], true).replace(new RegExp("'","g"), "''") + "'" ); 
-                        output.push([pos++, pConfig[i].type]);
-                        header.push( pConfig[i].placeholderName );
-                    }
-                    catch( err )
-                    {                      
-                        logging.log( err )
-                    }
-                    break;
-                case "select": // Subselects
-                    fields.push( "(" + vars.resolveVariables(pConfig[i].valueDefinition) + " )" );
-                    output.push([pos++, pConfig[i].type]);
-                    header.push( pConfig[i].placeholderName );
-                    break;
-                case Placeholder.types.ADDRESSFORMAT:
-                    if ( posaddrfields == -1 )
-                    {        
-                        var sortfields = ["ORGANISATION.NAME", "PERSON.LASTNAME"];
-                        fields.push( addrfields.join(", ") );
-                        posaddrfields = pos;
-                        pos += addrfields.length;								
-                    }
-                    output.push([posaddrfields, pConfig[i].type, pConfig[i].valueDefinition]);
-                    header.push( pConfig[i].placeholderName );
-                    break;
-                case "resolveIDFunction":
-                    var configJSON = pConfig[i].valueDefinition;
-                    fields.push( configJSON.rowIDField );
-
-                    functionCalls.push([pos,
-                        configJSON.resolveFunction,
-                        configJSON.imports,
-                        configJSON.localVars]);
-                                    
-                    output.push([pos++, pConfig[i].type]);
-                    header.push( pConfig[i].placeholderName );                
-                    break;
-            }
-        }
-        if (!pPerson) {           
-            var sqlstr =  "select " + fields.join(",") 
-            + " from CONTACT join ORGANISATION on CONTACT.ORGANISATION_ID = ORGANISATION.ORGANISATIONID "
-            + " left join PERSON on CONTACT.PERSON_ID = PERSON.PERSONID "
-            + " left join ADDRESS on CONTACT.ADDRESS_ID = ";
-        } else {
-            
-            sqlstr = "select " + fields.join(",")
-            + " from CONTACT join PERSON on CONTACT.PERSON_ID = PERSON.PERSONID "
-            + " left join ORGANISATION on CONTACT.ORGANISATION_ID = ORGANISATION.ORGANISATIONID "
-            + " left join ADDRESS on CONTACT.ADDRESS_ID = ";
-        }
-        
-        if ( AddressID != undefined && AddressID != "" )  sqlstr += "'" + AddressID + "'"; 
-        else sqlstr += "ADDRESS.ADDRESSID";
-        if ( pCondition != "" ) sqlstr += " where " + pCondition;
-        var data = db.table(sqlstr + (sortfields != undefined ? " order by " + sortfields.join(", ") : "" ));
-
-        // loop over all returned datasets
-        for(let j = 0; j < data.length; j++)
-        {
-            // loop over all possible resolveFunction entries
-            for(let k = 0; k < functionCalls.length; k++ )
-            {
-                // get the local variables, which should be present in the function call
-                var localVars = functionCalls[k][3];
-                // add the row id value to the localVars Object so the funtion can gather the data for this dataset
-                localVars.rowIDValue = data[j][ functionCalls[k][0] ];
-                // replace the row id with its base64 string
-                data[j][ functionCalls[k][0] ] = evalScript("Address_lib.fetchAddressData.resolveFunction", 
-                    vars.resolveVariables( functionCalls[k][1]+"()" ), 
-                    localVars, 
-                    functionCalls[k][2], // imports
-                    true);
-            }
-        }
-        
-        if ( data.length == 0 ) 
-        {   
-            logging.log("Address_lib: " +  pCondition, logging.ERROR);
-            data = [[]];
-            for (let i = 0; i < addrfields.length + fields.length; i++ )   data[0].push("Err.");
-        }
-        data = [ data, output, header, addrfields ];
-    }
-    return data;
-}
-
-/*
-* reads data from the database
-* 
-* @param {String [[]]} pData req array of data
-* 
-* @return {String [[]]}  data 
-*/
-function setAddressData( pData )
-{ 
-    var sqlresult = pData[0];
-    var data = [];
-    if ( sqlresult.length > 0 )
-    {
-        var output = pData[1]; 
-        var header = pData[2];
-        var addrfields = pData[3];
-        data.push( header );
-        for ( var i = 0; i < sqlresult.length; i++ )
-        {		
-            var addrdata = [];
-            var row = [];	
-            for ( var z = 0; z < header.length; z++ )
-            {
-                switch( output[z][1] )
-                {
-                    case Placeholder.types.SQLPART:
-                    case Placeholder.types.SQLPARTFUNCTION:
-                    case "afunction":
-                    case "resolveIDFunction":
-                    case "select":
-                        row[z] = sqlresult[i][output[z][0]];
-                        break;
-                    case Placeholder.types.ADDRESSFORMAT:
-                        if (addrdata.length == 0) addrdata = _getAddrData( sqlresult[i].slice(output[z][0], output[z][0] + addrfields.length) );
-                        row[z] = _formatAddrData( addrdata, output[z][2], false );
-                        break;
-                }
-            }
-            data.push( row );
-        }
-    }
-    return data;
-}
-/*
-*
-* returns formatted address data
-*
-* @param {String [[]]} pData req data 
-*
-* @return {String [[]]} formatted data
-*/
-function _getAddrData( pData )
-{
-    var lettersalutation = pData[14];
-    var salutation = pData[19];
-    var sformat = "";
-    switch( Number(pData[0]) )
-    {
-        case 1:
-            if ( lettersalutation == "" ) 
-            {
-                sformat = _getSalutation( pData[22] );
-                if ( sformat != undefined && sformat[1] != "" ) lettersalutation = _formatAddrData( pData,  sformat[1] );
-                else lettersalutation = "Sehr geehrte Damen und Herren";
-            }
-            break;
-        case 2:
-            // private -> orgname deleted
-            pData[15] = "";
-        case 3:
-            sformat = _getSalutation( pData[22] + pData[19] + pData[20] );
-            //no language defined
-            if ( sformat == undefined )  sformat = _getSalutation( pData[19] + pData[20] );
-            // no language specific entry in salutation
-            if ( sformat == undefined || sformat[0] == "" || sformat[1] == "" )	sformat = ["{sa} {ti} {fn} {la}", "{sa} {ti} {ln}"];
-            salutation = _formatAddrData( pData,  sformat[0] );
-            // lettersalutation if none existent yet
-            if( lettersalutation == "" ) lettersalutation = _formatAddrData( pData, sformat[1] );
-    }
-
-    pData[23] = salutation;
-    pData[24] = lettersalutation;
-    pData[25] = _getCountryName(pData[5]);
-    return pData;
-}
-
-/*
-* returns a formatted salutation
-* 
-* @param {String} pSalutCode req salutation code
-* 
-* @return {String} translated salutation
-*/
-function _getSalutation( pSalutCode )
-{
-    var salut = new Object();
-    if (vars.exists("$global.Salutation")) {
-        salut = vars.get("$global.Salutation");
-    }
-    else
-    {	
-        var list = db.table("select LANGUAGE, SALUTATION, TITLE, HEADLINE, LETTERSALUTATION from SALUTATION" );
-        for ( var i = 0; i < list.length; i++ )	
-        {   
-            salut[list[i][0] + list[i][1] + list[i][2]] = [list[i][3], list[i][4]];
-            salut[list[i][1] + list[i][2]] = [list[i][3], list[i][4]];
-        }
-        vars.set("$global.Salutation", salut);
-    }
-    return salut[pSalutCode];
-}
-
-/*
-* returns country names 
-*
-* @param {String} pCountryCode req countrycode
-*
-* @return {String} translated countryname
-*/
-function _getCountryName(pCountryCode)
-{
-    var countryname = new Object();
-    if ( vars.exists("$global.CountryName")) countryname = vars.get("$global.CountryName");
-    else
-    {	
-        var list = db.table("select ISO2, NAME_NATIVE from AB_COUNTRYINFO" );
-        for (var i=0; i < list.length; i++ )	countryname[list[i][0]] = translate.text(list[i][1]);
-        vars.set("$global.CountryName", countryname);
-    }
-    return countryname[pCountryCode];
-}
-
-/*
-* returns a formatted address
-*
-* @param {String [[]]} pAddrData req Address data 
-* @param {String} pFormat opt given format
-* @param {boolean} pCountry if the country should be displayed
-*
-* @return {String} formatted address
-*/
-function _formatAddrData( pAddrData, pFormat, pCountry )
-{
-    var placeholerInfo = {
-        "street":       {dataPosition: 1},
-        "buildingno":   {dataPosition: 2},
-        "zip":          {dataPosition: 3},
-        "city":         {dataPosition: 4},
-        "district":     {dataPosition: 8},
-        "region":       {dataPosition: 9},
-        "state":        {dataPosition: 10},
-        "firstname":    {dataPosition: 16},
-        "middlename":   {dataPosition: 17},
-        "lastname":     {dataPosition: 18},
-        "saluation":    {dataPosition: 19},
-        "title":        {dataPosition: 20},
-        "suffix":       {dataPosition: 21},
-        "country":      {dataPosition: 25},
-        "organisation_name":    {dataPosition: 15},
-        "salutation_name":      {dataPosition: 23},
-        "letter_salutation":    {dataPosition: 24}
-    };
-
-    var format = pFormat || pAddrData[26];       
-    format = _mapFormatPlaceholderTitles(format, pAddrData, pCountry);
-    
-    var res = format;    
-    for (var placeholder in placeholerInfo)
-    {
-        var currentAddrData = pAddrData[placeholerInfo[placeholder].dataPosition];
-        if (currentAddrData != undefined)
-        {
-            res = res.replace(new RegExp("{" + placeholder + "}", "g"), currentAddrData);
-            res = res.replace(new RegExp("{" + placeholder.toUpperCase() + "}", "g"), currentAddrData.toUpperCase());
-        }
-    }
-
-    res = res.replace(/^\n/, "");  // CR am Anfang entfernen;
-    res = res.replace(/  /g, " "); // doppelte leerzeichen entfernen
-    res = res.replace(/\\n/ig, "\n");	// newline marker ersetzen
-    res = res.replace(/ *\n */g, "\n");// leerzeichen am ende und Anfang entfernen
-    res = res.replace(/\s(?=\s)/g, "");	// leerzeilen rauswerfen
-    return res;
-}
-
-/*
-* returns the new format 
-*
-* @param {String [[]]} pAddrData req Daten 
-* @param {String} pFormat req the format string
-* @param {boolean} pCountry if the country should be displayed
-*
-* @return {String} new formate
-* 
-N – Name - salutation
-O – Organisation - orgname
-A – Street Address Line(s) - address + buildingno
-D – Dependent locality - district / region
-C – City or Locality - city
-S – Administrative area - state
-Z – Zip or postal code - zip
-X – Sorting code - not available
-*/
-function _mapFormatPlaceholderTitles(pFormat, pAddrData, pCountry) 
-{
-    //gstatic-paceholders
-    pFormat = pFormat.replace(new RegExp("%N", "g"), "{salutation_name}");
-    pFormat = pFormat.replace(new RegExp("%A", "g"), "{street} {buildingno}");  
-    pFormat = pFormat.replace(new RegExp("%C", "g"), "{city}");
-    pFormat = pFormat.replace(new RegExp("%S", "g"), "{state}");
-    pFormat = pFormat.replace(new RegExp("%Z", "g"), "{zip}");
-    pFormat = pFormat.replace(new RegExp("%O", "g"), "{organisation_name}");
-    pFormat = pFormat.replace(new RegExp("%X", "g"), "");   
-    pFormat = pFormat.replace(new RegExp("%n", "g"), "\n");
-    
-    //shortform adito-placeholders
-    pFormat = pFormat.replace(new RegExp("{fn}", "g"), "{firstname}");
-    pFormat = pFormat.replace(new RegExp("{ln}", "g"), "{lastname}");
-    pFormat = pFormat.replace(new RegExp("{ti}", "g"), "{title}");
-    pFormat = pFormat.replace(new RegExp("{sa}", "g"), "{salutation}");
-    
-    if (pAddrData[8] == pAddrData[9])
-        pFormat = pFormat.replace(new RegExp("%D", "g"), "{district}");
-    else
-        pFormat = pFormat.replace(new RegExp("%D", "g"), "{district} \n {region}");   
-    
-    if(pCountry == undefined || pCountry == null || pCountry == true)
-        pFormat = pFormat + "\n {country}";
-    
-    return pFormat;
+import("Employee_lib");
+import("system.swing");
+import("system.text");
+import("system.db");
+import("system.logging");
+import("system.vars");
+import("system.translate");
+import("Attribute_lib");
+import("Sql_lib");
+import("Util_lib");
+import("DocumentTemplate_lib");
+
+/*
+* Creates a Address Object
+* 
+* @param {String} pContactId req relationid for which address should be retrieved
+* @param {String} pAddressId opt addressid for which address should be retrieved
+* @param {boolean} pPerson whether the address is from a person, not an organisation
+*  
+* @return {String} the formatted address
+*/
+
+function AddrObject(pContactId, pPerson, pAddressId)
+{
+    this.Data = fetchAddressData([pContactId], [new Placeholder("", Placeholder.types.ADDRESSFORMAT, "")], pAddressId, pPerson);
+    this.fmt = this.Data[0][0][26]; 
+	
+    /*
+    * creates a formatted address
+    * 
+    * @param {boolean} pCountry whether the country should be displayed
+    * @param {String} pFormat a fixed format for the address
+    * 
+    * @return {String} formatted address
+    */
+    this.getFormattedAddress = function( pCountry, pFormat )
+    {	
+        return _formatAddrData( _getAddrData(  this.Data[0][0] ), pFormat, pCountry );
+    }
+}
+
+/*
+* creates address data
+* 
+* @param {String} pCondition req SQL-Where-Condition  
+* @param {Object []} pConfig req ( name, functionality, details )
+* @param {String} pSenderID opt UserRelationID
+* @param {String} pAddressID opt addressid
+* 
+* @return {[]}  Daten 
+*/
+function getAddressesData( pCondition, pConfig, pSenderID, pAddressID )
+{ 
+    var returndata = [];
+    var senderconfig = [];
+    var employeeconfig = [];
+    var config = [];
+    for (let i = 0; i < pConfig.length; i++)
+    {
+        switch (pConfig[i].target)
+        {
+            case Placeholder.targets.EMPLOYEE:
+                employeeconfig.push(pConfig[i]);
+                break;
+            case Placeholder.targets.SENDER:
+                senderconfig.push(pConfig[i]);
+                break;
+            case Placeholder.targets.RECIPIENT:
+            default:
+                config.push(pConfig[i]);
+                break;
+        } 
+    }
+    var data = getAddressData(pCondition, config, pAddressID);
+    if (pSenderID == undefined)  pSenderID = vars.get("$global.user").relationid;
+    if (senderconfig.length > 0) 
+        var senderdata = getAddressData([pSenderID], senderconfig);
+    if (employeeconfig.length > 0) 
+        var employeedata = getAddressData([EmployeeUtils.getCurrentContactId()], employeeconfig);
+    if (data.length > 0 && (senderconfig.length > 0 || employeeconfig.length > 0))
+    { 
+        var ze = data[0];
+        if (employeeconfig.length > 0) ze = ze.concat(employeedata[0]);
+        if (senderconfig.length > 0) ze = ze.concat(senderdata[0]); 
+        returndata.push(ze);
+        for (let i = 1; i < data.length; i++)
+        {
+            ze = data[i];
+            if (employeeconfig.length > 0) ze = ze.concat(employeedata[1]);
+            if (senderconfig.length > 0) ze = ze.concat(senderdata[1]); 
+            returndata.push(ze);
+        }
+        return returndata;
+    }
+    else return data;
+}
+
+/*
+* creates
+* 
+* @param {String} pCondition req SQL-Where-Condition  
+* @param {Placeholder[]} pConfig req array of placeholders
+* @param {String} AddressID opt addressid
+* 
+* @return {[]}  Daten 
+*/
+function getAddressData( pCondition, pConfig, AddressID )
+{ 
+    return setAddressData( fetchAddressData( pCondition, pConfig, AddressID ) );
+}
+
+/*
+* reads data from the database
+* 
+* @param {String} pCondition req SQL-Where-Condition  
+* @param {Placeholder[]} pConfig req array of placeholders
+* @param {String} AddressID opt addressid
+* @param {boolean} pPerson opt if private person
+* 
+* @return {Array} 2d-Array, structure: [[ data, output, header, addrfields ]]
+*/
+function fetchAddressData( pCondition, pConfig, AddressID, pPerson )
+{ 
+    if ( typeof(pCondition) == "object") pCondition = "CONTACT.CONTACTID in ('" + pCondition.join("','") + "')";
+    if ( pConfig.length > 0 )
+    { 
+        var header = [];
+        var fields = [];
+        var output = [];
+        var pos = 0;
+        var posaddrfields = -1;
+        var functionCalls = [];
+        var addrfields = [
+            "case when CONTACT.PERSON_ID is null then 1 else case when " + SqlMaskingUtils.prototype.trim("CONTACT.ORGANISATION_ID") + " = '0' then 2 else 3 end end", //0
+            "ADDRESS.ADDRESS", "ADDRESS.BUILDINGNO", "ADDRESS.ZIP", "ADDRESS.CITY", "ADDRESS.COUNTRY", "ADDRESS.ADDRESSADDITION",  // 1-6
+            "ADDRESS.ADDRIDENTIFIER", "ADDRESS.DISTRICT", "ADDRESS.REGION", "ADDRESS.STATE", "CONTACT.DEPARTMENT", "CONTACT.CONTACTROLE", // 7-12
+            "CONTACT.POSITION", "CONTACT.LETTERSALUTATION", "ORGANISATION.NAME", "PERSON.FIRSTNAME", "PERSON.MIDDLENAME", "PERSON.LASTNAME",  // 13-18
+            "PERSON.SALUTATION", "PERSON.TITLE", "PERSON.TITLESUFFIX", // 19-21
+            "coalesce( CONTACT.LANGUAGE, (select C.LANGUAGE from CONTACT C where C.ORGANISATION_ID = CONTACT.ORGANISATION_ID and PERSON_ID is null))", // 22
+            "''", "''", "''", "(select ADDR_FORMAT from AB_COUNTRYINFO where ISO2 = ADDRESS.COUNTRY)", "ADDRESS.ADDR_TYPE" // 23-27
+        ];
+											
+        for (let i=0; i < pConfig.length; i++ )
+        {
+            switch( pConfig[i].type )
+            {
+                case Placeholder.types.SQLPART: //sql part
+                    fields.push( pConfig[i].valueDefinition ); 
+                    output.push([pos++, pConfig[i].type]);
+                    header.push( pConfig[i].placeholderName );
+                    break;
+                case Placeholder.types.SQLPARTFUNCTION: // adito SQL functions
+                    fields.push("(" + pConfig[i].valueDefinition.call() + ")");
+                    output.push([pos++, pConfig[i].type]);
+                    header.push( pConfig[i].placeholderName );
+                    break;
+                case Placeholder.types.ADDRESSFORMAT:
+                    if ( posaddrfields == -1 )
+                    {        
+                        var sortfields = ["ORGANISATION.NAME", "PERSON.LASTNAME"];
+                        fields.push( addrfields.join(", ") );
+                        posaddrfields = pos;
+                        pos += addrfields.length;								
+                    }
+                    output.push([posaddrfields, pConfig[i].type, pConfig[i].valueDefinition]);
+                    header.push( pConfig[i].placeholderName );
+                    break;
+                    
+                case "afunction": // adito functions
+                    try
+                    {
+                        fields.push( "'" + evalScript("Address_lib.fetchAddressData", vars.resolveVariables(pConfig[i].valueDefinition), {}, ["Attribute_lib", "Sql_lib", "Keyword_lib", "Person_lib"], true).replace(new RegExp("'","g"), "''") + "'" ); 
+                        output.push([pos++, pConfig[i].type]);
+                        header.push( pConfig[i].placeholderName );
+                    }
+                    catch( err )
+                    {                      
+                        logging.log( err )
+                    }
+                    break;
+                case "resolveIDFunction":
+                    var configJSON = pConfig[i].valueDefinition;
+                    fields.push( configJSON.rowIDField );
+
+                    functionCalls.push([pos,
+                        configJSON.resolveFunction,
+                        configJSON.imports,
+                        configJSON.localVars]);
+                                    
+                    output.push([pos++, pConfig[i].type]);
+                    header.push( pConfig[i].placeholderName );                
+                    break;
+            }
+        }
+        if (!pPerson) {           
+            var sqlstr =  "select " + fields.join(",") 
+            + " from CONTACT join ORGANISATION on CONTACT.ORGANISATION_ID = ORGANISATION.ORGANISATIONID "
+            + " left join PERSON on CONTACT.PERSON_ID = PERSON.PERSONID "
+            + " left join ADDRESS on CONTACT.ADDRESS_ID = ";
+        } else {
+            
+            sqlstr = "select " + fields.join(",")
+            + " from CONTACT join PERSON on CONTACT.PERSON_ID = PERSON.PERSONID "
+            + " left join ORGANISATION on CONTACT.ORGANISATION_ID = ORGANISATION.ORGANISATIONID "
+            + " left join ADDRESS on CONTACT.ADDRESS_ID = ";
+        }
+        
+        if ( AddressID != undefined && AddressID != "" )  
+            sqlstr += "'" + AddressID + "'"; 
+        else 
+            sqlstr += "ADDRESS.ADDRESSID";
+        if ( pCondition != "" ) sqlstr += " where " + pCondition;
+        var data = db.table(sqlstr + (sortfields != undefined ? " order by " + sortfields.join(", ") : "" ));
+
+        // loop over all returned datasets
+        for(let j = 0; j < data.length; j++)
+        {
+            // loop over all possible resolveFunction entries
+            for(let k = 0; k < functionCalls.length; k++ )
+            {
+                // get the local variables, which should be present in the function call
+                var localVars = functionCalls[k][3];
+                // add the row id value to the localVars Object so the funtion can gather the data for this dataset
+                localVars.rowIDValue = data[j][ functionCalls[k][0] ];
+                // replace the row id with its base64 string
+                data[j][ functionCalls[k][0] ] = evalScript("Address_lib.fetchAddressData.resolveFunction", 
+                    vars.resolveVariables( functionCalls[k][1]+"()" ), 
+                    localVars, 
+                    functionCalls[k][2], // imports
+                    true);
+            }
+        }
+        
+        if ( data.length == 0 ) 
+        {   
+            logging.log("Address_lib: " +  pCondition, logging.ERROR);
+            data = [[]];
+            for (let i = 0; i < addrfields.length + fields.length; i++ )   data[0].push("Err.");
+        }
+        data = [ data, output, header, addrfields ];
+    }
+    return data;
+}
+
+/*
+* reads data from the database
+* 
+* @param {String [[]]} pData req array of data
+* 
+* @return {String [[]]}  data 
+*/
+function setAddressData( pData )
+{ 
+    var sqlresult = pData[0];
+    var data = [];
+    if ( sqlresult.length > 0 )
+    {
+        var output = pData[1]; 
+        var header = pData[2];
+        var addrfields = pData[3];
+        data.push( header );
+        for ( var i = 0; i < sqlresult.length; i++ )
+        {		
+            var addrdata = [];
+            var row = [];	
+            for ( var z = 0; z < header.length; z++ )
+            {
+                switch( output[z][1] )
+                {
+                    case Placeholder.types.SQLPART:
+                    case Placeholder.types.SQLPARTFUNCTION:
+                    case "afunction":
+                    case "resolveIDFunction":
+                    case "select":
+                        row[z] = sqlresult[i][output[z][0]];
+                        break;
+                    case Placeholder.types.ADDRESSFORMAT:
+                        if (addrdata.length == 0) addrdata = _getAddrData( sqlresult[i].slice(output[z][0], output[z][0] + addrfields.length) );
+                        row[z] = _formatAddrData( addrdata, output[z][2], false );
+                        break;
+                }
+            }
+            data.push( row );
+        }
+    }
+    return data;
+}
+/*
+*
+* returns formatted address data
+*
+* @param {String [[]]} pData req data 
+*
+* @return {String [[]]} formatted data
+*/
+function _getAddrData( pData )
+{
+    var lettersalutation = pData[14];
+    var salutation = pData[19];
+    var sformat = "";
+    switch( Number(pData[0]) )
+    {
+        case 1:
+            if ( lettersalutation == "" ) 
+            {
+                sformat = _getSalutation( pData[22] );
+                if ( sformat != undefined && sformat[1] != "" ) lettersalutation = _formatAddrData( pData,  sformat[1] );
+                else lettersalutation = "Sehr geehrte Damen und Herren";
+            }
+            break;
+        case 2:
+            // private -> orgname deleted
+            pData[15] = "";
+        case 3:
+            sformat = _getSalutation( pData[22] + pData[19] + pData[20] );
+            //no language defined
+            if ( sformat == undefined )  sformat = _getSalutation( pData[19] + pData[20] );
+            // no language specific entry in salutation
+            if ( sformat == undefined || sformat[0] == "" || sformat[1] == "" )	sformat = ["{sa} {ti} {fn} {la}", "{sa} {ti} {ln}"];
+            salutation = _formatAddrData( pData,  sformat[0] );
+            // lettersalutation if none existent yet
+            if( lettersalutation == "" ) lettersalutation = _formatAddrData( pData, sformat[1] );
+    }
+
+    pData[23] = salutation;
+    pData[24] = lettersalutation;
+    pData[25] = _getCountryName(pData[5]);
+    return pData;
+}
+
+/*
+* returns a formatted salutation
+* 
+* @param {String} pSalutCode req salutation code
+* 
+* @return {String} translated salutation
+*/
+function _getSalutation( pSalutCode )
+{
+    var salut = new Object();
+    if (vars.exists("$global.Salutation")) {
+        salut = vars.get("$global.Salutation");
+    }
+    else
+    {	
+        var list = db.table("select LANGUAGE, SALUTATION, TITLE, HEADLINE, LETTERSALUTATION from SALUTATION" );
+        for ( var i = 0; i < list.length; i++ )	
+        {   
+            salut[list[i][0] + list[i][1] + list[i][2]] = [list[i][3], list[i][4]];
+            salut[list[i][1] + list[i][2]] = [list[i][3], list[i][4]];
+        }
+        vars.set("$global.Salutation", salut);
+    }
+    return salut[pSalutCode];
+}
+
+/*
+* returns country names 
+*
+* @param {String} pCountryCode req countrycode
+*
+* @return {String} translated countryname
+*/
+function _getCountryName(pCountryCode)
+{
+    var countryname = new Object();
+    if ( vars.exists("$global.CountryName")) countryname = vars.get("$global.CountryName");
+    else
+    {	
+        var list = db.table("select ISO2, NAME_NATIVE from AB_COUNTRYINFO" );
+        for (var i=0; i < list.length; i++ )	countryname[list[i][0]] = translate.text(list[i][1]);
+        vars.set("$global.CountryName", countryname);
+    }
+    return countryname[pCountryCode];
+}
+
+/*
+* returns a formatted address
+*
+* @param {String [[]]} pAddrData req Address data 
+* @param {String} pFormat opt given format
+* @param {boolean} pCountry if the country should be displayed
+*
+* @return {String} formatted address
+*/
+function _formatAddrData( pAddrData, pFormat, pCountry )
+{
+    var placeholerInfo = {
+        "street":       {dataPosition: 1},
+        "buildingno":   {dataPosition: 2},
+        "zip":          {dataPosition: 3},
+        "city":         {dataPosition: 4},
+        "district":     {dataPosition: 8},
+        "region":       {dataPosition: 9},
+        "state":        {dataPosition: 10},
+        "firstname":    {dataPosition: 16},
+        "middlename":   {dataPosition: 17},
+        "lastname":     {dataPosition: 18},
+        "saluation":    {dataPosition: 19},
+        "title":        {dataPosition: 20},
+        "suffix":       {dataPosition: 21},
+        "country":      {dataPosition: 25},
+        "organisation_name":    {dataPosition: 15},
+        "salutation_name":      {dataPosition: 23},
+        "letter_salutation":    {dataPosition: 24}
+    };
+
+    var format = pFormat || pAddrData[26];       
+    format = _mapFormatPlaceholderTitles(format, pAddrData, pCountry);
+    
+    var res = format;    
+    for (var placeholder in placeholerInfo)
+    {
+        var currentAddrData = pAddrData[placeholerInfo[placeholder].dataPosition];
+        if (currentAddrData != undefined)
+        {
+            res = res.replace(new RegExp("{" + placeholder + "}", "g"), currentAddrData);
+            res = res.replace(new RegExp("{" + placeholder.toUpperCase() + "}", "g"), currentAddrData.toUpperCase());
+        }
+    }
+
+    res = res.replace(/^\n/, "");  // CR am Anfang entfernen;
+    res = res.replace(/  /g, " "); // doppelte leerzeichen entfernen
+    res = res.replace(/\\n/ig, "\n");	// newline marker ersetzen
+    res = res.replace(/ *\n */g, "\n");// leerzeichen am ende und Anfang entfernen
+    res = res.replace(/\s(?=\s)/g, "");	// leerzeilen rauswerfen
+    return res;
+}
+
+/*
+* returns the new format 
+*
+* @param {String [[]]} pAddrData req Daten 
+* @param {String} pFormat req the format string
+* @param {boolean} pCountry if the country should be displayed
+*
+* @return {String} new formate
+* 
+N – Name - salutation
+O – Organisation - orgname
+A – Street Address Line(s) - address + buildingno
+D – Dependent locality - district / region
+C – City or Locality - city
+S – Administrative area - state
+Z – Zip or postal code - zip
+X – Sorting code - not available
+*/
+function _mapFormatPlaceholderTitles(pFormat, pAddrData, pCountry) 
+{
+    //gstatic-paceholders
+    pFormat = pFormat.replace(new RegExp("%N", "g"), "{salutation_name}");
+    pFormat = pFormat.replace(new RegExp("%A", "g"), "{street} {buildingno}");  
+    pFormat = pFormat.replace(new RegExp("%C", "g"), "{city}");
+    pFormat = pFormat.replace(new RegExp("%S", "g"), "{state}");
+    pFormat = pFormat.replace(new RegExp("%Z", "g"), "{zip}");
+    pFormat = pFormat.replace(new RegExp("%O", "g"), "{organisation_name}");
+    pFormat = pFormat.replace(new RegExp("%X", "g"), "");   
+    pFormat = pFormat.replace(new RegExp("%n", "g"), "\n");
+    
+    //shortform adito-placeholders
+    pFormat = pFormat.replace(new RegExp("{fn}", "g"), "{firstname}");
+    pFormat = pFormat.replace(new RegExp("{ln}", "g"), "{lastname}");
+    pFormat = pFormat.replace(new RegExp("{ti}", "g"), "{title}");
+    pFormat = pFormat.replace(new RegExp("{sa}", "g"), "{salutation}");
+    
+    if (pAddrData[8] == pAddrData[9])
+        pFormat = pFormat.replace(new RegExp("%D", "g"), "{district}");
+    else
+        pFormat = pFormat.replace(new RegExp("%D", "g"), "{district} \n {region}");   
+    
+    if(pCountry == undefined || pCountry == null || pCountry == true)
+        pFormat = pFormat + "\n {country}";
+    
+    return pFormat;
 }
\ No newline at end of file
diff --git a/process/Attribute_lib/process.js b/process/Attribute_lib/process.js
index 37898cbc0b23bd7a1e47df931088405add877d79..9e3e472a98b9587d8fa8bf06015cf002dbf820c8 100644
--- a/process/Attribute_lib/process.js
+++ b/process/Attribute_lib/process.js
@@ -1,3 +1,4 @@
+import("Context_lib");
 import("system.util");
 import("system.datetime");
 import("system.translate");
@@ -188,6 +189,8 @@ AttributeUtil.hasRelations = function (pAttributeId)
  */
 AttributeUtil.getAttributeType = function (pAttributeId)
 {
+    if (!pAttributeId)
+        return "";
     var attrTypeSelect = "select ATTRIBUTE_TYPE from AB_ATTRIBUTE";
     attrTypeSelect = SqlCondition.begin()
         .andPrepare("AB_ATTRIBUTE.AB_ATTRIBUTEID", pAttributeId)
@@ -225,7 +228,7 @@ AttributeRelationUtils.getAttribute = function (pAttributeId, pObjectRowId, pObj
     
     var defaultFields = [
         "AB_ATTRIBUTE.ATTRIBUTE_TYPE", 
-        "AB_ATTRIBUTE.KEYWORD_CONTAINER", 
+        "AB_ATTRIBUTE.DROPDOWNDEFINITION", 
         "COMBOVAL.ATTRIBUTE_NAME"
     ];
     var valueFields = AttributeTypeUtil.getAllDatabaseFields();
@@ -266,7 +269,7 @@ AttributeRelationUtils.getAllAttributes = function (pObjectRowId, pObjectType, p
     var defaultFields = [
         "AB_ATTRIBUTE_ID", 
         "AB_ATTRIBUTE.ATTRIBUTE_TYPE", 
-        "AB_ATTRIBUTE.KEYWORD_CONTAINER", 
+        "AB_ATTRIBUTE.DROPDOWNDEFINITION", 
         "COMBOVAL.ATTRIBUTE_NAME"
     ];
     var valueFields = AttributeTypeUtil.getAllDatabaseFields();
@@ -307,7 +310,7 @@ AttributeRelationUtils.getAllAttributes = function (pObjectRowId, pObjectType, p
  */
 AttributeRelationUtils.selectAttributeValue = function (pAttributeId, pValueMap, pGetViewValue)
 {
-    var sqlSelect = "select ATTRIBUTE_TYPE, KEYWORD_CONTAINER from AB_ATTRIBUTE";
+    var sqlSelect = "select ATTRIBUTE_TYPE, DROPDOWNDEFINITION from AB_ATTRIBUTE";
     var type = db.array(db.ROW, SqlCondition.begin()
         .andPrepare("AB_ATTRIBUTE.AB_ATTRIBUTEID", pAttributeId)
         .buildSql(sqlSelect)
@@ -444,7 +447,7 @@ AttributeRelationUtils.validateAttributeCount = function (pRowId, pObjectType, p
     
     return validationMessage.join("\n");
     
-    //returns the correct count expression by chossing either singular (1 time) or plural (2 times)
+    //returns the correct count expression by choosing either singular (1 time) or plural (2 times)
     function _getTranslatedCount (pCount)
     {
         if (pCount == 1)
@@ -526,25 +529,29 @@ AttributeRelationUtils.countAttributeRelations = function (pRowId, pObjectType,
  * This Object is only for the general definition of attribute types and for getting
  * data about every type, anything that has to do with a specific attribute (= the function requires an attribute id)
  * should be done in AttributeUtils.
- * The values for each type are:
+ * The required values and methods for each type are:
  * 
- * keyword = the key of the corresponding keyword
+ * toString = function that should return a unique name
  * contentType = the value that is returned in the contentType process for the attribute
  * databaseField = the database field that holds values of attributes with the type
  * 
+ * optional:
+ * getViewValue = function that gets the display value for a given value
+ * isGroup = if true, the attribute can have children
+ * getDropDownDefinitions = function that returns an array of possible values
+ *          for DROPDOWNDEFINITION
+ * 
  * The display name is controlled by the keyword 'AttributeType'
  */
 function $AttributeTypes () {}
 
 $AttributeTypes.TEXT = { 
-    toString : function () {return this.keyword},
-    keyword : "TEXT",
+    toString : function () {return "TEXT";},
     contentType : "TEXT", 
     databaseField : "CHAR_VALUE"
 };
 $AttributeTypes.DATE = {
-    toString : function () {return this.keyword},
-    keyword : "DATE",
+    toString : function () {return "DATE";},
     contentType : "DATE", 
     databaseField : "DATE_VALUE",
     getViewValue : function (pValue)
@@ -553,14 +560,12 @@ $AttributeTypes.DATE = {
         }
 };
 $AttributeTypes.NUMBER = {
-    toString : function () {return this.keyword},
-    keyword : "NUMBER",
+    toString : function () {return  "NUMBER";},
     contentType : "NUMBER", 
     databaseField : "NUMBER_VALUE"
 };
 $AttributeTypes.BOOLEAN = {
-    toString : function () {return this.keyword},
-    keyword : "BOOLEAN",
+    toString : function () {return "BOOLEAN";},
     contentType : "BOOLEAN", 
     databaseField : "INT_VALUE",
     getViewValue : function (pValue)
@@ -569,48 +574,63 @@ $AttributeTypes.BOOLEAN = {
         }
 };
 $AttributeTypes.COMBO = {
-    toString : function () {return this.keyword},
-    keyword : "COMBO",
+    toString : function () {return "COMBO";},
     contentType : "UNKNOWN",
     databaseField : "ID_VALUE",
     isGroup : true
 };
 $AttributeTypes.COMBOVALUE = {
-    toString : function () {return this.keyword},
-    keyword : "COMBOVALUE",
+    toString : function () {return "COMBOVALUE";},
     contentType : null, 
     databaseField : null
 };
 $AttributeTypes.GROUP = {
-    toString : function () {return this.keyword},
-    keyword : "GROUP",
+    toString : function () {return "GROUP";},
     contentType : null, 
     databaseField : null,
     isGroup : true
 };
 $AttributeTypes.KEYWORD = {
-    toString : function () {return this.keyword},
-    keyword : "KEYWORD",
+    toString : function () {return "KEYWORD";},
     contentType : "UNKNOWN", 
     databaseField : "ID_VALUE", 
     getViewValue : function (pValue, pKeyword)
         {
             return KeywordUtils.getViewValue(pKeyword, pValue);
+        },
+    getDropDownDefinitions : function ()
+        {
+            return KeywordUtils.getContainerNames().map(function (e)
+            {
+                return [e, e];//currently the first column is ID, second view value - which is the same because there is no ID for keyword-containers
+            });
         }
 };
 $AttributeTypes.VOID = {
-    toString : function () {return this.keyword},
-    keyword : "VOID",
+    toString : function () {return "VOID";},
     contentType : null,
     databaseField : null,
     isGroup : true
 };
 $AttributeTypes.MEMO = { 
-    toString : function () {return this.keyword},
-    keyword : "MEMO",
+    toString : function () {return "MEMO";},
     contentType : "LONG_TEXT", 
     databaseField : "CHAR_VALUE"
 };
+$AttributeTypes.OBJECTSELECTION = {
+    toString : function () {return "OBJECTSELECTION";},
+    contentType : "UNKNOWN",
+    databaseField : "ID_VALUE",
+    getViewValue : function (pValue, pModule)
+        {
+            return db.cell(ContextUtils.getNameSql(pModule, pValue));
+        },
+    getDropDownDefinitions : function ()
+        {
+            return ContextUtils.getContexts(true);
+        }
+};
+
 
 function AttributeTypeUtil () {}
 
@@ -705,8 +725,6 @@ AttributeTypeUtil.getTypeColumnIndex = function (pAttributeType)
 /**
  * Functions for AttributeUsages.
  * Do not instanciate this!
- * 
- * @class
  */
 function AttributeUsageUtil () {}
 
diff --git a/process/Bulkmail_lib/Bulkmail_lib.aod b/process/Bulkmail_lib/Bulkmail_lib.aod
new file mode 100644
index 0000000000000000000000000000000000000000..e02358029db1060e0396ba5d77f7b402cf4d7d27
--- /dev/null
+++ b/process/Bulkmail_lib/Bulkmail_lib.aod
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
+  <name>Bulkmail_lib</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <process>%aditoprj%/process/Bulkmail_lib/process.js</process>
+  <variants>
+    <element>LIBRARY</element>
+  </variants>
+</process>
diff --git a/process/Bulkmail_lib/process.js b/process/Bulkmail_lib/process.js
new file mode 100644
index 0000000000000000000000000000000000000000..27a4b8362f5d4c49ca9a2094eb1fab7919eddaa8
--- /dev/null
+++ b/process/Bulkmail_lib/process.js
@@ -0,0 +1,6 @@
+import("DocumentTemplate_lib");
+
+function Bulkmail ()
+{
+    
+}
\ No newline at end of file
diff --git a/process/Contact_lib/process.js b/process/Contact_lib/process.js
index 9db41fc6d453cbda9df6b68a85835c6f956c22ea..5cca68dfd2b81d5023746b9596a1ca2a1a78baa1 100644
--- a/process/Contact_lib/process.js
+++ b/process/Contact_lib/process.js
@@ -1,528 +1,550 @@
-import("system.translate");
-import("system.neon");
-import("system.vars");
-import("system.result");
-import("system.db");
-import("Sql_lib");
-import("Util_lib");
-import("Context_lib");
-
-/**
- * a static Utility class for organisations
- * 
- * Do not create an instance of this!
- * @class
- */
-function OrganisationUtils() {}
-
-/*
- * retrieves the name of an organisation with a select statement
- * 
- * @param {String} pOrganisationId the ID of the organisation that shall be searched in the database; 
- * 
- * @return {String} the name of the organisation
- */
-OrganisationUtils.getNameByOrganisationId = function(pOrganisationId)
-{
-    var orgname = "";
-    if (pOrganisationId)
-    {
-        orgname = db.cell(SqlCondition.begin()
-                                      .andPrepare("ORGANISATION.ORGANISATIONID", pOrganisationId)
-                                      .buildSql("select ORGANISATION.NAME from ORGANISATION"));
-    }
-    return orgname;
-};
-
-/*
- * retrieves the name of an organisation with a select statement
- * 
- * @param {String} pContactId the ID of the corresponding org-contact of the organisation that shall be searched in the database; 
- * 
- * @return {String} the name of the organisation
- */
-OrganisationUtils.getNameByContactId = function(pContactId)
-{
-    var orgname = "";
-    if (pContactId)
-    {
-        orgname = db.cell(SqlCondition.begin()
-            .andPrepare("CONTACT.CONTACTID", pContactId)
-            .buildSql("select ORGANISATION.NAME \n\
-                            from ORGANISATION \n\
-                            join CONTACT on (CONTACT.ORGANISATION_ID = ORGANISATION.ORGANISATIONID and CONTACT.PERSON_ID is null)"));
-    }
-    return orgname;
-};
-
-/**
- * a static Utility class for contacts
- * 
- * Do not create an instance of this!
- * @class
- */
-function ContactUtils() {}
-
-/*
- * validates if a ORGANISATION_ID in a person-contact is correct [=>does not already exist] or not [=>does already exist]
- * this is done by checking the database for entires that do already exist with this combination of ORGANISATIONID and PERSONID
- * gives different messages for private persons and contacts that do already exist
- * 
- * @param {String} pPersonId the ID of the person that shall be searched in the database
- * @param {String} pOrganisationId the ID of the organisation that shall be searched in the database; 
- *                                 if this is an empty string it will be treated as private-dummy-organisation
- * @param {String} [pOwnContactId] the CONTACTID of your current record; this is only needed when in EDIT-mode since you don't want to get a message 
- *                                  for your own CONTACT;
- *                                  (if you do a lookup if a organisation-person-combination does already exist you'l get your own contact which you want to exclude)
- * 
- * @return {String} translated text that describes whats the problem or null if there was no problem and everything is fine
- * 
- */
-ContactUtils.validateIfAlreadyExists = function(pPersonId, pOrganisationId, pOwnContactId)
-{
-    if (!pPersonId)
-        return null;
-    if (pOrganisationId == "")
-        pOrganisationId = "0";
-    var cond = SqlCondition.begin()
-    .andPrepare("CONTACT.PERSON_ID", pPersonId)
-    .andPrepare("CONTACT.ORGANISATION_ID", pOrganisationId)
-    //exclude the own since we do not want a "is not valid"-message for our own entry (on EDIT-mode)
-    .andPrepareIfSet("CONTACT.CONTACTID", pOwnContactId, "# != ?");
-
-    var sql = cond.buildSql("select CONTACT.CONTACTID from CONTACT");
-    var alreadyExistantContactId = db.cell(sql);
-    if (alreadyExistantContactId)
-        if (pOrganisationId.trim() == "0")
-            return translate.text("This private person doeas already exist and can not be created once more.");
-        else
-            return translate.text("This combination of person and organisation does already exist and can not be created once more.");
-    
-    return null;
-};
-
-/**
- * Get the type of contact. <br>
- * In recordstate NEW or EDIT it loads the person- / orgid from the db.<br>
- * But in the other states it uses the values pPersId, pOrgId directly (for performance).<br>
- * <br>
- * It only checks if pPersId / pOrgId are not empty. <br>
- * Based on which parameter is empty / not empty it return s the type of the contact. <br>
- *  <br>
- * !!It does not check if the person / org ids really exist!! <br>
- * !!And it does not check if really any contact with this person / org ids exist!! <br>
- *  <br>
- *  <br>
- * It is meant to be used by entitys, where you can load person and org with the DataRecord. <br>
- * This saves an extra select from CONTACT. <br>
- *  <br>
- *  <br>
- * @param {String} pContactId
- * @param {String} pPersId selected from the CONTACT table
- * @param {String} pOrgId selected from the CONTACT table
- *  <br>
- * @return {Integer} <br>0 if both ids are empty <br>
- *                      1 if organisation <br>
- *                      2 if privat person <br>
- *                      3 if person of an organisation <br>
- */
-ContactUtils.getContactType = function(pContactId, pPersId, pOrgId)
-{
-    if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW || vars.get("$sys.recordstate") == neon.OPERATINGSTATE_EDIT)
-    {
-        return ContactUtils.getContactTypeByContactId(pContactId);
-    }
-    else
-    {
-        return ContactUtils.getContactTypeByPersOrg(pPersId, pOrgId);
-    }
-}
-
-/**
- * get the type of contact for a relationId <br>
- * If you already have persId and orgId from the CONTACT table, use getContactTypeByPersOrg() <br>
- * @param {String} pContactId
- * <br>
- * @return {Integer} 0 if relationId not found <br>
- *                  1 if organisation <br>
- *                  2 if privat person <br>
- *                  3 if person of an organisation <br>
- */
-ContactUtils.getContactTypeByContactId = function(pContactId)
-{
-    var relationData = ContactUtils.getPersOrgIds(pContactId);
-    if (relationData[0]) 
-    {
-        return this.getContactTypeByPersOrg(relationData[1], relationData[2]);
-    }
-    else
-    {
-        return 0;
-    }
-}
-
-/**
- * Get the type of contact. <br>
- * It only checks if the parameters are not empty. <br>
- * Based on which parameter is empty / not empty it return s the type of the contact. <br>
- *  <br>
- * !!It does not check if the person / org ids really exist!! <br>
- * !!And it does not check if really any contact with this person / org ids exist!! <br>
- *  <br>
- * This function is more performant than getContactTypeByContactId, <br>
- * because it doesn't load something from the db. <br>
- *  <br>
- * It is meant to be used by entitys, where you can load person and org with the DataRecord. <br>
- * This saves an extra select from CONTACT. <br>
- *  <br>
- * @param {String} pPersId selected from the CONTACT table
- * @param {String} pOrgId selected from the CONTACT table
- *  <br>
- * @return {Integer} <br>0 if both ids are empty <br>
- *                      1 if organisation <br>
- *                      2 if privat person <br>
- *                      3 if person of an organisation <br>
- */
-ContactUtils.getContactTypeByPersOrg = function(pPersId, pOrgId)
-{
-    if (!pPersId)
-    {
-        if (!pOrgId) {
-            return 0; // both are empty
-        }
-        return 1;  // Organisation da PERSON_ID leer
-    }
-    else
-    {
-        if (pOrgId.replace(/\s/g,"") == "0" )
-        {
-            return 2; // Privatperson da PERSON_ID nicht leer und ORGANISATION_ID.trim() = '0'
-        }
-        else
-        {
-            return 3; // Person einer Organisation da PERSON_ID nicht leer und ORGANISATION_ID nicht '0'
-        }
-    }
-}
-
-/**
- * return the corresponding context of the contact
- * 
- * It only checks if the parameters are not empty. <br>
- * Based on which parameter is empty / not empty it return s the type of the contact. <br>
- *  <br>
- * !!It does not check if the person / org ids really exist!! <br>
- * !!And it does not check if really any contact with this person / org ids exist!! <br>
- *  <br>
- * This function is more performant than getContextByContactId, <br>
- * because it doesn't load something from the db. <br>
- *  <br>
- * It is meant to be used by entitys, where you can load person and org with the DataRecord. <br>
- * This saves an extra select from CONTACT. <br>
- *  <br>
- * 
- * @param {String} pPersId selected from the CONTACT table
- * @param {String} pOrgId selected from the CONTACT table
- * 
- * @return {String} contextname or "" if both ids are empty
- */
-ContactUtils.getContextByPersOrg = function(pPersId, pOrgId)
-{
-    switch (ContactUtils.getContactTypeByPersOrg(pPersId, pOrgId))
-    {
-        case 1: // Org
-            return ContextUtils.getContextName("Organisation");
-        case 2: // private Person
-        case 3: // Person
-            return ContextUtils.getContextName("Person");
-        default:
-            return "";
-    }
-}
-
-/**
- * return the corresponding context of the contact <br>
- * If you already have persId and orgId from the CONTACT table, use getContextByPersOrg() <br>
- * 
- * @param {String} pContactId
- * @return {String} contextname or "" if contact not found
- */
-ContactUtils.getContextByContactId = function(pContactId)
-{
-    var relationData = ContactUtils.getPersOrgIds(pContactId);
-    return ContactUtils.getContextByPersOrg(relationData[1], relationData[2])
-}
-
-/**
- * get the person- and org-id from a contact as array
- * 
- * @param {String} pContactId
- * @return {String[]} result as [contactid, persid, orgid] if one of them is null in the db, "" will be returned as the id.
- */
-ContactUtils.getPersOrgIds = function(pContactId)
-{
-    if (pContactId) {
-        return db.array(db.ROW, 
-            SqlCondition.begin()
-                        .andPrepare("CONTACT.CONTACTID", pContactId)
-                        .buildSql("select CONTACTID, PERSON_ID, ORGANISATION_ID from CONTACT", "1=0"));
-    }
-    
-    return [];
-}
-
-/**
- * get the name of the person or organisation
- * 
- * @param {String} pContactId the contact id where pers-name or orgname shall be loaded
- * 
- * @return {String} the name or ""
- */
-ContactUtils.getFullTitleByContactId = function(pContactId)
-{
-    if (pContactId) 
-    {
-        var data = db.array(db.ROW, SqlCondition.begin()
-                .andPrepare("CONTACT.CONTACTID", pContactId)
-                .buildSql("select ORGANISATION.NAME, PERSON.SALUTATION, PERSON.TITLE, PERSON.FIRSTNAME, PERSON.MIDDLENAME, PERSON.LASTNAME "
-                    + "from CONTACT CONTACT "
-                    + "join ORGANISATION on ORGANISATION.ORGANISATIONID = CONTACT.ORGANISATION_ID "
-                    + "left join PERSON on PERSON.PERSONID = CONTACT.PERSON_ID", "1 = 2"));
-        if (data.length == 0)
-            return "";
-        var contact = new Contact();
-        [contact.organisationName, contact.salutation, contact.title, contact.firstname, contact.middlename, contact.lastname] = data;
-        var renderer = new ContactTitleRenderer(contact);
-        return renderer.asString();
-    }
-    
-    return "";
-}
-
-/**
- * get the name of the person
- * do not use this for a mass of data (e.g. in a loop) since this will be slow due to select-time
- * 
- * @param {String} pPersonId the id of the person where the data shall be loaded
- * 
- * @return {String} the name or ""
- */
-ContactUtils.getTitleByPersonId = function(pPersonId)
-{
-    if (pPersonId) 
-    {
-        var data = db.array(db.ROW, SqlCondition.begin()
-            .andPrepare("PERSON.PERSONID", pPersonId)
-            .buildSql("select PERSON.SALUTATION, PERSON.TITLE, PERSON.FIRSTNAME, PERSON.MIDDLENAME, PERSON.LASTNAME "
-                + "from PERSON", "1 = 2"));
-        if (data.length == 0)
-            return "";
-        var contact = new Contact();
-        [contact.salutation, contact.title, contact.firstname, contact.middlename, contact.lastname] = data;
-        var renderer = new ContactTitleRenderer(contact);
-        return renderer.asString();
-    }
-    
-    return "";
-}
-
-/**
- * get the name of the person
- * do not use this for a mass of data (e.g. in a loop) since this will be slow due to select-time
- * 
- * @param {String} pContactId the id of the contact entry with the person where the data shall be loaded
- * 
- * @return {String} the name or ""
- */
-ContactUtils.getTitleByContactId = function(pContactId)
-{
-    if (pContactId) 
-    {
-        var personId = db.cell(SqlCondition.begin()
-                                           .andPrepare("CONTACT.CONTACTID", pContactId)
-                                            .buildSql("select CONTACT.PERSON_ID from CONTACT ", "1 = 2"));
-        if (personId)
-            return ContactUtils.getTitleByPersonId(personId);
-    }
-    
-    return "";
-}
-
-/**
- * returns the from string for the contact joined with org, person, address 
- *
- * @return {String}
- */
-ContactUtils.getFullContactString = function()
-{
-    return " CONTACT join ORGANISATION on ORGANISATION.ORGANISATIONID = CONTACT.ORGANISATION_ID"
-    + " left join PERSON on PERSON.PERSONID = CONTACT.PERSON_ID"
-    + " left join ADDRESS on ADDRESS.ADDRESSID = CONTACT.ADDRESS_ID";
-}
-
-/**
- * get the addressid of the default address
- *
- * @return {String} the ID or "" if no default address exists
- */
-ContactUtils.getDefaultAddressId = function(pContactId)
-{
-    return db.cell(SqlCondition.begin().andPrepare("CONTACT.CONTACTID", pContactId)
-                               .buildSql("select ADDRESS_ID from CONTACT", "1=2"));
-}
-
-/**
- * object for handling of a single contact
- * provides static- and instance-functions
- * 
- * @class
- *
- */
-function Contact()
-{
-    //storage for information
-    this.salutation = "";
-    this.title = "";
-    this.firstname= "";
-    this.middlename = "";
-    this.lastname = "";
-    this.suffix = "";
-
-    this.customercode = "";
-    this.organisationName = "";
-    
-    this._contactType = Contact.TYPES.Auto;
-}
-
-/**
- * sets the contactType of a contact
- * reserved for future implementation
- * 
- * @param {String} pContactType contactType that shall be set; value of Contact.TYPES.
- *
- * @return void
- */
-Contact.prototype.setContactType = function (pContactType)
-{
-    if (! ObjectUtils.existsValue(Contact.TYPES, pContactType))
-        throw new TypeError("the given contact type is not a valid value and not a contact type");
-    
-    this._contactType = pContactType;
-};
-
-/**
- * returns the contactType of a contact
- * reserved for future implementation
- * 
- * @return {String} the contactType is a value of Contact.TYPES.
- */
-Contact.prototype.getContactType = function ()
-{
-    return this._contactType;
-};
-
-/**
- * constants for types of Contacts
- * use only within functions
- * reserved for future implementation
- * 
- * @static
- */
-Contact.TYPES = {
-    Organisation: "organisation",
-    Contact: "contact",
-    Private: "private",
-    Auto: null
-};
-
-/**
- * creates a new Contact-object with a preset of DB-columns
- * 
- * @static
- */
-Contact.createWithColumnPreset = function()
-{
-    var contact = new Contact();
-    contact.salutation = "PERSON.SALUTATION";
-    contact.title = "PERSON.TITLE";
-    contact.firstname= "PERSON.FIRSTNAME";
-    contact.middlename = "PERSON.MIDDLENAME";
-    contact.lastname = "PERSON.LASTNAME";
-    contact.suffix = "PERSON.TITLESUFFIX";
-    contact.customercode = "ORGANISATION.CUSTOMERCODE";
-    contact.organisationName = "ORGANISATION.NAME";
-    return contact;
-};
-
-/**
- * object for rendering a Contact-object into text representation or an sql that represents the text
- * provides static- and instance-functions
- * 
- * @param {Contact} pContact The Contact-object to render
- * @param {Number} pOptions additional options for rendering; use values of ContactTitleRenderer.OPTIONS and pass them by bitwise OR concatination; e.g.:
- *                  OPTION_1 | OPTION_2 | OPTION_5
- * 
- * @class
- *
- */
-function ContactTitleRenderer(pContact, pOptions)
-{
-    this.contact = pContact;
-    if (pOptions !== undefined)//null means null which is "no option"; so check exactly for undefined to check if default option has to be set
-        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();
-        var res = maskingUtil.concat([this.contact.salutation, this.contact.title, this.contact.firstname, this.contact.middlename, this.contact.lastname].filter(function (e){
-            return e != "";
-        }), " ");
-        if (this._options & ContactTitleRenderer.OPTIONS.IncludeOrganisation && this.contact.organisationName)
-            res = maskingUtil.concat([res, this.contact.organisationName], " | ");
-        return res;
-    };
-    
-    //function that renders the contact into a text  (e.g. for a displayValue)
-    this._asStringFn = function (){
-        var res = StringUtils.concat(" ", [this.contact.salutation, this.contact.title, this.contact.firstname, this.contact.middlename, this.contact.lastname]);
-
-        if (this._options & ContactTitleRenderer.OPTIONS.IncludeOrganisation && this.contact.organisationName)
-            res = StringUtils.concat(" | ", [res, this.contact.organisationName]);
-        return res;
-    }
-}
-
-/**
- * constants for options for the ContactTitleRenderer
- * use only within functions
- * 
- * @static
- */
-ContactTitleRenderer.OPTIONS = {
-    NoOption: 0,
-    IncludeOrganisation: 1
-};
-
-/**
- * function that renders the contact into a sql expression (e.g. for a subselect)
- * what this function exactly does depends on specified values and options specified in the Renderer-object
- * 
- * @return {String} sql-expression that can be placed inside a select statement
- */
-ContactTitleRenderer.prototype.asSql = function ()
-{
-    return this._asSqlFn.apply(this, arguments);
-};
-
-/**
- * function that renders the contact into text
- * what this function exactly does depends on specified values and options specified in the Renderer-object
- * 
- * @return {String} rendered values as text
- */
-ContactTitleRenderer.prototype.asString = function ()
-{
-    return this._asStringFn.apply(this, arguments);
-};
+import("system.translate");
+import("system.neon");
+import("system.vars");
+import("system.result");
+import("system.db");
+import("Sql_lib");
+import("Util_lib");
+import("Context_lib");
+
+/**
+ * a static Utility class for organisations
+ * 
+ * Do not create an instance of this!
+ * @class
+ */
+function OrganisationUtils() {}
+
+/*
+ * retrieves the name of an organisation with a select statement
+ * 
+ * @param {String} pOrganisationId the ID of the organisation that shall be searched in the database; 
+ * 
+ * @return {String} the name of the organisation
+ */
+OrganisationUtils.getNameByOrganisationId = function(pOrganisationId)
+{
+    var orgname = "";
+    if (pOrganisationId)
+    {
+        orgname = db.cell(SqlCondition.begin()
+                                      .andPrepare("ORGANISATION.ORGANISATIONID", pOrganisationId)
+                                      .buildSql("select ORGANISATION.NAME from ORGANISATION"));
+    }
+    return orgname;
+};
+
+/*
+ * retrieves the name of an organisation with a select statement
+ * 
+ * @param {String} pContactId the ID of the corresponding org-contact of the organisation that shall be searched in the database; 
+ * 
+ * @return {String} the name of the organisation
+ */
+OrganisationUtils.getNameByContactId = function(pContactId)
+{
+    var orgname = "";
+    if (pContactId)
+    {
+        orgname = db.cell(SqlCondition.begin()
+            .andPrepare("CONTACT.CONTACTID", pContactId)
+            .buildSql("select ORGANISATION.NAME \n\
+                            from ORGANISATION \n\
+                            join CONTACT on (CONTACT.ORGANISATION_ID = ORGANISATION.ORGANISATIONID and CONTACT.PERSON_ID is null)"));
+    }
+    return orgname;
+};
+
+/**
+ * a static Utility class for contacts
+ * 
+ * Do not create an instance of this!
+ * @class
+ */
+function ContactUtils() {}
+
+/**
+ * creates an subSql for resolving a person/organisation-contact into one string of text (for example the name of a person)
+ * useful for example in an displayValue-expression to resolave a references (which is chosen by Lookups)
+ * does not validate if pRelationIdField exists or is a valid or harmful value
+ * 
+ * @param {String} pContactIdField fieldname for the CONTACTID-condition as TABLEALIAS.COLUMNALIAS; e.g. TASK.EDITOR_CONTACT_ID
+ * @return {String} a subsql (without bracets) that can be played within an SQL
+ */
+ContactUtils.getResolvingDisplaySubSql = function(pContactIdField)
+{
+    var contact = Contact.createWithColumnPreset();
+    var renderer = new ContactTitleRenderer(contact, ContactTitleRenderer.OPTIONS.IncludeOrganisation);
+    var selectExpression = renderer.asSql();
+
+    //TODO: verify if there is a better solution for the usage of this as a displayValueExpression --> automatic use of #TITLE | waiting vor implementation
+    return "select " + selectExpression + "from CONTACT \n\
+        left join PERSON on (PERSON.PERSONID = CONTACT.PERSON_ID) \n\
+        left join ORGANISATION on (ORGANISATION.ORGANISATIONID = CONTACT.ORGANISATION_ID) \n\
+        where CONTACT.CONTACTID = " + pContactIdField;
+}
+
+/*
+ * validates if a ORGANISATION_ID in a person-contact is correct [=>does not already exist] or not [=>does already exist]
+ * this is done by checking the database for entires that do already exist with this combination of ORGANISATIONID and PERSONID
+ * gives different messages for private persons and contacts that do already exist
+ * 
+ * @param {String} pPersonId the ID of the person that shall be searched in the database
+ * @param {String} pOrganisationId the ID of the organisation that shall be searched in the database; 
+ *                                 if this is an empty string it will be treated as private-dummy-organisation
+ * @param {String} [pOwnContactId] the CONTACTID of your current record; this is only needed when in EDIT-mode since you don't want to get a message 
+ *                                  for your own CONTACT;
+ *                                  (if you do a lookup if a organisation-person-combination does already exist you'l get your own contact which you want to exclude)
+ * 
+ * @return {String} translated text that describes whats the problem or null if there was no problem and everything is fine
+ * 
+ */
+ContactUtils.validateIfAlreadyExists = function(pPersonId, pOrganisationId, pOwnContactId)
+{
+    if (!pPersonId)
+        return null;
+    if (pOrganisationId == "")
+        pOrganisationId = "0";
+    var cond = SqlCondition.begin()
+    .andPrepare("CONTACT.PERSON_ID", pPersonId)
+    .andPrepare("CONTACT.ORGANISATION_ID", pOrganisationId)
+    //exclude the own since we do not want a "is not valid"-message for our own entry (on EDIT-mode)
+    .andPrepareIfSet("CONTACT.CONTACTID", pOwnContactId, "# != ?");
+
+    var sql = cond.buildSql("select CONTACT.CONTACTID from CONTACT");
+    var alreadyExistantContactId = db.cell(sql);
+    if (alreadyExistantContactId)
+        if (pOrganisationId.trim() == "0")
+            return translate.text("This private person doeas already exist and can not be created once more.");
+        else
+            return translate.text("This combination of person and organisation does already exist and can not be created once more.");
+    
+    return null;
+};
+
+/**
+ * Get the type of contact. <br>
+ * In recordstate NEW or EDIT it loads the person- / orgid from the db.<br>
+ * But in the other states it uses the values pPersId, pOrgId directly (for performance).<br>
+ * <br>
+ * It only checks if pPersId / pOrgId are not empty. <br>
+ * Based on which parameter is empty / not empty it return s the type of the contact. <br>
+ *  <br>
+ * !!It does not check if the person / org ids really exist!! <br>
+ * !!And it does not check if really any contact with this person / org ids exist!! <br>
+ *  <br>
+ *  <br>
+ * It is meant to be used by entitys, where you can load person and org with the DataRecord. <br>
+ * This saves an extra select from CONTACT. <br>
+ *  <br>
+ *  <br>
+ * @param {String} pContactId
+ * @param {String} pPersId selected from the CONTACT table
+ * @param {String} pOrgId selected from the CONTACT table
+ *  <br>
+ * @return {Integer} <br>0 if both ids are empty <br>
+ *                      1 if organisation <br>
+ *                      2 if privat person <br>
+ *                      3 if person of an organisation <br>
+ */
+ContactUtils.getContactType = function(pContactId, pPersId, pOrgId)
+{
+    if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW || vars.get("$sys.recordstate") == neon.OPERATINGSTATE_EDIT)
+    {
+        return ContactUtils.getContactTypeByContactId(pContactId);
+    }
+    else
+    {
+        return ContactUtils.getContactTypeByPersOrg(pPersId, pOrgId);
+    }
+}
+
+/**
+ * get the type of contact for a relationId <br>
+ * If you already have persId and orgId from the CONTACT table, use getContactTypeByPersOrg() <br>
+ * @param {String} pContactId
+ * <br>
+ * @return {Integer} 0 if relationId not found <br>
+ *                  1 if organisation <br>
+ *                  2 if privat person <br>
+ *                  3 if person of an organisation <br>
+ */
+ContactUtils.getContactTypeByContactId = function(pContactId)
+{
+    var relationData = ContactUtils.getPersOrgIds(pContactId);
+    if (relationData[0]) 
+    {
+        return this.getContactTypeByPersOrg(relationData[1], relationData[2]);
+    }
+    else
+    {
+        return 0;
+    }
+}
+
+/**
+ * Get the type of contact. <br>
+ * It only checks if the parameters are not empty. <br>
+ * Based on which parameter is empty / not empty it return s the type of the contact. <br>
+ *  <br>
+ * !!It does not check if the person / org ids really exist!! <br>
+ * !!And it does not check if really any contact with this person / org ids exist!! <br>
+ *  <br>
+ * This function is more performant than getContactTypeByContactId, <br>
+ * because it doesn't load something from the db. <br>
+ *  <br>
+ * It is meant to be used by entitys, where you can load person and org with the DataRecord. <br>
+ * This saves an extra select from CONTACT. <br>
+ *  <br>
+ * @param {String} pPersId selected from the CONTACT table
+ * @param {String} pOrgId selected from the CONTACT table
+ *  <br>
+ * @return {Integer} <br>0 if both ids are empty <br>
+ *                      1 if organisation <br>
+ *                      2 if privat person <br>
+ *                      3 if person of an organisation <br>
+ */
+ContactUtils.getContactTypeByPersOrg = function(pPersId, pOrgId)
+{
+    if (!pPersId)
+    {
+        if (!pOrgId) {
+            return 0; // both are empty
+        }
+        return 1;  // Organisation da PERSON_ID leer
+    }
+    else
+    {
+        if (pOrgId.replace(/\s/g,"") == "0" )
+        {
+            return 2; // Privatperson da PERSON_ID nicht leer und ORGANISATION_ID.trim() = '0'
+        }
+        else
+        {
+            return 3; // Person einer Organisation da PERSON_ID nicht leer und ORGANISATION_ID nicht '0'
+        }
+    }
+}
+
+/**
+ * return the corresponding context of the contact
+ * 
+ * It only checks if the parameters are not empty. <br>
+ * Based on which parameter is empty / not empty it return s the type of the contact. <br>
+ *  <br>
+ * !!It does not check if the person / org ids really exist!! <br>
+ * !!And it does not check if really any contact with this person / org ids exist!! <br>
+ *  <br>
+ * This function is more performant than getContextByContactId, <br>
+ * because it doesn't load something from the db. <br>
+ *  <br>
+ * It is meant to be used by entitys, where you can load person and org with the DataRecord. <br>
+ * This saves an extra select from CONTACT. <br>
+ *  <br>
+ * 
+ * @param {String} pPersId selected from the CONTACT table
+ * @param {String} pOrgId selected from the CONTACT table
+ * 
+ * @return {String} contextname or "" if both ids are empty
+ */
+ContactUtils.getContextByPersOrg = function(pPersId, pOrgId)
+{
+    switch (ContactUtils.getContactTypeByPersOrg(pPersId, pOrgId))
+    {
+        case 1: // Org
+            return ContextUtils.getContextName("Organisation");
+        case 2: // private Person
+        case 3: // Person
+            return ContextUtils.getContextName("Person");
+        default:
+            return "";
+    }
+}
+
+/**
+ * return the corresponding context of the contact <br>
+ * If you already have persId and orgId from the CONTACT table, use getContextByPersOrg() <br>
+ * 
+ * @param {String} pContactId
+ * @return {String} contextname or "" if contact not found
+ */
+ContactUtils.getContextByContactId = function(pContactId)
+{
+    var relationData = ContactUtils.getPersOrgIds(pContactId);
+    return ContactUtils.getContextByPersOrg(relationData[1], relationData[2])
+}
+
+/**
+ * get the person- and org-id from a contact as array
+ * 
+ * @param {String} pContactId
+ * @return {String[]} result as [contactid, persid, orgid] if one of them is null in the db, "" will be returned as the id.
+ */
+ContactUtils.getPersOrgIds = function(pContactId)
+{
+    if (pContactId) {
+        return db.array(db.ROW, 
+            SqlCondition.begin()
+                        .andPrepare("CONTACT.CONTACTID", pContactId)
+                        .buildSql("select CONTACTID, PERSON_ID, ORGANISATION_ID from CONTACT", "1=0"));
+    }
+    
+    return [];
+}
+
+/**
+ * get the name of the person or organisation
+ * 
+ * @param {String} pContactId the contact id where pers-name or orgname shall be loaded
+ * 
+ * @return {String} the name or ""
+ */
+ContactUtils.getFullTitleByContactId = function(pContactId)
+{
+    if (pContactId) 
+    {
+        var data = db.array(db.ROW, SqlCondition.begin()
+                .andPrepare("CONTACT.CONTACTID", pContactId)
+                .buildSql("select ORGANISATION.NAME, PERSON.SALUTATION, PERSON.TITLE, PERSON.FIRSTNAME, PERSON.MIDDLENAME, PERSON.LASTNAME "
+                    + "from CONTACT CONTACT "
+                    + "join ORGANISATION on ORGANISATION.ORGANISATIONID = CONTACT.ORGANISATION_ID "
+                    + "left join PERSON on PERSON.PERSONID = CONTACT.PERSON_ID", "1 = 2"));
+        if (data.length == 0)
+            return "";
+        var contact = new Contact();
+        [contact.organisationName, contact.salutation, contact.title, contact.firstname, contact.middlename, contact.lastname] = data;
+        var renderer = new ContactTitleRenderer(contact);
+        return renderer.asString();
+    }
+    
+    return "";
+}
+
+/**
+ * get the name of the person
+ * do not use this for a mass of data (e.g. in a loop) since this will be slow due to select-time
+ * 
+ * @param {String} pPersonId the id of the person where the data shall be loaded
+ * 
+ * @return {String} the name or ""
+ */
+ContactUtils.getTitleByPersonId = function(pPersonId)
+{
+    if (pPersonId) 
+    {
+        var data = db.array(db.ROW, SqlCondition.begin()
+            .andPrepare("PERSON.PERSONID", pPersonId)
+            .buildSql("select PERSON.SALUTATION, PERSON.TITLE, PERSON.FIRSTNAME, PERSON.MIDDLENAME, PERSON.LASTNAME "
+                + "from PERSON", "1 = 2"));
+        if (data.length == 0)
+            return "";
+        var contact = new Contact();
+        [contact.salutation, contact.title, contact.firstname, contact.middlename, contact.lastname] = data;
+        var renderer = new ContactTitleRenderer(contact);
+        return renderer.asString();
+    }
+    
+    return "";
+}
+
+/**
+ * get the name of the person
+ * do not use this for a mass of data (e.g. in a loop) since this will be slow due to select-time
+ * 
+ * @param {String} pContactId the id of the contact entry with the person where the data shall be loaded
+ * 
+ * @return {String} the name or ""
+ */
+ContactUtils.getTitleByContactId = function(pContactId)
+{
+    if (pContactId) 
+    {
+        var personId = db.cell(SqlCondition.begin()
+                                           .andPrepare("CONTACT.CONTACTID", pContactId)
+                                            .buildSql("select CONTACT.PERSON_ID from CONTACT ", "1 = 2"));
+        if (personId)
+            return ContactUtils.getTitleByPersonId(personId);
+    }
+    
+    return "";
+}
+
+/**
+ * returns the from string for the contact joined with org, person, address 
+ *
+ * @return {String}
+ */
+ContactUtils.getFullContactString = function()
+{
+    return " CONTACT \n\
+        join ORGANISATION on ORGANISATION.ORGANISATIONID = CONTACT.ORGANISATION_ID  \n\
+        left join PERSON on PERSON.PERSONID = CONTACT.PERSON_ID \n\
+        left join ADDRESS on ADDRESS.ADDRESSID = CONTACT.ADDRESS_ID";
+}
+
+/**
+ * get the addressid of the default address
+ *
+ * @return {String} the ID or "" if no default address exists
+ */
+ContactUtils.getDefaultAddressId = function(pContactId)
+{
+    return db.cell(SqlCondition.begin().andPrepare("CONTACT.CONTACTID", pContactId)
+                               .buildSql("select ADDRESS_ID from CONTACT", "1=2"));
+}
+
+/**
+ * object for handling of a single contact
+ * provides static- and instance-functions
+ * 
+ * @class
+ *
+ */
+function Contact()
+{
+    //storage for information
+    this.salutation = "";
+    this.title = "";
+    this.firstname= "";
+    this.middlename = "";
+    this.lastname = "";
+    this.suffix = "";
+
+    this.customercode = "";
+    this.organisationName = "";
+    
+    this._contactType = Contact.TYPES.Auto;
+}
+
+/**
+ * sets the contactType of a contact
+ * reserved for future implementation
+ * 
+ * @param {String} pContactType contactType that shall be set; value of Contact.TYPES.
+ *
+ * @return void
+ */
+Contact.prototype.setContactType = function (pContactType)
+{
+    if (! ObjectUtils.existsValue(Contact.TYPES, pContactType))
+        throw new TypeError("the given contact type is not a valid value and not a contact type");
+    
+    this._contactType = pContactType;
+};
+
+/**
+ * returns the contactType of a contact
+ * reserved for future implementation
+ * 
+ * @return {String} the contactType is a value of Contact.TYPES.
+ */
+Contact.prototype.getContactType = function ()
+{
+    return this._contactType;
+};
+
+/**
+ * constants for types of Contacts
+ * use only within functions
+ * reserved for future implementation
+ * 
+ * @static
+ */
+Contact.TYPES = {
+    Organisation: "organisation",
+    Contact: "contact",
+    Private: "private",
+    Auto: null
+};
+
+/**
+ * creates a new Contact-object with a preset of DB-columns
+ * 
+ * @static
+ */
+Contact.createWithColumnPreset = function()
+{
+    var contact = new Contact();
+    contact.salutation = "PERSON.SALUTATION";
+    contact.title = "PERSON.TITLE";
+    contact.firstname= "PERSON.FIRSTNAME";
+    contact.middlename = "PERSON.MIDDLENAME";
+    contact.lastname = "PERSON.LASTNAME";
+    contact.suffix = "PERSON.TITLESUFFIX";
+    contact.customercode = "ORGANISATION.CUSTOMERCODE";
+    contact.organisationName = "ORGANISATION.NAME";
+    return contact;
+};
+
+/**
+ * object for rendering a Contact-object into text representation or an sql that represents the text
+ * provides static- and instance-functions
+ * 
+ * @param {Contact} pContact The Contact-object to render
+ * @param {Number} pOptions additional options for rendering; use values of ContactTitleRenderer.OPTIONS and pass them by bitwise OR concatination; e.g.:
+ *                  OPTION_1 | OPTION_2 | OPTION_5
+ * 
+ * @class
+ *
+ */
+function ContactTitleRenderer(pContact, pOptions)
+{
+    this.contact = pContact;
+    if (pOptions !== undefined)//null means null which is "no option"; so check exactly for undefined to check if default option has to be set
+        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();
+        var res = maskingUtil.concat([this.contact.salutation, this.contact.title, this.contact.firstname, this.contact.middlename, this.contact.lastname].filter(function (e){
+            return e != "";
+        }), " ");
+        if (this._options & ContactTitleRenderer.OPTIONS.IncludeOrganisation && this.contact.organisationName)
+            res = maskingUtil.concat([res, this.contact.organisationName], " | ");
+        return res;
+    };
+    
+    //function that renders the contact into a text  (e.g. for a displayValue)
+    this._asStringFn = function (){
+        var res = StringUtils.concat(" ", [this.contact.salutation, this.contact.title, this.contact.firstname, this.contact.middlename, this.contact.lastname]);
+
+        if (this._options & ContactTitleRenderer.OPTIONS.IncludeOrganisation && this.contact.organisationName)
+            res = StringUtils.concat(" | ", [res, this.contact.organisationName]);
+        return res;
+    }
+}
+
+/**
+ * constants for options for the ContactTitleRenderer
+ * use only within functions
+ * 
+ * @static
+ */
+ContactTitleRenderer.OPTIONS = {
+    NoOption: 0,
+    IncludeOrganisation: 1
+};
+
+/**
+ * function that renders the contact into a sql expression (e.g. for a subselect)
+ * what this function exactly does depends on specified values and options specified in the Renderer-object
+ * 
+ * @return {String} sql-expression that can be placed inside a select statement
+ */
+ContactTitleRenderer.prototype.asSql = function ()
+{
+    return this._asSqlFn.apply(this, arguments);
+};
+
+/**
+ * function that renders the contact into text
+ * what this function exactly does depends on specified values and options specified in the Renderer-object
+ * 
+ * @return {String} rendered values as text
+ */
+ContactTitleRenderer.prototype.asString = function ()
+{
+    return this._asStringFn.apply(this, arguments);
+};
diff --git a/process/Context_lib/process.js b/process/Context_lib/process.js
index 71beab7d3b5c0e3692d1ff54f82f631f32b1d35f..0acbe8b80929ad5a9198fce2f706d7d5737c7ede 100644
--- a/process/Context_lib/process.js
+++ b/process/Context_lib/process.js
@@ -334,7 +334,8 @@ ContextUtils.getSelectMap  = function()
 {
     var maskingUtils = new SqlMaskingUtils();
     return {
-        "Organisation": ContextSelector.create("ORGANISATION", "ORGANISATIONID", "NAME")
+            "Organisation": ContextSelector.create("ORGANISATION", "CONTACT.CONTACTID", "ORGANISATION.NAME")
+                                       .setJoinExpression("join CONTACT on ORGANISATION.ORGANISATIONID = CONTACT.ORGANISATION_ID and CONTACT.PERSON_ID is null")
                                        .setCondition(SqlCondition.begin().and("ORGANISATION.ORGANISATIONID != '0'"))
             ,"Person": ContextSelector.create("CONTACT", "CONTACTID")
                                       .setTitleExpression(maskingUtils.concat([
diff --git a/process/CountryInfo_lib/process.js b/process/CountryInfo_lib/process.js
index 67f674c97d8e655ddf53b3ecdf639d6a2dbf4892..1bd84270bc4173346b5a54a4721ddc54bcb81b37 100644
--- a/process/CountryInfo_lib/process.js
+++ b/process/CountryInfo_lib/process.js
@@ -22,6 +22,8 @@ function CountryUtils() {}
 */
 CountryUtils.getLatinNameByIso2 = function(pIso2, pLocale)
 {
+    if (!pIso2)
+        return "";
     var countryName = db.cell(SqlCondition.begin()
                                           .andPrepare("AB_COUNTRYINFO.ISO2", pIso2)
                                           .buildSql("select AB_COUNTRYINFO.NAME_LATIN from AB_COUNTRYINFO"));
diff --git a/process/DocumentTemplate_lib/process.js b/process/DocumentTemplate_lib/process.js
index 933f91713b0e1ce503a0ab9be97095a9ec88447d..2cbeffcce9962843b8873fbbab9a2db3a4efd75d 100644
--- a/process/DocumentTemplate_lib/process.js
+++ b/process/DocumentTemplate_lib/process.js
@@ -1,3 +1,4 @@
+import("system.logging");
 import("Communication_lib");
 import("system.neon");
 import("Employee_lib");
@@ -22,6 +23,8 @@ import("Placeholder_lib");
 /**
  * Object for working with document templates, holds the content and type of the template.
  * Provides functions to replace placeholders in the content.
+ * 
+ * @class
  */
 function DocumentTemplate (pTemplateContent, pType, pFilename)
 {
@@ -30,9 +33,16 @@ function DocumentTemplate (pTemplateContent, pType, pFilename)
     this.filename = pFilename;
 }
 
+DocumentTemplate.prototype.toString = function ()
+{
+    return text.parseDocument(this.content);
+}
+
 /**
  * The types a DocumentTemplate can have. Depending on the type,
  * the correct method for replacing the placeholders can be chosen
+ * 
+ * @enum {String}
  */
 DocumentTemplate.types = {
     TXT : "txt",
@@ -77,6 +87,8 @@ DocumentTemplate.loadTemplate = function (pTemplateId)
 /**
  * Replace function that works with strings instead of regular expressions
  * so that control characters (for example '{', '}') don't have to be escaped.
+ * 
+ * @private
  */
 DocumentTemplate._replaceText = function (pText, pReplacements)
 {
@@ -85,24 +97,20 @@ DocumentTemplate._replaceText = function (pText, pReplacements)
     return pText;
 }
 
-DocumentTemplate.prototype.toString = function ()
-{
-    return this.getReplacedContent({});
-}
-
 /**
- * returns the simpleName of all placeholders that are used in the template
+ * returns the 'simpleName' of all placeholders that are used in the template
+ * 
+ * @private
  */
-DocumentTemplate.prototype.getRequiredPlaceholders = function ()
+DocumentTemplate.prototype._getRequiredPlaceholders = function ()
 {
-    if (this.type == DocumentTemplate.types.ODT || this.type == DocumentTemplate.types.DOCX)
-        return [];
     var allPlaceholders = PlaceholderUtils.getPlaceholders();
+    var plainText = this.toString();
     var usedPlaceholders = [];
     for (let i = 0, l = allPlaceholders.length; i < l; i++)
     {
-        if (this.toString().indexOf(allPlaceholders[i]) !== -1)
-            usedPlaceholders.push(allPlaceholders[i].simpleName);
+        if (plainText.indexOf(allPlaceholders[i]) !== -1)
+            usedPlaceholders.push(allPlaceholders[i]);
     }
     return usedPlaceholders; 
 }
@@ -136,15 +144,21 @@ DocumentTemplate.prototype.getReplacedContent = function (pReplacements)
     }
 }
 
-DocumentTemplate.prototype.getReplacedContentByContactId = function (pContactId)
+/**
+ * replaces the placeholders with data from the contact and returns the result
+ */
+DocumentTemplate.prototype.getReplacedContentByContactId = function (pContactId)  //TODO: function required for mass replacing (for bulkmails)
 {
-    var replacements = DocumentTemplate._getReplacementsByContactId(pContactId);
+    var replacements = this._getReplacementsByContactId(pContactId); 
     return this.getReplacedContent(replacements);
 }
 
-DocumentTemplate._getReplacementsByContactId = function (pContactId)
+/**
+ * @private
+ */
+DocumentTemplate.prototype._getReplacementsByContactId = function (pContactId)
 {
-    var config = PlaceholderUtils.getPlaceholders();
+    var config = this._getRequiredPlaceholders();
     var addressData = getAddressesData([pContactId], config, EmployeeUtils.getCurrentContactId()); //TODO: add sender selection
     var replacements = {};
     for (let i = 0, l = addressData[0].length; i < l; i++)
@@ -186,6 +200,8 @@ DocumentTemplate.prototype.setEmailTemplateByContactId = function (pEmail, pCont
  * @param {Object} pReplacements mapping with replacements for every placeholder
  * 
  * @return {String} the replaced content
+ * 
+ * @private
  */
 DocumentTemplate.prototype._getReplacedEML = function (pReplacements)
 {
@@ -197,10 +213,11 @@ DocumentTemplate.prototype._getReplacedEML = function (pReplacements)
 /*
  * replaces a given Odt-File on the server and returns the replaced base64-file
  *
- * @param {String|String[]} pAddrDataCondition req a SQL-Condition or an Array of Relation-Ids for reducing the default-placeholders
- * @param {String} pAddressID opt if you want to use the standard address you can pass undefined, otherwise you need to specify a Address-Id
+ * @param {Object} pReplacements map of placeholders and replacements
  *
  * @return {String} base64-encoded replaced file
+ * 
+ * @private
  */
 DocumentTemplate.prototype._getReplacedODT = function (pReplacements)
 {
@@ -217,13 +234,12 @@ DocumentTemplate.prototype._getReplacedODT = function (pReplacements)
 
     return replacedFileData;
     
-    /*
-    * ersetzt die Platzhalter in ODT-Datei
-    *
-    * @param {String} pCondition req Condition
-    * @param {String} pODTFileName req Filename des odt-Datei
-    * @param {String} pAddressID opt ID von der die Adressdaten geholt werden
+    /**
+    * replaces placeholders in a odt file
     *
+    * @param {Object} pReplacements replacement object
+    * @param {String} pODTFileName filename of the odt
+    * 
     * @return {Boolean}
     */
     function _replaceODTFile (pReplacements, pODTFileName)
@@ -233,23 +249,29 @@ DocumentTemplate.prototype._getReplacedODT = function (pReplacements)
             return false;
         if (Object.keys(pReplacements).length)
         {
-            // ersetzen Platzhalter in content.xml
-
-            var textS = util.decodeBase64String(pack.getFromZip(pODTFileName, "content.xml"));
-            var bodybegin = textS.indexOf("<office:body>");
-            var bodyend =  textS.indexOf("</office:body>") + 14;
-            var body = textS.substring( bodybegin, bodyend );
-            var lastbody = textS.substr( bodyend );
-            textS = textS.substring( 0, bodybegin );
+            //replace placeholders in content.xml
+            var contentXml = util.decodeBase64String(pack.getFromZip(pODTFileName, "content.xml"));
+            var bodybegin = contentXml.indexOf("<office:body>");
+            var bodyend =  contentXml.indexOf("</office:body>") + 14;
+            
+            var body = contentXml.substring(bodybegin, bodyend);
+            var beforeBody = contentXml.substring(0, bodybegin);
+            var afterBody = contentXml.substr(bodyend);
+            
+            /* This only works if the text of the placeholders in the odt were not edited since they were written.
+             * If you edit the odt and change a placeholder (for example: you change '{@addres@}' to '{@address@}'),
+             * the text is saved in different XML tags and won't be replaced correctly.
+             */
+            
             for (let placeholder in pReplacements)
             {
                 body = body.replace(placeholder,
                     pReplacements[placeholder].replace(/\n/ig, "<text:line-break/>").replace(/&/ig, "&amp;"), "ig");
             }
-            textS += body;
-            textS += lastbody;
-            pack.addToZip(pODTFileName, "content.xml", util.encodeBase64String(textS))
-            // ersetzen Platzhalter in styles.xml
+            contentXml = beforeBody + body + afterBody;
+            pack.addToZip(pODTFileName, "content.xml", util.encodeBase64String(contentXml));
+            
+            //replace placeholders in styles.xml
             var styles = util.decodeBase64String(pack.getFromZip(pODTFileName, "styles.xml"));
             for (let placeholder in pReplacements)
             {
@@ -269,6 +291,8 @@ DocumentTemplate.prototype._getReplacedODT = function (pReplacements)
  * @param {Object} pReplacements - Must contain an object, which holds the placeholders
  * 
  * @return {String} returns the modified document in a BASE64 coded string
+ * 
+ * @private
  */
 DocumentTemplate.prototype._getReplacedDOCX = function (pReplacements)
 {
diff --git a/process/JditoFilter_lib/process.js b/process/JditoFilter_lib/process.js
index be2203fcd517d83bc53d8c9289fb2c03deb9a2bf..75d84b59c61ce1cbdf111641aa19ba4da5863c17 100644
--- a/process/JditoFilter_lib/process.js
+++ b/process/JditoFilter_lib/process.js
@@ -1,230 +1,234 @@
-import("Sql_lib");
-
-/**
- * object for filtering records
- * 
- * @param {Array} pColumns the column names
- * @param {Object} pFilter the filter object
- */
-function JditoFilterHelper (pColumns, pFilter) 
-{
-    var columnMap = {};
-    for (let i = 0, l = pColumns.length; i < l; i++)
-    {
-        if (pColumns[i])
-            columnMap[pColumns[i]] = i;
-    }
-    this._columnMap = columnMap;
-    this._filter = pFilter;
-}
-
-/**
- * tests the given row if it matches the filter
- * 
- * @param {Array} pRow one record
- * 
- * @return {boolean} true, if it matches the condition
- */
-JditoFilterHelper.prototype.checkRecord = function (pRow)
-{
-    if (this._filter.length == 0)
-        return true;
-    
-    return _testRecord.call(this, this._filter);
-    
-    function _testRecord (pCondition)
-    {
-        if (pCondition.type == "row")
-        {
-            let value = pRow[this._columnMap[pCondition.name]];
-            return _testValue(value, (pCondition.key || pCondition.value), pCondition.operator);
-        }
-        else if (pCondition.type == "group")
-        {
-            if (pCondition.operator == "AND")
-                return pCondition.childs.every(_testRecord, this);
-            return pCondition.childs.some(_testRecord, this);
-        }
-        return true;
-    }
-    
-    /**
-     * compares two values with the given operator
-     */
-    function _testValue (pRowValue, pFilterValue, pOperator)
-    {
-        switch (pOperator)
-        {
-            case "CONTAINS":
-                return (new RegExp(pFilterValue)).test(pRowValue);
-            case "CONTAINSNOT":
-                return !(new RegExp(pFilterValue)).test(pRowValue);
-            case "STARTSWITH":
-                return (new RegExp("^" + pFilterValue)).test(pRowValue);
-            case "ENDSWITH":
-                return (new RegExp(pFilterValue + "$")).test(pRowValue);
-            case "EQUAL":
-                return (new RegExp("^" + pFilterValue + "$")).test(pRowValue);
-            case "NOT_EQUAL":
-                return !(new RegExp("^" + pFilterValue + "$")).test(pRowValue);
-            case "LESS":
-                return pRowValue < pFilterValue;
-            case "LESS_OR_EQUAL":
-                return pRowValue <= pFilterValue;
-            case "GREATER":
-                return pRowValue > pFilterValue;
-            case "GREATER_OR_EQUAL":
-                return pRowValue >= pFilterValue;
-            case "ISNULL":
-                return pRowValue == "";
-            case "ISNOTNULL":
-                return pRowValue != "";
-        }
-    }
-}
-
-
-
-/**
- * Provides functions for using the filter with jdito recordcontainers
- * 
- * Do not instanciate this!
- * 
- * @class
- */
-function JditoFilterUtils () {}
-
-/**
- * Filters the given records manually. If you get the records using a sql query, you might consider using
- * JditoFilterUtils.getSqlCondition instead for better performance.
- * 
- * @param {Array} pColumns one dimensional array with all column names (only the columns with the idValue, displayValue columns should be null or ""), 
- *                          the order has to match the columns of the recordFields property in the recordcontainer
- * @param {Array} pRecords two dimensional array with all records
- * @param {String|Object} pFilter the value of vars.get($local.filter).filter
- * 
- * @return {Array} the filtered records
- */
-JditoFilterUtils.filterRecords = function (pColumns, pRecords, pFilter)
-{
-    if (!pFilter)
-        return pRecords;
-    
-    var filter = new JditoFilterHelper(pColumns, pFilter);
-    
-    return pRecords.filter(function (row)
-        {
-            return this.checkRecord(row);
-        }, filter);
-}
-
-/**
- * builds an sql condition from the given filter
- * 
- * @param {Object} pFilter the filter object
- * @param {String} pTable the database table
- * @param {String} [pTableAlias=null] the database table alias
- * @param {Object} [pColumnMap=null] Custom mapping for the fields to the DB columns, this is necessary
- *      if the fields are from different tables. Structure has to be like this:
- *      {
- *          FIELD1 : "TABLE1.COLUMN1",
- *          FIELD2 : ["TABLE2", "COLUMN2", "TABLE2ALIAS"] //do it like this if the table has an alias
- *      }
- *      
- * @example
- * var condition = SqlCondition.begin();
- * if (vars.exists("$local.filter") && vars.get("$local.filter"))
- * {
- *     var filter = vars.get("$local.filter");
- *     if (filter.filter)
- *      condition.andSqlCondition((JditoFilterUtils.getSqlCondition(filter.filter, "AB_ATTRIBUTE")));
- * }
- * var attributeSql = condition.buildSql("select AB_ATTRIBUTEID from AB_ATTRIBUTE");
- * 
- * @return {SqlCondition} the SqlCondition object
- */
-JditoFilterUtils.getSqlCondition = function (pFilter, pTable, pTableAlias, pColumnMap)
-{
-    var condition = new SqlCondition();
-    
-    if (!pFilter)
-        return condition;
-    if (!pColumnMap)
-        pColumnMap = {};
-    
-    _addCondition.call(condition, pFilter, pFilter.operator);
-    
-    return condition;
-    
-    //recursive function (for compatibility with a condition tree) that
-    //builds the SqlCondition
-    function _addCondition (pCondition, pOperator)
-    {
-        if (pCondition.type == "row")
-        {
-            if (pCondition.name in pColumnMap)
-                pCondition.name = pColumnMap[pCondition.name];
-            else if (pTable && pTableAlias)
-                pCondition.name = [pTable, pCondition.name, pTableAlias];
-            else if (pTable)
-                pCondition.name = pTable + "." + pCondition.name;
-            
-            pCondition.value = (pCondition.key || pCondition.value);
-            var condition = _getCondition.call(pCondition);
-            if (pOperator == "AND")
-                this.andPrepare(pCondition.name, pCondition.value, condition);
-            else if (pOperator == "OR")
-                this.orPrepare(pCondition.name, pCondition.value, condition);
-        }
-        else if (pCondition.type == "group")
-        {
-            let subCondition = new SqlCondition();
-            let operator = pCondition.operator;
-            pCondition.childs.forEach(function (cond)
-            {
-                _addCondition.call(subCondition, cond, operator);
-            });
-            if (pOperator == "AND")
-                this.andSqlCondition(subCondition);
-            else if (pOperator == "OR")
-                this.orSqlCondition(subCondition);
-        }
-    }
-    
-    //returns the condition depending on the operator and 
-    //adds wildcards to the value if necessary
-    function _getCondition ()
-    {
-        switch (this.operator)
-        {
-            case "CONTAINS":
-                this.value = "%" + this.value + "%";
-                return "# like ?";
-            case "CONTAINSNOT":
-                this.value = "%" + this.value + "%";
-                return "# not like ?";
-            case "STARTSWITH":
-                this.value = this.value + "%";
-                return "# like ?";
-            case "ENDSWITH":
-                this.value = "%" + this.value;
-                return "# like ?";
-            case "EQUAL":
-                return "# = ?";
-            case "NOT_EQUAL":
-                return "# != ?";
-            case "LESS":
-                return "# < ?";
-            case "LESS_OR_EQUAL":
-                return "# <= ?";
-            case "GREATER":
-                return "# > ?";
-            case "GREATER_OR_EQUAL":
-                return "# >= ?";
-            case "ISNULL":
-                return "# is null";
-            case "ISNOTNULL":
-                return "# is not null";
-        }
-    }
+import("system.logging");
+import("Sql_lib");
+
+/**
+ * object for filtering records
+ * 
+ * @param {Array} pColumns the column names
+ * @param {Object} pFilter the filter object
+ */
+function JditoFilterHelper (pColumns, pFilter) 
+{
+    var columnMap = {};
+    for (let i = 0, l = pColumns.length; i < l; i++)
+    {
+        if (pColumns[i])
+            columnMap[pColumns[i]] = i;
+    }
+    this._columnMap = columnMap;
+    this._filter = pFilter;
+}
+
+/**
+ * tests the given row if it matches the filter
+ * 
+ * @param {Array} pRow one record
+ * 
+ * @return {boolean} true, if it matches the condition
+ */
+JditoFilterHelper.prototype.checkRecord = function (pRow)
+{
+    if (this._filter.length == 0)
+        return true;
+    
+    return _testRecord.call(this, this._filter);
+    
+    /**
+     * recursive function to test the row against the condition
+     */
+    function _testRecord (pCondition)
+    {
+        if (pCondition.type == "row")
+        {
+            let value = pRow[this._columnMap[pCondition.name]];
+            return _testValue(value, (pCondition.key || pCondition.value), pCondition.operator);
+        }
+        else if (pCondition.type == "group")
+        {
+            if (pCondition.operator == "AND")
+                return pCondition.childs.every(_testRecord, this);
+            return pCondition.childs.some(_testRecord, this);
+        }
+        return true;
+    }
+    
+    /**
+     * compares two values with the given operator
+     */
+    function _testValue (pRowValue, pFilterValue, pOperator)
+    {
+        switch (pOperator)
+        {
+            case "CONTAINS":
+                return (new RegExp(pFilterValue)).test(pRowValue);
+            case "CONTAINSNOT":
+                return !(new RegExp(pFilterValue)).test(pRowValue);
+            case "STARTSWITH":
+                return (new RegExp("^" + pFilterValue)).test(pRowValue);
+            case "ENDSWITH":
+                return (new RegExp(pFilterValue + "$")).test(pRowValue);
+            case "EQUAL":
+                return (new RegExp("^" + pFilterValue + "$")).test(pRowValue);
+            case "NOT_EQUAL":
+                return !(new RegExp("^" + pFilterValue + "$")).test(pRowValue);
+            case "LESS":
+                return pRowValue < pFilterValue;
+            case "LESS_OR_EQUAL":
+                return pRowValue <= pFilterValue;
+            case "GREATER":
+                return pRowValue > pFilterValue;
+            case "GREATER_OR_EQUAL":
+                return pRowValue >= pFilterValue;
+            case "ISNULL":
+                return pRowValue == "";
+            case "ISNOTNULL":
+                return pRowValue != "";
+        }
+    }
+}
+
+
+
+/**
+ * Provides functions for using the filter with jdito recordcontainers
+ * 
+ * Do not instanciate this!
+ * 
+ * @class
+ */
+function JditoFilterUtils () {}
+
+/**
+ * Filters the given records manually. If you get the records using a sql query, you might consider using
+ * JditoFilterUtils.getSqlCondition instead for better performance.
+ * 
+ * @param {Array} pColumns one dimensional array with all column names (only the columns with the idValue, displayValue columns should be null or ""), 
+ *                          the order has to match the columns of the recordFields property in the recordcontainer
+ * @param {Array} pRecords two dimensional array with all records
+ * @param {String|Object} pFilter the value of vars.get($local.filter).filter
+ * 
+ * @return {Array} the filtered records
+ */
+JditoFilterUtils.filterRecords = function (pColumns, pRecords, pFilter)
+{
+    if (!pFilter)
+        return pRecords;
+    
+    var filter = new JditoFilterHelper(pColumns, pFilter);
+    
+    return pRecords.filter(function (row)
+        {
+            return this.checkRecord(row);
+        }, filter);
+}
+
+/**
+ * builds an sql condition from the given filter
+ * 
+ * @param {Object} pFilter the filter object
+ * @param {String} pTable the database table
+ * @param {String} [pTableAlias=null] the database table alias
+ * @param {Object} [pColumnMap=null] Custom mapping for the fields to the DB columns, this is necessary
+ *      if the fields are from different tables. Structure has to be like this:
+ *      {
+ *          FIELD1 : "TABLE1.COLUMN1",
+ *          FIELD2 : ["TABLE2", "COLUMN2", "TABLE2ALIAS"] //do it like this if the table has an alias
+ *      }
+ *      
+ * @example
+ * var condition = SqlCondition.begin();
+ * if (vars.exists("$local.filter") && vars.get("$local.filter"))
+ * {
+ *     var filter = vars.get("$local.filter");
+ *     if (filter.filter)
+ *      condition.andSqlCondition((JditoFilterUtils.getSqlCondition(filter.filter, "AB_ATTRIBUTE")));
+ * }
+ * var attributeSql = condition.buildSql("select AB_ATTRIBUTEID from AB_ATTRIBUTE");
+ * 
+ * @return {SqlCondition} the SqlCondition object
+ */
+JditoFilterUtils.getSqlCondition = function (pFilter, pTable, pTableAlias, pColumnMap)
+{
+    var condition = new SqlCondition();
+    
+    if (!pFilter)
+        return condition;
+    if (!pColumnMap)
+        pColumnMap = {};
+    
+    _addCondition.call(condition, pFilter, pFilter.operator);
+    
+    return condition;
+    
+    //recursive function (for compatibility with a condition tree) that
+    //builds the SqlCondition
+    function _addCondition (pCondition, pOperator)
+    {
+        if (pCondition.type == "row")
+        {
+            if (pCondition.name in pColumnMap)
+                pCondition.name = pColumnMap[pCondition.name];
+            else if (pTable && pTableAlias)
+                pCondition.name = [pTable, pCondition.name, pTableAlias];
+            else if (pTable)
+                pCondition.name = pTable + "." + pCondition.name;
+            
+            pCondition.value = (pCondition.key || pCondition.value);
+            var condition = _getCondition.call(pCondition);
+            if (pOperator == "AND")
+                this.andPrepare(pCondition.name, pCondition.value, condition);
+            else if (pOperator == "OR")
+                this.orPrepare(pCondition.name, pCondition.value, condition);
+        }
+        else if (pCondition.type == "group")
+        {
+            let subCondition = new SqlCondition();
+            let operator = pCondition.operator;
+            pCondition.childs.forEach(function (cond)
+            {
+                _addCondition.call(subCondition, cond, operator);
+            });
+            if (pOperator == "AND")
+                this.andSqlCondition(subCondition);
+            else if (pOperator == "OR")
+                this.orSqlCondition(subCondition);
+        }
+    }
+    
+    //returns the condition depending on the operator and 
+    //adds wildcards to the value if necessary
+    function _getCondition ()
+    {
+        switch (this.operator)
+        {
+            case "CONTAINS":
+                this.value = "%" + this.value + "%";
+                return "# like ?";
+            case "CONTAINSNOT":
+                this.value = "%" + this.value + "%";
+                return "# not like ?";
+            case "STARTSWITH":
+                this.value = this.value + "%";
+                return "# like ?";
+            case "ENDSWITH":
+                this.value = "%" + this.value;
+                return "# like ?";
+            case "EQUAL":
+                return "# = ?";
+            case "NOT_EQUAL":
+                return "# != ?";
+            case "LESS":
+                return "# < ?";
+            case "LESS_OR_EQUAL":
+                return "# <= ?";
+            case "GREATER":
+                return "# > ?";
+            case "GREATER_OR_EQUAL":
+                return "# >= ?";
+            case "ISNULL":
+                return "# is null";
+            case "ISNOTNULL":
+                return "# is not null";
+        }
+    }
 }
\ No newline at end of file
diff --git a/process/KeywordRegistry_basic/process.js b/process/KeywordRegistry_basic/process.js
index d9f1c97af2af46fd3664c7ac5c60fd5d707bdb14..7aacc071aeede38bc1207baf2cacad71d117a405 100644
--- a/process/KeywordRegistry_basic/process.js
+++ b/process/KeywordRegistry_basic/process.js
@@ -55,6 +55,7 @@ $KeywordRegistry.productPricelist = function(){return "ProductPricelist";};
 $KeywordRegistry.productPricelist$standardList = function(){return "02553fc7-4611-4914-8ff5-0b7c4e7531c9";};
 
 $KeywordRegistry.quantityUnit = function(){return "QuantityUnit";};
+$KeywordRegistry.quantityUnit$pieces = function(){return "548ffe3b-466b-4c8f-97d6-e3ad23e33344";};
 $KeywordRegistry.MemberRole = function(){return "MemberRole";};
 $KeywordRegistry.salesprojectSource = function(){return "SalesprojectSource";};
 $KeywordRegistry.salesorderState = function(){return "SalesorderState";};
diff --git a/process/Keyword_lib/process.js b/process/Keyword_lib/process.js
index a7d93bfb2fa94ffc6bf804368308dcb9b17d4177..faa11ee5cd526b4ec26522e4ef037a20c224aa9f 100644
--- a/process/Keyword_lib/process.js
+++ b/process/Keyword_lib/process.js
@@ -200,13 +200,15 @@ KeywordUtils.getTranslatedContainer = function(pContainerName)
  * @param {String} pContainerName specifies the type of the keyword and therefore the list elements;
  *                                  e.g. "COUNTRY"; use an entry of the $KeywordRegistry here
  * @param {String} pAttributeName the name of the keyword attribute that shall be initalized
+ * @param {String} [pDefault=undefined] the default value -> Does not throw an error, if default value exists.
  * 
  * @class
  */
-function KeywordAttribute(pContainerName, pAttributeName)
+function KeywordAttribute(pContainerName, pAttributeName, pDefault)
 {
     this.container = pContainerName;
     this.attribute = pAttributeName;
+    this.defaultValue = pDefault;
     
     var sql  = SqlCondition.begin()
                            .andPrepare("AB_KEYWORD_ATTRIBUTE.CONTAINER", pContainerName)
@@ -215,23 +217,58 @@ function KeywordAttribute(pContainerName, pAttributeName)
     
     var keywordAttrData = db.array(db.ROW, sql);
     
-    if (keywordAttrData.length == 0)
+    if (keywordAttrData.length > 0) 
+    {
+        this.id = keywordAttrData[0];
+        this.type = keywordAttrData[1];
+        this.dbField = this.type.trim();
+    }
+    else if(pDefault == undefined)
+    {
         throw new Error(translate.withArguments("no keyword attribute \"%0\" found in keyword container \"%1\"", [this.attribute, this.container]));
-    
-    this.id = keywordAttrData[0];
-    this.type = keywordAttrData[1];
-    this.dbField = this.type.trim();
+    }
 }
 
+/**
+ * get the value for a specific keyId.
+ * Error if the keyword container does not have the attribute at all (you can check this with .exists())
+ * Error if the attribute does not exist at the provided keyId and you have not specified a default
+ * 
+ * @param {String} pKeyId the keyId
+ * 
+ * @return {String} the loaded value (or the default)
+ */
 KeywordAttribute.prototype.getValue = function(pKeyId)
 {
-    var sql = SqlCondition.begin()
+    if (this.exists()) 
+    {
+        var sql = SqlCondition.begin()
                           .andPrepare("AB_KEYWORD_ENTRY.CONTAINER", this.container)
                           .andPrepare("AB_KEYWORD_ATTRIBUTERELATION.AB_KEYWORD_ATTRIBUTE_ID", this.id)
                           .andPrepare("AB_KEYWORD_ENTRY.KEYID", pKeyId)
                           .buildSql("select " + this.dbField + " from AB_KEYWORD_ENTRY join AB_KEYWORD_ATTRIBUTERELATION on AB_KEYWORD_ENTRY.AB_KEYWORD_ENTRYID = AB_KEYWORD_ATTRIBUTERELATION.AB_KEYWORD_ENTRY_ID");
+        var attrValue = db.cell(sql);
+        if (attrValue)
+            return attrValue;
+        
+        if (this.defaultValue)
+            return this.defaultValue;
+        
+        throw new Error(translate.withArguments("no keyword attribute \"%0\" found in keyword \"%1\" from container \"%2\"", [this.attribute, pKeyId, this.container]));
+    }
+    else if (this.defaultValue == undefined)
+        throw new Error(translate.withArguments("no keyword attribute \"%0\" found in keyword container \"%1\"", [this.attribute, this.container]));
+    else
+        return this.defaultValue;
+}
 
-    return db.cell(sql);
+/**
+ * check if the Container can have the attribute.
+ * @return {Boolean} true if it exists, false if not
+ */
+KeywordAttribute.prototype.exists = function()
+{
+    return this.id != undefined && this.type != undefined && this.dbField != undefined;
 }
 
 /**
diff --git a/process/Person_lib/process.js b/process/Person_lib/process.js
index 2fe262fac3ee20b20078c4ff90293500a8b77f16..1963013e3e25e981546cf3852b7dc242c71a7b39 100644
--- a/process/Person_lib/process.js
+++ b/process/Person_lib/process.js
@@ -52,16 +52,28 @@ PersUtils.removeImage = function(pPersId)
  * does not validate if pRelationIdField exists or is a valid or harmful value
  * 
  * @param {String} pRelationIdField fieldname for the CONTACTID-condition as TABLEALIAS.COLUMNALIAS; e.g. TASK.EDITOR_CONTACT_ID
- * @return {String} a subsql (without bracets) that can be played within an SQL
+ * @return {String} a subsql (without bracets) that can be placed within an SQL
  */
 PersUtils.getResolvingDisplaySubSql = function(pRelationIdField)
 {
-    var contact = Contact.createWithColumnPreset();
-    var renderer = new ContactTitleRenderer(contact, null);
-    var selectExpression = renderer.asSql();
+    var selectExpression = PersUtils.getDisplaySqlExpression();
 
     //TODO: verify if there is a better solution for the usage of this as a displayValueExpression --> automatic use of #TITLE | waiting vor implementation
     return "select " + selectExpression + "from PERSON \n\
         join CONTACT on (PERSON.PERSONID = CONTACT.PERSON_ID) \n\
         where CONTACT.CONTACTID = " + pRelationIdField;
+}
+
+/**
+ * creates a sql-part for resolving a person into one string of text (for example the name of a person)
+ * useful for example in an displayValue-expression to resolave a references which is already joined within the record-container
+
+ * @return {String} a sql-part that can be placed within an SQL
+ */
+PersUtils.getDisplaySqlExpression = function()
+{
+    var contact = Contact.createWithColumnPreset();
+    var renderer = new ContactTitleRenderer(contact, null);
+    var expression = renderer.asSql();
+    return expression;
 }
\ No newline at end of file
diff --git a/process/Placeholder_lib/process.js b/process/Placeholder_lib/process.js
index c410229e0b6499caf5272e796bbe1bd0728875bb..54520ad69d604a24dbf59d0b231b0bbca241c7e9 100644
--- a/process/Placeholder_lib/process.js
+++ b/process/Placeholder_lib/process.js
@@ -5,6 +5,9 @@ import("Communication_lib");
  * All possible placeholders that can be used in a template are defined here.
  */
 
+/**
+ * Provides functions for placeholders.
+ */
 function PlaceholderUtils () {}
 
 /**
@@ -12,17 +15,10 @@ function PlaceholderUtils () {}
  * 
  * @return {Array} array of placeholders
  */
-PlaceholderUtils.getPlaceholders = function (pFilter)
+PlaceholderUtils.getPlaceholders = function ()
 {
-    var filter = {};
-    if (pFilter)
-    {
-        pFilter.forEach(function (p)
-        {
-            this[p] = true;
-        }, filter);
-    }
     var placeholders = [];
+    var sqlUtil = new SqlMaskingUtils();
     
     /***************************************************************************************************************/ 
     //Definition of available Placeholders. Placeholders should be added here:
@@ -41,12 +37,12 @@ PlaceholderUtils.getPlaceholders = function (pFilter)
     _addAddressFormat("senderFullAddress", "", Placeholder.targets.SENDER);
     
     _addSqlPart("orgname", "ORGANISATION.NAME");
-    
-    _addSqlPartFunction("phone", CommUtil.getStandardSubSqlPhone);
-    _addSqlPartFunction("email", CommUtil.getStandardSubSqlMail);
-    _addSqlPartFunction("senderPhone", CommUtil.getStandardSubSqlPhone, Placeholder.targets.SENDER);
-    _addSqlPartFunction("senderEmail", CommUtil.getStandardSubSqlMail, Placeholder.targets.SENDER);
-    _addSqlPartFunction("senderName", function () {return (new SqlMaskingUtils()).concat(["SALUTATION", "TITLE", "FIRSTNAME", "LASTNAME"])}, Placeholder.targets.SENDER);
+    _addSqlPart("phone", CommUtil.getStandardSubSqlPhone());
+    _addSqlPart("email", CommUtil.getStandardSubSqlMail());
+    _addSqlPart("name", sqlUtil.concat(["SALUTATION", "TITLE", "FIRSTNAME", "LASTNAME"]));
+    _addSqlPart("senderPhone", CommUtil.getStandardSubSqlPhone(), Placeholder.targets.SENDER);
+    _addSqlPart("senderEmail", CommUtil.getStandardSubSqlMail(), Placeholder.targets.SENDER);
+    _addSqlPart("senderName", sqlUtil.concat(["SALUTATION", "TITLE", "FIRSTNAME", "LASTNAME"]), Placeholder.targets.SENDER);
     
     
     
@@ -61,18 +57,16 @@ PlaceholderUtils.getPlaceholders = function (pFilter)
      */
     function _addAddressFormat (pName, pFormat, pTarget)
     {
-        if (!pFilter || filter[pName])
-            placeholders.push(new Placeholder(pName, Placeholder.types.ADDRESSFORMAT, pFormat, pTarget));
+        placeholders.push(new Placeholder(pName, Placeholder.types.ADDRESSFORMAT, pFormat, pTarget));
     }
     
     /**
      * Add a sub-sql placeholder to placeholders. For further information regarding the full query, you can take
      * a look at the function 'fetchAddressData' in Address_lib. You can use fields from CONTACT, ADDRESS, ORGANISATION and PERSON.
      */
-    function _addSqlPart (pName, pSqlPart, pTarget, pAddBraces)
+    function _addSqlPart (pName, pSqlPart, pTarget)
     {
-        if (!pFilter || filter[pName])
-            placeholders.push(new Placeholder(pName, Placeholder.types.SQLPART, pAddBraces ? "(" + pSqlPart + ")" : pSqlPart, pTarget));
+        placeholders.push(new Placeholder(pName, Placeholder.types.SQLPART, "(" + pSqlPart + ")", pTarget));
     }
     
     /**
@@ -81,8 +75,7 @@ PlaceholderUtils.getPlaceholders = function (pFilter)
      */
     function _addSqlPartFunction (pName, pSqlPartFunction, pTarget)
     {
-        if (!pFilter || filter[pName])
-            placeholders.push(new Placeholder(pName, Placeholder.types.SQLPARTFUNCTION, pSqlPartFunction, pTarget));
+        placeholders.push(new Placeholder(pName, Placeholder.types.SQLPARTFUNCTION, pSqlPartFunction, pTarget));
     }
 }
 
@@ -107,7 +100,6 @@ PlaceholderUtils.formatPlaceholder = function (pPlaceholder)
 function Placeholder (pName, pType, pValueDef, pTarget) 
 {
     this.placeholderName = PlaceholderUtils.formatPlaceholder(pName);
-    this.simpleName = pName;
     this.type = pType;
     this.target = pTarget || Placeholder.targets.RECIPIENT;
     this.valueDefinition = pValueDef;
@@ -120,6 +112,8 @@ Placeholder.prototype.toString = function ()
 
 /**
  * placeholder types, defines how the value is acquired
+ * 
+ * @enum {String}
  */
 Placeholder.types = {
     /**
@@ -138,6 +132,8 @@ Placeholder.types = {
 
 /**
  * placeholder targets, defines whose data is used
+ * 
+ * @enum {String}
  */
 Placeholder.targets = {
     /**
diff --git a/process/autostartNeon/process.js b/process/autostartNeon/process.js
index 69f1c38301c03b7a0cc0ea574015b33424454426..4c0947f97557e1f7f3225bd5406aac3b350f86ee 100644
--- a/process/autostartNeon/process.js
+++ b/process/autostartNeon/process.js
@@ -1,3 +1,4 @@
+import("system.logging");
 import("system.tools");
 import("system.calendars")
 import("system.notification")
@@ -6,19 +7,4 @@ import("system.util");
 
 var users = ["Admin", "Birgit Leicht", "Harold Smith", "Herbert Obermeier", "Lisa Sommer", "Susanne Lustig"];
 calendars.setCalendarUser(users, calendars.RIGHT_READ | calendars.RIGHT_WRITE, false, calendars.SORTSTRATEGY_NATURAL);
-calendars.setCheckAttendeesOnWrite(false);
-
-//notification.addNotification(
-//    "",
-//    text.encodeMS(["Person", "1a67eaa7-21da-4a18-97ab-755ac5cb74f7"]),
-//    null, 
-//    "", 
-//    "Geburtstag", 
-//    notification.PRIO_MAX, 
-//    1, 
-//    notification.STATE_UNSEEN, 
-//    ["_____USER_bcdfb521-c7d0-4ef1-8916-78e7d3232046"], 
-//    "Susanne Lustig", 
-//    "Alles Gute!");
-//    
-   
+calendars.setCheckAttendeesOnWrite(false);
\ No newline at end of file