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 98f078c1634736a5edf560f8ec3e9fbe68af7c0e..696a1530088850673a2bf9f11448cd27a197ce00 100644
--- a/.liquibase/Data_alias/basic/2019.2/changelog.xml
+++ b/.liquibase/Data_alias/basic/2019.2/changelog.xml
@@ -132,15 +132,21 @@
 
     <include relativeToChangelogFile="true" file="update_Keyword_Essentials.xml" />
     <include relativeToChangelogFile="true" file="Contactmanagement_added_ImageBlobs.xml" />
-
+	
     <!-- Derby needs special handling -->
     <include relativeToChangelogFile="true" file="alter_activityLink_notDerby.xml" />
     <include relativeToChangelogFile="true" file="alter_activityLink_Derby.xml" />
 
+    <include relativeToChangelogFile="true" file="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="CampaignManagement/create_campaign.xml"/>
     <include relativeToChangelogFile="true" file="CampaignManagement/create_campaignStep.xml"/>
     <include relativeToChangelogFile="true" file="CampaignManagement/create_campaignParticipant.xml"/>
     <include relativeToChangelogFile="true" file="CampaignManagement/create_campaignParticipantLog.xml"/>
     <include relativeToChangelogFile="true" file="CampaignManagement/create_campaignState.xml"/>
     <include relativeToChangelogFile="true" file="CampaignManagement/create_campaignStepState.xml"/>
-</databaseChangeLog>
\ No newline at end of file
+</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/aliasDefinition/Data_alias/Data_alias.aod b/aliasDefinition/Data_alias/Data_alias.aod
index 931f020236b7c094f01a827689b6f449611009b4..b541a63604568f96ca5af924ff5725964efd9208 100644
--- a/aliasDefinition/Data_alias/Data_alias.aod
+++ b/aliasDefinition/Data_alias/Data_alias.aod
@@ -2702,109 +2702,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>
@@ -5982,6 +5879,110 @@
               </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>
+                <description></description>
+              </entityFieldDb>
+            </entityFields>
+          </entityDb>
           <entityDb>
             <name>CAMPAIGNPARTICIPANT</name>
             <dbName></dbName>
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/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/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/Attribute_entity/Attribute_entity.aod b/entity/Attribute_entity/Attribute_entity.aod
index 7a53655d326d89c0f289e70d22176c8ed389a346..27bd01462c6cfe52e580468756201a33b84bd200 100644
--- a/entity/Attribute_entity/Attribute_entity.aod
+++ b/entity/Attribute_entity/Attribute_entity.aod
@@ -278,6 +278,10 @@
         </entityParameter>
       </children>
     </entityConsumer>
+    <entityField>
+      <name>IMAGE</name>
+      <contentType>IMAGE</contentType>
+    </entityField>
   </entityFields>
   <recordContainers>
     <dbRecordContainer>
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/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 f01081e61fe46561cf416fe70f216adc920c205e..3a3330c16589bac7f545e94ff4accf9865cc3b1d 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>
         <entityDependency>
           <name>b5c39776-509e-4758-8d05-a64eac4e7f38</name>
           <entityName>CampaignStep_entity</entityName>
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 78bb374858de35e55f8003509b94d9bcc861e735..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");
@@ -18,6 +17,6 @@ if (usageCount <= 0)
 }
 else
 {
-    // TODO: server hängt bei question.showMessage
+    // TODO: Show message hier nicht möglich: mit Grant-Prozess ausführung komplett verhindern, wenn es diese gibt.
     //question.showMessage(translate.withArguments("There are still %0 relations using the type %1.", [usageCount, translate.text(vars.get("$field.SOURCE_RELATION_TITLE")) + " -> " + translate.text(vars.get("$field.DEST_RELATION_TITLE"))]), question.WARNING, translate.text("Cannot remove relation type"))
 }
\ No newline at end of file
diff --git a/entity/ObjectRelationType_entity/recordcontainers/jdito/onInsert.js b/entity/ObjectRelationType_entity/recordcontainers/jdito/onInsert.js
index 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 4df0c2df9ece10a5c2e64a8506ac0f0597a0e174..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);
     }
