diff --git a/application/_____SYSTEM_APPLICATION_NEON/_____SYSTEM_APPLICATION_NEON.aod b/application/_____SYSTEM_APPLICATION_NEON/_____SYSTEM_APPLICATION_NEON.aod
index 149a5b63e8c60f220a8b802f4c9bea8b2ef8be0e..410fe391ef714edad68ea6ccc50ee2e9466eac7d 100644
--- a/application/_____SYSTEM_APPLICATION_NEON/_____SYSTEM_APPLICATION_NEON.aod
+++ b/application/_____SYSTEM_APPLICATION_NEON/_____SYSTEM_APPLICATION_NEON.aod
@@ -61,6 +61,14 @@
                 <name>Salesproject</name>
                 <kind v="10077" />
               </entityNode>
+              <entityNode>
+                <name>Offer</name>
+                <kind v="10077" />
+              </entityNode>
+              <entityNode>
+                <name>Order</name>
+                <kind v="10077" />
+              </entityNode>
               <entityNode>
                 <name>PROJECT_FieldStaff</name>
                 <kind v="159" />
@@ -72,20 +80,17 @@
                 <title></title>
               </entityNode>
               <entityNode>
-                <name>Offer</name>
-                <kind v="10077" />
-              </entityNode>
-              <entityNode>
-                <name>Order</name>
+                <name>Contract</name>
                 <kind v="10077" />
               </entityNode>
               <entityNode>
-                <name>Contract</name>
+                <name>Product</name>
                 <kind v="10077" />
               </entityNode>
               <entityNode>
-                <name>Product</name>
+                <name>Productprice</name>
                 <kind v="10077" />
+                <title></title>
               </entityNode>
             </childNodes>
           </entityNode>
diff --git a/entity/Address_entity/conditionProcess.js b/entity/Address_entity/conditionProcess.js
index 029bece9162d3a87ea09053626efcef906a8d9ef..fccfe75da2c5adf71d2f3fdbed4695f49ec76ea6 100644
--- a/entity/Address_entity/conditionProcess.js
+++ b/entity/Address_entity/conditionProcess.js
@@ -1,7 +1,7 @@
 import("system.result");
 import("system.vars");
 
-if(vars.exists("$param.ContactId_param") && vars.get("$param.ContactId_param") != null && vars.get("$param.ContactId_param") != "")
+if (vars.exists("$param.ContactId_param") && vars.get("$param.ContactId_param"))
     result.string("ADDRESS.CONTACT_ID = ('" + vars.getString("$param.ContactId_param") + "')");  
 else
-    result.string("1 = 1");  
+    result.string("1=1");  
diff --git a/entity/AttributeUsage_entity/recordcontainers/db/conditionProcess.js b/entity/AttributeUsage_entity/recordcontainers/db/conditionProcess.js
index 03fa933bbc75f782259828e7771b24d8912ef0a5..f28818dcfa611f2cdae014095414c5ce2383a129 100644
--- a/entity/AttributeUsage_entity/recordcontainers/db/conditionProcess.js
+++ b/entity/AttributeUsage_entity/recordcontainers/db/conditionProcess.js
@@ -1,7 +1,7 @@
 import("system.result");
 import("system.vars");
 
-if(vars.exists("$param.AttributeId_param") && vars.get("$param.AttributeId_param") != null)
+if(vars.exists("$param.AttributeId_param") && vars.get("$param.AttributeId_param"))
     result.string("AB_ATTRIBUTEUSAGE.AB_ATTRIBUTE_ID = ('" + vars.getString("$param.AttributeId_param") + "')");  
 else
     result.string("1 = 2");  
\ No newline at end of file
diff --git a/entity/KeywordEntry_entity/KeywordEntry_entity.aod b/entity/KeywordEntry_entity/KeywordEntry_entity.aod
index 1025fac61468df0ad65685eb86187d6c530a0c83..609c83dc2e21531d13805b6f92948158f2e0632c 100644
--- a/entity/KeywordEntry_entity/KeywordEntry_entity.aod
+++ b/entity/KeywordEntry_entity/KeywordEntry_entity.aod
@@ -475,7 +475,7 @@
           <fieldName>KeywordGuarantee</fieldName>
           <isConsumer v="false" />
         </entityDependency>
-         <entityDependency>
+        <entityDependency>
           <name>2443c7e3-9e66-41dc-99c7-3283e9315000</name>
           <entityName>Campaign_entity</entityName>
           <fieldName>KeywordCurrency</fieldName>
@@ -530,6 +530,7 @@
     </entityParameter>
     <entityConsumer>
       <name>KeywordAttributeRelations</name>
