diff --git a/.liquibase/Data_alias/basic/2021.2.0/changelog.xml b/.liquibase/Data_alias/basic/2021.2.0/changelog.xml
index 6cf5d524b1420157e979a3d41c742b3f3e586a6d..e45780f3a8c5af0b7c44f1ac39841430fe1a3feb 100644
--- a/.liquibase/Data_alias/basic/2021.2.0/changelog.xml
+++ b/.liquibase/Data_alias/basic/2021.2.0/changelog.xml
@@ -13,4 +13,4 @@
     <include relativeToChangelogFile="true" file="EwsContactSync/changelog.xml"/>
     <include relativeToChangelogFile="true" file="Export/changelog.xml"/>
     <include relativeToChangelogFile="true" file="insert_ProductGroupcode.xml"/>
-</databaseChangeLog>
+</databaseChangeLog>
\ No newline at end of file
diff --git a/.liquibase/Data_alias/basic/2021.2.2/BulkMail/changelog.xml b/.liquibase/Data_alias/basic/2021.2.2/BulkMail/changelog.xml
new file mode 100644
index 0000000000000000000000000000000000000000..1f04bc2b9923e4c127ec5e87d952657c13dd6933
--- /dev/null
+++ b/.liquibase/Data_alias/basic/2021.2.2/BulkMail/changelog.xml
@@ -0,0 +1,6 @@
+<?xml version="1.1" encoding="UTF-8" standalone="no"?>
+<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd">
+    <include relativeToChangelogFile="true" file="insertBulkMailSenderAddressKeyword.xml"/>
+</databaseChangeLog>
\ No newline at end of file
diff --git a/.liquibase/Data_alias/basic/2021.2.2/BulkMail/insertBulkMailSenderAddressKeyword.xml b/.liquibase/Data_alias/basic/2021.2.2/BulkMail/insertBulkMailSenderAddressKeyword.xml
new file mode 100644
index 0000000000000000000000000000000000000000..0fc18b63a15ed14e6486279434c15da61ad7cc5f
--- /dev/null
+++ b/.liquibase/Data_alias/basic/2021.2.2/BulkMail/insertBulkMailSenderAddressKeyword.xml
@@ -0,0 +1,24 @@
+<?xml version="1.1" encoding="UTF-8" standalone="no"?>
+<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd">
+  <changeSet author="m.groppe" id="50badea9-da46-4aa0-94ed-a2c3db2874ac">
+        <insert tableName="AB_KEYWORD_CATEGORY">
+            <column name="AB_KEYWORD_CATEGORYID" value="3f31d08d-bf59-4bb7-9e96-7f026571cb79"/>
+            <column name="NAME" value="BulkmailSenderAddress"/>
+            <column name="SORTINGBY" valueNumeric="0"/>
+            <column name="SORTINGDIRECTION" value="ASC"/>
+        </insert>
+
+        <insert tableName="AB_KEYWORD_ENTRY">
+            <column name="AB_KEYWORD_ENTRYID" value="c4773a13-314d-4f00-a7d3-ab65947586ba"/>
+            <column name="KEYID" value="news@adito.de"/>
+            <column name="TITLE" value="news@adito.de"/>
+            <column name="CONTAINER"/>
+            <column name="SORTING" valueNumeric="1"/>
+            <column name="ISACTIVE" valueNumeric="1"/>
+            <column name="ISESSENTIAL" valueNumeric="0"/>
+            <column name="AB_KEYWORD_CATEGORY_ID" value="3f31d08d-bf59-4bb7-9e96-7f026571cb79"/>
+        </insert>
+  </changeSet>
+</databaseChangeLog>
\ No newline at end of file
diff --git a/.liquibase/Data_alias/basic/2021.2.2/Offer/changelog.xml b/.liquibase/Data_alias/basic/2021.2.2/Offer/changelog.xml
new file mode 100644
index 0000000000000000000000000000000000000000..43d3f1056899fb14bc1b977c3a956d5a35346b4a
--- /dev/null
+++ b/.liquibase/Data_alias/basic/2021.2.2/Offer/changelog.xml
@@ -0,0 +1,6 @@
+<?xml version="1.1" encoding="UTF-8" standalone="no"?>
+<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd">
+    <include relativeToChangelogFile="true" file="update_OfferSetZeroProbability.xml"/>
+</databaseChangeLog>
\ No newline at end of file
diff --git a/.liquibase/Data_alias/basic/2021.2.2/Offer/update_OfferSetZeroProbability.xml b/.liquibase/Data_alias/basic/2021.2.2/Offer/update_OfferSetZeroProbability.xml
new file mode 100644
index 0000000000000000000000000000000000000000..c473d075052c034844cc364b734fcb90884efae4
--- /dev/null
+++ b/.liquibase/Data_alias/basic/2021.2.2/Offer/update_OfferSetZeroProbability.xml
@@ -0,0 +1,19 @@
+<?xml version="1.1" encoding="UTF-8" standalone="no"?>
+<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
+                   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd">
+    <changeSet author="b.ulrich" id="02eac203-25b5-480c-a73b-364d1c76d051">
+        <update tableName="OFFER">
+            <column name="PROBABILITY" valueNumeric="0"/>
+            <where>PROBABILITY is null</where>
+        </update>
+        <addDefaultValue 
+            columnDataType="NUMERIC(14,2)"
+            columnName="PROBABILITY"  
+            defaultValueNumeric="0"
+            tableName="OFFER"/>
+        <addNotNullConstraint
+           columnDataType="NUMERIC(14,2)"
+           columnName="PROBABILITY"  
+           tableName="OFFER"/>
+    </changeSet>
+</databaseChangeLog>
\ No newline at end of file
diff --git a/.liquibase/Data_alias/basic/2021.2.2/Offeritem/changelog.xml b/.liquibase/Data_alias/basic/2021.2.2/Offeritem/changelog.xml
new file mode 100644
index 0000000000000000000000000000000000000000..17b59f34cb8941cf482c762276660a4c7099f156
--- /dev/null
+++ b/.liquibase/Data_alias/basic/2021.2.2/Offeritem/changelog.xml
@@ -0,0 +1,6 @@
+<?xml version="1.1" encoding="UTF-8" standalone="no"?>
+<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd">
+    <include relativeToChangelogFile="true" file="update_OfferitemSetZeroDiscount.xml"/>
+</databaseChangeLog>
\ No newline at end of file
diff --git a/.liquibase/Data_alias/basic/2021.2.2/Offeritem/update_OfferitemSetZeroDiscount.xml b/.liquibase/Data_alias/basic/2021.2.2/Offeritem/update_OfferitemSetZeroDiscount.xml
new file mode 100644
index 0000000000000000000000000000000000000000..206cf4f999182c0d71aa169971235c39d0d334ff
--- /dev/null
+++ b/.liquibase/Data_alias/basic/2021.2.2/Offeritem/update_OfferitemSetZeroDiscount.xml
@@ -0,0 +1,19 @@
+<?xml version="1.1" encoding="UTF-8" standalone="no"?>
+<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
+                   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd">
+    <changeSet author="b.ulrich" id="2372c4db-0f58-474a-bb00-71ddd5776ff7">
+        <update tableName="OFFERITEM">
+            <column name="DISCOUNT" valueNumeric="0"/>
+            <where>DISCOUNT is null</where>
+        </update>
+        <addDefaultValue 
+            columnDataType="NUMERIC(14,2)"
+            columnName="DISCOUNT"  
+            defaultValueNumeric="0"
+            tableName="OFFERITEM"/>
+        <addNotNullConstraint
+           columnDataType="NUMERIC(14,2)"
+           columnName="DISCOUNT"  
+           tableName="OFFERITEM"/>
+    </changeSet>
+</databaseChangeLog>
\ No newline at end of file
diff --git a/.liquibase/Data_alias/basic/2021.2.2/Salesorderitem/changelog.xml b/.liquibase/Data_alias/basic/2021.2.2/Salesorderitem/changelog.xml
new file mode 100644
index 0000000000000000000000000000000000000000..e2399a10ecb43adf4f250ceaad663cc85e190084
--- /dev/null
+++ b/.liquibase/Data_alias/basic/2021.2.2/Salesorderitem/changelog.xml
@@ -0,0 +1,6 @@
+<?xml version="1.1" encoding="UTF-8" standalone="no"?>
+<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd">
+    <include relativeToChangelogFile="true" file="update_SalesorderitemSetZeroDiscount.xml"/>
+</databaseChangeLog>
\ No newline at end of file
diff --git a/.liquibase/Data_alias/basic/2021.2.2/Salesorderitem/update_SalesorderitemSetZeroDiscount.xml b/.liquibase/Data_alias/basic/2021.2.2/Salesorderitem/update_SalesorderitemSetZeroDiscount.xml
new file mode 100644
index 0000000000000000000000000000000000000000..f50ad6ccaddfc3e85b4d7f8439acc1d254daac25
--- /dev/null
+++ b/.liquibase/Data_alias/basic/2021.2.2/Salesorderitem/update_SalesorderitemSetZeroDiscount.xml
@@ -0,0 +1,19 @@
+<?xml version="1.1" encoding="UTF-8" standalone="no"?>
+<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
+                   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd">
+    <changeSet author="b.ulrich" id="f1176133-6149-4e3a-a19c-0199c2ea6c00">
+        <update tableName="SALESORDERITEM">
+            <column name="DISCOUNT" valueNumeric="0"/>
+            <where>DISCOUNT is null</where>
+        </update>
+        <addDefaultValue 
+            columnDataType="NUMERIC(14,2)"
+            columnName="DISCOUNT"  
+            defaultValueNumeric="0"
+            tableName="SALESORDERITEM"/>
+        <addNotNullConstraint
+           columnDataType="NUMERIC(14,2)"
+           columnName="DISCOUNT"  
+           tableName="SALESORDERITEM"/>
+    </changeSet>
+</databaseChangeLog>
\ No newline at end of file
diff --git a/.liquibase/Data_alias/basic/2021.2.2/Salesproject/changelog.xml b/.liquibase/Data_alias/basic/2021.2.2/Salesproject/changelog.xml
new file mode 100644
index 0000000000000000000000000000000000000000..be255f7f32e9a0ec54ec66b2dc76f5b5eacccbe1
--- /dev/null
+++ b/.liquibase/Data_alias/basic/2021.2.2/Salesproject/changelog.xml
@@ -0,0 +1,6 @@
+<?xml version="1.1" encoding="UTF-8" standalone="no"?>
+<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd">
+    <include relativeToChangelogFile="true" file="update_SalesprojectSetZeroProbability.xml"/>
+</databaseChangeLog>
\ No newline at end of file
diff --git a/.liquibase/Data_alias/basic/2021.2.2/Salesproject/update_SalesprojectSetZeroProbability.xml b/.liquibase/Data_alias/basic/2021.2.2/Salesproject/update_SalesprojectSetZeroProbability.xml
new file mode 100644
index 0000000000000000000000000000000000000000..ab47beff7163fd059ca3d260ab064c1dbac32f5f
--- /dev/null
+++ b/.liquibase/Data_alias/basic/2021.2.2/Salesproject/update_SalesprojectSetZeroProbability.xml
@@ -0,0 +1,19 @@
+<?xml version="1.1" encoding="UTF-8" standalone="no"?>
+<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
+                   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd">
+    <changeSet author="b.ulrich" id="c32865a9-ed82-44e5-814c-b8953d710e4d">
+        <update tableName="SALESPROJECT">
+            <column name="PROBABILITY" valueNumeric="0"/>
+            <where>PROBABILITY is null</where>
+        </update>
+        <addDefaultValue 
+            columnDataType="DECIMAL(6, 2)"  
+            columnName="PROBABILITY"  
+            defaultValueNumeric="0"
+            tableName="SALESPROJECT"/>
+        <addNotNullConstraint
+           columnDataType="DECIMAL(6, 2)"  
+           columnName="PROBABILITY"  
+            tableName="SALESPROJECT"/>
+    </changeSet>
+</databaseChangeLog>
diff --git a/.liquibase/Data_alias/basic/2021.2.2/changelog.xml b/.liquibase/Data_alias/basic/2021.2.2/changelog.xml
index ef73ebbf3edcee364540b105acc1d112511ff0f1..5da770e16014568be77456b5ef0bb58395d5db51 100644
--- a/.liquibase/Data_alias/basic/2021.2.2/changelog.xml
+++ b/.liquibase/Data_alias/basic/2021.2.2/changelog.xml
@@ -5,12 +5,17 @@
     <include relativeToChangelogFile="true" file="alter_relation-type-title_grandchildof.xml"/>
     <include relativeToChangelogFile="true" file="alter_display-value_task-status-completed_keyword.xml"/>
     <include relativeToChangelogFile="true" file="alter_display-name_prospective-customer.xml"/>
+    <include relativeToChangelogFile="true" file="Offer/changelog.xml"/>
     <include relativeToChangelogFile="true" file="add_offer_showprice.xml"/>
     <include relativeToChangelogFile="true" file="Ticket/changelog.xml"/>
     <include relativeToChangelogFile="true" file="StandardColumns/changelog.xml"/>
     <include relativeToChangelogFile="true" file="Person/changelog.xml"/>
+    <include relativeToChangelogFile="true" file="Offeritem/changelog.xml"/>
+    <include relativeToChangelogFile="true" file="Salesorderitem/changelog.xml"/>
+    <include relativeToChangelogFile="true" file="Salesproject/changelog.xml"/>
     <include relativeToChangelogFile="true" file="Employee/changelog.xml"/>
     <include relativeToChangelogFile="true" file="Mosaico/insert_mosaico_color_keyword.xml"/>
     <include relativeToChangelogFile="true" file="Mailbridge/changelog.xml"/>
     <include relativeToChangelogFile="true" file="OfferOrder/changelog.xml"/>
-</databaseChangeLog>
+    <include relativeToChangelogFile="true" file="BulkMail/changelog.xml"/>
+</databaseChangeLog>
\ No newline at end of file
diff --git a/.liquibase/Data_alias/basic/_demoData/generatedData/offer.xml b/.liquibase/Data_alias/basic/_demoData/generatedData/offer.xml
index d129c2559996f8555a7a63db20ae4fa1bf3856cf..3df9e9fd415d60f98f1e8a2fca811a4966a6a6e2 100644
--- a/.liquibase/Data_alias/basic/_demoData/generatedData/offer.xml
+++ b/.liquibase/Data_alias/basic/_demoData/generatedData/offer.xml
@@ -144,6 +144,7 @@
       <column name="DATE_NEW" valueDate="2019-05-17T08:27:21"/>
       <column name="HEADER" value="gerne bieten wir Ihnen wie folgt an:"/>
       <column name="STATUS" value="OFFERSTATWON"/>
+      <column name="PROBABILITY" valueNumeric="0"/>
     </insert>
     <insert tableName="offer">
       <column name="PAYMENTTERMS" value="PAYTERM7"/>
diff --git a/.liquibase/Data_alias/basic/_demoData/generatedData/offeritem.xml b/.liquibase/Data_alias/basic/_demoData/generatedData/offeritem.xml
index 393b314d4ef6e0f1b0d7c79f591e645f587db6b9..70437cfb1f191cce14b47c762be2dda9fb20f610 100644
--- a/.liquibase/Data_alias/basic/_demoData/generatedData/offeritem.xml
+++ b/.liquibase/Data_alias/basic/_demoData/generatedData/offeritem.xml
@@ -14,6 +14,7 @@
       <column name="ITEMPOSITION" value="1.3"/>
       <column name="UNIT" value="QUANTITYPIECES"/>
       <column name="PRODUCT_ID" value="b973e3f9-277c-4787-96a0-7cac54472420"/>
+      <column name="DISCOUNT" valueNumeric="0"/>
     </insert>
     <insert tableName="offeritem">
       <column name="QUANTITY" valueNumeric="1.00"/>
@@ -27,6 +28,7 @@
       <column name="UNIT" value="QUANTITYPIECES"/>
       <column name="PRICE" valueNumeric="1000.00"/>
       <column name="PRODUCT_ID" value="805cd37f-d6c7-424b-99b0-b3de9ec89f7b"/>
+      <column name="DISCOUNT" valueNumeric="0"/>
     </insert>
     <insert tableName="offeritem">
       <column name="QUANTITY" valueNumeric="10.00"/>
@@ -41,6 +43,7 @@
       <column name="PRICE" valueNumeric="5000.00"/>
       <column name="PRODUCT_ID" value="8cdbd2d8-70e2-4899-9ac6-3f0c3e28cab1"/>
       <column name="INFO" value="Standard Stahlträger mit den Maßen 5m x 0,3m x 0,3m."/>
+      <column name="DISCOUNT" valueNumeric="0"/>
     </insert>
     <insert tableName="offeritem">
       <column name="QUANTITY" valueNumeric="800.00"/>
@@ -55,6 +58,7 @@
       <column name="UNIT" value="QUANTITYHOUR"/>
       <column name="PRICE" valueNumeric="125.00"/>
       <column name="PRODUCT_ID" value="bb897bd1-244b-45cd-8a2f-f5a783cbbbff"/>
+      <column name="DISCOUNT" valueNumeric="0"/>
     </insert>
     <insert tableName="offeritem">
       <column name="QUANTITY" valueNumeric="3600.00"/>
@@ -83,6 +87,7 @@
       <column name="UNIT" value="QUANTITYPIECES"/>
       <column name="PRICE" valueNumeric="3500.00"/>
       <column name="PRODUCT_ID" value="895f8caf-8c91-4ba8-9619-44ea6366cbbb"/>
+      <column name="DISCOUNT" valueNumeric="0"/>
     </insert>
     <insert tableName="offeritem">
       <column name="QUANTITY" valueNumeric="1.00"/>
