diff --git a/entity/Address_entity/Address_entity.aod b/entity/Address_entity/Address_entity.aod
index 6cc8087d7753dab09bf7f85d37d3072b5a381b78..10f8654b0ad82f174b74f3a1b584b6c5a19823cd 100644
--- a/entity/Address_entity/Address_entity.aod
+++ b/entity/Address_entity/Address_entity.aod
@@ -1,12 +1,12 @@
 <?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.0.3" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.0.3">
+<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.0.4" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.0.4">
   <name>Address_entity</name>
   <title>Addresses</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
-  <recordContainerType>DB</recordContainerType>
-  <caption>Addresses</caption>
   <alias>Data_alias</alias>
   <conditionProcess>%aditoprj%/entity/Address_entity/conditionProcess.js</conditionProcess>
+  <recordContainerType>DB</recordContainerType>
+  <caption>Addresses</caption>
   <entityFields>
     <entityField>
       <name>ADDRESS</name>
diff --git a/entity/Comm_entity/Comm_entity.aod b/entity/Comm_entity/Comm_entity.aod
index c8e8ab8a1280bd4d3acf578d04f850279cff51b7..7441cfe350ac876895a30a000ae9d33185f74c4c 100644
--- a/entity/Comm_entity/Comm_entity.aod
+++ b/entity/Comm_entity/Comm_entity.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.0.3" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.0.3">
+<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.0.4" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.0.4">
   <name>Comm_entity</name>
   <title>Communication</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
@@ -15,7 +15,7 @@
       <columnName>ADDR</columnName>
       <caption>${COMM_ADDRESS}</caption>
       <contentTypeProcess>%aditoprj%/entity/Comm_entity/entityfields/addr/contentTypeProcess.js</contentTypeProcess>
-      <valueProcess>%aditoprj%/entity/Comm_entity/entityfields/addr/valueProcess.js</valueProcess>
+      <onValidation>%aditoprj%/entity/Comm_entity/entityfields/addr/onValidation.js</onValidation>
     </entityField>
     <entityField>
       <name>COMMID</name>
@@ -41,6 +41,7 @@
       <columnName>MEDIUM_ID</columnName>
       <caption>Medium</caption>
       <possibleItemsProcess>%aditoprj%/entity/Comm_entity/entityfields/medium_id/possibleItemsProcess.js</possibleItemsProcess>
+      <valueProcess>%aditoprj%/entity/Comm_entity/entityfields/medium_id/valueProcess.js</valueProcess>
     </entityField>
     <entityField>
       <name>RELATION_ID</name>
@@ -87,6 +88,12 @@ So, for only showing telephone-types you&amp;apos;ve to specify this parameter w
     <entityIncomingField>
       <name>#INCOMING</name>
     </entityIncomingField>
+    <entityParameter>
+      <name>RelationsMainCountry_param</name>
+      <code>%aditoprj%/entity/Comm_entity/entityfields/relationsmaincountry_param/code.js</code>
+      <mandatory v="false" />
+      <description>PARAMETER</description>
+    </entityParameter>
   </entityFields>
   <linkInformation>
     <linkInformation>
diff --git a/entity/Comm_entity/conditionProcess.js b/entity/Comm_entity/conditionProcess.js
index 7ab504b7b04216aec94e4d2dbbcba228e8c50819..52f44d3905881512659a8e605db36eb05e32a336 100644
--- a/entity/Comm_entity/conditionProcess.js
+++ b/entity/Comm_entity/conditionProcess.js
@@ -1,42 +1,38 @@
-import("system.logging");
-import("system.text");
-import("system.result");
-import("system.vars");
-import("Sql_lib");
-import("Keyword_lib");
-
-var cond, relId, mediumCategories, keywordUtil;
-
-
-
-cond = "";
-if(vars.exists("$param.RelId_param")){
-    
-    relId = vars.get("$param.RelId_param");
-    
-     if (relId != null && relId != "" && relId != undefined)
-     {      
-        cond += " and COMM.RELATION_ID in ('" + relId + "')";//TODO: quoting/prevent sql-injection 
-     }
-}
-if (vars.exists("$param.MediumCategoriesFilter_param")){
-    
-    mediumCategories = vars.get("$param.MediumCategoriesFilter_param");
-    if (mediumCategories != null && mediumCategories != "" && mediumCategories != undefined)
-    {
-   
-        mediumCategories = text.decodeMS(mediumCategories);   
-        keywordUtil = new KeywordUtils();
-        var kwd = keywordUtil.createKeyword("COMM.MEDIUM");
-        kwd.filter(function(id, name, customs){
-            return mediumCategories.indexOf(customs.category) > -1;
-        });
-        mediumIds = kwd.toArray("id");
-        if (mediumIds.length == 0)
-            throw new Error();//TODO: add message
-
-        cond += " and COMM.MEDIUM_ID in (" + mediumIds.join(", ") + ")";
-    }
-}
-
-result.string(cond ? "1 = 1 " + cond: "1 = 2");
\ No newline at end of file
+import("system.db");
+import("system.logging");
+import("system.text");
+import("system.result");
+import("system.vars");
+import("Sql_lib");
+import("Keyword_lib");
+
+var cond, relId, mediumCategories, keywordUtil, condStr;
+
+cond = new SqlCondition();
+if(vars.exists("$param.RelId_param")){
+    relId = vars.get("$param.RelId_param");
+    
+     if (relId != null && relId != ""){      
+         cond.andPrepare("COMM.RELATION_ID", "# = ?", relId);
+     }
+}
+
+if (vars.exists("$param.MediumCategoriesFilter_param")){
+    mediumCategories = vars.get("$param.MediumCategoriesFilter_param");
+    if (mediumCategories != null && mediumCategories != "") {
+        mediumCategories = text.decodeMS(mediumCategories);   
+        keywordUtil = new KeywordUtils();
+        var kwd = keywordUtil.createKeyword("COMM.MEDIUM");
+        kwd.filter(function(id, name, customs){
+            return mediumCategories.indexOf(customs.category) > -1;
+        });
+        mediumIds = kwd.toArray("id");
+        if (mediumIds.length == 0)
+            throw new Error();//TODO: add message
+
+        cond.and("COMM.MEDIUM_ID in (" + mediumIds.join(", ") + ")");
+    }
+}
+
+condStr = db.translateCondition([cond.toString("1 = 2"), cond.preparedValues]);//TODO: this should not be necessary in the future
+result.string(condStr);
\ No newline at end of file
diff --git a/entity/Comm_entity/entityfields/addr/contentTypeProcess.js b/entity/Comm_entity/entityfields/addr/contentTypeProcess.js
index 06a2fe06be4ffc09f15cfc7d2fcc671bdf6456dc..d447305cf063f92a6dc121a43b9a4df1f5f706b7 100644
--- a/entity/Comm_entity/entityfields/addr/contentTypeProcess.js
+++ b/entity/Comm_entity/entityfields/addr/contentTypeProcess.js
@@ -3,26 +3,12 @@ import("system.vars");
 import("system.result");
 import("system.neon");
 