+      <onValidation>%aditoprj%/entity/KeywordEntry_entity/entityfields/keywordattributerelations/onValidation.js</onValidation>
       <dependency>
         <name>dependency</name>
         <entityName>KeywordAttributeRelation_entity</entityName>
@@ -543,22 +544,6 @@
         </entityParameter>
       </children>
     </entityConsumer>
-    <entityConsumer>
-      <name>KeywordAttributeRelationsReadOnly</name>
-      <documentation>%aditoprj%/entity/KeywordEntry_entity/entityfields/keywordattributerelationsreadonly/documentation.adoc</documentation>
-      <state>READONLY</state>
-      <dependency>
-        <name>dependency</name>
-        <entityName>KeywordAttributeRelation_entity</entityName>
-        <fieldName>AttributesForKeywordEntry</fieldName>
-      </dependency>
-      <children>
-        <entityParameter>
-          <name>KeywordEntryId_param</name>
-          <valueProcess>%aditoprj%/entity/KeywordEntry_entity/entityfields/keywordattributerelationsreadonly/children/keywordentryid_param/valueProcess.js</valueProcess>
-        </entityParameter>
-      </children>
-    </entityConsumer>
     <entityParameter>
       <name>ExcludedKeyIdsSubquery_param</name>
       <expose v="true" />
diff --git a/entity/KeywordEntry_entity/entityfields/keywordattributerelations/onValidation.js b/entity/KeywordEntry_entity/entityfields/keywordattributerelations/onValidation.js
new file mode 100644
index 0000000000000000000000000000000000000000..ff0553af7e4a904edf8807108c2c417aadd12adb
--- /dev/null
+++ b/entity/KeywordEntry_entity/entityfields/keywordattributerelations/onValidation.js
@@ -0,0 +1,82 @@
+import("system.translate");
+import("system.result");
+import("system.vars");
+import("Sql_lib");
+import("system.db");
+
+if (!_areUnique())
+    result.string(translate.text("Attributes must be unique!"));
+
+function _areUnique ()
+{
+    var insertedRows = vars.get("$field.KeywordAttributeRelations.insertedRows");
+    var changedRows = vars.get("$field.KeywordAttributeRelations.changedRows");
+    var deletedRows = vars.get("$field.KeywordAttributeRelations.deletedRows");
+
+    var storedRows = db.table(SqlCondition.begin()
+        .andPrepare("AB_KEYWORD_ATTRIBUTERELATION.AB_KEYWORD_ENTRY_ID", vars.get("$field.AB_KEYWORD_ENTRYID"))
+        .buildSql("select AB_KEYWORD_ATTRIBUTERELATIONID, AB_KEYWORD_ATTRIBUTE_ID from AB_KEYWORD_ATTRIBUTERELATION"));
+    
+    var attributeChanges = {};
+
+    if (deletedRows)
+        deletedRows.forEach(function (row)
+        {
+            this[row.AB_KEYWORD_ATTRIBUTERELATIONID] = "";
+        }, attributeChanges);
+    
+    if (changedRows)
+        changedRows.forEach(function (row)
+        {
+            this[row.AB_KEYWORD_ATTRIBUTERELATIONID] = row.AB_KEYWORD_ATTRIBUTE_ID;
+        }, attributeChanges);
+    
+    var countObj = {};
+
+    storedRows.forEach(function ([storedAttrRelationId, storedAttributeId]) {
+        var currentAttributeId = storedAttributeId;
+        //merging the data that is stored in the DB and the provided changes
+        if (attributeChanges && storedAttrRelationId in attributeChanges)
+            currentAttributeId = attributeChanges[storedAttrRelationId];
+        
+        // it doesn't matter if a row has been deleted or if the attribute has been set to "nothing"
+        if (currentAttributeId == "")
+            _decrCount(storedAttributeId);
+        else
+        {
+            _incrCount(currentAttributeId);
+            if (currentAttributeId != storedAttributeId)
+                _decrCount(storedAttributeId);
+        }
+    });
+    
+    if (insertedRows) //append the new rows
+    {
+        insertedRows.forEach(function (row)
+        {
+            this[row.AB_KEYWORD_ATTRIBUTE_ID] = (this[row.AB_KEYWORD_ATTRIBUTE_ID] || 0) + 1;
+        }, countObj);
+    }
+    
+    for (let id in countObj)
+        if (countObj[id] > 1)
+            return false;
+    
+    return true;
+
+    function _incrCount (pAttributeId)
+    {
+        if (countObj[pAttributeId])
+            countObj[pAttributeId]++;
+        else
+            countObj[pAttributeId] = 1;
+    }
+    
+    function _decrCount (pAttributeId)
+    {
+        if (countObj[pAttributeId])
+            countObj[pAttributeId]--;
+        else
+            countObj[pAttributeId] = 0;
+    }
+}
diff --git a/entity/KeywordEntry_entity/entityfields/keywordattributerelationsreadonly/children/keywordentryid_param/valueProcess.js b/entity/KeywordEntry_entity/entityfields/keywordattributerelationsreadonly/children/keywordentryid_param/valueProcess.js
deleted file mode 100644
index 53afbdfbbfe9044ca0a5af0984365d6b2ee5bdba..0000000000000000000000000000000000000000
--- a/entity/KeywordEntry_entity/entityfields/keywordattributerelationsreadonly/children/keywordentryid_param/valueProcess.js
+++ /dev/null
@@ -1,4 +0,0 @@
-import("system.vars");
-import("system.result");
-
-result.string(vars.get("$field.AB_KEYWORD_ENTRYID"));
\ No newline at end of file
diff --git a/entity/KeywordEntry_entity/entityfields/keywordattributerelationsreadonly/documentation.adoc b/entity/KeywordEntry_entity/entityfields/keywordattributerelationsreadonly/documentation.adoc
deleted file mode 100644
index 99874edc30d1b8340662c802a9b2b4ef1da0fcdd..0000000000000000000000000000000000000000
--- a/entity/KeywordEntry_entity/entityfields/keywordattributerelationsreadonly/documentation.adoc
+++ /dev/null
@@ -1,2 +0,0 @@
-Since it's not possible to limit the keywordAttributeRelation to a distinctive list (use a KeywordAttributeRelation "category" only once per keyowrd-entry) within the generic-multiple-template / titledList-template use this readonly consumer there.
-For editing use the not-read-only consumer in a list-template. In a list-template only one row can be changed (and stored) which means we can exlucde already stored entries.
\ No newline at end of file
diff --git a/entity/Offer_entity/entityfields/contact_id/onValueChange.js b/entity/Offer_entity/entityfields/contact_id/onValueChange.js
index ae48412049aaa2dcb6dd2d2b7d64e5cc3b25c0fa..15006677e0cc2ec6dd0ffd120b1b14916637ec69 100644
--- a/entity/Offer_entity/entityfields/contact_id/onValueChange.js
+++ b/entity/Offer_entity/entityfields/contact_id/onValueChange.js
@@ -1,3 +1,4 @@
+import("Sql_lib");
 import("system.neon");
 import("system.vars");
 import("system.db");