@@ -96,6 +101,7 @@
       <column name="ITEMPOSITION" value="1.1"/>
       <column name="UNIT" value="QUANTITYPIECES"/>
       <column name="PRODUCT_ID" value="feefb3a9-f02a-4536-9ebb-ab7070cc71ba"/>
+      <column name="DISCOUNT" valueNumeric="0"/>
     </insert>
     <insert tableName="offeritem">
       <column name="QUANTITY" valueNumeric="1.00"/>
@@ -110,6 +116,7 @@
       <column name="UNIT" value="QUANTITYPIECES"/>
       <column name="PRICE" valueNumeric="50000.00"/>
       <column name="PRODUCT_ID" value="3d0086d3-f7fa-4328-bfc9-75cf37eb422c"/>
+      <column name="DISCOUNT" valueNumeric="0"/>
     </insert>
     <insert tableName="offeritem">
       <column name="QUANTITY" valueNumeric="2.00"/>
@@ -124,6 +131,7 @@
       <column name="UNIT" value="QUANTITYPIECES"/>
       <column name="PRICE" valueNumeric="210.00"/>
       <column name="PRODUCT_ID" value="a2e76fe1-e49b-4f2b-8da5-12660738043d"/>
+      <column name="DISCOUNT" valueNumeric="0"/>
     </insert>
     <insert tableName="offeritem">
       <column name="QUANTITY" valueNumeric="3.00"/>
@@ -137,6 +145,7 @@
       <column name="ITEMPOSITION" value="1.1.1"/>
       <column name="UNIT" value="QUANTITYPIECES"/>
       <column name="PRODUCT_ID" value="6e52e636-284d-454b-978c-8f58844c5c5b"/>
+      <column name="DISCOUNT" valueNumeric="0"/>
     </insert>
     <insert tableName="offeritem">
       <column name="QUANTITY" valueNumeric="1.00"/>
@@ -151,6 +160,7 @@
       <column name="UNIT" value="QUANTITYPIECES"/>
       <column name="PRICE" valueNumeric="2500.00"/>
       <column name="PRODUCT_ID" value="805cd37f-d6c7-424b-99b0-b3de9ec89f7b"/>
+      <column name="DISCOUNT" valueNumeric="0"/>
     </insert>
     <insert tableName="offeritem">
       <column name="QUANTITY" valueNumeric="2.00"/>
@@ -164,6 +174,7 @@
       <column name="ITEMPOSITION" value="1.2"/>
       <column name="UNIT" value="QUANTITYPIECES"/>
       <column name="PRODUCT_ID" value="f52b1d6e-bf08-4fe1-8d83-ac0728c4b1c4"/>
+      <column name="DISCOUNT" valueNumeric="0"/>
     </insert>
     <insert tableName="offeritem">
       <column name="QUANTITY" valueNumeric="1000.00"/>
@@ -177,6 +188,7 @@
       <column name="UNIT" value="QUANTITYPIECES"/>
       <column name="PRICE" valueNumeric="150.00"/>
       <column name="PRODUCT_ID" value="e073ddc7-e3b8-4430-9e4f-12065106a624"/>
+      <column name="DISCOUNT" valueNumeric="0"/>
     </insert>
     <insert tableName="offeritem">
       <column name="QUANTITY" valueNumeric="3.00"/>
@@ -190,6 +202,7 @@
       <column name="ITEMPOSITION" value="1.1.2"/>
       <column name="UNIT" value="QUANTITYPIECES"/>
       <column name="PRODUCT_ID" value="072680e3-9e5d-4228-b5a8-f4acef8f2452"/>
+      <column name="DISCOUNT" valueNumeric="0"/>
     </insert>
     <insert tableName="offeritem">
       <column name="QUANTITY" valueNumeric="1.00"/>
@@ -204,6 +217,7 @@
       <column name="UNIT" value="QUANTITYHOUR"/>
       <column name="PRICE" valueNumeric="1000.00"/>
       <column name="PRODUCT_ID" value="239a4c58-5ae6-4aaa-aba3-7e40bf348ce2"/>
+      <column name="DISCOUNT" valueNumeric="0"/>
     </insert>
     <insert tableName="offeritem">
       <column name="QUANTITY" valueNumeric="1.00"/>
@@ -219,6 +233,7 @@
       <column name="PRICE" valueNumeric="10000.00"/>
       <column name="PRODUCT_ID" value="8cdbd2d8-70e2-4899-9ac6-3f0c3e28cab1"/>
       <column name="INFO" value="Standard Stahlträger mit den Maßen 5m x 0,3m x 0,3m."/>
+      <column name="DISCOUNT" valueNumeric="0"/>
     </insert>
     <insert tableName="offeritem">
       <column name="QUANTITY" valueNumeric="3600.00"/>
@@ -233,6 +248,7 @@
       <column name="UNIT" value="QUANTITYHOUR"/>
       <column name="PRICE" valueNumeric="125.00"/>
       <column name="PRODUCT_ID" value="bb897bd1-244b-45cd-8a2f-f5a783cbbbff"/>
+      <column name="DISCOUNT" valueNumeric="0"/>
     </insert>
     <insert tableName="offeritem">
       <column name="QUANTITY" valueNumeric="5.00"/>
@@ -248,6 +264,7 @@
       <column name="PRICE" valueNumeric="10000.00"/>
       <column name="PRODUCT_ID" value="8cdbd2d8-70e2-4899-9ac6-3f0c3e28cab1"/>
       <column name="INFO" value="Standard Stahlträger mit den Maßen 5m x 0,3m x 0,3m."/>
+      <column name="DISCOUNT" valueNumeric="0"/>
     </insert>
     <insert tableName="offeritem">
       <column name="QUANTITY" valueNumeric="1.00"/>
@@ -262,6 +279,7 @@
       <column name="PRICE" valueNumeric="50000.00"/>
       <column name="PRODUCT_ID" value="80b77bce-5299-4c1d-bf41-5eca0add2f50"/>
       <column name="INFO" value="2 Zonen Klimaanlage für Klein- und Kompaktwagen"/>
+      <column name="DISCOUNT" valueNumeric="0"/>
     </insert>
     <insert tableName="offeritem">
       <column name="QUANTITY" valueNumeric="1.00"/>
@@ -276,6 +294,7 @@
       <column name="UNIT" value="QUANTITYPIECES"/>
       <column name="PRICE" valueNumeric="210.00"/>
       <column name="PRODUCT_ID" value="a2e76fe1-e49b-4f2b-8da5-12660738043d"/>
+      <column name="DISCOUNT" valueNumeric="0"/>
     </insert>
     <insert tableName="offeritem">
       <column name="QUANTITY" valueNumeric="1.00"/>
@@ -303,6 +322,7 @@
       <column name="UNIT" value="QUANTITYPIECES"/>
       <column name="PRICE" valueNumeric="250.00"/>
       <column name="PRODUCT_ID" value="993f6294-f1fc-42d2-8786-1c13274fd133"/>
+      <column name="DISCOUNT" valueNumeric="0"/>
     </insert>
     <insert tableName="offeritem">
       <column name="QUANTITY" valueNumeric="2.00"/>
@@ -317,6 +337,7 @@
       <column name="UNIT" value="QUANTITYHOUR"/>
       <column name="PRICE" valueNumeric="210.00"/>
       <column name="PRODUCT_ID" value="a2e76fe1-e49b-4f2b-8da5-12660738043d"/>
+      <column name="DISCOUNT" valueNumeric="0"/>
     </insert>
     <insert tableName="offeritem">
       <column name="QUANTITY" valueNumeric="2.00"/>
@@ -331,6 +352,7 @@
       <column name="UNIT" value="QUANTITYPIECES"/>
       <column name="PRICE" valueNumeric="210.00"/>
       <column name="PRODUCT_ID" value="a2e76fe1-e49b-4f2b-8da5-12660738043d"/>
+      <column name="DISCOUNT" valueNumeric="0"/>
     </insert>
     <insert tableName="offeritem">
       <column name="QUANTITY" valueNumeric="3.00"/>
@@ -345,6 +367,7 @@
       <column name="UNIT" value="QUANTITYPIECES"/>
       <column name="PRICE" valueNumeric="210.00"/>
       <column name="PRODUCT_ID" value="a2e76fe1-e49b-4f2b-8da5-12660738043d"/>
+      <column name="DISCOUNT" valueNumeric="0"/>
     </insert>
     <insert tableName="offeritem">
       <column name="QUANTITY" valueNumeric="1.00"/>
@@ -359,6 +382,7 @@
       <column name="UNIT" value="QUANTITYPIECES"/>
       <column name="PRICE" valueNumeric="50000.00"/>
       <column name="PRODUCT_ID" value="155ac430-ccfc-4814-95fc-189631779064"/>
+      <column name="DISCOUNT" valueNumeric="0"/>
     </insert>
     <insert tableName="offeritem">
       <column name="QUANTITY" valueNumeric="5.00"/>
@@ -388,6 +412,7 @@
       <column name="UNIT" value="QUANTITYPIECES"/>
       <column name="PRICE" valueNumeric="600.00"/>
       <column name="PRODUCT_ID" value="895f8caf-8c91-4ba8-9619-44ea6366cbbb"/>
+      <column name="DISCOUNT" valueNumeric="0"/>
     </insert>
     <insert tableName="offeritem">
       <column name="QUANTITY" valueNumeric="5.00"/>
@@ -402,6 +427,7 @@
       <column name="PRICE" valueNumeric="5000.00"/>
       <column name="PRODUCT_ID" value="535cec1a-e81c-4833-aad6-1d2348dbc0fb"/>
       <column name="INFO" value="4 Zonen Klimaanlage für Mittelklasse Wagen"/>
+      <column name="DISCOUNT" valueNumeric="0"/>
     </insert>
     <insert tableName="offeritem">
       <column name="QUANTITY" valueNumeric="1.00"/>
@@ -415,6 +441,7 @@
       <column name="UNIT" value="QUANTITYPIECES"/>
       <column name="PRICE" valueNumeric="25000.00"/>
       <column name="PRODUCT_ID" value="c9f744bc-7903-4ec0-96f9-1df010ce1f37"/>
+      <column name="DISCOUNT" valueNumeric="0"/>
     </insert>
   </changeSet>
 </databaseChangeLog>
\ No newline at end of file
diff --git a/.liquibase/Data_alias/basic/_demoData/generatedData/salesorderitem.xml b/.liquibase/Data_alias/basic/_demoData/generatedData/salesorderitem.xml
index 743844503622c2e957f5627f4ca5d518abec683f..f0d59d1e5e460741cf7cf5a8c3cefa187501acc0 100644
--- a/.liquibase/Data_alias/basic/_demoData/generatedData/salesorderitem.xml
+++ b/.liquibase/Data_alias/basic/_demoData/generatedData/salesorderitem.xml
@@ -14,6 +14,7 @@
       <column name="PRODUCT_ID" value="80b77bce-5299-4c1d-bf41-5eca0add2f50"/>
       <column name="SALESORDERITEMID" value="001410e8-f70b-4041-901c-02275ff6deb5"/>
       <column name="INFO" value="2 Zonen Klimaanlage für Klein- und Kompaktwagen"/>
+      <column name="DISCOUNT" valueNumeric="0"/>
     </insert>
     <insert tableName="salesorderitem">
       <column name="QUANTITY" valueNumeric="1.00"/>
@@ -26,6 +27,7 @@
       <column name="PRICE" valueNumeric="3500.00"/>
       <column name="PRODUCT_ID" value="895f8caf-8c91-4ba8-9619-44ea6366cbbb"/>
       <column name="SALESORDERITEMID" value="07ceecff-e3cc-4891-b820-3fb6b977a9cc"/>
+      <column name="DISCOUNT" valueNumeric="0"/>
     </insert>
     <insert tableName="salesorderitem">
       <column name="QUANTITY" valueNumeric="1.00"/>
@@ -38,6 +40,7 @@
       <column name="PRICE" valueNumeric="3500.00"/>
       <column name="PRODUCT_ID" value="895f8caf-8c91-4ba8-9619-44ea6366cbbb"/>
       <column name="SALESORDERITEMID" value="08de406a-79bf-468f-8fea-29acfc79a1e8"/>
+      <column name="DISCOUNT" valueNumeric="0"/>
     </insert>
     <insert tableName="salesorderitem">
       <column name="QUANTITY" valueNumeric="1.00"/>
@@ -51,6 +54,7 @@
       <column name="PRICE" valueNumeric="600.00"/>
       <column name="PRODUCT_ID" value="895f8caf-8c91-4ba8-9619-44ea6366cbbb"/>
       <column name="SALESORDERITEMID" value="0b6823a7-7c89-4da8-a4fb-1f2ce4d3a6f0"/>
+      <column name="DISCOUNT" valueNumeric="0"/>
     </insert>
     <insert tableName="salesorderitem">
       <column name="QUANTITY" valueNumeric="1200.00"/>
@@ -74,6 +78,7 @@
       <column name="PRICE" valueNumeric="210.00"/>
       <column name="PRODUCT_ID" value="a2e76fe1-e49b-4f2b-8da5-12660738043d"/>
       <column name="SALESORDERITEMID" value="17856c63-10f8-46c6-9295-5ad5bedff8ba"/>
+      <column name="DISCOUNT" valueNumeric="0"/>
     </insert>
     <insert tableName="salesorderitem">
       <column name="QUANTITY" valueNumeric="5.00"/>
@@ -87,6 +92,7 @@
       <column name="PRODUCT_ID" value="535cec1a-e81c-4833-aad6-1d2348dbc0fb"/>
       <column name="SALESORDERITEMID" value="2f409cb9-4d85-4e39-8e78-4838cd9a9224"/>
       <column name="INFO" value="4 Zonen Klimaanlage für Mittelklasse Wagen"/>
+      <column name="DISCOUNT" valueNumeric="0"/>
     </insert>
     <insert tableName="salesorderitem">
       <column name="QUANTITY" valueNumeric="10.00"/>
@@ -100,6 +106,7 @@
       <column name="PRODUCT_ID" value="8cdbd2d8-70e2-4899-9ac6-3f0c3e28cab1"/>
       <column name="SALESORDERITEMID" value="35c54c0a-760c-4a6b-a5f1-4d6beaec07ac"/>
       <column name="INFO" value="Standard Stahlträger mit den Maßen 5m x 0,3m x 0,3m."/>
+      <column name="DISCOUNT" valueNumeric="0"/>
     </insert>
     <insert tableName="salesorderitem">
       <column name="QUANTITY" valueNumeric="5.00"/>
@@ -113,6 +120,7 @@
       <column name="PRODUCT_ID" value="535cec1a-e81c-4833-aad6-1d2348dbc0fb"/>
       <column name="SALESORDERITEMID" value="368569a0-4d4d-4535-b2a5-8e380d5612ef"/>
       <column name="INFO" value="4 Zonen Klimaanlage für Mittelklasse Wagen"/>
+      <column name="DISCOUNT" valueNumeric="0"/>
     </insert>
     <insert tableName="salesorderitem">
       <column name="QUANTITY" valueNumeric="1.00"/>
@@ -125,6 +133,7 @@
       <column name="PRICE" valueNumeric="25000.00"/>
       <column name="PRODUCT_ID" value="c9f744bc-7903-4ec0-96f9-1df010ce1f37"/>
       <column name="SALESORDERITEMID" value="39da8def-662f-4904-b9bf-b4e97affbeb7"/>
+      <column name="DISCOUNT" valueNumeric="0"/>
     </insert>
     <insert tableName="salesorderitem">
       <column name="QUANTITY" valueNumeric="50.00"/>
@@ -138,6 +147,7 @@
       <column name="PRICE" valueNumeric="1060.00"/>
       <column name="PRODUCT_ID" value="6e52e636-284d-454b-978c-8f58844c5c5b"/>
       <column name="SALESORDERITEMID" value="3d9a18ac-2182-4cd5-a2c4-140674466821"/>
+      <column name="DISCOUNT" valueNumeric="0"/>
     </insert>
     <insert tableName="salesorderitem">
       <column name="QUANTITY" valueNumeric="2.00"/>
@@ -151,6 +161,7 @@
       <column name="PRICE" valueNumeric="210.00"/>
       <column name="PRODUCT_ID" value="a2e76fe1-e49b-4f2b-8da5-12660738043d"/>
       <column name="SALESORDERITEMID" value="45422c17-9626-4435-80ef-58c24fdf7559"/>
+      <column name="DISCOUNT" valueNumeric="0"/>
     </insert>
     <insert tableName="salesorderitem">
       <column name="QUANTITY" valueNumeric="2.00"/>
@@ -164,6 +175,7 @@
       <column name="PRICE" valueNumeric="210.00"/>
       <column name="PRODUCT_ID" value="072680e3-9e5d-4228-b5a8-f4acef8f2452"/>
       <column name="SALESORDERITEMID" value="45c38cca-86b7-46f1-aee8-635c8f0603bc"/>
+      <column name="DISCOUNT" valueNumeric="0"/>
     </insert>
     <insert tableName="salesorderitem">
       <column name="QUANTITY" valueNumeric="1.00"/>
@@ -177,6 +189,7 @@
       <column name="PRICE" valueNumeric="50000.00"/>
       <column name="PRODUCT_ID" value="3d0086d3-f7fa-4328-bfc9-75cf37eb422c"/>
       <column name="SALESORDERITEMID" value="468023b8-fb3e-4e4c-9d30-841d12888b73"/>
+      <column name="DISCOUNT" valueNumeric="0"/>
     </insert>
     <insert tableName="salesorderitem">
       <column name="QUANTITY" valueNumeric="1.00"/>
@@ -190,6 +203,7 @@
       <column name="PRICE" valueNumeric="600.00"/>
       <column name="PRODUCT_ID" value="895f8caf-8c91-4ba8-9619-44ea6366cbbb"/>
       <column name="SALESORDERITEMID" value="4c403665-3fc3-43cd-9921-1f07e2a358ef"/>
