diff --git a/aliasDefinition/Data_alias/Data_alias.aod b/aliasDefinition/Data_alias/Data_alias.aod
index 6bc32d7d9dabe6094c7105967e5314134507ad39..7e09926aa31b4d677a81ba73f0b39e519e2508f6 100644
--- a/aliasDefinition/Data_alias/Data_alias.aod
+++ b/aliasDefinition/Data_alias/Data_alias.aod
@@ -5130,5 +5130,77 @@
       </affectedTables>
       <affectedIds>%aditoprj%/aliasDefinition/Data_alias/indexsearchgroups/person/affectedIds.js</affectedIds>
     </indexSearchGroup>
+    <indexSearchGroup>
+      <name>OFFER</name>
+      <title>Offer</title>
+      <icon>VAADIN:CART</icon>
+      <active v="false" />
+      <idColumn>OFFERID</idColumn>
+      <titleColumn>TITLECOLUMN</titleColumn>
+      <descriptionColumn>DESCCOLUMN</descriptionColumn>
+      <query>%aditoprj%/aliasDefinition/Data_alias/indexsearchgroups/offer/query.js</query>
+      <resultContextNeon>Offer</resultContextNeon>
+      <affectedTables>
+        <element>OFFER</element>
+      </affectedTables>
+      <affectedIds>%aditoprj%/aliasDefinition/Data_alias/indexsearchgroups/offer/affectedIds.js</affectedIds>
+    </indexSearchGroup>
+    <indexSearchGroup>
+      <name>SALESORDER</name>
+      <title>Order</title>
+      <icon>VAADIN:DOLLAR</icon>
+      <active v="false" />
+      <idColumn>SALESORDERID</idColumn>
+      <titleColumn>TITLECOLUMN</titleColumn>
+      <descriptionColumn>DESCCOLUMN</descriptionColumn>
+      <query>%aditoprj%/aliasDefinition/Data_alias/indexsearchgroups/salesorder/query.js</query>
+      <resultContextNeon>Order</resultContextNeon>
+      <affectedTables>
+        <element>SALESORDER</element>
+      </affectedTables>
+      <affectedIds>%aditoprj%/aliasDefinition/Data_alias/indexsearchgroups/salesorder/affectedIds.js</affectedIds>
+    </indexSearchGroup>
+    <indexSearchGroup>
+      <name>CONTRACT</name>
+      <title>Contract</title>
+      <icon>VAADIN:FILE_TEXT</icon>
+      <active v="false" />
+      <idColumn>CONTRACT</idColumn>
+      <titleColumn>TITLECOLUMN</titleColumn>
+      <descriptionColumn>DESCCOLUMN</descriptionColumn>
+      <resultContextNeon>Contract</resultContextNeon>
+      <affectedTables>
+        <element>CONTRACT</element>
+      </affectedTables>
+      <affectedIds>%aditoprj%/aliasDefinition/Data_alias/indexsearchgroups/contract/affectedIds.js</affectedIds>
+    </indexSearchGroup>
+    <indexSearchGroup>
+      <name>PRODUCT</name>
+      <title>Product</title>
+      <icon>VAADIN:HAMMER</icon>
+      <active v="false" />
+      <idColumn>PRODUCT</idColumn>
+      <titleColumn>TITLECOLUMN</titleColumn>
+      <descriptionColumn>DESCCOLUMN</descriptionColumn>
+      <resultContextNeon>Product</resultContextNeon>
+      <affectedTables>
+        <element>PRODUCT</element>
+      </affectedTables>
+      <affectedIds>%aditoprj%/aliasDefinition/Data_alias/indexsearchgroups/product/affectedIds.js</affectedIds>
+    </indexSearchGroup>
+    <indexSearchGroup>
+      <name>SALESPROJECT</name>
+      <title>Salesproject</title>
+      <icon>VAADIN:BOOK_DOLLAR</icon>
+      <active v="false" />
+      <idColumn>SALESPROJECT</idColumn>
+      <titleColumn>TITLECOLUMN</titleColumn>
+      <descriptionColumn>DESCCOLUMN</descriptionColumn>
+      <resultContextNeon>Salesproject</resultContextNeon>
+      <affectedTables>
+        <element>SALESPROJECT</element>
+      </affectedTables>
+      <affectedIds>%aditoprj%/aliasDefinition/Data_alias/indexsearchgroups/salesproject/affectedIds.js</affectedIds>
+    </indexSearchGroup>
   </indexSearchGroups>
 </aliasDefinition>
diff --git a/aliasDefinition/Data_alias/indexsearchgroups/contract/affectedIds.js b/aliasDefinition/Data_alias/indexsearchgroups/contract/affectedIds.js
new file mode 100644
index 0000000000000000000000000000000000000000..548f327a66b7b08252086a013c0152cd52f8da20
--- /dev/null
+++ b/aliasDefinition/Data_alias/indexsearchgroups/contract/affectedIds.js
@@ -0,0 +1,4 @@
+import("system.vars");
+import("system.result");
+
+result.object([vars.getString("$local.idvalue")]);
\ No newline at end of file
diff --git a/aliasDefinition/Data_alias/indexsearchgroups/offer/affectedIds.js b/aliasDefinition/Data_alias/indexsearchgroups/offer/affectedIds.js
new file mode 100644
index 0000000000000000000000000000000000000000..548f327a66b7b08252086a013c0152cd52f8da20
--- /dev/null
+++ b/aliasDefinition/Data_alias/indexsearchgroups/offer/affectedIds.js
@@ -0,0 +1,4 @@
+import("system.vars");
+import("system.result");
+
+result.object([vars.getString("$local.idvalue")]);
\ No newline at end of file
diff --git a/aliasDefinition/Data_alias/indexsearchgroups/offer/query.js b/aliasDefinition/Data_alias/indexsearchgroups/offer/query.js
new file mode 100644
index 0000000000000000000000000000000000000000..d8bff6962ee6476f616c9cb6a66304bfae3d35b2
--- /dev/null
+++ b/aliasDefinition/Data_alias/indexsearchgroups/offer/query.js
@@ -0,0 +1,22 @@
+import("system.result");
+import("system.vars");
+import("system.calendars");
+import("system.db");
+import("Sql_lib");
+
+var sqlQuery, sqlHelper, queryCondition, affectedIds;
+if (vars.exists("$local.idvalue")) {
+    affectedIds = vars.get("$local.idvalue");
+    queryCondition = "where OFFERID in ('" + affectedIds.map(function (v){return db.quote(v);}).join("', '") + "')";
+    //TODO: refactor this for incremental indexer (injections?)
+}
+sqlHelper = new SqlMaskingUtils();
+sqlQuery = "select OFFERID, " 
+    + "OFFERCODE as TITLECOLUMN, " 
+    + sqlHelper.concat(["ORGNAME", "'| Kd-Nr.: '", "CUSTOMERCODE"]) 
+    + " as DESCCOLUMN, OFFERCODE, ORGNAME, CUSTOMERCODE " 
+    + " from OFFER "
+    + " join CONTACT on OFFER.CONTACT_ID = CONTACTID "
+    + " join ORGANISATION on ORGANISATIONID = CONTACT.ORGANISATION_ID "
+    + queryCondition + " order by OFFERCODE ";
+result.string(sqlQuery);
\ No newline at end of file
diff --git a/aliasDefinition/Data_alias/indexsearchgroups/product/affectedIds.js b/aliasDefinition/Data_alias/indexsearchgroups/product/affectedIds.js
new file mode 100644
index 0000000000000000000000000000000000000000..548f327a66b7b08252086a013c0152cd52f8da20
--- /dev/null
+++ b/aliasDefinition/Data_alias/indexsearchgroups/product/affectedIds.js
@@ -0,0 +1,4 @@
+import("system.vars");
+import("system.result");
+
+result.object([vars.getString("$local.idvalue")]);
\ No newline at end of file
diff --git a/aliasDefinition/Data_alias/indexsearchgroups/salesorder/affectedIds.js b/aliasDefinition/Data_alias/indexsearchgroups/salesorder/affectedIds.js
new file mode 100644
index 0000000000000000000000000000000000000000..548f327a66b7b08252086a013c0152cd52f8da20
--- /dev/null
+++ b/aliasDefinition/Data_alias/indexsearchgroups/salesorder/affectedIds.js
@@ -0,0 +1,4 @@
+import("system.vars");
+import("system.result");
+
+result.object([vars.getString("$local.idvalue")]);
\ No newline at end of file
diff --git a/aliasDefinition/Data_alias/indexsearchgroups/salesorder/query.js b/aliasDefinition/Data_alias/indexsearchgroups/salesorder/query.js
new file mode 100644
index 0000000000000000000000000000000000000000..39a1d15028db2e6dd488e391a63d6d3d51cc52de
--- /dev/null
+++ b/aliasDefinition/Data_alias/indexsearchgroups/salesorder/query.js
@@ -0,0 +1,22 @@
+import("system.result");
+import("system.vars");
+import("system.calendars");
+import("system.db");
+import("Sql_lib");
+
+var sqlQuery, sqlHelper, queryCondition, affectedIds;
+if (vars.exists("$local.idvalue")) {
+    affectedIds = vars.get("$local.idvalue");
+    queryCondition = "where OFFERID in ('" + affectedIds.map(function (v){return db.quote(v);}).join("', '") + "')";
+    //TODO: refactor this for incremental indexer (injections?)
+}
+sqlHelper = new SqlMaskingUtils();
+sqlQuery = "select SALESORDERID, " 
+    + " ORDERCODE as TITLECOLUMN, " 
+    + sqlHelper.concat(["ORGNAME", "'| Kd-Nr.: '", "CUSTOMERCODE"]) 
+    + " as DESCCOLUMN, ORDERCODE, ORGNAME, CUSTOMERCODE "
+    + " from SALESORDER "
+    + " join RELATION on SALESORDER.RELATION_ID = RELATIONID "
+    + " join ORG on ORGID = RELATION.ORG_ID "
+    + queryCondition + " order by ORDERCODE ";
+result.string(sqlQuery);
\ No newline at end of file
diff --git a/aliasDefinition/Data_alias/indexsearchgroups/salesproject/affectedIds.js b/aliasDefinition/Data_alias/indexsearchgroups/salesproject/affectedIds.js
new file mode 100644
index 0000000000000000000000000000000000000000..548f327a66b7b08252086a013c0152cd52f8da20
--- /dev/null
+++ b/aliasDefinition/Data_alias/indexsearchgroups/salesproject/affectedIds.js
@@ -0,0 +1,4 @@
+import("system.vars");
+import("system.result");
+
+result.object([vars.getString("$local.idvalue")]);
\ No newline at end of file
diff --git a/application/_____SYSTEM_APPLICATION_NEON/_____SYSTEM_APPLICATION_NEON.aod b/application/_____SYSTEM_APPLICATION_NEON/_____SYSTEM_APPLICATION_NEON.aod
index 29aff4640e7d1b3091d0a8cdf4444ad2d860f2c9..4e90b5b470b7003fa1c6ef6a40e349f8fdb102e9 100644
--- a/application/_____SYSTEM_APPLICATION_NEON/_____SYSTEM_APPLICATION_NEON.aod
+++ b/application/_____SYSTEM_APPLICATION_NEON/_____SYSTEM_APPLICATION_NEON.aod
@@ -32,7 +32,6 @@
         <node name="Attribute" kind="10077" />
         <node name="KeywordEntry" kind="10077" />
         <node name="KeywordAttribute" kind="10077" />
-        <node name="Salutation" kind="10077" />
         <node name="INTERNAL_ADMINISTRATOR" kind="159" />
       </node>
     </node>
diff --git a/entity/360Degree_entity/entityfields/newmodule/children/newcontract/iconIdProcess.js b/entity/360Degree_entity/entityfields/newmodule/children/newcontract/iconIdProcess.js
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/entity/Activity_entity/Activity_entity.aod b/entity/Activity_entity/Activity_entity.aod
index dc0e95ce40aa8b214bf9f13f02cca8a647aabf06..3f998199e73bd8addc2b6b5bf9a945d68533dcee 100644
--- a/entity/Activity_entity/Activity_entity.aod
+++ b/entity/Activity_entity/Activity_entity.aod
@@ -263,7 +263,7 @@
       <consumer>Contacts</consumer>
       <linkedContext>Person</linkedContext>
       <searchable v="false" />
-      <valueProcess>%aditoprj%/entity/Activity_entity/entityfields/creator/valueProcess.js</valueProcess>
+      <displayValueProcess>%aditoprj%/entity/Activity_entity/entityfields/creator/displayValueProcess.js</displayValueProcess>
     </entityField>
     <entityConsumer>
       <name>ModuleTrees</name>
diff --git a/entity/Activity_entity/entityfields/creator/displayValueProcess.js b/entity/Activity_entity/entityfields/creator/displayValueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..0dde82e7728286629b1c210326725aac2ebb92c5
--- /dev/null
+++ b/entity/Activity_entity/entityfields/creator/displayValueProcess.js
@@ -0,0 +1,8 @@
+import("system.result");
+import("system.vars");
+import("Contact_lib");
+
+var id = vars.get("$this.value");
+//show the simpel title since this will be later an employee-entry and therefore no organisation is needed
+var title = ContactUtils.getTitleByContactId(id);
+result.string(title);
\ No newline at end of file
diff --git a/entity/Activity_entity/entityfields/creator/valueProcess.js b/entity/Activity_entity/entityfields/creator/valueProcess.js
deleted file mode 100644
index fbf6105a85aaeeb73fa5784afaf603d6d650a770..0000000000000000000000000000000000000000
--- a/entity/Activity_entity/entityfields/creator/valueProcess.js
+++ /dev/null
@@ -1,8 +0,0 @@
-import("system.result");
-import("system.vars");
-import("system.neon");
-
-if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW)
-{
-    result.string(vars.get("$sys.user"));
-}
\ No newline at end of file
diff --git a/entity/Activity_entity/recordcontainers/db/onDBDelete.js b/entity/Activity_entity/recordcontainers/db/onDBDelete.js
index 787c4614c1462768ec4b375d47ef1a79eb2d57d3..3ede97828741f9baed6f5ef05de7d3913953e3fc 100644
--- a/entity/Activity_entity/recordcontainers/db/onDBDelete.js
+++ b/entity/Activity_entity/recordcontainers/db/onDBDelete.js
@@ -1,11 +1,8 @@
 import("system.vars");
 import("system.db");
 import("Sql_lib");
-import("Context_lib");
 
 var activityObjectsCondition = SqlCondition.begin()
-                                           .andPrepare("AB_OBJECTRELATION.OBJECT1_TYPE", ContextUtils.getCurrentContextId())
-                                           .andPrepareVars("AB_OBJECTRELATION.OBJECT1_ROWID", "$field.ACTIVITYID");
-
-db.deleteData("AB_OBJECTRELATION", activityObjectsCondition.build("1=2"));
+                                           .andPrepareVars("ACTIVITYLINK.ACTIVITY_ID", "$field.ACTIVITYID");
 
+db.deleteData("ACTIVITYLINK", activityObjectsCondition.build("1=2"));
\ No newline at end of file
diff --git a/entity/AnyContact_entity/AnyContact_entity.aod b/entity/AnyContact_entity/AnyContact_entity.aod
index 505785aee4ca2423bab2bada7b9f9a0b7c8884ea..ef3c7122fe47dc58830ac0cae0f16a7d2a668e72 100644
--- a/entity/AnyContact_entity/AnyContact_entity.aod
+++ b/entity/AnyContact_entity/AnyContact_entity.aod
@@ -88,7 +88,7 @@ See ContactUtils.getRelationTypeByPersOrg for possible values</description>
       <children>
         <entityParameter>
           <name>ContactId_param</name>
-          <valueProcess>%aditoprj%/entity/AnyContact_entity/entityfields/organisation/children/ContactId_param/valueProcess.js</valueProcess>
+          <valueProcess>%aditoprj%/entity/AnyContact_entity/entityfields/organisations/children/contactid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
     </entityConsumer>
diff --git a/entity/AnyContact_entity/entityfields/organisation/children/contactid_param/valueProcess.js b/entity/AnyContact_entity/entityfields/organisation/children/contactid_param/valueProcess.js
deleted file mode 100644
index 7b6137b4d105e9ba592cf8ef6e796fb838a32b09..0000000000000000000000000000000000000000
--- a/entity/AnyContact_entity/entityfields/organisation/children/contactid_param/valueProcess.js
+++ /dev/null
@@ -1,4 +0,0 @@
-import("system.vars");
-import("system.result");
-
-result.string(vars.get("$field.CONTACTID"));
\ No newline at end of file
diff --git a/entity/Appointment_entity/entityfields/contexts/children/contextid_param/valueProcess.js b/entity/Appointment_entity/entityfields/contexts/children/contextid_param/valueProcess.js
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/entity/Appointment_entity/entityfields/objects/children/objecttype_param/valueProcess.js b/entity/Appointment_entity/entityfields/objects/children/objecttype_param/valueProcess.js
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/entity/AttributeRelation_entity/AttributeRelation_entity.aod b/entity/AttributeRelation_entity/AttributeRelation_entity.aod
index cabd4f0e481e979f64fc0a81d86a0e0ec125941a..e257ce32b6f4ecc06cfc62b9e8b5ca5f84d8b1fc 100644
--- a/entity/AttributeRelation_entity/AttributeRelation_entity.aod
+++ b/entity/AttributeRelation_entity/AttributeRelation_entity.aod
@@ -99,6 +99,7 @@
     <entityParameter>
       <name>ObjectRowId_param</name>
       <expose v="true" />
+      <triggerRecalculation v="true" />
       <description>PARAMETER</description>
     </entityParameter>
     <entityField>
diff --git a/entity/AttributeRelation_entity/entityfields/ab_attribute_id/displayValueProcess.js b/entity/AttributeRelation_entity/entityfields/ab_attribute_id/displayValueProcess.js
index 7375ee03d22b48d48e19926a0ad891be06cc2aec..acda6626ab40309e259438b0dca6da54219b99ec 100644
--- a/entity/AttributeRelation_entity/entityfields/ab_attribute_id/displayValueProcess.js
+++ b/entity/AttributeRelation_entity/entityfields/ab_attribute_id/displayValueProcess.js
@@ -2,4 +2,6 @@ import("system.vars");
 import("system.result");
 import("Attribute_lib");
 
-result.string(AttributeUtil.getFullAttributeName(vars.get("$field.AB_ATTRIBUTE_ID")));
\ No newline at end of file
+result.string(AttributeUtil.getFullAttributeName(
+        vars.get("$field.AB_ATTRIBUTE_ID"),
+        vars.exists("$param.DisplaySimpleName_param") ? vars.get("$param.DisplaySimpleName_param") : false ));
\ No newline at end of file
diff --git a/entity/AttributeRelation_entity/recordcontainers/db/conditionProcess.js b/entity/AttributeRelation_entity/recordcontainers/db/conditionProcess.js
index aee41089141ec40518d13418f789ecc3a54b5e2e..623fac4157f0adf965683447e178916aedffc2a6 100644
--- a/entity/AttributeRelation_entity/recordcontainers/db/conditionProcess.js
+++ b/entity/AttributeRelation_entity/recordcontainers/db/conditionProcess.js
@@ -1,14 +1,17 @@
+import("system.logging");
 import("system.vars");
 import("system.db");
 import("system.result");
 import("Sql_lib");
 