@@ -9,9 +10,11 @@ var contactid = vars.get("local.value");
 if(contactid != "")
 {
     //Language Preset
-    var relData = db.array(db.ROW, "select ISOLANGUAGE from CONTACT where CONTACTID = '" + contactid + "'");
-    if(relData[0] != "") 
-        neon.setFieldValue("field.ISOLANGUAGE", relData[0]);
+    var lang = db.cell(SqlCondition.begin()
+        .andPrepare("CONTACT.CONTACTID", contactid)
+        .buildSql("select ISOLANGUAGE from CONTACT"));
+    if(lang != "") 
+        neon.setFieldValue("field.ISOLANGUAGE", lang);
     
     // set $field.CONTATCT_ORG_ID per contactid
     var orgid = ContactUtils.getPersOrgIds(contactid);
diff --git a/entity/Offer_entity/entityfields/contact_id/valueProcess.js b/entity/Offer_entity/entityfields/contact_id/valueProcess.js
index ae70dd9d53d436e3a989d138c46c5f78c7fa1621..ca10ffff0e5c7db64b8e1602cfc4006252747100 100644
--- a/entity/Offer_entity/entityfields/contact_id/valueProcess.js
+++ b/entity/Offer_entity/entityfields/contact_id/valueProcess.js
@@ -20,10 +20,12 @@ if ((!vars.exists("$param.ContactId_param") || !vars.get("$param.ContactId_param
 
 if (contactId) 
 {
-    var relData = db.array(db.ROW, "select ISOLANGUAGE from CONTACT where CONTACTID = '" + contactId + "'");
+    var lang = db.cell(SqlCondition.begin()
+        .andPrepare("CONTACT.CONTACTID", contactid)
+        .buildSql("select ISOLANGUAGE from CONTACT"));
 
-    if(relData[0] != "") 
-        neon.setFieldValue("field.ISOLANGUAGE", relData[0]);
+    if(lang != "") 
+        neon.setFieldValue("field.ISOLANGUAGE", lang);
     
     result.string(contactId);
 }
\ No newline at end of file
diff --git a/entity/Offer_entity/entityfields/footer/valueProcess.js b/entity/Offer_entity/entityfields/footer/valueProcess.js
index 002d6afd22e0e8bede80b076b0c08bda6d3cb458..192565648a52934053446ebc48e07722713ffcb2 100644
--- a/entity/Offer_entity/entityfields/footer/valueProcess.js
+++ b/entity/Offer_entity/entityfields/footer/valueProcess.js
@@ -12,10 +12,12 @@ else if(vars.get("$this.value"))
     result.string(vars.get("$this.value"));
 
 else if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW)
-    result.string("Vielen Dank!")
+    result.string("Vielen Dank!"); //TODO: translate
 
 if (vars.get("$field.ChoosenTEXFooter") != "")
 {
-    var binaryId      = db.cell("select ID from ASYS_BINARIES where ROW_ID = '" + vars.get("$field.ChoosenTEXFooter") + "'", SqlUtils.getSystemAlias());
+    var binaryId = db.cell(SqlCondition.begin()
+        .andPrepareVars("ASYS_BINARIES.ROW_ID", "$field.ChoosenTEXFooter")
+        .buildSql("select ID from ASYS_BINARIES"), SqlUtils.getSystemAlias());
     result.string(util.decodeBase64String(db.getBinaryContent(binaryId, SqlUtils.getSystemAlias())));
 }
\ No newline at end of file
diff --git a/entity/Offer_entity/entityfields/header/valueProcess.js b/entity/Offer_entity/entityfields/header/valueProcess.js
index a271b33322c83b7cd69b4fd90a81b4fe3174467e..5ebdc79fc02cf4b23a7c4e478d2a3d6055b630f2 100644
--- a/entity/Offer_entity/entityfields/header/valueProcess.js
+++ b/entity/Offer_entity/entityfields/header/valueProcess.js
@@ -1,3 +1,4 @@
+import("Sql_lib");
 import("system.logging");
 import("system.result");
 import("system.vars");
@@ -12,11 +13,12 @@ else if(vars.get("$this.value"))
     result.string(vars.get("$this.value"));
 
 else if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW)
-    result.string("Gerne bieten wir Ihnen wie folgt an:")
+    result.string("Gerne bieten wir Ihnen wie folgt an:"); //TODO: translate
 
 if (vars.get("$field.ChoosenTEXHeader") != "")
 {
-    var binaryId      = db.cell("select ID from ASYS_BINARIES where ROW_ID = '" + vars.get("$field.ChoosenTEXHeader") + "'", "_____SYSTEMALIAS");
-    logging.log(binaryId);
-    result.string(util.decodeBase64String(db.getBinaryContent(binaryId, "_____SYSTEMALIAS")));
+    var binaryId = db.cell(SqlCondition.begin()
+        .andPrepareVars("ASYS_BINARIES.ROW_ID", "$field.ChoosenTEXHeader")
+        .buildSql("select ID from ASYS_BINARIES"), SqlUtils.getSystemAlias());
+    result.string(util.decodeBase64String(db.getBinaryContent(binaryId, SqlUtils.getSystemAlias())));
 }
\ No newline at end of file
diff --git a/entity/Offer_entity/onDBDelete.js b/entity/Offer_entity/onDBDelete.js
index c69fde6a9281b91ef88556c006165b009a8fcb4c..5c36082b9691235f56ae00de76af5eca4d528c14 100644
--- a/entity/Offer_entity/onDBDelete.js
+++ b/entity/Offer_entity/onDBDelete.js
@@ -1,4 +1,5 @@
+import("Sql_lib");
 import("system.vars");
 import("system.db");
 
-db.deleteData("OFFERITEM", "OFFERITEM.OFFER_ID = '" + vars.getString("$field.OFFERID") + "'");
\ No newline at end of file
+db.deleteData("OFFERITEM", SqlCondition.equals("OFFERITEM.OFFER_ID", vars.getString("$field.OFFERID"), "1=2"));
\ No newline at end of file
diff --git a/entity/Offer_entity/recordcontainers/db/onDBDelete.js b/entity/Offer_entity/recordcontainers/db/onDBDelete.js
index c69fde6a9281b91ef88556c006165b009a8fcb4c..5c36082b9691235f56ae00de76af5eca4d528c14 100644
--- a/entity/Offer_entity/recordcontainers/db/onDBDelete.js
+++ b/entity/Offer_entity/recordcontainers/db/onDBDelete.js
@@ -1,4 +1,5 @@
+import("Sql_lib");
 import("system.vars");
 import("system.db");
 
-db.deleteData("OFFERITEM", "OFFERITEM.OFFER_ID = '" + vars.getString("$field.OFFERID") + "'");
\ No newline at end of file
+db.deleteData("OFFERITEM", SqlCondition.equals("OFFERITEM.OFFER_ID", vars.getString("$field.OFFERID"), "1=2"));
\ No newline at end of file
diff --git a/entity/Order_entity/entityfields/footer/valueProcess.js b/entity/Order_entity/entityfields/footer/valueProcess.js
index a57f0c325bb04abbb9c14d6bc7deda65f75ab9ae..da93ce5f2efc0488c2259f82b3b5c783337a7375 100644
--- a/entity/Order_entity/entityfields/footer/valueProcess.js
+++ b/entity/Order_entity/entityfields/footer/valueProcess.js
@@ -1,3 +1,4 @@
+import("Sql_lib");
 import("system.result");
 import("system.vars");
 import("system.neon");
@@ -6,21 +7,22 @@ import("system.util");
 
 if (vars.get("$this.value") == null)
 {
-if (vars.exists("$param.OrderFooter_param")) 
-{
-    result.string(vars.get("$param.OrderFooter_param"));
-}
-
+    if (vars.exists("$param.OrderFooter_param")) 
+    {
+        result.string(vars.get("$param.OrderFooter_param"));
+    }
 
-else if(vars.get("$this.value"))
-    result.string(vars.get("$this.value"));
+    else if(vars.get("$this.value"))
+        result.string(vars.get("$this.value"));
 
-else if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW)
-    result.string("Danke sehr:")
+    else if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW)
+        result.string("Danke sehr:"); //TODO: translate
 
-if (vars.get("$field.ChosenTexFooter") != "")
-{
-    var binaryId      = db.cell("select ID from ASYS_BINARIES where ROW_ID = '" + vars.get("$field.ChosenTexFooter") + "'", "_____SYSTEMALIAS");
-    result.string(util.decodeBase64String(db.getBinaryContent(binaryId, "_____SYSTEMALIAS")));
-}
+    if (vars.get("$field.ChosenTexFooter") != "")
+    {
+        var binaryId = db.cell(SqlCondition.begin()
+            .andPrepareVars("ASYS_BINARIES.ROW_ID", "$field.ChosenTexFooter")
+            .buildSql("select ID from ASYS_BINARIES"), SqlUtils.getSystemAlias());
+        result.string(util.decodeBase64String(db.getBinaryContent(binaryId, SqlUtils.getSystemAlias())));
+    }
 }