+      <column name="DISCOUNT" valueNumeric="0"/>
     </insert>
     <insert tableName="salesorderitem">
       <column name="QUANTITY" valueNumeric="2.00"/>
@@ -203,6 +217,7 @@
       <column name="PRICE" valueNumeric="210.00"/>
       <column name="PRODUCT_ID" value="072680e3-9e5d-4228-b5a8-f4acef8f2452"/>
       <column name="SALESORDERITEMID" value="5396e85b-3144-400f-8f5d-c01e875679f7"/>
+      <column name="DISCOUNT" valueNumeric="0"/>
     </insert>
     <insert tableName="salesorderitem">
       <column name="QUANTITY" valueNumeric="1.00"/>
@@ -216,6 +231,7 @@
       <column name="PRICE" valueNumeric="25000.00"/>
       <column name="PRODUCT_ID" value="895f8caf-8c91-4ba8-9619-44ea6366cbbb"/>
       <column name="SALESORDERITEMID" value="692f2acd-08b6-45d1-bcdf-6f8e46999039"/>
+      <column name="DISCOUNT" valueNumeric="0"/>
     </insert>
     <insert tableName="salesorderitem">
       <column name="QUANTITY" valueNumeric="1.00"/>
@@ -230,6 +246,7 @@
       <column name="PRODUCT_ID" value="8cdbd2d8-70e2-4899-9ac6-3f0c3e28cab1"/>
       <column name="SALESORDERITEMID" value="6e12bc70-5607-4ee5-b40f-2d65fd07ba22"/>
       <column name="INFO" value="Standard Stahlträger mit den Maßen 5m x 0,3m x 0,3m."/>
+      <column name="DISCOUNT" valueNumeric="0"/>
     </insert>
     <insert tableName="salesorderitem">
       <column name="QUANTITY" valueNumeric="1.00"/>
@@ -266,6 +283,7 @@
       <column name="PRICE" valueNumeric="125.00"/>
       <column name="PRODUCT_ID" value="bb897bd1-244b-45cd-8a2f-f5a783cbbbff"/>
       <column name="SALESORDERITEMID" value="8e946799-4921-41a6-a419-eca29dc1a3e0"/>
+      <column name="DISCOUNT" valueNumeric="0"/>
     </insert>
     <insert tableName="salesorderitem">
       <column name="QUANTITY" valueNumeric="5.00"/>
@@ -294,6 +312,7 @@
       <column name="PRODUCT_ID" value="8cdbd2d8-70e2-4899-9ac6-3f0c3e28cab1"/>
       <column name="SALESORDERITEMID" value="950fd897-5ec0-4838-b45f-1b811ab391dd"/>
       <column name="INFO" value="Standard Stahlträger mit den Maßen 5m x 0,3m x 0,3m."/>
+      <column name="DISCOUNT" valueNumeric="0"/>
     </insert>
     <insert tableName="salesorderitem">
       <column name="QUANTITY" valueNumeric="1.00"/>
@@ -307,6 +326,7 @@
       <column name="PRICE" valueNumeric="600.00"/>
       <column name="PRODUCT_ID" value="895f8caf-8c91-4ba8-9619-44ea6366cbbb"/>
       <column name="SALESORDERITEMID" value="a157e7c1-8ed3-4231-9b84-1db9aa4f6bc6"/>
+      <column name="DISCOUNT" valueNumeric="0"/>
     </insert>
     <insert tableName="salesorderitem">
       <column name="QUANTITY" valueNumeric="1.00"/>
@@ -319,6 +339,7 @@
       <column name="PRICE" valueNumeric="1000.00"/>
       <column name="PRODUCT_ID" value="805cd37f-d6c7-424b-99b0-b3de9ec89f7b"/>
       <column name="SALESORDERITEMID" value="b4f02784-4593-4caf-a845-40b426d00082"/>
+      <column name="DISCOUNT" valueNumeric="0"/>
     </insert>
     <insert tableName="salesorderitem">
       <column name="QUANTITY" valueNumeric="1000.00"/>
@@ -331,6 +352,7 @@
       <column name="PRICE" valueNumeric="150.00"/>
       <column name="PRODUCT_ID" value="e073ddc7-e3b8-4430-9e4f-12065106a624"/>
       <column name="SALESORDERITEMID" value="b5f17aaa-ffa7-4c8e-bbcb-d51cfecb06db"/>
+      <column name="DISCOUNT" valueNumeric="0"/>
     </insert>
     <insert tableName="salesorderitem">
       <column name="QUANTITY" valueNumeric="5.00"/>
@@ -359,6 +381,7 @@
       <column name="PRODUCT_ID" value="8cdbd2d8-70e2-4899-9ac6-3f0c3e28cab1"/>
       <column name="SALESORDERITEMID" value="cd79054e-b74b-4c09-b49b-a62ee738818b"/>
       <column name="INFO" value="Standard Stahlträger mit den Maßen 5m x 0,3m x 0,3m."/>
+      <column name="DISCOUNT" valueNumeric="0"/>
     </insert>
     <insert tableName="salesorderitem">
       <column name="QUANTITY" valueNumeric="1.00"/>
@@ -372,6 +395,7 @@
       <column name="PRICE" valueNumeric="1000.00"/>
       <column name="PRODUCT_ID" value="239a4c58-5ae6-4aaa-aba3-7e40bf348ce2"/>
       <column name="SALESORDERITEMID" value="cd7c9255-0de8-4b15-a952-caf9669b447a"/>
+      <column name="DISCOUNT" valueNumeric="0"/>
     </insert>
     <insert tableName="salesorderitem">
       <column name="QUANTITY" valueNumeric="1.00"/>
@@ -385,6 +409,7 @@
       <column name="PRICE" valueNumeric="2500.00"/>
       <column name="PRODUCT_ID" value="805cd37f-d6c7-424b-99b0-b3de9ec89f7b"/>
       <column name="SALESORDERITEMID" value="e53aaecf-d8b6-4327-96cb-66f004e4b5fb"/>
+      <column name="DISCOUNT" valueNumeric="0"/>
     </insert>
   </changeSet>
 </databaseChangeLog>
\ No newline at end of file
diff --git a/.liquibase/Data_alias/basic/_demoData/generatedData/salesproject.xml b/.liquibase/Data_alias/basic/_demoData/generatedData/salesproject.xml
index 571a4489a807e1581709dcced953f52352c9a928..ae504db23f5b56a81d527ad993272f9d15562dd2 100644
--- a/.liquibase/Data_alias/basic/_demoData/generatedData/salesproject.xml
+++ b/.liquibase/Data_alias/basic/_demoData/generatedData/salesproject.xml
@@ -41,6 +41,7 @@
       <column name="SALESPROJECTID" value="7683f92d-a949-4b76-ba6f-57344d730f40"/>
       <column name="PROJECTTITLE" value="Meister Messebau/ Umsetzung"/>
       <column name="STATUS" value="SALPROJSTATOPEN"/>
+      <column name="PROBABILITY" valueNumeric="0.00"/>
     </insert>
     <insert tableName="salesproject">
       <column name="PHASE" value="SALPROJPHASEOFFER"/>
diff --git a/entity/BulkMail_entity/BulkMail_entity.aod b/entity/BulkMail_entity/BulkMail_entity.aod
index 5a95e209f60d6d026a2f8406f132dc440eaa1b37..c91cdcca4a5efb196f0c9d442aead91a284f0c4e 100644
--- a/entity/BulkMail_entity/BulkMail_entity.aod
+++ b/entity/BulkMail_entity/BulkMail_entity.aod
@@ -93,8 +93,9 @@
     <entityField>
       <name>SENDER</name>
       <title>Sender address</title>
+      <consumer>SenderAddressKeyword</consumer>
       <mandatory v="true" />
-      <valueProcess>%aditoprj%/entity/BulkMail_entity/entityfields/sender/valueProcess.js</valueProcess>
+      <textInputAllowed v="true" />
       <onValidation>%aditoprj%/entity/BulkMail_entity/entityfields/sender/onValidation.js</onValidation>
     </entityField>
     <entityField>
@@ -641,6 +642,20 @@
         <fieldName>ISO3Name</fieldName>
       </dependency>
     </entityConsumer>
+    <entityConsumer>
+      <name>SenderAddressKeyword</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>SpecificContainerKeywords</fieldName>
+      </dependency>
+      <children>
+        <entityParameter>
+          <name>ContainerName_param</name>
+          <valueProcess>%aditoprj%/entity/BulkMail_entity/entityfields/senderaddresskeyword/children/containername_param/valueProcess.js</valueProcess>
+        </entityParameter>
+      </children>
+    </entityConsumer>
   </entityFields>
   <recordContainers>
     <dbRecordContainer>
diff --git a/entity/BulkMail_entity/entityfields/sender/valueProcess.js b/entity/BulkMail_entity/entityfields/sender/valueProcess.js
deleted file mode 100644
index 88626d517388be0ae8c0186c2f3729d00b741eb7..0000000000000000000000000000000000000000
--- a/entity/BulkMail_entity/entityfields/sender/valueProcess.js
+++ /dev/null
@@ -1,8 +0,0 @@
-import("system.neon");
-import("system.vars");
-import("Communication_lib");
-import("system.result");
-import("Employee_lib");
-
-if(vars.get("$this.value") == null && vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW)
-result.string(CommUtil.getStandardMail(EmployeeUtils.getCurrentContactId()));
\ No newline at end of file
diff --git a/entity/BulkMail_entity/entityfields/senderaddresskeyword/children/containername_param/valueProcess.js b/entity/BulkMail_entity/entityfields/senderaddresskeyword/children/containername_param/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..6429e2a55e085b274b35eeabbe613c94741d8b5e
--- /dev/null
+++ b/entity/BulkMail_entity/entityfields/senderaddresskeyword/children/containername_param/valueProcess.js
@@ -0,0 +1,4 @@
+import("KeywordRegistry_basic");
+import("system.result");
+
+result.string($KeywordRegistry.bulkMailSenderAddress());
\ No newline at end of file
diff --git a/entity/Checklist_entity/Checklist_entity.aod b/entity/Checklist_entity/Checklist_entity.aod
index 6608df6d0ef35f2c9ee6887768755695cd9c5558..19c219ceb5145bcedaf5c22861eb0eb4f1076654 100644
--- a/entity/Checklist_entity/Checklist_entity.aod
+++ b/entity/Checklist_entity/Checklist_entity.aod
@@ -67,7 +67,7 @@
     </entityField>
     <entityField>
       <name>CHECKLIST_CONTEXT</name>
-      <title>Context</title>
+      <title>${CONTEXT}</title>
       <consumer>Contexts</consumer>
       <groupable v="true" />
       <mandatory v="true" />
diff --git a/entity/DistrictChangeValidityDates_entity/onValidation.js b/entity/DistrictChangeValidityDates_entity/onValidation.js
index 11ff32f6ed97d0f204bf0bc4c368bf38317aa0c3..ece25072947b140d07ecb0a771aa190cef9cebef 100644
--- a/entity/DistrictChangeValidityDates_entity/onValidation.js
+++ b/entity/DistrictChangeValidityDates_entity/onValidation.js
@@ -1,8 +1,9 @@
+import("system.translate");
 import("system.result");
 import("system.vars");
 
 var count = vars.get("$field.count");
 if(count == 0)
 {
-    result.string("No Datasets selected");
+    result.string(translate.text("No Datasets selected"));
 }
\ No newline at end of file
diff --git a/entity/DistrictContact_entity/entityfields/filterviewactiongroup/children/changevalidity/onActionProcess.js b/entity/DistrictContact_entity/entityfields/filterviewactiongroup/children/changevalidity/onActionProcess.js
index 1ba1dceffbacbc53b63b0fe55412dd2b9d4f2da2..756059093ddcae5d7471939e45d69125a8dd843e 100644
--- a/entity/DistrictContact_entity/entityfields/filterviewactiongroup/children/changevalidity/onActionProcess.js
+++ b/entity/DistrictContact_entity/entityfields/filterviewactiongroup/children/changevalidity/onActionProcess.js
@@ -8,7 +8,7 @@ import("system.vars");
 var districtContactIds;
 var currentContext = ContextUtils.getCurrentContextId();
 
-if (vars.get("$sys.selection").length > 0)
+if (vars.get("$sys.selection") && vars.get("$sys.selection").length > 0)
 {
     districtContactIds = vars.get("$sys.selection");
 }
diff --git a/entity/Employee_entity/recordcontainers/jdito/onDelete.js b/entity/Employee_entity/recordcontainers/jdito/onDelete.js
index 24ad2b0487705801548cc6654fe9a82e0bdb4322..876381fb501a07aef95ed8946195bd1593c012a4 100644
--- a/entity/Employee_entity/recordcontainers/jdito/onDelete.js
+++ b/entity/Employee_entity/recordcontainers/jdito/onDelete.js
@@ -5,14 +5,60 @@ import("system.neon");
 import("system.vars");
 import("system.tools");
 import("Employee_lib");
+import("system.tag");
 
 //the current user should not delete himself
 if (EmployeeUtils.getCurrentUserName() != vars.get("$field.TITLE") && !EmployeeUtils.hasRelations(vars.get("$field.CONTACT_ID")))
 {
-    tools.deleteUser(vars.get("$field.TITLE"));
-    
-    new AttributeRelationQuery(EmployeeUtils.sliceUserId(vars.get("$field.UID")), null, ContextUtils.getCurrentContextId())
-        .deleteAllAttributes();
+    var targetUserTitle = vars.get("$field.TITLE");
+    if (targetUserTitle)
+    {
+        untagAllPrivateTaggedObjects(targetUserTitle);
+        tools.deleteUser(targetUserTitle);
+       
+        new AttributeRelationQuery(EmployeeUtils.sliceUserId(vars.get("$field.UID")), null, ContextUtils.getCurrentContextId())
+            .deleteAllAttributes();
         
-    WorkflowSignalSender.deleted();
+        WorkflowSignalSender.deleted();
+    }
+}
+
+/*
+ * Untags all private tagged objects (default favorites and favorite groups) of the provided user.
+ */
+function untagAllPrivateTaggedObjects(pTargetUserTitle) 
+{
+    var privateTags = [];
+    var targetUser = tools.getUser([pTargetUserTitle], tools.PROFILE_DEFAULT);
+    
+    var config = tag.createGetTaggedObjectsConfig();
+    config.setUserId(targetUser.name); 
+    
+    // get all objects tagged as default favorite
+    config.setTagType(tag.DEFAULT_FAVORITE_GROUP);
+    privateTags = privateTags.concat(getAllTaggedObjectIds(config));
+    
+    // get all objects tagged as favorite group
+    config.setTagType(tag.FAVORITE_GROUP);
+    privateTags = privateTags.concat(getAllTaggedObjectIds(config));
+    
+    // untag all private tags
+    config = tag.createUntagMultipleByIdConfig();
+    config.setTaggedObjectsRecordIds(privateTags);
+    tag.untag(config);
+}
+
+/*
+ * Returns an array containing all ids of private tagged objects (ID of ASYS_RECORD).
+ */
+function getAllTaggedObjectIds(pConfig)
+{
+    var allTaggedObjectIds = [];
+    
+    tag.getTaggedObjects(pConfig).forEach(function(taggedObject) {
+        if (taggedObject.id)
+            allTaggedObjectIds.push(taggedObject.id);
+    });
+    
+    return allTaggedObjectIds;
 }
\ No newline at end of file
diff --git a/entity/KeywordCategory_entity/entityfields/sortingby/dropDownProcess.js b/entity/KeywordCategory_entity/entityfields/sortingby/dropDownProcess.js
index 7857949a704707c91123e2f9d922b23fcfc1bef0..864f12458a9ae4d40c62a2cc85b43ab948b67d8e 100644
--- a/entity/KeywordCategory_entity/entityfields/sortingby/dropDownProcess.js
+++ b/entity/KeywordCategory_entity/entityfields/sortingby/dropDownProcess.js
@@ -3,7 +3,7 @@ import("system.translate");
 
 
 result.object([
-    ["0", translate.text("by sorting")],
-    ["1", translate.text("by name")],
-    ["2", translate.text("by translated name")],
+    ["0", translate.text("manually")],
+    ["1", translate.text("by title")],
+    ["2", translate.text("by translated title")],
 ]);
\ No newline at end of file
diff --git a/entity/Offer_entity/Offer_entity.aod b/entity/Offer_entity/Offer_entity.aod
index 9b143fe1e1a0d957a48705e44b631f8a1f040590..2dbe5967ccd2153fecdda665416384b29e63eae1 100644
--- a/entity/Offer_entity/Offer_entity.aod
+++ b/entity/Offer_entity/Offer_entity.aod
@@ -77,6 +77,7 @@
       <minValue v="0" />
       <outputFormat>0'%'</outputFormat>
       <groupable v="true" />
+      <mandatory v="true" />
       <dropDownProcess>%aditoprj%/entity/Offer_entity/entityfields/probability/dropDownProcess.js</dropDownProcess>
       <textInputAllowed v="false" />
       <stateProcess>%aditoprj%/entity/Offer_entity/entityfields/probability/stateProcess.js</stateProcess>
diff --git a/entity/Offer_entity/entityfields/offerreportdispatch/children/dispatchofferreport/onActionProcess.js b/entity/Offer_entity/entityfields/offerreportdispatch/children/dispatchofferreport/onActionProcess.js
index c9be3c889870754bed49436e6818a86aebc8ca22..32834d7795ed019a1dc794be35c67e45640c47ae 100644
--- a/entity/Offer_entity/entityfields/offerreportdispatch/children/dispatchofferreport/onActionProcess.js
+++ b/entity/Offer_entity/entityfields/offerreportdispatch/children/dispatchofferreport/onActionProcess.js
@@ -1,3 +1,4 @@
+import("Util_lib");
 import("system.db");
 import("system.vars");
 import("system.question");