@@ -82,7 +89,7 @@ if (usageCount <= 0)
 }
 else
 {
-    // TODO: server hängt bei question.showMessage
+    // TODO: Show message hier nicht möglich: mit Grant-Prozess ausführung komplett verhindern, wenn es diese gibt.
     //question.showMessage(translate.withArguments("There are still %0 relations using the type %1.", [usageCount, translate.text(vars.get("$field.SOURCE_RELATION_TITLE")) + " -> " + translate.text(vars.get("$field.DEST_RELATION_TITLE"))]), question.WARNING, translate.text("Cannot remove relation type"))
 }
 
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_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/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/objects1/children/objecttype_param/valueProcess.js b/entity/ObjectRelation_entity/entityfields/objects1/children/objecttype_param/valueProcess.js
deleted file mode 100644
index 0e35811c9fc30b9f87c3e4dda4235787fb0066f7..0000000000000000000000000000000000000000
--- a/entity/ObjectRelation_entity/entityfields/objects1/children/objecttype_param/valueProcess.js
+++ /dev/null
@@ -1,4 +0,0 @@
-import("system.vars");
-import("system.result");
-
-result.string(vars.get("$field.OBJECT1_TYPE"))
\ 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/providertype_param/valueProcess.js b/entity/ObjectRelation_entity/entityfields/providertype_param/valueProcess.js
deleted file mode 100644
index 981503eee34d83611c7bf484a2fab5e86840bf03..0000000000000000000000000000000000000000
--- a/entity/ObjectRelation_entity/entityfields/providertype_param/valueProcess.js
+++ /dev/null
@@ -1,3 +0,0 @@
-import("system.result");
-
-result.string("none");
\ No newline at end of file
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/object2/children/objecttype_param/valueProcess.js b/entity/ObjectTree_entity/entityfields/info/tooltipProcess.js
similarity index 51%
rename from entity/ObjectRelation_entity/entityfields/object2/children/objecttype_param/valueProcess.js
rename to entity/ObjectTree_entity/entityfields/info/tooltipProcess.js
index e4c1084f9a07683a0ceaab1f42521b8a2819c3dc..702c61b00fa47d188e32deb347b70106f4fb9d29 100644
--- a/entity/ObjectRelation_entity/entityfields/object2/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.OBJECT2_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..3e594fdf6c0dd8614fd4b85533e42f1ba771bb8c 100644
--- a/entity/Offer_entity/Offer_entity.aod
+++ b/entity/Offer_entity/Offer_entity.aod
@@ -728,30 +728,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 +866,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/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/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 28fb3becb19e236812a86c4a4b6762bea4d35a9e..0d7643173af7613e0f3e739c5e449d858d44cbed 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 d59f95c32a0b786ff89b9419b5f0a10bededddea..bd40b44a11b1920bb4f75febd9933345c6472eb9 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/objectrelations/children/providertype_param/valueProcess.js b/entity/SalesprojectMilestone_entity/recordcontainers/db/recordfieldmappings/parent.value/expression.js
similarity index 52%
rename from entity/ObjectRelation_entity/entityfields/objectrelations/children/providertype_param/valueProcess.js
rename to entity/SalesprojectMilestone_entity/recordcontainers/db/recordfieldmappings/parent.value/expression.js
index 4a2d2e1c96782b8407f30181246efb90a9efd35a..e5c82e9c86a2c395736339cb57fe1e2fede85a2e 100644
--- a/entity/ObjectRelation_entity/entityfields/objectrelations/children/providertype_param/valueProcess.js
+++ b/entity/SalesprojectMilestone_entity/recordcontainers/db/recordfieldmappings/parent.value/expression.js
@@ -1,3 +1,2 @@
 import("system.result");
-
-result.string("tree");
\ 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..370f210a8fd53d25f1f55b93cb6f94af250d0fbf 100644
--- a/entity/Task_entity/Task_entity.aod
+++ b/entity/Task_entity/Task_entity.aod
@@ -25,6 +25,7 @@
     <entityField>
       <name>SUBJECT</name>
       <title>subject</title>