\ No newline at end of file
diff --git a/entity/Order_entity/entityfields/header/valueProcess.js b/entity/Order_entity/entityfields/header/valueProcess.js
index 35a345fc953a6cbd4906c73374b69c554e505aff..038bf931e38f6a3ea50e99194e5da823d96a9fd6 100644
--- a/entity/Order_entity/entityfields/header/valueProcess.js
+++ b/entity/Order_entity/entityfields/header/valueProcess.js
@@ -1,3 +1,4 @@
+import("Sql_lib");
 import("system.result");
 import("system.vars");
 import("system.neon");
@@ -6,18 +7,20 @@ import("system.util");
 
 if (vars.get("$this.value") == null)
 {
-if(vars.exists("$param.OrderHeader_param") && vars.get("$param.OrderHeader_param")) 
-    result.string(vars.get("$param.OrderHeader_param"));
+    if(vars.exists("$param.OrderHeader_param") && vars.get("$param.OrderHeader_param")) 
+        result.string(vars.get("$param.OrderHeader_param"));
 
-else if(vars.get("$this.value"))
-    result.string(vars.get("$this.value"));
+    else if(vars.get("$this.value"))
+        result.string(vars.get("$this.value"));
 
-else if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW)
-    result.string("Gerne bieten wir Ihnen wie folgt an:")
+    else if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW)
+        result.string("Gerne bieten wir Ihnen wie folgt an:"); //TODO: translation
 
