diff --git a/entity/Prod2prod_entity/Prod2prod_entity.aod b/entity/Prod2prod_entity/Prod2prod_entity.aod
index 0acf3ef262439b9abf72d47cb858eac6817b1f60..56050bde20f8453297db4f0728dc93d0f8c05734 100644
--- a/entity/Prod2prod_entity/Prod2prod_entity.aod
+++ b/entity/Prod2prod_entity/Prod2prod_entity.aod
@@ -5,7 +5,7 @@
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <documentation>%aditoprj%/entity/Prod2prod_entity/documentation.adoc</documentation>
   <titlePlural>Parts list</titlePlural>
-  <recordContainer>jdito</recordContainer>
+  <recordContainer>jDito</recordContainer>
   <entityFields>
     <entityProvider>
       <name>#PROVIDER</name>
@@ -23,10 +23,6 @@
       <valueProcess>%aditoprj%/entity/Prod2prod_entity/entityfields/optional/valueProcess.js</valueProcess>
       <onValueChange>%aditoprj%/entity/Prod2prod_entity/entityfields/optional/onValueChange.js</onValueChange>
     </entityField>
-    <entityField>
-      <name>UID</name>
-      <valueProcess>%aditoprj%/entity/Prod2prod_entity/entityfields/uid/valueProcess.js</valueProcess>
-    </entityField>
     <entityField>
       <name>QUANTITY</name>
       <title>Quantity</title>
@@ -42,7 +38,6 @@
       <title>Product</title>
       <consumer>Products</consumer>
       <mandatory v="true" />
-      <valueProcess>%aditoprj%/entity/Prod2prod_entity/entityfields/source_id/valueProcess.js</valueProcess>
       <onValueChange>%aditoprj%/entity/Prod2prod_entity/entityfields/source_id/onValueChange.js</onValueChange>
     </entityField>
     <entityField>
@@ -60,7 +55,6 @@
     </entityParameter>
     <entityField>
       <name>PROD2PRODID</name>
-      <valueProcess>%aditoprj%/entity/Prod2prod_entity/entityfields/prod2prodid/valueProcess.js</valueProcess>
     </entityField>
     <entityProvider>
       <name>ProductLinks</name>
@@ -138,9 +132,6 @@
       <title>Unit</title>
       <state>READONLY</state>
     </entityField>
-    <entityField>
-      <name>vat</name>
-    </entityField>
     <entityField>
       <name>currentPurchasePrice</name>
       <title>Curr. purchase price</title>
@@ -151,13 +142,17 @@
       <title>Curr. sales price</title>
       <state>READONLY</state>
     </entityField>
+    <entityField>
+      <name>PARENT_ID</name>
+    </entityField>
+    <entityField>
+      <name>UID</name>
+    </entityField>
   </entityFields>
   <recordContainers>
     <jDitoRecordContainer>
-      <name>jdito</name>
+      <name>jDito</name>
       <jDitoRecordAlias>Data_alias</jDitoRecordAlias>
-      <isRequireContainerFiltering v="true" />
-      <isSortable v="true" />
       <contentProcess>%aditoprj%/entity/Prod2prod_entity/recordcontainers/jdito/contentProcess.js</contentProcess>
       <hasDependentRecords v="true" />
       <onInsert>%aditoprj%/entity/Prod2prod_entity/recordcontainers/jdito/onInsert.js</onInsert>
@@ -168,22 +163,22 @@
           <name>UID.value</name>
         </jDitoRecordFieldMapping>
         <jDitoRecordFieldMapping>
-          <name>SOURCE_ID.value</name>
+          <name>PROD2PRODID.value</name>
         </jDitoRecordFieldMapping>
         <jDitoRecordFieldMapping>
-          <name>DEST_ID.value</name>
+          <name>PARENT_ID.value</name>
         </jDitoRecordFieldMapping>
         <jDitoRecordFieldMapping>
-          <name>QUANTITY.value</name>
+          <name>SOURCE_ID.value</name>
         </jDitoRecordFieldMapping>
         <jDitoRecordFieldMapping>
-          <name>PRODUCTCODE.value</name>
+          <name>SOURCE_ID.displayValue</name>
         </jDitoRecordFieldMapping>
         <jDitoRecordFieldMapping>
-          <name>PRODUCTID.value</name>
+          <name>DEST_ID.value</name>
         </jDitoRecordFieldMapping>
         <jDitoRecordFieldMapping>
-          <name>PROD2PRODID.value</name>
+          <name>QUANTITY.value</name>
         </jDitoRecordFieldMapping>
         <jDitoRecordFieldMapping>
           <name>OPTIONAL.value</name>