@@ -20,13 +21,18 @@ var additionalPlaceholders = [
     new Placeholder("offerCode", Placeholder.types.FIXEDVALUE, vars.get("$field.FullOfferCode"))
 ];
 
-if (vars.get("$field.CONTACT_ID") == null || "") contactId = vars.get("$field.CONTACT_ORG_ID");
+if (Utils.isNullOrEmptyString(vars.get("$field.CONTACT_ID")))
+{
+    contactId = vars.get("$field.CONTACT_ORG_ID");
+}
 
 offerReport.content = arrayReport[1];
 offerReport.mimeType = MimeTypes.PDF();
-offerReport.filename = translate.text("Offer No.") + vars.get("$field.#CONTENTTITLE") + ".pdf";
+offerReport.filename = translate.text("Offer No.") + vars.get("$field.OfferCode_VersNr_fieldgroup") + ".pdf";
 
 attachmentArray[0] = offerReport;
 
-EmailWritingUtils.sendReportAsMail(contactId, attachmentArray, "Offer", notificationMsg, emailFilename, additionalPlaceholders, updateStatements, 
-                                        $KeywordRegistry.documentTemplateTypeCategory$single());
+EmailWritingUtils.sendReportAsMail(
+    contactId, attachmentArray, "Offer", notificationMsg, emailFilename, additionalPlaceholders, updateStatements, 
+    $KeywordRegistry.documentTemplateTypeCategory$single()
+);
diff --git a/entity/Offeritem_entity/Offeritem_entity.aod b/entity/Offeritem_entity/Offeritem_entity.aod
index 8791f8cf6abb0d5a2632c3b425aea6ba1c603faa..539426a9accdeccf35ae7df22f09485107038217 100644
--- a/entity/Offeritem_entity/Offeritem_entity.aod
+++ b/entity/Offeritem_entity/Offeritem_entity.aod
@@ -25,6 +25,7 @@
       <outputFormat>0.00'%'</outputFormat>
       <inputFormat>0.00</inputFormat>
       <titleProcess>%aditoprj%/entity/Offeritem_entity/entityfields/discount/titleProcess.js</titleProcess>
+      <mandatory v="true" />
       <onValidation>%aditoprj%/entity/Offeritem_entity/entityfields/discount/onValidation.js</onValidation>
     </entityField>
     <entityField>
diff --git a/entity/Orderitem_entity/Orderitem_entity.aod b/entity/Orderitem_entity/Orderitem_entity.aod
index da6218d0b5296177dbd061e7e3c4222128d21b0d..a22087028d3fb3ac617b40b7989e5cb94a5b6d3b 100644
--- a/entity/Orderitem_entity/Orderitem_entity.aod
+++ b/entity/Orderitem_entity/Orderitem_entity.aod
@@ -26,6 +26,7 @@
       <inputFormat>0.00</inputFormat>
       <titleProcess>%aditoprj%/entity/Orderitem_entity/entityfields/discount/titleProcess.js</titleProcess>
       <onValidation>%aditoprj%/entity/Orderitem_entity/entityfields/discount/onValidation.js</onValidation>
+      <mandatory v="true" />
     </entityField>
     <entityField>
       <name>GROUPCODEID</name>
diff --git a/entity/Prod2prod_entity/Prod2prod_entity.aod b/entity/Prod2prod_entity/Prod2prod_entity.aod
index 2cc4ae001df0fc3f0c49ca346d6ff4fdab3b273c..ead47cfc2b7ce1a9f304350248ad64201065a2a0 100644
--- a/entity/Prod2prod_entity/Prod2prod_entity.aod
+++ b/entity/Prod2prod_entity/Prod2prod_entity.aod
@@ -124,16 +124,6 @@
       <title>Unit</title>
       <state>READONLY</state>
     </entityField>
-    <entityField>
-      <name>currentPurchasePrice</name>
-      <title>Curr. purchase price</title>
-      <state>READONLY</state>
-    </entityField>
-    <entityField>
-      <name>currentSalesPrice</name>
-      <title>Curr. sales price</title>
-      <state>READONLY</state>
-    </entityField>
     <entityField>
       <name>PARENT_ID</name>
     </entityField>
@@ -144,6 +134,16 @@
       <name>PICTURE</name>
       <contentType>IMAGE</contentType>
     </entityField>
+    <entityField>
+      <name>currentSalesPrice</name>
+      <title>Curr. sales price</title>
+      <state>READONLY</state>
+    </entityField>
+    <entityField>
+      <name>currentPurchasePrice</name>
+      <title>Curr. purchase price</title>
+      <state>READONLY</state>
+    </entityField>
   </entityFields>
   <recordContainers>
     <jDitoRecordContainer>
diff --git a/entity/Prod2prod_entity/entityfields/source_id/onValueChange.js b/entity/Prod2prod_entity/entityfields/source_id/onValueChange.js
index 498192c6dc9e096ec2f225e2c5bad1234bc17305..6b7340b99f92da214cf9f70f511e441c2d15ec55 100644
--- a/entity/Prod2prod_entity/entityfields/source_id/onValueChange.js
+++ b/entity/Prod2prod_entity/entityfields/source_id/onValueChange.js
@@ -1,3 +1,5 @@
+import("system.eMath");
+import("Util_lib");
 import("system.text");
 import("Product_lib");
 import("KeywordRegistry_basic");
@@ -6,25 +8,187 @@ import("Sql_lib");
 import("system.vars");
 import("system.neon");
 
-var productId = vars.get("$local.value");
+if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW || vars.get("$sys.recordstate") == neon.OPERATINGSTATE_EDIT)
+{
+    var buyPrice = "";
+    var sellPrice = "";    
+    var productId = vars.get("$local.value");
+
+    var unit = newSelect(KeywordUtils.getResolvedTitleSqlPart($KeywordRegistry.quantityUnit(), "PRODUCT.UNIT"))
+                            .from("PRODUCT")
+                            .where("PRODUCT.PRODUCTID", productId)
+                            .cell();
+    var data = "";
+    var purchasePrice = ProductUtils.getCurrentProductPrice(productId, "PP", true);
+    if (purchasePrice.length > 0)
+    {
+        purchasePrice = text.formatDouble(purchasePrice[0], "#,##0.00", true) + " " + purchasePrice[1];
+    }
+    else
+    {
+        let calcPrices = _calcPrices();
+        buyPrice = calcPrices["buyPrice"];
+        sellPrice = calcPrices["sellPrice"];
+        purchasePrice = buyPrice;
+    }
 
-var unit = newSelect(KeywordUtils.getResolvedTitleSqlPart($KeywordRegistry.quantityUnit(), "PRODUCT.UNIT"))
-                        .from("PRODUCT")
-                        .where("PRODUCT.PRODUCTID", productId)
-                        .cell();
+    var salesPrice = ProductUtils.getCurrentProductPrice(productId, "SP", true);
+    if (salesPrice.length > 0)
+    {
+        salesPrice = text.formatDouble(salesPrice[0], "#,##0.00", true) + " " + salesPrice[1];
+    }
+    else
+    {
+        if(Utils.isNullOrEmptyString(data))
+        {
+            let calcPrices = _calcPrices();
+            buyPrice = calcPrices["buyPrice"];
+            sellPrice = calcPrices["sellPrice"];
+        }
+        salesPrice = sellPrice;
+    }
+
+    neon.setFieldValue("$field.unit", unit);
+    neon.setFieldValue("$field.currentPurchasePrice", purchasePrice);
+    neon.setFieldValue("$field.currentSalesPrice", salesPrice);
+}
 
-var purchasePrice = ProductUtils.getCurrentProductPrice(productId, "PP", true);
-if (purchasePrice.length > 0)
+/*
+*  Recursive function that retuns the childs of a product parts list
+* 
+*  @param {String} pId - uid value
+*  
+*  @param {String} pProductId product id
+*  
+*  @param {Integer} pMaxRecursion max recursion
+*  
+*  @return {Array} Childs
+ */
+function _getChilds(pId, pProductId, pMaxRecursion)
 {
-    purchasePrice = text.formatDouble(purchasePrice[0], "#,##0.00", true) + " " + purchasePrice[1];
+    if(pMaxRecursion == 0)
+    {
+        return [];
+    }
+    var items = prod2prod.filter(function(p2p) {
+        return p2p[5] == pProductId;
+    });
+    var itemChilds = [];
+    items.forEach(function(p2p) {
+        p2p[2] = pId;
+        itemChilds.push(_getChilds(p2p[0], p2p[3], pMaxRecursion - 1));
+    });
+    return Array.prototype.concat.apply(items, itemChilds);
 }
 
-var salesPrice = ProductUtils.getCurrentProductPrice(productId, "SP", true);
-if (salesPrice.length > 0)
+/*
+*  Caclulates the prace of pProdId by adding up the child prices
+* 
+*  @param {String} pProdId - uid value
+*  
+*  @param {String} pProductAndChildProducts product id
+*  
+*  @param {Integer} pPpSp buy/sell possible values: "PP", "SP"
+*  
+*  @return {String} Price
+ */
+function _calculatePriceFromChildren(pProdId, pProductAndChildProducts, pPpSp)
 {
-    salesPrice = text.formatDouble(salesPrice[0], "#,##0.00", true) + " " + salesPrice[1];
+    var children = pProductAndChildProducts[pProdId];
+    var price = "";
+    if(children != undefined)
+    {
+        for (let i = 0; i < children.length; i++)
+        {
+            let childProdId = children[i];
+            childPrice = productPrices[childProdId][pPpSp];
+            if(childPrice && Utils.isNotNullOrEmptyString(childPrice))
+            {
+
+                if(price == "")
+                {
+                    price = 0;
+                }
+                price = eMath.addDec(price, childPrice);
+            }
+        }
+    }
+    return price;
 }
 
-neon.setFieldValue("$field.unit", unit);
-neon.setFieldValue("$field.currentPurchasePrice", purchasePrice);
-neon.setFieldValue("$field.currentSalesPrice", salesPrice);
\ No newline at end of file
+/*
+*  Caclulates the buy and sales prices for the current product
+*  
+*  @return {Object} Object with buyPrice and sellPrice.
+ */
+function _calcPrices()
+{
+    var sqlMask = new SqlMaskingUtils();
+    prod2prod = newSelect([
+            "PROD2PROD.PROD2PRODID",                // UID.value
+            "PROD2PROD.PROD2PRODID",                // PROD2PRODID.value
+            "''",                                   // PARENT_ID.value
+            "PROD2PROD.SOURCE_ID",                  // SOURCE_ID.value
+            "PRODUCT.PRODUCTNAME",                  // SOURCE_ID.displayValue
+            "PROD2PROD.DEST_ID",                    // DEST_ID.value
+            ]).from("PROD2PROD")
+            .join("PRODUCT", "PRODUCT.PRODUCTID = PROD2PROD.SOURCE_ID")
+            .where("PROD2PROD.SOURCE_ID", vars.get("$local.value"))
+            .or("PROD2PROD.DEST_ID", vars.get("$local.value"))
+            .table();
+
+    data = _getChilds(null, vars.get("$local.value"), 20)
+    var productAndChildProducts = {};
+    var productPrices = {};
+
+    for(var i = data.length - 1; i >= 0; i--)//loop backwards
+    {
+        var productId = data[i][3];
+        var prodId = data[i][0];
+        var parentId = data[i][2];
+
+        if(!productAndChildProducts.hasOwnProperty(parentId))
+        {
+            productAndChildProducts[parentId] = [prodId];
+        }
+        else
+        {
+            productAndChildProducts[parentId].push(prodId);
+        }
+
+        productPrices[prodId] = {};
+
+        var purchasePrice = ProductUtils.getCurrentProductPrice(productId, "PP", true);
+        productPrices[prodId]["PP"] = purchasePrice.length == 0 ? _calculatePriceFromChildren(prodId, productAndChildProducts, "PP") : purchasePrice[0];
+
+        var salesPrice = ProductUtils.getCurrentProductPrice(productId, "SP", true);
+        productPrices[prodId]["SP"] = salesPrice.length == 0 ? _calculatePriceFromChildren(prodId, productAndChildProducts, "SP") : salesPrice[0];
+
+    }
+
+    for (i = 0; i < productAndChildProducts[null].length; i++)
+    {
+        var currentProdId = productAndChildProducts[null][i];
+
+        if(Utils.isNotNullOrEmptyString(productPrices[currentProdId]["PP"]))
+        {
+            buyPrice = eMath.addDec(buyPrice, productPrices[currentProdId]["PP"]);
+        }
+        if(Utils.isNotNullOrEmptyString(productPrices[currentProdId]["SP"]))
+        {
+            sellPrice = eMath.addDec(sellPrice, productPrices[currentProdId]["SP"]);
+        }
+    }
+    buyPrice =(
+        Utils.isNullOrEmptyString(buyPrice) ? "" :
+        text.formatDouble(buyPrice, "#,##0.00", true) + " " + "Euro"
+    );
+
+    sellPrice =(
+        Utils.isNullOrEmptyString(sellPrice) ? "" :
+        text.formatDouble(sellPrice, "#,##0.00", true) + " " + "Euro"
+    );
+    
+    return {"buyPrice": buyPrice
+            , "sellPrice": sellPrice};
+}
\ No newline at end of file
diff --git a/entity/Prod2prod_entity/recordcontainers/jdito/contentProcess.js b/entity/Prod2prod_entity/recordcontainers/jdito/contentProcess.js
index 9c60cc28a8c3905a4c3419520d44bdb5ac1ea277..42e34ece3d422f06fee8f846dc94ebeb54cb88e4 100644
--- a/entity/Prod2prod_entity/recordcontainers/jdito/contentProcess.js
+++ b/entity/Prod2prod_entity/recordcontainers/jdito/contentProcess.js
@@ -1,3 +1,5 @@
+import("system.eMath");
+import("Util_lib");
 import("Product_lib");
 import("system.text");
 import("system.neon");
@@ -31,23 +33,68 @@ var query = newSelect([
 .join("PRODUCT", "PRODUCT.PRODUCTID = PROD2PROD.SOURCE_ID");
 
 function _returnData(data) {
-    for(let i = 0; i < data.length; i++)
+    
+    var productAndChildProducts = {};
+    var productPrices = {};
+    function _calculatePriceFromChildren(pProdId, pParentId, pPpSp)
+    {
+        var children = productAndChildProducts[pProdId];
+        var price = "";
+        if(children != undefined)
+        {
+            for (let i = 0; i < children.length; i++)
+            {
+                let childProdId = children[i];
+                childPrice = productPrices[childProdId][pPpSp];
+                if(childPrice && Utils.isNotNullOrEmptyString(childPrice))
+                {
+                    
+                    if(price == "")
+                    {
+                        price = 0;
+                    }
+                    price = eMath.addDec(price, childPrice);
+                }
+            }
+        }
+        return price;
+    }
+    
+    for(var i = data.length - 1; i >= 0; i--)//loop backwards
     {
         var productId = data[i][3];
+        var prodId = data[i][0];
+        var parentId = data[i][2];
+        
+        if(!productAndChildProducts.hasOwnProperty(parentId))
+        {
+            productAndChildProducts[parentId] = [prodId];
+        }
+        else
+        {
+            productAndChildProducts[parentId].push(prodId);
+        }
+        
+        productPrices[prodId] = {};
         
-        // currentPurchasePrice.value
         var purchasePrice = ProductUtils.getCurrentProductPrice(productId, "PP", true);
+        productPrices[prodId]["PP"] = purchasePrice.length == 0 ? _calculatePriceFromChildren(prodId, parentId, "PP") : purchasePrice[0];
+        
+        var salesPrice = ProductUtils.getCurrentProductPrice(productId, "SP", true);
+        productPrices[prodId]["SP"] = salesPrice.length == 0 ? _calculatePriceFromChildren(prodId, parentId, "SP") : salesPrice[0];
+        
+        // currentPurchasePrice.value
         data[i].push(
-            purchasePrice.length == 0 ? "" :
-            text.formatDouble(purchasePrice[0], "#,##0.00", true) + " " + purchasePrice[1]
+            Utils.isNullOrEmptyString(productPrices[prodId]["PP"]) ? "" :
+            text.formatDouble(productPrices[prodId]["PP"], "#,##0.00", true) + " " + "Euro"
         );
         
         // currentSalesPrice.value
-        var salesPrice = ProductUtils.getCurrentProductPrice(productId, "SP", true);
         data[i].push(
-            salesPrice.length == 0 ? "" :
-            text.formatDouble(salesPrice[0], "#,##0.00", true) + " " + salesPrice[1]
+            Utils.isNullOrEmptyString(productPrices[prodId]["SP"]) ? "" :
+            text.formatDouble(productPrices[prodId]["SP"], "#,##0.00", true) + " " + "Euro"
         );
+        
     }
     result.object(data);
 }
@@ -76,4 +123,4 @@ else
         return Array.prototype.concat.apply(items, itemChilds);
     }
     _returnData(_getChilds(null, vars.get("$param.ProductId_param"), 20));
-}
+}
\ No newline at end of file
diff --git a/entity/Salesproject_entity/Salesproject_entity.aod b/entity/Salesproject_entity/Salesproject_entity.aod
index a4a0042cb90cf0ddb5708954771988e46a813a7c..ff7f6cbe34e6b06d62d6be56fc468277910e8119 100644
--- a/entity/Salesproject_entity/Salesproject_entity.aod
+++ b/entity/Salesproject_entity/Salesproject_entity.aod
@@ -136,6 +136,7 @@
       <outputFormat>0'%'</outputFormat>
       <inputFormat>0'%'</inputFormat>
       <groupable v="true" />