-if (vars.get("$field.ChosenTexHeader") != "")
-{
-    var binaryId      = db.cell("select ID from ASYS_BINARIES where ROW_ID = '" + vars.get("$field.ChosenTexHeader") + "'", "_____SYSTEMALIAS");
-    result.string(util.decodeBase64String(db.getBinaryContent(binaryId, "_____SYSTEMALIAS")));
-}
+    if (vars.get("$field.ChosenTexHeader") != "")
+    {
+        var binaryId = db.cell(SqlCondition.begin()
+            .andPrepareVars("ASYS_BINARIES.ROW_ID", "$field.ChosenTexHeader")
+            .buildSql("select ID from ASYS_BINARIES"), SqlUtils.getSystemAlias());
+        result.string(util.decodeBase64String(db.getBinaryContent(binaryId, SqlUtils.getSystemAlias())));
+    }
 }
\ No newline at end of file
diff --git a/entity/Productprice_entity/Productprice_entity.aod b/entity/Productprice_entity/Productprice_entity.aod
index 9aff525cbe0da3f68ee53d578251adfa679a21d1..7f12819dac5c3456db46f3d21d2dbdc9e631f171 100644
--- a/entity/Productprice_entity/Productprice_entity.aod
+++ b/entity/Productprice_entity/Productprice_entity.aod
@@ -3,6 +3,7 @@
   <name>Productprice_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <documentation>%aditoprj%/entity/Productprice_entity/documentation.adoc</documentation>