+      <linkedContext>Task</linkedContext>
       <mandatory v="true" />
     </entityField>
     <entityField>
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 d250a6d427d58a4ba364bb28ef05d464a9d5d4df..8d4e21b1c94884c183dfc6af1235e605495611cd 100644
--- a/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod
+++ b/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod
@@ -2916,6 +2916,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 9689aac09eed78dfb192053f2d07675e5abfad12..2b4091c0772e3861ad6a8c9fd33c009e29243e7c 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>
@@ -50,6 +54,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>
@@ -2177,6 +2185,10 @@
       <key>Spain</key>
       <value>Spanien</value>
     </entry>
+    <entry>
+      <key>ObjectRelationType</key>
+      <value>Beziehungstyp</value>
+    </entry>
     <entry>
       <key>Palau</key>
       <value>Palau</value>
@@ -3661,11 +3673,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>
@@ -3684,6 +3696,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>
     <entry>
       <key>Approved</key>
       <value>Freigegeben</value>
diff --git a/language/_____LANGUAGE_en/_____LANGUAGE_en.aod b/language/_____LANGUAGE_en/_____LANGUAGE_en.aod
index 2308d3644bfcf22d29914f8641ee4354f058d803..a5fe0c8172457cc1d14a011fa076416828b4b51e 100644
--- a/language/_____LANGUAGE_en/_____LANGUAGE_en.aod
+++ b/language/_____LANGUAGE_en/_____LANGUAGE_en.aod
@@ -2947,6 +2947,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 5e82a5275611386b972a0109437cf5a6a97dbf9d..c90b46ece5109ab161d5df449e410baa5bcfc690 100644
--- a/neonContext/ObjectRelationType/ObjectRelationType.aod
+++ b/neonContext/ObjectRelationType/ObjectRelationType.aod
@@ -3,9 +3,9 @@
   <name>ObjectRelationType</name>
   <title>Relation type</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
+  <icon>VAADIN:SPLIT</icon>
   <filterview>ObjectRelationTypeFilter_view</filterview>
   <editview>ObjectRelationTypeEdit_view</editview>
-  <preview>ObjectRelationTypePreview_view</preview>
   <entity>ObjectRelationType_entity</entity>
   <references>
     <neonViewReference>
@@ -16,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 e9f268d0105e123f791eb8715f7fd8f107d2ea6b..fd33556f856997695ea211f98288dd4a7d791259 100644
--- a/neonView/ActivityFilter_view/ActivityFilter_view.aod
+++ b/neonView/ActivityFilter_view/ActivityFilter_view.aod
@@ -63,6 +63,7 @@
       <iconIdField>DIRECTION_ICON</iconIdField>
       <hideTime v="true" />
       <entityField>#ENTITY</entityField>
+      <maxDBRow v="400" />
     </timelineViewTemplate>
     <tableViewTemplate>
       <name>ActivitiesTable</name>
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
deleted file mode 100644
index 9056b55d310ac4338db187dfe63c8eb50a2dea49..0000000000000000000000000000000000000000
--- a/neonView/ActivityTimeline_view/ActivityTimeline_view.aod
+++ /dev/null
@@ -1,20 +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>
-      <entityField>#ENTITY</entityField>
-    </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/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..a04bd4d99520afa22000c81decd2b2f623d7caaa 100644
--- a/neonView/TaskFilter_view/TaskFilter_view.aod
+++ b/neonView/TaskFilter_view/TaskFilter_view.aod
@@ -28,7 +28,7 @@
   <children>
     <timelineViewTemplate>
       <name>TasksTimeline</name>
-      <dateField>START_DATE</dateField>
+      <dateField>MATURITY_DATE</dateField>
       <titleField>SUBJECT</titleField>
       <descriptionField>DESCRIPTION</descriptionField>
       <iconIdField>#ICON</iconIdField>
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/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/Context_lib/process.js b/process/Context_lib/process.js
index d64c9583f3cd1855ebc4019d87982c79e96a719b..6f9f0b718ceeb526e62bf6371f381a78d93b665b 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
@@ -359,7 +369,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()!'";
@@ -394,7 +404,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)
@@ -420,7 +430,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/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");