diff --git a/.liquibase/Data_alias/basic/2019.2/addDefaultAddresses.xml b/.liquibase/Data_alias/basic/2019.2/addDefaultAddresses.xml
new file mode 100644
index 0000000000000000000000000000000000000000..53c2858677b011f511d70426a00f473448665451
--- /dev/null
+++ b/.liquibase/Data_alias/basic/2019.2/addDefaultAddresses.xml
@@ -0,0 +1,274 @@
+<?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="58c94c79-1c82-43b3-bd19-324955d4cbfb">
+        <!--Lisa Sommer-->
+        <update tableName="CONTACT">
+            <column name="ADDRESS_ID" value="11d01332-985b-4efe-a634-da71ae482907"/>
+            <where>CONTACTID = ? and ADDRESS_ID is null</where>
+            <whereParams>
+                <param value="ef345d11-a40d-59e0-a24c-afcb6095d2cb" />
+            </whereParams>
+        </update>
+        
+        <!--MNF-->
+        <insert tableName="ADDRESS">
+            <column name="STATE" value="Bayern"/>
+            <column name="ADDR_TYPE" value="b3292432-bca2-4674-8b06-b78b2b06351e"/>
+            <column name="CITY" value="München"/>
+            <column name="COUNTRY" value="DE"/>
+            <column name="CONTACT_ID" value="e6da1393-f46b-41a4-826b-2c7d22de2246"/>
+            <column name="ADDRIDENTIFIER" value="Tor 1"/>
+            <column name="REGION" value=""/>
+            <column name="ADDRESSID" value="6a3f6232-7a66-4a72-8d2d-66a3a9f1b9ea"/>
+            <column name="BUILDINGNO" value="3"/>
+            <column name="ADDRESSADDITION"/>
+            <column name="ZIP" value="80807"/>
+            <column name="ADDRESS" value="Muster-Straße"/>
+            <column name="DISTRICT" value="Oberbayern"/>
+            <column name="USER_NEW" value="Admin"/>
+            <column name="DATE_NEW" valueComputed="current_datetime"/>
+        </insert>
+        <update tableName="CONTACT">
+            <column name="ADDRESS_ID" value="6a3f6232-7a66-4a72-8d2d-66a3a9f1b9ea"/>
+            <where>CONTACTID = ? and ADDRESS_ID is null</where>
+            <whereParams>
+                <param value="e6da1393-f46b-41a4-826b-2c7d22de2246" />
+            </whereParams>
+        </update>
+        
+        <!--Lichtenstein-->
+        <insert tableName="ADDRESS">
+            <column name="STATE" value="Bayern"/>
+            <column name="ADDR_TYPE" value="b3292432-bca2-4674-8b06-b78b2b06351e"/>
+            <column name="CITY" value="München"/>
+            <column name="COUNTRY" value="DE"/>
+            <column name="CONTACT_ID" value="e83c45e0-c30b-436e-b445-00a8b58383b0"/>
+            <column name="ADDRIDENTIFIER" value="Tor 1"/>
+            <column name="REGION" value=""/>
+            <column name="ADDRESSID" value="f54606ee-ecdd-4859-ad7d-aa096c5e9596"/>
+            <column name="BUILDINGNO" value="35"/>
+            <column name="ADDRESSADDITION"/>
+            <column name="ZIP" value="80807"/>
+            <column name="ADDRESS" value="Lützowplatz"/>
+            <column name="DISTRICT" value="Oberbayern"/>
+            <column name="USER_NEW" value="Admin"/>
+            <column name="DATE_NEW" valueComputed="current_datetime"/>
+        </insert>
+        <update tableName="CONTACT">
+            <column name="ADDRESS_ID" value="f54606ee-ecdd-4859-ad7d-aa096c5e9596"/>
+            <where>CONTACTID = ? and ADDRESS_ID is null</where>
+            <whereParams>
+                <param value="e83c45e0-c30b-436e-b445-00a8b58383b0" />
+            </whereParams>
+        </update>
+        
+        <!--International Kältetechnik AG-->
+        <insert tableName="ADDRESS">
+            <column name="STATE" value="Bayern"/>
+            <column name="ADDR_TYPE" value="b3292432-bca2-4674-8b06-b78b2b06351e"/>
+            <column name="CITY" value="München"/>
+            <column name="COUNTRY" value="DE"/>
+            <column name="CONTACT_ID" value="eda61ea6-35ed-4a92-a93c-6118fc67d533"/>
+            <column name="ADDRIDENTIFIER" value="Tor 1"/>
+            <column name="REGION" value=""/>
+            <column name="ADDRESSID" value="92a244c5-6065-458c-abc7-57d0dc955011"/>
+            <column name="BUILDINGNO" value="48"/>
+            <column name="ADDRESSADDITION"/>
+            <column name="ZIP" value="63847"/>
+            <column name="ADDRESS" value="Hildburghausen"/>
+            <column name="DISTRICT" value="Oberbayern"/>
+            <column name="USER_NEW" value="Admin"/>
+            <column name="DATE_NEW" valueComputed="current_datetime"/>
+        </insert>
+        <update tableName="CONTACT">
+            <column name="ADDRESS_ID" value="92a244c5-6065-458c-abc7-57d0dc955011"/>
+            <where>CONTACTID = ? and ADDRESS_ID is null</where>
+            <whereParams>
+                <param value="e83c45e0-c30b-436e-b445-00a8b58383b0" />
+            </whereParams>
+        </update>
+        
+        <!--Pichelmaier Financial AG-->
+        <insert tableName="ADDRESS">
+            <column name="STATE" value="Bayern"/>
+            <column name="ADDR_TYPE" value="b3292432-bca2-4674-8b06-b78b2b06351e"/>
+            <column name="CITY" value="München"/>
+            <column name="COUNTRY" value="DE"/>
+            <column name="CONTACT_ID" value="fd082db5-be43-4219-a705-588f9c06e59b"/>
+            <column name="ADDRIDENTIFIER" value="Tor 1"/>
+            <column name="REGION" value=""/>
+            <column name="ADDRESSID" value="90726b19-f23c-42dd-847a-7eacf4c71d18"/>
+            <column name="BUILDINGNO" value="6"/>
+            <column name="ADDRESSADDITION"/>
+            <column name="ZIP" value="54595"/>
+            <column name="ADDRESS" value="Rudower Strasse"/>
+            <column name="DISTRICT" value="Oberbayern"/>
+            <column name="USER_NEW" value="Admin"/>
+            <column name="DATE_NEW" valueComputed="current_datetime"/>
+        </insert>
+        <update tableName="CONTACT">
+            <column name="ADDRESS_ID" value="90726b19-f23c-42dd-847a-7eacf4c71d18"/>
+            <where>CONTACTID = ? and ADDRESS_ID is null</where>
+            <whereParams>
+                <param value="fd082db5-be43-4219-a705-588f9c06e59b" />
+            </whereParams>
+        </update>
+        
+        <!--Peter Pfiffig-->
+        <update tableName="CONTACT">
+            <column name="ADDRESS_ID" value="14d01332-985b-4efe-a634-da71ae482907"/>
+            <where>CONTACTID = ? and ADDRESS_ID is null</where>
+            <whereParams>
+                <param value="a2e084e2-d68a-4f1e-a1bb-f8d46ad6293d" />
+            </whereParams>
+        </update>
+        
+        <!--Franz Müller-->
+        <insert tableName="ADDRESS">
+            <column name="STATE" value="Bayern"/>
+            <column name="ADDR_TYPE" value="a7466ee5-3fba-40bf-93cf-aa20a2b32ad6"/>
+            <column name="CITY" value="Bergkirchen"/>
+            <column name="COUNTRY" value="DE"/>
+            <column name="CONTACT_ID" value="f0fb7676-8183-4bc7-beca-ca32c1e11c10"/>
+            <column name="ADDRIDENTIFIER"/>
+            <column name="REGION" value=""/>
+            <column name="ADDRESSID" value="5773392d-cc7a-4170-8ffe-867807634c3c"/>
+            <column name="BUILDINGNO" value="32"/>
+            <column name="ADDRESSADDITION"/>
+            <column name="ZIP" value="85230"/>
+            <column name="ADDRESS" value="Büsingstrasse"/>
+            <column name="DISTRICT" value="Oberbayern"/>
+            <column name="USER_NEW" value="Admin"/>
+            <column name="DATE_NEW" valueComputed="current_datetime"/>
+        </insert>
+        <update tableName="CONTACT">
+            <column name="ADDRESS_ID" value="5773392d-cc7a-4170-8ffe-867807634c3c"/>
+            <where>CONTACTID = ? and ADDRESS_ID is null</where>
+            <whereParams>
+                <param value="f0fb7676-8183-4bc7-beca-ca32c1e11c10" />
+            </whereParams>
+        </update>
+        
+        <!--Birgit Leicht-->
+        <update tableName="CONTACT">
+            <column name="ADDRESS_ID" value="ce990566-3b86-48fe-bd0c-1167142e584b"/>
+            <where>CONTACTID = ? and ADDRESS_ID is null</where>
+            <whereParams>
+                <param value="d5a2dc64-e503-4aed-a0c6-d54f49b8db87" />
+            </whereParams>
+        </update>
+        
+        <!--Ludwig Kanzler-->
+        <insert tableName="ADDRESS">
+            <column name="STATE" value="Bayern"/>
+            <column name="ADDR_TYPE" value="a7466ee5-3fba-40bf-93cf-aa20a2b32ad6"/>
+            <column name="CITY" value="München"/>
+            <column name="COUNTRY" value="DE"/>
+            <column name="CONTACT_ID" value="73d731a2-e7f5-11e8-9f32-f2801f1b9fd1"/>
+            <column name="ADDRIDENTIFIER"/>
+            <column name="REGION" value=""/>
+            <column name="ADDRESSID" value="8f6da43d-adc5-410e-8bc5-14adca88ebfe"/>
+            <column name="BUILDINGNO" value="83"/>
+            <column name="ADDRESSADDITION"/>
+            <column name="ZIP" value="80456"/>
+            <column name="ADDRESS" value="Landsberger Allee"/>
+            <column name="DISTRICT" value="Oberbayern"/>
+            <column name="USER_NEW" value="Admin"/>
+            <column name="DATE_NEW" valueComputed="current_datetime"/>
+        </insert>
+        <update tableName="CONTACT">
+            <column name="ADDRESS_ID" value="8f6da43d-adc5-410e-8bc5-14adca88ebfe"/>
+            <where>CONTACTID = ? and ADDRESS_ID is null</where>
+            <whereParams>
+                <param value="73d731a2-e7f5-11e8-9f32-f2801f1b9fd1" />
+            </whereParams>
+        </update>
+        
+        <!--Jerome Grüner-->
+        <insert tableName="ADDRESS">
+            <column name="STATE" value="Bayern"/>
+            <column name="ADDR_TYPE" value="a7466ee5-3fba-40bf-93cf-aa20a2b32ad6"/>
+            <column name="CITY" value="Niederkirchen"/>
+            <column name="COUNTRY" value="DE"/>
+            <column name="CONTACT_ID" value="73d73404-e7f5-11e8-9f32-f2801f1b9fd1"/>
+            <column name="ADDRIDENTIFIER"/>
+            <column name="REGION" value=""/>
+            <column name="ADDRESSID" value="84e040be-5a5f-48e7-be2c-769d4a169390"/>
+            <column name="BUILDINGNO" value="48"/>
+            <column name="ADDRESSADDITION"/>
+            <column name="ZIP" value="67700"/>
+            <column name="ADDRESS" value="Grosse Praesidenten Str."/>
+            <column name="DISTRICT" value="Oberbayern"/>
+            <column name="USER_NEW" value="Admin"/>
+            <column name="DATE_NEW" valueComputed="current_datetime"/>
+        </insert>
+        <update tableName="CONTACT">
+            <column name="ADDRESS_ID" value="84e040be-5a5f-48e7-be2c-769d4a169390"/>
+            <where>CONTACTID = ? and ADDRESS_ID is null</where>
+            <whereParams>
+                <param value="73d73404-e7f5-11e8-9f32-f2801f1b9fd1" />
+            </whereParams>
+        </update>
+        
+        <!--Herbert Obermeier-->
+        <insert tableName="ADDRESS">
+            <column name="STATE" value="Bayern"/>
+            <column name="ADDR_TYPE" value="a7466ee5-3fba-40bf-93cf-aa20a2b32ad6"/>
+            <column name="CITY" value="Bielefeld Babenhausen"/>
+            <column name="COUNTRY" value="DE"/>
+            <column name="CONTACT_ID" value="57d524f6-ad66-4550-be83-fee6e31b7a52"/>
+            <column name="ADDRIDENTIFIER"/>
+            <column name="REGION" value=""/>
+            <column name="ADDRESSID" value="f00966ec-693b-4bb5-8c66-26a40f18394f"/>
+            <column name="BUILDINGNO" value="67"/>
+            <column name="ADDRESSADDITION"/>
+            <column name="ZIP" value="33739"/>
+            <column name="ADDRESS" value="Spresstrasse"/>
+            <column name="DISTRICT" value="Oberbayern"/>
+            <column name="USER_NEW" value="Admin"/>
+            <column name="DATE_NEW" valueComputed="current_datetime"/>
+        </insert>
+        <update tableName="CONTACT">
+            <column name="ADDRESS_ID" value="f00966ec-693b-4bb5-8c66-26a40f18394f"/>
+            <where>CONTACTID = ? and ADDRESS_ID is null</where>
+            <whereParams>
+                <param value="57d524f6-ad66-4550-be83-fee6e31b7a52" />
+            </whereParams>
+        </update>
+        
+        <!--Harold Smith-->
+        <insert tableName="ADDRESS">
+            <column name="STATE" value="Mecklenburg-Vorpommern"/>
+            <column name="ADDR_TYPE" value="a7466ee5-3fba-40bf-93cf-aa20a2b32ad6"/>
+            <column name="CITY" value="Rostock"/>
+            <column name="COUNTRY" value="DE"/>
+            <column name="CONTACT_ID" value="d105f7f4-afd1-4a98-adc2-13fd6934b7e9"/>
+            <column name="ADDRIDENTIFIER"/>
+            <column name="REGION" value=""/>
+            <column name="ADDRESSID" value="85bc81b9-5553-42a8-a643-eb47e1ed3c42"/>
+            <column name="BUILDINGNO" value="95"/>
+            <column name="ADDRESSADDITION"/>
+            <column name="ZIP" value="18074"/>
+            <column name="ADDRESS" value="Kurfürstendamm"/>
+            <column name="DISTRICT" value="Mecklenburg-Vorpommern"/>
+            <column name="USER_NEW" value="Admin"/>
+            <column name="DATE_NEW" valueComputed="current_datetime"/>
+        </insert>
+        <update tableName="CONTACT">
+            <column name="ADDRESS_ID" value="85bc81b9-5553-42a8-a643-eb47e1ed3c42"/>
+            <where>CONTACTID = ? and ADDRESS_ID is null</where>
+            <whereParams>
+                <param value="d105f7f4-afd1-4a98-adc2-13fd6934b7e9" />
+            </whereParams>
+        </update>
+        
+        <!--Susanne Lustig-->
+        <update tableName="CONTACT">
+            <column name="ADDRESS_ID" value="89cbad0e-9901-42e2-ae40-a5a20c7ed5c8"/>
+            <where>CONTACTID = ? and ADDRESS_ID is null</where>
+            <whereParams>
+                <param value="1a67eaa7-21da-4a18-97ab-755ac5cb74f7" />
+            </whereParams>
+        </update>
+    </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_Derby.xml
new file mode 100644
index 0000000000000000000000000000000000000000..fa2c3652ee188650237957106649b056346a3c5c
--- /dev/null
+++ b/.liquibase/Data_alias/basic/2019.2/change_Milestone_datatype_to_new_Keyword_logic_Derby.xml
@@ -0,0 +1,16 @@
+<?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="be098ba0-30ed-4e01-893e-928b1ac86923">
+        <sql>
+            ALTER TABLE SALESPROJECT_MILESTONE ADD COLUMN TYPE_NEW VARCHAR(80);
+            UPDATE SALESPROJECT_MILESTONE SET TYPE_NEW=CHAR(TYPE);
+            ALTER TABLE SALESPROJECT_MILESTONE DROP COLUMN TYPE;
+            RENAME COLUMN SALESPROJECT_MILESTONE.TYPE_NEW TO TYPE;
+            
+            ALTER TABLE SALESPROJECT_MILESTONE ADD COLUMN VALUE_NEW CHAR(36);
+            UPDATE SALESPROJECT_MILESTONE SET VALUE_NEW=CHAR(VALUE);
+            ALTER TABLE SALESPROJECT_MILESTONE DROP COLUMN VALUE;
+            RENAME COLUMN SALESPROJECT_MILESTONE.VALUE_NEW TO VALUE;
+        </sql>
+    </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
new file mode 100644
index 0000000000000000000000000000000000000000..41fdab8d76669d6e338ccad579c2745d9f1efb61
--- /dev/null
+++ b/.liquibase/Data_alias/basic/2019.2/change_Milestone_datatype_to_new_Keyword_logic_notDerby.xml
@@ -0,0 +1,7 @@
+<?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 6f93491024becfd2f83b731b29f4e47794fd1782..c018844e469ed9c0fe96763cab6b8372a568feee 100644
--- a/.liquibase/Data_alias/basic/2019.2/changelog.xml
+++ b/.liquibase/Data_alias/basic/2019.2/changelog.xml
@@ -136,6 +136,16 @@
     <!-- Derby needs special handling -->
     <include relativeToChangelogFile="true" file="alter_activityLink_notDerby.xml" />
     <include relativeToChangelogFile="true" file="alter_activityLink_Derby.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="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="AditoBasic/create_ab_loghistory.xml"/>
+    
 </databaseChangeLog>
diff --git a/.liquibase/Data_alias/basic/2019.2/data/example_person/PERSON_admin.xml b/.liquibase/Data_alias/basic/2019.2/data/example_person/PERSON_admin.xml
new file mode 100644
index 0000000000000000000000000000000000000000..0c15468561e1105847a568f7e64803487f37cbeb
--- /dev/null
+++ b/.liquibase/Data_alias/basic/2019.2/data/example_person/PERSON_admin.xml
@@ -0,0 +1,78 @@
+<?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="d750c022-e34c-4903-8146-bd89121c0214">
+    <insert tableName="PERSON">
+        <column name="PERSONID" value="b16282bd-254e-4569-a56e-675449821467"/>
+        <column name="FIRSTNAME" value="Tim"/>
+        <column name="MIDDLENAME"/>
+        <column name="LASTNAME" value="Admin"/>
+        <column name="SALUTATION" value="Herr"/>
+        <column name="DATEOFBIRTH" valueDate="1993-05-07"/>
+        <column name="USER_NEW" value="Admin"/>
+        <column name="DATE_NEW" valueComputed="current_datetime"/>
+    </insert>
+    <insert tableName="CONTACT">
+        <column name="RELATIONSHIP" valueNumeric="1"/>
+        <column name="LANGUAGE" value="deu"/>
+        <column name="PERSON_ID" value="b16282bd-254e-4569-a56e-675449821467"/>
+        <column name="CONTACTID" value="c7ddf982-0e58-4152-b82b-8f5673b0b729"/>
+        <column name="ORGANISATION_ID" value="b219b58a-f120-42d8-9a64-0b176501eac7"/>
+        <column name="STATUS" value="BSIC0rel-stat-actv-ae03-b6b04430e90b"/>
+        <column name="ADDRESS_ID" value="0e6d2504-adda-453a-bb36-981e6d0f06c7"/>
+        <column name="USER_NEW" value="Admin"/>
+        <column name="DATE_NEW" valueComputed="current_datetime"/>
+    </insert>
+    <insert tableName="ADDRESS">
+        <column name="STATE" value="Freistaat Bayern"/>
+        <column name="ADDR_TYPE" value="a7466ee5-3fba-40bf-93cf-aa20a2b32ad6"/>
+        <column name="CITY" value="Heinrichsthal"/>
+        <column name="COUNTRY" value="DE"/>
+        <column name="CONTACT_ID" value="c7ddf982-0e58-4152-b82b-8f5673b0b729"/>
+        <column name="ADDRIDENTIFIER"/>
+        <column name="REGION" value=""/>
+        <column name="ADDRESSID" value="0e6d2504-adda-453a-bb36-981e6d0f06c7"/>
+        <column name="BUILDINGNO" value="77"/>
+        <column name="ADDRESSADDITION"/>
+        <column name="ZIP" value="18074"/>
+        <column name="ADDRESS" value="Rudolstaedter Strasse"/>
+        <column name="DISTRICT" value="Bayern"/>
+        <column name="USER_NEW" value="Admin"/>
+        <column name="DATE_NEW" valueComputed="current_datetime"/>
+    </insert>
+    <insert tableName="COMMUNICATION">
+        <column name="COMMUNICATIONID" value="3ccc54d5-dfb0-4da9-a0a0-472025f65994"/>
+        <column name="CONTACT_ID" value="c7ddf982-0e58-4152-b82b-8f5673b0b729"/>
+        <column name="MEDIUM_ID" value="85ee16dd-c878-4463-be6a-324c25e76764"/>
+        <column name="ADDR" value="Admin@domain.local"/>
+        <column name="STANDARD" valueNumeric="1"/>
+        <column name="USER_NEW" value="Admin"/>
+        <column name="DATE_NEW" valueComputed="current_datetime"/>
+    </insert>
+    <rollback>
+        <delete tableName="CONTACT">
+            <where>CONTACTID = ?</where>
+            <whereParams>
+                <param value="c7ddf982-0e58-4152-b82b-8f5673b0b729" />
+            </whereParams>
+        </delete>
+        <delete tableName="COMMUNICATION">
+            <where>CONTACTID = ?</where>
+            <whereParams>
+                <param value="c7ddf982-0e58-4152-b82b-8f5673b0b729" />
+            </whereParams>
+        </delete>
+        <delete tableName="PERSON">
+            <where>PERSONID = ?</where>
+            <whereParams>
+                <param value="b16282bd-254e-4569-a56e-675449821467" />
+            </whereParams>
+        </delete>
+        <delete tableName="ADDRESS">
+            <where>CONTACT_ID = ?</where>
+            <whereParams>
+                <param value="c7ddf982-0e58-4152-b82b-8f5673b0b729" />
+            </whereParams>
+        </delete>
+    </rollback>
+</changeSet>
+</databaseChangeLog>
diff --git a/.liquibase/Data_alias/basic/2019.2/renameCycle_to_Milestone.xml b/.liquibase/Data_alias/basic/2019.2/renameCycle_to_Milestone.xml
new file mode 100644
index 0000000000000000000000000000000000000000..94183e1d8dc5c55dbd95db8652fc83e37cfe3143
--- /dev/null
+++ b/.liquibase/Data_alias/basic/2019.2/renameCycle_to_Milestone.xml
@@ -0,0 +1,9 @@
+<?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="da0982c9-8541-43a2-ae3f-cfb179a6b8c3">
+        <renameTable oldTableName="SALESPROJECT_CYCLE" newTableName="SALESPROJECT_MILESTONE"/>
+        <renameColumn tableName="SALESPROJECT_MILESTONE" columnDataType="CHAR(36)" newColumnName="SALESPROJECT_MILESTONEID" oldColumnName="SALESPROJECT_CYCLEID"/>
+        <dropPrimaryKey tableName="SALESPROJECT_MILESTONE" constraintName="PK_SALESPROJECT_CYCLE_SALESPROJECT_CYCLEID"/>
+        <addPrimaryKey tableName="SALESPROJECT_MILESTONE" constraintName="PK_SALESPROJECT_MILESTONE_SALESPROJECT_MILESTONEID" columnNames="SALESPROJECT_MILESTONEID"/>
+   </changeSet>
+</databaseChangeLog>
\ No newline at end of file
diff --git a/.liquibase/Data_alias/basic/2019.2/update_Milestone_to_new_Keyword.xml b/.liquibase/Data_alias/basic/2019.2/update_Milestone_to_new_Keyword.xml
new file mode 100644
index 0000000000000000000000000000000000000000..78058cb375498026ca1ab75ec33e674970b569f2
--- /dev/null
+++ b/.liquibase/Data_alias/basic/2019.2/update_Milestone_to_new_Keyword.xml
@@ -0,0 +1,135 @@
+<?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="ec9bae68-ca27-4597-9808-fc333246b3a0">
+        <update tableName="SALESPROJECT_MILESTONE">
+            <column name="TYPE" value="SalesprojectPhase"/>
+            <where>TYPE = ?</where>
+            <whereParams>
+                <param value="1" />
+            </whereParams>
+        </update>
+        <update tableName="SALESPROJECT_MILESTONE">
+            <column name="VALUE" value="9f7d1fa9-7c09-4037-8f7c-8458def14d89"/>
+            <where>TYPE = ? and VALUE in (?,?,?,?,?,?,?,?,?,?,?)</where>
+            <whereParams>
+                <param value="SalesprojectPhase" />
+                <param value="1" />
+                <param value="7" />
+                <param value="8" />
+                <param value="9" />
+                <param value="10" />
+                <param value="11" />
+                <param value="12" />
+                <param value="13" />
+                <param value="14" />
+                <param value="15" />
+                <param value="16" />
+            </whereParams>
+        </update>
+        <update tableName="SALESPROJECT_MILESTONE">
+            <column name="VALUE" value="292628f1-d9a5-432d-8130-f6690c14a5d4"/>
+            <where>TYPE = ? and VALUE = ?</where>
+            <whereParams>
+                <param value="SalesprojectPhase" />
+                <param value="2" />
+            </whereParams>
+        </update>
+        <update tableName="SALESPROJECT_MILESTONE">
+            <column name="VALUE" value="4467b33c-3a68-4c8b-ba4a-1eb666a6c774"/>
+            <where>TYPE = ? and VALUE = ?</where>
+            <whereParams>
+                <param value="SalesprojectPhase" />
+                <param value="3" />
+            </whereParams>
+        </update>
+        <update tableName="SALESPROJECT_MILESTONE">
+            <column name="VALUE" value="1e42f183-fb97-415f-9917-b43ca159fde4"/>
+            <where>TYPE = ? and VALUE = ?</where>
+            <whereParams>
+                <param value="SalesprojectPhase" />
+                <param value="4" />
+            </whereParams>
+        </update>
+        <update tableName="SALESPROJECT_MILESTONE">
+            <column name="VALUE" value="972a41dc-a8ae-43cd-a03b-522ea84efbfb"/>
+            <where>TYPE = ? and VALUE = ?</where>
+            <whereParams>
+                <param value="SalesprojectPhase" />
+                <param value="5" />
+            </whereParams>
+        </update>
+        <update tableName="SALESPROJECT_MILESTONE">
+            <column name="VALUE" value="60d09bb1-7e02-4003-99bf-18b739a577ad"/>
+            <where>TYPE = ? and VALUE = ?</where>
+            <whereParams>
+                <param value="SalesprojectPhase" />
+                <param value="6" />
+            </whereParams>
+        </update>
+        <update tableName="SALESPROJECT_MILESTONE">
+            <column name="VALUE" value="213c8184-f930-457e-8605-703baaf21d4a"/>
+            <where>TYPE = ? and VALUE = ?</where>
+            <whereParams>
+                <param value="SalesprojectPhase" />
+                <param value="7" />
+            </whereParams>
+        </update>
+        
+        
+        <update tableName="SALESPROJECT_MILESTONE">
+            <column name="TYPE" value="SalesprojectState"/>
+            <where>TYPE = ?</where>
+            <whereParams>
+                <param value="2" />
+            </whereParams>
+        </update>
+        <update tableName="SALESPROJECT_MILESTONE">
+            <column name="VALUE" value="483bcaeb-1e5b-4772-b54e-7d7d8aa65712"/>
+            <where>TYPE = ? and VALUE = ?</where>
+            <whereParams>
+                <param value="SalesprojectState" />
+                <param value="1" />
+            </whereParams>
+        </update>
+        <update tableName="SALESPROJECT_MILESTONE">
+            <column name="VALUE" value="23d38486-4cce-41ce-a8df-164ad44df706"/>
+            <where>TYPE = ? and VALUE = ?</where>
+            <whereParams>
+                <param value="SalesprojectState" />
+                <param value="2" />
+            </whereParams>
+        </update>
+        <update tableName="SALESPROJECT_MILESTONE">
+            <column name="VALUE" value="8916e241-9452-4541-a323-d479ad5f2e4d"/>
+            <where>TYPE = ? and VALUE = ?</where>
+            <whereParams>
+                <param value="SalesprojectState" />
+                <param value="3" />
+            </whereParams>
+        </update>
+        <update tableName="SALESPROJECT_MILESTONE">
+            <column name="VALUE" value="1606cf46-a87b-4797-830e-55ebdd70a001"/>
+            <where>TYPE = ? and VALUE = ?</where>
+            <whereParams>
+                <param value="SalesprojectState" />
+                <param value="4" />
+            </whereParams>
+        </update>
+        <update tableName="SALESPROJECT_MILESTONE">
+            <column name="VALUE" value="130bb53a-a97e-455e-8f34-8d445e985474"/>
+            <where>TYPE = ? and VALUE = ?</where>
+            <whereParams>
+                <param value="SalesprojectState" />
+                <param value="5" />
+            </whereParams>
+        </update>
+        <update tableName="SALESPROJECT_MILESTONE">
+            <column name="VALUE" value="d8a60f60-a4e6-46ee-88ec-bac53e1afedd"/>
+            <where>TYPE = ? and VALUE = ?</where>
+            <whereParams>
+                <param value="SalesprojectState" />
+                <param value="6" />
+            </whereParams>
+        </update>
+   </changeSet>
+</databaseChangeLog>
\ No newline at end of file
diff --git a/.liquibase/_____SYSTEMALIAS/basic/init/data/defaultBlob/_____configuration.xml b/.liquibase/_____SYSTEMALIAS/basic/init/data/defaultBlob/_____configuration.xml
index 0808967704be0c95f53d4cad4524a9660e07eb8a..a57bd0f04271547aaf28e4f103e6a625bd2d8804 100644
--- a/.liquibase/_____SYSTEMALIAS/basic/init/data/defaultBlob/_____configuration.xml
+++ b/.liquibase/_____SYSTEMALIAS/basic/init/data/defaultBlob/_____configuration.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<aliasConfig xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.0.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/aliasConfig/1.0.7">
+<aliasConfig 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/aliasConfig/1.1.0">
   <name>_____CONFIGURATION</name>
   <serverId>default</serverId>
   <definitionName>_____CONFIGURATION</definitionName>
diff --git a/.liquibase/_____SYSTEMALIAS/basic/init/data/defaultBlob/_____system_sysdb_version.xml b/.liquibase/_____SYSTEMALIAS/basic/init/data/defaultBlob/_____system_sysdb_version.xml
index 59bf0767b66fe17465aa47e845310a64b932ea6d..263bf76d5d876fa69aaabaef1f06f01b5e4e1c01 100644
--- a/.liquibase/_____SYSTEMALIAS/basic/init/data/defaultBlob/_____system_sysdb_version.xml
+++ b/.liquibase/_____SYSTEMALIAS/basic/init/data/defaultBlob/_____system_sysdb_version.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <sysDbVersion xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.0" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/sysDbVersion/1.2.0">
   <name>_____SYSTEM_SYSDB_VERSION</name>
-  <systemDbVersion>2.5.1</systemDbVersion>
+  <systemDbVersion>2.6.0</systemDbVersion>
 </sysDbVersion>
diff --git a/.liquibase/_____SYSTEMALIAS/basic/init/data/defaultBlob/data_alias.xml b/.liquibase/_____SYSTEMALIAS/basic/init/data/defaultBlob/data_alias.xml
index 96e374b63bfba36595e9eef04af49ece136932a9..e6eb125c832854bf0e6dd3e0c5f88d2ee198db51 100644
--- a/.liquibase/_____SYSTEMALIAS/basic/init/data/defaultBlob/data_alias.xml
+++ b/.liquibase/_____SYSTEMALIAS/basic/init/data/defaultBlob/data_alias.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<aliasConfig xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.0.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/aliasConfig/1.0.7">
+<aliasConfig 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/aliasConfig/1.1.0">
   <name>f50ee138-12d9-420d-a4f9-9b8257e207e4</name>
   <description>jdbc:derby://localhost:1527/basic_data</description>
   <serverId>default</serverId>
diff --git a/.liquibase/_____SYSTEMALIAS/basic/init/data/insert_asys_system.xml b/.liquibase/_____SYSTEMALIAS/basic/init/data/insert_asys_system.xml
index 5065651e3bced3f53c7fcd357f402fba4ba1384c..38d99e05952657760911852cb369a4853b78e69e 100644
--- a/.liquibase/_____SYSTEMALIAS/basic/init/data/insert_asys_system.xml
+++ b/.liquibase/_____SYSTEMALIAS/basic/init/data/insert_asys_system.xml
@@ -7,7 +7,7 @@
         <column name="DATE_NEW" valueDate="2018-05-24T14:53:57.763"/>
         <column name="KIND" valueNumeric="600"/>
         <column name="NAME" value="_____SYSTEM_SYSDB_VERSION"/>
-        <column name="TITLE" value="2.5.1"/>
+        <column name="TITLE" value="2.6.0"/>
         <column name="USER_EDIT" value="_____DESIGNERANONYM"/>
         <column name="USER_NEW" value="_____DESIGNERANONYM"/>
         <column name="XMLDATA" valueBlobFile="defaultBlob/_____system_sysdb_version.xml"/>
diff --git a/.liquibase/_____SYSTEMALIAS/basic/init/data/insert_asys_users-admin.xml b/.liquibase/_____SYSTEMALIAS/basic/init/data/insert_asys_users-admin.xml
index 985b5d19534f4f4ffcc60ecd673f6c907f1e0730..33f7425c15c97e76ac83a3a172c4c79849fb88bb 100644
--- a/.liquibase/_____SYSTEMALIAS/basic/init/data/insert_asys_users-admin.xml
+++ b/.liquibase/_____SYSTEMALIAS/basic/init/data/insert_asys_users-admin.xml
@@ -10,6 +10,15 @@
         <column name="PROPKEY" value="lastModified"/>
         <column name="PROPVAL" value="1544193908535"/>
     </insert>
+    <insert tableName="ASYS_USERS">
+        <column name="DATE_EDIT" valueDate="2018-12-07T15:45:08.535"/>
+        <column name="DATE_NEW" valueDate="2018-05-25T09:52:30.361"/>
+        <column name="GROUPID" value="BASIC"/>
+        <column name="ID" value="cdb34f95-e414-4807-bbdb-f369138ee49f"/>
+        <column name="NAME" value="_____USER_bcdfb521-c7d0-4ef1-8916-78e7d3232046"/>
+        <column name="PROPKEY" value="contactID"/>
+        <column name="PROPVAL" value="c7ddf982-0e58-4152-b82b-8f5673b0b729"/>
+    </insert>
     <insert tableName="ASYS_USERS">
         <column name="DATE_EDIT" valueDate="2018-12-07T15:45:08.535"/>
         <column name="DATE_NEW" valueDate="2018-05-25T09:52:30.361"/>
@@ -19,6 +28,15 @@
         <column name="PROPKEY" value="name"/>
         <column name="PROPVAL" value="_____USER_bcdfb521-c7d0-4ef1-8916-78e7d3232046"/>
     </insert>
+    <insert tableName="ASYS_USERS">
+        <column name="DATE_EDIT" valueDate="2018-12-07T15:45:08.535"/>
+        <column name="DATE_NEW" valueDate="2018-05-25T09:52:30.361"/>
+        <column name="GROUPID" value="BASIC"/>
+        <column name="ID" value="c17c88f5-74e2-44a1-ae68-8130918b43d3"/>
+        <column name="NAME" value="_____USER_bcdfb521-c7d0-4ef1-8916-78e7d3232046"/>
+        <column name="PROPKEY" value="isActive"/>
+        <column name="PROPVAL" value="true"/>
+    </insert>
     <insert tableName="ASYS_USERS">
         <column name="DATE_EDIT" valueDate="2018-12-07T15:45:08.535"/>
         <column name="DATE_NEW" valueDate="2018-05-25T09:52:30.361"/>
@@ -28,6 +46,15 @@
         <column name="PROPKEY" value="title"/>
         <column name="PROPVAL" value="Admin"/>
     </insert>
+    <insert tableName="ASYS_USERS">
+        <column name="DATE_EDIT" valueDate="2018-12-07T15:45:08.535"/>
+        <column name="DATE_NEW" valueDate="2018-05-25T09:52:30.361"/>
+        <column name="GROUPID" value="PERSONAL"/>
+        <column name="ID" value="93c88dff-a6b0-49ce-b7b4-e474b7ca7fb6"/>
+        <column name="NAME" value="_____USER_bcdfb521-c7d0-4ef1-8916-78e7d3232046"/>
+        <column name="PROPKEY" value="firstname"/>
+        <column name="PROPVAL" value="Tim"/>
+    </insert>
     <insert tableName="ASYS_USERS">
         <column name="DATE_EDIT" valueDate="2018-12-07T15:45:08.535"/>
         <column name="DATE_NEW" valueDate="2018-05-25T09:52:30.361"/>
@@ -35,7 +62,7 @@
         <column name="ID" value="f63d0946-3960-43bb-9888-4c36d962f955"/>
         <column name="NAME" value="_____USER_bcdfb521-c7d0-4ef1-8916-78e7d3232046"/>
         <column name="PROPKEY" value="lastname"/>
-        <column name="PROPVAL" value="Administrator"/>
+        <column name="PROPVAL" value="Admin"/>
     </insert>
     <insert tableName="ASYS_USERS">
         <column name="DATE_EDIT" valueDate="2018-12-07T15:45:08.535"/>
diff --git a/.liquibase/_____SYSTEMALIAS/basic/init/init.xml b/.liquibase/_____SYSTEMALIAS/basic/init/init.xml
index 4e94f2543871caa8a6c85f12715d0856d3f6a6e2..d29b9203a5b0089545e87bd7641479f7fa4003e9 100644
--- a/.liquibase/_____SYSTEMALIAS/basic/init/init.xml
+++ b/.liquibase/_____SYSTEMALIAS/basic/init/init.xml
@@ -1,18 +1,18 @@
 <?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">