+  <icon>VAADIN:MONEY</icon>
   <title>Prices</title>
   <siblings>
     <element>Product_entity</element>
diff --git a/entity/Productprice_entity/entityfields/product_id/stateProcess.js b/entity/Productprice_entity/entityfields/product_id/stateProcess.js
index 07518244a575e451e071fc07387960724911c5e3..ced938f5f37658b7dbf70ee82013020b1e3a0328 100644
--- a/entity/Productprice_entity/entityfields/product_id/stateProcess.js
+++ b/entity/Productprice_entity/entityfields/product_id/stateProcess.js
@@ -2,11 +2,7 @@ import("system.vars");
 import("system.result");
 import("system.neon");
 
-if(vars.exists("$param.ProductId_param") && vars.get("$param.ProductId_param"))
-{
-    result.string(neon.COMPONENTSTATE_DISABLED);
-}
+if (vars.exists("$param.ProductId_param") && vars.get("$param.ProductId_param"))
+    result.string(neon.COMPONENTSTATE_READONLY);
 else
-{
-    result.string(neon.COMPONENTSTATE_AUTO);
-}
\ No newline at end of file
+    result.string(neon.COMPONENTSTATE_AUTO);
\ No newline at end of file
diff --git a/entity/Productprice_entity/recordcontainers/db/orderClauseProcess.js b/entity/Productprice_entity/recordcontainers/db/orderClauseProcess.js
index 9fd0aad5a4bce2f8f7f5ca713d35f79bc1b9a7ec..4fd74ea4b6fff396197bed7a63ad854e7b3021b7 100644
--- a/entity/Productprice_entity/recordcontainers/db/orderClauseProcess.js
+++ b/entity/Productprice_entity/recordcontainers/db/orderClauseProcess.js
@@ -1,3 +1,4 @@
+import("system.db");
 import("system.result");
 
-result.object({"PRODUCTPRICE.VALID_FROM": "down"});
\ No newline at end of file
+result.object({"PRODUCTPRICE.VALID_FROM": db.DESCENDING});
\ No newline at end of file
diff --git a/language/_____LANGUAGE_de/_____LANGUAGE_de.aod b/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
index 91644104f7cc8a70d51a24d3184ce1febf78ed43..59bc632c9c90132aea4e1255f88d74da873f9a8b 100644
--- a/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
+++ b/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
@@ -6400,6 +6400,144 @@
     <entry>
       <key>This error should never appear - contact administrator.</key>
     </entry>