+      <mandatory v="true" />
     </entityField>
     <entityConsumer>
       <name>SalesprojectSources</name>
diff --git a/entity/TopicTree_entity/TopicTree_entity.aod b/entity/TopicTree_entity/TopicTree_entity.aod
index a1f57a287242fa31a59c821b2ea0f24869d45e27..7c8c12832377b99735c6b18438212dc1edd74412 100644
--- a/entity/TopicTree_entity/TopicTree_entity.aod
+++ b/entity/TopicTree_entity/TopicTree_entity.aod
@@ -7,6 +7,7 @@
   <grantDeleteProcess>%aditoprj%/entity/TopicTree_entity/grantDeleteProcess.js</grantDeleteProcess>
   <contentTitleProcess>%aditoprj%/entity/TopicTree_entity/contentTitleProcess.js</contentTitleProcess>
   <iconId>VAADIN:TREE_TABLE</iconId>
+  <recordsRecipeSupported v="true" />
   <recordContainer>jdito</recordContainer>
   <entityFields>
     <entityProvider>
@@ -104,6 +105,7 @@
           <title>First</title>
           <onActionProcess>%aditoprj%/entity/TopicTree_entity/entityfields/more/children/first/onActionProcess.js</onActionProcess>
           <isObjectAction v="false" />
+          <selectionType>MULTI</selectionType>
           <iconId>VAADIN:ANGLE_DOUBLE_UP</iconId>
           <stateProcess>%aditoprj%/entity/TopicTree_entity/entityfields/more/children/first/stateProcess.js</stateProcess>
         </entityActionField>
@@ -112,6 +114,7 @@
           <title>Move Up</title>
           <onActionProcess>%aditoprj%/entity/TopicTree_entity/entityfields/more/children/moveup/onActionProcess.js</onActionProcess>
           <isObjectAction v="false" />
+          <selectionType>MULTI</selectionType>
           <iconId>VAADIN:ANGLE_UP</iconId>
           <stateProcess>%aditoprj%/entity/TopicTree_entity/entityfields/more/children/moveup/stateProcess.js</stateProcess>
         </entityActionField>
@@ -120,6 +123,7 @@
           <title>Move Down</title>
           <onActionProcess>%aditoprj%/entity/TopicTree_entity/entityfields/more/children/movedown/onActionProcess.js</onActionProcess>
           <isObjectAction v="false" />
+          <selectionType>MULTI</selectionType>
           <iconId>VAADIN:ANGLE_DOWN</iconId>
           <stateProcess>%aditoprj%/entity/TopicTree_entity/entityfields/more/children/movedown/stateProcess.js</stateProcess>
         </entityActionField>
@@ -128,6 +132,7 @@
           <title>Last</title>
           <onActionProcess>%aditoprj%/entity/TopicTree_entity/entityfields/more/children/last/onActionProcess.js</onActionProcess>
           <isObjectAction v="false" />
+          <selectionType>MULTI</selectionType>
           <iconId>VAADIN:ANGLE_DOUBLE_DOWN</iconId>
           <stateProcess>%aditoprj%/entity/TopicTree_entity/entityfields/more/children/last/stateProcess.js</stateProcess>
         </entityActionField>
@@ -135,13 +140,14 @@
           <name>copy</name>
           <title>Copy</title>
           <onActionProcess>%aditoprj%/entity/TopicTree_entity/entityfields/more/children/copy/onActionProcess.js</onActionProcess>
+          <selectionType>MULTI</selectionType>
           <iconId>VAADIN:COPY</iconId>
-          <stateProcess>%aditoprj%/entity/TopicTree_entity/entityfields/more/children/copy/stateProcess.js</stateProcess>
         </entityActionField>
         <entityActionField>
           <name>paste</name>
           <title>Paste</title>
           <onActionProcess>%aditoprj%/entity/TopicTree_entity/entityfields/more/children/paste/onActionProcess.js</onActionProcess>
+          <selectionType>MULTI</selectionType>
           <iconId>VAADIN:PASTE</iconId>
           <stateProcess>%aditoprj%/entity/TopicTree_entity/entityfields/more/children/paste/stateProcess.js</stateProcess>
         </entityActionField>
@@ -149,6 +155,7 @@
           <name>pasteAsTopTopic</name>
           <title>Paste as Top Topic</title>
           <onActionProcess>%aditoprj%/entity/TopicTree_entity/entityfields/more/children/pasteastoptopic/onActionProcess.js</onActionProcess>
+          <selectionType>MULTI</selectionType>
           <iconId>VAADIN:PASTE</iconId>
           <stateProcess>%aditoprj%/entity/TopicTree_entity/entityfields/more/children/pasteastoptopic/stateProcess.js</stateProcess>
         </entityActionField>
@@ -156,6 +163,7 @@
           <name>cut</name>
           <title>Cut</title>
           <onActionProcess>%aditoprj%/entity/TopicTree_entity/entityfields/more/children/cut/onActionProcess.js</onActionProcess>
+          <selectionType>MULTI</selectionType>
           <iconId>VAADIN:SCISSORS</iconId>
           <stateProcess>%aditoprj%/entity/TopicTree_entity/entityfields/more/children/cut/stateProcess.js</stateProcess>
         </entityActionField>
diff --git a/entity/TopicTree_entity/entityfields/createexpand/children/createchildtopic/onActionProcess.js b/entity/TopicTree_entity/entityfields/createexpand/children/createchildtopic/onActionProcess.js
index 6e11443e9dda8a886c5a8585b8fd195a78c058d5..8412c62f4711a775f8ddb22f4750656da64256d6 100644
--- a/entity/TopicTree_entity/entityfields/createexpand/children/createchildtopic/onActionProcess.js
+++ b/entity/TopicTree_entity/entityfields/createexpand/children/createchildtopic/onActionProcess.js
@@ -6,8 +6,7 @@ import("Attribute_lib");
 var params = {};
 if (vars.exists("$sys.selection"))
 {
-    var row = vars.get("$sys.selection");
-    var topicTreeId = row[0];
+    var topicTreeId = vars.get("$field.TOPICTREEID");
     params["AssignedToId_param"] = topicTreeId;
 }
 neon.openContextWithRecipe("TopicTree", "TopicTreeEdit_view", neonFilter.createEntityRecordsRecipeBuilder().parameters(params).toString(), neon.OPERATINGSTATE_NEW);
\ No newline at end of file
diff --git a/entity/TopicTree_entity/entityfields/createexpand/children/createchildtopic/stateProcess.js b/entity/TopicTree_entity/entityfields/createexpand/children/createchildtopic/stateProcess.js
index 0e259b3b846e565b0793a70b3fb37cd1a53515d4..2a720a7a63ae74539c9ea4f907fbc6ab53973b75 100644
--- a/entity/TopicTree_entity/entityfields/createexpand/children/createchildtopic/stateProcess.js
+++ b/entity/TopicTree_entity/entityfields/createexpand/children/createchildtopic/stateProcess.js
@@ -1,3 +1,4 @@
+import("Util_lib");
 import("system.result");
 import("system.eMath");
 import("system.neon");