-var keywordUtils, category, medium, contentType;
+var keywordUtils, medium, contentType;
 //TODO: add constants for contentTypes #1022547
 medium = vars.get("$field.MEDIUM_ID");
 if (medium){
     keywordUtils = new KeywordUtils();
-    category = keywordUtils.createKeyword("COMM.MEDIUM").getPropForKey(medium, "category", true);
-    switch (category) {
-        case "PHONE":
-            contentType = "TELEPHONE";
-            break;
-        case "EMAIL":
-            contentType = "EMAIL";
-            break;
-        case "WEBSITE":
-            contentType = "LINK";
-            break;
-        default:
-            contentType = "TEXT";
-            break;
-    }
+    contentType = keywordUtils.createKeyword("COMM.MEDIUM").getPropForKey(medium, "contentType", true) || "TEXT";
 }
 else {
     contentType = "TEXT";
diff --git a/entity/Comm_entity/entityfields/addr/onValidation.js b/entity/Comm_entity/entityfields/addr/onValidation.js
new file mode 100644
index 0000000000000000000000000000000000000000..b99bc84225439980d4ed10a88a6a45f9f30c082a
--- /dev/null
+++ b/entity/Comm_entity/entityfields/addr/onValidation.js
@@ -0,0 +1,23 @@
+import("system.logging");
+import("system.translate");
+import("system.vars");
+import("system.net");
+import("system.result");
+import("system.mail");
+import("Keyword_lib");
+import("Comm_lib");
+
+var kwdUtil = new KeywordUtils();
+var kwd = kwdUtil.createKeyword("COMM.MEDIUM");
+var commMedium = vars.get("$field.MEDIUM_ID");
+var commCategory = kwd.getPropForKey(commMedium, "contentType", true);//TODO: maybe accessible via  $property - then it's not needed to keep this information within the keyword
+
+var fn = CommValidationUtil.makeValidationFn(commCategory);
+if (fn != null){
+    var commAddr = vars.get("$local.value");//contains the entered value - the field contains the value only after successfull validation
+    var additional = CommValidationUtil.getExtensionsBlueprint();
+    additional.countryCode = vars.get("$param.RelationsMainCountry_param");//TODO: try to use users language first and then the companies
+    var res = fn.call(null, commAddr, additional);
+    if (res != null)
+        result.string(res);
+}
\ No newline at end of file
diff --git a/entity/Comm_entity/entityfields/medium_id/possibleItemsProcess.js b/entity/Comm_entity/entityfields/medium_id/possibleItemsProcess.js
index f73dccbca8682450c0237f4b5af827e2d2ae6182..a5f76ab6c894de82dbf14e1c0dcbfd4c21f2b82e 100644
--- a/entity/Comm_entity/entityfields/medium_id/possibleItemsProcess.js
+++ b/entity/Comm_entity/entityfields/medium_id/possibleItemsProcess.js
@@ -1,3 +1,4 @@
+import("system.logging");
 import("system.text");
 import("system.vars");
 import("system.result");
@@ -6,7 +7,7 @@ import("Keyword_lib");
 var mediumCategories, kwdUtils, kwd, items;
 
 kwdUtils = new KeywordUtils();
-if (vars.exists("$param.MediumCategoriesFilter_param") && (mediumCategories = vars.get("$param.MediumCategoriesFilter_param")) != null){
+if (vars.exists("$param.MediumCategoriesFilter_param") && (mediumCategories = vars.get("$param.MediumCategoriesFilter_param")) != ""){
     mediumCategories = text.decodeMS(mediumCategories);
     kwd = kwdUtils.createKeyword("COMM.MEDIUM");
     kwd.filter(function(id, name, customs){
diff --git a/entity/Comm_entity/entityfields/relationsmaincountry_param/code.js b/entity/Comm_entity/entityfields/relationsmaincountry_param/code.js
new file mode 100644
index 0000000000000000000000000000000000000000..c14118ef254f82f6bbb35c3d32ca5974b113a1d0
--- /dev/null
+++ b/entity/Comm_entity/entityfields/relationsmaincountry_param/code.js
@@ -0,0 +1,22 @@
+import("system.result");
+import("system.db");
+import("system.logging");
+import("system.vars");
+import("Sql_lib");
+
+var relId, country; 
+
+if (vars.exists("$param.RelId_param")) {
+    relId = vars.get("$param.RelId_param");
+    if (relId != "" && relId != null){
+        var cond = new SqlCondition();
+        cond.andPrepare("RELATION.RELATIONID", "# = ?", relId);
+        //TODO: this should happen by 1:1 links instead of manually requesting the data by a select
+        country = db.cell(["select ADDRESS.COUNTRY from ADDRESS "
+            + "join RELATION on RELATION.ADDRESS_ID = ADDRESS.ADDRESSID "
+            + cond.toWhereString(), cond.preparedValues]);
+
+        if (country != "") 
+            result.string(country);
+    }
+}
\ No newline at end of file
diff --git a/entity/Contract_entity/Contract_entity.aod b/entity/Contract_entity/Contract_entity.aod
index 8388d1b55c2ea8912f9b948347290f6031bd3336..c5490d13fc0d111ef418228350c0751ccfe53cbe 100644
--- a/entity/Contract_entity/Contract_entity.aod
+++ b/entity/Contract_entity/Contract_entity.aod
@@ -1,13 +1,13 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.0.3" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.0.3">
+<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.0.4" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.0.4">
   <name>Contract_entity</name>
   <title>Contract</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
+  <alias>Data_alias</alias>
+  <conditionProcess>%aditoprj%/entity/Contract_entity/conditionProcess.js</conditionProcess>
   <recordContainerType>DB</recordContainerType>
   <caption>Contract</caption>
   <iconId>VAADIN:FORM</iconId>
-  <alias>Data_alias</alias>
-  <conditionProcess>%aditoprj%/entity/Contract_entity/conditionProcess.js</conditionProcess>
   <entityFields>
     <entityField>
       <name>CONTRACTCODE</name>
diff --git a/entity/Countries_Entity/Countries_Entity.aod b/entity/Countries_Entity/Countries_Entity.aod
index d41286d9045f3cfbf9d979d9f3db16566777d6da..f9778cb9e1d98bd905af70b406ce7406451674c2 100644
--- a/entity/Countries_Entity/Countries_Entity.aod
+++ b/entity/Countries_Entity/Countries_Entity.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.0.3" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.0.3">
+<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.0.4" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.0.4">
   <name>Countries_Entity</name>
   <title>Countries</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/entity/Gender_keyword/Gender_keyword.aod b/entity/Gender_keyword/Gender_keyword.aod
index 044ab6dfe51ff3ae9dfd2a92cbf65f8601c750da..4f487bf216e65e2c3c9073aeb28478971e9c2800 100644
--- a/entity/Gender_keyword/Gender_keyword.aod
+++ b/entity/Gender_keyword/Gender_keyword.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.0.3" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.0.3">
+<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.0.4" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.0.4">
   <name>Gender_keyword</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <jDitoRecordAlias>Data_alias</jDitoRecordAlias>
diff --git a/entity/History_entity/History_entity.aod b/entity/History_entity/History_entity.aod
index 9d4131bdaf67a55f19ea7f277342545576757948..fe9f04dc945a48ba9a0fd0a7aa9df43fb2d57a25 100644
--- a/entity/History_entity/History_entity.aod
+++ b/entity/History_entity/History_entity.aod
@@ -1,17 +1,17 @@
 <?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.0.3" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.0.3">
+<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.0.4" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.0.4">
   <name>History_entity</name>
   <title>History</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
-  <recordContainerType>DB</recordContainerType>
-  <caption>History</caption>
-  <iconId>NEON:HISTORY</iconId>
-  <imageProcess>%aditoprj%/entity/History_entity/imageProcess.js</imageProcess>
   <alias>Data_alias</alias>
   <fromClauseProcess>%aditoprj%/entity/History_entity/fromClauseProcess.js</fromClauseProcess>
   <conditionProcess>%aditoprj%/entity/History_entity/conditionProcess.js</conditionProcess>
   <onDBInsert>%aditoprj%/entity/History_entity/onDBInsert.js</onDBInsert>
   <onDBDelete>%aditoprj%/entity/History_entity/onDBDelete.js</onDBDelete>
+  <recordContainerType>DB</recordContainerType>
+  <caption>History</caption>
+  <iconId>NEON:HISTORY</iconId>
+  <imageProcess>%aditoprj%/entity/History_entity/imageProcess.js</imageProcess>
   <entityFields>
     <entityField>
       <name>DIRECTION</name>
diff --git a/entity/Offer_entity/Offer_entity.aod b/entity/Offer_entity/Offer_entity.aod
index 4ab172e44a1d1f5a212b7d39a4d9693d33d5ffa5..a5e954badf21f6d01a0656b6d78f039c397a88a7 100644
--- a/entity/Offer_entity/Offer_entity.aod
+++ b/entity/Offer_entity/Offer_entity.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.0.3" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.0.3">
+<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.0.4" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.0.4">
   <name>Offer_entity</name>
   <title>Offer</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
@@ -41,12 +41,6 @@
       <mandatory v="true" />
       <possibleItemsProcess>%aditoprj%/entity/Offer_entity/entityfields/language/possibleItemsProcess.js</possibleItemsProcess>
     </entityField>
-    <entityField>
-      <name>NET</name>
-      <tableName>OFFER</tableName>
-      <columnName>NET</columnName>
-      <caption>Total net</caption>
-    </entityField>
     <entityField>
       <name>OFFERCODE</name>
       <tableName>OFFER</tableName>
@@ -116,6 +110,7 @@
       <tableName>OFFER</tableName>
       <columnName>VAT</columnName>
       <caption>Total VAT</caption>
+      <state>READONLY</state>
     </entityField>
     <entityField>
       <name>IMAGE</name>
@@ -127,6 +122,7 @@
       <tableName>OFFER</tableName>
       <columnName>HEADER</columnName>
       <caption>Header text</caption>
+      <valueProcess>%aditoprj%/entity/Offer_entity/entityfields/header/valueProcess.js</valueProcess>
     </entityField>
     <entityField>
       <name>FOOTER</name>
@@ -153,6 +149,19 @@
           <triggerRecalculation v="true" />
           <mandatory v="true" />
         </entityParameter>
+        <entityParameter>
+          <name>Currency_param</name>
+          <code>%aditoprj%/entity/Offer_entity/entityfields/offerofferitem_dfo/children/currency_param/code.js</code>
+          <expose v="true" />
+          <triggerRecalculation v="true" />
+        </entityParameter>
+        <entityParameter>
+          <name>RelationId_param</name>
+          <code>%aditoprj%/entity/Offer_entity/entityfields/offerofferitem_dfo/children/relationid_param/code.js</code>
+          <expose v="true" />
+          <triggerRecalculation v="true" />
+          <mandatory v="true" />
+        </entityParameter>
       </children>
     </entityOutgoingField>
     <entityActionField>
@@ -161,6 +170,25 @@
       <onActionProcess>%aditoprj%/entity/Offer_entity/entityfields/newofferversion/onActionProcess.js</onActionProcess>
       <caption>New offer verison</caption>
     </entityActionField>
+    <entityField>
+      <name>PreviewTitle</name>
+      <valueProcess>%aditoprj%/entity/Offer_entity/entityfields/previewtitle/valueProcess.js</valueProcess>
+    </entityField>
+    <entityField>
+      <name>NET</name>
+      <tableName>OFFER</tableName>
+      <columnName>NET</columnName>
+      <caption>Total net</caption>
+      <state>READONLY</state>
+      <valueProcess>%aditoprj%/entity/Offer_entity/entityfields/net/valueProcess.js</valueProcess>
+      <fieldIdProcess>%aditoprj%/entity/Offer_entity/entityfields/net/fieldIdProcess.js</fieldIdProcess>
+    </entityField>
+    <entityField>
+      <name>TotalGross</name>
+      <caption>Total gross</caption>
+      <state>READONLY</state>
+      <valueProcess>%aditoprj%/entity/Offer_entity/entityfields/totalgross/valueProcess.js</valueProcess>
+    </entityField>
   </entityFields>
   <linkInformation>
     <linkInformation>
diff --git a/entity/Pers_entity/entityfields/gender/possibleItemsProcess.js b/entity/Offer_entity/entityfields/header/valueProcess.js
similarity index 100%
rename from entity/Pers_entity/entityfields/gender/possibleItemsProcess.js
rename to entity/Offer_entity/entityfields/header/valueProcess.js
diff --git a/entity/Productprice_entity/entityfields/pricelist_relation/onValidation.js b/entity/Offer_entity/entityfields/net/fieldIdProcess.js
similarity index 100%
rename from entity/Productprice_entity/entityfields/pricelist_relation/onValidation.js
rename to entity/Offer_entity/entityfields/net/fieldIdProcess.js
diff --git a/entity/Productprice_entity/entityfields/pricelist_relation/onValueChange.js b/entity/Offer_entity/entityfields/net/valueProcess.js
similarity index 100%
rename from entity/Productprice_entity/entityfields/pricelist_relation/onValueChange.js
rename to entity/Offer_entity/entityfields/net/valueProcess.js
diff --git a/entity/Offer_entity/entityfields/offerofferitem_dfo/children/currency_param/code.js b/entity/Offer_entity/entityfields/offerofferitem_dfo/children/currency_param/code.js
new file mode 100644
index 0000000000000000000000000000000000000000..5e55d336c5058653f14b546e53fcc03f9dce105c
--- /dev/null
+++ b/entity/Offer_entity/entityfields/offerofferitem_dfo/children/currency_param/code.js
@@ -0,0 +1,4 @@
+import("system.vars");
+import("system.result");
+
+result.string(vars.get("$field.CURRENCY"));
\ No newline at end of file
diff --git a/entity/Offer_entity/entityfields/offerofferitem_dfo/children/relationid_param/code.js b/entity/Offer_entity/entityfields/offerofferitem_dfo/children/relationid_param/code.js
new file mode 100644
index 0000000000000000000000000000000000000000..a5cee65a3ba3e16976d5f7d3952da23c73ef54da
--- /dev/null
+++ b/entity/Offer_entity/entityfields/offerofferitem_dfo/children/relationid_param/code.js
@@ -0,0 +1,4 @@
+import("system.vars");
+import("system.result");
+
+result.string(vars.get("$field.RELATION_ID"));
\ No newline at end of file
diff --git a/entity/Offer_entity/entityfields/previewtitle/valueProcess.js b/entity/Offer_entity/entityfields/previewtitle/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..d8bf28486a9cc4b31d3042ee6df5b00dbcdf6063
--- /dev/null
+++ b/entity/Offer_entity/entityfields/previewtitle/valueProcess.js
@@ -0,0 +1,5 @@
+import("system.translate");
+import("system.result");
+import("system.vars");
+
+result.string(translate.text("Offer") + " " + vars.get("$field.OFFERCODE"));
\ No newline at end of file
diff --git a/entity/Offer_entity/entityfields/totalgross/valueProcess.js b/entity/Offer_entity/entityfields/totalgross/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..6e374c8f50a610ed0f50b89319726224167631d0
--- /dev/null
+++ b/entity/Offer_entity/entityfields/totalgross/valueProcess.js
@@ -0,0 +1,8 @@
+import("system.result");
+import("system.vars");
+import("system.eMath");
+
+var netValue = vars.get("$field.NET");
+var vatValue = vars.get("$field.VAT");
+
+result.string( eMath.addDec(netValue, vatValue) );
\ No newline at end of file
diff --git a/entity/Offeritem_entity/Offeritem_entity.aod b/entity/Offeritem_entity/Offeritem_entity.aod
index e79df8ba11966550710e4281b06a5de92d3a766c..206e426134b28f34b15c6b34a01f84f74246e0cc 100644
--- a/entity/Offeritem_entity/Offeritem_entity.aod
+++ b/entity/Offeritem_entity/Offeritem_entity.aod
@@ -1,10 +1,13 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.0.3" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.0.3">
+<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.0.4" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.0.4">
   <name>Offeritem_entity</name>
   <title>Offeritem</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <alias>Data_alias</alias>
   <conditionProcess>%aditoprj%/entity/Offeritem_entity/conditionProcess.js</conditionProcess>
+  <onDBInsert>%aditoprj%/entity/Offeritem_entity/onDBInsert.js</onDBInsert>
+  <onDBUpdate>%aditoprj%/entity/Offeritem_entity/onDBUpdate.js</onDBUpdate>
+  <onDBDelete>%aditoprj%/entity/Offeritem_entity/onDBDelete.js</onDBDelete>
   <recordContainerType>DB</recordContainerType>
   <caption>Offeritem</caption>
   <entityFields>
@@ -44,6 +47,7 @@
       <tableName>OFFERITEM</tableName>
       <columnName>DESCRIPTION</columnName>
       <caption>Description</caption>
+      <contentType>LONG_TEXT</contentType>
     </entityField>
     <entityField>
       <name>DISCOUNT</name>
@@ -56,6 +60,8 @@
       <tableName>OFFERITEM</tableName>
       <columnName>GROUPCODEID</columnName>
       <caption>Commodity group</caption>
+      <possibleItemsProcess>%aditoprj%/entity/Offeritem_entity/entityfields/groupcodeid/possibleItemsProcess.js</possibleItemsProcess>
+      <state>READONLY</state>
     </entityField>
     <entityField>
       <name>ITEMNAME</name>
@@ -68,6 +74,7 @@
       <tableName>OFFERITEM</tableName>
       <columnName>ITEMPOSITION</columnName>
       <caption>Position</caption>
+      <state>READONLY</state>
     </entityField>
     <entityField>
       <name>ITEMSORT</name>
@@ -78,6 +85,7 @@
       <name>OFFERITEMID</name>
       <tableName>OFFERITEM</tableName>
       <columnName>OFFERITEMID</columnName>
+      <valueProcess>%aditoprj%/entity/Offeritem_entity/entityfields/offeritemid/valueProcess.js</valueProcess>
     </entityField>
     <entityField>
       <name>OFFER_ID</name>
@@ -90,6 +98,9 @@
       <tableName>OFFERITEM</tableName>
       <columnName>OPTIONAL</columnName>
       <caption>Optional</caption>
+      <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>
@@ -102,18 +113,25 @@
       <tableName>OFFERITEM</tableName>
       <columnName>PRODUCT_ID</columnName>
       <caption>Article</caption>
+      <possibleItemsProcess>%aditoprj%/entity/Offeritem_entity/entityfields/product_id/possibleItemsProcess.js</possibleItemsProcess>
+      <onValidation>%aditoprj%/entity/Offeritem_entity/entityfields/product_id/onValidation.js</onValidation>
+      <onValueChange>%aditoprj%/entity/Offeritem_entity/entityfields/product_id/onValueChange.js</onValueChange>
     </entityField>
     <entityField>
       <name>QUANTITY</name>
       <tableName>OFFERITEM</tableName>
       <columnName>QUANTITY</columnName>
       <caption>Quantity</caption>
+      <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>
     </entityField>
     <entityField>
       <name>UNIT</name>
       <tableName>OFFERITEM</tableName>
       <columnName>UNIT</columnName>
       <caption>Unit</caption>
+      <possibleItemsProcess>%aditoprj%/entity/Offeritem_entity/entityfields/unit/possibleItemsProcess.js</possibleItemsProcess>
     </entityField>
     <entityField>
       <name>USER_EDIT</name>
@@ -132,6 +150,7 @@
       <tableName>OFFERITEM</tableName>
       <columnName>VAT</columnName>
       <caption>VAT</caption>
+      <state>READONLY</state>
     </entityField>
     <entityParameter>
       <name>OfferId_param</name>
@@ -140,6 +159,31 @@
       <mandatory v="true" />
       <description>PARAMETER</description>
     </entityParameter>
+    <entityParameter>
+      <name>RelationId_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>
+      <caption>Sum</caption>
+      <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>
   </entityFields>
   <linkInformation>
     <linkInformation>
diff --git a/entity/Offeritem_entity/conditionProcess.js b/entity/Offeritem_entity/conditionProcess.js
index 904a7b5517b1c1bd7f40ae87e00d2aaf3ea91b22..b39721ef89a7459add6bade8992f1d23296a84c4 100644
--- a/entity/Offeritem_entity/conditionProcess.js
+++ b/entity/Offeritem_entity/conditionProcess.js
@@ -5,4 +5,4 @@ import("system.vars");
 if(vars.exists("$param.OfferId_param") && vars.get("$param.OfferId_param") != "")
     result.string("OFFERITEM.OFFER_ID = ('" + vars.get("$param.OfferId_param") + "')");  
 else
-    result.string("1 = 2");
\ No newline at end of file
+    result.string("");
\ No newline at end of file
diff --git a/entity/Productprice_entity/entityfields/pricelist_relation/possibleItemsProcess.js b/entity/Offeritem_entity/entityfields/groupcodeid/possibleItemsProcess.js
similarity index 71%
rename from entity/Productprice_entity/entityfields/pricelist_relation/possibleItemsProcess.js
rename to entity/Offeritem_entity/entityfields/groupcodeid/possibleItemsProcess.js
index 6b44f39adb82667f216ba46a76f1b3db73f83879..ec42dede214f092bd764b4151c5a0e93fa25de84 100644
--- a/entity/Productprice_entity/entityfields/pricelist_relation/possibleItemsProcess.js
+++ b/entity/Offeritem_entity/entityfields/groupcodeid/possibleItemsProcess.js
@@ -4,5 +4,5 @@ import("Keyword_lib");
 var kwdUtils, items;
 
 kwdUtils = new KeywordUtils();
-items = kwdUtils.getStandardArray("PRICELIST");
+items = kwdUtils.getStandardArray("GROUPCODE");
 result.object(items);
\ No newline at end of file
diff --git a/entity/Offeritem_entity/entityfields/image/valueProcess.js b/entity/Offeritem_entity/entityfields/image/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..e29d35c1604de27ca8281ae2d1848e258a943efd
--- /dev/null
+++ b/entity/Offeritem_entity/entityfields/image/valueProcess.js
@@ -0,0 +1,2 @@
+import("system.result");
+result.string("TEXT:IM");
\ No newline at end of file
diff --git a/entity/Offeritem_entity/entityfields/offeritemid/valueProcess.js b/entity/Offeritem_entity/entityfields/offeritemid/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..5be18c39832eee52e38b7147961d7db4bab5a588
--- /dev/null
+++ b/entity/Offeritem_entity/entityfields/offeritemid/valueProcess.js
@@ -0,0 +1,7 @@
+import("system.util");
+import("system.vars");
+import("system.result");
+import("system.neon");
+
+if(vars.get("$sys.operatingstate") == neon.OPERATINGSTATE_NEW)
+    result.string(util.getNewUUID());
\ No newline at end of file
diff --git a/entity/Offeritem_entity/entityfields/optional/possibleItemsProcess.js b/entity/Offeritem_entity/entityfields/optional/possibleItemsProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..1dfbf04839cfeacd9b7e3af1a453f1892cea77f1
--- /dev/null
+++ b/entity/Offeritem_entity/entityfields/optional/possibleItemsProcess.js
@@ -0,0 +1,7 @@
+import("system.translate");
+import("system.result");
+
+result.object([
+     ["0", translate.text("Yes")]
+    ,["1", translate.text("No")]
+]);
\ No newline at end of file
diff --git a/entity/Offeritem_entity/entityfields/optional/valueProcess.js b/entity/Offeritem_entity/entityfields/optional/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..04344c1e2caaa81ee9c4e8ed7c9e10c084b49f95
--- /dev/null
+++ b/entity/Offeritem_entity/entityfields/optional/valueProcess.js
@@ -0,0 +1,6 @@
+import("system.vars");
+import("system.result");
+import("system.neon");
+
+if(vars.get("$sys.operatingstate") == neon.OPERATINGSTATE_NEW)
+    result.string("1");
\ No newline at end of file
diff --git a/entity/Offeritem_entity/entityfields/product_id/onValidation.js b/entity/Offeritem_entity/entityfields/product_id/onValidation.js
new file mode 100644
index 0000000000000000000000000000000000000000..139597f9cb07c5d48bed18984ec4747f4b4f3438
--- /dev/null
+++ b/entity/Offeritem_entity/entityfields/product_id/onValidation.js
@@ -0,0 +1,2 @@
+
+
diff --git a/entity/Offeritem_entity/entityfields/product_id/onValueChange.js b/entity/Offeritem_entity/entityfields/product_id/onValueChange.js
new file mode 100644
index 0000000000000000000000000000000000000000..bdb931f90f8d6afa263804676af9479fd4ec5aa9
--- /dev/null
+++ b/entity/Offeritem_entity/entityfields/product_id/onValueChange.js
@@ -0,0 +1,29 @@
+import("system.logging");
+import("system.vars");
+import("system.neon");
+import("Product_lib");
+
+var pid = vars.get("$local.value");
+if(pid != "")
+{
+    var curr = vars.exists("$param.Currency_param") ? vars.get("$param.Currency_param") : "";
+    var relid = vars.exists("$param.RelationId_param") ? vars.get("$param.RelationId_param") : "";
+    
+    var pUtils = new ProductUtils();
+    var PriceListFilter = { currency: curr, quantity: vars.get("$field.QUANTITY"), relationId: relid };
+    
+    var ProductDetails = pUtils.getProductDetails(pid, PriceListFilter);
+    
+    if(ProductDetails[pid] != undefined)
+    {
+        vars.set("$field.GROUPCODEID", ProductDetails[pid].groupCode);
+        vars.set("$field.UNIT", ProductDetails[pid].unit);
+        vars.set("$field.ITEMNAME", ProductDetails[pid].productName);
+
+        if(ProductDetails[pid].PriceListToUse != null)
+        {
+            vars.set("$field.PRICE", ProductDetails[pid].PriceListToUse.price);
+            vars.set("$field.VAT", ProductDetails[pid].PriceListToUse.vat);
+        }
+    }
+}
\ No newline at end of file
diff --git a/entity/Offeritem_entity/entityfields/product_id/possibleItemsProcess.js b/entity/Offeritem_entity/entityfields/product_id/possibleItemsProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..ece8c2eca10356f471b5d9013c36208311b4a7b6
--- /dev/null
+++ b/entity/Offeritem_entity/entityfields/product_id/possibleItemsProcess.js
@@ -0,0 +1,17 @@
+import("system.logging");
+import("system.result");
+import("system.db");
+import("Sql_lib");
+
+//TODO: change field to lookup field
+var sqlUtils = new LegacySqlUtils();
+var prodsSql = "select PRODUCTID, " + sqlUtils.concat(["PRODUCTCODE", "'/'", "PRODUCTNAME"]) 
+                    + " from PRODUCT";
+
+var prods = db.table(prodsSql);
+
+var retArray = [];
+for(var i = 0; i < prods.length; i++)
+    retArray.push(prods[i]);
+
+result.object(retArray);
\ No newline at end of file
diff --git a/entity/Offeritem_entity/entityfields/quantity/onValidation.js b/entity/Offeritem_entity/entityfields/quantity/onValidation.js
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/entity/Offeritem_entity/entityfields/quantity/onValueChange.js b/entity/Offeritem_entity/entityfields/quantity/onValueChange.js
new file mode 100644
index 0000000000000000000000000000000000000000..5acf7788daa3af2aeb320809b1c55acdabf05908
--- /dev/null
+++ b/entity/Offeritem_entity/entityfields/quantity/onValueChange.js
@@ -0,0 +1,23 @@
+import("system.logging");
+import("system.vars");
+import("system.neon");
+import("Product_lib");
+
+var pid = vars.get("$field.PRODUCT_ID");
+var newQuantity = vars.get("$local.value");
+if(pid != "" && newQuantity != "")
+{
+    var curr = vars.exists("$param.Currency_param") ? vars.get("$param.Currency_param") : "";
+    var relid = vars.exists("$param.RelationId_param") ? vars.get("$param.RelationId_param") : "";
+    
+    var pUtils = new ProductUtils();
+    var PriceListFilter = { currency: curr, quantity: newQuantity, relationId: relid };
+    
+    var ProductDetails = pUtils.getProductDetails(pid, PriceListFilter);
+    
+    if(ProductDetails[pid] != undefined && ProductDetails[pid].PriceListToUse != null)
+    {
+        vars.set("$field.PRICE", ProductDetails[pid].PriceListToUse.price);
+        vars.set("$field.VAT", ProductDetails[pid].PriceListToUse.vat);
+    }
+}
\ No newline at end of file
diff --git a/entity/Offeritem_entity/entityfields/quantity/valueProcess.js b/entity/Offeritem_entity/entityfields/quantity/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..3aebc70e19c7c9cb3c62338a847b4759f5af2be0
--- /dev/null
+++ b/entity/Offeritem_entity/entityfields/quantity/valueProcess.js
@@ -0,0 +1,10 @@
+import("system.vars");
+import("system.result");
+import("system.neon");
+
+if(vars.get("$sys.operatingstate") == neon.OPERATINGSTATE_NEW && vars.get("$this.value") == "")
+{
+    result.string("1");
+}
+else
+    result.string(vars.get("$this.value"));
\ No newline at end of file
diff --git a/entity/Offeritem_entity/entityfields/totalprice/valueProcess.js b/entity/Offeritem_entity/entityfields/totalprice/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..7fff82a426deedb7c0729b258be6c55dda0b19f7
--- /dev/null
+++ b/entity/Offeritem_entity/entityfields/totalprice/valueProcess.js
@@ -0,0 +1,8 @@
+import("system.result");
+import("system.vars");
+import("Offer_lib");
+
+var oiUtils = new OfferItemUtils();
+
+result.string(oiUtils.roundPrice(oiUtils.getItemSum(vars.get("$field.QUANTITY"), vars.get("$field.PRICE")
+                                , vars.get("$field.DISCOUNT"), vars.get("$field.OPTIONAL"))));
\ No newline at end of file
diff --git a/entity/Offeritem_entity/entityfields/unit/possibleItemsProcess.js b/entity/Offeritem_entity/entityfields/unit/possibleItemsProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..020f0770d41377e4f1eb2a0265e64a0055ef01f0
--- /dev/null
+++ b/entity/Offeritem_entity/entityfields/unit/possibleItemsProcess.js
@@ -0,0 +1,8 @@
+import("system.result");
+import("Keyword_lib");
+
+var kwdUtils, items;
+
+kwdUtils = new KeywordUtils();
+items = kwdUtils.getStandardArray("UNIT");
+result.object(items);
\ No newline at end of file
diff --git a/entity/Offeritem_entity/onDBDelete.js b/entity/Offeritem_entity/onDBDelete.js
new file mode 100644
index 0000000000000000000000000000000000000000..e7ce64e15311337b8b619f36dc75edd10eeb3c52
--- /dev/null
+++ b/entity/Offeritem_entity/onDBDelete.js
@@ -0,0 +1,17 @@
+import("system.neon");
+import("system.vars");
+import("system.db");
+import("Offer_lib");
+
+var oid = vars.get("$field.OFFER_ID");
+if(oid != "")
+{
+    var cols = ["NET", "VAT"];
+    var colTypes = db.getColumnTypes("OFFER", cols);
+    var oUtils = new OfferUtils();
+    var vals = oUtils.getOfferNetAndVAT(oid, vars.get("$field.OFFERITEMID"));
+
+    db.updateData("OFFER", cols, colTypes, vals, "OFFERID = '" + oid + "'");
+    
+    neon.refresh("Offer_entity");
+}
\ No newline at end of file
diff --git a/entity/Offeritem_entity/onDBInsert.js b/entity/Offeritem_entity/onDBInsert.js
new file mode 100644
index 0000000000000000000000000000000000000000..d27032ac0e449b2de5efa128292bb59561213b6f
--- /dev/null
+++ b/entity/Offeritem_entity/onDBInsert.js
@@ -0,0 +1,17 @@
+import("system.neon");
+import("system.vars");
+import("system.db");
+import("Offer_lib");
+
+var oid = vars.get("$field.OFFER_ID");
+if(oid != "")
+{
+    var cols = ["NET", "VAT"];
+    var colTypes = db.getColumnTypes("OFFER", cols);
+    var oUtils = new OfferUtils();
+    var vals = oUtils.getOfferNetAndVAT(oid);
+
+    db.updateData("OFFER", cols, colTypes, vals, "OFFERID = '" + oid + "'");
+    
+    neon.refresh("Offer_entity");
+}
\ No newline at end of file
diff --git a/entity/Offeritem_entity/onDBUpdate.js b/entity/Offeritem_entity/onDBUpdate.js
new file mode 100644
index 0000000000000000000000000000000000000000..15e362e109713c274f3b53bc35fe30a3a99bb3ab
--- /dev/null
+++ b/entity/Offeritem_entity/onDBUpdate.js
@@ -0,0 +1,18 @@
+import("system.logging");
+import("system.vars");
+import("system.db");
+import("system.neon");
+import("Offer_lib");
+
+var oid = vars.get("$field.OFFER_ID");
+if(oid != "")
+{
+    var cols = ["NET", "VAT"];
+    var colTypes = db.getColumnTypes("OFFER", cols);
+    var oUtils = new OfferUtils();
+    var vals = oUtils.getOfferNetAndVAT(oid);
+
+    db.updateData("OFFER", cols, colTypes, vals, "OFFERID = '" + oid + "'");
+    
+    neon.refresh("Offer_entity");
+}
\ No newline at end of file
diff --git a/entity/Options_Entity/Options_Entity.aod b/entity/Options_Entity/Options_Entity.aod
index a1f5e63ded38ae5869c80e41f31aadb12810c588..3712683649290ce89c0daff0f3803bfec96b3362 100644
--- a/entity/Options_Entity/Options_Entity.aod
+++ b/entity/Options_Entity/Options_Entity.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.0.3" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.0.3">
+<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.0.4" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.0.4">
   <name>Options_Entity</name>
   <title>Options</title>
   <description></description>
diff --git a/entity/Org_entity/Org_entity.aod b/entity/Org_entity/Org_entity.aod
index 4807ae7a89ab1c194c3a78b40d896af4f3b64b96..857f8573e8b1395215ce18af443c5a5049fcc7da 100644
--- a/entity/Org_entity/Org_entity.aod
+++ b/entity/Org_entity/Org_entity.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.0.3" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.0.3">
+<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.0.4" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.0.4">
   <name>Org_entity</name>
   <title>Company</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
@@ -51,6 +51,7 @@
       <tableName>ORG</tableName>
       <columnName>NAME</columnName>
       <caption>Name</caption>
+      <mandatory v="true" />
     </entityField>
     <entityField>
       <name>ORGID</name>
@@ -259,6 +260,66 @@
         </entityParameter>
       </children>
     </entityOutgoingField>
+    <entityOutgoingField>
+      <name>OrgCommEmail_dfo</name>
+      <fieldType>DEPENDENCY_OUT</fieldType>
+      <caption>Communication E-Mail</caption>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Comm_entity</entityName>
+        <fieldName>#INCOMING</fieldName>
+      </dependency>
+      <children>
+        <entityParameter>
+          <name>RelId_param</name>
+          <code>%aditoprj%/entity/Org_entity/entityfields/orgcommemail_dfo/children/relid_param/code.js</code>
+        </entityParameter>
+        <entityParameter>
+          <name>MediumCategoriesFilter_param</name>
+          <code>%aditoprj%/entity/Org_entity/entityfields/orgcommemail_dfo/children/mediumcategoriesfilter_param/code.js</code>
+        </entityParameter>
+      </children>
+    </entityOutgoingField>
+    <entityOutgoingField>
+      <name>OrgCommPhone_dfo</name>
+      <fieldType>DEPENDENCY_OUT</fieldType>
+      <caption>Communication Phone</caption>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Comm_entity</entityName>
+        <fieldName>#INCOMING</fieldName>
+      </dependency>
+      <children>
+        <entityParameter>
+          <name>RelId_param</name>
+          <code>%aditoprj%/entity/Org_entity/entityfields/orgcommphone_dfo/children/relid_param/code.js</code>
+        </entityParameter>
+        <entityParameter>
+          <name>MediumCategoriesFilter_param</name>
+          <code>%aditoprj%/entity/Org_entity/entityfields/orgcommphone_dfo/children/mediumcategoriesfilter_param/code.js</code>
+        </entityParameter>
+      </children>
+    </entityOutgoingField>
+    <entityOutgoingField>
+      <name>OrgCommOthers_dfo</name>
+      <fieldType>DEPENDENCY_OUT</fieldType>
+      <caption>Communication Other</caption>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Comm_entity</entityName>
+        <fieldName>#INCOMING</fieldName>
+      </dependency>
+      <children>
+        <entityParameter>
+          <name>RelId_param</name>
+          <code>%aditoprj%/entity/Org_entity/entityfields/orgcommothers_dfo/children/relid_param/code.js</code>
+        </entityParameter>
+        <entityParameter>
+          <name>MediumCategoriesFilter_param</name>
+          <code>%aditoprj%/entity/Org_entity/entityfields/orgcommothers_dfo/children/mediumcategoriesfilter_param/code.js</code>
+        </entityParameter>
+      </children>
+    </entityOutgoingField>
     <entityOutgoingField>
       <name>OrgContract_dfo</name>
       <fieldType>DEPENDENCY_OUT</fieldType>
diff --git a/entity/Org_entity/entityfields/orgcommemail_dfo/children/mediumcategoriesfilter_param/code.js b/entity/Org_entity/entityfields/orgcommemail_dfo/children/mediumcategoriesfilter_param/code.js
new file mode 100644
index 0000000000000000000000000000000000000000..aaff61e4c8898ae395726ecc423de32a449ffedb
--- /dev/null
+++ b/entity/Org_entity/entityfields/orgcommemail_dfo/children/mediumcategoriesfilter_param/code.js
@@ -0,0 +1,4 @@
+import("system.text");
+import("system.result");
+
+result.string(text.encodeMS(["EMAIL"]));
diff --git a/entity/Org_entity/entityfields/orgcommemail_dfo/children/relid_param/code.js b/entity/Org_entity/entityfields/orgcommemail_dfo/children/relid_param/code.js
new file mode 100644
index 0000000000000000000000000000000000000000..c618e8d6e5ce719d68e284f7c5b4b050c95b25d3
--- /dev/null
+++ b/entity/Org_entity/entityfields/orgcommemail_dfo/children/relid_param/code.js
@@ -0,0 +1,4 @@
+import("system.result");
+import("system.vars");
+
+result.string(vars.get("$field.RELATIONID"));
\ No newline at end of file
diff --git a/entity/Org_entity/entityfields/orgcommothers_dfo/children/mediumcategoriesfilter_param/code.js b/entity/Org_entity/entityfields/orgcommothers_dfo/children/mediumcategoriesfilter_param/code.js
new file mode 100644
index 0000000000000000000000000000000000000000..4f54b7ffc8acbf3d404f6d45dea8b79e991ca573
--- /dev/null
+++ b/entity/Org_entity/entityfields/orgcommothers_dfo/children/mediumcategoriesfilter_param/code.js
@@ -0,0 +1,4 @@
+import("system.text");
+import("system.result");
+
+result.string(text.encodeMS(["OTHER"]));
diff --git a/entity/Org_entity/entityfields/orgcommothers_dfo/children/relid_param/code.js b/entity/Org_entity/entityfields/orgcommothers_dfo/children/relid_param/code.js
new file mode 100644
index 0000000000000000000000000000000000000000..c618e8d6e5ce719d68e284f7c5b4b050c95b25d3
--- /dev/null
+++ b/entity/Org_entity/entityfields/orgcommothers_dfo/children/relid_param/code.js
@@ -0,0 +1,4 @@
+import("system.result");
+import("system.vars");
+
+result.string(vars.get("$field.RELATIONID"));
\ No newline at end of file
diff --git a/entity/Org_entity/entityfields/orgcommphone_dfo/children/mediumcategoriesfilter_param/code.js b/entity/Org_entity/entityfields/orgcommphone_dfo/children/mediumcategoriesfilter_param/code.js
new file mode 100644
index 0000000000000000000000000000000000000000..10d8f95a8428f41e01924b5a23ed0082fed74b2f
--- /dev/null
+++ b/entity/Org_entity/entityfields/orgcommphone_dfo/children/mediumcategoriesfilter_param/code.js
@@ -0,0 +1,4 @@
+import("system.text");
+import("system.result");
+
+result.string(text.encodeMS(["PHONE"]));
diff --git a/entity/Org_entity/entityfields/orgcommphone_dfo/children/relid_param/code.js b/entity/Org_entity/entityfields/orgcommphone_dfo/children/relid_param/code.js
new file mode 100644
index 0000000000000000000000000000000000000000..c618e8d6e5ce719d68e284f7c5b4b050c95b25d3
--- /dev/null
+++ b/entity/Org_entity/entityfields/orgcommphone_dfo/children/relid_param/code.js
@@ -0,0 +1,4 @@
+import("system.result");
+import("system.vars");
+
+result.string(vars.get("$field.RELATIONID"));
\ No newline at end of file
diff --git a/entity/Pers_entity/Pers_entity.aod b/entity/Pers_entity/Pers_entity.aod
index 53eefff3e9a0536965f4a03d72fe853d1d0e2104..a564609fab5bf434e8475e3ae7174071b01902d3 100644
--- a/entity/Pers_entity/Pers_entity.aod
+++ b/entity/Pers_entity/Pers_entity.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.0.3" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.0.3">
+<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.0.4" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.0.4">
   <name>Pers_entity</name>
   <title>Contact</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
@@ -49,7 +49,6 @@
       <columnName>GENDER</columnName>
       <caption>Gender</caption>
       <outgoingField>PersGender_dfo</outgoingField>
-      <possibleItemsProcess>%aditoprj%/entity/Pers_entity/entityfields/gender/possibleItemsProcess.js</possibleItemsProcess>
     </entityField>
     <entityField>
       <name>LASTNAME</name>
@@ -391,21 +390,29 @@
     <entityIncomingField>
       <name>#INCOMING</name>
     </entityIncomingField>
+    <entityField>
+      <name>LANGUAGE</name>
+      <tableName>RELATION</tableName>
+      <columnName>LANGUAGE</columnName>
+      <caption>Language</caption>
+      <mandatory v="true" />
+      <possibleItemsProcess>%aditoprj%/entity/Pers_entity/entityfields/language/possibleItemsProcess.js</possibleItemsProcess>
+    </entityField>
   </entityFields>
   <linkInformation>
     <linkInformation>
-      <name>ffff1758-e84e-47d8-a957-5989d0be7092</name>
+      <name>9ce0dfd2-192d-4446-8b2d-a4c053abc44a</name>
       <tableName>PERS</tableName>
       <primaryKey>PERSID</primaryKey>
     </linkInformation>
     <linkInformation>
-      <name>5547b8d7-5145-4eb7-8698-c92674b4691f</name>
+      <name>348312a8-6392-4adb-af69-75cbcfc5b65b</name>
       <tableName>RELATION</tableName>
       <primaryKey>RELATIONID</primaryKey>
       <isUIDTable v="true" />
     </linkInformation>
     <linkInformation>
-      <name>dae8e70a-ec76-4c53-9799-ee04bfbe3bd2</name>
+      <name>edf5e4f3-993d-4097-b59d-a100d5222cad</name>
       <tableName>ORG</tableName>
       <primaryKey>ORGID</primaryKey>
       <readonly v="true" />
diff --git a/entity/Pers_entity/entityfields/language/possibleItemsProcess.js b/entity/Pers_entity/entityfields/language/possibleItemsProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..26992f2c6cfc67f4cbfae11030af30b34b7c553d
--- /dev/null
+++ b/entity/Pers_entity/entityfields/language/possibleItemsProcess.js
@@ -0,0 +1,8 @@
+import("system.result");
+import("Keyword_lib");
+
+var kwdUtils, items;
+
+kwdUtils = new KeywordUtils();
+items = kwdUtils.getStandardArray("LANGUAGE");
+result.object(items);
\ No newline at end of file
diff --git a/entity/Product_entity/Product_entity.aod b/entity/Product_entity/Product_entity.aod
index 02d326e17c0fcd179f2cdcd9f38317894c43f969..b329898832b46fcb125df74c5839e5ec55f51c0d 100644
--- a/entity/Product_entity/Product_entity.aod
+++ b/entity/Product_entity/Product_entity.aod
@@ -1,12 +1,12 @@
 <?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.0.3" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.0.3">
+<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.0.4" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.0.4">
   <name>Product_entity</name>
   <title>Product</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
+  <alias>Data_alias</alias>
   <recordContainerType>DB</recordContainerType>
   <caption>Product</caption>
   <iconId>VAADIN:HAMMER</iconId>
-  <alias>Data_alias</alias>
   <entityFields>
     <entityField>
       <name>ADVERTISING</name>
diff --git a/entity/Productprice_entity/Productprice_entity.aod b/entity/Productprice_entity/Productprice_entity.aod
index 0ab83ab71f67b32c62d0a0994004dc3b1f75b7cc..029ac867926eab7b3e24021a7b42cd0b3202cbbe 100644
--- a/entity/Productprice_entity/Productprice_entity.aod
+++ b/entity/Productprice_entity/Productprice_entity.aod
@@ -1,10 +1,11 @@
 <?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.0.3" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.0.3">
+<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.0.4" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.0.4">
   <name>Productprice_entity</name>
   <title>Price list</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <alias>Data_alias</alias>
   <conditionProcess>%aditoprj%/entity/Productprice_entity/conditionProcess.js</conditionProcess>
+  <orderClauseProcess>%aditoprj%/entity/Productprice_entity/orderClauseProcess.js</orderClauseProcess>
   <recordContainerType>DB</recordContainerType>
   <caption>Price list</caption>
   <entityFields>
@@ -16,6 +17,7 @@
       <mandatory v="true" />
       <mandatoryProcess>%aditoprj%/entity/Productprice_entity/entityfields/buysell/mandatoryProcess.js</mandatoryProcess>
       <possibleItemsProcess>%aditoprj%/entity/Productprice_entity/entityfields/buysell/possibleItemsProcess.js</possibleItemsProcess>
+      <valueProcess>%aditoprj%/entity/Productprice_entity/entityfields/buysell/valueProcess.js</valueProcess>
     </entityField>
     <entityField>
       <name>CURRENCY</name>
@@ -69,7 +71,7 @@
       <name>PRODUCT_ID</name>
       <tableName>PRODUCTPRICE</tableName>
       <columnName>PRODUCT_ID</columnName>
-      <caption>Product name</caption>
+      <caption>Product</caption>
       <linkedContext>Product_context</linkedContext>
       <mandatory v="false" />
       <outgoingField>ProductpriceProduct_dfo</outgoingField>
@@ -130,8 +132,11 @@
       <tableName>PRODUCTPRICE</tableName>
       <columnName>PRICELIST</columnName>
       <caption>Price list</caption>
+      <captionProcess>%aditoprj%/entity/Productprice_entity/entityfields/pricelist/captionProcess.js</captionProcess>
       <possibleItemsProcess>%aditoprj%/entity/Productprice_entity/entityfields/pricelist/possibleItemsProcess.js</possibleItemsProcess>
       <state>AUTO</state>
+      <stateProcess>%aditoprj%/entity/Productprice_entity/entityfields/pricelist/stateProcess.js</stateProcess>
+      <valueProcess>%aditoprj%/entity/Productprice_entity/entityfields/pricelist/valueProcess.js</valueProcess>
     </entityField>
     <entityIncomingField>
       <name>ProductProductprice_dfi</name>
@@ -158,14 +163,6 @@
       <mandatory v="false" />
       <description>PARAMETER</description>
     </entityParameter>
-    <entityField>
-      <name>Pricelist_Relation</name>
-      <caption>Price list / Company</caption>
-      <possibleItemsProcess>%aditoprj%/entity/Productprice_entity/entityfields/pricelist_relation/possibleItemsProcess.js</possibleItemsProcess>
-      <valueProcess>%aditoprj%/entity/Productprice_entity/entityfields/pricelist_relation/valueProcess.js</valueProcess>
-      <onValidation>%aditoprj%/entity/Productprice_entity/entityfields/pricelist_relation/onValidation.js</onValidation>
-      <onValueChange>%aditoprj%/entity/Productprice_entity/entityfields/pricelist_relation/onValueChange.js</onValueChange>
-    </entityField>
     <entityField>
       <name>PRODUCT_GROUPCODEID</name>
       <caption>Product group</caption>
diff --git a/entity/Productprice_entity/entityfields/buysell/mandatoryProcess.js b/entity/Productprice_entity/entityfields/buysell/mandatoryProcess.js
index 7808bc1144567b08f53c71a2934533fbb28bd695..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644
--- a/entity/Productprice_entity/entityfields/buysell/mandatoryProcess.js
+++ b/entity/Productprice_entity/entityfields/buysell/mandatoryProcess.js
@@ -1,12 +0,0 @@
-import("system.logging");
-import("system.vars");
-import("system.result");
-
-if(vars.exists("$param.ProductId_param") && vars.get("$param.ProductId_param") != "")
-{
-    result.string("true");
-}
-else
-{
-    result.string("false");
-}
\ No newline at end of file
diff --git a/entity/Productprice_entity/entityfields/buysell/possibleItemsProcess.js b/entity/Productprice_entity/entityfields/buysell/possibleItemsProcess.js
index 5da424e274784b45e964216aa3a62cf03bdbacc4..827f2d7a130b4b475d4a486628908a9c5929df90 100644
--- a/entity/Productprice_entity/entityfields/buysell/possibleItemsProcess.js
+++ b/entity/Productprice_entity/entityfields/buysell/possibleItemsProcess.js
@@ -2,6 +2,6 @@ import("system.translate");
 import("system.result");
 
 result.object([
-    ["PP", translate.text("PP")],
     ["SP", translate.text("SP")]
+    , ["PP", translate.text("PP")]
     ]);
\ No newline at end of file
diff --git a/entity/Productprice_entity/entityfields/buysell/valueProcess.js b/entity/Productprice_entity/entityfields/buysell/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..334695bcf35bf986d3158845954c58707cec9755
--- /dev/null
+++ b/entity/Productprice_entity/entityfields/buysell/valueProcess.js
@@ -0,0 +1,6 @@
+import("system.vars");
+import("system.result");
+import("system.neon");
+
+if(vars.get("$sys.operatingstate") == neon.OPERATINGSTATE_NEW && vars.get("$this.value") == "")
+    result.string("SP");
\ No newline at end of file
diff --git a/entity/Productprice_entity/entityfields/pricelist/captionProcess.js b/entity/Productprice_entity/entityfields/pricelist/captionProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..325222cf9a75416c2e498b3493b1dc5be5c893c2
--- /dev/null
+++ b/entity/Productprice_entity/entityfields/pricelist/captionProcess.js
@@ -0,0 +1,10 @@
+import("system.vars");
+import("system.translate");
+import("system.neon");
+import("system.result");
+
+var str = translate.text("Price list");
+if(vars.get("$sys.operatingstate") == neon.OPERATINGSTATE_VIEW)
+    str = translate.text("Price list / Company");
+
+result.string(str);
\ No newline at end of file
diff --git a/entity/Productprice_entity/entityfields/pricelist/possibleItemsProcess.js b/entity/Productprice_entity/entityfields/pricelist/possibleItemsProcess.js
index 6b44f39adb82667f216ba46a76f1b3db73f83879..23c85c28b992637216dd30c649dd607110dd9c02 100644
--- a/entity/Productprice_entity/entityfields/pricelist/possibleItemsProcess.js
+++ b/entity/Productprice_entity/entityfields/pricelist/possibleItemsProcess.js
@@ -1,3 +1,6 @@
+import("system.db");
+import("system.neon");
+import("system.vars");
 import("system.result");
 import("Keyword_lib");
 
@@ -5,4 +8,11 @@ var kwdUtils, items;
 
 kwdUtils = new KeywordUtils();
 items = kwdUtils.getStandardArray("PRICELIST");
+
+if(vars.get("$field.RELATION_ID") != "")
+{
+    var orgname = db.cell("select NAME from ORG join RELATION on ORG_ID = ORGID where RELATIONID = '" + vars.get("$field.RELATION_ID") + "'");
+    items.push(["", orgname]);
+}
+
 result.object(items);
\ No newline at end of file
diff --git a/entity/Productprice_entity/entityfields/pricelist/stateProcess.js b/entity/Productprice_entity/entityfields/pricelist/stateProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..7736f0d63499e5ffdee2b861d1dffb69d961f0ec
--- /dev/null
+++ b/entity/Productprice_entity/entityfields/pricelist/stateProcess.js
@@ -0,0 +1,7 @@
+import("system.vars");
+import("system.result");
+
+if(vars.get("$field.RELATION_ID") != "")
+    result.string("READONLY");
+else
+    result.string("EDITABLE");
\ No newline at end of file
diff --git a/entity/Productprice_entity/entityfields/pricelist/valueProcess.js b/entity/Productprice_entity/entityfields/pricelist/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/entity/Productprice_entity/entityfields/pricelist_relation/valueProcess.js b/entity/Productprice_entity/entityfields/pricelist_relation/valueProcess.js
deleted file mode 100644
index 3f9089e29c49884f47876b8d9a789ac01df256f0..0000000000000000000000000000000000000000
--- a/entity/Productprice_entity/entityfields/pricelist_relation/valueProcess.js
+++ /dev/null
@@ -1,16 +0,0 @@
-import("system.result");
-import("system.vars");
-import("Keyword_lib");
-
-var kewUtils = new KeywordUtils();
-
-var rel = vars.get("$field.RELATION_ID");
-
-if(rel != "")
-{
-    result.string("Firma");//TODO: Org/pers Name
-}
-else
-{
-    result.string(kewUtils.getViewValue("PRICELIST", vars.get("$field.PRICELIST")));
-}
\ No newline at end of file
diff --git a/entity/Productprice_entity/orderClauseProcess.js b/entity/Productprice_entity/orderClauseProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..9fd0aad5a4bce2f8f7f5ca713d35f79bc1b9a7ec
--- /dev/null
+++ b/entity/Productprice_entity/orderClauseProcess.js
@@ -0,0 +1,3 @@
+import("system.result");
+
+result.object({"PRODUCTPRICE.VALID_FROM": "down"});
\ No newline at end of file
diff --git a/entity/Salesproject_entity/Salesproject_entity.aod b/entity/Salesproject_entity/Salesproject_entity.aod
index 2398361961635ff3eb850c159d96d34527f31ea7..f81960ed2babb095dd7430b9bb443b2d9c4815f7 100644
--- a/entity/Salesproject_entity/Salesproject_entity.aod
+++ b/entity/Salesproject_entity/Salesproject_entity.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.0.3" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.0.3">
+<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.0.4" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.0.4">
   <name>Salesproject_entity</name>
   <title>Salesproject</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/entity/Social_entity/Social_entity.aod b/entity/Social_entity/Social_entity.aod
index 787822ab61170dafd42eb8cb733ed51144a495d4..4b500fab944187cb9e8fd43ded8a56f35b2d75b8 100644
--- a/entity/Social_entity/Social_entity.aod
+++ b/entity/Social_entity/Social_entity.aod
@@ -1,16 +1,16 @@
 <?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.0.3" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.0.3">
+<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.0.4" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.0.4">
   <name>Social_entity</name>
   <title>Social</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
-  <recordContainerType>NONE</recordContainerType>
-  <caption>Social Media</caption>
   <indexGroup></indexGroup>
   <patternExtensionProcess></patternExtensionProcess>
   <fields>
     <element>UID</element>
   </fields>
   <contentProcess>%aditoprj%/entity/Social_entity/contentProcess.js</contentProcess>
+  <recordContainerType>NONE</recordContainerType>
+  <caption>Social Media</caption>
   <entityFields>
     <entityField>
       <name>TWITTER_TIMELINE</name>
diff --git a/entity/Stock_entity/Stock_entity.aod b/entity/Stock_entity/Stock_entity.aod
index 72a126bb04dd0ff96c22a297fea745d32c5cae08..4942e5aa72153edeca4529e1cdf8f8058f038173 100644
--- a/entity/Stock_entity/Stock_entity.aod
+++ b/entity/Stock_entity/Stock_entity.aod
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.0.3" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.0.3">
+<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.0.4" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.0.4">
   <name>Stock_entity</name>
   <title>Stock</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
diff --git a/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod b/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod
index b792b088507a336429f459b8e866edfc1764882f..a37c3f2fda4e76d43298037b7924a342cea607be 100644
--- a/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod
+++ b/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod
@@ -696,6 +696,75 @@
     <entry>
       <key>New offer verison</key>
     </entry>
+    <entry>
+      <key>ISO3  Code</key>
+    </entry>
+    <entry>
+      <key>zusagen</key>
+    </entry>
+    <entry>
+      <key>EU Member</key>
+    </entry>
+    <entry>
+      <key>Zip exists</key>
+    </entry>
+    <entry>
+      <key>ISO2 Code</key>
+    </entry>
+    <entry>
+      <key>Sum</key>
+    </entry>
+    <entry>
+      <key>absagen</key>
+    </entry>
+    <entry>
+      <key>Option4</key>
+    </entry>
+    <entry>
+      <key>Option3</key>
+    </entry>
+    <entry>
+      <key>Option2</key>
+    </entry>
+    <entry>
+      <key>Option1</key>
+    </entry>
+    <entry>
+      <key>Countries</key>
+    </entry>
+    <entry>
+      <key>Euro zone</key>
+    </entry>
+    <entry>
+      <key>NAME</key>
+    </entry>
+    <entry>
+      <key>Options</key>
+    </entry>
+    <entry>
+      <key>Country code</key>
+    </entry>
+    <entry>
+      <key>Country Code</key>
+    </entry>
+    <entry>
+      <key>PO-box name</key>
+    </entry>
+    <entry>
+      <key>Adress format</key>
+    </entry>
+    <entry>
+      <key>vielleicht</key>
+    </entry>
+    <entry>
+      <key>Administration</key>
+    </entry>
+    <entry>
+      <key>Flag</key>
+    </entry>
+    <entry>
+      <key>Total gross</key>
+    </entry>
   </keyValueMap>
   <font name="Dialog" style="0" size="11" />
   <sqlModels>
diff --git a/language/_____LANGUAGE_de/_____LANGUAGE_de.aod b/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
index 2befe9354a3f1458eefcdc771769a07ca247f5a5..a3683b6322427ec28d949b94239a810293604e2a 100644
--- a/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
+++ b/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
@@ -909,6 +909,77 @@
       <key>New offer verison</key>
       <value>Neue Angebotsversion</value>
     </entry>
+    <entry>
+      <key>ISO3  Code</key>
+    </entry>
+    <entry>
+      <key>zusagen</key>
+    </entry>
+    <entry>
+      <key>EU Member</key>
+    </entry>
+    <entry>
+      <key>Zip exists</key>
+    </entry>
+    <entry>
+      <key>ISO2 Code</key>
+    </entry>
+    <entry>
+      <key>Sum</key>
+      <value>Summe</value>
+    </entry>
+    <entry>
+      <key>absagen</key>
+    </entry>
+    <entry>
+      <key>Option4</key>
+    </entry>
+    <entry>
+      <key>Option3</key>
+    </entry>
+    <entry>
+      <key>Option2</key>
+    </entry>
+    <entry>
+      <key>Option1</key>
+    </entry>
+    <entry>
+      <key>Countries</key>
+    </entry>
+    <entry>
+      <key>Euro zone</key>
+    </entry>
+    <entry>
+      <key>NAME</key>
+    </entry>
+    <entry>
+      <key>Options</key>
+    </entry>
+    <entry>
+      <key>Country code</key>
+    </entry>
+    <entry>
+      <key>Country Code</key>
+    </entry>
+    <entry>
+      <key>PO-box name</key>
+    </entry>
+    <entry>
+      <key>Adress format</key>
+    </entry>
+    <entry>
+      <key>vielleicht</key>
+    </entry>
+    <entry>
+      <key>Administration</key>
+    </entry>
+    <entry>
+      <key>Flag</key>
+    </entry>
+    <entry>
+      <key>Total gross</key>
+      <value>Betrag brutto</value>
+    </entry>
   </keyValueMap>
   <font name="Dialog" style="0" size="11" />
 </language>
diff --git a/language/_____LANGUAGE_en/_____LANGUAGE_en.aod b/language/_____LANGUAGE_en/_____LANGUAGE_en.aod
index 88547b926576827437d608ede7b69fb816c67337..8f1c4ca4922e38aa5735c049a17eae478d499c16 100644
--- a/language/_____LANGUAGE_en/_____LANGUAGE_en.aod
+++ b/language/_____LANGUAGE_en/_____LANGUAGE_en.aod
@@ -704,6 +704,75 @@
     <entry>
       <key>New offer verison</key>
     </entry>
+    <entry>
+      <key>ISO3  Code</key>
+    </entry>
+    <entry>
+      <key>zusagen</key>
+    </entry>
+    <entry>
+      <key>EU Member</key>
+    </entry>
+    <entry>
+      <key>Zip exists</key>
+    </entry>
+    <entry>
+      <key>ISO2 Code</key>
+    </entry>
+    <entry>
+      <key>Sum</key>
+    </entry>
+    <entry>
+      <key>absagen</key>
+    </entry>
+    <entry>
+      <key>Option4</key>
+    </entry>
+    <entry>
+      <key>Option3</key>
+    </entry>
+    <entry>
+      <key>Option2</key>
+    </entry>
+    <entry>
+      <key>Option1</key>
+    </entry>
+    <entry>
+      <key>Countries</key>
+    </entry>
+    <entry>
+      <key>Euro zone</key>
+    </entry>
+    <entry>
+      <key>NAME</key>
+    </entry>
+    <entry>
+      <key>Options</key>
+    </entry>
+    <entry>
+      <key>Country code</key>
+    </entry>
+    <entry>
+      <key>Country Code</key>
+    </entry>
+    <entry>
+      <key>PO-box name</key>
+    </entry>
+    <entry>
+      <key>Adress format</key>
+    </entry>
+    <entry>
+      <key>vielleicht</key>
+    </entry>
+    <entry>
+      <key>Administration</key>
+    </entry>
+    <entry>
+      <key>Flag</key>
+    </entry>
+    <entry>
+      <key>Total gross</key>
+    </entry>
   </keyValueMap>
   <font name="Dialog" style="0" size="11" />
 </language>
diff --git a/neonContext/Offeritem_context/Offeritem_context.aod b/neonContext/Offeritem_context/Offeritem_context.aod
index bbfcab9649ab51bd109a53945a6a54e42686bfbc..d541a52c517c3226f5605c3e52c7520dfa07e3ad 100644
--- a/neonContext/Offeritem_context/Offeritem_context.aod
+++ b/neonContext/Offeritem_context/Offeritem_context.aod
@@ -1,7 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <neonContext xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.0.0" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonContext/1.0.0">
   <name>Offeritem_context</name>
+  <title>Offeritem</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
+  <filterview>OfferitemFilter_view</filterview>
+  <preview>OfferitemPreview_view</preview>
   <entity>Offeritem_entity</entity>
   <references>
     <neonViewReference>
diff --git a/neonView/OfferPreview_view/OfferPreview_view.aod b/neonView/OfferPreview_view/OfferPreview_view.aod
index d639c0b4f7c4d5134e511749ef64ff9f3b97b0f3..c9b1bb992940cd5becb6ce76339038340b54a6b9 100644
--- a/neonView/OfferPreview_view/OfferPreview_view.aod
+++ b/neonView/OfferPreview_view/OfferPreview_view.aod
@@ -11,7 +11,7 @@
     <cardViewTemplate>
       <name>OfferHeader_template</name>
       <iconField>IMAGE</iconField>
-      <titleField>OFFERCODE</titleField>
+      <titleField>PreviewTitle</titleField>
       <descriptionField>RELATION_ID</descriptionField>
       <entityField>#ENTITY</entityField>
     </cardViewTemplate>
@@ -33,13 +33,17 @@
           <entityField>LANGUAGE</entityField>
         </entityFieldLink>
         <entityFieldLink>
-          <name>9e876b07-3029-42fe-a1e7-5c19b845e50d</name>
+          <name>4843f0f0-4ee8-47c2-bc0f-99241bad4c51</name>
           <entityField>NET</entityField>
         </entityFieldLink>
         <entityFieldLink>
           <name>cd72899a-69b2-4fe2-bf58-4fb9f594324e</name>
           <entityField>VAT</entityField>
         </entityFieldLink>
+        <entityFieldLink>
+          <name>10d8f38b-1e01-45a1-bc57-424284bf87be</name>
+          <entityField>TotalGross</entityField>
+        </entityFieldLink>
         <entityFieldLink>
           <name>16d38881-d3d3-4c4d-9f23-39d60eadce8d</name>
           <entityField>CURRENCY</entityField>
@@ -52,6 +56,10 @@
           <name>3317b73e-68e8-41a8-a678-89c7c7c8513e</name>
           <entityField>SALESPROJECT_ID</entityField>
         </entityFieldLink>
+        <entityFieldLink>
+          <name>683e3a86-0f9f-4b40-85c0-ae102a5a4a9a</name>
+          <entityField>HEADER</entityField>
+        </entityFieldLink>
       </fields>
     </genericViewTemplate>
   </children>
diff --git a/neonView/OfferitemFilter_view/OfferitemFilter_view.aod b/neonView/OfferitemFilter_view/OfferitemFilter_view.aod
index ec94cab9bee6ab6e9b5adf44202c92331bec418b..481f23266f24a2ec1e102aec6645739475d23e7e 100644
--- a/neonView/OfferitemFilter_view/OfferitemFilter_view.aod
+++ b/neonView/OfferitemFilter_view/OfferitemFilter_view.aod
@@ -10,6 +10,7 @@
   <children>
     <tableViewTemplate>
       <name>OfferitemFilter_table</name>
+      <autoNewRow v="true" />
       <entityField>#ENTITY</entityField>
       <columns>
         <neonTableColumn>
@@ -18,7 +19,7 @@
         </neonTableColumn>
         <neonTableColumn>
           <name>545f79bf-2fee-4112-9541-0889d0e514eb</name>
-          <entityField>ITEMNAME</entityField>
+          <entityField>PRODUCT_ID</entityField>
         </neonTableColumn>
         <neonTableColumn>
           <name>2a907da4-b48d-4933-bc17-a40e7d4556f9</name>
diff --git a/neonView/OfferitemPreview_view/OfferitemPreview_view.aod b/neonView/OfferitemPreview_view/OfferitemPreview_view.aod
index 467fadca47f07681dabc81aa3f3686000323ea40..48c2b919c5c99ecc9e4ad2babe5a431fb44b2ecf 100644
--- a/neonView/OfferitemPreview_view/OfferitemPreview_view.aod
+++ b/neonView/OfferitemPreview_view/OfferitemPreview_view.aod
@@ -10,8 +10,29 @@
   <children>
     <cardViewTemplate>
       <name>OfferitemPreview_header</name>
+      <iconField>IMAGE</iconField>
       <titleField>ITEMNAME</titleField>
       <descriptionField>DESCRIPTION</descriptionField>
+      <entityField>#ENTITY</entityField>
     </cardViewTemplate>
+    <genericViewTemplate>
+      <name>Offeritem_generic</name>
+      <showDrawer v="true" />
+      <entityField>#ENTITY</entityField>
+      <fields>
+        <entityFieldLink>
+          <name>9868560c-41c7-4641-b0f1-627a61b796b3</name>
+          <entityField>TotalPrice</entityField>
+        </entityFieldLink>
+        <entityFieldLink>
+          <name>c0c04d1c-90a7-4c0b-9323-1f0783757987</name>
+          <entityField>GROUPCODEID</entityField>
+        </entityFieldLink>
+        <entityFieldLink>
+          <name>e25386dc-a740-4f93-a1f0-32317cf5a36a</name>
+          <entityField>OPTIONAL</entityField>
+        </entityFieldLink>
+      </fields>
+    </genericViewTemplate>
   </children>
 </neonView>
diff --git a/neonView/OrgPreview_view/OrgPreview_view.aod b/neonView/OrgPreview_view/OrgPreview_view.aod
index 2807fd672f1b75ef82268bceb91ba7827f7919db..dfa831fca34615d5f91a0f9de35496517147640b 100644
--- a/neonView/OrgPreview_view/OrgPreview_view.aod
+++ b/neonView/OrgPreview_view/OrgPreview_view.aod
@@ -1,52 +1,62 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.0.0" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.0.0">
-  <name>OrgPreview_view</name>
-  <majorModelMode>DISTRIBUTED</majorModelMode>
-  <layout>
-    <boxLayout>
-      <name>layout</name>
-    </boxLayout>
-  </layout>
-  <children>
-    <cardViewTemplate>
-      <name>BasicCard_template</name>
-      <iconField>IMAGE</iconField>
-      <titleField>NAME</titleField>
-      <descriptionField>CUSTOMERCODE_DISPLAY_fieldGroup</descriptionField>
-      <entityField>#ENTITY</entityField>
-    </cardViewTemplate>
-    <neonViewReference>
-      <name>df605bb6-5d18-4233-abc0-1da82e4910ca</name>
-      <entityField>OrgAddress_dfo</entityField>
-      <view>AddressList_view</view>
-    </neonViewReference>
-    <neonViewReference>
-      <name>7fbd6034-4213-41f9-bb0d-c73d55b88d82</name>
-      <entityField>OrgComm_dfo</entityField>
-      <view>CommList_view</view>
-    </neonViewReference>
-    <genericViewTemplate>
-      <name>OrgInfo_template</name>
-      <showDrawer v="true" />
-      <entityField>#ENTITY</entityField>
-      <fields>
-        <entityFieldLink>
-          <name>4bad7219-1a3a-4e6e-ae5a-533d3acb6845</name>
-          <entityField>LANGUAGE</entityField>
-        </entityFieldLink>
-        <entityFieldLink>
-          <name>5a397737-2768-4e16-8c58-890b8a26b4a2</name>
-          <entityField>STATUS</entityField>
-        </entityFieldLink>
-        <entityFieldLink>
-          <name>89e9aa74-1568-4f74-b42a-a02b13752802</name>
-          <entityField>TYPE</entityField>
-        </entityFieldLink>
-        <entityFieldLink>
-          <name>180e8467-4eb2-4f89-a59f-ff76b8810925</name>
-          <entityField>INFO</entityField>
-        </entityFieldLink>
-      </fields>
-    </genericViewTemplate>
-  </children>
-</neonView>
+<?xml version="1.0" encoding="UTF-8"?>
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.0.0" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.0.0">
+  <name>OrgPreview_view</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <layout>
+    <boxLayout>
+      <name>layout</name>
+    </boxLayout>
+  </layout>
+  <children>
+    <cardViewTemplate>
+      <name>BasicCard_template</name>
+      <iconField>IMAGE</iconField>
+      <titleField>NAME</titleField>
+      <descriptionField>CUSTOMERCODE_DISPLAY_fieldGroup</descriptionField>
+      <entityField>#ENTITY</entityField>
+    </cardViewTemplate>
+    <neonViewReference>
+      <name>df605bb6-5d18-4233-abc0-1da82e4910ca</name>
+      <entityField>OrgAddress_dfo</entityField>
+      <view>AddressList_view</view>
+    </neonViewReference>
+    <genericViewTemplate>
+      <name>OrgInfo_template</name>
+      <showDrawer v="true" />
+      <entityField>#ENTITY</entityField>
+      <fields>
+        <entityFieldLink>
+          <name>4bad7219-1a3a-4e6e-ae5a-533d3acb6845</name>
+          <entityField>LANGUAGE</entityField>
+        </entityFieldLink>
+        <entityFieldLink>
+          <name>5a397737-2768-4e16-8c58-890b8a26b4a2</name>
+          <entityField>STATUS</entityField>
+        </entityFieldLink>
+        <entityFieldLink>
+          <name>89e9aa74-1568-4f74-b42a-a02b13752802</name>
+          <entityField>TYPE</entityField>
+        </entityFieldLink>
+        <entityFieldLink>
+          <name>180e8467-4eb2-4f89-a59f-ff76b8810925</name>
+          <entityField>INFO</entityField>
+        </entityFieldLink>
+      </fields>
+    </genericViewTemplate>
+    <neonViewReference>
+      <name>7b3f1253-f671-4cf4-83ec-81e229910014</name>
+      <entityField>OrgCommEmail_dfo</entityField>
+      <view>CommList_view</view>
+    </neonViewReference>
+    <neonViewReference>
+      <name>23f420cb-fd45-433f-b385-55a49e98744f</name>
+      <entityField>OrgCommPhone_dfo</entityField>
+      <view>CommList_view</view>
+    </neonViewReference>
+    <neonViewReference>
+      <name>c45d71cf-b81f-4d75-876d-7f9c26b1eb12</name>
+      <entityField>OrgCommOthers_dfo</entityField>
+      <view>CommList_view</view>
+    </neonViewReference>
+  </children>
+</neonView>
diff --git a/neonView/PersEdit_view/PersEdit_view.aod b/neonView/PersEdit_view/PersEdit_view.aod
index 95b00ae97314c2df0b4ce8de2d68381ea52db2ba..57bba3ca2f7c0820868ce9810333c1f92f931340 100644
--- a/neonView/PersEdit_view/PersEdit_view.aod
+++ b/neonView/PersEdit_view/PersEdit_view.aod
@@ -48,6 +48,10 @@
           <name>74de507e-75e0-4957-a4fb-7070fa3c5a4a</name>
           <entityField>DATEOFBIRTH</entityField>
         </entityFieldLink>
+        <entityFieldLink>
+          <name>d8d04e36-de46-48a3-994a-fa72d1f2ea89</name>
+          <entityField>LANGUAGE</entityField>
+        </entityFieldLink>
       </fields>
     </genericViewTemplate>
     <neonViewReference>
diff --git a/neonView/PersFilter_view/PersFilter_view.aod b/neonView/PersFilter_view/PersFilter_view.aod
index b8f86322d84be98eeb9378ec3f60e9846e428644..ec8bc3ee05333157dfc2d475a88446d6f4b00a3a 100644
--- a/neonView/PersFilter_view/PersFilter_view.aod
+++ b/neonView/PersFilter_view/PersFilter_view.aod
@@ -29,6 +29,9 @@
   <children>
     <tableViewTemplate>
       <name>PersFilter_template</name>
+      <favoriteActionGroup1>MyActions</favoriteActionGroup1>
+      <favoriteActionGroup2>ServusGruppe</favoriteActionGroup2>
+      <favoriteActionGroup3>HalloGruppe</favoriteActionGroup3>
       <showHeader v="true" />
       <entityField>#ENTITY</entityField>
       <columns>
diff --git a/neonView/PersPreview_view/PersPreview_view.aod b/neonView/PersPreview_view/PersPreview_view.aod
index a3b9ca8a3a46aa3e518431f883cebd728a8991b6..786aef8c3fe8ac185a6b7205425777566f88d9b1 100644
--- a/neonView/PersPreview_view/PersPreview_view.aod
+++ b/neonView/PersPreview_view/PersPreview_view.aod
@@ -66,6 +66,10 @@
           <name>5d4e0828-b7fe-4f54-a47a-f9b5838fb1ae</name>
           <entityField>DATEOFBIRTH</entityField>
         </entityFieldLink>
+        <entityFieldLink>
+          <name>3aa3e89b-91ce-4607-8d76-53ee309a688f</name>
+          <entityField>LANGUAGE</entityField>
+        </entityFieldLink>
       </fields>
     </genericViewTemplate>
   </children>
diff --git a/neonView/ProductpriceFilter_view/ProductpriceFilter_view.aod b/neonView/ProductpriceFilter_view/ProductpriceFilter_view.aod
index 1c56c25712bcf4b6c50bad7737801cbf34810b61..96f22def03c732f18052ddd63f262f037c0b3ded 100644
--- a/neonView/ProductpriceFilter_view/ProductpriceFilter_view.aod
+++ b/neonView/ProductpriceFilter_view/ProductpriceFilter_view.aod
@@ -20,7 +20,7 @@
         </neonTableColumn>
         <neonTableColumn>
           <name>695ce7be-d738-48a9-833d-e8815c6eff74</name>
-          <entityField>Pricelist_Relation</entityField>
+          <entityField>PRICELIST</entityField>
         </neonTableColumn>
         <neonTableColumn>
           <name>472a96ca-10ff-49c7-b2ae-6550e04c4e6f</name>
diff --git a/neonView/ProductpriceRelation_view/ProductpriceRelation_view.aod b/neonView/ProductpriceRelation_view/ProductpriceRelation_view.aod
index 3d65425be7d9285d965e27d67589c0b096c87e43..861b1d1178595c2b98e2fbc557f4d8de0128ea3a 100644
--- a/neonView/ProductpriceRelation_view/ProductpriceRelation_view.aod
+++ b/neonView/ProductpriceRelation_view/ProductpriceRelation_view.aod
@@ -18,10 +18,6 @@
           <name>bc7ca35e-c454-4cc0-9b2e-0656e03f1f65</name>
           <entityField>IMAGE</entityField>
         </neonTableColumn>
-        <neonTableColumn>
-          <name>0b2271ca-f55f-4339-b63f-f6f95d1d18e6</name>
-          <entityField>PRODUCT_GROUPCODEID</entityField>
-        </neonTableColumn>
         <neonTableColumn>
           <name>9b809450-cbe5-40f3-8d64-b4a5bac5eb5b</name>
           <entityField>PRODUCT_ID</entityField>
@@ -46,6 +42,10 @@
           <name>20efd64c-297d-4774-b020-437d3610e798</name>
           <entityField>CURRENCY</entityField>
         </neonTableColumn>
+        <neonTableColumn>
+          <name>787d2cce-ddb0-4d7e-8df4-5675e0d96d76</name>
+          <entityField>VAT</entityField>
+        </neonTableColumn>
       </columns>
     </tableViewTemplate>
   </children>
diff --git a/others/db_changes/masterChangelog.xml b/others/db_changes/masterChangelog.xml
index f7675a5a11231d93c5990ac14ae410754bccb997..13278709b581a055601de549c2c09d3a5d4cbf95 100644
--- a/others/db_changes/masterChangelog.xml
+++ b/others/db_changes/masterChangelog.xml
@@ -1,6 +1,6 @@
 <?xml version="1.1" encoding="UTF-8" standalone="no"?>
 <databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd">
-    <include file="struct/Create_Pers.xml"/>
+    <include file="struct/create_pers.xml"/>
     <include file="struct/create_org.xml"/>
     <include file="struct/create_history.xml"/>
     <include file="struct/1022526_orgChange.xml"/>
diff --git a/others/db_changes/struct/create_org.xml b/others/db_changes/struct/create_org.xml
index ae2a69496b565e19534cbb7dd669833be0129d75..a7fae3e18c4b0ecae19a04586ad5a33f592f6073 100644
--- a/others/db_changes/struct/create_org.xml
+++ b/others/db_changes/struct/create_org.xml
@@ -2,7 +2,9 @@
 <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="1528803466364-1">
         <createTable tableName="ORG">
-            <column name="NAME" type="NVARCHAR(255)"/>
+            <column name="NAME" type="NVARCHAR(255)">
+                <constraints nullable="false"/>
+            </column>
             <column name="INFO" type="NCLOB"/>
             <column name="TYPE" type="SMALLINT"/>
             <column name="CUSTOMERCODE" type="VARCHAR(30)"/>
diff --git a/others/db_changes/struct/Create_Pers.xml b/others/db_changes/struct/create_pers.xml
similarity index 91%
rename from others/db_changes/struct/Create_Pers.xml
rename to others/db_changes/struct/create_pers.xml
index 2fc0b35392db9b5e910225760dd710850b544013..8fdd0ff9eb3b21528732f9bea02f18867447d3cc 100644
--- a/others/db_changes/struct/Create_Pers.xml
+++ b/others/db_changes/struct/create_pers.xml
@@ -12,7 +12,9 @@
 		<column name="USER_NEW" type="VARCHAR(50)"/>
 		<column name="FIRSTNAME" type="VARCHAR(50)"/>
 		<column name="MIDDLENAME" type="VARCHAR(50)"/>
-		<column name="LASTNAME" type="VARChAR(50)"/>
+		<column name="LASTNAME" type="VARCHAR(50)">
+                    <constraints nullable="false"/>
+                </column>
 		<column name="GENDER" type="VARCHAR(50)"/>
 		<column name="SALUTATION" type="VARCHAR(16)"/>
 		<column name="TITLE" type="VARCHAR(50)"/>
diff --git a/process/Comm_lib/Comm_lib.aod b/process/Comm_lib/Comm_lib.aod
new file mode 100644
index 0000000000000000000000000000000000000000..21ab969d90c667d39fe448d4805b9a95d4994f69
--- /dev/null
+++ b/process/Comm_lib/Comm_lib.aod
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.1.7">
+  <name>Comm_lib</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <process>%aditoprj%/process/Comm_lib/process.js</process>
+</process>
diff --git a/process/Comm_lib/process.js b/process/Comm_lib/process.js
new file mode 100644
index 0000000000000000000000000000000000000000..84b969d635c72e28ad7bffdd2f8b4a03424232b6
--- /dev/null
+++ b/process/Comm_lib/process.js
@@ -0,0 +1,65 @@
+import("system.translate");
+import("system.net");
+import("system.mail");
+import("system.cti");
+
+
+/**
+ * provides somehow static methods for validation of communication data
+ * do not create an instance of this
+ */
+function CommValidationUtil(){
+}
+
+/**
+ * creates a function depending on a given COMM-category (like PHONE, EMAIL, etc.) or null if no validation-function was defined for the given category
+ * @param {string} commCategory category that determines which function shall be created, e.g. "EMAIL" 
+ * @return {function} function that receives the following arguments:
+ * <br/> - commAddress
+ * <br/> - extensions
+ * <br/>the function has to return null if everything is OK or a value with details if validation failed
+ */
+CommValidationUtil.makeValidationFn = function (commCategory){
+    var callbackFn;
+
+    switch (commCategory) {
+        case "EMAIL":
+            callbackFn = function (addrValue){
+//                if (!mail.isValidMailAddress(addrValue)) //TODO: enable JDito-methods
+//                    return translate.text("no valid mail-address format");
+                return null;
+            }
+            break;
+        case "LINK":
+            callbackFn = function (addrValue){
+//                if (!net.isValidUrl(addrValue, ["http", "https"]))//TODO: enable JDito-methods
+//                    return translate.text("no valid format");
+                return null;
+            }
+            break;
+        case "TELEPHONE":
+            callbackFn = function (addrValue, ext){
+                var country = null;
+                if (addrValue[0] != "+") //if the number starts with a country-identifier (e.g. +49) no country needs to be specified
+                    country = ext.countryCode;
+//                if (!cti.isValidPhoneNumber(addrValue, country))//TODO: enable JDito-methods
+//                    return translate.text("no valid phone number");
+                return null;
+            }
+            break;
+        default:
+            callbackFn = null;
+            break;
+    }
+    return callbackFn;
+}
+
+/**
+ * returns a blueprint for validation extensions; these extensions are needed for validating comm data and can be passed to other functions
+ * @return {object} a object with properties that have a specific default value; normally you want to overwrite that value
+ */
+CommValidationUtil.getExtensionsBlueprint = function(){
+    return {
+        countryCode: null
+    };
+}
diff --git a/process/Keyword_lib/process.js b/process/Keyword_lib/process.js
index 7e8781529f62f054c579424e158129a7a7a8a0c9..d018fbf41aa3d76b6cc9cfcd2b73a16276a8455e 100644
--- a/process/Keyword_lib/process.js
+++ b/process/Keyword_lib/process.js
@@ -1,352 +1,354 @@
-import("system.translate");
-
-/**
- * provides methods for interactions with keywords
- */
-function KeywordUtils(){
-    /**
-     * returns the default case for keyword-arrays (id and translated name)
-     * @param {String} keywordType specifies the type of the keyword and therefore the list elements; e.g. "COUNTRY"
-     * @return {Array} a 2D array in form of [["id1", "name1"], ["idN", "nameN"]]
-     * @example
-     * var kwdUtils, items;
-     * 
-     * kwdUtils = new KeywordUtils();
-     * items = kwdUtils.getStandardArray("ADDRESS.TYPE");
-     * result.object(items);
-     */
-    this.getStandardArray = function(keywordType){
-        return this.createKeyword(keywordType).toArray(["id", "name"]);
-    }
-    
-    /**
-     * returns a specific name (translated) - this is normally the view-value - of a given keyword;
-     * <br/>if the key could not be found an empty string "" is returned 
-     * @param {String} keywordType specifies the type of the keyword and therefore the list elements; e.g. "COUNTRY"
-     * @param {String} key id value of the keyword where the view-value shall be searched
-     * @return {String} representation of the translated name of the keyword-key
-     * @example
-     * var kwdUtils, histMedium;
-     * histMedium = vars.get("$field.MEDIUM");
-     * if (histMedium){
-     *     kwdUtils = new KeywordUtils();
-     *     result.string(vars.get("$field.SUBJECT") + " (" + kwdUtils.getViewValue("HISTORY.MEDIUM", histMedium) + ")");
-     * }
-     */
-    this.getViewValue = function(keywordType, key){
-        var k = this.createKeyword(keywordType);
-        return k.getPropForKey(key, "name") || "";
-    }
-    
-    /**
-     * creates an object with methods for interacting with an specific keyword
-     * @param {String} keywordType specifies the type of the keyword and therefore the list elements; e.g. "COUNTRY"
-     * @return {Object} object with the following methods:
-     * <br/>- toArray
-     * <br/>- getPropForKey
-     * <br/>- getPropsForKey
-     */
-    this.createKeyword = function(keywordType){//TODO: rename ot createKeywordObj?
-        var valueContainer, _toArrayFn, _getPropForKeyFn, _getPropsForKeyFn;
-
-        switch (keywordType){
-            case "RELATION.STATUS":
-                valueContainer = createKeywordEntriesContainer([
-                     createKeywordEntry("0", translate.text("Inactive"))
-                    ,createKeywordEntry("1", translate.text("Active"))
-                    ,createKeywordEntry("2", translate.text("In review"))
-                ]);
-                break;
-            case "COUNTRY":
-                valueContainer = createKeywordEntriesContainer([
-                     createKeywordEntry("DE", translate.text("Germany"))
-                    ,createKeywordEntry("AT", translate.text("Austria"))
-                    ,createKeywordEntry("CH", translate.text("Switzerland"))
-                    ,createKeywordEntry("GB", translate.text("United Kingdom"))
-                    ,createKeywordEntry("NO", translate.text("Norway"))
-                ]);
-                break;
-            case "LANGUAGE":
-                valueContainer = createKeywordEntriesContainer([
-                     createKeywordEntry("de", translate.text("German"))
-                    ,createKeywordEntry("de-DE", translate.text("German (Germany)"))
-                    ,createKeywordEntry("de-AT", translate.text("German (Austria)"))
-                    ,createKeywordEntry("en", translate.text("English"))
-                    ,createKeywordEntry("en-GB", translate.text("English (United Kingdom)"))
-                    ,createKeywordEntry("no-NO", translate.text("Norwegian"))
-                ]);
-                break;
-            case "HISTORY.DIRECTION":
-                valueContainer = createKeywordEntriesContainer([
-                     createKeywordEntry("i", translate.text("Incoming"))
-                    ,createKeywordEntry("o", translate.text("Outgoing"))
-                ]);
-                break;
-            case "HISTORY.MEDIUM":
-                valueContainer = createKeywordEntriesContainer([
-                     createKeywordEntry("0", translate.text("Visit"))
-                    ,createKeywordEntry("1", translate.text("E-Mail"))
-                    ,createKeywordEntry("2", translate.text("Phone"))
-                    ,createKeywordEntry("3", translate.text("Internal"))
-                    ,createKeywordEntry("4", translate.text("Online-Meeting"))
-                ]);
-            case "COMM.MEDIUM":
-                valueContainer = createKeywordEntriesContainer([
-                     createKeywordEntry("0", translate.text("Mobile"), null, {category: "PHONE"})
-                    ,createKeywordEntry("1", translate.text("E-Mail"), null, {category: "EMAIL"})
-                    ,createKeywordEntry("2", translate.text("Phone"), null, {category: "PHONE"})
-                    ,createKeywordEntry("3", translate.text("Internet"), null, {category: "OTHER"})
-                ]);
-                break;
-            case "ADDRESS.TYPE":
-                valueContainer = createKeywordEntriesContainer([
-                     createKeywordEntry("1", translate.text("Office address"))
-                    ,createKeywordEntry("2", translate.text("Home address"))
-                    ,createKeywordEntry("3", translate.text("Delivery address"))
-                    ,createKeywordEntry("4", translate.text("Post office box"))
-                ]);
-                break;
-            case "ORG.TYPE":
-                valueContainer = createKeywordEntriesContainer([
-                     createKeywordEntry("0", translate.text("Customer"))
-                    ,createKeywordEntry("1", translate.text("Prospect"))
-                    ,createKeywordEntry("2", translate.text("Supplier"))
-                    ,createKeywordEntry("3", translate.text("Other"))
-                ]);
-                break;
-            case "PERS.GENDER":
-                valueContainer = createKeywordEntriesContainer([
-                     createKeywordEntry("f", translate.text("Female"))
-                    ,createKeywordEntry("m", translate.text("Male"))
-                    ,createKeywordEntry("o", translate.text("${GENDER_OTHER}"))
-                ]);
-                break;
-            case "CONTRACT.CONTRACTTYPE":
-                valueContainer = createKeywordEntriesContainer([
-                     createKeywordEntry("0", translate.text("Framework contract"))
-                    ,createKeywordEntry("1", translate.text("Service contract"))
-                    ,createKeywordEntry("2", translate.text("Maintenance contract"))
-                ]);
-                break;
-            case "CONTRACT.CONTRACTSTATUS":
-                valueContainer = createKeywordEntriesContainer([
-                     createKeywordEntry("0", translate.text("Valid, unlimited"))
-                    ,createKeywordEntry("1", translate.text("Valid, limited"))
-                    ,createKeywordEntry("2", translate.text("Not signed yet"))
-                    ,createKeywordEntry("3", translate.text("None, individual count"))
-                    ,createKeywordEntry("4", translate.text("Cancelled"))
-                ]);
-                break;
-            case "CONTRACT.PAYMENT":
-                valueContainer = createKeywordEntriesContainer([
-                     createKeywordEntry("0", translate.text("Annually"))
-                    ,createKeywordEntry("1", translate.text("Semiannually"))
-                    ,createKeywordEntry("2", translate.text("Quarterly"))
-                ]);
-                break;
-            case "GROUPCODE":
-                valueContainer = createKeywordEntriesContainer([
-                     createKeywordEntry("1", translate.text("Commodity group 1"))
-                    ,createKeywordEntry("2", translate.text("Commodity group 2"))
-                    ,createKeywordEntry("3", translate.text("Commodity group 3"))
-                    ,createKeywordEntry("4", translate.text("Discount"))
-                    ,createKeywordEntry("5", translate.text("Spare parts"))
-                    ,createKeywordEntry("6", translate.text("Service"))
-                ]);
-                break;
-            case "UNIT":
-                valueContainer = createKeywordEntriesContainer([
-                     createKeywordEntry("1", translate.text("Pieces"))
-                    ,createKeywordEntry("2", translate.text("Kgs"))
-                    ,createKeywordEntry("3", translate.text("Liter"))
-                    ,createKeywordEntry("4", translate.text("Hours"))
-                ]);
-                break;
-            case "PRICELIST":
-                valueContainer = createKeywordEntriesContainer([
-                     createKeywordEntry("1", translate.text("${PRICELIST_DEFAULT}"))
-                    ,createKeywordEntry("2", translate.text("Key account"))
-                    ,createKeywordEntry("3", translate.text("Special price list1"))
-                    ,createKeywordEntry("4", translate.text("${PRICELIST_SERVICE}"))
-                ]);
-                break;
-            case "CURRENCY":
-                valueContainer = createKeywordEntriesContainer([
-                     createKeywordEntry("1", translate.text("EUR"))
-                    ,createKeywordEntry("2", translate.text("USD"))
-                    ,createKeywordEntry("3", translate.text("CND"))
-                    ,createKeywordEntry("4", translate.text("CHF"))
-                ]);
-                break;
-            case "STOCK.WAREHOUSE":
-                valueContainer = createKeywordEntriesContainer([
-                     createKeywordEntry("1", translate.text("Warehouse 1"))
-                    ,createKeywordEntry("2", translate.text("Warehouse 2"))
-                    ,createKeywordEntry("3", translate.text("Warehouse 3"))
-                ]);
-                break;
-            case "SALESPROJECT.STATUS":
-                valueContainer = createKeywordEntriesContainer([
-                     createKeywordEntry("1", translate.text("Open"))
-                    ,createKeywordEntry("2", translate.text("Postponed"))
-                    ,createKeywordEntry("3", translate.text("Aborted"))
-                    ,createKeywordEntry("4", translate.text("Partial order"))
-                    ,createKeywordEntry("5", translate.text("Order"))
-                    ,createKeywordEntry("6", translate.text("Lost"))
-                ]);
-                break;
-            case "SALESPROJECT.PHASE":
-                valueContainer = createKeywordEntriesContainer([
-                     createKeywordEntry("1", translate.text("Project decision"))
-                    ,createKeywordEntry("2", translate.text("Negotiation"))
-                    ,createKeywordEntry("3", translate.text("Workshop"))
-                    ,createKeywordEntry("4", translate.text("Presentation postprocessing"))
-                    ,createKeywordEntry("5", translate.text("Presentation preparation"))
-                    ,createKeywordEntry("6", translate.text("Statement given"))
-                    ,createKeywordEntry("7", translate.text("Specifications in progress"))
-                    ,createKeywordEntry("8", translate.text("Waiting for request"))
-                    ,createKeywordEntry("9", translate.text("Lead"))
-                ]);
-                break;
-            case "OFFER.PROBABILITY":
-                valueContainer = createKeywordEntriesContainer([
-                     createKeywordEntry("1", translate.text("0 %"), null, {percentValue: 0})
-                    ,createKeywordEntry("2", translate.text("25 %"), null, {percentValue: 25})
-                    ,createKeywordEntry("3", translate.text("50 %"), null, {percentValue: 50})
-                    ,createKeywordEntry("4", translate.text("75 %"), null, {percentValue: 75})
-                    ,createKeywordEntry("5", translate.text("100 %"), null, {percentValue: 100})
-                ]);
-                break;
-            case "OFFER.STATUS":
-                valueContainer = createKeywordEntriesContainer([
-                     createKeywordEntry("1", translate.text("Checked"))
-                    ,createKeywordEntry("2", translate.text("Sent"))
-                    ,createKeywordEntry("3", translate.text("Won"))
-                    ,createKeywordEntry("4", translate.text("Lost"))
-                ]);
-                break;
-            default: 
-                throw new Error(translate.withArguments("[%0]the given keyword \"%1\" has no match with the possible keywordlist", [
-                    arguments.callee.name, keywordType
-                ]));
-                break;
-        }
-
-
-        _getPropForKeyFn = function(key, field, isCustom) {
-            var keyObject;
-            if (isCustom)
-                keyObject = valueContainer[key]["customProperties"];
-            else
-                keyObject = valueContainer[key];
-                
-            if (keyObject == undefined)
-                return undefined;
-            return keyObject[field];
-        };
-        
-        _getPropsForKeyFn = function(key, fields) {
-            var keyObject, i, l, currentRow, currentField;
-            
-            keyObject = valueContainer[key];
-            if (keyObject == undefined)
-                return [];//TODO: throw error instead?
-            l = fields.length;
-            currentRow = [];
-            for (i = 0; i < l; i++){
-                currentField = fields[i];
-                //check if the passed fieldnames match the existing fieldnames (<=> properties in the object)
-                //to prevent errors and unexpected behaviour
-                if (keyObject[currentField])
-                    currentRow.push(keyObject[currentField]);
-                else
-                    currentRow.push("");
-            }
-            return currentRow;
-        };
-        
-        _toArrayFn = function(fields){
-            var res, id, currentRow;
-
-            res = [];
-            if (!fields)
-                fields = ["id", "name"];
-            else if (typeof(fields) == "string"){
-                for (id in valueContainer){
-                    res.push(_getPropForKeyFn(id, fields));
-                }
-                return res;
-            }
-            
-            for (id in valueContainer){
-                currentRow = _getPropsForKeyFn(id, fields);
-                res.push(currentRow);
-            }
-            return res;
-        };
-
-        return {
-            /**
-             * toArray
-             */
-             toArray: _toArrayFn
-            ,getPropForKey: _getPropForKeyFn
-            ,getPropsForKey: _getPropsForKeyFn
-            ,filter: function (callbackFn, thisArg){
-                for (id in valueContainer){
-                    if (false == callbackFn.call(thisArg, valueContainer[id].id, valueContainer[id].name, valueContainer[id].customProperties, 
-                            valueContainer[id], valueContainer)){
-                        delete valueContainer[id];
-                    }
-                }
-                return this;
-            }
-        };
-    };
-    
-    /**
-     * internal  function for creating an object that represents a keyword entry
-     * @param {String} id represents the key of an entry; a KeywordEntriesContainer can contain the same key only once
-     * @param {String} name represents the translated name of an entry; this is in most cases the view-value
-     * @param {String} [description=""] description text for describing the keyword
-     * @param {Object} [customProperties=null] an Object with additional properties; these can be virtually anything
-     * @return {Object} object that represents a single keyword entry; normally severel entries are cumulated in a "keywordEntriesContainer"
-     */
-    function createKeywordEntry(id, name, description, customProperties){
-        //TODO: verify if mandatory-checks are really that usefull or can at least be made easier
-        if (!id)
-            throw new Error(translate.withArguments("the param \"%0\" in \"%1\" is mandatory and has to be set", [
-                "id", arguments.callee.name
-            ]));
-        if (!name)
-            throw new Error(translate.withArguments("the param \"%0\" in \"%1\" is mandatory and has to be set", [
-                "name", arguments.callee.name
-            ]));
-
-        return {
-             id: id
-            ,name: name
-            ,description: description || ""
-            ,customProperties: customProperties
-        };
-    }
-
-    /**
-     * internal  function for creating an object that represents a container of several keywordEntries
-     * @param {Array} keywordEntries an Array of keywordEntry-objects (as they are created by "createKeywordEntry"
-     * @return {Object} object that contains several keywordEntries
-     */
-    function createKeywordEntriesContainer(keywordEntries){
-        var res, i, l, id;
-
-        res = {};
-        for (i = 0, l = keywordEntries.length; i < l; i++){
-            id = keywordEntries[i].id;
-            if (res[id] != undefined){
-                throw new Error("the given id is not unique since it already exists");
-            }
-            res[id] = keywordEntries[i];
-        }
-        return res;
-    }
+import("system.translate");
+import("system.neon");
+
+/**
+ * provides methods for interactions with keywords
+ */
+function KeywordUtils(){
+    /**
+     * returns the default case for keyword-arrays (id and translated name)
+     * @param {String} keywordType specifies the type of the keyword and therefore the list elements; e.g. "COUNTRY"
+     * @return {Array} a 2D array in form of [["id1", "name1"], ["idN", "nameN"]]
+     * @example
+     * var kwdUtils, items;
+     * 
+     * kwdUtils = new KeywordUtils();
+     * items = kwdUtils.getStandardArray("ADDRESS.TYPE");
+     * result.object(items);
+     */
+    this.getStandardArray = function(keywordType){
+        return this.createKeyword(keywordType).toArray(["id", "name"]);
+    }
+    
+    /**
+     * returns a specific name (translated) - this is normally the view-value - of a given keyword;
+     * <br/>if the key could not be found an empty string "" is returned 
+     * @param {String} keywordType specifies the type of the keyword and therefore the list elements; e.g. "COUNTRY"
+     * @param {String} key id value of the keyword where the view-value shall be searched
+     * @return {String} representation of the translated name of the keyword-key
+     * @example
+     * var kwdUtils, histMedium;
+     * histMedium = vars.get("$field.MEDIUM");
+     * if (histMedium){
+     *     kwdUtils = new KeywordUtils();
+     *     result.string(vars.get("$field.SUBJECT") + " (" + kwdUtils.getViewValue("HISTORY.MEDIUM", histMedium) + ")");
+     * }
+     */
+    this.getViewValue = function(keywordType, key){
+        var k = this.createKeyword(keywordType);
+        return k.getPropForKey(key, "name") || "";
+    }
+    
+    /**
+     * creates an object with methods for interacting with an specific keyword
+     * @param {String} keywordType specifies the type of the keyword and therefore the list elements; e.g. "COUNTRY"
+     * @return {Object} object with the following methods:
+     * <br/>- toArray
+     * <br/>- getPropForKey
+     * <br/>- getPropsForKey
+     * <br/>- filter
+     */
+    this.createKeyword = function(keywordType){//TODO: rename ot createKeywordObj?
+        var valueContainer, _toArrayFn, _getPropForKeyFn, _getPropsForKeyFn;
+
+        switch (keywordType){
+            case "RELATION.STATUS":
+                valueContainer = createKeywordEntriesContainer([
+                     createKeywordEntry("0", translate.text("Inactive"))
+                    ,createKeywordEntry("1", translate.text("Active"))
+                    ,createKeywordEntry("2", translate.text("In review"))
+                ]);
+                break;
+            case "COUNTRY":
+                valueContainer = createKeywordEntriesContainer([
+                     createKeywordEntry("DE", translate.text("Germany"))
+                    ,createKeywordEntry("AT", translate.text("Austria"))
+                    ,createKeywordEntry("CH", translate.text("Switzerland"))
+                    ,createKeywordEntry("GB", translate.text("United Kingdom"))
+                    ,createKeywordEntry("NO", translate.text("Norway"))
+                ]);
+                break;
+            case "LANGUAGE":
+                valueContainer = createKeywordEntriesContainer([
+                     createKeywordEntry("de", translate.text("German"))
+                    ,createKeywordEntry("de-DE", translate.text("German (Germany)"))
+                    ,createKeywordEntry("de-AT", translate.text("German (Austria)"))
+                    ,createKeywordEntry("en", translate.text("English"))
+                    ,createKeywordEntry("en-GB", translate.text("English (United Kingdom)"))
+                    ,createKeywordEntry("no-NO", translate.text("Norwegian"))
+                ]);
+                break;
+            case "HISTORY.DIRECTION":
+                valueContainer = createKeywordEntriesContainer([
+                     createKeywordEntry("i", translate.text("Incoming"))
+                    ,createKeywordEntry("o", translate.text("Outgoing"))
+                ]);
+                break;
+            case "HISTORY.MEDIUM":
+                valueContainer = createKeywordEntriesContainer([
+                     createKeywordEntry("0", translate.text("Visit"))
+                    ,createKeywordEntry("1", translate.text("E-Mail"))
+                    ,createKeywordEntry("2", translate.text("Phone"))
+                    ,createKeywordEntry("3", translate.text("Internal"))
+                    ,createKeywordEntry("4", translate.text("Online-Meeting"))
+                ]);
+            case "COMM.MEDIUM":
+                valueContainer = createKeywordEntriesContainer([
+                     createKeywordEntry("0", translate.text("Mobile"), null, {category: "PHONE", contentType: "TELEPHONE"})
+                    ,createKeywordEntry("1", translate.text("E-Mail"), null, {category: "EMAIL", contentType: "EMAIL"})
+                    ,createKeywordEntry("2", translate.text("Phone"), null, {category: "PHONE", contentType: "TELEPHONE"})
+                    ,createKeywordEntry("3", translate.text("Internet"), null, {category: "OTHER", contentType: "LINK"})
+                ]);
+                break;
+            case "ADDRESS.TYPE":
+                valueContainer = createKeywordEntriesContainer([
+                     createKeywordEntry("1", translate.text("Office address"))
+                    ,createKeywordEntry("2", translate.text("Home address"))
+                    ,createKeywordEntry("3", translate.text("Delivery address"))
+                    ,createKeywordEntry("4", translate.text("Post office box"))
+                ]);
+                break;
+            case "ORG.TYPE":
+                valueContainer = createKeywordEntriesContainer([
+                     createKeywordEntry("0", translate.text("Customer"))
+                    ,createKeywordEntry("1", translate.text("Prospect"))
+                    ,createKeywordEntry("2", translate.text("Supplier"))
+                    ,createKeywordEntry("3", translate.text("Other"))//TODO: key as ${}
+                ]);
+                break;
+            case "PERS.GENDER":
+                valueContainer = createKeywordEntriesContainer([
+                     createKeywordEntry("f", translate.text("Female"))
+                    ,createKeywordEntry("m", translate.text("Male"))
+                    ,createKeywordEntry("o", translate.text("${GENDER_OTHER}"))
+                ]);
+                break;
+            case "CONTRACT.CONTRACTTYPE":
+                valueContainer = createKeywordEntriesContainer([
+                     createKeywordEntry("0", translate.text("Framework contract"))
+                    ,createKeywordEntry("1", translate.text("Service contract"))
+                    ,createKeywordEntry("2", translate.text("Maintenance contract"))
+                ]);
+                break;
+            case "CONTRACT.CONTRACTSTATUS":
+                valueContainer = createKeywordEntriesContainer([
+                     createKeywordEntry("0", translate.text("Valid, unlimited"))
+                    ,createKeywordEntry("1", translate.text("Valid, limited"))
+                    ,createKeywordEntry("2", translate.text("Not signed yet"))
+                    ,createKeywordEntry("3", translate.text("None, individual count"))
+                    ,createKeywordEntry("4", translate.text("Cancelled"))
+                ]);
+                break;
+            case "CONTRACT.PAYMENT":
+                valueContainer = createKeywordEntriesContainer([
+                     createKeywordEntry("0", translate.text("Annually"))
+                    ,createKeywordEntry("1", translate.text("Semiannually"))
+                    ,createKeywordEntry("2", translate.text("Quarterly"))
+                ]);
+                break;
+            case "GROUPCODE":
+                valueContainer = createKeywordEntriesContainer([
+                     createKeywordEntry("1", translate.text("Commodity group 1"))
+                    ,createKeywordEntry("2", translate.text("Commodity group 2"))
+                    ,createKeywordEntry("3", translate.text("Commodity group 3"))
+                    ,createKeywordEntry("4", translate.text("Discount"))
+                    ,createKeywordEntry("5", translate.text("Spare parts"))
+                    ,createKeywordEntry("6", translate.text("Service"))
+                ]);
+                break;
+            case "UNIT":
+                valueContainer = createKeywordEntriesContainer([
+                     createKeywordEntry("1", translate.text("Pieces"))
+                    ,createKeywordEntry("2", translate.text("Kgs"))
+                    ,createKeywordEntry("3", translate.text("Liter"))
+                    ,createKeywordEntry("4", translate.text("Hours"))
+                ]);
+                break;
+            case "PRICELIST":
+                valueContainer = createKeywordEntriesContainer([
+                     createKeywordEntry("1", translate.text("${PRICELIST_DEFAULT}"))
+                    ,createKeywordEntry("2", translate.text("Key account"))
+                    ,createKeywordEntry("3", translate.text("Special price list1"))
+                    ,createKeywordEntry("4", translate.text("${PRICELIST_SERVICE}"))
+                ]);
+                break;
+            case "CURRENCY":
+                valueContainer = createKeywordEntriesContainer([
+                     createKeywordEntry("1", translate.text("EUR"))
+                    ,createKeywordEntry("2", translate.text("USD"))
+                    ,createKeywordEntry("3", translate.text("CND"))
+                    ,createKeywordEntry("4", translate.text("CHF"))
+                ]);
+                break;
+            case "STOCK.WAREHOUSE":
+                valueContainer = createKeywordEntriesContainer([
+                     createKeywordEntry("1", translate.text("Warehouse 1"))
+                    ,createKeywordEntry("2", translate.text("Warehouse 2"))
+                    ,createKeywordEntry("3", translate.text("Warehouse 3"))
+                ]);
+                break;
+            case "SALESPROJECT.STATUS":
+                valueContainer = createKeywordEntriesContainer([
+                     createKeywordEntry("1", translate.text("Open"))
+                    ,createKeywordEntry("2", translate.text("Postponed"))
+                    ,createKeywordEntry("3", translate.text("Aborted"))
+                    ,createKeywordEntry("4", translate.text("Partial order"))
+                    ,createKeywordEntry("5", translate.text("Order"))
+                    ,createKeywordEntry("6", translate.text("Lost"))
+                ]);
+                break;
+            case "SALESPROJECT.PHASE":
+                valueContainer = createKeywordEntriesContainer([
+                     createKeywordEntry("1", translate.text("Project decision"))
+                    ,createKeywordEntry("2", translate.text("Negotiation"))
+                    ,createKeywordEntry("3", translate.text("Workshop"))
+                    ,createKeywordEntry("4", translate.text("Presentation postprocessing"))
+                    ,createKeywordEntry("5", translate.text("Presentation preparation"))
+                    ,createKeywordEntry("6", translate.text("Statement given"))
+                    ,createKeywordEntry("7", translate.text("Specifications in progress"))
+                    ,createKeywordEntry("8", translate.text("Waiting for request"))
+                    ,createKeywordEntry("9", translate.text("Lead"))
+                ]);
+                break;
+            case "OFFER.PROBABILITY":
+                valueContainer = createKeywordEntriesContainer([
+                     createKeywordEntry("1", translate.text("0 %"), null, {percentValue: 0})
+                    ,createKeywordEntry("2", translate.text("25 %"), null, {percentValue: 25})
+                    ,createKeywordEntry("3", translate.text("50 %"), null, {percentValue: 50})
+                    ,createKeywordEntry("4", translate.text("75 %"), null, {percentValue: 75})
+                    ,createKeywordEntry("5", translate.text("100 %"), null, {percentValue: 100})
+                ]);
+                break;
+            case "OFFER.STATUS":
+                valueContainer = createKeywordEntriesContainer([
+                     createKeywordEntry("1", translate.text("Checked"))
+                    ,createKeywordEntry("2", translate.text("Sent"))
+                    ,createKeywordEntry("3", translate.text("Won"))
+                    ,createKeywordEntry("4", translate.text("Lost"))
+                ]);
+                break;
+            default: 
+                throw new Error(translate.withArguments("[%0]the given keyword \"%1\" has no match with the possible keywordlist", [
+                    arguments.callee.name, keywordType
+                ]));
+                break;
+        }
+
+
+        _getPropForKeyFn = function(key, field, isCustom) {
+            var keyObject;
+            if (isCustom)
+                keyObject = valueContainer[key]["customProperties"];
+            else
+                keyObject = valueContainer[key];
+                
+            if (keyObject == undefined)
+                return undefined;
+            return keyObject[field];
+        };
+        
+        _getPropsForKeyFn = function(key, fields) {
+            var keyObject, i, l, currentRow, currentField;
+            
+            keyObject = valueContainer[key];
+            if (keyObject == undefined)
+                return [];//TODO: throw error instead?
+            l = fields.length;
+            currentRow = [];
+            for (i = 0; i < l; i++){
+                currentField = fields[i];
+                //check if the passed fieldnames match the existing fieldnames (<=> properties in the object)
+                //to prevent errors and unexpected behaviour
+                if (keyObject[currentField])
+                    currentRow.push(keyObject[currentField]);
+                else
+                    currentRow.push("");
+            }
+            return currentRow;
+        };
+        
+        _toArrayFn = function(fields){
+            var res, id, currentRow;
+
+            res = [];
+            if (!fields)
+                fields = ["id", "name"];
+            else if (typeof(fields) == "string"){
+                for (id in valueContainer){
+                    res.push(_getPropForKeyFn(id, fields));
+                }
+                return res;
+            }
+            
+            for (id in valueContainer){
+                currentRow = _getPropsForKeyFn(id, fields);
+                res.push(currentRow);
+            }
+            return res;
+        };
+
+        return {
+            /**
+             * toArray
+             */
+             toArray: _toArrayFn
+            ,getPropForKey: _getPropForKeyFn
+            ,getPropsForKey: _getPropsForKeyFn
+            ,filter: function (callbackFn, thisArg){
+                for (id in valueContainer){
+                    if (false == callbackFn.call(thisArg, valueContainer[id].id, valueContainer[id].name, valueContainer[id].customProperties, 
+                            valueContainer[id], valueContainer)){
+                        delete valueContainer[id];
+                    }
+                }
+                return this;
+            }
+        };
+    };
+    
+    /**
+     * internal  function for creating an object that represents a keyword entry
+     * @param {String} id represents the key of an entry; a KeywordEntriesContainer can contain the same key only once
+     * @param {String} name represents the translated name of an entry; this is in most cases the view-value
+     * @param {String} [description=""] description text for describing the keyword
+     * @param {Object} [customProperties=null] an Object with additional properties; these can be virtually anything
+     * @return {Object} object that represents a single keyword entry; normally severel entries are cumulated in a "keywordEntriesContainer"
+     */
+    function createKeywordEntry(id, name, description, customProperties){
+        //TODO: verify if mandatory-checks are really that usefull or can at least be made easier
+        if (!id)
+            throw new Error(translate.withArguments("the param \"%0\" in \"%1\" is mandatory and has to be set", [
+                "id", arguments.callee.name
+            ]));
+        if (!name)
+            throw new Error(translate.withArguments("the param \"%0\" in \"%1\" is mandatory and has to be set", [
+                "name", arguments.callee.name
+            ]));
+
+        return {
+             id: id
+            ,name: name
+            ,description: description || ""
+            ,customProperties: customProperties
+        };
+    }
+
+    /**
+     * internal  function for creating an object that represents a container of several keywordEntries
+     * @param {Array} keywordEntries an Array of keywordEntry-objects (as they are created by "createKeywordEntry"
+     * @return {Object} object that contains several keywordEntries
+     */
+    function createKeywordEntriesContainer(keywordEntries){
+        var res, i, l, id;
+
+        res = {};
+        for (i = 0, l = keywordEntries.length; i < l; i++){
+            id = keywordEntries[i].id;
+            if (res[id] != undefined){
+                throw new Error("the given id is not unique since it already exists");
+            }
+            res[id] = keywordEntries[i];
+        }
+        return res;
+    }
 }
\ No newline at end of file
diff --git a/process/Offer_lib/process.js b/process/Offer_lib/process.js
index d142a7bc54e17f5950585a38c7fdd81f56c0ace9..b7c05285b8fb45833a699b54a8901fae47fab9e7 100644
--- a/process/Offer_lib/process.js
+++ b/process/Offer_lib/process.js
@@ -30,4 +30,51 @@ function OfferUtils(){
     this.getOfferNumberValidationFailString = function(){
         return translate.text("The offer number already exists!");
     }
+    
+    this.getOfferNetAndVAT = function(pOfferId, pOfferitemIdToDel){
+        //TODO: Bessere Möglichkeit als per SQL die zugehörigen Posten aus der DB zu holen?
+        var sum = 0;
+        var vat = 0;
+        var oiUtils = new OfferItemUtils();
+        
+        var condition = "where OFFER_ID = '" + pOfferId + "'";
+        if(pOfferitemIdToDel != undefined)
+            condition += " and OFFERITEMID <> '" + pOfferitemIdToDel + "'";
+        
+        var offerItems = db.table("select QUANTITY, PRICE, DISCOUNT, VAT, OPTIONAL "
+                                 + "from OFFERITEM " + condition);
+        
+        for(var i = 0; i < offerItems.length; i++){
+            sum += oiUtils.getItemSum(offerItems[i][0], offerItems[i][1], offerItems[i][2], offerItems[i][4]);
+            vat += oiUtils.getItemVAT(offerItems[i][0], offerItems[i][1], offerItems[i][2], offerItems[i][3], offerItems[i][4]);
+        }
+        
+        return [sum, vat];
+    }
+}
+
+function OfferItemUtils(){
+    
+    this.getItemSum = function(pQuantity, pPrice, pDiscount, pOptional){
+        
+        pQuantity = pQuantity || 0;
+        pPrice = pPrice || 0;
+        pDiscount = pDiscount || 0;
+        
+        return Number(pOptional) * parseFloat(pQuantity) * parseFloat(pPrice) * ((100 - parseFloat(pDiscount)) / 100);
+    }
+    
+    this.getItemVAT = function(pQuantity, pPrice, pDiscount, pVAT, pOptional){
+        
+        pQuantity = pQuantity || 0;
+        pPrice = pPrice || 0;
+        pDiscount = pDiscount || 0;
+        pVAT = pVAT || 0;
+        
+        return Number(pOptional) * parseFloat(pQuantity) * parseFloat(pPrice) * ((100 - parseFloat(pDiscount)) / 100) * (parseFloat(pVAT) / 100);
+    }
+    
+    this.roundPrice = function(pPrice){
+        return eMath.roundDec(pPrice, 2, eMath.ROUND_HALF_UP);
+    }
 }
\ No newline at end of file
diff --git a/process/Product_lib/process.js b/process/Product_lib/process.js
index dd841c2a86f1b5d8c279ffebd4902d8950f292d4..0d4f9f1d184b6c6b5d8254fbe04322d3e3c0c947 100644
--- a/process/Product_lib/process.js
+++ b/process/Product_lib/process.js
@@ -64,4 +64,120 @@ function ProductUtils()
             throw new Error();//TODO: add message
         }
     }
+    
+    /**
+     * Delivers the stock
+     * 
+     * @param pPid {String} ProductID
+     * 
+     * @example productUtils.getStockCount(vars.get("$field.PRODUCTID"))
+     * 
+     * @result {String} stock count
+     */
+    this.getProductDetails = function( pPid, pPriceListFilter )
+    {
+        var ProductDetails = {};
+        
+        var cols = [];
+        var colsProduct = ["PRODUCT.PRODUCTID", "PRODUCT.PRODUCTNAME", "PRODUCT.GROUPCODEID", "PRODUCT.UNIT"];
+        cols = cols.concat(colsProduct);
+        
+        var joins = [];
+        var conditions = ["1=1"];
+        var orderby = ["PRODUCTID"];
+        var sqltypes = [];
+             
+        //Prod2Prod
+        //TODO: get product structure
+        
+        //PriceList
+        if(pPriceListFilter != undefined 
+            && pPriceListFilter.currency != undefined && pPriceListFilter.currency != "" 
+            && pPriceListFilter.quantity != undefined && pPriceListFilter.quantity != "")
+        {
+            var colsPricelist = ["PRODUCTPRICE.PRODUCTPRICEID", "PRODUCTPRICE.RELATION_ID", "PRODUCTPRICE.PRICELIST", "PRODUCTPRICE.PRICE", "PRODUCTPRICE.VAT"];
+            cols = cols.concat(colsPricelist);
+            joins.push(" left join PRODUCTPRICE on PRODUCTPRICE.PRODUCT_ID = PRODUCTID "
+                        + " and PRODUCTPRICE.CURRENCY = " + pPriceListFilter.currency 
+                        + " and PRODUCTPRICE.VALID_FROM <= ? and (PRODUCTPRICE.VALID_TO > ? or PRODUCTPRICE.VALID_TO is null) "
+                        + " and PRODUCTPRICE.FROMQUANTITY <= " + pPriceListFilter.quantity
+                        + " and (PRODUCTPRICE.RELATION_ID = '" + pPriceListFilter.relationId + "' or (PRODUCTPRICE.RELATION_ID is null and PRODUCTPRICE.BUYSELL = 'SP')) ");
+
+            sqltypes.push([datetime.date().toString(), SQLTYPES.TIMESTAMP]);
+            sqltypes.push([datetime.date().toString(), SQLTYPES.TIMESTAMP]);
+            orderby = orderby.concat(["PRODUCTPRICE.VALID_FROM desc, PRODUCTPRICE.FROMQUANTITY desc"]);           
+        }
+        
+        var ProductDataSql = "select " + cols.join(", ")
+                   + " from PRODUCT "
+                   + joins.join(" ")
+                   + " where PRODUCTID = '" + pPid + "' "
+                   + " and " + conditions.join(" and ")
+                   + " order by " + orderby.join(", ");
+        
+        
+        var ProductData = db.table([ProductDataSql, sqltypes]);
+        
+        for(var i = 0; i < ProductData.length; i++)
+        {
+            //Product
+            if(ProductDetails[ProductData[i][0]] == undefined)
+            {
+                ProductDetails[ProductData[i][0]] = {
+                    productId: ProductData[i][0]
+                    , productName: ProductData[i][1]
+                    , groupCode: ProductData[i][2]
+                    , unit: ProductData[i][3]
+                    , Prod2Prod: {}
+                    , CurrentValidPriceLists: {}
+                    , PriceListToUse: null
+                };
+            }
+            //Pricelist
+            var colIdx = colsProduct.length;
+            if(ProductData[i][colIdx] != "") //Pricelist found
+            {
+                ProductDetails[ProductData[i][0]].CurrentValidPriceLists[ProductData[i][colIdx]] = {
+                    priceListId: ProductData[i][colIdx++]
+                    , relationId: ProductData[i][colIdx++]
+                    , priceList: ProductData[i][colIdx++]
+                    , price: ProductData[i][colIdx++]
+                    , vat: ProductData[i][colIdx++]
+                }
+            }
+        }
+        
+        ProductDetails[pPid].PriceListToUse = _getPriceListToUse(ProductDetails[pPid].CurrentValidPriceLists, pPriceListFilter);
+        
+        return ProductDetails;
+        
+        
+        function _getPriceListToUse(pPriceLists, pPriceListFilter)
+        {
+            for(var list in pPriceLists)
+            {
+                //customer specific price (defined in Org -> Conditions)
+                if(pPriceListFilter.relationId != "" && pPriceListFilter.relationId == pPriceLists[list].relationId)
+                {
+                    return pPriceLists[list];
+                }
+                //customer deposited price list (defined by Attribute)
+                if(pPriceListFilter.priceList != "" && pPriceListFilter.priceList == pPriceLists[list].priceList)
+                {
+                    return pPriceLists[list];
+                }
+                //default price list
+                if(pPriceLists[list].priceList == "1")
+                {
+                    return pPriceLists[list];
+                }
+            }
+            
+            //no valid price list found
+            return null;
+        }
+    }
+    
+    
+    
 }
\ No newline at end of file
diff --git a/process/Sql_lib/process.js b/process/Sql_lib/process.js
index 9187a8f49e56fa987f4fb7cb83c30a79153dfda4..4181790956d0d67fc930d95ce5d5e75d4ad2f20e 100644
--- a/process/Sql_lib/process.js
+++ b/process/Sql_lib/process.js
@@ -4,7 +4,8 @@ import("system.db");
 import("system.datetime");
 import("system.tools");
 import("system.SQLTYPES");
-import("Util_lib")
+import("system.text");
+import("Util_lib");
 
 /**
  * Object for easier handling of conditions;
@@ -12,8 +13,10 @@ import("Util_lib")
  * you don't need to append a "1=1" condition or similar;
  * @example //TODO: add missing example
  */
-function SqlCondition(){
+function SqlCondition(alias){
     this._sqlStorage = "";
+    this.preparedValues = [];
+    this.alias = alias;
 }
 /**
  * append with SQL-and; no paranthesize of existing conditions is done
@@ -28,6 +31,22 @@ SqlCondition.prototype.and = function(cond){
     this._sqlStorage += cond;
     return this;
 }
+
+/**
+ * same as the "and"-function but with preparedStatement functionality
+ * @param {String} field the database field as "tablename.columnname"; e.g. "ORG.NAME"
+ * @param {String} cond the strucutre of the SQL condition as preparedString, you can use a number sign "#" as placeholder for you fieldname; 
+ *                 e.g. "# > ?"; escaping the number sign is possible with a backslash "\"
+ * @param {String} value the value that shall be set into the prepared statement
+ * @param {Numeric} [fieldType] SQL-column-type; if the fieldType is not given it's loaded automatically;
+ *                              please note that this can be a performace issue if it happens a lot of times (e.g. in aloop)
+ * @return {Object} current SqlCondition-object
+ */
+SqlCondition.prototype.andPrepare = function(field, cond, value, fieldType){
+    cond = this._prepare(field, cond, value, fieldType);
+    return this.and(cond);
+}
+
 /**
  * append with SQL-or; Also paranthesize the existing conditions
  * @param {String} cond the condition string which shall be appended
@@ -42,6 +61,21 @@ SqlCondition.prototype.or = function(cond){
         this._sqlStorage = cond;
     return this;
 }
+
+/**
+ * same as the "or"-function but with preparedStatement functionality
+ * @param {String} field the database field as "tablename.columnname"; e.g. "ORG.NAME"
+ * @param {String} cond the strucutre of the SQL condition as preparedString, you can use a number sign "#" as placeholder for you fieldname; 
+ *                 e.g. "# > ?"; escaping the number sign is possible with a backslash "\"
+ * @param {String} value the value that shall be set into the prepared statement
+ * @param {Numeric} [fieldType] SQL-column-type; if the fieldType is not given it's loaded automatically;
+ *                              please note that this can be a performace issue if it happens a lot of times (e.g. in aloop)
+ * @return {Object} current SqlCondition-object
+ */
+SqlCondition.prototype.orPrepare = function(field, cond, value, fieldType){
+    cond = this._prepare(field, cond, value, fieldType);
+    return this.or(cond);
+}
 /**
  * ready to use string; does not contain a where keyword at the beginning
  * @param {String} alternativeCond condition that is returned when nothing has been appended 
@@ -66,6 +100,44 @@ SqlCondition.prototype.toWhereString = function(alternativeCond){
         return cond;
 }
 
+/**
+ * hidden function for composing preparedStatements
+ * @param {String} field the database field as "tablename.columnname"; e.g. "ORG.NAME"
+ * @param {String} cond the strucutre of the SQL condition as preparedString, you can use a number sign "#" as placeholder for you fieldname; 
+ *                 e.g. "# > ?"; escaping the number sign is possible with a backslash "\"
+ * @param {String} value the value that shall be set into the prepared statement
+ * @param {Numeric} [fieldType] SQL-column-type; if the fieldType is not given it's loaded automatically;
+ *                              please note that this can be a performace issue if it happens a lot of times (e.g. in aloop)
+ * @return {String} the replaced SQL-condition string (replace # by the fieldname)
+ */
+SqlCondition.prototype._prepare = function(field, cond, value, fieldType){
+    //this function looks more complex (and slower) than it actually is
+    /* the following regex looks like this after javascript-escaping of the backslash: (?<!\\)((?:\\\\)*)#
+    the regexp searches for the unescaped character and these characters are replaced by the field name
+    
+    examples:
+    ---------------------
+    | # --match         |
+    | \# --no-match     |
+    | \\# --match       |
+    | \\\# --no-match   |
+    | \\\\# --match     |
+    ---------------------
+    */
+   //use replaceAll because it's faster and supports negative lookbehinds
+    cond = text.replaceAll(cond, {
+        //manually readd the replaced backslashes by using a group reference, because they a part of the match and therefore replaced by "replaceAll"
+        //since the field COULD contain already a group reference (I think this is extremely uncommon; 
+        //probably that never happens but better stay save): escape that references within the fieldname
+        "(?<!\\\\)((?:\\\\\\\\)*)#": "$1" + text.replaceAll(field, {"$1": "\\$1"}),
+        //now that we've replaced the correct field placeholder let's replace the escaped number sign "\#" to a normal number sign "#"
+        "\\\\#": "#"
+    });
+    type = fieldType || SqlUtils.getSingleColumnType(field, undefined, this.alias);
+    this.preparedValues.push([value.toString(), type]);
+    return cond;
+}
+
 function SqlMaskingUtils(){
     //TODO: use callbacks for different handling?
     /**
@@ -218,6 +290,42 @@ function SqlMaskingUtils(){
     }
 }
 
+function SqlUtils(){
+}
+
+SqlUtils.getSingleColumnType = function(fieldOrTableName, columnName, alias)
+{
+    var tableName, fieldVarType;
+    if (columnName == undefined){
+        fieldVarType = typeof(fieldOrTableName);
+        if (fieldVarType == "string")
+            fieldOrTableName = text.split(fieldOrTableName, "\\.");
+        else if (fieldVarType != "object"){
+            throw new TypeError();//TODO: add message
+        }
+        
+        if (fieldOrTableName.hasOwnProperty("length") && fieldOrTableName.length == 2)
+        {
+            tableName = fieldOrTableName[0];
+            columnName = fieldOrTableName[1];
+        }
+        else
+            throw new TypeError();//TODO: add message
+    }
+    else
+        tableName = fieldOrTableName;
+    
+    if (typeof(columnName) != "string")
+        throw new TypeError();//TODO: add message
+    if (typeof(tableName) != "string")
+        throw new TypeError();//TODO: add message
+    
+    if (alias == undefined)
+        alias = db.getCurrentAlias();
+    
+    return db.getColumnTypes(tableName, [columnName], alias)[0];
+}
+
 /**
  *Class containing utilities for SQL
  *@deprecated use SqlMaskingUtils