+    <entry>
+      <key>Reminder</key>
+    </entry>
+    <entry>
+      <key>versendet</key>
+    </entry>
+    <entry>
+      <key>Netto</key>
+    </entry>
+    <entry>
+      <key>Only </key>
+    </entry>
+    <entry>
+      <key>Währung</key>
+    </entry>
+    <entry>
+      <key>Transfer to Invoice</key>
+    </entry>
+    <entry>
+      <key>Pay due date</key>
+    </entry>
+    <entry>
+      <key>No duplicates allowed: action '</key>
+    </entry>
+    <entry>
+      <key>Payment address</key>
+    </entry>
+    <entry>
+      <key>Texts</key>
+    </entry>
+    <entry>
+      <key>Print reminder</key>
+    </entry>
+    <entry>
+      <key>keine Standard-E-Mail Büro vorhanden !</key>
+    </entry>
+    <entry>
+      <key>Rech.-Betrag</key>
+    </entry>
+    <entry>
+      <key>Order date</key>
+    </entry>
+    <entry>
+      <key>Due date</key>
+    </entry>
+    <entry>
+      <key>Order amount</key>
+    </entry>
+    <entry>
+      <key>Belegdatum</key>
+    </entry>
+    <entry>
+      <key>Firma</key>
+    </entry>
+    <entry>
+      <key>Choose payment address</key>
+    </entry>
+    <entry>
+      <key>Adds the selection to a bulk mail</key>
+    </entry>
+    <entry>
+      <key>Order number</key>
+    </entry>
+    <entry>
+      <key>Paid</key>
+    </entry>
+    <entry>
+      <key>Empty actions are not allowed!</key>
+    </entry>
+    <entry>
+      <key>Dunning level</key>
+    </entry>
+    <entry>
+      <key>Print order</key>
+    </entry>
+    <entry>
+      <key>Beleg</key>
+    </entry>
+    <entry>
+      <key>Order Type</key>
+    </entry>
+    <entry>
+      <key>Notice</key>
+    </entry>
+    <entry>
+      <key>Bitte einen Adressat in 'to' eintragen!</key>
+    </entry>
+    <entry>
+      <key>Dunning text</key>
+    </entry>
+    <entry>
+      <key>Choose delivery address</key>
+    </entry>
+    <entry>
+      <key>Links</key>
+    </entry>
+    <entry>
+      <key>geprüft</key>
+    </entry>
+    <entry>
+      <key>Mahnung</key>
+    </entry>
+    <entry>
+      <key>Set dunning</key>
+    </entry>
+    <entry>
+      <key>Beleg-Nr.</key>
+    </entry>
+    <entry>
+      <key>Adds the selection to a serial letter</key>
+    </entry>
+    <entry>
+      <key>Cancel</key>
+    </entry>
+    <entry>
+      <key>Set to sent</key>
+    </entry>
+    <entry>
+      <key>Due</key>
+    </entry>
+    <entry>
+      <key>Set paid amount</key>
+    </entry>
+    <entry>
+      <key>Belegliste</key>
+    </entry>
+    <entry>
+      <key>Pay date</key>
+    </entry>
+    <entry>
+      <key>This error should never appear - contact administrator.</key>
+    </entry>
+    <entry>
+      <key>Transfer to delivery note</key>
+    </entry>
+    <entry>
+      <key>Dunning date</key>
+    </entry>
   </keyValueMap>
   <font name="Dialog" style="0" size="11" />
 </language>
diff --git a/neonContext/Productprice/Productprice.aod b/neonContext/Productprice/Productprice.aod
index 705012cef4192bf010547b88fdacc2242bf92dd7..52e0c4aa761b241c4a0a17410e29554faf3d3666 100644
--- a/neonContext/Productprice/Productprice.aod
+++ b/neonContext/Productprice/Productprice.aod
@@ -2,6 +2,7 @@
 <neonContext xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.0" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonContext/1.1.0">
   <name>Productprice</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
+  <icon>VAADIN:MONEY</icon>
   <filterview>ProductpriceFilter_view</filterview>
   <editview>ProductpriceEdit_view</editview>
   <preview>ProductpricePreview_view</preview>
@@ -23,5 +24,9 @@
       <name>590ab927-5303-451b-824a-c16adfb00772</name>
       <view>ProductpricePreview_view</view>
     </neonViewReference>
+    <neonViewReference>
+      <name>ff71c944-42f4-46ff-bb61-2b7205609a49</name>
+      <view>ProductpriceForProductFilter_view</view>
+    </neonViewReference>
   </references>
 </neonContext>
diff --git a/neonView/ProductMain_view/ProductMain_view.aod b/neonView/ProductMain_view/ProductMain_view.aod
index ba7678cf434ca2dd7a5cfc4d885fa1ebc74f7e49..205b0e34998d8922727c490b284c2076fc516675 100644
--- a/neonView/ProductMain_view/ProductMain_view.aod
+++ b/neonView/ProductMain_view/ProductMain_view.aod
@@ -37,7 +37,7 @@
     <neonViewReference>
       <name>11c4c5a0-27fa-4748-a6c6-3a667d2f3d8f</name>
       <entityField>Productprices</entityField>
-      <view>ProductpriceFilter_view</view>
+      <view>ProductpriceForProductFilter_view</view>
     </neonViewReference>
     <neonViewReference>
       <name>616f7cc3-93e7-41ee-8d38-027dd3d4b299</name>
diff --git a/neonView/ProductpriceFilter_view/ProductpriceFilter_view.aod b/neonView/ProductpriceFilter_view/ProductpriceFilter_view.aod
index dfbf07b3a8b7c4983f20aba29880854e5c266158..ba9818dfc76cf8ad7dc0e7dea06c58374a599692 100644
--- a/neonView/ProductpriceFilter_view/ProductpriceFilter_view.aod
+++ b/neonView/ProductpriceFilter_view/ProductpriceFilter_view.aod
@@ -17,6 +17,10 @@
           <name>44311686-a24a-4cf0-87a0-6e354b3f457a</name>
           <entityField>IMAGE</entityField>
         </neonTableColumn>
