diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml
new file mode 100644
index 0000000000000000000000000000000000000000..4b4cb0e41a13b48bacb75b77b3e9ab50b0a32a67
--- /dev/null
+++ b/.idea/inspectionProfiles/Project_Default.xml
@@ -0,0 +1,6 @@
+<component name="InspectionProjectProfileManager">
+  <profile version="1.0">
+    <option name="myName" value="Project Default" />
+    <inspection_tool class="LossyEncoding" enabled="false" level="WARNING" enabled_by_default="false" />
+  </profile>
+</component>
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 0000000000000000000000000000000000000000..94a25f7f4cb416c083d265558da75d457237d671
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="VcsDirectoryMappings">
+    <mapping directory="$PROJECT_DIR$" vcs="Git" />
+  </component>
+</project>
\ No newline at end of file
diff --git a/.liquibase/Data_alias/basic/2019.2/AditoBasic/ActivityDirectionKeyword_add_icon_attr.xml b/.liquibase/Data_alias/basic/2019.2/AditoBasic/ActivityDirectionKeyword_add_icon_attr.xml
new file mode 100644
index 0000000000000000000000000000000000000000..eb2fe92e77c66f859c14fee4050918d3edc4f492
--- /dev/null
+++ b/.liquibase/Data_alias/basic/2019.2/AditoBasic/ActivityDirectionKeyword_add_icon_attr.xml
@@ -0,0 +1,30 @@
+<?xml version="1.1" encoding="UTF-8" standalone="no"?>
+<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd">
+    <changeSet author="j-hoermann" id="1599ef6a-6293-40e3-8d6c-6ddfe1028e5e">
+        <insert tableName="AB_KEYWORD_ATTRIBUTE">
+            <column name="AB_KEYWORD_ATTRIBUTEID" value="e187a585-9ab1-4dd4-a2e9-2db14d4cc3a7"/>
+
+            <column name="NAME" value="icon"/>
+            <column name="CONTAINER" value="ActivityDirection"/>
+            <column name="TYPE" value="CHAR_VALUE"/>
+        </insert>
+        <insert tableName="AB_KEYWORD_ATTRIBUTERELATION">
+            <column name="AB_KEYWORD_ATTRIBUTERELATIONID" value="7770bafa-22f0-4a74-a2cf-5001b620a4b2"/>
+            <column name="AB_KEYWORD_ENTRY_ID" value="c564719a-18ef-4b9e-b130-dde8b2b518ad"/>
+            <column name="AB_KEYWORD_ATTRIBUTE_ID" value="e187a585-9ab1-4dd4-a2e9-2db14d4cc3a7"/>
+            <column name="CHAR_VALUE" value="VAADIN:ARROW_BACKWARD"/>
+        </insert>
+        <insert tableName="AB_KEYWORD_ATTRIBUTERELATION">
+            <column name="AB_KEYWORD_ATTRIBUTERELATIONID" value="d2ad222a-7a5f-4d4d-ae8c-578ad3359d24"/>
+            <column name="AB_KEYWORD_ENTRY_ID" value="6f4c6e49-36ca-4b91-ba83-c507203e1eac"/>
+            <column name="AB_KEYWORD_ATTRIBUTE_ID" value="e187a585-9ab1-4dd4-a2e9-2db14d4cc3a7"/>
+            <column name="CHAR_VALUE" value="VAADIN:ARROW_FORWARD"/>
+        </insert>
+        <insert tableName="AB_KEYWORD_ATTRIBUTERELATION">
+            <column name="AB_KEYWORD_ATTRIBUTERELATIONID" value="e82923a6-5245-4d42-871b-91df297bc2ee"/>
+            <column name="AB_KEYWORD_ENTRY_ID" value="bb386131-ee36-4835-b458-6751f137a941"/>
+            <column name="AB_KEYWORD_ATTRIBUTE_ID" value="e187a585-9ab1-4dd4-a2e9-2db14d4cc3a7"/>
+            <column name="CHAR_VALUE" value="VAADIN:SHOP"/>
+        </insert>
+    </changeSet>
+</databaseChangeLog>
\ No newline at end of file
diff --git a/.liquibase/Data_alias/basic/2019.2/AditoBasic/init_AttributeType.xml b/.liquibase/Data_alias/basic/2019.2/AditoBasic/init_AttributeType.xml
index 93ebb8ff36a275392160f83e2038deba91ac4d51..afce4587bceb283ab111c963a2d16390135a3240 100644
--- a/.liquibase/Data_alias/basic/2019.2/AditoBasic/init_AttributeType.xml
+++ b/.liquibase/Data_alias/basic/2019.2/AditoBasic/init_AttributeType.xml
@@ -34,6 +34,72 @@
             <column name="SORTING" valueNumeric="9"/>
             <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"/>
+                <column name="NAME" value="defaultAvatarRepresentation"/>
+                <column name="CONTAINER" value="AttributeType"/>
+                <column name="TYPE" value="CHAR_VALUE"/>
+        </insert>
+        <insert tableName="AB_KEYWORD_ATTRIBUTERELATION">
+                <column name="AB_KEYWORD_ATTRIBUTERELATIONID" value="0c537ea0-6ba2-4d9a-a27c-7c6a6920e303"/>
+                <column name="AB_KEYWORD_ENTRY_ID" value="972e5eb1-a457-4b75-b966-1183896dac2c"/>
+                <column name="AB_KEYWORD_ATTRIBUTE_ID" value="307ecfc6-15c8-4ab9-8afa-e97b90a00c5f"/>
+                <column name="CHAR_VALUE" value="VAADIN:INPUT"/>
+        </insert>
+        <insert tableName="AB_KEYWORD_ATTRIBUTERELATION">
+                <column name="AB_KEYWORD_ATTRIBUTERELATIONID" value="8ada9b1e-2f23-4e07-bbd6-16a3b76c5b62"/>
+                <column name="AB_KEYWORD_ENTRY_ID" value="cb7ecaea-b4e6-460e-9006-4a3d059b9857"/>
+                <column name="AB_KEYWORD_ATTRIBUTE_ID" value="307ecfc6-15c8-4ab9-8afa-e97b90a00c5f"/>
+                <column name="CHAR_VALUE" value="VAADIN:DATE_INPUT"/>
+        </insert>
+        <insert tableName="AB_KEYWORD_ATTRIBUTERELATION">
+                <column name="AB_KEYWORD_ATTRIBUTERELATIONID" value="2ef73c53-30b4-47f9-94fb-87825e14743a"/>
+                <column name="AB_KEYWORD_ENTRY_ID" value="14de196a-aaa6-41b9-b503-3df1d45acc1e"/>
+                <column name="AB_KEYWORD_ATTRIBUTE_ID" value="307ecfc6-15c8-4ab9-8afa-e97b90a00c5f"/>
+                <column name="CHAR_VALUE" value="VAADIN:CALC"/>
+        </insert>
+        <insert tableName="AB_KEYWORD_ATTRIBUTERELATION">
+                <column name="AB_KEYWORD_ATTRIBUTERELATIONID" value="c4cdd0dc-fc7e-443c-9c2f-c3d400ce3a1b"/>
+                <column name="AB_KEYWORD_ENTRY_ID" value="8a9791c1-655f-4340-91b4-cfdf6372fc75"/>
+                <column name="AB_KEYWORD_ATTRIBUTE_ID" value="307ecfc6-15c8-4ab9-8afa-e97b90a00c5f"/>
+                <column name="CHAR_VALUE" value="VAADIN:CHECK_SQUARE_O"/>
+        </insert>
+        <insert tableName="AB_KEYWORD_ATTRIBUTERELATION">
+                <column name="AB_KEYWORD_ATTRIBUTERELATIONID" value="5afb11f5-e0eb-45f2-8018-cdf85078a236"/>
+                <column name="AB_KEYWORD_ENTRY_ID" value="1390813c-6b94-4336-9986-9bcaddab69ac"/>
+                <column name="AB_KEYWORD_ATTRIBUTE_ID" value="307ecfc6-15c8-4ab9-8afa-e97b90a00c5f"/>
+                <column name="CHAR_VALUE" value="VAADIN:COMBOBOX"/>
+        </insert>
+        <insert tableName="AB_KEYWORD_ATTRIBUTERELATION">
+                <column name="AB_KEYWORD_ATTRIBUTERELATIONID" value="0954628d-e40e-45e0-a808-3194594b431e"/>
+                <column name="AB_KEYWORD_ENTRY_ID" value="2c188a17-2961-45df-bd68-34b55352375c"/>
+                <column name="AB_KEYWORD_ATTRIBUTE_ID" value="307ecfc6-15c8-4ab9-8afa-e97b90a00c5f"/>
+                <column name="CHAR_VALUE" value="VAADIN:FILE_TREE"/>
+        </insert>
+        <insert tableName="AB_KEYWORD_ATTRIBUTERELATION">
+                <column name="AB_KEYWORD_ATTRIBUTERELATIONID" value="1516db79-6f15-4683-9314-cddebb29f995"/>
+                <column name="AB_KEYWORD_ENTRY_ID" value="75a67526-6b7c-400d-b958-e1f8f45466aa"/>
+                <column name="AB_KEYWORD_ATTRIBUTE_ID" value="307ecfc6-15c8-4ab9-8afa-e97b90a00c5f"/>
+                <column name="CHAR_VALUE" value="VAADIN:DOT_CIRCLE"/>
+        </insert>
+        <insert tableName="AB_KEYWORD_ATTRIBUTERELATION">
+                <column name="AB_KEYWORD_ATTRIBUTERELATIONID" value="091bf881-e599-4baf-915a-e756ae75c52e"/>
+                <column name="AB_KEYWORD_ENTRY_ID" value="9d2f9605-1a5e-47d3-8920-168f5637e37f"/>
+                <column name="AB_KEYWORD_ATTRIBUTE_ID" value="307ecfc6-15c8-4ab9-8afa-e97b90a00c5f"/>
+                <column name="CHAR_VALUE" value="VAADIN:KEY"/>
+        </insert>
+        <insert tableName="AB_KEYWORD_ATTRIBUTERELATION">
+                <column name="AB_KEYWORD_ATTRIBUTERELATIONID" value="a85fd75f-7346-41d0-b7fe-6c677bd3f392"/>
+                <column name="AB_KEYWORD_ENTRY_ID" value="ee893a1c-d007-46fe-a190-727124c4467b"/>
+                <column name="AB_KEYWORD_ATTRIBUTE_ID" value="307ecfc6-15c8-4ab9-8afa-e97b90a00c5f"/>
+                <column name="CHAR_VALUE" value="VAADIN:TEXT_INPUT"/>
+        </insert>
+        <insert tableName="AB_KEYWORD_ATTRIBUTERELATION">
+                <column name="AB_KEYWORD_ATTRIBUTERELATIONID" value="a35c73d5-2719-422b-872b-1c6c1e0707a0"/>
+                <column name="AB_KEYWORD_ENTRY_ID" value="191d7293-3b3f-4dc7-bbe2-9da1a897f7df"/>
+                <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">
@@ -54,6 +120,27 @@
                     <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>
     </changeSet>
 </databaseChangeLog>
\ No newline at end of file
diff --git a/.liquibase/Data_alias/basic/2019.2/CampaignManagement/create_campaign.xml b/.liquibase/Data_alias/basic/2019.2/CampaignManagement/create_campaign.xml
new file mode 100644
index 0000000000000000000000000000000000000000..54404f2efe3b9073b0fe44e34f8176c728ac236e
--- /dev/null
+++ b/.liquibase/Data_alias/basic/2019.2/CampaignManagement/create_campaign.xml
@@ -0,0 +1,28 @@
+<?xml version="1.1" encoding="UTF-8" standalone="no"?>
+<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd">
+    <changeSet author="d.lechner" id="campaign_001">
+        <createTable tableName="CAMPAIGN">
+            <column name="CAMPAIGNID" type="CHAR(36)">
+                <constraints primaryKey="true" primaryKeyName="PK_CAMPAIGN_CAMPAIGNID"/>
+            </column>
+            <column name="NAME" type="NVARCHAR(50)">
+                <constraints nullable="false"/>
+            </column>
+            <column name="EMPLOYEE_CONTACT_ID" type="CHAR(36)">
+                <constraints nullable="false"/>
+            </column>
+            <column name="DESCRIPTION" type="NVARCHAR(500)" />
+            <column name="USER_NEW" type="NVARCHAR(50)">
+                <constraints nullable="false"/>
+            </column>
+            <column name="DATE_NEW" type="DATE">
+                <constraints nullable="false"/>
+            </column>
+            <column name="USER_EDIT" type="NVARCHAR(50)" />
+            <column name="DATE_EDIT" type="DATE" />
+            <column name="STATE" type="CHAR(36)">
+                <constraints nullable="false"/>
+            </column>
+        </createTable>
+    </changeSet>
+</databaseChangeLog>
\ No newline at end of file
diff --git a/.liquibase/Data_alias/basic/2019.2/CampaignManagement/create_campaignCost.xml b/.liquibase/Data_alias/basic/2019.2/CampaignManagement/create_campaignCost.xml
new file mode 100644
index 0000000000000000000000000000000000000000..19d63878df285f730940e4578eda5d7793c99194
--- /dev/null
+++ b/.liquibase/Data_alias/basic/2019.2/CampaignManagement/create_campaignCost.xml
@@ -0,0 +1,27 @@
+<?xml version="1.1" encoding="UTF-8" standalone="no"?>
+<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd">
+    <changeSet author="j.hoermann" id="ca18b650-d221-43bf-988d-7e47101e02be">
+        <createTable tableName="CAMPAIGNCOST">
+            <column name="CAMPAIGNCOSTID" type="CHAR(36)">
+                <constraints primaryKey="true" primaryKeyName="PK_CAMPAIGNCOST_CAMPAIGNCOSTID"/>
+            </column>
+            <column name="CAMPAIGN_ID" type="CHAR(36)">
+                <constraints nullable="false"/>
+            </column>
+            <column name="CAMPAIGNSTEP_ID" type="CHAR(36)"/>
+            <column name="CATEGORY" type="CHAR(36)">
+                <constraints nullable="false"/>
+            </column>
+            <column name="NET" type="NUMERIC(14,2)"/>
+            
+            <column name="USER_NEW" type="NVARCHAR(50)">
+                <constraints nullable="false"/>
+            </column>
+            <column name="DATE_NEW" type="DATE">
+                <constraints nullable="false"/>
+            </column>
+            <column name="USER_EDIT" type="NVARCHAR(50)" />
+            <column name="DATE_EDIT" type="DATE"/>
+        </createTable>
+    </changeSet>
+</databaseChangeLog>
\ No newline at end of file
diff --git a/.liquibase/Data_alias/basic/2019.2/CampaignManagement/create_campaignCostCategory.xml b/.liquibase/Data_alias/basic/2019.2/CampaignManagement/create_campaignCostCategory.xml
new file mode 100644
index 0000000000000000000000000000000000000000..cce303ee3c6e5cd61f3707199c572e452cb9ab84
--- /dev/null
+++ b/.liquibase/Data_alias/basic/2019.2/CampaignManagement/create_campaignCostCategory.xml
@@ -0,0 +1,32 @@
+<?xml version="1.1" encoding="UTF-8" standalone="no"?>
+<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd">
+    <changeSet author="j.hoermann" id="17b2f361-6d08-4cd7-80da-53ebf84d06fe">
+        <insert tableName="AB_KEYWORD_ENTRY">
+            <column name="AB_KEYWORD_ENTRYID" value="62cb479d-70b2-4cb4-91f5-5d1352f2131b"/>
+            <column name="KEYID" value="74aabda2-fb1f-4ed3-adcc-9509c533b52c"/>
+            <column name="TITLE" value="Printing costs"/>
+            <column name="CONTAINER" value="CampaignManagementCostCategory"/>
+            <column name="SORTING" valueNumeric="1"/>
+            <column name="ISACTIVE" valueNumeric="1"/>
+            <column name="ISESSENTIAL" valueNumeric="0"/>
+        </insert>
+        <insert tableName="AB_KEYWORD_ENTRY">
+            <column name="AB_KEYWORD_ENTRYID" value="73b34a7c-5921-461c-8cf5-17e3aba01bd0"/>
+            <column name="KEYID" value="3c28d838-8bca-4b2d-82af-335f8a48984f"/>
+            <column name="TITLE" value="Shipping costs"/>
+            <column name="CONTAINER" value="CampaignManagementCostCategory"/>
+            <column name="SORTING" valueNumeric="2"/>
+            <column name="ISACTIVE" valueNumeric="1"/>
+            <column name="ISESSENTIAL" valueNumeric="0"/>
+        </insert>
+        <insert tableName="AB_KEYWORD_ENTRY">
+            <column name="AB_KEYWORD_ENTRYID" value="7ef45db6-9151-45da-adb9-8e7759390ecd"/>
+            <column name="KEYID" value="94e04ba5-3cd4-42c2-85d7-6488dba75cf2"/>
+            <column name="TITLE" value="Layout costs"/>
+            <column name="CONTAINER" value="CampaignManagementCostCategory"/>
+            <column name="SORTING" valueNumeric="3"/>
+            <column name="ISACTIVE" valueNumeric="1"/>
+            <column name="ISESSENTIAL" valueNumeric="0"/>
+        </insert>
+    </changeSet>
+</databaseChangeLog>
\ No newline at end of file
diff --git a/.liquibase/Data_alias/basic/2019.2/CampaignManagement/create_campaignParticipant.xml b/.liquibase/Data_alias/basic/2019.2/CampaignManagement/create_campaignParticipant.xml
new file mode 100644
index 0000000000000000000000000000000000000000..2977ad8355fe6e72bc0571a4ef8e89bac7e131fe
--- /dev/null
+++ b/.liquibase/Data_alias/basic/2019.2/CampaignManagement/create_campaignParticipant.xml
@@ -0,0 +1,27 @@
+<?xml version="1.1" encoding="UTF-8" standalone="no"?>
+<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd">
+    <changeSet author="d.lechner" id="campaign_003">
+        <createTable tableName="CAMPAIGNPARTICIPANT">
+            <column name="CAMPAIGNPARTICIPANTID" type="CHAR(36)">
+                <constraints primaryKey="true" primaryKeyName="PK_CAMPAIGNPARTICIPANT_CAMPAIGNPARTICIPANTID"/>
+            </column>
+            <column name="CONTACT_ID" type="CHAR(36)">
+                <constraints nullable="false"/>
+            </column>
+            <column name="CAMPAIGN_ID" type="CHAR(36)">
+                <constraints nullable="false"/>
+            </column>
+            <column name="CAMPAIGNSTEP_ID" type="CHAR(36)">
+                <constraints nullable="false"/>
+            </column>
+            <column name="USER_NEW" type="NVARCHAR(50)">
+                <constraints nullable="false"/>
+            </column>
+            <column name="DATE_NEW" type="DATE">
+                <constraints nullable="false"/>
+            </column>
+            <column name="USER_EDIT" type="NVARCHAR(50)" />
+            <column name="DATE_EDIT" type="DATE" />
+        </createTable>
+    </changeSet>
+</databaseChangeLog>
\ No newline at end of file
diff --git a/.liquibase/Data_alias/basic/2019.2/CampaignManagement/create_campaignParticipantLog.xml b/.liquibase/Data_alias/basic/2019.2/CampaignManagement/create_campaignParticipantLog.xml
new file mode 100644
index 0000000000000000000000000000000000000000..9aecc0e95b24a922d05c9c724087a8a6a3d18236
--- /dev/null
+++ b/.liquibase/Data_alias/basic/2019.2/CampaignManagement/create_campaignParticipantLog.xml
@@ -0,0 +1,27 @@
+<?xml version="1.1" encoding="UTF-8" standalone="no"?>
+<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd">
+    <changeSet author="d.lechner" id="campaign_004">
+        <createTable tableName="CAMPAIGNPARTICIPANTLOG">
+            <column name="CAMPAIGNPARTICIPANTLOGID" type="CHAR(36)">
+                <constraints primaryKey="true" primaryKeyName="PK_CAMPAIGNPARTICIPANTLOG_CAMPAIGNPARTICIPANTLOGID"/>
+            </column>
+            <column name="CAMPAIGNPARTICIPANT_ID" type="CHAR(36)">
+                <constraints nullable="false"/>
+            </column>
+            <column name="CAMPAIGN_ID" type="CHAR(36)">
+                <constraints nullable="false"/>
+            </column>
+            <column name="CAMPAIGNSTEP_ID" type="CHAR(36)">
+                <constraints nullable="false"/>
+            </column>
+            <column name="USER_NEW" type="NVARCHAR(50)">
+                <constraints nullable="false"/>
+            </column>
+            <column name="DATE_NEW" type="DATE">
+                <constraints nullable="false"/>
+            </column>
+            <column name="USER_EDIT" type="NVARCHAR(50)" />
+            <column name="DATE_EDIT" type="DATE" />
+        </createTable>
+    </changeSet>
+</databaseChangeLog>
\ No newline at end of file
diff --git a/.liquibase/Data_alias/basic/2019.2/CampaignManagement/create_campaignState.xml b/.liquibase/Data_alias/basic/2019.2/CampaignManagement/create_campaignState.xml
new file mode 100644
index 0000000000000000000000000000000000000000..ead502807aa3d421af1242ce059178ce8c2085ac
--- /dev/null
+++ b/.liquibase/Data_alias/basic/2019.2/CampaignManagement/create_campaignState.xml
@@ -0,0 +1,35 @@
+<?xml version="1.1" encoding="UTF-8" standalone="no"?>
+<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd">
+    <changeSet author="d.buechler" id="a3212838-7473-4e9d-bbf4-49dec0c1c399">
+        <insert tableName="AB_KEYWORD_ENTRY">
+            <column name="AB_KEYWORD_ENTRYID" value="8d95cad1-3ab2-4b6c-9b38-064cb914216d"/>
+
+            <column name="KEYID" value="e04c9c59-0590-463c-a10e-e25c583e9cf2"/>
+            <column name="TITLE" value="In planning"/>
+            <column name="CONTAINER" value="CampaignManagementStates"/>
+            <column name="SORTING" valueNumeric="1"/>
+            <column name="ISACTIVE" valueNumeric="1"/>
+            <column name="ISESSENTIAL" valueNumeric="1"/>
+        </insert>
+        <insert tableName="AB_KEYWORD_ENTRY">
+            <column name="AB_KEYWORD_ENTRYID" value="3e5036a1-43a1-4bb1-ad56-ed42df7c9538"/>
+
+            <column name="KEYID" value="42e1ee2b-0108-4ccf-ab43-29cbcb0377bf"/>
+            <column name="TITLE" value="Approved"/>
+            <column name="CONTAINER" value="CampaignManagementStates"/>
+            <column name="SORTING" valueNumeric="2"/>
+            <column name="ISACTIVE" valueNumeric="1"/>
+            <column name="ISESSENTIAL" valueNumeric="0"/>
+        </insert>
+        <insert tableName="AB_KEYWORD_ENTRY">
+            <column name="AB_KEYWORD_ENTRYID" value="0759da45-5a5b-4163-a3a1-6a19f5a196c5"/>
+
+            <column name="KEYID" value="db1f6e61-07ed-4185-abdb-f9103e5ee3e6"/>
+            <column name="TITLE" value="Completed"/>
+            <column name="CONTAINER" value="CampaignManagementStates"/>
+            <column name="SORTING" valueNumeric="3"/>
+            <column name="ISACTIVE" valueNumeric="1"/>
+            <column name="ISESSENTIAL" valueNumeric="0"/>
+        </insert>
+    </changeSet>
+</databaseChangeLog>
\ No newline at end of file
diff --git a/.liquibase/Data_alias/basic/2019.2/CampaignManagement/create_campaignStep.xml b/.liquibase/Data_alias/basic/2019.2/CampaignManagement/create_campaignStep.xml
new file mode 100644
index 0000000000000000000000000000000000000000..377cb13f6c1cf81663d3d3da7ebbd6a9ffb99b24
--- /dev/null
+++ b/.liquibase/Data_alias/basic/2019.2/CampaignManagement/create_campaignStep.xml
@@ -0,0 +1,43 @@
+<?xml version="1.1" encoding="UTF-8" standalone="no"?>
+<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd">
+    <changeSet author="d.lechner" id="campaign_002">
+        <createTable tableName="CAMPAIGNSTEP">
+            <column name="CAMPAIGNSTEPID" type="CHAR(36)">
+                <constraints primaryKey="true" primaryKeyName="PK_CAMPAIGNSTEP_CAMPAIGNSTEPID"/>
+            </column>
+            <column name="CAMPAIGN_ID" type="CHAR(36)">
+                <constraints nullable="false"/>
+            </column>
+            <column name="EMPLOYEE_CONTACT_ID" type="CHAR(36)">
+                <constraints nullable="false"/>
+            </column>
+            <column name="NAME" type="NVARCHAR(50)">
+                <constraints nullable="false"/>
+            </column>
+            <column name="DESCRIPTION" type="NVARCHAR(500)" />
+            <column name="DATE_START" type="DATE">
+                <constraints nullable="false"/>
+            </column>
+            <column name="DATE_END" type="DATE">
+                <constraints nullable="false"/>
+            </column>
+            <column name="STATE" type="CHAR(36)">
+                <constraints nullable="false"/>
+            </column>
+            <column name="SORTING" type="INTEGER">
+                <constraints nullable="false"/>
+            </column>
+            <column name="MAXPARTICIPANTS" type="INTEGER">
+                <constraints nullable="false"/>
+            </column>
+            <column name="USER_NEW" type="NVARCHAR(50)">
+                <constraints nullable="false"/>
+            </column>
+            <column name="DATE_NEW" type="DATE">
+                <constraints nullable="false"/>
+            </column>
+            <column name="USER_EDIT" type="NVARCHAR(50)" />
+            <column name="DATE_EDIT" type="DATE" />
+        </createTable>
+    </changeSet>
+</databaseChangeLog>
\ No newline at end of file
diff --git a/.liquibase/Data_alias/basic/2019.2/CampaignManagement/create_campaignStepState.xml b/.liquibase/Data_alias/basic/2019.2/CampaignManagement/create_campaignStepState.xml
new file mode 100644
index 0000000000000000000000000000000000000000..c7560f94c6359a13bcad0a3982955f6a4a49cc2f
--- /dev/null
+++ b/.liquibase/Data_alias/basic/2019.2/CampaignManagement/create_campaignStepState.xml
@@ -0,0 +1,35 @@
+<?xml version="1.1" encoding="UTF-8" standalone="no"?>
+<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd">
+    <changeSet author="d.buechler" id="d5e7a9a5-d4a9-4425-a930-39ea2574ca47">
+        <insert tableName="AB_KEYWORD_ENTRY">
+            <column name="AB_KEYWORD_ENTRYID" value="0dc9b27b-56d8-4650-92ee-bf85a3c67cb3"/>
+
+            <column name="KEYID" value="bbf69673-2ec6-46f8-b231-684a31be9fbd"/>
+            <column name="TITLE" value="Open"/>
+            <column name="CONTAINER" value="CampaignManagementStepStates"/>
+            <column name="SORTING" valueNumeric="1"/>
+            <column name="ISACTIVE" valueNumeric="1"/>
+            <column name="ISESSENTIAL" valueNumeric="1"/>
+        </insert>
+        <insert tableName="AB_KEYWORD_ENTRY">
+            <column name="AB_KEYWORD_ENTRYID" value="b1f5ea38-1b8c-47a8-a8ad-4c6ed9c26cda"/>
+
+            <column name="KEYID" value="1df0f89b-836d-4242-99cb-334764a7abac"/>
+            <column name="TITLE" value="Active"/>
+            <column name="CONTAINER" value="CampaignManagementStepStates"/>
+            <column name="SORTING" valueNumeric="2"/>
+            <column name="ISACTIVE" valueNumeric="1"/>
+            <column name="ISESSENTIAL" valueNumeric="0"/>
+        </insert>
+        <insert tableName="AB_KEYWORD_ENTRY">
+            <column name="AB_KEYWORD_ENTRYID" value="98f4cab1-74b8-4a23-a99a-c3624711beab"/>
+
+            <column name="KEYID" value="2b9904ad-41d0-411c-8c3a-6f31d8e742b3"/>
+            <column name="TITLE" value="Completed"/>
+            <column name="CONTAINER" value="CampaignManagementStepStates"/>
+            <column name="SORTING" valueNumeric="3"/>
+            <column name="ISACTIVE" valueNumeric="1"/>
+            <column name="ISESSENTIAL" valueNumeric="0"/>
+        </insert>
+    </changeSet>
+</databaseChangeLog>
\ No newline at end of file
diff --git a/.liquibase/Data_alias/basic/2019.2/alter_activityLink_Derby.xml b/.liquibase/Data_alias/basic/2019.2/alter_activityLink.xml
similarity index 72%
rename from .liquibase/Data_alias/basic/2019.2/alter_activityLink_Derby.xml
rename to .liquibase/Data_alias/basic/2019.2/alter_activityLink.xml
index 42dad5d1fe1233018439f983730dda81cbaf8f26..108c30fec50d07609f1fc73f106092a0724349ff 100644
--- a/.liquibase/Data_alias/basic/2019.2/alter_activityLink_Derby.xml
+++ b/.liquibase/Data_alias/basic/2019.2/alter_activityLink.xml
@@ -8,4 +8,14 @@
             RENAME COLUMN ACTIVITYLINK.ACTIVITY_ID_NEW TO ACTIVITY_ID;
         </sql>
     </changeSet>
+    
+    <changeSet author="j.hoermann" id="9a86323f-a299-42a5-937a-f5e37d0db507">
+        <preConditions onFail="CONTINUE">
+            <not>
+                <dbms type="derby" />
+            </not>
+        </preConditions>
+
+        <modifyDataType tableName="ACTIVITYLINK" columnName="ACTIVITY_ID" newDataType="CHAR(36)"/>
+    </changeSet>
 </databaseChangeLog>
\ No newline at end of file
diff --git a/.liquibase/Data_alias/basic/2019.2/alter_activityLink_notDerby.xml b/.liquibase/Data_alias/basic/2019.2/alter_activityLink_notDerby.xml
deleted file mode 100644
index 1f3a0b842f009417b8ed199eb918f583bf670807..0000000000000000000000000000000000000000
--- a/.liquibase/Data_alias/basic/2019.2/alter_activityLink_notDerby.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.1" encoding="UTF-8" standalone="no"?>
-<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd">
-    <changeSet dbms="!derby" author="j.hoermann" id="634590d7-8bcc-40f9-9615-9de7cd91e586">
-        <modifyDataType tableName="ACTIVITYLINK" columnName="ACTIVITY_ID" newDataType="CHAR(36)"/>
-    </changeSet>
-</databaseChangeLog>
\ No newline at end of file
diff --git a/.liquibase/Data_alias/basic/2019.2/change_Milestone_datatype_to_new_Keyword_logic_Derby.xml b/.liquibase/Data_alias/basic/2019.2/change_Milestone_datatype_to_new_Keyword_logic.xml
similarity index 72%
rename from .liquibase/Data_alias/basic/2019.2/change_Milestone_datatype_to_new_Keyword_logic_Derby.xml
rename to .liquibase/Data_alias/basic/2019.2/change_Milestone_datatype_to_new_Keyword_logic.xml
index fa2c3652ee188650237957106649b056346a3c5c..6eee124a8c12c2870b013401622c68324bc8f065 100644
--- a/.liquibase/Data_alias/basic/2019.2/change_Milestone_datatype_to_new_Keyword_logic_Derby.xml
+++ b/.liquibase/Data_alias/basic/2019.2/change_Milestone_datatype_to_new_Keyword_logic.xml
@@ -13,4 +13,15 @@
             RENAME COLUMN SALESPROJECT_MILESTONE.VALUE_NEW TO VALUE;
         </sql>
     </changeSet>
+    
+    <changeSet author="j.hoermann" id="f5074961-4aa0-4cd8-8541-7381ddfb0b71">
+        <preConditions onFail="CONTINUE">
+            <not>
+                <dbms type="derby" />
+            </not>
+        </preConditions>
+
+        <modifyDataType tableName="SALESPROJECT_MILESTONE" columnName="TYPE" newDataType="NVARCHAR(80)"/>
+        <modifyDataType tableName="SALESPROJECT_MILESTONE" columnName="VALUE" newDataType="CHAR(36)"/>
+    </changeSet>
 </databaseChangeLog>
\ No newline at end of file
diff --git a/.liquibase/Data_alias/basic/2019.2/change_Milestone_datatype_to_new_Keyword_logic_notDerby.xml b/.liquibase/Data_alias/basic/2019.2/change_Milestone_datatype_to_new_Keyword_logic_notDerby.xml
deleted file mode 100644
index 41fdab8d76669d6e338ccad579c2745d9f1efb61..0000000000000000000000000000000000000000
--- a/.liquibase/Data_alias/basic/2019.2/change_Milestone_datatype_to_new_Keyword_logic_notDerby.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.1" encoding="UTF-8" standalone="no"?>
-<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd">
-    <changeSet dbms="!derby" author="j.hoermann" id="f5074961-4aa0-4cd8-8541-7381ddfb0b71">
-        <modifyDataType tableName="SALESPROJECT_MILESTONE" columnName="TYPE" newDataType="NVARCHAR(80)"/>
-        <modifyDataType tableName="SALESPROJECT_MILESTONE" columnName="VALUE" newDataType="CHAR(36)"/>
-    </changeSet>
-</databaseChangeLog>
\ No newline at end of file
diff --git a/.liquibase/Data_alias/basic/2019.2/changelog.xml b/.liquibase/Data_alias/basic/2019.2/changelog.xml
index 071191bde2bf36e39cf9e1c9b04664b67e389d56..8dd34b786f956712f56e4ea679dd6f83064fce90 100644
--- a/.liquibase/Data_alias/basic/2019.2/changelog.xml
+++ b/.liquibase/Data_alias/basic/2019.2/changelog.xml
@@ -133,21 +133,28 @@
     <include relativeToChangelogFile="true" file="update_Keyword_Essentials.xml" />
     <include relativeToChangelogFile="true" file="Contactmanagement_added_ImageBlobs.xml" />
 	
-    <!-- Derby needs special handling -->
-    <include relativeToChangelogFile="true" file="alter_activityLink_notDerby.xml" />
-    <include relativeToChangelogFile="true" file="alter_activityLink_Derby.xml" />
+    <include relativeToChangelogFile="true" file="alter_activityLink.xml" />
     
     <include relativeToChangelogFile="true" file="renameCycle_to_Milestone.xml" />
-    <!-- Derby needs special handling -->
-    <include relativeToChangelogFile="true" file="change_Milestone_datatype_to_new_Keyword_logic_notDerby.xml" />
-    <include relativeToChangelogFile="true" file="change_Milestone_datatype_to_new_Keyword_logic_Derby.xml" />
+    <include relativeToChangelogFile="true" file="change_Milestone_datatype_to_new_Keyword_logic.xml" />
     <include relativeToChangelogFile="true" file="update_Milestone_to_new_Keyword.xml" />
-    
+
     <include relativeToChangelogFile="true" file="data/example_person/PERSON_admin.xml" context="example"/>
     
-    <include relativeToChangelogFile="true" file="addDefaultAddresses.xml" context="example"/>    
+    <include relativeToChangelogFile="true" file="addDefaultAddresses.xml" context="example"/>  
     <include relativeToChangelogFile="true" file="AditoBasic/create_ab_loghistory.xml"/>
     
     <include relativeToChangelogFile="true" file="activity_rename_Creator_to_Responsible.xml" />
     <include relativeToChangelogFile="true" file="miscellaneous/Contact_additionalColumns.xml" />
+
+    <include relativeToChangelogFile="true" file="CampaignManagement/create_campaign.xml"/>
+    <include relativeToChangelogFile="true" file="CampaignManagement/create_campaignStep.xml"/>
+    <include relativeToChangelogFile="true" file="CampaignManagement/create_campaignParticipant.xml"/>
+    <include relativeToChangelogFile="true" file="CampaignManagement/create_campaignParticipantLog.xml"/>
+    <include relativeToChangelogFile="true" file="CampaignManagement/create_campaignState.xml"/>
+    <include relativeToChangelogFile="true" file="CampaignManagement/create_campaignStepState.xml"/>
+    <include relativeToChangelogFile="true" file="CampaignManagement/create_campaignCost.xml"/>
+    <include relativeToChangelogFile="true" file="CampaignManagement/create_campaignCostCategory.xml"/>
+    
+    <include relativeToChangelogFile="true" file="AditoBasic/ActivityDirectionKeyword_add_icon_attr.xml"/>
 </databaseChangeLog>
diff --git a/.liquibase/Data_alias/basic/2019.2/data/example_attribute/AttributeUsage.xml b/.liquibase/Data_alias/basic/2019.2/data/example_attribute/AttributeUsage.xml
index e0c81c2dcf1939e780d8eb0a77cfa261780b7998..2de20c7371737c9e63d9328dec98a22efbd74568 100644
--- a/.liquibase/Data_alias/basic/2019.2/data/example_attribute/AttributeUsage.xml
+++ b/.liquibase/Data_alias/basic/2019.2/data/example_attribute/AttributeUsage.xml
@@ -4,336 +4,409 @@
 <insert tableName="AB_ATTRIBUTEUSAGE">
     <column name="AB_ATTRIBUTEUSAGEID" value="48e9320b-b2b4-4523-bb34-e68749fe1465"/>
     <column name="AB_ATTRIBUTE_ID" value="b4e372c5-da95-4c16-9d10-3be1c6a9eddd"/>
+    <column name="MAX_COUNT" valueNumeric="1"/>
+    <column name="OBJECT_TYPE" value="Activity"/>
+</insert>
+<insert tableName="AB_ATTRIBUTEUSAGE">
+    <column name="AB_ATTRIBUTEUSAGEID" value="1d34b5e6-44ca-4577-925e-5b93e96be40a"/>
+    <column name="AB_ATTRIBUTE_ID" value="a6eee141-5ed6-4b87-986f-29e3fdccaf13"/>
+    <column name="MAX_COUNT" valueNumeric="1"/>
     <column name="OBJECT_TYPE" value="Activity"/>
 </insert>
 <insert tableName="AB_ATTRIBUTEUSAGE">
     <column name="AB_ATTRIBUTEUSAGEID" value="b70e6047-c8d9-4be0-99a9-e8a6b4a07c9b"/>
     <column name="AB_ATTRIBUTE_ID" value="bfc5c9d3-274e-49e9-b8ab-8a4c24987026"/>
+    <column name="MAX_COUNT" valueNumeric="1"/>
     <column name="OBJECT_TYPE" value="Activity"/>
 </insert>
 <insert tableName="AB_ATTRIBUTEUSAGE">
     <column name="AB_ATTRIBUTEUSAGEID" value="6fb3f5c0-177e-41ad-88c1-44d096ead1de"/>
     <column name="AB_ATTRIBUTE_ID" value="ae04f4ba-0ddb-4188-9ec1-b9ce2d9b11d8"/>
+    <column name="MAX_COUNT" valueNumeric="1"/>
     <column name="OBJECT_TYPE" value="Activity"/>
 </insert>
 <insert tableName="AB_ATTRIBUTEUSAGE">
     <column name="AB_ATTRIBUTEUSAGEID" value="022f3b98-f716-47ca-aaa1-7db53f86b821"/>
     <column name="AB_ATTRIBUTE_ID" value="43a913ce-d73c-48a6-aa4b-ad050e1f1b26"/>
+    <column name="MAX_COUNT" valueNumeric="1"/>
     <column name="OBJECT_TYPE" value="Activity"/>
 </insert>
 <insert tableName="AB_ATTRIBUTEUSAGE">
     <column name="AB_ATTRIBUTEUSAGEID" value="aeb00c8d-dbee-4657-b5da-4e7aaa494120"/>
     <column name="AB_ATTRIBUTE_ID" value="96fc2fe2-8424-4ff2-8eb5-0d054e26af9b"/>
+    <column name="MAX_COUNT" valueNumeric="1"/>
     <column name="OBJECT_TYPE" value="Activity"/>
 </insert>
 <insert tableName="AB_ATTRIBUTEUSAGE">
     <column name="AB_ATTRIBUTEUSAGEID" value="3ea3348e-bffa-47d9-ac58-cfb9fb7c21e7"/>
     <column name="AB_ATTRIBUTE_ID" value="746bbd1d-344b-487e-adb5-d232aba57c0e"/>
+    <column name="MAX_COUNT" valueNumeric="1"/>
     <column name="OBJECT_TYPE" value="Activity"/>
 </insert>
 <insert tableName="AB_ATTRIBUTEUSAGE">
     <column name="AB_ATTRIBUTEUSAGEID" value="570f695f-5fd1-4f5a-b21d-62ab721db1ef"/>
     <column name="AB_ATTRIBUTE_ID" value="40bbf16f-566d-442c-8423-64be0ae40c81"/>
+    <column name="MAX_COUNT" valueNumeric="1"/>
     <column name="OBJECT_TYPE" value="Activity"/>
 </insert>
 <insert tableName="AB_ATTRIBUTEUSAGE">
     <column name="AB_ATTRIBUTEUSAGEID" value="c6bb63b2-afdb-4dde-a22a-0022926425d8"/>
     <column name="AB_ATTRIBUTE_ID" value="b8179c49-8ef0-4d8e-bcb2-762f9d05563b"/>
+    <column name="MAX_COUNT" valueNumeric="1"/>
     <column name="OBJECT_TYPE" value="Activity"/>
 </insert>
 <insert tableName="AB_ATTRIBUTEUSAGE">
     <column name="AB_ATTRIBUTEUSAGEID" value="924782ab-fc54-432e-aa19-d04a986fb3da"/>
     <column name="AB_ATTRIBUTE_ID" value="4c71d1da-9fff-43fc-b6fd-6fc24696c4bf"/>
+    <column name="MAX_COUNT" valueNumeric="1"/>
     <column name="OBJECT_TYPE" value="Activity"/>
 </insert>
 <insert tableName="AB_ATTRIBUTEUSAGE">
     <column name="AB_ATTRIBUTEUSAGEID" value="247a2d0b-dd07-4799-89fc-e85d3ef10947"/>
     <column name="AB_ATTRIBUTE_ID" value="3587a98c-03e4-4acc-af89-13b26ce4d956"/>
+    <column name="MAX_COUNT" valueNumeric="1"/>
     <column name="OBJECT_TYPE" value="Activity"/>
 </insert>
 <insert tableName="AB_ATTRIBUTEUSAGE">
     <column name="AB_ATTRIBUTEUSAGEID" value="d890f5d6-0330-457a-8650-9261f494fe9c"/>
     <column name="AB_ATTRIBUTE_ID" value="ddd06ec5-b0f8-4c12-8753-e7333fcf87cf"/>
+    <column name="MAX_COUNT" valueNumeric="1"/>
     <column name="OBJECT_TYPE" value="Activity"/>
 </insert>
 <insert tableName="AB_ATTRIBUTEUSAGE">
     <column name="AB_ATTRIBUTEUSAGEID" value="440250fb-033a-4db2-84ec-1f05e90b5d1d"/>
     <column name="AB_ATTRIBUTE_ID" value="4bb88e18-f160-4bf3-b9b2-d1a413dcecf5"/>
+    <column name="MAX_COUNT" valueNumeric="1"/>
     <column name="OBJECT_TYPE" value="Activity"/>
 </insert>
 <insert tableName="AB_ATTRIBUTEUSAGE">
     <column name="AB_ATTRIBUTEUSAGEID" value="b405df7f-07e3-43c6-b067-c29a083489db"/>
     <column name="AB_ATTRIBUTE_ID" value="e144b3f5-3074-4d92-a645-2b7aa601564c"/>
+    <column name="MAX_COUNT" valueNumeric="1"/>
     <column name="OBJECT_TYPE" value="Activity"/>
 </insert>
 <insert tableName="AB_ATTRIBUTEUSAGE">
     <column name="AB_ATTRIBUTEUSAGEID" value="85d90ab9-8b2c-4759-b730-14bdc21bdf0c"/>
     <column name="AB_ATTRIBUTE_ID" value="90578c72-fd3a-4b09-8116-31a017b6c623"/>
+    <column name="MAX_COUNT" valueNumeric="1"/>
     <column name="OBJECT_TYPE" value="Activity"/>
 </insert>
 <insert tableName="AB_ATTRIBUTEUSAGE">
     <column name="AB_ATTRIBUTEUSAGEID" value="d1c81512-9e0c-45ae-bf58-7fc025ecbe12"/>
     <column name="AB_ATTRIBUTE_ID" value="de6702e0-9253-4d7a-ab20-b8efb963ee63"/>
+    <column name="MAX_COUNT" valueNumeric="1"/>
     <column name="OBJECT_TYPE" value="Activity"/>
 </insert>
 <insert tableName="AB_ATTRIBUTEUSAGE">
     <column name="AB_ATTRIBUTEUSAGEID" value="b327f51d-1d52-4db0-96e1-3b1a02af603d"/>
     <column name="AB_ATTRIBUTE_ID" value="2d66c8b6-cf6e-44b2-b663-488f3f4d6647"/>
+    <column name="MAX_COUNT" valueNumeric="1"/>
     <column name="OBJECT_TYPE" value="Activity"/>
 </insert>
 <insert tableName="AB_ATTRIBUTEUSAGE">
     <column name="AB_ATTRIBUTEUSAGEID" value="745b9d55-4402-4b0d-95c1-60cc86d753c0"/>
     <column name="AB_ATTRIBUTE_ID" value="620a0903-6fde-4751-aefa-c398d64c13cc"/>
+    <column name="MAX_COUNT" valueNumeric="1"/>
     <column name="OBJECT_TYPE" value="Activity"/>
 </insert>
 <insert tableName="AB_ATTRIBUTEUSAGE">
     <column name="AB_ATTRIBUTEUSAGEID" value="fb175158-9a11-49df-9d2d-c5149826db0f"/>
     <column name="AB_ATTRIBUTE_ID" value="6e162c86-3b07-4817-8570-ef5598b4f455"/>
+    <column name="MAX_COUNT" valueNumeric="1"/>
     <column name="OBJECT_TYPE" value="Activity"/>
 </insert>
 <insert tableName="AB_ATTRIBUTEUSAGE">
     <column name="AB_ATTRIBUTEUSAGEID" value="a4c52b1c-2a9d-480f-9ed2-266ef94102f2"/>
     <column name="AB_ATTRIBUTE_ID" value="ee8c2bff-92c9-456a-a665-c7ccc3960f8d"/>
+    <column name="MAX_COUNT" valueNumeric="1"/>
     <column name="OBJECT_TYPE" value="Activity"/>
 </insert>
 <insert tableName="AB_ATTRIBUTEUSAGE">
     <column name="AB_ATTRIBUTEUSAGEID" value="b358d1b5-e3be-4b81-8f68-8b8bfe6084c2"/>
     <column name="AB_ATTRIBUTE_ID" value="33937757-d170-4c4f-bca7-2a687b0c3a8a"/>
+    <column name="MAX_COUNT" valueNumeric="1"/>
     <column name="OBJECT_TYPE" value="Activity"/>
 </insert>
 <insert tableName="AB_ATTRIBUTEUSAGE">
     <column name="AB_ATTRIBUTEUSAGEID" value="7aece23a-c0d2-432c-86da-f6b766752062"/>
     <column name="AB_ATTRIBUTE_ID" value="bae6db6b-259a-4f36-9112-4516b7f8cfeb"/>
+    <column name="MAX_COUNT" valueNumeric="1"/>
     <column name="OBJECT_TYPE" value="Activity"/>
 </insert>
 <insert tableName="AB_ATTRIBUTEUSAGE">
     <column name="AB_ATTRIBUTEUSAGEID" value="0a32ee8c-3fc7-4412-ab4a-e17668396954"/>
     <column name="AB_ATTRIBUTE_ID" value="ffeeca2a-2349-40dc-9b0c-4a8b3447d3df"/>
+    <column name="MAX_COUNT" valueNumeric="1"/>
     <column name="OBJECT_TYPE" value="Activity"/>
 </insert>
 <insert tableName="AB_ATTRIBUTEUSAGE">
     <column name="AB_ATTRIBUTEUSAGEID" value="79133e7e-fd63-4d71-90a2-96a487e5ab42"/>
     <column name="AB_ATTRIBUTE_ID" value="10d2cbd3-9c58-4e9d-9259-d556aba6cf6c"/>
+    <column name="MAX_COUNT" valueNumeric="1"/>
     <column name="OBJECT_TYPE" value="Activity"/>
 </insert>
 <insert tableName="AB_ATTRIBUTEUSAGE">
     <column name="AB_ATTRIBUTEUSAGEID" value="fdd04439-6302-41ec-bbf1-5b63e2142cbc"/>
     <column name="AB_ATTRIBUTE_ID" value="6537b5ae-9bfd-455e-8b48-183895b9b461"/>
+    <column name="MAX_COUNT" valueNumeric="1"/>
     <column name="OBJECT_TYPE" value="Activity"/>
 </insert>
 <insert tableName="AB_ATTRIBUTEUSAGE">
     <column name="AB_ATTRIBUTEUSAGEID" value="5f8563c1-5467-4655-a42f-72dcf43d184b"/>
     <column name="AB_ATTRIBUTE_ID" value="f5e7449a-f61e-4022-aa93-6b3916ddbed7"/>
+    <column name="MAX_COUNT" valueNumeric="1"/>
     <column name="OBJECT_TYPE" value="Activity"/>
 </insert>
 <insert tableName="AB_ATTRIBUTEUSAGE">
     <column name="AB_ATTRIBUTEUSAGEID" value="24f74162-380a-4f9e-bf71-1e8a51275118"/>
     <column name="AB_ATTRIBUTE_ID" value="f7aad2b0-021e-48dd-8286-a364d0ac9fca"/>
+    <column name="MAX_COUNT" valueNumeric="1"/>
     <column name="OBJECT_TYPE" value="Activity"/>
 </insert>
 <insert tableName="AB_ATTRIBUTEUSAGE">
     <column name="AB_ATTRIBUTEUSAGEID" value="ddee95f8-21f9-4b6b-850f-79e9f12d3c4c"/>
     <column name="AB_ATTRIBUTE_ID" value="61436f5e-b85a-477e-af8b-5369d12ad742"/>
+    <column name="MAX_COUNT" valueNumeric="1"/>
     <column name="OBJECT_TYPE" value="Activity"/>
 </insert>
 <insert tableName="AB_ATTRIBUTEUSAGE">
     <column name="AB_ATTRIBUTEUSAGEID" value="4704a3a1-7762-4863-8dca-6e3ce8b4ba9f"/>
     <column name="AB_ATTRIBUTE_ID" value="913457fc-361c-4af6-ab5a-85a0ad8640e5"/>
+    <column name="MAX_COUNT" valueNumeric="1"/>
     <column name="OBJECT_TYPE" value="Activity"/>
 </insert>
 <insert tableName="AB_ATTRIBUTEUSAGE">
     <column name="AB_ATTRIBUTEUSAGEID" value="c37d0b13-468b-4018-802e-a290ccd239b7"/>
     <column name="AB_ATTRIBUTE_ID" value="eaa9aea2-73f3-48f4-909d-81de5e09a75f"/>
+    <column name="MAX_COUNT" valueNumeric="1"/>
     <column name="OBJECT_TYPE" value="Activity"/>
 </insert>
 <insert tableName="AB_ATTRIBUTEUSAGE">
     <column name="AB_ATTRIBUTEUSAGEID" value="b1df815f-535f-46c6-9df5-0c43bbcc8c47"/>
     <column name="AB_ATTRIBUTE_ID" value="7a4282b8-8461-4486-9362-bc72ceb7b5df"/>
+    <column name="MAX_COUNT" valueNumeric="1"/>
     <column name="OBJECT_TYPE" value="Activity"/>
 </insert>
 <insert tableName="AB_ATTRIBUTEUSAGE">
     <column name="AB_ATTRIBUTEUSAGEID" value="f049d2f7-bacf-4b57-b40a-779111a0b944"/>
     <column name="AB_ATTRIBUTE_ID" value="0c86b9ad-1635-46b4-8ac7-3d9b00bc2b01"/>
+    <column name="MAX_COUNT" valueNumeric="1"/>
     <column name="OBJECT_TYPE" value="Activity"/>
 </insert>
 <insert tableName="AB_ATTRIBUTEUSAGE">
     <column name="AB_ATTRIBUTEUSAGEID" value="33b8e55d-227c-4a5c-8e92-89e429dc1157"/>
     <column name="AB_ATTRIBUTE_ID" value="14b71577-42d6-40c0-a377-a11df03aa324"/>
+    <column name="MAX_COUNT" valueNumeric="1"/>
     <column name="OBJECT_TYPE" value="Activity"/>
 </insert>
 <insert tableName="AB_ATTRIBUTEUSAGE">
     <column name="AB_ATTRIBUTEUSAGEID" value="2057fae3-bea6-4a90-8dcc-b795f677c7ac"/>
     <column name="AB_ATTRIBUTE_ID" value="d3f2348b-fad2-4e4c-9ff6-cb22b0a0cd93"/>
+    <column name="MAX_COUNT" valueNumeric="1"/>
     <column name="OBJECT_TYPE" value="Activity"/>
 </insert>
 <insert tableName="AB_ATTRIBUTEUSAGE">
     <column name="AB_ATTRIBUTEUSAGEID" value="c43230d6-984b-4b47-8c39-3fceb126641b"/>
     <column name="AB_ATTRIBUTE_ID" value="fb01b321-ec75-486b-a0ef-3adfe99a33b2"/>
+    <column name="MAX_COUNT" valueNumeric="1"/>
     <column name="OBJECT_TYPE" value="Activity"/>
 </insert>
 <insert tableName="AB_ATTRIBUTEUSAGE">
     <column name="AB_ATTRIBUTEUSAGEID" value="b3f6e18e-8bdc-4679-aaa5-895c08430532"/>
     <column name="AB_ATTRIBUTE_ID" value="149c1c4c-3742-46b5-9a31-7afe22965df7"/>
+    <column name="MAX_COUNT" valueNumeric="1"/>
     <column name="OBJECT_TYPE" value="Activity"/>
 </insert>
 <insert tableName="AB_ATTRIBUTEUSAGE">
     <column name="AB_ATTRIBUTEUSAGEID" value="b78f182a-bade-428a-9b12-fd40f52414a9"/>
     <column name="AB_ATTRIBUTE_ID" value="b49852b7-901d-4d6b-b5d8-b20d75678d4b"/>
+    <column name="MAX_COUNT" valueNumeric="1"/>
     <column name="OBJECT_TYPE" value="Activity"/>
 </insert>
 <insert tableName="AB_ATTRIBUTEUSAGE">
     <column name="AB_ATTRIBUTEUSAGEID" value="27a518a0-0456-4494-8d9e-a62afb70fd68"/>
     <column name="AB_ATTRIBUTE_ID" value="542ca620-3ad0-49cc-acf9-e31f4542f302"/>
+    <column name="MAX_COUNT" valueNumeric="1"/>
     <column name="OBJECT_TYPE" value="Activity"/>
 </insert>
 <insert tableName="AB_ATTRIBUTEUSAGE">
     <column name="AB_ATTRIBUTEUSAGEID" value="3c0a29b2-e98f-4aae-902d-e5ae691537f5"/>
     <column name="AB_ATTRIBUTE_ID" value="3eb8a90f-c17b-441e-9aa8-acde31e4544c"/>
+    <column name="MAX_COUNT" valueNumeric="1"/>
     <column name="OBJECT_TYPE" value="Activity"/>
 </insert>
 <insert tableName="AB_ATTRIBUTEUSAGE">
     <column name="AB_ATTRIBUTEUSAGEID" value="7593fe50-00be-42fc-9e75-8eae49fb2b25"/>
     <column name="AB_ATTRIBUTE_ID" value="9d0949b5-7c87-4663-9229-897057e03192"/>
+    <column name="MAX_COUNT" valueNumeric="1"/>
     <column name="OBJECT_TYPE" value="Activity"/>
 </insert>
 <insert tableName="AB_ATTRIBUTEUSAGE">
     <column name="AB_ATTRIBUTEUSAGEID" value="202789a8-4d69-43b2-ab38-708938081d68"/>
     <column name="AB_ATTRIBUTE_ID" value="a689a561-d30f-4215-8faa-97b8df3e5b68"/>
+    <column name="MAX_COUNT" valueNumeric="1"/>
     <column name="OBJECT_TYPE" value="Activity"/>
 </insert>
 <insert tableName="AB_ATTRIBUTEUSAGE">
     <column name="AB_ATTRIBUTEUSAGEID" value="642ee10a-b516-4fa3-95fc-f402992a0158"/>
     <column name="AB_ATTRIBUTE_ID" value="d0d78243-cc6e-4602-b77c-b3e669da2f01"/>
+    <column name="MAX_COUNT" valueNumeric="1"/>
     <column name="OBJECT_TYPE" value="Activity"/>
 </insert>
 <insert tableName="AB_ATTRIBUTEUSAGE">
     <column name="AB_ATTRIBUTEUSAGEID" value="6c6651b6-a8a5-4f89-82a1-3f1c22a8d9b6"/>
     <column name="AB_ATTRIBUTE_ID" value="ec874d78-6231-45d6-a4c2-193756587981"/>
+    <column name="MAX_COUNT" valueNumeric="1"/>
     <column name="OBJECT_TYPE" value="Activity"/>
 </insert>
 <insert tableName="AB_ATTRIBUTEUSAGE">
     <column name="AB_ATTRIBUTEUSAGEID" value="b55dd353-cb6b-48a1-8cad-c3e90f63a8b0"/>
     <column name="AB_ATTRIBUTE_ID" value="6d4dd325-7f30-4098-a391-ebae4f27988e"/>
+    <column name="MAX_COUNT" valueNumeric="1"/>
     <column name="OBJECT_TYPE" value="Activity"/>
 </insert>
 <insert tableName="AB_ATTRIBUTEUSAGE">
     <column name="AB_ATTRIBUTEUSAGEID" value="d546bc42-e452-4446-a85e-557f6c0bc88b"/>
     <column name="AB_ATTRIBUTE_ID" value="f8d8d58e-9381-4e44-aeae-284116ca3613"/>
+    <column name="MAX_COUNT" valueNumeric="1"/>
     <column name="OBJECT_TYPE" value="Activity"/>
 </insert>
 <insert tableName="AB_ATTRIBUTEUSAGE">
     <column name="AB_ATTRIBUTEUSAGEID" value="504487e9-86f8-4ff1-91a2-b364829fa86b"/>
     <column name="AB_ATTRIBUTE_ID" value="d0ae40d2-1a7f-45f6-bb0c-20ce6ae7efe2"/>
+    <column name="MAX_COUNT" valueNumeric="1"/>
     <column name="OBJECT_TYPE" value="Activity"/>
 </insert>
 <insert tableName="AB_ATTRIBUTEUSAGE">
     <column name="AB_ATTRIBUTEUSAGEID" value="33d64ce6-e8b4-4acf-ac75-0d99d0092c6c"/>
     <column name="AB_ATTRIBUTE_ID" value="956622a7-03b3-42a4-a7ef-f8936d92cff9"/>
+    <column name="MAX_COUNT" valueNumeric="1"/>
     <column name="OBJECT_TYPE" value="Activity"/>
 </insert>
 <insert tableName="AB_ATTRIBUTEUSAGE">
     <column name="AB_ATTRIBUTEUSAGEID" value="07704049-9ae8-4d07-86e3-1042ed104035"/>
     <column name="AB_ATTRIBUTE_ID" value="f0f0b150-ea60-46e5-ba4f-727c78c993d0"/>
+    <column name="MAX_COUNT" valueNumeric="1"/>
     <column name="OBJECT_TYPE" value="Activity"/>
 </insert>
 <insert tableName="AB_ATTRIBUTEUSAGE">
     <column name="AB_ATTRIBUTEUSAGEID" value="4757e926-3059-4969-b07a-f04479f6d723"/>
     <column name="AB_ATTRIBUTE_ID" value="c5f8b5f7-ddc0-4c88-bebd-be96fd37bb9c"/>
+    <column name="MAX_COUNT" valueNumeric="1"/>
     <column name="OBJECT_TYPE" value="Activity"/>
 </insert>
 <insert tableName="AB_ATTRIBUTEUSAGE">
     <column name="AB_ATTRIBUTEUSAGEID" value="22a31ed9-be4d-45db-ad2a-5777e9a785bf"/>
     <column name="AB_ATTRIBUTE_ID" value="262a8fbe-d6ef-4949-87ce-6202967136d7"/>
+    <column name="MAX_COUNT" valueNumeric="1"/>
     <column name="OBJECT_TYPE" value="Activity"/>
 </insert>
 <insert tableName="AB_ATTRIBUTEUSAGE">
     <column name="AB_ATTRIBUTEUSAGEID" value="d8352147-7866-40c2-8f1a-063ccc4b0c04"/>
     <column name="AB_ATTRIBUTE_ID" value="67edd12f-93cc-45d4-b86a-b59d19936442"/>
+    <column name="MAX_COUNT" valueNumeric="1"/>
     <column name="OBJECT_TYPE" value="Activity"/>
 </insert>
 <insert tableName="AB_ATTRIBUTEUSAGE">
     <column name="AB_ATTRIBUTEUSAGEID" value="55879930-2f90-44ec-a9b6-fdfe2226a7b0"/>
     <column name="AB_ATTRIBUTE_ID" value="78343572-20fa-454d-ab26-0e1ac0dccc9e"/>
+    <column name="MAX_COUNT" valueNumeric="1"/>
     <column name="OBJECT_TYPE" value="Activity"/>
 </insert>
 <insert tableName="AB_ATTRIBUTEUSAGE">
     <column name="AB_ATTRIBUTEUSAGEID" value="cc03ab69-248a-4ee0-9219-120fcc8c69da"/>
     <column name="AB_ATTRIBUTE_ID" value="9b2dd256-fe8e-4edd-9f1e-0a841103a41a"/>
+    <column name="MAX_COUNT" valueNumeric="1"/>
     <column name="OBJECT_TYPE" value="Activity"/>
 </insert>
 <insert tableName="AB_ATTRIBUTEUSAGE">
     <column name="AB_ATTRIBUTEUSAGEID" value="925a2fe7-2d7d-425b-b55d-71c3d6cfe554"/>
     <column name="AB_ATTRIBUTE_ID" value="f001e3a8-b888-49a8-89e1-96ecc503e936"/>
+    <column name="MAX_COUNT" valueNumeric="1"/>
     <column name="OBJECT_TYPE" value="Activity"/>
 </insert>
 <insert tableName="AB_ATTRIBUTEUSAGE">
     <column name="AB_ATTRIBUTEUSAGEID" value="55eed1d2-086c-4e25-a59e-ec3d1e8c3283"/>
     <column name="AB_ATTRIBUTE_ID" value="9c64aefe-23c0-4e64-ada5-02db5f4bcb85"/>
+    <column name="MAX_COUNT" valueNumeric="1"/>
     <column name="OBJECT_TYPE" value="Activity"/>
 </insert>
 <insert tableName="AB_ATTRIBUTEUSAGE">
     <column name="AB_ATTRIBUTEUSAGEID" value="c0f1778b-595f-4e76-831e-0df4b323f711"/>
     <column name="AB_ATTRIBUTE_ID" value="c31d3ee4-3e08-4a3e-acdb-5f5d236e01de"/>
+    <column name="MAX_COUNT" valueNumeric="1"/>
     <column name="OBJECT_TYPE" value="Activity"/>
 </insert>
 <insert tableName="AB_ATTRIBUTEUSAGE">
     <column name="AB_ATTRIBUTEUSAGEID" value="a22a9765-637e-4ca4-818a-e3acb8306776"/>
     <column name="AB_ATTRIBUTE_ID" value="15810377-58c8-4e22-8dd1-ed341f7baf0a"/>
+    <column name="MAX_COUNT" valueNumeric="1"/>
     <column name="OBJECT_TYPE" value="Activity"/>
 </insert>
 <insert tableName="AB_ATTRIBUTEUSAGE">
     <column name="AB_ATTRIBUTEUSAGEID" value="7e5726f4-16f4-4b18-ae95-a6ad24e49d40"/>
     <column name="AB_ATTRIBUTE_ID" value="3a0843a4-0d43-4b97-9fe5-4d4049ec79d3"/>
+    <column name="MAX_COUNT" valueNumeric="1"/>
     <column name="OBJECT_TYPE" value="Activity"/>
 </insert>
 <insert tableName="AB_ATTRIBUTEUSAGE">
     <column name="AB_ATTRIBUTEUSAGEID" value="1310d547-f5d2-4e30-8e30-0deeba7de746"/>
     <column name="AB_ATTRIBUTE_ID" value="685a771b-86d9-4493-80f1-de65fc613ea3"/>
+    <column name="MAX_COUNT" valueNumeric="1"/>
     <column name="OBJECT_TYPE" value="Activity"/>
 </insert>
 <insert tableName="AB_ATTRIBUTEUSAGE">
     <column name="AB_ATTRIBUTEUSAGEID" value="6462a324-535a-4978-86f2-e439f581571a"/>
     <column name="AB_ATTRIBUTE_ID" value="c2eb5976-39d0-4098-8e1f-1fff0c910faf"/>
+    <column name="MAX_COUNT" valueNumeric="1"/>
     <column name="OBJECT_TYPE" value="Activity"/>
 </insert>
 <insert tableName="AB_ATTRIBUTEUSAGE">
     <column name="AB_ATTRIBUTEUSAGEID" value="8c380566-bab2-4397-a7f7-a88f2c728388"/>
     <column name="AB_ATTRIBUTE_ID" value="fd8cd4b8-a284-4e1d-accd-310b85577c98"/>
+    <column name="MAX_COUNT" valueNumeric="1"/>
     <column name="OBJECT_TYPE" value="Activity"/>
 </insert>
 <insert tableName="AB_ATTRIBUTEUSAGE">
     <column name="AB_ATTRIBUTEUSAGEID" value="f6d3a5f3-04bd-4cf1-8057-11a1af4352a4"/>
     <column name="AB_ATTRIBUTE_ID" value="941a02f8-577f-40a9-8e43-0ea4d695f254"/>
+    <column name="MAX_COUNT" valueNumeric="1"/>
     <column name="OBJECT_TYPE" value="Activity"/>
 </insert>
 <insert tableName="AB_ATTRIBUTEUSAGE">
     <column name="AB_ATTRIBUTEUSAGEID" value="607b45dc-2a97-4005-9d38-488640665aa1"/>
     <column name="AB_ATTRIBUTE_ID" value="593bd38f-704a-480a-add3-22e0af9e2460"/>
+    <column name="MAX_COUNT" valueNumeric="1"/>
     <column name="OBJECT_TYPE" value="Activity"/>
 </insert>
 <insert tableName="AB_ATTRIBUTEUSAGE">
     <column name="AB_ATTRIBUTEUSAGEID" value="63801bc2-a0a2-4a3c-a531-1949ff3041a6"/>
     <column name="AB_ATTRIBUTE_ID" value="8a9ee08c-da32-40b0-93a3-3a388158dd3c"/>
+    <column name="MAX_COUNT" valueNumeric="1"/>
     <column name="OBJECT_TYPE" value="Activity"/>
 </insert>
 <insert tableName="AB_ATTRIBUTEUSAGE">
     <column name="AB_ATTRIBUTEUSAGEID" value="5bdf8396-30bb-4fbc-bdbe-304fa7d73fb2"/>
     <column name="AB_ATTRIBUTE_ID" value="a559f36c-768b-4fc4-b4f2-7dfd25fadb4a"/>
+    <column name="MAX_COUNT" valueNumeric="1"/>
     <column name="OBJECT_TYPE" value="Activity"/>
 </insert>
 <insert tableName="AB_ATTRIBUTEUSAGE">
     <column name="AB_ATTRIBUTEUSAGEID" value="f71f995d-0022-4144-95a9-88e33468b835"/>
     <column name="AB_ATTRIBUTE_ID" value="5929874c-ab20-4d18-9d75-083e39f8d576"/>
+    <column name="MAX_COUNT" valueNumeric="1"/>
     <column name="OBJECT_TYPE" value="Activity"/>
 </insert>
 <insert tableName="AB_ATTRIBUTEUSAGE">
     <column name="AB_ATTRIBUTEUSAGEID" value="d6982ee5-616a-4eb9-adf9-e571658851ea"/>
     <column name="AB_ATTRIBUTE_ID" value="0adcd251-d3d1-4bed-a299-39373c098cad"/>
+    <column name="MAX_COUNT" valueNumeric="1"/>
     <column name="OBJECT_TYPE" value="Activity"/>
 </insert>
 <insert tableName="AB_ATTRIBUTEUSAGE">
     <column name="AB_ATTRIBUTEUSAGEID" value="717abaf4-3ed3-4754-ba01-3192677ac399"/>
     <column name="AB_ATTRIBUTE_ID" value="786d0154-acec-4281-8ddc-52772d5ea1ea"/>
+    <column name="MAX_COUNT" valueNumeric="1"/>
     <column name="OBJECT_TYPE" value="Activity"/>
 </insert>
 <insert tableName="AB_ATTRIBUTEUSAGE">
@@ -463,7 +536,6 @@
 <insert tableName="AB_ATTRIBUTEUSAGE">
 	<column name="AB_ATTRIBUTEUSAGEID" value="05576033-1bee-4547-ab82-fdfcdd039642"/>
 	<column name="AB_ATTRIBUTE_ID" value="7e9927a4-41e4-426f-bddd-c3e9ee3b093e"/>
-	<column name="MAX_COUNT" valueNumeric="0"/>
 	<column name="MIN_COUNT" valueNumeric="2"/>
 	<column name="OBJECT_TYPE" value="Organisation"/>
 </insert>
diff --git a/aliasDefinition/Data_alias/Data_alias.aod b/aliasDefinition/Data_alias/Data_alias.aod
index 0e53b6a7cd819fe6cff7e88e0bd0ec4e35367329..81b8e1987ede5b81ebbeea7f26683686a47b1585 100644
--- a/aliasDefinition/Data_alias/Data_alias.aod
+++ b/aliasDefinition/Data_alias/Data_alias.aod
@@ -500,6 +500,20 @@
                 <title>Creation user</title>
                 <description></description>
               </entityFieldDb>
+              <entityFieldDb>
+                <name>LETTERSALUTATION</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="12" />
+                <size v="200" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
             </entityFields>
           </entityDb>
           <entityDb>
@@ -7462,7 +7476,7 @@
                 <dbName></dbName>
                 <primaryKey v="false" />
                 <columnType v="12" />
-                <size v="50" />
+                <size v="200" />
                 <scale v="0" />
                 <notNull v="false" />
                 <isUnique v="false" />
@@ -7581,7 +7595,7 @@
                 <dbName></dbName>
                 <primaryKey v="false" />
                 <columnType v="12" />
-                <size v="50" />
+                <size v="200" />
                 <scale v="0" />
                 <notNull v="false" />
                 <isUnique v="false" />
@@ -8374,6 +8388,778 @@
               </entityFieldDb>
             </entityFields>
           </entityDb>
+          <entityDb>
+            <name>CAMPAIGNPARTICIPANT</name>
+            <dbName></dbName>
+            <idColumn>CAMPAIGNPARTICIPANTID</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>CAMPAIGN_ID</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="1" />
+                <size v="36" />
+                <scale v="0" />
+                <notNull v="true" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>CAMPAIGNPARTICIPANTID</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>DATE_EDIT</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="91" />
+                <size v="10" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>CONTACT_ID</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="1" />
+                <size v="36" />
+                <scale v="0" />
+                <notNull v="true" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>DATE_NEW</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="91" />
+                <size v="10" />
+                <scale v="0" />
+                <notNull v="true" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>USER_NEW</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="12" />
+                <size v="50" />
+                <scale v="0" />
+                <notNull v="true" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>USER_EDIT</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="12" />
+                <size v="50" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>CAMPAIGNSTEP_ID</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="1" />
+                <size v="36" />
+                <scale v="0" />
+                <notNull v="true" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+            </entityFields>
+          </entityDb>
+          <entityDb>
+            <name>CAMPAIGN</name>
+            <dbName></dbName>
+            <idColumn>CAMPAIGNID</idColumn>
+            <idGeneratorType v="0" />
+            <idGeneratorInterval v="1" />
+            <documentation></documentation>
+            <title></title>
+            <description></description>
+            <auditSyncConfig>
+              <name>auditSyncConfig</name>
+              <auditMode v="0" />
+              <syncActive v="false" />
+              <syncComplete v="true" />
+              <syncDirection v="1" />
+              <syncIds></syncIds>
+            </auditSyncConfig>
+            <entityFields>
+              <entityFieldDb>
+                <name>DATE_EDIT</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="91" />
+                <size v="10" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>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>EMPLOYEE_CONTACT_ID</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="1" />
+                <size v="36" />
+                <scale v="0" />
+                <notNull v="true" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>DATE_NEW</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="91" />
+                <size v="10" />
+                <scale v="0" />
+                <notNull v="true" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>USER_NEW</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="12" />
+                <size v="50" />
+                <scale v="0" />
+                <notNull v="true" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>CAMPAIGNID</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>USER_EDIT</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="12" />
+                <size v="50" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>NAME</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="12" />
+                <size v="50" />
+                <scale v="0" />
+                <notNull v="true" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>STATE</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="1" />
+                <size v="36" />
+                <scale v="0" />
+                <notNull v="true" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+            </entityFields>
+          </entityDb>
+          <entityDb>
+            <name>CAMPAIGNSTEP</name>
+            <dbName></dbName>
+            <idColumn>CAMPAIGNSTEPID</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>CAMPAIGN_ID</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="1" />
+                <size v="36" />
+                <scale v="0" />
+                <notNull v="true" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>DATE_EDIT</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="91" />
+                <size v="10" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>DATE_START</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="91" />
+                <size v="10" />
+                <scale v="0" />
+                <notNull v="true" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>EMPLOYEE_CONTACT_ID</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="1" />
+                <size v="36" />
+                <scale v="0" />
+                <notNull v="true" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>STATE</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="1" />
+                <size v="36" />
+                <scale v="0" />
+                <notNull v="true" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>SORTING</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="4" />
+                <size v="10" />
+                <scale v="0" />
+                <notNull v="true" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>CAMPAIGNSTEPID</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>DATE_NEW</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="91" />
+                <size v="10" />
+                <scale v="0" />
+                <notNull v="true" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>USER_NEW</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="12" />
+                <size v="50" />
+                <scale v="0" />
+                <notNull v="true" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>DATE_END</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="91" />
+                <size v="10" />
+                <scale v="0" />
+                <notNull v="true" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>USER_EDIT</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="12" />
+                <size v="50" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>NAME</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="12" />
+                <size v="50" />
+                <scale v="0" />
+                <notNull v="true" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>MAXPARTICIPANTS</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="4" />
+                <size v="10" />
+                <scale v="0" />
+                <notNull v="true" />
+                <isUnique v="false" />
+                <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>
+            </entityFields>
+          </entityDb>
+          <entityDb>
+            <name>CAMPAIGNPARTICIPANTLOG</name>
+            <dbName></dbName>
+            <idColumn>CAMPAIGNPARTICIPANTLOGID</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>CAMPAIGN_ID</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="1" />
+                <size v="36" />
+                <scale v="0" />
+                <notNull v="true" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>DATE_EDIT</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="91" />
+                <size v="10" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>DATE_NEW</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="91" />
+                <size v="10" />
+                <scale v="0" />
+                <notNull v="true" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>USER_NEW</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="12" />
+                <size v="50" />
+                <scale v="0" />
+                <notNull v="true" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>USER_EDIT</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="12" />
+                <size v="50" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>CAMPAIGNPARTICIPANTLOGID</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>CAMPAIGNSTEP_ID</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="1" />
+                <size v="36" />
+                <scale v="0" />
+                <notNull v="true" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>CAMPAIGNPARTICIPANT_ID</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="1" />
+                <size v="36" />
+                <scale v="0" />
+                <notNull v="true" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+            </entityFields>
+          </entityDb>
+          <entityDb>
+            <name>CAMPAIGNCOST</name>
+            <dbName></dbName>
+            <idColumn>CAMPAIGNCOSTID</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>CAMPAIGN_ID</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="1" />
+                <size v="36" />
+                <scale v="0" />
+                <notNull v="true" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>DATE_EDIT</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="91" />
+                <size v="10" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>CAMPAIGNCOSTID</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>CATEGORY</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="1" />
+                <size v="36" />
+                <scale v="0" />
+                <notNull v="true" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>DATE_NEW</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="91" />
+                <size v="10" />
+                <scale v="0" />
+                <notNull v="true" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>USER_NEW</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="12" />
+                <size v="50" />
+                <scale v="0" />
+                <notNull v="true" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>NET</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="2" />
+                <size v="14" />
+                <scale v="2" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>USER_EDIT</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="12" />
+                <size v="50" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>CAMPAIGNSTEP_ID</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="1" />
+                <size v="36" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+            </entityFields>
+          </entityDb>
         </entities>
       </entityGroup>
     </aliasDefDb>
diff --git a/aliasDefinition/Data_alias/indexsearchgroups/offer/query.js b/aliasDefinition/Data_alias/indexsearchgroups/offer/query.js
index edc6c63a6391c12b33b79fee916d3ecd17515e15..55757887e4fe36f49983380be08686380f9d2e35 100644
--- a/aliasDefinition/Data_alias/indexsearchgroups/offer/query.js
+++ b/aliasDefinition/Data_alias/indexsearchgroups/offer/query.js
@@ -19,7 +19,7 @@ sqlHelper = new SqlMaskingUtils();
 sqlQuery = "select OFFERID, " 
     + sqlHelper.concat([sqlHelper.cast("OFFERCODE", SQLTYPES.CHAR, 10), KeywordUtils.getResolvedTitleSqlPart($KeywordRegistry.offerStatus(), "OFFER.STATUS")], " | ")
     + " as TITLECOLUMN, " 
-    + sqlHelper.concat(["ORGANISATION.NAME"], " | ") // "'" + translate.text("Description") + ":'", sqlHelper.castLob("OFFER.INFO", 256)
+    + sqlHelper.concat(["ORGANISATION.NAME", "'| " + translate.text("Description") + ":'", sqlHelper.castLob("OFFER.INFO", 250)])  
     + " as DESCCOLUMN, OFFERCODE, ORGANISATION.NAME, CUSTOMERCODE " 
     + " from OFFER "
     + " join CONTACT on OFFER.CONTACT_ID = CONTACTID "
diff --git a/aliasDefinition/_____SYSTEMALIAS/_____SYSTEMALIAS.aod b/aliasDefinition/_____SYSTEMALIAS/_____SYSTEMALIAS.aod
index c080c506aab66b4417c3d9ca26f3515a37afc35b..a78014b1d0cd10eb39a6f9667ad3a8347db650d0 100644
--- a/aliasDefinition/_____SYSTEMALIAS/_____SYSTEMALIAS.aod
+++ b/aliasDefinition/_____SYSTEMALIAS/_____SYSTEMALIAS.aod
@@ -2969,6 +2969,208 @@
               </entityFieldDb>
             </entityFields>
           </entityDb>
+          <entityDb>
+            <name>ASYS_NOTIFICATIONCONTENTS</name>
+            <dbName></dbName>
+            <idColumn>CONTENTID</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>CONTENTID</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>FORCEDPRIORITY</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="4" />
+                <size v="10" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>ICON_INFO</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="12" />
+                <size v="1023" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>CREATIONDATE</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="-5" />
+                <size v="19" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>LIFETIME</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="-5" />
+                <size v="19" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>DESCRIPTION</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="12" />
+                <size v="1023" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>LINK_INFO</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="12" />
+                <size v="1023" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>VERSION</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="4" />
+                <size v="10" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>RECIPIENTUSERIDS</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="2005" />
+                <size v="2147483647" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>TYPECODE</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="12" />
+                <size v="63" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>BACKPACK</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="2005" />
+                <size v="2147483647" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>CAPTION</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="12" />
+                <size v="512" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>ORIGINATORNAME</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="12" />
+                <size v="63" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+            </entityFields>
+          </entityDb>
         </entities>
       </entityGroup>
     </aliasDefDb>
diff --git a/application/_____SYSTEM_APPLICATION_NEON/_____SYSTEM_APPLICATION_NEON.aod b/application/_____SYSTEM_APPLICATION_NEON/_____SYSTEM_APPLICATION_NEON.aod
index 2d715c6e5a0360e97f68cafd23bfc6179425aca6..0737745e3dea53481ecc16cf6c385f09692501c6 100644
--- a/application/_____SYSTEM_APPLICATION_NEON/_____SYSTEM_APPLICATION_NEON.aod
+++ b/application/_____SYSTEM_APPLICATION_NEON/_____SYSTEM_APPLICATION_NEON.aod
@@ -26,9 +26,17 @@
         <node name="INTERNAL_ADMINISTRATOR" kind="159" />
       </node>
     </node>
+    <node name="Marketing" kind="123" title="Marketing">
+      <icon>VAADIN:GROUP</icon>
+      <node name="Group4" kind="123" title="">
+        <node name="Campaign" kind="10077" />
+        <node name="INTERNAL_ADMINISTRATOR" kind="159" />
+      </node>
+    </node>
     <node name="ADMINISTRATION" kind="123" title="Administration">
       <icon>VAADIN:CONTROLLER</icon>
       <node name="Group3" kind="123" title="">
+        <node name="Notification" kind="10077" />
         <node name="Attribute" kind="10077" />
         <node name="KeywordEntry" kind="10077" />
         <node name="KeywordAttribute" kind="10077" />
diff --git a/entity/360Degree_entity/360Degree_entity.aod b/entity/360Degree_entity/360Degree_entity.aod
index 027a6d9ee787bd05106a36d93a7f8fe993f530ad..8684c41b4dc28464f39b2cf582c98b4ab0db3e4a 100644
--- a/entity/360Degree_entity/360Degree_entity.aod
+++ b/entity/360Degree_entity/360Degree_entity.aod
@@ -122,6 +122,15 @@
           <iconIdProcess>%aditoprj%/entity/360Degree_entity/entityfields/newmodule/children/newcontract/iconIdProcess.js</iconIdProcess>
           <stateProcess>%aditoprj%/entity/360Degree_entity/entityfields/newmodule/children/newcontract/stateProcess.js</stateProcess>
         </entityActionField>
+        <entityActionField>
+          <name>newCampaignParticipant</name>
+          <fieldType>ACTION</fieldType>
+          <title>Add to Campaign</title>
+          <onActionProcess>%aditoprj%/entity/360Degree_entity/entityfields/newmodule/children/newcampaignparticipant/onActionProcess.js</onActionProcess>
+          <iconId>NEON:GROUP_APPOINTMENT</iconId>
+          <stateProcess>%aditoprj%/entity/360Degree_entity/entityfields/newmodule/children/newcampaignparticipant/stateProcess.js</stateProcess>
+          <tooltip>Choose a campaign and a step to add the contact to a  campaign</tooltip>
+        </entityActionField>
       </children>
     </entityActionGroup>
     <entityField>
diff --git a/entity/360Degree_entity/entityfields/context_name/valueProcess.js b/entity/360Degree_entity/entityfields/context_name/valueProcess.js
index 618f59f467b2f706dfca685c1e93818af1dbf3de..8c43c3b5ddb6ec03c7926371e2cecce626eb8410 100644
--- a/entity/360Degree_entity/entityfields/context_name/valueProcess.js
+++ b/entity/360Degree_entity/entityfields/context_name/valueProcess.js
@@ -1,5 +1,6 @@
+import("system.logging");
 import("system.translate");
 import("system.vars");
 import("system.result");
-
+logging.log(" -> " + vars.getString("$field.TARGET_CONTEXT"));
 result.string(translate.text(vars.getString("$field.TARGET_CONTEXT")));
\ No newline at end of file
diff --git a/entity/360Degree_entity/entityfields/icon/valueProcess.js b/entity/360Degree_entity/entityfields/icon/valueProcess.js
index 6b0bb83e3c5e90e1fd2f90c044fb085ac09d4a35..53cfb3d009757a5271e3c4583befe083d22ea745 100644
--- a/entity/360Degree_entity/entityfields/icon/valueProcess.js
+++ b/entity/360Degree_entity/entityfields/icon/valueProcess.js
@@ -14,4 +14,7 @@ switch (context)
     case "Contract":
         result.string("VAADIN:FILE_TEXT");
         break;           
+    case "Campaign":
+        result.string("NEON:GROUP_APPOINTMENT");
+        break;       
 }
\ No newline at end of file
diff --git a/entity/360Degree_entity/entityfields/newmodule/children/newcampaignparticipant/onActionProcess.js b/entity/360Degree_entity/entityfields/newmodule/children/newcampaignparticipant/onActionProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..b4e2d8936bab62bc9dd4fabb953c89196553d6bf
--- /dev/null
+++ b/entity/360Degree_entity/entityfields/newmodule/children/newcampaignparticipant/onActionProcess.js
@@ -0,0 +1,4 @@
+import("system.vars");
+import("Campaign_lib");
+
+CampaignUtils.addParticipant(vars.getString("$param.ObjectRowId_param"));
\ No newline at end of file
diff --git a/entity/360Degree_entity/entityfields/newmodule/children/newcampaignparticipant/stateProcess.js b/entity/360Degree_entity/entityfields/newmodule/children/newcampaignparticipant/stateProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..da6fd5283abd2daf5d3b8c08591f3bc87cde12e1
--- /dev/null
+++ b/entity/360Degree_entity/entityfields/newmodule/children/newcampaignparticipant/stateProcess.js
@@ -0,0 +1,15 @@
+import("system.vars");
+import("system.neon");
+import("system.result");
+
+var contextList = JSON.parse(vars.getString("$param.ObjectType_param"));
+var found = false;
+contextList.forEach(function (context) 
+{
+    if(context == "Campaign")
+        found = true;        
+});
+if(found)
+    result.string(neon.COMPONENTSTATE_AUTO);
+else
+    result.string(neon.COMPONENTSTATE_INVISIBLE);
\ No newline at end of file
diff --git a/entity/360Degree_entity/entityfields/organisationobjects/children/objecttype_param/valueProcess.js b/entity/360Degree_entity/entityfields/organisationobjects/children/objecttype_param/valueProcess.js
index bb07a1ee2ed5f16932e450be46af31e10e5ec7ee..4c08b444ed989e17cfafc0ba94739f06c17d5538 100644
--- a/entity/360Degree_entity/entityfields/organisationobjects/children/objecttype_param/valueProcess.js
+++ b/entity/360Degree_entity/entityfields/organisationobjects/children/objecttype_param/valueProcess.js
@@ -1,4 +1,4 @@
 import("system.vars");
 import("system.result");
 
-result.object(["Salesproject", "Offer", "Contract"]);
\ No newline at end of file
+result.object(["Salesproject", "Offer", "Contract", "Campaign"]);
\ No newline at end of file
diff --git a/entity/360Degree_entity/entityfields/personobjects/children/objecttype_param/valueProcess.js b/entity/360Degree_entity/entityfields/personobjects/children/objecttype_param/valueProcess.js
index 15de0e1ae47eb721911420272e0952a8d0aab01c..05350e2675ad54b2bb8422803c3951e3c7af1b1c 100644
--- a/entity/360Degree_entity/entityfields/personobjects/children/objecttype_param/valueProcess.js
+++ b/entity/360Degree_entity/entityfields/personobjects/children/objecttype_param/valueProcess.js
@@ -1,4 +1,4 @@
 import("system.vars");
 import("system.result");
 
-result.object(["Offer", "Contract"]);
\ No newline at end of file
+result.object(["Offer", "Contract", "Campaign"]);
\ No newline at end of file
diff --git a/entity/Activity_entity/Activity_entity.aod b/entity/Activity_entity/Activity_entity.aod
index ed7f41f79ce2b5ec3267c56e0da9d45cee271ecc..9d47a294f6041c0368594d5d8224488b77e894b9 100644
--- a/entity/Activity_entity/Activity_entity.aod
+++ b/entity/Activity_entity/Activity_entity.aod
@@ -6,6 +6,7 @@
   <documentation>%aditoprj%/entity/Activity_entity/documentation.adoc</documentation>
   <afterUiInit>%aditoprj%/entity/Activity_entity/afterUiInit.js</afterUiInit>
   <iconId>NEON:HISTORY</iconId>
+  <image>VAADIN:SHOP</image>
   <imageProcess>%aditoprj%/entity/Activity_entity/imageProcess.js</imageProcess>
   <recordContainer>db</recordContainer>
   <entityFields>
diff --git a/entity/Activity_entity/afterUiInit.js b/entity/Activity_entity/afterUiInit.js
index 0f3cf2b05300e9e6aeafee314f1d17de5ab2fc20..952cd632d70758bac2e56f8a47ff41c38f5eff1a 100644
--- a/entity/Activity_entity/afterUiInit.js
+++ b/entity/Activity_entity/afterUiInit.js
@@ -1,3 +1,5 @@
+import("Context_lib");
+import("Attribute_lib");
 import("system.neon");
 import("system.vars");
 import("ActivityTask_lib");
@@ -5,4 +7,5 @@ import("ActivityTask_lib");
 if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW)
 {
     ActivityUtils.addLinkRecords("$param.ObjectId_param", "$param.RowId_param", "$param.PresetLinks_param", "$field.PARENT_CONTEXT", "$field.PARENT_ID");
+    AttributeRelationUtils.presetMandatoryAttributes(ContextUtils.getCurrentContextId(), "Attributes");
 }
\ No newline at end of file
diff --git a/entity/Activity_entity/entityfields/direction_icon/valueProcess.js b/entity/Activity_entity/entityfields/direction_icon/valueProcess.js
index ce60c7e40748a7e42e76f0762efb600701d2ffcb..5f9400b7f7159921ac01da7022222d4724785e07 100644
--- a/entity/Activity_entity/entityfields/direction_icon/valueProcess.js
+++ b/entity/Activity_entity/entityfields/direction_icon/valueProcess.js
@@ -2,20 +2,30 @@ import("system.vars");
 import("system.result");
 import("system.neon");
 import("KeywordRegistry_basic");
+import("Keyword_lib");
 
 var direction = vars.getString("$field.DIRECTION");
-var res;
-switch (direction) 
+
+if (direction)
 {
-    case $KeywordRegistry.activityDirection$incoming():
-        res = "VAADIN:ARROW_BACKWARD";
-        break;
-    case $KeywordRegistry.activityDirection$outgoing():
-        res = "VAADIN:ARROW_FORWARD";
-        break;
-    default:
-        res = "";
-        break;
-}
+    // cache to prevent multiple loading of the same icon-names
+    if (vars.exists("$context.cache_activity_dir-icon_" + direction) && vars.get("$context.cache_activity_dir-icon_" + direction))
+    {
+        result.string(vars.get("$context.cache_activity_dir-icon_" + direction));
+    }
+    else
+    {
+        var res = KeywordUtils.getAttributeRelationsByKey(direction, $KeywordRegistry.activityDirection())["icon"];
 
-result.string(res);
+        if (res)
+        {
+            result.string(res);
+            vars.set("$context.cache_activity_dir-icon_" + direction, res);
+        }
+        else
+        {
+            result.string("");
+            vars.set("$context.cache_activity_dir-icon_" + direction, "");
+        }
+    }
+}
\ No newline at end of file
diff --git a/entity/Address_entity/Address_entity.aod b/entity/Address_entity/Address_entity.aod
index 6d9770c1885149fa0c4a5aa85ec295b36eee439f..511c4edff31012fcec97a4d870b8b658e9f0a586 100644
--- a/entity/Address_entity/Address_entity.aod
+++ b/entity/Address_entity/Address_entity.aod
@@ -337,6 +337,12 @@
         </entityParameter>
       </children>
     </entityConsumer>
+    <entityParameter>
+      <name>ReloadWorkaround_param</name>
+      <expose v="true" />
+      <triggerRecalculation v="true" />
+      <description>PARAMETER</description>
+    </entityParameter>
   </entityFields>
   <recordContainers>
     <dbRecordContainer>
diff --git a/entity/AnyContact_entity/AnyContact_entity.aod b/entity/AnyContact_entity/AnyContact_entity.aod
index c6813cc5c955aca10865035712c6177c8a95928d..bb167ee03350083aef1ea9caba4749f1347fc951 100644
--- a/entity/AnyContact_entity/AnyContact_entity.aod
+++ b/entity/AnyContact_entity/AnyContact_entity.aod
@@ -26,6 +26,12 @@
           <fieldName>Relations</fieldName>
           <isConsumer v="false" />
         </entityDependency>
+        <entityDependency>
+          <name>336fdc6b-05f8-40bc-89ba-d4ab98bd6948</name>
+          <entityName>CampaignParticipant_entity</entityName>
+          <fieldName>AnyContacts</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
       </dependencies>
     </entityProvider>
     <entityField>
diff --git a/entity/AttributeRelationTree_entity/AttributeRelationTree_entity.aod b/entity/AttributeRelationTree_entity/AttributeRelationTree_entity.aod
index 0ec44e9eb92c6afa692b644fbbaacb5270166c64..b0c1cc1dc3b026692007e5bac012f544d0906f30 100644
--- a/entity/AttributeRelationTree_entity/AttributeRelationTree_entity.aod
+++ b/entity/AttributeRelationTree_entity/AttributeRelationTree_entity.aod
@@ -69,6 +69,18 @@
           <fieldName>AttributeTree</fieldName>
           <isConsumer v="false" />
         </entityDependency>
+        <entityDependency>
+          <name>148faad1-78f6-4ff2-a4d5-9607d919adb9</name>
+          <entityName>Salesproject_entity</entityName>
+          <fieldName>AttributeTree</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+        <entityDependency>
+          <name>8ed8bae6-c69e-45ce-9fc9-5fb43587a47b</name>
+          <entityName>Order_entity</entityName>
+          <fieldName>AttributeTree</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
       </dependencies>
     </entityProvider>
     <entityField>
@@ -100,6 +112,10 @@
           <valueProcess>%aditoprj%/entity/AttributeRelationTree_entity/entityfields/specificattribute/children/objecttype_param/valueProcess.js</valueProcess>
           <triggerRecalculation v="true" />
         </entityParameter>
+        <entityParameter>
+          <name>AttributeCount_param</name>
+          <valueProcess>%aditoprj%/entity/AttributeRelationTree_entity/entityfields/specificattribute/children/attributecount_param/valueProcess.js</valueProcess>
+        </entityParameter>
       </children>
     </entityConsumer>
     <entityActionGroup>
diff --git a/entity/AttributeRelationTree_entity/entityfields/specificattribute/children/attributecount_param/valueProcess.js b/entity/AttributeRelationTree_entity/entityfields/specificattribute/children/attributecount_param/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..feab7983edde4183300888452e1f30a7cbf7050a
--- /dev/null
+++ b/entity/AttributeRelationTree_entity/entityfields/specificattribute/children/attributecount_param/valueProcess.js
@@ -0,0 +1,25 @@
+import("system.result");
+import("system.db");
+import("Sql_lib");
+import("system.vars");
+
+var objectType = vars.exists("$param.ObjectType_param") && vars.get("$param.ObjectType_param");
+var rowId = vars.exists("$param.ObjectRowId_param") && vars.get("$param.ObjectRowId_param");
+if (rowId)
+{
+    var condition = SqlCondition.begin()
+        .andPrepare("AB_ATTRIBUTERELATION.OBJECT_ROWID", rowId);
+    if (objectType)
+        condition.andPrepare("AB_ATTRIBUTERELATION.OBJECT_TYPE", objectType);
+    var relationCounts = db.table(condition.buildSql(
+        "select AB_ATTRIBUTE_ID, count(AB_ATTRIBUTE_ID) from AB_ATTRIBUTERELATION",
+        "1=2",
+        "group by AB_ATTRIBUTE_ID"
+    ));
+    var countObj = {};
+    relationCounts.forEach(function (row)
+    {
+        this[row[0]] = row[1];
+    }, countObj);
+    result.object(countObj);
+}
\ No newline at end of file
diff --git a/entity/AttributeRelationTree_entity/entityfields/value/mandatoryProcess.js b/entity/AttributeRelationTree_entity/entityfields/value/mandatoryProcess.js
index 564b24d9e769f678a1da3de8776adf941e94217e..e60d633a87eef5815501eb3cef2e8d7f69c71c04 100644
--- a/entity/AttributeRelationTree_entity/entityfields/value/mandatoryProcess.js
+++ b/entity/AttributeRelationTree_entity/entityfields/value/mandatoryProcess.js
@@ -3,4 +3,5 @@ import("system.result");
 import("Attribute_lib");
 
 var attributeType = AttributeUtil.getAttributeType(vars.get("$field.AB_ATTRIBUTE_ID"));
-result.string(AttributeTypeUtil.getContentType(attributeType) != null);
\ No newline at end of file
+var contentType = AttributeTypeUtil.getContentType(attributeType);
+result.string(contentType != null && contentType != "BOOLEAN");
\ No newline at end of file
diff --git a/entity/AttributeRelation_entity/AttributeRelation_entity.aod b/entity/AttributeRelation_entity/AttributeRelation_entity.aod
index 5a73fc1c19bdd491565c792edab9272448535580..e2b4e1f9aa68d6e3178dfbdf44c333179530499d 100644
--- a/entity/AttributeRelation_entity/AttributeRelation_entity.aod
+++ b/entity/AttributeRelation_entity/AttributeRelation_entity.aod
@@ -106,6 +106,18 @@
           <fieldName>Attributes</fieldName>
           <isConsumer v="false" />
         </entityDependency>
+        <entityDependency>
+          <name>6e01a982-198c-40ab-ae1b-7f5683d33f07</name>
+          <entityName>Salesproject_entity</entityName>
+          <fieldName>Attributes</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+        <entityDependency>
+          <name>1d33f00a-203d-4119-9178-c7dc0d087353</name>
+          <entityName>Order_entity</entityName>
+          <fieldName>Attributes</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
       </dependencies>
     </entityProvider>
     <entityParameter>
@@ -141,18 +153,6 @@
       <name>ID_VALUE</name>
       <searchable v="false" />
     </entityField>
-    <entityField>
-      <name>ATTRIBUTE_PARENT_ID</name>
-      <title>Superordinate Attribute</title>
-      <dropDownProcess>%aditoprj%/entity/AttributeRelation_entity/entityfields/attribute_parent_id/dropDownProcess.js</dropDownProcess>
-      <searchable v="false" />
-      <displayValueProcess>%aditoprj%/entity/AttributeRelation_entity/entityfields/attribute_parent_id/displayValueProcess.js</displayValueProcess>
-      <onValueChangeTypes>
-        <element>MASK</element>
-        <element>PROCESS</element>
-        <element>PROCESS_SETVALUE</element>
-      </onValueChangeTypes>
-    </entityField>
     <entityConsumer>
       <name>Keywords</name>
       <fieldType>DEPENDENCY_OUT</fieldType>
@@ -227,24 +227,15 @@
     <dbRecordContainer>
       <name>db</name>
       <alias>Data_alias</alias>
-      <fromClauseProcess>%aditoprj%/entity/AttributeRelation_entity/recordcontainers/db/fromClauseProcess.js</fromClauseProcess>
       <conditionProcess>%aditoprj%/entity/AttributeRelation_entity/recordcontainers/db/conditionProcess.js</conditionProcess>
-      <orderClauseProcess>%aditoprj%/entity/AttributeRelation_entity/recordcontainers/db/orderClauseProcess.js</orderClauseProcess>
       <linkInformation>
         <linkInformation>
-          <name>14697123-47ee-4ff0-8ab2-2b8d1217f637</name>
+          <name>9565b2b1-ace7-4464-ae76-c71bd8f5f676</name>
           <tableName>AB_ATTRIBUTERELATION</tableName>
           <primaryKey>AB_ATTRIBUTERELATIONID</primaryKey>
           <isUIDTable v="true" />
           <readonly v="false" />
         </linkInformation>
-        <linkInformation>
-          <name>a988b754-86b1-4d27-8406-08712d12766c</name>
-          <tableName>AB_ATTRIBUTE</tableName>
-          <primaryKey>AB_ATTRIBUTEID</primaryKey>
-          <isUIDTable v="false" />
-          <readonly v="false" />
-        </linkInformation>
       </linkInformation>
       <recordFieldMappings>
         <dbRecordFieldMapping>
@@ -279,10 +270,6 @@
           <name>ID_VALUE.value</name>
           <recordfield>AB_ATTRIBUTERELATION.ID_VALUE</recordfield>
         </dbRecordFieldMapping>
-        <dbRecordFieldMapping>
-          <name>ATTRIBUTE_PARENT_ID.value</name>
-          <recordfield>AB_ATTRIBUTE.ATTRIBUTE_PARENT_ID</recordfield>
-        </dbRecordFieldMapping>
         <dbRecordFieldMapping>
           <name>USER_NEW.value</name>
           <recordfield>AB_ATTRIBUTERELATION.USER_NEW</recordfield>
diff --git a/entity/AttributeRelation_entity/entityfields/attribute_parent_id/displayValueProcess.js b/entity/AttributeRelation_entity/entityfields/attribute_parent_id/displayValueProcess.js
deleted file mode 100644
index b85310336652c14dc00b557287404299142e85c5..0000000000000000000000000000000000000000
--- a/entity/AttributeRelation_entity/entityfields/attribute_parent_id/displayValueProcess.js
+++ /dev/null
@@ -1,5 +0,0 @@
-import("system.vars");
-import("system.result");
-import("Attribute_lib");
-
-result.string(AttributeUtil.getFullAttributeName(vars.get("$field.ATTRIBUTE_PARENT_ID")));
\ No newline at end of file
diff --git a/entity/AttributeRelation_entity/entityfields/attribute_parent_id/dropDownProcess.js b/entity/AttributeRelation_entity/entityfields/attribute_parent_id/dropDownProcess.js
deleted file mode 100644
index 816f528b0cb03b2f412293c272955a49bfae48eb..0000000000000000000000000000000000000000
--- a/entity/AttributeRelation_entity/entityfields/attribute_parent_id/dropDownProcess.js
+++ /dev/null
@@ -1,5 +0,0 @@
-import("system.vars");
-import("system.result");
-import("Attribute_lib");
-        
-result.object(AttributeUtil.getPossibleAttributes(vars.get("$param.ObjectType_param"), true));
diff --git a/entity/AttributeRelation_entity/entityfields/valueproxy/mandatoryProcess.js b/entity/AttributeRelation_entity/entityfields/valueproxy/mandatoryProcess.js
index 564b24d9e769f678a1da3de8776adf941e94217e..e60d633a87eef5815501eb3cef2e8d7f69c71c04 100644
--- a/entity/AttributeRelation_entity/entityfields/valueproxy/mandatoryProcess.js
+++ b/entity/AttributeRelation_entity/entityfields/valueproxy/mandatoryProcess.js
@@ -3,4 +3,5 @@ import("system.result");
 import("Attribute_lib");
 
 var attributeType = AttributeUtil.getAttributeType(vars.get("$field.AB_ATTRIBUTE_ID"));
-result.string(AttributeTypeUtil.getContentType(attributeType) != null);
\ No newline at end of file
+var contentType = AttributeTypeUtil.getContentType(attributeType);
+result.string(contentType != null && contentType != "BOOLEAN");
\ No newline at end of file
diff --git a/entity/AttributeRelation_entity/recordcontainers/db/conditionProcess.js b/entity/AttributeRelation_entity/recordcontainers/db/conditionProcess.js
index d2b666631967c44d632fcdd249414629786e0219..89514328ab3734a6cd8f89dc637b90aa7effc275 100644
--- a/entity/AttributeRelation_entity/recordcontainers/db/conditionProcess.js
+++ b/entity/AttributeRelation_entity/recordcontainers/db/conditionProcess.js
@@ -4,7 +4,8 @@ import("system.result");
 import("Sql_lib");
 
 var cond = SqlCondition.begin()
-                   .andPrepareVars("AB_ATTRIBUTERELATION.OBJECT_ROWID", "$param.ObjectRowId_param");
+                   .andPrepareVars("AB_ATTRIBUTERELATION.OBJECT_ROWID", "$param.ObjectRowId_param")
+                   .andPrepareVars("AB_ATTRIBUTERELATION.OBJECT_TYPE", "$param.ObjectType_param");
 
 if (vars.exists("$param.ObjectRowId_param") && vars.get("$param.ObjectRowId_param")
     && vars.exists("$param.FilteredAttributeIds_param") && vars.get("$param.FilteredAttributeIds_param"))
diff --git a/entity/AttributeRelation_entity/recordcontainers/db/fromClauseProcess.js b/entity/AttributeRelation_entity/recordcontainers/db/fromClauseProcess.js
deleted file mode 100644
index db1937db74e473532997b9f4b6d8307c24518500..0000000000000000000000000000000000000000
--- a/entity/AttributeRelation_entity/recordcontainers/db/fromClauseProcess.js
+++ /dev/null
@@ -1,3 +0,0 @@
-import("system.result");
-
-result.string("AB_ATTRIBUTERELATION join AB_ATTRIBUTE on (AB_ATTRIBUTERELATION.AB_ATTRIBUTE_ID = AB_ATTRIBUTE.AB_ATTRIBUTEID)");
\ No newline at end of file
diff --git a/entity/AttributeRelation_entity/recordcontainers/db/orderClauseProcess.js b/entity/AttributeRelation_entity/recordcontainers/db/orderClauseProcess.js
deleted file mode 100644
index b70300ec1e67e5492b07d3d47dfc5d47a061581f..0000000000000000000000000000000000000000
--- a/entity/AttributeRelation_entity/recordcontainers/db/orderClauseProcess.js
+++ /dev/null
@@ -1,5 +0,0 @@
-import("system.db");
-import("system.result");
-result.object({
-    "AB_ATTRIBUTE.ATTRIBUTE_PARENT_ID" : db.ASCENDING
-});
\ No newline at end of file
diff --git a/entity/AttributeUsage_entity/AttributeUsage_entity.aod b/entity/AttributeUsage_entity/AttributeUsage_entity.aod
index f341a9ea3218507bb38815ce8309fd40799c9882..dadfdcc4831c9ce6bf665693711aeccc74bcc678 100644
--- a/entity/AttributeUsage_entity/AttributeUsage_entity.aod
+++ b/entity/AttributeUsage_entity/AttributeUsage_entity.aod
@@ -4,6 +4,7 @@
   <title>Attribute Usage</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <documentation>%aditoprj%/entity/AttributeUsage_entity/documentation.adoc</documentation>
+  <onValidation>%aditoprj%/entity/AttributeUsage_entity/onValidation.js</onValidation>
   <recordContainer>db</recordContainer>
   <entityFields>
     <entityProvider>
@@ -53,6 +54,8 @@
       <title>Minimal Count</title>
       <contentType>NUMBER</contentType>
       <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>
       <onValidation>%aditoprj%/entity/AttributeUsage_entity/entityfields/min_count/onValidation.js</onValidation>
     </entityField>
     <entityField>
@@ -60,6 +63,8 @@
       <title>Maximal Count</title>
       <contentType>NUMBER</contentType>
       <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>
       <onValidation>%aditoprj%/entity/AttributeUsage_entity/entityfields/max_count/onValidation.js</onValidation>
     </entityField>
     <entityConsumer>
@@ -85,6 +90,17 @@
         </entityParameter>
       </children>
     </entityConsumer>
+    <entityParameter>
+      <name>SingleSelection_param</name>
+      <expose v="true" />
+      <triggerRecalculation v="true" />
+      <description>PARAMETER</description>
+    </entityParameter>
+    <entityParameter>
+      <name>DisableMinCount_param</name>
+      <expose v="true" />
+      <description>PARAMETER</description>
+    </entityParameter>
   </entityFields>
   <recordContainers>
     <dbRecordContainer>
diff --git a/entity/AttributeUsage_entity/entityfields/context/children/exclusivecontexts_param/valueProcess.js b/entity/AttributeUsage_entity/entityfields/context/children/exclusivecontexts_param/valueProcess.js
index 9ccd8c87e5829b0b4895728bee6a2d184aaa0424..5a8e7eb9fe21be6d537ba769a61622d42f95087b 100644
--- a/entity/AttributeUsage_entity/entityfields/context/children/exclusivecontexts_param/valueProcess.js
+++ b/entity/AttributeUsage_entity/entityfields/context/children/exclusivecontexts_param/valueProcess.js
@@ -7,6 +7,7 @@ result.object([
     "Product",
     "Activity",
     "Offer",
+    "Order",
     "Employee",
     "Salesproject"
 ]);
\ No newline at end of file
diff --git a/entity/AttributeUsage_entity/entityfields/max_count/stateProcess.js b/entity/AttributeUsage_entity/entityfields/max_count/stateProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..8afb53a33287d435fbe60cf73251c6892d7a4e4a
--- /dev/null
+++ b/entity/AttributeUsage_entity/entityfields/max_count/stateProcess.js
@@ -0,0 +1,8 @@
+import("system.neon");
+import("system.result");
+import("system.vars");
+
+if (vars.exists("$param.SingleSelection_param") && vars.get("$param.SingleSelection_param") == "true")
+    result.string(neon.COMPONENTSTATE_READONLY);
+else
+    result.string(neon.COMPONENTSTATE_EDITABLE);
\ No newline at end of file
diff --git a/entity/AttributeUsage_entity/entityfields/max_count/valueProcess.js b/entity/AttributeUsage_entity/entityfields/max_count/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..420c9cb7132ffc0dd8eb048ab2e922ce7d7beb77
--- /dev/null
+++ b/entity/AttributeUsage_entity/entityfields/max_count/valueProcess.js
@@ -0,0 +1,5 @@
+import("system.result");
+import("system.vars");
+
+if (vars.exists("$param.SingleSelection_param") && vars.get("$param.SingleSelection_param") == "true")
+    result.string("1");
\ No newline at end of file
diff --git a/entity/AttributeUsage_entity/entityfields/min_count/stateProcess.js b/entity/AttributeUsage_entity/entityfields/min_count/stateProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..d140eb741f4bc42de2674499e7ef5d6220db0599
--- /dev/null
+++ b/entity/AttributeUsage_entity/entityfields/min_count/stateProcess.js
@@ -0,0 +1,8 @@
+import("system.neon");
+import("system.result");
+import("system.vars");
+
+if (vars.exists("$param.DisableMinCount_param") && vars.get("$param.DisableMinCount_param") == "true")
+    result.string(neon.COMPONENTSTATE_READONLY);
+else
+    result.string(neon.COMPONENTSTATE_EDITABLE);
\ No newline at end of file
diff --git a/entity/AttributeUsage_entity/entityfields/min_count/valueProcess.js b/entity/AttributeUsage_entity/entityfields/min_count/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..99e89c3d9b5a6d200ccc22a464b30e06d04cab0c
--- /dev/null
+++ b/entity/AttributeUsage_entity/entityfields/min_count/valueProcess.js
@@ -0,0 +1,5 @@
+import("system.result");
+import("system.vars");
+
+if (vars.exists("$param.DisableMinCount_param") && vars.get("$param.DisableMinCount_param") == "true")
+    result.string("");
\ No newline at end of file
diff --git a/entity/AttributeUsage_entity/onValidation.js b/entity/AttributeUsage_entity/onValidation.js
new file mode 100644
index 0000000000000000000000000000000000000000..5e0442557341d0d0707a84065fb5246e035f9b73
--- /dev/null
+++ b/entity/AttributeUsage_entity/onValidation.js
@@ -0,0 +1,8 @@
+import("system.translate");
+import("system.vars");
+import("system.result");
+
+var minCount = vars.getString("$field.MIN_COUNT");
+var maxCount = vars.getString("$field.MAX_COUNT");
+if (minCount != "" && maxCount != "" && minCount > maxCount)
+    result.string(translate.text("The minimal count can't be larger than the maximal count!"));
\ No newline at end of file
diff --git a/entity/Attribute_entity/Attribute_entity.aod b/entity/Attribute_entity/Attribute_entity.aod
index 687bb7a6d0d036983aabefb881c779fc33b56ceb..439e57fdab5644ce83742eec4e8980692f8b69a6 100644
--- a/entity/Attribute_entity/Attribute_entity.aod
+++ b/entity/Attribute_entity/Attribute_entity.aod
@@ -95,6 +95,10 @@
           <name>AttrParentId_param</name>
           <expose v="true" />
         </entityParameter>
+        <entityParameter>
+          <name>AttributeCount_param</name>
+          <expose v="false" />
+        </entityParameter>
       </children>
     </entityProvider>
     <entityParameter>
@@ -118,6 +122,14 @@
           <expose v="false" />
           <triggerRecalculation v="true" />
         </entityParameter>
+        <entityParameter>
+          <name>SingleSelection_param</name>
+          <valueProcess>%aditoprj%/entity/Attribute_entity/entityfields/attributeusages/children/singleselection_param/valueProcess.js</valueProcess>
+        </entityParameter>
+        <entityParameter>
+          <name>DisableMinCount_param</name>
+          <valueProcess>%aditoprj%/entity/Attribute_entity/entityfields/attributeusages/children/disablemincount_param/valueProcess.js</valueProcess>
+        </entityParameter>
       </children>
     </entityConsumer>
     <entityField>
@@ -150,7 +162,6 @@
       <title>Keyword</title>
       <dropDownProcess>%aditoprj%/entity/Attribute_entity/entityfields/keyword_container/dropDownProcess.js</dropDownProcess>
       <searchable v="false" />
-      <state>AUTO</state>
       <stateProcess>%aditoprj%/entity/Attribute_entity/entityfields/keyword_container/stateProcess.js</stateProcess>
     </entityField>
     <entityParameter>
@@ -249,7 +260,6 @@
       <name>USAGELIST</name>
       <title>Usage</title>
       <state>READONLY</state>
-      <valueProcess>%aditoprj%/entity/Attribute_entity/entityfields/usagelist/valueProcess.js</valueProcess>
     </entityField>
     <entityProvider>
       <name>AttributeGroups</name>
@@ -264,6 +274,10 @@
           <name>AttrParentId_param</name>
           <expose v="true" />
         </entityParameter>
+        <entityParameter>
+          <name>AttributeCount_param</name>
+          <expose v="false" />
+        </entityParameter>
       </children>
     </entityProvider>
     <entityConsumer>
@@ -282,8 +296,9 @@
       </children>
     </entityConsumer>
     <entityField>
-      <name>IMAGE</name>
+      <name>ICON</name>
       <contentType>IMAGE</contentType>
+      <valueProcess>%aditoprj%/entity/Attribute_entity/entityfields/icon/valueProcess.js</valueProcess>
     </entityField>
     <entityField>
       <name>UID</name>
@@ -294,6 +309,11 @@
       <title>Sorting</title>
       <searchable v="false" />
     </entityField>
+    <entityParameter>
+      <name>AttributeCount_param</name>
+      <expose v="true" />
+      <description>PARAMETER</description>
+    </entityParameter>
   </entityFields>
   <recordContainers>
     <jDitoRecordContainer>
@@ -313,6 +333,8 @@
         <element>ATTRIBUTE_TYPE.displayValue</element>
         <element>KEYWORD_CONTAINER.value</element>
         <element>SORTING.value</element>
+        <element>USAGELIST.value</element>
+        <element>FULL_ATTRIBUTE_NAME.value</element>
       </recordFields>
     </jDitoRecordContainer>
   </recordContainers>
diff --git a/entity/Attribute_entity/entityfields/attributeusages/children/disablemincount_param/valueProcess.js b/entity/Attribute_entity/entityfields/attributeusages/children/disablemincount_param/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..0a2e8963712038f5f0e3d895d6a5909ed39704af
--- /dev/null
+++ b/entity/Attribute_entity/entityfields/attributeusages/children/disablemincount_param/valueProcess.js
@@ -0,0 +1,6 @@
+import("system.vars");
+import("system.result");
+import("Attribute_lib")
+
+var type = vars.get("$field.ATTRIBUTE_TYPE").trim();
+result.string(type == $AttributeTypes.VOID);
\ No newline at end of file
diff --git a/entity/Attribute_entity/entityfields/attributeusages/children/singleselection_param/valueProcess.js b/entity/Attribute_entity/entityfields/attributeusages/children/singleselection_param/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..64160d194837e0d77754fff0f7aed6fe33eac1a8
--- /dev/null
+++ b/entity/Attribute_entity/entityfields/attributeusages/children/singleselection_param/valueProcess.js
@@ -0,0 +1,6 @@
+import("system.vars");
+import("system.result");
+import("Attribute_lib")
+
+var type = vars.get("$field.ATTRIBUTE_TYPE").trim();
+result.string(type == $AttributeTypes.VOID || type == $AttributeTypes.BOOLEAN); //using a boolean/void attribute twice wouldn't make sense
\ No newline at end of file
diff --git a/entity/Attribute_entity/entityfields/icon/valueProcess.js b/entity/Attribute_entity/entityfields/icon/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..74e82fd764df16389820a48f02f00e9390f54b40
--- /dev/null
+++ b/entity/Attribute_entity/entityfields/icon/valueProcess.js
@@ -0,0 +1,11 @@
+import("system.vars");
+import("system.result");
+import("system.neon");
+import("Keyword_lib");
+import("KeywordRegistry_basic");
+
+var type = vars.getString("$field.ATTRIBUTE_TYPE");
+var keywordAttributes = KeywordUtils.getAttributeRelationsByKey(type, $KeywordRegistry.attributeType())
+var icon = keywordAttributes.defaultAvatarRepresentation;
+
+result.string(icon);
diff --git a/entity/Attribute_entity/entityfields/keyword_container/stateProcess.js b/entity/Attribute_entity/entityfields/keyword_container/stateProcess.js
index b72e57d775c59b92691cda3fa4bdf03454c8e77c..1ba0d0dfaee10f1e1c0bb83e38c6ec45fe054138 100644
--- a/entity/Attribute_entity/entityfields/keyword_container/stateProcess.js
+++ b/entity/Attribute_entity/entityfields/keyword_container/stateProcess.js
@@ -6,6 +6,8 @@ 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;
 
diff --git a/entity/Attribute_entity/entityfields/usagelist/valueProcess.js b/entity/Attribute_entity/entityfields/usagelist/valueProcess.js
deleted file mode 100644
index 130b4cc5a16fb171b4613faf46c3a3734725750f..0000000000000000000000000000000000000000
--- a/entity/Attribute_entity/entityfields/usagelist/valueProcess.js
+++ /dev/null
@@ -1,18 +0,0 @@
-import("system.translate");
-import("system.result");
-import("system.db");
-import("system.vars");
-import("Sql_lib");
-import("Attribute_lib");
-
-var retStr = "\u00A0"; // \u00A0 -> space character that doesn't get trimmed 
-if (vars.get("$field.ATTRIBUTE_TYPE").trim() != $AttributeTypes.COMBOVALUE)
-{
-    var usages = db.array(db.COLUMN, SqlCondition.begin()
-        .andPrepareVars("AB_ATTRIBUTEUSAGE.AB_ATTRIBUTE_ID", "$field.UID")
-        .buildSql("select OBJECT_TYPE from AB_ATTRIBUTEUSAGE"));
-    if (usages.length)
-        retStr = usages.join(", ");
-}
-
-result.string(retStr);
\ No newline at end of file
diff --git a/entity/Attribute_entity/recordcontainers/jdito/contentProcess.js b/entity/Attribute_entity/recordcontainers/jdito/contentProcess.js
index 925c8d353f8aade0cc25efe331689cb0bee7376a..773ea99f554003603ead5facc50c33de5a303066 100644
--- a/entity/Attribute_entity/recordcontainers/jdito/contentProcess.js
+++ b/entity/Attribute_entity/recordcontainers/jdito/contentProcess.js
@@ -1,4 +1,3 @@
-import("system.datetime");
 import("JditoFilter_lib");
 import("KeywordRegistry_basic");
 import("Keyword_lib");
@@ -8,33 +7,35 @@ import("system.result");
 import("Sql_lib");
 import("Attribute_lib");
 
-var sqlSelect = "select AB_ATTRIBUTEID, ATTRIBUTE_ACTIVE, " 
-    + "ATTRIBUTE_NAME, ATTRIBUTE_PARENT_ID, ATTRIBUTE_TYPE, " 
-    + KeywordUtils.getResolvedTitleSqlPart($KeywordRegistry.attributeType(), "ATTRIBUTE_TYPE")
-    + ", KEYWORD_CONTAINER, SORTING from AB_ATTRIBUTE";
+var sqlSelect = "select A.AB_ATTRIBUTEID, A.ATTRIBUTE_ACTIVE, A.ATTRIBUTE_NAME, A.ATTRIBUTE_PARENT_ID, A.ATTRIBUTE_TYPE, " 
+    + KeywordUtils.getResolvedTitleSqlPart($KeywordRegistry.attributeType(), "A.ATTRIBUTE_TYPE")
+    + ", A.KEYWORD_CONTAINER, A.SORTING, P.ATTRIBUTE_PARENT_ID, P.ATTRIBUTE_NAME " 
+    + "from AB_ATTRIBUTE A "
+    + "left join AB_ATTRIBUTE P on A.ATTRIBUTE_PARENT_ID = P.AB_ATTRIBUTEID";
 
-var sqlOrder = " order by ATTRIBUTE_PARENT_ID asc, SORTING asc";
+var sqlOrder = " order by A.ATTRIBUTE_PARENT_ID asc, A.SORTING asc";
 
-var condition = new SqlCondition();
+var condition = SqlCondition.begin();
 
 var getGroups = vars.exists("$param.GetGroups_param") && vars.get("$param.GetGroups_param");
 var objectType = vars.exists("$param.ObjectType_param") && vars.get("$param.ObjectType_param");
 
 if (vars.exists("$local.idvalues") && vars.get("$local.idvalues"))
-    condition.and("AB_ATTRIBUTEID in ('" + vars.get("$local.idvalues").join("','") + "')");
+    condition.and("A.AB_ATTRIBUTEID in ('" + vars.get("$local.idvalues").join("','") + "')");
 else if (getGroups)
 {
     //this is for the selection of the superordinate attribute, this condition
     //filters out the own id and the children to prevent loops
     
-    var isGroupCondition = new SqlCondition();
+    var isGroupCondition = SqlCondition.begin();
     for (let type in $AttributeTypes)
         if ($AttributeTypes[type].isGroup && $AttributeTypes[type] != $AttributeTypes.COMBO)
-            isGroupCondition.orPrepare("AB_ATTRIBUTE.ATTRIBUTE_TYPE", $AttributeTypes[type]);
+            isGroupCondition.orPrepare(["AB_ATTRIBUTE", "ATTRIBUTE_TYPE", "A"], $AttributeTypes[type]);
+    
     condition.andSqlCondition(SqlCondition.begin()
         .andSqlCondition(isGroupCondition)
-        .andPrepareVars("AB_ATTRIBUTE.AB_ATTRIBUTEID", "$param.AttrParentId_param", "# != ?")
-        .and("AB_ATTRIBUTE.AB_ATTRIBUTEID not in ('" + AttributeUtil.getAllChildren(vars.getString("$param.AttrParentId_param")).join("','") + "')")
+        .andPrepareVars(["AB_ATTRIBUTE", "AB_ATTRIBUTEID", "A"], "$param.AttrParentId_param", "# != ?")
+        .and("A.AB_ATTRIBUTEID not in ('" + AttributeUtil.getAllChildren(vars.getString("$param.AttrParentId_param")).join("','") + "')")
     );
 }
 else if (objectType)  //if there's an objectType, it comes from the AttributeRelation entity
@@ -42,20 +43,22 @@ else if (objectType)  //if there's an objectType, it comes from the AttributeRel
     var filteredAttributes = [];
     if (vars.exists("$param.FilteredAttributeIds_param") && vars.get("$param.FilteredAttributeIds_param"))
         filteredAttributes = JSON.parse(vars.get("$param.FilteredAttributeIds_param"));
-    
-    var ids = AttributeUtil.getPossibleAttributes(objectType, false, filteredAttributes);
-    condition.and("AB_ATTRIBUTE.AB_ATTRIBUTEID in ('" + ids.join("','") + "')");
+    var attributeCount;
+    if (vars.exists("$param.AttributeCount_param") && vars.get("$param.AttributeCount_param"))
+        attributeCount = JSON.parse(vars.get("$param.AttributeCount_param"));
+    var ids = AttributeUtil.getPossibleAttributes(objectType, false, filteredAttributes, attributeCount);
+    condition.and("A.AB_ATTRIBUTEID in ('" + ids.join("','") + "')");
 } 
 else 
 {
-    var type = vars.exists("$param.AttrParentType_param") && vars.get("$param.AttrParentType_param");   
-    if (AttributeTypeUtil.isGroupType(type))
+    var parentType = vars.exists("$param.AttrParentType_param") && vars.get("$param.AttrParentType_param");   
+    if (AttributeTypeUtil.isGroupType(parentType))
     {
         var parentId = vars.exists("$param.AttrParentId_param") && vars.get("$param.AttrParentId_param");
         if (parentId)
-            condition.and("AB_ATTRIBUTE.AB_ATTRIBUTEID in ('" + AttributeUtil.getAllChildren(vars.getString("$param.AttrParentId_param")).join("','") + "')");
+            condition.and("A.AB_ATTRIBUTEID in ('" + AttributeUtil.getAllChildren(vars.getString("$param.AttrParentId_param")).join("','") + "')");
     }
-    else if (type)
+    else if (parentType)
         condition.and("1=2");
 }
 
@@ -63,45 +66,79 @@ else
 if (vars.exists("$local.filter") && vars.get("$local.filter"))
 {
     var filter = vars.get("$local.filter");
-    condition.andSqlCondition(JditoFilterUtils.getSqlCondition(filter, "AB_ATTRIBUTE"));
+    condition.andSqlCondition(JditoFilterUtils.getSqlCondition(filter, "AB_ATTRIBUTE", "A"));
 }
 
 var attributes = db.table(condition.buildSql(sqlSelect, "1=1", sqlOrder));
 
-if (attributes.length > 1)
-    attributes = _sortArrayForTree(attributes);
+var usageIdType = SqlUtils.getSingleColumnType("AB_ATTRIBUTEUSAGE.AB_ATTRIBUTE_ID");
+var attributeIdType = SqlUtils.getSingleColumnType("AB_ATTRIBUTE.AB_ATTRIBUTEID");
+
+attributes = _buildAttributeTable(attributes);
 
 result.object(attributes);
 
-//sorts the records in a way that a tree can be built
-function _sortArrayForTree (pArray) 
+
+//sorts the records in a way that a tree can be built and adds values
+function _buildAttributeTable (pAttributes) 
 {
     var rows = {};
     var allIds = {};
-    var idIndex = 0;
-    var parentIdIndex = 3;
     
-    pArray.forEach(function (row) {allIds[row[idIndex]] = true;});
+    //fills the allIds object, the object is used for checking if a parent exists in the array
+    pAttributes.forEach(function (row) {allIds[row[0]] = true;});
     
-    var index = 0;
+    var arrayIndex = 0;
     
-    for (let itemsAdded = true; itemsAdded; itemsAdded = oldIndex != index)
+    //stops the loop when no new items were added so that recursive relations between attributes don't cause an infinite loop
+    for (let itemsAdded = true; itemsAdded; itemsAdded = oldIndex != arrayIndex)
     {
-        var oldIndex = index;
-        pArray.forEach(function (row)
-        {
+        var oldIndex = arrayIndex;
+        pAttributes.forEach(function (row)
+        {   
             //item will be added if the id is not already in the object and
             //the parent is already added (or the parent is not in the array)
-            if (!(row[idIndex] in this) && (row[parentIdIndex] in this || !allIds[row[parentIdIndex]]))
-                this[row[idIndex]] = {
+            if (!(row[0] in this) && (row[3] in this || !allIds[row[3]]))
+                this[row[0]] = {
                     data : row,
-                    index : index++
+                    index : arrayIndex++
                 };
         }, rows);
     }
     var sortedArray = new Array(Object.keys(rows).length);
     for (let i in rows)
-        sortedArray[rows[i].index] = rows[i].data;
+    {
+        let rowData = rows[i].data;
+        if (!(vars.exists("$param.DisplaySimpleName_param") && vars.get("$param.DisplaySimpleName_param")))
+            rowData[9] = _getFullName(rowData[2], rowData[9], rowData[8]);
+        else
+            rowData[9] = rowData[2];
+        if (rowData[4].trim() != $AttributeTypes.COMBOVALUE)
+        {
+            let usages = db.array(db.COLUMN, SqlCondition.begin()
+                .andPrepare("AB_ATTRIBUTEUSAGE.AB_ATTRIBUTE_ID", rowData[0], null, usageIdType)
+                .buildSql("select OBJECT_TYPE from AB_ATTRIBUTEUSAGE")
+            );
+            if (usages.length)
+                rowData[8] = usages.join(", ");
+        }
+        else
+            rowData[8] = "";
+        sortedArray[rows[i].index] = rowData;
+    }
     
     return sortedArray;
+}
+
+function _getFullName (pAttributeName, pParentName, pGrandParentId)
+{
+    if (pParentName)
+        pAttributeName = pParentName + " / " + pAttributeName;
+    if (pGrandParentId)
+    {
+        var grandParentName = AttributeUtil.getFullAttributeName(pGrandParentId, null, attributeIdType);
+        if (grandParentName)
+            pAttributeName = grandParentName + " / " + pAttributeName;
+    }
+    return pAttributeName;
 }
\ No newline at end of file
diff --git a/entity/Attribute_entity/titleProcess.js b/entity/Attribute_entity/titleProcess.js
index e55588aa4fb9dea4ee26b065951ab47b1ad43256..0eb44535e0b26ca7b387f2ba0cd5634f519ce0c1 100644
--- a/entity/Attribute_entity/titleProcess.js
+++ b/entity/Attribute_entity/titleProcess.js
@@ -1,4 +1,5 @@
+import("Context_lib");
 import("system.vars");
 import("system.result");
 
-result.string(vars.get("$field.FULL_ATTRIBUTE_NAME"));
\ No newline at end of file
+result.string(ContextUtils.prefixWithCurrentContextTitle(vars.get("$field.FULL_ATTRIBUTE_NAME")));
\ No newline at end of file
diff --git a/entity/CampaignAddParticipants_entity/CampaignAddParticipants_entity.aod b/entity/CampaignAddParticipants_entity/CampaignAddParticipants_entity.aod
new file mode 100644
index 0000000000000000000000000000000000000000..af54d522f5456756c0fe42a572fb5e15991bcb95
--- /dev/null
+++ b/entity/CampaignAddParticipants_entity/CampaignAddParticipants_entity.aod
@@ -0,0 +1,138 @@
+<?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.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.2">
+  <name>CampaignAddParticipants_entity</name>
+  <title>Add participants to Campaign</title>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <afterOperatingState>%aditoprj%/entity/CampaignAddParticipants_entity/afterOperatingState.js</afterOperatingState>
+  <recordContainer>jdito</recordContainer>
+  <entityFields>
+    <entityProvider>
+      <name>#PROVIDER</name>
+    </entityProvider>
+    <entityField>
+      <name>CAMPAIGN_ID</name>
+      <title>Campaign</title>
+      <consumer>CampaignConsumer</consumer>
+      <mandatory v="true" />
+      <state>AUTO</state>
+      <valueProcess>%aditoprj%/entity/CampaignAddParticipants_entity/entityfields/campaign_id/valueProcess.js</valueProcess>
+      <displayValueProcess>%aditoprj%/entity/CampaignAddParticipants_entity/entityfields/campaign_id/displayValueProcess.js</displayValueProcess>
+      <onValidation>%aditoprj%/entity/CampaignAddParticipants_entity/entityfields/campaign_id/onValidation.js</onValidation>
+      <onValueChange>%aditoprj%/entity/CampaignAddParticipants_entity/entityfields/campaign_id/onValueChange.js</onValueChange>
+      <onValueChangeTypes>
+        <element>MASK</element>
+        <element>PROCESS</element>
+        <element>PROCESS_SETVALUE</element>
+        <element>RECORD</element>
+      </onValueChangeTypes>
+    </entityField>
+    <entityField>
+      <name>CAMPAIGNSTEP_ID</name>
+      <title>Campaign Step</title>
+      <consumer>CampaignStepConsumer</consumer>
+      <mandatory v="true" />
+      <state>EDITABLE</state>
+      <displayValueProcess>%aditoprj%/entity/CampaignAddParticipants_entity/entityfields/campaignstep_id/displayValueProcess.js</displayValueProcess>
+    </entityField>
+    <entityField>
+      <name>campaignParticipantMessage</name>
+      <state>READONLY</state>
+      <valueProcess>%aditoprj%/entity/CampaignAddParticipants_entity/entityfields/campaignparticipantmessage/valueProcess.js</valueProcess>
+    </entityField>
+    <entityParameter>
+      <name>campaignParticipants_param</name>
+      <expose v="true" />
+      <description>PARAMETER</description>
+    </entityParameter>
+    <entityConsumer>
+      <name>CampaignConsumer</name>
+      <fieldType>DEPENDENCY_OUT</fieldType>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Campaign_entity</entityName>
+        <fieldName>CampaignProvider</fieldName>
+      </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>CampaignStepConsumer</name>
+      <fieldType>DEPENDENCY_OUT</fieldType>
+      <dependency>
+        <name>dependency</name>
+        <entityName>CampaignStep_entity</entityName>
+        <fieldName>CampaignSteps</fieldName>
+      </dependency>
+      <children>
+        <entityParameter>
+          <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>
+    <entityField>
+      <name>UID</name>
+    </entityField>
+    <entityParameter>
+      <name>currentCampaignId_param</name>
+      <expose v="true" />
+      <description>PARAMETER</description>
+    </entityParameter>
+    <entityParameter>
+      <name>currentCampaignStepId_param</name>
+      <expose v="true" />
+      <description>PARAMETER</description>
+    </entityParameter>
+    <entityParameter>
+      <name>isUpdate_param</name>
+      <expose v="true" />
+      <description>PARAMETER</description>
+    </entityParameter>
+    <entityConsumer>
+      <name>CampaignAnalyses</name>
+      <fieldType>DEPENDENCY_OUT</fieldType>
+      <dependency>
+        <name>dependency</name>
+        <entityName>CampaignAnalysis_entity</entityName>
+        <fieldName>#PROVIDER</fieldName>
+      </dependency>
+      <children>
+        <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>
+    <entityField>
+      <name>campaignStepCurrentParticipantCount</name>
+      <title>Current participants</title>
+      <displayValueProcess>%aditoprj%/entity/CampaignAddParticipants_entity/entityfields/campaignstepcurrentparticipantcount/displayValueProcess.js</displayValueProcess>
+    </entityField>
+    <entityField>
+      <name>campaignStepMaxParticipantCount</name>
+      <title>Max participants</title>
+      <displayValueProcess>%aditoprj%/entity/CampaignAddParticipants_entity/entityfields/campaignstepmaxparticipantcount/displayValueProcess.js</displayValueProcess>
+    </entityField>
+    <entityField>
+      <name>isUpdate</name>
+      <valueProcess>%aditoprj%/entity/CampaignAddParticipants_entity/entityfields/isupdate/valueProcess.js</valueProcess>
+    </entityField>
+  </entityFields>
+  <recordContainers>
+    <jDitoRecordContainer>
+      <name>jdito</name>
+      <jDitoRecordAlias>Data_alias</jDitoRecordAlias>
+      <contentProcess>%aditoprj%/entity/CampaignAddParticipants_entity/recordcontainers/jdito/contentProcess.js</contentProcess>
+      <onInsert>%aditoprj%/entity/CampaignAddParticipants_entity/recordcontainers/jdito/onInsert.js</onInsert>
+      <recordFields>
+        <element>UID.value</element>
+      </recordFields>
+    </jDitoRecordContainer>
+  </recordContainers>
+</entity>
diff --git a/entity/CampaignAddParticipants_entity/afterOperatingState.js b/entity/CampaignAddParticipants_entity/afterOperatingState.js
new file mode 100644
index 0000000000000000000000000000000000000000..0265fbd4f36bc81aea602c4cc6f51140f1c03a7e
--- /dev/null
+++ b/entity/CampaignAddParticipants_entity/afterOperatingState.js
@@ -0,0 +1,2 @@
+import("system.logging");
+logging.log("hallo");
\ No newline at end of file
diff --git a/entity/CampaignAddParticipants_entity/entityfields/campaign_id/displayValueProcess.js b/entity/CampaignAddParticipants_entity/entityfields/campaign_id/displayValueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..c00610e87398affa17633bef42ef19a0e8b2b067
--- /dev/null
+++ b/entity/CampaignAddParticipants_entity/entityfields/campaign_id/displayValueProcess.js
@@ -0,0 +1,8 @@
+import("system.result");
+import("system.db");
+import("system.vars");
+import("Campaign_lib");
+
+var campaignId = vars.get("$field.CAMPAIGN_ID");
+var campaignName = CampaignUtils.getCampaignNameById(campaignId);
+result.string(campaignName);
\ No newline at end of file
diff --git a/entity/CampaignAddParticipants_entity/entityfields/campaign_id/onValidation.js b/entity/CampaignAddParticipants_entity/entityfields/campaign_id/onValidation.js
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/entity/CampaignAddParticipants_entity/entityfields/campaign_id/onValueChange.js b/entity/CampaignAddParticipants_entity/entityfields/campaign_id/onValueChange.js
new file mode 100644
index 0000000000000000000000000000000000000000..a8754300a5ed02b50adf50695d4eef4f5b43aab8
--- /dev/null
+++ b/entity/CampaignAddParticipants_entity/entityfields/campaign_id/onValueChange.js
@@ -0,0 +1,9 @@
+import("system.logging");
+import("system.vars");
+import("system.neon");
+import("Campaign_lib");
+
+var stepId;
+CampaignUtils.getDefaultCampaignStep(vars.get("$field.CAMPAIGN_ID"));
+
+neon.setFieldValue("$field.CAMPAIGNSTEP_ID", stepId);
\ No newline at end of file
diff --git a/entity/CampaignAddParticipants_entity/entityfields/campaign_id/valueProcess.js b/entity/CampaignAddParticipants_entity/entityfields/campaign_id/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..5deb886b88ee09a8de4bd50ba7167e0a0d4b86fa
--- /dev/null
+++ b/entity/CampaignAddParticipants_entity/entityfields/campaign_id/valueProcess.js
@@ -0,0 +1,8 @@
+import("system.result");
+import("system.neon");
+import("system.vars");
+
+if(vars.exists("$param.currentCampaignId_param") && vars.get("$param.currentCampaignId_param"))
+{
+    result.string(vars.get("$param.currentCampaignId_param"));
+}
\ No newline at end of file
diff --git a/entity/CampaignAddParticipants_entity/entityfields/campaignanalyses/children/campaignparticipants_param/valueProcess.js b/entity/CampaignAddParticipants_entity/entityfields/campaignanalyses/children/campaignparticipants_param/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..bc239826083563dbc100924e8cdc0689f2b3335b
--- /dev/null
+++ b/entity/CampaignAddParticipants_entity/entityfields/campaignanalyses/children/campaignparticipants_param/valueProcess.js
@@ -0,0 +1,3 @@
+import("system.vars");
+import("system.result");
+result.string(vars.get("$param.campaignParticipants_param"));
\ No newline at end of file
diff --git a/entity/CampaignAddParticipants_entity/entityfields/campaignanalyses/children/campaignstepid_param/valueProcess.js b/entity/CampaignAddParticipants_entity/entityfields/campaignanalyses/children/campaignstepid_param/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..1ad18e3c6c373a202e9d9bafb9748d57338dc5ec
--- /dev/null
+++ b/entity/CampaignAddParticipants_entity/entityfields/campaignanalyses/children/campaignstepid_param/valueProcess.js
@@ -0,0 +1,4 @@
+import("system.vars");
+import("system.result");
+
+result.string(vars.get("$field.CAMPAIGNSTEP_ID"));
\ No newline at end of file
diff --git a/entity/CampaignAddParticipants_entity/entityfields/campaignparticipantmessage/valueProcess.js b/entity/CampaignAddParticipants_entity/entityfields/campaignparticipantmessage/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..e29b9d1da9e56ec1b5c63265147f2d586161cfa6
--- /dev/null
+++ b/entity/CampaignAddParticipants_entity/entityfields/campaignparticipantmessage/valueProcess.js
@@ -0,0 +1,8 @@
+import("system.result");
+import("system.translate");
+import("system.vars");
+
+var campaignParticipantsAmount = JSON.parse(vars.get("$param.campaignParticipants_param")).length;
+var informationText = translate.text("participants will be added to the selected campaign step");
+
+result.string(campaignParticipantsAmount + " " + informationText);
\ No newline at end of file
diff --git a/entity/CampaignAddParticipants_entity/entityfields/campaignstep_id/displayValueProcess.js b/entity/CampaignAddParticipants_entity/entityfields/campaignstep_id/displayValueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..649caa2bc64329ecde4daf38beb3d1d35fe666b8
--- /dev/null
+++ b/entity/CampaignAddParticipants_entity/entityfields/campaignstep_id/displayValueProcess.js
@@ -0,0 +1,8 @@
+import("system.logging");
+import("system.vars");
+import("Campaign_lib");
+import("system.result");
+
+var campaignStepId = vars.get("$field.CAMPAIGNSTEP_ID");
+var campaignStepName = CampaignUtils.getCampaignStepNameById(campaignStepId);
+result.string(campaignStepName);
\ No newline at end of file
diff --git a/entity/CampaignAddParticipants_entity/entityfields/campaignstepconsumer/children/campaignid_param/valueProcess.js b/entity/CampaignAddParticipants_entity/entityfields/campaignstepconsumer/children/campaignid_param/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..0b9f6e82c776f901fe0acc30083d718ab0198e8c
--- /dev/null
+++ b/entity/CampaignAddParticipants_entity/entityfields/campaignstepconsumer/children/campaignid_param/valueProcess.js
@@ -0,0 +1,5 @@
+import("system.logging");
+import("system.vars");
+import("system.result");
+logging.log("parameter campaignid -> " + vars.getString("$field.CAMPAIGN_ID"));
+result.string(vars.getString("$field.CAMPAIGN_ID"));
\ No newline at end of file
diff --git a/entity/CampaignAddParticipants_entity/entityfields/campaignstepcurrentparticipantcount/displayValueProcess.js b/entity/CampaignAddParticipants_entity/entityfields/campaignstepcurrentparticipantcount/displayValueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..d001f813402438ca1481d4c2fd03c94b4b341de6
--- /dev/null
+++ b/entity/CampaignAddParticipants_entity/entityfields/campaignstepcurrentparticipantcount/displayValueProcess.js
@@ -0,0 +1,5 @@
+import("system.result");
+import("system.vars");
+import("Campaign_lib");
+
+result.string(CampaignUtils.getParticipantCountForStep(vars.get("$field.CAMPAIGNSTEP_ID")));
\ No newline at end of file
diff --git a/entity/CampaignAddParticipants_entity/entityfields/campaignstepmaxparticipantcount/displayValueProcess.js b/entity/CampaignAddParticipants_entity/entityfields/campaignstepmaxparticipantcount/displayValueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..cc8e454b27deee27b34ccb9e12c08f4e767c065f
--- /dev/null
+++ b/entity/CampaignAddParticipants_entity/entityfields/campaignstepmaxparticipantcount/displayValueProcess.js
@@ -0,0 +1,5 @@
+import("system.result");
+import("system.vars");
+import("Campaign_lib");
+
+result.string(CampaignUtils.getMaxParticipantCountForStep(vars.get("$field.CAMPAIGNSTEP_ID")));
\ No newline at end of file
diff --git a/entity/CampaignAddParticipants_entity/entityfields/isupdate/valueProcess.js b/entity/CampaignAddParticipants_entity/entityfields/isupdate/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..9d4383e75f361c325a98a53f6338210b5af50468
--- /dev/null
+++ b/entity/CampaignAddParticipants_entity/entityfields/isupdate/valueProcess.js
@@ -0,0 +1,7 @@
+import("system.result");
+import("system.vars");
+
+var isUpdate = "false";
+if(vars.exists("$param.isUpdate_param") && vars.get("$param.isUpdate_param") != null)
+    isUpdate = vars.get("$param.isUpdate_param");
+result.string(isUpdate);
\ No newline at end of file
diff --git a/entity/CampaignAddParticipants_entity/recordcontainers/jdito/contentProcess.js b/entity/CampaignAddParticipants_entity/recordcontainers/jdito/contentProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/entity/CampaignAddParticipants_entity/recordcontainers/jdito/onInsert.js b/entity/CampaignAddParticipants_entity/recordcontainers/jdito/onInsert.js
new file mode 100644
index 0000000000000000000000000000000000000000..cadda267735d1e2481992b20d9addead9611895c
--- /dev/null
+++ b/entity/CampaignAddParticipants_entity/recordcontainers/jdito/onInsert.js
@@ -0,0 +1,78 @@
+import("system.logging");
+import("system.vars");
+import("system.db");
+import("system.util");
+import("Campaign_lib");
+
+
+logging.log("CampaignAddPs jdito oninsert -> ");
+
+var campaignId     = vars.getString("$field.CAMPAIGN_ID");
+var newCampaignStepId = vars.getString("$field.CAMPAIGNSTEP_ID");
+var participants   = JSON.parse(vars.getString("$param.campaignParticipants_param"));
+
+var isUpdate = vars.get("$field.isUpdate");
+logging.log("onInsert isUpdate -> " + isUpdate);
+var colNamesCampaignParticipantLog = CampaignUtils.getParticipantLogInsertColumnNames();
+
+var cols = [];
+
+if(isUpdate == "true")
+{
+    cols = [ "CAMPAIGNSTEP_ID",
+              "USER_EDIT",
+              "DATE_EDIT"
+            ];
+}
+else
+{
+    cols = [ "CAMPAIGNPARTICIPANTID"
+    ,"CONTACT_ID"
+    ,"CAMPAIGN_ID"
+    ,"CAMPAIGNSTEP_ID"
+    ,"USER_NEW"
+    ,"DATE_NEW"
+    ];
+}
+
+var statementArray = [];
+logging.log("isUpdate -> " + isUpdate);
+for (participant in participants)
+{
+    var campaignParticipantLogId = util.getNewUUID();
+    if(isUpdate == "true")
+    {
+        let updatedValues = [newCampaignStepId,
+                        vars.get("$sys.user"),
+                        vars.get("$sys.date")];
+        
+        let condition = "CAMPAIGNPARTICIPANTID = '" + participants[participant] + "'";
+        logging.log("condition -> " + condition);
+        let valsCampaignParticipantLog = new Array(participants[participant], campaignId, newCampaignStepId, campaignParticipantLogId, vars.get("$sys.user"), vars.get("$sys.date"));
+        
+        statementArray.push(["CAMPAIGNPARTICIPANT", cols, null, updatedValues, condition]);
+        statementArray.push(["CAMPAIGNPARTICIPANTLOG", colNamesCampaignParticipantLog, null, valsCampaignParticipantLog]);
+    }
+    else
+    {
+        let campaignParticipantId = util.getNewUUID();
+    
+        var valsCampaignParticipant = [ campaignParticipantId
+        , participants[participant]
+        , campaignId
+        , newCampaignStepId
+        , vars.get("$sys.user")
+        , vars.get("$sys.date")
+        ];
+
+        let valsCampaignParticipantLog = new Array(campaignParticipantId, campaignId, newCampaignStepId, campaignParticipantLogId, vars.get("$sys.user"), vars.get("$sys.date"));
+
+        statementArray.push(["CAMPAIGNPARTICIPANT", cols, null, valsCampaignParticipant]);
+        statementArray.push(["CAMPAIGNPARTICIPANTLOG", colNamesCampaignParticipantLog, null, valsCampaignParticipantLog]);
+    }
+}
+
+if(isUpdate == "true")
+    db.updates(statementArray)
+else
+    db.inserts(statementArray);
diff --git a/entity/CampaignAnalysis_entity/CampaignAnalysis_entity.aod b/entity/CampaignAnalysis_entity/CampaignAnalysis_entity.aod
new file mode 100644
index 0000000000000000000000000000000000000000..ce2bfa04290f59e0d85687af903279bb0a397069
--- /dev/null
+++ b/entity/CampaignAnalysis_entity/CampaignAnalysis_entity.aod
@@ -0,0 +1,70 @@
+<?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.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.2">
+  <name>CampaignAnalysis_entity</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <recordContainer>jdito</recordContainer>
+  <entityFields>
+    <entityProvider>
+      <name>#PROVIDER</name>
+      <dependencies>
+        <entityDependency>
+          <name>afaa52b1-6e5b-46be-adef-e50f1394fcf8</name>
+          <entityName>CampaignAddParticipants_entity</entityName>
+          <fieldName>CampaignAnalyses</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+      </dependencies>
+    </entityProvider>
+    <entityField>
+      <name>UID</name>
+    </entityField>
+    <entityField>
+      <name>LABEL</name>
+      <title>Count</title>
+    </entityField>
+    <entityField>
+      <name>COUNT</name>
+    </entityField>
+    <entityField>
+      <name>SORTING</name>
+    </entityField>
+    <entityProvider>
+      <name>CampaignAnalysisProvider</name>
+      <fieldType>DEPENDENCY_IN</fieldType>
+      <children>
+        <entityParameter>
+          <name>campaignParticipants_param</name>
+          <triggerRecalculation v="true" />
+        </entityParameter>
+        <entityParameter>
+          <name>campaignStepId_param</name>
+          <triggerRecalculation v="true" />
+        </entityParameter>
+      </children>
+    </entityProvider>
+    <entityParameter>
+      <name>campaignStepId_param</name>
+      <expose v="true" />
+      <triggerRecalculation v="true" />
+      <description>PARAMETER</description>
+    </entityParameter>
+    <entityParameter>
+      <name>campaignParticipants_param</name>
+      <expose v="true" />
+      <description>PARAMETER</description>
+    </entityParameter>
+  </entityFields>
+  <recordContainers>
+    <jDitoRecordContainer>
+      <name>jdito</name>
+      <jDitoRecordAlias>Data_alias</jDitoRecordAlias>
+      <contentProcess>%aditoprj%/entity/CampaignAnalysis_entity/recordcontainers/jdito/contentProcess.js</contentProcess>
+      <recordFields>
+        <element>UID.value</element>
+        <element>LABEL.value</element>
+        <element>COUNT.value</element>
+        <element>SORTING.value</element>
+      </recordFields>
+    </jDitoRecordContainer>
+  </recordContainers>
+</entity>
diff --git a/entity/CampaignAnalysis_entity/recordcontainers/jdito/contentProcess.js b/entity/CampaignAnalysis_entity/recordcontainers/jdito/contentProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..6508822e59a180b10df2af32d7fb49dbdf3fdc9d
--- /dev/null
+++ b/entity/CampaignAnalysis_entity/recordcontainers/jdito/contentProcess.js
@@ -0,0 +1,29 @@
+import("system.vars");
+import("system.logging");
+import("system.result");
+import("system.util");
+import("system.db");
+
+logging.log("CampaignAnalysis_RecordContainer");
+var ret = [];
+
+var campaignstepid = "b80588dd-4287-4fd7-85c1-7b86118ac4ff";//TODO: Refresh problem - vars.get("$param.campaignStepId_param");
+var newParticipants = JSON.parse(vars.get("$param.campaignParticipants_param")).length;
+
+var query = "select MAXPARTICIPANTS, count(CAMPAIGNPARTICIPANTID) from CAMPAIGNSTEP "
+          + "join CAMPAIGNPARTICIPANT on CAMPAIGNPARTICIPANT.CAMPAIGNSTEP_ID = CAMPAIGNSTEP.CAMPAIGNSTEPID "
+          + "where CAMPAIGNSTEP_ID = '" + campaignstepid + "' "
+          + "group by CAMPAIGNPARTICIPANT.CAMPAIGNSTEP_ID, MAXPARTICIPANTS";
+
+var maxCurrentParticipants = db.table(query);
+
+if(maxCurrentParticipants.length > 0)
+{
+    logging.log("hallo2");
+    ret[0] = [util.getNewUUID(), "Current participants", maxCurrentParticipants[0][1], 0];
+    ret[1] = [util.getNewUUID(), "New participants", newParticipants, 1];
+    logging.log(maxCurrentParticipants[0][0]);
+    ret[2] = [util.getNewUUID(), "Free participant slots", Number(maxCurrentParticipants[0][0]) - (Number(maxCurrentParticipants[0][1]) + Number(newParticipants)), 2];
+}
+
+result.object(ret);
\ No newline at end of file
diff --git a/entity/CampaignCost_entitiy/CampaignCost_entitiy.aod b/entity/CampaignCost_entitiy/CampaignCost_entitiy.aod
new file mode 100644
index 0000000000000000000000000000000000000000..7d3ad07314968cf32cb6a677ac342433b6bd3883
--- /dev/null
+++ b/entity/CampaignCost_entitiy/CampaignCost_entitiy.aod
@@ -0,0 +1,301 @@
+<?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.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.2">
+  <name>CampaignCost_entitiy</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <afterOperatingState>%aditoprj%/entity/CampaignCost_entitiy/afterOperatingState.js</afterOperatingState>
+  <recordContainer>db</recordContainer>
+  <entityFields>
+    <entityProvider>
+      <name>#PROVIDER</name>
+    </entityProvider>
+    <entityField>
+      <name>CAMPAIGNCOSTID</name>
+      <mandatory v="true" />
+      <searchable v="false" />
+      <valueProcess>%aditoprj%/entity/CampaignCost_entitiy/entityfields/campaigncostid/valueProcess.js</valueProcess>
+    </entityField>
+    <entityField>
+      <name>CAMPAIGN_ID</name>
+      <title>Campaign</title>
+      <consumer>Campaigns</consumer>
+      <mandatory v="true" />
+      <groupable v="true" />
+      <valueProcess>%aditoprj%/entity/CampaignCost_entitiy/entityfields/campaign_id/valueProcess.js</valueProcess>
+      <displayValueProcess>%aditoprj%/entity/CampaignCost_entitiy/entityfields/campaign_id/displayValueProcess.js</displayValueProcess>
+    </entityField>
+    <entityField>
+      <name>CAMPAIGNSTEP_ID</name>
+      <title>Campaign Step</title>
+      <consumer>CampaignSteps</consumer>
+      <mandatoryProcess>%aditoprj%/entity/CampaignCost_entitiy/entityfields/campaignstep_id/mandatoryProcess.js</mandatoryProcess>
+      <groupable v="true" />
+      <stateProcess>%aditoprj%/entity/CampaignCost_entitiy/entityfields/campaignstep_id/stateProcess.js</stateProcess>
+      <valueProcess>%aditoprj%/entity/CampaignCost_entitiy/entityfields/campaignstep_id/valueProcess.js</valueProcess>
+      <displayValueProcess>%aditoprj%/entity/CampaignCost_entitiy/entityfields/campaignstep_id/displayValueProcess.js</displayValueProcess>
+      <onValueChange>%aditoprj%/entity/CampaignCost_entitiy/entityfields/campaignstep_id/onValueChange.js</onValueChange>
+      <onValueChangeTypes>
+        <element>MASK</element>
+      </onValueChangeTypes>
+    </entityField>
+    <entityField>
+      <name>CATEGORY</name>
+      <title>Category</title>
+      <consumer>KeywordCampaignManagementCostCategory</consumer>
+      <mandatory v="true" />
+      <groupable v="true" />
+      <displayValueProcess>%aditoprj%/entity/CampaignCost_entitiy/entityfields/category/displayValueProcess.js</displayValueProcess>
+    </entityField>
+    <entityField>
+      <name>NET</name>
+      <title>Cost</title>
+      <contentType>NUMBER</contentType>
+      <outputFormat>#,##0.00</outputFormat>
+      <mandatory v="true" />
+    </entityField>
+    <entityField>
+      <name>USER_NEW</name>
+      <mandatory v="true" />
+      <searchable v="false" />
+      <valueProcess>%aditoprj%/entity/CampaignCost_entitiy/entityfields/user_new/valueProcess.js</valueProcess>
+    </entityField>
+    <entityField>
+      <name>DATE_NEW</name>
+      <mandatory v="true" />
+      <searchable v="false" />
+      <valueProcess>%aditoprj%/entity/CampaignCost_entitiy/entityfields/date_new/valueProcess.js</valueProcess>
+    </entityField>
+    <entityField>
+      <name>USER_EDIT</name>
+      <searchable v="false" />
+      <valueProcess>%aditoprj%/entity/CampaignCost_entitiy/entityfields/user_edit/valueProcess.js</valueProcess>
+    </entityField>
+    <entityField>
+      <name>DATE_EDIT</name>
+      <searchable v="false" />
+      <valueProcess>%aditoprj%/entity/CampaignCost_entitiy/entityfields/date_edit/valueProcess.js</valueProcess>
+    </entityField>
+    <entityProvider>
+      <name>CampaignCosts</name>
+      <fieldType>DEPENDENCY_IN</fieldType>
+      <dependencies>
+        <entityDependency>
+          <name>7131288b-af5c-4914-96f5-c5d70217fc23</name>
+          <entityName>Campaign_entity</entityName>
+          <fieldName>CampaignCosts</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+      </dependencies>
+      <children>
+        <entityParameter>
+          <name>CampaignStepId_param</name>
+          <expose v="false" />
+        </entityParameter>
+        <entityParameter>
+          <name>Uid_param</name>
+          <expose v="false" />
+        </entityParameter>
+        <entityParameter>
+          <name>CampaignId_param</name>
+          <expose v="true" />
+        </entityParameter>
+        <entityParameter>
+          <name>CampaignSteps_param</name>
+          <valueProcess>%aditoprj%/entity/CampaignCost_entitiy/entityfields/campaigncosts/children/campaignsteps_param/valueProcess.js</valueProcess>
+          <expose v="false" />
+        </entityParameter>
+      </children>
+    </entityProvider>
+    <entityProvider>
+      <name>StepCosts</name>
+      <fieldType>DEPENDENCY_IN</fieldType>
+      <dependencies>
+        <entityDependency>
+          <name>af147f3e-a1bd-4eb0-9ac8-325dbdaba17d</name>
+          <entityName>CampaignStep_entity</entityName>
+          <fieldName>CampaignStepCosts</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+        <entityDependency>
+          <name>2a92b738-c0bb-4c14-9915-aff9e18effaf</name>
+          <entityName>Campaign_entity</entityName>
+          <fieldName>CampaignStepCosts</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+      </dependencies>
+      <children>
+        <entityParameter>
+          <name>CampaignStepId_param</name>
+          <expose v="true" />
+        </entityParameter>
+        <entityParameter>
+          <name>Uid_param</name>
+          <expose v="false" />
+        </entityParameter>
+        <entityParameter>
+          <name>CampaignId_param</name>
+          <expose v="true" />
+        </entityParameter>
+        <entityParameter>
+          <name>CampaignSteps_param</name>
+          <valueProcess>%aditoprj%/entity/CampaignCost_entitiy/entityfields/stepcosts/children/campaignsteps_param/valueProcess.js</valueProcess>
+          <expose v="false" />
+        </entityParameter>
+      </children>
+    </entityProvider>
+    <entityConsumer>
+      <name>Campaigns</name>
+      <fieldType>DEPENDENCY_OUT</fieldType>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Campaign_entity</entityName>
+        <fieldName>CampaignProvider</fieldName>
+      </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>CampaignSteps</name>
+      <fieldType>DEPENDENCY_OUT</fieldType>
+      <dependency>
+        <name>dependency</name>
+        <entityName>CampaignStep_entity</entityName>
+        <fieldName>CampaignSteps</fieldName>
+      </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>KeywordCampaignManagementCostCategory</name>
+      <fieldType>DEPENDENCY_OUT</fieldType>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>SpecificContainerKeywords</fieldName>
+      </dependency>
+      <children>
+        <entityParameter>
+          <name>ContainerName_param</name>
+          <valueProcess>%aditoprj%/entity/CampaignCost_entitiy/entityfields/keywordcampaignmanagementcostcategory/children/containername_param/valueProcess.js</valueProcess>
+        </entityParameter>
+        <entityParameter>
+          <name>ExcludedKeyIdsSubquery_param</name>
+          <valueProcess>%aditoprj%/entity/CampaignCost_entitiy/entityfields/keywordcampaignmanagementcostcategory/children/excludedkeyidssubquery_param/valueProcess.js</valueProcess>
+        </entityParameter>
+      </children>
+    </entityConsumer>
+    <entityActionGroup>
+      <name>alter</name>
+      <children>
+        <entityActionField>
+          <name>edit</name>
+          <fieldType>ACTION</fieldType>
+          <onActionProcess>%aditoprj%/entity/CampaignCost_entitiy/entityfields/alter/children/edit/onActionProcess.js</onActionProcess>
+          <isSelectionAction v="true" />
+          <iconId>NEON:PENCIL</iconId>
+        </entityActionField>
+      </children>
+    </entityActionGroup>
+    <entityParameter>
+      <name>CampaignId_param</name>
+      <expose v="true" />
+      <mandatory v="true" />
+      <description>PARAMETER</description>
+    </entityParameter>
+    <entityParameter>
+      <name>CampaignStepId_param</name>
+      <expose v="true" />
+      <description>PARAMETER</description>
+    </entityParameter>
+    <entityParameter>
+      <name>Uid_param</name>
+      <expose v="true" />
+      <description>PARAMETER</description>
+    </entityParameter>
+    <entityField>
+      <name>netPerParticipant</name>
+      <contentType>NUMBER</contentType>
+      <outputFormat>#,##0.00</outputFormat>
+      <state>READONLY</state>
+      <titleProcess>%aditoprj%/entity/CampaignCost_entitiy/entityfields/netperparticipant/titleProcess.js</titleProcess>
+      <valueProcess>%aditoprj%/entity/CampaignCost_entitiy/entityfields/netperparticipant/valueProcess.js</valueProcess>
+    </entityField>
+    <entityField>
+      <name>countParticipants</name>
+      <title>Participants</title>
+      <contentType>NUMBER</contentType>
+      <outputFormat>#0</outputFormat>
+      <state>READONLY</state>
+      <valueProcess>%aditoprj%/entity/CampaignCost_entitiy/entityfields/countparticipants/valueProcess.js</valueProcess>
+    </entityField>
+    <entityParameter>
+      <name>CampaignSteps_param</name>
+      <title></title>
+      <expose v="true" />
+      <documentation>%aditoprj%/entity/CampaignCost_entitiy/entityfields/campaignsteps_param/documentation.adoc</documentation>
+      <description>PARAMETER</description>
+    </entityParameter>
+  </entityFields>
+  <recordContainers>
+    <dbRecordContainer>
+      <name>db</name>
+      <alias>Data_alias</alias>
+      <fromClauseProcess>%aditoprj%/entity/CampaignCost_entitiy/recordcontainers/db/fromClauseProcess.js</fromClauseProcess>
+      <conditionProcess>%aditoprj%/entity/CampaignCost_entitiy/recordcontainers/db/conditionProcess.js</conditionProcess>
+      <orderClauseProcess>%aditoprj%/entity/CampaignCost_entitiy/recordcontainers/db/orderClauseProcess.js</orderClauseProcess>
+      <linkInformation>
+        <linkInformation>
+          <name>70c2db20-0695-4189-92cb-7da585bff401</name>
+          <tableName>CAMPAIGNCOST</tableName>
+          <primaryKey>CAMPAIGNCOSTID</primaryKey>
+          <isUIDTable v="true" />
+          <readonly v="false" />
+        </linkInformation>
+        <linkInformation>
+          <name>b97b7f67-86ea-4d0a-8303-abc05863ed66</name>
+          <tableName>CAMPAIGNSTEP</tableName>
+          <primaryKey>CAMPAIGNSTEPID</primaryKey>
+          <isUIDTable v="false" />
+          <readonly v="true" />
+        </linkInformation>
+      </linkInformation>
+      <recordFieldMappings>
+        <dbRecordFieldMapping>
+          <name>CAMPAIGN_ID.value</name>
+          <recordfield>CAMPAIGNCOST.CAMPAIGN_ID</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>CAMPAIGNCOSTID.value</name>
+          <recordfield>CAMPAIGNCOST.CAMPAIGNCOSTID</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>CAMPAIGNSTEP_ID.value</name>
+          <recordfield>CAMPAIGNCOST.CAMPAIGNSTEP_ID</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>CATEGORY.value</name>
+          <recordfield>CAMPAIGNCOST.CATEGORY</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>DATE_EDIT.value</name>
+          <recordfield>CAMPAIGNCOST.DATE_EDIT</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>DATE_NEW.value</name>
+          <recordfield>CAMPAIGNCOST.DATE_NEW</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>NET.value</name>
+          <recordfield>CAMPAIGNCOST.NET</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>USER_EDIT.value</name>
+          <recordfield>CAMPAIGNCOST.USER_EDIT</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>USER_NEW.value</name>
+          <recordfield>CAMPAIGNCOST.USER_NEW</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>CATEGORY.displayValue</name>
+          <expression>%aditoprj%/entity/CampaignCost_entitiy/recordcontainers/db/recordfieldmappings/category.displayvalue/expression.js</expression>
+        </dbRecordFieldMapping>
+      </recordFieldMappings>
+    </dbRecordContainer>
+  </recordContainers>
+</entity>
diff --git a/entity/CampaignCost_entitiy/afterOperatingState.js b/entity/CampaignCost_entitiy/afterOperatingState.js
new file mode 100644
index 0000000000000000000000000000000000000000..d39336402371a7d3f5db536a2e8ca261fa4e7fe3
--- /dev/null
+++ b/entity/CampaignCost_entitiy/afterOperatingState.js
@@ -0,0 +1,7 @@
+import("system.neon");
+import("system.vars");
+
+if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_VIEW) 
+{
+    neon.refreshAll();
+}
\ No newline at end of file
diff --git a/entity/CampaignCost_entitiy/entityfields/alter/children/edit/onActionProcess.js b/entity/CampaignCost_entitiy/entityfields/alter/children/edit/onActionProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..2f19601f3e8f533982bac2823f085588c6f8dd7e
--- /dev/null
+++ b/entity/CampaignCost_entitiy/entityfields/alter/children/edit/onActionProcess.js
@@ -0,0 +1,7 @@
+import("system.neon");
+import("system.vars");
+
+var params = {
+    "Uid_param" : vars.get("$sys.uid")
+}
+neon.openContext("CampaignCost", "CampaignCostEdit_view", null, neon.OPERATINGSTATE_EDIT, params);
\ No newline at end of file
diff --git a/entity/CampaignCost_entitiy/entityfields/campaign_id/displayValueProcess.js b/entity/CampaignCost_entitiy/entityfields/campaign_id/displayValueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..12ea2ba316a5f6370d042673bc2c79c8019841f4
--- /dev/null
+++ b/entity/CampaignCost_entitiy/entityfields/campaign_id/displayValueProcess.js
@@ -0,0 +1,9 @@
+import("system.result");
+import("system.db");
+import("system.vars");
+import("Campaign_lib");
+
+var campaignId = vars.get("$field.CAMPAIGN_ID");
+var campaignName = CampaignUtils.getCampaignNameById(campaignId);
+
+result.string(campaignName);
\ No newline at end of file
diff --git a/entity/CampaignCost_entitiy/entityfields/campaign_id/valueProcess.js b/entity/CampaignCost_entitiy/entityfields/campaign_id/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..aae29913f6603e7e01072a210fe275d8112fabe2
--- /dev/null
+++ b/entity/CampaignCost_entitiy/entityfields/campaign_id/valueProcess.js
@@ -0,0 +1,8 @@
+import("system.result");
+import("system.neon");
+import("system.vars");
+
+if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && vars.exists("$param.CampaignId_param") && vars.get("$param.CampaignId_param"))
+{
+    result.string(vars.get("$param.CampaignId_param"));
+}
\ No newline at end of file
diff --git a/entity/CampaignCost_entitiy/entityfields/campaigncostid/valueProcess.js b/entity/CampaignCost_entitiy/entityfields/campaigncostid/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..f6b9da922bcaccb0006690f599c1d3cee4d00c55
--- /dev/null
+++ b/entity/CampaignCost_entitiy/entityfields/campaigncostid/valueProcess.js
@@ -0,0 +1,7 @@
+import("system.neon");
+import("system.util");
+import("system.vars");
+import("system.result");
+
+if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW)
+    result.string(util.getNewUUID());
\ No newline at end of file
diff --git a/entity/CampaignCost_entitiy/entityfields/campaigncosts/children/campaignsteps_param/valueProcess.js b/entity/CampaignCost_entitiy/entityfields/campaigncosts/children/campaignsteps_param/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..742074b164130b0dced0dc645104ededc1501e96
--- /dev/null
+++ b/entity/CampaignCost_entitiy/entityfields/campaigncosts/children/campaignsteps_param/valueProcess.js
@@ -0,0 +1,2 @@
+import("system.result");
+result.string(0)
\ No newline at end of file
diff --git a/entity/CampaignCost_entitiy/entityfields/campaignstep_id/displayValueProcess.js b/entity/CampaignCost_entitiy/entityfields/campaignstep_id/displayValueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..ee615b672f09af762e082d55eb0dfae53be9a87d
--- /dev/null
+++ b/entity/CampaignCost_entitiy/entityfields/campaignstep_id/displayValueProcess.js
@@ -0,0 +1,20 @@
+import("system.neon");
+import("system.translate");
+import("system.result");
+import("system.db");
+import("system.vars");
+import("Campaign_lib");
+
+if (vars.get("$sys.recordstate") != neon.OPERATINGSTATE_NEW)
+{
+    var campaignStepId = vars.get("$field.CAMPAIGNSTEP_ID");
+    if (campaignStepId)
+    {
+        var campaignStepName = CampaignUtils.getCampaignStepNameById(campaignStepId);
+        result.string(translate.text("Step") + ": " + campaignStepName);
+    }
+    else
+    {
+            result.string(translate.text("Fix cost"));    
+    }
+}
\ No newline at end of file
diff --git a/entity/CampaignCost_entitiy/entityfields/campaignstep_id/mandatoryProcess.js b/entity/CampaignCost_entitiy/entityfields/campaignstep_id/mandatoryProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..39c2cd139e0d469ba5a2445c0bb53004299c8632
--- /dev/null
+++ b/entity/CampaignCost_entitiy/entityfields/campaignstep_id/mandatoryProcess.js
@@ -0,0 +1,7 @@
+import("system.result");
+import("system.neon");
+import("system.vars");
+
+result.object((vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW &&
+                vars.exists("$param.CampaignSteps_param") && vars.get("$param.CampaignSteps_param") == "1" &&
+                vars.exists("$param.CampaignStepId_param") && !vars.get("$param.CampaignStepId_param")));
diff --git a/entity/CampaignCost_entitiy/entityfields/campaignstep_id/onValueChange.js b/entity/CampaignCost_entitiy/entityfields/campaignstep_id/onValueChange.js
new file mode 100644
index 0000000000000000000000000000000000000000..a7827c48e458d541031e9d65941ade4fc7e0ff16
--- /dev/null
+++ b/entity/CampaignCost_entitiy/entityfields/campaignstep_id/onValueChange.js
@@ -0,0 +1,3 @@
+import("system.neon");
+
+neon.setFieldValue("$field.CATEGORY", "");
\ No newline at end of file
diff --git a/entity/CampaignCost_entitiy/entityfields/campaignstep_id/stateProcess.js b/entity/CampaignCost_entitiy/entityfields/campaignstep_id/stateProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..93d98b6e6e5e4d2e03ce31e3971571940efccc64
--- /dev/null
+++ b/entity/CampaignCost_entitiy/entityfields/campaignstep_id/stateProcess.js
@@ -0,0 +1,13 @@
+import("system.result");
+import("system.neon");
+import("system.vars");
+if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW &&
+    vars.exists("$param.CampaignSteps_param") && vars.get("$param.CampaignSteps_param") == "1" &&
+    vars.exists("$param.CampaignStepId_param") && !vars.get("$param.CampaignStepId_param"))
+{
+    result.string(neon.COMPONENTSTATE_AUTO);
+}
+else
+{
+    result.string(neon.COMPONENTSTATE_INVISIBLE);
+}
\ No newline at end of file
diff --git a/entity/CampaignCost_entitiy/entityfields/campaignstep_id/valueProcess.js b/entity/CampaignCost_entitiy/entityfields/campaignstep_id/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..f4a91495ca4454e2b82cb84d6a7b46761f19c88e
--- /dev/null
+++ b/entity/CampaignCost_entitiy/entityfields/campaignstep_id/valueProcess.js
@@ -0,0 +1,8 @@
+import("system.result");
+import("system.neon");
+import("system.vars");
+
+if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && vars.exists("$param.CampaignStepId_param") && vars.get("$param.CampaignStepId_param"))
+{
+    result.string(vars.get("$param.CampaignStepId_param"));
+}
\ No newline at end of file
diff --git a/entity/CampaignCost_entitiy/entityfields/campaignsteps_param/documentation.adoc b/entity/CampaignCost_entitiy/entityfields/campaignsteps_param/documentation.adoc
new file mode 100644
index 0000000000000000000000000000000000000000..e7434a04e7650f378d9e46cc04b5b0d7518234d3
--- /dev/null
+++ b/entity/CampaignCost_entitiy/entityfields/campaignsteps_param/documentation.adoc
@@ -0,0 +1,2 @@
+if 0: show only fix costs
+if 1: show only campaign steps
\ No newline at end of file
diff --git a/entity/CampaignCost_entitiy/entityfields/category/displayValueProcess.js b/entity/CampaignCost_entitiy/entityfields/category/displayValueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..96536279ef0b858b99687c397622da45f831fa14
--- /dev/null
+++ b/entity/CampaignCost_entitiy/entityfields/category/displayValueProcess.js
@@ -0,0 +1,6 @@
+import("system.result");
+import("system.vars");
+import("Keyword_lib");
+import("KeywordRegistry_basic");
+
+result.string(KeywordUtils.getViewValue($KeywordRegistry.campaignStepCostCategory(), vars.get("$this.value")));
\ No newline at end of file
diff --git a/entity/CampaignCost_entitiy/entityfields/countparticipants/valueProcess.js b/entity/CampaignCost_entitiy/entityfields/countparticipants/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..6952bc19fb1c4532ee3588b899bb4be228e0dc60
--- /dev/null
+++ b/entity/CampaignCost_entitiy/entityfields/countparticipants/valueProcess.js
@@ -0,0 +1,12 @@
+import("system.result");
+import("system.vars");
+import("Campaign_lib");
+
+if (vars.get("$field.CAMPAIGNSTEP_ID"))
+{
+    result.string(CampaignUtils.getParticipantCountForStep(vars.get("$field.CAMPAIGNSTEP_ID")));
+}
+else
+{
+    result.string(CampaignUtils.getParticipantCount(vars.get("$field.CAMPAIGN_ID")));
+}
\ No newline at end of file
diff --git a/entity/CampaignCost_entitiy/entityfields/date_edit/valueProcess.js b/entity/CampaignCost_entitiy/entityfields/date_edit/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..5e6ef059738e0c724a468685333a5e257ac228ce
--- /dev/null
+++ b/entity/CampaignCost_entitiy/entityfields/date_edit/valueProcess.js
@@ -0,0 +1,7 @@
+import("system.util");
+import("system.result");
+import("system.neon");
+import("system.vars");
+
+if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_EDIT)
+    result.string(vars.get("$sys.date"));
\ No newline at end of file
diff --git a/entity/CampaignCost_entitiy/entityfields/date_new/valueProcess.js b/entity/CampaignCost_entitiy/entityfields/date_new/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..a72892783bf2bd04fe353c47f1be0cb570bbb323
--- /dev/null
+++ b/entity/CampaignCost_entitiy/entityfields/date_new/valueProcess.js
@@ -0,0 +1,7 @@
+import("system.util");
+import("system.result");
+import("system.neon");
+import("system.vars");
+
+if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW)
+    result.string(vars.get("$sys.date"));
\ No newline at end of file
diff --git a/entity/CampaignCost_entitiy/entityfields/keywordcampaignmanagementcostcategory/children/containername_param/valueProcess.js b/entity/CampaignCost_entitiy/entityfields/keywordcampaignmanagementcostcategory/children/containername_param/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..7a66c852983ef1afe350b0b1637c9859a85e2421
--- /dev/null
+++ b/entity/CampaignCost_entitiy/entityfields/keywordcampaignmanagementcostcategory/children/containername_param/valueProcess.js
@@ -0,0 +1,4 @@
+import("system.result");
+import("KeywordRegistry_basic");
+
+result.string($KeywordRegistry.campaignStepCostCategory());
\ No newline at end of file
diff --git a/entity/CampaignCost_entitiy/entityfields/keywordcampaignmanagementcostcategory/children/excludedkeyidssubquery_param/valueProcess.js b/entity/CampaignCost_entitiy/entityfields/keywordcampaignmanagementcostcategory/children/excludedkeyidssubquery_param/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..f9fdcc7295ca3443a1ba782155d529cc5f8103a6
--- /dev/null
+++ b/entity/CampaignCost_entitiy/entityfields/keywordcampaignmanagementcostcategory/children/excludedkeyidssubquery_param/valueProcess.js
@@ -0,0 +1,18 @@
+import("system.neon");
+import("system.vars");
+import("system.db");
+import("Sql_lib");
+import("system.result");
+
+var cond = SqlCondition.begin()
+                       .andPrepareVars("CAMPAIGNCOST.CAMPAIGN_ID", "$field.CAMPAIGN_ID");
+
+if (vars.get("$field.CAMPAIGNSTEP_ID"))
+    cond.andPrepareVars("CAMPAIGNCOST.CAMPAIGNSTEP_ID", "$field.CAMPAIGNSTEP_ID");
+else
+    cond.and("CAMPAIGNCOST.CAMPAIGNSTEP_ID is null")
+    
+if (vars.get("$sys.recordstate") != neon.OPERATINGSTATE_NEW)
+    cond.andPrepareVars("CAMPAIGNCOST.CAMPAIGNCOSTID", "$field.CAMPAIGNCOSTID", "# <> ?");
+
+result.string(db.translateStatement(cond.buildSql("select CATEGORY from CAMPAIGNCOST", "1=2", "group by CATEGORY")));
\ No newline at end of file
diff --git a/entity/CampaignCost_entitiy/entityfields/netperparticipant/titleProcess.js b/entity/CampaignCost_entitiy/entityfields/netperparticipant/titleProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..fc36199cca341dd1e3923ebb223ab28f3efa5ccf
--- /dev/null
+++ b/entity/CampaignCost_entitiy/entityfields/netperparticipant/titleProcess.js
@@ -0,0 +1,4 @@
+import("system.translate");
+import("system.result");
+
+result.string(translate.text("Cost") +  " " + translate.text("per") + " "  + translate.text("Participant"));
\ No newline at end of file
diff --git a/entity/CampaignCost_entitiy/entityfields/netperparticipant/valueProcess.js b/entity/CampaignCost_entitiy/entityfields/netperparticipant/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..f3dedbcae4b8b310a011af1104b8706b3421998b
--- /dev/null
+++ b/entity/CampaignCost_entitiy/entityfields/netperparticipant/valueProcess.js
@@ -0,0 +1,11 @@
+import("system.vars");
+import("system.result");
+import("system.eMath");
+
+var netto = parseFloat(vars.get("$field.NET"));
+var countParticipants = parseFloat(vars.get("$field.countParticipants"));
+
+if (netto && countParticipants &&countParticipants > 0)
+    result.string(eMath.roundDec(netto / countParticipants, 2, eMath.ROUND_HALF_UP));
+else
+    result.string(0);
\ No newline at end of file
diff --git a/entity/CampaignCost_entitiy/entityfields/stepcosts/children/campaignsteps_param/valueProcess.js b/entity/CampaignCost_entitiy/entityfields/stepcosts/children/campaignsteps_param/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..0488a23572b30f97174720a23726a09b8b266381
--- /dev/null
+++ b/entity/CampaignCost_entitiy/entityfields/stepcosts/children/campaignsteps_param/valueProcess.js
@@ -0,0 +1,3 @@
+import("system.result");
+
+result.string(1);
\ No newline at end of file
diff --git a/entity/CampaignCost_entitiy/entityfields/user_edit/valueProcess.js b/entity/CampaignCost_entitiy/entityfields/user_edit/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..6af880ae3e0e2b89b4eee8327ed49f1eefe458af
--- /dev/null
+++ b/entity/CampaignCost_entitiy/entityfields/user_edit/valueProcess.js
@@ -0,0 +1,7 @@
+import("system.util");
+import("system.result");
+import("system.neon");
+import("system.vars");
+
+if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_EDIT)
+    result.string(vars.get("$sys.user"));
\ No newline at end of file
diff --git a/entity/CampaignCost_entitiy/entityfields/user_new/valueProcess.js b/entity/CampaignCost_entitiy/entityfields/user_new/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..e518bc75a9494e53a83613dedd943106e74fc00a
--- /dev/null
+++ b/entity/CampaignCost_entitiy/entityfields/user_new/valueProcess.js
@@ -0,0 +1,7 @@
+import("system.util");
+import("system.result");
+import("system.neon");
+import("system.vars");
+
+if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW)
+    result.string(vars.get("$sys.user"));
\ No newline at end of file
diff --git a/entity/CampaignCost_entitiy/recordcontainers/db/conditionProcess.js b/entity/CampaignCost_entitiy/recordcontainers/db/conditionProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..ff7f94167b0fbafce7189b2facf299ae60849832
--- /dev/null
+++ b/entity/CampaignCost_entitiy/recordcontainers/db/conditionProcess.js
@@ -0,0 +1,22 @@
+import("system.vars");
+import("system.db");
+import("system.result");
+import("Sql_lib");
+
+var cond = SqlCondition.begin()
+                       .andPrepareVars("CAMPAIGNCOST.CAMPAIGNCOSTID", "$param.Uid_param")
+                       .andPrepareVars("CAMPAIGNCOST.CAMPAIGN_ID", "$param.CampaignId_param")
+                       .andPrepareVars("CAMPAIGNCOST.CAMPAIGNSTEP_ID", "$param.CampaignStepId_param");
+                       
+if (vars.exists("$param.CampaignSteps_param") && vars.get("$param.CampaignSteps_param") == "1")
+{
+    // only step costs
+    cond.and("CAMPAIGNCOST.CAMPAIGNSTEP_ID is not null");
+}
+else
+{
+    // only fix costs
+    cond.and("CAMPAIGNCOST.CAMPAIGNSTEP_ID is null");
+}
+
+result.string(db.translateCondition(cond.build("1=2")));
\ No newline at end of file
diff --git a/entity/CampaignCost_entitiy/recordcontainers/db/fromClauseProcess.js b/entity/CampaignCost_entitiy/recordcontainers/db/fromClauseProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..4d95079d7cb044ddab9f1e475e6921ec8dcfb2f9
--- /dev/null
+++ b/entity/CampaignCost_entitiy/recordcontainers/db/fromClauseProcess.js
@@ -0,0 +1,3 @@
+import("system.result");
+
+result.string("CAMPAIGNCOST left join CAMPAIGNSTEP on CAMPAIGNCOST.CAMPAIGNSTEP_ID = CAMPAIGNSTEP.CAMPAIGNSTEPID")
\ No newline at end of file
diff --git a/entity/CampaignCost_entitiy/recordcontainers/db/orderClauseProcess.js b/entity/CampaignCost_entitiy/recordcontainers/db/orderClauseProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..8538a702d13027d9d9739d9b6652105b87725638
--- /dev/null
+++ b/entity/CampaignCost_entitiy/recordcontainers/db/orderClauseProcess.js
@@ -0,0 +1,4 @@
+import("system.result");
+import("system.db");
+
+result.object({"CAMPAIGNSTEP.SORTING": db.ASCENDING});
\ No newline at end of file
diff --git a/entity/CampaignCost_entitiy/recordcontainers/db/recordfieldmappings/category.displayvalue/expression.js b/entity/CampaignCost_entitiy/recordcontainers/db/recordfieldmappings/category.displayvalue/expression.js
new file mode 100644
index 0000000000000000000000000000000000000000..3aa7368fd41339c1bd48a4951acb4ff54b12ef58
--- /dev/null
+++ b/entity/CampaignCost_entitiy/recordcontainers/db/recordfieldmappings/category.displayvalue/expression.js
@@ -0,0 +1,6 @@
+import("system.result");
+import("Keyword_lib");
+import("KeywordRegistry_basic");
+
+var sql = KeywordUtils.getResolvedTitleSqlPart($KeywordRegistry.campaignStepCostCategory(), "CAMPAIGNCOST.CATEGORY");
+result.string(sql);
\ No newline at end of file
diff --git a/entity/CampaignParticipant_entity/CampaignParticipant_entity.aod b/entity/CampaignParticipant_entity/CampaignParticipant_entity.aod
new file mode 100644
index 0000000000000000000000000000000000000000..6615e8ac0eb58972ef9024c123fd54bc4662382a
--- /dev/null
+++ b/entity/CampaignParticipant_entity/CampaignParticipant_entity.aod
@@ -0,0 +1,244 @@
+<?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.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.2">
+  <name>CampaignParticipant_entity</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <afterOperatingState>%aditoprj%/entity/CampaignParticipant_entity/afterOperatingState.js</afterOperatingState>
+  <recordContainer>ParticipantsDbRecordContainer</recordContainer>
+  <entityFields>
+    <entityProvider>
+      <name>#PROVIDER</name>
+    </entityProvider>
+    <entityProvider>
+      <name>CampaignParticipantsProvider</name>
+      <fieldType>DEPENDENCY_IN</fieldType>
+      <targetContextField>CONTACTCONTEXT</targetContextField>
+      <targetIdField>CONTACT_ID</targetIdField>
+      <dependencies>
+        <entityDependency>
+          <name>f28945cd-4613-4dfa-91f7-a7d9d64cef58</name>
+          <entityName>Campaign_entity</entityName>
+          <fieldName>CampaignParticipants</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+        <entityDependency>
+          <name>7ad08378-b36f-4512-8891-db727c6ddcd7</name>
+          <entityName>CampaignStep_entity</entityName>
+          <fieldName>CampaignParticipantsConsumer</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+      </dependencies>
+      <children>
+        <entityParameter>
+          <name>ContactId_param</name>
+          <expose v="true" />
+        </entityParameter>
+        <entityParameter>
+          <name>CampaignId_param</name>
+          <expose v="true" />
+        </entityParameter>
+        <entityParameter>
+          <name>CampaignStepId_param</name>
+          <valueProcess>%aditoprj%/entity/CampaignParticipant_entity/entityfields/campaignparticipantsprovider/children/campaignstepid_param/valueProcess.js</valueProcess>
+          <expose v="true" />
+        </entityParameter>
+      </children>
+    </entityProvider>
+    <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>
+    <entityField>
+      <name>CAMPAIGNPARTICIPANTID</name>
+      <valueProcess>%aditoprj%/entity/CampaignParticipant_entity/entityfields/campaignparticipantid/valueProcess.js</valueProcess>
+    </entityField>
+    <entityField>
+      <name>CAMPAIGN_ID</name>
+      <title>Campaign</title>
+      <consumer>CampaignsConsumer</consumer>
+      <mandatory v="true" />
+      <state>EDITABLE</state>
+      <stateProcess>%aditoprj%/entity/CampaignParticipant_entity/entityfields/campaign_id/stateProcess.js</stateProcess>
+      <valueProcess>%aditoprj%/entity/CampaignParticipant_entity/entityfields/campaign_id/valueProcess.js</valueProcess>
+      <displayValueProcess>%aditoprj%/entity/CampaignParticipant_entity/entityfields/campaign_id/displayValueProcess.js</displayValueProcess>
+      <onValueChange>%aditoprj%/entity/CampaignParticipant_entity/entityfields/campaign_id/onValueChange.js</onValueChange>
+      <onValueChangeTypes>
+        <element>MASK</element>
+        <element>PROCESS</element>
+      </onValueChangeTypes>
+    </entityField>
+    <entityField>
+      <name>CAMPAIGNSTEP_ID</name>
+      <title>Campaign Step</title>
+      <consumer>CampaignSteps</consumer>
+      <mandatory v="true" />
+      <state>EDITABLE</state>
+      <displayValueProcess>%aditoprj%/entity/CampaignParticipant_entity/entityfields/campaignstep_id/displayValueProcess.js</displayValueProcess>
+      <onValueChange>%aditoprj%/entity/CampaignParticipant_entity/entityfields/campaignstep_id/onValueChange.js</onValueChange>
+      <onValueChangeTypes>
+        <element>MASK</element>
+        <element>PROCESS</element>
+        <element>PROCESS_SETVALUE</element>
+      </onValueChangeTypes>
+    </entityField>
+    <entityConsumer>
+      <name>CampaignsConsumer</name>
+      <title>Campaign</title>
+      <fieldType>DEPENDENCY_OUT</fieldType>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Campaign_entity</entityName>
+        <fieldName>CampaignProvider</fieldName>
+      </dependency>
+    </entityConsumer>
+    <entityParameter>
+      <name>ContactId_param</name>
+      <expose v="true" />
+      <triggerRecalculation v="true" />
+      <description>PARAMETER</description>
+    </entityParameter>
+    <entityField>
+      <name>CONTACT_ID</name>
+      <title>Participant</title>
+      <consumer>AnyContacts</consumer>
+      <linkedContextProcess>%aditoprj%/entity/CampaignParticipant_entity/entityfields/contact_id/linkedContextProcess.js</linkedContextProcess>
+      <mandatory v="true" />
+      <state>READONLY</state>
+      <stateProcess>%aditoprj%/entity/CampaignParticipant_entity/entityfields/contact_id/stateProcess.js</stateProcess>
+      <valueProcess>%aditoprj%/entity/CampaignParticipant_entity/entityfields/contact_id/valueProcess.js</valueProcess>
+      <displayValueProcess>%aditoprj%/entity/CampaignParticipant_entity/entityfields/contact_id/displayValueProcess.js</displayValueProcess>
+    </entityField>
+    <entityField>
+      <name>DATE_NEW</name>
+      <valueProcess>%aditoprj%/entity/CampaignParticipant_entity/entityfields/date_new/valueProcess.js</valueProcess>
+    </entityField>
+    <entityField>
+      <name>USER_NEW</name>
+      <valueProcess>%aditoprj%/entity/CampaignParticipant_entity/entityfields/user_new/valueProcess.js</valueProcess>
+    </entityField>
+    <entityField>
+      <name>DATE_EDIT</name>
+    </entityField>
+    <entityField>
+      <name>USER_EDIT</name>
+    </entityField>
+    <entityConsumer>
+      <name>AnyContacts</name>
+      <fieldType>DEPENDENCY_OUT</fieldType>
+      <dependency>
+        <name>dependency</name>
+        <entityName>AnyContact_entity</entityName>
+        <fieldName>#PROVIDER</fieldName>
+      </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>CampaignSteps</name>
+      <fieldType>DEPENDENCY_OUT</fieldType>
+      <dependency>
+        <name>dependency</name>
+        <entityName>CampaignStep_entity</entityName>
+        <fieldName>CampaignSteps</fieldName>
+      </dependency>
+      <children>
+        <entityParameter>
+          <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>
+    <entityField>
+      <name>CONTACTCONTEXT</name>
+      <valueProcess>%aditoprj%/entity/CampaignParticipant_entity/entityfields/contactcontext/valueProcess.js</valueProcess>
+    </entityField>
+    <entityActionGroup>
+      <name>FilterViewActionGroup</name>
+      <children>
+        <entityActionField>
+          <name>SetStepToParticipantSelection</name>
+          <fieldType>ACTION</fieldType>
+          <title>Set campaign step</title>
+          <onActionProcess>%aditoprj%/entity/CampaignParticipant_entity/entityfields/filterviewactiongroup/children/setsteptoparticipantselection/onActionProcess.js</onActionProcess>
+          <isObjectAction v="false" />
+          <isSelectionAction v="true" />
+          <iconId>NEON:GROUP_APPOINTMENT</iconId>
+        </entityActionField>
+      </children>
+    </entityActionGroup>
+    <entityField>
+      <name>campaignStepCurrentParticipantCount</name>
+      <title>Current participants</title>
+      <displayValueProcess>%aditoprj%/entity/CampaignParticipant_entity/entityfields/campaignstepcurrentparticipantcount/displayValueProcess.js</displayValueProcess>
+    </entityField>
+    <entityField>
+      <name>campaignStepMaxParticipantCount</name>
+      <title>Max participants</title>
+      <displayValueProcess>%aditoprj%/entity/CampaignParticipant_entity/entityfields/campaignstepmaxparticipantcount/displayValueProcess.js</displayValueProcess>
+    </entityField>
+  </entityFields>
+  <recordContainers>
+    <dbRecordContainer>
+      <name>ParticipantsDbRecordContainer</name>
+      <alias>Data_alias</alias>
+      <conditionProcess>%aditoprj%/entity/CampaignParticipant_entity/recordcontainers/participantsdbrecordcontainer/conditionProcess.js</conditionProcess>
+      <onDBInsert>%aditoprj%/entity/CampaignParticipant_entity/recordcontainers/participantsdbrecordcontainer/onDBInsert.js</onDBInsert>
+      <linkInformation>
+        <linkInformation>
+          <name>12b5bf2e-e376-4c40-9799-fb07961a455d</name>
+          <tableName>CAMPAIGNPARTICIPANT</tableName>
+          <primaryKey>CAMPAIGNPARTICIPANTID</primaryKey>
+          <isUIDTable v="true" />
+          <readonly v="false" />
+        </linkInformation>
+      </linkInformation>
+      <recordFieldMappings>
+        <dbRecordFieldMapping>
+          <name>CAMPAIGNPARTICIPANT_ID.value</name>
+          <recordfield>CAMPAIGNPARTICIPANT.CAMPAIGNPARTICIPANTID</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>CAMPAIGN_ID.value</name>
+          <recordfield>CAMPAIGNPARTICIPANT.CAMPAIGN_ID</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>CAMPAIGNPARTICIPANTID.value</name>
+          <recordfield>CAMPAIGNPARTICIPANT.CAMPAIGNPARTICIPANTID</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>CAMPAIGNSTEP_ID.value</name>
+          <recordfield>CAMPAIGNPARTICIPANT.CAMPAIGNSTEP_ID</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>CONTACT_ID.value</name>
+          <recordfield>CAMPAIGNPARTICIPANT.CONTACT_ID</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>DATE_EDIT.value</name>
+          <recordfield>CAMPAIGNPARTICIPANT.DATE_EDIT</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>DATE_NEW.value</name>
+          <recordfield>CAMPAIGNPARTICIPANT.DATE_NEW</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>USER_EDIT.value</name>
+          <recordfield>CAMPAIGNPARTICIPANT.USER_EDIT</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>USER_NEW.value</name>
+          <recordfield>CAMPAIGNPARTICIPANT.USER_NEW</recordfield>
+        </dbRecordFieldMapping>
+      </recordFieldMappings>
+    </dbRecordContainer>
+  </recordContainers>
+</entity>
diff --git a/entity/CampaignParticipant_entity/afterOperatingState.js b/entity/CampaignParticipant_entity/afterOperatingState.js
new file mode 100644
index 0000000000000000000000000000000000000000..d39336402371a7d3f5db536a2e8ca261fa4e7fe3
--- /dev/null
+++ b/entity/CampaignParticipant_entity/afterOperatingState.js
@@ -0,0 +1,7 @@
+import("system.neon");
+import("system.vars");
+
+if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_VIEW) 
+{
+    neon.refreshAll();
+}
\ No newline at end of file
diff --git a/entity/CampaignParticipant_entity/entityfields/campaign_id/displayValueProcess.js b/entity/CampaignParticipant_entity/entityfields/campaign_id/displayValueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..12ea2ba316a5f6370d042673bc2c79c8019841f4
--- /dev/null
+++ b/entity/CampaignParticipant_entity/entityfields/campaign_id/displayValueProcess.js
@@ -0,0 +1,9 @@
+import("system.result");
+import("system.db");
+import("system.vars");
+import("Campaign_lib");
+
+var campaignId = vars.get("$field.CAMPAIGN_ID");
+var campaignName = CampaignUtils.getCampaignNameById(campaignId);
+
+result.string(campaignName);
\ No newline at end of file
diff --git a/entity/CampaignParticipant_entity/entityfields/campaign_id/onValueChange.js b/entity/CampaignParticipant_entity/entityfields/campaign_id/onValueChange.js
new file mode 100644
index 0000000000000000000000000000000000000000..914e1ea09b29d039e3c94536843f6c2d6186c4a2
--- /dev/null
+++ b/entity/CampaignParticipant_entity/entityfields/campaign_id/onValueChange.js
@@ -0,0 +1,7 @@
+import("system.neon");
+import("system.logging");
+import("Campaign_lib");
+import("system.vars");
+
+var stepId = CampaignUtils.getDefaultCampaignStep(vars.get("$field.CAMPAIGN_ID"));
+neon.setFieldValue("$field.CAMPAIGNSTEP_ID", stepId);
\ No newline at end of file
diff --git a/entity/CampaignParticipant_entity/entityfields/campaign_id/stateProcess.js b/entity/CampaignParticipant_entity/entityfields/campaign_id/stateProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..08bb8ede9acc54fa91f0ae1b22db90a5f61cea36
--- /dev/null
+++ b/entity/CampaignParticipant_entity/entityfields/campaign_id/stateProcess.js
@@ -0,0 +1,9 @@
+import("system.neon");
+import("system.result");
+import("system.vars");
+import("system.logging");
+
+if(vars.exists("$param.CampaignId_param") && vars.get("$param.CampaignId_param") != "")
+    result.string(neon.COMPONENTSTATE_READONLY);
+else
+    result.string(neon.COMPONENTSTATE_EDITABLE);
\ No newline at end of file
diff --git a/entity/CampaignParticipant_entity/entityfields/campaign_id/valueProcess.js b/entity/CampaignParticipant_entity/entityfields/campaign_id/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..619a4eb3879036407125c0a0f51cf0419a54b1fc
--- /dev/null
+++ b/entity/CampaignParticipant_entity/entityfields/campaign_id/valueProcess.js
@@ -0,0 +1,9 @@
+import("system.neon");
+import("system.result");
+import("system.vars");
+
+if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && 
+    vars.exists("$param.CampaignId_param") && vars.get("$param.CampaignId_param"))
+    {
+        result.string(vars.get("$param.CampaignId_param"));
+    }
\ No newline at end of file
diff --git a/entity/CampaignParticipant_entity/entityfields/campaignparticipantid/valueProcess.js b/entity/CampaignParticipant_entity/entityfields/campaignparticipantid/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..f6b9da922bcaccb0006690f599c1d3cee4d00c55
--- /dev/null
+++ b/entity/CampaignParticipant_entity/entityfields/campaignparticipantid/valueProcess.js
@@ -0,0 +1,7 @@
+import("system.neon");
+import("system.util");
+import("system.vars");
+import("system.result");
+
+if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW)
+    result.string(util.getNewUUID());
\ No newline at end of file
diff --git a/entity/CampaignParticipant_entity/entityfields/campaignparticipantsprovider/children/campaignstepid_param/valueProcess.js b/entity/CampaignParticipant_entity/entityfields/campaignparticipantsprovider/children/campaignstepid_param/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/entity/CampaignParticipant_entity/entityfields/campaignstep_id/displayValueProcess.js b/entity/CampaignParticipant_entity/entityfields/campaignstep_id/displayValueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..e99107695ed42802fee2490b171383bdc2de6ea6
--- /dev/null
+++ b/entity/CampaignParticipant_entity/entityfields/campaignstep_id/displayValueProcess.js
@@ -0,0 +1,7 @@
+import("system.logging");
+import("system.vars");
+import("system.db");
+import("system.result");
+
+logging.log("campaignstep_idim displayvalue -> " + vars.get("$field.CAMPAIGNSTEP_ID"));
+result.string(db.cell("select NAME from CAMPAIGNSTEP where CAMPAIGNSTEPID = '" + vars.get("$field.CAMPAIGNSTEP_ID") + "'"));
\ No newline at end of file
diff --git a/entity/CampaignParticipant_entity/entityfields/campaignstep_id/onValueChange.js b/entity/CampaignParticipant_entity/entityfields/campaignstep_id/onValueChange.js
new file mode 100644
index 0000000000000000000000000000000000000000..786b3ee87f36dd8cee13c107c0ba28bc76dc008c
--- /dev/null
+++ b/entity/CampaignParticipant_entity/entityfields/campaignstep_id/onValueChange.js
@@ -0,0 +1,3 @@
+import("system.vars");
+import("system.logging");
+logging.log("campaignstep_id im onValueChange -> " + vars.get("$field.CAMPAIGNSTEP_ID"));
\ No newline at end of file
diff --git a/entity/CampaignParticipant_entity/entityfields/campaignstepcurrentparticipantcount/displayValueProcess.js b/entity/CampaignParticipant_entity/entityfields/campaignstepcurrentparticipantcount/displayValueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..d001f813402438ca1481d4c2fd03c94b4b341de6
--- /dev/null
+++ b/entity/CampaignParticipant_entity/entityfields/campaignstepcurrentparticipantcount/displayValueProcess.js
@@ -0,0 +1,5 @@
+import("system.result");
+import("system.vars");
+import("Campaign_lib");
+
+result.string(CampaignUtils.getParticipantCountForStep(vars.get("$field.CAMPAIGNSTEP_ID")));
\ No newline at end of file
diff --git a/entity/CampaignParticipant_entity/entityfields/campaignstepmaxparticipantcount/displayValueProcess.js b/entity/CampaignParticipant_entity/entityfields/campaignstepmaxparticipantcount/displayValueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..cc8e454b27deee27b34ccb9e12c08f4e767c065f
--- /dev/null
+++ b/entity/CampaignParticipant_entity/entityfields/campaignstepmaxparticipantcount/displayValueProcess.js
@@ -0,0 +1,5 @@
+import("system.result");
+import("system.vars");
+import("Campaign_lib");
+
+result.string(CampaignUtils.getMaxParticipantCountForStep(vars.get("$field.CAMPAIGNSTEP_ID")));
\ No newline at end of file
diff --git a/entity/CampaignParticipant_entity/entityfields/campaignsteps/children/campaignid_param/valueProcess.js b/entity/CampaignParticipant_entity/entityfields/campaignsteps/children/campaignid_param/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..c05a7b59b563a7c1fd3b5cd7f7905c60ee7cbe09
--- /dev/null
+++ b/entity/CampaignParticipant_entity/entityfields/campaignsteps/children/campaignid_param/valueProcess.js
@@ -0,0 +1,3 @@
+import("system.vars");
+import("system.result");
+result.string(vars.get("$field.CAMPAIGN_ID"));
\ No newline at end of file
diff --git a/entity/CampaignParticipant_entity/entityfields/contact_id/displayValueProcess.js b/entity/CampaignParticipant_entity/entityfields/contact_id/displayValueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..c79f958b803960d5ec825a4f567d82d44c9a20e4
--- /dev/null
+++ b/entity/CampaignParticipant_entity/entityfields/contact_id/displayValueProcess.js
@@ -0,0 +1,16 @@
+import("system.logging");
+import("system.result");
+import("system.vars");
+import("Contact_lib");
+import("system.neon");
+
+logging.log("contactid displayvalueValueProcess -> " + vars.getString("$field.CONTACT_ID"));
+
+
+let contactId = vars.getString("$field.CONTACT_ID");
+let displayValue = "";
+    
+if(contactId != "")
+    displayValue = ContactUtils.getFullTitleByContactId(contactId);
+
+result.string(displayValue);
diff --git a/entity/CampaignParticipant_entity/entityfields/contact_id/linkedContextProcess.js b/entity/CampaignParticipant_entity/entityfields/contact_id/linkedContextProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..6e599325755a49424ba25051c71e5367e50c3be9
--- /dev/null
+++ b/entity/CampaignParticipant_entity/entityfields/contact_id/linkedContextProcess.js
@@ -0,0 +1,6 @@
+import("system.logging");
+import("system.vars");
+import("system.result");
+import("Contact_lib");
+
+result.string(ContactUtils.getContextByContactId(vars.getString("$field.CONTACT_ID")));
\ No newline at end of file
diff --git a/entity/CampaignParticipant_entity/entityfields/contact_id/stateProcess.js b/entity/CampaignParticipant_entity/entityfields/contact_id/stateProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..5b6862597686b505239e46fb2e47034e558fa50c
--- /dev/null
+++ b/entity/CampaignParticipant_entity/entityfields/contact_id/stateProcess.js
@@ -0,0 +1,12 @@
+import("system.result");
+import("system.neon");
+import("system.vars");
+
+if(vars.exists("$param.ContactId_param") && vars.get("$param.ContactId_param"))
+    //A contact has been provided. Show it in readonly.
+    fieldState = neon.COMPONENTSTATE_READONLY;
+else
+    //No contact has been provided, therefore let the user select one.
+    fieldState = neon.COMPONENTSTATE_EDITABLE;
+    
+result.string(fieldState);
\ No newline at end of file
diff --git a/entity/CampaignParticipant_entity/entityfields/contact_id/valueProcess.js b/entity/CampaignParticipant_entity/entityfields/contact_id/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..a84578985ef42c5c0b1b7f9aef780bc586864a38
--- /dev/null
+++ b/entity/CampaignParticipant_entity/entityfields/contact_id/valueProcess.js
@@ -0,0 +1,7 @@
+import("system.logging");
+import("system.result");
+import("system.vars");
+
+logging.log("$param.ContactId_param -> " + vars.get("$param.ContactId_param"));
+if(vars.exists("$param.ContactId_param") && vars.get("$param.ContactId_param"))
+    result.string(vars.get("$param.ContactId_param"));
\ No newline at end of file
diff --git a/entity/CampaignParticipant_entity/entityfields/contactcontext/valueProcess.js b/entity/CampaignParticipant_entity/entityfields/contactcontext/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..2e504d63e3b5a3f71b54b072798b3ad09c50984b
--- /dev/null
+++ b/entity/CampaignParticipant_entity/entityfields/contactcontext/valueProcess.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/CampaignParticipant_entity/entityfields/date_new/valueProcess.js b/entity/CampaignParticipant_entity/entityfields/date_new/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..a72892783bf2bd04fe353c47f1be0cb570bbb323
--- /dev/null
+++ b/entity/CampaignParticipant_entity/entityfields/date_new/valueProcess.js
@@ -0,0 +1,7 @@
+import("system.util");
+import("system.result");
+import("system.neon");
+import("system.vars");
+
+if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW)
+    result.string(vars.get("$sys.date"));
\ No newline at end of file
diff --git a/entity/CampaignParticipant_entity/entityfields/filterviewactiongroup/children/setsteptoparticipantselection/onActionProcess.js b/entity/CampaignParticipant_entity/entityfields/filterviewactiongroup/children/setsteptoparticipantselection/onActionProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..4e09ec798a27900e7e2ffeb2cb819458feb470a4
--- /dev/null
+++ b/entity/CampaignParticipant_entity/entityfields/filterviewactiongroup/children/setsteptoparticipantselection/onActionProcess.js
@@ -0,0 +1,14 @@
+import("system.logging");
+import("system.vars");
+import("system.neon");
+import("Campaign_lib");
+logging.log("inOnAction -> ");
+    logging.log("sys selection -> " + vars.get("$sys.selection"));
+if(vars.exists("$sys.selection")) //selektierte IDs als Array
+{
+    logging.log("campaignid -> " + vars.get("$field.CAMPAIGN_ID"));
+    logging.log("campaignstepid -> " + vars.get("$field.CAMPAIGNSTEP_ID"));
+    logging.log("contact id -> " + vars.get("$field.CONTACT_ID"));
+    logging.log("sys selection -> " + vars.get("$sys.selection"));
+    CampaignUtils.openSetCampaignStepView(vars.get("$sys.selection"), vars.get("$field.CAMPAIGN_ID"), vars.get("$field.CAMPAIGNSTEP_ID"));
+}
\ No newline at end of file
diff --git a/entity/CampaignParticipant_entity/entityfields/selectedcampaign/onValueChange.js b/entity/CampaignParticipant_entity/entityfields/selectedcampaign/onValueChange.js
new file mode 100644
index 0000000000000000000000000000000000000000..42ea3ef828ff969d88c3c4752232117c7f7e7e89
--- /dev/null
+++ b/entity/CampaignParticipant_entity/entityfields/selectedcampaign/onValueChange.js
@@ -0,0 +1,4 @@
+import("system.neon");
+
+
+neon.setFieldValue("$field.SYSTEMTEMPLATE", templateId);
\ No newline at end of file
diff --git a/entity/CampaignParticipant_entity/entityfields/user_new/valueProcess.js b/entity/CampaignParticipant_entity/entityfields/user_new/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..e518bc75a9494e53a83613dedd943106e74fc00a
--- /dev/null
+++ b/entity/CampaignParticipant_entity/entityfields/user_new/valueProcess.js
@@ -0,0 +1,7 @@
+import("system.util");
+import("system.result");
+import("system.neon");
+import("system.vars");
+
+if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW)
+    result.string(vars.get("$sys.user"));
\ No newline at end of file
diff --git a/entity/CampaignParticipant_entity/recordcontainers/participantsdbrecordcontainer/conditionProcess.js b/entity/CampaignParticipant_entity/recordcontainers/participantsdbrecordcontainer/conditionProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..db030eee9a91a5eae552c5cb328e8d26cfdb4eb5
--- /dev/null
+++ b/entity/CampaignParticipant_entity/recordcontainers/participantsdbrecordcontainer/conditionProcess.js
@@ -0,0 +1,19 @@
+import("system.logging");
+import("system.result");
+import("system.vars");
+
+var resultValue;
+if(vars.get("$param.CampaignId_param") != null && vars.get("$param.CampaignId_param") != "")
+{
+    resultValue = "CAMPAIGN_ID = '" + vars.get("$param.CampaignId_param") + "'";
+    
+    if(vars.get("$param.CampaignStepId_param") != null && vars.get("$param.CampaignStepId_param") != "")
+        resultValue += " AND CAMPAIGNSTEP_ID = '" + vars.get("$param.CampaignStepId_param") + "'";
+    
+    result.string(resultValue);
+}
+else if(vars.get("$param.CampaignStepId_param") != null && vars.get("$param.CampaignStepId_param") != "")
+    {
+        resultValue = "CAMPAIGNSTEP_ID = '" + vars.get("$param.CampaignStepId_param") + "'";
+        result.string(resultValue);
+    }
\ No newline at end of file
diff --git a/entity/CampaignParticipant_entity/recordcontainers/participantsdbrecordcontainer/onDBInsert.js b/entity/CampaignParticipant_entity/recordcontainers/participantsdbrecordcontainer/onDBInsert.js
new file mode 100644
index 0000000000000000000000000000000000000000..c6903032cc3a3689f688dba12ac13a56c5da533c
--- /dev/null
+++ b/entity/CampaignParticipant_entity/recordcontainers/participantsdbrecordcontainer/onDBInsert.js
@@ -0,0 +1,9 @@
+import("system.vars");
+import("Campaign_lib");
+
+var campaignId = vars.get("$field.CAMPAIGN_ID");
+var campaignStepId = vars.get("$field.CAMPAIGNSTEP_ID");
+var contactId = vars.get("$field.CONTACT_ID");
+var campaignParticipantId = vars.get("$field.CAMPAIGNPARTICIPANTID");
+
+CampaignUtils.createLogEntry(campaignId, campaignStepId, contactId, campaignParticipantId);
\ No newline at end of file
diff --git a/entity/CampaignStep_entity/CampaignStep_entity.aod b/entity/CampaignStep_entity/CampaignStep_entity.aod
new file mode 100644
index 0000000000000000000000000000000000000000..e26c5f83d6da803c7737f361b6e46536217fa0d6
--- /dev/null
+++ b/entity/CampaignStep_entity/CampaignStep_entity.aod
@@ -0,0 +1,324 @@
+<?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.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.2">
+  <name>CampaignStep_entity</name>
+  <title>Campaign Step</title>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <icon>NEON:GROUP_APPOINTMENT</icon>
+  <titleProcess>%aditoprj%/entity/CampaignStep_entity/titleProcess.js</titleProcess>
+  <recordContainer>db</recordContainer>
+  <entityFields>
+    <entityProvider>
+      <name>#PROVIDER</name>
+    </entityProvider>
+    <entityField>
+      <name>CAMPAIGNSTEPID</name>
+      <mandatory v="true" />
+      <valueProcess>%aditoprj%/entity/CampaignStep_entity/entityfields/campaignstepid/valueProcess.js</valueProcess>
+    </entityField>
+    <entityField>
+      <name>CAMPAIGN_ID</name>
+      <title>Campaign</title>
+      <consumer>CampaignConsumer</consumer>
+      <linkedContext>Campaign</linkedContext>
+      <mandatory v="true" />
+      <valueProcess>%aditoprj%/entity/CampaignStep_entity/entityfields/campaign_id/valueProcess.js</valueProcess>
+      <displayValueProcess>%aditoprj%/entity/CampaignStep_entity/entityfields/campaign_id/displayValueProcess.js</displayValueProcess>
+    </entityField>
+    <entityField>
+      <name>EMPLOYEE_CONTACT_ID</name>
+      <title>Zuständiger</title>
+      <consumer>Employees</consumer>
+      <mandatory v="true" />
+      <valueProcess>%aditoprj%/entity/CampaignStep_entity/entityfields/employee_contact_id/valueProcess.js</valueProcess>
+      <displayValueProcess>%aditoprj%/entity/CampaignStep_entity/entityfields/employee_contact_id/displayValueProcess.js</displayValueProcess>
+    </entityField>
+    <entityField>
+      <name>NAME</name>
+      <title>Name</title>
+      <mandatory v="true" />
+    </entityField>
+    <entityField>
+      <name>DATE_START</name>
+      <title>Beginn</title>
+      <contentType>DATE</contentType>
+      <resolution>DAY</resolution>
+      <outputFormat>dd.MM.yyyy</outputFormat>
+      <mandatory v="true" />
+      <valueProcess>%aditoprj%/entity/CampaignStep_entity/entityfields/date_start/valueProcess.js</valueProcess>
+      <onValidation>%aditoprj%/entity/CampaignStep_entity/entityfields/date_start/onValidation.js</onValidation>
+      <onValueChange>%aditoprj%/entity/CampaignStep_entity/entityfields/date_start/onValueChange.js</onValueChange>
+    </entityField>
+    <entityField>
+      <name>DATE_END</name>
+      <title>Ende</title>
+      <contentType>DATE</contentType>
+      <resolution>DAY</resolution>
+      <outputFormat>dd.MM.yyyy</outputFormat>
+      <mandatory v="true" />
+      <valueProcess>%aditoprj%/entity/CampaignStep_entity/entityfields/date_end/valueProcess.js</valueProcess>
+      <onValidation>%aditoprj%/entity/CampaignStep_entity/entityfields/date_end/onValidation.js</onValidation>
+    </entityField>
+    <entityField>
+      <name>STATE</name>
+      <title>Status</title>
+      <consumer>KeywordStates</consumer>
+      <mandatory v="true" />
+      <valueProcess>%aditoprj%/entity/CampaignStep_entity/entityfields/state/valueProcess.js</valueProcess>
+      <displayValueProcess>%aditoprj%/entity/CampaignStep_entity/entityfields/state/displayValueProcess.js</displayValueProcess>
+    </entityField>
+    <entityField>
+      <name>SORTING</name>
+      <title>Reihenfolge</title>
+      <contentType>NUMBER</contentType>
+      <mandatory v="true" />
+      <valueProcess>%aditoprj%/entity/CampaignStep_entity/entityfields/sorting/valueProcess.js</valueProcess>
+    </entityField>
+    <entityField>
+      <name>USER_NEW</name>
+      <valueProcess>%aditoprj%/entity/CampaignStep_entity/entityfields/user_new/valueProcess.js</valueProcess>
+    </entityField>
+    <entityField>
+      <name>DATE_NEW</name>
+      <valueProcess>%aditoprj%/entity/CampaignStep_entity/entityfields/date_new/valueProcess.js</valueProcess>
+    </entityField>
+    <entityField>
+      <name>USER_EDIT</name>
+      <valueProcess>%aditoprj%/entity/CampaignStep_entity/entityfields/user_edit/valueProcess.js</valueProcess>
+    </entityField>
+    <entityField>
+      <name>DATE_EDIT</name>
+      <valueProcess>%aditoprj%/entity/CampaignStep_entity/entityfields/date_edit/valueProcess.js</valueProcess>
+    </entityField>
+    <entityProvider>
+      <name>CampaignSteps</name>
+      <fieldType>DEPENDENCY_IN</fieldType>
+      <recordContainer>db</recordContainer>
+      <dependencies>
+        <entityDependency>
+          <name>421e6cc2-f874-4834-b022-fe1b253d50af</name>
+          <entityName>Campaign_entity</entityName>
+          <fieldName>CampaignSteps</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+        <entityDependency>
+          <name>7f1c046b-0e8f-429e-a0a6-3322382c61d4</name>
+          <entityName>CampaignParticipant_entity</entityName>
+          <fieldName>CampaignSteps</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+        <entityDependency>
+          <name>eedc7b17-af98-4ffb-b527-97835cf8f903</name>
+          <entityName>CampaignAddParticipants_entity</entityName>
+          <fieldName>CampaignStepConsumer</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+        <entityDependency>
+          <name>ad4ee503-95b9-4add-a0ef-e833db008349</name>
+          <entityName>CampaignCost_entitiy</entityName>
+          <fieldName>CampaignSteps</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+      </dependencies>
+      <children>
+        <entityParameter>
+          <name>campaignId_param</name>
+          <expose v="true" />
+          <triggerRecalculation v="false" />
+          <mandatory v="true" />
+        </entityParameter>
+      </children>
+    </entityProvider>
+    <entityParameter>
+      <name>campaignId_param</name>
+      <expose v="true" />
+      <triggerRecalculation v="true" />
+      <description>PARAMETER</description>
+    </entityParameter>
+    <entityConsumer>
+      <name>KeywordStates</name>
+      <fieldType>DEPENDENCY_OUT</fieldType>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>SpecificContainerKeywords</fieldName>
+      </dependency>
+      <children>
+        <entityParameter>
+          <name>ContainerName_param</name>
+          <valueProcess>%aditoprj%/entity/CampaignStep_entity/entityfields/keywordstates/children/containername_param/valueProcess.js</valueProcess>
+        </entityParameter>
+      </children>
+    </entityConsumer>
+    <entityField>
+      <name>MAXPARTICIPANTS</name>
+      <title>Max participants</title>
+      <contentType>NUMBER</contentType>
+      <mandatory v="true" />
+    </entityField>
+    <entityConsumer>
+      <name>CampaignParticipantsConsumer</name>
+      <title>Participants</title>
+      <fieldType>DEPENDENCY_OUT</fieldType>
+      <selectionMode>MULTI</selectionMode>
+      <dependency>
+        <name>dependency</name>
+        <entityName>CampaignParticipant_entity</entityName>
+        <fieldName>CampaignParticipantsProvider</fieldName>
+      </dependency>
+      <children>
+        <entityParameter>
+          <name>CampaignId_param</name>
+          <valueProcess>%aditoprj%/entity/CampaignStep_entity/entityfields/campaignparticipantsconsumer/children/campaignid_param/valueProcess.js</valueProcess>
+        </entityParameter>
+        <entityParameter>
+          <name>CampaignStepId_param</name>
+          <valueProcess>%aditoprj%/entity/CampaignStep_entity/entityfields/campaignparticipantsconsumer/children/campaignstepid_param/valueProcess.js</valueProcess>
+        </entityParameter>
+      </children>
+    </entityConsumer>
+    <entityField>
+      <name>CurrentMaxParticipantsInfo</name>
+      <title>Participants</title>
+      <state>READONLY</state>
+      <valueProcess>%aditoprj%/entity/CampaignStep_entity/entityfields/currentmaxparticipantsinfo/valueProcess.js</valueProcess>
+    </entityField>
+    <entityField>
+      <name>CampaignStatus</name>
+      <title>Campaign status</title>
+      <state>READONLY</state>
+      <valueProcess>%aditoprj%/entity/CampaignStep_entity/entityfields/campaignstatus/valueProcess.js</valueProcess>
+    </entityField>
+    <entityField>
+      <name>DESCRIPTION</name>
+      <title>Description</title>
+      <contentType>LONG_TEXT</contentType>
+    </entityField>
+    <entityConsumer>
+      <name>Employees</name>
+      <fieldType>DEPENDENCY_OUT</fieldType>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Employee_entity</entityName>
+        <fieldName>Employees</fieldName>
+      </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>CampaignStepCosts</name>
+      <title>Cost</title>
+      <fieldType>DEPENDENCY_OUT</fieldType>
+      <dependency>
+        <name>dependency</name>
+        <entityName>CampaignCost_entitiy</entityName>
+        <fieldName>StepCosts</fieldName>
+      </dependency>
+      <children>
+        <entityParameter>
+          <name>CampaignId_param</name>
+          <valueProcess>%aditoprj%/entity/CampaignStep_entity/entityfields/campaignstepcosts/children/campaignid_param/valueProcess.js</valueProcess>
+        </entityParameter>
+        <entityParameter>
+          <name>CampaignStepId_param</name>
+          <valueProcess>%aditoprj%/entity/CampaignStep_entity/entityfields/campaignstepcosts/children/campaignstepid_param/valueProcess.js</valueProcess>
+        </entityParameter>
+      </children>
+    </entityConsumer>
+    <entityField>
+      <name>COST</name>
+      <title>Cost</title>
+      <contentType>NUMBER</contentType>
+      <outputFormat>#,##0.00</outputFormat>
+    </entityField>
+    <entityConsumer>
+      <name>CampaignConsumer</name>
+      <fieldType>DEPENDENCY_OUT</fieldType>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Campaign_entity</entityName>
+        <fieldName>CampaignProvider</fieldName>
+      </dependency>
+    </entityConsumer>
+  </entityFields>
+  <recordContainers>
+    <dbRecordContainer>
+      <name>db</name>
+      <alias>Data_alias</alias>
+      <conditionProcess>%aditoprj%/entity/CampaignStep_entity/recordcontainers/db/conditionProcess.js</conditionProcess>
+      <orderClauseProcess>%aditoprj%/entity/CampaignStep_entity/recordcontainers/db/orderClauseProcess.js</orderClauseProcess>
+      <linkInformation>
+        <linkInformation>
+          <name>b1b09ce7-82a2-41fd-9b20-1fd5235f8f30</name>
+          <tableName>CAMPAIGNSTEP</tableName>
+          <primaryKey>CAMPAIGNSTEPID</primaryKey>
+          <isUIDTable v="true" />
+          <readonly v="false" />
+        </linkInformation>
+      </linkInformation>
+      <recordFieldMappings>
+        <dbRecordFieldMapping>
+          <name>CAMPAIGN_ID.value</name>
+          <recordfield>CAMPAIGNSTEP.CAMPAIGN_ID</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>DATE_EDIT.value</name>
+          <recordfield>CAMPAIGNSTEP.DATE_EDIT</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>DATE_END.value</name>
+          <recordfield>CAMPAIGNSTEP.DATE_END</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>DATE_NEW.value</name>
+          <recordfield>CAMPAIGNSTEP.DATE_NEW</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>DATE_START.value</name>
+          <recordfield>CAMPAIGNSTEP.DATE_START</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>EMPLOYEE_CONTACT_ID.value</name>
+          <recordfield>CAMPAIGNSTEP.EMPLOYEE_CONTACT_ID</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>NAME.value</name>
+          <recordfield>CAMPAIGNSTEP.NAME</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>SORTING.value</name>
+          <recordfield>CAMPAIGNSTEP.SORTING</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>STATE.value</name>
+          <recordfield>CAMPAIGNSTEP.STATE</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>USER_EDIT.value</name>
+          <recordfield>CAMPAIGNSTEP.USER_EDIT</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>USER_NEW.value</name>
+          <recordfield>CAMPAIGNSTEP.USER_NEW</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>STATE.displayValue</name>
+          <expression>%aditoprj%/entity/CampaignStep_entity/recordcontainers/db/recordfieldmappings/state.displayvalue/expression.js</expression>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>MAXPARTICIPANTS.value</name>
+          <recordfield>CAMPAIGNSTEP.MAXPARTICIPANTS</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>CAMPAIGNSTEPID.value</name>
+          <recordfield>CAMPAIGNSTEP.CAMPAIGNSTEPID</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>DESCRIPTION.value</name>
+          <recordfield>CAMPAIGNSTEP.DESCRIPTION</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>COST.value</name>
+          <expression>%aditoprj%/entity/CampaignStep_entity/recordcontainers/db/recordfieldmappings/cost.value/expression.js</expression>
+        </dbRecordFieldMapping>
+      </recordFieldMappings>
+    </dbRecordContainer>
+  </recordContainers>
+</entity>
diff --git a/entity/CampaignStep_entity/entityfields/campaign_id/displayValueProcess.js b/entity/CampaignStep_entity/entityfields/campaign_id/displayValueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..d31669f144542cf6a53139722e3ae27f91156a19
--- /dev/null
+++ b/entity/CampaignStep_entity/entityfields/campaign_id/displayValueProcess.js
@@ -0,0 +1,7 @@
+import("system.result");
+import("system.vars");
+import("Campaign_lib");
+
+var campaignId = vars.get("$this.value");
+var campaignName = CampaignUtils.getCampaignNameById(campaignId)
+result.string(campaignName);
\ No newline at end of file
diff --git a/entity/CampaignStep_entity/entityfields/campaign_id/valueProcess.js b/entity/CampaignStep_entity/entityfields/campaign_id/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..9e7628a2cbd9b8acde9cf67636e0fdeb5843bf83
--- /dev/null
+++ b/entity/CampaignStep_entity/entityfields/campaign_id/valueProcess.js
@@ -0,0 +1,8 @@
+import("system.neon");
+import("system.logging");
+import("system.result");
+import("system.vars");
+
+//For creation of new Step in CampaignMainView
+if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && vars.exists("$param.campaignId_param") && vars.get("$param.campaignId_param"))
+    result.string(vars.get("$param.campaignId_param"));
\ No newline at end of file
diff --git a/entity/CampaignStep_entity/entityfields/campaignparticipantsconsumer/children/campaignid_param/valueProcess.js b/entity/CampaignStep_entity/entityfields/campaignparticipantsconsumer/children/campaignid_param/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..9dd7e44f4ea3fc9d60c8a5dcbb9d208feb770fab
--- /dev/null
+++ b/entity/CampaignStep_entity/entityfields/campaignparticipantsconsumer/children/campaignid_param/valueProcess.js
@@ -0,0 +1,4 @@
+import("system.result");
+import("system.vars");
+
+result.string(vars.get("$field.CAMPAIGN_ID"));
\ No newline at end of file
diff --git a/entity/CampaignStep_entity/entityfields/campaignparticipantsconsumer/children/campaignstepid_param/valueProcess.js b/entity/CampaignStep_entity/entityfields/campaignparticipantsconsumer/children/campaignstepid_param/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..737745c8c91d70a5a56cb216a4586749ea411dda
--- /dev/null
+++ b/entity/CampaignStep_entity/entityfields/campaignparticipantsconsumer/children/campaignstepid_param/valueProcess.js
@@ -0,0 +1,6 @@
+import("system.logging");
+import("system.result");
+import("system.vars");
+
+logging.log("CS_entity_CPCOnsumer_CSId_param: field.CAMPAIGNSTEPID ->" + vars.getString("$field.CAMPAIGNSTEPID"));
+result.string(vars.getString("$field.CAMPAIGNSTEPID"));
\ No newline at end of file
diff --git a/entity/CampaignStep_entity/entityfields/campaignstatus/valueProcess.js b/entity/CampaignStep_entity/entityfields/campaignstatus/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..b1c6ea17f2c0d193d665398c40a5f8d80722dfae
--- /dev/null
+++ b/entity/CampaignStep_entity/entityfields/campaignstatus/valueProcess.js
@@ -0,0 +1,7 @@
+import("system.result");
+import("system.vars");
+import("Campaign_lib");
+
+let campaignId = vars.get("$field.CAMPAIGN_ID");
+
+result.string(CampaignUtils.getCampaignStatusByCampaignId(campaignId))
\ No newline at end of file
diff --git a/entity/CampaignStep_entity/entityfields/campaignstepcosts/children/campaignid_param/valueProcess.js b/entity/CampaignStep_entity/entityfields/campaignstepcosts/children/campaignid_param/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..b2482a5e35fe9e1a55eb568ff5a3798b696dbfbf
--- /dev/null
+++ b/entity/CampaignStep_entity/entityfields/campaignstepcosts/children/campaignid_param/valueProcess.js
@@ -0,0 +1,4 @@
+import("system.vars");
+import("system.result");
+
+result.string(vars.get("$field.CAMPAIGN_ID"));
\ No newline at end of file
diff --git a/entity/CampaignStep_entity/entityfields/campaignstepcosts/children/campaignstepid_param/valueProcess.js b/entity/CampaignStep_entity/entityfields/campaignstepcosts/children/campaignstepid_param/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..533f8ec837ea2f9b588ddf05545ac47cdda23d18
--- /dev/null
+++ b/entity/CampaignStep_entity/entityfields/campaignstepcosts/children/campaignstepid_param/valueProcess.js
@@ -0,0 +1,4 @@
+import("system.vars");
+import("system.result");
+
+result.string(vars.get("$sys.uid"));
\ No newline at end of file
diff --git a/entity/CampaignStep_entity/entityfields/campaignstepid/valueProcess.js b/entity/CampaignStep_entity/entityfields/campaignstepid/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..4af99287f59a86e98d9b4c552c010fe13c106cc7
--- /dev/null
+++ b/entity/CampaignStep_entity/entityfields/campaignstepid/valueProcess.js
@@ -0,0 +1,7 @@
+import("system.util");
+import("system.result");
+import("system.neon");
+import("system.vars");
+
+if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW)
+    result.string(util.getNewUUID());
\ No newline at end of file
diff --git a/entity/CampaignStep_entity/entityfields/currentmaxparticipantsinfo/valueProcess.js b/entity/CampaignStep_entity/entityfields/currentmaxparticipantsinfo/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..f3447d7251ccdd3bc5fdb2115c62be33268ab094
--- /dev/null
+++ b/entity/CampaignStep_entity/entityfields/currentmaxparticipantsinfo/valueProcess.js
@@ -0,0 +1,7 @@
+import("system.result");
+import("system.vars");
+import("Campaign_lib");
+
+let currentParticipantsCount = CampaignUtils.getParticipantCountForStep(vars.get("$field.CAMPAIGNSTEPID"));
+let maxParticipantsStepCount = vars.get("$field.MAXPARTICIPANTS");
+result.string(currentParticipantsCount + "/" + maxParticipantsStepCount);
\ No newline at end of file
diff --git a/entity/CampaignStep_entity/entityfields/date_edit/valueProcess.js b/entity/CampaignStep_entity/entityfields/date_edit/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..5e6ef059738e0c724a468685333a5e257ac228ce
--- /dev/null
+++ b/entity/CampaignStep_entity/entityfields/date_edit/valueProcess.js
@@ -0,0 +1,7 @@
+import("system.util");
+import("system.result");
+import("system.neon");
+import("system.vars");
+
+if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_EDIT)
+    result.string(vars.get("$sys.date"));
\ No newline at end of file
diff --git a/entity/CampaignStep_entity/entityfields/date_end/onValidation.js b/entity/CampaignStep_entity/entityfields/date_end/onValidation.js
new file mode 100644
index 0000000000000000000000000000000000000000..64e94f87c19545092b85dd400847f342bf7aac70
--- /dev/null
+++ b/entity/CampaignStep_entity/entityfields/date_end/onValidation.js
@@ -0,0 +1,14 @@
+import("system.neon");
+import("system.result");
+import("system.vars");
+import("Date_lib");
+import("Entity_lib");
+
+var cEnd = ProcessHandlingUtils.getOnValidationValue(vars.get("$field.DATE_END"));
+
+if (DateUtils.validateBeginnBeforeEnd(vars.get("$field.DATE_START"), cEnd) === false)
+    result.string(DateUtils.getValidationFailString());
+else
+    {
+        neon.refresh(["$field.DATE_START"]);
+    }
\ No newline at end of file
diff --git a/entity/CampaignStep_entity/entityfields/date_end/valueProcess.js b/entity/CampaignStep_entity/entityfields/date_end/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..bf2e43999c9b27b5744089cb8d88ec10e1c5feed
--- /dev/null
+++ b/entity/CampaignStep_entity/entityfields/date_end/valueProcess.js
@@ -0,0 +1,10 @@
+import("system.neon");
+import("system.vars");
+import("system.result");
+import("system.datetime");
+
+var threeWeeks = datetime.ONE_WEEK * 3;
+var inThreeWeeks = datetime.date() + threeWeeks;
+
+if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && !vars.get("$this.value"))
+    result.string(inThreeWeeks);
\ No newline at end of file
diff --git a/entity/CampaignStep_entity/entityfields/date_new/valueProcess.js b/entity/CampaignStep_entity/entityfields/date_new/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..a72892783bf2bd04fe353c47f1be0cb570bbb323
--- /dev/null
+++ b/entity/CampaignStep_entity/entityfields/date_new/valueProcess.js
@@ -0,0 +1,7 @@
+import("system.util");
+import("system.result");
+import("system.neon");
+import("system.vars");
+
+if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW)
+    result.string(vars.get("$sys.date"));
\ No newline at end of file
diff --git a/entity/CampaignStep_entity/entityfields/date_start/onValidation.js b/entity/CampaignStep_entity/entityfields/date_start/onValidation.js
new file mode 100644
index 0000000000000000000000000000000000000000..83a6fd0a8f608b725d4f9118179bf7e5c571635a
--- /dev/null
+++ b/entity/CampaignStep_entity/entityfields/date_start/onValidation.js
@@ -0,0 +1,14 @@
+import("system.neon");
+import("system.result");
+import("system.vars");
+import("Date_lib");
+import("Entity_lib");
+
+var cStart = ProcessHandlingUtils.getOnValidationValue(vars.get("$field.DATE_START"));
+
+if (DateUtils.validateBeginnBeforeEnd(cStart, vars.get("$field.DATE_END")) === false)
+    result.string(DateUtils.getValidationFailString());
+else
+    {
+        neon.refresh(["$field.DATE_END"]);
+    }
\ No newline at end of file
diff --git a/entity/CampaignStep_entity/entityfields/date_start/onValueChange.js b/entity/CampaignStep_entity/entityfields/date_start/onValueChange.js
new file mode 100644
index 0000000000000000000000000000000000000000..8f389856a99f98af690f9391efb4cbba0581c5a5
--- /dev/null
+++ b/entity/CampaignStep_entity/entityfields/date_start/onValueChange.js
@@ -0,0 +1,2 @@
+import("system.logging");
+logging.log("date start on value change -> ");
\ No newline at end of file
diff --git a/entity/CampaignStep_entity/entityfields/date_start/valueProcess.js b/entity/CampaignStep_entity/entityfields/date_start/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..4c1e2142a292fa2ef6fa38dbe2e458d9628af21f
--- /dev/null
+++ b/entity/CampaignStep_entity/entityfields/date_start/valueProcess.js
@@ -0,0 +1,11 @@
+import("Date_lib");
+import("system.neon");
+import("system.vars");
+import("system.result");
+    
+if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && !vars.get("$this.value"))
+{
+    result.string(DateUtils.getTodayUTC());
+}
+else
+    result.string(vars.get("$this.value"));
\ No newline at end of file
diff --git a/entity/CampaignStep_entity/entityfields/employee_contact_id/displayValueProcess.js b/entity/CampaignStep_entity/entityfields/employee_contact_id/displayValueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..037d5e264baf41f4e2b0ebcfce8103d365ee7e13
--- /dev/null
+++ b/entity/CampaignStep_entity/entityfields/employee_contact_id/displayValueProcess.js
@@ -0,0 +1,5 @@
+import("system.vars");
+import("system.result");
+import("Contact_lib");
+
+result.string(ContactUtils.getTitleByContactId(vars.get("$field.EMPLOYEE_CONTACT_ID")));
\ No newline at end of file
diff --git a/entity/CampaignStep_entity/entityfields/employee_contact_id/valueProcess.js b/entity/CampaignStep_entity/entityfields/employee_contact_id/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..1e62e7551ccb20b0b0d7aca34f64b6e448b5dda7
--- /dev/null
+++ b/entity/CampaignStep_entity/entityfields/employee_contact_id/valueProcess.js
@@ -0,0 +1,7 @@
+import("system.result");
+import("system.neon");
+import("system.vars");
+import("Employee_lib");
+
+if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW)
+    result.string(EmployeeUtils.getCurrentContactId());
\ No newline at end of file
diff --git a/entity/CampaignStep_entity/entityfields/keywordstates/children/containername_param/valueProcess.js b/entity/CampaignStep_entity/entityfields/keywordstates/children/containername_param/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..ebd6eccbcbcd1f6e73a292b82a107c78f8b91325
--- /dev/null
+++ b/entity/CampaignStep_entity/entityfields/keywordstates/children/containername_param/valueProcess.js
@@ -0,0 +1,5 @@
+import("system.result");
+import("Keyword_lib");
+import("KeywordRegistry_basic");
+
+result.string($KeywordRegistry.campaignStepState());
\ No newline at end of file
diff --git a/entity/CampaignStep_entity/entityfields/sorting/valueProcess.js b/entity/CampaignStep_entity/entityfields/sorting/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..8be188bfa5837c38651100b49d7163c0cf745fb9
--- /dev/null
+++ b/entity/CampaignStep_entity/entityfields/sorting/valueProcess.js
@@ -0,0 +1,14 @@
+import("system.db");
+import("system.neon");
+import("system.vars");
+import("system.util");
+import("system.result");
+
+if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW)
+{
+    var campaignId = vars.get("$field.CAMPAIGN_ID");
+    var latestSortingQuery = "select COUNT(CAMPAIGNSTEPID) from CAMPAIGNSTEP " + 
+        "where CAMPAIGN_ID = '" + campaignId + "'";
+    var stepCount = db.cell(latestSortingQuery);
+    result.string(parseInt(stepCount) + 1);
+}
\ No newline at end of file
diff --git a/entity/CampaignStep_entity/entityfields/state/displayValueProcess.js b/entity/CampaignStep_entity/entityfields/state/displayValueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..076a4dc046a745c33652aebad5ffa9c38125f9ef
--- /dev/null
+++ b/entity/CampaignStep_entity/entityfields/state/displayValueProcess.js
@@ -0,0 +1,6 @@
+import("system.result");
+import("system.vars");
+import("Keyword_lib");
+import("KeywordRegistry_basic");
+
+result.string(KeywordUtils.getViewValue($KeywordRegistry.campaignStepState(), vars.get("$this.value")));
\ No newline at end of file
diff --git a/entity/CampaignStep_entity/entityfields/state/valueProcess.js b/entity/CampaignStep_entity/entityfields/state/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..9524152a718ff70b850fa270593399e3fdc5f5bd
--- /dev/null
+++ b/entity/CampaignStep_entity/entityfields/state/valueProcess.js
@@ -0,0 +1,7 @@
+import("system.vars");
+import("system.result");
+import("system.neon");
+import("KeywordRegistry_basic");
+
+if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && !vars.get("$this.value"))
+    result.string($KeywordRegistry.campaignStepState$open());
\ No newline at end of file
diff --git a/entity/CampaignStep_entity/entityfields/user_edit/valueProcess.js b/entity/CampaignStep_entity/entityfields/user_edit/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..6af880ae3e0e2b89b4eee8327ed49f1eefe458af
--- /dev/null
+++ b/entity/CampaignStep_entity/entityfields/user_edit/valueProcess.js
@@ -0,0 +1,7 @@
+import("system.util");
+import("system.result");
+import("system.neon");
+import("system.vars");
+
+if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_EDIT)
+    result.string(vars.get("$sys.user"));
\ No newline at end of file
diff --git a/entity/CampaignStep_entity/entityfields/user_new/valueProcess.js b/entity/CampaignStep_entity/entityfields/user_new/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..e518bc75a9494e53a83613dedd943106e74fc00a
--- /dev/null
+++ b/entity/CampaignStep_entity/entityfields/user_new/valueProcess.js
@@ -0,0 +1,7 @@
+import("system.util");
+import("system.result");
+import("system.neon");
+import("system.vars");
+
+if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW)
+    result.string(vars.get("$sys.user"));
\ No newline at end of file
diff --git a/entity/CampaignStep_entity/recordcontainers/db/conditionProcess.js b/entity/CampaignStep_entity/recordcontainers/db/conditionProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..b64ace9707df0605c82aba6306dd622fbc9a2a30
--- /dev/null
+++ b/entity/CampaignStep_entity/recordcontainers/db/conditionProcess.js
@@ -0,0 +1,9 @@
+import("system.logging");
+import("system.vars");
+import("system.result");
+
+if(vars.exists("$param.campaignId_param") && vars.get("$param.campaignId_param"))
+{
+    logging.log("CampaignStepDBRC_conditionProcess: campaignId_param -> " + vars.get("$param.campaignId_param"));    
+    result.string("CAMPAIGN_ID = '" + vars.getString("$param.campaignId_param") + "'");
+}
diff --git a/entity/CampaignStep_entity/recordcontainers/db/orderClauseProcess.js b/entity/CampaignStep_entity/recordcontainers/db/orderClauseProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..8538a702d13027d9d9739d9b6652105b87725638
--- /dev/null
+++ b/entity/CampaignStep_entity/recordcontainers/db/orderClauseProcess.js
@@ -0,0 +1,4 @@
+import("system.result");
+import("system.db");
+
+result.object({"CAMPAIGNSTEP.SORTING": db.ASCENDING});
\ No newline at end of file
diff --git a/entity/CampaignStep_entity/recordcontainers/db/recordfieldmappings/cost.value/expression.js b/entity/CampaignStep_entity/recordcontainers/db/recordfieldmappings/cost.value/expression.js
new file mode 100644
index 0000000000000000000000000000000000000000..90244a5bfed8a35a3de7ea631a8414c3d9916c97
--- /dev/null
+++ b/entity/CampaignStep_entity/recordcontainers/db/recordfieldmappings/cost.value/expression.js
@@ -0,0 +1,3 @@
+import("system.result");
+
+result.string("(select sum(NET) from CAMPAIGNCOST where CAMPAIGNCOST.CAMPAIGN_ID = CAMPAIGNSTEP.CAMPAIGN_ID and CAMPAIGNCOST.CAMPAIGNSTEP_ID = CAMPAIGNSTEP.CAMPAIGNSTEPID)")
\ No newline at end of file
diff --git a/entity/CampaignStep_entity/recordcontainers/db/recordfieldmappings/state.displayvalue/expression.js b/entity/CampaignStep_entity/recordcontainers/db/recordfieldmappings/state.displayvalue/expression.js
new file mode 100644
index 0000000000000000000000000000000000000000..8b0d07b793542a03718b3ba98c1afd793aa5a345
--- /dev/null
+++ b/entity/CampaignStep_entity/recordcontainers/db/recordfieldmappings/state.displayvalue/expression.js
@@ -0,0 +1,6 @@
+import("system.result");
+import("Keyword_lib");
+import("KeywordRegistry_basic");
+
+var sql = KeywordUtils.getResolvedTitleSqlPart($KeywordRegistry.campaignStepState(), "CAMPAIGNSTEP.STATE");
+result.string(sql);
\ No newline at end of file
diff --git a/entity/CampaignStep_entity/titleProcess.js b/entity/CampaignStep_entity/titleProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..429260276f9d30b111be834373ee1613df1f7084
--- /dev/null
+++ b/entity/CampaignStep_entity/titleProcess.js
@@ -0,0 +1,5 @@
+import("Context_lib");
+import("system.result");
+import("system.vars");
+
+result.string(ContextUtils.prefixWithCurrentContextTitle(vars.getString("$field.NAME")));
\ No newline at end of file
diff --git a/entity/Campaign_entity/Campaign_entity.aod b/entity/Campaign_entity/Campaign_entity.aod
new file mode 100644
index 0000000000000000000000000000000000000000..1b94e9210769af76e7e2c9bba236bdac858268c4
--- /dev/null
+++ b/entity/Campaign_entity/Campaign_entity.aod
@@ -0,0 +1,295 @@
+<?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.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.2">
+  <name>Campaign_entity</name>
+  <title>Campaign</title>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <icon>VAADIN:GROUP</icon>
+  <titleProcess>%aditoprj%/entity/Campaign_entity/titleProcess.js</titleProcess>
+  <recordContainer>db</recordContainer>
+  <entityFields>
+    <entityProvider>
+      <name>#PROVIDER</name>
+    </entityProvider>
+    <entityField>
+      <name>CAMPAIGNID</name>
+      <searchable v="false" />
+      <valueProcess>%aditoprj%/entity/Campaign_entity/entityfields/campaignid/valueProcess.js</valueProcess>
+    </entityField>
+    <entityField>
+      <name>NAME</name>
+      <title>Name</title>
+      <mandatory v="true" />
+    </entityField>
+    <entityField>
+      <name>DATE_START</name>
+      <title>Beginn</title>
+      <contentType>DATE</contentType>
+      <resolution>DAY</resolution>
+      <outputFormat>dd.MM.YYYY</outputFormat>
+      <state>READONLY</state>
+      <displayValueProcess>%aditoprj%/entity/Campaign_entity/entityfields/date_start/displayValueProcess.js</displayValueProcess>
+    </entityField>
+    <entityField>
+      <name>DATE_END</name>
+      <title>Ende</title>
+      <contentType>DATE</contentType>
+      <resolution>DAY</resolution>
+      <outputFormat>dd.MM.YYYY</outputFormat>
+      <state>READONLY</state>
+      <displayValueProcess>%aditoprj%/entity/Campaign_entity/entityfields/date_end/displayValueProcess.js</displayValueProcess>
+    </entityField>
+    <entityField>
+      <name>EMPLOYEE_CONTACT_ID</name>
+      <title>Hauptverantw.</title>
+      <consumer>Employee</consumer>
+      <mandatory v="true" />
+      <valueProcess>%aditoprj%/entity/Campaign_entity/entityfields/employee_contact_id/valueProcess.js</valueProcess>
+      <displayValueProcess>%aditoprj%/entity/Campaign_entity/entityfields/employee_contact_id/displayValueProcess.js</displayValueProcess>
+    </entityField>
+    <entityField>
+      <name>DESCRIPTION</name>
+      <title>Description</title>
+      <contentType>LONG_TEXT</contentType>
+    </entityField>
+    <entityField>
+      <name>USER_NEW</name>
+      <searchable v="false" />
+      <valueProcess>%aditoprj%/entity/Campaign_entity/entityfields/user_new/valueProcess.js</valueProcess>
+    </entityField>
+    <entityField>
+      <name>DATE_NEW</name>
+      <contentType>DATE</contentType>
+      <searchable v="false" />
+      <valueProcess>%aditoprj%/entity/Campaign_entity/entityfields/date_new/valueProcess.js</valueProcess>
+    </entityField>
+    <entityField>
+      <name>USER_EDIT</name>
+      <searchable v="false" />
+      <valueProcess>%aditoprj%/entity/Campaign_entity/entityfields/user_edit/valueProcess.js</valueProcess>
+    </entityField>
+    <entityField>
+      <name>DATE_EDIT</name>
+      <contentType>DATE</contentType>
+      <searchable v="false" />
+      <valueProcess>%aditoprj%/entity/Campaign_entity/entityfields/date_edit/valueProcess.js</valueProcess>
+    </entityField>
+    <entityConsumer>
+      <name>CampaignSteps</name>
+      <title>Steps</title>
+      <fieldType>DEPENDENCY_OUT</fieldType>
+      <dependency>
+        <name>dependency</name>
+        <entityName>CampaignStep_entity</entityName>
+        <fieldName>CampaignSteps</fieldName>
+      </dependency>
+      <children>
+        <entityParameter>
+          <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>
+    </entityConsumer>
+    <entityField>
+      <name>STATE</name>
+      <title>Status</title>
+      <consumer>KeywordStates</consumer>
+      <mandatory v="true" />
+      <valueProcess>%aditoprj%/entity/Campaign_entity/entityfields/state/valueProcess.js</valueProcess>
+      <displayValueProcess>%aditoprj%/entity/Campaign_entity/entityfields/state/displayValueProcess.js</displayValueProcess>
+    </entityField>
+    <entityConsumer>
+      <name>KeywordStates</name>
+      <fieldType>DEPENDENCY_OUT</fieldType>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>SpecificContainerKeywords</fieldName>
+      </dependency>
+      <children>
+        <entityParameter>
+          <name>ContainerName_param</name>
+          <valueProcess>%aditoprj%/entity/Campaign_entity/entityfields/keywordstates/children/containername_param/valueProcess.js</valueProcess>
+        </entityParameter>
+      </children>
+    </entityConsumer>
+    <entityProvider>
+      <name>CampaignProvider</name>
+      <fieldType>DEPENDENCY_IN</fieldType>
+      <recordContainer>db</recordContainer>
+      <dependencies>
+        <entityDependency>
+          <name>7cb37ad1-a0a9-41bc-9a9e-7207317cd812</name>
+          <entityName>CampaignParticipant_entity</entityName>
+          <fieldName>CampaignsConsumer</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+        <entityDependency>
+          <name>918b744c-4bd5-4ae0-9a09-5ecf1927b8f6</name>
+          <entityName>CampaignAddParticipants_entity</entityName>
+          <fieldName>CampaignConsumer</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+        <entityDependency>
+          <name>d238b02c-75e7-4cf4-b90c-bb36d41ae90f</name>
+          <entityName>CampaignCost_entitiy</entityName>
+          <fieldName>Campaigns</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+        <entityDependency>
+          <name>92ec68f6-2ff5-4f15-9001-6297a6d5790d</name>
+          <entityName>CampaignStep_entity</entityName>
+          <fieldName>CampaignConsumer</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+      </dependencies>
+    </entityProvider>
+    <entityConsumer>
+      <name>CampaignParticipants</name>
+      <title>Participants</title>
+      <fieldType>DEPENDENCY_OUT</fieldType>
+      <selectionMode>MULTI</selectionMode>
+      <dependency>
+        <name>dependency</name>
+        <entityName>CampaignParticipant_entity</entityName>
+        <fieldName>CampaignParticipantsProvider</fieldName>
+      </dependency>
+      <children>
+        <entityParameter>
+          <name>ContactId_param</name>
+          <expose v="true" />
+        </entityParameter>
+        <entityParameter>
+          <name>CampaignStepId_param</name>
+          <expose v="true" />
+        </entityParameter>
+        <entityParameter>
+          <name>CampaignId_param</name>
+          <valueProcess>%aditoprj%/entity/Campaign_entity/entityfields/campaignparticipants/children/campaignid_param/valueProcess.js</valueProcess>
+          <expose v="true" />
+        </entityParameter>
+      </children>
+    </entityConsumer>
+    <entityConsumer>
+      <name>Employee</name>
+      <fieldType>DEPENDENCY_OUT</fieldType>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Employee_entity</entityName>
+        <fieldName>Employees</fieldName>
+      </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>CampaignCosts</name>
+      <title>Costs</title>
+      <fieldType>DEPENDENCY_OUT</fieldType>
+      <dependency>
+        <name>dependency</name>
+        <entityName>CampaignCost_entitiy</entityName>
+        <fieldName>CampaignCosts</fieldName>
+      </dependency>
+      <children>
+        <entityParameter>
+          <name>CampaignId_param</name>
+          <valueProcess>%aditoprj%/entity/Campaign_entity/entityfields/campaigncosts/children/campaignid_param/valueProcess.js</valueProcess>
+        </entityParameter>
+      </children>
+    </entityConsumer>
+    <entityField>
+      <name>COST</name>
+      <title>Cost</title>
+      <contentType>NUMBER</contentType>
+      <outputFormat>#,##0.00</outputFormat>
+    </entityField>
+    <entityConsumer>
+      <name>CampaignStepCosts</name>
+      <fieldType>DEPENDENCY_OUT</fieldType>
+      <dependency>
+        <name>dependency</name>
+        <entityName>CampaignCost_entitiy</entityName>
+        <fieldName>StepCosts</fieldName>
+      </dependency>
+      <children>
+        <entityParameter>
+          <name>CampaignId_param</name>
+          <valueProcess>%aditoprj%/entity/Campaign_entity/entityfields/campaignstepcosts/children/campaignid_param/valueProcess.js</valueProcess>
+        </entityParameter>
+      </children>
+    </entityConsumer>
+    <entityField>
+      <name>stepCount</name>
+      <title>Steps</title>
+      <valueProcess>%aditoprj%/entity/Campaign_entity/entityfields/stepcount/valueProcess.js</valueProcess>
+    </entityField>
+    <entityField>
+      <name>participantCount</name>
+      <title>Participants</title>
+      <valueProcess>%aditoprj%/entity/Campaign_entity/entityfields/participantcount/valueProcess.js</valueProcess>
+    </entityField>
+  </entityFields>
+  <recordContainers>
+    <dbRecordContainer>
+      <name>db</name>
+      <alias>Data_alias</alias>
+      <onDBInsert>%aditoprj%/entity/Campaign_entity/recordcontainers/db/onDBInsert.js</onDBInsert>
+      <onDBDelete>%aditoprj%/entity/Campaign_entity/recordcontainers/db/onDBDelete.js</onDBDelete>
+      <linkInformation>
+        <linkInformation>
+          <name>f3893829-3af2-4e55-ae85-c3a24411a8b8</name>
+          <tableName>CAMPAIGN</tableName>
+          <primaryKey>CAMPAIGNID</primaryKey>
+          <isUIDTable v="true" />
+          <readonly v="false" />
+        </linkInformation>
+      </linkInformation>
+      <recordFieldMappings>
+        <dbRecordFieldMapping>
+          <name>DATE_EDIT.value</name>
+          <recordfield>CAMPAIGN.DATE_EDIT</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>DATE_NEW.value</name>
+          <recordfield>CAMPAIGN.DATE_NEW</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>DESCRIPTION.value</name>
+          <recordfield>CAMPAIGN.DESCRIPTION</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>EMPLOYEE_CONTACT_ID.value</name>
+          <recordfield>CAMPAIGN.EMPLOYEE_CONTACT_ID</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>NAME.value</name>
+          <recordfield>CAMPAIGN.NAME</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>USER_EDIT.value</name>
+          <recordfield>CAMPAIGN.USER_EDIT</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>USER_NEW.value</name>
+          <recordfield>CAMPAIGN.USER_NEW</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>STATE.value</name>
+          <recordfield>CAMPAIGN.STATE</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>STATE.displayValue</name>
+          <expression>%aditoprj%/entity/Campaign_entity/recordcontainers/db/recordfieldmappings/state.displayvalue/expression.js</expression>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>CAMPAIGNID.value</name>
+          <recordfield>CAMPAIGN.CAMPAIGNID</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>COST.value</name>
+          <expression>%aditoprj%/entity/Campaign_entity/recordcontainers/db/recordfieldmappings/cost.value/expression.js</expression>
+        </dbRecordFieldMapping>
+      </recordFieldMappings>
+    </dbRecordContainer>
+  </recordContainers>
+</entity>
diff --git a/entity/Campaign_entity/entityfields/campaigncosts/children/campaignid_param/valueProcess.js b/entity/Campaign_entity/entityfields/campaigncosts/children/campaignid_param/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..c95f5ea0c85673d6f68abfdbef56f55fb63597c1
--- /dev/null
+++ b/entity/Campaign_entity/entityfields/campaigncosts/children/campaignid_param/valueProcess.js
@@ -0,0 +1,4 @@
+import("system.result");
+import("system.vars");
+
+result.string(vars.get("$sys.uid"));
\ No newline at end of file
diff --git a/entity/Campaign_entity/entityfields/campaignid/valueProcess.js b/entity/Campaign_entity/entityfields/campaignid/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..4af99287f59a86e98d9b4c552c010fe13c106cc7
--- /dev/null
+++ b/entity/Campaign_entity/entityfields/campaignid/valueProcess.js
@@ -0,0 +1,7 @@
+import("system.util");
+import("system.result");
+import("system.neon");
+import("system.vars");
+
+if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW)
+    result.string(util.getNewUUID());
\ No newline at end of file
diff --git a/entity/Campaign_entity/entityfields/campaignparticipants/children/campaignid_param/valueProcess.js b/entity/Campaign_entity/entityfields/campaignparticipants/children/campaignid_param/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..3814648f507bd77edb266f38a807c1669e8c5f1e
--- /dev/null
+++ b/entity/Campaign_entity/entityfields/campaignparticipants/children/campaignid_param/valueProcess.js
@@ -0,0 +1,4 @@
+import("system.vars");
+import("system.result");
+
+result.string(vars.get("$field.CAMPAIGNID"));
\ No newline at end of file
diff --git a/entity/Campaign_entity/entityfields/campaignstepcosts/children/campaignid_param/valueProcess.js b/entity/Campaign_entity/entityfields/campaignstepcosts/children/campaignid_param/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..c95f5ea0c85673d6f68abfdbef56f55fb63597c1
--- /dev/null
+++ b/entity/Campaign_entity/entityfields/campaignstepcosts/children/campaignid_param/valueProcess.js
@@ -0,0 +1,4 @@
+import("system.result");
+import("system.vars");
+
+result.string(vars.get("$sys.uid"));
\ No newline at end of file
diff --git a/entity/Campaign_entity/entityfields/campaignsteps/children/campaignid_param/valueProcess.js b/entity/Campaign_entity/entityfields/campaignsteps/children/campaignid_param/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..ea290bfda9377cc69f8b4c727ccbe2cf83f493de
--- /dev/null
+++ b/entity/Campaign_entity/entityfields/campaignsteps/children/campaignid_param/valueProcess.js
@@ -0,0 +1,5 @@
+import("system.logging");
+import("system.result");
+import("system.vars");
+
+result.string(vars.getString("$field.CAMPAIGNID"));
\ No newline at end of file
diff --git a/entity/Campaign_entity/entityfields/date_edit/valueProcess.js b/entity/Campaign_entity/entityfields/date_edit/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..5e6ef059738e0c724a468685333a5e257ac228ce
--- /dev/null
+++ b/entity/Campaign_entity/entityfields/date_edit/valueProcess.js
@@ -0,0 +1,7 @@
+import("system.util");
+import("system.result");
+import("system.neon");
+import("system.vars");
+
+if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_EDIT)
+    result.string(vars.get("$sys.date"));
\ No newline at end of file
diff --git a/entity/Campaign_entity/entityfields/date_end/displayValueProcess.js b/entity/Campaign_entity/entityfields/date_end/displayValueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..af009bc99321959dee737e4dd3c6bea039862e1c
--- /dev/null
+++ b/entity/Campaign_entity/entityfields/date_end/displayValueProcess.js
@@ -0,0 +1,12 @@
+import("system.result");
+import("system.vars");
+import("Campaign_lib");
+
+if(vars.exists("$field.CAMPAIGNID") && 
+        vars.get("$field.CAMPAIGNID") != "" && vars.get("$field.CAMPAIGNID") != null)
+{
+    var capmaignId = vars.get("$field.CAMPAIGNID");
+    var campaignStepEndDate = CampaignUtils.getCampaignEndDate(capmaignId);
+
+    result.string(campaignStepEndDate);
+}
\ No newline at end of file
diff --git a/entity/Campaign_entity/entityfields/date_new/valueProcess.js b/entity/Campaign_entity/entityfields/date_new/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..a72892783bf2bd04fe353c47f1be0cb570bbb323
--- /dev/null
+++ b/entity/Campaign_entity/entityfields/date_new/valueProcess.js
@@ -0,0 +1,7 @@
+import("system.util");
+import("system.result");
+import("system.neon");
+import("system.vars");
+
+if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW)
+    result.string(vars.get("$sys.date"));
\ No newline at end of file
diff --git a/entity/Campaign_entity/entityfields/date_start/displayValueProcess.js b/entity/Campaign_entity/entityfields/date_start/displayValueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..fd8b8586af122186de41ee63ab69db1c255434eb
--- /dev/null
+++ b/entity/Campaign_entity/entityfields/date_start/displayValueProcess.js
@@ -0,0 +1,12 @@
+import("system.result");
+import("system.vars");
+import("Campaign_lib");
+
+if(vars.exists("$field.CAMPAIGNID") && 
+        vars.get("$field.CAMPAIGNID") != "" && vars.get("$field.CAMPAIGNID") != null)
+{
+    var capmaignId = vars.get("$field.CAMPAIGNID");
+    var campaignStepStartDate = CampaignUtils.getCampaignStartDate(capmaignId);
+    
+    result.string(campaignStepStartDate);
+}
\ No newline at end of file
diff --git a/entity/Campaign_entity/entityfields/employee_contact_id/displayValueProcess.js b/entity/Campaign_entity/entityfields/employee_contact_id/displayValueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..037d5e264baf41f4e2b0ebcfce8103d365ee7e13
--- /dev/null
+++ b/entity/Campaign_entity/entityfields/employee_contact_id/displayValueProcess.js
@@ -0,0 +1,5 @@
+import("system.vars");
+import("system.result");
+import("Contact_lib");
+
+result.string(ContactUtils.getTitleByContactId(vars.get("$field.EMPLOYEE_CONTACT_ID")));
\ No newline at end of file
diff --git a/entity/Campaign_entity/entityfields/employee_contact_id/valueProcess.js b/entity/Campaign_entity/entityfields/employee_contact_id/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..1e62e7551ccb20b0b0d7aca34f64b6e448b5dda7
--- /dev/null
+++ b/entity/Campaign_entity/entityfields/employee_contact_id/valueProcess.js
@@ -0,0 +1,7 @@
+import("system.result");
+import("system.neon");
+import("system.vars");
+import("Employee_lib");
+
+if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW)
+    result.string(EmployeeUtils.getCurrentContactId());
\ No newline at end of file
diff --git a/entity/Campaign_entity/entityfields/keywordstates/children/containername_param/valueProcess.js b/entity/Campaign_entity/entityfields/keywordstates/children/containername_param/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..c4b797e74cbaf5fc02fee2f06791e7bd30cda404
--- /dev/null
+++ b/entity/Campaign_entity/entityfields/keywordstates/children/containername_param/valueProcess.js
@@ -0,0 +1,5 @@
+import("system.result");
+import("Keyword_lib");
+import("KeywordRegistry_basic");
+
+result.string($KeywordRegistry.campaignState());
\ No newline at end of file
diff --git a/entity/Campaign_entity/entityfields/participantcount/valueProcess.js b/entity/Campaign_entity/entityfields/participantcount/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..184e4e80abbaceb98e2b8ecc3dc62ff8111b0d0d
--- /dev/null
+++ b/entity/Campaign_entity/entityfields/participantcount/valueProcess.js
@@ -0,0 +1,4 @@
+import("system.result");
+import("system.vars");
+import("Campaign_lib");
+result.string(CampaignUtils.getParticipantCount(vars.get("$field.CAMPAIGNID")));
\ No newline at end of file
diff --git a/entity/Campaign_entity/entityfields/state/displayValueProcess.js b/entity/Campaign_entity/entityfields/state/displayValueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..53f6f8c77cfe099cd4ca554a7b67cb0d9c904aef
--- /dev/null
+++ b/entity/Campaign_entity/entityfields/state/displayValueProcess.js
@@ -0,0 +1,6 @@
+import("system.result");
+import("system.vars");
+import("Keyword_lib");
+import("KeywordRegistry_basic");
+
+result.string(KeywordUtils.getViewValue($KeywordRegistry.campaignState(), vars.get("$field.STATE")));
\ No newline at end of file
diff --git a/entity/Campaign_entity/entityfields/state/valueProcess.js b/entity/Campaign_entity/entityfields/state/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..24a86c10cb9eef3178aa13268f2a7106785b9d07
--- /dev/null
+++ b/entity/Campaign_entity/entityfields/state/valueProcess.js
@@ -0,0 +1,7 @@
+import("system.neon");
+import("system.vars");
+import("system.result");
+import("KeywordRegistry_basic");
+
+if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && !vars.get("$this.value"))
+    result.string($KeywordRegistry.campaignState$planning());
\ No newline at end of file
diff --git a/entity/Campaign_entity/entityfields/stepcount/valueProcess.js b/entity/Campaign_entity/entityfields/stepcount/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..f92f5f8867f499e35d14e6502ce910830cd224ed
--- /dev/null
+++ b/entity/Campaign_entity/entityfields/stepcount/valueProcess.js
@@ -0,0 +1,4 @@
+import("system.result");
+import("system.vars");
+import("Campaign_lib");
+result.string(CampaignUtils.getStepCount(vars.get("$field.CAMPAIGNID")));
\ No newline at end of file
diff --git a/entity/Campaign_entity/entityfields/user_edit/valueProcess.js b/entity/Campaign_entity/entityfields/user_edit/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..6af880ae3e0e2b89b4eee8327ed49f1eefe458af
--- /dev/null
+++ b/entity/Campaign_entity/entityfields/user_edit/valueProcess.js
@@ -0,0 +1,7 @@
+import("system.util");
+import("system.result");
+import("system.neon");
+import("system.vars");
+
+if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_EDIT)
+    result.string(vars.get("$sys.user"));
\ No newline at end of file
diff --git a/entity/Campaign_entity/entityfields/user_new/valueProcess.js b/entity/Campaign_entity/entityfields/user_new/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..e518bc75a9494e53a83613dedd943106e74fc00a
--- /dev/null
+++ b/entity/Campaign_entity/entityfields/user_new/valueProcess.js
@@ -0,0 +1,7 @@
+import("system.util");
+import("system.result");
+import("system.neon");
+import("system.vars");
+
+if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW)
+    result.string(vars.get("$sys.user"));
\ No newline at end of file
diff --git a/entity/Campaign_entity/recordcontainers/db/onDBDelete.js b/entity/Campaign_entity/recordcontainers/db/onDBDelete.js
new file mode 100644
index 0000000000000000000000000000000000000000..fe6d290a0d7833058d4503ef92c6a787bee31f28
--- /dev/null
+++ b/entity/Campaign_entity/recordcontainers/db/onDBDelete.js
@@ -0,0 +1,22 @@
+import("system.db");
+import("system.vars");
+import("Sql_lib");
+
+var currentId = vars.getString("$field.SALESPROJECTID");
+
+if (currentId)
+{
+    var toDelete = [
+        "CAMPAIGNCOST",
+        "CAMPAIGNPARTICIPANT",
+        "CAMPAIGNPARTICIPANTLOG",
+        "CAMPAIGNSTEP",
+    ];
+    
+    toDelete = toDelete.map(function(pTable)
+    {
+        return [pTable, SqlCondition.equals(pTable + ".CAMPAIGN_ID", currentId, "1=2")]
+    });
+    
+    db.deletes(toDelete);
+}
\ No newline at end of file
diff --git a/entity/Campaign_entity/recordcontainers/db/onDBInsert.js b/entity/Campaign_entity/recordcontainers/db/onDBInsert.js
new file mode 100644
index 0000000000000000000000000000000000000000..1792051b832d740de4c08365b71dd39d2e5a0873
--- /dev/null
+++ b/entity/Campaign_entity/recordcontainers/db/onDBInsert.js
@@ -0,0 +1,35 @@
+import("Employee_lib");
+import("system.translate");
+import("KeywordRegistry_basic");
+import("system.util");
+import("system.vars");
+import("system.logging");
+import("system.db");
+import("system.datetime");
+
+var threeWeeks = datetime.ONE_WEEK * 3;
+var inThreeWeeks = datetime.date() + threeWeeks;
+
+var campaignId = vars.get("$field.CAMPAIGNID");
+var campaignStepId = util.getNewUUID();
+var campaignStepName = translate.text("Added");
+
+var dateNew = vars.get("$sys.date");
+var userNew = vars.get("$sys.user");
+
+var dateStart = dateNew;
+var dateEnd = inThreeWeeks;
+
+var description = "";
+var maxParticipants = 100;
+var state = $KeywordRegistry.campaignStepState$open();
+var sorting = 1;
+var employeeContactId = vars.get("$field.EMPLOYEE_CONTACT_ID");
+
+
+var columns = ["CAMPAIGN_ID", "CAMPAIGNSTEPID", "NAME", "DATE_NEW", "USER_NEW", 
+    "DATE_START", "DATE_END", "DESCRIPTION", "MAXPARTICIPANTS", "STATE", "SORTING", "EMPLOYEE_CONTACT_ID"];
+var values = [campaignId, campaignStepId, campaignStepName, dateNew, userNew,
+    dateStart, dateEnd, description, maxParticipants, state, sorting, employeeContactId];
+
+db.insertData("CAMPAIGNSTEP", columns, null, values);
\ No newline at end of file
diff --git a/entity/Campaign_entity/recordcontainers/db/recordfieldmappings/cost.value/expression.js b/entity/Campaign_entity/recordcontainers/db/recordfieldmappings/cost.value/expression.js
new file mode 100644
index 0000000000000000000000000000000000000000..cecf6e4f7c03f399083118f9c9b3413277c9204b
--- /dev/null
+++ b/entity/Campaign_entity/recordcontainers/db/recordfieldmappings/cost.value/expression.js
@@ -0,0 +1,3 @@
+import("system.result");
+
+result.string("(select sum(NET) from CAMPAIGNCOST where CAMPAIGNCOST.CAMPAIGN_ID = CAMPAIGN.CAMPAIGNID)")
\ No newline at end of file
diff --git a/entity/Campaign_entity/recordcontainers/db/recordfieldmappings/state.displayvalue/expression.js b/entity/Campaign_entity/recordcontainers/db/recordfieldmappings/state.displayvalue/expression.js
new file mode 100644
index 0000000000000000000000000000000000000000..95d0ac1d4c1893934b7541d57a1f514ae3a95d7c
--- /dev/null
+++ b/entity/Campaign_entity/recordcontainers/db/recordfieldmappings/state.displayvalue/expression.js
@@ -0,0 +1,6 @@
+import("system.result");
+import("Keyword_lib");
+import("KeywordRegistry_basic");
+
+var sql = KeywordUtils.getResolvedTitleSqlPart($KeywordRegistry.campaignState(), "CAMPAIGN.STATE");
+result.string(sql);
\ No newline at end of file
diff --git a/entity/Campaign_entity/titleProcess.js b/entity/Campaign_entity/titleProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..429260276f9d30b111be834373ee1613df1f7084
--- /dev/null
+++ b/entity/Campaign_entity/titleProcess.js
@@ -0,0 +1,5 @@
+import("Context_lib");
+import("system.result");
+import("system.vars");
+
+result.string(ContextUtils.prefixWithCurrentContextTitle(vars.getString("$field.NAME")));
\ No newline at end of file
diff --git a/entity/Contact_entity/Contact_entity.aod b/entity/Contact_entity/Contact_entity.aod
index 47279e3e9047039685e03cb35436713de26e56ef..d70d8d0861ddb402b8eb3e22bedb8a9045f04bdf 100644
--- a/entity/Contact_entity/Contact_entity.aod
+++ b/entity/Contact_entity/Contact_entity.aod
@@ -2,6 +2,7 @@
 <entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.2">
   <name>Contact_entity</name>
   <title>Contact</title>
+  <description></description>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <documentation>%aditoprj%/entity/Contact_entity/documentation.adoc</documentation>
   <onValidation>%aditoprj%/entity/Contact_entity/onValidation.js</onValidation>
@@ -27,7 +28,6 @@
       <title>Company</title>
       <consumer>Organisations</consumer>
       <mandatory v="false" />
-      <displayValueProcess>%aditoprj%/entity/Contact_entity/entityfields/organisation_id/displayValueProcess.js</displayValueProcess>
       <onValidation>%aditoprj%/entity/Contact_entity/entityfields/organisation_id/onValidation.js</onValidation>
     </entityField>
     <entityField>
@@ -299,10 +299,6 @@
           <name>DATE_EDIT.value</name>
           <recordfield>CONTACT.DATE_EDIT</recordfield>
         </dbRecordFieldMapping>
-        <dbRecordFieldMapping>
-          <name>ORGANISATION_ID.displayValue</name>
-          <recordfield>ORGANISATION.NAME</recordfield>
-        </dbRecordFieldMapping>
       </recordFieldMappings>
     </dbRecordContainer>
   </recordContainers>
diff --git a/entity/Contact_entity/entityfields/organisation_id/displayValueProcess.js b/entity/Contact_entity/entityfields/organisation_id/displayValueProcess.js
deleted file mode 100644
index 460b39849d5d34bac95e4b987d28a665b732e860..0000000000000000000000000000000000000000
--- a/entity/Contact_entity/entityfields/organisation_id/displayValueProcess.js
+++ /dev/null
@@ -1,9 +0,0 @@
-import("system.result");
-import("system.db");
-import("system.vars");
-import("Contact_lib");
-
-var organisationId = vars.get("$field.ORGANISATION_ID");
-var res = OrganisationUtils.getNameByOrganisationId(organisationId);
-
-result.string(res);
\ No newline at end of file
diff --git a/entity/Contract_entity/Contract_entity.aod b/entity/Contract_entity/Contract_entity.aod
index 9b98cff5472e6ba4055a3df13cf89c01c73b2ce4..fcac2f5cbf4f5775864bc6845a0244bee4d86ea1 100644
--- a/entity/Contract_entity/Contract_entity.aod
+++ b/entity/Contract_entity/Contract_entity.aod
@@ -4,6 +4,7 @@
   <title>Contract</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <documentation>%aditoprj%/entity/Contract_entity/documentation.adoc</documentation>
+  <afterUiInit>%aditoprj%/entity/Contract_entity/afterUiInit.js</afterUiInit>
   <iconId>VAADIN:FILE_TEXT</iconId>
   <titleProcess>%aditoprj%/entity/Contract_entity/titleProcess.js</titleProcess>
   <recordContainer>db</recordContainer>
@@ -48,6 +49,7 @@
       <contentType>DATE</contentType>
       <resolution>DAY</resolution>
       <outputFormat>dd.MM.yyyy</outputFormat>
+      <valueProcess>%aditoprj%/entity/Contract_entity/entityfields/contractstart/valueProcess.js</valueProcess>
       <onValidation>%aditoprj%/entity/Contract_entity/entityfields/contractstart/onValidation.js</onValidation>
       <onValueChange>%aditoprj%/entity/Contract_entity/entityfields/contractstart/onValueChange.js</onValueChange>
     </entityField>
diff --git a/entity/Contract_entity/afterUiInit.js b/entity/Contract_entity/afterUiInit.js
new file mode 100644
index 0000000000000000000000000000000000000000..031b635db2bf916a03eda91e8db23dc6c8bb5d35
--- /dev/null
+++ b/entity/Contract_entity/afterUiInit.js
@@ -0,0 +1,9 @@
+import("system.neon");
+import("system.vars");
+import("Context_lib");
+import("Attribute_lib");
+
+if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW)
+{
+    AttributeRelationUtils.presetMandatoryAttributes(ContextUtils.getCurrentContextId(), "Attributes");
+}
diff --git a/entity/Contract_entity/entityfields/contractend/onValidation.js b/entity/Contract_entity/entityfields/contractend/onValidation.js
index c2b570b75775ae1f669ba1a8e7ad9b716e17f2eb..9cfd6fc2f89a9472d2f9822573964a58640e6966 100644
--- a/entity/Contract_entity/entityfields/contractend/onValidation.js
+++ b/entity/Contract_entity/entityfields/contractend/onValidation.js
@@ -1,7 +1,6 @@
 import("system.result");
 import("system.vars");
 import("Date_lib");
-import("Util_lib");
 import("Entity_lib");
 
 var cEnd = ProcessHandlingUtils.getOnValidationValue(vars.get("$field.CONTRACTEND"));
diff --git a/entity/Contract_entity/entityfields/contractstart/onValidation.js b/entity/Contract_entity/entityfields/contractstart/onValidation.js
index f7e82b3fd8a66a24591a7fb75a849799a3755ad4..81cb960ca17d5f47cafe286002b0e4c4b381aba7 100644
--- a/entity/Contract_entity/entityfields/contractstart/onValidation.js
+++ b/entity/Contract_entity/entityfields/contractstart/onValidation.js
@@ -1,8 +1,6 @@
-import("system.neon");
 import("system.result");
 import("system.vars");
 import("Date_lib");
-import("Util_lib");
 import("Entity_lib");
 
 var cStart = ProcessHandlingUtils.getOnValidationValue(vars.get("$field.CONTRACTSTART"));
diff --git a/entity/Contract_entity/entityfields/contractstart/valueProcess.js b/entity/Contract_entity/entityfields/contractstart/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..7f859f943373ed46e60a1e4786e51216a6a00126
--- /dev/null
+++ b/entity/Contract_entity/entityfields/contractstart/valueProcess.js
@@ -0,0 +1,11 @@
+import("system.result");
+import("system.vars");
+import("system.neon");
+import("Date_lib");
+
+if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && !vars.get("$this.value"))
+{
+    result.string(DateUtils.getTodayUTC());
+}
+else
+    result.string(vars.get("$this.value"));
\ No newline at end of file
diff --git a/entity/Contract_entity/titleProcess.js b/entity/Contract_entity/titleProcess.js
index 46f60176775fe07563734ff5f62aa714afa71e45..3432c05f4a705f9e680c966699b8250a10f8fe53 100644
--- a/entity/Contract_entity/titleProcess.js
+++ b/entity/Contract_entity/titleProcess.js
@@ -1,4 +1,5 @@
+import("Context_lib");
 import("system.vars");
 import("system.result");
 
-result.string(vars.get("$field.CONTRACTCODE_DISPLAY_fieldGroup"));
\ No newline at end of file
+result.string(ContextUtils.prefixWithCurrentContextTitle(vars.get("$field.CONTRACTCODE_DISPLAY_fieldGroup")));
\ No newline at end of file
diff --git a/entity/Countries_Entity/titleProcess.js b/entity/Countries_Entity/titleProcess.js
index 6a1357835421f5c8fe5231388b03ee15dd29f58b..27c78a47f571add3d25469cb7eaa9b3662cb62b3 100644
--- a/entity/Countries_Entity/titleProcess.js
+++ b/entity/Countries_Entity/titleProcess.js
@@ -1,3 +1,4 @@
+import("Context_lib");
 import("system.result");
 import("system.vars");
-result.string(vars.get("$field.NAME_TRANSLATED"));
\ No newline at end of file
+result.string(ContextUtils.prefixWithCurrentContextTitle(vars.get("$field.NAME_TRANSLATED")));
\ No newline at end of file
diff --git a/entity/Employee_entity/Employee_entity.aod b/entity/Employee_entity/Employee_entity.aod
index c84f9b00fa9ce83dbdce9561ed10264ad7891f00..69043649be78f514ad6f86dfae1e39232d60c6b8 100644
--- a/entity/Employee_entity/Employee_entity.aod
+++ b/entity/Employee_entity/Employee_entity.aod
@@ -3,6 +3,7 @@
   <name>Employee_entity</name>
   <title>Employee</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
+  <afterUiInit>%aditoprj%/entity/Employee_entity/afterUiInit.js</afterUiInit>
   <onValidation>%aditoprj%/entity/Employee_entity/onValidation.js</onValidation>
   <afterOperatingState>%aditoprj%/entity/Employee_entity/afterOperatingState.js</afterOperatingState>
   <iconId>VAADIN:GROUP</iconId>
@@ -235,6 +236,18 @@
           <fieldName>Employees</fieldName>
           <isConsumer v="false" />
         </entityDependency>
+        <entityDependency>
+          <name>02bacafb-433c-497d-8561-96c426da61e9</name>
+          <entityName>Campaign_entity</entityName>
+          <fieldName>Employee</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+        <entityDependency>
+          <name>fefc05d2-6087-4600-bc77-80804654809e</name>
+          <entityName>CampaignStep_entity</entityName>
+          <fieldName>Employees</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
       </dependencies>
       <children>
         <entityParameter>
@@ -243,10 +256,6 @@
         </entityParameter>
       </children>
     </entityProvider>
-    <entityField>
-      <name>TITLE_ORIGINAL</name>
-      <searchable v="false" />
-    </entityField>
     <entityConsumer>
       <name>Departments</name>
       <fieldType>DEPENDENCY_OUT</fieldType>
@@ -266,6 +275,12 @@
         </entityParameter>
       </children>
     </entityConsumer>
+    <entityField>
+      <name>USERID</name>
+    </entityField>
+    <entityField>
+      <name>USERID_SMALL</name>
+    </entityField>
   </entityFields>
   <recordContainers>
     <jDitoRecordContainer>
@@ -278,7 +293,6 @@
       <recordFields>
         <element>UID.value</element>
         <element>TITLE.value</element>
-        <element>TITLE_ORIGINAL.value</element>
         <element>ISACTIVE.value</element>
         <element>FIRSTNAME.value</element>
         <element>LASTNAME.value</element>
@@ -288,6 +302,8 @@
         <element>CONTACT_ID.value</element>
         <element>CONTACT_ID.displayValue</element>
         <element>DEPARTMENT.value</element>
+        <element>USERID.value</element>
+        <element>USERID_SMALL.value</element>
       </recordFields>
     </jDitoRecordContainer>
   </recordContainers>
diff --git a/entity/Employee_entity/afterUiInit.js b/entity/Employee_entity/afterUiInit.js
new file mode 100644
index 0000000000000000000000000000000000000000..031b635db2bf916a03eda91e8db23dc6c8bb5d35
--- /dev/null
+++ b/entity/Employee_entity/afterUiInit.js
@@ -0,0 +1,9 @@
+import("system.neon");
+import("system.vars");
+import("Context_lib");
+import("Attribute_lib");
+
+if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW)
+{
+    AttributeRelationUtils.presetMandatoryAttributes(ContextUtils.getCurrentContextId(), "Attributes");
+}
diff --git a/entity/Employee_entity/entityfields/attributes/children/objectrowid_param/valueProcess.js b/entity/Employee_entity/entityfields/attributes/children/objectrowid_param/valueProcess.js
index 16c85500b5355a72548030867e3d300661e9d4aa..4efd08e3fe4c862d5eef9eda053cb9ddf4720b0c 100644
--- a/entity/Employee_entity/entityfields/attributes/children/objectrowid_param/valueProcess.js
+++ b/entity/Employee_entity/entityfields/attributes/children/objectrowid_param/valueProcess.js
@@ -1,4 +1,4 @@
 import("system.vars");
 import("system.result");
 
-result.string(vars.get("$field.UID"));
\ No newline at end of file
+result.string(vars.get("$field.USERID_SMALL"));
\ No newline at end of file
diff --git a/entity/Employee_entity/entityfields/attributetree/children/objectrowid_param/valueProcess.js b/entity/Employee_entity/entityfields/attributetree/children/objectrowid_param/valueProcess.js
index 16c85500b5355a72548030867e3d300661e9d4aa..4efd08e3fe4c862d5eef9eda053cb9ddf4720b0c 100644
--- a/entity/Employee_entity/entityfields/attributetree/children/objectrowid_param/valueProcess.js
+++ b/entity/Employee_entity/entityfields/attributetree/children/objectrowid_param/valueProcess.js
@@ -1,4 +1,4 @@
 import("system.vars");
 import("system.result");
 
-result.string(vars.get("$field.UID"));
\ No newline at end of file
+result.string(vars.get("$field.USERID_SMALL"));
\ No newline at end of file
diff --git a/entity/Employee_entity/entityfields/contact_id/onValidation.js b/entity/Employee_entity/entityfields/contact_id/onValidation.js
index 35de5d935eb3755ddc0c4e9a345da60098433df2..46842576f46eab3aff937175ea2fd26972a66880 100644
--- a/entity/Employee_entity/entityfields/contact_id/onValidation.js
+++ b/entity/Employee_entity/entityfields/contact_id/onValidation.js
@@ -1,12 +1,12 @@
-import("system.result");
-import("system.vars");
-import("system.tools");
-import("system.translate");
-
-var contactId = vars.get("$field.CONTACT_ID");
-var isTaken = tools.getUserByAttribute(tools.CONTACTID, [contactId]);
-isTaken = isTaken 
-    ? isTaken[tools.TITLE] != vars.get("$field.TITLE_ORIGINAL")
-    : false;
-if (contactId && isTaken)
+import("system.result");
+import("system.vars");
+import("system.tools");
+import("system.translate");
+
+var contactId = vars.get("$field.CONTACT_ID");
+var isTaken = tools.getUserByAttribute(tools.CONTACTID, [contactId]);
+isTaken = isTaken 
+    ? isTaken[tools.NAME] != vars.get("$field.USERID")
+    : false;
+if (contactId && isTaken)
     result.string(translate.text("The person is already associated with another employee!"));
\ No newline at end of file
diff --git a/entity/Employee_entity/entityfields/documents/children/assignmentrowid_param/valueProcess.js b/entity/Employee_entity/entityfields/documents/children/assignmentrowid_param/valueProcess.js
index 16c85500b5355a72548030867e3d300661e9d4aa..4efd08e3fe4c862d5eef9eda053cb9ddf4720b0c 100644
--- a/entity/Employee_entity/entityfields/documents/children/assignmentrowid_param/valueProcess.js
+++ b/entity/Employee_entity/entityfields/documents/children/assignmentrowid_param/valueProcess.js
@@ -1,4 +1,4 @@
 import("system.vars");
 import("system.result");
 
-result.string(vars.get("$field.UID"));
\ No newline at end of file
+result.string(vars.get("$field.USERID_SMALL"));
\ No newline at end of file
diff --git a/entity/Employee_entity/entityfields/email_address/onValidation.js b/entity/Employee_entity/entityfields/email_address/onValidation.js
index 35d65102d1e956f09fd9c6298ae86f754c985a83..9525ada052cc9ef5885522ecb5cd6e36b5739c74 100644
--- a/entity/Employee_entity/entityfields/email_address/onValidation.js
+++ b/entity/Employee_entity/entityfields/email_address/onValidation.js
@@ -1,13 +1,13 @@
-import("Entity_lib");
-import("system.result");
-import("system.vars");
-import("system.tools");
-import("system.translate");
-
-var email = ProcessHandlingUtils.getOnValidationValue(vars.get("$field.EMAIL_ADDRESS"));
-var isTaken = tools.getUserByAttribute(tools.EMAIL, [email]);
-isTaken = isTaken 
-    ? isTaken[tools.TITLE] != vars.get("$field.TITLE_ORIGINAL")
-    : false;
-if (email && isTaken)
+import("Entity_lib");
+import("system.result");
+import("system.vars");
+import("system.tools");
+import("system.translate");
+
+var email = ProcessHandlingUtils.getOnValidationValue(vars.get("$field.EMAIL_ADDRESS"));
+var isTaken = tools.getUserByAttribute(tools.EMAIL, [email]);
+isTaken = isTaken 
+    ? isTaken[tools.NAME] != vars.get("$field.USERID")
+    : false;
+if (email && isTaken)
     result.string(translate.text("Email must be unique!"));
\ No newline at end of file
diff --git a/entity/Employee_entity/entityfields/title/onValidation.js b/entity/Employee_entity/entityfields/title/onValidation.js
index b7a2177b025698809ddcc9f2d4adb5ea62cdd6e6..9c3a98b9d7a71864c1c5e687bf2a35e30cb10bbd 100644
--- a/entity/Employee_entity/entityfields/title/onValidation.js
+++ b/entity/Employee_entity/entityfields/title/onValidation.js
@@ -1,11 +1,13 @@
-import("system.translate");
-import("system.neon");
-import("system.result");
-import("system.vars");
-import("system.tools");
-import("Entity_lib");
-
-var title = ProcessHandlingUtils.getOnValidationValue(vars.get("$field.TITLE"));
-if (!(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_EDIT && title == vars.get("$field.TITLE_ORIGINAL")) 
-    && title != "" && tools.existUsers(title))
+import("system.translate");
+import("system.neon");
+import("system.result");
+import("system.vars");
+import("system.tools");
+import("Entity_lib");
+
+var title = ProcessHandlingUtils.getOnValidationValue(vars.get("$field.TITLE"));
+var oldTitle = tools.getUserByAttribute(tools.NAME, vars.get("$field.USERID"), tools.PROFILE_TITLE);
+oldTitle = oldTitle && oldTitle[tools.TITLE];
+if (!(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_EDIT && title == oldTitle) 
+    && title != "" && tools.existUsers(title))
         result.string(translate.text("Username already exists!"));
\ No newline at end of file
diff --git a/entity/Employee_entity/recordcontainers/jdito/contentProcess.js b/entity/Employee_entity/recordcontainers/jdito/contentProcess.js
index ecccde702a88fb72646dd5d94ffd3917a22bec48..95997876508b87928228b38db353af6ebd4022c1 100644
--- a/entity/Employee_entity/recordcontainers/jdito/contentProcess.js
+++ b/entity/Employee_entity/recordcontainers/jdito/contentProcess.js
@@ -5,6 +5,8 @@ import("system.tools");
 import("Util_lib");
 import("Contact_lib");
 import("JditoFilter_lib");
+import("Employee_lib");
+
 var users;
 if (vars.exists("$local.idvalues") && vars.get("$local.idvalues"))
     users = [tools.getUser(vars.get("$local.idvalues"), tools.PROFILE_FULL)];
@@ -19,7 +21,6 @@ else
 users = users.map(function (user)
 {
     return [
-        user[tools.TITLE],
         user[tools.TITLE],
         user[tools.TITLE],
         user[tools.PARAMS][tools.ISACTIVE],
@@ -30,14 +31,16 @@ users = users.map(function (user)
         user[tools.DESCRIPTION],
         user[tools.PARAMS][tools.CONTACTID],
         ContactUtils.getTitleByContactId(user[tools.PARAMS][tools.CONTACTID]), //TODO: get the names more efficiently
-        user[tools.PARAMS].department
+        user[tools.PARAMS].department,
+        user[tools.NAME],
+        EmployeeUtils.sliceUserId(user[tools.NAME])
     ];
 });
 
 var filter = vars.exists("$local.filter") && vars.get("$local.filter"); 
 
 //TODO: this is a workaround that filters the records manually, it should be possible to filter the users with a tools.* method
-users = JditoFilterUtils.filterRecords(["UID", "TITLE", "TITLE_ORIGINAL", "ISACTIVE", "FIRSTNAME", "LASTNAME", "EMAIL_ADDRESS", "DESCRIPTION", "CONTACT_ID", "", "DEPARTMENT"], users, filter);
+users = JditoFilterUtils.filterRecords(["UID", "TITLE", "ISACTIVE", "FIRSTNAME", "LASTNAME", "EMAIL_ADDRESS", "DESCRIPTION", "CONTACT_ID", "", "DEPARTMENT"], users, filter);
 
 
 ArrayUtils.sort2d(users, 0, true, false); //sort by username
diff --git a/entity/Employee_entity/recordcontainers/jdito/onUpdate.js b/entity/Employee_entity/recordcontainers/jdito/onUpdate.js
index ccc3af0949642f34fef08f954f3ee0a71b29f9fb..825985279c1694a30876a88105aba44fb25a7bac 100644
--- a/entity/Employee_entity/recordcontainers/jdito/onUpdate.js
+++ b/entity/Employee_entity/recordcontainers/jdito/onUpdate.js
@@ -17,7 +17,7 @@ FieldChanges.assimilateChangeAndDispose("$field.IMAGE", function (state, value)
         PersUtils.removeImage(personId);
 });
 
-var user = tools.getUser(vars.get("$field.TITLE_ORIGINAL"));
+var user = tools.getUserByAttribute(tools.NAME, vars.get("$field.USERID"));
 
 user[tools.TITLE] = vars.get("$field.TITLE");
 user[tools.PARAMS][tools.ISACTIVE] = vars.get("$field.ISACTIVE");
diff --git a/entity/Employee_entity/titleProcess.js b/entity/Employee_entity/titleProcess.js
index cfe8dbda0147ed4ce85bc5394e118459edb315d1..2c946bc446bdc882880d688ae373ebdf8561a225 100644
--- a/entity/Employee_entity/titleProcess.js
+++ b/entity/Employee_entity/titleProcess.js
@@ -1,4 +1,5 @@
+import("Context_lib");
 import("system.vars");
 import("system.result");
 
-result.string((vars.get("$field.FIRSTNAME") + " " + vars.get("$field.LASTNAME")).trim());
\ No newline at end of file
+result.string(ContextUtils.prefixWithCurrentContextTitle((vars.get("$field.FIRSTNAME") + " " + vars.get("$field.LASTNAME")).trim()));
\ No newline at end of file
diff --git a/entity/IndexSearchEntity/IndexSearchEntity.aod b/entity/IndexSearchEntity/IndexSearchEntity.aod
new file mode 100644
index 0000000000000000000000000000000000000000..a10878bfe9d27169c28993b456511ef2315e2a4a
--- /dev/null
+++ b/entity/IndexSearchEntity/IndexSearchEntity.aod
@@ -0,0 +1,13 @@
+<?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.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.2">
+  <name>IndexSearchEntity</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <entityFields>
+    <entityProvider>
+      <name>#PROVIDER</name>
+    </entityProvider>
+    <entityField>
+      <name>INDEXSEARCHFIELD</name>
+    </entityField>
+  </entityFields>
+</entity>
diff --git a/entity/KeywordAttribute_entity/titleProcess.js b/entity/KeywordAttribute_entity/titleProcess.js
index 28fd67de270b497ba718dd4e91766bd22936f67e..53fee4be6adf0706c04c01952405a9792b65feb5 100644
--- a/entity/KeywordAttribute_entity/titleProcess.js
+++ b/entity/KeywordAttribute_entity/titleProcess.js
@@ -1,4 +1,5 @@
+import("Context_lib");
 import("system.vars");
 import("system.result");
 
-result.string(vars.get("$field.NAME"));
\ No newline at end of file
+result.string(ContextUtils.prefixWithCurrentContextTitle(vars.get("$field.NAME")));
\ No newline at end of file
diff --git a/entity/KeywordEntry_entity/KeywordEntry_entity.aod b/entity/KeywordEntry_entity/KeywordEntry_entity.aod
index 51d103e15918731cc20ee3af53bfc609cafdb83d..6f3c591388a32dd3d3c1236061bd0ed30f21a18c 100644
--- a/entity/KeywordEntry_entity/KeywordEntry_entity.aod
+++ b/entity/KeywordEntry_entity/KeywordEntry_entity.aod
@@ -373,6 +373,18 @@
           <fieldName>Keywords</fieldName>
           <isConsumer v="false" />
         </entityDependency>
+        <entityDependency>
+          <name>b5c39776-509e-4758-8d05-a64eac4e7f38</name>
+          <entityName>CampaignStep_entity</entityName>
+          <fieldName>KeywordStates</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+        <entityDependency>
+          <name>13d739cb-2b97-44a0-bed0-b6868b0e579e</name>
+          <entityName>CampaignCost_entitiy</entityName>
+          <fieldName>KeywordCampaignManagementCostCategory</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
       </dependencies>
       <children>
         <entityParameter>
@@ -433,6 +445,12 @@
         </entityParameter>
       </children>
     </entityConsumer>
+    <entityParameter>
+      <name>ExcludedKeyIdsSubquery_param</name>
+      <expose v="true" />
+      <documentation>%aditoprj%/entity/KeywordEntry_entity/entityfields/excludedkeyidssubquery_param/documentation.adoc</documentation>
+      <description>PARAMETER</description>
+    </entityParameter>
   </entityFields>
   <recordContainers>
     <dbRecordContainer>
diff --git a/entity/KeywordEntry_entity/entityfields/excludedkeyidssubquery_param/documentation.adoc b/entity/KeywordEntry_entity/entityfields/excludedkeyidssubquery_param/documentation.adoc
new file mode 100644
index 0000000000000000000000000000000000000000..5eb6c62c6b9086cf2b3f9818d2ea97612d585d6f
--- /dev/null
+++ b/entity/KeywordEntry_entity/entityfields/excludedkeyidssubquery_param/documentation.adoc
@@ -0,0 +1,2 @@
+Can be filled with a subquery-string, which delivers KeyIds to exclude.
+The subquery is used insade a "KEYID not in(...)" 
\ No newline at end of file
diff --git a/entity/KeywordEntry_entity/recordcontainers/db/conditionProcess.js b/entity/KeywordEntry_entity/recordcontainers/db/conditionProcess.js
index 4fb1ef2f327547a69afb2fe8d5e65cfa2dc1de00..e027aee8210372b3f4626d5286fc48df714de49c 100644
--- a/entity/KeywordEntry_entity/recordcontainers/db/conditionProcess.js
+++ b/entity/KeywordEntry_entity/recordcontainers/db/conditionProcess.js
@@ -1,3 +1,4 @@
+import("system.logging");
 import("system.vars");
 import("system.db");
 import("system.result");
@@ -10,5 +11,8 @@ if (vars.get("$param.OnlyActives_param") == "true")
     cond.andPrepare("AB_KEYWORD_ENTRY.ISACTIVE", "1");
 }
 
+if (vars.exists("$param.ExcludedKeyIdsSubquery_param") && vars.get("$param.ExcludedKeyIdsSubquery_param"))
+    cond.and("AB_KEYWORD_ENTRY.KEYID not in (" + vars.get("$param.ExcludedKeyIdsSubquery_param") + ")");
+
 var condStr = db.translateCondition(cond.build("1 = 1"));
 result.string(condStr);
\ No newline at end of file
diff --git a/entity/KeywordEntry_entity/titleProcess.js b/entity/KeywordEntry_entity/titleProcess.js
index a907335e8d11cf3ec8c18651257f5ab8d96a29b9..3a9950b109a01757e0892bf8cbbd3c8205514385 100644
--- a/entity/KeywordEntry_entity/titleProcess.js
+++ b/entity/KeywordEntry_entity/titleProcess.js
@@ -1,4 +1,5 @@
+import("Context_lib");
 import("system.vars");
 import("system.result");
 
-result.string(vars.get("$field.TITLE_TRANSLATED"));
\ No newline at end of file
+result.string(ContextUtils.prefixWithCurrentContextTitle(vars.get("$field.TITLE_TRANSLATED")));
\ No newline at end of file
diff --git a/entity/Notification_entity/Notification_entity.aod b/entity/Notification_entity/Notification_entity.aod
new file mode 100644
index 0000000000000000000000000000000000000000..dbb94e5cc932ddbe3b4c7e97cac1c93c6f410e02
--- /dev/null
+++ b/entity/Notification_entity/Notification_entity.aod
@@ -0,0 +1,160 @@
+<?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.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.2">
+  <name>Notification_entity</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <recordContainer>db</recordContainer>
+  <entityFields>
+    <entityProvider>
+      <name>#PROVIDER</name>
+      <targetContextField>LINKCONTEXT</targetContextField>
+      <targetIdField>LINKID</targetIdField>
+      <recordContainer>db</recordContainer>
+    </entityProvider>
+    <entityField>
+      <name>UID</name>
+    </entityField>
+    <entityField>
+      <name>CONTENTID</name>
+    </entityField>
+    <entityField>
+      <name>USER</name>
+    </entityField>
+    <entityField>
+      <name>STATE</name>
+    </entityField>
+    <entityField>
+      <name>BACKPACK</name>
+    </entityField>
+    <entityField>
+      <name>CAPTION</name>
+    </entityField>
+    <entityField>
+      <name>CREATIONDATE</name>
+    </entityField>
+    <entityField>
+      <name>DESCRIPTION</name>
+    </entityField>
+    <entityField>
+      <name>FORCEDPRIORITY</name>
+    </entityField>
+    <entityField>
+      <name>ICON</name>
+    </entityField>
+    <entityField>
+      <name>LIFETIME</name>
+    </entityField>
+    <entityField>
+      <name>ORIGINATORNAME</name>
+    </entityField>
+    <entityField>
+      <name>RECIPIENTUSERIDS</name>
+    </entityField>
+    <entityField>
+      <name>TYPECODE</name>
+    </entityField>
+    <entityField>
+      <name>VERSION</name>
+    </entityField>
+    <entityField>
+      <name>LINKCONTEXT</name>
+      <valueProcess>%aditoprj%/entity/Notification_entity/entityfields/linkcontext/valueProcess.js</valueProcess>
+    </entityField>
+    <entityField>
+      <name>LINKID</name>
+      <valueProcess>%aditoprj%/entity/Notification_entity/entityfields/linkid/valueProcess.js</valueProcess>
+    </entityField>
+    <entityField>
+      <name>LINKINFO</name>
+    </entityField>
+  </entityFields>
+  <recordContainers>
+    <dbRecordContainer>
+      <name>db</name>
+      <alias>_____SYSTEMALIAS</alias>
+      <isPageable v="false" />
+      <conditionProcess>%aditoprj%/entity/Notification_entity/recordcontainers/db/conditionProcess.js</conditionProcess>
+      <linkInformation>
+        <linkInformation>
+          <name>33b9740c-cd3d-43ec-97e6-65c9e880655a</name>
+          <tableName>ASYS_NOTIFICATIONS</tableName>
+          <primaryKey>ID</primaryKey>
+          <isUIDTable v="true" />
+          <readonly v="false" />
+        </linkInformation>
+        <linkInformation>
+          <name>b9a8b01d-bdc5-4132-801f-be4e799fff1c</name>
+          <tableName>ASYS_NOTIFICATIONCONTENTS</tableName>
+          <primaryKey>CONTENTID</primaryKey>
+          <isUIDTable v="false" />
+          <readonly v="true" />
+        </linkInformation>
+      </linkInformation>
+      <recordFieldMappings>
+        <dbRecordFieldMapping>
+          <name>BACKPACK.value</name>
+          <recordfield>ASYS_NOTIFICATIONCONTENTS.BACKPACK</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>CAPTION.value</name>
+          <recordfield>ASYS_NOTIFICATIONCONTENTS.CAPTION</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>CONTENTID.value</name>
+          <recordfield>ASYS_NOTIFICATIONCONTENTS.CONTENTID</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>CREATIONDATE.value</name>
+          <recordfield>ASYS_NOTIFICATIONCONTENTS.CREATIONDATE</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>DESCRIPTION.value</name>
+          <recordfield>ASYS_NOTIFICATIONCONTENTS.DESCRIPTION</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>FORCEDPRIORITY.value</name>
+          <recordfield>ASYS_NOTIFICATIONCONTENTS.FORCEDPRIORITY</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>ICON.value</name>
+          <recordfield>ASYS_NOTIFICATIONCONTENTS.ICON_INFO</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>LIFETIME.value</name>
+          <recordfield>ASYS_NOTIFICATIONCONTENTS.LIFETIME</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>ORIGINATORNAME.value</name>
+          <recordfield>ASYS_NOTIFICATIONCONTENTS.ORIGINATORNAME</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>RECIPIENTUSERIDS.value</name>
+          <recordfield>ASYS_NOTIFICATIONCONTENTS.RECIPIENTUSERIDS</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>STATE.value</name>
+          <recordfield>ASYS_NOTIFICATIONS.STATE</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>TYPECODE.value</name>
+          <recordfield>ASYS_NOTIFICATIONCONTENTS.TYPECODE</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>UID.value</name>
+          <recordfield>ASYS_NOTIFICATIONS.ID</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>USER.value</name>
+          <recordfield>ASYS_NOTIFICATIONS.USERID</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>VERSION.value</name>
+          <recordfield>ASYS_NOTIFICATIONCONTENTS.VERSION</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>LINKINFO.value</name>
+          <recordfield>ASYS_NOTIFICATIONCONTENTS.LINK_INFO</recordfield>
+        </dbRecordFieldMapping>
+      </recordFieldMappings>
+    </dbRecordContainer>
+  </recordContainers>
+</entity>
diff --git a/entity/Notification_entity/entityfields/linkcontext/valueProcess.js b/entity/Notification_entity/entityfields/linkcontext/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..276ea44e9a0d5b7e1850d52e12fd455c6fd6f7b6
--- /dev/null
+++ b/entity/Notification_entity/entityfields/linkcontext/valueProcess.js
@@ -0,0 +1,8 @@
+import("system.logging");
+import("system.vars");
+import("system.result");
+import("system.text");
+
+var context = text.decodeMS(vars.get("$field.LINKINFO"))[0];
+logging.log("context: " + context);
+result.string(context);
\ No newline at end of file
diff --git a/entity/Notification_entity/entityfields/linkid/valueProcess.js b/entity/Notification_entity/entityfields/linkid/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..53b0ffeef7c0efe723e17be8af25a010c77e09d5
--- /dev/null
+++ b/entity/Notification_entity/entityfields/linkid/valueProcess.js
@@ -0,0 +1,8 @@
+import("system.logging");
+import("system.vars");
+import("system.result");
+import("system.text");
+
+var id = text.decodeMS(vars.get("$field.LINKINFO"))[1];
+logging.log("id: " + id);
+result.string(id);
\ No newline at end of file
diff --git a/entity/Notification_entity/recordcontainers/db/conditionProcess.js b/entity/Notification_entity/recordcontainers/db/conditionProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..31f26547b3faf99eaa911946fdc2cd184a94f2ad
--- /dev/null
+++ b/entity/Notification_entity/recordcontainers/db/conditionProcess.js
@@ -0,0 +1,10 @@
+import("system.logging");
+import("system.result");
+import("system.vars");
+import("system.util");
+import("system.tools");
+
+var user = tools.getCurrentUser();
+var userid = user["name"];
+
+result.object("ASYS_NOTIFICATIONS.CONTENTID = ASYS_NOTIFICATIONCONTENTS.CONTENTID and USERID = '" + userid + "'");
\ No newline at end of file
diff --git a/entity/ObjectRelationType_entity/titleProcess.js b/entity/ObjectRelationType_entity/titleProcess.js
index dbc0c500302fcbb7dfe706e35445f9f01952daa5..5f55a99abcb8803e2573f23cf9027f7da40370a6 100644
--- a/entity/ObjectRelationType_entity/titleProcess.js
+++ b/entity/ObjectRelationType_entity/titleProcess.js
@@ -1,12 +1,13 @@
+import("Context_lib");
 import("system.translate");
 import("system.vars");
 import("system.result");
 
 if (vars.exists("$param.OnlyFirstSide_param") && vars.get("$param.OnlyFirstSide_param") == "1" && vars.get("$field.DIRECTION") != "same")
 {
-    result.string(translate.text(vars.get("$field.SOURCE_RELATION_TITLE")) + " -> " + translate.text(vars.get("$field.DEST_RELATION_TITLE")));
+    result.string(ContextUtils.prefixWithCurrentContextTitle(translate.text(vars.get("$field.SOURCE_RELATION_TITLE")) + " -> " + translate.text(vars.get("$field.DEST_RELATION_TITLE"))));
 }
 else
 {
-    result.string(translate.text(vars.get("$field.SOURCE_RELATION_TITLE")));
+    result.string(ContextUtils.prefixWithCurrentContextTitle(translate.text(vars.get("$field.SOURCE_RELATION_TITLE"))));
 }
\ No newline at end of file
diff --git a/entity/ObjectTree_entity/entityfields/target_id/linkedContextProcess.js b/entity/ObjectTree_entity/entityfields/target_id/linkedContextProcess.js
index 1309ba4e92dedd6284a0482f87b00c1c46a0f7c8..215d53285d594413acd924470d6bfd2d8e735ee8 100644
--- a/entity/ObjectTree_entity/entityfields/target_id/linkedContextProcess.js
+++ b/entity/ObjectTree_entity/entityfields/target_id/linkedContextProcess.js
@@ -5,4 +5,4 @@ import("Context_lib");
 if (vars.get("$field.TARGET_CONTEXT"))
 {
     result.string(ContextUtils.getContextName(vars.get("$field.TARGET_CONTEXT")));
-}
+}
\ No newline at end of file
diff --git a/entity/Object_entity/Object_entity.aod b/entity/Object_entity/Object_entity.aod
index 99ed95858065c06f5a57e982a8701195b1d412c1..a1759bc528bc35bd0bc3af5e0e6086611d43b612 100644
--- a/entity/Object_entity/Object_entity.aod
+++ b/entity/Object_entity/Object_entity.aod
@@ -133,6 +133,7 @@
     <entityProvider>
       <name>FilteredObjects</name>
       <fieldType>DEPENDENCY_IN</fieldType>
+      <targetConsumerProcess>%aditoprj%/entity/Object_entity/entityfields/filteredobjects/targetConsumerProcess.js</targetConsumerProcess>
       <dependencies>
         <entityDependency>
           <name>e644a709-cc8f-425e-bef2-9c51eea9bbe9</name>
diff --git a/entity/Object_entity/entityfields/allobjects/targetConsumerProcess.js b/entity/Object_entity/entityfields/allobjects/targetConsumerProcess.js
index 1a9d1e2e9d5ce31c14e07d1f1eee3f01b05eba78..8ba22ed45d1674ebb7da780fa596b38df518d035 100644
--- a/entity/Object_entity/entityfields/allobjects/targetConsumerProcess.js
+++ b/entity/Object_entity/entityfields/allobjects/targetConsumerProcess.js
@@ -4,28 +4,7 @@ import("Context_lib");
 
 if (vars.exists("$param.ObjectType_param") && vars.get("$param.ObjectType_param"))
 {
-    switch(vars.get("$param.ObjectType_param"))
-    {
-        case ContextUtils.getContextName("Organisation"):
-            result.string("Organisations");
-            break;
-        case ContextUtils.getContextName("Person"):
-            result.string("Persons");
-            break;
-        case ContextUtils.getContextName("Offer"):
-            result.string("Offers");
-            break;
-        case ContextUtils.getContextName("Order"):
-            result.string("Orders");
-            break;
-        case ContextUtils.getContextName("Product"):
-            result.string("Products");
-            break;
-        case ContextUtils.getContextName("Contract"):
-            result.string("Contracts");
-            break;      
-        case ContextUtils.getContextName("Salesproject"):
-            result.string("Salesprojects");
-            break;             
-    }
+    var consumer = ContextUtils.getContextConsumer(vars.get("$param.ObjectType_param"));
+    if (consumer)
+        result.string(consumer);
 }
\ No newline at end of file
diff --git a/entity/Object_entity/entityfields/filteredobjects/targetConsumerProcess.js b/entity/Object_entity/entityfields/filteredobjects/targetConsumerProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..8ba22ed45d1674ebb7da780fa596b38df518d035
--- /dev/null
+++ b/entity/Object_entity/entityfields/filteredobjects/targetConsumerProcess.js
@@ -0,0 +1,10 @@
+import("system.vars");
+import("system.result");
+import("Context_lib");
+
+if (vars.exists("$param.ObjectType_param") && vars.get("$param.ObjectType_param"))
+{
+    var consumer = ContextUtils.getContextConsumer(vars.get("$param.ObjectType_param"));
+    if (consumer)
+        result.string(consumer);
+}
\ No newline at end of file
diff --git a/entity/Offer_entity/Offer_entity.aod b/entity/Offer_entity/Offer_entity.aod
index 91ae54bf765710fac211ecd00690ecd194fcfd90..d8d4f2b4d157abcd69062d6799cc6e15112588bf 100644
--- a/entity/Offer_entity/Offer_entity.aod
+++ b/entity/Offer_entity/Offer_entity.aod
@@ -4,6 +4,7 @@
   <title>Offer</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <documentation>%aditoprj%/entity/Offer_entity/documentation.adoc</documentation>
+  <afterUiInit>%aditoprj%/entity/Offer_entity/afterUiInit.js</afterUiInit>
   <iconId>VAADIN:CART</iconId>
   <titleProcess>%aditoprj%/entity/Offer_entity/titleProcess.js</titleProcess>
   <recordContainer>db</recordContainer>
@@ -240,17 +241,6 @@
         <element>VERSNR</element>
       </fields>
     </entityFieldGroup>
-    <entityFieldGroup>
-      <name>Offer_OfferCode_VersNr_fieldgroup</name>
-      <valueProcess>%aditoprj%/entity/Offer_entity/entityfields/offer_offercode_versnr_fieldgroup/valueProcess.js</valueProcess>
-      <title>Offer number</title>
-      <description>"Offer " + OfferCode + VersNr</description>
-      <state>READONLY</state>
-      <fields>
-        <element>OFFERCODE</element>
-        <element>VERSNR</element>
-      </fields>
-    </entityFieldGroup>
     <entityParameter>
       <name>ContactId_param</name>
       <expose v="true" />
diff --git a/entity/Offer_entity/afterUiInit.js b/entity/Offer_entity/afterUiInit.js
new file mode 100644
index 0000000000000000000000000000000000000000..ac1ce38fae75b5e38fc7043f5710ce3fd07ce7be
--- /dev/null
+++ b/entity/Offer_entity/afterUiInit.js
@@ -0,0 +1,9 @@
+import("system.neon");
+import("system.vars");
+import("Context_lib");
+import("Attribute_lib");
+
+if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW)
+{
+    AttributeRelationUtils.presetMandatoryAttributes(ContextUtils.getCurrentContextId(), "Attributes");
+}
diff --git a/entity/Offer_entity/entityfields/offer_offercode_versnr_fieldgroup/valueProcess.js b/entity/Offer_entity/entityfields/offer_offercode_versnr_fieldgroup/valueProcess.js
deleted file mode 100644
index 6b1c8c5befc8421b5acd2fb8a5a3265d71202e4c..0000000000000000000000000000000000000000
--- a/entity/Offer_entity/entityfields/offer_offercode_versnr_fieldgroup/valueProcess.js
+++ /dev/null
@@ -1,8 +0,0 @@
-import("system.translate");
-import("system.result");
-import("system.vars");
-
-// TODO: Kern-Fix, VersNr wird bei indirektem Aufruf nicht geladen, wenn kein "$field.VERSNR" hier ist:
-"$field.VERSNR"
-
-result.string(translate.text("Offer") + " " + vars.get("$field.OfferCode_VersNr_fieldgroup")); 
diff --git a/entity/Offer_entity/entityfields/offerdate/valueProcess.js b/entity/Offer_entity/entityfields/offerdate/valueProcess.js
index 09c66d00cc0e8b740a0b3c68c2b7d16947027795..6b67243627ceda867da63df21c0600d67442cbbf 100644
--- a/entity/Offer_entity/entityfields/offerdate/valueProcess.js
+++ b/entity/Offer_entity/entityfields/offerdate/valueProcess.js
@@ -3,7 +3,7 @@ import("system.result");
 import("system.neon");
 import("Date_lib");
 
-if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && vars.get("$this.value") == "")
+if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && !vars.get("$this.value"))
 {
     result.string(DateUtils.getTodayUTC());
 }
diff --git a/entity/Offer_entity/titleProcess.js b/entity/Offer_entity/titleProcess.js
index b5301f43f0d44e22f8ee928719b999098e446a51..7baf0cfba8e76a9744e1b9a3253f7f4f8ee97e86 100644
--- a/entity/Offer_entity/titleProcess.js
+++ b/entity/Offer_entity/titleProcess.js
@@ -1,4 +1,5 @@
+import("Context_lib");
 import("system.vars");
 import("system.result");
 
-result.string(vars.get("$field.Offer_OfferCode_VersNr_fieldgroup"));
\ No newline at end of file
+result.string(ContextUtils.prefixWithCurrentContextTitle(vars.get("$field.OfferCode_VersNr_fieldgroup")));
\ No newline at end of file
diff --git a/entity/Order_entity/Order_entity.aod b/entity/Order_entity/Order_entity.aod
index 0afa28adacc332d4fabaca6ccb890838a0b1cd89..197dad83f612a49af47bf090e9f4e9bddee8ffda 100644
--- a/entity/Order_entity/Order_entity.aod
+++ b/entity/Order_entity/Order_entity.aod
@@ -4,6 +4,7 @@
   <title>Receipt</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <documentation>%aditoprj%/entity/Order_entity/documentation.adoc</documentation>
+  <afterUiInit>%aditoprj%/entity/Order_entity/afterUiInit.js</afterUiInit>
   <iconId>VAADIN:DOLLAR</iconId>
   <titleProcess>%aditoprj%/entity/Order_entity/titleProcess.js</titleProcess>
   <recordContainer>db</recordContainer>
@@ -203,17 +204,6 @@
         <element>VERSNR</element>
       </fields>
     </entityFieldGroup>
-    <entityFieldGroup>
-      <name>Order_OrderCode_VersNr_fieldgroup</name>
-      <valueProcess>%aditoprj%/entity/Order_entity/entityfields/order_ordercode_versnr_fieldgroup/valueProcess.js</valueProcess>
-      <title>Receipt number</title>
-      <description>"Receipt " + ReceiptCode + VersNr</description>
-      <state>READONLY</state>
-      <fields>
-        <element>SALESORDERCODE</element>
-        <element>VERSNR</element>
-      </fields>
-    </entityFieldGroup>
     <entityParameter>
       <name>ContactId_param</name>
       <expose v="true" />
@@ -446,6 +436,46 @@
         </entityParameter>
       </children>
     </entityConsumer>
+    <entityConsumer>
+      <name>Attributes</name>
+      <title>Attributes</title>
+      <fieldType>DEPENDENCY_OUT</fieldType>
+      <dependency>
+        <name>dependency</name>
+        <entityName>AttributeRelation_entity</entityName>
+        <fieldName>RelationsForSpecificObject</fieldName>
+      </dependency>
+      <children>
+        <entityParameter>
+          <name>ObjectRowId_param</name>
+          <valueProcess>%aditoprj%/entity/Order_entity/entityfields/attributes/children/objectrowid_param/valueProcess.js</valueProcess>
+        </entityParameter>
+        <entityParameter>
+          <name>ObjectType_param</name>
+          <valueProcess>%aditoprj%/entity/Order_entity/entityfields/attributes/children/objecttype_param/valueProcess.js</valueProcess>
+        </entityParameter>
+      </children>
+    </entityConsumer>
+    <entityConsumer>
+      <name>AttributeTree</name>
+      <title>Attributes</title>
+      <fieldType>DEPENDENCY_OUT</fieldType>
+      <dependency>
+        <name>dependency</name>
+        <entityName>AttributeRelationTree_entity</entityName>
+        <fieldName>TreeProvider</fieldName>
+      </dependency>
+      <children>
+        <entityParameter>
+          <name>ObjectType_param</name>
+          <valueProcess>%aditoprj%/entity/Order_entity/entityfields/attributetree/children/objecttype_param/valueProcess.js</valueProcess>
+        </entityParameter>
+        <entityParameter>
+          <name>ObjectRowId_param</name>
+          <valueProcess>%aditoprj%/entity/Order_entity/entityfields/attributetree/children/objectrowid_param/valueProcess.js</valueProcess>
+        </entityParameter>
+      </children>
+    </entityConsumer>
   </entityFields>
   <recordContainers>
     <dbRecordContainer>
diff --git a/entity/Order_entity/afterUiInit.js b/entity/Order_entity/afterUiInit.js
new file mode 100644
index 0000000000000000000000000000000000000000..ac1ce38fae75b5e38fc7043f5710ce3fd07ce7be
--- /dev/null
+++ b/entity/Order_entity/afterUiInit.js
@@ -0,0 +1,9 @@
+import("system.neon");
+import("system.vars");
+import("Context_lib");
+import("Attribute_lib");
+
+if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW)
+{
+    AttributeRelationUtils.presetMandatoryAttributes(ContextUtils.getCurrentContextId(), "Attributes");
+}
diff --git a/entity/Order_entity/entityfields/attributes/children/objectrowid_param/valueProcess.js b/entity/Order_entity/entityfields/attributes/children/objectrowid_param/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..2d458f3d3e14b4d4de7e16459e7ca915b9aafa16
--- /dev/null
+++ b/entity/Order_entity/entityfields/attributes/children/objectrowid_param/valueProcess.js
@@ -0,0 +1,4 @@
+import("system.vars");
+import("system.result");
+
+result.string(vars.get("$field.SALESORDERID"));
\ No newline at end of file
diff --git a/entity/Order_entity/entityfields/attributes/children/objecttype_param/valueProcess.js b/entity/Order_entity/entityfields/attributes/children/objecttype_param/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..008915f61deac19ccdd40fff81701de63eb3b6a2
--- /dev/null
+++ b/entity/Order_entity/entityfields/attributes/children/objecttype_param/valueProcess.js
@@ -0,0 +1,4 @@
+import("system.result");
+import("Context_lib");
+
+result.string(ContextUtils.getCurrentContextId());
\ No newline at end of file
diff --git a/entity/Order_entity/entityfields/attributetree/children/objectrowid_param/valueProcess.js b/entity/Order_entity/entityfields/attributetree/children/objectrowid_param/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..2d458f3d3e14b4d4de7e16459e7ca915b9aafa16
--- /dev/null
+++ b/entity/Order_entity/entityfields/attributetree/children/objectrowid_param/valueProcess.js
@@ -0,0 +1,4 @@
+import("system.vars");
+import("system.result");
+
+result.string(vars.get("$field.SALESORDERID"));
\ No newline at end of file
diff --git a/entity/Order_entity/entityfields/attributetree/children/objecttype_param/valueProcess.js b/entity/Order_entity/entityfields/attributetree/children/objecttype_param/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..008915f61deac19ccdd40fff81701de63eb3b6a2
--- /dev/null
+++ b/entity/Order_entity/entityfields/attributetree/children/objecttype_param/valueProcess.js
@@ -0,0 +1,4 @@
+import("system.result");
+import("Context_lib");
+
+result.string(ContextUtils.getCurrentContextId());
\ No newline at end of file
diff --git a/entity/Order_entity/entityfields/order_ordercode_versnr_fieldgroup/valueProcess.js b/entity/Order_entity/entityfields/order_ordercode_versnr_fieldgroup/valueProcess.js
deleted file mode 100644
index 777196873cb611d0ad72ee486c0ff35c964a3da8..0000000000000000000000000000000000000000
--- a/entity/Order_entity/entityfields/order_ordercode_versnr_fieldgroup/valueProcess.js
+++ /dev/null
@@ -1,8 +0,0 @@
-import("system.translate");
-import("system.result");
-import("system.vars");
-
-// TODO: Kern-Fix, VersNr wird bei indirektem Aufruf nicht geladen, wenn kein "$field.VERSNR" hier ist:
-"$field.VERSNR"
-
-result.string(translate.text("Order") + " " + vars.get("$field.OrderCode_VersNr_fieldgroup")); 
diff --git a/entity/Order_entity/entityfields/salesorderdate/valueProcess.js b/entity/Order_entity/entityfields/salesorderdate/valueProcess.js
index 09c66d00cc0e8b740a0b3c68c2b7d16947027795..6b67243627ceda867da63df21c0600d67442cbbf 100644
--- a/entity/Order_entity/entityfields/salesorderdate/valueProcess.js
+++ b/entity/Order_entity/entityfields/salesorderdate/valueProcess.js
@@ -3,7 +3,7 @@ import("system.result");
 import("system.neon");
 import("Date_lib");
 
-if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && vars.get("$this.value") == "")
+if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && !vars.get("$this.value"))
 {
     result.string(DateUtils.getTodayUTC());
 }
diff --git a/entity/Order_entity/titleProcess.js b/entity/Order_entity/titleProcess.js
index f9b8aea4a9a3b5f300dde8fc9cbf5863a59ec3e5..37977fc62e9742a3d34b3cea24de1cbabe06cfa1 100644
--- a/entity/Order_entity/titleProcess.js
+++ b/entity/Order_entity/titleProcess.js
@@ -1,5 +1,6 @@
+import("Context_lib");
 import("system.translate");
 import("system.vars");
 import("system.result");
 
-result.string(translate.text("Receipt") + " " + vars.get("$field.OrderCode_VersNr_fieldgroup"));
+result.string(ContextUtils.prefixWithCurrentContextTitle(vars.get("$field.OrderCode_VersNr_fieldgroup")));
diff --git a/entity/Orderitem_entity/entityfields/quantity/valueProcess.js b/entity/Orderitem_entity/entityfields/quantity/valueProcess.js
index f6173830c1313bf8a59babc8c9f76ba54df6069a..51d655d5bff03c5552b7f5aabbb9b271a1db5e03 100644
--- a/entity/Orderitem_entity/entityfields/quantity/valueProcess.js
+++ b/entity/Orderitem_entity/entityfields/quantity/valueProcess.js
@@ -2,7 +2,7 @@ import("system.vars");
 import("system.result");
 import("system.neon");
 
-if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && vars.get("$this.value") == "")
+if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && !vars.get("$this.value"))
 {
     result.string("1");
 }
diff --git a/entity/Organisation_entity/Organisation_entity.aod b/entity/Organisation_entity/Organisation_entity.aod
index 866e4b4a21be65e131dcd6bc51866534e12d57bc..663c477a59206a189d39957e57f8a2e2b5d1256f 100644
--- a/entity/Organisation_entity/Organisation_entity.aod
+++ b/entity/Organisation_entity/Organisation_entity.aod
@@ -5,6 +5,7 @@
   <description>former Org</description>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <documentation>%aditoprj%/entity/Organisation_entity/documentation.adoc</documentation>
+  <afterUiInit>%aditoprj%/entity/Organisation_entity/afterUiInit.js</afterUiInit>
   <iconId>VAADIN:BUILDING</iconId>
   <imageProcess>%aditoprj%/entity/Organisation_entity/imageProcess.js</imageProcess>
   <titleProcess>%aditoprj%/entity/Organisation_entity/titleProcess.js</titleProcess>
@@ -789,6 +790,30 @@
       <valueProcess>%aditoprj%/entity/Organisation_entity/entityfields/avatartext_param/valueProcess.js</valueProcess>
       <description>PARAMETER</description>
     </entityParameter>
+    <entityActionGroup>
+      <name>campaignActionGroup</name>
+      <children>
+        <entityActionField>
+          <name>addToCampaignFromTable</name>
+          <fieldType>ACTION</fieldType>
+          <title>Add to Campaign</title>
+          <onActionProcess>%aditoprj%/entity/Organisation_entity/entityfields/campaignactiongroup/children/addtocampaignfromtable/onActionProcess.js</onActionProcess>
+          <isObjectAction v="false" />
+          <isSelectionAction v="true" />
+          <iconId>NEON:GROUP_APPOINTMENT</iconId>
+          <tooltip>Add the selection to a campaign</tooltip>
+          <tooltipProcess>%aditoprj%/entity/Organisation_entity/entityfields/campaignactiongroup/children/addtocampaignfromtable/tooltipProcess.js</tooltipProcess>
+        </entityActionField>
+      </children>
+    </entityActionGroup>
+    <entityActionField>
+      <name>addToCampaign</name>
+      <fieldType>ACTION</fieldType>
+      <title>Add to Campaign</title>
+      <onActionProcess>%aditoprj%/entity/Organisation_entity/entityfields/addtocampaign/onActionProcess.js</onActionProcess>
+      <iconId>NEON:GROUP_APPOINTMENT</iconId>
+      <tooltip>Choose a campaign and a step to add the contact to a  campaign</tooltip>
+    </entityActionField>
   </entityFields>
   <recordContainers>
     <dbRecordContainer>
diff --git a/entity/Organisation_entity/afterUiInit.js b/entity/Organisation_entity/afterUiInit.js
new file mode 100644
index 0000000000000000000000000000000000000000..031b635db2bf916a03eda91e8db23dc6c8bb5d35
--- /dev/null
+++ b/entity/Organisation_entity/afterUiInit.js
@@ -0,0 +1,9 @@
+import("system.neon");
+import("system.vars");
+import("Context_lib");
+import("Attribute_lib");
+
+if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW)
+{
+    AttributeRelationUtils.presetMandatoryAttributes(ContextUtils.getCurrentContextId(), "Attributes");
+}
diff --git a/entity/Organisation_entity/entityfields/addtocampaign/onActionProcess.js b/entity/Organisation_entity/entityfields/addtocampaign/onActionProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..90dbbcdf2911e2f7f594f6cf5aaf910cfb4a8cec
--- /dev/null
+++ b/entity/Organisation_entity/entityfields/addtocampaign/onActionProcess.js
@@ -0,0 +1,4 @@
+import("system.vars");
+import("Campaign_lib");
+
+CampaignUtils.addParticipant(vars.getString("$field.CONTACTID"));
\ No newline at end of file
diff --git a/entity/Organisation_entity/entityfields/campaignactiongroup/children/addtocampaignfromtable/onActionProcess.js b/entity/Organisation_entity/entityfields/campaignactiongroup/children/addtocampaignfromtable/onActionProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..104558a4d9b4ed76ef4e24ae184815401dbc2749
--- /dev/null
+++ b/entity/Organisation_entity/entityfields/campaignactiongroup/children/addtocampaignfromtable/onActionProcess.js
@@ -0,0 +1,10 @@
+import("system.vars");
+import("system.logging");
+import("system.logging");
+import("system.neon");
+import("Campaign_lib");
+
+if(vars.exists("$sys.selection")) //selektierte IDs als Array
+{
+    CampaignUtils.addParticipants(vars.getString("$sys.selection"));
+}
\ No newline at end of file
diff --git a/entity/Organisation_entity/entityfields/campaignactiongroup/children/addtocampaignfromtable/tooltipProcess.js b/entity/Organisation_entity/entityfields/campaignactiongroup/children/addtocampaignfromtable/tooltipProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..497a88278adfae851d54cddb2968601c0cc58aaf
--- /dev/null
+++ b/entity/Organisation_entity/entityfields/campaignactiongroup/children/addtocampaignfromtable/tooltipProcess.js
@@ -0,0 +1,4 @@
+import("system.translate");
+import("system.result");
+
+result.string(translate.text("Add the selection to a campaign"));
\ No newline at end of file
diff --git a/entity/Organisation_entity/entityfields/status/valueProcess.js b/entity/Organisation_entity/entityfields/status/valueProcess.js
index 13218c16514d81765c7e5dfd47c099996adfe063..ab590b059440372f55b8c6d73d0c47eae06ca396 100644
--- a/entity/Organisation_entity/entityfields/status/valueProcess.js
+++ b/entity/Organisation_entity/entityfields/status/valueProcess.js
@@ -3,5 +3,5 @@ import("system.result");
 import("system.neon");
 import("KeywordRegistry_basic");
 
-if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && vars.get("$this.value") == null)
+if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && !vars.get("$this.value"))
     result.string($KeywordRegistry.contactStatus$active());
\ No newline at end of file
diff --git a/entity/Organisation_entity/titleProcess.js b/entity/Organisation_entity/titleProcess.js
index dffd0bd73b994f31efe37f60430ab35fe4150c02..5f2cd996da8492d6c6ce7a7df50a7a14e47c5796 100644
--- a/entity/Organisation_entity/titleProcess.js
+++ b/entity/Organisation_entity/titleProcess.js
@@ -1,4 +1,5 @@
+import("Context_lib");
 import("system.vars");
 import("system.result");
 
-result.string(vars.get("$field.NAME"))
\ No newline at end of file
+result.string(ContextUtils.prefixWithCurrentContextTitle(vars.get("$field.NAME")))
\ No newline at end of file
diff --git a/entity/Person_entity/Person_entity.aod b/entity/Person_entity/Person_entity.aod
index 1a5a56950bc24b5350a6c9b7fc5ed66f62b3b6d3..e241423f46c7f244337cc0ab75d7b36fa91ab1bf 100644
--- a/entity/Person_entity/Person_entity.aod
+++ b/entity/Person_entity/Person_entity.aod
@@ -5,6 +5,7 @@
   <description>former Pers</description>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <documentation>%aditoprj%/entity/Person_entity/documentation.adoc</documentation>
+  <afterUiInit>%aditoprj%/entity/Person_entity/afterUiInit.js</afterUiInit>
   <onValidation>%aditoprj%/entity/Person_entity/onValidation.js</onValidation>
   <iconId>VAADIN:USERS</iconId>
   <imageProcess>%aditoprj%/entity/Person_entity/imageProcess.js</imageProcess>
@@ -149,6 +150,7 @@
       <valueProcess>%aditoprj%/entity/Person_entity/entityfields/organisation_id/valueProcess.js</valueProcess>
       <displayValueProcess>%aditoprj%/entity/Person_entity/entityfields/organisation_id/displayValueProcess.js</displayValueProcess>
       <onValidation>%aditoprj%/entity/Person_entity/entityfields/organisation_id/onValidation.js</onValidation>
+      <onValueChange>%aditoprj%/entity/Person_entity/entityfields/organisation_id/onValueChange.js</onValueChange>
     </entityField>
     <entityConsumer>
       <name>PersAddresses</name>
@@ -689,6 +691,11 @@ 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>
+          <valueProcess>%aditoprj%/entity/Person_entity/entityfields/contactandorganisationaddresses/children/organisationid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
     </entityConsumer>
@@ -768,6 +775,12 @@ Usually this is used for filtering COMMUNICATION-entries by a specified contact
           <fieldName>Contacts</fieldName>
           <isConsumer v="false" />
         </entityDependency>
+        <entityDependency>
+          <name>e46dcd73-64a8-4b3e-b976-1b4643c54ebb</name>
+          <entityName>CampaignStep_entity</entityName>
+          <fieldName>ContactsConsumer</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
       </dependencies>
       <children>
         <entityParameter>
@@ -800,6 +813,15 @@ Usually this is used for filtering COMMUNICATION-entries by a specified contact
         </entityParameter>
       </children>
     </entityConsumer>
+    <entityActionField>
+      <name>addToCampaign</name>
+      <fieldType>ACTION</fieldType>
+      <title>Add to Campaign</title>
+      <onActionProcess>%aditoprj%/entity/Person_entity/entityfields/addtocampaign/onActionProcess.js</onActionProcess>
+      <actionOrder v="1" />
+      <iconId>NEON:GROUP_APPOINTMENT</iconId>
+      <tooltip>Choose a campaign and a step to add the contact to a  campaign</tooltip>
+    </entityActionField>
     <entityConsumer>
       <name>AttributeTree</name>
       <title>Attributes</title>
@@ -870,6 +892,24 @@ Usually this is used for filtering COMMUNICATION-entries by a specified contact
       <valueProcess>%aditoprj%/entity/Person_entity/entityfields/avatartext_param/valueProcess.js</valueProcess>
       <description>PARAMETER</description>
     </entityParameter>
+    <entityActionGroup>
+      <name>campaignActionGroup</name>
+      <title>Campaign</title>
+      <children>
+        <entityActionField>
+          <name>addToCampaignFromTable</name>
+          <fieldType>ACTION</fieldType>
+          <title>Add to Campaign</title>
+          <onActionProcess>%aditoprj%/entity/Person_entity/entityfields/campaignactiongroup/children/addtocampaignfromtable/onActionProcess.js</onActionProcess>
+          <isMenuAction v="true" />
+          <isObjectAction v="false" />
+          <isSelectionAction v="true" />
+          <iconId>NEON:GROUP_APPOINTMENT</iconId>
+          <tooltip>Add the selection to a campaign</tooltip>
+          <tooltipProcess>%aditoprj%/entity/Person_entity/entityfields/campaignactiongroup/children/addtocampaignfromtable/tooltipProcess.js</tooltipProcess>
+        </entityActionField>
+      </children>
+    </entityActionGroup>
   </entityFields>
   <recordContainers>
     <dbRecordContainer>
diff --git a/entity/Person_entity/afterUiInit.js b/entity/Person_entity/afterUiInit.js
new file mode 100644
index 0000000000000000000000000000000000000000..031b635db2bf916a03eda91e8db23dc6c8bb5d35
--- /dev/null
+++ b/entity/Person_entity/afterUiInit.js
@@ -0,0 +1,9 @@
+import("system.neon");
+import("system.vars");
+import("Context_lib");
+import("Attribute_lib");
+
+if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW)
+{
+    AttributeRelationUtils.presetMandatoryAttributes(ContextUtils.getCurrentContextId(), "Attributes");
+}
diff --git a/entity/Person_entity/entityfields/address_id/valueProcess.js b/entity/Person_entity/entityfields/address_id/valueProcess.js
index f5131447594b4ae38c216e849e0bca9324adaa78..96d98eb54f978592c408e075a0e8b8249e6daedc 100644
--- a/entity/Person_entity/entityfields/address_id/valueProcess.js
+++ b/entity/Person_entity/entityfields/address_id/valueProcess.js
@@ -3,11 +3,12 @@ import("system.vars");
 import("StandardObject_lib");
 
 //  Check if the standard address is already set.
-if (vars.get("$field.ADDRESS_ID") === null || vars.get("$field.ADDRESS_ID") === "" || vars.get("$field.ADDRESS_ID") == 0) {
+if (!vars.get("$field.ADDRESS_ID")) 
+{
     var possibleStandardAddressID = new StandardObject("Address", null, "Person", vars.get("$field.PERSONID"))
         .onPersonValueChange(vars.get("$field.ORGANISATION_ID"));
 
     // If a possible standard addrss was found it should get applied to the field.
-    if (possibleStandardAddressID !== null)
+    if (possibleStandardAddressID)
         result.string(possibleStandardAddressID);
 }
\ No newline at end of file
diff --git a/entity/Person_entity/entityfields/addtocampaign/onActionProcess.js b/entity/Person_entity/entityfields/addtocampaign/onActionProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..90dbbcdf2911e2f7f594f6cf5aaf910cfb4a8cec
--- /dev/null
+++ b/entity/Person_entity/entityfields/addtocampaign/onActionProcess.js
@@ -0,0 +1,4 @@
+import("system.vars");
+import("Campaign_lib");
+
+CampaignUtils.addParticipant(vars.getString("$field.CONTACTID"));
\ No newline at end of file
diff --git a/entity/Person_entity/entityfields/campaignactiongroup/children/addtocampaignfromtable/onActionProcess.js b/entity/Person_entity/entityfields/campaignactiongroup/children/addtocampaignfromtable/onActionProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..4272aa62116b561dd4c1afe4ed5dd86663d57988
--- /dev/null
+++ b/entity/Person_entity/entityfields/campaignactiongroup/children/addtocampaignfromtable/onActionProcess.js
@@ -0,0 +1,9 @@
+import("system.vars");
+import("system.logging");
+import("system.neon");
+import("Campaign_lib");
+    logging.log("sys selection -> " + vars.get("$sys.selection"));
+if(vars.exists("$sys.selection")) //selektierte IDs als Array
+{
+    CampaignUtils.addParticipants(vars.getString("$sys.selection"));
+}
\ No newline at end of file
diff --git a/entity/Person_entity/entityfields/campaignactiongroup/children/addtocampaignfromtable/tooltipProcess.js b/entity/Person_entity/entityfields/campaignactiongroup/children/addtocampaignfromtable/tooltipProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..497a88278adfae851d54cddb2968601c0cc58aaf
--- /dev/null
+++ b/entity/Person_entity/entityfields/campaignactiongroup/children/addtocampaignfromtable/tooltipProcess.js
@@ -0,0 +1,4 @@
+import("system.translate");
+import("system.result");
+
+result.string(translate.text("Add the selection to a campaign"));
\ No newline at end of file
diff --git a/entity/Person_entity/entityfields/contactandorganisationaddresses/children/organisationid_param/valueProcess.js b/entity/Person_entity/entityfields/contactandorganisationaddresses/children/organisationid_param/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..a3b647281edc9773de45eec7b7d8afe949f3eba2
--- /dev/null
+++ b/entity/Person_entity/entityfields/contactandorganisationaddresses/children/organisationid_param/valueProcess.js
@@ -0,0 +1,4 @@
+import("system.vars");
+import("system.result");
+
+result.string(vars.get("$field.ORGANISATION_ID"));
\ No newline at end of file
diff --git a/entity/Person_entity/entityfields/organisation_id/onValueChange.js b/entity/Person_entity/entityfields/organisation_id/onValueChange.js
new file mode 100644
index 0000000000000000000000000000000000000000..928e32fa1fd71adc77ebb8a845d07a137cf372f1
--- /dev/null
+++ b/entity/Person_entity/entityfields/organisation_id/onValueChange.js
@@ -0,0 +1,16 @@
+import("system.logging");
+import("system.result");
+import("system.vars");
+import("system.neon");
+import("StandardObject_lib");
+
+if (!vars.get("$field.ADDRESS_ID") || StandardObject.isOrganisationAddress(vars.get("$field.ADDRESS_ID")))
+{
+    logging.log(vars.get("$field.ADDRESS_ID"))
+    var possibleStandardAddressID = new StandardObject("Address", null, "Person", vars.get("$field.PERSONID"))
+        .onPersonValueChange(vars.get("$field.ORGANISATION_ID"));
+
+    // If a possible standard addrss was found it should get applied to the field.
+    if (possibleStandardAddressID)
+        neon.setFieldValue("$field.ADDRESS_ID", possibleStandardAddressID);
+}
\ No newline at end of file
diff --git a/entity/Person_entity/titleProcess.js b/entity/Person_entity/titleProcess.js
index abaa3df1566528e8dc3e5aad91ac26ab26fe5418..5f2140b1f8870c878bfc8b06a633618471df0aa5 100644
--- a/entity/Person_entity/titleProcess.js
+++ b/entity/Person_entity/titleProcess.js
@@ -1,3 +1,4 @@
+import("Context_lib");
 import("system.vars");
 import("system.result");
 import("Util_lib");
@@ -13,4 +14,4 @@ contact.lastname = vars.get("$field.LASTNAME");
 contact.organisationName = vars.get("$field.ORGANISATION_NAME");
 
 var renderer = new ContactTitleRenderer(contact, null);
-result.string(renderer.asString());
\ No newline at end of file
+result.string(ContextUtils.prefixWithCurrentContextTitle(renderer.asString()));
\ No newline at end of file
diff --git a/entity/Product_entity/Product_entity.aod b/entity/Product_entity/Product_entity.aod
index 010fc23042d719f2f9176c18e359c98791d0092e..d90fa0affa858861d6744471be0936bf23d77788 100644
--- a/entity/Product_entity/Product_entity.aod
+++ b/entity/Product_entity/Product_entity.aod
@@ -4,6 +4,7 @@
   <title>Product</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <documentation>%aditoprj%/entity/Product_entity/documentation.adoc</documentation>
+  <afterUiInit>%aditoprj%/entity/Product_entity/afterUiInit.js</afterUiInit>
   <iconId>VAADIN:HAMMER</iconId>
   <titleProcess>%aditoprj%/entity/Product_entity/titleProcess.js</titleProcess>
   <recordContainer>db</recordContainer>
diff --git a/entity/Product_entity/afterUiInit.js b/entity/Product_entity/afterUiInit.js
new file mode 100644
index 0000000000000000000000000000000000000000..031b635db2bf916a03eda91e8db23dc6c8bb5d35
--- /dev/null
+++ b/entity/Product_entity/afterUiInit.js
@@ -0,0 +1,9 @@
+import("system.neon");
+import("system.vars");
+import("Context_lib");
+import("Attribute_lib");
+
+if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW)
+{
+    AttributeRelationUtils.presetMandatoryAttributes(ContextUtils.getCurrentContextId(), "Attributes");
+}
diff --git a/entity/Product_entity/titleProcess.js b/entity/Product_entity/titleProcess.js
index 4f684f8c2a25b7c72fb953b045428c87e7271751..1df7a714a4dde816d9dded4520659233e3282e80 100644
--- a/entity/Product_entity/titleProcess.js
+++ b/entity/Product_entity/titleProcess.js
@@ -1,4 +1,5 @@
+import("Context_lib");
 import("system.vars");
 import("system.result");
 
-result.string(vars.get("$field.PRODUCTNAME"));
\ No newline at end of file
+result.string(ContextUtils.prefixWithCurrentContextTitle(vars.get("$field.PRODUCTNAME")));
\ No newline at end of file
diff --git a/entity/Productprice_entity/Productprice_entity.aod b/entity/Productprice_entity/Productprice_entity.aod
index 2a4a101c97044df295f234220003729435a5439c..4bcf65351c33b6fdf2475b7d12f731588c1b6e38 100644
--- a/entity/Productprice_entity/Productprice_entity.aod
+++ b/entity/Productprice_entity/Productprice_entity.aod
@@ -91,7 +91,6 @@
       <documentation>%aditoprj%/entity/Productprice_entity/entityfields/pricelist/documentation.adoc</documentation>
       <title>Price list</title>
       <consumer>KeywordPricelists</consumer>
-      <mandatoryProcess>%aditoprj%/entity/Productprice_entity/entityfields/pricelist/mandatoryProcess.js</mandatoryProcess>
       <state>AUTO</state>
       <stateProcess>%aditoprj%/entity/Productprice_entity/entityfields/pricelist/stateProcess.js</stateProcess>
       <titleProcess>%aditoprj%/entity/Productprice_entity/entityfields/pricelist/titleProcess.js</titleProcess>
diff --git a/entity/Productprice_entity/entityfields/buysell/valueProcess.js b/entity/Productprice_entity/entityfields/buysell/valueProcess.js
index 33aba856e9b608b1f09c8c04181e1082b0229a95..f8481bc40d44f280c10a48148b53c71f1b5d0247 100644
--- a/entity/Productprice_entity/entityfields/buysell/valueProcess.js
+++ b/entity/Productprice_entity/entityfields/buysell/valueProcess.js
@@ -2,5 +2,5 @@ import("system.vars");
 import("system.result");
 import("system.neon");
 
-if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && vars.get("$this.value") == "")
+if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && !vars.get("$this.value"))
     result.string("SP");
\ No newline at end of file
diff --git a/entity/Productprice_entity/entityfields/fromquantity/valueProcess.js b/entity/Productprice_entity/entityfields/fromquantity/valueProcess.js
index b2204ba4adb39c57f8f5dd011cf2560d92034c07..b659c0bc4d1a64ec7a7e22a2132763523003f5e9 100644
--- a/entity/Productprice_entity/entityfields/fromquantity/valueProcess.js
+++ b/entity/Productprice_entity/entityfields/fromquantity/valueProcess.js
@@ -2,7 +2,7 @@ import("system.vars");
 import("system.result");
 import("system.neon");
 
-if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && vars.get("$this.value") == "")
+if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && !vars.get("$this.value"))
     result.string("1");
 else
     result.string(vars.get("$this.value"));
\ No newline at end of file
diff --git a/entity/Productprice_entity/entityfields/price/valueProcess.js b/entity/Productprice_entity/entityfields/price/valueProcess.js
index 723d0252aa9b87eb839318b7e5e63d7d7dfc567f..79b1b6752e24ab20067845ce191ee075eab584f2 100644
--- a/entity/Productprice_entity/entityfields/price/valueProcess.js
+++ b/entity/Productprice_entity/entityfields/price/valueProcess.js
@@ -1,6 +1,6 @@
-import("system.vars");
-import("system.result");
-import("system.neon");
-
-if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && vars.get("$this.value") == "")
+import("system.vars");
+import("system.result");
+import("system.neon");
+
+if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && !vars.get("$this.value"))
     result.string("0");
\ No newline at end of file
diff --git a/entity/Productprice_entity/entityfields/pricelist/mandatoryProcess.js b/entity/Productprice_entity/entityfields/pricelist/mandatoryProcess.js
deleted file mode 100644
index a58e5c2bf7ea484c0a9038f0846ecec2f42be31b..0000000000000000000000000000000000000000
--- a/entity/Productprice_entity/entityfields/pricelist/mandatoryProcess.js
+++ /dev/null
@@ -1,10 +0,0 @@
-import("system.neon");
-import("system.vars");
-import("system.result");
-
-if(vars.get("$sys.recordstate") ==  neon.OPERATINGSTATE_NEW && vars.get("$field.CONTACT_ID") != "")
-    result.string("false");
-else
-    result.string("true");
-
-    
\ No newline at end of file
diff --git a/entity/Productprice_entity/entityfields/valid_from/onValidation.js b/entity/Productprice_entity/entityfields/valid_from/onValidation.js
index 5ebbf1a7dccee4b0a58c46b478596bf326697184..6d142999dafedcbed0a2eeca9725a0d82f3ba72f 100644
--- a/entity/Productprice_entity/entityfields/valid_from/onValidation.js
+++ b/entity/Productprice_entity/entityfields/valid_from/onValidation.js
@@ -1,7 +1,6 @@
 import("system.result");
 import("system.vars");
 import("Date_lib");
-import("Util_lib");
 import("Entity_lib");
 
 var cStart = ProcessHandlingUtils.getOnValidationValue(vars.get("$field.VALID_FROM"));
diff --git a/entity/Productprice_entity/entityfields/valid_from/valueProcess.js b/entity/Productprice_entity/entityfields/valid_from/valueProcess.js
index 4a5ac41f637617745a3985ec17bd66594133db52..7f859f943373ed46e60a1e4786e51216a6a00126 100644
--- a/entity/Productprice_entity/entityfields/valid_from/valueProcess.js
+++ b/entity/Productprice_entity/entityfields/valid_from/valueProcess.js
@@ -3,7 +3,7 @@ import("system.vars");
 import("system.neon");
 import("Date_lib");
 
-if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && vars.get("$this.value") == "")
+if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && !vars.get("$this.value"))
 {
     result.string(DateUtils.getTodayUTC());
 }
diff --git a/entity/Productprice_entity/entityfields/valid_to/onValidation.js b/entity/Productprice_entity/entityfields/valid_to/onValidation.js
index 3ada2dd1e76e6dceb2b4c1dbf169bf91e0125579..28693efe69f97ec8a33fddd928127117866f264a 100644
--- a/entity/Productprice_entity/entityfields/valid_to/onValidation.js
+++ b/entity/Productprice_entity/entityfields/valid_to/onValidation.js
@@ -1,7 +1,6 @@
 import("system.result");
 import("system.vars");
 import("Date_lib");
-import("Util_lib");
 import("Entity_lib");
 
 var cEnd = ProcessHandlingUtils.getOnValidationValue(vars.get("$field.VALID_TO"));
diff --git a/entity/Productprice_entity/entityfields/vat/valueProcess.js b/entity/Productprice_entity/entityfields/vat/valueProcess.js
index 723d0252aa9b87eb839318b7e5e63d7d7dfc567f..79b1b6752e24ab20067845ce191ee075eab584f2 100644
--- a/entity/Productprice_entity/entityfields/vat/valueProcess.js
+++ b/entity/Productprice_entity/entityfields/vat/valueProcess.js
@@ -1,6 +1,6 @@
-import("system.vars");
-import("system.result");
-import("system.neon");
-
-if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && vars.get("$this.value") == "")
+import("system.vars");
+import("system.result");
+import("system.neon");
+
+if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && !vars.get("$this.value"))
     result.string("0");
\ No newline at end of file
diff --git a/entity/SalesprojectForecast_entity/SalesprojectForecast_entity.aod b/entity/SalesprojectForecast_entity/SalesprojectForecast_entity.aod
index bb39731c041d0e54d2244e0b183af5da512ca5cb..d9be296864922536d3a0d0bd8bab65084c0dde05 100644
--- a/entity/SalesprojectForecast_entity/SalesprojectForecast_entity.aod
+++ b/entity/SalesprojectForecast_entity/SalesprojectForecast_entity.aod
@@ -14,6 +14,7 @@
       <contentType>DATE</contentType>
       <resolution>DAY</resolution>
       <outputFormat>dd.MM.yyyy</outputFormat>
+      <valueProcess>%aditoprj%/entity/SalesprojectForecast_entity/entityfields/date_start/valueProcess.js</valueProcess>
     </entityField>
     <entityField>
       <name>GROUPCODE</name>
diff --git a/entity/SalesprojectForecast_entity/entityfields/date_start/valueProcess.js b/entity/SalesprojectForecast_entity/entityfields/date_start/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..7f859f943373ed46e60a1e4786e51216a6a00126
--- /dev/null
+++ b/entity/SalesprojectForecast_entity/entityfields/date_start/valueProcess.js
@@ -0,0 +1,11 @@
+import("system.result");
+import("system.vars");
+import("system.neon");
+import("Date_lib");
+
+if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && !vars.get("$this.value"))
+{
+    result.string(DateUtils.getTodayUTC());
+}
+else
+    result.string(vars.get("$this.value"));
\ No newline at end of file
diff --git a/entity/SalesprojectMilestone_entity/titleProcess.js b/entity/SalesprojectMilestone_entity/titleProcess.js
index 658e8105ef136f6e374f80363f1c1d0ace5fba7e..a5a099447859455db9fc077639edf59dc58e2105 100644
--- a/entity/SalesprojectMilestone_entity/titleProcess.js
+++ b/entity/SalesprojectMilestone_entity/titleProcess.js
@@ -1,10 +1,11 @@
+import("Context_lib");
 import("system.vars");
 import("system.translate");
 import("system.result");
 
 if (vars.exists("$field.TYPE") && vars.get("$field.TYPE"))
 {
-    result.string(translate.text("Milestones") + " " + translate.text(vars.get("$field.TYPE")));
+    result.string(ContextUtils.prefixWithCurrentContextTitle(translate.text("Milestones") + " " + translate.text(vars.get("$field.TYPE"))));
 }
 else
-    result.string(translate.text("Milestones"));
\ No newline at end of file
+    result.string(ContextUtils.prefixWithCurrentContextTitle(translate.text("Milestones")));
\ No newline at end of file
diff --git a/entity/Salesproject_entity/Salesproject_entity.aod b/entity/Salesproject_entity/Salesproject_entity.aod
index d0183a15899446c7cb8e11286d712f9ff3cf0536..cf5b6fcfaf15f937f6732b64d3ae57535c33a3d6 100644
--- a/entity/Salesproject_entity/Salesproject_entity.aod
+++ b/entity/Salesproject_entity/Salesproject_entity.aod
@@ -3,6 +3,7 @@
   <name>Salesproject_entity</name>
   <title>Salesproject</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
+  <afterUiInit>%aditoprj%/entity/Salesproject_entity/afterUiInit.js</afterUiInit>
   <afterOperatingState>%aditoprj%/entity/Salesproject_entity/afterOperatingState.js</afterOperatingState>
   <iconId>VAADIN:BOOK_DOLLAR</iconId>
   <titleProcess>%aditoprj%/entity/Salesproject_entity/titleProcess.js</titleProcess>
@@ -32,6 +33,7 @@
       <resolution>DAY</resolution>
       <outputFormat>dd.MM.yyyy</outputFormat>
       <valueProcess>%aditoprj%/entity/Salesproject_entity/entityfields/enddate/valueProcess.js</valueProcess>
+      <onValidation>%aditoprj%/entity/Salesproject_entity/entityfields/enddate/onValidation.js</onValidation>
     </entityField>
     <entityField>
       <name>INFO</name>
@@ -81,6 +83,7 @@
       <outputFormat>dd.MM.yyyy</outputFormat>
       <mandatory v="true" />
       <valueProcess>%aditoprj%/entity/Salesproject_entity/entityfields/startdate/valueProcess.js</valueProcess>
+      <onValidation>%aditoprj%/entity/Salesproject_entity/entityfields/startdate/onValidation.js</onValidation>
     </entityField>
     <entityField>
       <name>STATE</name>
@@ -556,6 +559,46 @@
         <fieldName>StateMilestones</fieldName>
       </dependency>
     </entityConsumer>
+    <entityConsumer>
+      <name>Attributes</name>
+      <title>Attributes</title>
+      <fieldType>DEPENDENCY_OUT</fieldType>
+      <dependency>
+        <name>dependency</name>
+        <entityName>AttributeRelation_entity</entityName>
+        <fieldName>RelationsForSpecificObject</fieldName>
+      </dependency>
+      <children>
+        <entityParameter>
+          <name>ObjectType_param</name>
+          <valueProcess>%aditoprj%/entity/Salesproject_entity/entityfields/attributes/children/objecttype_param/valueProcess.js</valueProcess>
+        </entityParameter>
+        <entityParameter>
+          <name>ObjectRowId_param</name>
+          <valueProcess>%aditoprj%/entity/Salesproject_entity/entityfields/attributes/children/objectrowid_param/valueProcess.js</valueProcess>
+        </entityParameter>
+      </children>
+    </entityConsumer>
+    <entityConsumer>
+      <name>AttributeTree</name>
+      <title>Attributes</title>
+      <fieldType>DEPENDENCY_OUT</fieldType>
+      <dependency>
+        <name>dependency</name>
+        <entityName>AttributeRelationTree_entity</entityName>
+        <fieldName>TreeProvider</fieldName>
+      </dependency>
+      <children>
+        <entityParameter>
+          <name>ObjectType_param</name>
+          <valueProcess>%aditoprj%/entity/Salesproject_entity/entityfields/attributetree/children/objecttype_param/valueProcess.js</valueProcess>
+        </entityParameter>
+        <entityParameter>
+          <name>ObjectRowId_param</name>
+          <valueProcess>%aditoprj%/entity/Salesproject_entity/entityfields/attributetree/children/objectrowid_param/valueProcess.js</valueProcess>
+        </entityParameter>
+      </children>
+    </entityConsumer>
   </entityFields>
   <recordContainers>
     <dbRecordContainer>
diff --git a/entity/Salesproject_entity/afterUiInit.js b/entity/Salesproject_entity/afterUiInit.js
new file mode 100644
index 0000000000000000000000000000000000000000..ac1ce38fae75b5e38fc7043f5710ce3fd07ce7be
--- /dev/null
+++ b/entity/Salesproject_entity/afterUiInit.js
@@ -0,0 +1,9 @@
+import("system.neon");
+import("system.vars");
+import("Context_lib");
+import("Attribute_lib");
+
+if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW)
+{
+    AttributeRelationUtils.presetMandatoryAttributes(ContextUtils.getCurrentContextId(), "Attributes");
+}
diff --git a/entity/Salesproject_entity/entityfields/attributes/children/objectrowid_param/valueProcess.js b/entity/Salesproject_entity/entityfields/attributes/children/objectrowid_param/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..2b119ebfa1944164fd2a1cb645511740bec9015e
--- /dev/null
+++ b/entity/Salesproject_entity/entityfields/attributes/children/objectrowid_param/valueProcess.js
@@ -0,0 +1,4 @@
+import("system.vars");
+import("system.result");
+
+result.string(vars.get("$field.SALESPROJECTID"));
\ No newline at end of file
diff --git a/entity/Salesproject_entity/entityfields/attributes/children/objecttype_param/valueProcess.js b/entity/Salesproject_entity/entityfields/attributes/children/objecttype_param/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..e8b4e72e74a0a4696ff39e83135aa6100ef908c0
--- /dev/null
+++ b/entity/Salesproject_entity/entityfields/attributes/children/objecttype_param/valueProcess.js
@@ -0,0 +1,4 @@
+import("system.result");
+import("Context_lib");
+
+result.string(ContextUtils.getCurrentContextId());
diff --git a/entity/Salesproject_entity/entityfields/attributetree/children/objectrowid_param/valueProcess.js b/entity/Salesproject_entity/entityfields/attributetree/children/objectrowid_param/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..2b119ebfa1944164fd2a1cb645511740bec9015e
--- /dev/null
+++ b/entity/Salesproject_entity/entityfields/attributetree/children/objectrowid_param/valueProcess.js
@@ -0,0 +1,4 @@
+import("system.vars");
+import("system.result");
+
+result.string(vars.get("$field.SALESPROJECTID"));
\ No newline at end of file
diff --git a/entity/Salesproject_entity/entityfields/attributetree/children/objecttype_param/valueProcess.js b/entity/Salesproject_entity/entityfields/attributetree/children/objecttype_param/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..e8b4e72e74a0a4696ff39e83135aa6100ef908c0
--- /dev/null
+++ b/entity/Salesproject_entity/entityfields/attributetree/children/objecttype_param/valueProcess.js
@@ -0,0 +1,4 @@
+import("system.result");
+import("Context_lib");
+
+result.string(ContextUtils.getCurrentContextId());
diff --git a/entity/Salesproject_entity/entityfields/enddate/onValidation.js b/entity/Salesproject_entity/entityfields/enddate/onValidation.js
new file mode 100644
index 0000000000000000000000000000000000000000..11c71f9e9c1f0bc9a2890ce460aafc7d5529a473
--- /dev/null
+++ b/entity/Salesproject_entity/entityfields/enddate/onValidation.js
@@ -0,0 +1,10 @@
+import("system.result");
+import("system.vars");
+import("Date_lib");
+import("Util_lib");
+import("Entity_lib");
+
+var cEnd = ProcessHandlingUtils.getOnValidationValue(vars.get("$field.ENDDATE"));
+
+if (DateUtils.validateBeginnBeforeEnd(vars.get("$field.STARTDATE"), cEnd) === false)
+    result.string(DateUtils.getValidationFailString());
\ No newline at end of file
diff --git a/entity/Salesproject_entity/entityfields/enddate/valueProcess.js b/entity/Salesproject_entity/entityfields/enddate/valueProcess.js
index f6ff85ba891e77ab3a5435a936d573a67defce9a..9cd6d6bfeb34744525ad8934e0fb07ab27a742ec 100644
--- a/entity/Salesproject_entity/entityfields/enddate/valueProcess.js
+++ b/entity/Salesproject_entity/entityfields/enddate/valueProcess.js
@@ -3,7 +3,7 @@ import("system.result");
 import("system.neon");
 import("Date_lib");
 
-if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && vars.get("$this.value") == "")
+if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && !vars.get("$this.value"))
 {
     result.string(DateUtils.getDateIncrementedByYears(DateUtils.getTodayUTC(), 1));
 }
diff --git a/entity/Salesproject_entity/entityfields/startdate/onValidation.js b/entity/Salesproject_entity/entityfields/startdate/onValidation.js
new file mode 100644
index 0000000000000000000000000000000000000000..4e0411453d761b4184537f5ee680cc214e5a74d6
--- /dev/null
+++ b/entity/Salesproject_entity/entityfields/startdate/onValidation.js
@@ -0,0 +1,11 @@
+import("system.neon");
+import("system.result");
+import("system.vars");
+import("Date_lib");
+import("Util_lib");
+import("Entity_lib");
+
+var cStart = ProcessHandlingUtils.getOnValidationValue(vars.get("$field.STARTDATE"));
+
+if (DateUtils.validateBeginnBeforeEnd(cStart, vars.get("$field.ENDDATE")) === false)
+    result.string(DateUtils.getValidationFailString());
\ No newline at end of file
diff --git a/entity/Salesproject_entity/entityfields/startdate/valueProcess.js b/entity/Salesproject_entity/entityfields/startdate/valueProcess.js
index 09c66d00cc0e8b740a0b3c68c2b7d16947027795..6b67243627ceda867da63df21c0600d67442cbbf 100644
--- a/entity/Salesproject_entity/entityfields/startdate/valueProcess.js
+++ b/entity/Salesproject_entity/entityfields/startdate/valueProcess.js
@@ -3,7 +3,7 @@ import("system.result");
 import("system.neon");
 import("Date_lib");
 
-if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && vars.get("$this.value") == "")
+if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && !vars.get("$this.value"))
 {
     result.string(DateUtils.getTodayUTC());
 }
diff --git a/entity/Salesproject_entity/titleProcess.js b/entity/Salesproject_entity/titleProcess.js
index 96a0a030e216f22364464faa38814240f086e885..bcc2474490ec5415d723b0620ebb1458081b6b17 100644
--- a/entity/Salesproject_entity/titleProcess.js
+++ b/entity/Salesproject_entity/titleProcess.js
@@ -1,4 +1,5 @@
+import("Context_lib");
 import("system.vars");
 import("system.result");
 
-result.string(vars.get("$field.PROJECTTITLE"));
\ No newline at end of file
+result.string(ContextUtils.prefixWithCurrentContextTitle(vars.get("$field.PROJECTTITLE")));
\ No newline at end of file
diff --git a/entity/Task_entity/entityfields/maturity_date/onValidation.js b/entity/Task_entity/entityfields/maturity_date/onValidation.js
index bb062404491c5fdbd934a7e23caf370b5c250d6e..c9150833ab7afe40eb4f700569d03ad1e0ba8706 100644
--- a/entity/Task_entity/entityfields/maturity_date/onValidation.js
+++ b/entity/Task_entity/entityfields/maturity_date/onValidation.js
@@ -1 +1,9 @@
-//TODO: add validation for start-date and maturity-date
\ No newline at end of file
+import("system.result");
+import("system.vars");
+import("Date_lib");
+import("Entity_lib");
+
+var cEnd = ProcessHandlingUtils.getOnValidationValue(vars.get("$field.MATURITY_DATE"));
+
+if (DateUtils.validateBeginnBeforeEnd(vars.get("$field.START_DATE"), cEnd) === false)
+    result.string(DateUtils.getValidationFailString());
\ No newline at end of file
diff --git a/entity/Task_entity/entityfields/maturity_date/valueProcess.js b/entity/Task_entity/entityfields/maturity_date/valueProcess.js
index 033144177b08bda5223b19f104b5fdbebf1a7569..080e7e81c25ffad28875eee2a0525bfc2a7f768d 100644
--- a/entity/Task_entity/entityfields/maturity_date/valueProcess.js
+++ b/entity/Task_entity/entityfields/maturity_date/valueProcess.js
@@ -1,11 +1,10 @@
 import("system.eMath");
 import("system.datetime");
-import("system.util");
 import("system.result");
 import("system.neon");
 import("system.vars");
 
-if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW)
+if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && !vars.get("$this.value"))
 {
     var startDate = vars.get("$field.START_DATE");
     var presetVal = eMath.addInt(startDate, datetime.ONE_WEEK);
diff --git a/entity/Task_entity/entityfields/start_date/onValidation.js b/entity/Task_entity/entityfields/start_date/onValidation.js
index bb062404491c5fdbd934a7e23caf370b5c250d6e..4bad868ca52710b422022dd4583f0afde7b000bc 100644
--- a/entity/Task_entity/entityfields/start_date/onValidation.js
+++ b/entity/Task_entity/entityfields/start_date/onValidation.js
@@ -1 +1,11 @@
-//TODO: add validation for start-date and maturity-date
\ No newline at end of file
+import("system.neon");
+import("system.result");
+import("system.vars");
+import("Date_lib");
+import("Util_lib");
+import("Entity_lib");
+
+var cStart = ProcessHandlingUtils.getOnValidationValue(vars.get("$field.START_DATE"));
+
+if (DateUtils.validateBeginnBeforeEnd(cStart, vars.get("$field.MATURITY_DATE")) === false)
+    result.string(DateUtils.getValidationFailString());
\ No newline at end of file
diff --git a/entity/Task_entity/entityfields/start_date/valueProcess.js b/entity/Task_entity/entityfields/start_date/valueProcess.js
index 0b43b2859aece42dabb0f256e8058c6e811677a4..5b098ba003d06ee9125c54f3f53559b2155ea8e3 100644
--- a/entity/Task_entity/entityfields/start_date/valueProcess.js
+++ b/entity/Task_entity/entityfields/start_date/valueProcess.js
@@ -1,10 +1,9 @@
 import("system.datetime");
-import("system.util");
 import("system.result");
 import("system.neon");
 import("system.vars");
 
-if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW)
+if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && !vars.get("$this.value"))
 {
     var presetVal = datetime.date();
     //TODO: depending on what happens in #1032274 we need to manually set the resolution to MINUTES or not (which means we've to set everything smaller than MINUTES (Seconds, etc.) to zero) 
diff --git a/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod b/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod
index ab67a7e7b5022723e0c26b5b547a52564a2517cc..7d36afb0e90d471b736369839c52c5c941ce25c6 100644
--- a/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod
+++ b/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod
@@ -2544,12 +2544,78 @@
     <entry>
       <key>Price policy</key>
     </entry>
+    <entry>
+      <key>Approved</key>
+    </entry>
+    <entry>
+      <key>Completed</key>
+    </entry>
+    <entry>
+      <key>In planning</key>
+    </entry>
+    <entry>
+      <key>Campaign Step</key>
+    </entry>
+    <entry>
+      <key>Campaign Participant</key>
+    </entry>
+    <entry>
+      <key>Campaign Steps</key>
+    </entry>
     <entry>
       <key>360 Degree</key>
     </entry>
+    <entry>
+      <key>Campaigns</key>
+    </entry>
+    <entry>
+      <key>Campaign</key>
+    </entry>
+    <entry>
+      <key>Auswertung</key>
+    </entry>
+    <entry>
+      <key>Reihenfolge</key>
+    </entry>
+    <entry>
+      <key>Zuständiger</key>
+    </entry>
+    <entry>
+      <key>Schritte</key>
+    </entry>
+    <entry>
+      <key>Teilnehmer</key>
+    </entry>
     <entry>
       <key>VAT in %</key>
     </entry>
+    <entry>
+      <key>Kampagnen Schritte</key>
+    </entry>
+    <entry>
+      <key>Kampagnenschritte</key>
+    </entry>
+    <entry>
+      <key>Marketing</key>
+    </entry>
+    <entry>
+      <key>Die maximale Anzahl Teilnehmer ist erreicht!</key>
+    </entry>
+    <entry>
+      <key>Neuer Kampagnenschritt</key>
+    </entry>
+    <entry>
+      <key>Kontakteasdasd</key>
+    </entry>
+    <entry>
+      <key>Ende</key>
+    </entry>
+    <entry>
+      <key>Neue Kampagne</key>
+    </entry>
+    <entry>
+      <key>Beginn</key>
+    </entry>
     <entry>
       <key>${QUANTITY_LOWER_THAN_1}</key>
     </entry>
@@ -2592,9 +2658,6 @@
     <entry>
       <key>IT manager</key>
     </entry>
-    <entry>
-      <key>Marketing</key>
-    </entry>
     <entry>
       <key>CSO</key>
     </entry>
@@ -2742,6 +2805,30 @@
     <entry>
       <key>Salesproject phases</key>
     </entry>
+    <entry>
+      <key>Add to Campaign</key>
+    </entry>
+    <entry>
+      <key>Choose a campaign and a step to add the contact to a  campaign</key>
+    </entry>
+    <entry>
+      <key>Max participants</key>
+    </entry>
+    <entry>
+      <key>Participants</key>
+    </entry>
+    <entry>
+      <key>Add the selection to a campaign</key>
+    </entry>
+    <entry>
+      <key>protected</key>
+    </entry>
+    <entry>
+      <key>participants will be added to the selected campaign step</key>
+    </entry>
+    <entry>
+      <key>Add participants to Campaign</key>
+    </entry>
     <entry>
       <key>Object type 1</key>
     </entry>
@@ -2865,6 +2952,27 @@
     <entry>
       <key>This cannot be undone!</key>
     </entry>
+    <entry>
+      <key>Campaign status</key>
+    </entry>
+    <entry>
+      <key>Set campaign step</key>
+    </entry>
+    <entry>
+      <key>Add participant to Campaign</key>
+    </entry>
+    <entry>
+      <key>Steps</key>
+    </entry>
+    <entry>
+      <key>CampaignStep</key>
+    </entry>
+    <entry>
+      <key>Added</key>
+    </entry>
+    <entry>
+      <key>Current participants</key>
+    </entry>
     <entry>
       <key>Overdue tasks</key>
     </entry>
@@ -2920,14 +3028,35 @@
       <key>${ATTRIBUTE_VOID}</key>
     </entry>
     <entry>
-      <key>${WEBSERVICE_ERROR} url:%0 status:%1</key>
+      <key>Kampagnenzeitraum</key>
+    </entry>
+    <entry>
+      <key>Hauptverantw.</key>
+    </entry>
+    <entry>
+      <key>New campaign step</key>
+    </entry>
+    <entry>
+      <key>Cost</key>
     </entry>
     <entry>
       <key>file '%0' cannot be read</key>
     </entry>
+    <entry>
+      <key>Campaign costs</key>
+    </entry>
     <entry>
       <key>Importer</key>
     </entry>
+    <entry>
+      <key>Participant</key>
+    </entry>
+    <entry>
+      <key>Printing costs</key>
+    </entry>
+    <entry>
+      <key>Shipping costs</key>
+    </entry>
     <entry>
       <key>yyyy-MM-dd HH:mm:ss</key>
     </entry>
@@ -2937,6 +3066,27 @@
     <entry>
       <key>Zip</key>
     </entry>
+    <entry>
+      <key>Add to campaign</key>
+    </entry>
+    <entry>
+      <key>Layout costs</key>
+    </entry>
+    <entry>
+      <key>Costs</key>
+    </entry>
+    <entry>
+      <key>${WEBSERVICE_ERROR} url:%0 status:%1</key>
+    </entry>
+    <entry>
+      <key>Step</key>
+    </entry>
+    <entry>
+      <key>Fix cost</key>
+    </entry>
+    <entry>
+      <key>per</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 efefdb8fdcda4deec261ec78dd90fa18549ce08e..061f1ef983065b965429dde575cc4c018726c64b 100644
--- a/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
+++ b/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
@@ -10,10 +10,18 @@
       <key>SalesprojectState</key>
       <value>Status</value>
     </entry>
+    <entry>
+      <key>Steps</key>
+      <value>Stufen</value>
+    </entry>
     <entry>
       <key>Project management</key>
       <value>Projektmanagement</value>
     </entry>
+    <entry>
+      <key>Add to Campaign</key>
+      <value>Zu Kampagne hinzufügen</value>
+    </entry>
     <entry>
       <key>Company</key>
       <value>Firma</value>
@@ -78,6 +86,10 @@
       <key>Maximal Count</key>
       <value>Maximale Anzahl</value>
     </entry>
+    <entry>
+      <key>Campaign Participant</key>
+      <value>Kampagnen Teilnehmer/innen</value>
+    </entry>
     <entry>
       <key>Entrydate (Month)</key>
       <value>Eingangsdatum (Monat)</value>
@@ -86,10 +98,18 @@
       <key>Usage</key>
       <value>Verwendung</value>
     </entry>
+    <entry>
+      <key>Campaign status</key>
+      <value>Kampagnenstatus</value>
+    </entry>
     <entry>
       <key>Show all activities</key>
       <value>Alle Aktivitäten anzeigen</value>
     </entry>
+    <entry>
+      <key>Add the selection to a campaign</key>
+      <value>Fügt die Auswahl zur Kampagne hinzu</value>
+    </entry>
     <entry>
       <key>${ADDRESS_STATE}</key>
       <value>Staat</value>
@@ -106,6 +126,10 @@
       <key>Show all contracts</key>
       <value>Alle Verträge anzeigen</value>
     </entry>
+    <entry>
+      <key>Max participants</key>
+      <value>Maximale Teilnehmer</value>
+    </entry>
     <entry>
       <key>This combination of person and organisation does already exist and can not be created once more.</key>
       <value>Diese Kombination aus Person und Organisation existiert bereits und kann daher nicht noch ein mal angelegt werden.</value>
@@ -134,6 +158,10 @@
       <key>Activity</key>
       <value>Aktivität</value>
     </entry>
+    <entry>
+      <key>participants will be added to the selected campaign step</key>
+      <value>Teilnehmer/innen werden zur ausgewählten Kampagnenstufe hinzugefügt</value>
+    </entry>
     <entry>
       <key>Name</key>
       <value>Name</value>
@@ -142,6 +170,10 @@
       <key>Austria</key>
       <value>Österreich</value>
     </entry>
+    <entry>
+      <key>Set campaign step</key>
+      <value>Kampagnenstufe setzen</value>
+    </entry>
     <entry>
       <key>New time tracking</key>
       <value>Neuer Zeiteintrag</value>
@@ -166,6 +198,10 @@
       <key>Status</key>
       <value>Status</value>
     </entry>
+    <entry>
+      <key>Campaigns</key>
+      <value>Kampagnen</value>
+    </entry>
     <entry>
       <key>${SALESPROJECT_MEMBER}</key>
       <value>Projektteam</value>
@@ -182,6 +218,10 @@
       <key>Days inactive</key>
       <value>Tage inaktiv</value>
     </entry>
+    <entry>
+      <key>Choose a campaign and a step to add the contact to a  campaign</key>
+      <value>Wählen Sie eine Kampagne und eine Stufe aus um den Kontakt hinzuzufügen</value>
+    </entry>
     <entry>
       <key>Active</key>
       <value>Aktiv</value>
@@ -301,6 +341,10 @@
       <key>Gender</key>
       <value>Geschlecht</value>
     </entry>
+    <entry>
+      <key>Campaign Steps</key>
+      <value>Kampagnen Stufen</value>
+    </entry>
     <entry>
       <key>Show all companies</key>
       <value>Alle Firmen anzeigen</value>
@@ -329,6 +373,10 @@
       <key>Addresstype</key>
       <value>Adresstyp</value>
     </entry>
+    <entry>
+      <key>Add participants to Campaign</key>
+      <value>Kampagnenteilnehmer/innen hinzufügen</value>
+    </entry>
     <entry>
       <key>Firstname</key>
       <value>Vorname</value>
@@ -361,6 +409,10 @@
       <key>Delivery address</key>
       <value>Lieferadresse</value>
     </entry>
+    <entry>
+      <key>Participants</key>
+      <value>Teilnehmer/innen</value>
+    </entry>
     <entry>
       <key>House number</key>
       <value>Hausnummer</value>
@@ -567,6 +619,14 @@
       <key>Commodity group 2</key>
       <value>Warengruppe 2</value>
     </entry>
+    <entry>
+      <key>Campaign Step</key>
+      <value>Kampagnen Stufe</value>
+    </entry>
+    <entry>
+      <key>CampaignStep</key>
+      <value>Kampagnen Stufe</value>
+    </entry>
     <entry>
       <key>Commodity group 1</key>
       <value>Warengruppe 1</value>
@@ -619,6 +679,10 @@
       <key>Product name</key>
       <value>Produktname</value>
     </entry>
+    <entry>
+      <key>Campaign</key>
+      <value>Kampagne</value>
+    </entry>
     <entry>
       <key>Product group</key>
       <value>Produktgruppe</value>
@@ -2401,6 +2465,10 @@
       <key>Yemen</key>
       <value>Jemen</value>
     </entry>
+    <entry>
+      <key>The minimal count can't be larger than the maximal count!</key>
+      <value>Die minimale Anzahl darf nicht größer als die maximale Anzahl sein!</value>
+    </entry>
     <entry>
       <key>Aruba</key>
       <value>Aruba</value>
@@ -3123,6 +3191,10 @@
     <entry>
       <key>Tree Entity</key>
     </entry>
+    <entry>
+      <key>Add participant to Campaign</key>
+      <value>Kampagnenteilnehmer/in hinzufügen</value>
+    </entry>
     <entry>
       <key>Relationtype</key>
       <value>Beziehungsart</value>
@@ -3739,15 +3811,102 @@
       <key>MyTasks</key>
     </entry>
     <entry>
-      <key>${WEBSERVICE_ERROR} url:%0 status:%1</key>
-      <value>Webservice nicht erreichbar. URL: %0 %1</value>
+      <key>Approved</key>
+      <value>Freigegeben</value>
+    </entry>
+    <entry>
+      <key>Completed</key>
+      <value>Abgeschlossen</value>
+    </entry>
+    <entry>
+      <key>In planning</key>
+      <value>In Planung</value>
+    </entry>
+    <entry>
+      <key>Auswertung</key>
+    </entry>
+    <entry>
+      <key>Reihenfolge</key>
+    </entry>
+    <entry>
+      <key>Zuständiger</key>
+    </entry>
+    <entry>
+      <key>Schritte</key>
+    </entry>
+    <entry>
+      <key>Teilnehmer</key>
+    </entry>
+    <entry>
+      <key>Kampagnen Schritte</key>
+    </entry>
+    <entry>
+      <key>Kampagnenschritte</key>
+    </entry>
+    <entry>
+      <key>Die maximale Anzahl Teilnehmer ist erreicht!</key>
+    </entry>
+    <entry>
+      <key>Neuer Kampagnenschritt</key>
+    </entry>
+    <entry>
+      <key>Kontakteasdasd</key>
+    </entry>
+    <entry>
+      <key>Ende</key>
+    </entry>
+    <entry>
+      <key>Neue Kampagne</key>
+    </entry>
+    <entry>
+      <key>Beginn</key>
+    </entry>
+    <entry>
+      <key>protected</key>
+    </entry>
+    <entry>
+      <key>Added</key>
+      <value>Hinzugefügt</value>
+    </entry>
+    <entry>
+      <key>Current participants</key>
+      <value>Aktuelle Teilnehmer</value>
+    </entry>
+    <entry>
+      <key>Kampagnenzeitraum</key>
+    </entry>
+    <entry>
+      <key>Hauptverantw.</key>
+    </entry>
+    <entry>
+      <key>New campaign step</key>
+    </entry>
+    <entry>
+      <key>Cost</key>
+      <value>Kosten</value>
     </entry>
     <entry>
       <key>file '%0' cannot be read</key>
     </entry>
+    <entry>
+      <key>Campaign costs</key>
+      <value>Kampagnen Kosten</value>
+    </entry>
     <entry>
       <key>Importer</key>
     </entry>
+    <entry>
+      <key>Participant</key>
+      <value>Teilnehmer/in</value>
+    </entry>
+    <entry>
+      <key>Printing costs</key>
+      <value>Druckkosten</value>
+    </entry>
+    <entry>
+      <key>Shipping costs</key>
+      <value>Porto</value>
+    </entry>
     <entry>
       <key>yyyy-MM-dd HH:mm:ss</key>
     </entry>
@@ -3757,6 +3916,33 @@
     <entry>
       <key>Zip</key>
     </entry>
+    <entry>
+      <key>Add to campaign</key>
+    </entry>
+    <entry>
+      <key>Layout costs</key>
+      <value>Layout</value>
+    </entry>
+    <entry>
+      <key>Costs</key>
+      <value>Kosten</value>
+    </entry>
+    <entry>
+      <key>${WEBSERVICE_ERROR} url:%0 status:%1</key>
+      <value>Webservice nicht erreichbar. URL: %0 %1</value>
+    </entry>
+    <entry>
+      <key>Step</key>
+      <value>Stufe</value>
+    </entry>
+    <entry>
+      <key>Fix cost</key>
+      <value>Fixkosten</value>
+    </entry>
+    <entry>
+      <key>per</key>
+      <value>pro</value>
+    </entry>
   </keyValueMap>
   <font name="Dialog" style="0" size="11" />
 </language>
diff --git a/language/_____LANGUAGE_en/_____LANGUAGE_en.aod b/language/_____LANGUAGE_en/_____LANGUAGE_en.aod
index f10c855aa407ec764d4365463443b66901d75f54..9cf86e4d198b59e2e21eb96a77af237823de7d5e 100644
--- a/language/_____LANGUAGE_en/_____LANGUAGE_en.aod
+++ b/language/_____LANGUAGE_en/_____LANGUAGE_en.aod
@@ -2532,12 +2532,78 @@
     <entry>
       <key>Price policy</key>
     </entry>
+    <entry>
+      <key>Approved</key>
+    </entry>
+    <entry>
+      <key>Completed</key>
+    </entry>
+    <entry>
+      <key>In planning</key>
+    </entry>
+    <entry>
+      <key>Campaign Step</key>
+    </entry>
+    <entry>
+      <key>Campaign Participant</key>
+    </entry>
+    <entry>
+      <key>Campaign Steps</key>
+    </entry>
     <entry>
       <key>360 Degree</key>
     </entry>
+    <entry>
+      <key>Campaigns</key>
+    </entry>
+    <entry>
+      <key>Campaign</key>
+    </entry>
+    <entry>
+      <key>Auswertung</key>
+    </entry>
+    <entry>
+      <key>Reihenfolge</key>
+    </entry>
+    <entry>
+      <key>Zuständiger</key>
+    </entry>
+    <entry>
+      <key>Schritte</key>
+    </entry>
+    <entry>
+      <key>Teilnehmer</key>
+    </entry>
     <entry>
       <key>VAT in %</key>
     </entry>
+    <entry>
+      <key>Kampagnen Schritte</key>
+    </entry>
+    <entry>
+      <key>Kampagnenschritte</key>
+    </entry>
+    <entry>
+      <key>Marketing</key>
+    </entry>
+    <entry>
+      <key>Die maximale Anzahl Teilnehmer ist erreicht!</key>
+    </entry>
+    <entry>
+      <key>Neuer Kampagnenschritt</key>
+    </entry>
+    <entry>
+      <key>Kontakteasdasd</key>
+    </entry>
+    <entry>
+      <key>Ende</key>
+    </entry>
+    <entry>
+      <key>Neue Kampagne</key>
+    </entry>
+    <entry>
+      <key>Beginn</key>
+    </entry>
     <entry>
       <key>${QUANTITY_LOWER_THAN_1}</key>
       <value>Quantity should be greater than 0.</value>
@@ -2578,9 +2644,6 @@
     <entry>
       <key>IT manager</key>
     </entry>
-    <entry>
-      <key>Marketing</key>
-    </entry>
     <entry>
       <key>CSO</key>
     </entry>
@@ -2774,6 +2837,30 @@
     <entry>
       <key>Salesproject phases</key>
     </entry>
+    <entry>
+      <key>Add to Campaign</key>
+    </entry>
+    <entry>
+      <key>Choose a campaign and a step to add the contact to a  campaign</key>
+    </entry>
+    <entry>
+      <key>Max participants</key>
+    </entry>
+    <entry>
+      <key>Participants</key>
+    </entry>
+    <entry>
+      <key>Add the selection to a campaign</key>
+    </entry>
+    <entry>
+      <key>protected</key>
+    </entry>
+    <entry>
+      <key>participants will be added to the selected campaign step</key>
+    </entry>
+    <entry>
+      <key>Add participants to Campaign</key>
+    </entry>
     <entry>
       <key>Key figures</key>
     </entry>
@@ -2897,6 +2984,27 @@
     <entry>
       <key>This cannot be undone!</key>
     </entry>
+    <entry>
+      <key>Campaign status</key>
+    </entry>
+    <entry>
+      <key>Set campaign step</key>
+    </entry>
+    <entry>
+      <key>Add participant to Campaign</key>
+    </entry>
+    <entry>
+      <key>Steps</key>
+    </entry>
+    <entry>
+      <key>CampaignStep</key>
+    </entry>
+    <entry>
+      <key>Added</key>
+    </entry>
+    <entry>
+      <key>Current participants</key>
+    </entry>
     <entry>
       <key>Overdue tasks</key>
     </entry>
@@ -2954,15 +3062,35 @@
       <value>Void</value>
     </entry>
     <entry>
-      <key>${WEBSERVICE_ERROR} url:%0 status:%1</key>
-      <value>Webservice not available. URL: %0 %1</value>
+      <key>Kampagnenzeitraum</key>
+    </entry>
+    <entry>
+      <key>Hauptverantw.</key>
+    </entry>
+    <entry>
+      <key>New campaign step</key>
+    </entry>
+    <entry>
+      <key>Cost</key>
     </entry>
     <entry>
       <key>file '%0' cannot be read</key>
     </entry>
+    <entry>
+      <key>Campaign costs</key>
+    </entry>
     <entry>
       <key>Importer</key>
     </entry>
+    <entry>
+      <key>Participant</key>
+    </entry>
+    <entry>
+      <key>Printing costs</key>
+    </entry>
+    <entry>
+      <key>Shipping costs</key>
+    </entry>
     <entry>
       <key>yyyy-MM-dd HH:mm:ss</key>
     </entry>
@@ -2972,6 +3100,28 @@
     <entry>
       <key>Zip</key>
     </entry>
+    <entry>
+      <key>Add to campaign</key>
+    </entry>
+    <entry>
+      <key>Layout costs</key>
+    </entry>
+    <entry>
+      <key>Costs</key>
+    </entry>
+    <entry>
+      <key>Fix cost</key>
+    </entry>
+    <entry>
+      <key>Step</key>
+    </entry>
+    <entry>
+      <key>${WEBSERVICE_ERROR} url:%0 status:%1</key>
+      <value>Webservice not available. URL: %0 %1</value>
+    </entry>
+    <entry>
+      <key>per</key>
+    </entry>
   </keyValueMap>
   <font name="Dialog" style="0" size="11" />
 </language>
diff --git a/neonContext/Campaign/Campaign.aod b/neonContext/Campaign/Campaign.aod
new file mode 100644
index 0000000000000000000000000000000000000000..44da77e955ace0671af2cb87a25685eaf48ff6ea
--- /dev/null
+++ b/neonContext/Campaign/Campaign.aod
@@ -0,0 +1,35 @@
+<?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>Campaign</name>
+  <title>Campaign</title>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <icon>VAADIN:GROUP</icon>
+  <mainview>CampaignMain_view</mainview>
+  <filterview>CampaignFilter_view</filterview>
+  <editview>CampaignEdit_view</editview>
+  <preview>CampaignPreview_view</preview>
+  <lookupview>CampaignFilter_view</lookupview>
+  <entity>Campaign_entity</entity>
+  <references>
+    <neonViewReference>
+      <name>7a90a8ed-62e9-47c1-9c8c-2b1019e31da0</name>
+      <view>CampaignFilter_view</view>
+    </neonViewReference>
+    <neonViewReference>
+      <name>b4750aec-8ad6-419b-9b44-2848d90b68d0</name>
+      <view>CampaignMain_view</view>
+    </neonViewReference>
+    <neonViewReference>
+      <name>678bda6a-42f2-49c3-8527-5289e70645a2</name>
+      <view>CampaignEdit_view</view>
+    </neonViewReference>
+    <neonViewReference>
+      <name>2fffb548-0b4f-4986-9b50-aefa2e00bade</name>
+      <view>CampaignPreview_view</view>
+    </neonViewReference>
+    <neonViewReference>
+      <name>4a5377cc-af00-49c7-aad2-ac93e2752b3f</name>
+      <view>CampaignCost_view</view>
+    </neonViewReference>
+  </references>
+</neonContext>
diff --git a/neonContext/CampaignAddParticipants/CampaignAddParticipants.aod b/neonContext/CampaignAddParticipants/CampaignAddParticipants.aod
new file mode 100644
index 0000000000000000000000000000000000000000..28d85596318e2b2c9ead40ee288098f4e00d2461
--- /dev/null
+++ b/neonContext/CampaignAddParticipants/CampaignAddParticipants.aod
@@ -0,0 +1,17 @@
+<?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>CampaignAddParticipants</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <editview>CampaignAddParticipantsEdit_view</editview>
+  <entity>CampaignAddParticipants_entity</entity>
+  <references>
+    <neonViewReference>
+      <name>c4f11246-9c24-4c1c-8e53-96acabf04bab</name>
+      <view>CampaignAddParticipantsEdit_view</view>
+    </neonViewReference>
+    <neonViewReference>
+      <name>87d572bd-f2ce-4283-8db0-a7d9f9441fa0</name>
+      <view>campaignParticipantMessage_view</view>
+    </neonViewReference>
+  </references>
+</neonContext>
diff --git a/neonContext/CampaignAnalysis/CampaignAnalysis.aod b/neonContext/CampaignAnalysis/CampaignAnalysis.aod
new file mode 100644
index 0000000000000000000000000000000000000000..8d1ff1b7b9aaf49a169817f8f9ac4fc619969095
--- /dev/null
+++ b/neonContext/CampaignAnalysis/CampaignAnalysis.aod
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<neonContext xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.0" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonContext/1.1.0">
+  <name>CampaignAnalysis</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <entity>CampaignAnalysis_entity</entity>
+  <references>
+    <neonViewReference>
+      <name>ebb2a4e0-5e0e-4749-8ed8-7aa3b8cae3fc</name>
+      <view>CampaignStepCurrentMaxParticipants_view</view>
+    </neonViewReference>
+  </references>
+</neonContext>
diff --git a/neonContext/CampaignCost/CampaignCost.aod b/neonContext/CampaignCost/CampaignCost.aod
new file mode 100644
index 0000000000000000000000000000000000000000..65fbbf22993e1e6edd229db2c3303370dc0b5004
--- /dev/null
+++ b/neonContext/CampaignCost/CampaignCost.aod
@@ -0,0 +1,26 @@
+<?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>CampaignCost</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <filterview>CampaignCostFilter_view</filterview>
+  <editview>CampaignCostEdit_view</editview>
+  <entity>CampaignCost_entitiy</entity>
+  <references>
+    <neonViewReference>
+      <name>fa4ac7f7-4f30-42ba-86b2-99e86597734f</name>
+      <view>CampaignCostFilter_view</view>
+    </neonViewReference>
+    <neonViewReference>
+      <name>34fefde3-d3cf-4a64-92e2-fe1150c286eb</name>
+      <view>CampaignCostEdit_view</view>
+    </neonViewReference>
+    <neonViewReference>
+      <name>01137074-b129-42bc-86b7-82afc356923b</name>
+      <view>CampaignGroupedCostFilter_view</view>
+    </neonViewReference>
+    <neonViewReference>
+      <name>a4f131e8-2371-4070-83f7-fd69dfd6a7df</name>
+      <view>CampaignCostExtendedFilter_view</view>
+    </neonViewReference>
+  </references>
+</neonContext>
diff --git a/neonContext/CampaignParticipant/CampaignParticipant.aod b/neonContext/CampaignParticipant/CampaignParticipant.aod
new file mode 100644
index 0000000000000000000000000000000000000000..5595651c789c73c72702acf557fa2711d3c9523e
--- /dev/null
+++ b/neonContext/CampaignParticipant/CampaignParticipant.aod
@@ -0,0 +1,23 @@
+<?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>CampaignParticipant</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <filterview>CampaignParticipantFilter_view</filterview>
+  <editview>CampaignParticipantEdit_view</editview>
+  <preview>CampaignParticipantPreview_view</preview>
+  <entity>CampaignParticipant_entity</entity>
+  <references>
+    <neonViewReference>
+      <name>2937d001-c1c8-40a0-9eac-f575fcc7c251</name>
+      <view>CampaignParticipantFilter_view</view>
+    </neonViewReference>
+    <neonViewReference>
+      <name>e52a3270-3a6c-48be-bf91-8b6118ccf57c</name>
+      <view>CampaignParticipantEdit_view</view>
+    </neonViewReference>
+    <neonViewReference>
+      <name>1b11a31b-4ca3-49ad-a312-4d31b9d986b1</name>
+      <view>CampaignParticipantPreview_view</view>
+    </neonViewReference>
+  </references>
+</neonContext>
diff --git a/neonContext/CampaignStep/CampaignStep.aod b/neonContext/CampaignStep/CampaignStep.aod
new file mode 100644
index 0000000000000000000000000000000000000000..17e6119fb7f175a1485f953f92a111e9f8f03fee
--- /dev/null
+++ b/neonContext/CampaignStep/CampaignStep.aod
@@ -0,0 +1,38 @@
+<?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>CampaignStep</name>
+  <title>Campaign Step</title>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <mainview>CampaignStepMain_view</mainview>
+  <filterview>CampaignStepFilter_view</filterview>
+  <editview>CampaignStepEdit_view</editview>
+  <preview>CampaignStepPreview_view</preview>
+  <lookupview>CampaignStepFilter_view</lookupview>
+  <entity>CampaignStep_entity</entity>
+  <references>
+    <neonViewReference>
+      <name>9c8fa482-9c3b-4ea8-82b0-91979cc2936d</name>
+      <view>CampaignStepFilter_view</view>
+    </neonViewReference>
+    <neonViewReference>
+      <name>c11ece8f-3ddf-416f-8b22-eaa2dda085eb</name>
+      <view>CampaignStepEdit_view</view>
+    </neonViewReference>
+    <neonViewReference>
+      <name>3de647e9-f3fb-47c8-8ba8-093f3e00a41c</name>
+      <view>CampaignStepPreview_view</view>
+    </neonViewReference>
+    <neonViewReference>
+      <name>b0b74015-6ed3-4ad4-bd72-b4017fe85e54</name>
+      <view>CampaignStepMain_view</view>
+    </neonViewReference>
+    <neonViewReference>
+      <name>bd922414-bd4c-4313-8564-85f27156159e</name>
+      <view>CampaignStepAnalysis_view</view>
+    </neonViewReference>
+    <neonViewReference>
+      <name>c1be17f6-c4ca-4d9d-8c3a-0cc8f75906f6</name>
+      <view>CampaignStepAddParticipants_view</view>
+    </neonViewReference>
+  </references>
+</neonContext>
diff --git a/neonContext/IndexSearchContext/IndexSearchContext.aod b/neonContext/IndexSearchContext/IndexSearchContext.aod
new file mode 100644
index 0000000000000000000000000000000000000000..b379419b4084feb116cf5d2213ad5f07954fa607
--- /dev/null
+++ b/neonContext/IndexSearchContext/IndexSearchContext.aod
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<neonContext xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.0" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonContext/1.1.0">
+  <name>IndexSearchContext</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <entity>IndexSearchEntity</entity>
+  <references>
+    <neonViewReference>
+      <name>2648f63d-7a43-4049-81b0-a3486ed15db6</name>
+      <view>IndexSearchView</view>
+    </neonViewReference>
+  </references>
+</neonContext>
diff --git a/neonContext/Notification/Notification.aod b/neonContext/Notification/Notification.aod
new file mode 100644
index 0000000000000000000000000000000000000000..ef86e6f5e55ffc6d82304521cfe2be15f783fae3
--- /dev/null
+++ b/neonContext/Notification/Notification.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>Notification</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <filterview>NotificationFilter_view</filterview>
+  <preview>NotificationPreview_view</preview>
+  <entity>Notification_entity</entity>
+  <references>
+    <neonViewReference>
+      <name>110703ad-3509-4472-90e6-6825a05ff55b</name>
+      <view>NotificationFilter_view</view>
+    </neonViewReference>
+    <neonViewReference>
+      <name>f47542b9-ccf9-4487-ae3f-cdfda61cff3a</name>
+      <view>NotificationPreview_view</view>
+    </neonViewReference>
+  </references>
+</neonContext>
diff --git a/neonContext/ObjectTree/ObjectTree.aod b/neonContext/ObjectTree/ObjectTree.aod
index 3a0bc38b2c9464edf2e3c6d8e510f00b7d7b2182..a8f24a44156098989667e38818ddd4491116b862 100644
--- a/neonContext/ObjectTree/ObjectTree.aod
+++ b/neonContext/ObjectTree/ObjectTree.aod
@@ -4,7 +4,6 @@
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <filterview>ObjectTreeFilter_view</filterview>
   <editview>ObjectTreeEdit_view</editview>
-  <preview>ObjectTreePreview</preview>
   <entity>ObjectTree_entity</entity>
   <references>
     <neonViewReference>
@@ -15,9 +14,5 @@
       <name>1122516a-5f1c-4f08-9995-02acaee2a0cd</name>
       <view>ObjectTreeEdit_view</view>
     </neonViewReference>
-    <neonViewReference>
-      <name>1caa61e2-0e59-47bd-a996-db49867e3908</name>
-      <view>ObjectTreePreview</view>
-    </neonViewReference>
   </references>
 </neonContext>
diff --git a/neonNotificationType/AndisNotification/AndisNotification.aod b/neonNotificationType/AndisNotification/AndisNotification.aod
index 5f38e02ae6bb21adf600c3218842a6fc37939e84..3c43805abbdc4bfe1bd4584c23fa29fcbcd9244c 100644
--- a/neonNotificationType/AndisNotification/AndisNotification.aod
+++ b/neonNotificationType/AndisNotification/AndisNotification.aod
@@ -3,6 +3,7 @@
   <name>AndisNotification</name>
   <title>Andis Noti</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
+  <icon>VAADIN:ASTERISK</icon>
   <resultFrameNeon></resultFrameNeon>
   <onResultOpen>%aditoprj%/neonNotificationType/AndisNotification/onResultOpen.js</onResultOpen>
 </neonNotificationType>
diff --git a/neonView/ActivityFilter_view/ActivityFilter_view.aod b/neonView/ActivityFilter_view/ActivityFilter_view.aod
index 78a81d68932c0bf91139e730cb800fc2b19df0a3..61c9ff0d3c3ba8a790d07508018003137662577f 100644
--- a/neonView/ActivityFilter_view/ActivityFilter_view.aod
+++ b/neonView/ActivityFilter_view/ActivityFilter_view.aod
@@ -91,12 +91,33 @@
         </neonTableColumn>
       </columns>
     </tableViewTemplate>
-    <treeViewTemplate>
-      <name>ActivitiesTreetable</name>
-      <titleField>SUBJECT_DETAILS</titleField>
-      <descriptionField>INFO</descriptionField>
-      <iconField>#IMAGE</iconField>
+    <treeTableViewTemplate>
+      <name>ActivitiesTreeTable</name>
       <entityField>#ENTITY</entityField>
-    </treeViewTemplate>
+      <columns>
+        <neonTableColumn>
+          <name>4167708f-b5a4-42ed-848a-cf9bb604f083</name>
+          <entityField>ICON</entityField>
+          <width v="75" />
+        </neonTableColumn>
+        <neonTableColumn>
+          <name>ec8f0488-9a9f-4114-8123-1bc21b1d1f68</name>
+          <entityField>SUBJECT</entityField>
+          <width v="75" />
+        </neonTableColumn>
+        <neonTableColumn>
+          <name>c44d54b5-00b9-4faf-9934-687e3a417b73</name>
+          <entityField>ENTRYDATE</entityField>
+        </neonTableColumn>
+        <neonTableColumn>
+          <name>f7137699-ae62-48e0-9cd6-e06d37f87f94</name>
+          <entityField>DIRECTION</entityField>
+        </neonTableColumn>
+        <neonTableColumn>
+          <name>385231ab-204f-498a-8bf2-6fca3f59b7a5</name>
+          <entityField>CATEGORY</entityField>
+        </neonTableColumn>
+      </columns>
+    </treeTableViewTemplate>
   </children>
 </neonView>
diff --git a/neonView/AddressList_view/AddressList_view.aod b/neonView/AddressList_view/AddressList_view.aod
index 74236c8433e8fa39c3666e2c1c8f074d1a2495f2..63782018ac9680289975c8c3d0ebe6733db30c65 100644
--- a/neonView/AddressList_view/AddressList_view.aod
+++ b/neonView/AddressList_view/AddressList_view.aod
@@ -19,8 +19,12 @@
           <entityField>ADDR_TYPE</entityField>
         </neonTableColumn>
         <neonTableColumn>
-          <name>dfaa01a1-0b11-4f92-aa18-89f12ebb2db5</name>
-          <entityField>COUNTRY</entityField>
+          <name>4e5e6a4f-f43e-4861-a912-fb05e576f960</name>
+          <entityField>ADDRESS</entityField>
+        </neonTableColumn>
+        <neonTableColumn>
+          <name>935bcecf-fdd9-4e82-a53f-3c3082c85340</name>
+          <entityField>BUILDINGNO</entityField>
         </neonTableColumn>
         <neonTableColumn>
           <name>0336ea99-c4a1-4f39-b5aa-a520a7dcbaab</name>
@@ -31,20 +35,16 @@
           <entityField>CITY</entityField>
         </neonTableColumn>
         <neonTableColumn>
-          <name>29dbb3f5-6f80-4100-aed3-334ac0b9cc48</name>
-          <entityField>REGION</entityField>
+          <name>dfaa01a1-0b11-4f92-aa18-89f12ebb2db5</name>
+          <entityField>COUNTRY</entityField>
         </neonTableColumn>
         <neonTableColumn>
           <name>aafc58cf-7dbb-42cb-b04c-d0869e58d09a</name>
           <entityField>STATE</entityField>
         </neonTableColumn>
         <neonTableColumn>
-          <name>4e5e6a4f-f43e-4861-a912-fb05e576f960</name>
-          <entityField>ADDRESS</entityField>
-        </neonTableColumn>
-        <neonTableColumn>
-          <name>935bcecf-fdd9-4e82-a53f-3c3082c85340</name>
-          <entityField>BUILDINGNO</entityField>
+          <name>29dbb3f5-6f80-4100-aed3-334ac0b9cc48</name>
+          <entityField>REGION</entityField>
         </neonTableColumn>
         <neonTableColumn>
           <name>6af52273-25bf-4286-83cc-217aea94ad09</name>
diff --git a/neonView/AddressLookup_view/AddressLookup_view.aod b/neonView/AddressLookup_view/AddressLookup_view.aod
index 84a197811b5c31e788561505537c4b9c354cfeae..6b0c5094306af8e955eb39eb3e9949a12c42c0e6 100644
--- a/neonView/AddressLookup_view/AddressLookup_view.aod
+++ b/neonView/AddressLookup_view/AddressLookup_view.aod
@@ -20,10 +20,6 @@
           <name>07e3bcf0-30aa-4745-8dd6-ed79dd2d0fa0</name>
           <entityField>ADDR_TYPE</entityField>
         </neonTableColumn>
-        <neonTableColumn>
-          <name>e6d9ced9-eea3-4cdf-9751-74c8f206282f</name>
-          <entityField>COUNTRY</entityField>
-        </neonTableColumn>
         <neonTableColumn>
           <name>570039fc-c27a-4b06-a93e-16cc712a3d0c</name>
           <entityField>ADDRESS</entityField>
@@ -40,17 +36,21 @@
           <name>6a07479c-b4d3-4946-993e-e6ce7dd825ba</name>
           <entityField>CITY</entityField>
         </neonTableColumn>
+        <neonTableColumn>
+          <name>e6d9ced9-eea3-4cdf-9751-74c8f206282f</name>
+          <entityField>COUNTRY</entityField>
+        </neonTableColumn>
         <neonTableColumn>
           <name>820b6ffc-7e56-4982-8f39-4443b0ada876</name>
           <entityField>STATE</entityField>
         </neonTableColumn>
         <neonTableColumn>
-          <name>24f73ac8-ac90-4beb-83fe-bdaa2d0806b6</name>
-          <entityField>ADDRIDENTIFIER</entityField>
+          <name>9651a718-ab01-4c97-8da0-6e7133f26466</name>
+          <entityField>REGION</entityField>
         </neonTableColumn>
         <neonTableColumn>
-          <name>9651a718-ab01-4c97-8da0-6e7133f26466</name>
-          <entityField>#PROVIDER</entityField>
+          <name>24f73ac8-ac90-4beb-83fe-bdaa2d0806b6</name>
+          <entityField>ADDRIDENTIFIER</entityField>
         </neonTableColumn>
       </columns>
     </tableViewTemplate>
diff --git a/neonView/AdressMultiEdit_view/AdressMultiEdit_view.aod b/neonView/AdressMultiEdit_view/AdressMultiEdit_view.aod
index 7ff9546ade23e1956af0503193b9300ee0168276..cfa861355be86b2a0fbcfec74258fb12e422aad3 100644
--- a/neonView/AdressMultiEdit_view/AdressMultiEdit_view.aod
+++ b/neonView/AdressMultiEdit_view/AdressMultiEdit_view.aod
@@ -17,8 +17,12 @@
           <entityField>ADDR_TYPE</entityField>
         </neonTableColumn>
         <neonTableColumn>
-          <name>435f10b8-b6ef-4187-bffc-fc6104a6130c</name>
-          <entityField>COUNTRY</entityField>
+          <name>ac71d5eb-7ce7-41a0-91aa-5594f2238788</name>
+          <entityField>ADDRESS</entityField>
+        </neonTableColumn>
+        <neonTableColumn>
+          <name>61261845-740e-4f4b-a1f8-5e6aeac2deba</name>
+          <entityField>BUILDINGNO</entityField>
         </neonTableColumn>
         <neonTableColumn>
           <name>c1372a93-cf83-4c55-90e6-3b6b352abebf</name>
@@ -29,20 +33,16 @@
           <entityField>CITY</entityField>
         </neonTableColumn>
         <neonTableColumn>
-          <name>b62515bf-e89d-44a9-94ff-933766657fe5</name>
-          <entityField>REGION</entityField>
+          <name>435f10b8-b6ef-4187-bffc-fc6104a6130c</name>
+          <entityField>COUNTRY</entityField>
         </neonTableColumn>
         <neonTableColumn>
           <name>66ae75ca-7a5c-4cf0-b768-6c2900f7b7c6</name>
           <entityField>STATE</entityField>
         </neonTableColumn>
         <neonTableColumn>
-          <name>ac71d5eb-7ce7-41a0-91aa-5594f2238788</name>
-          <entityField>ADDRESS</entityField>
-        </neonTableColumn>
-        <neonTableColumn>
-          <name>61261845-740e-4f4b-a1f8-5e6aeac2deba</name>
-          <entityField>BUILDINGNO</entityField>
+          <name>b62515bf-e89d-44a9-94ff-933766657fe5</name>
+          <entityField>REGION</entityField>
         </neonTableColumn>
         <neonTableColumn>
           <name>443b9d7d-dac2-40b2-bb2b-d5e0091877a9</name>
diff --git a/neonView/AttributeFilter_view/AttributeFilter_view.aod b/neonView/AttributeFilter_view/AttributeFilter_view.aod
index cadb8afc80a55d8af99a17f82f798828a6200a72..3a1c298e1cff4737c6a2d8acf4415c7944f1c33f 100644
--- a/neonView/AttributeFilter_view/AttributeFilter_view.aod
+++ b/neonView/AttributeFilter_view/AttributeFilter_view.aod
@@ -17,6 +17,11 @@
       <showChildrenCount v="false" />
       <entityField>#ENTITY</entityField>
       <columns>
+        <neonTableColumn>
+          <name>169aceb2-2ff8-42de-ab89-4d3cc15d5747</name>
+          <entityField>ICON</entityField>
+          <width v="75" />
+        </neonTableColumn>
         <neonTableColumn>
           <name>a776a053-6712-44f9-943f-da26d1ce11ee</name>
           <entityField>ATTRIBUTE_NAME</entityField>
@@ -35,6 +40,10 @@
       <name>AttributesTable</name>
       <entityField>#ENTITY</entityField>
       <columns>
+        <neonTableColumn>
+          <name>c1ee431e-e4d2-4744-ad8c-2bf2c2eed8d6</name>
+          <entityField>ICON</entityField>
+        </neonTableColumn>
         <neonTableColumn>
           <name>4dae1a23-8798-42ff-998c-7f5fedc7dcc5</name>
           <entityField>FULL_ATTRIBUTE_NAME</entityField>
diff --git a/neonView/AttributePreview_view/AttributePreview_view.aod b/neonView/AttributePreview_view/AttributePreview_view.aod
index 5a8e785eb7471b2b09da7a94db7797460926cf79..812510e36bcf15293daa63d6d34912cedb7428f5 100644
--- a/neonView/AttributePreview_view/AttributePreview_view.aod
+++ b/neonView/AttributePreview_view/AttributePreview_view.aod
@@ -18,37 +18,23 @@
     <genericViewTemplate>
       <name>Details</name>
       <showDrawer v="true" />
-      <drawerCaption>Details</drawerCaption>
       <entityField>#ENTITY</entityField>
       <fields>
         <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>
-    <genericViewTemplate>
-      <name>Info</name>
-      <editMode v="false" />
-      <showDrawer v="true" />
-      <entityField>#ENTITY</entityField>
-      <title></title>
-      <fields>
-        <entityFieldLink>
-          <name>5f20a5d4-0343-4b8c-92bf-15eeb2483ba9</name>
+          <name>3de869e9-936b-4215-86de-b1e24f6bfd78</name>
           <entityField>ATTRIBUTE_PARENT_ID</entityField>
         </entityFieldLink>
         <entityFieldLink>
-          <name>7e64cd02-e91e-4845-bc77-256a4945670e</name>
+          <name>39cf159f-2c34-41a1-bf6d-210d2d1f8df9</name>
           <entityField>KEYWORD_CONTAINER</entityField>
         </entityFieldLink>
         <entityFieldLink>
-          <name>00a51564-0eca-43f9-8235-b811df1dbafd</name>
-          <entityField>ATTRIBUTE_LEVEL</entityField>
+          <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>
diff --git a/neonView/CampaignAddParticipantsEdit_view/CampaignAddParticipantsEdit_view.aod b/neonView/CampaignAddParticipantsEdit_view/CampaignAddParticipantsEdit_view.aod
new file mode 100644
index 0000000000000000000000000000000000000000..89837dbdc48be1db6a691a421179a59ed82b328b
--- /dev/null
+++ b/neonView/CampaignAddParticipantsEdit_view/CampaignAddParticipantsEdit_view.aod
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.1">
+  <name>CampaignAddParticipantsEdit_view</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <isSmall v="true" />
+  <layout>
+    <headerFooterLayout>
+      <name>layout</name>
+      <header>campaignDetail</header>
+      <footer>SelectedCampaignInfosScore</footer>
+    </headerFooterLayout>
+  </layout>
+  <children>
+    <genericViewTemplate>
+      <name>campaignDetail</name>
+      <editMode v="true" />
+      <entityField>#ENTITY</entityField>
+      <fields>
+        <entityFieldLink>
+          <name>4968ad35-3651-4654-a1b0-0e3d0fc6165d</name>
+          <entityField>CAMPAIGN_ID</entityField>
+        </entityFieldLink>
+        <entityFieldLink>
+          <name>b9016725-1345-4526-88eb-2b05fb4089c8</name>
+          <entityField>CAMPAIGNSTEP_ID</entityField>
+        </entityFieldLink>
+      </fields>
+    </genericViewTemplate>
+    <neonViewReference>
+      <name>1bfb0564-f81f-4c60-ae5b-1d9778a519ab</name>
+      <entityField>#ENTITY</entityField>
+      <view>campaignParticipantMessage_view</view>
+    </neonViewReference>
+    <scoreCardViewTemplate>
+      <name>SelectedCampaignInfosScore</name>
+      <entityField>#ENTITY</entityField>
+      <fields>
+        <entityFieldLink>
+          <name>5fb2164c-9433-480a-9d55-726a2b05a549</name>
+          <entityField>campaignStepCurrentParticipantCount</entityField>
+        </entityFieldLink>
+        <entityFieldLink>
+          <name>d0820091-352f-431f-8d7a-71cb5b576853</name>
+          <entityField>campaignStepMaxParticipantCount</entityField>
+        </entityFieldLink>
+      </fields>
+    </scoreCardViewTemplate>
+  </children>
+</neonView>
diff --git a/neonView/ObjectTreePreview/ObjectTreePreview.aod b/neonView/CampaignCostEdit_view/CampaignCostEdit_view.aod
similarity index 56%
rename from neonView/ObjectTreePreview/ObjectTreePreview.aod
rename to neonView/CampaignCostEdit_view/CampaignCostEdit_view.aod
index d7e3916a28c515ec3ae3c150fe75b9b4c6fdbe04..69429a3f8b8cf6be7c4719645893042c7f9499e0 100644
--- a/neonView/ObjectTreePreview/ObjectTreePreview.aod
+++ b/neonView/CampaignCostEdit_view/CampaignCostEdit_view.aod
@@ -1,30 +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>ObjectTreePreview</name>
+  <name>CampaignCostEdit_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
+  <isSmall v="true" />
   <layout>
-    <headerFooterLayout>
+    <boxLayout>
       <name>layout</name>
-    </headerFooterLayout>
+    </boxLayout>
   </layout>
   <children>
     <genericViewTemplate>
-      <name>Info</name>
-      <showDrawer v="true" />
-      <drawerCaption>Info</drawerCaption>
+      <name>EditFields</name>
+      <editMode v="true" />
       <entityField>#ENTITY</entityField>
       <fields>
         <entityFieldLink>
-          <name>a7ff1a5c-1ea5-4904-a802-b3da55c07341</name>
-          <entityField>OBJECTRELATIONTYPEID</entityField>
+          <name>2937d501-ee30-4535-870b-1d5d4ccc21ba</name>
+          <entityField>CAMPAIGNSTEP_ID</entityField>
         </entityFieldLink>
         <entityFieldLink>
-          <name>0b612a60-d882-4def-b569-7146e1b1ccb6</name>
-          <entityField>TARGET_ID</entityField>
+          <name>bb0e5fb9-e82c-47f7-b6fa-f3e5d4c36649</name>
+          <entityField>CATEGORY</entityField>
         </entityFieldLink>
         <entityFieldLink>
-          <name>6ed4e675-b1f5-4790-97d1-d015f87f37e4</name>
-          <entityField>INFO</entityField>
+          <name>23f1ec3b-91b3-44b6-bf2b-a976da6e3778</name>
+          <entityField>NET</entityField>
         </entityFieldLink>
       </fields>
     </genericViewTemplate>
diff --git a/neonView/CampaignCostExtendedFilter_view/CampaignCostExtendedFilter_view.aod b/neonView/CampaignCostExtendedFilter_view/CampaignCostExtendedFilter_view.aod
new file mode 100644
index 0000000000000000000000000000000000000000..94892da46ddd8019cdca05edd461f0b30d7ff61d
--- /dev/null
+++ b/neonView/CampaignCostExtendedFilter_view/CampaignCostExtendedFilter_view.aod
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.1">
+  <name>CampaignCostExtendedFilter_view</name>
+  <title>Stop costs</title>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <filterable v="true" />
+  <layout>
+    <boxLayout>
+      <name>layout</name>
+    </boxLayout>
+  </layout>
+  <children>
+    <tableViewTemplate>
+      <name>CampaignCost</name>
+      <entityField>#ENTITY</entityField>
+      <columns>
+        <neonTableColumn>
+          <name>5202d410-fc4d-4109-93b1-8743954a25e2</name>
+          <entityField>CATEGORY</entityField>
+        </neonTableColumn>
+        <neonTableColumn>
+          <name>b3c90c61-9f12-4b1c-9e27-b88abe77fd4e</name>
+          <entityField>NET</entityField>
+        </neonTableColumn>
+        <neonTableColumn>
+          <name>3dc61836-42a2-4cd9-b87f-14381d72d01a</name>
+          <entityField>netPerParticipant</entityField>
+        </neonTableColumn>
+        <neonTableColumn>
+          <name>0f42e172-f2d0-45de-8a39-d0e4609b3393</name>
+          <entityField>countParticipants</entityField>
+        </neonTableColumn>
+      </columns>
+    </tableViewTemplate>
+  </children>
+</neonView>
diff --git a/neonView/CampaignCostFilter_view/CampaignCostFilter_view.aod b/neonView/CampaignCostFilter_view/CampaignCostFilter_view.aod
new file mode 100644
index 0000000000000000000000000000000000000000..8b940f6c9f56259fc92e3c57128293689d54e4ef
--- /dev/null
+++ b/neonView/CampaignCostFilter_view/CampaignCostFilter_view.aod
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.1">
+  <name>CampaignCostFilter_view</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <filterable v="true" />
+  <layout>
+    <boxLayout>
+      <name>layout</name>
+    </boxLayout>
+  </layout>
+  <children>
+    <tableViewTemplate>
+      <name>CampaignCost</name>
+      <entityField>#ENTITY</entityField>
+      <columns>
+        <neonTableColumn>
+          <name>651c5bd4-8f87-40d4-9d1f-38549b1e5fdf</name>
+          <entityField>CATEGORY</entityField>
+        </neonTableColumn>
+        <neonTableColumn>
+          <name>ee4676af-5bb6-4805-99cb-954ef3b178f0</name>
+          <entityField>NET</entityField>
+        </neonTableColumn>
+      </columns>
+    </tableViewTemplate>
+  </children>
+</neonView>
diff --git a/neonView/CampaignCost_view/CampaignCost_view.aod b/neonView/CampaignCost_view/CampaignCost_view.aod
new file mode 100644
index 0000000000000000000000000000000000000000..b392d37aa91da50891fa207e1301682c74d93ec1
--- /dev/null
+++ b/neonView/CampaignCost_view/CampaignCost_view.aod
@@ -0,0 +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>CampaignCost_view</name>
+  <title>Cost</title>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <layout>
+    <boxLayout>
+      <name>layout</name>
+    </boxLayout>
+  </layout>
+  <children>
+    <neonViewReference>
+      <name>127a0cab-ec21-47e6-ba6c-c091cb31c794</name>
+      <entityField>CampaignCosts</entityField>
+      <view>CampaignCostFilter_view</view>
+    </neonViewReference>
+    <neonViewReference>
+      <name>5830d1ed-c118-4a37-ab65-4727e8312c0a</name>
+      <entityField>CampaignStepCosts</entityField>
+      <view>CampaignGroupedCostFilter_view</view>
+    </neonViewReference>
+  </children>
+</neonView>
diff --git a/neonView/CampaignEdit_view/CampaignEdit_view.aod b/neonView/CampaignEdit_view/CampaignEdit_view.aod
new file mode 100644
index 0000000000000000000000000000000000000000..5635c65c2e8c9bcfa2347478f9092d682acc849e
--- /dev/null
+++ b/neonView/CampaignEdit_view/CampaignEdit_view.aod
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.1">
+  <name>CampaignEdit_view</name>
+  <title>Campaign</title>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <icon>VAADIN:GROUP</icon>
+  <isSmall v="true" />
+  <layout>
+    <boxLayout>
+      <name>layout</name>
+    </boxLayout>
+  </layout>
+  <children>
+    <genericViewTemplate>
+      <name>Edit</name>
+      <editMode v="true" />
+      <showDrawer v="false" />
+      <drawerCaption></drawerCaption>
+      <entityField>#ENTITY</entityField>
+      <title>Neue Kampagne</title>
+      <fields>
+        <entityFieldLink>
+          <name>df6356cf-e0bd-4947-8163-736301e622cf</name>
+          <entityField>NAME</entityField>
+        </entityFieldLink>
+        <entityFieldLink>
+          <name>57992f29-2e55-4f1f-8652-c2817a3b257e</name>
+          <entityField>EMPLOYEE_CONTACT_ID</entityField>
+        </entityFieldLink>
+        <entityFieldLink>
+          <name>8372cca8-be9f-4910-bebd-64bd41cc7083</name>
+          <entityField>STATE</entityField>
+        </entityFieldLink>
+        <entityFieldLink>
+          <name>114121d3-093a-40e7-9e0e-f187c9eaa5f1</name>
+          <entityField>DESCRIPTION</entityField>
+        </entityFieldLink>
+      </fields>
+    </genericViewTemplate>
+  </children>
+</neonView>
diff --git a/neonView/CampaignFilter_view/CampaignFilter_view.aod b/neonView/CampaignFilter_view/CampaignFilter_view.aod
new file mode 100644
index 0000000000000000000000000000000000000000..76eb3162044f64f8d0e59abdc3a26c8ec8eee3df
--- /dev/null
+++ b/neonView/CampaignFilter_view/CampaignFilter_view.aod
@@ -0,0 +1,40 @@
+<?xml version="1.0" 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>
+      <columns>
+        <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>
diff --git a/neonView/CampaignGroupedCostFilter_view/CampaignGroupedCostFilter_view.aod b/neonView/CampaignGroupedCostFilter_view/CampaignGroupedCostFilter_view.aod
new file mode 100644
index 0000000000000000000000000000000000000000..e3bce2264a0cfdf1ab4378f49c5bc7f799c3c5f3
--- /dev/null
+++ b/neonView/CampaignGroupedCostFilter_view/CampaignGroupedCostFilter_view.aod
@@ -0,0 +1,40 @@
+<?xml version="1.0" 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>CampaignGroupedCostFilter_view</name>
+  <title>Step costs</title>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <filterable v="true" />
+  <layout>
+    <boxLayout>
+      <name>layout</name>
+    </boxLayout>
+  </layout>
+  <children>
+    <treeTableViewTemplate>
+      <name>CostTreeTable</name>
+      <favoriteActionGroup1>alter</favoriteActionGroup1>
+      <defaultGroupFields>
+        <element>CAMPAIGNSTEP_ID</element>
+      </defaultGroupFields>
+      <entityField>#ENTITY</entityField>
+      <columns>
+        <neonTableColumn>
+          <name>457caff8-0403-425f-839c-62e5d05fe3a1</name>
+          <entityField>CATEGORY</entityField>
+        </neonTableColumn>
+        <neonTableColumn>
+          <name>2adbd887-f1df-43ff-bde9-12c8273af7a9</name>
+          <entityField>NET</entityField>
+        </neonTableColumn>
+        <neonTableColumn>
+          <name>f8c6439c-9536-477b-af19-26719902e12e</name>
+          <entityField>netPerParticipant</entityField>
+        </neonTableColumn>
+        <neonTableColumn>
+          <name>8239e81b-d69c-4ea9-b55d-83e79d1693cf</name>
+          <entityField>countParticipants</entityField>
+        </neonTableColumn>
+      </columns>
+    </treeTableViewTemplate>
+  </children>
+</neonView>
diff --git a/neonView/CampaignMain_view/CampaignMain_view.aod b/neonView/CampaignMain_view/CampaignMain_view.aod
new file mode 100644
index 0000000000000000000000000000000000000000..e35b2793103a62830da3077fb2619a2db03d079d
--- /dev/null
+++ b/neonView/CampaignMain_view/CampaignMain_view.aod
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.1">
+  <name>CampaignMain_view</name>
+  <title>Campaign</title>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <layout>
+    <masterSlaveLayout>
+      <name>layout</name>
+      <master>3092912e-212f-4e3a-9cde-dca8219f9ad7</master>
+    </masterSlaveLayout>
+  </layout>
+  <children>
+    <neonViewReference>
+      <name>3092912e-212f-4e3a-9cde-dca8219f9ad7</name>
+      <entityField>#ENTITY</entityField>
+      <view>CampaignPreview_view</view>
+    </neonViewReference>
+    <neonViewReference>
+      <name>ad66a5a6-65fb-45d5-bf62-45661fc16e30</name>
+      <entityField>CampaignSteps</entityField>
+      <view>CampaignStepFilter_view</view>
+    </neonViewReference>
+    <neonViewReference>
+      <name>77a8018e-0acc-47fd-b780-28c7fe4f5420</name>
+      <entityField>CampaignParticipants</entityField>
+      <view>CampaignParticipantFilter_view</view>
+    </neonViewReference>
+    <neonViewReference>
+      <name>405213b0-e044-4199-9cd3-220c09ac7323</name>
+      <entityField>#ENTITY</entityField>
+      <view>CampaignCost_view</view>
+    </neonViewReference>
+  </children>
+</neonView>
diff --git a/neonView/CampaignParticipantEdit_view/CampaignParticipantEdit_view.aod b/neonView/CampaignParticipantEdit_view/CampaignParticipantEdit_view.aod
new file mode 100644
index 0000000000000000000000000000000000000000..031c3e7314a419cc5390075cd3707bbf0b0ba6d6
--- /dev/null
+++ b/neonView/CampaignParticipantEdit_view/CampaignParticipantEdit_view.aod
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.1">
+  <name>CampaignParticipantEdit_view</name>
+  <title>Add participant to Campaign</title>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <isSmall v="true" />
+  <layout>
+    <headerFooterLayout>
+      <name>layout</name>
+      <header>Generic</header>
+      <footer>CampaignStepInfos_Score</footer>
+    </headerFooterLayout>
+  </layout>
+  <children>
+    <genericViewTemplate>
+      <name>Generic</name>
+      <editMode v="true" />
+      <entityField>#ENTITY</entityField>
+      <title></title>
+      <fields>
+        <entityFieldLink>
+          <name>f578bf25-4903-40a9-95c4-5ef673e57f47</name>
+          <entityField>CAMPAIGN_ID</entityField>
+        </entityFieldLink>
+        <entityFieldLink>
+          <name>3d03bc59-f0d1-458e-9453-33c00f10c7ce</name>
+          <entityField>CAMPAIGNSTEP_ID</entityField>
+        </entityFieldLink>
+        <entityFieldLink>
+          <name>94aa9a4d-e2e5-4a1b-b6f8-4d5aed87fe53</name>
+          <entityField>CONTACT_ID</entityField>
+        </entityFieldLink>
+      </fields>
+    </genericViewTemplate>
+    <scoreCardViewTemplate>
+      <name>CampaignStepInfos_Score</name>
+      <entityField>#ENTITY</entityField>
+      <fields>
+        <entityFieldLink>
+          <name>22e3fc0a-a3cb-4de0-92a6-9797bf2fafea</name>
+          <entityField>campaignStepCurrentParticipantCount</entityField>
+        </entityFieldLink>
+        <entityFieldLink>
+          <name>2bbf0c7e-6a47-4c5a-a2ae-b2ee1ee17d50</name>
+          <entityField>campaignStepMaxParticipantCount</entityField>
+        </entityFieldLink>
+      </fields>
+    </scoreCardViewTemplate>
+  </children>
+</neonView>
diff --git a/neonView/CampaignParticipantFilter_view/CampaignParticipantFilter_view.aod b/neonView/CampaignParticipantFilter_view/CampaignParticipantFilter_view.aod
new file mode 100644
index 0000000000000000000000000000000000000000..cb62a6a056152b5bd834a2fad1f1451cd0c85b1c
--- /dev/null
+++ b/neonView/CampaignParticipantFilter_view/CampaignParticipantFilter_view.aod
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.1">
+  <name>CampaignParticipantFilter_view</name>
+  <title></title>
+  <description></description>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <filterable v="false" />
+  <layout>
+    <boxLayout>
+      <name>layout</name>
+    </boxLayout>
+  </layout>
+  <children>
+    <tableViewTemplate>
+      <name>ParticipantsTable</name>
+      <favoriteActionGroup1>FilterViewActionGroup</favoriteActionGroup1>
+      <favoriteActionGroup2></favoriteActionGroup2>
+      <entityField>#ENTITY</entityField>
+      <columns>
+        <neonTableColumn>
+          <name>85558e09-e1f0-4430-b779-f807f5763808</name>
+          <entityField>CONTACT_ID</entityField>
+        </neonTableColumn>
+        <neonTableColumn>
+          <name>fc7ef954-ec19-43cf-bc0c-908760f20144</name>
+          <entityField>CAMPAIGNSTEP_ID</entityField>
+        </neonTableColumn>
+      </columns>
+    </tableViewTemplate>
+  </children>
+</neonView>
diff --git a/neonView/CampaignParticipantPreview_view/CampaignParticipantPreview_view.aod b/neonView/CampaignParticipantPreview_view/CampaignParticipantPreview_view.aod
new file mode 100644
index 0000000000000000000000000000000000000000..190c14da70064df4cc8189b74fe598b3ffdfb8a4
--- /dev/null
+++ b/neonView/CampaignParticipantPreview_view/CampaignParticipantPreview_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>CampaignParticipantPreview_view</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <layout>
+    <boxLayout>
+      <name>layout</name>
+    </boxLayout>
+  </layout>
+  <children>
+    <genericViewTemplate>
+      <name>Generic</name>
+      <entityField>#ENTITY</entityField>
+      <fields>
+        <entityFieldLink>
+          <name>012e9f6b-2507-4977-a43d-84aa54be7f6c</name>
+          <entityField>CONTACT_ID</entityField>
+        </entityFieldLink>
+        <entityFieldLink>
+          <name>1db0779f-5e93-4d80-baad-26c3128f9f5e</name>
+          <entityField>CONTACTCONTEXT</entityField>
+        </entityFieldLink>
+      </fields>
+    </genericViewTemplate>
+  </children>
+</neonView>
diff --git a/neonView/CampaignPreview_view/CampaignPreview_view.aod b/neonView/CampaignPreview_view/CampaignPreview_view.aod
new file mode 100644
index 0000000000000000000000000000000000000000..a1d6b8859c18d6f830605335621dc7a623376ad4
--- /dev/null
+++ b/neonView/CampaignPreview_view/CampaignPreview_view.aod
@@ -0,0 +1,57 @@
+<?xml version="1.0" 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>CampaignPreview_view</name>
+  <title>Campaign</title>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <icon>VAADIN:GROUP</icon>
+  <layout>
+    <headerFooterLayout>
+      <name>layout</name>
+      <header>Header</header>
+      <footer>ScoreCard</footer>
+    </headerFooterLayout>
+  </layout>
+  <children>
+    <cardViewTemplate>
+      <name>Header</name>
+      <titleField>NAME</titleField>
+      <subtitleField>STATE</subtitleField>
+      <descriptionField>DESCRIPTION</descriptionField>
+      <entityField>#ENTITY</entityField>
+      <title></title>
+    </cardViewTemplate>
+    <genericViewTemplate>
+      <name>TimespanGeneric</name>
+      <entityField>#ENTITY</entityField>
+      <title>Kampagnenzeitraum</title>
+      <fields>
+        <entityFieldLink>
+          <name>1cf03051-be32-4ff8-9788-6dbc024f086f</name>
+          <entityField>DATE_START</entityField>
+        </entityFieldLink>
+        <entityFieldLink>
+          <name>a52607c9-da9c-4894-acc6-f31024510d6d</name>
+          <entityField>DATE_END</entityField>
+        </entityFieldLink>
+      </fields>
+    </genericViewTemplate>
+    <scoreCardViewTemplate>
+      <name>ScoreCard</name>
+      <entityField>#ENTITY</entityField>
+      <fields>
+        <entityFieldLink>
+          <name>df1b29fd-0d20-4be0-b6a3-785dadb8a35b</name>
+          <entityField>COST</entityField>
+        </entityFieldLink>
+        <entityFieldLink>
+          <name>1cdf9373-790e-47ae-a6ce-d7673cb8cdb2</name>
+          <entityField>participantCount</entityField>
+        </entityFieldLink>
+        <entityFieldLink>
+          <name>b689668f-1d48-4ff1-95d9-2e217547c853</name>
+          <entityField>stepCount</entityField>
+        </entityFieldLink>
+      </fields>
+    </scoreCardViewTemplate>
+  </children>
+</neonView>
diff --git a/neonView/CampaignStepAddParticipants_view/CampaignStepAddParticipants_view.aod b/neonView/CampaignStepAddParticipants_view/CampaignStepAddParticipants_view.aod
new file mode 100644
index 0000000000000000000000000000000000000000..6bd40ef6ee02ab8358a37e0856cb5ba04b5d680a
--- /dev/null
+++ b/neonView/CampaignStepAddParticipants_view/CampaignStepAddParticipants_view.aod
@@ -0,0 +1,32 @@
+<?xml version="1.0" 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>CampaignStepAddParticipants_view</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <layout>
+    <boxLayout>
+      <name>layout</name>
+    </boxLayout>
+  </layout>
+  <children>
+    <genericViewTemplate>
+      <name>CampaignAndStepSelectionGeneric</name>
+      <editMode v="true" />
+      <showDrawer v="false" />
+      <entityField>#ENTITY</entityField>
+      <fields>
+        <entityFieldLink>
+          <name>038b2969-8fe9-469f-b823-e7f356b103cd</name>
+          <entityField>CAMPAIGN_ID</entityField>
+        </entityFieldLink>
+        <entityFieldLink>
+          <name>62805d6e-3b77-4af3-b282-13720dd615df</name>
+          <entityField>CAMPAIGNSTEPID</entityField>
+        </entityFieldLink>
+        <entityFieldLink>
+          <name>6c1ec68e-64fd-4eaf-8d74-047e9a8703fa</name>
+          <entityField>ADDPARTICIPANTSMESSAGE</entityField>
+        </entityFieldLink>
+      </fields>
+    </genericViewTemplate>
+  </children>
+</neonView>
diff --git a/neonView/CampaignStepAnalysis_view/CampaignStepAnalysis_view.aod b/neonView/CampaignStepAnalysis_view/CampaignStepAnalysis_view.aod
new file mode 100644
index 0000000000000000000000000000000000000000..90077e93c4182534c269c047f36dfdef150905ed
--- /dev/null
+++ b/neonView/CampaignStepAnalysis_view/CampaignStepAnalysis_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>CampaignStepAnalysis_view</name>
+  <title>Auswertung</title>
+  <description>Charts als Übersicht der Kosten des Kampagnenschrittes</description>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <layout>
+    <boxLayout>
+      <name>layout</name>
+    </boxLayout>
+  </layout>
+  <children>
+    <genericViewTemplate>
+      <name>54</name>
+      <entityField>#ENTITY</entityField>
+      <fields>
+        <entityFieldLink>
+          <name>79aa1ec7-815a-4494-9d1c-c8116ea8d952</name>
+          <entityField>NAME</entityField>
+        </entityFieldLink>
+      </fields>
+    </genericViewTemplate>
+  </children>
+</neonView>
diff --git a/neonView/CampaignStepCurrentMaxParticipants_view/CampaignStepCurrentMaxParticipants_view.aod b/neonView/CampaignStepCurrentMaxParticipants_view/CampaignStepCurrentMaxParticipants_view.aod
new file mode 100644
index 0000000000000000000000000000000000000000..2fbca914538b480a897fab10d0da5c2a0976cf6f
--- /dev/null
+++ b/neonView/CampaignStepCurrentMaxParticipants_view/CampaignStepCurrentMaxParticipants_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>CampaignStepCurrentMaxParticipants_view</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <layout>
+    <boxLayout>
+      <name>layout</name>
+    </boxLayout>
+  </layout>
+  <children>
+    <singleDataChartViewTemplate>
+      <name>CurrentToMaxParticipantsChart</name>
+      <chartType>PIE</chartType>
+      <xAxis>LABEL</xAxis>
+      <yAxis>COUNT</yAxis>
+      <entityField>#ENTITY</entityField>
+    </singleDataChartViewTemplate>
+  </children>
+</neonView>
diff --git a/neonView/CampaignStepEdit_view/CampaignStepEdit_view.aod b/neonView/CampaignStepEdit_view/CampaignStepEdit_view.aod
new file mode 100644
index 0000000000000000000000000000000000000000..7c5c1ed02a31713ae7a8dabcd98416ca0c4573ae
--- /dev/null
+++ b/neonView/CampaignStepEdit_view/CampaignStepEdit_view.aod
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.1">
+  <name>CampaignStepEdit_view</name>
+  <title>Neuer Kampagnenschritt</title>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <isSmall v="true" />
+  <layout>
+    <boxLayout>
+      <name>layout</name>
+    </boxLayout>
+  </layout>
+  <children>
+    <genericViewTemplate>
+      <name>StepGeneric</name>
+      <editMode v="true" />
+      <entityField>#ENTITY</entityField>
+      <title>New campaign step</title>
+      <fields>
+        <entityFieldLink>
+          <name>db2e792a-b224-4c93-99ef-96c54c5c703f</name>
+          <entityField>NAME</entityField>
+        </entityFieldLink>
+        <entityFieldLink>
+          <name>e16e3f66-7e80-4796-acca-6018e86e1b88</name>
+          <entityField>EMPLOYEE_CONTACT_ID</entityField>
+        </entityFieldLink>
+        <entityFieldLink>
+          <name>ea21096b-5885-4f5e-8bd6-c45275b25036</name>
+          <entityField>DATE_START</entityField>
+        </entityFieldLink>
+        <entityFieldLink>
+          <name>95e538ba-686b-4791-87f0-cd569b8cb456</name>
+          <entityField>DATE_END</entityField>
+        </entityFieldLink>
+        <entityFieldLink>
+          <name>80c1df2f-2458-4e4c-a6da-9ce56b17bbf0</name>
+          <entityField>STATE</entityField>
+        </entityFieldLink>
+        <entityFieldLink>
+          <name>2447348f-4ed9-4b8c-8b0e-94e663fd781d</name>
+          <entityField>MAXPARTICIPANTS</entityField>
+        </entityFieldLink>
+        <entityFieldLink>
+          <name>981cf207-6e9b-428e-bd81-0d76b4b2f180</name>
+          <entityField>DESCRIPTION</entityField>
+        </entityFieldLink>
+      </fields>
+    </genericViewTemplate>
+  </children>
+</neonView>
diff --git a/neonView/CampaignStepFilter_view/CampaignStepFilter_view.aod b/neonView/CampaignStepFilter_view/CampaignStepFilter_view.aod
new file mode 100644
index 0000000000000000000000000000000000000000..5b4e3ac8b18b2f0ec22163c47bbf30f0a94c03cf
--- /dev/null
+++ b/neonView/CampaignStepFilter_view/CampaignStepFilter_view.aod
@@ -0,0 +1,45 @@
+<?xml version="1.0" 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>CampaignStepFilter_view</name>
+  <title>Kampagnenschritte</title>
+  <description></description>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <layout>
+    <boxLayout>
+      <name>layout</name>
+    </boxLayout>
+  </layout>
+  <children>
+    <tableViewTemplate>
+      <name>StepsTable</name>
+      <autoNewRow v="true" />
+      <entityField>#ENTITY</entityField>
+      <columns>
+        <neonTableColumn>
+          <name>5d52aaef-ec22-4c45-9ac7-eaec5d967283</name>
+          <entityField>SORTING</entityField>
+        </neonTableColumn>
+        <neonTableColumn>
+          <name>d9ca59de-1441-494a-91f0-1cff91c575de</name>
+          <entityField>NAME</entityField>
+        </neonTableColumn>
+        <neonTableColumn>
+          <name>0ffcc021-2b58-49f6-91d0-21f4029f744f</name>
+          <entityField>DATE_START</entityField>
+        </neonTableColumn>
+        <neonTableColumn>
+          <name>2507d34f-3bc2-426c-9acc-d8ae146daee8</name>
+          <entityField>DATE_END</entityField>
+        </neonTableColumn>
+        <neonTableColumn>
+          <name>4ee7481b-c629-4da2-8d7a-b33e2e10821e</name>
+          <entityField>CurrentMaxParticipantsInfo</entityField>
+        </neonTableColumn>
+        <neonTableColumn>
+          <name>9fa9d9f4-5851-4125-ba59-09aa2fb07f89</name>
+          <entityField>STATE</entityField>
+        </neonTableColumn>
+      </columns>
+    </tableViewTemplate>
+  </children>
+</neonView>
diff --git a/neonView/CampaignStepMain_view/CampaignStepMain_view.aod b/neonView/CampaignStepMain_view/CampaignStepMain_view.aod
new file mode 100644
index 0000000000000000000000000000000000000000..ba87160a9b109f44b7bcc99017b7c48ec0715d8d
--- /dev/null
+++ b/neonView/CampaignStepMain_view/CampaignStepMain_view.aod
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.1">
+  <name>CampaignStepMain_view</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <layout>
+    <masterSlaveLayout>
+      <name>layout</name>
+      <master>3dfd5e35-275b-412f-8729-2a59e3a2c025</master>
+    </masterSlaveLayout>
+  </layout>
+  <children>
+    <neonViewReference>
+      <name>3dfd5e35-275b-412f-8729-2a59e3a2c025</name>
+      <entityField>#ENTITY</entityField>
+      <view>CampaignStepPreview_view</view>
+    </neonViewReference>
+    <neonViewReference>
+      <name>f1a098ae-1516-49bc-9982-8f96ec0dbe2b</name>
+      <entityField>CampaignParticipantsConsumer</entityField>
+      <view>CampaignParticipantFilter_view</view>
+    </neonViewReference>
+    <neonViewReference>
+      <name>dd0cb348-669f-431a-ba71-65e9a651c922</name>
+      <entityField>#ENTITY</entityField>
+      <view>CampaignStepAnalysis_view</view>
+    </neonViewReference>
+    <neonViewReference>
+      <name>a5a2f431-9c55-45d7-8765-100e2d5dbb81</name>
+      <entityField>CampaignStepCosts</entityField>
+      <view>CampaignCostExtendedFilter_view</view>
+    </neonViewReference>
+  </children>
+</neonView>
diff --git a/neonView/CampaignStepPreview_view/CampaignStepPreview_view.aod b/neonView/CampaignStepPreview_view/CampaignStepPreview_view.aod
new file mode 100644
index 0000000000000000000000000000000000000000..f3de7b97b364387b4ccc0e4782dcca1a011bf9c0
--- /dev/null
+++ b/neonView/CampaignStepPreview_view/CampaignStepPreview_view.aod
@@ -0,0 +1,57 @@
+<?xml version="1.0" 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>CampaignStepPreview_view</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <layout>
+    <headerFooterLayout>
+      <name>layout</name>
+      <header>CampaignStepCard</header>
+      <footer>KeyScoreInfos</footer>
+    </headerFooterLayout>
+  </layout>
+  <children>
+    <cardViewTemplate>
+      <name>CampaignStepCard</name>
+      <titleField>NAME</titleField>
+      <subtitleField>STATE</subtitleField>
+      <descriptionField>DESCRIPTION</descriptionField>
+      <entityField>#ENTITY</entityField>
+    </cardViewTemplate>
+    <genericViewTemplate>
+      <name>CampaignStepInfosGeneric</name>
+      <entityField>#ENTITY</entityField>
+      <fields>
+        <entityFieldLink>
+          <name>4cbf0232-1dab-47f9-b62a-b539d5035c53</name>
+          <entityField>DATE_START</entityField>
+        </entityFieldLink>
+        <entityFieldLink>
+          <name>677875bc-6b50-4dd8-b8bf-eba5c0e94c56</name>
+          <entityField>DATE_END</entityField>
+        </entityFieldLink>
+        <entityFieldLink>
+          <name>a4dc1652-1c0c-4ca1-8f53-58e0b0c18177</name>
+          <entityField>CAMPAIGN_ID</entityField>
+        </entityFieldLink>
+        <entityFieldLink>
+          <name>1a30ddde-aaaf-43c5-ab4c-52581175ff12</name>
+          <entityField>CampaignStatus</entityField>
+        </entityFieldLink>
+      </fields>
+    </genericViewTemplate>
+    <scoreCardViewTemplate>
+      <name>KeyScoreInfos</name>
+      <entityField>#ENTITY</entityField>
+      <fields>
+        <entityFieldLink>
+          <name>0af45fb6-7ce8-493e-bdd8-17c4a06aa4f7</name>
+          <entityField>COST</entityField>
+        </entityFieldLink>
+        <entityFieldLink>
+          <name>dc39a199-a5c1-4a8e-81cc-a85bfca63a9f</name>
+          <entityField>CurrentMaxParticipantsInfo</entityField>
+        </entityFieldLink>
+      </fields>
+    </scoreCardViewTemplate>
+  </children>
+</neonView>
diff --git a/neonView/IndexSearchView/IndexSearchView.aod b/neonView/IndexSearchView/IndexSearchView.aod
new file mode 100644
index 0000000000000000000000000000000000000000..39cd3e719a428a03ca082d815e5495936be68857
--- /dev/null
+++ b/neonView/IndexSearchView/IndexSearchView.aod
@@ -0,0 +1,32 @@
+<?xml version="1.0" 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>IndexSearchView</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <dashletConfigurations>
+    <neonDashletConfiguration>
+      <name>IndexSearchDashlet</name>
+      <title>Indexsearch</title>
+      <fragment>IndexSearchContext/full</fragment>
+      <storeRoles />
+      <icon>VAADIN:SEARCH</icon>
+      <categories>
+        <neonDashletCategory>
+          <name>indexsearch</name>
+          <title>Indexsearch</title>
+        </neonDashletCategory>
+      </categories>
+    </neonDashletConfiguration>
+  </dashletConfigurations>
+  <layout>
+    <boxLayout>
+      <name>layout</name>
+    </boxLayout>
+  </layout>
+  <children>
+    <indexSearchViewTemplate>
+      <name>IndexSearchTemplate</name>
+      <entityField>INDEXSEARCHFIELD</entityField>
+      <title></title>
+    </indexSearchViewTemplate>
+  </children>
+</neonView>
diff --git a/neonView/KeywordEntryFilter_view/KeywordEntryFilter_view.aod b/neonView/KeywordEntryFilter_view/KeywordEntryFilter_view.aod
index 80ba451c5ede8eaffae1986389fe751dea73ae1c..e638ae7abde4ea41370b881058de6ddf60251636 100644
--- a/neonView/KeywordEntryFilter_view/KeywordEntryFilter_view.aod
+++ b/neonView/KeywordEntryFilter_view/KeywordEntryFilter_view.aod
@@ -9,15 +9,23 @@
     </groupLayout>
   </layout>
   <children>
-    <treeViewTemplate>
-      <name>EntriesTreetable</name>
-      <titleField>TITLE</titleField>
-      <descriptionField>KEYID</descriptionField>
+    <treeTableViewTemplate>
+      <name>EntriesTreeTable</name>
       <defaultGroupFields>
         <element>CONTAINER</element>
       </defaultGroupFields>
       <entityField>#ENTITY</entityField>
-    </treeViewTemplate>
+      <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>
diff --git a/neonView/NotificationFilter_view/NotificationFilter_view.aod b/neonView/NotificationFilter_view/NotificationFilter_view.aod
new file mode 100644
index 0000000000000000000000000000000000000000..11a8ea6866cb1b0fdd61e0fe94caca420a868eed
--- /dev/null
+++ b/neonView/NotificationFilter_view/NotificationFilter_view.aod
@@ -0,0 +1,39 @@
+<?xml version="1.0" 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>NotificationFilter_view</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <filterable v="true" />
+  <layout>
+    <boxLayout>
+      <name>layout</name>
+    </boxLayout>
+  </layout>
+  <children>
+    <tableViewTemplate>
+      <name>Table</name>
+      <entityField>#ENTITY</entityField>
+      <columns>
+        <neonTableColumn>
+          <name>0ed20b46-be6a-424c-a583-a3f7496ec3f9</name>
+          <entityField>ICON</entityField>
+        </neonTableColumn>
+        <neonTableColumn>
+          <name>3bf425ed-227c-4768-b339-4794aa0d6063</name>
+          <entityField>CAPTION</entityField>
+        </neonTableColumn>
+        <neonTableColumn>
+          <name>ff33a6c1-7ac6-4acd-a083-e56a36f89977</name>
+          <entityField>DESCRIPTION</entityField>
+        </neonTableColumn>
+        <neonTableColumn>
+          <name>63df503b-2502-4123-917a-77c932f61268</name>
+          <entityField>ORIGINATORNAME</entityField>
+        </neonTableColumn>
+        <neonTableColumn>
+          <name>5cb09de4-4413-41e5-8a7c-4970a3cf6a62</name>
+          <entityField>STATE</entityField>
+        </neonTableColumn>
+      </columns>
+    </tableViewTemplate>
+  </children>
+</neonView>
diff --git a/neonView/NotificationPreview_view/NotificationPreview_view.aod b/neonView/NotificationPreview_view/NotificationPreview_view.aod
new file mode 100644
index 0000000000000000000000000000000000000000..4f30158ba8c1271b41d2999ad3514e6e71d4cdac
--- /dev/null
+++ b/neonView/NotificationPreview_view/NotificationPreview_view.aod
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.1">
+  <name>NotificationPreview_view</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <filterable v="false" />
+  <layout>
+    <boxLayout>
+      <name>layout</name>
+    </boxLayout>
+  </layout>
+  <children>
+    <cardViewTemplate>
+      <name>Card</name>
+      <iconField>#ICON</iconField>
+      <titleField>CAPTION</titleField>
+      <descriptionField>DESCRIPTION</descriptionField>
+      <entityField>#ENTITY</entityField>
+    </cardViewTemplate>
+  </children>
+</neonView>
diff --git a/neonView/OfferEdit_view/OfferEdit_view.aod b/neonView/OfferEdit_view/OfferEdit_view.aod
index 60e014f44a74e9ab46a5f84f9352401b2e8bab7b..ba2428898be40760f5ee4785e95fc00e47a95725 100644
--- a/neonView/OfferEdit_view/OfferEdit_view.aod
+++ b/neonView/OfferEdit_view/OfferEdit_view.aod
@@ -70,5 +70,10 @@
         </entityFieldLink>
       </fields>
     </genericViewTemplate>
+    <neonViewReference>
+      <name>52f93604-4ec3-427f-b220-27ab63a30560</name>
+      <entityField>Attributes</entityField>
+      <view>AttributeRelationEdit_view</view>
+    </neonViewReference>
   </children>
 </neonView>
diff --git a/neonView/OfferMain_view/OfferMain_view.aod b/neonView/OfferMain_view/OfferMain_view.aod
index ea4a89a44810d450579b611e28b0e28cf923ff86..47f2a91194206929a0f2c663bb747f096a09e755 100644
--- a/neonView/OfferMain_view/OfferMain_view.aod
+++ b/neonView/OfferMain_view/OfferMain_view.aod
@@ -34,6 +34,11 @@
       <entityField>Tasks</entityField>
       <view>TaskFilter_view</view>
     </neonViewReference>
+    <neonViewReference>
+      <name>bc335644-c046-4362-9c7f-db6baa0b7394</name>
+      <entityField>AttributeTree</entityField>
+      <view>AttributeRelationTree_view</view>
+    </neonViewReference>
     <neonViewReference>
       <name>e96f2fec-1a98-4380-895a-82ab78ba408a</name>
       <entityField>Documents</entityField>
diff --git a/neonView/OfferPreview_view/OfferPreview_view.aod b/neonView/OfferPreview_view/OfferPreview_view.aod
index 9b73e6cfe911f0906c5aed7bc0eb83f034975aca..a28c644d44eab76093e06b9f42354d5dfc181606 100644
--- a/neonView/OfferPreview_view/OfferPreview_view.aod
+++ b/neonView/OfferPreview_view/OfferPreview_view.aod
@@ -12,7 +12,7 @@
     <cardViewTemplate>
       <name>Header</name>
       <iconField>IMAGE</iconField>
-      <titleField>Offer_OfferCode_VersNr_fieldgroup</titleField>
+      <titleField>OfferCode_VersNr_fieldgroup</titleField>
       <descriptionField>CONTACT_ID</descriptionField>
       <favoriteAction1>newActivity</favoriteAction1>
       <entityField>#ENTITY</entityField>
diff --git a/neonView/OfferitemFilter_view/OfferitemFilter_view.aod b/neonView/OfferitemFilter_view/OfferitemFilter_view.aod
index 782aa68ca11efa22d05bcf1a3fba67d2720e4ac2..7071404ce53d0a5ace58c32883ec2581efc4dfc3 100644
--- a/neonView/OfferitemFilter_view/OfferitemFilter_view.aod
+++ b/neonView/OfferitemFilter_view/OfferitemFilter_view.aod
@@ -9,48 +9,48 @@
     </boxLayout>
   </layout>
   <children>
-    <tableViewTemplate>
-      <name>Offeritems</name>
-      <autoNewRow v="true" />
+    <treeTableViewTemplate>
+      <name>OfferitemsTreeTable</name>
+      <parentField>ASSIGNEDTO</parentField>
       <entityField>#ENTITY</entityField>
       <columns>
         <neonTableColumn>
-          <name>8c74810d-d127-4e64-8fbf-1b3db1835232</name>
+          <name>91e85f61-5e5d-48f8-aeb1-a5740ec07e25</name>
           <entityField>ITEMPOSITION</entityField>
         </neonTableColumn>
         <neonTableColumn>
-          <name>545f79bf-2fee-4112-9541-0889d0e514eb</name>
+          <name>0d896874-cdb1-42bb-8a47-8ee61def6177</name>
           <entityField>PRODUCT_ID</entityField>
         </neonTableColumn>
         <neonTableColumn>
-          <name>2a907da4-b48d-4933-bc17-a40e7d4556f9</name>
+          <name>0b493fd0-d94d-4bfa-8533-ff2ad4af7ffb</name>
           <entityField>QUANTITY</entityField>
         </neonTableColumn>
         <neonTableColumn>
-          <name>a8dcb2bb-bb09-4a6e-b0f0-1b4d1111eb22</name>
+          <name>917406b8-f030-417d-a961-f391655526ec</name>
           <entityField>UNIT</entityField>
         </neonTableColumn>
         <neonTableColumn>
-          <name>33ef0703-d4ea-4187-b555-648a1733ee99</name>
+          <name>14da5a9f-4fed-4977-aec0-823ab665e1cb</name>
           <entityField>PRICE</entityField>
         </neonTableColumn>
         <neonTableColumn>
-          <name>61a39c6b-f7dd-487c-bc5f-c2e95376ec37</name>
+          <name>25d9f682-eb5f-4d96-a040-c3f4522affe7</name>
           <entityField>DISCOUNT</entityField>
         </neonTableColumn>
         <neonTableColumn>
-          <name>bfd34c94-1a5f-4caf-ae6e-2c09375c023c</name>
+          <name>9e2bcb7e-b042-4f13-946c-0a6422412975</name>
           <entityField>VAT</entityField>
         </neonTableColumn>
         <neonTableColumn>
-          <name>89fd18d0-f6ee-4323-9277-464dee6da625</name>
+          <name>7a3b3ce6-a651-4a2a-acfa-0e990fb0b041</name>
           <entityField>OPTIONAL</entityField>
         </neonTableColumn>
         <neonTableColumn>
-          <name>60a36c38-103f-4fdb-9e8a-b8fd6d441f14</name>
+          <name>e43213db-8867-495f-8305-3472a8906222</name>
           <entityField>TotalPrice</entityField>
         </neonTableColumn>
       </columns>
-    </tableViewTemplate>
+    </treeTableViewTemplate>
   </children>
 </neonView>
diff --git a/neonView/OfferitemPreview_view/OfferitemPreview_view.aod b/neonView/OfferitemPreview_view/OfferitemPreview_view.aod
index c93ad8c9ef329db4797b3726f77dafbf10044c28..23999712d4bdbc25fa2fb3171d39e082a6744284 100644
--- a/neonView/OfferitemPreview_view/OfferitemPreview_view.aod
+++ b/neonView/OfferitemPreview_view/OfferitemPreview_view.aod
@@ -24,18 +24,38 @@
           <name>3b207cf2-c621-4e7d-b7aa-32feace5fe04</name>
           <entityField>INFO</entityField>
         </entityFieldLink>
-        <entityFieldLink>
-          <name>9868560c-41c7-4641-b0f1-627a61b796b3</name>
-          <entityField>TotalPrice</entityField>
-        </entityFieldLink>
         <entityFieldLink>
           <name>c0c04d1c-90a7-4c0b-9323-1f0783757987</name>
           <entityField>GROUPCODEID</entityField>
         </entityFieldLink>
+        <entityFieldLink>
+          <name>e792d720-187f-4aa1-917c-1c8065222b72</name>
+          <entityField>QUANTITY</entityField>
+        </entityFieldLink>
+        <entityFieldLink>
+          <name>9e25804b-198d-4505-b276-62bf58482dc6</name>
+          <entityField>UNIT</entityField>
+        </entityFieldLink>
+        <entityFieldLink>
+          <name>b503187b-db64-4d2f-839f-9e812ee5163e</name>
+          <entityField>PRICE</entityField>
+        </entityFieldLink>
+        <entityFieldLink>
+          <name>f8043352-f756-4854-9caa-a9aea073e4fe</name>
+          <entityField>DISCOUNT</entityField>
+        </entityFieldLink>
+        <entityFieldLink>
+          <name>89b426b0-962f-4483-87c3-e6c0e0d0d651</name>
+          <entityField>VAT</entityField>
+        </entityFieldLink>
         <entityFieldLink>
           <name>e25386dc-a740-4f93-a1f0-32317cf5a36a</name>
           <entityField>OPTIONAL</entityField>
         </entityFieldLink>
+        <entityFieldLink>
+          <name>9868560c-41c7-4641-b0f1-627a61b796b3</name>
+          <entityField>TotalPrice</entityField>
+        </entityFieldLink>
       </fields>
     </genericViewTemplate>
   </children>
diff --git a/neonView/OrderEdit_view/OrderEdit_view.aod b/neonView/OrderEdit_view/OrderEdit_view.aod
index 8ab4459538bc6228271a07028817648be240f7a8..2132b516032ca81b2c1e714ead5d08f216cf47d5 100644
--- a/neonView/OrderEdit_view/OrderEdit_view.aod
+++ b/neonView/OrderEdit_view/OrderEdit_view.aod
@@ -54,5 +54,10 @@
         </entityFieldLink>
       </fields>
     </genericViewTemplate>
+    <neonViewReference>
+      <name>72e2cb25-23e0-4f52-87a3-7c1bd80e99ec</name>
+      <entityField>Attributes</entityField>
+      <view>AttributeRelationEdit_view</view>
+    </neonViewReference>
   </children>
 </neonView>
diff --git a/neonView/OrderMain_view/OrderMain_view.aod b/neonView/OrderMain_view/OrderMain_view.aod
index 77bbd6830b3053237835359ff55114deae8125ee..bc76e90e0617ea97e8df8b7e2a17aa0555055a0e 100644
--- a/neonView/OrderMain_view/OrderMain_view.aod
+++ b/neonView/OrderMain_view/OrderMain_view.aod
@@ -34,6 +34,11 @@
       <entityField>#ENTITY</entityField>
       <view>OrderDetail_view</view>
     </neonViewReference>
+    <neonViewReference>
+      <name>1e0af6a9-9bb6-47b5-944b-636d21ac74d2</name>
+      <entityField>AttributeTree</entityField>
+      <view>AttributeRelationTree_view</view>
+    </neonViewReference>
     <neonViewReference>
       <name>b3014999-da86-45ae-86ae-feb738d62906</name>
       <entityField>Documents</entityField>
diff --git a/neonView/OrderPreview_view/OrderPreview_view.aod b/neonView/OrderPreview_view/OrderPreview_view.aod
index d9aa97ac59cc3bec65c625d8cc72bcb3fa7f37dd..224df4dc3dffd9d2668c7e5453be2c7dfb69507e 100644
--- a/neonView/OrderPreview_view/OrderPreview_view.aod
+++ b/neonView/OrderPreview_view/OrderPreview_view.aod
@@ -12,7 +12,7 @@
     <cardViewTemplate>
       <name>Header</name>
       <iconField>IMAGE</iconField>
-      <titleField>Order_OrderCode_VersNr_fieldgroup</titleField>
+      <titleField>OrderCode_VersNr_fieldgroup</titleField>
       <descriptionField>CONTACT_ID</descriptionField>
       <favoriteAction1>newActivity</favoriteAction1>
       <entityField>#ENTITY</entityField>
diff --git a/neonView/OrganisationFilter_view/OrganisationFilter_view.aod b/neonView/OrganisationFilter_view/OrganisationFilter_view.aod
index 0be0dd2053fa814caca8b0954dac6a4380772042..42acbc4358c5d947174cf4c9740b0bd95dfb886d 100644
--- a/neonView/OrganisationFilter_view/OrganisationFilter_view.aod
+++ b/neonView/OrganisationFilter_view/OrganisationFilter_view.aod
@@ -32,6 +32,7 @@
   <children>
     <tableViewTemplate>
       <name>Organisations</name>
+      <favoriteActionGroup1>campaignActionGroup</favoriteActionGroup1>
       <entityField>#ENTITY</entityField>
       <columns>
         <neonTableColumn>
diff --git a/neonView/PersonFilter_view/PersonFilter_view.aod b/neonView/PersonFilter_view/PersonFilter_view.aod
index fe94380f9869ce7deafca8ce11d3541eeec36754..8eacdad7de7323e951cb19a53f568e9883fb908f 100644
--- a/neonView/PersonFilter_view/PersonFilter_view.aod
+++ b/neonView/PersonFilter_view/PersonFilter_view.aod
@@ -32,6 +32,8 @@
   <children>
     <tableViewTemplate>
       <name>Persons</name>
+      <favoriteActionGroup1>campaignActionGroup</favoriteActionGroup1>
+      <hideActions v="false" />
       <showHeader v="true" />
       <entityField>#ENTITY</entityField>
       <columns>
diff --git a/neonView/ProductpriceFilter_view/ProductpriceFilter_view.aod b/neonView/ProductpriceFilter_view/ProductpriceFilter_view.aod
index b225f31a95b5abf6de65302cf84b5d1e777e836a..19a4436db74b4df7216d312685839c1b7bda5ec4 100644
--- a/neonView/ProductpriceFilter_view/ProductpriceFilter_view.aod
+++ b/neonView/ProductpriceFilter_view/ProductpriceFilter_view.aod
@@ -11,7 +11,6 @@
   <children>
     <tableViewTemplate>
       <name>Prices</name>
-      <autoNewRow v="true" />
       <entityField>#ENTITY</entityField>
       <columns>
         <neonTableColumn>
diff --git a/neonView/ProductpriceRelation_view/ProductpriceRelation_view.aod b/neonView/ProductpriceRelation_view/ProductpriceRelation_view.aod
index 3f9f33250c400cb0f9b755e87e229f788ff579c8..9d9bef97dfc888c3202b6d6c207c3d3cbf4bf53c 100644
--- a/neonView/ProductpriceRelation_view/ProductpriceRelation_view.aod
+++ b/neonView/ProductpriceRelation_view/ProductpriceRelation_view.aod
@@ -10,45 +10,48 @@
   <children>
     <tableViewTemplate>
       <name>PriceRelations</name>
-      <autoNewRow v="true" />
       <entityField>#ENTITY</entityField>
       <columns>
         <neonTableColumn>
-          <name>bc7ca35e-c454-4cc0-9b2e-0656e03f1f65</name>
+          <name>44311686-a24a-4cf0-87a0-6e354b3f457a</name>
           <entityField>IMAGE</entityField>
         </neonTableColumn>
         <neonTableColumn>
-          <name>9b809450-cbe5-40f3-8d64-b4a5bac5eb5b</name>
+          <name>695ce7be-d738-48a9-833d-e8815c6eff74</name>
           <entityField>PRODUCT_ID</entityField>
         </neonTableColumn>
         <neonTableColumn>
-          <name>fd5ab54d-439c-4836-a761-3af16e437a0e</name>
+          <name>472a96ca-10ff-49c7-b2ae-6550e04c4e6f</name>
           <entityField>VALID_FROM</entityField>
         </neonTableColumn>
         <neonTableColumn>
-          <name>da4728b2-d5fe-4df1-84e5-a77a653dc558</name>
+          <name>56b22986-0b94-4e7f-a0e8-c2a0a7281088</name>
           <entityField>VALID_TO</entityField>
         </neonTableColumn>
         <neonTableColumn>
-          <name>4fd6845e-cb3a-4fe3-8900-3b58a86cb374</name>
-          <entityField>FROMQUANTITY</entityField>
+          <name>56902ebb-b48b-42f9-b867-fb2b07527461</name>
+          <entityField>PRICE</entityField>
         </neonTableColumn>
         <neonTableColumn>
-          <name>1cf65759-0c48-4d3d-8bd1-ddf0645ded43</name>
-          <entityField>PRICELIST</entityField>
+          <name>8879e46d-fa53-4769-8bcf-15b65fdf9967</name>
+          <entityField>CURRENCY</entityField>
         </neonTableColumn>
         <neonTableColumn>
-          <name>3ed800e0-a630-42b4-9dda-288ab5eefc69</name>
-          <entityField>PRICE</entityField>
+          <name>15a669d9-b089-4134-89a0-129de6e1e68c</name>
+          <entityField>BUYSELL</entityField>
         </neonTableColumn>
         <neonTableColumn>
-          <name>20efd64c-297d-4774-b020-437d3610e798</name>
-          <entityField>CURRENCY</entityField>
+          <name>e27ad433-ca4f-4a54-8722-75c9055a202b</name>
+          <entityField>FROMQUANTITY</entityField>
         </neonTableColumn>
         <neonTableColumn>
-          <name>787d2cce-ddb0-4d7e-8df4-5675e0d96d76</name>
+          <name>981f29b1-b4c5-4591-8064-21a72f339179</name>
           <entityField>VAT</entityField>
         </neonTableColumn>
+        <neonTableColumn>
+          <name>51a923d8-3893-409b-869e-a4ad9704aa03</name>
+          <entityField>PRICELIST</entityField>
+        </neonTableColumn>
       </columns>
     </tableViewTemplate>
   </children>
diff --git a/neonView/SalesprojectEdit_view/SalesprojectEdit_view.aod b/neonView/SalesprojectEdit_view/SalesprojectEdit_view.aod
index 5c2db6962a97eead75e68fdae5689a31deca62e5..c047336f190676a4a78f522967c83665db265246 100644
--- a/neonView/SalesprojectEdit_view/SalesprojectEdit_view.aod
+++ b/neonView/SalesprojectEdit_view/SalesprojectEdit_view.aod
@@ -62,5 +62,10 @@
         </entityFieldLink>
       </fields>
     </genericViewTemplate>
+    <neonViewReference>
+      <name>fc97f8c8-ffd0-4d67-b331-eab37ef1dc2b</name>
+      <entityField>Attributes</entityField>
+      <view>AttributeRelationEdit_view</view>
+    </neonViewReference>
   </children>
 </neonView>
diff --git a/neonView/SalesprojectMain_view/SalesprojectMain_view.aod b/neonView/SalesprojectMain_view/SalesprojectMain_view.aod
index 2ac8547b5b4d4913bfdc9c98b2e4e1f8468f406a..649798e53651fcf3339727f5098a61c702bbebc9 100644
--- a/neonView/SalesprojectMain_view/SalesprojectMain_view.aod
+++ b/neonView/SalesprojectMain_view/SalesprojectMain_view.aod
@@ -59,6 +59,11 @@
       <entityField>Timetrackings</entityField>
       <view>TimetrackingFilter_view</view>
     </neonViewReference>
+    <neonViewReference>
+      <name>9c98cef0-f9dd-40a7-a9c9-eb4e741286d2</name>
+      <entityField>AttributeTree</entityField>
+      <view>AttributeRelationTree_view</view>
+    </neonViewReference>
     <neonViewReference>
       <name>0a3f2444-8d91-41e3-8f4d-19a6013c29c5</name>
       <entityField>Documents</entityField>
diff --git a/neonView/TaskFilter_view/TaskFilter_view.aod b/neonView/TaskFilter_view/TaskFilter_view.aod
index 68e0e642b0fa2b04a6218fcba22ee9ac56a7b70d..268c1b42d833821c2443c0d287c7ce8537c5f3c1 100644
--- a/neonView/TaskFilter_view/TaskFilter_view.aod
+++ b/neonView/TaskFilter_view/TaskFilter_view.aod
@@ -68,13 +68,32 @@
         </neonTableColumn>
       </columns>
     </tableViewTemplate>
-    <treeViewTemplate>
-      <name>TasksTree</name>
-      <titleField>SUBJECT_DETAILS</titleField>
-      <descriptionField>DESCRIPTION</descriptionField>
-      <iconField>PRIORITY_ICON</iconField>
-      <defaultGroupFields />
+    <treeTableViewTemplate>
+      <name>TasksTreeTable</name>
       <entityField>#ENTITY</entityField>
-    </treeViewTemplate>
+      <columns>
+        <neonTableColumn>
+          <name>3cd319ea-5a06-409c-a7ce-1c87beff62d2</name>
+          <entityField>PRIORITY_ICON</entityField>
+        </neonTableColumn>
+        <neonTableColumn>
+          <name>591cd079-a8e9-49aa-8a2d-afb643aef079</name>
+          <entityField>SUBJECT</entityField>
+          <expandRatio v="100" />
+        </neonTableColumn>
+        <neonTableColumn>
+          <name>5d11add4-d939-4c8e-9633-efd0c2991837</name>
+          <entityField>PRIORITY</entityField>
+        </neonTableColumn>
+        <neonTableColumn>
+          <name>abba0283-ace9-41f2-8b98-df149c2feaf9</name>
+          <entityField>MATURITY_DATE</entityField>
+        </neonTableColumn>
+        <neonTableColumn>
+          <name>b92dba41-58a2-4c95-aeb4-235c5eaffad7</name>
+          <entityField>STATUS</entityField>
+        </neonTableColumn>
+      </columns>
+    </treeTableViewTemplate>
   </children>
 </neonView>
diff --git a/neonView/campaignParticipantMessage_view/campaignParticipantMessage_view.aod b/neonView/campaignParticipantMessage_view/campaignParticipantMessage_view.aod
new file mode 100644
index 0000000000000000000000000000000000000000..2ed214ff37cc2b033dba2655cd3f551364924647
--- /dev/null
+++ b/neonView/campaignParticipantMessage_view/campaignParticipantMessage_view.aod
@@ -0,0 +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>campaignParticipantMessage_view</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <layout>
+    <noneLayout>
+      <name>layout</name>
+    </noneLayout>
+  </layout>
+  <children>
+    <genericViewTemplate>
+      <name>Message_view</name>
+      <hideLabels v="true" />
+      <entityField>#ENTITY</entityField>
+      <fields>
+        <entityFieldLink>
+          <name>bc1db862-a448-47f6-b534-2ce28dc993a8</name>
+          <entityField>campaignParticipantMessage</entityField>
+        </entityFieldLink>
+      </fields>
+    </genericViewTemplate>
+  </children>
+</neonView>
diff --git a/process/Attribute_lib/process.js b/process/Attribute_lib/process.js
index e7007a1a0d6df39c40565250f87f9f2f603f8775..b3eee446c71250c1b804544796b8c70dea7852c4 100644
--- a/process/Attribute_lib/process.js
+++ b/process/Attribute_lib/process.js
@@ -23,10 +23,11 @@ function AttributeUtil () {}
  * @param {String} pObjectType the object type (= context)
  * @param {boolean} [pIncludeGroups=false]
  * @param {String[]} [pFilteredAttributeIds=[]] Whitleist of attribute ids
+ * @param {Object} [pAttributeCount=null] Object with attribute ids and their count
  * 
  * @return {String[]} array of attributeIds
  */
-AttributeUtil.getPossibleAttributes = function (pObjectType, pIncludeGroups, pFilteredAttributeIds)
+AttributeUtil.getPossibleAttributes = function (pObjectType, pIncludeGroups, pFilteredAttributeIds, pAttributeCount)
 {
     if (pObjectType == null)
         return [];
@@ -37,6 +38,18 @@ AttributeUtil.getPossibleAttributes = function (pObjectType, pIncludeGroups, pFi
         .andPrepare("AB_ATTRIBUTEUSAGE.OBJECT_TYPE", pObjectType)
         .andPrepare("AB_ATTRIBUTE.ATTRIBUTE_TYPE", $AttributeTypes.COMBOVALUE, "# <> ?")
         .and("ATTRIBUTE_ACTIVE = 1");
+    
+    if (pAttributeCount)
+    {
+        for (let attributeId in pAttributeCount)
+        {
+            attrCond.andSqlCondition(
+                SqlCondition.begin()
+                    .orPrepare("AB_ATTRIBUTEUSAGE.AB_ATTRIBUTE_ID", attributeId, "# != ?")
+                    .orPrepare("AB_ATTRIBUTEUSAGE.MAX_COUNT", pAttributeCount[attributeId], "# > ?")
+            );
+        }
+    }
         
     if (pFilteredAttributeIds != undefined && pFilteredAttributeIds.length > 0)
     {
@@ -320,6 +333,34 @@ AttributeRelationUtils.setAttribute = function ()
     //TODO: implement
 }
 
+/**
+ * adds rows for attributes with min_count > 0
+ * 
+ * @param {String} pObjectType the object type
+ * @param {String} pConsumer the name of the attribute relation consumer
+ */
+AttributeRelationUtils.presetMandatoryAttributes = function (pObjectType, pConsumer)
+{
+    var mandatoryAttributes = db.table(
+        SqlCondition.begin()
+            .andPrepare("AB_ATTRIBUTEUSAGE.OBJECT_TYPE", pObjectType)
+            .andPrepare("AB_ATTRIBUTE.ATTRIBUTE_TYPE", $AttributeTypes.COMBOVALUE, "# <> ?")
+            .andPrepare("AB_ATTRIBUTE.ATTRIBUTE_TYPE", $AttributeTypes.GROUP, "# <> ?")
+            .and("ATTRIBUTE_ACTIVE = 1")
+            .and("MIN_COUNT > 0")
+            .buildSql("select AB_ATTRIBUTE_ID, MIN_COUNT from AB_ATTRIBUTEUSAGE "
+                + "join AB_ATTRIBUTE on AB_ATTRIBUTE_ID = AB_ATTRIBUTEID")
+    );
+    mandatoryAttributes.forEach(function (usage)
+    {
+        //adding an attribute more than 20 times would be too much (having a min_count > 20 is very unlikely)
+        for (let i = 0; i < usage[1] && i < 20; i++)
+            neon.addRecord(null, pConsumer, {
+                "AB_ATTRIBUTE_ID" : usage[0]
+            });
+    });
+}
+
 /*********************************************************************************************************************/
 
 
diff --git a/process/Campaign_lib/Campaign_lib.aod b/process/Campaign_lib/Campaign_lib.aod
new file mode 100644
index 0000000000000000000000000000000000000000..6cff8443c7403caa3bbdc859ee356e248dc54018
--- /dev/null
+++ b/process/Campaign_lib/Campaign_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>Campaign_lib</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <process>%aditoprj%/process/Campaign_lib/process.js</process>
+  <variants>
+    <element>LIBRARY</element>
+  </variants>
+</process>
diff --git a/process/Campaign_lib/process.js b/process/Campaign_lib/process.js
new file mode 100644
index 0000000000000000000000000000000000000000..d4932b0cc7df8f6d96b58e5e6588382503ed4d85
--- /dev/null
+++ b/process/Campaign_lib/process.js
@@ -0,0 +1,243 @@
+import("system.logging");
+import("system.vars");
+import("system.db");
+import("system.neon");
+import("Sql_lib");
+import("Keyword_lib");
+import("KeywordRegistry_basic");
+
+/**
+ * Methods for campaignmanagement.
+ * Do not create an instance of this!
+ * 
+ * @class
+ */
+function CampaignUtils() {}
+
+/**
+ * Add one Contact (Person or Organistaion) to a Campaign
+ * 
+ * @param {String} pContactId req ContactId
+ */
+CampaignUtils.addParticipant = function(pContactId)
+{
+    _CampaignUtils._openAddParticipantContext("CampaignParticipant", pContactId, "ContactId_param", "CampaignParticipantEdit_view");
+}
+
+/**
+ * Add many Contacts (Person or Organistaion) to a Campaign
+ * 
+ * @param {String} pRowIds req ContactIds
+ */
+CampaignUtils.addParticipants = function(pRowIds)
+{
+    _CampaignUtils._openAddParticipantContext("CampaignAddParticipants", pRowIds, "campaignParticipants_param", "CampaignAddParticipantsEdit_view");
+}
+
+/**
+ * todo
+ */
+CampaignUtils.getCampaignNameById = function(pCampaignId)
+{
+    let selectQuery = "select CAMPAIGN.NAME from CAMPAIGN";
+    let conditionField = "CAMPAIGN.CAMPAIGNID";
+    let defaultValue = "";
+    
+    return _CampaignUtils._loadSingleValueFromDb(selectQuery, conditionField, pCampaignId, defaultValue);
+}
+
+/**
+ * todo
+ */
+CampaignUtils.getCampaignStepNameById = function(pCampaignStepId)
+{
+    let selectQuery = "select CAMPAIGNSTEP.NAME from CAMPAIGNSTEP";
+    let conditionField = "CAMPAIGNSTEP.CAMPAIGNSTEPID";
+    let defaultValue = "";
+    
+    return _CampaignUtils._loadSingleValueFromDb(selectQuery, conditionField, pCampaignStepId, defaultValue);
+}
+
+/**
+ * todo
+ */
+CampaignUtils.getParticipantCountForStep = function(pCampaignStepId)
+{
+    let selectQuery = "select count(*) from CAMPAIGNPARTICIPANT";
+    let conditionField = "CAMPAIGNPARTICIPANT.CAMPAIGNSTEP_ID";
+    let defaultValue = 0;
+    
+    return _CampaignUtils._loadSingleValueFromDb(selectQuery, conditionField, pCampaignStepId, defaultValue);
+}
+
+/**
+ * todo
+ */
+CampaignUtils.getParticipantCount = function(pCampaignId)
+{
+    let selectQuery = "select count(*) from CAMPAIGNPARTICIPANT";
+    let conditionField = "CAMPAIGNPARTICIPANT.CAMPAIGN_ID";
+    let defaultValue = 0;
+    
+    return _CampaignUtils._loadSingleValueFromDb(selectQuery, conditionField, pCampaignId, defaultValue);
+}
+
+/**
+ * todo
+ */
+CampaignUtils.getMaxParticipantCountForStep = function(pCampaignStepId)
+{
+    let selectQuery = "select MAXPARTICIPANTS from CAMPAIGNSTEP";
+    let conditionField = "CAMPAIGNSTEP.CAMPAIGNSTEPID";
+    let defaultValue = 0;
+    
+    return _CampaignUtils._loadSingleValueFromDb(selectQuery, conditionField, pCampaignStepId, defaultValue);
+}
+
+/**
+ * todo
+ */
+CampaignUtils.getStepCount = function(pCampaignId)
+{
+    let selectQuery = "select count(*) from CAMPAIGNSTEP";
+    let conditionField = "CAMPAIGNSTEP.CAMPAIGN_ID";
+    let defaultValue = 0;
+    
+    return _CampaignUtils._loadSingleValueFromDb(selectQuery, conditionField, pCampaignId, defaultValue);
+}
+
+/**
+ * todo
+ */
+CampaignUtils.getCampaignStatusByCampaignId = function(pCampaignId)
+{
+    let selectQuery = "select CAMPAIGN.STATE from CAMPAIGN";
+    let conditionField = "CAMPAIGN.CAMPAIGNID";
+    let defaultValue = "";
+    
+    let campaignState = $KeywordRegistry.campaignState();
+    let statusId = _CampaignUtils._loadSingleValueFromDb(selectQuery, conditionField, pCampaignId, defaultValue);
+    return KeywordUtils.getViewValue(campaignState, statusId);
+}
+
+/**
+ * todo
+ */
+CampaignUtils.createLogEntry = function(pCampaignId, pCampaignStepId, pContactId, pCampaignParticipantId)
+{
+    let colsCampaignParticipantLog = CampaignUtils.getParticipantLogInsertColumnNames();
+    
+    let valsCampaignParticipantLog = new Array(pCampaignId, pCampaignStepId, pContactId, pCampaignParticipantId, vars.get("$sys.user"), vars.get("$sys.date"));
+    
+    let rows = db.insertData("CAMPAIGNPARTICIPANTLOG", colsCampaignParticipantLog, null, valsCampaignParticipantLog);
+    return (rows == 1);
+}
+
+/**
+ * todo
+ */
+CampaignUtils.getParticipantLogInsertColumnNames = function()
+{
+    return ["CAMPAIGNPARTICIPANT_ID", "CAMPAIGN_ID", "CAMPAIGNSTEP_ID", "CAMPAIGNPARTICIPANTLOGID", "USER_NEW", "DATE_NEW"];
+}
+
+/**
+ * todo
+ */
+CampaignUtils.openSetCampaignStepView = function(pParticipantIds, pCampaignId, pCampaignStepId)
+{
+    var params = {};
+    
+    params["campaignParticipants_param"] = pParticipantIds;
+    params["currentCampaignId_param"] = pCampaignId;
+    params["currentCampaignStepId_param"] = pCampaignStepId;
+    params["isUpdate_param"] = true;
+    
+    
+
+    neon.openContext("CampaignAddParticipants", "CampaignAddParticipantsEdit_view", null, neon.OPERATINGSTATE_NEW, params);
+}
+
+/**
+ * todo
+ */
+CampaignUtils.getDefaultCampaignStep = function(pCampaignId)
+{
+    let selectQuery = "select CAMPAIGNSTEPID from CAMPAIGNSTEP " +
+                      "where CAMPAIGNSTEP.CAMPAIGN_ID = '" + pCampaignId + "' " +
+                      "order by CAMPAIGNSTEP.SORTING asc " +
+                      "fetch first 1 rows only";
+    
+    
+    return db.cell(selectQuery)   
+}
+
+/**
+ * todo
+ */
+CampaignUtils.getCampaignStartDate = function(pCapmaignId)
+{
+    var campaignIdCondition = SqlCondition.begin()
+                                         .andPrepare("CAMPAIGNSTEP.CAMPAIGN_ID", pCapmaignId);
+    // TODO: Fetch first 1 rows only will not work with all dbms! Maybe just remove it, because db.cell always uses only the first row
+    return db.cell(campaignIdCondition.buildSql("SELECT DATE_START, SORTING FROM ADITO.CAMPAIGNSTEP", "1=2", "order by SORTING ASC FETCH FIRST 1 ROWS ONLY"));
+}
+
+/**
+ * todo
+ */
+CampaignUtils.getCampaignEndDate = function(pCapmaignId)
+{
+    var campaignIdCondition = SqlCondition.begin()
+                                         .andPrepare("CAMPAIGNSTEP.CAMPAIGN_ID", pCapmaignId);
+
+    // TODO: Fetch first 1 rows only will not work with all dbms! Maybe just remove it, because db.cell always uses only the first row
+    return db.cell(campaignIdCondition.buildSql("SELECT DATE_END, SORTING FROM CAMPAIGNSTEP", "1=2", "order by SORTING ASC FETCH FIRST 1 ROWS ONLY"));
+}
+
+/**
+ * Methods for campaignmanagement.
+ * Do not create an instance of this!
+ * 
+ * @ignore
+ * @class
+ */
+function _CampaignUtils() {}
+
+/**
+ * Open EditView to Add Participants to a Campaignstep
+ * 
+ * @param {String} pContext req name of the context
+ * @param {String} pRowIds req Contact-Ids
+ * @param {String} pEntityParam req parameter for the entity (CAMPAIGNSTEP)
+ * @param {String} pView req targeting view
+ * 
+ */
+_CampaignUtils._openAddParticipantContext = function(pContext, pRowIds, pEntityParam, pView)
+{
+    var params = {};
+    
+    if (pRowIds)
+    {
+        params[pEntityParam] = pRowIds;
+    }
+    params["isUpdate_param"] = false;
+    
+    logging.log("pRowsIds" + pRowIds);
+    neon.openContext(pContext, null, null, neon.OPERATINGSTATE_NEW, params);
+}
+
+/**
+ * todo
+ */
+_CampaignUtils._loadSingleValueFromDb = function(pSelectQuery, pConditionField, pConditionValue, pDefaultValue)
+{
+    let res = pDefaultValue;
+    if (pConditionValue)
+    {
+        res = db.cell(SqlCondition.begin()
+                                  .andPrepare(pConditionField, pConditionValue)
+                                  .buildSql(pSelectQuery));
+    }
+    return res;
+}
\ No newline at end of file
diff --git a/process/Context_lib/process.js b/process/Context_lib/process.js
index ee1242dde2f44628e793fdf78919a49c5a1b9e69..238aa4b1ac561df18d93ace719f7216624672b3d 100644
--- a/process/Context_lib/process.js
+++ b/process/Context_lib/process.js
@@ -26,6 +26,21 @@ ContextUtils.getCurrentContextId = function()
     return vars.getString("$sys.currentcontextname");
 }
 
+/**
+ * Get the title of the current context
+ * Note: The variable contexttitle is not always available.
+ * In this case this function returns ""
+ * 
+ * @return {String} Title of the current context
+ */
+ContextUtils.getCurrentContextTitle = function()
+{
+    if (vars.exists("$sys.currentcontexttitle") && vars.get("$sys.currentcontexttitle"))
+        return vars.get("$sys.currentcontexttitle");
+
+    return "";
+}
+
 /**
  * TODO: use System function. Currently the Name is also the id.
  * Returns the Name of a context by the Id
@@ -39,6 +54,34 @@ ContextUtils.getContextName = function(pContextId)
     return pContextId;
 }
 
+/**
+ * Returns the Name of the correct Consumer or null
+ *
+ * @param {String} pContextId the id of a context
+ * @return {String|null} Name of the correct Consumer
+ */
+ContextUtils.getContextConsumer = function(pContextId)
+{
+    // TODO: is there a better solution without a swiutch case? maybe metadata of context / entity
+    switch(pContextId)
+    {
+        case ContextUtils.getContextName("Organisation"):
+            return "Organisations";
+        case ContextUtils.getContextName("Person"):
+            return "Persons";
+        case ContextUtils.getContextName("Offer"):
+            return "Offers";
+        case ContextUtils.getContextName("Order"):
+            return "Orders";
+        case ContextUtils.getContextName("Product"):
+            return "Products";
+        case ContextUtils.getContextName("Contract"):
+            return "Contracts";
+        case ContextUtils.getContextName("Salesproject"):
+            return "Salesprojects";
+    }
+}
+
 /**
  *
  * @param {Boolean} [pFilter=false] filter only for contexts which have a mapping in ContextUtils.getSelectMap 
@@ -100,6 +143,21 @@ ContextUtils.getContext = function(pContextId)
     return ContextUtils._contextDataMapping(project.getDataModel(project.DATAMODEL_KIND_CONTEXT, pContextId));
 }
 
+/**
+ * Prefix the given title with the current context title. (only if the title is available)
+ * @param {String} pTitle
+ * 
+ * @return {String} e.g.: Kontakt - Herr Tim Admin
+ */
+ContextUtils.prefixWithCurrentContextTitle = function(pTitle)
+{
+    var titlePrefix = ContextUtils.getCurrentContextTitle();
+    if (titlePrefix)
+        return titlePrefix + " - " + pTitle;
+    
+    return pTitle;
+}
+
 /**
  * map the contextData from the system.project-lib to [contextId, contextName, contextTitle]
  *
@@ -348,6 +406,19 @@ ContextUtils.getSelectMap  = function()
                                             "PRODUCTNAME"
                                             ], "", false))
             ,"Task": ContextSelector.create("TASK", "TASKID", "SUBJECT")
+            ,"Campaign": ContextSelector.create("CAMPAIGN", "CAMPAIGNID")
+                         .setTitleExpression(maskingUtils.concat([
+                                                maskingUtils.cast("CAMPAIGN.NAME", SQLTYPES.VARCHAR, 10),
+                                                "' - '",
+                                                maskingUtils.cast("CAMPAIGNSTEP.NAME", SQLTYPES.VARCHAR, 10)
+                                            ], "", false))
+                         .setContactIdField("CAMPAIGNPARTICIPANT.CONTACT_ID")
+                         .setJoinExpression("join CAMPAIGNPARTICIPANT on CAMPAIGNPARTICIPANT.CAMPAIGN_ID = CAMPAIGN.CAMPAIGNID " +
+                                            "join CAMPAIGNSTEP on CAMPAIGNSTEP.CAMPAIGNSTEPID = CAMPAIGNPARTICIPANT.CAMPAIGNSTEP_ID")
+                        .setCreationDateField("CAMPAIGNSTEP.DATE_START")
+                        .setStateField("CAMPAIGN.STATE")
+                        .setActiveStates(["e04c9c59-0590-463c-a10e-e25c583e9cf2", "42e1ee2b-0108-4ccf-ab43-29cbcb0377bf"])
+
     }
 }
 
diff --git a/process/JditoFilter_lib/process.js b/process/JditoFilter_lib/process.js
index b4a2be8f420efa8a9453ca8c26f966381000601d..a0da9e16d8b3052b947bcbb21acf868ad85e345b 100644
--- a/process/JditoFilter_lib/process.js
+++ b/process/JditoFilter_lib/process.js
@@ -117,6 +117,7 @@ JditoFilterUtils.filterRecords = function (pColumns, pRecords, pFilter)
  * 
  * @param {String|Object} pFilter the filter as JSON
  * @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
  *      
@@ -129,7 +130,7 @@ JditoFilterUtils.filterRecords = function (pColumns, pRecords, pFilter)
  *      
  * @return {SqlCondition} the SqlCondition object
  */
-JditoFilterUtils.getSqlCondition = function (pFilter, pTable, pColumnMap)
+JditoFilterUtils.getSqlCondition = function (pFilter, pTable, pTableAlias, pColumnMap)
 {
     var condition = new SqlCondition();
     
@@ -152,8 +153,10 @@ JditoFilterUtils.getSqlCondition = function (pFilter, pTable, pColumnMap)
         {
             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.name = pTable + "." + pCondition.name;
             
             pCondition.value = (pCondition.key || pCondition.value);
             var condition = _getCondition.call(pCondition);
diff --git a/process/KeywordRegistry_basic/process.js b/process/KeywordRegistry_basic/process.js
index a810b588164c4d91a4ab38a32840fe265f8f6548..fbd894dc51ef3bdcfcc76fdf132aa0d7d62d8877 100644
--- a/process/KeywordRegistry_basic/process.js
+++ b/process/KeywordRegistry_basic/process.js
@@ -77,4 +77,8 @@ $KeywordRegistry.paymentTerm = function(){return "PaymentTerm";};
 $KeywordRegistry.contactDepartment = function(){return "ContactDepartment";};
 $KeywordRegistry.contactPosition = function(){return "ContactPosition";};
 $KeywordRegistry.contactContactrole = function(){return "ContactContactrole";};
-
+$KeywordRegistry.campaignState = function(){return "CampaignManagementStates";};
+$KeywordRegistry.campaignState$planning = function(){return "e04c9c59-0590-463c-a10e-e25c583e9cf2";};
+$KeywordRegistry.campaignStepState = function(){return "CampaignManagementStepStates";};
+$KeywordRegistry.campaignStepState$open = function(){return "bbf69673-2ec6-46f8-b231-684a31be9fbd";};
+$KeywordRegistry.campaignStepCostCategory = function(){return "CampaignManagementCostCategory";};
diff --git a/process/StandardObject_lib/process.js b/process/StandardObject_lib/process.js
index 11ad559a925e55d2baa3d5b2c3216b4d30751130..70e8e5c56abe2ef40cd9644ff1668f5cf3524df8 100644
--- a/process/StandardObject_lib/process.js
+++ b/process/StandardObject_lib/process.js
@@ -185,8 +185,8 @@ StandardObject.prototype.onCommunicationUpdate = function (pMediumID) {
  * address it will return `true`, otherwise `false`. This function asserts that
  * it's currently working on a `Address` object.
  * 
- * @param pContactID Contact ID to check.
- * @return If the contact ID has standard address.
+ * @param {String} pContactID Contact ID to check.
+ * @return {Boolean} If the contact ID has standard address.
  */
 StandardObject.prototype._hasContactStandardAddress = function (pContactID) {
     this._assertObjectType(StandardObject.CONST_OBJECT_ADDRESS());
@@ -201,8 +201,8 @@ StandardObject.prototype._hasContactStandardAddress = function (pContactID) {
  * Will set the given address ID on the given contact ID. This function asserts
  * that it's currently working on an `Address` object.
  * 
- * @param pAddressID New address ID to set on the contact.
- * @param pContactID The contact ID to set the address ID on. 
+ * @param {String} pAddressID New address ID to set on the contact.
+ * @param {String} pContactID The contact ID to set the address ID on. 
  */
 StandardObject.prototype._setContactStandardAddress = function (pAddressID, pContactID) {
     // Assert.
@@ -237,8 +237,8 @@ StandardObject.prototype._getCompanyStandardAddress = function (pOrganisationID)
  * Checks if the given contact ID already has a standard set with the given medium
  * category.
  * 
- * @param pContactID {String} Contact ID to check.
- * @param pMediumCategory {String} Medium category to check.
+ * @param {String} pContactID Contact ID to check.
+ * @param {String} pMediumCategory Medium category to check.
  * @return {Boolean} If the contact already has a standard addres with the given
  * medium category.
  */
@@ -254,7 +254,7 @@ StandardObject.prototype._hasStandardCommunicationByMedium = function (pContactI
 /**
  * Resolves the given pMediumID with the category.
  * 
- * @param pMediumID {String} ID of the medium to resolve.
+ * @param {String} pMediumID ID of the medium to resolve.
  * @return {String} Resovled category.
  */
 StandardObject.prototype._getMediumCategory = function (pMediumID) {
@@ -267,8 +267,8 @@ StandardObject.prototype._getMediumCategory = function (pMediumID) {
  * Will set the given communication ID as standard. (Will update the `STANDARD`
  * column.)
  * 
- * @param pCommunicationID {String} The communication ID to set as standard.
- * @param pValue {Number} 0 or 1 (boolean)
+ * @param {String} pCommunicationID The communication ID to set as standard.
+ * @param {Number} pValue 0 or 1 (boolean)
  */
 StandardObject.prototype._setStandardCommunication = function (pCommunicationID, pValue) {
     // Assert.
@@ -286,7 +286,7 @@ StandardObject.prototype._setStandardCommunication = function (pCommunicationID,
 /**
  * Will return the Contact ID by the given communication ID.
  * 
- * @param pCommunicationID {String} Communication ID to get the contact ID for.
+ * @param {String} pCommunicationID to get the contact ID for.
  * @return The contact ID.
  */
 StandardObject.prototype._getContactIdByCommunication = function (pCommunicationID) {
@@ -294,12 +294,22 @@ StandardObject.prototype._getContactIdByCommunication = function (pCommunication
 }
 
 StandardObject.prototype._isOrganisationAddress = function (pAddressID) {
+    return StandardObject.isOrganisationAddress(pAddressID);
+}
+
+/**
+ * Check if the address is a organisation address.
+ * 
+ * @param {String} pAddressID Communication ID to get the contact ID for.
+ * @return The contact ID.
+ */
+StandardObject.isOrganisationAddress = function (pAddressID) {
     var contactID = db.cell("select CONTACTID from CONTACT where ADDRESS_ID = '" + pAddressID + "'");
     
-    if (contactID === "")
+    if (!contactID)
         return false;
     
     var contactType = ContactUtils.getContactTypeByContactId(contactID);
     
-    return contactType === 1;
+    return contactType == 1;
 }
\ No newline at end of file
diff --git a/process/_test_clientProcess/_test_clientProcess.aod b/process/_test_clientProcess/_test_clientProcess.aod
index fed7f21f22aef10ea93a966bab6cf4f06973d949..f5019c9b8cf2a4ef9af8a2011d967f9f8bf3e421 100644
--- a/process/_test_clientProcess/_test_clientProcess.aod
+++ b/process/_test_clientProcess/_test_clientProcess.aod
@@ -3,6 +3,7 @@
   <name>_test_clientProcess</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <process>%aditoprj%/process/_test_clientProcess/process.js</process>
+  <publishAsWebservice v="true" />
   <alias>Data_alias</alias>
   <variants>
     <element>EXECUTABLE</element>