-
-
 var cond = SqlCondition.begin()
                    .andPrepareVars("AB_ATTRIBUTERELATION.OBJECT_ROWID", "$param.ObjectRowId_param");
 
-if (vars.exists("$param.FilteredAttributeIds_param") && vars.get("$param.FilteredAttributeIds_param"))
+if (vars.exists("$param.ObjectRowId_param"))
+    logging.log(vars.get("$param.ObjectRowId_param"))
+
+if (vars.exists("$param.ObjectRowId_param") && vars.get("$param.ObjectRowId_param")
+    && vars.exists("$param.FilteredAttributeIds_param") && vars.get("$param.FilteredAttributeIds_param"))
 {
     var filteredIds = JSON.parse(vars.get("$param.FilteredAttributeIds_param"));
     var filteredIdsCondition = new SqlCondition();
diff --git a/entity/AttributeUsage_entity/AttributeUsage_entity.aod b/entity/AttributeUsage_entity/AttributeUsage_entity.aod
index 18af22e8347ed37d6c604134d7aab2e9c3e12216..db802200adca400fc289e7fa8cdbe26d38fcf352 100644
--- a/entity/AttributeUsage_entity/AttributeUsage_entity.aod
+++ b/entity/AttributeUsage_entity/AttributeUsage_entity.aod
@@ -13,7 +13,12 @@
       <name>OBJECT_TYPE</name>
       <title>Module</title>
       <consumer>Context</consumer>
+      <valueProcess>%aditoprj%/entity/AttributeUsage_entity/entityfields/object_type/valueProcess.js</valueProcess>
       <displayValueProcess>%aditoprj%/entity/AttributeUsage_entity/entityfields/object_type/displayValueProcess.js</displayValueProcess>
+      <onValueChangeTypes>
+        <element>MASK</element>
+        <element>PROCESS</element>
+      </onValueChangeTypes>
     </entityField>
     <entityField>
       <name>AB_ATTRIBUTEUSAGEID</name>
@@ -71,6 +76,9 @@
       <name>db</name>
       <alias>Data_alias</alias>
       <conditionProcess>%aditoprj%/entity/AttributeUsage_entity/recordcontainers/db/conditionProcess.js</conditionProcess>
+      <onDBInsert>%aditoprj%/entity/AttributeUsage_entity/recordcontainers/db/onDBInsert.js</onDBInsert>
+      <onDBUpdate>%aditoprj%/entity/AttributeUsage_entity/recordcontainers/db/onDBUpdate.js</onDBUpdate>
+      <onDBDelete>%aditoprj%/entity/AttributeUsage_entity/recordcontainers/db/onDBDelete.js</onDBDelete>
       <linkInformation>
         <linkInformation>
           <name>c30f5670-580e-4621-95dd-0fec4a99190f</name>
diff --git a/entity/AttributeUsage_entity/entityfields/ab_attribute_id/valueProcess.js b/entity/AttributeUsage_entity/entityfields/ab_attribute_id/valueProcess.js
index c3a2248b66e14317873bfcff446f25abac69686a..9efed36fc2699e14e3c6f4baa4cd4c62ceef938e 100644
--- a/entity/AttributeUsage_entity/entityfields/ab_attribute_id/valueProcess.js
+++ b/entity/AttributeUsage_entity/entityfields/ab_attribute_id/valueProcess.js
@@ -3,4 +3,6 @@ import("system.result");
 import("system.neon");
 
 if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && vars.exists("$param.AttributeId_param") && vars.get("$param.AttributeId_param") != null)
-    result.string(vars.get("$param.AttributeId_param"));
\ No newline at end of file
+    result.string(vars.get("$param.AttributeId_param"));
+else if (vars.get("$field.AB_ATTRIBUTE_ID"))
+    result.string(vars.get("$field.AB_ATTRIBUTE_ID"));
\ No newline at end of file
diff --git a/entity/AttributeUsage_entity/entityfields/object_type/valueProcess.js b/entity/AttributeUsage_entity/entityfields/object_type/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..40b7c76fc5515aeb4d2e88c54f0bbe9daf403618
--- /dev/null
+++ b/entity/AttributeUsage_entity/entityfields/object_type/valueProcess.js
@@ -0,0 +1,5 @@
+import("system.vars");
+
+//this is a workaround to get the old value in the onDBUpdate process
+//@TODO replace this when it's possible to get the old value in onDBUpdate
+vars.set("$context.originalObjectType", vars.get("$field.OBJECT_TYPE"));
\ No newline at end of file
diff --git a/entity/AttributeUsage_entity/recordcontainers/db/onDBDelete.js b/entity/AttributeUsage_entity/recordcontainers/db/onDBDelete.js
new file mode 100644
index 0000000000000000000000000000000000000000..b41e99cd82af7be8fd94faddd41fda7feb3e733e
--- /dev/null
+++ b/entity/AttributeUsage_entity/recordcontainers/db/onDBDelete.js
@@ -0,0 +1,7 @@
+import("system.vars");
+import("Attribute_lib");
+
+var attributeId = vars.get("$field.AB_ATTRIBUTE_ID");
+var objectType = vars.get("$field.OBJECT_TYPE");
+
+AttributeUsageUtil.deleteChildrenUsages(attributeId, objectType);
\ No newline at end of file
diff --git a/entity/AttributeUsage_entity/recordcontainers/db/onDBInsert.js b/entity/AttributeUsage_entity/recordcontainers/db/onDBInsert.js
new file mode 100644
index 0000000000000000000000000000000000000000..73c28f291697502a3d36b35e3b5878ecefdf14a1
--- /dev/null
+++ b/entity/AttributeUsage_entity/recordcontainers/db/onDBInsert.js
@@ -0,0 +1,8 @@
+import("system.vars");
+import("Attribute_lib");
+
+var attributeId = vars.get("$field.AB_ATTRIBUTE_ID");
+var objectType = vars.get("$field.OBJECT_TYPE");
+
+AttributeUsageUtil.insertChildrenUsages(attributeId, objectType);
+AttributeUsageUtil.removeDuplicates(attributeId);
\ No newline at end of file
diff --git a/entity/AttributeUsage_entity/recordcontainers/db/onDBUpdate.js b/entity/AttributeUsage_entity/recordcontainers/db/onDBUpdate.js
new file mode 100644
index 0000000000000000000000000000000000000000..02890f1b92c8da2fd1f5849ad7855337ba6148ed
--- /dev/null
+++ b/entity/AttributeUsage_entity/recordcontainers/db/onDBUpdate.js
@@ -0,0 +1,9 @@
+import("system.vars");
+import("Attribute_lib");
+
+var attributeId = vars.get("$field.AB_ATTRIBUTE_ID");
+var oldObjectType = vars.get("$context.originalObjectType");
+var newObjectType = vars.get("$field.OBJECT_TYPE");
+
+AttributeUsageUtil.updateChildrenUsages(attributeId, oldObjectType, newObjectType);
+AttributeUsageUtil.removeDuplicates(attributeId);
\ No newline at end of file
diff --git a/entity/Attribute_entity/afterUiInit.js b/entity/Attribute_entity/afterUiInit.js
index f36f9fbc0eb68caa31ed5b1e78c6508976364ffb..87febc93d555370828def178d66937ba02b37a7e 100644
--- a/entity/Attribute_entity/afterUiInit.js
+++ b/entity/Attribute_entity/afterUiInit.js
@@ -3,13 +3,15 @@ import("system.db");
 import("system.neon");
 import("system.vars");
 import("Context_lib");
+import("Attribute_lib");
 
 if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW 
+    && vars.get("$field.ATTRIBUTE_TYPE").trim() != $AttributeTypes.COMBOVALUE
     && vars.exists("$param.AttrParentId_param") && vars.get("$param.AttrParentId_param"))
 {
     var parentId = vars.get("$param.AttrParentId_param");
     var attributeId = vars.get("$field.AB_ATTRIBUTEID");
-    
+
     var usageSql = SqlCondition.begin()
         .andPrepare("AB_ATTRIBUTEUSAGE.AB_ATTRIBUTE_ID", parentId)
         .buildSql("select OBJECT_TYPE from AB_ATTRIBUTEUSAGE", "1=0");
diff --git a/entity/Attribute_entity/entityfields/attribute_type/stateProcess.js b/entity/Attribute_entity/entityfields/attribute_type/stateProcess.js
index b768fb2fba7336e45a6e5c99d6224d9e623d4e5b..f663dddf570f4246c8ae5babd6035026d2bc2ffc 100644
--- a/entity/Attribute_entity/entityfields/attribute_type/stateProcess.js
+++ b/entity/Attribute_entity/entityfields/attribute_type/stateProcess.js
@@ -3,10 +3,29 @@ import("system.neon");
 import("system.result");
 import("system.vars");
 import("Attribute_lib");
+import("Sql_lib");
 
-if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && vars.get("$field.ATTRIBUTE_PARENT_ID") != "")
+var type = vars.get("$field.ATTRIBUTE_TYPE").trim();
+var state = neon.COMPONENTSTATE_AUTO
+if (type == $AttributeTypes.COMBOVALUE)
 {
-    var type = AttributeHandler.begin(vars.get("$field.ATTRIBUTE_PARENT_ID")).getAttributeType();
-    if (type == $AttributeTypes.COMBO)
-        result.string(neon.COMPONENTSTATE_INVISIBLE);
-}
\ No newline at end of file
+    state = neon.COMPONENTSTATE_READONLY;
+}
+else if (type == $AttributeTypes.GROUP || type == $AttributeTypes.COMBO)
+{
+    var hasSubordinate = db.cell(SqlCondition.begin()
+        .andPrepareVars("AB_ATTRIBUTE.AB_ATTRIBUTEID", "$field.AB_ATTRIBUTEID")
+        .buildSql(
+            "select exists ("
+            +    "select SUB.AB_ATTRIBUTEID from AB_ATTRIBUTE SUB "
+            +    "where SUB.ATTRIBUTE_PARENT_ID = AB_ATTRIBUTE.AB_ATTRIBUTEID"
+            + ") from AB_ATTRIBUTE", "1=2"
+        )
+    ) == "true";
+    if (hasSubordinate)
+        state = neon.COMPONENTSTATE_READONLY;
+}
+else if (AttributeUtil.hasRelations(vars.get("$field.AB_ATTRIBUTEID")))
+        state = neon.COMPONENTSTATE_READONLY;
+
+result.string(state)
\ No newline at end of file
diff --git a/entity/Attribute_entity/entityfields/attributechildren/children/attrparentid_param/valueProcess.js b/entity/Attribute_entity/entityfields/attributechildren/children/attrparentid_param/valueProcess.js
index f2318723e88440808277d20753657fb7674a0d0f..b68489b6e02b29d34ae67b14c7371f985305f014 100644
--- a/entity/Attribute_entity/entityfields/attributechildren/children/attrparentid_param/valueProcess.js
+++ b/entity/Attribute_entity/entityfields/attributechildren/children/attrparentid_param/valueProcess.js
@@ -1,4 +1,7 @@
 import("system.vars");
 import("system.result");
+import("Attribute_lib");
 
-result.string(vars.getString("$field.AB_ATTRIBUTEID"));
+var type = vars.get("$field.ATTRIBUTE_TYPE").trim();
+if (type == $AttributeTypes.GROUP || type == $AttributeTypes.COMBO)
+    result.string(vars.getString("$field.AB_ATTRIBUTEID"));
diff --git a/entity/Attribute_entity/entityfields/attributechildren/children/attrparenttype_param/valueProcess.js b/entity/Attribute_entity/entityfields/attributechildren/children/attrparenttype_param/valueProcess.js
index 372decd8620b90d3e722f96f362c01b947eb6a32..fe18eca06c7f87d798bd3e58c7726058b5bf049f 100644
--- a/entity/Attribute_entity/entityfields/attributechildren/children/attrparenttype_param/valueProcess.js
+++ b/entity/Attribute_entity/entityfields/attributechildren/children/attrparenttype_param/valueProcess.js
@@ -1,10 +1,4 @@
-import("system.neon");
 import("system.vars");
 import("system.result");
 
-var type;
-if (vars.get("$sys.operatingstate") == neon.OPERATINGSTATE_NEW)
-    type = "GETGROUPS";
-else
-    type = vars.getString("$field.ATTRIBUTE_TYPE").trim()
-result.string(type);
+result.string(vars.getString("$field.ATTRIBUTE_TYPE").trim());
diff --git a/entity/Attribute_entity/entityfields/keyword_container/stateProcess.js b/entity/Attribute_entity/entityfields/keyword_container/stateProcess.js
index 9ce13917b56c5c8e51f01876f47c5cb1f625ec85..67de95ea15b0707ce1a44627ba5a60b92cb5e917 100644
--- a/entity/Attribute_entity/entityfields/keyword_container/stateProcess.js
+++ b/entity/Attribute_entity/entityfields/keyword_container/stateProcess.js
@@ -4,9 +4,9 @@ import("system.result");
 import("Attribute_lib");
 
 var fieldState;
-if (vars.get("$field.ATTRIBUTE_TYPE").trim() == $AttributeTypes.KEYWORD)
+if (vars.get("$field.ATTRIBUTE_TYPE").trim() == $AttributeTypes.KEYWORD && !AttributeUtil.hasRelations(vars.get("$field.AB_ATTRIBUTEID")))
     fieldState = neon.COMPONENTSTATE_EDITABLE;
 else
-    fieldState = neon.COMPONENTSTATE_DISABLED;
+    fieldState = neon.COMPONENTSTATE_READONLY;
 
 result.string(fieldState);
\ No newline at end of file
diff --git a/entity/Attribute_entity/entityfields/usagelist/valueProcess.js b/entity/Attribute_entity/entityfields/usagelist/valueProcess.js
index 0192da48ac5fb006f40737067207ddf9043604a0..675da9521dc245e23992c051dc34239c6f262963 100644
--- a/entity/Attribute_entity/entityfields/usagelist/valueProcess.js
+++ b/entity/Attribute_entity/entityfields/usagelist/valueProcess.js
@@ -3,10 +3,16 @@ import("system.result");
 import("system.db");
 import("system.vars");
 import("Sql_lib");
+import("Attribute_lib");
 
-var usages = db.array(db.COLUMN, SqlCondition.begin()
-    .andPrepare("AB_ATTRIBUTEUSAGE.AB_ATTRIBUTE_ID", vars.get("$field.AB_ATTRIBUTEID"))
-    .buildSql("select OBJECT_TYPE from AB_ATTRIBUTEUSAGE"));
-var usageStr = translate.text("Usage");
+var retStr = "\u00A0"; // \u00A0 -> space character that doesn't get trimmed 
+if (vars.get("$field.ATTRIBUTE_TYPE").trim() != $AttributeTypes.COMBOVALUE)
+{
+    var usages = db.array(db.COLUMN, SqlCondition.begin()
+        .andPrepare("AB_ATTRIBUTEUSAGE.AB_ATTRIBUTE_ID", vars.get("$field.AB_ATTRIBUTEID"))
+        .buildSql("select OBJECT_TYPE from AB_ATTRIBUTEUSAGE"));
+    if (usages.length)
+        retStr = translate.text("Usage") +  ": " + usages.join(", ");
+}
 
-result.string(usages.length ? usageStr + ": " + usages.join(", ") : "\u00A0"); // \u00A0 -> space character that doesn't get trimmed 
\ No newline at end of file
+result.string(retStr);
\ No newline at end of file
diff --git a/entity/Contact_entity/Contact_entity.aod b/entity/Contact_entity/Contact_entity.aod
index 4ce8a38fd6962ba6b14bf4479779995fc6f191c2..866f81d40bdb74084bd1dd7933b0ab590bd7e960 100644
--- a/entity/Contact_entity/Contact_entity.aod
+++ b/entity/Contact_entity/Contact_entity.aod
@@ -4,7 +4,6 @@
   <title>Contact</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <documentation>%aditoprj%/entity/Contact_entity/documentation.adoc</documentation>
-  <onValidation>%aditoprj%/entity/Contact_entity/onValidation.js</onValidation>
   <iconId>VAADIN:USERS</iconId>
   <recordContainer>db</recordContainer>
   <entityFields>
@@ -33,14 +32,20 @@
     <entityField>
       <name>DEPARTMENT</name>
       <title>Department</title>
+      <possibleItemsProcess>%aditoprj%/entity/Contact_entity/entityfields/department/possibleItemsProcess.js</possibleItemsProcess>
+      <newItemsAllowed v="true" />
     </entityField>
     <entityField>
       <name>POSITION</name>
       <title>Position</title>
+      <possibleItemsProcess>%aditoprj%/entity/Contact_entity/entityfields/position/possibleItemsProcess.js</possibleItemsProcess>
+      <newItemsAllowed v="true" />
     </entityField>
     <entityField>
       <name>CONTACTROLE</name>
       <title>Contactrole</title>
+      <possibleItemsProcess>%aditoprj%/entity/Contact_entity/entityfields/contactrole/possibleItemsProcess.js</possibleItemsProcess>
+      <newItemsAllowed v="true" />
     </entityField>
     <entityConsumer>
       <name>Organisations</name>