+        <neonTableColumn>
+          <name>c97a0ba1-90de-4dd9-b917-c474b4de0f8e</name>
+          <entityField>PRODUCT_ID</entityField>
+        </neonTableColumn>
         <neonTableColumn>
           <name>695ce7be-d738-48a9-833d-e8815c6eff74</name>
           <entityField>PRICELIST</entityField>
@@ -48,6 +52,7 @@
         <neonTableColumn>
           <name>981f29b1-b4c5-4591-8064-21a72f339179</name>
           <entityField>VAT</entityField>
+          <collapse v="false" />
         </neonTableColumn>
       </columns>
     </tableViewTemplate>
diff --git a/neonView/ProductpriceForProductFilter_view/ProductpriceForProductFilter_view.aod b/neonView/ProductpriceForProductFilter_view/ProductpriceForProductFilter_view.aod
new file mode 100644
index 0000000000000000000000000000000000000000..52af81ef82c88c1f695981bccad2e221b9c85a5f
--- /dev/null
+++ b/neonView/ProductpriceForProductFilter_view/ProductpriceForProductFilter_view.aod
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.2">
+  <name>ProductpriceForProductFilter_view</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <filterable v="true" />
+  <layout>
+    <boxLayout>
+      <name>layout</name>
+    </boxLayout>
+  </layout>
+  <children>
+    <tableViewTemplate>
+      <name>Table</name>
+      <entityField>#ENTITY</entityField>
+      <columns>
+        <neonTableColumn>
+          <name>05bed0da-33f6-483a-b7d8-82ff4ef573f1</name>
+          <entityField>IMAGE</entityField>
+        </neonTableColumn>
+        <neonTableColumn>
+          <name>83216e42-ad22-40d7-b01e-fccc940af44c</name>
+          <entityField>PRICELIST</entityField>
+        </neonTableColumn>
+        <neonTableColumn>
+          <name>c1211cf5-ad9b-43ef-9ce5-ab93f01eb5c9</name>
+          <entityField>VALID_FROM</entityField>
+        </neonTableColumn>
+        <neonTableColumn>
+          <name>35e5daad-a34a-45f9-a81e-dc6b654184df</name>
+          <entityField>VALID_TO</entityField>
+        </neonTableColumn>
+        <neonTableColumn>
+          <name>b14d91ad-bfc0-4c18-b447-8c8e7568a600</name>
+          <entityField>PRICE</entityField>
+        </neonTableColumn>
+        <neonTableColumn>
+          <name>f5f43936-fa42-46a7-b152-e5a8fa0228c9</name>
+          <entityField>CURRENCY</entityField>
+        </neonTableColumn>
+        <neonTableColumn>
+          <name>16bcb0f7-6dd5-449b-830d-0eef6c11a600</name>
+          <entityField>BUYSELL</entityField>
+        </neonTableColumn>
+        <neonTableColumn>
+          <name>bce5ad39-9325-4582-a34b-908b40b69762</name>
+          <entityField>FROMQUANTITY</entityField>
+        </neonTableColumn>
+        <neonTableColumn>
+          <name>6e6d8582-08d0-464d-9632-f21a205de661</name>
+          <entityField>VAT</entityField>
+        </neonTableColumn>
+      </columns>
+    </tableViewTemplate>
+  </children>
+</neonView>
diff --git a/neonView/ProductpricePreview_view/ProductpricePreview_view.aod b/neonView/ProductpricePreview_view/ProductpricePreview_view.aod
index d1b78476afeb57aa906210ff9c35195e0fd14bde..b5039c392066e51b42601d3dcca9df5d352a3ea3 100644
--- a/neonView/ProductpricePreview_view/ProductpricePreview_view.aod
+++ b/neonView/ProductpricePreview_view/ProductpricePreview_view.aod
@@ -11,6 +11,7 @@
   <children>
     <genericViewTemplate>
       <name>PriceInfo</name>
+      <showDrawer v="true" />
       <entityField>#ENTITY</entityField>
       <fields>
         <entityFieldLink>
@@ -46,9 +47,9 @@
     <cardViewTemplate>
       <name>Header</name>
       <iconField>IMAGE</iconField>
-      <titleField>PRODUCT_ID</titleField>
+      <titleField>PRICELIST</titleField>
+      <subtitleField>PRODUCT_ID</subtitleField>
       <entityField>#ENTITY</entityField>
-      <informationField>PRICELIST</informationField>
     </cardViewTemplate>
   </children>
 </neonView>