@@ -192,11 +187,17 @@
           <name>TAKEPRICE.value</name>
         </jDitoRecordFieldMapping>
         <jDitoRecordFieldMapping>
-          <name>SOURCE_ID.displayValue</name>
+          <name>PRODUCTID.value</name>
+        </jDitoRecordFieldMapping>
+        <jDitoRecordFieldMapping>
+          <name>PRODUCTCODE.value</name>
         </jDitoRecordFieldMapping>
         <jDitoRecordFieldMapping>
           <name>unit.value</name>
         </jDitoRecordFieldMapping>
+        <jDitoRecordFieldMapping>
+          <name>unit.displayValue</name>
+        </jDitoRecordFieldMapping>
         <jDitoRecordFieldMapping>
           <name>currentPurchasePrice.value</name>
         </jDitoRecordFieldMapping>
diff --git a/entity/Prod2prod_entity/entityfields/prod2prodid/valueProcess.js b/entity/Prod2prod_entity/entityfields/prod2prodid/valueProcess.js
deleted file mode 100644
index 86ef789e064a4016f2d12c432498dc23474807aa..0000000000000000000000000000000000000000
--- a/entity/Prod2prod_entity/entityfields/prod2prodid/valueProcess.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import("system.util");
-import("system.vars");
-import("system.result");
-import("system.neon");
-
-if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW)
-    result.string(util.getNewUUID());
\ No newline at end of file
diff --git a/entity/Prod2prod_entity/entityfields/source_id/valueProcess.js b/entity/Prod2prod_entity/entityfields/source_id/valueProcess.js
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/entity/Prod2prod_entity/entityfields/uid/valueProcess.js b/entity/Prod2prod_entity/entityfields/uid/valueProcess.js
deleted file mode 100644
index 884a038bbce84aa5a3bc93ac65bc962fd93f468d..0000000000000000000000000000000000000000
--- a/entity/Prod2prod_entity/entityfields/uid/valueProcess.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import("system.util");
-import("system.vars");
-import("system.result");
-import("system.neon");
-
-if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW)
-    result.object([util.getNewUUID(), vars.get("$field.PROD2PRODID")]); // 1. is some random uid for uniqueness 2. is the prod2ProdID
\ 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 fb53ccb23f6522117378f94c664f60efbbf33c78..a65c4e001eedff9fc05cf32b52ec2be79445d73e 100644
--- a/entity/Prod2prod_entity/recordcontainers/jdito/contentProcess.js
+++ b/entity/Prod2prod_entity/recordcontainers/jdito/contentProcess.js
@@ -1,218 +1,76 @@
+import("Product_lib");
 import("system.text");
-import("KeywordRegistry_basic");
-import("Keyword_lib");
-import("Sql_lib");
 import("system.neon");
-import("system.result");
 import("system.vars");