-    <include file="struct/create_asys_aliasconfig.xml"/>
-    <include file="struct/create_asys_binaries.xml"/>
-    <include file="struct/create_asys_dashletconfigurations.xml"/>
-    <include file="struct/create_asys_dashlets.xml"/>
-    <include file="struct/create_asys_notifications.xml"/>
-    <include file="struct/create_asys_sequences.xml"/>
-    <include file="struct/create_asys_system.xml"/>
-    <include file="struct/create_asys_timer.xml"/>
-    <include file="struct/create_asys_users.xml"/>
-    <include file="struct/create_asys_calendarbackend.xml"/>
-    <include file="struct/create_asys_calendarlink.xml"/>
+    <include relativeToChangelogFile="true" file="struct/create_asys_aliasconfig.xml"/>
+    <include relativeToChangelogFile="true" file="struct/create_asys_binaries.xml"/>
+    <include relativeToChangelogFile="true" file="struct/create_asys_dashletconfigurations.xml"/>
+    <include relativeToChangelogFile="true" file="struct/create_asys_dashlets.xml"/>
+    <include relativeToChangelogFile="true" file="struct/create_asys_notifications.xml"/>
+    <include relativeToChangelogFile="true" file="struct/create_asys_sequences.xml"/>
+    <include relativeToChangelogFile="true" file="struct/create_asys_system.xml"/>
+    <include relativeToChangelogFile="true" file="struct/create_asys_timer.xml"/>
+    <include relativeToChangelogFile="true" file="struct/create_asys_users.xml"/>
+    <include relativeToChangelogFile="true" file="struct/create_asys_calendarbackend.xml"/>
+    <include relativeToChangelogFile="true" file="struct/create_asys_calendarlink.xml"/>
     
-    <include file="data/insert_asys_aliasconfig.xml"/>
-    <include file="data/insert_asys_system.xml"/>
-    <include file="data/insert_asys_users-admin.xml"/>
+    <include relativeToChangelogFile="true" file="data/insert_asys_aliasconfig.xml"/>
+    <include relativeToChangelogFile="true" file="data/insert_asys_system.xml"/>
+    <include relativeToChangelogFile="true" file="data/insert_asys_users-admin.xml"/>
 </databaseChangeLog>
diff --git a/.liquibase/_____SYSTEMALIAS/basic/init/system_aliasTestdata.xml b/.liquibase/_____SYSTEMALIAS/basic/init/system_aliasTestdata.xml
index 12e4b957ade3bd0f87acb1decb681cb98398f0df..9471a52c15d6bcf528b3d86b509fba763553a793 100644
--- a/.liquibase/_____SYSTEMALIAS/basic/init/system_aliasTestdata.xml
+++ b/.liquibase/_____SYSTEMALIAS/basic/init/system_aliasTestdata.xml
@@ -1,13 +1,13 @@
 <?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">   
-    <include file="data/example_asys_users/Birgit_Leicht.xml"/>
-    <include file="data/example_asys_binaries/Birgit_Leicht_Image.xml"/>
-    <include file="data/example_asys_users/Harold_Smith.xml"/>
-    <include file="data/example_asys_binaries/Harold_Smith_Image.xml"/>
-    <include file="data/example_asys_users/Herbert_Obermeier.xml"/>
-    <include file="data/example_asys_binaries/Herbert_Obermeier_Image.xml"/>
-    <include file="data/example_asys_users/Lisa_Sommer.xml"/>
-    <include file="data/example_asys_binaries/Lisa_Sommer_Image.xml"/>
-    <include file="data/example_asys_users/Susanne_Lustig.xml"/>
-    <include file="data/example_asys_binaries/Susanne_Lustig_Image.xml"/>
+    <include relativeToChangelogFile="true" file="data/example_asys_users/Birgit_Leicht.xml"/>
+    <include relativeToChangelogFile="true" file="data/example_asys_binaries/Birgit_Leicht_Image.xml"/>
+    <include relativeToChangelogFile="true" file="data/example_asys_users/Harold_Smith.xml"/>
+    <include relativeToChangelogFile="true" file="data/example_asys_binaries/Harold_Smith_Image.xml"/>
+    <include relativeToChangelogFile="true" file="data/example_asys_users/Herbert_Obermeier.xml"/>
+    <include relativeToChangelogFile="true" file="data/example_asys_binaries/Herbert_Obermeier_Image.xml"/>
+    <include relativeToChangelogFile="true" file="data/example_asys_users/Lisa_Sommer.xml"/>
+    <include relativeToChangelogFile="true" file="data/example_asys_binaries/Lisa_Sommer_Image.xml"/>
+    <include relativeToChangelogFile="true" file="data/example_asys_users/Susanne_Lustig.xml"/>
+    <include relativeToChangelogFile="true" file="data/example_asys_binaries/Susanne_Lustig_Image.xml"/>
 </databaseChangeLog>
diff --git a/aliasDefinition/Data_alias/Data_alias.aod b/aliasDefinition/Data_alias/Data_alias.aod
index 4297b5fe7326d3da65160bbcf5725a41b0b405d8..b2e73a04e975097de4b9cdaca86cb59205c1808c 100644
--- a/aliasDefinition/Data_alias/Data_alias.aod
+++ b/aliasDefinition/Data_alias/Data_alias.aod
@@ -2742,109 +2742,6 @@
               </entityFieldDb>
             </entityFields>
           </entityDb>
-          <entityDb>
-            <name>SALESPROJECT_CYCLE</name>
-            <dbName></dbName>
-            <idColumn>SALESPROJECT_CYCLEID</idColumn>
-            <idGeneratorType v="0" />
-            <idGeneratorInterval v="1" />
-            <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>SALESPROJECT_CYCLEID</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_START</name>
-                <dbName></dbName>
-                <primaryKey v="false" />
-                <columnType v="93" />
-                <size v="29" />
-                <scale v="9" />
-                <notNull v="false" />
-                <isUnique v="false" />
-                <index v="false" />
-                <documentation></documentation>
-                <title></title>
-                <description></description>
-              </entityFieldDb>
-              <entityFieldDb>
-                <name>VALUE</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>SALESPROJECT_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>TYPE</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>DATE_END</name>
-                <dbName></dbName>
-                <primaryKey v="false" />
-                <columnType v="93" />
-                <size v="29" />
-                <scale v="9" />
-                <notNull v="false" />
-                <isUnique v="false" />
-                <index v="false" />
-                <documentation></documentation>
-                <title></title>
-                <description></description>
-              </entityFieldDb>
-            </entityFields>
-          </entityDb>
           <entityDb>
             <name>SALESPROJECT_FORECAST</name>
             <dbName></dbName>
@@ -6189,6 +6086,106 @@
                 <scale v="0" />
                 <notNull v="false" />
                 <isUnique v="false" />
+              </entityFieldDb>
+            </entityFields>
+          </entityDb>
+          <entityDb>
+            <name>SALESPROJECT_MILESTONE</name>
+            <dbName></dbName>
+            <idColumn>SALESPROJECT_MILESTONEID</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_START</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="93" />
+                <size v="29" />
+                <scale v="9" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>VALUE</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="1" />
+                <size v="36" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>SALESPROJECT_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>TYPE</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="12" />
+                <size v="80" />
+                <scale v="0" />
+                <notNull v="false" />
+                <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="93" />
+                <size v="29" />
+                <scale v="9" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>SALESPROJECT_MILESTONEID</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>
diff --git a/entity/360Degree_entity/360Degree_entity.aod b/entity/360Degree_entity/360Degree_entity.aod
index 66b17d986f3f77f93e3bea9c803ef2a87d1a95bb..1d4bdeca355a54d16fe7f61f2f6eb3f37e3295da 100644
--- a/entity/360Degree_entity/360Degree_entity.aod
+++ b/entity/360Degree_entity/360Degree_entity.aod
@@ -14,6 +14,7 @@
     </entityField>
     <entityField>
       <name>TITLE</name>
+      <linkedContextProcess>%aditoprj%/entity/360Degree_entity/entityfields/title/linkedContextProcess.js</linkedContextProcess>
       <searchable v="false" />
     </entityField>
     <entityParameter>
diff --git a/entity/360Degree_entity/entityfields/newmodule/children/newcontract/onActionProcess.js b/entity/360Degree_entity/entityfields/newmodule/children/newcontract/onActionProcess.js
index c441f436ac1b006d8c653a13d4095207a9752c56..0593c0ea1d681ac441b346e130c12bfbf7c0564c 100644
--- a/entity/360Degree_entity/entityfields/newmodule/children/newcontract/onActionProcess.js
+++ b/entity/360Degree_entity/entityfields/newmodule/children/newcontract/onActionProcess.js
@@ -1,5 +1,4 @@
 import("system.vars");
 import("Contract_lib");
-import("system.logging");
 
 ContractUtils.createNewContract(vars.getString("$param.ObjectRowId_param"));
\ No newline at end of file
diff --git a/entity/360Degree_entity/entityfields/newmodule/children/newcontract/stateProcess.js b/entity/360Degree_entity/entityfields/newmodule/children/newcontract/stateProcess.js
index 45d4c0d1cadf0fd4f0a44a660ff1a9a8e481e879..fc6fedaff886e1b4b13e066605063f5c595b795b 100644
--- a/entity/360Degree_entity/entityfields/newmodule/children/newcontract/stateProcess.js
+++ b/entity/360Degree_entity/entityfields/newmodule/children/newcontract/stateProcess.js
@@ -1,7 +1,6 @@
 import("system.result");
 import("system.vars");
 import("system.neon");
-import("system.logging");
     
 var contextList = JSON.parse(vars.getString("$param.ObjectType_param"));
 var found = false;
diff --git a/entity/360Degree_entity/entityfields/title/linkedContextProcess.js b/entity/360Degree_entity/entityfields/title/linkedContextProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..c493945bed68e5998cc4a2e8f2f18aa500683f72
--- /dev/null
+++ b/entity/360Degree_entity/entityfields/title/linkedContextProcess.js
@@ -0,0 +1,3 @@
+import("system.vars");
+import("system.result");
+result.string(vars.get("$field.TARGET_CONTEXT"));
\ No newline at end of file
diff --git a/entity/360Degree_entity/recordcontainers/jdito/contentProcess.js b/entity/360Degree_entity/recordcontainers/jdito/contentProcess.js
index f74342ef8fe31213bd81788524244cb58c2a2271..5f91637c836c317480dc04958cdc4563b0da8611 100644
--- a/entity/360Degree_entity/recordcontainers/jdito/contentProcess.js
+++ b/entity/360Degree_entity/recordcontainers/jdito/contentProcess.js
@@ -1,11 +1,9 @@
-import("system.logging");
 import("system.util");
 import("system.db");
 import("system.vars");
 import("system.result");
 import("Context_lib");
 import("system.translate");
-import("system.logging");
 
 var resultList = [];
 if (vars.exists("$param.ObjectType_param") && vars.get("$param.ObjectType_param") && vars.exists("$param.ObjectRowId_param") && vars.get("$param.ObjectRowId_param"))
diff --git a/entity/ActivityLink_entity/ActivityLink_entity.aod b/entity/ActivityLink_entity/ActivityLink_entity.aod
index 312eb108037270268629d5641532f061c3d07e27..00d2c837e4ba4cdbb7253c1baa75966e9cc111ef 100644
--- a/entity/ActivityLink_entity/ActivityLink_entity.aod
+++ b/entity/ActivityLink_entity/ActivityLink_entity.aod
@@ -16,6 +16,7 @@
       <name>OBJECT_TYPE</name>
       <title>{$OBJECTLINK_TYPE}</title>
       <consumer>Context</consumer>
+      <mandatory v="true" />
       <displayValueProcess>%aditoprj%/entity/ActivityLink_entity/entityfields/object_type/displayValueProcess.js</displayValueProcess>
     </entityField>
     <entityField>
@@ -23,6 +24,7 @@
       <title>{$OBJECTLINK_OBJECT}</title>
       <consumer>Objects</consumer>
       <linkedContextProcess>%aditoprj%/entity/ActivityLink_entity/entityfields/object_rowid/linkedContextProcess.js</linkedContextProcess>
+      <mandatory v="true" />
       <displayValueProcess>%aditoprj%/entity/ActivityLink_entity/entityfields/object_rowid/displayValueProcess.js</displayValueProcess>
     </entityField>
     <entityField>
diff --git a/entity/Activity_entity/Activity_entity.aod b/entity/Activity_entity/Activity_entity.aod
index 8d1f8c7048a5dbf2e54d0213c01465d38cbe0fbc..cd65065c38663b5ab510ec227d4807fbf1260f4d 100644
--- a/entity/Activity_entity/Activity_entity.aod
+++ b/entity/Activity_entity/Activity_entity.aod
@@ -58,6 +58,7 @@
     </entityParameter>
     <entityField>
       <name>SUBJECT_DETAILS</name>
+      <linkedContext>Activity</linkedContext>
       <valueProcess>%aditoprj%/entity/Activity_entity/entityfields/subject_details/valueProcess.js</valueProcess>
     </entityField>
     <entityField>
diff --git a/entity/Address_entity/recordcontainers/db/onDBInsert.js b/entity/Address_entity/recordcontainers/db/onDBInsert.js
index 4f0f20e26a8335a324327f5df12e37c8399545e3..0b06b98f3f4d02529bd274832a28057377d16bd6 100644
--- a/entity/Address_entity/recordcontainers/db/onDBInsert.js
+++ b/entity/Address_entity/recordcontainers/db/onDBInsert.js
@@ -1,4 +1,3 @@
-import("system.logging");
 import("system.vars");
 import("StandardObject_lib");
 
diff --git a/entity/AppointmentLink_entity/entityfields/objectid/displayValueProcess.js b/entity/AppointmentLink_entity/entityfields/objectid/displayValueProcess.js
index 844708f89dc0cc824e7651eade24917d5a38e4fb..b603d5545bf136c0f5ab87ec05c4ab83d3ac6cc0 100644
--- a/entity/AppointmentLink_entity/entityfields/objectid/displayValueProcess.js
+++ b/entity/AppointmentLink_entity/entityfields/objectid/displayValueProcess.js
@@ -1,4 +1,3 @@
-import("system.logging");
 import("system.db");
 import("system.vars");
 import("system.result");