@@ -8,10 +9,10 @@ var state = neon.COMPONENTSTATE_DISABLED;
 
 if(operatingState != neon.OPERATINGSTATE_NEW && operatingState != neon.OPERATINGSTATE_EDIT)
 {
-    var selection = vars.get("$sys.selectionRows")[0];
-    if(selection && selection.sortingHelper != "")
+    var selection = vars.get("$sys.selectionsRecordsRecipe");
+    if(selection && JSON.parse(selection)["uidsIncludelist"][0] && Utils.isNotNullOrEmptyString(vars.get("$field.sortingHelper")))
     {
-        var sortingObj = JSON.parse(selection.sortingHelper);
+        var sortingObj = JSON.parse(vars.get("$field.sortingHelper"));
         var layer = sortingObj.sortingLayer;
         if(layer != "SORTING_LAYER_6")
         {
diff --git a/entity/TopicTree_entity/entityfields/more/children/copy/onActionProcess.js b/entity/TopicTree_entity/entityfields/more/children/copy/onActionProcess.js
index 04b811522dd2345d2ed9a5804b39af8e1eed7479..e52ea430b4aeed3d00ad9faaa70fc53e8e07edbc 100644
--- a/entity/TopicTree_entity/entityfields/more/children/copy/onActionProcess.js
+++ b/entity/TopicTree_entity/entityfields/more/children/copy/onActionProcess.js
@@ -1,7 +1,24 @@
 import("TopicTree_lib");
 import("system.vars");
 
-var topicDatSet = vars.get("$sys.selectionRows")[0];
+var topicDatSet = {};
+topicDatSet["ACTIVE"] = vars.get("$field.ACTIVE");
+topicDatSet["ASSIGNEDTO"] = vars.get("$field.ASSIGNEDTO");
+topicDatSet["DATE_EDIT"] = vars.get("$field.DATE_EDIT");
+topicDatSet["DATE_NEW"] = vars.get("$field.DATE_NEW");
+topicDatSet["SORTING_LAYER_1"] = vars.get("$field.SORTING_LAYER_1");
+topicDatSet["SORTING_LAYER_2"] = vars.get("$field.SORTING_LAYER_2");
+topicDatSet["SORTING_LAYER_3"] = vars.get("$field.SORTING_LAYER_3");
+topicDatSet["SORTING_LAYER_4"] = vars.get("$field.SORTING_LAYER_4");
+topicDatSet["SORTING_LAYER_5"] = vars.get("$field.SORTING_LAYER_5");
+topicDatSet["SORTING_LAYER_6"] = vars.get("$field.SORTING_LAYER_6");
+topicDatSet["TOPIC"] = vars.get("$field.TOPIC");
+topicDatSet["DESCRIPTION"] = vars.get("$field.DESCRIPTION");
+topicDatSet["TOPICTREEID"] = vars.get("$field.TOPICTREEID");
+topicDatSet["#UID"] = vars.get("$field.UID");
+topicDatSet["USER_EDIT"] = vars.get("$field.USER_EDIT");
+topicDatSet["USER_NEW"] = vars.get("$field.USER_NEW");
+topicDatSet["sortingHelper"] = vars.get("$field.sortingHelper");
 
 vars.set("$context.HasToBeCut", false);
 vars.set("$context.Copied", JSON.stringify({dataset: topicDatSet
diff --git a/entity/TopicTree_entity/entityfields/more/children/copy/stateProcess.js b/entity/TopicTree_entity/entityfields/more/children/copy/stateProcess.js
deleted file mode 100644
index 3f81b4f375b84c14050bdfc7577055d5b20216e8..0000000000000000000000000000000000000000
--- a/entity/TopicTree_entity/entityfields/more/children/copy/stateProcess.js
+++ /dev/null
@@ -1,12 +0,0 @@
-import("system.db");
-import("system.neon");
-import("system.result");
-import("system.vars");
-
-var selection = vars.get("$sys.selectionRows")[0];
-var state = neon.COMPONENTSTATE_DISABLED;
-if(selection)
-{
-    state = neon.COMPONENTSTATE_EDITABLE;
-}
-result.string(state);
\ No newline at end of file
diff --git a/entity/TopicTree_entity/entityfields/more/children/cut/onActionProcess.js b/entity/TopicTree_entity/entityfields/more/children/cut/onActionProcess.js
index 0de3d45cd47a69ec2c21c7667178f5540f52ae6f..aa044d1eed03eb687910f30234bfc54636fc741e 100644
--- a/entity/TopicTree_entity/entityfields/more/children/cut/onActionProcess.js
+++ b/entity/TopicTree_entity/entityfields/more/children/cut/onActionProcess.js
@@ -1,7 +1,23 @@
 import("TopicTree_lib");
 import("system.vars");
 
-var topicDatSet = vars.get("$sys.selectionRows")[0];
+var topicDatSet = {};
+topicDatSet["ACTIVE"] = vars.get("$field.ACTIVE");
+topicDatSet["ASSIGNEDTO"] = vars.get("$field.ASSIGNEDTO");
+topicDatSet["DATE_EDIT"] = vars.get("$field.DATE_EDIT");
+topicDatSet["DATE_NEW"] = vars.get("$field.DATE_NEW");
+topicDatSet["SORTING_LAYER_1"] = vars.get("$field.SORTING_LAYER_1");
+topicDatSet["SORTING_LAYER_2"] = vars.get("$field.SORTING_LAYER_2");
+topicDatSet["SORTING_LAYER_3"] = vars.get("$field.SORTING_LAYER_3");
+topicDatSet["SORTING_LAYER_4"] = vars.get("$field.SORTING_LAYER_4");
+topicDatSet["SORTING_LAYER_5"] = vars.get("$field.SORTING_LAYER_5");
+topicDatSet["SORTING_LAYER_6"] = vars.get("$field.SORTING_LAYER_6");
+topicDatSet["TOPIC"] = vars.get("$field.TOPIC");
+topicDatSet["TOPICTREEID"] = vars.get("$field.TOPICTREEID");
+topicDatSet["#UID"] = vars.get("$field.UID");
+topicDatSet["USER_EDIT"] = vars.get("$field.USER_EDIT");
+topicDatSet["USER_NEW"] = vars.get("$field.USER_NEW");
+topicDatSet["sortingHelper"] = vars.get("$field.sortingHelper");
 
 vars.set("$context.Copied", JSON.stringify({dataset: topicDatSet
                                             , amountOfLayers: TopicTreeUtils.getAmountOfLayers(topicDatSet)}));
diff --git a/entity/TopicTree_entity/entityfields/more/children/cut/stateProcess.js b/entity/TopicTree_entity/entityfields/more/children/cut/stateProcess.js
index da1b7324b98030e890d11a91b7cfc7a470ae77de..89f86e7d116f89b87b1801a56c981ff7f8e88786 100644
--- a/entity/TopicTree_entity/entityfields/more/children/cut/stateProcess.js
+++ b/entity/TopicTree_entity/entityfields/more/children/cut/stateProcess.js
@@ -1,14 +1,32 @@
+import("Util_lib");
 import("system.neon");
 import("system.result");
 import("Sql_lib");
 import("TopicTree_lib");
 import("system.vars");
 
-var selection = vars.get("$sys.selectionRows");
+var selection = vars.get("$sys.selectionsRecordsRecipe");
 var state = neon.COMPONENTSTATE_DISABLED;
-if(selection && selection.length > 0)
+if(selection && !Utils.isNullOrEmpty(selection[0]))
 {
-    var topicDatSet = selection[0];
+    var topicDatSet = {};
+    topicDatSet["ACTIVE"] = vars.get("$field.ACTIVE");
+    topicDatSet["ASSIGNEDTO"] = vars.get("$field.ASSIGNEDTO");
+    topicDatSet["DATE_EDIT"] = vars.get("$field.DATE_EDIT");
+    topicDatSet["DATE_NEW"] = vars.get("$field.DATE_NEW");
+    topicDatSet["SORTING_LAYER_1"] = vars.get("$field.SORTING_LAYER_1");
+    topicDatSet["SORTING_LAYER_2"] = vars.get("$field.SORTING_LAYER_2");
+    topicDatSet["SORTING_LAYER_3"] = vars.get("$field.SORTING_LAYER_3");
+    topicDatSet["SORTING_LAYER_4"] = vars.get("$field.SORTING_LAYER_4");
+    topicDatSet["SORTING_LAYER_5"] = vars.get("$field.SORTING_LAYER_5");
+    topicDatSet["SORTING_LAYER_6"] = vars.get("$field.SORTING_LAYER_6");
+    topicDatSet["TOPIC"] = vars.get("$field.TOPIC");
+    topicDatSet["TOPICTREEID"] = vars.get("$field.TOPICTREEID");
+    topicDatSet["#UID"] = vars.get("$field.UID");
+    topicDatSet["USER_EDIT"] = vars.get("$field.USER_EDIT");
+    topicDatSet["USER_NEW"] = vars.get("$field.USER_NEW");
+    topicDatSet["sortingHelper"] = vars.get("$field.sortingHelper");
+    
     var topicIds = TopicTreeUtils.getSubTopicIds(topicDatSet);
 
     var count = 0;
diff --git a/entity/TopicTree_entity/entityfields/more/children/first/onActionProcess.js b/entity/TopicTree_entity/entityfields/more/children/first/onActionProcess.js
index 328ca8c9be6d35e44604c2cecfc8c137d4f331a0..ea59797c078d3c393fd4deafa427de37a46bc68c 100644
--- a/entity/TopicTree_entity/entityfields/more/children/first/onActionProcess.js
+++ b/entity/TopicTree_entity/entityfields/more/children/first/onActionProcess.js
@@ -2,11 +2,10 @@ import("system.neon");
 import("TopicTree_lib");
 import("system.vars");
 
-var selection = vars.get("$sys.selectionRows")[0];
-var topicTreeid = selection["#UID"];
-var sortingHelper = JSON.parse(selection.sortingHelper);
-var currentLayer = TopicTreeUtils.getLayer(selection.SORTING_LAYER_1, selection.SORTING_LAYER_2, selection.SORTING_LAYER_3, selection.SORTING_LAYER_4, selection.SORTING_LAYER_5, selection.SORTING_LAYER_6);
-var assignedTo = selection.ASSIGNEDTO == "" ? $TopicTreeConstants.TOPTOPIC() : selection.ASSIGNEDTO;
+var topicTreeid = vars.get("$field.UID");
+var sortingHelper = JSON.parse(vars.get("$field.sortingHelper"));
+var currentLayer = TopicTreeUtils.getLayer(vars.get("$field.SORTING_LAYER_1"), vars.get("$field.SORTING_LAYER_2"), vars.get("$field.SORTING_LAYER_3"), vars.get("$field.SORTING_LAYER_4"), vars.get("$field.SORTING_LAYER_5"), vars.get("$field.SORTING_LAYER_6"));
+var assignedTo = vars.get("$field.ASSIGNEDTO") == "" ? $TopicTreeConstants.TOPTOPIC() : vars.get("$field.ASSIGNEDTO");
 
 TopicTreeUtils.movePosition(topicTreeid, $TopicTreeMoveDirections.TOP(), sortingHelper.maxSortingValue, assignedTo, sortingHelper.ownSortingValue, currentLayer);
 neon.refreshAll();
\ No newline at end of file
diff --git a/entity/TopicTree_entity/entityfields/more/children/first/stateProcess.js b/entity/TopicTree_entity/entityfields/more/children/first/stateProcess.js
index 1a90e3c289a1d561f6959c35adef58380815ab50..ba9a2d08fdd217b67f5b8d2f79edb435537ae527 100644
--- a/entity/TopicTree_entity/entityfields/more/children/first/stateProcess.js
+++ b/entity/TopicTree_entity/entityfields/more/children/first/stateProcess.js
@@ -1,3 +1,4 @@
+import("Util_lib");
 import("system.result");
 import("system.eMath");
 import("system.neon");
@@ -7,10 +8,10 @@ var operatingState = vars.get("$sys.operatingstate");
 var state = neon.COMPONENTSTATE_DISABLED;
 if(operatingState != neon.OPERATINGSTATE_NEW && operatingState != neon.OPERATINGSTATE_EDIT)
 {
-    var selection = vars.get("$sys.selectionRows")[0];
-    if(selection && selection.sortingHelper != "")
+    var selection = vars.get("$sys.selectionsRecordsRecipe");
+    if(selection && JSON.parse(selection)["uidsIncludelist"][0] && Utils.isNotNullOrEmptyString(vars.get("$field.sortingHelper")))
     {
-        var sortingObj = JSON.parse(selection.sortingHelper);
+        var sortingObj = JSON.parse(vars.get("$field.sortingHelper"));
         var ownSortingValue = sortingObj.ownSortingValue;
         if(ownSortingValue != 1)
         {
diff --git a/entity/TopicTree_entity/entityfields/more/children/last/onActionProcess.js b/entity/TopicTree_entity/entityfields/more/children/last/onActionProcess.js
index bb26a0d1dc66b815e53da2d5b26d61755918f8c7..44691e40d5fc7201f895ba168b4de99e5e7bf43c 100644
--- a/entity/TopicTree_entity/entityfields/more/children/last/onActionProcess.js
+++ b/entity/TopicTree_entity/entityfields/more/children/last/onActionProcess.js
@@ -2,11 +2,10 @@ import("system.neon");
 import("TopicTree_lib");
 import("system.vars");
 
-var selection = vars.get("$sys.selectionRows")[0];
-var topicTreeid = selection["#UID"];
-var sortingHelper = JSON.parse(selection.sortingHelper);
-var currentLayer = TopicTreeUtils.getLayer(selection.SORTING_LAYER_1, selection.SORTING_LAYER_2, selection.SORTING_LAYER_3, selection.SORTING_LAYER_4, selection.SORTING_LAYER_5, selection.SORTING_LAYER_6);
-var assignedTo = selection.ASSIGNEDTO == "" ? $TopicTreeConstants.TOPTOPIC() : selection.ASSIGNEDTO;
+var topicTreeid = vars.get("$field.UID");
+var sortingHelper = JSON.parse(vars.get("$field.sortingHelper"));
+var currentLayer = TopicTreeUtils.getLayer(vars.get("$field.SORTING_LAYER_1"), vars.get("$field.SORTING_LAYER_2"), vars.get("$field.SORTING_LAYER_3"), vars.get("$field.SORTING_LAYER_4"), vars.get("$field.SORTING_LAYER_5"), vars.get("$field.SORTING_LAYER_6"));
+var assignedTo = vars.get("$field.ASSIGNEDTO") == "" ? $TopicTreeConstants.TOPTOPIC() : vars.get("$field.ASSIGNEDTO");
 
 TopicTreeUtils.movePosition(topicTreeid, $TopicTreeMoveDirections.BOTTOM(), sortingHelper.maxSortingValue, assignedTo, sortingHelper.ownSortingValue, currentLayer);
 neon.refreshAll();
\ No newline at end of file
diff --git a/entity/TopicTree_entity/entityfields/more/children/last/stateProcess.js b/entity/TopicTree_entity/entityfields/more/children/last/stateProcess.js
index b0e5ad3ee6202c8d7ff8d87f57046373570a60c6..8ce0611a7677702383f48477565fd8a8508ac73d 100644
--- a/entity/TopicTree_entity/entityfields/more/children/last/stateProcess.js
+++ b/entity/TopicTree_entity/entityfields/more/children/last/stateProcess.js
@@ -1,3 +1,4 @@
+import("Util_lib");
 import("system.result");
 import("system.eMath");
 import("system.neon");
@@ -8,10 +9,10 @@ var state = neon.COMPONENTSTATE_DISABLED;
 
 if(operatingState != neon.OPERATINGSTATE_NEW && operatingState != neon.OPERATINGSTATE_EDIT)
 {
-    var selection = vars.get("$sys.selectionRows")[0];
-    if(selection && selection.sortingHelper != "")
+    var selection = vars.get("$sys.selectionsRecordsRecipe");
+    if(selection && JSON.parse(selection)["uidsIncludelist"][0] && Utils.isNotNullOrEmptyString(vars.get("$field.sortingHelper")))
     {
-        var sortingObj = JSON.parse(selection.sortingHelper);
+        var sortingObj = JSON.parse(vars.get("$field.sortingHelper"));
         var maxSorting = sortingObj.maxSortingValue;
         var ownSortingValue = sortingObj.ownSortingValue;
         if(eMath.addInt(ownSortingValue, 1) <= maxSorting)
diff --git a/entity/TopicTree_entity/entityfields/more/children/movedown/onActionProcess.js b/entity/TopicTree_entity/entityfields/more/children/movedown/onActionProcess.js
index cf3eac3f952dd7fd3aeeb3f9602680e61789caad..ce04d4afde09e23cc7e2cb793ab0f57294623270 100644
--- a/entity/TopicTree_entity/entityfields/more/children/movedown/onActionProcess.js
+++ b/entity/TopicTree_entity/entityfields/more/children/movedown/onActionProcess.js
@@ -2,11 +2,10 @@ import("system.neon");
 import("TopicTree_lib");
 import("system.vars");
 
-var selection = vars.get("$sys.selectionRows")[0];
-var topicTreeid = selection["#UID"];
-var sortingHelper = JSON.parse(selection.sortingHelper);
-var currentLayer = TopicTreeUtils.getLayer(selection.SORTING_LAYER_1, selection.SORTING_LAYER_2, selection.SORTING_LAYER_3, selection.SORTING_LAYER_4, selection.SORTING_LAYER_5, selection.SORTING_LAYER_6);
-var assignedTo = selection.ASSIGNEDTO == "" ? $TopicTreeConstants.TOPTOPIC() : selection.ASSIGNEDTO;
+var topicTreeid = vars.get("$field.UID");
+var sortingHelper = JSON.parse(vars.get("$field.sortingHelper"));
+var currentLayer = TopicTreeUtils.getLayer(vars.get("$field.SORTING_LAYER_1"), vars.get("$field.SORTING_LAYER_2"), vars.get("$field.SORTING_LAYER_3"), vars.get("$field.SORTING_LAYER_4"), vars.get("$field.SORTING_LAYER_5"), vars.get("$field.SORTING_LAYER_6"));
+var assignedTo = vars.get("$field.ASSIGNEDTO") == "" ? $TopicTreeConstants.TOPTOPIC() : vars.get("$field.ASSIGNEDTO");
 
 TopicTreeUtils.movePosition(topicTreeid, $TopicTreeMoveDirections.DOWN(), sortingHelper.maxSortingValue, assignedTo, sortingHelper.ownSortingValue, currentLayer);
 neon.refreshAll();
\ No newline at end of file
diff --git a/entity/TopicTree_entity/entityfields/more/children/movedown/stateProcess.js b/entity/TopicTree_entity/entityfields/more/children/movedown/stateProcess.js
index b0e5ad3ee6202c8d7ff8d87f57046373570a60c6..8ce0611a7677702383f48477565fd8a8508ac73d 100644
--- a/entity/TopicTree_entity/entityfields/more/children/movedown/stateProcess.js
+++ b/entity/TopicTree_entity/entityfields/more/children/movedown/stateProcess.js
@@ -1,3 +1,4 @@
+import("Util_lib");
 import("system.result");
 import("system.eMath");
 import("system.neon");
@@ -8,10 +9,10 @@ var state = neon.COMPONENTSTATE_DISABLED;
 
 if(operatingState != neon.OPERATINGSTATE_NEW && operatingState != neon.OPERATINGSTATE_EDIT)
 {
-    var selection = vars.get("$sys.selectionRows")[0];
-    if(selection && selection.sortingHelper != "")
+    var selection = vars.get("$sys.selectionsRecordsRecipe");
+    if(selection && JSON.parse(selection)["uidsIncludelist"][0] && Utils.isNotNullOrEmptyString(vars.get("$field.sortingHelper")))
     {
-        var sortingObj = JSON.parse(selection.sortingHelper);
+        var sortingObj = JSON.parse(vars.get("$field.sortingHelper"));
         var maxSorting = sortingObj.maxSortingValue;
         var ownSortingValue = sortingObj.ownSortingValue;
         if(eMath.addInt(ownSortingValue, 1) <= maxSorting)
diff --git a/entity/TopicTree_entity/entityfields/more/children/moveup/onActionProcess.js b/entity/TopicTree_entity/entityfields/more/children/moveup/onActionProcess.js
index 681a3bf3fc485a4acc07910702c796b4243736e7..cb36836948f3b8d586981cb1ec26fee53ee3e995 100644
--- a/entity/TopicTree_entity/entityfields/more/children/moveup/onActionProcess.js
+++ b/entity/TopicTree_entity/entityfields/more/children/moveup/onActionProcess.js
@@ -2,11 +2,10 @@ import("system.neon");
 import("TopicTree_lib");
 import("system.vars");
 
-var selection = vars.get("$sys.selectionRows")[0];
-var topicTreeid = selection["#UID"];
-var sortingHelper = JSON.parse(selection.sortingHelper);
-var currentLayer = TopicTreeUtils.getLayer(selection.SORTING_LAYER_1, selection.SORTING_LAYER_2, selection.SORTING_LAYER_3, selection.SORTING_LAYER_4, selection.SORTING_LAYER_5, selection.SORTING_LAYER_6);
-var assignedTo = selection.ASSIGNEDTO == "" ? $TopicTreeConstants.TOPTOPIC() : selection.ASSIGNEDTO;
+var topicTreeid = vars.get("$field.UID");
+var sortingHelper = JSON.parse(vars.get("$field.sortingHelper"));
+var currentLayer = TopicTreeUtils.getLayer(vars.get("$field.SORTING_LAYER_1"), vars.get("$field.SORTING_LAYER_2"), vars.get("$field.SORTING_LAYER_3"), vars.get("$field.SORTING_LAYER_4"), vars.get("$field.SORTING_LAYER_5"), vars.get("$field.SORTING_LAYER_6"));
+var assignedTo = vars.get("$field.ASSIGNEDTO") == "" ? $TopicTreeConstants.TOPTOPIC() : vars.get("$field.ASSIGNEDTO");
 
 TopicTreeUtils.movePosition(topicTreeid, $TopicTreeMoveDirections.UP(), sortingHelper.maxSortingValue, assignedTo, sortingHelper.ownSortingValue, currentLayer);
 neon.refreshAll();
\ No newline at end of file
diff --git a/entity/TopicTree_entity/entityfields/more/children/moveup/stateProcess.js b/entity/TopicTree_entity/entityfields/more/children/moveup/stateProcess.js
index c9a5b7f7c30ab18ec91fcb66f666b578229cbeba..6bdcb5e368813e12533d9375511d67ba6c0a18f8 100644
--- a/entity/TopicTree_entity/entityfields/more/children/moveup/stateProcess.js
+++ b/entity/TopicTree_entity/entityfields/more/children/moveup/stateProcess.js
@@ -1,3 +1,4 @@
+import("Util_lib");
 import("system.result");
 import("system.eMath");
 import("system.neon");
@@ -8,10 +9,10 @@ var state = neon.COMPONENTSTATE_DISABLED;
 
 if(operatingState != neon.OPERATINGSTATE_NEW && operatingState != neon.OPERATINGSTATE_EDIT)
 {
-    var selection = vars.get("$sys.selectionRows")[0];
-    if(selection && selection.sortingHelper != "")
+    var selection = vars.get("$sys.selectionsRecordsRecipe");
+    if(selection && JSON.parse(selection)["uidsIncludelist"][0] && Utils.isNotNullOrEmptyString(vars.get("$field.sortingHelper")))
     {
-        var sortingObj = JSON.parse(selection.sortingHelper);
+        var sortingObj = JSON.parse(vars.get("$field.sortingHelper"));
         var ownSortingValue = sortingObj.ownSortingValue;
         if(ownSortingValue != 1)
         {
diff --git a/entity/TopicTree_entity/entityfields/more/children/paste/stateProcess.js b/entity/TopicTree_entity/entityfields/more/children/paste/stateProcess.js
index b3d1749a90e97dfa9eb17f2796232285e65dd2b6..e08bc5a1e1ca539141ac55e80792846a7fa3bef7 100644
--- a/entity/TopicTree_entity/entityfields/more/children/paste/stateProcess.js
+++ b/entity/TopicTree_entity/entityfields/more/children/paste/stateProcess.js
@@ -1,3 +1,4 @@
+import("Sql_lib");
 import("system.eMath");
 import("TopicTree_lib");
 import("system.db");
@@ -7,9 +8,9 @@ import("system.vars");
 
 var selection = vars.get("$sys.selectionRows")[0];
 var state = neon.COMPONENTSTATE_DISABLED;
-if(selection && vars.exists("$context.Copied"))
+if(vars.get("$sys.selectionsRecordsRecipe") && JSON.parse(vars.get("$sys.selectionsRecordsRecipe")) && vars.exists("$context.Copied"))
 {
-    var layer = TopicTreeUtils.returnNumberOfLayerName(JSON.parse(selection["sortingHelper"])["sortingLayer"]);
+    var layer = TopicTreeUtils.returnNumberOfLayerName(JSON.parse(vars.get("$field.sortingHelper"))["sortingLayer"]);
     var amountOfLayers = JSON.parse(vars.get("$context.Copied"))["amountOfLayers"];
     
     if(eMath.addInt(amountOfLayers, layer) <= TopicTreeUtils.getArrayLayers().length)//this tree doesn't work endlessly, so we can*t allow the user to create more layers than we allow
@@ -19,7 +20,7 @@ if(selection && vars.exists("$context.Copied"))
             var copiedTopicTreeId = JSON.parse(vars.get("$context.Copied"))["dataset"];
             var topicTreeIds = TopicTreeUtils.getSubTopicIds(copiedTopicTreeId);
             topicTreeIds.push(copiedTopicTreeId);
-            var pasteTopicTreeId = selection["#UID"];
+            var pasteTopicTreeId = vars.get("$field.UID");
             if(!topicTreeIds.includes(pasteTopicTreeId))
             {
                 state = neon.COMPONENTSTATE_EDITABLE;
diff --git a/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod b/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod
index d44e9c22689eaad3357099bafa6d56ca6bd8c5e7..0782e9d922d004212d3b411508cf0e2c260557a0 100644
--- a/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod
+++ b/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod
@@ -4525,10 +4525,10 @@
       <key>Shows unread notifications about different content, e.g. Appointments, serial mails, ...</key>
     </entry>
     <entry>
-      <key>Shows how many sales projects are in the various sales phases</key>
+      <key>Show how many sales projects are in the various sales phases</key>
     </entry>
     <entry>
-      <key>Most important salse key figures</key>
+      <key>Most important Sales key figures</key>
     </entry>
     <entry>
       <key>Shows the organisations turnover and forecast</key>
@@ -4828,7 +4828,7 @@
       <key>My Forecast and Turnover </key>
     </entry>
     <entry>
-      <key>Shows my Forecast and Turnover for the actual year</key>
+      <key>Show my Forecast and Turnover for the current year</key>
     </entry>
     <entry>
       <key>My Forecast and Turnover</key>
@@ -7744,7 +7744,7 @@
       <key>Sales Project Id</key>
     </entry>
     <entry>
-      <key>Sales Project Convertion Rates</key>
+      <key>Sales Project Conversion Rates</key>
     </entry>
     <entry>
       <key>Set Campaign Step</key>
@@ -9269,7 +9269,7 @@
       <key>First Approval</key>
     </entry>
     <entry>
-      <key>show all offers with second approval</key>
+      <key>Show all offers with second approval</key>
     </entry>
     <entry>
       <key>Second Approval</key>
@@ -9278,7 +9278,7 @@
       <key>Approval denied</key>
     </entry>
     <entry>
-      <key>show all offers with first approval</key>
+      <key>Show all offers with first approval</key>
     </entry>
     <entry>
       <key>[TEST] Importer</key>
@@ -11214,13 +11214,25 @@
       <key>Reveal the price in the offer</key>
     </entry>
     <entry>
-      <key>Discount in %0</key>
+      <key>Valid from (as %0)</key>
     </entry>
     <entry>
-      <key>You were assigned as new district contact to district %0 and %1 organisation(s).</key>
+      <key>Calculate sum</key>
     </entry>
     <entry>
-      <key>Valid from (as %0)</key>
+      <key>Offers / Receipts</key>
+    </entry>
+    <entry>
+      <key>${CONTEXT}</key>
+    </entry>
+    <entry>
+      <key>Manual resynchronization</key>
+    </entry>
+    <entry>
+      <key>Discount in %0</key>
+    </entry>
+    <entry>
+      <key>You were assigned as new district contact to district %0 and %1 organisation(s).</key>
     </entry>
     <entry>
       <key>Set parent district</key>
@@ -11232,16 +11244,82 @@
       <key>Set auto assignment</key>
     </entry>
     <entry>
-      <key>Subject and Body</key>
+      <key>No Datasets selected</key>
     </entry>
     <entry>
-      <key>Calculate sum</key>
+      <key>Subject and Body</key>
     </entry>
     <entry>
       <key>Serial action</key>
     </entry>
     <entry>
-      <key>Offers / Receipts</key>
+      <key>Slave UID</key>
+    </entry>
+    <entry>
+      <key>AsysAudit Clean Up</key>
+    </entry>
+    <entry>
+      <key>EWS - Manage Synctable</key>
+    </entry>
+    <entry>
+      <key>Start Workflow</key>
+    </entry>
+    <entry>
+      <key>Beschreibung</key>
+    </entry>
+    <entry>
+      <key>EWS - Sync to Exchange</key>
+    </entry>
+    <entry>
+      <key>Search Synchronisation</key>
+    </entry>
+    <entry>
+      <key>Last synchronized</key>
+    </entry>
+    <entry>
+      <key>Intervall</key>
+    </entry>
+    <entry>
+      <key>Intervall setzen</key>
+    </entry>
+    <entry>
+      <key>[TEST] Util_lib - ArrayUtils</key>
+    </entry>
+    <entry>
+      <key>Mosaico template</key>
+    </entry>
+    <entry>
+      <key>Mosaico</key>
+    </entry>
+    <entry>
+      <key>Input</key>
+    </entry>
+    <entry>
+      <key>Advertising Id</key>
+    </entry>
+    <entry>
+      <key>Advertisingitem Id</key>
+    </entry>
+    <entry>
+      <key>Device ID</key>
+    </entry>
+    <entry>
+      <key>Show my tickets that are in process.</key>
+    </entry>
+    <entry>
+      <key>Propkey</key>
+    </entry>
+    <entry>
+      <key>[TEST] ZippingUtil_lib</key>
+    </entry>
+    <entry>
+      <key>LastSync zurücksetzen</key>
+    </entry>
+    <entry>
+      <key>Device ID Reset</key>
+    </entry>
+    <entry>
+      <key>Show the finished Tickets in the last 4 weeks</key>
     </entry>
     <entry>
       <key>Kd.-Nr.</key>
diff --git a/language/_____LANGUAGE_de/_____LANGUAGE_de.aod b/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
index f7c82450ec94b2cd45f0a93c68b5fd127bcec0e1..532024e389c769afd31ba805f59f2b4e581919d2 100644
--- a/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
+++ b/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
@@ -10,6 +10,10 @@
       <key>The file did not contain any data</key>
       <value>Die Datei enthielt keine Daten</value>
     </entry>
+    <entry>
+      <key>by translated title</key>
+      <value>Titel (übersetzt)</value>
+    </entry>
     <entry>
       <key>Slave administration</key>
       <value>Slave Verwaltung</value>
@@ -299,9 +303,13 @@
       <key>Fullfilled</key>
       <value>erledigt</value>
     </entry>
+    <entry>
+      <key>No Datasets selected</key>
+      <value>Keine Datensätze ausgewählt</value>
+    </entry>
     <entry>
       <key>A Phase filter has to be set when creating a checklistentry for the Salesproject Context.</key>
-      <value>Es muss ein Filter auf die Phase gesetzt werden wenn der VertriebsprojektKontext ausgewählt ist.</value>
+      <value>Es muss ein Filter auf die Phase gesetzt werden, wenn der Context Vertriebsprojekt ausgewählt ist.</value>
     </entry>
     <entry>
       <key>Redirect needs a full URL with http/https</key>
@@ -2236,6 +2244,10 @@
       <key>Discount</key>
       <value>Rabatt</value>
     </entry>
+    <entry>
+      <key>Discount in %</key>
+      <value>Rabatt in %</value>
+    </entry>
     <entry>
       <key>Sales</key>
       <value>Vertrieb</value>
@@ -3347,10 +3359,6 @@
       <key>Keyword</key>
       <value>Schlüsselwort</value>
     </entry>
-    <entry>
-      <key>Manually</key>
-      <value>Manuell</value>
-    </entry>
     <entry>
       <key>Sorting</key>
       <value>Sortierung</value>
@@ -7673,6 +7681,10 @@
       <key>(drop mails here)</key>
       <value>(E-Mails per Drag and Drop einfügen)</value>
     </entry>
+    <entry>
+      <key>manually</key>
+      <value>manuell</value>
+    </entry>
     <entry>
       <key>minute</key>
       <value>Minute</value>
@@ -7721,6 +7733,10 @@
       <key>seconds</key>
       <value>Sekunden</value>
     </entry>
+    <entry>
+      <key>by title</key>
+      <value>Titel</value>
+    </entry>
     <entry>
       <key>Duplicatescan</key>
       <value>Dublettenermittlung</value>
@@ -7850,11 +7866,11 @@
       <value>Zeigt alle ungelesenen Benachrichtigungen mit verschiedenen Inhalten, z.B. zu Terminen, Serienmails</value>
     </entry>
     <entry>
-      <key>Shows how many sales projects are in the various sales phases</key>
+      <key>Show how many sales projects are in the various sales phases</key>
       <value>Zeigt wie viele Vertriebsprojekte in den einzelnen Vertriebsphasen sind</value>
     </entry>
     <entry>
-      <key>Most important salse key figures</key>
+      <key>Most important Sales key figures</key>
       <value>Zeigt die wichtigsten Vertriebskennzahlen</value>
     </entry>
     <entry>
@@ -8298,6 +8314,10 @@
       <key>${CONTRACT_STATUS}</key>
       <value>Vertragsstatus</value>
     </entry>
+    <entry>
+      <key>${CONTEXT}</key>
+      <value>Context</value>
+    </entry>
     <entry>
       <key>Time in minutes</key>
       <value>Zeit in Minuten</value>
@@ -8422,7 +8442,7 @@
       <value>Wird gelöscht</value>
     </entry>
     <entry>
-      <key>Shows my Forecast and Turnover for the actual year</key>
+      <key>Show my Forecast and Turnover for the current year</key>
       <value>Zeigt meinen Forecast und meinen Umsatz für das aktuelle Jahr</value>
     </entry>
     <entry>
@@ -9846,7 +9866,7 @@ Bitte Datumseingabe prüfen</value>
       <value>Eigenschaften setzen (verwende Filterergebnis)</value>
     </entry>
     <entry>
-      <key>show all offers with first approval</key>
+      <key>Show all offers with first approval</key>
       <value>Alle Angebote mit 1. Freigabe anzeigen</value>
     </entry>
     <entry>
@@ -10209,7 +10229,7 @@ Bitte Datumseingabe prüfen</value>
       <value>Neu</value>
     </entry>
     <entry>
-      <key>show all offers with second approval</key>
+      <key>Show all offers with second approval</key>
       <value>Alle Angebote mit 2. Freigabe anzeigen</value>
     </entry>
     <entry>
@@ -11173,7 +11193,7 @@ Bitte Datumseingabe prüfen</value>
     </entry>
     <entry>
       <key>Shows the different conversion rates of the sales project phases</key>
-      <value>zeigt die unterschiedlichen Umrechnungsraten der vertriebsprojektphasen</value>
+      <value>Zeigt die unterschiedlichen Conversion Rates der Vertriebsprojektphasen</value>
     </entry>
     <entry>
       <key>Salesproject Convertion Rates</key>
@@ -11399,7 +11419,7 @@ Bitte Datumseingabe prüfen</value>
       <value>VertriebsprojektId</value>
     </entry>
     <entry>
-      <key>Sales Project Convertion Rates</key>
+      <key>Sales Project Conversion Rates</key>
       <value>Vertriebsprojekt Umrechnungsraten</value>
     </entry>
     <entry>
@@ -14682,6 +14702,78 @@ Bitte Datumseingabe prüfen</value>
       <key>The roll out date must be after the project start!</key>
       <value>Das Roll Out Datum muss nach dem Projektstart liegen!</value>
     </entry>
+    <entry>
+      <key>Manual resynchronization</key>
+    </entry>
+    <entry>
+      <key>Slave UID</key>
+    </entry>
+    <entry>
+      <key>AsysAudit Clean Up</key>
+    </entry>
+    <entry>
+      <key>EWS - Manage Synctable</key>
+    </entry>
+    <entry>
+      <key>Start Workflow</key>
+    </entry>
+    <entry>
+      <key>Beschreibung</key>
+    </entry>
+    <entry>
+      <key>EWS - Sync to Exchange</key>
+    </entry>
+    <entry>
+      <key>Search Synchronisation</key>
+    </entry>
+    <entry>
+      <key>Last synchronized</key>
+    </entry>
+    <entry>
+      <key>Intervall</key>
+    </entry>
+    <entry>
+      <key>Intervall setzen</key>
+    </entry>
+    <entry>
+      <key>[TEST] Util_lib - ArrayUtils</key>
+    </entry>
+    <entry>
+      <key>Mosaico template</key>
+    </entry>
+    <entry>
+      <key>Mosaico</key>
+    </entry>
+    <entry>
+      <key>Input</key>
+    </entry>
+    <entry>
+      <key>Advertising Id</key>
+    </entry>
+    <entry>
+      <key>Advertisingitem Id</key>
+    </entry>
+    <entry>
+      <key>Device ID</key>
+    </entry>
+    <entry>
+      <key>Show my tickets that are in process.</key>
+    </entry>
+    <entry>
+      <key>Propkey</key>
+    </entry>
+    <entry>
+      <key>[TEST] ZippingUtil_lib</key>
+    </entry>
+    <entry>
+      <key>LastSync zurücksetzen</key>
+    </entry>
+    <entry>
+      <key>Device ID Reset</key>
+    </entry>
+    <entry>
+      <key>Show the finished Tickets in the last 4 weeks</key>
+    </entry>
     <entry>
       <key>Cust.-No.</key>
       <value>Kd.-Nr.</value>
diff --git a/language/_____LANGUAGE_en/_____LANGUAGE_en.aod b/language/_____LANGUAGE_en/_____LANGUAGE_en.aod
index a6265eee7104f369f46f413fb34e51d00d0cf0e3..fc12ad1b62673b0bbcf378e93b1c8bfae34aa693 100644
--- a/language/_____LANGUAGE_en/_____LANGUAGE_en.aod
+++ b/language/_____LANGUAGE_en/_____LANGUAGE_en.aod
@@ -4618,10 +4618,10 @@
       <key>Shows unread notifications about different content, e.g. Appointments, serial mails, ...</key>
     </entry>
     <entry>
-      <key>Shows how many sales projects are in the various sales phases</key>
+      <key>Show how many sales projects are in the various sales phases</key>
     </entry>
     <entry>
-      <key>Most important salse key figures</key>
+      <key>Most important Sales key figures</key>
     </entry>
     <entry>
       <key>Shows the organisations turnover and forecast</key>
@@ -4921,7 +4921,7 @@
       <key>My Forecast and Turnover </key>
     </entry>
     <entry>
-      <key>Shows my Forecast and Turnover for the actual year</key>
+      <key>Show my Forecast and Turnover for the current year</key>
     </entry>
     <entry>
       <key>My Forecast and Turnover</key>
@@ -7559,7 +7559,7 @@
       <key>Sales Project Id</key>
     </entry>
     <entry>
-      <key>Sales Project Convertion Rates</key>
+      <key>Sales Project Conversion Rates</key>
     </entry>
     <entry>
       <key>Set Campaign Step</key>
@@ -8716,7 +8716,7 @@
       <key>First Approval</key>
     </entry>
     <entry>
-      <key>show all offers with second approval</key>
+      <key>Show all offers with second approval</key>
     </entry>
     <entry>
       <key>Second Approval</key>
@@ -8725,7 +8725,7 @@
       <key>Approval denied</key>
     </entry>
     <entry>
-      <key>show all offers with first approval</key>
+      <key>Show all offers with first approval</key>
     </entry>
     <entry>
       <key>[TEST] Importer</key>
@@ -11304,13 +11304,26 @@
       <key>Reveal the price in the offer</key>
     </entry>
     <entry>
-      <key>Discount in %0</key>
+      <key>Valid from (as %0)</key>
     </entry>
     <entry>
-      <key>You were assigned as new district contact to district %0 and %1 organisation(s).</key>
+      <key>Calculate sum</key>
     </entry>
     <entry>
-      <key>Valid from (as %0)</key>
+      <key>Offers / Receipts</key>
+    </entry>
+    <entry>
+      <key>${CONTEXT}</key>
+      <value>Context</value>
+    </entry>
+    <entry>
+      <key>Manual resynchronization</key>
+    </entry>
+    <entry>
+      <key>Discount in %0</key>
+    </entry>
+    <entry>
+      <key>You were assigned as new district contact to district %0 and %1 organisation(s).</key>
     </entry>
     <entry>
       <key>Set parent district</key>
@@ -11322,16 +11335,82 @@
       <key>Set auto assignment</key>
     </entry>
     <entry>
-      <key>Subject and Body</key>
+      <key>No Datasets selected</key>
     </entry>
     <entry>
-      <key>Calculate sum</key>
+      <key>Subject and Body</key>
     </entry>
     <entry>
       <key>Serial action</key>
     </entry>
     <entry>
-      <key>Offers / Receipts</key>
+      <key>Slave UID</key>
+    </entry>
+    <entry>
+      <key>AsysAudit Clean Up</key>
+    </entry>
+    <entry>
+      <key>EWS - Manage Synctable</key>
+    </entry>
+    <entry>
+      <key>Start Workflow</key>
+    </entry>
+    <entry>
+      <key>Beschreibung</key>
+    </entry>
+    <entry>
+      <key>EWS - Sync to Exchange</key>
+    </entry>
+    <entry>
+      <key>Search Synchronisation</key>
+    </entry>
+    <entry>
+      <key>Last synchronized</key>
+    </entry>
+    <entry>
+      <key>Intervall</key>
+    </entry>
+    <entry>
+      <key>Intervall setzen</key>
+    </entry>
+    <entry>
+      <key>[TEST] Util_lib - ArrayUtils</key>
+    </entry>
+    <entry>
+      <key>Mosaico template</key>
+    </entry>
+    <entry>
+      <key>Mosaico</key>
+    </entry>
+    <entry>
+      <key>Input</key>
+    </entry>
+    <entry>
+      <key>Advertising Id</key>
+    </entry>
+    <entry>
+      <key>Advertisingitem Id</key>
+    </entry>
+    <entry>
+      <key>Device ID</key>
+    </entry>
+    <entry>
+      <key>Show my tickets that are in process.</key>
+    </entry>
+    <entry>
+      <key>Propkey</key>
+    </entry>
+    <entry>
+      <key>[TEST] ZippingUtil_lib</key>
+    </entry>
+    <entry>
+      <key>LastSync zurücksetzen</key>
+    </entry>
+    <entry>
+      <key>Device ID Reset</key>
+    </entry>
+    <entry>
+      <key>Show the finished Tickets in the last 4 weeks</key>
     </entry>
     <entry>
       <key>Kd.-Nr.</key>
diff --git a/neonView/MyTurnoverForecastScoreCard_view/MyTurnoverForecastScoreCard_view.aod b/neonView/MyTurnoverForecastScoreCard_view/MyTurnoverForecastScoreCard_view.aod
index 2c67b8c90a7d9a4c44ee74913267712e898bc580..e0798e0066c30ac73869ce15bd3d8f37a867a541 100644
--- a/neonView/MyTurnoverForecastScoreCard_view/MyTurnoverForecastScoreCard_view.aod
+++ b/neonView/MyTurnoverForecastScoreCard_view/MyTurnoverForecastScoreCard_view.aod
@@ -6,7 +6,7 @@
     <neonDashletConfiguration>
       <name>OwnForecastTurnover</name>
       <title>My Forecast and Turnover</title>
-      <description>Shows my Forecast and Turnover for the actual year</description>
+      <description>Show my Forecast and Turnover for the current year</description>
       <fragment>SalesprojectAnalyses/full</fragment>
       <singleton v="true" />
       <icon>VAADIN:MONEY</icon>
diff --git a/neonView/OfferFilter_view/OfferFilter_view.aod b/neonView/OfferFilter_view/OfferFilter_view.aod
index c92b2a4e556897e4650ea9c461118db38af63997..3e1f1de8a491a8670724b87e95278f1caf7b0bf4 100644
--- a/neonView/OfferFilter_view/OfferFilter_view.aod
+++ b/neonView/OfferFilter_view/OfferFilter_view.aod
@@ -45,7 +45,7 @@
     <neonDashletConfiguration>
       <name>FirstApprovalDashlet</name>
       <title>First Approval</title>
-      <description>show all offers with first approval</description>
+      <description>Show all offers with first approval</description>
       <fragment>Offer/filter</fragment>
       <singleton v="true" />
       <storeRoles>
@@ -69,7 +69,7 @@
     <neonDashletConfiguration>
       <name>SecondApprovalDashlet</name>
       <title>Second Approval</title>
-      <description>show all offers with second approval</description>
+      <description>Show all offers with second approval</description>
       <fragment>Offer/filter</fragment>
       <singleton v="true" />
       <storeRoles>
diff --git a/neonView/SalesprojectAnalyses_view/SalesprojectAnalyses_view.aod b/neonView/SalesprojectAnalyses_view/SalesprojectAnalyses_view.aod
index b2c99ae417a1dcab62f0a4ba4ff0ebf4383d0c32..cd0ba197cbf0e71645b7e47de0653e72d29488c5 100644
--- a/neonView/SalesprojectAnalyses_view/SalesprojectAnalyses_view.aod
+++ b/neonView/SalesprojectAnalyses_view/SalesprojectAnalyses_view.aod
@@ -7,7 +7,7 @@
     <neonDashletConfiguration>
       <name>SalesprojectPhases</name>
       <title>Sales Project Phases</title>
-      <description>Shows how many sales projects are in the various sales phases</description>
+      <description>Show how many sales projects are in the various sales phases</description>
       <fragment>Salesproject/filter?search=eyJ0eXBlIjoiZ3JvdXAiLCJvcGVyYXRvciI6IkFORCIsImNoaWxkcyI6W3sidHlwZSI6InJvdyIsIm5hbWUiOiJQSEFTRSIsIm9wZXJhdG9yIjoiTk9UX0VRVUFMIiwidmFsdWUiOiJOZWdvdGlhdGlvbiIsImtleSI6IlNBTFBST0pQSEFTRU5FR08iLCJjb250ZW50dHlwZSI6IlRFWFQifSx7InR5cGUiOiJyb3ciLCJuYW1lIjoiU1RBVFVTIiwib3BlcmF0b3IiOiJFUVVBTCIsInZhbHVlIjoiT2ZmZW4iLCJrZXkiOiJTQUxQUk9KU1RBVE9QRU4iLCJjb250ZW50dHlwZSI6IlRFWFQifV19&amp;axes=COUNT&amp;grouping=%23EXTENSION.Phase_filter.Phase_filter%23TEXT</fragment>
       <singleton v="true" />
       <storeRoles>
diff --git a/neonView/SalesprojectConversionRate_view/SalesprojectConversionRate_view.aod b/neonView/SalesprojectConversionRate_view/SalesprojectConversionRate_view.aod
index 9b9754063c92aea73ff8385c24c0c71b99d6ce29..7a28d81a49845ad55884dab9ef689d2f5aed1b1f 100644
--- a/neonView/SalesprojectConversionRate_view/SalesprojectConversionRate_view.aod
+++ b/neonView/SalesprojectConversionRate_view/SalesprojectConversionRate_view.aod
@@ -6,7 +6,7 @@
   <dashletConfigurations>
     <neonDashletConfiguration>
       <name>ConvertionRates</name>
-      <title>Sales Project Convertion Rates</title>
+      <title>Sales Project Conversion Rates</title>
       <description>Shows the different conversion rates of the sales project phases</description>
       <fragment>SalesprojectConversionRate/filter?search=eyJ0eXBlIjoiZ3JvdXAiLCJvcGVyYXRvciI6IkFORCIsImNoaWxkcyI6W3sidHlwZSI6InJvdyIsIm5hbWUiOiIjRVhURU5TSU9OLkRBVEVfU1RBUlQuREFURV9TVEFSVCNEQVRFIiwib3BlcmF0b3IiOiJUSU1FRlJBTUVfRVFVQUwiLCJ2YWx1ZSI6IkRpZXNlcyBKYWhyIiwia2V5IjoiUkVMPUFESlVTVEVEO1VOSVQ9WUVBUiIsImNvbnRlbnR0eXBlIjoiREFURSJ9XX0%3D&amp;axes=conversionRate&amp;grouping=AB_KEYWORD_ENTRYID_KEYID%2C%23EXTENSION.Month.Month%23NUMBER</fragment>
       <singleton v="true" />
diff --git a/neonView/SalesprojectScoreCard_view/SalesprojectScoreCard_view.aod b/neonView/SalesprojectScoreCard_view/SalesprojectScoreCard_view.aod
index 73440be89f0f0da0add22c6c1dc51542be009400..c52153ae682519c6c5bd24bdac8a2512a53258d2 100644
--- a/neonView/SalesprojectScoreCard_view/SalesprojectScoreCard_view.aod
+++ b/neonView/SalesprojectScoreCard_view/SalesprojectScoreCard_view.aod
@@ -6,7 +6,7 @@
     <neonDashletConfiguration>
       <name>KeyFigures</name>
       <title>Key Figures</title>
-      <description>Most important salse key figures</description>
+      <description>Most important Sales key figures</description>
       <fragment>SalesprojectAnalyses/full</fragment>
       <singleton v="true" />
       <storeRoles>
diff --git a/process/FilterViewAction_lib/process.js b/process/FilterViewAction_lib/process.js
index f79e4d3d548b181bf63dd9098ca8584d5db05c81..2ceb9bfc1fe2fdb55cc77020ed1fed08a79ed32a 100644
--- a/process/FilterViewAction_lib/process.js
+++ b/process/FilterViewAction_lib/process.js
@@ -71,12 +71,12 @@ FilterViewActionUtils.getUidsByEntityFilter = function (pContext, pFilter, pPara
     .entity(ContextUtils.getEntity(pContext))
     .fields(["#UID"]);
 
-    if (Utils.isNullOrEmpty(pFilter.filter))
+    if (!Utils.isNullOrEmpty(pFilter.filter))
     {
         loadRowsConfig.filter(JSON.stringify(pFilter.filter));
     }
 
-    if(Utils.isNullOrEmpty(pParameters))
+    if(!Utils.isNullOrEmpty(pParameters))
     {
         Object.keys(pParameters).forEach(function(key){
             loadRowsConfig.addParameter(key, pParameters[key])
diff --git a/process/KeywordRegistry_basic/process.js b/process/KeywordRegistry_basic/process.js
index 678044ed0455ad46831c71e6c63ba16bcfefbdca..96b33aae0bfb08e563dab33e33eac11420ccd979 100644
--- a/process/KeywordRegistry_basic/process.js
+++ b/process/KeywordRegistry_basic/process.js
@@ -521,6 +521,8 @@ $KeywordRegistry.linkEvaluationType$default = function(){return "LINKEVALUATION_
 $KeywordRegistry.linkEvaluationType$ignore = function(){return "LINKEVALUATION_IGNORE";};
 $KeywordRegistry.linkEvaluationType$unsubscribe = function(){return "LINKEVALUATION_UNSUBSCRIBE";};
 
+$KeywordRegistry.bulkMailSenderAddress = function() {return "BulkmailSenderAddress";};
+
 $KeywordRegistry.mosaicoBaseTemplate = function(){return "MosaicoBaseTemplate";};
 $KeywordRegistry.mosaicoColor = function(){return "MosaicoColor";};
 $KeywordRegistry.mosaicoTemplateCategory = function(){return "MosaicoTemplateCategory";};
\ No newline at end of file
diff --git a/process/Offer_lib/process.js b/process/Offer_lib/process.js
index 142d079b0f87a61efbaef0ef16f59893f484ea66..15c7e2f1a7843a5e40784d64a04249acff3a2cd8 100644
--- a/process/Offer_lib/process.js
+++ b/process/Offer_lib/process.js
@@ -233,14 +233,17 @@ OfferUtils.buildOfferReport = function (pOfferID, pExclDiscountGroupcodes)
     
     offeritemData = offeritemData.map(function (offeritem)
     {
-        if(offeritem[4] != "1")
+        if (!offeritem[5].includes(".")) //only if it's no child
         {
             //quantity * price
             fullPrice = eMath.mulDec(parseFloat(offeritem[9]), parseFloat(offeritem[10])); //price without discount
             
             //itemSum = (fullPrice * (100 - discount)) / 100
             itemSum = eMath.roundDec(eMath.divDec(eMath.mulDec(fullPrice, eMath.subDec(100, offeritem[11])), 100), 2, eMath.ROUND_HALF_EVEN); //sum of the item (with discount)
-            sumItemSum += itemSum; //total sum (without vat) 
+            if(!Utils.toBoolean(parseInt(offeritem[4])))//is optional
+            {
+                sumItemSum += itemSum; //total sum (without vat) 
+            }
 
             let excluded = -1
             if(pExclDiscountGroupcodes)
@@ -259,9 +262,9 @@ OfferUtils.buildOfferReport = function (pOfferID, pExclDiscountGroupcodes)
                 vatsum = ItemUtils.prototype.getItemVAT(offeritem[9], offeritem[10], offeritem[11], offeritem[12], offeritem[4])
             }
 
-            if(offeritem[12] > 0)
+            if (offeritem[12] > 0) 
             {
-                sums.push([offeritem[12], vatsum]); //MWSteuerwerte für Map vorbereiten
+                sums.push([offeritem[12], vatsum]); //Prepare VAT for map
             }
         }
         
@@ -270,36 +273,44 @@ OfferUtils.buildOfferReport = function (pOfferID, pExclDiscountGroupcodes)
         {
             total = eMath.addDec(sumItemSum, vatsum); //total sum with vat
         }
-        
+
         if(!printDiscount && offeritem[11] > 0)
         {
             printDiscount = true;
         }
         
+        if(!isNaN(itemSum))
+        {
+            itemSum = text.formatDouble(itemSum, "#,##0.00", true)
+        }
+        if(Utils.toBoolean(parseInt(offeritem[4])))//is optional
+        {
+            itemSum = "(" + itemSum + ")";
+        }
         return [
-            offerData[6],   //currency
-            offerData[7],   //offerdate
-            pOfferID,       //offerId
-            offeritem[0],        //info
-            offeritem[1],        //assignedTo
-            offeritem[3],        //itemname
-            parseInt(offeritem[4]) ? translate.text("Yes", language) : translate.text("No", language), //optional
-            offeritem[5],        //itemposition
-            offeritem[6],        //productcode
-            header,         //header 
-            footer,         //footer 
-            text.formatDouble(offeritem[9], "#,##0", true),          //quantity
-            text.formatDouble(offeritem[10], "#,##0.00", true),      //price
-            text.formatDouble(offeritem[11], "0.00", true),          //discount
-            offerData[10],  //versnr
-            offerData[5],   //offercode
-            text.formatDouble(offeritem[12], "#,##0.00", true),      //vat
-            text.formatDouble(itemSum, "#,##0.00", true),       //itemsum
-            KeywordUtils.getViewValue($KeywordRegistry.quantityUnit(), offeritem[8]), //unittext
-            discValue,
-            offerData[18],
-            discount,
-            offeritem[16]
+        offerData[6],   //currency
+        offerData[7],   //offerdate
+        pOfferID,       //offerId
+        offeritem[0],        //info
+        offeritem[1],        //assignedTo
+        offeritem[3],        //itemname
+        parseInt(offeritem[4]) ? translate.text("Yes", language) : translate.text("No", language), //optional
+        offeritem[5],        //itemposition
+        offeritem[6],        //productcode
+        header,         //header 
+        footer,         //footer 
+        text.formatDouble(offeritem[9], "#,##0", true),          //quantity
+        text.formatDouble(offeritem[10], "#,##0.00", true),      //price
+        text.formatDouble(offeritem[11], "0.00", true),          //discount
+        offerData[10],  //versnr
+        offerData[5],   //offercode
+        text.formatDouble(offeritem[12], "#,##0.00", true),      //vat
+        itemSum,       //itemsum
+        KeywordUtils.getViewValue($KeywordRegistry.quantityUnit(), offeritem[8]), //unittext
+        discValue,
+        offerData[18],
+        discount,
+        offeritem[16]
         ];
     });
     
diff --git a/process/Permission_lib/process.js b/process/Permission_lib/process.js
index bcd5ad4035ff94f8d62aa4daa1fa23035ee59d87..0c7cdcfdca04cf2861f0748a2405713b53d4870b 100644
--- a/process/Permission_lib/process.js
+++ b/process/Permission_lib/process.js
@@ -1075,6 +1075,13 @@ function PermissionUtil () {}
                 };
             }
         }
+        else
+        {
+            res = {
+                status: null, // if pRecordState == NEW -> status is not relevant for display
+                title: ContextUtils.getTitleByContext(pObjectType, pObjectRowId)
+            };
+        }
         
         return res;
     }
diff --git a/process/TopicTree_lib/process.js b/process/TopicTree_lib/process.js
index cc46b867ed55675a04cafacd39721b2ce6ab962b..3c0d5cb685a64d25c69369fd4c884e12ebb93cdb 100644
--- a/process/TopicTree_lib/process.js
+++ b/process/TopicTree_lib/process.js
@@ -421,7 +421,7 @@ TopicTreeUtils.returnNumberOfLayerName = function(pLayerName)
 /*
  * Returns the amount of layers<br>
  * So basically how deep this topic is from pTopicTreeDataset to the deepest one
- * @param {String} pTopicTreeDataset as returned by vars.get("$sys.selectionRows")[0];
+ * @param {Object} pTopicTreeDataset;
  * 
  * @return {Number} Number of layers (e.g: when topLayer = SORTING_LAYER_2 and the deepest subtopic is SORTING_LAYER_5 --> "4" (4layers: 2, 3, 4, 5) 
  */
@@ -818,15 +818,14 @@ TopicTreeUtils.paste = function (pIsTopTopic)
     var pLayerDeeper = "SORTING_LAYER_2";
     var cond = newWhere("TOPICTREE.ASSIGNEDTO is null");
     if(!pIsTopTopic)
-    {
-        var paste = vars.get("$sys.selectionRows")[0]; //paste data
-        var pTopicTreeId = paste["#UID"];
-        var pSorting_Layer_1 = paste.SORTING_LAYER_1;
-        var pSorting_Layer_2 = paste.SORTING_LAYER_2;
-        var pSorting_Layer_3 = paste.SORTING_LAYER_3;
-        var pSorting_Layer_4 = paste.SORTING_LAYER_4;
-        var pSorting_Layer_5 = paste.SORTING_LAYER_5;
-        var pSorting_Layer_6 = paste.SORTING_LAYER_6;
+    {   
+        var pTopicTreeId = vars.get("$field.UID");
+        var pSorting_Layer_1 = vars.get("$field.SORTING_LAYER_1");
+        var pSorting_Layer_2 = vars.get("$field.SORTING_LAYER_2");
+        var pSorting_Layer_3 = vars.get("$field.SORTING_LAYER_3");
+        var pSorting_Layer_4 = vars.get("$field.SORTING_LAYER_4");
+        var pSorting_Layer_5 = vars.get("$field.SORTING_LAYER_5");
+        var pSorting_Layer_6 = vars.get("$field.SORTING_LAYER_6");
         pLayer = TopicTreeUtils.getLayer(pSorting_Layer_1, pSorting_Layer_2, pSorting_Layer_3, pSorting_Layer_4, pSorting_Layer_5, pSorting_Layer_6);
         pLayerDeeper = TopicTreeUtils.getDeeperLayer(pSorting_Layer_1, pSorting_Layer_2, pSorting_Layer_3, pSorting_Layer_4, pSorting_Layer_5, pSorting_Layer_6);
         cond = newWhere("TOPICTREE.ASSIGNEDTO", pTopicTreeId);
@@ -853,8 +852,7 @@ TopicTreeUtils.paste = function (pIsTopTopic)
                     , "ACTIVE"
                     , pLayer
                     , "USER_NEW"
-                    , "DATE_NEW"
-                    , "ASSIGNEDTO"];
+                    , "DATE_NEW"];
 
     var uid = isCut == true ? cTopicTreeId : util.getNewUUID();//new uuid is old uuid if cut, since we "move" the topic instead of copying
     var values = [uid
@@ -863,10 +861,14 @@ TopicTreeUtils.paste = function (pIsTopTopic)
                     , cActive
                     , eMath.addInt(maxSortingOneLayerDeeper, 1)
                     , vars.get("$sys.user")
-                    , vars.get("$sys.date")
-                    , pTopicTreeId];
-
+                    , vars.get("$sys.date")];
 
+    
+    if(!pIsTopTopic)
+    {
+        columns.push("ASSIGNEDTO");
+        values.push(pTopicTreeId);
+    }
     if(isCut)
     {
         _updateSortingValuesOfOtherTopics(cLayer, cOwnSortingValue, cAssignedTo);
@@ -886,7 +888,7 @@ TopicTreeUtils.paste = function (pIsTopTopic)
     //update child topics accordingly
     while(stop == false)
     {
-        topicTreeDatasets = newSelect(["TOPICTREE.TOPICTREEID"
+        var topicTreeDatasets = newSelect(["TOPICTREE.TOPICTREEID"
                                     , TopicTreeUtils.relevantSortingValueCaseWhen() + " as sortingValue"
                                     , TopicTreeUtils.layerNameCaseWhen()
                                     , "TOPICTREE.TOPIC"
@@ -911,13 +913,12 @@ TopicTreeUtils.paste = function (pIsTopTopic)
                     topicTreeIds.push(subTopicId);
                     topicTreeIdsToUpdate.push(subTopicId);
 
-                    subColumns = ["TOPICTREEID"
+                    var subColumns = ["TOPICTREEID"
                         , "TOPIC"
                         , "DESCRIPTION"
                         , "ACTIVE"
                         , "USER_NEW"
                         , "DATE_NEW"
-                        , "ASSIGNEDTO"
                         , subTopicRelevantSortingLayer];//relevant sorting value
                     var newSubUid
                     if(isCut == true)
@@ -930,15 +931,20 @@ TopicTreeUtils.paste = function (pIsTopTopic)
                         newSubUid = util.getNewUUID();
                     }
                     oldToNewIdHelperObj[subTopicId] = newSubUid;
-
-                    subValues = [newSubUid
+                    
+                    var subValues = [newSubUid
                             , subTopic
                             , subDescription
                             , subActive
                             , vars.get("$sys.user")
                             , vars.get("$sys.date")
-                            , oldToNewIdHelperObj[subAssignedTo]
                             , subTopicRelevantSortingValue];
+                        
+                    if(Utils.isNotNullOrEmptyString(oldToNewIdHelperObj[subAssignedTo]))
+                    {
+                        subValues.push(oldToNewIdHelperObj[subAssignedTo]);
+                        subColumns.push("ASSIGNEDTO");
+                    }
 
                     var previousLayer = subTopicRelevantSortingLayer;
                     var stopper = false;