-import("system.db");
-import("system.util");
-import("Product_lib");
-
-/**
- * Calculate the root elements for this tree.
- * 
- * @param productRootID string
- * @param rows TreeData[]
- * @return string[]
- */
-function calculateRootElements (productRootID, rows) {
-   return rows.filter(function (row) {
-       // Filter predicate if the DIST_ID matches.
-      return row[2] === productRootID;
-   }).map(function (row) {
-       // Map to PROD2PROD_ID.
-       return row[0];
-   });
-}
-
-/**
-* Calculates a mapping object which has the PROD2PROD_ID as
-* key and the full TreeData array as value.
-* 
-* @param rows TreeData[]
-* @return {[key: TreeData]}
-*/
-function buildProd2ProdIDMapping (rows) {
-    var mapping = {}
-    
-    rows.forEach(function(row) {
-        // Create new property which PROD2PROD_ID as key and data
-        // as value.
-       mapping[row[0]] = row;
-    });
-    
-    return mapping;
-}
-
-/**
- * Calcualtes the children mapping structure which has the DIST_ID
- * as key and an array of PROD2PROD_IDs as value.
- *
- * @param rows TreeData[]
- * @return {[key: string[]]}
- */
-function buildChildrenMapping(rows) {
-    var parrentMapping = {}
-    
-    rows.forEach(function (row) {
-        // Create empty array if not created previously.
-        if (parrentMapping[row[2]] === undefined)
-          parrentMapping[row[2]] = []
-      
-      // Push with DIST_ID as key and PROD2PROD_ID as value.
-      parrentMapping[row[2]].push(row[0]);
-    })
-    
-    return parrentMapping
-}
-
-/**
- * Calculates the graph starting from the given elementID.
- */
-function buildGraph (elementID, parentElementID, mappingStructure, prod2prodIdMapping) {
-    var elements = []
- 
-    // Get the PROD2PROD data array and copy it.
-    // Copying is requried due to mutability of arrays.
-    var elementData = prod2prodIdMapping[elementID].slice(0);
-    
-    // Just as an error prevention.
-    if (elementData === undefined)
-        return elements;
-    
-    // Generate new PROD2PROD_ID to create a uniqueness between the PROD2PROD objects.
-    var virtualProd2ProdId = util.getNewUUID();
-    
-    // Override actual PROD2PROD_ID with new ID.
-    elementData[0] = JSON.stringify([virtualProd2ProdId, elementData[0]]);
- 
-    // Override parent id to match overriden prod2prodId of parent
-    if (parentElementID === null || parentElementID === undefined)
-        // Describes an root element
-        elementData[2] = null;
-    else
-        elementData[2] = parentElementID;
- 
-    // Push element data to elements array of this graph.
-    elements.push(elementData);
-
-    // Search for children
-    var childrens = mappingStructure[elementData[1]];
+import("system.result");
+import("Sql_lib");
+import("Keyword_lib");
+import("KeywordRegistry_basic");
 
-    if (childrens !== undefined && childrens.length > 0) {
-        // Build graph for each children
+var query = newSelect([
+    "PROD2PROD.PROD2PRODID",                // UID.value
+    "PROD2PROD.PROD2PRODID",                // PROD2PRODID.value
+    "''",                                   // PARENT_ID.value
+    "PROD2PROD.SOURCE_ID",                  // SOURCE_ID.value
+    "PRODUCT.PRODUCTNAME",                  // SOURCE_ID.displaValue
+    "PROD2PROD.DEST_ID",                    // DEST_ID.value
+    "PROD2PROD.QUANTITY",                   // QUANTITY.value
+    "PROD2PROD.OPTIONAL",                   // OPTIONAL.value
+    "PROD2PROD.TAKEPRICE",                  // TAKEPRICE.value
+    "PRODUCT.PRODUCTID",                    // PRODUCT.value
+    "PRODUCT.PRODUCTCODE",                  // PRODUCTCODE.value
+    "PRODUCT.UNIT",                         // unit.value
+    KeywordUtils.getResolvedTitleSqlPart(   // unit.displaValue
+        $KeywordRegistry.quantityUnit(),
+        "PRODUCT.UNIT"
+    )
+]).from("PROD2PROD")
+.join("PRODUCT", "PRODUCT.PRODUCTID = PROD2PROD.SOURCE_ID");
 
-        childrens.forEach(function(children) {
-            // Recursive function call (!)
-            
-            var graphResult = buildGraph(children, elementData[0], mappingStructure, prod2prodIdMapping);
-            
-            graphResult.forEach(function(res) {elements.push(res)})
-        });
+function _returnData(data) {
+    for(let i = 0; i < data.length; i++)
+    {
+        var productId = data[3];
+        
+        // currentPurchasePrice.value
+        var purchasePrice = ProductUtils.getCurrentProductPrice(productId, "PP", true);
+        data[i].push(
+            purchasePrice.length == 0 ? "" :
+            text.formatDouble(purchasePrice[0], "#,##0.00", true) + " " + purchasePrice[1]
+        );
+        
+        // currentSalesPrice.value
+        var salesPrice = ProductUtils.getCurrentProductPrice(productId, "SP", true);
+        data[i].push(
+            salesPrice.length == 0 ? "" :
+            text.formatDouble(salesPrice[0], "#,##0.00", true) + " " + salesPrice[1]
+        );
     }
-
-    return elements;
+    result.object(data);
 }
 
-/*
- * in the past at this point a check for the "recordstate" was done
- * this should not be necessery and in fact causes a problem:
- * When adding a new prod2prod entry and performing a cancel an error is raised that the variable does not exist.
- * 
- * So *IF* you need that check for the state, you should check if this error is thrown 
- * + add a comment why the check is needed here instead of this current comment
- */
-
-if (vars.get("$local.idvalues") && vars.get("$local.idvalues").length > 0)
+if(vars.exists("$local.idvalues") && vars.get("$local.idvalues"))
 {
-    var prod2prodId = JSON.parse(vars.get("$local.idvalues")[0])[1];
-    if (prod2prodId)
-    {
-        var prodData = newSelect(["PROD2PROD.PROD2PRODID", 
-                                    "PROD2PROD.SOURCE_ID", 
-                                    "PROD2PROD.DEST_ID", 
-                                    "PROD2PROD.QUANTITY", 
-                                    "PRODUCT.PRODUCTCODE", 
-                                    "PRODUCT.PRODUCTID", 
-                                    "PROD2PROD.PROD2PRODID", 
-                                    "PROD2PROD.OPTIONAL", 
-                                    "PROD2PROD.TAKEPRICE", 
-                                    "PRODUCT.PRODUCTNAME",
-                                    KeywordUtils.getResolvedTitleSqlPart($KeywordRegistry.quantityUnit(), "PRODUCT.UNIT")])
-                        .from("PROD2PROD")
-                        .join("PRODUCT", "PROD2PROD.SOURCE_ID = PRODUCTID")
-                        .where("PROD2PROD.PROD2PRODID", prod2prodId)
-                        .arrayRow();
-                        
-        prodData[0] = vars.get("$local.idvalues")[0]; //only first one since whe have single selection as the selection mode
-        prodData[11] = "";
-        prodData[12] = "";
-
-        let purchasePrice = ProductUtils.getCurrentProductPrice(prodData[5], "PP", true);
-        if (purchasePrice.length > 0)
-        {
-            prodData[11] = text.formatDouble(purchasePrice[0], "#,##0.00", true) + " " + purchasePrice[1];
-        }
-        
-        let salesPrice = ProductUtils.getCurrentProductPrice(prodData[5], "SP", true);
-        if (salesPrice.length > 0)
-        {
-            prodData[12] = text.formatDouble(salesPrice[0], "#,##0.00", true) + " " + salesPrice[1];
-        }
-        result.object([prodData]);
-    }
+    _returnData(query.where("PROD2PROD.PROD2PRODID", vars.get("$local.idvalues"), SqlBuilder.IN()).table());
 }
 else
 {
-    var prodid = vars.exists("$param.ProductId_param") 
-             && vars.get("$param.ProductId_param") != null ? vars.get("$param.ProductId_param") : "";
-    if(prodid != "")
+    var prod2prod = query.table();
+    function _getChilds(pId, pProductId, pMaxRecursion)
     {
-        // First 3 columns are crucial, the rest is optional.
-        var data = newSelect(["PROD2PROD.PROD2PRODID",
-                                "PROD2PROD.SOURCE_ID", 
-                                "PROD2PROD.DEST_ID", 
-                                "PROD2PROD.QUANTITY", 
-                                "PRODUCT.PRODUCTCODE",
-                                "PRODUCT.PRODUCTID", 
-                                "PROD2PROD.PROD2PRODID", 
-                                "PROD2PROD.OPTIONAL", 
-                                "PROD2PROD.TAKEPRICE", 
-                                "PRODUCT.PRODUCTNAME",
-                                KeywordUtils.getResolvedTitleSqlPart($KeywordRegistry.quantityUnit(), "PRODUCT.UNIT")])
-            .from("PROD2PROD")
-            .join("PRODUCT", "PROD2PROD.SOURCE_ID = PRODUCTID")
-            .orderBy("PRODUCTCODE")
-            .table();
-
-        var prod2prodIdMapping = buildProd2ProdIDMapping(data);
-        var childrenMapping = buildChildrenMapping(data);
-        var rootElements = calculateRootElements(prodid, data);
-
-        var allData = [];
-
-        rootElements.forEach(function(rg) {
-            var graphData = buildGraph(rg, null, childrenMapping, prod2prodIdMapping)
-            graphData.forEach(function (gd) { allData.push(gd); })
-        })
-
-        for (let i = 0; i < allData.length; i++) {
-            allData[i][11] = "";
-            allData[i][12] = "";
-            
-            let purchasePrice = ProductUtils.getCurrentProductPrice(allData[i][5], "PP", true);
-            if (purchasePrice.length > 0)
-            {
-                allData[i][11] = text.formatDouble(purchasePrice[0], "#,##0.00", true) + " " + purchasePrice[1];
-            }
-            
-            let salesPrice = ProductUtils.getCurrentProductPrice(allData[i][5], "SP", true);
-            if (salesPrice.length > 0)
-            {
-                allData[i][12] = text.formatDouble(salesPrice[0], "#,##0.00", true) + " " + salesPrice[1];
-            }
+        if(pMaxRecursion == 0)
+        {
+            return [];
         }
-        result.object(allData);
+        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);
     }
-}
\ No newline at end of file
+    _returnData(_getChilds(null, vars.get("$param.ProductId_param"), 20));
+}
diff --git a/entity/Prod2prod_entity/recordcontainers/jdito/onDelete.js b/entity/Prod2prod_entity/recordcontainers/jdito/onDelete.js
index 94f252cf1229adcd080a63a58a821d873fc3ccc1..7cf6538eadb00ee62b1c3b7096b98fc81ec4bf6d 100644
--- a/entity/Prod2prod_entity/recordcontainers/jdito/onDelete.js
+++ b/entity/Prod2prod_entity/recordcontainers/jdito/onDelete.js
@@ -1,3 +1,4 @@
 import("Sql_lib");
+import("system.vars");
 
-newWhereIfSet("PROD2PROD.PROD2PRODID", "$field.PROD2PRODID").deleteData();
\ No newline at end of file
+newWhereIfSet("PROD2PROD.PROD2PRODID", vars.get("$local.uid")).deleteData();
diff --git a/entity/Prod2prod_entity/recordcontainers/jdito/onInsert.js b/entity/Prod2prod_entity/recordcontainers/jdito/onInsert.js
index d1adc28758e4d7e3d9d2c7dcc2e505e54039c03d..2e13aacb363ad913dfe9a7996dcd497d2af308a5 100644
--- a/entity/Prod2prod_entity/recordcontainers/jdito/onInsert.js
+++ b/entity/Prod2prod_entity/recordcontainers/jdito/onInsert.js
@@ -10,11 +10,11 @@ var cols = [ "PROD2PRODID"
            , "OPTIONAL"
            , "TAKEPRICE" ];
 
-var vals = [ vars.get("$field.PROD2PRODID")
+var vals = [ vars.get("$local.uid")
            , vars.get("$field.DEST_ID")
            , vars.get("$field.SOURCE_ID")
            , vars.get("$field.QUANTITY")
            , vars.get("$field.OPTIONAL")
            , vars.get("$field.TAKEPRICE") ];
 
-db.insertData("PROD2PROD", cols, null, vals);
\ No newline at end of file
+db.insertData("PROD2PROD", cols, null, vals);
diff --git a/entity/Prod2prod_entity/recordcontainers/jdito/onUpdate.js b/entity/Prod2prod_entity/recordcontainers/jdito/onUpdate.js
index c71a9c41db27fb3478fde565b44b9c5b7643c1c3..a98faf66d87ef816d36d0ac543e1245313c535a8 100644
--- a/entity/Prod2prod_entity/recordcontainers/jdito/onUpdate.js
+++ b/entity/Prod2prod_entity/recordcontainers/jdito/onUpdate.js
@@ -1,6 +1,5 @@
-import("Sql_lib");
-import("system.datetime");
 import("system.vars");
+import("Sql_lib");
 
 var cols = [ "SOURCE_ID"
            , "QUANTITY"
@@ -12,5 +11,5 @@ var vals = [ vars.get("$field.SOURCE_ID")
            , vars.get("$field.OPTIONAL")
            , vars.get("$field.TAKEPRICE") ];
 
-newWhere("PROD2PROD.PROD2PRODID", "$field.PROD2PRODID")
-    .updateData(true, "PROD2PROD", cols, null, vals);
\ No newline at end of file
+newWhere("PROD2PROD.PROD2PRODID", vars.get("$local.uid"))
+    .updateData(true, "PROD2PROD", cols, null, vals);
diff --git a/entity/Product_entity/Product_entity.aod b/entity/Product_entity/Product_entity.aod
index 740f556ee5bee37ebc380a6ef7e9a190f664aaac..7310a2e80ecd721da360acde752796f04736ef1d 100644
--- a/entity/Product_entity/Product_entity.aod
+++ b/entity/Product_entity/Product_entity.aod
@@ -201,6 +201,7 @@
     </entityProvider>
     <entityConsumer>
       <name>ProductLinks</name>
+      <selectionMode>MULTI</selectionMode>
       <dependency>
         <name>dependency</name>
         <entityName>Prod2prod_entity</entityName>
diff --git a/neonView/Prod2prodFilter_view/Prod2prodFilter_view.aod b/neonView/Prod2prodFilter_view/Prod2prodFilter_view.aod
index 7df0d8ad40546a5a1f45f10b4ae096553100605a..c009ab9b93b68c970edc4ed546fa70443de9a91b 100644
--- a/neonView/Prod2prodFilter_view/Prod2prodFilter_view.aod
+++ b/neonView/Prod2prodFilter_view/Prod2prodFilter_view.aod
@@ -11,8 +11,7 @@
   <children>
     <treeTableViewTemplate>
       <name>PartlistTree</name>
-      <parentField>DEST_ID</parentField>
-      <entityField>#ENTITY</entityField>
+      <parentField>PARENT_ID</parentField>
       <favoriteActionGroup1>alter</favoriteActionGroup1>
       <devices>
         <element>MOBILE</element>