diff --git a/entity/Contact_entity/entityfields/contactrole/possibleItemsProcess.js b/entity/Contact_entity/entityfields/contactrole/possibleItemsProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..96627ddf00215d0598ae85d2452acfd248cbe52a
--- /dev/null
+++ b/entity/Contact_entity/entityfields/contactrole/possibleItemsProcess.js
@@ -0,0 +1,9 @@
+import("system.result");
+import("Keyword_lib");
+import("KeywordRegistry_basic");
+
+var res = KeywordUtils.getEntryNamesByContainer($KeywordRegistry.contactContactrole()).map(function (e){
+    return [e, e]; //currently the first column is ID, second view value - which is the same because there is no ID for keyword-containers
+});
+
+result.object(res);
\ No newline at end of file
diff --git a/entity/Contact_entity/entityfields/department/possibleItemsProcess.js b/entity/Contact_entity/entityfields/department/possibleItemsProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..77d99fa219eb36618f38dbb344e4a345bb71d331
--- /dev/null
+++ b/entity/Contact_entity/entityfields/department/possibleItemsProcess.js
@@ -0,0 +1,9 @@
+import("system.result");
+import("Keyword_lib");
+import("KeywordRegistry_basic");
+
+var res = KeywordUtils.getEntryNamesByContainer($KeywordRegistry.contactDepartment()).map(function (e){
+    return [e, e]; //currently the first column is ID, second view value - which is the same because there is no ID for keyword-containers
+});
+
+result.object(res);
\ No newline at end of file
diff --git a/entity/Contact_entity/entityfields/position/possibleItemsProcess.js b/entity/Contact_entity/entityfields/position/possibleItemsProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..a86d6820913b759ac976779f9c045378095b6d24
--- /dev/null
+++ b/entity/Contact_entity/entityfields/position/possibleItemsProcess.js
@@ -0,0 +1,9 @@
+import("system.result");
+import("Keyword_lib");
+import("KeywordRegistry_basic");
+
+var res = KeywordUtils.getEntryNamesByContainer($KeywordRegistry.contactPosition()).map(function (e){
+    return [e, e]; //currently the first column is ID, second view value - which is the same because there is no ID for keyword-containers
+});
+
+result.object(res);
\ No newline at end of file
diff --git a/entity/Contact_entity/onValidation.js b/entity/Contact_entity/onValidation.js
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/entity/ObjectRelation_entity/entityfields/objects1/children/objecttype_param/code.js b/entity/ObjectRelation_entity/entityfields/objects1/children/objecttype_param/code.js
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/entity/ObjectRelation_entity/entityfields/targetobjectrowid/valueProcess.js b/entity/ObjectRelation_entity/entityfields/targetobjectrowid/valueProcess.js
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/entity/ObjectRelation_entity/entityfields/targetobjecttype/valueProcess.js b/entity/ObjectRelation_entity/entityfields/targetobjecttype/valueProcess.js
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/entity/ObjectTree_entity/recordcontainers/jdito/contentProcess.js b/entity/ObjectTree_entity/recordcontainers/jdito/contentProcess.js
index 19b4227d9653b2fea12ec49da0a70b90b50aa3a5..34ef78477331f19dc8f0ebb899c3b97bfb14454d 100644
--- a/entity/ObjectTree_entity/recordcontainers/jdito/contentProcess.js
+++ b/entity/ObjectTree_entity/recordcontainers/jdito/contentProcess.js
@@ -81,7 +81,7 @@ function buildTreeData (pObjectRelations) {
    
    var i = 0;
    for (i = 0; i < pObjectRelations.length; i++) {
-       var currentRelation = pObjectRelations[i];
+       let currentRelation = pObjectRelations[i];
        
        if (relationTypeMapping[currentRelation[0]] === undefined)
            relationTypeMapping[currentRelation[0]] = currentRelation[2];
@@ -89,7 +89,7 @@ function buildTreeData (pObjectRelations) {
    
    var treeRows = []
    for (i = 0; i < pObjectRelations.length; i++) {
-       var currentRelation = pObjectRelations[i];
+       let currentRelation = pObjectRelations[i];
               
        treeRows.push([currentRelation[3], currentRelation[0], currentRelation[4]]);
    }
diff --git a/entity/Offer_entity/entityfields/printoffer/stateProcess.js b/entity/Offer_entity/entityfields/printoffer/stateProcess.js
index b6ef75cff77e2ad3ff7423b297ecb8fa6cac1aa1..bb8a76fc6373e23f7ea9e562c2bcedad4c6b5bdb 100644
--- a/entity/Offer_entity/entityfields/printoffer/stateProcess.js
+++ b/entity/Offer_entity/entityfields/printoffer/stateProcess.js
@@ -10,4 +10,4 @@ var itemcount = db.cell(SqlCondition.begin()
 if(itemcount == "0")
     result.string(neon.COMPONENTSTATE_DISABLED);
 else
-    result.string(neon.COMPONENTSTATE_AUTO);
\ No newline at end of file
+    result.string(neon.COMPONENTSTATE_EDITABLE);
\ No newline at end of file
diff --git a/entity/Offeritem_entity/Offeritem_entity.aod b/entity/Offeritem_entity/Offeritem_entity.aod
index bca109621bcae2469bf6c3087157de7244b15488..236c205986cbdc9106c1762473cc0b5b4e177a92 100644
--- a/entity/Offeritem_entity/Offeritem_entity.aod
+++ b/entity/Offeritem_entity/Offeritem_entity.aod
@@ -1,324 +1,323 @@
-<?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.0" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.0">
-  <name>Offeritem_entity</name>
-  <title>Offeritem</title>
-  <majorModelMode>DISTRIBUTED</majorModelMode>
-  <documentation>%aditoprj%/entity/Offeritem_entity/documentation.adoc</documentation>
-  <afterOperatingState>%aditoprj%/entity/Offeritem_entity/afterOperatingState.js</afterOperatingState>
-  <recordContainer>db</recordContainer>
-  <entityFields>
-    <entityProvider>
-      <name>#PROVIDER</name>
-    </entityProvider>
-    <entityField>
-      <name>ASSIGNEDTO</name>
-    </entityField>
-    <entityField>
-      <name>DISCOUNT</name>
-      <title>Discount %</title>
-      <contentType>NUMBER</contentType>
-      <outputFormat>#,##0</outputFormat>
-    </entityField>
-    <entityField>
-      <name>GROUPCODEID</name>
-      <title>Commodity group</title>
-      <consumer>KeywordProductGroupcodes</consumer>
-      <state>READONLY</state>
-      <displayValueProcess>%aditoprj%/entity/Offeritem_entity/entityfields/groupcodeid/displayValueProcess.js</displayValueProcess>
-    </entityField>
-    <entityField>
-      <name>ITEMNAME</name>
-      <title>Designation</title>
-    </entityField>
-    <entityField>
-      <name>ITEMPOSITION</name>
-      <title>Position</title>
-      <state>READONLY</state>
-    </entityField>
-    <entityField>
-      <name>ITEMSORT</name>
-    </entityField>
-    <entityField>
-      <name>OFFERITEMID</name>
-      <valueProcess>%aditoprj%/entity/Offeritem_entity/entityfields/offeritemid/valueProcess.js</valueProcess>
-    </entityField>
-    <entityField>
-      <name>OFFER_ID</name>
-      <valueProcess>%aditoprj%/entity/Offeritem_entity/entityfields/offer_id/valueProcess.js</valueProcess>
-      <onValueChangeTypes>
-        <element>MASK</element>
-      </onValueChangeTypes>
-    </entityField>
-    <entityField>
-      <name>OPTIONAL</name>
-      <title>Optional</title>
-      <contentType>BOOLEAN</contentType>
-      <possibleItemsProcess>%aditoprj%/entity/Offeritem_entity/entityfields/optional/possibleItemsProcess.js</possibleItemsProcess>
-      <valueProcess>%aditoprj%/entity/Offeritem_entity/entityfields/optional/valueProcess.js</valueProcess>
-    </entityField>
-    <entityField>
-      <name>PRICE</name>
-      <title>Unit price</title>
-      <contentType>NUMBER</contentType>
-      <outputFormat>#,##0.00</outputFormat>
-    </entityField>
-    <entityField>
-      <name>PRODUCT_ID</name>
-      <documentation>%aditoprj%/entity/Offeritem_entity/entityfields/product_id/documentation.adoc</documentation>
-      <title>Article</title>
-      <consumer>Products</consumer>
-      <linkedContext>Product</linkedContext>
-      <displayValueProcess>%aditoprj%/entity/Offeritem_entity/entityfields/product_id/displayValueProcess.js</displayValueProcess>
-      <onValueChange>%aditoprj%/entity/Offeritem_entity/entityfields/product_id/onValueChange.js</onValueChange>
-      <onValueChangeTypes>
-        <element>MASK</element>
-      </onValueChangeTypes>
-    </entityField>
-    <entityField>
-      <name>QUANTITY</name>
-      <documentation>%aditoprj%/entity/Offeritem_entity/entityfields/quantity/documentation.adoc</documentation>
-      <title>Quantity</title>
-      <contentType>NUMBER</contentType>
-      <outputFormat>#</outputFormat>
-      <valueProcess>%aditoprj%/entity/Offeritem_entity/entityfields/quantity/valueProcess.js</valueProcess>
-      <onValidation>%aditoprj%/entity/Offeritem_entity/entityfields/quantity/onValidation.js</onValidation>
-      <onValueChange>%aditoprj%/entity/Offeritem_entity/entityfields/quantity/onValueChange.js</onValueChange>
-      <onValueChangeTypes>
-        <element>MASK</element>
-      </onValueChangeTypes>
-    </entityField>
-    <entityField>
-      <name>UNIT</name>
-      <title>Unit</title>
-      <consumer>KeywordQuantityUnits</consumer>
-      <state>READONLY</state>
-      <displayValueProcess>%aditoprj%/entity/Offeritem_entity/entityfields/unit/displayValueProcess.js</displayValueProcess>
-      <onValueChangeTypes>
-        <element>PROCESS</element>
-        <element>MASK</element>
-        <element>PROCESS_SETVALUE</element>
-      </onValueChangeTypes>
-    </entityField>
-    <entityField>
-      <name>VAT</name>
-      <title>VAT in %</title>
-      <contentType>NUMBER</contentType>
-      <outputFormat>#,##0.00</outputFormat>
-      <state>READONLY</state>
-    </entityField>
-    <entityParameter>
-      <name>OfferId_param</name>
-      <expose v="true" />
-      <triggerRecalculation v="true" />
-      <mandatory v="true" />
-      <description>PARAMETER</description>
-    </entityParameter>
-    <entityParameter>
-      <name>ContactId_param</name>
-      <expose v="true" />
-      <triggerRecalculation v="true" />
-      <description>PARAMETER</description>
-    </entityParameter>
-    <entityParameter>
-      <name>Currency_param</name>
-      <expose v="true" />
-      <triggerRecalculation v="true" />
-      <description>PARAMETER</description>
-    </entityParameter>
-    <entityField>
-      <name>TotalPrice</name>
-      <documentation>%aditoprj%/entity/Offeritem_entity/entityfields/totalprice/documentation.adoc</documentation>
-      <title>Sum</title>
-      <contentType>NUMBER</contentType>
-      <outputFormat>#,##0.00</outputFormat>
-      <state>READONLY</state>
-      <valueProcess>%aditoprj%/entity/Offeritem_entity/entityfields/totalprice/valueProcess.js</valueProcess>
-    </entityField>
-    <entityField>
-      <name>IMAGE</name>
-      <contentType>IMAGE</contentType>
-      <valueProcess>%aditoprj%/entity/Offeritem_entity/entityfields/image/valueProcess.js</valueProcess>
-    </entityField>
-    <entityParameter>
-      <name>OfferStatus_param</name>
-      <expose v="true" />
-      <triggerRecalculation v="true" />
-      <description>PARAMETER</description>
-    </entityParameter>
-    <entityProvider>
-      <name>OfferItems</name>
-      <fieldType>DEPENDENCY_IN</fieldType>
-      <recordContainer>db</recordContainer>
-      <dependencies>
-        <entityDependency>
-          <name>7810e350-d011-4d95-8d0b-883f3a0e519c</name>
-          <entityName>Offer_entity</entityName>
-          <fieldName>Offeritems</fieldName>
-          <isConsumer v="false" />
-        </entityDependency>
-      </dependencies>
-      <children>
-        <entityParameter>
-          <name>ContactId_param</name>
-          <expose v="true" />
-        </entityParameter>
-        <entityParameter>
-          <name>Currency_param</name>
-          <valueProcess>%aditoprj%/entity/Offeritem_entity/entityfields/offeritems/children/currency_param/valueProcess.js</valueProcess>
-          <expose v="true" />
-        </entityParameter>
-        <entityParameter>
-          <name>OfferId_param</name>
-          <expose v="true" />
-        </entityParameter>
-        <entityParameter>
-          <name>OfferStatus_param</name>
-          <expose v="true" />
-        </entityParameter>
-      </children>
-    </entityProvider>
-    <entityField>
-      <name>INFO</name>
-      <documentation>%aditoprj%/entity/Offeritem_entity/entityfields/info/documentation.adoc</documentation>
-      <title>Note</title>
-      <contentType>LONG_TEXT</contentType>
-      <state>READONLY</state>
-    </entityField>
-    <entityConsumer>
-      <name>KeywordProductGroupcodes</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/Offeritem_entity/entityfields/keywordproductgroupcodes/children/containername_param/valueProcess.js</valueProcess>
-          <expose v="false" />
-        </entityParameter>
-      </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>KeywordQuantityUnits</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/Offeritem_entity/entityfields/keywordquantityunits/children/containername_param/valueProcess.js</valueProcess>
-          <expose v="false" />
-        </entityParameter>
-      </children>
-    </entityConsumer>
-    <entityConsumer>
-      <name>Products</name>
-      <fieldType>DEPENDENCY_OUT</fieldType>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Product_entity</entityName>
-        <fieldName>#PROVIDER</fieldName>
-      </dependency>
-    </entityConsumer>
-  </entityFields>
-  <recordContainers>
-    <dbRecordContainer>
-      <name>db</name>
-      <alias>Data_alias</alias>
-      <maximumDbRows v="0" />
-      <conditionProcess>%aditoprj%/entity/Offeritem_entity/recordcontainers/db/conditionProcess.js</conditionProcess>
-      <orderClauseProcess>%aditoprj%/entity/Offeritem_entity/recordcontainers/db/orderClauseProcess.js</orderClauseProcess>
-      <onDBInsert>%aditoprj%/entity/Offeritem_entity/recordcontainers/db/onDBInsert.js</onDBInsert>
-      <onDBUpdate>%aditoprj%/entity/Offeritem_entity/recordcontainers/db/onDBUpdate.js</onDBUpdate>
-      <onDBDelete>%aditoprj%/entity/Offeritem_entity/recordcontainers/db/onDBDelete.js</onDBDelete>
-      <linkInformation>
-        <linkInformation>
-          <name>1894a7fa-bc31-43c2-9ba9-d432892efdaa</name>
-          <tableName>OFFERITEM</tableName>
-          <primaryKey>OFFERITEMID</primaryKey>
-          <isUIDTable v="true" />
-          <readonly v="false" />
-        </linkInformation>
-      </linkInformation>
-      <recordFieldMappings>
-        <dbRecordFieldMapping>
-          <name>ASSIGNEDTO.value</name>
-          <recordfield>OFFERITEM.ASSIGNEDTO</recordfield>
-        </dbRecordFieldMapping>
-        <dbRecordFieldMapping>
-          <name>DISCOUNT.value</name>
-          <recordfield>OFFERITEM.DISCOUNT</recordfield>
-        </dbRecordFieldMapping>
-        <dbRecordFieldMapping>
-          <name>GROUPCODEID.value</name>
-          <recordfield>OFFERITEM.GROUPCODEID</recordfield>
-        </dbRecordFieldMapping>
-        <dbRecordFieldMapping>
-          <name>ITEMNAME.value</name>
-          <recordfield>OFFERITEM.ITEMNAME</recordfield>
-        </dbRecordFieldMapping>
-        <dbRecordFieldMapping>
-          <name>ITEMPOSITION.value</name>
-          <recordfield>OFFERITEM.ITEMPOSITION</recordfield>
-        </dbRecordFieldMapping>
-        <dbRecordFieldMapping>
-          <name>ITEMSORT.value</name>
-          <recordfield>OFFERITEM.ITEMSORT</recordfield>
-        </dbRecordFieldMapping>
-        <dbRecordFieldMapping>
-          <name>OFFERITEMID.value</name>
-          <recordfield>OFFERITEM.OFFERITEMID</recordfield>
-        </dbRecordFieldMapping>
-        <dbRecordFieldMapping>
-          <name>OFFER_ID.value</name>
-          <recordfield>OFFERITEM.OFFER_ID</recordfield>
-        </dbRecordFieldMapping>
-        <dbRecordFieldMapping>
-          <name>OPTIONAL.value</name>
-          <recordfield>OFFERITEM.OPTIONAL</recordfield>
-        </dbRecordFieldMapping>
-        <dbRecordFieldMapping>
-          <name>PRICE.value</name>
-          <recordfield>OFFERITEM.PRICE</recordfield>
-        </dbRecordFieldMapping>
-        <dbRecordFieldMapping>
-          <name>PRODUCT_ID.value</name>
-          <recordfield>OFFERITEM.PRODUCT_ID</recordfield>
-        </dbRecordFieldMapping>
-        <dbRecordFieldMapping>
-          <name>QUANTITY.value</name>
-          <recordfield>OFFERITEM.QUANTITY</recordfield>
-        </dbRecordFieldMapping>
-        <dbRecordFieldMapping>
-          <name>UNIT.value</name>
-          <recordfield>OFFERITEM.UNIT</recordfield>
-        </dbRecordFieldMapping>
-        <dbRecordFieldMapping>
-          <name>VAT.value</name>
-          <recordfield>OFFERITEM.VAT</recordfield>
-        </dbRecordFieldMapping>
-        <dbRecordFieldMapping>
-          <name>INFO.value</name>
-          <recordfield>OFFERITEM.INFO</recordfield>
-        </dbRecordFieldMapping>
-        <dbRecordFieldMapping>
-          <name>GROUPCODEID.displayValue</name>
-          <expression>%aditoprj%/entity/Offeritem_entity/recordcontainers/db/recordfieldmappings/groupcodeid.displayvalue/expression.js</expression>
-        </dbRecordFieldMapping>
-        <dbRecordFieldMapping>
-          <name>UNIT.displayValue</name>
-          <expression>%aditoprj%/entity/Offeritem_entity/recordcontainers/db/recordfieldmappings/unit.displayvalue/expression.js</expression>
-        </dbRecordFieldMapping>
-        <dbRecordFieldMapping>
-          <name>PRODUCT_ID.displayValue</name>
-          <expression>%aditoprj%/entity/Offeritem_entity/recordcontainers/db/recordfieldmappings/product_id.displayvalue/expression.js</expression>
-        </dbRecordFieldMapping>
-      </recordFieldMappings>
-    </dbRecordContainer>
-  </recordContainers>
-</entity>
+<?xml version="1.0" encoding="UTF-8"?>
+<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.0" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.0">
+  <name>Offeritem_entity</name>
+  <title>Offeritem</title>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <documentation>%aditoprj%/entity/Offeritem_entity/documentation.adoc</documentation>
+  <afterOperatingState>%aditoprj%/entity/Offeritem_entity/afterOperatingState.js</afterOperatingState>
+  <recordContainer>db</recordContainer>
+  <entityFields>
+    <entityProvider>
+      <name>#PROVIDER</name>
+    </entityProvider>
+    <entityField>
+      <name>ASSIGNEDTO</name>
+    </entityField>
+    <entityField>
+      <name>DISCOUNT</name>
+      <title>Discount %</title>
+      <contentType>NUMBER</contentType>
+      <outputFormat>#,##0</outputFormat>
+    </entityField>
+    <entityField>
+      <name>GROUPCODEID</name>
+      <title>Commodity group</title>
+      <consumer>KeywordProductGroupcodes</consumer>
+      <state>READONLY</state>
+      <displayValueProcess>%aditoprj%/entity/Offeritem_entity/entityfields/groupcodeid/displayValueProcess.js</displayValueProcess>
+    </entityField>
+    <entityField>
+      <name>ITEMNAME</name>
+      <title>Designation</title>
+    </entityField>
+    <entityField>
+      <name>ITEMPOSITION</name>
+      <title>Position</title>
+      <state>READONLY</state>
+    </entityField>
+    <entityField>
+      <name>ITEMSORT</name>
+    </entityField>
+    <entityField>
+      <name>OFFERITEMID</name>
+      <valueProcess>%aditoprj%/entity/Offeritem_entity/entityfields/offeritemid/valueProcess.js</valueProcess>
+    </entityField>
+    <entityField>
+      <name>OFFER_ID</name>
+      <valueProcess>%aditoprj%/entity/Offeritem_entity/entityfields/offer_id/valueProcess.js</valueProcess>
+      <onValueChangeTypes>
+        <element>MASK</element>
+      </onValueChangeTypes>
+    </entityField>
+    <entityField>
+      <name>OPTIONAL</name>
+      <title>Optional</title>
+      <contentType>BOOLEAN</contentType>
+      <possibleItemsProcess>%aditoprj%/entity/Offeritem_entity/entityfields/optional/possibleItemsProcess.js</possibleItemsProcess>
+      <valueProcess>%aditoprj%/entity/Offeritem_entity/entityfields/optional/valueProcess.js</valueProcess>
+    </entityField>
+    <entityField>
+      <name>PRICE</name>
+      <title>Unit price</title>
+      <contentType>NUMBER</contentType>
+      <outputFormat>#,##0.00</outputFormat>
+    </entityField>
+    <entityField>
+      <name>PRODUCT_ID</name>
+      <documentation>%aditoprj%/entity/Offeritem_entity/entityfields/product_id/documentation.adoc</documentation>
+      <title>Article</title>
+      <consumer>Products</consumer>
+      <linkedContext>Product</linkedContext>
+      <displayValueProcess>%aditoprj%/entity/Offeritem_entity/entityfields/product_id/displayValueProcess.js</displayValueProcess>
+      <onValueChange>%aditoprj%/entity/Offeritem_entity/entityfields/product_id/onValueChange.js</onValueChange>
+      <onValueChangeTypes>
+        <element>MASK</element>
+      </onValueChangeTypes>
+    </entityField>
+    <entityField>
+      <name>QUANTITY</name>
+      <documentation>%aditoprj%/entity/Offeritem_entity/entityfields/quantity/documentation.adoc</documentation>
+      <title>Quantity</title>
+      <contentType>NUMBER</contentType>
+      <outputFormat>#</outputFormat>
+      <valueProcess>%aditoprj%/entity/Offeritem_entity/entityfields/quantity/valueProcess.js</valueProcess>
+      <onValidation>%aditoprj%/entity/Offeritem_entity/entityfields/quantity/onValidation.js</onValidation>
+      <onValueChange>%aditoprj%/entity/Offeritem_entity/entityfields/quantity/onValueChange.js</onValueChange>
+      <onValueChangeTypes>
+        <element>MASK</element>
+      </onValueChangeTypes>
+    </entityField>
+    <entityField>
+      <name>UNIT</name>
+      <title>Unit</title>
+      <consumer>KeywordQuantityUnits</consumer>
+      <state>READONLY</state>
+      <displayValueProcess>%aditoprj%/entity/Offeritem_entity/entityfields/unit/displayValueProcess.js</displayValueProcess>
+      <onValueChangeTypes>
+        <element>PROCESS</element>
+        <element>MASK</element>
+        <element>PROCESS_SETVALUE</element>
+      </onValueChangeTypes>
+    </entityField>
+    <entityField>
+      <name>VAT</name>
+      <title>VAT in %</title>
+      <contentType>NUMBER</contentType>
+      <outputFormat>#,##0.00</outputFormat>
+      <state>READONLY</state>
+    </entityField>
+    <entityParameter>
+      <name>OfferId_param</name>
+      <expose v="true" />
+      <triggerRecalculation v="true" />
+      <mandatory v="true" />
+      <description>PARAMETER</description>
+    </entityParameter>
+    <entityParameter>
+      <name>ContactId_param</name>
+      <expose v="true" />
+      <triggerRecalculation v="true" />
+      <description>PARAMETER</description>
+    </entityParameter>
+    <entityParameter>
+      <name>Currency_param</name>
+      <expose v="true" />
+      <triggerRecalculation v="true" />
+      <description>PARAMETER</description>
+    </entityParameter>
+    <entityField>
+      <name>TotalPrice</name>
+      <documentation>%aditoprj%/entity/Offeritem_entity/entityfields/totalprice/documentation.adoc</documentation>
+      <title>Sum</title>
+      <contentType>NUMBER</contentType>
+      <outputFormat>#,##0.00</outputFormat>
+      <state>READONLY</state>
+      <valueProcess>%aditoprj%/entity/Offeritem_entity/entityfields/totalprice/valueProcess.js</valueProcess>
+    </entityField>
+    <entityField>
+      <name>IMAGE</name>
+      <contentType>IMAGE</contentType>
+      <valueProcess>%aditoprj%/entity/Offeritem_entity/entityfields/image/valueProcess.js</valueProcess>
+    </entityField>
+    <entityParameter>
+      <name>OfferStatus_param</name>
+      <expose v="true" />
+      <triggerRecalculation v="true" />
+      <description>PARAMETER</description>
+    </entityParameter>
+    <entityProvider>
+      <name>OfferItems</name>
+      <fieldType>DEPENDENCY_IN</fieldType>
+      <recordContainer>db</recordContainer>
+      <dependencies>
+        <entityDependency>
+          <name>7810e350-d011-4d95-8d0b-883f3a0e519c</name>
+          <entityName>Offer_entity</entityName>
+          <fieldName>Offeritems</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+      </dependencies>
+      <children>
+        <entityParameter>
+          <name>ContactId_param</name>
+          <expose v="true" />
+        </entityParameter>
+        <entityParameter>
+          <name>Currency_param</name>
+          <expose v="true" />
+        </entityParameter>
+        <entityParameter>
+          <name>OfferId_param</name>
+          <expose v="true" />
+        </entityParameter>
+        <entityParameter>
+          <name>OfferStatus_param</name>
+          <expose v="true" />
+        </entityParameter>
+      </children>
+    </entityProvider>
+    <entityField>
+      <name>INFO</name>
+      <documentation>%aditoprj%/entity/Offeritem_entity/entityfields/info/documentation.adoc</documentation>
+      <title>Note</title>
+      <contentType>LONG_TEXT</contentType>
+      <state>READONLY</state>
+    </entityField>
+    <entityConsumer>
+      <name>KeywordProductGroupcodes</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/Offeritem_entity/entityfields/keywordproductgroupcodes/children/containername_param/valueProcess.js</valueProcess>
+          <expose v="false" />
+        </entityParameter>
+      </children>
+    </entityConsumer>
+    <entityConsumer>
+      <name>KeywordQuantityUnits</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/Offeritem_entity/entityfields/keywordquantityunits/children/containername_param/valueProcess.js</valueProcess>
+          <expose v="false" />
+        </entityParameter>
+      </children>
+    </entityConsumer>
+    <entityConsumer>
+      <name>Products</name>
+      <fieldType>DEPENDENCY_OUT</fieldType>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Product_entity</entityName>
+        <fieldName>#PROVIDER</fieldName>
+      </dependency>
+    </entityConsumer>
+  </entityFields>
+  <recordContainers>
+    <dbRecordContainer>
+      <name>db</name>
+      <alias>Data_alias</alias>
+      <maximumDbRows v="0" />
+      <conditionProcess>%aditoprj%/entity/Offeritem_entity/recordcontainers/db/conditionProcess.js</conditionProcess>
+      <orderClauseProcess>%aditoprj%/entity/Offeritem_entity/recordcontainers/db/orderClauseProcess.js</orderClauseProcess>
+      <onDBInsert>%aditoprj%/entity/Offeritem_entity/recordcontainers/db/onDBInsert.js</onDBInsert>
+      <onDBUpdate>%aditoprj%/entity/Offeritem_entity/recordcontainers/db/onDBUpdate.js</onDBUpdate>
+      <onDBDelete>%aditoprj%/entity/Offeritem_entity/recordcontainers/db/onDBDelete.js</onDBDelete>
+      <linkInformation>
+        <linkInformation>
+          <name>1894a7fa-bc31-43c2-9ba9-d432892efdaa</name>
+          <tableName>OFFERITEM</tableName>
+          <primaryKey>OFFERITEMID</primaryKey>
+          <isUIDTable v="true" />
+          <readonly v="false" />
+        </linkInformation>
+      </linkInformation>
+      <recordFieldMappings>
+        <dbRecordFieldMapping>
+          <name>ASSIGNEDTO.value</name>
+          <recordfield>OFFERITEM.ASSIGNEDTO</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>DISCOUNT.value</name>
+          <recordfield>OFFERITEM.DISCOUNT</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>GROUPCODEID.value</name>
+          <recordfield>OFFERITEM.GROUPCODEID</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>ITEMNAME.value</name>
+          <recordfield>OFFERITEM.ITEMNAME</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>ITEMPOSITION.value</name>
+          <recordfield>OFFERITEM.ITEMPOSITION</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>ITEMSORT.value</name>
+          <recordfield>OFFERITEM.ITEMSORT</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>OFFERITEMID.value</name>
+          <recordfield>OFFERITEM.OFFERITEMID</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>OFFER_ID.value</name>
+          <recordfield>OFFERITEM.OFFER_ID</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>OPTIONAL.value</name>
+          <recordfield>OFFERITEM.OPTIONAL</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>PRICE.value</name>
+          <recordfield>OFFERITEM.PRICE</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>PRODUCT_ID.value</name>
+          <recordfield>OFFERITEM.PRODUCT_ID</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>QUANTITY.value</name>
+          <recordfield>OFFERITEM.QUANTITY</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>UNIT.value</name>
+          <recordfield>OFFERITEM.UNIT</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>VAT.value</name>
+          <recordfield>OFFERITEM.VAT</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>INFO.value</name>
+          <recordfield>OFFERITEM.INFO</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>GROUPCODEID.displayValue</name>
+          <expression>%aditoprj%/entity/Offeritem_entity/recordcontainers/db/recordfieldmappings/groupcodeid.displayvalue/expression.js</expression>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>UNIT.displayValue</name>
+          <expression>%aditoprj%/entity/Offeritem_entity/recordcontainers/db/recordfieldmappings/unit.displayvalue/expression.js</expression>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>PRODUCT_ID.displayValue</name>
+          <expression>%aditoprj%/entity/Offeritem_entity/recordcontainers/db/recordfieldmappings/product_id.displayvalue/expression.js</expression>
+        </dbRecordFieldMapping>
+      </recordFieldMappings>
+    </dbRecordContainer>
+  </recordContainers>
+</entity>
diff --git a/entity/Offeritem_entity/entityfields/offeritems/children/currency_param/valueProcess.js b/entity/Offeritem_entity/entityfields/offeritems/children/currency_param/valueProcess.js
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/entity/Person_entity/Person_entity.aod b/entity/Person_entity/Person_entity.aod
index cbf15c42b4556e833a57da1f19477f8db5dce923..a1bfbf3da6a45cd9e66a135767a1c65be48377a6 100644
--- a/entity/Person_entity/Person_entity.aod
+++ b/entity/Person_entity/Person_entity.aod
@@ -372,6 +372,10 @@ Usually this is used for filtering COMMUNICATION-entries by a specified contact
           <expose v="true" />
           <mandatory v="true" />
         </entityParameter>
+        <entityParameter>
+          <name>ExcludedContactIds_param</name>
+          <expose v="false" />
+        </entityParameter>
       </children>
     </entityProvider>
     <entityConsumer>
@@ -691,14 +695,20 @@ Usually this is used for filtering COMMUNICATION-entries by a specified contact
     <entityField>
       <name>DEPARTMENT</name>
       <title>Department</title>
+      <possibleItemsProcess>%aditoprj%/entity/Person_entity/entityfields/department/possibleItemsProcess.js</possibleItemsProcess>
+      <newItemsAllowed v="true" />
     </entityField>
     <entityField>
       <name>POSITION</name>
       <title>Position</title>
+      <possibleItemsProcess>%aditoprj%/entity/Person_entity/entityfields/position/possibleItemsProcess.js</possibleItemsProcess>
+      <newItemsAllowed v="true" />
     </entityField>
     <entityField>
       <name>CONTACTROLE</name>
       <title>Contactrole</title>
+      <possibleItemsProcess>%aditoprj%/entity/Person_entity/entityfields/contactrole/possibleItemsProcess.js</possibleItemsProcess>
+      <newItemsAllowed v="true" />
     </entityField>
     <entityConsumer>
       <name>OtherContacts</name>
@@ -716,17 +726,20 @@ Usually this is used for filtering COMMUNICATION-entries by a specified contact
         </entityParameter>
       </children>
     </entityConsumer>
+    <entityField>
+      <name>ORGANISATION_NAME</name>
+    </entityField>
     <entityParameter>
-      <name>SalesprojectId_param</name>
+      <name>ExcludedContactIds_param</name>
       <expose v="true" />
       <description>PARAMETER</description>
     </entityParameter>
     <entityProvider>
-      <name>SalesprojectMemberContact</name>
+      <name>Contacts</name>
       <fieldType>DEPENDENCY_IN</fieldType>
       <dependencies>
         <entityDependency>
-          <name>a6372a65-6cbe-4a8e-b428-f77b7f1ea4db</name>
+          <name>75f0e309-8b3f-4224-b599-a203405f1bff</name>
           <entityName>SalesprojectMember_entity</entityName>
           <fieldName>Contacts</fieldName>
           <isConsumer v="false" />
@@ -734,11 +747,20 @@ Usually this is used for filtering COMMUNICATION-entries by a specified contact
       </dependencies>
       <children>
         <entityParameter>
-          <name>SalesprojectId_param</name>
+          <name>ContactId_param</name>
+          <expose v="false" />
+        </entityParameter>
+        <entityParameter>
+          <name>ExcludedContactIds_param</name>
           <expose v="true" />
         </entityParameter>
+        <entityParameter>
+          <name>OrgId_param</name>
+          <expose v="false" />
+        </entityParameter>
       </children>
     </entityProvider>
+<<<<<<< HEAD
     <entityField>
       <name>ORGANISATION_NAME</name>
     </entityField>
@@ -758,6 +780,8 @@ Usually this is used for filtering COMMUNICATION-entries by a specified contact
         </entityParameter>
       </children>
     </entityConsumer>
+=======
+>>>>>>> e6bff1f416a5ecb607992832678b33fe6b6a0084
   </entityFields>
   <recordContainers>
     <dbRecordContainer>
diff --git a/entity/Person_entity/entityfields/contactrole/possibleItemsProcess.js b/entity/Person_entity/entityfields/contactrole/possibleItemsProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..96627ddf00215d0598ae85d2452acfd248cbe52a
--- /dev/null
+++ b/entity/Person_entity/entityfields/contactrole/possibleItemsProcess.js
@@ -0,0 +1,9 @@
+import("system.result");
+import("Keyword_lib");
+import("KeywordRegistry_basic");
+
+var res = KeywordUtils.getEntryNamesByContainer($KeywordRegistry.contactContactrole()).map(function (e){
+    return [e, e]; //currently the first column is ID, second view value - which is the same because there is no ID for keyword-containers
+});
+
+result.object(res);
\ No newline at end of file
diff --git a/entity/Person_entity/entityfields/department/possibleItemsProcess.js b/entity/Person_entity/entityfields/department/possibleItemsProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..77d99fa219eb36618f38dbb344e4a345bb71d331
--- /dev/null
+++ b/entity/Person_entity/entityfields/department/possibleItemsProcess.js
@@ -0,0 +1,9 @@
+import("system.result");
+import("Keyword_lib");
+import("KeywordRegistry_basic");
+
+var res = KeywordUtils.getEntryNamesByContainer($KeywordRegistry.contactDepartment()).map(function (e){
+    return [e, e]; //currently the first column is ID, second view value - which is the same because there is no ID for keyword-containers
+});
+
+result.object(res);
\ No newline at end of file
diff --git a/entity/Person_entity/entityfields/position/possibleItemsProcess.js b/entity/Person_entity/entityfields/position/possibleItemsProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..a86d6820913b759ac976779f9c045378095b6d24
--- /dev/null
+++ b/entity/Person_entity/entityfields/position/possibleItemsProcess.js
@@ -0,0 +1,9 @@
+import("system.result");
+import("Keyword_lib");
+import("KeywordRegistry_basic");
+
+var res = KeywordUtils.getEntryNamesByContainer($KeywordRegistry.contactPosition()).map(function (e){
+    return [e, e]; //currently the first column is ID, second view value - which is the same because there is no ID for keyword-containers
+});
+
+result.object(res);
\ No newline at end of file
diff --git a/entity/Person_entity/recordcontainers/db/conditionProcess.js b/entity/Person_entity/recordcontainers/db/conditionProcess.js
index 77acb02a09f3d362a1d26dde8ecf05ee28a2d291..47f1ee35510663ddbb914ef4dd4f25988d323560 100644
--- a/entity/Person_entity/recordcontainers/db/conditionProcess.js
+++ b/entity/Person_entity/recordcontainers/db/conditionProcess.js
@@ -4,13 +4,27 @@ import("system.result");
 import("Sql_lib");
 
 var cond = new SqlCondition();
-cond.andPrepareVars("CONTACT.ORGANISATION_ID", "$param.OrgId_param");
-cond.andPrepareVars("PERSON.CONTACT_ID", "$param.ContactId_param");
+cond.andPrepareVars("CONTACT.ORGANISATION_ID", "$param.OrgId_param")
+    .andPrepareVars("PERSON.CONTACT_ID", "$param.ContactId_param");
 
+if (vars.exists("$param.ExcludedContactIds_param") && vars.get("$param.ExcludedContactIds_param"))
+{
+    var excludedContacts = JSON.parse(vars.get("$param.ExcludedContactIds_param"));
+    var excludedCond = SqlCondition.begin();
+    
+    excludedContacts.forEach(function(pContactId)
+    {
+        excludedCond.andPrepare("CONTACT.CONTACTID", pContactId, "#<>?");
+    });
+    
+    cond.andSqlCondition(excludedCond, "1=1");
+}
+
+/*
 //in salesprojectMember, only people that aren't already in the salesproject should be selectable
 cond.andPrepareVars("PERSON.PERSONID", "$param.SalesprojectId_param", 
     "# not in (select CONTACT.PERSON_ID from SALESPROJECT_MEMBER join CONTACT on SALESPROJECT_MEMBER.CONTACT_ID = CONTACT.CONTACTID "
         + " where SALESPROJECT_MEMBER.SALESPROJECT_ID = ?)");
-
+*/
 //TODO: use a preparedCondition when available #1030812 #1034026
-result.string(db.translateCondition(cond.build("1 = 1")));
\ No newline at end of file
+result.string(db.translateCondition(cond.build("1 = 1")));
diff --git a/entity/Prod2prod_entity/Prod2prod_entity.aod b/entity/Prod2prod_entity/Prod2prod_entity.aod
index 80bbc2d7cd34083d96453057c56a151d3d7bea88..78d288fbd064f2aa42f6a4d8823fb3362f34dfeb 100644
--- a/entity/Prod2prod_entity/Prod2prod_entity.aod
+++ b/entity/Prod2prod_entity/Prod2prod_entity.aod
@@ -52,11 +52,6 @@
       <triggerRecalculation v="true" />
       <description>PARAMETER</description>
     </entityParameter>
-    <entityField>
-      <name>PARENTID</name>
-      <title>Parent</title>
-      <groupable v="true" />
-    </entityField>
     <entityField>
       <name>PROD2PRODID</name>
       <valueProcess>%aditoprj%/entity/Prod2prod_entity/entityfields/prod2prodid/valueProcess.js</valueProcess>
@@ -145,6 +140,9 @@
         <element>QUANTITY.value</element>
         <element>PRODUCTCODE.value</element>
         <element>PRODUCTID.value</element>
+        <element>PROD2PRODID.value</element>
+        <element>OPTIONAL.value</element>
+        <element>TAKEPRICE.value</element>
       </recordFields>
     </jDitoRecordContainer>
   </recordContainers>
diff --git a/entity/Prod2prod_entity/recordcontainers/jdito/contentProcess.js b/entity/Prod2prod_entity/recordcontainers/jdito/contentProcess.js
index 2e71e4c9dd769dfb2ac8d258de4574683599ad0d..eeef1e962f6196a9eb632698f6860c216068cb51 100644
--- a/entity/Prod2prod_entity/recordcontainers/jdito/contentProcess.js
+++ b/entity/Prod2prod_entity/recordcontainers/jdito/contentProcess.js
@@ -119,7 +119,7 @@ if (vars.get("$sys.recordstate") != neon.OPERATINGSTATE_NEW)
     if(prodid != "")
     {
         // First 3 columns are crucial, the rest is optional.
-        var data = db.table("select PROD2PRODID, SOURCE_ID, DEST_ID, QUANTITY, PRODUCTCODE, PRODUCTID "
+        var data = db.table("select PROD2PRODID, SOURCE_ID, DEST_ID, QUANTITY, PRODUCTCODE, PRODUCTID, PROD2PRODID, OPTIONAL, TAKEPRICE "
                     + "from PROD2PROD join PRODUCT on PROD2PROD.SOURCE_ID = PRODUCTID "
                     + "order by PRODUCTCODE");
                 
diff --git a/entity/Prod2prod_entity/recordcontainers/jdito/onDelete.js b/entity/Prod2prod_entity/recordcontainers/jdito/onDelete.js
index 75472b57594f5b0bfac9304d844e36c49cd92f69..3f5b37d8a09c58c04eb400f106a90a33be140cdd 100644
--- a/entity/Prod2prod_entity/recordcontainers/jdito/onDelete.js
+++ b/entity/Prod2prod_entity/recordcontainers/jdito/onDelete.js
@@ -1,3 +1,4 @@
+import("system.vars");
 import("system.neon");
 import("system.db");
 import("Sql_lib");
@@ -7,4 +8,4 @@ db.deleteData("PROD2PROD", SqlCondition.begin()
                                        .build("1=2"));
 
 // Refresh otherwise the children of the deleted node would be moved to the root.
-neon.refresh()
\ No newline at end of file
+neon.refresh();
\ No newline at end of file
diff --git a/entity/SalesprojectCompetition_entity/SalesprojectCompetition_entity.aod b/entity/SalesprojectCompetition_entity/SalesprojectCompetition_entity.aod
index bdd5fa2a86d27e88650268b235c03f7846d46d3a..0df2e74d7c286b06191944b2c34905f90ccf6324 100644
--- a/entity/SalesprojectCompetition_entity/SalesprojectCompetition_entity.aod
+++ b/entity/SalesprojectCompetition_entity/SalesprojectCompetition_entity.aod
@@ -219,6 +219,7 @@
       <name>Attributes</name>
       <title>Attributes</title>
       <fieldType>DEPENDENCY_OUT</fieldType>
+      <state>DISABLED</state>
       <dependency>
         <name>dependency</name>
         <entityName>AttributeRelation_entity</entityName>
@@ -228,17 +229,15 @@
         <entityParameter>
           <name>FilteredAttributeIds_param</name>
           <valueProcess>%aditoprj%/entity/SalesprojectCompetition_entity/entityfields/attributes/children/filteredattributeids_param/valueProcess.js</valueProcess>
-          <expose v="false" />
         </entityParameter>
         <entityParameter>
           <name>ObjectRowId_param</name>
           <valueProcess>%aditoprj%/entity/SalesprojectCompetition_entity/entityfields/attributes/children/objectrowid_param/valueProcess.js</valueProcess>
-          <expose v="false" />
+          <triggerRecalculation v="true" />
         </entityParameter>
         <entityParameter>
           <name>ObjectType_param</name>
           <valueProcess>%aditoprj%/entity/SalesprojectCompetition_entity/entityfields/attributes/children/objecttype_param/valueProcess.js</valueProcess>
-          <expose v="false" />
         </entityParameter>
         <entityParameter>
           <name>DisplaySimpleName_param</name>
diff --git a/entity/SalesprojectCompetition_entity/entityfields/attributes/children/objecttype_param/valueProcess.js b/entity/SalesprojectCompetition_entity/entityfields/attributes/children/objecttype_param/valueProcess.js
index 41202c0153c75fda1c5eb90ea3a2f09178ba6df9..9acfa14adab3e82729a6f5f57b0aa1b4b1bbadad 100644
--- a/entity/SalesprojectCompetition_entity/entityfields/attributes/children/objecttype_param/valueProcess.js
+++ b/entity/SalesprojectCompetition_entity/entityfields/attributes/children/objecttype_param/valueProcess.js
@@ -1,3 +1,7 @@
+import("system.vars");
 import("system.result");
 
-result.string("Organisation");
+if (vars.get("$field.CONTACT_ID"))
+    result.string("Organisation");
+else
+    result.string("true");
\ No newline at end of file
diff --git a/entity/SalesprojectMember_entity/SalesprojectMember_entity.aod b/entity/SalesprojectMember_entity/SalesprojectMember_entity.aod
index 94831ab56859425d402f96d06a02b076ae682e80..34540f9d1108c7c08cfefad0eaf52bb364a250b3 100644
--- a/entity/SalesprojectMember_entity/SalesprojectMember_entity.aod
+++ b/entity/SalesprojectMember_entity/SalesprojectMember_entity.aod
@@ -137,12 +137,12 @@ TODO: intuitive möglichkeit, auf dend Stand aus Relation zurückzusetzen... akt
       <dependency>
         <name>dependency</name>
         <entityName>Person_entity</entityName>
-        <fieldName>SalesprojectMemberContact</fieldName>
+        <fieldName>Contacts</fieldName>
       </dependency>
       <children>
         <entityParameter>
-          <name>SalesprojectId_param</name>
-          <valueProcess>%aditoprj%/entity/SalesprojectMember_entity/entityfields/contacts/children/salesprojectid_param/valueProcess.js</valueProcess>
+          <name>ExcludedContactIds_param</name>
+          <valueProcess>%aditoprj%/entity/SalesprojectMember_entity/entityfields/contacts/children/excludedcontactids_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
     </entityConsumer>
diff --git a/entity/SalesprojectMember_entity/entityfields/contacts/children/excludedcontactids_param/valueProcess.js b/entity/SalesprojectMember_entity/entityfields/contacts/children/excludedcontactids_param/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..35ca5d0cce0f248a842d75e8ee8d987dee71646c
--- /dev/null
+++ b/entity/SalesprojectMember_entity/entityfields/contacts/children/excludedcontactids_param/valueProcess.js
@@ -0,0 +1,13 @@
+import("system.logging");
+import("system.result");
+import("system.vars");
+import("system.db");
+import("Sql_lib");
+
+logging.log(db.array(db.COLUMN, SqlCondition.begin()
+                                .andPrepare("SALESPROJECT_MEMBER.SALESPROJECT_ID", vars.get("$field.SALESPROJECT_ID"))
+                                .buildSql("select CONTACT_ID from SALESPROJECT_MEMBER", "1=2")).toSource())
+result.object(db.array(db.COLUMN, SqlCondition.begin()
+                                .andPrepare("SALESPROJECT_MEMBER.SALESPROJECT_ID", vars.get("$field.SALESPROJECT_ID"))
+                                .buildSql("select CONTACT_ID from SALESPROJECT_MEMBER", "1=2")));
+                     
\ No newline at end of file
diff --git a/entity/SalesprojectMember_entity/entityfields/contacts/children/salesprojectid_param/valueProcess.js b/entity/SalesprojectMember_entity/entityfields/contacts/children/salesprojectid_param/valueProcess.js
deleted file mode 100644
index 0456b23233a1ace988306c88ab36b7a26030d519..0000000000000000000000000000000000000000
--- a/entity/SalesprojectMember_entity/entityfields/contacts/children/salesprojectid_param/valueProcess.js
+++ /dev/null
@@ -1,4 +0,0 @@
-import("system.vars");
-import("system.result");
-
-result.string(vars.get("$field.SALESPROJECT_ID"));
\ No newline at end of file
diff --git a/entity/Task_entity/entityfields/editor_contact_id/displayValueProcess.js b/entity/Task_entity/entityfields/editor_contact_id/displayValueProcess.js
index ee76682f8edea5a240eab30e4a8dffdfe66ac907..0dde82e7728286629b1c210326725aac2ebb92c5 100644
--- a/entity/Task_entity/entityfields/editor_contact_id/displayValueProcess.js
+++ b/entity/Task_entity/entityfields/editor_contact_id/displayValueProcess.js
@@ -3,5 +3,6 @@ import("system.vars");
 import("Contact_lib");
 
 var id = vars.get("$this.value");
-var title = ContactUtils.getFullTitleByContactId(id);
+//show the simpel title since this will be later an employee-entry and therefore no organisation is needed
+var title = ContactUtils.getTitleByContactId(id);
 result.string(title);
\ No newline at end of file
diff --git a/entity/Task_entity/entityfields/requestor_contact_id/displayValueProcess.js b/entity/Task_entity/entityfields/requestor_contact_id/displayValueProcess.js
index ee76682f8edea5a240eab30e4a8dffdfe66ac907..0dde82e7728286629b1c210326725aac2ebb92c5 100644
--- a/entity/Task_entity/entityfields/requestor_contact_id/displayValueProcess.js
+++ b/entity/Task_entity/entityfields/requestor_contact_id/displayValueProcess.js
@@ -3,5 +3,6 @@ import("system.vars");
 import("Contact_lib");
 
 var id = vars.get("$this.value");
-var title = ContactUtils.getFullTitleByContactId(id);
+//show the simpel title since this will be later an employee-entry and therefore no organisation is needed
+var title = ContactUtils.getTitleByContactId(id);
 result.string(title);
\ No newline at end of file
diff --git a/entity/Task_entity/recordcontainers/db/onDBDelete.js b/entity/Task_entity/recordcontainers/db/onDBDelete.js
index 7857f671302c87c59f3123e3329ff7057a6b0e20..d19d38f6e972d7759782100f4a94d41fd3dd7944 100644
--- a/entity/Task_entity/recordcontainers/db/onDBDelete.js
+++ b/entity/Task_entity/recordcontainers/db/onDBDelete.js
@@ -5,5 +5,4 @@ import("Sql_lib");
 var condition = SqlCondition.begin()
     .andPrepareVars("TASKLINK.TASK_ID", "$field.TASKID");
 
-db.deleteData("TASKLINK", condition.build("1=2"));
-
+db.deleteData("TASKLINK", condition.build("1=2"));
\ No newline at end of file
diff --git a/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod b/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod
index 39ba8770d5698323c9bcad7982bea1b4cb7274e1..737d12613926001907d83bf7b8c148ca47db7db4 100644
--- a/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod
+++ b/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod
@@ -1164,9 +1164,6 @@
     <entry>
       <key>Attribute Usage</key>
     </entry>
-    <entry>
-      <key>Beziehung</key>
-    </entry>
     <entry>
       <key>Key</key>
     </entry>
@@ -2581,13 +2578,52 @@
       <key>New module</key>
     </entry>
     <entry>
-      <key>New salesproject</key>
+      <key>Time in minutes</key>
     </entry>
     <entry>
-      <key>New contract</key>
+      <key>Sales manager</key>
     </entry>
     <entry>
-      <key>Time in minutes</key>
+      <key>IT</key>
+    </entry>
+    <entry>
+      <key>Administrator</key>
+    </entry>
+    <entry>
+      <key>Managing director</key>
+    </entry>
+    <entry>
+      <key>Production manager</key>
+    </entry>
+    <entry>
+      <key>Production</key>
+    </entry>
+    <entry>
+      <key>CEO</key>
+    </entry>
+    <entry>
+      <key>Purchasing manager</key>
+    </entry>
+    <entry>
+      <key>Marketing manager</key>
+    </entry>
+    <entry>
+      <key>IT manager</key>
+    </entry>
+    <entry>
+      <key>Marketing</key>
+    </entry>
+    <entry>
+      <key>CSO</key>
+    </entry>
+    <entry>
+      <key>Executive board</key>
+    </entry>
+    <entry>
+      <key>Supervisory board</key>
+    </entry>
+    <entry>
+      <key>Management</key>
     </entry>
   </keyValueMap>
   <font name="Dialog" style="0" size="11" />
diff --git a/language/_____LANGUAGE_de/_____LANGUAGE_de.aod b/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
index 499739e2d4cd025ce39e85af70c718a6f99e0238..61efa9f24ab8eda804250b23e1f55e8cd9995715 100644
--- a/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
+++ b/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
@@ -42,10 +42,6 @@
       <key>Show all activities</key>
       <value>Alle Aktivitäten anzeigen</value>
     </entry>
-    <entry>
-      <key>New contract</key>
-      <value>Neuer Vertrag</value>
-    </entry>
     <entry>
       <key>${ADDRESS_STATE}</key>
       <value>Staat</value>
@@ -1610,9 +1606,6 @@
       <key>Attribute Usage</key>
       <value>Eigenschaftsverwendung</value>
     </entry>
-    <entry>
-      <key>Beziehung</key>
-    </entry>
     <entry>
       <key>Key</key>
     </entry>
@@ -1864,10 +1857,6 @@
       <key>Cabo Verde</key>
       <value>Cabo Verde</value>
     </entry>
-    <entry>
-      <key>New salesproject</key>
-      <value>Neues Vertriebsprojekt</value>
-    </entry>
     <entry>
       <key>Ecuador</key>
       <value>Ecuador</value>
@@ -3335,6 +3324,60 @@
       <key>Time in minutes</key>
       <value>Zeit in Minuten</value>
     </entry>
+    <entry>
+      <key>Sales manager</key>
+      <value>Vertriebsleiter</value>
+    </entry>
+    <entry>
+      <key>IT</key>
+    </entry>
+    <entry>
+      <key>Administrator</key>
+    </entry>
+    <entry>
+      <key>Managing director</key>
+      <value>Geschäftsführer</value>
+    </entry>
+    <entry>
+      <key>Production manager</key>
+      <value>Produktionsleiter</value>
+    </entry>
+    <entry>
+      <key>Production</key>
+      <value>Produktion</value>
+    </entry>
+    <entry>
+      <key>CEO</key>
+    </entry>
+    <entry>
+      <key>Purchasing manager</key>
+      <value>Einkaufsleiter</value>
+    </entry>
+    <entry>
+      <key>Marketing manager</key>
+      <value>Marketingleiter</value>
+    </entry>
+    <entry>
+      <key>IT manager</key>
+      <value>IT-Leiter</value>
+    </entry>
+    <entry>
+      <key>Marketing</key>
+    </entry>
+    <entry>
+      <key>CSO</key>
+    </entry>
+    <entry>
+      <key>Executive board</key>
+      <value>Vorstand</value>
+    </entry>
+    <entry>
+      <key>Supervisory board</key>
+      <value>Aufsichtsrat</value>
+    </entry>
+    <entry>
+      <key>Management</key>
+    </entry>
   </keyValueMap>
   <font name="Dialog" style="0" size="11" />
 </language>
diff --git a/language/_____LANGUAGE_en/_____LANGUAGE_en.aod b/language/_____LANGUAGE_en/_____LANGUAGE_en.aod
index 39e9b302cf5d3d120975c2f8fdbf0c46f23d6660..de4f31a483976ce8aff9c6f97b8cd1d2e2324ceb 100644
--- a/language/_____LANGUAGE_en/_____LANGUAGE_en.aod
+++ b/language/_____LANGUAGE_en/_____LANGUAGE_en.aod
@@ -521,7 +521,7 @@
     </entry>
     <entry>
       <key>${EURO_SIGN}</key>
-      <value>�</value>
+      <value>?</value>
     </entry>
     <entry>
       <key>Planned</key>
@@ -1184,9 +1184,6 @@
     <entry>
       <key>Attribute Usage</key>
     </entry>
-    <entry>
-      <key>Beziehung</key>
-    </entry>
     <entry>
       <key>Key</key>
     </entry>
@@ -1217,9 +1214,6 @@
     <entry>
       <key>Context name</key>
     </entry>
-    <entry>
-      <key>Schlüsselwort</key>
-    </entry>
     <entry>
       <key>Cambodia</key>
     </entry>
@@ -1307,9 +1301,6 @@
     <entry>
       <key>Jordan</key>
     </entry>
-    <entry>
-      <key>Côte d'Ivoire</key>
-    </entry>
     <entry>
       <key>United Arab Emirates</key>
     </entry>
@@ -1677,9 +1668,6 @@
     <entry>
       <key>Kazakhstan</key>
     </entry>
-    <entry>
-      <key>Ã…land Islands</key>
-    </entry>
     <entry>
       <key>Bahamas</key>
     </entry>
@@ -1958,9 +1946,6 @@
     <entry>
       <key>Ukraine</key>
     </entry>
-    <entry>
-      <key>Curaçao</key>
-    </entry>
     <entry>
       <key>Anguilla</key>
     </entry>
@@ -2057,9 +2042,6 @@
     <entry>
       <key>ended</key>
     </entry>
-    <entry>
-      <key>Saint Barthélemy</key>
-    </entry>
     <entry>
       <key>Wallis and Futuna</key>
     </entry>
@@ -2075,9 +2057,6 @@
     <entry>
       <key>Hungary</key>
     </entry>
-    <entry>
-      <key>Réunion</key>
-    </entry>
     <entry>
       <key>Japan</key>
     </entry>
@@ -2484,9 +2463,6 @@
     <entry>
       <key>Other Contactroles</key>
     </entry>
-    <entry>
-      <key>Bitte Datumseingabe prüfen!</key>
-    </entry>
     <entry>
       <key>In Bearbeitung</key>
     </entry>
@@ -2499,12 +2475,6 @@
     <entry>
       <key>Bitte Filterbedingungen setzen</key>
     </entry>
-    <entry>
-      <key>Bestätigt</key>
-    </entry>
-    <entry>
-      <key>Vorläufig</key>
-    </entry>
     <entry>
       <key>keine</key>
     </entry>
@@ -2517,18 +2487,12 @@
     <entry>
       <key>&amp;Aufgaben (%0)</key>
     </entry>
-    <entry>
-      <key>erledigt / zurückgestellt</key>
-    </entry>
     <entry>
       <key>hoch</key>
     </entry>
     <entry>
       <key>Keine Berechtigung zum Verschieben der Aufgabe</key>
     </entry>
-    <entry>
-      <key>Zurückgestellt</key>
-    </entry>
     <entry>
       <key>Erledigt</key>
     </entry>
@@ -2538,24 +2502,15 @@
     <entry>
       <key>Abgesagt</key>
     </entry>
-    <entry>
-      <key>Außer Haus</key>
-    </entry>
     <entry>
       <key>Abbrechen</key>
     </entry>
-    <entry>
-      <key>Benutzer auswählen</key>
-    </entry>
     <entry>
       <key>delegiert</key>
     </entry>
     <entry>
       <key>frei</key>
     </entry>
-    <entry>
-      <key>Kein Weitergeben von privaten Aufgaben möglich!</key>
-    </entry>
     <entry>
       <key>%0 Aufgabe(n) erfolgreich weitergegeben an: %1</key>
     </entry>
@@ -2605,14 +2560,95 @@
     <entry>
       <key>Time in minutes</key>
     </entry>
+    <entry>
+      <key>Sales manager</key>
+    </entry>
+    <entry>
+      <key>IT</key>
+    </entry>
+    <entry>
+      <key>Administrator</key>
+    </entry>
+    <entry>
+      <key>Managing director</key>
+    </entry>
+    <entry>
+      <key>Production manager</key>
+    </entry>
+    <entry>
+      <key>Production</key>
+    </entry>
+    <entry>
+      <key>CEO</key>
+    </entry>
+    <entry>
+      <key>Purchasing manager</key>
+    </entry>
+    <entry>
+      <key>Marketing manager</key>
+    </entry>
+    <entry>
+      <key>IT manager</key>
+    </entry>
+    <entry>
+      <key>Marketing</key>
+    </entry>
+    <entry>
+      <key>CSO</key>
+    </entry>
+    <entry>
+      <key>Executive board</key>
+    </entry>
+    <entry>
+      <key>Supervisory board</key>
+    </entry>
+    <entry>
+      <key>Management</key>
+    </entry>
     <entry>
       <key>New module</key>
     </entry>
     <entry>
-      <key>New salesproject</key>
+      <key>Côte d'Ivoire</key>
+    </entry>
+    <entry>
+      <key>Bitte Datumseingabe prüfen!</key>
+    </entry>
+    <entry>
+      <key>Bestätigt</key>
+    </entry>
+    <entry>
+      <key>Vorläufig</key>
+    </entry>
+    <entry>
+      <key>Saint Barthélemy</key>
+    </entry>
+    <entry>
+      <key>erledigt / zurückgestellt</key>
+    </entry>
+    <entry>
+      <key>Zurückgestellt</key>
+    </entry>
+    <entry>
+      <key>Außer Haus</key>
+    </entry>
+    <entry>
+      <key>Benutzer auswählen</key>
+    </entry>
+    <entry>
+      <key>Ã…land Islands</key>
+    </entry>
+    <entry>
+      <key>Kein Weitergeben von privaten Aufgaben möglich!</key>
     </entry>
     <entry>
-      <key>New contract</key>
+      <key>Curaçao</key>
+    </entry>
+    <entry>
+      <key>Schlüsselwort</key>
+    </entry>
+    <entry>
+      <key>Réunion</key>
     </entry>
   </keyValueMap>
   <font name="Dialog" style="0" size="11" />
diff --git a/neonView/OfferFilter_view/OfferFilter_view.aod b/neonView/OfferFilter_view/OfferFilter_view.aod
index 8bd1c5f25d7e107d260c2752f565a3fa913f71ac..edf7596f2f4c18361445c97edeffb08b8f034e8d 100644
--- a/neonView/OfferFilter_view/OfferFilter_view.aod
+++ b/neonView/OfferFilter_view/OfferFilter_view.aod
@@ -27,7 +27,7 @@
       <name>SendOffersDashlet</name>
       <title>Sent offers</title>
       <description>Show all sent offers</description>
-      <fragment>Offer/filter?search=W3sibmFtZSI6IlNUQVRVUyIsIm9wZXJhdG9yIjoiRVFVQUwiLCJ2YWx1ZUtleSI6IjIiLCJ2YWx1ZSI6IlZlcnNlbmRldCIsImNvbnRlbnRUeXBlIjoiVEVYVCJ9XQ%253D%253D</fragment>
+      <fragment>Offer/filter?search=W3sibmFtZSI6IlNUQVRVUyIsIm9wZXJhdG9yIjoiRVFVQUwiLCJ2YWx1ZSI6ImU1ZDZiNWE0LTc1NzYtNDQwZi04MzMyLWJjNDAxNDdjMDMzNSIsImNvbnRlbnRUeXBlIjoiVEVYVCJ9XQ%253D%253D</fragment>
       <singleton v="true" />
       <requiresConfiguration v="false" />
       <icon>vaadin:cart</icon>
diff --git a/neonView/PersonEdit_view/PersonEdit_view.aod b/neonView/PersonEdit_view/PersonEdit_view.aod
index 55ea2a761ba85c258981ef0ce2ca8c6e21d23f12..97dfc7bb74265146568a0df9e75d2a15833e6f8b 100644
--- a/neonView/PersonEdit_view/PersonEdit_view.aod
+++ b/neonView/PersonEdit_view/PersonEdit_view.aod
@@ -57,6 +57,18 @@
           <name>f8ec0e41-7ead-4c80-878c-df75ce5fce34</name>
           <entityField>STATUS</entityField>
         </entityFieldLink>
+        <entityFieldLink>
+          <name>16b3b029-eed3-45b7-94b0-446c89d70594</name>
+          <entityField>DEPARTMENT</entityField>
+        </entityFieldLink>
+        <entityFieldLink>
+          <name>720ba110-faa2-4c64-823b-82a2089f337c</name>
+          <entityField>CONTACTROLE</entityField>
+        </entityFieldLink>
+        <entityFieldLink>
+          <name>7bad6e30-fda3-4ee4-858c-712a60437397</name>
+          <entityField>POSITION</entityField>
+        </entityFieldLink>
       </fields>
     </genericViewTemplate>
     <neonViewReference>
diff --git a/neonView/SalesprojectCompetitionEdit_view/SalesprojectCompetitionEdit_view.aod b/neonView/SalesprojectCompetitionEdit_view/SalesprojectCompetitionEdit_view.aod
index badeadd20fbc20a68526aec3aa629834da7c35d5..16ddeeaa248d7712b685e16dc2f590662dfe4796 100644
--- a/neonView/SalesprojectCompetitionEdit_view/SalesprojectCompetitionEdit_view.aod
+++ b/neonView/SalesprojectCompetitionEdit_view/SalesprojectCompetitionEdit_view.aod
@@ -51,10 +51,5 @@
         </entityFieldLink>
       </fields>
     </genericViewTemplate>
-    <neonViewReference>
-      <name>cba34c27-9abf-416b-99fc-f7e91bd3669c</name>
-      <entityField>Attributes</entityField>
-      <view>AttributeRelationEdit_view</view>
-    </neonViewReference>
   </children>
 </neonView>
diff --git a/neonView/SalesprojectFilter_view/SalesprojectFilter_view.aod b/neonView/SalesprojectFilter_view/SalesprojectFilter_view.aod
index 5baa8af9d1972faee567f460d1e03c380063d9f2..1ea48c8e825f65023b66ea0231761b4a8747a445 100644
--- a/neonView/SalesprojectFilter_view/SalesprojectFilter_view.aod
+++ b/neonView/SalesprojectFilter_view/SalesprojectFilter_view.aod
@@ -27,7 +27,7 @@
       <name>OpenSalesprojectsDashlet</name>
       <title>Open salesprojects</title>
       <description>Show open salesprojects</description>
-      <fragment>Salesproject/filter?search=W3sibmFtZSI6IlNUQVRFIiwib3BlcmF0b3IiOiJFUVVBTCIsInZhbHVlS2V5IjoiMSIsInZhbHVlIjoiT2ZmZW4iLCJjb250ZW50VHlwZSI6IlRFWFQifV0%253D</fragment>
+      <fragment>Salesproject/filter?search=W3sibmFtZSI6IlNUQVRFIiwib3BlcmF0b3IiOiJFUVVBTCIsInZhbHVlIjoiMjViMGFjNzctZWY5Mi00ODA5LTgwMmUtYmI5ZDg3ODJmODY1IiwiY29udGVudFR5cGUiOiJURVhUIn1d</fragment>
       <singleton v="true" />
       <requiresConfiguration v="false" />
       <icon>vaadin:filter</icon>
diff --git a/others/db_changes/data_alias/basic/2019.2/AditoBasic/init_ContactContactrole.xml b/others/db_changes/data_alias/basic/2019.2/AditoBasic/init_ContactContactrole.xml
new file mode 100644
index 0000000000000000000000000000000000000000..e63bb7ba7d4a32faf22bc6e1f01365c7672d7b33
--- /dev/null
+++ b/others/db_changes/data_alias/basic/2019.2/AditoBasic/init_ContactContactrole.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.goderbauer" id="88938510-188f-4814-b25d-0b5e393cd837">
+        <insert tableName="AB_KEYWORD_ENTRY">
+            <column name="AB_KEYWORD_ENTRYID" value="767b89c6-2461-4d0e-9b7a-dda33e5090c9"/>
+
+            <column name="KEYID" value="47abd1f8-d449-4d81-9e6d-c48783119b0b"/>
+            <column name="TITLE" value="Managing director"/>
+            <column name="CONTAINER" value="ContactContactrole"/>
+            <column name="SORTING" valueNumeric="0"/>
+            <column name="ISACTIVE" valueNumeric="1"/>
+            <column name="ISESSENTIAL" valueNumeric="0"/>
+        </insert>
+        <insert tableName="AB_KEYWORD_ENTRY">
+            <column name="AB_KEYWORD_ENTRYID" value="2fa7cddb-1e2c-438f-8f16-92f245af09f4"/>
+
+            <column name="KEYID" value="07ec8a18-c830-4982-a4c6-d2795841b07a"/>
+            <column name="TITLE" value="Purchasing manager"/>
+            <column name="CONTAINER" value="ContactContactrole"/>
+            <column name="SORTING" valueNumeric="1"/>
+            <column name="ISACTIVE" valueNumeric="1"/>
+            <column name="ISESSENTIAL" valueNumeric="0"/>
+        </insert>
+        <insert tableName="AB_KEYWORD_ENTRY">
+            <column name="AB_KEYWORD_ENTRYID" value="67ea4d33-b683-4a04-b2e3-4af54d6debcb"/>
+
+            <column name="KEYID" value="91411987-8700-43d7-a101-4bd375c6e3af"/>
+            <column name="TITLE" value="Executive board"/>
+            <column name="CONTAINER" value="ContactContactrole"/>
+            <column name="SORTING" valueNumeric="2"/>
+            <column name="ISACTIVE" valueNumeric="1"/>
+            <column name="ISESSENTIAL" valueNumeric="0"/>
+        </insert>
+        <insert tableName="AB_KEYWORD_ENTRY">
+            <column name="AB_KEYWORD_ENTRYID" value="d7be200e-ffc0-47a7-b0bb-3da92f39b993"/>
+
+            <column name="KEYID" value="bd0c1b58-6c8c-42a4-b68b-7099ef05bc0e"/>
+            <column name="TITLE" value="Marketing manager"/>
+            <column name="CONTAINER" value="ContactContactrole"/>
+            <column name="SORTING" valueNumeric="3"/>
+            <column name="ISACTIVE" valueNumeric="1"/>
+            <column name="ISESSENTIAL" valueNumeric="0"/>
+        </insert>
+        <insert tableName="AB_KEYWORD_ENTRY">
+            <column name="AB_KEYWORD_ENTRYID" value="3b836d42-9ecf-49b9-8df9-570c27860c01"/>
+
+            <column name="KEYID" value="97d0d10d-14a2-4d85-908d-ea14624b2bfd"/>
+            <column name="TITLE" value="Sales manager"/>
+            <column name="CONTAINER" value="ContactContactrole"/>
+            <column name="SORTING" valueNumeric="4"/>
+            <column name="ISACTIVE" valueNumeric="1"/>
+            <column name="ISESSENTIAL" valueNumeric="0"/>
+        </insert>
+        <insert tableName="AB_KEYWORD_ENTRY">
+            <column name="AB_KEYWORD_ENTRYID" value="2a4e6516-8493-4dde-a9df-bf2efd4db0c8"/>
+
+            <column name="KEYID" value="9c3aea50-b402-4e51-b48d-bfc50c107232"/>
+            <column name="TITLE" value="Supervisory board"/>
+            <column name="CONTAINER" value="ContactContactrole"/>
+            <column name="SORTING" valueNumeric="5"/>
+            <column name="ISACTIVE" valueNumeric="1"/>
+            <column name="ISESSENTIAL" valueNumeric="0"/>
+        </insert>
+        <insert tableName="AB_KEYWORD_ENTRY">
+            <column name="AB_KEYWORD_ENTRYID" value="3e7f2a42-ad8b-48da-aa11-95525ca36d01"/>
+
+            <column name="KEYID" value="7b71b7e0-fb4a-4557-a4ab-7122574b292b"/>
+            <column name="TITLE" value="Administrator"/>
+            <column name="CONTAINER" value="ContactContactrole"/>
+            <column name="SORTING" valueNumeric="6"/>
+            <column name="ISACTIVE" valueNumeric="1"/>
+            <column name="ISESSENTIAL" valueNumeric="0"/>
+        </insert>
+        <insert tableName="AB_KEYWORD_ENTRY">
+            <column name="AB_KEYWORD_ENTRYID" value="11c05d41-78ec-4d7c-acbe-f94912f2386c"/>
+
+            <column name="KEYID" value="6d6f2261-2dbd-445a-9189-18418e7c44ef"/>
+            <column name="TITLE" value="IT manager"/>
+            <column name="CONTAINER" value="ContactContactrole"/>
+            <column name="SORTING" valueNumeric="7"/>
+            <column name="ISACTIVE" valueNumeric="1"/>
+            <column name="ISESSENTIAL" valueNumeric="0"/>
+        </insert>
+        <rollback>
+            <delete tableName="AB_KEYWORD_ENTRY">
+                <where>AB_KEYWORD_ENTRYID = ?</where>
+                <whereParams>
+                    <param value="767b89c6-2461-4d0e-9b7a-dda33e5090c9" />
+                </whereParams>
+            </delete>
+            <delete tableName="AB_KEYWORD_ENTRY">
+                <where>AB_KEYWORD_ENTRYID = ?</where>
+                <whereParams>
+                    <param value="2fa7cddb-1e2c-438f-8f16-92f245af09f4" />
+                </whereParams>
+            </delete>
+            <delete tableName="AB_KEYWORD_ENTRY">
+                <where>AB_KEYWORD_ENTRYID = ?</where>
+                <whereParams>
+                    <param value="67ea4d33-b683-4a04-b2e3-4af54d6debcb" />
+                </whereParams>
+            </delete>
+            <delete tableName="AB_KEYWORD_ENTRY">
+                <where>AB_KEYWORD_ENTRYID = ?</where>
+                <whereParams>
+                    <param value="d7be200e-ffc0-47a7-b0bb-3da92f39b993" />
+                </whereParams>
+            </delete>
+            <delete tableName="AB_KEYWORD_ENTRY">
+                <where>AB_KEYWORD_ENTRYID = ?</where>
+                <whereParams>
+                    <param value="3b836d42-9ecf-49b9-8df9-570c27860c01" />
+                </whereParams>
+            </delete>
+            <delete tableName="AB_KEYWORD_ENTRY">
+                <where>AB_KEYWORD_ENTRYID = ?</where>
+                <whereParams>
+                    <param value="2a4e6516-8493-4dde-a9df-bf2efd4db0c8" />
+                </whereParams>
+            </delete>
+            <delete tableName="AB_KEYWORD_ENTRY">
+                <where>AB_KEYWORD_ENTRYID = ?</where>
+                <whereParams>
+                    <param value="3e7f2a42-ad8b-48da-aa11-95525ca36d01" />
+                </whereParams>
+            </delete>
+            <delete tableName="AB_KEYWORD_ENTRY">
+                <where>AB_KEYWORD_ENTRYID = ?</where>
+                <whereParams>
+                    <param value="11c05d41-78ec-4d7c-acbe-f94912f2386c" />
+                </whereParams>
+            </delete>
+        </rollback>
+    </changeSet>
+</databaseChangeLog>
\ No newline at end of file
diff --git a/others/db_changes/data_alias/basic/2019.2/AditoBasic/init_ContactDepartment.xml b/others/db_changes/data_alias/basic/2019.2/AditoBasic/init_ContactDepartment.xml
new file mode 100644
index 0000000000000000000000000000000000000000..15f81f525dd0bcdd343a3849029af4d14c32df4b
--- /dev/null
+++ b/others/db_changes/data_alias/basic/2019.2/AditoBasic/init_ContactDepartment.xml
@@ -0,0 +1,87 @@
+<?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.goderbauer" id="88938510-188f-4814-b25d-0b5e393cd837">
+        <insert tableName="AB_KEYWORD_ENTRY">
+            <column name="AB_KEYWORD_ENTRYID" value="75bd97bc-56f3-4ea3-a132-df3cb9cda071"/>
+
+            <column name="KEYID" value="c58a028c-772a-444f-8109-37cfde3f60a0"/>
+            <column name="TITLE" value="Management"/>
+            <column name="CONTAINER" value="ContactDepartment"/>
+            <column name="SORTING" valueNumeric="0"/>
+            <column name="ISACTIVE" valueNumeric="1"/>
+            <column name="ISESSENTIAL" valueNumeric="0"/>
+        </insert>
+        <insert tableName="AB_KEYWORD_ENTRY">
+            <column name="AB_KEYWORD_ENTRYID" value="6e30d397-e31f-4ccb-96e9-51cf71d259fa"/>
+
+            <column name="KEYID" value="afc7a9b8-895d-41b9-b68c-e1bdb8ba878f"/>
+            <column name="TITLE" value="Sales"/>
+            <column name="CONTAINER" value="ContactDepartment"/>
+            <column name="SORTING" valueNumeric="1"/>
+            <column name="ISACTIVE" valueNumeric="1"/>
+            <column name="ISESSENTIAL" valueNumeric="0"/>
+        </insert>
+        <insert tableName="AB_KEYWORD_ENTRY">
+            <column name="AB_KEYWORD_ENTRYID" value="722e83bc-148a-4762-abda-d491bf590bd5"/>
+
+            <column name="KEYID" value="e00eb3fc-2c8d-46a9-990a-ed2bf1948ffe"/>
+            <column name="TITLE" value="Production"/>
+            <column name="CONTAINER" value="ContactDepartment"/>
+            <column name="SORTING" valueNumeric="2"/>
+            <column name="ISACTIVE" valueNumeric="1"/>
+            <column name="ISESSENTIAL" valueNumeric="0"/>
+        </insert>
+        <insert tableName="AB_KEYWORD_ENTRY">
+            <column name="AB_KEYWORD_ENTRYID" value="191617b2-09cc-4fe6-bc02-1cee746285d5"/>
+
+            <column name="KEYID" value="bde6d083-517e-45bd-8326-d84e7f8aeba0"/>
+            <column name="TITLE" value="Marketing"/>
+            <column name="CONTAINER" value="ContactDepartment"/>
+            <column name="SORTING" valueNumeric="3"/>
+            <column name="ISACTIVE" valueNumeric="1"/>
+            <column name="ISESSENTIAL" valueNumeric="0"/>
+        </insert>
+        <insert tableName="AB_KEYWORD_ENTRY">
+            <column name="AB_KEYWORD_ENTRYID" value="87f97554-c335-4328-911a-345d8a9abd7d"/>
+
+            <column name="KEYID" value="b1113c19-2f1f-4d0a-806e-b0165ecc1b4a"/>
+            <column name="TITLE" value="IT"/>
+            <column name="CONTAINER" value="ContactDepartment"/>
+            <column name="SORTING" valueNumeric="4"/>
+            <column name="ISACTIVE" valueNumeric="1"/>
+            <column name="ISESSENTIAL" valueNumeric="0"/>
+        </insert>
+        <rollback>
+            <delete tableName="AB_KEYWORD_ENTRY">
+                <where>AB_KEYWORD_ENTRYID = ?</where>
+                <whereParams>
+                    <param value="75bd97bc-56f3-4ea3-a132-df3cb9cda071" />
+                </whereParams>
+            </delete>
+            <delete tableName="AB_KEYWORD_ENTRY">
+                <where>AB_KEYWORD_ENTRYID = ?</where>
+                <whereParams>
+                    <param value="6e30d397-e31f-4ccb-96e9-51cf71d259fa" />
+                </whereParams>
+            </delete>
+            <delete tableName="AB_KEYWORD_ENTRY">
+                <where>AB_KEYWORD_ENTRYID = ?</where>
+                <whereParams>
+                    <param value="722e83bc-148a-4762-abda-d491bf590bd5" />
+                </whereParams>
+            </delete>
+            <delete tableName="AB_KEYWORD_ENTRY">
+                <where>AB_KEYWORD_ENTRYID = ?</where>
+                <whereParams>
+                    <param value="191617b2-09cc-4fe6-bc02-1cee746285d5" />
+                </whereParams>
+            </delete>
+            <delete tableName="AB_KEYWORD_ENTRY">
+                <where>AB_KEYWORD_ENTRYID = ?</where>
+                <whereParams>
+                    <param value="87f97554-c335-4328-911a-345d8a9abd7d" />
+                </whereParams>
+            </delete>
+        </rollback>
+    </changeSet>
+</databaseChangeLog>
\ No newline at end of file
diff --git a/others/db_changes/data_alias/basic/2019.2/AditoBasic/init_ContactPosition.xml b/others/db_changes/data_alias/basic/2019.2/AditoBasic/init_ContactPosition.xml
new file mode 100644
index 0000000000000000000000000000000000000000..136f8bbd47dc2b9753b1cdb8d7d98cb2aa853673
--- /dev/null
+++ b/others/db_changes/data_alias/basic/2019.2/AditoBasic/init_ContactPosition.xml
@@ -0,0 +1,55 @@
+<?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.goderbauer" id="88938510-188f-4814-b25d-0b5e393cd837">
+        <insert tableName="AB_KEYWORD_ENTRY">
+            <column name="AB_KEYWORD_ENTRYID" value="ba369295-c717-48eb-ae76-314087375e06"/>
+
+            <column name="KEYID" value="3308c1e5-cf4d-4934-86b7-981b8f026369"/>
+            <column name="TITLE" value="CEO"/>
+            <column name="CONTAINER" value="ContactPosition"/>
+            <column name="SORTING" valueNumeric="0"/>
+            <column name="ISACTIVE" valueNumeric="1"/>
+            <column name="ISESSENTIAL" valueNumeric="0"/>
+        </insert>
+        <insert tableName="AB_KEYWORD_ENTRY">
+            <column name="AB_KEYWORD_ENTRYID" value="dcacb175-4c8a-4941-a417-69a971f52583"/>
+
+            <column name="KEYID" value="a4952791-73e4-41a1-8a78-5a27640ff0fd"/>
+            <column name="TITLE" value="CSO"/>
+            <column name="CONTAINER" value="ContactPosition"/>
+            <column name="SORTING" valueNumeric="1"/>
+            <column name="ISACTIVE" valueNumeric="1"/>
+            <column name="ISESSENTIAL" valueNumeric="0"/>
+        </insert>
+        <insert tableName="AB_KEYWORD_ENTRY">
+            <column name="AB_KEYWORD_ENTRYID" value="1a508899-e2bf-409d-8a57-3ca31c9c832d"/>
+
+            <column name="KEYID" value="77dcf148-112e-4251-8a0e-9e8bd811f0b7"/>
+            <column name="TITLE" value="Production manager"/>
+            <column name="CONTAINER" value="ContactPosition"/>
+            <column name="SORTING" valueNumeric="2"/>
+            <column name="ISACTIVE" valueNumeric="1"/>
+            <column name="ISESSENTIAL" valueNumeric="0"/>
+        </insert>
+        <rollback>
+            <delete tableName="AB_KEYWORD_ENTRY">
+                <where>AB_KEYWORD_ENTRYID = ?</where>
+                <whereParams>
+                    <param value="ba369295-c717-48eb-ae76-314087375e06" />
+                </whereParams>
+            </delete>
+            <delete tableName="AB_KEYWORD_ENTRY">
+                <where>AB_KEYWORD_ENTRYID = ?</where>
+                <whereParams>
+                    <param value="dcacb175-4c8a-4941-a417-69a971f52583" />
+                </whereParams>
+            </delete>
+            <delete tableName="AB_KEYWORD_ENTRY">
+                <where>AB_KEYWORD_ENTRYID = ?</where>
+                <whereParams>
+                    <param value="1a508899-e2bf-409d-8a57-3ca31c9c832d" />
+                </whereParams>
+            </delete>
+        </rollback>
+    </changeSet>
+</databaseChangeLog>
\ No newline at end of file
diff --git a/others/db_changes/data_alias/basic/2019.2/changelog.xml b/others/db_changes/data_alias/basic/2019.2/changelog.xml
index a9809f5a9d599555454a49990cdae23d0fad8628..05f9a8b2d4e26926cc632f938986211609fa083a 100644
--- a/others/db_changes/data_alias/basic/2019.2/changelog.xml
+++ b/others/db_changes/data_alias/basic/2019.2/changelog.xml
@@ -105,4 +105,7 @@
     <include relativeToChangelogFile="true" file="Salesproject_add_column.xml"/>
     
     <include relativeToChangelogFile="true" file="AditoBasic/update_Strength_Weakness.xml"/>
+    <include relativeToChangelogFile="true" file="AditoBasic/init_ContactDepartment.xml"/>
+    <include relativeToChangelogFile="true" file="AditoBasic/init_ContactContactrole.xml"/>
+    <include relativeToChangelogFile="true" file="AditoBasic/init_ContactPosition.xml"/>
 </databaseChangeLog>
diff --git a/others/db_changes/data_alias/basic/2019.2/data/AditoBasic/ObjectRelation_exampleData.xml b/others/db_changes/data_alias/basic/2019.2/data/AditoBasic/ObjectRelation_exampleData.xml
index db8fa70a9c5427c29c02f22db8e08f93f8fa83b5..448f72ab561a6f45d401d58e19b8f186882c1610 100644
--- a/others/db_changes/data_alias/basic/2019.2/data/AditoBasic/ObjectRelation_exampleData.xml
+++ b/others/db_changes/data_alias/basic/2019.2/data/AditoBasic/ObjectRelation_exampleData.xml
@@ -6,14 +6,14 @@
         <insert tableName="AB_OBJECTRELATION">
             <column name="AB_OBJECTRELATIONID" value="1a67eaa7-21da-4a18-97ab-755ac5cb74f7"/>
             <column name="OBJECT1_ROWID" value="ef345d11-a40d-59e0-a24c-afcb6095d2cb"/>
-            <column name="OBJECT2_ROWID" value="73d72702-e7f5-11e8-9f32-f2801f1b9fd1"/>
+            <column name="OBJECT2_ROWID" value="f0fb7676-8183-4bc7-beca-ca32c1e11c10"/>
             <column name="AB_OBJECTRELATIONTYPE1" value="c74ad02c-1db9-4f47-8691-aba349dbe316"/>
             <column name="AB_OBJECTRELATIONTYPE2" value="b3b85332-1c86-4cd8-a3b9-34c49c51f01a"/>
         </insert>
         <insert tableName="AB_OBJECTRELATION">
             <column name="AB_OBJECTRELATIONID" value="85ad4578-dce2-49df-a844-d162f1bd9f2f"/>
             <column name="OBJECT1_ROWID" value="ef345d11-a40d-59e0-a24c-afcb6095d2cb"/>
-            <column name="OBJECT2_ROWID" value="73d7306c-e7f5-11e8-9f32-f2801f1b9fd1"/>
+            <column name="OBJECT2_ROWID" value="4a55726c-4ca6-43cb-9d3f-8e55d97b7aaf"/>
             <column name="AB_OBJECTRELATIONTYPE1" value="090f6adc-c2b8-44b7-8c61-39dbb5660aa0"/>
             <column name="AB_OBJECTRELATIONTYPE2" value="090f6adc-c2b8-44b7-8c61-39dbb5660aa0"/>
         </insert>
diff --git a/others/db_changes/data_alias/basic/2019.2/data/example_person/PERSON_gruener.xml b/others/db_changes/data_alias/basic/2019.2/data/example_person/PERSON_gruener.xml
index 4c56d28a9fe6ffa708e17108b8a9e735ab4c999b..3d748a734c6d1c673e12d7edc2ef9afe85c11aa8 100644
--- a/others/db_changes/data_alias/basic/2019.2/data/example_person/PERSON_gruener.xml
+++ b/others/db_changes/data_alias/basic/2019.2/data/example_person/PERSON_gruener.xml
@@ -2,7 +2,7 @@
 <databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd">
 <changeSet author="m.escher" id="efc45d2-a40d-49e0-a24c-afab6095d1cb">
 	<insert tableName="PERSON">
-		<column name="PERSONID" value="73d732ce-e7f5-11e8-9f32-f2801f1b9fd1"/>
+		<column name="PERSONID" value="7c1efe4c-cc73-4e95-bdf0-208a3ff699b5"/>
             <column name="FIRSTNAME" value="Jerome"/>
             <column name="MIDDLENAME"/>
             <column name="LASTNAME" value="Grüner"/>
@@ -13,7 +13,7 @@
 	<insert tableName="CONTACT">
                 <column name="RELATIONSHIP" valueNumeric="1"/>
                 <column name="LANGUAGE" value="deu"/>
-		<column name="PERSON_ID" value="73d732ce-e7f5-11e8-9f32-f2801f1b9fd1"/>
+		<column name="PERSON_ID" value="7c1efe4c-cc73-4e95-bdf0-208a3ff699b5"/>
 		<column name="CONTACTID" value="73d73404-e7f5-11e8-9f32-f2801f1b9fd1"/>
 		<column name="ORGANISATION_ID" value="0"/>
 		<column name="STATUS" value="BSIC0rel-stat-actv-ae03-b6b04430e90b"/>
@@ -28,7 +28,7 @@
 		<delete tableName="PERSON">
 			<where>PERSONID = ?</where>
 			<whereParams>
-				<param value="73d732ce-e7f5-11e8-9f32-f2801f1b9fd1" />
+				<param value="7c1efe4c-cc73-4e95-bdf0-208a3ff699b5" />
 			</whereParams>
 		</delete>
 	</rollback>
diff --git a/others/db_changes/data_alias/basic/2019.2/data/example_person/PERSON_kanzler.xml b/others/db_changes/data_alias/basic/2019.2/data/example_person/PERSON_kanzler.xml
index 8b82284ee002bdc39792f40c57c34ec6e7f5e9d6..6eade59392e5f2120e1405d4e5d74cffa4bf68b6 100644
--- a/others/db_changes/data_alias/basic/2019.2/data/example_person/PERSON_kanzler.xml
+++ b/others/db_changes/data_alias/basic/2019.2/data/example_person/PERSON_kanzler.xml
@@ -2,7 +2,7 @@
 <databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd">
 <changeSet author="m.escher" id="efc45d2-a40d-49e0-a24c-afab6095d1cb">
 	<insert tableName="PERSON">
-		<column name="PERSONID" value="73d7306c-e7f5-11e8-9f32-f2801f1b9fd1"/>
+		<column name="PERSONID" value="4a55726c-4ca6-43cb-9d3f-8e55d97b7aaf"/>
         <column name="FIRSTNAME" value="Ludwig"/>
         <column name="MIDDLENAME"/>
         <column name="LASTNAME" value="Kanzler"/>
@@ -13,7 +13,7 @@
 	<insert tableName="CONTACT">
                 <column name="RELATIONSHIP" valueNumeric="1"/>
                 <column name="LANGUAGE" value="deu"/>
-		<column name="PERSON_ID" value="73d7306c-e7f5-11e8-9f32-f2801f1b9fd1"/>
+		<column name="PERSON_ID" value="4a55726c-4ca6-43cb-9d3f-8e55d97b7aaf"/>
 		<column name="CONTACTID" value="73d731a2-e7f5-11e8-9f32-f2801f1b9fd1"/>
 		<column name="ORGANISATION_ID" value="0"/>
 		<column name="STATUS" value="BSIC0rel-stat-actv-ae03-b6b04430e90b"/>
@@ -28,7 +28,7 @@
 		<delete tableName="PERSON">
 			<where>PERSONID = ?</where>
 			<whereParams>
-				<param value="73d7306c-e7f5-11e8-9f32-f2801f1b9fd1" />
+				<param value="4a55726c-4ca6-43cb-9d3f-8e55d97b7aaf" />
 			</whereParams>
 		</delete>
 	</rollback>
diff --git a/others/db_changes/data_alias/basic/2019.2/data/example_person/PERSON_leicht.xml b/others/db_changes/data_alias/basic/2019.2/data/example_person/PERSON_leicht.xml
index 286d335285d3ba16b61bbc1137c9686c95e6842a..d14a4606b8a5cad89c9dff0ab250f2b61569d7f4 100644
--- a/others/db_changes/data_alias/basic/2019.2/data/example_person/PERSON_leicht.xml
+++ b/others/db_changes/data_alias/basic/2019.2/data/example_person/PERSON_leicht.xml
@@ -2,7 +2,7 @@
 <databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd">
 <changeSet author="m.escher" id="efc45d2-a40d-49e0-a24c-afab6095d1cb">
     <insert tableName="PERSON">
-        <column name="PERSONID" value="73d72f18-e7f5-11e8-9f32-f2801f1b9fd1"/>
+        <column name="PERSONID" value="d5a2dc64-e503-4aed-a0c6-d54f49b8db87"/>
         <column name="FIRSTNAME" value="Birgit"/>
         <column name="MIDDLENAME"/>
         <column name="LASTNAME" value="Leicht"/>
@@ -13,8 +13,8 @@
     <insert tableName="CONTACT">
         <column name="RELATIONSHIP" valueNumeric="1"/>
         <column name="LANGUAGE" value="deu"/>
-        <column name="PERSON_ID" value="73d72f18-e7f5-11e8-9f32-f2801f1b9fd1"/>
-        <column name="CONTACTID" value="73d72f18-e7f5-11e8-9f32-f2801f1b9fd1"/>
+        <column name="PERSON_ID" value="d5a2dc64-e503-4aed-a0c6-d54f49b8db87"/>
+        <column name="CONTACTID" value="d5a2dc64-e503-4aed-a0c6-d54f49b8db87"/>
         <column name="ORGANISATION_ID" value="b219b58a-f120-42d8-9a64-0b176501eac7"/>
         <column name="STATUS" value="BSIC0rel-stat-actv-ae03-b6b04430e90b"/>
     </insert>
@@ -23,7 +23,7 @@
         <column name="ADDR_TYPE" valueNumeric="2"/>
         <column name="CITY" value="Landshut"/>
         <column name="COUNTRY" value="DE"/>
-        <column name="CONTACT_ID" value="73d72f18-e7f5-11e8-9f32-f2801f1b9fd1"/>
+        <column name="CONTACT_ID" value="d5a2dc64-e503-4aed-a0c6-d54f49b8db87"/>
         <column name="ADDRIDENTIFIER" value=""/>
         <column name="REGION" value="Niederbayern"/>
         <column name="ADDRESSID" value="ce990566-3b86-48fe-bd0c-1167142e584b"/>
@@ -38,7 +38,7 @@
         <column name="ADDR_TYPE" valueNumeric="3"/>
         <column name="CITY" value="Landshut"/>
         <column name="COUNTRY" value="DE"/>
-        <column name="CONTACT_ID" value="73d72f18-e7f5-11e8-9f32-f2801f1b9fd1"/>
+        <column name="CONTACT_ID" value="d5a2dc64-e503-4aed-a0c6-d54f49b8db87"/>
         <column name="ADDRIDENTIFIER" value=""/>
         <column name="REGION" value="Niederbayern"/>
         <column name="ADDRESSID" value="43b8aea1-2444-448f-87c5-f12fe1ef4ca0"/>
@@ -52,19 +52,19 @@
         <delete tableName="CONTACT">
             <where>CONTACTID = ?</where>
             <whereParams>
-                <param value="73d72f18-e7f5-11e8-9f32-f2801f1b9fd1" />
+                <param value="d5a2dc64-e503-4aed-a0c6-d54f49b8db87" />
             </whereParams>
         </delete>
         <delete tableName="PERSON">
             <where>PERSONID = ?</where>
             <whereParams>
-                <param value="73d72f18-e7f5-11e8-9f32-f2801f1b9fd1" />
+                <param value="d5a2dc64-e503-4aed-a0c6-d54f49b8db87" />
             </whereParams>
         </delete>
         <delete tableName="ADDRESS">
             <where>CONTACT_ID = ?</where>
             <whereParams>
-                <param value="73d72f18-e7f5-11e8-9f32-f2801f1b9fd1" />
+                <param value="d5a2dc64-e503-4aed-a0c6-d54f49b8db87" />
             </whereParams>
         </delete>
     </rollback>
diff --git a/others/db_changes/data_alias/basic/2019.2/data/example_person/PERSON_muller.xml b/others/db_changes/data_alias/basic/2019.2/data/example_person/PERSON_muller.xml
index 92325841d488cb250e60837236ed62834513e74e..a647b15464c1a77feaf6e539c5b0c6b9a6eec364 100644
--- a/others/db_changes/data_alias/basic/2019.2/data/example_person/PERSON_muller.xml
+++ b/others/db_changes/data_alias/basic/2019.2/data/example_person/PERSON_muller.xml
@@ -2,7 +2,7 @@
 <databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd">
 <changeSet author="m.escher" id="efc45d2-a40d-49e0-a24c-afab6095d1cb">
 	<insert tableName="PERSON">
-		<column name="PERSONID" value="73d72702-e7f5-11e8-9f32-f2801f1b9fd1"/>
+		<column name="PERSONID" value="f0fb7676-8183-4bc7-beca-ca32c1e11c10"/>
         <column name="FIRSTNAME" value="Franz"/>
         <column name="MIDDLENAME"/>
         <column name="LASTNAME" value="Müller"/>
@@ -13,8 +13,8 @@
 	<insert tableName="CONTACT">
                 <column name="RELATIONSHIP" valueNumeric="1"/>
                 <column name="LANGUAGE" value="deu"/>
-		<column name="CONTACTID" value="73d72702-e7f5-11e8-9f32-f2801f1b9fd1"/>
-		<column name="PERSON_ID" value="73d72702-e7f5-11e8-9f32-f2801f1b9fd1"/>
+		<column name="CONTACTID" value="f0fb7676-8183-4bc7-beca-ca32c1e11c10"/>
+		<column name="PERSON_ID" value="f0fb7676-8183-4bc7-beca-ca32c1e11c10"/>
 		<column name="ORGANISATION_ID" value="b219b58a-f120-42d8-9a64-0b176501eac7"/>
 		<column name="STATUS" value="BSIC0rel-stat-actv-ae03-b6b04430e90b"/>
 	</insert>
@@ -22,13 +22,13 @@
 		<delete tableName="CONTACT">
 			<where>CONTACTID = ?</where>
 			<whereParams>
-				<param value="73d72702-e7f5-11e8-9f32-f2801f1b9fd1" />
+				<param value="f0fb7676-8183-4bc7-beca-ca32c1e11c10" />
 			</whereParams>
 		</delete>
 		<delete tableName="PERSON">
 			<where>PERSONID = ?</where>
 			<whereParams>
-				<param value="73d72702-e7f5-11e8-9f32-f2801f1b9fd1" />
+				<param value="f0fb7676-8183-4bc7-beca-ca32c1e11c10" />
 			</whereParams>
 		</delete>
 	</rollback>
diff --git a/process/ActivityTask_lib/process.js b/process/ActivityTask_lib/process.js
index 421a419f4f090246ef1b6aefa40a865e54c1b3ba..4228e5d38db37b07d9a0329cc3577b69893815c2 100644
--- a/process/ActivityTask_lib/process.js
+++ b/process/ActivityTask_lib/process.js
@@ -165,7 +165,7 @@ _ActivityTaskUtils._addLinkRecords = function(pObjectIdField, pRowIdField, pAddi
                 break;
             case "Task":
                 presetLinks = presetLinks.concat(db.table(SqlCondition.begin()
-                             .andPrepare("TASKLINK.ACTIVITY_ID", vars.get(pParentIdField))
+                             .andPrepare("TASKLINK.TASK_ID", vars.get(pParentIdField))
                              .buildSql("select OBJECT_TYPE, OBJECT_ROWID from TASKLINK", "1=2")));
                 break;
         }
diff --git a/process/Attribute_lib/process.js b/process/Attribute_lib/process.js
index fcd1ba99fa423c020c228d00f0d988c7f4ae650d..6614f1c74149370b5d9309558f6f797f8d6a5031 100644
--- a/process/Attribute_lib/process.js
+++ b/process/Attribute_lib/process.js
@@ -1,3 +1,5 @@
+import("system.logging");
+import("system.util");
 import("system.datetime");
 import("system.translate");
 import("system.neon");
@@ -61,11 +63,15 @@ AttributeUtil.getPossibleAttributes = function (pObjectType, pIncludeGroups, pFi
  * returns the name of an attribute with all parent attribute names
  * 
  * @param {String} pAttributeId the id of the attribute
+ * @param {Boolean} [pSimpleName=false] Use only the name of the attribute and not the names of the parents.
  * 
  * @return {String} the name of the attribute
  */
-AttributeUtil.getFullAttributeName = function (pAttributeId) 
+AttributeUtil.getFullAttributeName = function (pAttributeId, pSimpleName) 
 {
+    if (pSimpleName == undefined)
+        pSimpleName = false;
+    
     if (!pAttributeId)
         return "";
     var attributeNames = [];
@@ -83,8 +89,8 @@ AttributeUtil.getFullAttributeName = function (pAttributeId)
         }
         else
             pAttributeId = "";
-    } while (pAttributeId);
-
+    } while (pAttributeId && !pSimpleName);
+    
     return attributeNames.reverse().join(" / ");
 }
 
@@ -128,6 +134,28 @@ AttributeUtil.getAllChildren = function (pAttributeId)
     return childIds;
 }
 
+/**
+ * checks if an attribute has attribute relations
+ * 
+ * @param {String} pAttributeId the id of the attribute
+ * 
+ * @result {boolean} true if it has relations
+ */
+AttributeUtil.hasRelations = function (pAttributeId)
+{
+    if (!pAttributeId)
+        return false;
+    return db.cell(SqlCondition.begin()
+        .andPrepare("AB_ATTRIBUTE.AB_ATTRIBUTEID", pAttributeId)
+        .buildSql(
+            "select exists ("
+            +    "select AB_ATTRIBUTERELATIONID from AB_ATTRIBUTERELATION "
+            +    "where AB_ATTRIBUTE_ID = AB_ATTRIBUTEID"
+            + ") from AB_ATTRIBUTE", "1=2"
+        )
+    ) == "true";
+}
+
 /*********************************************************************************************************************/
 
 /**
@@ -482,3 +510,168 @@ AttributeTypeUtil.getTypeColumnIndex = function (pAttributeType)
         AttributeTypeUtil._initTypeColumnData();
     return this._typeColumnMap[pAttributeType.trim()];
 }
+
+/*********************************************************************************************************************/
+
+/**
+ * Functions for AttributeUsages.
+ * Do not instanciate this!
+ * 
+ * @class
+ */
+function AttributeUsageUtil () {}
+
+/**
+ * Creates AttributeUsages for all subordinate attributes of an attribute.
+ * This is required when an usage is added to a superordinate attribute.
+ * 
+ * @param {String} pAttributeId the id of the superordinate attribute
+ * @param {String} pObjectType the context
+ */
+AttributeUsageUtil.insertChildrenUsages = function (pAttributeId, pObjectType)
+{
+    var table = "AB_ATTRIBUTEUSAGE";
+    var columns = ["AB_ATTRIBUTEUSAGEID", "AB_ATTRIBUTE_ID", "OBJECT_TYPE"];
+    var types = db.getColumnTypes(table, columns);
+    
+    var sqlSelect = "select AB_ATTRIBUTEID, "
+            + " exists (select AB_ATTRIBUTEUSAGEID from AB_ATTRIBUTEUSAGE where AB_ATTRIBUTEUSAGE.AB_ATTRIBUTE_ID = AB_ATTRIBUTE.AB_ATTRIBUTEID and OBJECT_TYPE = '" 
+            + pObjectType + "') from AB_ATTRIBUTE";
+    
+    var inserts = [];
+    _addInserts(pAttributeId, pObjectType);
+    db.inserts(inserts);
+    
+    function _addInserts (pAttributeId, pObjectType)
+    {
+        var condition = SqlCondition.begin()
+            .andPrepare("AB_ATTRIBUTE.ATTRIBUTE_TYPE", $AttributeTypes.COMBOVALUE, "# != ?")
+            .andPrepare("AB_ATTRIBUTE.ATTRIBUTE_PARENT_ID", pAttributeId);
+        var attributes = db.table(condition.buildSql(sqlSelect));
+        
+        attributes.forEach(function (row)
+        {
+            if (row[1] != "true")
+            {
+                let values = [util.getNewUUID(), row[0], pObjectType];
+                inserts.push([table, columns, types, values]);
+            }
+            _addInserts(row[0], pObjectType);
+        });
+    }
+}
+
+/**
+ * Updates AttributeUsages for all subordinate attributes of an attribute.
+ * This is required when an usage of a superordinate attribute is changed.
+ * 
+ * @param {String} pAttributeId the id of the superordinate attribute
+ * @param {String} pOldObjectType ye olde context
+ * @param {String} pNewObjectType the new context
+ */
+AttributeUsageUtil.updateChildrenUsages = function (pAttributeId, pOldObjectType, pNewObjectType)
+{
+    if (!pNewObjectType)
+        return;
+    
+    var table = "AB_ATTRIBUTEUSAGE";
+    
+    var sqlSelect = "select AB_ATTRIBUTEID, AB_ATTRIBUTEUSAGEID, "
+        + " exists (select AB_ATTRIBUTEUSAGEID from AB_ATTRIBUTEUSAGE where AB_ATTRIBUTEUSAGE.AB_ATTRIBUTE_ID = AB_ATTRIBUTE.AB_ATTRIBUTEID and OBJECT_TYPE = '" 
+        + pNewObjectType + "')"
+        + " from AB_ATTRIBUTE left join AB_ATTRIBUTEUSAGE on AB_ATTRIBUTEID = AB_ATTRIBUTE_ID and OBJECT_TYPE = '" + pOldObjectType + "'";
+    
+    var updateCond = SqlCondition.begin();
+    
+    //it is possible that the new objectType is already in a subordinate attribute 
+    //and an update could cause a duplicate entry so one has to be deleted
+    var deleteCond = SqlCondition.begin();
+    
+    _addUpdateIds(pAttributeId, pOldObjectType);
+        
+    if (updateCond.isSet())
+        db.updateData(table, ["OBJECT_TYPE"], null, [pNewObjectType], updateCond.build("1=2"));
+    if (deleteCond.isSet())
+        db.deleteData(table, deleteCond.build("1=2"));
+    
+    function _addUpdateIds (pAttributeId)
+    {
+        var condition = SqlCondition.begin()
+            .andPrepare("AB_ATTRIBUTE.ATTRIBUTE_TYPE", $AttributeTypes.COMBOVALUE, "# != ?")
+            .andPrepare("AB_ATTRIBUTE.ATTRIBUTE_PARENT_ID", pAttributeId);
+        var attributes = db.table(condition.buildSql(sqlSelect));
+        
+        attributes.forEach(function (row)
+        {
+            if (row[1] && row[2] == "true")
+                deleteCond.orPrepare("AB_ATTRIBUTEUSAGE.AB_ATTRIBUTEUSAGEID", row[1]);
+            else if (row[1])
+                updateCond.orPrepare("AB_ATTRIBUTEUSAGE.AB_ATTRIBUTEUSAGEID", row[1]);
+            _addUpdateIds(row[0]);
+        });
+    }
+}
+
+/**
+ * Deletes AttributeUsages for all subordinate attributes of an attribute.
+ * This is required when an usage is removed from a superordinate attribute.
+ * 
+ * @param {String} pAttributeId the id of the superordinate attribute
+ * @param {String} pObjectType the context
+ */
+AttributeUsageUtil.deleteChildrenUsages = function (pAttributeId, pObjectType)
+{
+    var table = "AB_ATTRIBUTEUSAGE";
+    
+    var sqlSelect = "select AB_ATTRIBUTEID, AB_ATTRIBUTEUSAGEID "
+        + " from AB_ATTRIBUTE left join AB_ATTRIBUTEUSAGE on AB_ATTRIBUTEID = AB_ATTRIBUTE_ID and OBJECT_TYPE = '" + pObjectType + "'";
+    
+    var deleteCond = SqlCondition.begin();
+    _addDeleteIds(pAttributeId, pObjectType);
+    if (deleteCond.isSet())
+        db.deleteData(table, deleteCond.build("1=2"));
+    
+    function _addDeleteIds (pAttributeId)
+    {
+        var condition = SqlCondition.begin()
+            .andPrepare("AB_ATTRIBUTE.ATTRIBUTE_TYPE", $AttributeTypes.COMBOVALUE, "# != ?")
+            .andPrepare("AB_ATTRIBUTE.ATTRIBUTE_PARENT_ID", pAttributeId);
+        var attributes = db.table(condition.buildSql(sqlSelect));
+        
+        attributes.forEach(function (row)
+        {
+            if (row[1])
+                deleteCond.orPrepare("AB_ATTRIBUTEUSAGE.AB_ATTRIBUTEUSAGEID", row[1])
+            _addDeleteIds(row[0]);
+        });
+    }
+}
+
+/**
+ * Deletes duplicate attribute usages.
+ * 
+ * @param {String} [pAttributeId=null] attribute id, if omitted, all duplicates will be deleted 
+ */
+AttributeUsageUtil.removeDuplicates = function (pAttributeId)
+{
+    var condition = SqlCondition.begin()
+        .and("exists (select AB_ATTRIBUTEUSAGEID from AB_ATTRIBUTEUSAGE AU where AB_ATTRIBUTEUSAGE.AB_ATTRIBUTE_ID = AU.AB_ATTRIBUTE_ID "
+            + "and AB_ATTRIBUTEUSAGE.OBJECT_TYPE = AU.OBJECT_TYPE and AB_ATTRIBUTEUSAGE.AB_ATTRIBUTEUSAGEID != AU.AB_ATTRIBUTEUSAGEID)");
+    if (pAttributeId)
+        condition.andPrepare("AB_ATTRIBUTEUSAGE.AB_ATTRIBUTE_ID", pAttributeId);
+    
+    var duplicates = db.table(condition.buildSql("select AB_ATTRIBUTEUSAGEID, AB_ATTRIBUTE_ID, OBJECT_TYPE from AB_ATTRIBUTEUSAGE"));
+    var usageObj = {};
+    var deleteCond = SqlCondition.begin();
+    
+    duplicates.forEach(function (row)
+    {
+        if (!(row[1] in this))
+            this[row[1]] = {};
+        if (row[2] in this[row[1]])
+            deleteCond.orPrepare("AB_ATTRIBUTEUSAGE.AB_ATTRIBUTEUSAGEID", row[0]);
+        this[row[1]][row[2]] = true;
+    }, usageObj);
+    if (deleteCond.isSet())
+        db.deleteData("AB_ATTRIBUTEUSAGE", deleteCond.build("1=2"));
+}
\ No newline at end of file
diff --git a/process/Contact_lib/process.js b/process/Contact_lib/process.js
index 4dc852d62ea958c7327fa1c1a5e8b459fe1589b1..f4d50682682ea63b11f722b56ea83c21de72c396 100644
--- a/process/Contact_lib/process.js
+++ b/process/Contact_lib/process.js
@@ -235,6 +235,7 @@ ContactUtils.getFullTitleByContactId = function(pContactId)
 
 /**
  * get the name of the person
+ * do not use this for a mass of data (e.g. in a loop) since this will be slow due to select-time
  * 
  * @param {String} pPersonId the id of the person where the data shall be loaded
  * 
@@ -259,6 +260,28 @@ ContactUtils.getTitleByPersonId = function(pPersonId)
     return "";
 }
 
+/**
+ * get the name of the person
+ * do not use this for a mass of data (e.g. in a loop) since this will be slow due to select-time
+ * 
+ * @param {String} pContactId the id of the contact entry with the person where the data shall be loaded
+ * 
+ * @return {String} the name or ""
+ */
+ContactUtils.getTitleByContactId = function(pContactId)
+{
+    if (pContactId) 
+    {
+        var personId = db.cell(SqlCondition.begin()
+                                           .andPrepare("CONTACT.CONTACTID", pContactId)
+                                            .buildSql("select CONTACT.PERSON_ID from CONTACT ", "1 = 2"));
+        if (personId)
+            return ContactUtils.getTitleByPersonId(personId);
+    }
+    
+    return "";
+}
+
 /**
  * returns the from string for the contact joined with org, person, address 
  *
@@ -368,7 +391,7 @@ Contact.createWithColumnPreset = function()
 function ContactTitleRenderer(pContact, pOptions)
 {
     this.contact = pContact;
-    if (pOptions !== undefined)//null means null which is "no option"; so check exactly for undefined
+    if (pOptions !== undefined)//null means null which is "no option"; so check exactly for undefined to check if default option has to be set
         this._options = pOptions;
     else 
         this._options = ContactTitleRenderer.OPTIONS.IncludeOrganisation;
@@ -401,6 +424,7 @@ function ContactTitleRenderer(pContact, pOptions)
  * @static
  */
 ContactTitleRenderer.OPTIONS = {
+    NoOption: 0,
     IncludeOrganisation: 1
 };
 
diff --git a/process/Context_lib/process.js b/process/Context_lib/process.js
index 698392214a43b109d79f978f94c7904d1f5ce1ba..5549cd81dbd688f7cc3d4fdc6656b1bd1f6f8111 100644
--- a/process/Context_lib/process.js
+++ b/process/Context_lib/process.js
@@ -108,13 +108,20 @@ ContextUtils._getSelectMap = function()
 {
     var maskingUtils = new SqlMaskingUtils();
     return {
-        // contextId             nameField  Tablename (or from-part inc, joins), IDField, RelationField, CreationDate override Tablename (needed if Tablename is a join clause)
+        // contextId,
+        // nameField,
+        // Tablename (or from-part inc, joins),
+        // IDField,
+        // RelationField,
+        // CreationDate override Tablename (needed if Tablename is a join clause)
+        
         // "Appointment": ["SUMMARY", "ASYS_CALENDARBACKEND", "UID"]
         "Organisation": [
             "\"NAME\"",
             "ORGANISATION",
             "ORGANISATIONID",
             "",
+            "",
             ""
         ],
         "Person": [
@@ -143,6 +150,7 @@ ContextUtils._getSelectMap = function()
             "SALESPROJECT",
             "SALESPROJECTID",
             "CONTACT_ID",
+            "",
             "STARTDATE"
         ],
         "Contract": [
@@ -153,6 +161,7 @@ ContextUtils._getSelectMap = function()
             "CONTRACT",
             "CONTRACTID",
             "CONTACT_ID",
+            "",
             "CONTRACTSTART"
         ],
         "Offer": [
@@ -166,6 +175,7 @@ ContextUtils._getSelectMap = function()
             "OFFER",
             "OFFERID",
             "CONTACT_ID",
+            "",
             "OFFERDATE"
         ],
         "Order": [
@@ -179,6 +189,7 @@ ContextUtils._getSelectMap = function()
             "SALESORDER",
             "SALESORDERID",
             "CONTACT_ID",
+            "",
             "ORDERDATE"
         ],
         "Product": [
@@ -190,6 +201,7 @@ ContextUtils._getSelectMap = function()
             "PRODUCT",
             "PRODUCTID",
             "",
+            "",
             ""
         ],
         "Task": [
@@ -198,6 +210,7 @@ ContextUtils._getSelectMap = function()
             "TASKID",
             translate.text("Task"),
             "",
+            "",
             ""
         ]
     }
diff --git a/process/KeywordRegistry_basic/process.js b/process/KeywordRegistry_basic/process.js
index 2addda46a43b75ce9367de9691e7cade21cd31eb..f9c474f06c75194161738fcf44b31ecaa1409177 100644
--- a/process/KeywordRegistry_basic/process.js
+++ b/process/KeywordRegistry_basic/process.js
@@ -60,4 +60,7 @@ $KeywordRegistry.salesprojectCompetitionState = function(){return "SalesprojectC
 $KeywordRegistry.objectRelationType = function(){return "ObjectRelationType"};
 $KeywordRegistry.deliveryTerm = function(){return "DeliveryTerm"};
 $KeywordRegistry.paymentTerm = function(){return "PaymentTerm"};
+$KeywordRegistry.contactDepartment = function(){return "ContactDepartment"};
+$KeywordRegistry.contactPosition = function(){return "ContactPosition"};
+$KeywordRegistry.contactContactrole = function(){return "ContactContactrole"};
 
diff --git a/process/Keyword_lib/process.js b/process/Keyword_lib/process.js
index 273862a3072e83e7c6d7645f5ba060890b9e7b32..3c150d05ed7e111d2531dc3ef03177a27a88a082 100644
--- a/process/Keyword_lib/process.js
+++ b/process/Keyword_lib/process.js
@@ -147,6 +147,25 @@ KeywordUtils.getContainerNames = function()
     return list;
 };
 
+/**
+* provides a translated list of keyword-entry-titles in the system filtered by a containerName;
+* usefull for lists where the key is the name which is then a editable displayValue
+* 
+* @param {String} pContainerName name of the keyword container for filtering
+* 
+* @return {String[]} translated titles as 1D-Array
+*/
+KeywordUtils.getEntryNamesByContainer = function(pContainerName)
+{
+    var sql = SqlCondition.begin()
+                          .andPrepare("AB_KEYWORD_ENTRY.CONTAINER", pContainerName)
+                          .buildSql("select AB_KEYWORD_ENTRY.TITLE from AB_KEYWORD_ENTRY", null, "order by AB_KEYWORD_ENTRY.SORTING asc, AB_KEYWORD_ENTRY.TITLE asc")
+    var list = db.array(db.COLUMN, sql).map(function (v){
+        return translate.text(v);
+    });
+    return list;
+};
+
 /**
  * object that provides featrues for a single keyword attribute; initalizes itself on creation with a specific keyword-attribute
  * 
diff --git a/process/Offer_lib/process.js b/process/Offer_lib/process.js
index aa218c4ff40b8ddab1b07189daa24b501e820026..b4c8bea33f50080dfcb04b1b1d98a38ef64ec7dc 100644
--- a/process/Offer_lib/process.js
+++ b/process/Offer_lib/process.js
@@ -148,6 +148,8 @@ OfferUtils.openOfferReport = function (pOfferID)
         );
     var itemData = db.table(offerItemSql);
     
+    if (itemData.length == 0)
+        return;
     
     // TODO: AddrObject implementieren
     //var addrobj = new AddrObject(contactId);