diff --git a/entity/AppointmentLink_entity/entityfields/objecttype/displayValueProcess.js b/entity/AppointmentLink_entity/entityfields/objecttype/displayValueProcess.js
index 9e7fb9a949fc371e06d22408fb69bf998b9488e7..bc84d07a9f8ab6e9bbfde0de443cd0322a26a69b 100644
--- a/entity/AppointmentLink_entity/entityfields/objecttype/displayValueProcess.js
+++ b/entity/AppointmentLink_entity/entityfields/objecttype/displayValueProcess.js
@@ -1,11 +1,9 @@
-import("system.logging");
-import("system.result");
-import("system.neon");
-import("system.vars");
-import("system.project");
-
-if (vars.exists("$field.OBJECTTYPE") && vars.get("$field.OBJECTTYPE"))
-{
-    logging.log("objecttype value: " + project.getDataModel(project.DATAMODEL_KIND_CONTEXT, vars.get("$field.OBJECTTYPE"))[1]);
-    result.string(project.getDataModel(project.DATAMODEL_KIND_CONTEXT, vars.get("$field.OBJECTTYPE"))[1]);
+import("system.result");
+import("system.neon");
+import("system.vars");
+import("system.project");
+
+if (vars.exists("$field.OBJECTTYPE") && vars.get("$field.OBJECTTYPE"))
+{
+    result.string(project.getDataModel(project.DATAMODEL_KIND_CONTEXT, vars.get("$field.OBJECTTYPE"))[1]);
 }
\ No newline at end of file
diff --git a/entity/Appointment_entity/entityfields/summary/valueProcess.js b/entity/Appointment_entity/entityfields/summary/valueProcess.js
index 8fd3d347cac2df60651d46bdab6fb9caffbd7ca6..c42150fdff40e956026f65addcdcadc10049df0b 100644
--- a/entity/Appointment_entity/entityfields/summary/valueProcess.js
+++ b/entity/Appointment_entity/entityfields/summary/valueProcess.js
@@ -9,8 +9,6 @@ import("system.result");
  */
 if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && vars.exists("$param.Entry_param"))
 {
-    logging.log()
-    
     var event = JSON.parse(vars.getString("$param.Entry_param"));
 
     if(event[calendars.SUMMARY])
diff --git a/entity/AttributeRelationTree_entity/recordcontainers/jdito/contentProcess.js b/entity/AttributeRelationTree_entity/recordcontainers/jdito/contentProcess.js
index e6b4f8a5171e30c73818b120f6f4de53eabef89f..3bc714d701a23a938e5cca97131fd2ee59a579cb 100644
--- a/entity/AttributeRelationTree_entity/recordcontainers/jdito/contentProcess.js
+++ b/entity/AttributeRelationTree_entity/recordcontainers/jdito/contentProcess.js
@@ -1,44 +1,71 @@
-import("system.vars");
-import("system.result");
-import("system.db");
-import("Attribute_lib");
-import("Sql_lib");
-
-var objectType = vars.get("$param.ObjectType_param");
-var rowId = vars.get("$param.ObjectRowId_param");
-var attributeObj = {};
-var allAttributes = [];
-var sqlSelect = "select AB_ATTRIBUTEID, ATTRIBUTE_PARENT_ID, ATTRIBUTE_NAME, ATTRIBUTE_LEVEL from AB_ATTRIBUTE";
-
-var attributeValues = AttributeRelationUtils.getAllAttributes(rowId, objectType, false, true);
-
-_fetchAttributes(attributeValues.map(function (row) {return row[1]}));
-
-allAttributes = allAttributes
-    .sort(function (a, b) {return a[3] - b[3];}) //sort by level to make sure parents are added first
-    .map(function (row) {return [row[0], row[1], row[2]];}) //remove level from array
-    .concat(attributeValues);
-result.object(allAttributes);
-
-function _fetchAttributes (pAttributeIds)
-{
-    var condition = SqlCondition.begin();
-    var nextIds = [];
-    pAttributeIds.forEach(function (id)
-    {
-        if (!(id in this))
-            condition.orPrepare("AB_ATTRIBUTE.AB_ATTRIBUTEID", id);
-    }, attributeObj);
-    db.table(condition.buildSql(sqlSelect, "1=2"))
-        .forEach(function (row)
-            {
-                this[row[0]] = true;
-                if (row[1])
-                    nextIds.push(row[1]);
-                else
-                    row[1] = null;
-                allAttributes.push(row);
-            }, attributeObj);
-    if (nextIds.length)
-        _fetchAttributes(nextIds);
+import("system.vars");
+import("system.result");
+import("system.db");
+import("Attribute_lib");
+import("Sql_lib");
+
+var objectType = vars.get("$param.ObjectType_param");
+var rowId = vars.get("$param.ObjectRowId_param");
+var attributeObj = {};
+var allAttributes = [];
+var sqlSelect = "select AB_ATTRIBUTEID, ATTRIBUTE_PARENT_ID, ATTRIBUTE_NAME from AB_ATTRIBUTE";
+
+var attributeValues = AttributeRelationUtils.getAllAttributes(rowId, objectType, false, true);
+
+_fetchAttributes(attributeValues.map(function (row) {return row[1]}));
+
+allAttributes = _sortArrayForTree(allAttributes).concat(attributeValues);
+result.object(allAttributes);
+
+function _fetchAttributes (pAttributeIds)
+{
+    var condition = SqlCondition.begin();
+    var nextIds = [];
+    pAttributeIds.forEach(function (id)
+    {
+        if (!(id in this))
+            condition.orPrepare("AB_ATTRIBUTE.AB_ATTRIBUTEID", id);
+    }, attributeObj);
+    db.table(condition.buildSql(sqlSelect, "1=2"))
+        .forEach(function (row)
+            {
+                this[row[0]] = true;
+                if (row[1])
+                    nextIds.push(row[1]);
+                else
+                    row[1] = null;
+                allAttributes.push(row);
+            }, attributeObj);
+    if (nextIds.length)
+        _fetchAttributes(nextIds);
+}
+
+function _sortArrayForTree (pArray) 
+{
+    var rows = {};
+    var allIds = {};
+    var idIndex = 1;
+    var parentIdIndex = 4;
+    
+    pArray.forEach(function (row) {allIds[row[idIndex]] = true;});
+    
+    var index = 0;
+    
+    for (let itemsAdded = true; itemsAdded; itemsAdded = oldIndex != index)
+    {
+        var oldIndex = index;
+        pArray.forEach(function (row)
+        {
+            if (!(row[idIndex] in this) && (row[parentIdIndex] in this || !allIds[row[parentIdIndex]]))
+                this[row[idIndex]] = {
+                    data : row,
+                    index : index++
+                };
+        }, rows);
+    }
+    var sortedArray = new Array(Object.keys(rows).length);
+    for (let i in rows)
+        sortedArray[rows[i].index] = rows[i].data;
+    
+    return sortedArray;
 }
\ No newline at end of file
diff --git a/entity/Attribute_entity/Attribute_entity.aod b/entity/Attribute_entity/Attribute_entity.aod
index 7a53655d326d89c0f289e70d22176c8ed389a346..a33899be37800f733596dee69847ff941dcd9efc 100644
--- a/entity/Attribute_entity/Attribute_entity.aod
+++ b/entity/Attribute_entity/Attribute_entity.aod
@@ -7,7 +7,7 @@
   <afterUiInit>%aditoprj%/entity/Attribute_entity/afterUiInit.js</afterUiInit>
   <iconId>VAADIN:TAG</iconId>
   <titleProcess>%aditoprj%/entity/Attribute_entity/titleProcess.js</titleProcess>
-  <recordContainer>db</recordContainer>
+  <recordContainer>jdito</recordContainer>
   <entityFields>
     <entityProvider>
       <name>#PROVIDER</name>
@@ -278,57 +278,32 @@
         </entityParameter>
       </children>
     </entityConsumer>
+    <entityField>
+      <name>IMAGE</name>
+      <contentType>IMAGE</contentType>
+    </entityField>
+    <entityField>
+      <name>UID</name>
+    </entityField>
   </entityFields>
   <recordContainers>
-    <dbRecordContainer>
-      <name>db</name>
-      <alias>Data_alias</alias>
-      <conditionProcess>%aditoprj%/entity/Attribute_entity/recordcontainers/db/conditionProcess.js</conditionProcess>
-      <orderClauseProcess>%aditoprj%/entity/Attribute_entity/recordcontainers/db/orderClauseProcess.js</orderClauseProcess>
-      <onDBUpdate>%aditoprj%/entity/Attribute_entity/recordcontainers/db/onDBUpdate.js</onDBUpdate>
-      <onDBDelete>%aditoprj%/entity/Attribute_entity/recordcontainers/db/onDBDelete.js</onDBDelete>
-      <linkInformation>
-        <linkInformation>
-          <name>b5fd38e1-b315-4e66-bd68-569dfc04710c</name>
-          <tableName>AB_ATTRIBUTE</tableName>
-          <primaryKey>AB_ATTRIBUTEID</primaryKey>
-          <isUIDTable v="true" />
-        </linkInformation>
-      </linkInformation>
-      <recordFieldMappings>
-        <dbRecordFieldMapping>
-          <name>AB_ATTRIBUTEID.value</name>
-          <recordfield>AB_ATTRIBUTE.AB_ATTRIBUTEID</recordfield>
-        </dbRecordFieldMapping>
-        <dbRecordFieldMapping>
-          <name>ATTRIBUTE_PARENT_ID.value</name>
-          <recordfield>AB_ATTRIBUTE.ATTRIBUTE_PARENT_ID</recordfield>
-        </dbRecordFieldMapping>
-        <dbRecordFieldMapping>
-          <name>ATTRIBUTE_TYPE.value</name>
-          <recordfield>AB_ATTRIBUTE.ATTRIBUTE_TYPE</recordfield>
-        </dbRecordFieldMapping>
-        <dbRecordFieldMapping>
-          <name>ATTRIBUTE_ACTIVE.value</name>
-          <recordfield>AB_ATTRIBUTE.ATTRIBUTE_ACTIVE</recordfield>
-        </dbRecordFieldMapping>
-        <dbRecordFieldMapping>
-          <name>ATTRIBUTE_TYPE.displayValue</name>
-          <expression>%aditoprj%/entity/Attribute_entity/recordcontainers/db/recordfieldmappings/attribute_type.displayvalue/expression.js</expression>
-        </dbRecordFieldMapping>
-        <dbRecordFieldMapping>
-          <name>ATTRIBUTE_NAME.value</name>
-          <recordfield>AB_ATTRIBUTE.ATTRIBUTE_NAME</recordfield>
-        </dbRecordFieldMapping>
-        <dbRecordFieldMapping>
-          <name>ATTRIBUTE_LEVEL.value</name>
-          <recordfield>AB_ATTRIBUTE.ATTRIBUTE_LEVEL</recordfield>
-        </dbRecordFieldMapping>
-        <dbRecordFieldMapping>
-          <name>KEYWORD_CONTAINER.value</name>
-          <recordfield>AB_ATTRIBUTE.KEYWORD_CONTAINER</recordfield>
-        </dbRecordFieldMapping>
-      </recordFieldMappings>
-    </dbRecordContainer>
+    <jDitoRecordContainer>
+      <name>jdito</name>
+      <jDitoRecordAlias>Data_alias</jDitoRecordAlias>
+      <contentProcess>%aditoprj%/entity/Attribute_entity/recordcontainers/jdito/contentProcess.js</contentProcess>
+      <onInsert>%aditoprj%/entity/Attribute_entity/recordcontainers/jdito/onInsert.js</onInsert>
+      <onUpdate>%aditoprj%/entity/Attribute_entity/recordcontainers/jdito/onUpdate.js</onUpdate>
+      <onDelete>%aditoprj%/entity/Attribute_entity/recordcontainers/jdito/onDelete.js</onDelete>
+      <recordFields>
+        <element>UID.value</element>
+        <element>AB_ATTRIBUTEID.value</element>
+        <element>ATTRIBUTE_ACTIVE.value</element>
+        <element>ATTRIBUTE_NAME.value</element>
+        <element>ATTRIBUTE_PARENT_ID.value</element>
+        <element>ATTRIBUTE_TYPE.value</element>
+        <element>ATTRIBUTE_TYPE.displayValue</element>
+        <element>KEYWORD_CONTAINER.value</element>
+      </recordFields>
+    </jDitoRecordContainer>
   </recordContainers>
 </entity>
diff --git a/entity/Attribute_entity/entityfields/attribute_level/valueProcess.js b/entity/Attribute_entity/entityfields/attribute_level/valueProcess.js
deleted file mode 100644
index e91a822698ae74d9b594ed31998920eb6f639c74..0000000000000000000000000000000000000000
--- a/entity/Attribute_entity/entityfields/attribute_level/valueProcess.js
+++ /dev/null
@@ -1,16 +0,0 @@
-import("system.db");
-import("system.neon");
-import("system.result");
-import("system.vars");
-import("Sql_lib");
-
-if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW || vars.get("$sys.recordstate") == neon.OPERATINGSTATE_EDIT)
-    if (vars.get("$field.ATTRIBUTE_PARENT_ID") != "")
-    {
-        var level = db.cell(SqlCondition.begin()
-            .andPrepare("AB_ATTRIBUTE.AB_ATTRIBUTEID", vars.get("$field.ATTRIBUTE_PARENT_ID"))
-            .buildSql("select ATTRIBUTE_LEVEL from AB_ATTRIBUTE"));
-        result.string(parseInt(level) + 1);
-    }
-    else
-        result.string("0");
diff --git a/entity/Attribute_entity/entityfields/name_with_type/valueProcess.js b/entity/Attribute_entity/entityfields/name_with_type/valueProcess.js
index d14e07a8442ddff79c9c39b211cd7bd25024f153..747a495cf7bb42324c1fb691b2609eae4e6df7cf 100644
--- a/entity/Attribute_entity/entityfields/name_with_type/valueProcess.js
+++ b/entity/Attribute_entity/entityfields/name_with_type/valueProcess.js
@@ -1,12 +1,9 @@
-import("system.translate");
-import("system.result");
-import("system.vars");
-import("Attribute_lib");
-import("Keyword_lib");
-import("KeywordRegistry_basic")
-
-var name = vars.get("$field.ATTRIBUTE_NAME");
-var type = vars.get("$field.ATTRIBUTE_TYPE");
-if (type.trim() != $AttributeTypes.COMBOVALUE)
-    name += " (" + translate.text("Type") + ": " + KeywordUtils.getViewValue($KeywordRegistry.attributeType(), type) + ")";
+import("system.translate");
+import("system.result");
+import("system.vars");
+import("Attribute_lib");
+
+var name = vars.get("$field.ATTRIBUTE_NAME");
+if (vars.get("$field.ATTRIBUTE_TYPE").trim() != $AttributeTypes.COMBOVALUE)
+    name += " (" + translate.text("Type") + ": " + vars.get("$field.ATTRIBUTE_TYPE.displayValue") + ")";
 result.string(name);
\ No newline at end of file
diff --git a/entity/Attribute_entity/recordcontainers/db/conditionProcess.js b/entity/Attribute_entity/recordcontainers/db/conditionProcess.js
deleted file mode 100644
index ed323a5c82da868f9b3ae4deafd54ad035520109..0000000000000000000000000000000000000000
--- a/entity/Attribute_entity/recordcontainers/db/conditionProcess.js
+++ /dev/null
@@ -1,46 +0,0 @@
-import("system.db");
-import("system.vars");
-import("system.result");
-import("Sql_lib");
-import("Attribute_lib");
-
-var condition = "1 = 2";
-
-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 (getGroups)
-{
-    //this is for the selection of the superordinate attribute, this condition
-    //filters out the own id and the children to prevent loops
-    condition = db.translateCondition(SqlCondition.begin()
-        .andPrepare("AB_ATTRIBUTE.ATTRIBUTE_TYPE", $AttributeTypes.GROUP)
-        .andPrepareVars("AB_ATTRIBUTE.AB_ATTRIBUTEID", "$param.AttrParentId_param", "# != ?")
-        .and("AB_ATTRIBUTE.AB_ATTRIBUTEID not in ('" + AttributeUtil.getAllChildren(vars.getString("$param.AttrParentId_param")).join("','") + "')")
-        .build());
-}
-else if (objectType)  //if there's an objectType, it comes from the AttributeRelation entity
-{
-    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 = "AB_ATTRIBUTE.AB_ATTRIBUTEID in ('" + ids.join("','") + "')";
-} 
-else 
-{
-    var type = vars.exists("$param.AttrParentType_param") && vars.get("$param.AttrParentType_param");
-    if (type == $AttributeTypes.COMBO)
-        condition = SqlCondition.begin()
-            .andPrepareVars("AB_ATTRIBUTE.ATTRIBUTE_PARENT_ID", "$param.AttrParentId_param")
-            .build();
-
-    var parentId = vars.exists("$param.AttrParentId_param") && vars.get("$param.AttrParentId_param");
-    if (parentId)
-        condition = "AB_ATTRIBUTE.AB_ATTRIBUTEID in ('" + AttributeUtil.getAllChildren(vars.getString("$param.AttrParentId_param")).join("','") + "')";
-    else if (!type)
-        condition = "";
-    
-}
-
-result.string(condition);
diff --git a/entity/Attribute_entity/recordcontainers/db/onDBDelete.js b/entity/Attribute_entity/recordcontainers/db/onDBDelete.js
deleted file mode 100644
index 7d1eb8b477436101b8cacb2fa7aa00241708adae..0000000000000000000000000000000000000000
--- a/entity/Attribute_entity/recordcontainers/db/onDBDelete.js
+++ /dev/null
@@ -1,29 +0,0 @@
-import("system.vars");
-import("system.db");
-import("Sql_lib");
-import("Attribute_lib");
-
-var attributeId = vars.get("$field.AB_ATTRIBUTEID");
-
-var childIds = AttributeUtil.getAllChildren(attributeId).concat(attributeId);
-
-var condition = SqlCondition.begin()
-    .and("AB_ATTRIBUTEUSAGE.AB_ATTRIBUTE_ID in ('" + childIds.join("','") + "')")
-    .build();
-
-//delete all entries in AB_ATTRIBUTEUSAGE belonging to the attribute to avoid unrelated entries
-db.deleteData("AB_ATTRIBUTEUSAGE", condition);
-
-condition = SqlCondition.begin()
-    .and("AB_ATTRIBUTERELATION.AB_ATTRIBUTE_ID in ('" + childIds.join("','") + "')")
-    .build();
-
-//delete all entries in AB_ATTRIBUTERELATION for the attributes
-db.deleteData("AB_ATTRIBUTERELATION", condition);
-
-condition = SqlCondition.begin()
-    .and("AB_ATTRIBUTE.AB_ATTRIBUTEID in ('" + childIds.join("','") + "')")
-    .build();
-
-//delete all attribute children
-db.deleteData("AB_ATTRIBUTE", condition);
diff --git a/entity/Attribute_entity/recordcontainers/db/onDBUpdate.js b/entity/Attribute_entity/recordcontainers/db/onDBUpdate.js
deleted file mode 100644
index 38704929f969ef673a7fafd41ac71a1fa2c05282..0000000000000000000000000000000000000000
--- a/entity/Attribute_entity/recordcontainers/db/onDBUpdate.js
+++ /dev/null
@@ -1,27 +0,0 @@
-import("system.db");
-import("system.neon");
-import("system.vars");
-import("Attribute_lib");
-
-var level = parseInt(vars.get("$field.ATTRIBUTE_LEVEL"));
-
-var table = "AB_ATTRIBUTE";
-var columns = ["ATTRIBUTE_LEVEL"];
-var types = db.getColumnTypes(table, columns);
-var toUpdate = [];
-
-var attributes = [vars.get("$field.AB_ATTRIBUTEID")];
-while (attributes.length > 0)
-{
-    var condition = SqlCondition.begin()
-        .and("AB_ATTRIBUTE.ATTRIBUTE_PARENT_ID in ('" + attributes.join("','") + "')");
-
-    toUpdate.push([table, columns, types, [String(++level)], condition.build()]);
-
-    attributes = db.array(db.COLUMN, SqlCondition.begin()
-        .and("AB_ATTRIBUTE.ATTRIBUTE_PARENT_ID in ('" + attributes.join("','") + "')")
-        .buildSql("select AB_ATTRIBUTEID from AB_ATTRIBUTE")
-    );
-}
-
-db.updates(toUpdate);
diff --git a/entity/Attribute_entity/recordcontainers/db/orderClauseProcess.js b/entity/Attribute_entity/recordcontainers/db/orderClauseProcess.js
deleted file mode 100644
index 003688a8bb9231d8f68eada88a41012db8d2ac2c..0000000000000000000000000000000000000000
--- a/entity/Attribute_entity/recordcontainers/db/orderClauseProcess.js
+++ /dev/null
@@ -1,6 +0,0 @@
-import("system.db");
-import("system.result");
-result.object({
-    "AB_ATTRIBUTE.ATTRIBUTE_LEVEL" : db.ASCENDING,
-    "AB_ATTRIBUTE.ATTRIBUTE_NAME" : db.ASCENDING
-});
\ No newline at end of file
diff --git a/entity/Attribute_entity/recordcontainers/db/recordfieldmappings/attribute_type.displayvalue/expression.js b/entity/Attribute_entity/recordcontainers/db/recordfieldmappings/attribute_type.displayvalue/expression.js
deleted file mode 100644
index 70d91a13284d4fe84c3ac11898f9818d944f46a2..0000000000000000000000000000000000000000
--- a/entity/Attribute_entity/recordcontainers/db/recordfieldmappings/attribute_type.displayvalue/expression.js
+++ /dev/null
@@ -1,6 +0,0 @@
-import("system.result");
-import("Keyword_lib");
-import("KeywordRegistry_basic");
-
-var sql = KeywordUtils.getResolvedTitleSqlPart($KeywordRegistry.attributeType(), "AB_ATTRIBUTE.ATTRIBUTE_TYPE");
-result.string(sql);
\ No newline at end of file
diff --git a/entity/Communication_entity/recordcontainers/db/onDBUpdate.js b/entity/Communication_entity/recordcontainers/db/onDBUpdate.js
index 7e2690d20ab6fcf371c1b12e9e4fa2f4e8a7ef39..30d791c0aa3c8923654612982f95153d38605fca 100644
--- a/entity/Communication_entity/recordcontainers/db/onDBUpdate.js
+++ b/entity/Communication_entity/recordcontainers/db/onDBUpdate.js
@@ -1,4 +1,3 @@
-import("system.logging");
 import("system.vars");
 import("StandardObject_lib");
 
diff --git a/entity/Contact_entity/entityfields/address_id/valueProcess.js b/entity/Contact_entity/entityfields/address_id/valueProcess.js
index d1d6810b0429c11c9c2a96791677caa7d557f9e8..0ddd690f6cc1711705c2243205b1483a84da6fc8 100644
--- a/entity/Contact_entity/entityfields/address_id/valueProcess.js
+++ b/entity/Contact_entity/entityfields/address_id/valueProcess.js
@@ -1,4 +1,3 @@
-import("system.logging");
 import("system.result");
 import("system.vars");
 import("StandardObject_lib");
diff --git a/entity/Context_entity/Context_entity.aod b/entity/Context_entity/Context_entity.aod
index df505cf73583fb1a97566a887270b53c34be8595..ae0b115f7aeb9e8496d700685ebd2bf01c2271c8 100644
--- a/entity/Context_entity/Context_entity.aod
+++ b/entity/Context_entity/Context_entity.aod
@@ -10,12 +10,6 @@
       <name>#PROVIDER</name>
       <recordContainer>jdito</recordContainer>
       <dependencies>
-        <entityDependency>
-          <name>fcccd077-46c9-4d57-9d9f-27915e40dbce</name>
-          <entityName>ObjectRelation_entity</entityName>
-          <fieldName>Context</fieldName>
-          <isConsumer v="false" />
-        </entityDependency>
         <entityDependency>
           <name>37559258-24f1-4c8c-b462-23ddf8de4e1e</name>
           <entityName>AppointmentLink_entity</entityName>
diff --git a/entity/Contract_entity/entityfields/contractcode_display_fieldgroup/valueProcess.js b/entity/Contract_entity/entityfields/contractcode_display_fieldgroup/valueProcess.js
index 5739345823bc0b832b6e7814fc7b97291a9f599c..1abc4310f52f05ab4ad9bd7881bf102cdde2fc71 100644
--- a/entity/Contract_entity/entityfields/contractcode_display_fieldgroup/valueProcess.js
+++ b/entity/Contract_entity/entityfields/contractcode_display_fieldgroup/valueProcess.js
@@ -4,7 +4,7 @@ import("system.result");
 import("Keyword_lib");
 import("KeywordRegistry_basic");
 
-var contractType = KeywordUtils.getViewValue($KeywordRegistry.contractType(), vars.get("$field.CONTRACTTYPE"));
+var contractType = vars.getString("$field.CONTRACTTYPE.displayValue");
 var contractCode = vars.get("$field.CONTRACTCODE");
 
 result.string((contractType || translate.text("Contract")) + " " + contractCode);
\ No newline at end of file
diff --git a/entity/Contract_entity/entityfields/image/valueProcess.js b/entity/Contract_entity/entityfields/image/valueProcess.js
index 7d2a0e8c8f6947c8c57a61074628e05f4bb1d7a3..d27cd1b74c498362844ab909c344a4e59a08d389 100644
--- a/entity/Contract_entity/entityfields/image/valueProcess.js
+++ b/entity/Contract_entity/entityfields/image/valueProcess.js
@@ -1,6 +1,4 @@
 import("system.vars");
 import("system.result");
-import("Keyword_lib");
-import("KeywordRegistry_basic");
 
-result.string("TEXT:" + KeywordUtils.getViewValue($KeywordRegistry.contractType(), vars.getString("$field.CONTRACTTYPE")) );
\ No newline at end of file
+result.string("TEXT:" + vars.getString("$field.CONTRACTTYPE.displayValue"));
\ No newline at end of file
diff --git a/entity/Countries_Entity/entityfields/flag/valueProcess.js b/entity/Countries_Entity/entityfields/flag/valueProcess.js
index d0b6d84cce31272ed67c38bf7da65fcfee34abae..d0ca80ab822ee9e0812b9d160ceeac1a6e62fd5c 100644
--- a/entity/Countries_Entity/entityfields/flag/valueProcess.js
+++ b/entity/Countries_Entity/entityfields/flag/valueProcess.js
@@ -2,6 +2,6 @@ import("system.vars");
 import("system.result");
 
 var b64 = vars.get("$field.FLAG_RAW");//TODO !move flags from AB_COUNTRYINFO to binaries (asys_binaries for meta)
-var dataUri = "data:image/svg+xml;base64," + b64;
+var dataUri = "data:image/svg+xml;base64," + b64;//TODO: currently workaround to get SVGs running
 
 result.string("URL:" + dataUri);
\ No newline at end of file
diff --git a/entity/Document_entity/Document_entity.aod b/entity/Document_entity/Document_entity.aod
index cc14877d0f62f3d79739e5988419cfe5dee5fbe3..172115bc01b310b95503e7794baa03ebf85fe85d 100644
--- a/entity/Document_entity/Document_entity.aod
+++ b/entity/Document_entity/Document_entity.aod
@@ -96,6 +96,11 @@
       <name>DESCRIPTION</name>
       <title>Beschreibung</title>
       <contentType>LONG_TEXT</contentType>
+      <onValueChangeTypes>
+        <element>MASK</element>
+        <element>PROCESS</element>
+        <element>PROCESS_SETVALUE</element>
+      </onValueChangeTypes>
     </entityField>
     <entityField>
       <name>KEYWORD</name>
diff --git a/entity/Document_entity/recordcontainers/jdito/contentProcess.js b/entity/Document_entity/recordcontainers/jdito/contentProcess.js
index ccee9b0372c42613f4f3fb78de22b7bfff755ef9..d58680419fb0222dbafbccafa1e60bb03cce7c8a 100644
--- a/entity/Document_entity/recordcontainers/jdito/contentProcess.js
+++ b/entity/Document_entity/recordcontainers/jdito/contentProcess.js
@@ -1,4 +1,3 @@
-import("system.logging");
 import("system.vars");
 import("system.result");
 import("system.db");
diff --git a/entity/KeywordEntry_entity/KeywordEntry_entity.aod b/entity/KeywordEntry_entity/KeywordEntry_entity.aod
index 3c8458d4e012e9b23427b7f7c9214c647d75e491..d507d0d138a404daf59354d1e1a1beb40fe0da7c 100644
--- a/entity/KeywordEntry_entity/KeywordEntry_entity.aod
+++ b/entity/KeywordEntry_entity/KeywordEntry_entity.aod
@@ -367,6 +367,12 @@
           <fieldName>KeywordContactStates</fieldName>
           <isConsumer v="false" />
         </entityDependency>
+        <entityDependency>
+          <name>740a9696-d394-48ea-bcbf-a5484a093bde</name>
+          <entityName>SalesprojectMilestone_entity</entityName>
+          <fieldName>Keywords</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
       </dependencies>
       <children>
         <entityParameter>
diff --git a/entity/ObjectRelationType_entity/ObjectRelationType_entity.aod b/entity/ObjectRelationType_entity/ObjectRelationType_entity.aod
index ad564c0c7354b4692adc0ef11ff6983f5ebd06d2..317e4db13fb31047f0a6817205dedc0e5ec93dd6 100644
--- a/entity/ObjectRelationType_entity/ObjectRelationType_entity.aod
+++ b/entity/ObjectRelationType_entity/ObjectRelationType_entity.aod
@@ -1,6 +1,7 @@
 <?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.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.1">
   <name>ObjectRelationType_entity</name>
+  <title>Relation type</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <icon>VAADIN:SPLIT</icon>
   <titleProcess>%aditoprj%/entity/ObjectRelationType_entity/titleProcess.js</titleProcess>
@@ -8,14 +9,6 @@
   <entityFields>
     <entityProvider>
       <name>#PROVIDER</name>
-      <dependencies>
-        <entityDependency>
-          <name>e66086ed-667b-4270-9ffb-ccb41e894ac3</name>
-          <entityName>ObjectRelation_entity</entityName>
-          <fieldName>ObjectRelationTypes</fieldName>
-          <isConsumer v="false" />
-        </entityDependency>
-      </dependencies>
     </entityProvider>
     <entityField>
       <name>UID</name>
@@ -80,6 +73,8 @@
       <name>DEST_OBJECT_TYPE</name>
       <title>Context 2</title>
       <consumer>Contexts</consumer>
+      <mandatoryProcess>%aditoprj%/entity/ObjectRelationType_entity/entityfields/dest_object_type/mandatoryProcess.js</mandatoryProcess>
+      <stateProcess>%aditoprj%/entity/ObjectRelationType_entity/entityfields/dest_object_type/stateProcess.js</stateProcess>
       <displayValueProcess>%aditoprj%/entity/ObjectRelationType_entity/entityfields/dest_object_type/displayValueProcess.js</displayValueProcess>
     </entityField>
     <entityField>
@@ -104,6 +99,8 @@
     <entityField>
       <name>DEST_RELATION_TITLE</name>
       <title>Relation type 2</title>
+      <mandatoryProcess>%aditoprj%/entity/ObjectRelationType_entity/entityfields/dest_relation_title/mandatoryProcess.js</mandatoryProcess>
+      <stateProcess>%aditoprj%/entity/ObjectRelationType_entity/entityfields/dest_relation_title/stateProcess.js</stateProcess>
       <displayValueProcess>%aditoprj%/entity/ObjectRelationType_entity/entityfields/dest_relation_title/displayValueProcess.js</displayValueProcess>
     </entityField>
     <entityConsumer>
@@ -122,6 +119,13 @@
       <onActionProcess>%aditoprj%/entity/ObjectRelationType_entity/entityfields/removeusage/onActionProcess.js</onActionProcess>
       <iconId>NEON:TRASH</iconId>
     </entityActionField>
+    <entityField>
+      <name>Type2Enabled_proxy</name>
+      <title>Enable relation type 2</title>
+      <contentType>BOOLEAN</contentType>
+      <possibleItemsProcess>%aditoprj%/entity/ObjectRelationType_entity/entityfields/type2enabled_proxy/possibleItemsProcess.js</possibleItemsProcess>
+      <valueProcess>%aditoprj%/entity/ObjectRelationType_entity/entityfields/type2enabled_proxy/valueProcess.js</valueProcess>
+    </entityField>
   </entityFields>
   <recordContainers>
     <jDitoRecordContainer>
@@ -144,6 +148,7 @@
         <element>SIDE.value</element>
         <element>DEST_OBJECTRELATIONTYPEID.value</element>
         <element>DEST_RELATION_TITLE.value</element>
+        <element>Type2Enabled_proxy.value</element>
       </recordFields>
     </jDitoRecordContainer>
   </recordContainers>
diff --git a/entity/ObjectRelationType_entity/entityfields/dest_object_type/displayValueProcess.js b/entity/ObjectRelationType_entity/entityfields/dest_object_type/displayValueProcess.js
index 4cee3b90ca1fb124959d0d75bdbbed6a728fac65..40aa4394b28d55270a839e0ead448446f78e8686 100644
--- a/entity/ObjectRelationType_entity/entityfields/dest_object_type/displayValueProcess.js
+++ b/entity/ObjectRelationType_entity/entityfields/dest_object_type/displayValueProcess.js
@@ -3,7 +3,7 @@ import("system.result");
 import("system.neon");
 import("system.vars");
 
-if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && !vars.get("$field.DEST_OBJECT_TYPE")) {
+if(!vars.get("$field.DEST_OBJECT_TYPE")) {
     result.string("");
 } else if (vars.exists("$field.DEST_OBJECT_TYPE") && vars.get("$field.DEST_OBJECT_TYPE")) {
     result.string(ContextUtils.getContext(vars.get("$field.DEST_OBJECT_TYPE"))[2]);
diff --git a/entity/ObjectRelationType_entity/entityfields/dest_object_type/mandatoryProcess.js b/entity/ObjectRelationType_entity/entityfields/dest_object_type/mandatoryProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..5f8ceb31ad2d7152f52576f7f0e520061d1ebc04
--- /dev/null
+++ b/entity/ObjectRelationType_entity/entityfields/dest_object_type/mandatoryProcess.js
@@ -0,0 +1,4 @@
+import("system.vars");
+import("system.result");
+
+result.string(vars.getString("$field.Type2Enabled_proxy") == "1")
\ No newline at end of file
diff --git a/entity/ObjectRelationType_entity/entityfields/dest_object_type/stateProcess.js b/entity/ObjectRelationType_entity/entityfields/dest_object_type/stateProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..74da791552b4d4a7ea1b5064319c589d9f3bea38
--- /dev/null
+++ b/entity/ObjectRelationType_entity/entityfields/dest_object_type/stateProcess.js
@@ -0,0 +1,12 @@
+import("system.vars");
+import("system.result");
+import("system.neon");
+
+if (vars.getString("$field.Type2Enabled_proxy") == "0")
+{
+    result.string(neon.COMPONENTSTATE_DISABLED);
+}
+else
+{
+    result.string(neon.COMPONENTSTATE_EDITABLE);
+}
\ No newline at end of file
diff --git a/entity/ObjectRelationType_entity/entityfields/dest_relation_title/mandatoryProcess.js b/entity/ObjectRelationType_entity/entityfields/dest_relation_title/mandatoryProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..0151ae8326830dccf8b5aebcb65d476182b113c7
--- /dev/null
+++ b/entity/ObjectRelationType_entity/entityfields/dest_relation_title/mandatoryProcess.js
@@ -0,0 +1,4 @@
+import("system.vars");
+import("system.result");
+
+result.string(vars.getString("$field.Type2Enabled_proxy") == "1");
\ No newline at end of file
diff --git a/entity/ObjectRelationType_entity/entityfields/dest_relation_title/stateProcess.js b/entity/ObjectRelationType_entity/entityfields/dest_relation_title/stateProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..74da791552b4d4a7ea1b5064319c589d9f3bea38
--- /dev/null
+++ b/entity/ObjectRelationType_entity/entityfields/dest_relation_title/stateProcess.js
@@ -0,0 +1,12 @@
+import("system.vars");
+import("system.result");
+import("system.neon");
+
+if (vars.getString("$field.Type2Enabled_proxy") == "0")
+{
+    result.string(neon.COMPONENTSTATE_DISABLED);
+}
+else
+{
+    result.string(neon.COMPONENTSTATE_EDITABLE);
+}
\ No newline at end of file
diff --git a/entity/ObjectRelationType_entity/entityfields/type2enabled_proxy/possibleItemsProcess.js b/entity/ObjectRelationType_entity/entityfields/type2enabled_proxy/possibleItemsProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..b88d5392d1a40aa827f90e9dfcdd26303c4b1baa
--- /dev/null
+++ b/entity/ObjectRelationType_entity/entityfields/type2enabled_proxy/possibleItemsProcess.js
@@ -0,0 +1,7 @@
+import("system.translate");
+import("system.result");
+
+result.object([
+     ["1", translate.text("Yes")]
+    ,["0", translate.text("No")]
+]);
\ No newline at end of file
diff --git a/entity/ObjectRelationType_entity/entityfields/type2enabled_proxy/valueProcess.js b/entity/ObjectRelationType_entity/entityfields/type2enabled_proxy/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..ee7b68c6f9c712c45af6a147dc23c15d9bc7b1ec
--- /dev/null
+++ b/entity/ObjectRelationType_entity/entityfields/type2enabled_proxy/valueProcess.js
@@ -0,0 +1,5 @@
+import("system.vars");
+import("system.result");
+
+if (!vars.get("$field.Type2Enabled_proxy"))
+    result.string(vars.get("$field.DIRECTION") == "same" ? 0 : 1);
\ No newline at end of file
diff --git a/entity/ObjectRelationType_entity/recordcontainers/jdito/contentProcess.js b/entity/ObjectRelationType_entity/recordcontainers/jdito/contentProcess.js
index 698419fadb815a40dc6bea058c6e873183f6881f..e3b5147b2a0d188cc8121b65f5748eb67200edf7 100644
--- a/entity/ObjectRelationType_entity/recordcontainers/jdito/contentProcess.js
+++ b/entity/ObjectRelationType_entity/recordcontainers/jdito/contentProcess.js
@@ -4,9 +4,9 @@ import("ObjectRelation_lib");
 
 if (vars.exists("$local.idvalues") && vars.get("$local.idvalues"))
 {
-    result.object([ObjectRelationUtils.getRelationType(vars.get("$local.idvalues")[0])]);
+    result.object([ObjectRelationUtils.getRelationType(vars.get("$local.idvalues")[0], true)]);
 }
 else
 {
-    result.object(ObjectRelationUtils.getPossibleRelationTypes(vars.get("$param.SourceObjectType_param"), true, vars.get("$param.OnlyFirstSide_param") == "1"));
+    result.object(ObjectRelationUtils.getPossibleRelationTypes(vars.get("$param.SourceObjectType_param"), true, vars.get("$param.OnlyFirstSide_param") == "1", undefined, true));
 }
\ No newline at end of file
diff --git a/entity/ObjectRelationType_entity/recordcontainers/jdito/onDelete.js b/entity/ObjectRelationType_entity/recordcontainers/jdito/onDelete.js
index 0c99d246e9ad41792904cece09329cdc6157d746..be2ad9cda09046be0972a65a678891217fa62039 100644
--- a/entity/ObjectRelationType_entity/recordcontainers/jdito/onDelete.js
+++ b/entity/ObjectRelationType_entity/recordcontainers/jdito/onDelete.js
@@ -1,4 +1,3 @@
-import("system.logging");
 import("system.vars");
 import("system.db");
 import("system.translate");
diff --git a/entity/ObjectRelationType_entity/recordcontainers/jdito/onInsert.js b/entity/ObjectRelationType_entity/recordcontainers/jdito/onInsert.js
index b9f87162f4bbcf88c0a2b17e83a581a51d7c9572..9c7155c513a43eef2afadf630ee6b6ef12bad3c9 100644
--- a/entity/ObjectRelationType_entity/recordcontainers/jdito/onInsert.js
+++ b/entity/ObjectRelationType_entity/recordcontainers/jdito/onInsert.js
@@ -22,8 +22,9 @@ db.insertData("AB_OBJECTRELATIONTYPE", [
     vars.get("$field.HIERARCHY")
 ]);
 
-if ((vars.get("$field.SOURCE_RELATION_TITLE") != vars.get("$field.DEST_RELATION_TITLE") || vars.get("$field.SOURCE_OBJECT_TYPE") != vars.get("$field.DEST_OBJECT_TYPE"))
-    && vars.get("$field.DEST_OBJECT_TYPE") && vars.get("$field.DEST_RELATION_TITLE"))
+if (vars.getString("$field.Type2Enabled_proxy") == "1" 
+    && (vars.get("$field.SOURCE_RELATION_TITLE") != vars.get("$field.DEST_RELATION_TITLE") 
+    && vars.get("$field.SOURCE_OBJECT_TYPE") != vars.get("$field.DEST_OBJECT_TYPE")))
 {
     db.insertData("AB_OBJECTRELATIONTYPE", [
         "AB_OBJECTRELATIONTYPEID",
diff --git a/entity/ObjectRelationType_entity/recordcontainers/jdito/onUpdate.js b/entity/ObjectRelationType_entity/recordcontainers/jdito/onUpdate.js
index bca1f7d3477c66f2d713e61a358243f41349aafb..e31eccf005c475e5c3fe863126e88a523f991a8f 100644
--- a/entity/ObjectRelationType_entity/recordcontainers/jdito/onUpdate.js
+++ b/entity/ObjectRelationType_entity/recordcontainers/jdito/onUpdate.js
@@ -1,3 +1,4 @@
+import("Entity_lib");
 import("system.util");
 import("Sql_lib");
 import("system.db");
@@ -25,6 +26,8 @@ if (usageCount <= 0)
             case "DEST":
                 type2Fields[fieldName.replace("DEST_", "")] = vars.get("$field." + fieldName);
                 break;
+            case "Type2Enabled":
+                break;
             default:
                 type1Fields[fieldName] = vars.get("$field." + fieldName);
                 type2Fields[fieldName] = vars.get("$field." + fieldName);
@@ -32,16 +35,20 @@ if (usageCount <= 0)
     });
 
     var updates = [];
-    var type1Cond = SqlCondition.begin().andPrepareVars("AB_OBJECTRELATIONTYPE.AB_OBJECTRELATIONTYPEID", "$field.UID").build("1=2");
-    var type2Cond = SqlCondition.begin().andPrepareVars("AB_OBJECTRELATIONTYPE.AB_OBJECTRELATIONTYPEID", "$field.DEST_OBJECTRELATIONTYPEID").build("1=2");
+    var type1Cond = SqlCondition.begin().andPrepare("AB_OBJECTRELATIONTYPE.RELATION_TYPE", vars.get("$field.RELATION_TYPE"))
+                                        .andPrepare("AB_OBJECTRELATIONTYPE.SIDE", "1").build("1=2");
+    var type2Cond = SqlCondition.begin().andPrepare("AB_OBJECTRELATIONTYPE.RELATION_TYPE", vars.get("$field.RELATION_TYPE"))
+                                        .andPrepare("AB_OBJECTRELATIONTYPE.SIDE", "2").build("1=2");
 
     for (let field in type1Fields) {
         updates.push(["AB_OBJECTRELATIONTYPE", [field], null, [type1Fields[field]], type1Cond]);
     }
 
+    var type2Enabled = vars.getString("$field.Type2Enabled_proxy");
+    
     // delete, if type2  is empty -> convert it to a "same"-type
-    if ((vars.get("$field.SOURCE_RELATION_TITLE") == vars.get("$field.DEST_RELATION_TITLE") && vars.get("$field.SOURCE_OBJECT_TYPE") == vars.get("$field.DEST_OBJECT_TYPE"))
-        || !vars.get("$field.DEST_OBJECT_TYPE") && !vars.get("$field.DEST_RELATION_TITLE"))
+    if (type2Enabled == "0" || ((vars.get("$field.SOURCE_RELATION_TITLE") == vars.get("$field.DEST_RELATION_TITLE") && vars.get("$field.SOURCE_OBJECT_TYPE") == vars.get("$field.DEST_OBJECT_TYPE"))
+        || !vars.get("$field.DEST_OBJECT_TYPE") && !vars.get("$field.DEST_RELATION_TITLE")))
     {
         db.deleteData("AB_OBJECTRELATIONTYPE", type2Cond);
     }
diff --git a/entity/ObjectRelation_entity/ObjectRelation_entity.aod b/entity/ObjectRelation_entity/ObjectRelation_entity.aod
deleted file mode 100644
index 1a3854b6597d50888dbbfb4f9735a17f94265763..0000000000000000000000000000000000000000
--- a/entity/ObjectRelation_entity/ObjectRelation_entity.aod
+++ /dev/null
@@ -1,227 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.1">
-  <name>ObjectRelation_entity</name>
-  <majorModelMode>DISTRIBUTED</majorModelMode>
-  <documentation>%aditoprj%/entity/ObjectRelation_entity/documentation.adoc</documentation>
-  <recordContainer>db</recordContainer>
-  <entityFields>
-    <entityProvider>
-      <name>#PROVIDER</name>
-      <recordContainer>db</recordContainer>
-      <dependencies>
-        <entityDependency>
-          <name>6789c40b-d70b-4133-af1d-40cbf548d460</name>
-          <entityName>Organisation_entity</entityName>
-          <fieldName>ObjectRelations</fieldName>
-          <isConsumer v="false" />
-        </entityDependency>
-      </dependencies>
-    </entityProvider>
-    <entityField>
-      <name>AB_OBJECTRELATIONTYPE1</name>
-      <title>Type 1</title>
-      <mandatory v="true" />
-    </entityField>
-    <entityField>
-      <name>OBJECT1_ROWID</name>
-      <title>Object 1</title>
-      <mandatory v="true" />
-    </entityField>
-    <entityField>
-      <name>AB_OBJECTRELATIONID</name>
-      <valueProcess>%aditoprj%/entity/ObjectRelation_entity/entityfields/ab_objectrelationid/valueProcess.js</valueProcess>
-    </entityField>
-    <entityField>
-      <name>OBJECT2_ROWID</name>
-      <title>Object 2</title>
-      <mandatory v="true" />
-      <titleProcess>%aditoprj%/entity/ObjectRelation_entity/entityfields/object2_rowid/titleProcess.js</titleProcess>
-    </entityField>
-    <entityField>
-      <name>AB_OBJECTRELATIONTYPE2</name>
-      <title>Type 2</title>
-      <mandatory v="true" />
-    </entityField>
-    <entityConsumer>
-      <name>Contexts</name>
-      <fieldType>DEPENDENCY_OUT</fieldType>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Context_entity</entityName>
-        <fieldName>#PROVIDER</fieldName>
-      </dependency>
-    </entityConsumer>
-    <entityConsumer>
-      <name>Objects</name>
-      <fieldType>DEPENDENCY_OUT</fieldType>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Object_entity</entityName>
-        <fieldName>AllObjects</fieldName>
-      </dependency>
-      <children>
-        <entityParameter>
-          <name>ObjectType_param</name>
-          <valueProcess>%aditoprj%/entity/ObjectRelation_entity/entityfields/objects/children/objecttype_param/valueProcess.js</valueProcess>
-          <triggerRecalculation v="true" />
-        </entityParameter>
-      </children>
-    </entityConsumer>
-    <entityProvider>
-      <name>ObjectRelations</name>
-      <fieldType>DEPENDENCY_IN</fieldType>
-      <targetContextField>objectTypeProxy</targetContextField>
-      <targetIdField>rowIdProxy</targetIdField>
-      <recordContainer>db</recordContainer>
-      <dependencies>
-        <entityDependency>
-          <name>30a7c954-3127-4ceb-9838-a0b7b55d0c8c</name>
-          <entityName>Person_entity</entityName>
-          <fieldName>ObjectRelations</fieldName>
-          <isConsumer v="false" />
-        </entityDependency>
-      </dependencies>
-      <children>
-        <entityParameter>
-          <name>ObjectRowid_param</name>
-          <expose v="true" />
-          <mandatory v="true" />
-        </entityParameter>
-        <entityParameter>
-          <name>ObjectType_param</name>
-          <expose v="true" />
-          <mandatory v="true" />
-        </entityParameter>
-      </children>
-    </entityProvider>
-    <entityConsumer>
-      <name>ObjectRelationTypes</name>
-      <fieldType>DEPENDENCY_OUT</fieldType>
-      <dependency>
-        <name>dependency</name>
-        <entityName>ObjectRelationType_entity</entityName>
-        <fieldName>#PROVIDER</fieldName>
-      </dependency>
-      <children>
-        <entityParameter>
-          <name>SourceObjectType_param</name>
-          <valueProcess>%aditoprj%/entity/ObjectRelation_entity/entityfields/objectrelationtypes/children/sourceobjecttype_param/valueProcess.js</valueProcess>
-          <triggerRecalculation v="true" />
-        </entityParameter>
-      </children>
-    </entityConsumer>
-    <entityParameter>
-      <name>ObjectType_param</name>
-      <expose v="true" />
-      <triggerRecalculation v="true" />
-      <mandatory v="true" />
-      <description>PARAMETER</description>
-    </entityParameter>
-    <entityParameter>
-      <name>ObjectRowid_param</name>
-      <expose v="true" />
-      <triggerRecalculation v="true" />
-      <mandatory v="true" />
-      <description>PARAMETER</description>
-    </entityParameter>
-    <entityField>
-      <name>selectedObjectRelationTypeIdProxy</name>
-      <title>Relationtype</title>
-      <possibleItemsProcess>%aditoprj%/entity/ObjectRelation_entity/entityfields/selectedobjectrelationtypeidproxy/possibleItemsProcess.js</possibleItemsProcess>
-      <valueProcess>%aditoprj%/entity/ObjectRelation_entity/entityfields/selectedobjectrelationtypeidproxy/valueProcess.js</valueProcess>
-      <onValueChange>%aditoprj%/entity/ObjectRelation_entity/entityfields/selectedobjectrelationtypeidproxy/onValueChange.js</onValueChange>
-    </entityField>
-    <entityField>
-      <name>relationTypeProxy</name>
-      <title>Relationtype</title>
-      <valueProcess>%aditoprj%/entity/ObjectRelation_entity/entityfields/relationtypeproxy/valueProcess.js</valueProcess>
-    </entityField>
-    <entityField>
-      <name>rowIdProxy</name>
-      <title>Object</title>
-      <consumer>Objects</consumer>
-      <linkedContextProcess>%aditoprj%/entity/ObjectRelation_entity/entityfields/rowidproxy/linkedContextProcess.js</linkedContextProcess>
-      <valueProcess>%aditoprj%/entity/ObjectRelation_entity/entityfields/rowidproxy/valueProcess.js</valueProcess>
-      <displayValueProcess>%aditoprj%/entity/ObjectRelation_entity/entityfields/rowidproxy/displayValueProcess.js</displayValueProcess>
-      <onValueChange>%aditoprj%/entity/ObjectRelation_entity/entityfields/rowidproxy/onValueChange.js</onValueChange>
-    </entityField>
-    <entityField>
-      <name>objectTypeProxy</name>
-      <title>Object type</title>
-      <valueProcess>%aditoprj%/entity/ObjectRelation_entity/entityfields/objecttypeproxy/valueProcess.js</valueProcess>
-    </entityField>
-    <entityField>
-      <name>mySide</name>
-      <description>Is always the side the current Object (from the parameters) is in the currently selected ObjectRelationType</description>
-    </entityField>
-    <entityField>
-      <name>OBJECT1_TYPE</name>
-    </entityField>
-    <entityField>
-      <name>OBJECT2_TYPE</name>
-    </entityField>
-    <entityField>
-      <name>INFO</name>
-      <title>Description</title>
-    </entityField>
-  </entityFields>
-  <recordContainers>
-    <dbRecordContainer>
-      <name>db</name>
-      <description>&lt;null value&gt;</description>
-      <alias>Data_alias</alias>
-      <fromClauseProcess>%aditoprj%/entity/ObjectRelation_entity/recordcontainers/db/fromClauseProcess.js</fromClauseProcess>
-      <conditionProcess>%aditoprj%/entity/ObjectRelation_entity/recordcontainers/db/conditionProcess.js</conditionProcess>
-      <linkInformation>
-        <linkInformation>
-          <name>e64669fe-3252-42b9-9b9b-56a2166d81b7</name>
-          <tableName>AB_OBJECTRELATION</tableName>
-          <primaryKey>AB_OBJECTRELATIONID</primaryKey>
-          <isUIDTable v="true" />
-          <readonly v="false" />
-        </linkInformation>
-        <linkInformation>
-          <name>2ff74f14-9e9c-458d-9100-1c2c9fb34b89</name>
-          <tableName>AB_OBJECTRELATIONTYPE</tableName>
-          <primaryKey>AB_OBJECTRELATIONTYPEID</primaryKey>
-          <isUIDTable v="false" />
-          <readonly v="true" />
-        </linkInformation>
-      </linkInformation>
-      <recordFieldMappings>
-        <dbRecordFieldMapping>
-          <name>AB_OBJECTRELATIONID.value</name>
-          <recordfield>AB_OBJECTRELATION.AB_OBJECTRELATIONID</recordfield>
-        </dbRecordFieldMapping>
-        <dbRecordFieldMapping>
-          <name>OBJECT1_ROWID.value</name>
-          <recordfield>AB_OBJECTRELATION.OBJECT1_ROWID</recordfield>
-        </dbRecordFieldMapping>
-        <dbRecordFieldMapping>
-          <name>OBJECT2_ROWID.value</name>
-          <recordfield>AB_OBJECTRELATION.OBJECT2_ROWID</recordfield>
-        </dbRecordFieldMapping>
-        <dbRecordFieldMapping>
-          <name>AB_OBJECTRELATIONTYPE1.value</name>
-          <recordfield>AB_OBJECTRELATION.AB_OBJECTRELATIONTYPE1</recordfield>
-        </dbRecordFieldMapping>
-        <dbRecordFieldMapping>
-          <name>AB_OBJECTRELATIONTYPE2.value</name>
-          <recordfield>AB_OBJECTRELATION.AB_OBJECTRELATIONTYPE2</recordfield>
-        </dbRecordFieldMapping>
-        <dbRecordFieldMapping>
-          <name>OBJECT2_TYPE.value</name>
-          <expression>%aditoprj%/entity/ObjectRelation_entity/recordcontainers/db/recordfieldmappings/object2_type.value/expression.js</expression>
-        </dbRecordFieldMapping>
-        <dbRecordFieldMapping>
-          <name>OBJECT1_TYPE.value</name>
-          <expression>%aditoprj%/entity/ObjectRelation_entity/recordcontainers/db/recordfieldmappings/object1_type.value/expression.js</expression>
-        </dbRecordFieldMapping>
-        <dbRecordFieldMapping>
-          <name>INFO.value</name>
-          <recordfield>AB_OBJECTRELATION.INFO</recordfield>
-        </dbRecordFieldMapping>
-      </recordFieldMappings>
-    </dbRecordContainer>
-  </recordContainers>
-</entity>
diff --git a/entity/ObjectRelation_entity/documentation.adoc b/entity/ObjectRelation_entity/documentation.adoc
deleted file mode 100644
index 687b98cb73cd11d9e6d6cbaf44457be3377ea0af..0000000000000000000000000000000000000000
--- a/entity/ObjectRelation_entity/documentation.adoc
+++ /dev/null
@@ -1,51 +0,0 @@
-Object Relation
-===============
-:toc2: left
-:numbered:
-
-(how it works currently 13.03.2019)
-
-== How the ObjectRelation_entity works ==
-The entity works with the AB_OBJECTRELATION and AB_OBJECTRELATIONTYPE db-tables.
-
-The AB_OBJECTRELATIONTYPE defines which relations are possible.
-It always defines one "side" of the relation. So for each relation you always need two of them and both have to be from the same RELATION_TYPE.
-
-So for example if you would like to have a relation between a child and parent you need these two types:
-
-----
-AB_OBJECTRELATIONTYPEID = UID_1 
-OBJECT_TYPE = Person 
-RELATION_TITLE = child of 
-RELATION_TYPE = TypeUID_1 
-SIDE = 1 
-
-and
-
-AB_OBJECTRELATIONTYPEID = UID_2 
-OBJECT_TYPE = Person 
-RELATION_TITLE = parent of 
-RELATION_TYPE = TypeUID_1 
-SIDE = 2 
-----
-
-Note that the RELATION_TYPE is the same.
-
-
-If you create a new relation between two persons it looks like this:
-
-----
-AB_OBJECTRELATIONID = RelUID_1
-OBJECT1_ROWID = UID_Lisa_Sommer
-OBJECT2_ROWID = UID_Franz_Mueller
-AB_OBJECTRELATIONTYPE1 = UID_1
-AB_OBJECTRELATIONTYPE2 = UID_2
-----
-
--> So:
-
-* Most relationtypes consist of two separate types connected by the RELATION_TYPE-id
-* Each type also has a SIDE, which defines, if it is for side 1 or side 2
-* If both sides are from the same type, then there is only one OBJECTRELATIONTYPE with the side 1 and Objects use the same one.
-
-The provider use the targetContext-feature to show the preview of the linked objects directly. (see targetContext-docu in the ohers/guide folder)
\ No newline at end of file
diff --git a/entity/ObjectRelation_entity/entityfields/ab_objectrelationid/valueProcess.js b/entity/ObjectRelation_entity/entityfields/ab_objectrelationid/valueProcess.js
deleted file mode 100644
index f6b9da922bcaccb0006690f599c1d3cee4d00c55..0000000000000000000000000000000000000000
--- a/entity/ObjectRelation_entity/entityfields/ab_objectrelationid/valueProcess.js
+++ /dev/null
@@ -1,7 +0,0 @@
-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/ObjectRelation_entity/entityfields/keywordobjectrelationtype/children/containername_param/valueProcess.js b/entity/ObjectRelation_entity/entityfields/keywordobjectrelationtype/children/containername_param/valueProcess.js
deleted file mode 100644
index 48379a6374dacddb9ccbcaa323c9a24e96e105c1..0000000000000000000000000000000000000000
--- a/entity/ObjectRelation_entity/entityfields/keywordobjectrelationtype/children/containername_param/valueProcess.js
+++ /dev/null
@@ -1,3 +0,0 @@
-import("system.result");
-
-result.string("ObjectRelationType");
\ No newline at end of file
diff --git a/entity/ObjectRelation_entity/entityfields/object2/children/objecttype_param/valueProcess.js b/entity/ObjectRelation_entity/entityfields/object2/children/objecttype_param/valueProcess.js
deleted file mode 100644
index e4c1084f9a07683a0ceaab1f42521b8a2819c3dc..0000000000000000000000000000000000000000
--- a/entity/ObjectRelation_entity/entityfields/object2/children/objecttype_param/valueProcess.js
+++ /dev/null
@@ -1,4 +0,0 @@
-import("system.vars");
-import("system.result");
-
-result.string(vars.get("$field.OBJECT2_TYPE"))
\ No newline at end of file
diff --git a/entity/ObjectRelation_entity/entityfields/object2_rowid/titleProcess.js b/entity/ObjectRelation_entity/entityfields/object2_rowid/titleProcess.js
deleted file mode 100644
index dc39a528c34c8e610d4f6f53ea6f83b98699f497..0000000000000000000000000000000000000000
--- a/entity/ObjectRelation_entity/entityfields/object2_rowid/titleProcess.js
+++ /dev/null
@@ -1,5 +0,0 @@
-import("system.translate");
-import("system.vars");
-import("system.result");
-import("Context_lib");
-result.string(vars.exists("$param.Object2RowidTitle_param") ? vars.get("$param.Object2RowidTitle_param") : "Object 2");
\ No newline at end of file
diff --git a/entity/ObjectRelation_entity/entityfields/objectrelations/children/providertype_param/valueProcess.js b/entity/ObjectRelation_entity/entityfields/objectrelations/children/providertype_param/valueProcess.js
deleted file mode 100644
index 4a2d2e1c96782b8407f30181246efb90a9efd35a..0000000000000000000000000000000000000000
--- a/entity/ObjectRelation_entity/entityfields/objectrelations/children/providertype_param/valueProcess.js
+++ /dev/null
@@ -1,3 +0,0 @@
-import("system.result");
-
-result.string("tree");
\ No newline at end of file
diff --git a/entity/ObjectRelation_entity/entityfields/objectrelationtypes/children/sourceobjecttype_param/valueProcess.js b/entity/ObjectRelation_entity/entityfields/objectrelationtypes/children/sourceobjecttype_param/valueProcess.js
deleted file mode 100644
index 1a0c474771a9e04dbe87f9ea547c2bd843ff4a25..0000000000000000000000000000000000000000
--- a/entity/ObjectRelation_entity/entityfields/objectrelationtypes/children/sourceobjecttype_param/valueProcess.js
+++ /dev/null
@@ -1,4 +0,0 @@
-import("system.vars");
-import("system.result");
-
-result.string(vars.get("$param.ObjectType_param"))
\ No newline at end of file
diff --git a/entity/ObjectRelation_entity/entityfields/objects/children/objecttype_param/valueProcess.js b/entity/ObjectRelation_entity/entityfields/objects/children/objecttype_param/valueProcess.js
deleted file mode 100644
index b1f7548ec5943881ae5b9fe74dc423635555f85b..0000000000000000000000000000000000000000
--- a/entity/ObjectRelation_entity/entityfields/objects/children/objecttype_param/valueProcess.js
+++ /dev/null
@@ -1,4 +0,0 @@
-import("system.vars");
-import("system.result");
-
-result.string(vars.get("$field.objectTypeProxy"))
\ No newline at end of file
diff --git a/entity/ObjectRelation_entity/entityfields/objects2/children/objecttype_param/valueProcess.js b/entity/ObjectRelation_entity/entityfields/objects2/children/objecttype_param/valueProcess.js
deleted file mode 100644
index e4c1084f9a07683a0ceaab1f42521b8a2819c3dc..0000000000000000000000000000000000000000
--- a/entity/ObjectRelation_entity/entityfields/objects2/children/objecttype_param/valueProcess.js
+++ /dev/null
@@ -1,4 +0,0 @@
-import("system.vars");
-import("system.result");
-
-result.string(vars.get("$field.OBJECT2_TYPE"))
\ No newline at end of file
diff --git a/entity/ObjectRelation_entity/entityfields/objecttree/children/providertype_param/code.js b/entity/ObjectRelation_entity/entityfields/objecttree/children/providertype_param/code.js
deleted file mode 100644
index 4a2d2e1c96782b8407f30181246efb90a9efd35a..0000000000000000000000000000000000000000
--- a/entity/ObjectRelation_entity/entityfields/objecttree/children/providertype_param/code.js
+++ /dev/null
@@ -1,3 +0,0 @@
-import("system.result");
-
-result.string("tree");
\ No newline at end of file
diff --git a/entity/ObjectRelation_entity/entityfields/objecttypeproxy/valueProcess.js b/entity/ObjectRelation_entity/entityfields/objecttypeproxy/valueProcess.js
deleted file mode 100644
index 463b2525125de2404ec16b3a17273df8d9851d6f..0000000000000000000000000000000000000000
--- a/entity/ObjectRelation_entity/entityfields/objecttypeproxy/valueProcess.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import("system.db");
-import("system.result");
-import("Sql_lib");
-
-result.string(db.cell(SqlCondition.begin()
-                    .andPrepareVars("AB_OBJECTRELATIONTYPE.AB_OBJECTRELATIONTYPEID", "$field.selectedObjectRelationTypeIdProxy")
-                    .buildSql("select OBJECT_TYPE from AB_OBJECTRELATIONTYPE", "1=2")));
diff --git a/entity/ObjectRelation_entity/entityfields/relationtypeproxy/valueProcess.js b/entity/ObjectRelation_entity/entityfields/relationtypeproxy/valueProcess.js
deleted file mode 100644
index 76668648c060b4a8d158cd2b655f142291ef25af..0000000000000000000000000000000000000000
--- a/entity/ObjectRelation_entity/entityfields/relationtypeproxy/valueProcess.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import("system.db");
-import("system.result");
-import("Sql_lib");
-
-result.string(db.cell(SqlCondition.begin()
-                    .andPrepareVars("AB_OBJECTRELATIONTYPE.AB_OBJECTRELATIONTYPEID", "$field.selectedObjectRelationTypeIdProxy")
-                    .buildSql("select RELATION_TYPE from AB_OBJECTRELATIONTYPE", "1=2")));
diff --git a/entity/ObjectRelation_entity/entityfields/rowidproxy/displayValueProcess.js b/entity/ObjectRelation_entity/entityfields/rowidproxy/displayValueProcess.js
deleted file mode 100644
index a93e4e38004f09f00e4a04b102371cf4e9877f46..0000000000000000000000000000000000000000
--- a/entity/ObjectRelation_entity/entityfields/rowidproxy/displayValueProcess.js
+++ /dev/null
@@ -1,6 +0,0 @@
-import("system.vars");
-import("system.db");
-import("system.result");
-import("Context_lib");
-
-result.string(db.cell(ContextUtils.getNameSql(vars.get("$field.objectTypeProxy"), vars.get("$field.rowIdProxy"))));
\ No newline at end of file
diff --git a/entity/ObjectRelation_entity/entityfields/rowidproxy/linkedContextProcess.js b/entity/ObjectRelation_entity/entityfields/rowidproxy/linkedContextProcess.js
deleted file mode 100644
index dbb069dff2b35c0d0d2ba499188d33a865aef84a..0000000000000000000000000000000000000000
--- a/entity/ObjectRelation_entity/entityfields/rowidproxy/linkedContextProcess.js
+++ /dev/null
@@ -1,3 +0,0 @@
-import("system.vars");
-import("system.result");
-result.string(vars.get("$field.objectTypeProxy"))
\ No newline at end of file
diff --git a/entity/ObjectRelation_entity/entityfields/rowidproxy/onValueChange.js b/entity/ObjectRelation_entity/entityfields/rowidproxy/onValueChange.js
deleted file mode 100644
index 33a17fadf00db3fb20aab978c0db6bdfc129d7dd..0000000000000000000000000000000000000000
--- a/entity/ObjectRelation_entity/entityfields/rowidproxy/onValueChange.js
+++ /dev/null
@@ -1,22 +0,0 @@
-import("system.neon");
-import("system.vars");
-import("Entity_lib");
-
-var selectedRowId = vars.exists("$field.rowIdProxy") ? vars.get("$field.rowIdProxy") : "";
-selectedRowId = ProcessHandlingUtils.getOnValidationValue(selectedRowId);
-
-var mySide = vars.get("$field.mySide");
-
-if (mySide && selectedRowId)
-{
-    if (mySide == "1")
-    {
-        neon.setFieldValue("$field.OBJECT1_ROWID", vars.get("$param.ObjectRowid_param"));
-        neon.setFieldValue("$field.OBJECT2_ROWID", selectedRowId);
-    }
-    else
-    {
-        neon.setFieldValue("$field.OBJECT1_ROWID", selectedRowId);
-        neon.setFieldValue("$field.OBJECT2_ROWID", vars.get("$param.ObjectRowid_param"));
-    }
-}
\ No newline at end of file
diff --git a/entity/ObjectRelation_entity/entityfields/rowidproxy/valueProcess.js b/entity/ObjectRelation_entity/entityfields/rowidproxy/valueProcess.js
deleted file mode 100644
index 709876feae8ab16d398f6fcaaa468f1ff101b9d6..0000000000000000000000000000000000000000
--- a/entity/ObjectRelation_entity/entityfields/rowidproxy/valueProcess.js
+++ /dev/null
@@ -1,23 +0,0 @@
-import("system.neon");
-import("system.vars");
-import("system.result");
-
-if(vars.get("$sys.recordstate") != neon.OPERATINGSTATE_NEW)
-{
-    var type1 = vars.get("$field.OBJECT1_TYPE");
-    var type2 = vars.get("$field.OBJECT2_TYPE");
-    var rowid1 = vars.get("$field.OBJECT1_ROWID");
-    var rowid2 = vars.get("$field.OBJECT2_ROWID");
-
-    var currentType = vars.get("$param.ObjectType_param");
-    var currentRowid = vars.get("$param.ObjectRowid_param");
-
-    if (type1 == currentType && rowid1 == currentRowid)
-    {
-        result.string(rowid2)
-    }
-    else if (type2 == currentType && rowid2 == currentRowid)
-    {
-        result.string(rowid1)
-    }
-}
\ No newline at end of file
diff --git a/entity/ObjectRelation_entity/entityfields/selectedobjectrelationtypeidproxy/onValueChange.js b/entity/ObjectRelation_entity/entityfields/selectedobjectrelationtypeidproxy/onValueChange.js
deleted file mode 100644
index 0154c7d4a2a3a404ca83c2ec00078ea563ff425d..0000000000000000000000000000000000000000
--- a/entity/ObjectRelation_entity/entityfields/selectedobjectrelationtypeidproxy/onValueChange.js
+++ /dev/null
@@ -1,38 +0,0 @@
-import("system.vars");
-import("system.db");
-import("system.result");
-import("system.neon");
-import("Sql_lib");
-import("Entity_lib");
-
-var selectedObjectRelationTypeId = vars.exists("$field.selectedObjectRelationTypeIdProxy") ? vars.get("$field.selectedObjectRelationTypeIdProxy") : "";
-selectedObjectRelationTypeId = ProcessHandlingUtils.getOnValidationValue(selectedObjectRelationTypeId);
-
-var relationTypeData = db.array(db.ROW, SqlCondition.begin()
-                        .andPrepare("AB_OBJECTRELATIONTYPE.AB_OBJECTRELATIONTYPEID", selectedObjectRelationTypeId)
-                        .buildSql("select AB_OBJECTRELATIONTYPEID, OBJECT_TYPE, RELATION_TITLE, RELATION_TYPE, SIDE from AB_OBJECTRELATIONTYPE", "1=2"));
-
-if (relationTypeData[0])
-{
-    var otherRelationTypeData = db.array(db.ROW, SqlCondition.begin()
-                                    .andPrepare("AB_OBJECTRELATIONTYPE.RELATION_TYPE", relationTypeData[3])
-                                    .andPrepare("AB_OBJECTRELATIONTYPE.SIDE", (relationTypeData[4] == "1" ? "2" : "1"))
-                                    .buildSql("select AB_OBJECTRELATIONTYPEID, OBJECT_TYPE, RELATION_TITLE, RELATION_TYPE, SIDE from AB_OBJECTRELATIONTYPE", "1=2"))
-    if (!otherRelationTypeData[0])
-    {
-        otherRelationTypeData = relationTypeData;
-    }
-    
-    if (relationTypeData[4] == "2")
-    {
-        neon.setFieldValue("$field.AB_OBJECTRELATIONTYPE2", relationTypeData[0]);
-        neon.setFieldValue("$field.AB_OBJECTRELATIONTYPE1", otherRelationTypeData[0]);
-    }
-    else if (relationTypeData[4] == "1")
-    {
-        neon.setFieldValue("$field.AB_OBJECTRELATIONTYPE1", relationTypeData[0]);
-        neon.setFieldValue("$field.AB_OBJECTRELATIONTYPE2", otherRelationTypeData[0]);
-    }
-    
-    neon.setFieldValue("$field.mySide", otherRelationTypeData[4]);
-}
diff --git a/entity/ObjectRelation_entity/entityfields/selectedobjectrelationtypeidproxy/possibleItemsProcess.js b/entity/ObjectRelation_entity/entityfields/selectedobjectrelationtypeidproxy/possibleItemsProcess.js
deleted file mode 100644
index 41ddaad8d5dc1f6a137232492c62683cab4da7e0..0000000000000000000000000000000000000000
--- a/entity/ObjectRelation_entity/entityfields/selectedobjectrelationtypeidproxy/possibleItemsProcess.js
+++ /dev/null
@@ -1,16 +0,0 @@
-import("system.translate");
-import("system.db");
-import("system.result");
-import("system.vars");
-
-result.object(db.table(
-["select main.AB_OBJECTRELATIONTYPEID, main.RELATION_TITLE \n\
-    from AB_OBJECTRELATIONTYPE main \n\
-    left join AB_OBJECTRELATIONTYPE type2 on (type2.AB_OBJECTRELATIONTYPEID <> main.AB_OBJECTRELATIONTYPEID and type2.RELATION_TYPE = main.RELATION_TYPE) \n\
-    where case when type2.OBJECT_TYPE is null then main.OBJECT_TYPE else type2.OBJECT_TYPE end = ? "
-, [
-  [vars.get("$param.ObjectType_param"), db.getColumnTypes("AB_OBJECTRELATIONTYPE", ["OBJECT_TYPE"])[0]]
-]]).map(function(pItem) 
-{
-    return [pItem[0], translate.text(pItem[1])];
-}));
\ No newline at end of file
diff --git a/entity/ObjectRelation_entity/entityfields/selectedobjectrelationtypeidproxy/valueProcess.js b/entity/ObjectRelation_entity/entityfields/selectedobjectrelationtypeidproxy/valueProcess.js
deleted file mode 100644
index 2e1e59bf7a9e242aaa2aeaaff8aca3255b2b12fc..0000000000000000000000000000000000000000
--- a/entity/ObjectRelation_entity/entityfields/selectedobjectrelationtypeidproxy/valueProcess.js
+++ /dev/null
@@ -1,23 +0,0 @@
-import("system.neon");
-import("system.vars");
-import("system.result");
-
-if(vars.get("$sys.recordstate") != neon.OPERATINGSTATE_NEW)
-{
-    var type1 = vars.get("$field.OBJECT1_TYPE");
-    var type2 = vars.get("$field.OBJECT2_TYPE");
-    var rowid1 = vars.get("$field.OBJECT1_ROWID");
-    var rowid2 = vars.get("$field.OBJECT2_ROWID");
-
-    var currentType = vars.get("$param.ObjectType_param");
-    var currentRowid = vars.get("$param.ObjectRowid_param");
-
-    if (type1 == currentType && rowid1 == currentRowid)
-    {
-        result.string(vars.get("$field.AB_OBJECTRELATIONTYPE2"))
-    }
-    else if (type2 == currentType && rowid2 == currentRowid)
-    {
-        result.string(vars.get("$field.AB_OBJECTRELATIONTYPE1"))
-    }
-}
\ No newline at end of file
diff --git a/entity/ObjectRelation_entity/entityfields/targetobjectrowid/displayValueProcess.js b/entity/ObjectRelation_entity/entityfields/targetobjectrowid/displayValueProcess.js
deleted file mode 100644
index f262c44d341bd7722a749aaaf5551dfac9ec5ced..0000000000000000000000000000000000000000
--- a/entity/ObjectRelation_entity/entityfields/targetobjectrowid/displayValueProcess.js
+++ /dev/null
@@ -1,12 +0,0 @@
-import("system.db");
-import("system.result");
-import("system.vars");
-import("Context_lib");
-
-var providerType = vars.getString("$param.ProviderType_param");
-
-// any object
-if (providerType == "any")
-{
-    result.string(db.cell(ContextUtils.getNameSql(vars.get("$field.AnyObjectType"), vars.get("$field.AnyObjectRowid"))));
-}
diff --git a/entity/ObjectRelation_entity/entityfields/targetobjectrowid/documentation.adoc b/entity/ObjectRelation_entity/entityfields/targetobjectrowid/documentation.adoc
deleted file mode 100644
index 336799b4617739da6a7435355cd9e7bde4e3650f..0000000000000000000000000000000000000000
--- a/entity/ObjectRelation_entity/entityfields/targetobjectrowid/documentation.adoc
+++ /dev/null
@@ -1,3 +0,0 @@
-This field is only filled when using the AnyObject Provider.
-
-Calculates the opposite side of the given AnyObject parameters.
diff --git a/entity/ObjectRelation_entity/entityfields/targetobjecttype/displayValueProcess.js b/entity/ObjectRelation_entity/entityfields/targetobjecttype/displayValueProcess.js
deleted file mode 100644
index 24c141470a2c2abc3d1f6f0f81af2ddbdbf9fbc0..0000000000000000000000000000000000000000
--- a/entity/ObjectRelation_entity/entityfields/targetobjecttype/displayValueProcess.js
+++ /dev/null
@@ -1,11 +0,0 @@
-import("system.project");
-import("system.result");
-import("system.vars");
-
-var providerType = vars.getString("$param.ProviderType_param");
-
-// any object
-if (providerType == "any")
-{
-    result.string(project.getDataModel(project.DATAMODEL_KIND_CONTEXT, vars.get("$field.AnyObjectType"))[1]);
-}
\ No newline at end of file
diff --git a/entity/ObjectRelation_entity/entityfields/targetobjecttype/documentation.adoc b/entity/ObjectRelation_entity/entityfields/targetobjecttype/documentation.adoc
deleted file mode 100644
index fba180b53ae87bb36854010f09dbb75125fd3159..0000000000000000000000000000000000000000
--- a/entity/ObjectRelation_entity/entityfields/targetobjecttype/documentation.adoc
+++ /dev/null
@@ -1,3 +0,0 @@
-This field is only filled when using the AnyObject Provider.
-
-Calculates the opposite side of the given AnyObject parameters.
\ No newline at end of file
diff --git a/entity/ObjectRelation_entity/recordcontainers/db/conditionProcess.js b/entity/ObjectRelation_entity/recordcontainers/db/conditionProcess.js
deleted file mode 100644
index f985eee1123c0fb78d105c2843f9557735b01831..0000000000000000000000000000000000000000
--- a/entity/ObjectRelation_entity/recordcontainers/db/conditionProcess.js
+++ /dev/null
@@ -1,25 +0,0 @@
-import("system.vars");
-import("system.result");
-import("system.db");
-import("Sql_lib");
-
-var fullCondition = SqlCondition.begin()
-
-// the parameters have to be present
-if (vars.exists("$param.ObjectType_param") && vars.exists("$param.ObjectRowid_param"))
-{ 
-    var objectType = vars.getString("$param.ObjectType_param");
-    var objectRowid = vars.getString("$param.ObjectRowid_param");
-    if (objectType && objectRowid)
-    {
-        fullCondition.orSqlCondition(SqlCondition.begin()
-                     .andPrepare(["AB_OBJECTRELATIONTYPE", "OBJECT_TYPE", "type1"], objectType)
-                     .andPrepare("AB_OBJECTRELATION.OBJECT1_ROWID", objectRowid))
-                 .orSqlCondition(SqlCondition.begin()
-                     .andPrepare(["AB_OBJECTRELATIONTYPE", "OBJECT_TYPE", "type2"], objectType)
-                     .andPrepare("AB_OBJECTRELATION.OBJECT2_ROWID", objectRowid));
-    }
-    
-}
-
-result.string(db.translateCondition(fullCondition.build("1=2")));
\ No newline at end of file
diff --git a/entity/ObjectRelation_entity/recordcontainers/db/fromClauseProcess.js b/entity/ObjectRelation_entity/recordcontainers/db/fromClauseProcess.js
deleted file mode 100644
index 1b526b9dcedf69e6198fa4e34138a39a7c390b8f..0000000000000000000000000000000000000000
--- a/entity/ObjectRelation_entity/recordcontainers/db/fromClauseProcess.js
+++ /dev/null
@@ -1,5 +0,0 @@
-import("system.result");
-
-result.string("AB_OBJECTRELATION \n\
-                join AB_OBJECTRELATIONTYPE type1 on AB_OBJECTRELATIONTYPE1 = type1.AB_OBJECTRELATIONTYPEID \n\
-                join AB_OBJECTRELATIONTYPE type2 on AB_OBJECTRELATIONTYPE2 = type2.AB_OBJECTRELATIONTYPEID");
\ No newline at end of file
diff --git a/entity/ObjectRelation_entity/recordcontainers/db/recordfieldmappings/object1_type.value/expression.js b/entity/ObjectRelation_entity/recordcontainers/db/recordfieldmappings/object1_type.value/expression.js
deleted file mode 100644
index e5b18cf00226b694da7e012b6424c939f70228a6..0000000000000000000000000000000000000000
--- a/entity/ObjectRelation_entity/recordcontainers/db/recordfieldmappings/object1_type.value/expression.js
+++ /dev/null
@@ -1,3 +0,0 @@
-import("system.result");
-
-result.string("type1.OBJECT_TYPE");
\ No newline at end of file
diff --git a/entity/ObjectRelation_entity/recordcontainers/db/recordfieldmappings/object2_type.value/expression.js b/entity/ObjectRelation_entity/recordcontainers/db/recordfieldmappings/object2_type.value/expression.js
deleted file mode 100644
index 13fa2a157f1b92f7c7727465280ef56d98580e20..0000000000000000000000000000000000000000
--- a/entity/ObjectRelation_entity/recordcontainers/db/recordfieldmappings/object2_type.value/expression.js
+++ /dev/null
@@ -1,3 +0,0 @@
-import("system.result");
-
-result.string("type2.OBJECT_TYPE");
\ No newline at end of file
diff --git a/entity/ObjectTree_entity/ObjectTree_entity.aod b/entity/ObjectTree_entity/ObjectTree_entity.aod
index 78ee2dcbcd62f54fb31db4eb1250d354f369a99f..732a7815ac7d2253db4ed90aa3965728076c95b4 100644
--- a/entity/ObjectTree_entity/ObjectTree_entity.aod
+++ b/entity/ObjectTree_entity/ObjectTree_entity.aod
@@ -61,6 +61,7 @@
     <entityField>
       <name>PARENT_ID</name>
       <searchable v="false" />
+      <tooltip></tooltip>
       <valueProcess>%aditoprj%/entity/ObjectTree_entity/entityfields/parent_id/valueProcess.js</valueProcess>
     </entityField>
     <entityField>
@@ -123,6 +124,7 @@
       <title>Description</title>
       <contentType>LONG_TEXT</contentType>
       <searchable v="false" />
+      <tooltipProcess>%aditoprj%/entity/ObjectTree_entity/entityfields/info/tooltipProcess.js</tooltipProcess>
     </entityField>
     <entityField>
       <name>OBJECTRELATIONTYPEID</name>
@@ -162,15 +164,15 @@
           <name>insert</name>
           <fieldType>ACTION</fieldType>
           <onActionProcess>%aditoprj%/entity/ObjectTree_entity/entityfields/alter/children/insert/onActionProcess.js</onActionProcess>
-          <isSelectionAction v="true" />
           <iconId>VAADIN:FILE_TREE_SMALL</iconId>
+          <stateProcess>%aditoprj%/entity/ObjectTree_entity/entityfields/alter/children/insert/stateProcess.js</stateProcess>
         </entityActionField>
         <entityActionField>
           <name>edit</name>
           <fieldType>ACTION</fieldType>
           <onActionProcess>%aditoprj%/entity/ObjectTree_entity/entityfields/alter/children/edit/onActionProcess.js</onActionProcess>
-          <isSelectionAction v="true" />
           <iconId>NEON:PENCIL</iconId>
+          <stateProcess>%aditoprj%/entity/ObjectTree_entity/entityfields/alter/children/edit/stateProcess.js</stateProcess>
         </entityActionField>
       </children>
     </entityActionGroup>
diff --git a/entity/ObjectTree_entity/entityfields/alter/children/edit/stateProcess.js b/entity/ObjectTree_entity/entityfields/alter/children/edit/stateProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..e46436ab939b94aa8d697e23d9d92390d1384404
--- /dev/null
+++ b/entity/ObjectTree_entity/entityfields/alter/children/edit/stateProcess.js
@@ -0,0 +1,25 @@
+import("system.result");
+import("system.neon");
+import("system.vars");
+
+if (vars.exists("$sys.selection") && vars.get("$sys.selection"))
+{    
+    var selectedRows = JSON.parse(vars.get("$sys.selection"));
+    var isObjectRelationNode = false;
+    if (selectedRows.length > 0)
+    {
+        var uid = JSON.parse(selectedRows[0]);
+        isObjectRelationNode = typeof uid[2] == "string";
+    }  
+
+    if (isObjectRelationNode)
+    {
+        result.string(neon.COMPONENTSTATE_EDITABLE)
+    }
+    else
+    {
+        result.string(neon.COMPONENTSTATE_DISABLED)
+    }
+}
+else
+    result.string(neon.COMPONENTSTATE_DISABLED)
\ No newline at end of file
diff --git a/entity/ObjectTree_entity/entityfields/alter/children/insert/onActionProcess.js b/entity/ObjectTree_entity/entityfields/alter/children/insert/onActionProcess.js
index 16288da8047743cf9d006aa8eab8a7264fc3ec65..cbeeeb007e4e98249f4cc3d011932efece2af4b2 100644
--- a/entity/ObjectTree_entity/entityfields/alter/children/insert/onActionProcess.js
+++ b/entity/ObjectTree_entity/entityfields/alter/children/insert/onActionProcess.js
@@ -1,33 +1,33 @@
-import("ObjectRelation_lib");
+import("system.result");
 import("system.neon");
 import("system.vars");
 
-if (vars.exists("$local.rows") && vars.get("$local.rows"))
-{
-    var selectedRows = JSON.parse(vars.get("$local.rows"));
-    var uid = JSON.parse(selectedRows[0]["#LOOKUPID"]);
-    var isObjectRelationNode = typeof uid[2] == "string";
-        
-    var parentId;
-    var parentObjectType;
-    var relationType;
-        
-    if (isObjectRelationNode)
-    {
-        parentId = uid[0];
-        parentObjectType = uid[3];
-    }
-    else
+if (vars.exists("$sys.selection") && vars.get("$sys.selection"))
+{    
+    var selectedRows = JSON.parse(vars.get("$sys.selection"));
+    var isObjectRelationNode = false;
+    if (selectedRows.length > 0)
     {
-        parentId = vars.getString("$param.ObjectId_param");
-        parentObjectType = vars.getString("$param.ObjectType_param");
-    }
-    
-    var params = {
-        "ObjectId_param" : parentId,
-        "ObjectType_param" : parentObjectType,
-        "RelationType_param" : vars.get("$field.OBJECTRELATIONTYPEID")
-    };
+        var uid = JSON.parse(selectedRows[0]);
+        isObjectRelationNode = typeof uid[2] == "string";
+        
+        if (isObjectRelationNode)
+        {
+            parentId = uid[0];
+            parentObjectType = uid[3];
+        }
+        else
+        {
+            parentId = vars.getString("$param.ObjectId_param");
+            parentObjectType = vars.getString("$param.ObjectType_param");
+        }
 
-    neon.openContext("ObjectTree", "ObjectTreeEdit_view", null, neon.OPERATINGSTATE_NEW, params);
+        var params = {
+            "ObjectId_param" : parentId,
+            "ObjectType_param" : parentObjectType,
+            "RelationType_param" : vars.get("$field.OBJECTRELATIONTYPEID")
+        };
+
+        neon.openContext("ObjectTree", "ObjectTreeEdit_view", null, neon.OPERATINGSTATE_NEW, params);
+    }
 }
\ No newline at end of file
diff --git a/entity/ObjectTree_entity/entityfields/alter/children/insert/stateProcess.js b/entity/ObjectTree_entity/entityfields/alter/children/insert/stateProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..5e1e7308c70d180decdf001e23bdb853e3e1e4c4
--- /dev/null
+++ b/entity/ObjectTree_entity/entityfields/alter/children/insert/stateProcess.js
@@ -0,0 +1,26 @@
+import("system.result");
+import("system.neon");
+import("system.vars");
+import("system.neon");
+
+if (vars.exists("$sys.selection") && vars.get("$sys.selection"))
+{    
+    var selectedRows = JSON.parse(vars.get("$sys.selection"));
+    var isObjectRelationNode = false;
+    if (selectedRows.length > 0)
+    {
+        var uid = JSON.parse(selectedRows[0]);
+        isObjectRelationNode = typeof uid[2] == "string";
+
+        if (!isObjectRelationNode || isObjectRelationNode && uid[7] == 1)
+        {
+            result.string(neon.COMPONENTSTATE_EDITABLE);
+        }
+        else
+            result.string(neon.COMPONENTSTATE_DISABLED);
+    }
+    else
+        result.string(neon.COMPONENTSTATE_DISABLED);
+}
+else
+        result.string(neon.COMPONENTSTATE_DISABLED);
\ No newline at end of file
diff --git a/entity/ObjectRelation_entity/entityfields/objects1/children/objecttype_param/valueProcess.js b/entity/ObjectTree_entity/entityfields/info/tooltipProcess.js
similarity index 51%
rename from entity/ObjectRelation_entity/entityfields/objects1/children/objecttype_param/valueProcess.js
rename to entity/ObjectTree_entity/entityfields/info/tooltipProcess.js
index 0e35811c9fc30b9f87c3e4dda4235787fb0066f7..702c61b00fa47d188e32deb347b70106f4fb9d29 100644
--- a/entity/ObjectRelation_entity/entityfields/objects1/children/objecttype_param/valueProcess.js
+++ b/entity/ObjectTree_entity/entityfields/info/tooltipProcess.js
@@ -1,4 +1,4 @@
 import("system.vars");
 import("system.result");
 
-result.string(vars.get("$field.OBJECT1_TYPE"))
\ No newline at end of file
+result.string(vars.get("$field.INFO"));
\ No newline at end of file
diff --git a/entity/ObjectTree_entity/recordcontainers/jdito/contentProcess.js b/entity/ObjectTree_entity/recordcontainers/jdito/contentProcess.js
index fe657ea0e68d9b03bfeceddc9ac26fc81051f69f..b7e9b9983dd60bc75dcbc6f51d4d0bd084536986 100644
--- a/entity/ObjectTree_entity/recordcontainers/jdito/contentProcess.js
+++ b/entity/ObjectTree_entity/recordcontainers/jdito/contentProcess.js
@@ -1,4 +1,3 @@
-import("system.logging");
 import("system.db");
 import("system.translate");
 import("system.result");
@@ -28,7 +27,7 @@ if (uidParam)
     if (isObjectRelationNode)
     {
         let relationTypeData = ObjectRelationUtils.getRelationType(uid[2]);
-        _insertEntry(tree, _getEntryData(uid[0], relationTypeData[3], relationTypeData[7], relationTypeData[8], undefined, false, uid[6]), "", 0, uid[3], relationTypeData[10]);
+        _insertEntry(tree, _getEntryData(uid[0], relationTypeData[3], relationTypeData[7], relationTypeData[8], undefined, false, uid[6]), "", 0, uid[3], relationTypeData[10], relationTypeData[4]);
 
     }
 }
@@ -80,8 +79,8 @@ function _loadObjectRelationTree(pObjectId, pObjectType, pObjectRelationTypeId,
                     relationTypeData = ObjectRelationUtils.getRelationType(relationTypeData[8]);
                     currentObjectId = _getRootID(currentObjectId, relationTypeData);
                 }
-                
-                let uids = _insertEntry(tree, [[currentObjectId, "", "", "", "", relationTypeData[7]]], pNodeId, pLayer, pObjectType, selectedRelationType)
+                                                                                                                 // true to enable the insert button always --v
+                let uids = _insertEntry(tree, [[currentObjectId, "", "", "", "", relationTypeData[7]]], pNodeId, pLayer, pObjectType, selectedRelationType, true)
                 for (let i = 0; i < uids.length; i++) 
                 {                    
                     _loadObjectRelationTree(uids[i][0], uids[i][3], relationTypeData[0], uids[i], pLayer+1, relationTypeData);
@@ -137,7 +136,7 @@ function _loadObjectRelationTree(pObjectId, pObjectType, pObjectRelationTypeId,
                     relationTypeIdForNew = thisRelationTypeId;
                 
                 
-                let uids = _insertEntry(tree, myData, pNodeId, pLayer, destObjectType, relationTypeIdForNew)
+                let uids = _insertEntry(tree, myData, pNodeId, pLayer, destObjectType, relationTypeIdForNew, hierarchy)
                 for (let i = 0; i < uids.length; i++) 
                 {                    
                     _loadObjectRelationTree(uids[i][0], uids[i][3], pObjectRelationTypeId, uids[i], pLayer+1, pRelationTypeData);
@@ -158,11 +157,11 @@ function _loadObjectRelationTree(pObjectId, pObjectType, pObjectRelationTypeId,
                     relationTypeIdForNew = thisRelationTypeId
 
                 // add both sides. Only one will succeed, because the prevObjectId will be filtered
-                _insertEntry(tree, entryData, pNodeId, pLayer, destObjectType, thisRelationTypeId, 0);
+                _insertEntry(tree, entryData, pNodeId, pLayer, destObjectType, thisRelationTypeId, hierarchy, 0);
                 if (direction == "same")
                 {
                     var otherEntryData = _getEntryData(pNodeId[0], "normal", relationType1, relationType2, prevObjectId, true);
-                    _insertEntry(tree, otherEntryData, pNodeId, pLayer, destObjectType, thisRelationTypeId, 1);
+                    _insertEntry(tree, otherEntryData, pNodeId, pLayer, destObjectType, thisRelationTypeId, hierarchy, 1);
                 }
             }
         }
@@ -250,9 +249,9 @@ function _getRelationTypes(pObjectType)
  * @param {String} pNewRelationTypeId the RelationType, a new relation should have, if this node is selected.
  * @param {Integer} [pNum=undefined] optional number added to the key. Needed, if the key would not be unique.
  * 
- * @return {Array[][]} the uids of the inserted data. Consists of [ObjectId, pEntryData-Index, AB_OBJECTRELATIONTYPEID, pObjectType (from param), pNodeId, objecttype (from entryId), objectrelationid]
+ * @return {Array[][]} the uids of the inserted data. Consists of [ObjectId, pEntryData-Index, AB_OBJECTRELATIONTYPEID, pObjectType (from param), pNodeId, objecttype (from entryId), objectrelationid, hierarchy]
  */
-function _insertEntry(pTree, pEntryData, pNodeId, pLayer, pObjectType, pNewRelationTypeId, pNum)
+function _insertEntry(pTree, pEntryData, pNodeId, pLayer, pObjectType, pNewRelationTypeId, pHierarchy, pNum)
 {
     var expanded = true;
     if (pLayer > 10) expanded = false;
@@ -262,7 +261,7 @@ function _insertEntry(pTree, pEntryData, pNodeId, pLayer, pObjectType, pNewRelat
     {
         var display = db.cell(ContextUtils.getNameSql(pObjectType, pEntryData[i][0]));
         // TODO: Icon                       
-        var uid = [pEntryData[i][0], i, pEntryData[i][5], pObjectType, pNodeId, pEntryData[i][2], pEntryData[i][1]]
+        var uid = [pEntryData[i][0], i, pEntryData[i][5], pObjectType, pNodeId, pEntryData[i][2], pEntryData[i][1], pHierarchy]
         if (pNum)
             uid.push(pNum);
         uids.push(uid);
diff --git a/entity/Object_entity/Object_entity.aod b/entity/Object_entity/Object_entity.aod
index a35318329e9dad635efdbadc4064e3cf77ec41e4..649fb2c0f4c9b918e7245912d43ed74b40c57a42 100644
--- a/entity/Object_entity/Object_entity.aod
+++ b/entity/Object_entity/Object_entity.aod
@@ -30,12 +30,6 @@
       <documentation>%aditoprj%/entity/Object_entity/entityfields/allobjects/documentation.adoc</documentation>
       <recordContainer>jdito</recordContainer>
       <dependencies>
-        <entityDependency>
-          <name>9810264a-4e53-4775-98eb-7025668c0021</name>
-          <entityName>ObjectRelation_entity</entityName>
-          <fieldName>Objects</fieldName>
-          <isConsumer v="false" />
-        </entityDependency>
         <entityDependency>
           <name>445b79b3-e826-40d1-b6c2-46d62daf0818</name>
           <entityName>TaskLink_entity</entityName>
diff --git a/entity/Object_entity/recordcontainers/jdito/contentProcess.js b/entity/Object_entity/recordcontainers/jdito/contentProcess.js
index cc897167253658a76227405133616de5a988b233..4497cff4006889629e44c87348ca9169084ad09b 100644
--- a/entity/Object_entity/recordcontainers/jdito/contentProcess.js
+++ b/entity/Object_entity/recordcontainers/jdito/contentProcess.js
@@ -1,4 +1,3 @@
-import("system.logging");
 import("system.db");
 import("system.vars");
 import("system.result");
@@ -11,9 +10,6 @@ if (vars.exists("$param.ObjectType_param") && vars.get("$param.ObjectType_param"
     if (vars.exists("$param.ExcludedObjectIds_param") && vars.get("$param.ExcludedObjectIds_param"))
         excludedIds = JSON.parse(vars.get("$param.ExcludedObjectIds_param"));
     
-    logging.log("aa22aa" + vars.get("$param.ExcludedObjectIds_param").toSource())
-    logging.log("aa22aa" + vars.get("$param.ObjectType_param").toSource())
-
     result.object(db.table(ContextUtils.getContextDataSql(vars.get("$param.ObjectType_param"), undefined, false, undefined, false, excludedIds)))
 } 
 else
diff --git a/entity/Offer_entity/Offer_entity.aod b/entity/Offer_entity/Offer_entity.aod
index 36e8bee336ba4f8af8ccd2b908feffe9ff9e4333..51dc0bd7bfd69c2c7c0234e4865cb7fe70415659 100644
--- a/entity/Offer_entity/Offer_entity.aod
+++ b/entity/Offer_entity/Offer_entity.aod
@@ -359,9 +359,12 @@
       <title>Choose address</title>
       <consumer>PossibleAddresses</consumer>
       <stateProcess>%aditoprj%/entity/Offer_entity/entityfields/chosenaddress/stateProcess.js</stateProcess>
+      <valueProcess>%aditoprj%/entity/Offer_entity/entityfields/chosenaddress/valueProcess.js</valueProcess>
+      <displayValueProcess>%aditoprj%/entity/Offer_entity/entityfields/chosenaddress/displayValueProcess.js</displayValueProcess>
       <onValueChange>%aditoprj%/entity/Offer_entity/entityfields/chosenaddress/onValueChange.js</onValueChange>
       <onValueChangeTypes>
         <element>MASK</element>
+        <element>PROCESS</element>
       </onValueChangeTypes>
     </entityField>
     <entityConsumer>
@@ -728,30 +731,23 @@
       <onDBDelete>%aditoprj%/entity/Offer_entity/recordcontainers/db/onDBDelete.js</onDBDelete>
       <linkInformation>
         <linkInformation>
-          <name>19634909-a0a3-4fde-b875-e3b2b254e890</name>
+          <name>fdfae1fd-5eb3-4891-86b7-517803035f23</name>
           <tableName>OFFER</tableName>
           <primaryKey>OFFERID</primaryKey>
           <isUIDTable v="true" />
           <readonly v="false" />
         </linkInformation>
         <linkInformation>
-          <name>1b7e5346-a8ce-4ef6-a227-a4557cba3294</name>
+          <name>d49d4390-5567-449b-8702-ee97dbfe1700</name>
           <tableName>CONTACT</tableName>
           <primaryKey>CONTACTID</primaryKey>
           <isUIDTable v="false" />
           <readonly v="true" />
         </linkInformation>
         <linkInformation>
-          <name>9c8f49ae-399f-49e8-a18a-fb4b84a360d0</name>
-          <tableName>ORGANISATION</tableName>
-          <primaryKey>ORGANISATIONID</primaryKey>
-          <isUIDTable v="false" />
-          <readonly v="true" />
-        </linkInformation>
-        <linkInformation>
-          <name>35ac875d-66c4-43b0-9293-b034f45260c8</name>
-          <tableName>PERSON</tableName>
-          <primaryKey>PERSONID</primaryKey>
+          <name>d165322e-cdf3-4611-9fea-0e100853ae80</name>
+          <tableName>SALESPROJECT</tableName>
+          <primaryKey>SALESPROJECTID</primaryKey>
           <isUIDTable v="false" />
           <readonly v="true" />
         </linkInformation>
@@ -873,6 +869,10 @@
           <name>DATE_EDIT.value</name>
           <recordfield>OFFER.DATE_EDIT</recordfield>
         </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>SALESPROJECT_ID.displayValue</name>
+          <recordfield>SALESPROJECT.PROJECTTITLE</recordfield>
+        </dbRecordFieldMapping>
       </recordFieldMappings>
     </dbRecordContainer>
   </recordContainers>
diff --git a/entity/Offer_entity/entityfields/chosenaddress/displayValueProcess.js b/entity/Offer_entity/entityfields/chosenaddress/displayValueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..698ddd21921ba4623f9eeae0c1a61f579da714f5
--- /dev/null
+++ b/entity/Offer_entity/entityfields/chosenaddress/displayValueProcess.js
@@ -0,0 +1,5 @@
+import("system.vars");
+import("PostalAddress_lib");
+import("system.result");
+
+result.string(AddressUtils.getFormattedOnlineAddressById(vars.get("$this.value")))
\ No newline at end of file
diff --git a/entity/Offer_entity/entityfields/chosenaddress/valueProcess.js b/entity/Offer_entity/entityfields/chosenaddress/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..6ebcf9a49b9f2a8d6f2a5b7f54b38fb6a2481fce
--- /dev/null
+++ b/entity/Offer_entity/entityfields/chosenaddress/valueProcess.js
@@ -0,0 +1,11 @@
+import("Contact_lib");
+import("system.result");
+import("system.neon");
+import("system.vars");
+
+if ((vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW || vars.get("$sys.recordstate") == neon.OPERATINGSTATE_EDIT) && !vars.get("$field.ADDRESS"))
+{
+    var defaultAddressId = ContactUtils.getDefaultAddressId(vars.get("$field.CONTACT_ID"));
+    if (defaultAddressId)
+        result.string(defaultAddressId);
+}
\ No newline at end of file
diff --git a/entity/Offer_entity/entityfields/contact_id/onValueChange.js b/entity/Offer_entity/entityfields/contact_id/onValueChange.js
index 98ae338e181debb430e224d724a4e4fc430d7f2d..21017ee1ee7962854598b28f6b669380403ecac1 100644
--- a/entity/Offer_entity/entityfields/contact_id/onValueChange.js
+++ b/entity/Offer_entity/entityfields/contact_id/onValueChange.js
@@ -1,20 +1,19 @@
-import("system.logging");
-import("system.neon");
-import("system.vars");
-import("system.db");
-import("Util_lib");
-import("Entity_lib");
-import("Contact_lib");
-
-var contactid = ProcessHandlingUtils.getOnValidationValue(vars.get("$field.CONTACT_ID"));
-if(contactid != "")
-{
-    //Language Preset
-    var relData = db.array(db.ROW, "select LANGUAGE from CONTACT where CONTACTID = '" + contactid + "'");
-    if(relData[0] != "") 
-        neon.setFieldValue("field.LANGUAGE", relData[0]);
-    
-    // set $field.CONTATCT_ORG_ID per contactid
-    var orgid = ContactUtils.getPersOrgIds(contactid);
-    neon.setFieldValue("$field.CONTACT_ORG_ID", orgid[2]);
+import("system.neon");
+import("system.vars");
+import("system.db");
+import("Util_lib");
+import("Entity_lib");
+import("Contact_lib");
+
+var contactid = ProcessHandlingUtils.getOnValidationValue(vars.get("$field.CONTACT_ID"));
+if(contactid != "")
+{
+    //Language Preset
+    var relData = db.array(db.ROW, "select LANGUAGE from CONTACT where CONTACTID = '" + contactid + "'");
+    if(relData[0] != "") 
+        neon.setFieldValue("field.LANGUAGE", relData[0]);
+    
+    // set $field.CONTATCT_ORG_ID per contactid
+    var orgid = ContactUtils.getPersOrgIds(contactid);
+    neon.setFieldValue("$field.CONTACT_ORG_ID", orgid[2]);
 }
\ No newline at end of file
diff --git a/entity/Offer_entity/entityfields/image/valueProcess.js b/entity/Offer_entity/entityfields/image/valueProcess.js
index 17664f2a052b736ff699cf8cdee04a6b10d73fdc..0b7267521a413a9284fa209c96e92bdea08a20ae 100644
--- a/entity/Offer_entity/entityfields/image/valueProcess.js
+++ b/entity/Offer_entity/entityfields/image/valueProcess.js
@@ -1,6 +1,4 @@
 import("system.vars");
 import("system.result");
-import("Keyword_lib");
-import("KeywordRegistry_basic");
 
-result.string("TEXT:" + KeywordUtils.getViewValue($KeywordRegistry.offerStatus(), vars.getString("$field.STATUS")) );
\ No newline at end of file
+result.string("TEXT:" + vars.get("$field.STATUS.displayValue"));
\ No newline at end of file
diff --git a/entity/Offer_entity/entityfields/salesproject_id/stateProcess.js b/entity/Offer_entity/entityfields/salesproject_id/stateProcess.js
index 1a1eb537b9b727aa99c48fe7236750b5c19c8e5a..1b35d9149a31ff3bebe48f47d48c54f55315e375 100644
--- a/entity/Offer_entity/entityfields/salesproject_id/stateProcess.js
+++ b/entity/Offer_entity/entityfields/salesproject_id/stateProcess.js
@@ -1,19 +1,17 @@
-import("system.logging");
-import("system.neon");
-import("system.result");
-import("system.vars");
-import("Entity_lib");
-
-
-switch (vars.get("$sys.recordstate")) 
-{
-    case neon.OPERATINGSTATE_NEW:
-        //only EDITABLE if $field.CONTACT_ID is set
-        if(ProcessHandlingUtils.getOnValidationValue(vars.get("$field.CONTACT_ID")))
-            result.object(neon.COMPONENTSTATE_EDITABLE);
-        else
-            result.object(neon.COMPONENTSTATE_READONLY);
-    break;
-    default:
-        result.object(neon.COMPONENTSTATE_READONLY);
+import("system.neon");
+import("system.result");
+import("system.vars");
+import("Entity_lib");
+
+switch (vars.get("$sys.recordstate")) 
+{
+    case neon.OPERATINGSTATE_NEW:
+        //only EDITABLE if $field.CONTACT_ID is set
+        if(ProcessHandlingUtils.getOnValidationValue(vars.get("$field.CONTACT_ID")))
+            result.object(neon.COMPONENTSTATE_EDITABLE);
+        else
+            result.object(neon.COMPONENTSTATE_READONLY);
+    break;
+    default:
+        result.object(neon.COMPONENTSTATE_READONLY);
 }
\ No newline at end of file
diff --git a/entity/Offer_entity/entityfields/salesprojects/children/contactid_param/valueProcess.js b/entity/Offer_entity/entityfields/salesprojects/children/contactid_param/valueProcess.js
index 2b24f74fc8720337e690ffb5b66610529cdbb859..f2c342bc94674b7899c756a441619cddb1769980 100644
--- a/entity/Offer_entity/entityfields/salesprojects/children/contactid_param/valueProcess.js
+++ b/entity/Offer_entity/entityfields/salesprojects/children/contactid_param/valueProcess.js
@@ -1,7 +1,5 @@
-import("system.logging");
-import("system.vars");
-import("system.result");
-import("Entity_lib");
-
-var contact = ProcessHandlingUtils.getOnValidationValue(vars.get("$field.CONTACT_ORG_ID"));
-result.string(contact);
\ No newline at end of file
+import("system.vars");
+import("system.result");
+import("Entity_lib");
+
+result.string(ProcessHandlingUtils.getOnValidationValue(vars.get("$field.CONTACT_ORG_ID")));
\ No newline at end of file
diff --git a/entity/Offer_entity/recordcontainers/db/fromClauseProcess.js b/entity/Offer_entity/recordcontainers/db/fromClauseProcess.js
index 2c33b4d7a687c225b0539799cc7262fab4048368..73ea32201ab969db8600af5c66bcafa1ad5523f6 100644
--- a/entity/Offer_entity/recordcontainers/db/fromClauseProcess.js
+++ b/entity/Offer_entity/recordcontainers/db/fromClauseProcess.js
@@ -1,4 +1,4 @@
 import("system.result");
 
 result.string("OFFER left join CONTACT on CONTACTID = CONTACT_ID \n\
-left join ORGANISATION on ORGANISATIONID = ORGANISATION_ID left join PERSON on PERSONID = PERSON_ID");
\ No newline at end of file
+left join SALESPROJECT on SALESPROJECTID = SALESPROJECT_ID");
\ No newline at end of file
diff --git a/entity/Offeritem_entity/entityfields/discount/onValidation.js b/entity/Offeritem_entity/entityfields/discount/onValidation.js
index a929b1d08a849904282a2e7c8d3a05bb77a7e4eb..2864ac016f3a9b00e8cc491bcf3fac9204e2ec90 100644
--- a/entity/Offeritem_entity/entityfields/discount/onValidation.js
+++ b/entity/Offeritem_entity/entityfields/discount/onValidation.js
@@ -1,4 +1,3 @@
-import("system.logging");
 import("system.result");
 import("system.vars");
 import("Util_lib");
diff --git a/entity/Order_entity/Order_entity.aod b/entity/Order_entity/Order_entity.aod
index 30b9585984658b4e37c7a6c25280bf4221c1cbc6..92de79ba4fa97d6419751e7271a6bc246005e0b2 100644
--- a/entity/Order_entity/Order_entity.aod
+++ b/entity/Order_entity/Order_entity.aod
@@ -456,30 +456,23 @@
       <onDBDelete>%aditoprj%/entity/Order_entity/recordcontainers/db/onDBDelete.js</onDBDelete>
       <linkInformation>
         <linkInformation>
-          <name>f84d86a8-867d-44ea-bce5-3489bbee55a0</name>
+          <name>c1a83567-58d0-44bd-ae08-14018311a6ae</name>
           <tableName>SALESORDER</tableName>
           <primaryKey>SALESORDERID</primaryKey>
           <isUIDTable v="true" />
           <readonly v="false" />
         </linkInformation>
         <linkInformation>
-          <name>2c489a72-00ee-4bad-929f-25ef82dbc714</name>
+          <name>7d433584-df9f-4b5b-bae4-f3b0a1962d59</name>
           <tableName>CONTACT</tableName>
           <primaryKey>CONTACTID</primaryKey>
           <isUIDTable v="false" />
           <readonly v="true" />
         </linkInformation>
         <linkInformation>
-          <name>3888fb8c-6d2a-42e6-8abd-e4a9ac7a74ac</name>
-          <tableName>ORGANISATION</tableName>
-          <primaryKey>ORGANISATIONID</primaryKey>
-          <isUIDTable v="false" />
-          <readonly v="true" />
-        </linkInformation>
-        <linkInformation>
-          <name>75470798-2097-41a2-95c2-22cf80d2f0c4</name>
-          <tableName>PERSON</tableName>
-          <primaryKey>PERSONID</primaryKey>
+          <name>33653e5e-df52-413c-9a91-349fd989ab89</name>
+          <tableName>SALESPROJECT</tableName>
+          <primaryKey>SALESPROJECTID</primaryKey>
           <isUIDTable v="false" />
           <readonly v="true" />
         </linkInformation>
@@ -565,6 +558,10 @@
           <name>OFFER_ID.value</name>
           <recordfield>SALESORDER.OFFER_ID</recordfield>
         </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>SALESPROJECT_ID.displayValue</name>
+          <recordfield>SALESPROJECT.PROJECTTITLE</recordfield>
+        </dbRecordFieldMapping>
       </recordFieldMappings>
     </dbRecordContainer>
   </recordContainers>
diff --git a/entity/Order_entity/entityfields/image/valueProcess.js b/entity/Order_entity/entityfields/image/valueProcess.js
index c02371b12bec59c4dcc278169f2d08c6fb919cc0..17507224aefcb223da7f2e3edca6b79ea9281930 100644
--- a/entity/Order_entity/entityfields/image/valueProcess.js
+++ b/entity/Order_entity/entityfields/image/valueProcess.js
@@ -1,6 +1,4 @@
 import("system.vars");
 import("system.result");
-import("Keyword_lib");
-import("KeywordRegistry_basic");
 
-result.string("TEXT:" + KeywordUtils.getViewValue($KeywordRegistry.salesorderState(), vars.getString("$field.STATUS")) );
+result.string("TEXT:" + vars.getString("$field.STATUS.displayValue"));
diff --git a/entity/Order_entity/entityfields/language/displayValueProcess.js b/entity/Order_entity/entityfields/language/displayValueProcess.js
index 528cfe6e1659e4d9d720cd96594f2aa5be7ac58d..d60342f7264e2cb7c41a787563070a80c827eb53 100644
--- a/entity/Order_entity/entityfields/language/displayValueProcess.js
+++ b/entity/Order_entity/entityfields/language/displayValueProcess.js
@@ -1,15 +1,15 @@
-import("system.db");
-import("system.translate");
-import("system.result");
-import("system.vars");
-import("Sql_lib");
-
-if (vars.exists("$param.OrderLanguage_param")) 
-{
-    var iso3 = vars.get("$param.OrderLanguage_param");
-    var latinName = db.cell(SqlCondition.begin()
-        .andPrepare("AB_LANGUAGE.ISO3", iso3)
-        .buildSql("select NAME_LATIN from AB_LANGUAGE", "1=0"));
-    latinName = translate.text(latinName);
-    result.string(latinName);
+import("system.db");
+import("system.translate");
+import("system.result");
+import("system.vars");
+import("Sql_lib");
+
+if (vars.exists("$param.OrderLanguage_param") && vars.get("$param.OrderLanguage_param")) 
+{
+    var iso3 = vars.get("$param.OrderLanguage_param");
+    var latinName = db.cell(SqlCondition.begin()
+        .andPrepare("AB_LANGUAGE.ISO3", iso3)
+        .buildSql("select NAME_LATIN from AB_LANGUAGE", "1=0"));
+    latinName = translate.text(latinName);
+    result.string(latinName);
 }
\ No newline at end of file
diff --git a/entity/Order_entity/entityfields/status/displayValueProcess.js b/entity/Order_entity/entityfields/status/displayValueProcess.js
index 70976b2e028f23867e8f6addad7cdd3517f3c5e0..4a9b7bcc8b2f66e295eafc8c09f796d693249001 100644
--- a/entity/Order_entity/entityfields/status/displayValueProcess.js
+++ b/entity/Order_entity/entityfields/status/displayValueProcess.js
@@ -1,6 +1,6 @@
-import("system.result");
-import("system.vars");
-import("Keyword_lib");
-import("KeywordRegistry_basic");
-
-result.string(KeywordUtils.getViewValue($KeywordRegistry.salesorderState(), vars.get("$field.STATUS")));
+import("system.result");
+import("system.vars");
+import("Keyword_lib");
+import("KeywordRegistry_basic");
+
+result.string(KeywordUtils.getViewValue($KeywordRegistry.salesorderState(), vars.get("$field.STATUS")));
diff --git a/entity/Order_entity/recordcontainers/db/fromClauseProcess.js b/entity/Order_entity/recordcontainers/db/fromClauseProcess.js
index 24ccfcf71b16a96c4d72afc35d8340a254b90baf..5972289c6996fa45ee4b680dfa87ef3d2e0c2048 100644
--- a/entity/Order_entity/recordcontainers/db/fromClauseProcess.js
+++ b/entity/Order_entity/recordcontainers/db/fromClauseProcess.js
@@ -1,3 +1,4 @@
 import("system.result");
 
-result.string("SALESORDER left join CONTACT on CONTACTID = CONTACT_ID left join ORGANISATION on ORGANISATIONID = ORGANISATION_ID");
\ No newline at end of file
+result.string("SALESORDER left join CONTACT on CONTACTID = CONTACT_ID \n\
+left join SALESPROJECT on SALESPROJECTID = SALESPROJECT_ID");
\ No newline at end of file
diff --git a/entity/Order_entity/recordcontainers/db/recordfieldmappings/status.displayvalue/expression.js b/entity/Order_entity/recordcontainers/db/recordfieldmappings/status.displayvalue/expression.js
index f2b9a0bfd51ec122ed45118cc0db8673efa32eb4..aa54f4f9efa30b7b8af672c9c43e70ed29d54b6c 100644
--- a/entity/Order_entity/recordcontainers/db/recordfieldmappings/status.displayvalue/expression.js
+++ b/entity/Order_entity/recordcontainers/db/recordfieldmappings/status.displayvalue/expression.js
@@ -2,5 +2,4 @@ import("system.result");
 import("Keyword_lib");
 import("KeywordRegistry_basic");
 
-var sql = KeywordUtils.getResolvedTitleSqlPart($KeywordRegistry.salesorderState(), "SALESORDER.STATUS");
-result.string(sql);
+result.string(KeywordUtils.getResolvedTitleSqlPart($KeywordRegistry.salesorderState(), "SALESORDER.STATUS"));
diff --git a/entity/Organisation_entity/Organisation_entity.aod b/entity/Organisation_entity/Organisation_entity.aod
index f9ace0913133af8421cbd1462193143eec6e1b36..ad19186315b3869a0a3b1be60a5bf80d3cf6100f 100644
--- a/entity/Organisation_entity/Organisation_entity.aod
+++ b/entity/Organisation_entity/Organisation_entity.aod
@@ -390,8 +390,6 @@
       <fieldType>DEPENDENCY_OUT</fieldType>
       <dependency>
         <name>dependency</name>
-        <entityName>ObjectRelation_entity</entityName>
-        <fieldName>ObjectRelations</fieldName>
       </dependency>
       <children>
         <entityParameter>
diff --git a/entity/Organisation_entity/entityfields/newappointment/onActionProcess.js b/entity/Organisation_entity/entityfields/newappointment/onActionProcess.js
index 475936e13803b10cfb274cf925f189ffbc54049c..fde05a49a0df1146c17e05dc3775b82ea0de6f12 100644
--- a/entity/Organisation_entity/entityfields/newappointment/onActionProcess.js
+++ b/entity/Organisation_entity/entityfields/newappointment/onActionProcess.js
@@ -1,14 +1,13 @@
-import("system.vars");
-import("system.logging");
-import("system.neon");
-import("system.calendars");
-import("Calendar_lib");
-import("system.date");
-import("Context_lib");
-
-
-var params = {};
-params["Entry_param"] = JSON.stringify(CalendarUtil.createEntry(calendars.VEVENT, "neue Termin weissu", "", false, ContextUtils.getCurrentContextId(), vars.get("$field.ORGANISATIONID")));
-
-neon.openContext("Appointment", "AppointmentEdit_view", null, neon.OPERATINGSTATE_NEW, params);
-
+import("system.vars");
+import("system.neon");
+import("system.calendars");
+import("Calendar_lib");
+import("system.date");
+import("Context_lib");
+
+
+var params = {};
+params["Entry_param"] = JSON.stringify(CalendarUtil.createEntry(calendars.VEVENT, "neue Termin weissu", "", false, ContextUtils.getCurrentContextId(), vars.get("$field.ORGANISATIONID")));
+
+neon.openContext("Appointment", "AppointmentEdit_view", null, neon.OPERATINGSTATE_NEW, params);
+
diff --git a/entity/Person_entity/Person_entity.aod b/entity/Person_entity/Person_entity.aod
index c224f074ad62d8477b0462eb39cf415b9eedfc21..d4cf26bf841cfe120cc2b36103c2d3c2de591e0d 100644
--- a/entity/Person_entity/Person_entity.aod
+++ b/entity/Person_entity/Person_entity.aod
@@ -421,6 +421,11 @@ Usually this is used for filtering COMMUNICATION-entries by a specified contact
       <consumer>EmailCommunications</consumer>
       <searchable v="false" />
       <onValueChange>%aditoprj%/entity/Person_entity/entityfields/standard_email_communication/onValueChange.js</onValueChange>
+      <onValueChangeTypes>
+        <element>MASK</element>
+        <element>PROCESS</element>
+        <element>PROCESS_SETVALUE</element>
+      </onValueChangeTypes>
     </entityField>
     <entityField>
       <name>STANDARD_PHONE_COMMUNICATION</name>
@@ -490,8 +495,6 @@ Usually this is used for filtering COMMUNICATION-entries by a specified contact
       <fieldType>DEPENDENCY_OUT</fieldType>
       <dependency>
         <name>dependency</name>
-        <entityName>ObjectRelation_entity</entityName>
-        <fieldName>ObjectRelations</fieldName>
       </dependency>
       <children>
         <entityParameter>
diff --git a/entity/Person_entity/entityfields/address_id/valueProcess.js b/entity/Person_entity/entityfields/address_id/valueProcess.js
index 72dfe18cc06b3c7b652af1305f4498c40fc101ae..f5131447594b4ae38c216e849e0bca9324adaa78 100644
--- a/entity/Person_entity/entityfields/address_id/valueProcess.js
+++ b/entity/Person_entity/entityfields/address_id/valueProcess.js
@@ -1,7 +1,7 @@
-import("system.logging");
 import("system.result");
 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) {
     var possibleStandardAddressID = new StandardObject("Address", null, "Person", vars.get("$field.PERSONID"))
diff --git a/entity/Person_entity/entityfields/status/displayValueProcess.js b/entity/Person_entity/entityfields/status/displayValueProcess.js
index 4ce3577f00ef6af8c3cf3886f6a3d7a729b9e064..b9185cff9ec6fc9022ed92033e064118bfc493b7 100644
--- a/entity/Person_entity/entityfields/status/displayValueProcess.js
+++ b/entity/Person_entity/entityfields/status/displayValueProcess.js
@@ -9,4 +9,4 @@ if (key)
     var res = KeywordUtils.getViewValue($KeywordRegistry.contactStatus(), key);
     result.string(res);
 }
-    
+    
\ No newline at end of file
diff --git a/entity/Prod2prod_entity/recordcontainers/jdito/contentProcess.js b/entity/Prod2prod_entity/recordcontainers/jdito/contentProcess.js
index eeef1e962f6196a9eb632698f6860c216068cb51..bb5fcc0559027a3fd5ab7534a4cc4a53a2ea2a71 100644
--- a/entity/Prod2prod_entity/recordcontainers/jdito/contentProcess.js
+++ b/entity/Prod2prod_entity/recordcontainers/jdito/contentProcess.js
@@ -1,4 +1,3 @@
-import("system.logging");
 import("system.neon");
 import("system.result");
 import("system.vars");
diff --git a/entity/Productprice_entity/entityfields/image/valueProcess.js b/entity/Productprice_entity/entityfields/image/valueProcess.js
index 1a61d32b892076cb93d6b4a4faeec1cf026a9ea8..8ba121f73f08d59b6efda0fbaa02d9761e31b5b3 100644
--- a/entity/Productprice_entity/entityfields/image/valueProcess.js
+++ b/entity/Productprice_entity/entityfields/image/valueProcess.js
@@ -1,5 +1,4 @@
 import("system.vars");
 import("system.result");
-import("Keyword_lib");
 
-result.string("TEXT:" + vars.get("$field.BUYSELL") );
\ No newline at end of file
+result.string("TEXT:" + vars.getString("$field.PRICELIST.displayValue"));
\ No newline at end of file
diff --git a/entity/SalesprojectAnalyses_entity/entityfields/open_salesprojects/valueProcess.js b/entity/SalesprojectAnalyses_entity/entityfields/open_salesprojects/valueProcess.js
index d58be99a6a23f3797888dbc9fe370413dad3b9a1..edfcaddcb840d27088338ff6d7b3624ce73938ff 100644
--- a/entity/SalesprojectAnalyses_entity/entityfields/open_salesprojects/valueProcess.js
+++ b/entity/SalesprojectAnalyses_entity/entityfields/open_salesprojects/valueProcess.js
@@ -1,14 +1,13 @@
-import("system.datetime");
-import("system.db");
-import("system.result");
-import("system.vars");
-import("Date_lib");
-import("system.logging");
-import("Sql_lib");
-import("system.SQLTYPES")
-
-var opensp = db.cell("select count(STATE) from SALESPROJECT \n\
-join AB_KEYWORD_ENTRY on KEYID = STATE and  CONTAINER  = 'SalesprojectState' and TITLE = 'Open' \n\
-group by KEYID, AB_KEYWORD_ENTRY.TITLE");
-                                  
+import("system.datetime");
+import("system.db");
+import("system.result");
+import("system.vars");
+import("Date_lib");
+import("Sql_lib");
+import("system.SQLTYPES")
+
+var opensp = db.cell("select count(STATE) from SALESPROJECT \n\
+join AB_KEYWORD_ENTRY on KEYID = STATE and  CONTAINER  = 'SalesprojectState' and TITLE = 'Open' \n\
+group by KEYID, AB_KEYWORD_ENTRY.TITLE");
+                                  
 result.string(opensp);
\ No newline at end of file
diff --git a/entity/SalesprojectAnalyses_entity/entityfields/overall_forecast/valueProcess.js b/entity/SalesprojectAnalyses_entity/entityfields/overall_forecast/valueProcess.js
index b1f1ae8c0052bfa40c6ffb555ff4197450caf553..48cfc6320620c6baf8bba6379b6dffe9f3cc6e15 100644
--- a/entity/SalesprojectAnalyses_entity/entityfields/overall_forecast/valueProcess.js
+++ b/entity/SalesprojectAnalyses_entity/entityfields/overall_forecast/valueProcess.js
@@ -1,14 +1,13 @@
-import("system.datetime");
-import("system.db");
-import("system.result");
-import("system.vars");
-import("Date_lib");
-import("system.logging");
-import("Sql_lib");
-import("system.SQLTYPES")
-
-var forecast = db.cell(SqlCondition.begin()
-                                   .andPrepare("SALESPROJECT_FORECAST.DATE_START", datetime.toDate(vars.get("$sys.date"), "yyyy"), "year(#) = ?", SQLTYPES.INTEGER)
-                                   .buildSql("select sum(VOLUME * 1000) from SALESPROJECT_FORECAST", "1=2"));
-                                  
+import("system.datetime");
+import("system.db");
+import("system.result");
+import("system.vars");
+import("Date_lib");
+import("Sql_lib");
+import("system.SQLTYPES")
+
+var forecast = db.cell(SqlCondition.begin()
+                                   .andPrepare("SALESPROJECT_FORECAST.DATE_START", datetime.toDate(vars.get("$sys.date"), "yyyy"), "year(#) = ?", SQLTYPES.INTEGER)
+                                   .buildSql("select sum(VOLUME * 1000) from SALESPROJECT_FORECAST", "1=2"));
+                                  
 result.string(forecast);
\ No newline at end of file
diff --git a/entity/SalesprojectAnalyses_entity/entityfields/overall_turnover/valueProcess.js b/entity/SalesprojectAnalyses_entity/entityfields/overall_turnover/valueProcess.js
index a08d40a129380b9383c59d1a175f75b5e31f5767..9c8e5ea68dc50dc8a1b7f3ddb63eeffa651d316f 100644
--- a/entity/SalesprojectAnalyses_entity/entityfields/overall_turnover/valueProcess.js
+++ b/entity/SalesprojectAnalyses_entity/entityfields/overall_turnover/valueProcess.js
@@ -1,14 +1,13 @@
-import("system.datetime");
-import("system.db");
-import("system.result");
-import("system.vars");
-import("Date_lib");
-import("system.logging");
-import("Sql_lib");
-import("system.SQLTYPES")
-
-var turnover = db.cell(SqlCondition.begin()
-                                   .andPrepare("SALESORDER.SALESORDERDATE", datetime.toDate(vars.get("$sys.date"), "yyyy"), "year(#) = ?", SQLTYPES.INTEGER)
-                                   .buildSql("select sum(NET + VAT) from SALESORDER", "1=2"));
-                                  
+import("system.datetime");
+import("system.db");
+import("system.result");
+import("system.vars");
+import("Date_lib");
+import("Sql_lib");
+import("system.SQLTYPES")
+
+var turnover = db.cell(SqlCondition.begin()
+                                   .andPrepare("SALESORDER.SALESORDERDATE", datetime.toDate(vars.get("$sys.date"), "yyyy"), "year(#) = ?", SQLTYPES.INTEGER)
+                                   .buildSql("select sum(NET + VAT) from SALESORDER", "1=2"));
+                                  
 result.string(turnover);
\ No newline at end of file
diff --git a/entity/SalesprojectAnalyses_entity/entityfields/sent_offers/valueProcess.js b/entity/SalesprojectAnalyses_entity/entityfields/sent_offers/valueProcess.js
index c415d73135ceb0683dd670668442589b62e5660a..8d610d08abc6ca281facdb29e790696741a5dd85 100644
--- a/entity/SalesprojectAnalyses_entity/entityfields/sent_offers/valueProcess.js
+++ b/entity/SalesprojectAnalyses_entity/entityfields/sent_offers/valueProcess.js
@@ -1,13 +1,12 @@
-import("system.datetime");
-import("system.db");
-import("system.result");
-import("system.vars");
-import("Date_lib");
-import("system.logging");
-import("Sql_lib");
-import("system.SQLTYPES")
-
-var sentoffer = db.cell("select count(STATUS) from OFFER join AB_KEYWORD_ENTRY \n\
-on KEYID = STATUS and  CONTAINER  = 'OfferStatus' and TITLE = 'Sent' group by KEYID, AB_KEYWORD_ENTRY.TITLE");
-                                  
+import("system.datetime");
+import("system.db");
+import("system.result");
+import("system.vars");
+import("Date_lib");
+import("Sql_lib");
+import("system.SQLTYPES")
+
+var sentoffer = db.cell("select count(STATUS) from OFFER join AB_KEYWORD_ENTRY \n\
+on KEYID = STATUS and  CONTAINER  = 'OfferStatus' and TITLE = 'Sent' group by KEYID, AB_KEYWORD_ENTRY.TITLE");
+                                  
 result.string(sentoffer);
\ No newline at end of file
diff --git a/entity/SalesprojectCompetition_entity/SalesprojectCompetition_entity.aod b/entity/SalesprojectCompetition_entity/SalesprojectCompetition_entity.aod
index f479afb820b077913c99b9e6e8d8b705ea07aad8..2424d7542058a15e42df7b7e48896db39b7a579f 100644
--- a/entity/SalesprojectCompetition_entity/SalesprojectCompetition_entity.aod
+++ b/entity/SalesprojectCompetition_entity/SalesprojectCompetition_entity.aod
@@ -18,6 +18,7 @@
     <entityField>
       <name>INFO</name>
       <title>Info</title>
+      <contentType>LONG_TEXT</contentType>
     </entityField>
     <entityField>
       <name>REASON</name>
@@ -258,6 +259,12 @@
         </entityParameter>
       </children>
     </entityConsumer>
+    <entityField>
+      <name>IMAGE</name>
+      <contentType>IMAGE</contentType>
+      <valueProcess>%aditoprj%/entity/SalesprojectCompetition_entity/entityfields/image/valueProcess.js</valueProcess>
+      <displayValueProcess>%aditoprj%/entity/SalesprojectCompetition_entity/entityfields/image/displayValueProcess.js</displayValueProcess>
+    </entityField>
   </entityFields>
   <recordContainers>
     <dbRecordContainer>
diff --git a/entity/SalesprojectCompetition_entity/entityfields/image/displayValueProcess.js b/entity/SalesprojectCompetition_entity/entityfields/image/displayValueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/entity/SalesprojectCompetition_entity/entityfields/image/valueProcess.js b/entity/SalesprojectCompetition_entity/entityfields/image/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..d071e384e95b26e1b3013d43ac5c4f45ae4cc579
--- /dev/null
+++ b/entity/SalesprojectCompetition_entity/entityfields/image/valueProcess.js
@@ -0,0 +1,4 @@
+import("system.vars");
+import("system.result");
+
+result.string("TEXT:" + vars.getString("$field.ORGANISATION_NAME"));
\ No newline at end of file
diff --git a/entity/SalesprojectCycle_entity/entityfields/date_edit/valueProcess.js b/entity/SalesprojectCycle_entity/entityfields/date_edit/valueProcess.js
deleted file mode 100644
index 710ac8a06a9911f82ff222c7d9d231846ca93fb2..0000000000000000000000000000000000000000
--- a/entity/SalesprojectCycle_entity/entityfields/date_edit/valueProcess.js
+++ /dev/null
@@ -1,6 +0,0 @@
-import("system.vars");
-import("system.result");
-import("system.neon");
-
-if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_EDIT)
-    result.string(vars.getString("$sys.date"));
\ No newline at end of file
diff --git a/entity/SalesprojectCycle_entity/entityfields/date_new/valueProcess.js b/entity/SalesprojectCycle_entity/entityfields/date_new/valueProcess.js
deleted file mode 100644
index 3a0d59096cd2de39b6098f1ed95af580dcebfce0..0000000000000000000000000000000000000000
--- a/entity/SalesprojectCycle_entity/entityfields/date_new/valueProcess.js
+++ /dev/null
@@ -1,6 +0,0 @@
-import("system.vars");
-import("system.result");
-import("system.neon");
-
-if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW)
-    result.string(vars.getString("$sys.date"));
\ No newline at end of file
diff --git a/entity/SalesprojectCycle_entity/entityfields/type/possibleItemsProcess.js b/entity/SalesprojectCycle_entity/entityfields/type/possibleItemsProcess.js
deleted file mode 100644
index effac991d6646dd9c7969dedb551820331abebf9..0000000000000000000000000000000000000000
--- a/entity/SalesprojectCycle_entity/entityfields/type/possibleItemsProcess.js
+++ /dev/null
@@ -1,6 +0,0 @@
-import("system.result");
-import("system.vars");
-import("Keyword_lib");
-
-var items = LegacyKeywordUtils.getStandardArray("SALESPROJECT.CYCLE.TYPE");
-result.object(items);
\ No newline at end of file
diff --git a/entity/SalesprojectCycle_entity/entityfields/user_edit/valueProcess.js b/entity/SalesprojectCycle_entity/entityfields/user_edit/valueProcess.js
deleted file mode 100644
index 1581e18d9763043ae602b98658f87cb0a3b0c967..0000000000000000000000000000000000000000
--- a/entity/SalesprojectCycle_entity/entityfields/user_edit/valueProcess.js
+++ /dev/null
@@ -1,6 +0,0 @@
-import("system.vars");
-import("system.result");
-import("system.neon");
-
-if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_EDIT)
-    result.string(vars.getString("$sys.user"));
\ No newline at end of file
diff --git a/entity/SalesprojectCycle_entity/entityfields/user_new/valueProcess.js b/entity/SalesprojectCycle_entity/entityfields/user_new/valueProcess.js
deleted file mode 100644
index 7c566863b493d778b72dea7d8822f6a59333e77d..0000000000000000000000000000000000000000
--- a/entity/SalesprojectCycle_entity/entityfields/user_new/valueProcess.js
+++ /dev/null
@@ -1,6 +0,0 @@
-import("system.vars");
-import("system.result");
-import("system.neon");
-
-if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW)
-    result.string(vars.getString("$sys.user"));
\ No newline at end of file
diff --git a/entity/SalesprojectCycle_entity/entityfields/value/possibleItemsProcess.js b/entity/SalesprojectCycle_entity/entityfields/value/possibleItemsProcess.js
deleted file mode 100644
index 512b10f2cc7f884a6d5a532ce0223ad938e8fcb0..0000000000000000000000000000000000000000
--- a/entity/SalesprojectCycle_entity/entityfields/value/possibleItemsProcess.js
+++ /dev/null
@@ -1,20 +0,0 @@
-import("system.result");
-import("system.vars");
-import("Keyword_lib");
-
-var items, keyword, type;
-
-items = [];
-
-type = vars.getString("$field.TYPE");
-
-// load the possible values based on the type.
-if (type) {
-    keyword = LegacyKeywordUtils.get("SALESPROJECT.CYCLE.TYPE", type)[2].keyword;
-        
-    if (keyword) {
-        items = LegacyKeywordUtils.getStandardArray(keyword);
-    }
-}
-
-result.object(items);
diff --git a/entity/SalesprojectForecast_entity/SalesprojectForecast_entity.aod b/entity/SalesprojectForecast_entity/SalesprojectForecast_entity.aod
index 945e940b05d1be8647b5655996ccf1b92b6d45ea..7a4816bce187d9b02b224a6baed1b8d05867a3f5 100644
--- a/entity/SalesprojectForecast_entity/SalesprojectForecast_entity.aod
+++ b/entity/SalesprojectForecast_entity/SalesprojectForecast_entity.aod
@@ -24,6 +24,7 @@
     <entityField>
       <name>INFO</name>
       <title>Info</title>
+      <contentType>LONG_TEXT</contentType>
     </entityField>
     <entityField>
       <name>SALESPROJECT_FORECASTID</name>
diff --git a/entity/SalesprojectCycle_entity/SalesprojectCycle_entity.aod b/entity/SalesprojectMilestone_entity/SalesprojectMilestone_entity.aod
similarity index 51%
rename from entity/SalesprojectCycle_entity/SalesprojectCycle_entity.aod
rename to entity/SalesprojectMilestone_entity/SalesprojectMilestone_entity.aod
index fbf0ff3b285905a417c48780fe7940f73534a02d..d390c31108e434406bb56161e32cbe4d650f5a9f 100644
--- a/entity/SalesprojectCycle_entity/SalesprojectCycle_entity.aod
+++ b/entity/SalesprojectMilestone_entity/SalesprojectMilestone_entity.aod
@@ -1,6 +1,6 @@
 <?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.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.1">
-  <name>SalesprojectCycle_entity</name>
+  <name>SalesprojectMilestone_entity</name>
   <title>Milestones</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <recordContainer>db</recordContainer>
@@ -24,24 +24,27 @@
       <outputFormat>dd.MM.yyyy</outputFormat>
     </entityField>
     <entityField>
-      <name>SALESPROJECT_CYCLEID</name>
-      <valueProcess>%aditoprj%/entity/SalesprojectCycle_entity/entityfields/salesproject_cycleid/valueProcess.js</valueProcess>
+      <name>SALESPROJECT_MILESTONEID</name>
+      <searchable v="false" />
+      <valueProcess>%aditoprj%/entity/SalesprojectMilestone_entity/entityfields/salesproject_milestoneid/valueProcess.js</valueProcess>
     </entityField>
     <entityField>
       <name>SALESPROJECT_ID</name>
-      <valueProcess>%aditoprj%/entity/SalesprojectCycle_entity/entityfields/salesproject_id/valueProcess.js</valueProcess>
+      <searchable v="false" />
+      <valueProcess>%aditoprj%/entity/SalesprojectMilestone_entity/entityfields/salesproject_id/valueProcess.js</valueProcess>
     </entityField>
     <entityField>
       <name>TYPE</name>
       <title>Type</title>
       <mandatory v="true" />
-      <possibleItemsProcess>%aditoprj%/entity/SalesprojectCycle_entity/entityfields/type/possibleItemsProcess.js</possibleItemsProcess>
+      <displayValueProcess>%aditoprj%/entity/SalesprojectMilestone_entity/entityfields/type/displayValueProcess.js</displayValueProcess>
     </entityField>
     <entityField>
       <name>VALUE</name>
       <title>Milestone</title>
+      <consumer>Keywords</consumer>
       <mandatory v="true" />
-      <possibleItemsProcess>%aditoprj%/entity/SalesprojectCycle_entity/entityfields/value/possibleItemsProcess.js</possibleItemsProcess>
+      <displayValueProcess>%aditoprj%/entity/SalesprojectMilestone_entity/entityfields/value/displayValueProcess.js</displayValueProcess>
     </entityField>
     <entityParameter>
       <name>SalesprojectId_param</name>
@@ -51,14 +54,14 @@
       <description>PARAMETER</description>
     </entityParameter>
     <entityProvider>
-      <name>SalesprojectCycles</name>
+      <name>SalesprojectMilestones</name>
       <fieldType>DEPENDENCY_IN</fieldType>
       <recordContainer>db</recordContainer>
       <dependencies>
         <entityDependency>
           <name>b05e2bdf-5d8b-4ba2-8dba-a8560c255470</name>
           <entityName>Salesproject_entity</entityName>
-          <fieldName>SalesprojectCycles</fieldName>
+          <fieldName>SalesprojectMilestones</fieldName>
           <isConsumer v="false" />
         </entityDependency>
       </dependencies>
@@ -69,19 +72,43 @@
         </entityParameter>
       </children>
     </entityProvider>
+    <entityField>
+      <name>DaysCount</name>
+      <title>Days count</title>
+      <valueProcess>%aditoprj%/entity/SalesprojectMilestone_entity/entityfields/dayscount/valueProcess.js</valueProcess>
+    </entityField>
+    <entityField>
+      <name>PARENT</name>
+    </entityField>
+    <entityConsumer>
+      <name>Keywords</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/SalesprojectMilestone_entity/entityfields/keywords/children/containername_param/valueProcess.js</valueProcess>
+        </entityParameter>
+      </children>
+    </entityConsumer>
   </entityFields>
   <recordContainers>
     <dbRecordContainer>
       <name>db</name>
       <title></title>
       <alias>Data_alias</alias>
-      <conditionProcess>%aditoprj%/entity/SalesprojectCycle_entity/recordcontainers/db/conditionProcess.js</conditionProcess>
-      <onDBUpdate>%aditoprj%/entity/SalesprojectCycle_entity/recordcontainers/db/onDBUpdate.js</onDBUpdate>
+      <conditionProcess>%aditoprj%/entity/SalesprojectMilestone_entity/recordcontainers/db/conditionProcess.js</conditionProcess>
+      <orderClauseProcess>%aditoprj%/entity/SalesprojectMilestone_entity/recordcontainers/db/orderClauseProcess.js</orderClauseProcess>
+      <onDBUpdate>%aditoprj%/entity/SalesprojectMilestone_entity/recordcontainers/db/onDBUpdate.js</onDBUpdate>
       <linkInformation>
         <linkInformation>
           <name>464f1fd7-e5b6-4cfc-92f8-4873d4e10ce3</name>
-          <tableName>SALESPROJECT_CYCLE</tableName>
-          <primaryKey>SALESPROJECT_CYCLEID</primaryKey>
+          <tableName>SALESPROJECT_MILESTONE</tableName>
+          <primaryKey>SALESPROJECT_MILESTONEID</primaryKey>
           <isUIDTable v="true" />
           <readonly v="false" />
         </linkInformation>
@@ -89,27 +116,31 @@
       <recordFieldMappings>
         <dbRecordFieldMapping>
           <name>DATE_END.value</name>
-          <recordfield>SALESPROJECT_CYCLE.DATE_END</recordfield>
+          <recordfield>SALESPROJECT_MILESTONE.DATE_END</recordfield>
         </dbRecordFieldMapping>
         <dbRecordFieldMapping>
           <name>DATE_START.value</name>
-          <recordfield>SALESPROJECT_CYCLE.DATE_START</recordfield>
+          <recordfield>SALESPROJECT_MILESTONE.DATE_START</recordfield>
         </dbRecordFieldMapping>
         <dbRecordFieldMapping>
-          <name>SALESPROJECT_CYCLEID.value</name>
-          <recordfield>SALESPROJECT_CYCLE.SALESPROJECT_CYCLEID</recordfield>
+          <name>SALESPROJECT_MILESTONEID.value</name>
+          <recordfield>SALESPROJECT_MILESTONE.SALESPROJECT_MILESTONEID</recordfield>
         </dbRecordFieldMapping>
         <dbRecordFieldMapping>
           <name>TYPE.value</name>
-          <recordfield>SALESPROJECT_CYCLE.TYPE</recordfield>
+          <recordfield>SALESPROJECT_MILESTONE.TYPE</recordfield>
         </dbRecordFieldMapping>
         <dbRecordFieldMapping>
           <name>VALUE.value</name>
-          <recordfield>SALESPROJECT_CYCLE.VALUE</recordfield>
+          <recordfield>SALESPROJECT_MILESTONE.VALUE</recordfield>
         </dbRecordFieldMapping>
         <dbRecordFieldMapping>
           <name>SALESPROJECT_ID.value</name>
-          <recordfield>SALESPROJECT_CYCLE.SALESPROJECT_ID</recordfield>
+          <recordfield>SALESPROJECT_MILESTONE.SALESPROJECT_ID</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>PARENT.value</name>
+          <expression>%aditoprj%/entity/SalesprojectMilestone_entity/recordcontainers/db/recordfieldmappings/parent.value/expression.js</expression>
         </dbRecordFieldMapping>
       </recordFieldMappings>
     </dbRecordContainer>
diff --git a/entity/SalesprojectCycle_entity/conditionProcess.js b/entity/SalesprojectMilestone_entity/conditionProcess.js
similarity index 72%
rename from entity/SalesprojectCycle_entity/conditionProcess.js
rename to entity/SalesprojectMilestone_entity/conditionProcess.js
index 01636c9c6c0e376f52c0a692d6d6bd7e8d755e9b..7711ad471a8ed5e095a39703339fdedc6bc6153f 100644
--- a/entity/SalesprojectCycle_entity/conditionProcess.js
+++ b/entity/SalesprojectMilestone_entity/conditionProcess.js
@@ -4,7 +4,7 @@ import("system.vars");
 import("Sql_lib");
 
 var cond = new SqlCondition();
-cond.andPrepareVars("SALESPROJECT_CYCLE.SALESPROJECT_ID", "$param.SalesprojectId_param");
+cond.andPrepareVars("SALESPROJECT_MILESTONE.SALESPROJECT_ID", "$param.SalesprojectId_param");
 
 //TODO: use a preparedCondition when available #1030812 #1034026
 result.string(db.translateCondition(cond.build("1 = 1")));
\ No newline at end of file
diff --git a/entity/ObjectRelation_entity/entityfields/date_edit/valueProcess.js b/entity/SalesprojectMilestone_entity/entityfields/date_edit/valueProcess.js
similarity index 100%
rename from entity/ObjectRelation_entity/entityfields/date_edit/valueProcess.js
rename to entity/SalesprojectMilestone_entity/entityfields/date_edit/valueProcess.js
diff --git a/entity/ObjectRelation_entity/entityfields/date_new/valueProcess.js b/entity/SalesprojectMilestone_entity/entityfields/date_new/valueProcess.js
similarity index 100%
rename from entity/ObjectRelation_entity/entityfields/date_new/valueProcess.js
rename to entity/SalesprojectMilestone_entity/entityfields/date_new/valueProcess.js
diff --git a/entity/SalesprojectMilestone_entity/entityfields/dayscount/valueProcess.js b/entity/SalesprojectMilestone_entity/entityfields/dayscount/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..c8db7ec7ba0e820f2e89fa0c6bb48100073811e5
--- /dev/null
+++ b/entity/SalesprojectMilestone_entity/entityfields/dayscount/valueProcess.js
@@ -0,0 +1,15 @@
+import("system.result");
+import("system.vars");
+import("system.datetime");
+
+var start = parseInt(vars.get("$field.DATE_START"));
+var end = vars.get("$field.DATE_END");
+
+if (!end)
+    end = parseInt(vars.get("$sys.date"));
+
+end = parseInt(end);
+
+var oneDay = datetime.ONE_DAY;
+var diffDays = Math.round(Math.abs((end - start)/(oneDay)));
+result.string(diffDays);
\ No newline at end of file
diff --git a/entity/ObjectRelation_entity/entityfields/object1/children/objecttype_param/valueProcess.js b/entity/SalesprojectMilestone_entity/entityfields/keywords/children/containername_param/valueProcess.js
similarity index 51%
rename from entity/ObjectRelation_entity/entityfields/object1/children/objecttype_param/valueProcess.js
rename to entity/SalesprojectMilestone_entity/entityfields/keywords/children/containername_param/valueProcess.js
index 0e35811c9fc30b9f87c3e4dda4235787fb0066f7..1b532aec63043fba84acf422369129fb9706bc12 100644
--- a/entity/ObjectRelation_entity/entityfields/object1/children/objecttype_param/valueProcess.js
+++ b/entity/SalesprojectMilestone_entity/entityfields/keywords/children/containername_param/valueProcess.js
@@ -1,4 +1,4 @@
 import("system.vars");
 import("system.result");
 
-result.string(vars.get("$field.OBJECT1_TYPE"))
\ No newline at end of file
+result.string(vars.get("$field.TYPE"));
\ No newline at end of file
diff --git a/entity/SalesprojectCycle_entity/entityfields/salesproject_id/valueProcess.js b/entity/SalesprojectMilestone_entity/entityfields/salesproject_id/valueProcess.js
similarity index 100%
rename from entity/SalesprojectCycle_entity/entityfields/salesproject_id/valueProcess.js
rename to entity/SalesprojectMilestone_entity/entityfields/salesproject_id/valueProcess.js
diff --git a/entity/SalesprojectCycle_entity/entityfields/salesproject_cycleid/valueProcess.js b/entity/SalesprojectMilestone_entity/entityfields/salesproject_milestoneid/valueProcess.js
similarity index 100%
rename from entity/SalesprojectCycle_entity/entityfields/salesproject_cycleid/valueProcess.js
rename to entity/SalesprojectMilestone_entity/entityfields/salesproject_milestoneid/valueProcess.js
diff --git a/entity/SalesprojectMilestone_entity/entityfields/type/displayValueProcess.js b/entity/SalesprojectMilestone_entity/entityfields/type/displayValueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..20dd9c7dc7b04a439a16a2a9b4cd833c78f3f964
--- /dev/null
+++ b/entity/SalesprojectMilestone_entity/entityfields/type/displayValueProcess.js
@@ -0,0 +1,5 @@
+import("system.result");
+import("system.vars");
+import("Keyword_lib");
+
+result.string(KeywordUtils.getTranslatedContainer(vars.get("$field.TYPE")));
\ No newline at end of file
diff --git a/entity/ObjectRelation_entity/entityfields/user_edit/valueProcess.js b/entity/SalesprojectMilestone_entity/entityfields/user_edit/valueProcess.js
similarity index 100%
rename from entity/ObjectRelation_entity/entityfields/user_edit/valueProcess.js
rename to entity/SalesprojectMilestone_entity/entityfields/user_edit/valueProcess.js
diff --git a/entity/ObjectRelation_entity/entityfields/user_new/valueProcess.js b/entity/SalesprojectMilestone_entity/entityfields/user_new/valueProcess.js
similarity index 100%
rename from entity/ObjectRelation_entity/entityfields/user_new/valueProcess.js
rename to entity/SalesprojectMilestone_entity/entityfields/user_new/valueProcess.js
diff --git a/entity/SalesprojectMilestone_entity/entityfields/value/displayValueProcess.js b/entity/SalesprojectMilestone_entity/entityfields/value/displayValueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..5a8a9c5933eb25e1aadbbdc66fa8ac545c1d12b5
--- /dev/null
+++ b/entity/SalesprojectMilestone_entity/entityfields/value/displayValueProcess.js
@@ -0,0 +1,5 @@
+import("system.vars");
+import("system.result");
+import("Keyword_lib");
+
+result.string(KeywordUtils.getViewValue(vars.get("$field.TYPE"), vars.get("$field.VALUE")))
\ No newline at end of file
diff --git a/entity/SalesprojectCycle_entity/recordcontainers/db/conditionProcess.js b/entity/SalesprojectMilestone_entity/recordcontainers/db/conditionProcess.js
similarity index 72%
rename from entity/SalesprojectCycle_entity/recordcontainers/db/conditionProcess.js
rename to entity/SalesprojectMilestone_entity/recordcontainers/db/conditionProcess.js
index 01636c9c6c0e376f52c0a692d6d6bd7e8d755e9b..7711ad471a8ed5e095a39703339fdedc6bc6153f 100644
--- a/entity/SalesprojectCycle_entity/recordcontainers/db/conditionProcess.js
+++ b/entity/SalesprojectMilestone_entity/recordcontainers/db/conditionProcess.js
@@ -4,7 +4,7 @@ import("system.vars");
 import("Sql_lib");
 
 var cond = new SqlCondition();
-cond.andPrepareVars("SALESPROJECT_CYCLE.SALESPROJECT_ID", "$param.SalesprojectId_param");
+cond.andPrepareVars("SALESPROJECT_MILESTONE.SALESPROJECT_ID", "$param.SalesprojectId_param");
 
 //TODO: use a preparedCondition when available #1030812 #1034026
 result.string(db.translateCondition(cond.build("1 = 1")));
\ No newline at end of file
diff --git a/entity/SalesprojectCycle_entity/recordcontainers/db/onDBUpdate.js b/entity/SalesprojectMilestone_entity/recordcontainers/db/onDBUpdate.js
similarity index 100%
rename from entity/SalesprojectCycle_entity/recordcontainers/db/onDBUpdate.js
rename to entity/SalesprojectMilestone_entity/recordcontainers/db/onDBUpdate.js
diff --git a/entity/SalesprojectMilestone_entity/recordcontainers/db/orderClauseProcess.js b/entity/SalesprojectMilestone_entity/recordcontainers/db/orderClauseProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..f05ac4a9bca40cede00cff420feb6e4343d2c2cd
--- /dev/null
+++ b/entity/SalesprojectMilestone_entity/recordcontainers/db/orderClauseProcess.js
@@ -0,0 +1,4 @@
+import("system.result");
+result.object({
+    "SALESPROJECT_MILESTONE.DATE_END": false
+});
\ No newline at end of file
diff --git a/entity/ObjectRelation_entity/entityfields/providertype_param/valueProcess.js b/entity/SalesprojectMilestone_entity/recordcontainers/db/recordfieldmappings/parent.value/expression.js
similarity index 52%
rename from entity/ObjectRelation_entity/entityfields/providertype_param/valueProcess.js
rename to entity/SalesprojectMilestone_entity/recordcontainers/db/recordfieldmappings/parent.value/expression.js
index 981503eee34d83611c7bf484a2fab5e86840bf03..e5c82e9c86a2c395736339cb57fe1e2fede85a2e 100644
--- a/entity/ObjectRelation_entity/entityfields/providertype_param/valueProcess.js
+++ b/entity/SalesprojectMilestone_entity/recordcontainers/db/recordfieldmappings/parent.value/expression.js
@@ -1,3 +1,2 @@
 import("system.result");
-
-result.string("none");
\ No newline at end of file
+result.string("''")
\ No newline at end of file
diff --git a/entity/Salesproject_entity/Salesproject_entity.aod b/entity/Salesproject_entity/Salesproject_entity.aod
index fc82706d6730f269f6bb3b6e4c086aa88e2ae458..a7c8206d47e7428825c0f1c5f304530f20e5f385 100644
--- a/entity/Salesproject_entity/Salesproject_entity.aod
+++ b/entity/Salesproject_entity/Salesproject_entity.aod
@@ -36,6 +36,7 @@
     <entityField>
       <name>INFO</name>
       <title>Information</title>
+      <contentType>LONG_TEXT</contentType>
     </entityField>
     <entityField>
       <name>PHASE</name>
@@ -88,6 +89,10 @@
       <mandatory v="true" />
       <valueProcess>%aditoprj%/entity/Salesproject_entity/entityfields/state/valueProcess.js</valueProcess>
       <displayValueProcess>%aditoprj%/entity/Salesproject_entity/entityfields/state/displayValueProcess.js</displayValueProcess>
+      <onValueChange>%aditoprj%/entity/Salesproject_entity/entityfields/state/onValueChange.js</onValueChange>
+      <onValueChangeTypes>
+        <element>MASK</element>
+      </onValueChangeTypes>
     </entityField>
     <entityField>
       <name>VOLUME</name>
@@ -130,18 +135,18 @@
       </children>
     </entityConsumer>
     <entityConsumer>
-      <name>SalesprojectCycles</name>
+      <name>SalesprojectMilestones</name>
       <title>Milestone</title>
       <fieldType>DEPENDENCY_OUT</fieldType>
       <dependency>
         <name>dependency</name>
-        <entityName>SalesprojectCycle_entity</entityName>
-        <fieldName>SalesprojectCycles</fieldName>
+        <entityName>SalesprojectMilestone_entity</entityName>
+        <fieldName>SalesprojectMilestones</fieldName>
       </dependency>
       <children>
         <entityParameter>
           <name>SalesprojectId_param</name>
-          <valueProcess>%aditoprj%/entity/Salesproject_entity/entityfields/salesprojectcycles/children/salesprojectid_param/valueProcess.js</valueProcess>
+          <valueProcess>%aditoprj%/entity/Salesproject_entity/entityfields/salesprojectmilestones/children/salesprojectid_param/valueProcess.js</valueProcess>
           <triggerRecalculation v="true" />
         </entityParameter>
       </children>
diff --git a/entity/Salesproject_entity/entityfields/image/valueProcess.js b/entity/Salesproject_entity/entityfields/image/valueProcess.js
index c04626b8e075d07b742f63f4810cde51d710516e..9f3f41e5b0ec89b6d2c4146f107984b702575a95 100644
--- a/entity/Salesproject_entity/entityfields/image/valueProcess.js
+++ b/entity/Salesproject_entity/entityfields/image/valueProcess.js
@@ -1,6 +1,4 @@
 import("system.vars");
 import("system.result");
-import("Keyword_lib");
-import("KeywordRegistry_basic");
 
-result.string("TEXT:" + KeywordUtils.getViewValue($KeywordRegistry.salesprojectState(), vars.getString("$field.STATE")) );
\ No newline at end of file
+result.string("TEXT:" +  vars.getString("$field.PROJECTTITLE"));
\ No newline at end of file
diff --git a/entity/Salesproject_entity/entityfields/reasons/possibleItemsProcess.js b/entity/Salesproject_entity/entityfields/reasons/possibleItemsProcess.js
index 82ceaf9374045d62c97d1b960f3d336663b4517c..650da662b99acacb43ca5af76c2556762f8a33f1 100644
--- a/entity/Salesproject_entity/entityfields/reasons/possibleItemsProcess.js
+++ b/entity/Salesproject_entity/entityfields/reasons/possibleItemsProcess.js
@@ -1,6 +1,5 @@
-import("system.logging");
-import("system.result");
-import("Keyword_lib");
-import("KeywordRegistry_basic");
-
+import("system.result");
+import("Keyword_lib");
+import("KeywordRegistry_basic");
+
 result.object(KeywordUtils.getEntryNamesAndIdsByContainer("SalesprojectWonLost"));
\ No newline at end of file
diff --git a/entity/Salesproject_entity/entityfields/salesprojectcycles/children/salesprojectid_param/valueProcess.js b/entity/Salesproject_entity/entityfields/salesprojectmilestones/children/salesprojectid_param/valueProcess.js
similarity index 100%
rename from entity/Salesproject_entity/entityfields/salesprojectcycles/children/salesprojectid_param/valueProcess.js
rename to entity/Salesproject_entity/entityfields/salesprojectmilestones/children/salesprojectid_param/valueProcess.js
diff --git a/entity/Salesproject_entity/entityfields/state/onValueChange.js b/entity/Salesproject_entity/entityfields/state/onValueChange.js
new file mode 100644
index 0000000000000000000000000000000000000000..fd8dae9d669334bc145bbc55b693b70a55e63726
--- /dev/null
+++ b/entity/Salesproject_entity/entityfields/state/onValueChange.js
@@ -0,0 +1,28 @@
+import("system.vars");
+import("Sql_lib");
+import("system.db");
+import("KeywordRegistry_basic");
+import("Keyword_lib");
+import("system.translate");
+import("system.question");
+import("system.neon");
+
+if (vars.get("$sys.recordstate") != neon.OPERATINGSTATE_NEW)
+{
+    var state = vars.get("$field.STATE");
+
+    // Postponed
+    if (state == '23d38486-4cce-41ce-a8df-164ad44df706')
+    {
+        var stateName = KeywordUtils.getViewValue($KeywordRegistry.salesprojectState(), state);
+        var clearForecast = question.askYesNo(translate.withArguments("Clear forecast and set state to '%0'?", [stateName]), translate.withArguments("Would you really like to clear the forecast and set the state to '%0'?" + "\n" + translate.text("This cannot be undone!"), [stateName]), false);
+
+        if (!clearForecast)
+        {
+            // reset to value from db
+            neon.setFieldValue("$field.STATE", db.cell(SqlCondition.begin()
+                                                                   .andPrepareVars("SALESPROJECT.SALESPROJECTID", "$field.SALESPROJECTID")
+                                                                   .buildSql("select STATE from SALESPROJECT", "1=2")));
+        }
+    }
+}
diff --git a/entity/Salesproject_entity/onDBInsert.js b/entity/Salesproject_entity/onDBInsert.js
deleted file mode 100644
index 46e16c3d687c541b66574fd13cfaa2c00fff2b87..0000000000000000000000000000000000000000
--- a/entity/Salesproject_entity/onDBInsert.js
+++ /dev/null
@@ -1,5 +0,0 @@
-import("system.vars");
-import("Salesproject_lib");
-
-Salesproject.insertMilestone(vars.getString("$field.SALESPROJECTID"), 1, vars.get("$field.PHASE"), false);
-Salesproject.insertMilestone(vars.getString("$field.SALESPROJECTID"), 2, vars.get("$field.STATE"), true);
\ No newline at end of file
diff --git a/entity/Salesproject_entity/onDBUpdate.js b/entity/Salesproject_entity/onDBUpdate.js
deleted file mode 100644
index 514b528e696d35c1b2116d3fa05826d6e030790e..0000000000000000000000000000000000000000
--- a/entity/Salesproject_entity/onDBUpdate.js
+++ /dev/null
@@ -1,24 +0,0 @@
-import("system.vars");
-import("Salesproject_lib");
-
-var typeValue, fieldVar
-
-// create Milestones if changed
-vars.get("$local.changed").forEach(function(fieldName) {
-    switch (fieldName) {
-        case "SALESPROJECT.PHASE":
-            typeValue = 1;
-            fieldVar = "$field.PHASE";
-            break;
-        case "SALESPROJECT.STATE":
-            typeValue = 2;
-            fieldVar = "$field.STATE";
-            break;
-    }
-        
-    if (typeValue) {
-        Salesproject.insertMilestone(vars.getString("$field.SALESPROJECTID"), typeValue, vars.getString(fieldVar), true);
-    }
-});
-
-
diff --git a/entity/Salesproject_entity/recordcontainers/db/conditionProcess.js b/entity/Salesproject_entity/recordcontainers/db/conditionProcess.js
index 49d846ad22819fbcb59e5dd83febe4a886c64412..f3a32a333dafdf4816b96cb701a339e4613f2827 100644
--- a/entity/Salesproject_entity/recordcontainers/db/conditionProcess.js
+++ b/entity/Salesproject_entity/recordcontainers/db/conditionProcess.js
@@ -1,21 +1,20 @@
-import("system.logging");
-import("system.db");
-import("system.result");
-import("system.vars");
-import("Sql_lib");
-
-if(vars.exists("$param.State_param") && vars.get("$param.State_param") && vars.exists("$param.ContactId_param") && vars.get("$param.ContactId_param"))
-{
-    result.string(db.translateCondition(
-                SqlCondition.begin()
-                            .andPrepareVars("SALESPROJECT.CONTACT_ID", "$param.ContactId_param")
-                            .andPrepareVars("SALESPROJECT.STATE", "$param.State_param")
-                            .build("1 = 2")));
-}
-else
-{
-    result.string(db.translateCondition(
-                SqlCondition.begin()
-                            .andPrepareVars("SALESPROJECT.CONTACT_ID", "$param.ContactId_param")
-                            .build("1 = 1")));
+import("system.db");
+import("system.result");
+import("system.vars");
+import("Sql_lib");
+
+if(vars.exists("$param.State_param") && vars.get("$param.State_param") && vars.exists("$param.ContactId_param") && vars.get("$param.ContactId_param"))
+{
+    result.string(db.translateCondition(
+                SqlCondition.begin()
+                            .andPrepareVars("SALESPROJECT.CONTACT_ID", "$param.ContactId_param")
+                            .andPrepareVars("SALESPROJECT.STATE", "$param.State_param")
+                            .build("1 = 2")));
+}
+else
+{
+    result.string(db.translateCondition(
+                SqlCondition.begin()
+                            .andPrepareVars("SALESPROJECT.CONTACT_ID", "$param.ContactId_param")
+                            .build("1 = 1")));
 }
\ No newline at end of file
diff --git a/entity/Salesproject_entity/recordcontainers/db/onDBDelete.js b/entity/Salesproject_entity/recordcontainers/db/onDBDelete.js
index 6d045ce9112fca4328a5253e983ff41f722cb449..65d94ab76dadcf8189255ca1a84187d9132b9f1f 100644
--- a/entity/Salesproject_entity/recordcontainers/db/onDBDelete.js
+++ b/entity/Salesproject_entity/recordcontainers/db/onDBDelete.js
@@ -1,5 +1,4 @@
 import("system.db");
-import("system.logging");
 import("system.vars");
 import("Sql_lib");
 
@@ -10,7 +9,7 @@ if (currentId)
     var toDelete = [
         "SALESPROJECT_COMPETITION",
         "SALESPROJECT_CLASSIFICATION",
-        "SALESPROJECT_CYCLE",
+        "SALESPROJECT_MILESTONE",
         "SALESPROJECT_FORECAST",
         "SALESPROJECT_MEMBER",
         "SALESPROJECT_SOURCE"
diff --git a/entity/Salesproject_entity/recordcontainers/db/onDBInsert.js b/entity/Salesproject_entity/recordcontainers/db/onDBInsert.js
index 47067fdfe5c683417c30b9d75a0d753324d8534d..49491bda0074fa9406df07580128dfd6240db2cb 100644
--- a/entity/Salesproject_entity/recordcontainers/db/onDBInsert.js
+++ b/entity/Salesproject_entity/recordcontainers/db/onDBInsert.js
@@ -1,6 +1,5 @@
 import("system.vars");
 import("Salesproject_lib");
 
-// TODO Milestone Value is still an Integer but has to be a String (varchar)
-// Salesproject.insertMilestone(vars.getString("$field.SALESPROJECTID"), 1, vars.get("$field.PHASE"), false);
-// Salesproject.insertMilestone(vars.getString("$field.SALESPROJECTID"), 2, vars.get("$field.STATE"), true);
\ No newline at end of file
+Salesproject.insertMilestone(vars.getString("$field.SALESPROJECTID"), "SalesprojectPhase", vars.get("$field.PHASE"), false);
+Salesproject.insertMilestone(vars.getString("$field.SALESPROJECTID"), "SalesprojectState", vars.get("$field.STATE"), true);
\ No newline at end of file
diff --git a/entity/Salesproject_entity/recordcontainers/db/onDBUpdate.js b/entity/Salesproject_entity/recordcontainers/db/onDBUpdate.js
index 2d558ee7cdb5dd210634cf5484ad18187e706d0b..95c901de86dfdf90d075c1311539cfe8971f4886 100644
--- a/entity/Salesproject_entity/recordcontainers/db/onDBUpdate.js
+++ b/entity/Salesproject_entity/recordcontainers/db/onDBUpdate.js
@@ -4,9 +4,11 @@ import("system.vars");
 import("Salesproject_lib");
 import("Sql_lib");
 import("system.db");
+import("system.question");
 import("KeywordRegistry_basic");
+import("Keyword_lib");
 
-var needToUpdateForecast = false;
+var needToUpdateForecast = null;
 
 // create Milestones if changed
 vars.get("$local.changed").forEach(function(fieldName) {
@@ -17,18 +19,18 @@ vars.get("$local.changed").forEach(function(fieldName) {
     
     switch (fieldName) {
         case "SALESPROJECT.PHASE":
-            typeValue = 1;
+            typeValue = "SalesprojectPhase";
             fieldVar = "$field.PHASE";
             break;
         case "SALESPROJECT.STATE":
             // Milestone
-            typeValue = 2;
+            typeValue = "SalesprojectState";
             fieldVar = "$field.STATE";
-            
+            var state = vars.get(fieldVar);
             // set COMPETITION / OFFER to Lost
             
             // Lost
-            if ( vars.get("$field.STATE") == 'd8a60f60-a4e6-46ee-88ec-bac53e1afedd')
+            if (state == 'd8a60f60-a4e6-46ee-88ec-bac53e1afedd')
             {
                 // set all offers of the salesproject to lost
                 db.updateData("OFFER", ["STATUS"], null, ["a5682630-01ae-4769-8f03-47dc1db44da4"], SqlCondition.equals("OFFER.SALESPROJECT_ID", vars.getString("$field.SALESPROJECTID"), "1=2"));
@@ -36,15 +38,22 @@ vars.get("$local.changed").forEach(function(fieldName) {
                 clearReason = false;
             }
             // Order
-            else if (vars.get("$field.STATE") == '130bb53a-a97e-455e-8f34-8d445e985474')
+            else if (state == '130bb53a-a97e-455e-8f34-8d445e985474')
             {
                 // set all competitions of the salesproject to lost
                 db.updateData("SALESPROJECT_COMPETITION", ["STATUS"], null, ["ff73172c-8517-4b6e-98cb-43aebacd9af1"], SqlCondition.equals("SALESPROJECT_COMPETITION.SALESPROJECT_ID", vars.getString("$field.SALESPROJECTID"), "1=2"));
                 _updateReasons();
                 clearReason = false;
             }
+            // Postponed
+            else if (state == '23d38486-4cce-41ce-a8df-164ad44df706')
+            {
+                // do not notify as the user just got a question, if he really would like to clear the forecast
+                needToUpdateForecast = false;
+                db.deleteData("SALESPROJECT_FORECAST", SqlCondition.equals("SALESPROJECT_FORECAST.SALESPROJECT_ID", vars.getString("$field.SALESPROJECTID"), "1=2"));
+            }
             // if state changed, but not to one of the above states
-            else if (clearReason == undefined)
+            else
             {
                 clearReason = true;
             }
@@ -59,9 +68,11 @@ vars.get("$local.changed").forEach(function(fieldName) {
     
 
     if (typeValue) {
-        needToUpdateForecast = true;
-        // TODO Milestone Value is still an Integer but has to be a String (varchar) -> use new keywords
-        //Salesproject.insertMilestone(vars.getString("$field.SALESPROJECTID"), typeValue, vars.getString(fieldVar));
+        // only notify, if not explicitely set to false above
+        if (needToUpdateForecast === null)
+            needToUpdateForecast = true;
+        
+        Salesproject.insertMilestone(vars.getString("$field.SALESPROJECTID"), typeValue, vars.getString(fieldVar));
     }
 });
 
diff --git a/entity/Stock_entity/entityfields/image/valueProcess.js b/entity/Stock_entity/entityfields/image/valueProcess.js
index 0693b6bd4810fe8d10495205a0383559738d533a..7a22eb5dbcdaa6b5c7e0651873ced2a6bdad0623 100644
--- a/entity/Stock_entity/entityfields/image/valueProcess.js
+++ b/entity/Stock_entity/entityfields/image/valueProcess.js
@@ -1,6 +1,5 @@
 import("system.translate");
 import("system.vars");
 import("system.result");
-import("Keyword_lib");
 
 result.string("TEXT:" + (vars.get("$field.IN_OUT") == "1" ? translate.text("IN") : translate.text("OUT") ) );
\ No newline at end of file
diff --git a/entity/Task_entity/Task_entity.aod b/entity/Task_entity/Task_entity.aod
index 5a6394af6a270b012f70e4325dd0bf2410126902..1f5d2049a1880f6c66d2ab5d0e68b620ca0c5e52 100644
--- a/entity/Task_entity/Task_entity.aod
+++ b/entity/Task_entity/Task_entity.aod
@@ -51,6 +51,7 @@
       <consumer>ContactRequestors</consumer>
       <linkedContext>Person</linkedContext>
       <mandatory v="true" />
+      <valueProcess>%aditoprj%/entity/Task_entity/entityfields/requestor_contact_id/valueProcess.js</valueProcess>
       <displayValueProcess>%aditoprj%/entity/Task_entity/entityfields/requestor_contact_id/displayValueProcess.js</displayValueProcess>
     </entityField>
     <entityField>
@@ -383,6 +384,12 @@
       <documentation>%aditoprj%/entity/Task_entity/entityfields/presetlinks_param/documentation.adoc</documentation>
       <description>PARAMETER</description>
     </entityParameter>
+    <entityField>
+      <name>SUBJECT_DETAILS</name>
+      <title>subject</title>
+      <linkedContext>Task</linkedContext>
+      <mandatory v="true" />
+    </entityField>
   </entityFields>
   <recordContainers>
     <dbRecordContainer>
@@ -485,6 +492,10 @@
           <name>PROGRESS.displayValue</name>
           <expression>%aditoprj%/entity/Task_entity/recordcontainers/db/recordfieldmappings/progress.displayvalue/expression.js</expression>
         </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>SUBJECT_DETAILS.value</name>
+          <recordfield>TASK.SUBJECT</recordfield>
+        </dbRecordFieldMapping>
       </recordFieldMappings>
     </dbRecordContainer>
   </recordContainers>
diff --git a/entity/Task_entity/entityfields/requestor_contact_id/valueProcess.js b/entity/Task_entity/entityfields/requestor_contact_id/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..1e62e7551ccb20b0b0d7aca34f64b6e448b5dda7
--- /dev/null
+++ b/entity/Task_entity/entityfields/requestor_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/Timetracking_entity/Timetracking_entity.aod b/entity/Timetracking_entity/Timetracking_entity.aod
index 621e193b43e4142e3a8588ba17876d95cb549f77..5ecb9a7fa6f694d0a682f27818d42801abee4958 100644
--- a/entity/Timetracking_entity/Timetracking_entity.aod
+++ b/entity/Timetracking_entity/Timetracking_entity.aod
@@ -12,6 +12,11 @@
       <name>INFO</name>
       <title>Description</title>
       <contentType>LONG_TEXT</contentType>
+      <onValueChangeTypes>
+        <element>MASK</element>
+        <element>PROCESS</element>
+        <element>PROCESS_SETVALUE</element>
+      </onValueChangeTypes>
     </entityField>
     <entityField>
       <name>MINUTES</name>
diff --git a/entity/Turnover_entity/recordcontainers/jdito/contentProcess.js b/entity/Turnover_entity/recordcontainers/jdito/contentProcess.js
index e25db6b1024be40f497efdb97d94f7ff2ba0f925..cee26913021aaca4b49d84e0a50eca912e8a2799 100644
--- a/entity/Turnover_entity/recordcontainers/jdito/contentProcess.js
+++ b/entity/Turnover_entity/recordcontainers/jdito/contentProcess.js
@@ -101,6 +101,9 @@ function _addMonth(pYear, pMonth, pData, pCategory)
 
 function _addProducts(pYear, pMonth, pData, pCategory)
 {
+    var monthDate = new Date(pYear, pMonth-1);
+    monthDate = datetime.toDate(monthDate.getTime(), "MMM yyyy", "UTC");
+    
     var groupcodeSums = {};
     
     for (let i = 0; i < pData.length; i++) 
@@ -131,6 +134,8 @@ function _addProducts(pYear, pMonth, pData, pCategory)
     for (let groupcode in groupcodeSums) 
     {
         if (groupcodeSums[groupcode]["sum"])
-            chartData.add(pCategory + pYear + pMonth + groupcode, pCategory + pYear + pMonth, [pCategory, groupcodeSums[groupcode]["name"], groupcodeSums[groupcode]["sum"]]);
+        {
+            chartData.add(pCategory + pYear + pMonth + groupcode, pCategory + pYear + pMonth, [pCategory, groupcodeSums[groupcode]["name"] + " (" + monthDate.toString() + ")", groupcodeSums[groupcode]["sum"]]);
+        }
     }
 }
diff --git a/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod b/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod
index d879997ad260f2afece34d77e0eab26400fcba93..c3ee7d877f3d269da36b01d0933bf562b9707051 100644
--- a/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod
+++ b/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod
@@ -2829,6 +2829,42 @@
     <entry>
       <key>Zeigt wie viele Vertriebsprojekte in den einzelnen Vertriebsphasen sind. </key>
     </entry>
+    <entry>
+      <key>Enable relation type 2</key>
+    </entry>
+    <entry>
+      <key>Salesproject Analyses</key>
+    </entry>
+    <entry>
+      <key>Wichtigste Kennzahlen zu den Vertriebsprojekten.</key>
+    </entry>
+    <entry>
+      <key>ObjectRelationType</key>
+    </entry>
+    <entry>
+      <key>SalesprojectPhase</key>
+    </entry>
+    <entry>
+      <key>SalesprojectState</key>
+    </entry>
+    <entry>
+      <key>Days count</key>
+    </entry>
+    <entry>
+      <key>Clear forecast and set state to \"%0\"?</key>
+    </entry>
+    <entry>
+      <key>Would you like to clear the forecast and set the state to \"%0\"?</key>
+    </entry>
+    <entry>
+      <key>Clear forecast and set state to '%0'?</key>
+    </entry>
+    <entry>
+      <key>Would you really like to clear the forecast and set the state to '%0'?</key>
+    </entry>
+    <entry>
+      <key>This cannot be undone!</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 418ed9962b822f3d766434ef0b1ad623d6d61bf4..c50f65492bcce2295d8bed1c178044b9d7188142 100644
--- a/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
+++ b/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
@@ -6,6 +6,10 @@
   <country></country>
   <variant></variant>
   <keyValueMap>
+    <entry>
+      <key>SalesprojectState</key>
+      <value>Status</value>
+    </entry>
     <entry>
       <key>Project management</key>
       <value>Projektmanagement</value>
@@ -46,6 +50,10 @@
       <key>Discount %</key>
       <value>Rabatt %</value>
     </entry>
+    <entry>
+      <key>SalesprojectPhase</key>
+      <value>Phase</value>
+    </entry>
     <entry>
       <key>Email must be unique!</key>
       <value>Die E-Mail-Adresse muss eindeutig sein!</value>
@@ -2125,6 +2133,10 @@
       <key>Spain</key>
       <value>Spanien</value>
     </entry>
+    <entry>
+      <key>ObjectRelationType</key>
+      <value>Beziehungstyp</value>
+    </entry>
     <entry>
       <key>Palau</key>
       <value>Palau</value>
@@ -3609,11 +3621,11 @@
     </entry>
     <entry>
       <key>Context 1</key>
-      <value>Kontext 1</value>
+      <value>Context 1</value>
     </entry>
     <entry>
       <key>Context 2</key>
-      <value>Kontext2</value>
+      <value>Context 2</value>
     </entry>
     <entry>
       <key>Tochter</key>
@@ -3632,6 +3644,38 @@
     <entry>
       <key>Successful</key>
     </entry>
+    <entry>
+      <key>Enable relation type 2</key>
+      <value>Beziehungsart 2 aktiv</value>
+    </entry>
+    <entry>
+      <key>Salesproject Analyses</key>
+    </entry>
+    <entry>
+      <key>Wichtigste Kennzahlen zu den Vertriebsprojekten.</key>
+    </entry>
+    <entry>
+      <key>Days count</key>
+      <value>Anzahl Tage</value>
+    </entry>
+    <entry>
+      <key>Clear forecast and set state to '%0'?</key>
+      <value>Forecast löschen und status auf '%0' setzen?</value>
+    </entry>
+    <entry>
+      <key>Would you really like to clear the forecast and set the state to '%0'?</key>
+      <value>Möchten Sie wirklich den Forecast löschen und den status auf '%0' setzen?</value>
+    </entry>
+    <entry>
+      <key>This cannot be undone!</key>
+      <value>Das kann nicht rückgängig gemacht werden!</value>
+    </entry>
+    <entry>
+      <key>Clear forecast and set state to \"%0\"?</key>
+    </entry>
+    <entry>
+      <key>Would you like to clear the forecast and set the state to \"%0\"?</key>
+    </entry>
   </keyValueMap>
   <font name="Dialog" style="0" size="11" />
 </language>
diff --git a/language/_____LANGUAGE_en/_____LANGUAGE_en.aod b/language/_____LANGUAGE_en/_____LANGUAGE_en.aod
index 7e420651fbbf10eaf035cdde342c5accd91830f8..d928e37d3dd103737d20031ddce232595e85c0ad 100644
--- a/language/_____LANGUAGE_en/_____LANGUAGE_en.aod
+++ b/language/_____LANGUAGE_en/_____LANGUAGE_en.aod
@@ -2861,6 +2861,42 @@
     <entry>
       <key>Zeigt wie viele Vertriebsprojekte in den einzelnen Vertriebsphasen sind. </key>
     </entry>
+    <entry>
+      <key>Enable relation type 2</key>
+    </entry>
+    <entry>
+      <key>Salesproject Analyses</key>
+    </entry>
+    <entry>
+      <key>Wichtigste Kennzahlen zu den Vertriebsprojekten.</key>
+    </entry>
+    <entry>
+      <key>ObjectRelationType</key>
+    </entry>
+    <entry>
+      <key>SalesprojectPhase</key>
+    </entry>
+    <entry>
+      <key>SalesprojectState</key>
+    </entry>
+    <entry>
+      <key>Days count</key>
+    </entry>
+    <entry>
+      <key>Clear forecast and set state to \"%0\"?</key>
+    </entry>
+    <entry>
+      <key>Would you like to clear the forecast and set the state to \"%0\"?</key>
+    </entry>
+    <entry>
+      <key>Clear forecast and set state to '%0'?</key>
+    </entry>
+    <entry>
+      <key>Would you really like to clear the forecast and set the state to '%0'?</key>
+    </entry>
+    <entry>
+      <key>This cannot be undone!</key>
+    </entry>
   </keyValueMap>
   <font name="Dialog" style="0" size="11" />
 </language>
diff --git a/neonContext/Activity/Activity.aod b/neonContext/Activity/Activity.aod
index 7cadf528888dcd44e0b3aa271f9b7420a78600cc..25ae52541afc98821f91d6cc70a13005028d0803 100644
--- a/neonContext/Activity/Activity.aod
+++ b/neonContext/Activity/Activity.aod
@@ -21,10 +21,6 @@
       <name>9b432ee5-c767-4c47-ad2a-66d2163557d1</name>
       <view>ActivityEdit_view</view>
     </neonViewReference>
-    <neonViewReference>
-      <name>e0af0a30-934b-4063-a4cf-9ba0c848a4db</name>
-      <view>ActivityTimeline_view</view>
-    </neonViewReference>
     <neonViewReference>
       <name>23964361-3977-4d2d-8af4-5cac94406d3d</name>
       <view>ActivityMain_view</view>
diff --git a/neonContext/ObjectRelation/ObjectRelation.aod b/neonContext/ObjectRelation/ObjectRelation.aod
deleted file mode 100644
index ea16cff33f05f5f1638a7376279ffa11ec90a32b..0000000000000000000000000000000000000000
--- a/neonContext/ObjectRelation/ObjectRelation.aod
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<neonContext xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.0" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonContext/1.1.0">
-  <name>ObjectRelation</name>
-  <majorModelMode>DISTRIBUTED</majorModelMode>
-  <filterview>ObjectRelationFilter_view</filterview>
-  <editview>ObjectRelationEdit_view</editview>
-  <preview>ObjectRelationPreview_view</preview>
-  <entity>ObjectRelation_entity</entity>
-  <references>
-    <neonViewReference>
-      <name>dc0bd793-a472-4a7b-8394-06c4bc31258a</name>
-      <view>ObjectRelationPreview_view</view>
-    </neonViewReference>
-    <neonViewReference>
-      <name>30334c84-5e46-4a4e-a5c4-3c42d1cb109b</name>
-      <view>ObjectRelationEdit_view</view>
-    </neonViewReference>
-    <neonViewReference>
-      <name>ec83a8eb-11a5-4544-8a06-47789704a626</name>
-      <view>ObjectRelationFilter_view</view>
-    </neonViewReference>
-  </references>
-</neonContext>
diff --git a/neonContext/ObjectRelationType/ObjectRelationType.aod b/neonContext/ObjectRelationType/ObjectRelationType.aod
index 2cfbf3567d625732b3fa18caa800ada1ccc514b7..c90b46ece5109ab161d5df449e410baa5bcfc690 100644
--- a/neonContext/ObjectRelationType/ObjectRelationType.aod
+++ b/neonContext/ObjectRelationType/ObjectRelationType.aod
@@ -6,7 +6,6 @@
   <icon>VAADIN:SPLIT</icon>
   <filterview>ObjectRelationTypeFilter_view</filterview>
   <editview>ObjectRelationTypeEdit_view</editview>
-  <preview>ObjectRelationTypePreview_view</preview>
   <entity>ObjectRelationType_entity</entity>
   <references>
     <neonViewReference>
@@ -17,9 +16,5 @@
       <name>afb5b3c7-fb34-4511-8b72-34808d64e226</name>
       <view>ObjectRelationTypeEdit_view</view>
     </neonViewReference>
-    <neonViewReference>
-      <name>b4cb3fc0-03ed-48d5-bd0c-725623865bc3</name>
-      <view>ObjectRelationTypePreview_view</view>
-    </neonViewReference>
   </references>
 </neonContext>
diff --git a/neonContext/Offer/Offer.aod b/neonContext/Offer/Offer.aod
index e1d68da5ca5cac83a93742e7ee2cdd8e82dbede4..ff88eb5a2d7980c3abf9393624b544b07a813d0d 100644
--- a/neonContext/Offer/Offer.aod
+++ b/neonContext/Offer/Offer.aod
@@ -28,7 +28,7 @@
     </neonViewReference>
     <neonViewReference>
       <name>a68c9d63-aff4-4e82-af23-72d20c2b6b76</name>
-      <view>OfferDetail_view</view>
+      <view>OfferCoverLetter_view</view>
     </neonViewReference>
   </references>
 </neonContext>
diff --git a/neonContext/Salesproject/Salesproject.aod b/neonContext/Salesproject/Salesproject.aod
index feef4560535219df0acd527d75fd4d3a46569d5c..a5422082d260a0e651632846afbc6b826ae25ff3 100644
--- a/neonContext/Salesproject/Salesproject.aod
+++ b/neonContext/Salesproject/Salesproject.aod
@@ -26,9 +26,5 @@
       <name>c35cc718-94a8-43cf-afe4-f02d251d4e9f</name>
       <view>SalesprojectEdit_view</view>
     </neonViewReference>
-    <neonViewReference>
-      <name>d7fb7e2b-c932-4b96-be2c-ae5ec3d36beb</name>
-      <view>SalesprojectCycle_view</view>
-    </neonViewReference>
   </references>
 </neonContext>
diff --git a/neonContext/SalesprojectCycle/SalesprojectCycle.aod b/neonContext/SalesprojectCycle/SalesprojectCycle.aod
deleted file mode 100644
index 59f07fb175bfea67747b8d4b582d3ece986a0d2b..0000000000000000000000000000000000000000
--- a/neonContext/SalesprojectCycle/SalesprojectCycle.aod
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<neonContext xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.0" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonContext/1.1.0">
-  <name>SalesprojectCycle</name>
-  <description>Milestones of a salesproject</description>
-  <majorModelMode>DISTRIBUTED</majorModelMode>
-  <filterview>SalesprojectCycleFilter_view</filterview>
-  <editview>SalesprojectCycleEdit_view</editview>
-  <preview>SalesprojectCyclePreview_view</preview>
-  <entity>SalesprojectCycle_entity</entity>
-  <references>
-    <neonViewReference>
-      <name>5de9785c-92cc-4fe1-ae13-8d65b9a68ce0</name>
-      <view>SalesprojectCycleFilter_view</view>
-    </neonViewReference>
-    <neonViewReference>
-      <name>04073406-1035-4a3b-919b-7e0bfda699e0</name>
-      <view>SalesprojectCycleEdit_view</view>
-    </neonViewReference>
-    <neonViewReference>
-      <name>b3a4073e-9431-4de1-a4d5-c9d11a71a214</name>
-      <view>SalesprojectCyclePreview_view</view>
-    </neonViewReference>
-  </references>
-</neonContext>
diff --git a/neonContext/SalesprojectMilestone/SalesprojectMilestone.aod b/neonContext/SalesprojectMilestone/SalesprojectMilestone.aod
new file mode 100644
index 0000000000000000000000000000000000000000..3626804e1c32ebcc9f4fbb25529c806c6937080f
--- /dev/null
+++ b/neonContext/SalesprojectMilestone/SalesprojectMilestone.aod
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<neonContext xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.0" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonContext/1.1.0">
+  <name>SalesprojectMilestone</name>
+  <description>Milestones of a salesproject</description>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <filterview>SalesprojectMilestoneChart_view</filterview>
+  <entity>SalesprojectMilestone_entity</entity>
+  <references>
+    <neonViewReference>
+      <name>54bee07a-f45d-458a-bfc6-56ba4992b63d</name>
+      <view>SalesprojectMilestoneChart_view</view>
+    </neonViewReference>
+  </references>
+</neonContext>
diff --git a/neonView/ActivityFilter_view/ActivityFilter_view.aod b/neonView/ActivityFilter_view/ActivityFilter_view.aod
index 23705e8e116a6b2eb35774168fab902f939b03a2..78a81d68932c0bf91139e730cb800fc2b19df0a3 100644
--- a/neonView/ActivityFilter_view/ActivityFilter_view.aod
+++ b/neonView/ActivityFilter_view/ActivityFilter_view.aod
@@ -55,11 +55,16 @@
     </groupLayout>
   </layout>
   <children>
-    <neonViewReference>
-      <name>0e5e5791-af45-4f3f-a8fb-44656e1556c3</name>
+    <timelineViewTemplate>
+      <name>ActivitiesTimeline</name>
+      <dateField>ENTRYDATE</dateField>
+      <titleField>SUBJECT_DETAILS</titleField>
+      <descriptionField>INFO</descriptionField>
+      <iconIdField>DIRECTION_ICON</iconIdField>
+      <hideTime v="true" />
       <entityField>#ENTITY</entityField>
-      <view>ActivityTimeline_view</view>
-    </neonViewReference>
+      <maxDBRow v="400" />
+    </timelineViewTemplate>
     <tableViewTemplate>
       <name>ActivitiesTable</name>
       <entityField>#ENTITY</entityField>
@@ -88,7 +93,7 @@
     </tableViewTemplate>
     <treeViewTemplate>
       <name>ActivitiesTreetable</name>
-      <titleField>SUBJECT</titleField>
+      <titleField>SUBJECT_DETAILS</titleField>
       <descriptionField>INFO</descriptionField>
       <iconField>#IMAGE</iconField>
       <entityField>#ENTITY</entityField>
diff --git a/neonView/ActivityMain_view/ActivityMain_view.aod b/neonView/ActivityMain_view/ActivityMain_view.aod
index 5b4191c6e9cf1a0ea8a561619e53f979f6d95c0c..57a928f08c54150ae14580797d167ace94c4aba2 100644
--- a/neonView/ActivityMain_view/ActivityMain_view.aod
+++ b/neonView/ActivityMain_view/ActivityMain_view.aod
@@ -29,11 +29,6 @@
       <entityField>Documents</entityField>
       <view>DocumentFilter_view</view>
     </neonViewReference>
-    <neonViewReference>
-      <name>6066d539-d392-4688-931a-409c10fa1fbe</name>
-      <entityField>Links</entityField>
-      <view>ActivityLinkFilter_view</view>
-    </neonViewReference>
     <neonViewReference>
       <name>8ffd03a7-a841-4674-96bf-04689d46cf48</name>
       <entityField>Attributes</entityField>
diff --git a/neonView/ActivityTimeline_view/ActivityTimeline_view.aod b/neonView/ActivityTimeline_view/ActivityTimeline_view.aod
index 843f80320fbc70ff39617c013a4984c3d6dfe880..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644
--- a/neonView/ActivityTimeline_view/ActivityTimeline_view.aod
+++ b/neonView/ActivityTimeline_view/ActivityTimeline_view.aod
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.1">
-  <name>ActivityTimeline_view</name>
-  <majorModelMode>DISTRIBUTED</majorModelMode>
-  <layout>
-    <boxLayout>
-      <name>layout</name>
-    </boxLayout>
-  </layout>
-  <children>
-    <timelineViewTemplate>
-      <name>Activities</name>
-      <dateField>ENTRYDATE</dateField>
-      <titleField>SUBJECT_DETAILS</titleField>
-      <descriptionField>INFO</descriptionField>
-      <iconIdField>DIRECTION_ICON</iconIdField>
-      <hideTime v="true" />
-      <entityField>#ENTITY</entityField>
-      <maxDBRow v="500" />
-    </timelineViewTemplate>
-  </children>
-</neonView>
diff --git a/neonView/ContractFilter_view/ContractFilter_view.aod b/neonView/ContractFilter_view/ContractFilter_view.aod
index 4933b78162863b690531c4dfb8d4d145f8e90a0d..c508588317a7ad788ca44f004382c3120b2f2bc6 100644
--- a/neonView/ContractFilter_view/ContractFilter_view.aod
+++ b/neonView/ContractFilter_view/ContractFilter_view.aod
@@ -62,14 +62,6 @@
           <name>845c3a71-0fa9-4299-9b85-8fa25f92436d</name>
           <entityField>CONTRACTEND</entityField>
         </neonTableColumn>
-        <neonTableColumn>
-          <name>b72f0fa5-43ba-4852-9dfa-db592193e5a6</name>
-          <entityField>PAYMENT</entityField>
-        </neonTableColumn>
-        <neonTableColumn>
-          <name>ae80fe48-c0c7-4b53-b014-a25417c6fb35</name>
-          <entityField>CONTRACTDUE</entityField>
-        </neonTableColumn>
       </columns>
     </tableViewTemplate>
   </children>
diff --git a/neonView/KeywordEntryEdit_view/KeywordEntryEdit_view.aod b/neonView/KeywordEntryEdit_view/KeywordEntryEdit_view.aod
index 31283c6fff3ca4221d2f5c881bba0963824645ee..061bbb6eebafc1131e711f7ab64fe66fb11bba7d 100644
--- a/neonView/KeywordEntryEdit_view/KeywordEntryEdit_view.aod
+++ b/neonView/KeywordEntryEdit_view/KeywordEntryEdit_view.aod
@@ -2,6 +2,7 @@
 <neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.1">
   <name>KeywordEntryEdit_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
+  <isSmall v="true" />
   <layout>
     <boxLayout>
       <name>layout</name>
diff --git a/neonView/ObjectRelationEdit_view/ObjectRelationEdit_view.aod b/neonView/ObjectRelationEdit_view/ObjectRelationEdit_view.aod
deleted file mode 100644
index 7f3ae6c82059100ec5d878d094c2b6a53398658b..0000000000000000000000000000000000000000
--- a/neonView/ObjectRelationEdit_view/ObjectRelationEdit_view.aod
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.1">
-  <name>ObjectRelationEdit_view</name>
-  <majorModelMode>DISTRIBUTED</majorModelMode>
-  <layout>
-    <boxLayout>
-      <name>layout</name>
-    </boxLayout>
-  </layout>
-  <children>
-    <genericViewTemplate>
-      <name>Edit</name>
-      <editMode v="true" />
-      <entityField>#ENTITY</entityField>
-      <fields>
-        <entityFieldLink>
-          <name>c3ef719e-2453-4216-a13a-1c1debafe410</name>
-          <entityField>selectedObjectRelationTypeIdProxy</entityField>
-        </entityFieldLink>
-        <entityFieldLink>
-          <name>f60a0e0d-c3a9-4ab7-9b52-b33f5bb61d31</name>
-          <entityField>rowIdProxy</entityField>
-        </entityFieldLink>
-        <entityFieldLink>
-          <name>04579da5-0609-4a43-97dd-9e773ec1a29b</name>
-          <entityField>INFO</entityField>
-        </entityFieldLink>
-      </fields>
-    </genericViewTemplate>
-  </children>
-</neonView>
diff --git a/neonView/ObjectRelationFilter_view/ObjectRelationFilter_view.aod b/neonView/ObjectRelationFilter_view/ObjectRelationFilter_view.aod
deleted file mode 100644
index 0199c5d9ca0cb5b21d21753de06d4d23125798f3..0000000000000000000000000000000000000000
--- a/neonView/ObjectRelationFilter_view/ObjectRelationFilter_view.aod
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.1">
-  <name>ObjectRelationFilter_view</name>
-  <majorModelMode>DISTRIBUTED</majorModelMode>
-  <filterable v="true" />
-  <layout>
-    <boxLayout>
-      <name>layout</name>
-    </boxLayout>
-  </layout>
-  <children>
-    <tableViewTemplate>
-      <name>ObjectRelations</name>
-      <autoNewRow v="true" />
-      <entityField>#ENTITY</entityField>
-      <columns>
-        <neonTableColumn>
-          <name>02c397e9-092b-4df0-be67-0fa3a1b02432</name>
-          <entityField>selectedObjectRelationTypeIdProxy</entityField>
-        </neonTableColumn>
-        <neonTableColumn>
-          <name>ab25081c-cb63-4d28-87d0-e4c022aac878</name>
-          <entityField>rowIdProxy</entityField>
-        </neonTableColumn>
-        <neonTableColumn>
-          <name>a5e8b3d6-ff83-461a-ba28-d67e0df5d93d</name>
-          <entityField>INFO</entityField>
-        </neonTableColumn>
-      </columns>
-    </tableViewTemplate>
-  </children>
-</neonView>
diff --git a/neonView/ObjectRelationPreview_view/ObjectRelationPreview_view.aod b/neonView/ObjectRelationPreview_view/ObjectRelationPreview_view.aod
deleted file mode 100644
index 6e5496348316ec265eda9c40167c3750dc10bcba..0000000000000000000000000000000000000000
--- a/neonView/ObjectRelationPreview_view/ObjectRelationPreview_view.aod
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.1">
-  <name>ObjectRelationPreview_view</name>
-  <majorModelMode>DISTRIBUTED</majorModelMode>
-  <layout>
-    <boxLayout>
-      <name>layout</name>
-    </boxLayout>
-  </layout>
-  <children>
-    <genericViewTemplate>
-      <name>Objects</name>
-      <entityField>#ENTITY</entityField>
-      <title>Object</title>
-      <fields>
-        <entityFieldLink>
-          <name>8b21eea2-b6ec-492f-9bfe-4937b61ba1ef</name>
-          <entityField>OBJECT1_ROWID</entityField>
-        </entityFieldLink>
-        <entityFieldLink>
-          <name>eabe1737-7a31-4181-8c32-bda6a9f7d7e9</name>
-          <entityField>OBJECT2_ROWID</entityField>
-        </entityFieldLink>
-      </fields>
-    </genericViewTemplate>
-  </children>
-</neonView>
diff --git a/neonView/ObjectRelationTypeEdit_view/ObjectRelationTypeEdit_view.aod b/neonView/ObjectRelationTypeEdit_view/ObjectRelationTypeEdit_view.aod
index 03950156117d7a1eb4f37b9efb67b833453a8c7b..6560a70b55a6184da2e9bb2fcfd0cf2ca821d37f 100644
--- a/neonView/ObjectRelationTypeEdit_view/ObjectRelationTypeEdit_view.aod
+++ b/neonView/ObjectRelationTypeEdit_view/ObjectRelationTypeEdit_view.aod
@@ -21,6 +21,10 @@
           <name>ffaf9de0-6866-4d0a-80af-42b57169d83e</name>
           <entityField>SOURCE_OBJECT_TYPE</entityField>
         </entityFieldLink>
+        <entityFieldLink>
+          <name>8c839d7f-31c2-4339-a74a-ff5fb83288df</name>
+          <entityField>Type2Enabled_proxy</entityField>
+        </entityFieldLink>
         <entityFieldLink>
           <name>0fd227e4-2896-4ce3-b699-8e5ce82a2862</name>
           <entityField>DEST_RELATION_TITLE</entityField>
diff --git a/neonView/OfferDetail_view/OfferDetail_view.aod b/neonView/OfferCoverLetter_view/OfferCoverLetter_view.aod
similarity index 68%
rename from neonView/OfferDetail_view/OfferDetail_view.aod
rename to neonView/OfferCoverLetter_view/OfferCoverLetter_view.aod
index a465d174bc221a0fa4ada807e8f2cb3aa9d104d3..3eb7add5eefa24bba18d5cee1d847b29ddb3118a 100644
--- a/neonView/OfferDetail_view/OfferDetail_view.aod
+++ b/neonView/OfferCoverLetter_view/OfferCoverLetter_view.aod
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.1">
-  <name>OfferDetail_view</name>
-  <title>Details</title>
+  <name>OfferCoverLetter_view</name>
+  <title>Cover letter</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
     <boxLayout>
@@ -12,18 +12,10 @@
     <genericViewTemplate>
       <name>Details</name>
       <showDrawer v="true" />
-      <drawerCaption>Detail</drawerCaption>
+      <drawerCaption>Cover letter</drawerCaption>
       <entityField>#ENTITY</entityField>
       <title></title>
       <fields>
-        <entityFieldLink>
-          <name>f0d0c68a-8437-4d9e-b852-575efaa984e8</name>
-          <entityField>DELIVERYTERMS</entityField>
-        </entityFieldLink>
-        <entityFieldLink>
-          <name>c66f5e5b-82ad-4f93-9951-d96dfb802dbe</name>
-          <entityField>PAYMENTTERMS</entityField>
-        </entityFieldLink>
         <entityFieldLink>
           <name>ab742325-7d03-4dfd-8afb-779dd8da805b</name>
           <entityField>INFO</entityField>
diff --git a/neonView/OfferFilter_view/OfferFilter_view.aod b/neonView/OfferFilter_view/OfferFilter_view.aod
index 541ac072d5e3df256b4b726da078a091dd94bd8f..ee8f03128aa738e1bdce1f7eb404d0ebd6eeb547 100644
--- a/neonView/OfferFilter_view/OfferFilter_view.aod
+++ b/neonView/OfferFilter_view/OfferFilter_view.aod
@@ -53,6 +53,10 @@
       <name>Offers</name>
       <entityField>#ENTITY</entityField>
       <columns>
+        <neonTableColumn>
+          <name>5755c4a7-0ec4-4ba8-9fa8-a64c440042f8</name>
+          <entityField>IMAGE</entityField>
+        </neonTableColumn>
         <neonTableColumn>
           <name>4d40cee3-bcb1-4e67-8c1d-d5fc2e49cc11</name>
           <entityField>FullOfferCode</entityField>
diff --git a/neonView/OfferMain_view/OfferMain_view.aod b/neonView/OfferMain_view/OfferMain_view.aod
index fd194c1b379bf81e5201f48d3f4bf360ff3fb234..ea4a89a44810d450579b611e28b0e28cf923ff86 100644
--- a/neonView/OfferMain_view/OfferMain_view.aod
+++ b/neonView/OfferMain_view/OfferMain_view.aod
@@ -22,7 +22,7 @@
     <neonViewReference>
       <name>e6b12eed-d67e-467c-9302-f6340f901235</name>
       <entityField>#ENTITY</entityField>
-      <view>OfferDetail_view</view>
+      <view>OfferCoverLetter_view</view>
     </neonViewReference>
     <neonViewReference>
       <name>a3702740-418d-40d5-9415-788542c14abb</name>
diff --git a/neonView/OfferPreview_view/OfferPreview_view.aod b/neonView/OfferPreview_view/OfferPreview_view.aod
index 5a36edbfc7aa6617c5da3e4dffde6d27c92f7ffd..5ebc5733ab8f4abba5d853538e634828874a9593 100644
--- a/neonView/OfferPreview_view/OfferPreview_view.aod
+++ b/neonView/OfferPreview_view/OfferPreview_view.aod
@@ -82,6 +82,14 @@
           <name>3317b73e-68e8-41a8-a678-89c7c7c8513e</name>
           <entityField>SALESPROJECT_ID</entityField>
         </entityFieldLink>
+        <entityFieldLink>
+          <name>59daee43-0e79-49d8-a36a-5ce4c491def9</name>
+          <entityField>PAYMENTTERMS</entityField>
+        </entityFieldLink>
+        <entityFieldLink>
+          <name>a3a9ee30-bdd2-4907-b215-d4b4adcc0f1d</name>
+          <entityField>DELIVERYTERMS</entityField>
+        </entityFieldLink>
       </fields>
     </genericViewTemplate>
     <neonViewReference>
diff --git a/neonView/OrderFilter_view/OrderFilter_view.aod b/neonView/OrderFilter_view/OrderFilter_view.aod
index f631fc736b5d10bc66abd6f4ea02ff47273dd088..0c2cb08ffc4b05dab0f2d3a167f55501d47086f1 100644
--- a/neonView/OrderFilter_view/OrderFilter_view.aod
+++ b/neonView/OrderFilter_view/OrderFilter_view.aod
@@ -53,6 +53,10 @@
       <name>Orders</name>
       <entityField>#ENTITY</entityField>
       <columns>
+        <neonTableColumn>
+          <name>8d4948c3-40cb-45dd-ae04-32ae06458b26</name>
+          <entityField>IMAGE</entityField>
+        </neonTableColumn>
         <neonTableColumn>
           <name>60b83daa-9349-4bef-94d8-5f1fc350da59</name>
           <entityField>SALESORDERCODE</entityField>
diff --git a/neonView/SalesprojectCompetitionPreview_view/SalesprojectCompetitionPreview_view.aod b/neonView/SalesprojectCompetitionPreview_view/SalesprojectCompetitionPreview_view.aod
index ae8dfc222cf2f206b7905db3294cd6c06b599d30..e3f46d0784614e5bfe394425774171e73e0d5b8c 100644
--- a/neonView/SalesprojectCompetitionPreview_view/SalesprojectCompetitionPreview_view.aod
+++ b/neonView/SalesprojectCompetitionPreview_view/SalesprojectCompetitionPreview_view.aod
@@ -10,7 +10,9 @@
   <children>
     <cardViewTemplate>
       <name>Header</name>
+      <iconField>IMAGE</iconField>
       <titleField>CONTACT_ID</titleField>
+      <subtitleField>CONTACT_ID</subtitleField>
       <descriptionField>INFO</descriptionField>
       <entityField>#ENTITY</entityField>
     </cardViewTemplate>
diff --git a/neonView/SalesprojectCycleEdit_view/SalesprojectCycleEdit_view.aod b/neonView/SalesprojectCycleEdit_view/SalesprojectCycleEdit_view.aod
deleted file mode 100644
index de1a3461bb5e7138fb90ae3348fb4f79c2134ebc..0000000000000000000000000000000000000000
--- a/neonView/SalesprojectCycleEdit_view/SalesprojectCycleEdit_view.aod
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.1">
-  <name>SalesprojectCycleEdit_view</name>
-  <majorModelMode>DISTRIBUTED</majorModelMode>
-  <layout>
-    <boxLayout>
-      <name>layout</name>
-    </boxLayout>
-  </layout>
-  <children>
-    <genericViewTemplate>
-      <name>Edit</name>
-      <editMode v="true" />
-      <entityField>#ENTITY</entityField>
-      <fields>
-        <entityFieldLink>
-          <name>ea501589-7a01-42d3-b0f4-521041554ee7</name>
-          <entityField>DATE_START</entityField>
-        </entityFieldLink>
-        <entityFieldLink>
-          <name>5df5e35b-4967-4efd-98ac-a57f757e04b4</name>
-          <entityField>DATE_END</entityField>
-        </entityFieldLink>
-        <entityFieldLink>
-          <name>db138f88-0cc7-42d9-a5d6-2bfc4f13985c</name>
-          <entityField>TYPE</entityField>
-        </entityFieldLink>
-        <entityFieldLink>
-          <name>71891f0f-e610-4584-8936-f2249e99e7ac</name>
-          <entityField>VALUE</entityField>
-        </entityFieldLink>
-      </fields>
-    </genericViewTemplate>
-  </children>
-</neonView>
diff --git a/neonView/SalesprojectCycleFilter_view/SalesprojectCycleFilter_view.aod b/neonView/SalesprojectCycleFilter_view/SalesprojectCycleFilter_view.aod
deleted file mode 100644
index 55809e21f25a772051eff44caa23f2fdbc259d4a..0000000000000000000000000000000000000000
--- a/neonView/SalesprojectCycleFilter_view/SalesprojectCycleFilter_view.aod
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.1">
-  <name>SalesprojectCycleFilter_view</name>
-  <majorModelMode>DISTRIBUTED</majorModelMode>
-  <filterable v="true" />
-  <layout>
-    <boxLayout>
-      <name>layout</name>
-    </boxLayout>
-  </layout>
-  <children>
-    <tableViewTemplate>
-      <name>Cycles</name>
-      <autoNewRow v="true" />
-      <entityField>#ENTITY</entityField>
-      <columns>
-        <neonTableColumn>
-          <name>1f66befa-a479-437e-b68f-da3cac6fed90</name>
-          <entityField>DATE_START</entityField>
-        </neonTableColumn>
-        <neonTableColumn>
-          <name>5001e853-a479-4e63-a0c6-3021926402b6</name>
-          <entityField>TYPE</entityField>
-        </neonTableColumn>
-        <neonTableColumn>
-          <name>8a4c91ad-a1e4-4a94-acad-de232c7b0be7</name>
-          <entityField>VALUE</entityField>
-        </neonTableColumn>
-      </columns>
-    </tableViewTemplate>
-  </children>
-</neonView>
diff --git a/neonView/SalesprojectCyclePreview_view/SalesprojectCyclePreview_view.aod b/neonView/SalesprojectCyclePreview_view/SalesprojectCyclePreview_view.aod
deleted file mode 100644
index 41114194e655c15ee0487f9e0a3d7df2d1043f9c..0000000000000000000000000000000000000000
--- a/neonView/SalesprojectCyclePreview_view/SalesprojectCyclePreview_view.aod
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.1">
-  <name>SalesprojectCyclePreview_view</name>
-  <majorModelMode>DISTRIBUTED</majorModelMode>
-  <layout>
-    <boxLayout>
-      <name>layout</name>
-    </boxLayout>
-  </layout>
-  <children>
-    <cardViewTemplate>
-      <name>Header</name>
-      <titleField>VALUE</titleField>
-      <descriptionField>DATE_START</descriptionField>
-      <entityField>#ENTITY</entityField>
-    </cardViewTemplate>
-    <genericViewTemplate>
-      <name>Info</name>
-      <entityField>#ENTITY</entityField>
-      <fields>
-        <entityFieldLink>
-          <name>e77b903f-a06f-4437-9b25-693b6f2aa45f</name>
-          <entityField>DATE_END</entityField>
-        </entityFieldLink>
-      </fields>
-    </genericViewTemplate>
-  </children>
-</neonView>
diff --git a/neonView/SalesprojectCycle_view/SalesprojectCycle_view.aod b/neonView/SalesprojectCycle_view/SalesprojectCycle_view.aod
deleted file mode 100644
index edacdea2adf843ed29d30a7eb4850f3bcd4fd932..0000000000000000000000000000000000000000
--- a/neonView/SalesprojectCycle_view/SalesprojectCycle_view.aod
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.1">
-  <name>SalesprojectCycle_view</name>
-  <title>Milestones</title>
-  <majorModelMode>DISTRIBUTED</majorModelMode>
-  <layout>
-    <boxLayout>
-      <name>layout</name>
-    </boxLayout>
-  </layout>
-  <children>
-    <neonViewReference>
-      <name>c68c50b8-6ff9-4be4-ab1e-c8bd9b93f650</name>
-      <entityField>SalesprojectCycles</entityField>
-      <view>SalesprojectCycleFilter_view</view>
-    </neonViewReference>
-    <neonViewReference>
-      <name>b172fd14-209d-412f-9250-aeb0f37091b5</name>
-      <entityField>SalesprojectForecasts</entityField>
-      <view>SalesprojectForecastFilter_view</view>
-    </neonViewReference>
-  </children>
-</neonView>
diff --git a/neonView/SalesprojectMain_view/SalesprojectMain_view.aod b/neonView/SalesprojectMain_view/SalesprojectMain_view.aod
index 4f429107957c57843a11aaff1328c91c90cac815..d2651987d7b1400048898ae5d5ad86b2f5b670d3 100644
--- a/neonView/SalesprojectMain_view/SalesprojectMain_view.aod
+++ b/neonView/SalesprojectMain_view/SalesprojectMain_view.aod
@@ -59,5 +59,10 @@
       <entityField>Documents</entityField>
       <view>DocumentFilter_view</view>
     </neonViewReference>
+    <neonViewReference>
+      <name>349a82ad-4a83-4718-b37e-b0adf1ddb0b2</name>
+      <entityField>SalesprojectMilestones</entityField>
+      <view>SalesprojectMilestoneChart_view</view>
+    </neonViewReference>
   </children>
 </neonView>
diff --git a/neonView/ObjectRelationTypePreview_view/ObjectRelationTypePreview_view.aod b/neonView/SalesprojectMilestoneChart_view/SalesprojectMilestoneChart_view.aod
similarity index 61%
rename from neonView/ObjectRelationTypePreview_view/ObjectRelationTypePreview_view.aod
rename to neonView/SalesprojectMilestoneChart_view/SalesprojectMilestoneChart_view.aod
index 0b02d9141e2ecf589fc746a1b7ad2547da75ed6b..5075336ab8a62209ae9b092900eec7b8f8496614 100644
--- a/neonView/ObjectRelationTypePreview_view/ObjectRelationTypePreview_view.aod
+++ b/neonView/SalesprojectMilestoneChart_view/SalesprojectMilestoneChart_view.aod
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.1">
-  <name>ObjectRelationTypePreview_view</name>
+  <name>SalesprojectMilestoneChart_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
     <boxLayout>
@@ -8,10 +8,13 @@
     </boxLayout>
   </layout>
   <children>
-    <cardViewTemplate>
-      <name>header</name>
-      <titleField>SOURCE_RELATION_TITLE</titleField>
+    <multiDataChartViewTemplate>
+      <name>MilestoneChart</name>
+      <chartType>COLUMN</chartType>
+      <xAxis>VALUE</xAxis>
+      <yAxis>DaysCount</yAxis>
+      <categoryField>TYPE</categoryField>
       <entityField>#ENTITY</entityField>
-    </cardViewTemplate>
+    </multiDataChartViewTemplate>
   </children>
 </neonView>
diff --git a/neonView/TaskFilter_view/TaskFilter_view.aod b/neonView/TaskFilter_view/TaskFilter_view.aod
index 0b8c264401f9179e1080095d019415bb750cfad2..b075f1542cc2f91349f2aee9d820156dd96184cc 100644
--- a/neonView/TaskFilter_view/TaskFilter_view.aod
+++ b/neonView/TaskFilter_view/TaskFilter_view.aod
@@ -28,8 +28,8 @@
   <children>
     <timelineViewTemplate>
       <name>TasksTimeline</name>
-      <dateField>START_DATE</dateField>
-      <titleField>SUBJECT</titleField>
+      <dateField>MATURITY_DATE</dateField>
+      <titleField>SUBJECT_DETAILS</titleField>
       <descriptionField>DESCRIPTION</descriptionField>
       <iconIdField>#ICON</iconIdField>
       <entityField>#ENTITY</entityField>
@@ -64,7 +64,7 @@
     </tableViewTemplate>
     <treeViewTemplate>
       <name>TasksTreetable</name>
-      <titleField>SUBJECT</titleField>
+      <titleField>SUBJECT_DETAILS</titleField>
       <descriptionField>DESCRIPTION</descriptionField>
       <iconField>#ICON</iconField>
       <entityField>#ENTITY</entityField>
diff --git a/neonView/TaskMain_view/TaskMain_view.aod b/neonView/TaskMain_view/TaskMain_view.aod
index 1c962435644b495ed5b00f2f0509b297d5cbc1e7..ac9d30a87c148300144507fe39e7274db8338ba3 100644
--- a/neonView/TaskMain_view/TaskMain_view.aod
+++ b/neonView/TaskMain_view/TaskMain_view.aod
@@ -41,10 +41,5 @@
       <entityField>MainDocuments</entityField>
       <view>DocumentFilter_view</view>
     </neonViewReference>
-    <neonViewReference>
-      <name>37975d30-f449-4a9f-8eac-81dcad4bbf97</name>
-      <entityField>Links</entityField>
-      <view>TaskLinkFilter_view</view>
-    </neonViewReference>
   </children>
 </neonView>
diff --git a/others/db_changes/Data_alias/basic/2019.2/AttributeKeyword.xml b/others/db_changes/Data_alias/basic/2019.2/AttributeKeyword.xml
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/preferences/_____PREFERENCES_PROJECT/_____PREFERENCES_PROJECT.aod b/preferences/_____PREFERENCES_PROJECT/_____PREFERENCES_PROJECT.aod
index 2e627c2e517e6de8e51a348a72ea341be0d36ca5..35430f5089fee2c2b0e5c87d3278c5f9d34a897c 100644
--- a/preferences/_____PREFERENCES_PROJECT/_____PREFERENCES_PROJECT.aod
+++ b/preferences/_____PREFERENCES_PROJECT/_____PREFERENCES_PROJECT.aod
@@ -2,7 +2,7 @@
 <preferences xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="3.1.0" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/preferences/3.1.0">
   <name>_____PREFERENCES_PROJECT</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
-  <projectName>xRM-Basic2019</projectName>
+  <projectName>xRM-Basic5</projectName>
   <jditoMaxContentSize v="57671680" />
   <calendarCategoriesEvent>
     <entry>
diff --git a/process/ActivityTask_lib/process.js b/process/ActivityTask_lib/process.js
index 8f7de2b78e5f70871594f05d7cf2f9c83b04c845..f68618c2379dddff760583ee455a00191d06b8a0 100644
--- a/process/ActivityTask_lib/process.js
+++ b/process/ActivityTask_lib/process.js
@@ -1,4 +1,3 @@
-import("system.logging");
 import("system.vars");
 import("system.util");
 import("system.datetime");
diff --git a/process/Attribute_lib/process.js b/process/Attribute_lib/process.js
index af3d24d9585b86cd16d243fb69b02a0087e47aaf..4833062c4d4339456153be1f9e59a7978ce05498 100644
--- a/process/Attribute_lib/process.js
+++ b/process/Attribute_lib/process.js
@@ -50,8 +50,8 @@ AttributeUtil.getPossibleAttributes = function (pObjectType, pIncludeGroups, pFi
         attrCond.andSqlCondition(filteredIdsCondition);
     }
 
-//    if (!pIncludeGroups)
-//        attrCond.and("ATTRIBUTE_TYPE != '" + $AttributeTypes.GROUP + "'");
+    if (!pIncludeGroups)
+        attrCond.and("ATTRIBUTE_TYPE != '" + $AttributeTypes.GROUP + "'");
     
     var attributes = db.array(db.COLUMN, attrCond.buildSql(attrSql));
     
diff --git a/process/Contact_lib/process.js b/process/Contact_lib/process.js
index 7539546b86e240ee05c0c28df960fec4ef92a420..f533b09e7c845e0beb0501277af23ea1a42e228b 100644
--- a/process/Contact_lib/process.js
+++ b/process/Contact_lib/process.js
@@ -332,6 +332,17 @@ ContactUtils.getFullContactString = function()
     + " left join ADDRESS on ADDRESS.ADDRESSID = CONTACT.ADDRESS_ID";
 }
 
+/**
+ * get the addressid of the default address
+ *
+ * @return {String} the ID or "" if no default address exists
+ */
+ContactUtils.getDefaultAddressId = function(pContactId)
+{
+    return db.cell(SqlCondition.begin().andPrepare("CONTACT.CONTACTID", pContactId)
+                               .buildSql("select ADDRESS_ID from CONTACT", "1=2"));
+}
+
 /**
  * object for handling of a single contact
  * provides static- and instance-functions
diff --git a/process/Context_lib/process.js b/process/Context_lib/process.js
index 82ea3eef6b21f0e6a8541a7021808c027235e9ed..881dbcdf80a726edd9f13f4d1ccd402719345ef1 100644
--- a/process/Context_lib/process.js
+++ b/process/Context_lib/process.js
@@ -6,7 +6,6 @@ import("Keyword_lib");
 import("Sql_lib");
 import("Proto_lib");
 import("Contact_lib");
-import("system.logging");
 
 /**
  * Methods to manage contexts.
@@ -195,11 +194,22 @@ ContextSelector.create = function(pTableName, pIdField, pTitleExpression)
     return new ContextSelector(pTableName, pIdField, pTitleExpression);
 };
 /**
- * @return {String} full id field containing tablename and column
+ * @param {String} pField the fieldname that shall be returned as full string
+ * @return {String} full field containing tablename and the column; if the column itself is already a full qualified field that field is returned
+ */
+ContextSelector.prototype.getFullField = function(pField)
+{
+    if (SqlUtils.isFullFieldQualifier(pField))
+        return pField;
+    else
+        return this.tableName + "." + pField;
+};
+/**
+ * @return {String} full id field containing tablename and column; if the column itself is already a full qualified field that field is returned
  */
 ContextSelector.prototype.getFullIdField = function()
 {
-    return this.tableName + "." + this.idField;
+    return this.getFullField(this.idField);
 };
 /**
  * @return {String} full from-expression with tablename and join-part
@@ -347,7 +357,7 @@ ContextUtils.getNameSubselectSql = function(pContextIdDbField, pRowIdDbField)
     var selectMap = ContextUtils.getSelectMap ()
     for (let contextId in selectMap)
     {
-        select += "when '" + contextId + "' then (select " + selectMap[contextId].titleExpression + " from " + selectMap[contextId].getFullFromClause() + (pRowIdDbField ? " where " + selectMap[contextId].idField + " = " + pRowIdDbField : " ") + ") ";
+        select += "when '" + contextId + "' then (select " + selectMap[contextId].titleExpression + " from " + selectMap[contextId].getFullFromClause() + (pRowIdDbField ? " where " + selectMap[pContextId].getFullIdField() + " = " + pRowIdDbField : " ") + ") ";
     }
 
     select += "else 'Not defined in ContextUtils.getNameSql()!'";
@@ -382,7 +392,7 @@ ContextUtils.getContextDataSql = function(pContextId, pContactId, pWithDate, pAc
     var cond = SqlCondition.begin();
     if (pContactId)
     {
-        cond.andPrepare(ownContextSelector.tableName + "." + ownContextSelector.contactIdField, pContactId)
+        cond.andPrepare(ownContextSelector.getFullField(ownContextSelector.contactIdField), pContactId)
     }
     
     if (pActive != undefined)
@@ -408,7 +418,7 @@ ContextUtils.getContextDataSql = function(pContextId, pContactId, pWithDate, pAc
         
         pExcludedObjectIds.forEach(function(id)
         {
-            this.andPrepare(ownContextSelector.tableName + "." + ownContextSelector.idField, id, "# <> ?");
+            this.andPrepare(ownContextSelector.getFullIdField(), id, "# <> ?");
         }, exludedIdsCond)
         
         cond.andSqlCondition(exludedIdsCond);
diff --git a/process/Data_lib/process.js b/process/Data_lib/process.js
index fe628720ef18b4a5d94ab82884a9cc3bf2f4cd96..e6802ed44f10df422da714d12f634bafda9918e8 100644
--- a/process/Data_lib/process.js
+++ b/process/Data_lib/process.js
@@ -366,7 +366,7 @@ DataTree.prototype.addArray = function(pData, pManipulateNodeFn)
 DataTree.prototype.toArray = function(pMaxDepth) 
 {   
     var that = this;
-    // TODO: maybe implement without recursion to prevent stack overflow even on deep cycles...
+    // TODO: maybe implement without recursion to prevent stack overflow even on deep milestones...
     var treeArray = [];
     var tree = this._dataTree;
     
diff --git a/process/Employee_lib/process.js b/process/Employee_lib/process.js
index dac86b25c4f2515a8db0a6b58585a9026a6f1c46..17ca0efa8f9fb5878a1b5ff4599310c11d48f7b9 100644
--- a/process/Employee_lib/process.js
+++ b/process/Employee_lib/process.js
@@ -1,113 +1,116 @@
-import("system.db");
-import("Sql_lib");
-import("system.tools");
-
-/**
- * Provides functions for employees and users.j
- * 
- * Do not create an instance of this!
- * 
- * @class
- */
-function EmployeeUtils () {}
-
-/**
- * Returns the contact id of the current user
- * 
- * @return the contact id
- */
-EmployeeUtils.getCurrentContactId = function ()
-{
-    var user = tools.getCurrentUser();
-    return user ? user[tools.PARAMS][tools.CONTACTID] : null;
-}
-
-/**
- * Returns the username id of the current user
- * 
- * @return the username
- */
-EmployeeUtils.getCurrentUserName = function ()
-{
-    var user = tools.getCurrentUser();
-    return user ? user[tools.TITLE] : null;
-}
-
-EmployeeUtils.sliceUserId = function (pUserId)
-{
-    return pUserId.substr(10, 36);
-}
-
-/**
- * generates a username from the firstname and lastname with the given structure
- * 
- * @param {String} pFirstName
- * @param {String} pLastName
- * @param {String} pStructure the structure of the username, special characters:
- *      f - one letter of the firstname in lowercase
- *      F - one letter of the firstname in uppsercase
- *      l - one letter of the lastname in lowercase
- *      L - one letter of the lastname in uppsercase
- *      f+ - the complete firstname in lowercase
- *      F+ - the complete firstname
- *      l+ - the complete lastname in lowercae
- *      L+ - the complete lastname 
- * 
- * @return {String} the generated username
- */
-EmployeeUtils.generateUserName = function (pFirstName, pLastName, pStructure)
-{
-    if (!pStructure || (!pFirstName && !pLastName))
-        return null;
-    
-    var firstNameIndex = 0;
-    var lastNameIndex = 0;
-    var userName = pStructure.replace(/(f\+|l\+|f|l)/ig, function (type)
-    {
-        switch (type)
-        {
-            case "f+":
-            return pFirstName.toLowerCase() || "";
-            case "F+":
-                return pFirstName || "";
-            case "l+":
-                return pLastName.toLowerCase()  || "";
-            case "L+":
-                return pLastName || "";
-            case "f":
-                return pFirstName.charAt(firstNameIndex++).toLowerCase() || "";
-            case "F":
-                return pFirstName.charAt(firstNameIndex++).toUpperCase() || "";
-            case "l":
-                return pLastName.charAt(lastNameIndex++).toLowerCase() || "";
-            case "L":
-                return pLastName.charAt(lastNameIndex++).toUpperCase() || "";
-        }
-    });
-    
-    return userName;
-}
-
-/**
- * checks if an employee is used somewhere
- * 
- * @param {String} pContactId the contact id of the user
- * 
- * @return {boolean} if the employee has relations
- */
-EmployeeUtils.hasRelations = function (pContactId)
-{
-    //sql queries with selects on tables where an employee can be used
-    var queries = [
-        SqlCondition.begin()
-            .andPrepare("ACTIVITY.CREATOR", pContactId)
-            .buildSql("select 1 from ACTIVITY"),
-        SqlCondition.begin()
-            .andPrepare("TIMETRACKING.CONTACT_ID", pContactId)
-            .buildSql("select 1 from TIMETRACKING")
-    ];
-    return queries.some(function (sql)
-        {
-            return db.cell(sql) != "";
-        });
+import("system.db");
+import("Sql_lib");
+import("system.tools");
+
+/**
+ * Provides functions for employees and users.j
+ * 
+ * Do not create an instance of this!
+ * 
+ * @class
+ */
+function EmployeeUtils () {}
+
+/**
+ * Returns the contact id of the current user
+ * 
+ * @return the contact id
+ */
+EmployeeUtils.getCurrentContactId = function ()
+{
+    var user = tools.getCurrentUser();
+    return user ? user[tools.PARAMS][tools.CONTACTID] : null;
+}
+
+/**
+ * Returns the username id of the current user
+ * 
+ * @return the username
+ */
+EmployeeUtils.getCurrentUserName = function ()
+{
+    var user = tools.getCurrentUser();
+    return user ? user[tools.TITLE] : null;
+}
+
+EmployeeUtils.sliceUserId = function (pUserId)
+{
+    return pUserId.substr(10, 36);
+}
+
+/**
+ * generates a username from the firstname and lastname with the given structure
+ * 
+ * @param {String} pFirstName
+ * @param {String} pLastName
+ * @param {String} pStructure the structure of the username, special characters:
+ *      f - one letter of the firstname in lowercase
+ *      F - one letter of the firstname in uppsercase
+ *      l - one letter of the lastname in lowercase
+ *      L - one letter of the lastname in uppsercase
+ *      f+ - the complete firstname in lowercase
+ *      F+ - the complete firstname
+ *      l+ - the complete lastname in lowercae
+ *      L+ - the complete lastname 
+ * 
+ * @return {String} the generated username
+ */
+EmployeeUtils.generateUserName = function (pFirstName, pLastName, pStructure)
+{
+    if (!pStructure || (!pFirstName && !pLastName))
+        return null;
+    
+    var firstNameIndex = 0;
+    var lastNameIndex = 0;
+    var userName = pStructure.replace(/(f\+|l\+|f|l)/ig, function (type)
+    {
+        switch (type)
+        {
+            case "f+":
+            return pFirstName.toLowerCase() || "";
+            case "F+":
+                return pFirstName || "";
+            case "l+":
+                return pLastName.toLowerCase()  || "";
+            case "L+":
+                return pLastName || "";
+            case "f":
+                return pFirstName.charAt(firstNameIndex++).toLowerCase() || "";
+            case "F":
+                return pFirstName.charAt(firstNameIndex++).toUpperCase() || "";
+            case "l":
+                return pLastName.charAt(lastNameIndex++).toLowerCase() || "";
+            case "L":
+                return pLastName.charAt(lastNameIndex++).toUpperCase() || "";
+        }
+    });
+    
+    return userName;
+}
+
+/**
+ * checks if an employee is used somewhere
+ * 
+ * @param {String} pContactId the contact id of the user
+ * 
+ * @return {boolean} if the employee has relations
+ */
+EmployeeUtils.hasRelations = function (pContactId)
+{
+    //sql queries with selects on tables where an employee can be used
+    var queries = [
+        SqlCondition.begin()
+            .andPrepare("ACTIVITY.CREATOR", pContactId)
+            .buildSql("select 1 from ACTIVITY"),
+        SqlCondition.begin()
+            .andPrepare("TASK.REQUESTOR_CONTACT_ID", pContactId)
+            .buildSql("select 1 from TASK"),
+        SqlCondition.begin()
+            .andPrepare("TIMETRACKING.CONTACT_ID", pContactId)
+            .buildSql("select 1 from TIMETRACKING")
+    ];
+    return queries.some(function (sql)
+        {
+            return db.cell(sql) != "";
+        });
 }
\ No newline at end of file
diff --git a/process/JditoFilter_lib/process.js b/process/JditoFilter_lib/process.js
index 64d5ea5a3107407acc64475b059ccb2a721858a7..47338a2ea2b09bb468ef588daa1784a150f5fad0 100644
--- a/process/JditoFilter_lib/process.js
+++ b/process/JditoFilter_lib/process.js
@@ -1,112 +1,199 @@
-
-/**
- * object for filtering records
- * 
- * @param {Array} pColumns the column names
- * @param {String|Object} pFilter the filter object
- */
-function JditoFilter (pColumns, pFilter) 
-{
-    var columnMap = {};
-    pColumns.forEach(function (row, i)
-    {
-        columnMap[row] = i;
-    });
-    this._columnMap = columnMap;
-    
-    if (pFilter.length) //check if pFilter is a string
-        pFilter = JSON.parse(pFilter);
-    
-    this._operator = pFilter.operator;
-    this._filters = pFilter.childs;
-}
-
-/**
- * tests the given row if it matches the filter
- * 
- * @param {Array} pRow one record
- * 
- * @return {boolean} true, if it matches the condition
- */
-JditoFilter.prototype.checkRecord = function (pRow)
-{
-    if (this._filters.length == 0)
-        return true;
-    
-    if (this._operator == "AND")
-        return this._filters.every(_testFn, this);
-    
-    return this._filters.some(_testFn, this);
-    
-    function _testFn (pFilter)
-    {
-        let value = pRow[this._columnMap[pFilter.name]];
-        return this._testValue(value, (pFilter.key || pFilter.value), pFilter.operator);
-    }
-}
-
-/**
- * compares two values with the given operator
- */
-JditoFilter.prototype._testValue = function (pRowValue, pFilterValue, pOperator)
-{
-    switch (pOperator)
-    {
-        case "CONTAINS":
-            return (new RegExp(pFilterValue)).test(pRowValue);
-        case "CONTAINSNOT":
-            return !(new RegExp(pFilterValue)).test(pRowValue);
-        case "STARTSWITH":
-            return (new RegExp("^" + pFilterValue)).test(pRowValue);
-        case "ENDSWITH":
-            return (new RegExp(pFilterValue + "$")).test(pRowValue);
-        case "EQUAL":
-            return (new RegExp("^" + pFilterValue + "$")).test(pRowValue);
-        case "NOT_EQUAL":
-            return !(new RegExp("^" + pFilterValue + "$")).test(pRowValue);
-        case "LESS":
-            return pRowValue < pFilterValue;
-        case "LESS_OR_EQUAL":
-            return pRowValue <= pFilterValue;
-        case "GREATER":
-            return pRowValue > pFilterValue;
-        case "GREATER_OR_EQUAL":
-            return pRowValue >= pFilterValue;
-        case "ISNULL":
-            return pRowValue == "";
-        case "ISNOTNULL":
-            return pRowValue != "";
-    }
-}
-
-/**
- * Provides functions for using the filter with jdito recordcontainers. You should only use this
- * if there is no other, faster way to filter the records
- * 
- * Do not instanciate this!
- * 
- * @class
- */
-function JditoFilterUtils () {}
-
-/**
- * Filters the given records
- * 
- * @param {Array} pColumns one dimensional array with all column names, the order has to match the columns of pRecords
- * @param {Array} pRecords two dimensional array with all records
- * @param {String|Object} pFilter the value of $local.filter
- * 
- * @return {Array} the filtered records
- */
-JditoFilterUtils.filterRecords = function (pColumns, pRecords, pFilter)
-{
-    if (!pFilter)
-        return pRecords;
-    
-    var filter = new JditoFilter(pColumns, pFilter);
-    
-    return pRecords.filter(function (row)
-        {
-            return this.checkRecord(row);
-        }, filter);
+import("Sql_lib");
+
+/**
+ * object for filtering records
+ * 
+ * @param {Array} pColumns the column names
+ * @param {String|Object} pFilter the filter object
+ */
+function JditoFilter (pColumns, pFilter) 
+{
+    var columnMap = {};
+    pColumns.forEach(function (row, i)
+    {
+        columnMap[row] = i;
+    });
+    this._columnMap = columnMap;
+    
+    if (pFilter.length) //check if pFilter is a string
+        pFilter = JSON.parse(pFilter);
+    
+    this._operator = pFilter.operator;
+    this._filters = pFilter.childs;
+}
+
+/**
+ * tests the given row if it matches the filter
+ * 
+ * @param {Array} pRow one record
+ * 
+ * @return {boolean} true, if it matches the condition
+ */
+JditoFilter.prototype.checkRecord = function (pRow)
+{
+    if (this._filters.length == 0)
+        return true;
+    
+    if (this._operator == "AND")
+        return this._filters.every(_testFn, this);
+    
+    return this._filters.some(_testFn, this);
+    
+    function _testFn (pFilter)
+    {
+        let value = pRow[this._columnMap[pFilter.name]];
+        return this._testValue(value, (pFilter.key || pFilter.value), pFilter.operator);
+    }
+}
+
+/**
+ * compares two values with the given operator
+ */
+JditoFilter.prototype._testValue = function (pRowValue, pFilterValue, pOperator)
+{
+    switch (pOperator)
+    {
+        case "CONTAINS":
+            return (new RegExp(pFilterValue)).test(pRowValue);
+        case "CONTAINSNOT":
+            return !(new RegExp(pFilterValue)).test(pRowValue);
+        case "STARTSWITH":
+            return (new RegExp("^" + pFilterValue)).test(pRowValue);
+        case "ENDSWITH":
+            return (new RegExp(pFilterValue + "$")).test(pRowValue);
+        case "EQUAL":
+            return (new RegExp("^" + pFilterValue + "$")).test(pRowValue);
+        case "NOT_EQUAL":
+            return !(new RegExp("^" + pFilterValue + "$")).test(pRowValue);
+        case "LESS":
+            return pRowValue < pFilterValue;
+        case "LESS_OR_EQUAL":
+            return pRowValue <= pFilterValue;
+        case "GREATER":
+            return pRowValue > pFilterValue;
+        case "GREATER_OR_EQUAL":
+            return pRowValue >= pFilterValue;
+        case "ISNULL":
+            return pRowValue == "";
+        case "ISNOTNULL":
+            return pRowValue != "";
+    }
+}
+
+/**
+ * Provides functions for using the filter with jdito recordcontainers. You should only use this
+ * if there is no other, faster way to filter the records
+ * 
+ * Do not instanciate this!
+ * 
+ * @class
+ */
+function JditoFilterUtils () {}
+
+/**
+ * Filters the given records
+ * 
+ * @param {Array} pColumns one dimensional array with all column names, the order has to match the columns of pRecords
+ * @param {Array} pRecords two dimensional array with all records
+ * @param {String|Object} pFilter the value of $local.filter
+ * 
+ * @return {Array} the filtered records
+ */
+JditoFilterUtils.filterRecords = function (pColumns, pRecords, pFilter)
+{
+    if (!pFilter)
+        return pRecords;
+    
+    var filter = new JditoFilter(pColumns, pFilter);
+    
+    return pRecords.filter(function (row)
+        {
+            return this.checkRecord(row);
+        }, filter);
+}
+
+JditoFilterUtils.getSqlCondition = function (pFilter, pTable, pColumnMap)
+{
+    var condition = new SqlCondition();
+    
+    if (!pFilter)
+        return condition;
+    if (pFilter.length) //check if pFilter is a string
+        pFilter = JSON.parse(pFilter);
+    if (!pColumnMap)
+        pColumnMap = {};
+    
+    _addCondition.call(condition, pFilter, pFilter.operator);
+    
+    return condition;
+    
+    //recursive function (for compatibility with a condition tree) that
+    //builds the SqlCondition
+    function _addCondition (pCondition, pOperator)
+    {
+        if (pCondition.type == "row")
+        {
+            if (pCondition.name in pColumnMap)
+                pCondition.name = pColumnMap[pCondition.name];
+            else if (pTable)
+                pCondition.name =  pTable + "." + pCondition.name;
+            
+            pCondition.value = (pCondition.key || pCondition.value);
+            var condition = _getCondition.call(pCondition);
+            if (pOperator == "AND")
+                this.andPrepare(pCondition.name, pCondition.value, condition);
+            else if (pOperator == "OR")
+                this.orPrepare(pCondition.name, pCondition.value, condition);
+        }
+        else if (pCondition.type == "group")
+        {
+            let subCondition = new SqlCondition();
+            let operator = pCondition.operator;
+            pCondition.childs.forEach(function (cond)
+            {
+                _addCondition.call(subCondition, cond, operator);
+            });
+            if (pOperator == "AND")
+                this.andSqlCondition(subCondition);
+            else if (pOperator == "OR")
+                this.orSqlCondition(subCondition);
+        }
+    }
+    
+    //returns the condition depending on the operator and 
+    //adds wildcards to the value if necessary
+    function _getCondition ()
+    {
+        switch (this.operator)
+        {
+            case "CONTAINS":
+                this.value = "%" + this.value + "%";
+                return "# like ?";
+            case "CONTAINSNOT":
+                this.value = "%" + this.value + "%";
+                return "# not like ?";
+            case "STARTSWITH":
+                this.value = this.value + "%";
+                return "# like ?";
+            case "ENDSWITH":
+                this.value = "%" + this.value;
+                return "# like ?";
+            case "EQUAL":
+                return "# = ?";
+            case "NOT_EQUAL":
+                return "# != ?";
+            case "LESS":
+                return "# < ?";
+            case "LESS_OR_EQUAL":
+                return "# <= ?";
+            case "GREATER":
+                return "# > ?";
+            case "GREATER_OR_EQUAL":
+                return "# >= ?";
+            case "ISNULL":
+                return "# is null";
+            case "ISNOTNULL":
+                return "# is not null";
+        }
+    }
 }
\ No newline at end of file
diff --git a/process/Keyword_lib/process.js b/process/Keyword_lib/process.js
index a4527c2594eb3c43724bfa790cb6de3ffd803294..971a45c6306a22c4b6508ffbe6a0fd8cfc834aa3 100644
--- a/process/Keyword_lib/process.js
+++ b/process/Keyword_lib/process.js
@@ -1,4 +1,3 @@
-import("system.logging");
 import("system.vars");
 import("system.SQLTYPES");
 import("system.db");
@@ -189,6 +188,46 @@ KeywordUtils.getEntryNamesAndIdsByContainer = function(pContainerName)
     return list;
 };
 
+/**
+ * checks, if a specific keyword exists
+ * 
+ * @param {String} pKeyId the key of an element within a containerName - this is the value that is stored in the reference-table (e.g. "DE")
+ * @param {String} pContainerName specifies the type of the keyword and therefore the list elements;
+ *                                  e.g. "COUNTRY"; use an entry of the $KeywordRegistry here
+ * 
+ * @return {Boolean}
+ */
+KeywordUtils.exists = function(pKeyId, pContainerName)
+{
+    var sql = SqlCondition.begin()
+                          .andPrepare("AB_KEYWORD_ENTRY.KEYID", pKeyId)
+                          .andPrepare("AB_KEYWORD_ENTRY.CONTAINER", pContainerName)
+                          .buildSql("select count(*) from AB_KEYWORD_ENTRY", "1=2")
+    return parseInt(db.cell(sql)) > 0;
+};
+
+/**
+ * get the translated container name.
+ * 
+ * @param {String} pContainerName specifies the type of the keyword and therefore the list elements;
+ *                                  e.g. "COUNTRY"; use an entry of the $KeywordRegistry here
+ * @return translated name, if it exists in the switch case
+ */
+KeywordUtils.getTranslatedContainer = function(pContainerName)
+{
+    switch (pContainerName)
+    {
+        case "SalesprojectPhase":
+            return translate.text("Phase");
+        case "SalesprojectState":
+            return translate.text("State");
+            break;
+        default:
+            return "Please add " + pContainerName + " to the switch case in Salesproject_lib";
+    }
+
+}
+
 /**
  * object that provides featrues for a single keyword attribute; initalizes itself on creation with a specific keyword-attribute
  * 
@@ -434,7 +473,7 @@ function LegacyKeywordUtils(){}
                     ,_createKeywordEntry("16", translate.text("Lead", locale))
                 ]);
                 break;
-            case "SALESPROJECT.CYCLE.TYPE":
+            case "SALESPROJECT.MILESTONE.TYPE":
                 valueContainer = _createKeywordEntriesContainer([
                      _createKeywordEntry("1", translate.text("Phase", locale), null, {keyword: "SALESPROJECT.PHASE"})
                     ,_createKeywordEntry("2", translate.text("State", locale), null, {keyword: "SALESPROJECT.STATE"})
diff --git a/process/ObjectRelation_lib/process.js b/process/ObjectRelation_lib/process.js
index 710f0c64e95ef07b4835a417bb2f5a216ee9d4ae..336694ba5c9a214c14842ea3d212c2f632b5d8e9 100644
--- a/process/ObjectRelation_lib/process.js
+++ b/process/ObjectRelation_lib/process.js
@@ -15,10 +15,13 @@ function ObjectRelationUtils() {}
  * 
  * @param {String} [pObjectType=undefined] the object type to load the relation types for.] 
  * @param {Boolean} [pFullInfo=false] return also RELATION_TYPE, direction (normal, reverse, same), hierarchy, OBJECT_TYPE dest, OBJECT_TYPE source, objectrelationtypeId1, objectrelationtypeId2, side, objectrelationtypeId, other title
+ * @param {Boolean} [pOnlyFirstSide=false] load all types only for the first side.
+ * @param {String} [pRelationTypeId=undefined] load only the specified relationType
+ * @param {Boolean} [pDummyField=false] empty dummy-field needed for Type2Enabled_proxy-field in ObjectRelationType_entity to get changes of the Type2Enabled_proxy-field in the onUpdate Process
  * 
  * @return {String[][]}
  */
-ObjectRelationUtils.getPossibleRelationTypes = function(pObjectType, pFullInfo, pOnlyFirstSide, pRelationTypeId)
+ObjectRelationUtils.getPossibleRelationTypes = function(pObjectType, pFullInfo, pOnlyFirstSide, pRelationTypeId, pDummyField)
 {
     var sql = " from AB_OBJECTRELATIONTYPE main \n\
             left join AB_OBJECTRELATIONTYPE type2 on (type2.AB_OBJECTRELATIONTYPEID <> main.AB_OBJECTRELATIONTYPEID and type2.RELATION_TYPE = main.RELATION_TYPE) ";
@@ -78,7 +81,7 @@ ObjectRelationUtils.getPossibleRelationTypes = function(pObjectType, pFullInfo,
              else type2.AB_OBJECTRELATIONTYPEID end objectrelationtypeId2, \n\
         main.SIDE,\n\
         case when type2.AB_OBJECTRELATIONTYPEID is  null then main.AB_OBJECTRELATIONTYPEID else type2.AB_OBJECTRELATIONTYPEID end,\n\
-        type2.RELATION_TITLE" + sql;
+        type2.RELATION_TITLE" + (pDummyField ? ", ''" : "") + sql;
     }
        
     // full info:
@@ -90,12 +93,13 @@ ObjectRelationUtils.getPossibleRelationTypes = function(pObjectType, pFullInfo,
  * returns the objectrelationtypeId, title, RELATION_TYPE, direction (normal, reverse, same), hierarchy, OBJECT_TYPE dest, OBJECT_TYPE source, objectrelationtypeId1, objectrelationtypeId2, side,objectrelationtypeId, other title
  * 
  * @param {String} pRelationTypeId the RelationTypeId to load the full relation type for.
+ * @param {Boolean} [pDummyField=false] empty dummy-field needed for Type2Enabled_proxy-field in ObjectRelationType_entity to get changes of the Type2Enabled_proxy-field in the onUpdate Process
  * 
  * @return {String[][]}
  */
-ObjectRelationUtils.getRelationType = function(pRelationTypeId)
+ObjectRelationUtils.getRelationType = function(pRelationTypeId, pDummyField)
 {
-    var data = ObjectRelationUtils.getPossibleRelationTypes(undefined, true, false, pRelationTypeId);
+    var data = ObjectRelationUtils.getPossibleRelationTypes(undefined, true, false, pRelationTypeId, pDummyField);
     if (data.length > 0)
         return data[0];
     else
diff --git a/process/Product_lib/process.js b/process/Product_lib/process.js
index 4780833eed4d897a49e271e49349fde17c00d5ca..cc2645e75e5f32a2205e6000f598f16c6536b024 100644
--- a/process/Product_lib/process.js
+++ b/process/Product_lib/process.js
@@ -1,4 +1,3 @@
-import("system.logging");
 import("system.util");
 import("system.SQLTYPES");
 import("system.datetime");
diff --git a/process/Salesproject_lib/process.js b/process/Salesproject_lib/process.js
index 380aecbc0df64c6f1984150721286c52dfcecdf7..ba78c7709d79f194884fe965eb7a80bf68a00ce1 100644
--- a/process/Salesproject_lib/process.js
+++ b/process/Salesproject_lib/process.js
@@ -1,3 +1,4 @@
+import("Sql_lib");
 import("system.neon");
 import("system.vars");
 import("system.util");
@@ -40,17 +41,28 @@ Salesproject.validateProjectNumber = function(projectNumber) {
  * Insert a new milestone.
  * 
  * @param {String} salesprojectId of the salesproject
- * @param {Integer} type can be any value of the keyword SALESPROJECT.CYCLE.TYPE
+ * @param {Integer} type can be any value of the keyword SALESPROJECT.MILESTONE.TYPE
  * @param {Integer} value value of the phase or state
- * @param {Boolean} notifyForecast if true, notify user to update the forecast
+ * @param {Boolean} [notifyForecast=false] if true, notify user to update the forecast
  * 
  * @result {Boolean} true if inserted, else false
  */
 Salesproject.insertMilestone = function(salesprojectId, type, value, notifyForecast) {
-    if (LegacyKeywordUtils.createKeyword("SALESPROJECT.CYCLE.TYPE").exists(type)) {
+    if (KeywordUtils.exists(value, type)) {
+        db.updateData(
+            "SALESPROJECT_MILESTONE",
+            ["DATE_END"],
+            null,
+            [vars.get("$sys.date")],
+            SqlCondition.begin()
+                        .andPrepare("SALESPROJECT_MILESTONE.SALESPROJECT_ID", salesprojectId)
+                        .andPrepare("SALESPROJECT_MILESTONE.TYPE", type)
+                        .and("SALESPROJECT_MILESTONE.DATE_END is null")
+                        .build("1=2"));
+        
         db.insertData(
-            "SALESPROJECT_CYCLE",
-            ["SALESPROJECT_CYCLEID", "SALESPROJECT_ID", "TYPE", "VALUE", "DATE_START"],
+            "SALESPROJECT_MILESTONE",
+            ["SALESPROJECT_MILESTONEID", "SALESPROJECT_ID", "TYPE", "VALUE", "DATE_START"],
             null,
             [util.getNewUUID(), salesprojectId, type, value, vars.get("$sys.date")]);
         if (notifyForecast) {
@@ -92,4 +104,4 @@ Salesproject.createNewSalesproject= function(pRelationId)
         params["ContactId_param"] = pRelationId;
     
     neon.openContext("Salesproject", null, null, neon.OPERATINGSTATE_NEW, params);
-}
+}
\ No newline at end of file
diff --git a/process/Sql_lib/process.js b/process/Sql_lib/process.js
index ffeaa776d32b61b284bf2447b4ded80a40b4c140..4c68f069fb8f6417e6ce3b78795cc4f0cc8b2091 100644
--- a/process/Sql_lib/process.js
+++ b/process/Sql_lib/process.js
@@ -1033,42 +1033,129 @@ SqlMaskingUtils.prototype.yearFromDate = function(pField)
     return retSql;
 }
 
+/**
+ * functions for various Sql-actions
+ * Do not create an instance of this!
+ *
+ * @class
+ * @static
+ */
 function SqlUtils() {}
 
-SqlUtils.getSingleColumnType = function(fieldOrTableName, columnName, alias) {
-    var tableName, fieldVarType;
-    if (columnName == undefined){
-        fieldVarType = typeof(fieldOrTableName);
-        if (fieldVarType == "string") {
-            fieldOrTableName = text.split(fieldOrTableName, "\\.");
-        } else if (fieldVarType != "object") {
-            throw new TypeError(translate.text("${SQL_LIB_WRONG_FIELD_TYPE}"));
+/**
+* parses given name of table and name of column to clearly find out the tablename and columnanme
+*
+* @param {String|Array} pFieldOrTableName you've got several possibilites to pass here:
+*                                   <br/> 1. the name of the table if also a pColumnName is specified 
+*                                   <br/> 2. the name of the table and columname as "tablename.columnname" (e.g. "ORGANISATION.NAME") if no pColumnName is specified
+*                                   <br/> 3. an array with 2 elements: [tablename, columnname] (e.g. ["ORGANISATION", "NAME"]) if no pColumnName is specified
+*                                   <br/> Everything else will raise an error
+*                                   
+* @param {String} [pColumnName] depending on pFieldOrTableName this should be undefined/null or the name of a column
+*
+* @return {Object|TypeError} TypeError if something wrong has been passed or returns a object with these properties: 
+*                           1. "table" which is the tablename
+*                           2. "column" which is the columnname
+*                           e.g. {table: "ORGANISATION", column: "NAME"}
+* 
+*
+*/
+SqlUtils._parseFieldQualifier = function(pFieldOrTableName, pColumnName) 
+{
+    var tableName, columnName;
+    if (pColumnName != undefined)
+    {
+        tableName = pFieldOrTableName;
+        columnName = pColumnName;
+    }
+    else
+    {
+        var fnName = "SqlUtils._parseFieldQualifier";//for return errors
+        var fieldVarType = typeof(pFieldOrTableName);
+        if (fieldVarType == "string") 
+        {
+            pFieldOrTableName = text.split(pFieldOrTableName, "\\.");
+        }
+        else if (fieldVarType != "object") //check for object since there exists JavaArrays and JavaScript arrays which are both valid
+        {
+            return new TypeError(translate.withArguments("[%0]%1 has to be a string or array but it is %2", [fnName, "pFieldOrTableName",
+                fieldVarType]));
         }
 
-        if (fieldOrTableName.hasOwnProperty("length")) {
-            if (fieldOrTableName.length == 2) {
+        if (pFieldOrTableName.hasOwnProperty("length")) 
+        {
+            if (pFieldOrTableName.length != 2) 
+                return new TypeError(translate.withArguments("[%0]has now an incorrect length; estimated 2 elements but got %1", [
+                        fnName, pFieldOrTableName.length ]));
 
-            } else {
-                throw new TypeError(translate.text("${SQL_LIB_WRONG_FIELD_TYPE}"))
-            }
-            tableName = fieldOrTableName[0];
-            columnName = fieldOrTableName[1];
+            tableName = pFieldOrTableName[0];
+            columnName = pFieldOrTableName[1];
         }
-        else
-            throw new TypeError(translate.text("${SQL_LIB_WRONG_FIELD_TYPE}"));
+        else //check for object happens since there exists JavaArrays and JavaScript arrays which are both valid
+            return  new TypeError(translate.withArguments("[%0]%1 is an object but seems not to be a valid array or array-like", [
+                    fnName, "pFieldOrTableName"]));
     }
-    else
-        tableName = fieldOrTableName;
 
     if (typeof(columnName) != "string")
-        throw new TypeError(translate.text("${SQL_LIB_WRONG_FIELD_TYPE}"));
+        return  new TypeError(translate.withArguments("[%0]the columnName is not a string after interpreting", [fnName]));
     if (typeof(tableName) != "string")
-        throw new TypeError(translate.text("${SQL_LIB_WRONG_FIELD_TYPE}"));
+        return  new TypeError(translate.withArguments("[%0]the tableName is not a string after interpreting", [fnName]));
 
-    if (alias == undefined)
-        alias = db.getCurrentAlias();
+    return {
+        table: tableName,
+        column: columnName
+    };
+};
+
+
+/**
+* determines if given values match a full field qualifier (name of table and name of column)
+*
+* @param {String|Array} pFieldOrTableName you've got several possibilites to pass here:
+*                                   <br/> 1. the name of the table if also a pColumnName is specified 
+*                                   <br/> 2. the name of the table and columname as "tablename.columnname" (e.g. "ORGANISATION.NAME") if no pColumnName is specified
+*                                   <br/> 3. an array with 2 elements: [tablename, columnname] (e.g. ["ORGANISATION", "NAME"]) if no pColumnName is specified
+*                                   <br/> Everything else will raise an error
+*                                   
+* @param {String} [pColumnName] depending on pFieldOrTableName this should be undefined/null or the name of a column
+*
+* @return {Boolean} returns true if it's a full qualifier or false if not
+*
+*/
+SqlUtils.isFullFieldQualifier = function(pFieldOrTableName, pColumnName)
+{
+    var parsed = SqlUtils._parseFieldQualifier(pFieldOrTableName, pColumnName);
+    if (parsed instanceof TypeError)
+        return false;
+    return true;
+};
+
+/**
+* determines the type of a single database column in a table; if you want to  get several columntypes at once use db.getColumnTypes instead 
+*
+* @param {String|Array} pFieldOrTableName you've got several possibilites to pass here:
+*                                   <br/> 1. the name of the table if also a pColumnName is specified 
+*                                   <br/> 2. the name of the table and columname as "tablename.columnname" (e.g. "ORGANISATION.NAME") if no pColumnName is specified
+*                                   <br/> 3. an array with 2 elements: [tablename, columnname] (e.g. ["ORGANISATION", "NAME"]) if no pColumnName is specified
+*                                   <br/> Everything else will raise an error
+*                                   
+* @param {String} [pColumnName] depending on pFieldOrTableName this should be undefined/null or the name of a column
+* @param {String} [pAlias=the current alias] Database-Aliasname, where the SQL-Statement shall be executed; default is the current dbalias
+*
+* @throws TypeError if a wrong format is passed as table/column-combination
+*
+* @return {Number} returns the corresponding SQLTYPES-value
+*
+*/
+SqlUtils.getSingleColumnType = function(pFieldOrTableName, pColumnName, pAlias) {
+    var fields = SqlUtils._parseFieldQualifier(pFieldOrTableName, pColumnName);
+    if (fields instanceof TypeError)
+        throw fields;
+    
+    if (pAlias == undefined)
+        pAlias = db.getCurrentAlias();
 
-    return db.getColumnTypes(tableName, [columnName], alias)[0];
+    return db.getColumnTypes(fields.table, [fields.column], pAlias)[0];
 };
 
 /**
diff --git a/process/StandardObject_lib/process.js b/process/StandardObject_lib/process.js
index 4e39fc12e4b74103b26e936065aa1367993c2427..11ad559a925e55d2baa3d5b2c3216b4d30751130 100644
--- a/process/StandardObject_lib/process.js
+++ b/process/StandardObject_lib/process.js
@@ -1,4 +1,3 @@
-import("system.logging");
 import("system.db");
 import("Keyword_lib");
 import("KeywordRegistry_basic");