diff --git a/entity/AttributeRelationTree_entity/AttributeRelationTree_entity.aod b/entity/AttributeRelationTree_entity/AttributeRelationTree_entity.aod
index 31f2c0b2265b3191fba0dad99ac417b1b71da198..4867a9611400b6a61e8136b5fc7051e8ff79775b 100644
--- a/entity/AttributeRelationTree_entity/AttributeRelationTree_entity.aod
+++ b/entity/AttributeRelationTree_entity/AttributeRelationTree_entity.aod
@@ -10,9 +10,6 @@
     <entityField>
       <name>PARENT_ID</name>
     </entityField>
-    <entityField>
-      <name>TITLE</name>
-    </entityField>
     <entityField>
       <name>UID</name>
     </entityField>
@@ -78,10 +75,15 @@
       <name>AB_ATTRIBUTE_ID</name>
       <title>Attribute</title>
       <consumer>SpecificAttribute</consumer>
+      <onValueChange>%aditoprj%/entity/AttributeRelationTree_entity/entityfields/ab_attribute_id/onValueChange.js</onValueChange>
     </entityField>
     <entityField>
       <name>VALUE</name>
       <title>Value</title>
+      <contentTypeProcess>%aditoprj%/entity/AttributeRelationTree_entity/entityfields/value/contentTypeProcess.js</contentTypeProcess>
+      <resolution>DAY</resolution>
+      <mandatory v="true" />
+      <possibleItemsProcess>%aditoprj%/entity/AttributeRelationTree_entity/entityfields/value/possibleItemsProcess.js</possibleItemsProcess>
     </entityField>
     <entityConsumer>
       <name>SpecificAttribute</name>
@@ -99,19 +101,23 @@
         </entityParameter>
       </children>
     </entityConsumer>
-    <entityField>
-      <name>ATTRIBUTE_TYPE</name>
-    </entityField>
   </entityFields>
   <recordContainers>
     <jDitoRecordContainer>
       <name>jdito</name>
       <jDitoRecordAlias>Data_alias</jDitoRecordAlias>
       <contentProcess>%aditoprj%/entity/AttributeRelationTree_entity/recordcontainers/jdito/contentProcess.js</contentProcess>
+      <onInsert>%aditoprj%/entity/AttributeRelationTree_entity/recordcontainers/jdito/onInsert.js</onInsert>
+      <onUpdate>%aditoprj%/entity/AttributeRelationTree_entity/recordcontainers/jdito/onUpdate.js</onUpdate>
+      <onDelete>%aditoprj%/entity/AttributeRelationTree_entity/recordcontainers/jdito/onDelete.js</onDelete>
       <recordFields>
         <element>UID.value</element>
         <element>PARENT_ID.value</element>
-        <element>TITLE.value</element>
+        <element>VALUE.value</element>
+        <element>VALUE.displayValue</element>
+        <element>AB_ATTRIBUTE_ID.value</element>
+        <element>AB_ATTRIBUTE_ID.displayValue</element>
+        <element>ATTRIBUTE_TYPE.value</element>
       </recordFields>
     </jDitoRecordContainer>
   </recordContainers>
diff --git a/entity/AttributeRelationTree_entity/entityfields/ab_attribute_id/onValueChange.js b/entity/AttributeRelationTree_entity/entityfields/ab_attribute_id/onValueChange.js
new file mode 100644
index 0000000000000000000000000000000000000000..1cebe1b3feaf01b51d151221f833a7255541bfb5
--- /dev/null
+++ b/entity/AttributeRelationTree_entity/entityfields/ab_attribute_id/onValueChange.js
@@ -0,0 +1,8 @@
+import("system.vars");
+import("system.neon");
+
+if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_EDIT || 
+    vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW) 
+{
+    neon.setFieldValue("$field.VALUE", null);
+}
\ No newline at end of file
diff --git a/entity/AttributeRelationTree_entity/entityfields/value/contentTypeProcess.js b/entity/AttributeRelationTree_entity/entityfields/value/contentTypeProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..55d32c91b7003e4a973558a6460268ef5b6d962b
--- /dev/null
+++ b/entity/AttributeRelationTree_entity/entityfields/value/contentTypeProcess.js
@@ -0,0 +1,6 @@
+import("system.vars");
+import("system.result");
+import("Attribute_lib");
+
+var attributeType = AttributeUtil.getAttributeType(vars.get("$field.AB_ATTRIBUTE_ID"));
+result.string(AttributeTypeUtil.getContentType(attributeType));
\ No newline at end of file
diff --git a/entity/AttributeRelationTree_entity/entityfields/value/possibleItemsProcess.js b/entity/AttributeRelationTree_entity/entityfields/value/possibleItemsProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..da3691199cda4881eb44136b7de67a7004952f83
--- /dev/null
+++ b/entity/AttributeRelationTree_entity/entityfields/value/possibleItemsProcess.js
@@ -0,0 +1,46 @@
+import("system.translate");
+import("system.db");
+import("system.result");
+import("system.vars");
+import("Attribute_lib");
+import("Sql_lib");
+
+var attributeId = vars.get("$field.AB_ATTRIBUTE_ID");
+var attrType = AttributeUtil.getAttributeType(attributeId);
+
+if (attrType == $AttributeTypes.COMBO)
+{
+    var valueSql = SqlCondition.begin()
+        .andPrepare("AB_ATTRIBUTE.ATTRIBUTE_ACTIVE", "1")
+        .andPrepare("AB_ATTRIBUTE.ATTRIBUTE_PARENT_ID", attributeId)
+        .andPrepare("AB_ATTRIBUTE.ATTRIBUTE_TYPE", $AttributeTypes.COMBOVALUE)
+        .buildSql("select AB_ATTRIBUTEID, ATTRIBUTE_NAME from AB_ATTRIBUTE", "1=2", "order by ATTRIBUTE_NAME");
+    var valueList = db.table(valueSql);
+    
+    result.object(valueList);
+}
+else if (attrType == $AttributeTypes.BOOLEAN)
+{
+    result.object([
+        ["1", translate.text("Yes")],
+        ["0", translate.text("No")]
+    ]);
+}
+
+//TODO this is a workaround for keywords, when it's possible to use the consumer remove this
+else if (attrType == $AttributeTypes.KEYWORD)
+{
+    var attrKeywordSelect = "select KEYWORD_CONTAINER from AB_ATTRIBUTE";
+    attrKeywordSelect = SqlCondition.begin()
+        .andPrepareVars("AB_ATTRIBUTE.AB_ATTRIBUTEID", "$field.AB_ATTRIBUTE_ID")
+        .buildSql(attrKeywordSelect);
+    
+    var sql = SqlCondition.begin()
+        .andPrepare("AB_KEYWORD_ENTRY.CONTAINER", db.cell(attrKeywordSelect))
+        .buildSql("select AB_KEYWORD_ENTRY.KEYID, AB_KEYWORD_ENTRY.TITLE from AB_KEYWORD_ENTRY");
+    var keywords = db.table(sql).map(function (row)
+    {
+        return [row[0], translate.text(row[1])];
+    });
+    result.object(keywords);
+}
\ No newline at end of file
diff --git a/entity/AttributeRelationTree_entity/recordcontainers/jdito/contentProcess.js b/entity/AttributeRelationTree_entity/recordcontainers/jdito/contentProcess.js
index 2ea0d933bf989b2b8ac967c1b10bc10d02ac9e5f..d887ea8db65ef4766a8182d7ae984c3c8212dfcd 100644
--- a/entity/AttributeRelationTree_entity/recordcontainers/jdito/contentProcess.js
+++ b/entity/AttributeRelationTree_entity/recordcontainers/jdito/contentProcess.js
@@ -8,9 +8,42 @@ var objectType = vars.get("$param.ObjectType_param");
 var rowId = vars.get("$param.ObjectRowId_param");
 var attributeObj = {};
 var allAttributes = [];
-var sqlSelect = "select AB_ATTRIBUTEID, ATTRIBUTE_PARENT_ID, ATTRIBUTE_NAME from AB_ATTRIBUTE";
+var sqlSelect = "select AB_ATTRIBUTEID, ATTRIBUTE_PARENT_ID, ATTRIBUTE_NAME, ATTRIBUTE_NAME, ATTRIBUTE_NAME, ATTRIBUTE_NAME, ATTRIBUTE_TYPE from AB_ATTRIBUTE";
+
+
+
+var attrCond = SqlCondition.begin()
+    .andPrepare("AB_ATTRIBUTERELATION.OBJECT_ROWID", rowId);
+if (objectType != null)
+    attrCond.andPrepare("AB_ATTRIBUTERELATION.OBJECT_TYPE", objectType);
+
+var defaultFields = [
+    "AB_ATTRIBUTERELATIONID",
+    "AB_ATTRIBUTE_ID", 
+    "AB_ATTRIBUTE.ATTRIBUTE_TYPE", 
+    "AB_ATTRIBUTE.KEYWORD_CONTAINER", 
+    "COMBOVAL.ATTRIBUTE_NAME"
+];
+var valueFields = AttributeTypeUtil.getAllDatabaseFields();
+var attributeSql = attrCond.buildSql("select " + defaultFields.join(", ") + ", " + valueFields.join(", ")
+    + " from AB_ATTRIBUTERELATION join AB_ATTRIBUTE on AB_ATTRIBUTE_ID = AB_ATTRIBUTE.AB_ATTRIBUTEID"
+    + " left join AB_ATTRIBUTE COMBOVAL on " + $AttributeTypes.COMBO.databaseField + " = COMBOVAL.AB_ATTRIBUTEID");
+
+var attributeNameMap = {};
+var attributeValues = db.table(attributeSql).map(function (row) 
+{
+    let attributeId = row[1];
+    let attributeName = "";
+    let value = row[AttributeTypeUtil.getTypeColumnIndex(row[2]) + defaultFields.length];
+    let viewValue;
+    if (row[2].trim() == $AttributeTypes.COMBO)
+        viewValue = row[4];
+    else
+        viewValue = AttributeTypeUtil.getAttributeViewValue(row[2].trim(), value, row[3]);
+
+    return [row[0], attributeId, value, viewValue, attributeId, attributeName, row[2]];
+});
 
-var attributeValues = AttributeRelationUtils.getAllAttributes(rowId, objectType, false, true);
 
 _fetchAttributes(attributeValues.map(function (row) {return row[1]}));
 
diff --git a/entity/AttributeRelationTree_entity/recordcontainers/jdito/onDelete.js b/entity/AttributeRelationTree_entity/recordcontainers/jdito/onDelete.js
new file mode 100644
index 0000000000000000000000000000000000000000..219317e107752606f09b507bbdd68e17a018af4c
--- /dev/null
+++ b/entity/AttributeRelationTree_entity/recordcontainers/jdito/onDelete.js
@@ -0,0 +1,10 @@
+import("system.neon");
+import("system.vars");
+import("Sql_lib");
+import("system.db");
+
+if (vars.get("$field.AB_ATTRIBUTE_ID"))
+{
+    db.deleteData("AB_ATTRIBUTERELATION", SqlCondition.begin().andPrepareVars("AB_ATTRIBUTERELATION.AB_ATTRIBUTERELATIONID", "$field.UID").build("1=2"));
+    neon.refresh();
+}
\ No newline at end of file
diff --git a/entity/AttributeRelationTree_entity/recordcontainers/jdito/onInsert.js b/entity/AttributeRelationTree_entity/recordcontainers/jdito/onInsert.js
new file mode 100644
index 0000000000000000000000000000000000000000..ba344ff704777c942370bfbe0731b2a80e69660a
--- /dev/null
+++ b/entity/AttributeRelationTree_entity/recordcontainers/jdito/onInsert.js
@@ -0,0 +1,31 @@
+import("system.datetime");
+import("system.util");
+import("system.db");
+import("system.vars");
+import("Attribute_lib");
+
+var type = AttributeUtil.getAttributeType(vars.get("$field.AB_ATTRIBUTE_ID"));
+var valueField = AttributeTypeUtil.getDatabaseField(type);
+
+if (valueField)
+{
+    var columns = [
+        "AB_ATTRIBUTERELATIONID",
+        "AB_ATTRIBUTE_ID",
+        "OBJECT_ROWID",
+        "OBJECT_TYPE",
+        "DATE_NEW",
+        "USER_NEW",
+        valueField
+    ];
+    var values = [
+        util.getNewUUID(),
+        vars.get("$field.AB_ATTRIBUTE_ID"),
+        vars.get("$param.ObjectRowId_param"),
+        vars.get("$param.ObjectType_param"),
+        String(datetime.date()),
+        vars.get("$sys.user"),
+        vars.get("$field.VALUE")
+    ];
+    db.insertData("AB_ATTRIBUTERELATION", columns, null, values);
+}
\ No newline at end of file
diff --git a/entity/AttributeRelationTree_entity/recordcontainers/jdito/onUpdate.js b/entity/AttributeRelationTree_entity/recordcontainers/jdito/onUpdate.js
new file mode 100644
index 0000000000000000000000000000000000000000..ffe8298ae35f313e717bb0895c2ca41e3a84141e
--- /dev/null
+++ b/entity/AttributeRelationTree_entity/recordcontainers/jdito/onUpdate.js
@@ -0,0 +1,25 @@
+import("Sql_lib");
+import("system.util");
+import("system.db");
+import("system.vars");
+import("Attribute_lib");
+
+var type = AttributeUtil.getAttributeType(vars.get("$field.AB_ATTRIBUTE_ID"));
+
+var columns = [
+    "AB_ATTRIBUTE_ID"
+];
+var values = [
+    vars.get("$field.AB_ATTRIBUTE_ID")
+];
+
+var dbFields = AttributeTypeUtil.getAllDatabaseFields();
+dbFields.forEach(function (row)
+{
+    columns.push(row);
+    values.push("");
+});
+values[AttributeTypeUtil.getTypeColumnIndex(type) + 1] = vars.get("$field.VALUE");
+
+db.updateData("AB_ATTRIBUTERELATION", columns, null, values, 
+    SqlCondition.begin().andPrepareVars("AB_ATTRIBUTERELATION.AB_ATTRIBUTERELATIONID", "$field.UID"));
\ No newline at end of file
diff --git a/entity/AttributeRelation_entity/entityfields/valueproxy/contentTypeProcess.js b/entity/AttributeRelation_entity/entityfields/valueproxy/contentTypeProcess.js
index 1e7cfe8ada6f58bd12a58cf076c0a887ceee54f7..55d32c91b7003e4a973558a6460268ef5b6d962b 100644
--- a/entity/AttributeRelation_entity/entityfields/valueproxy/contentTypeProcess.js
+++ b/entity/AttributeRelation_entity/entityfields/valueproxy/contentTypeProcess.js
@@ -2,5 +2,5 @@ import("system.vars");
 import("system.result");
 import("Attribute_lib");
 
-var attrType = AttributeHandler.begin(vars.get("$field.AB_ATTRIBUTE_ID")).getAttributeContentType();
-result.string(attrType);
\ No newline at end of file
+var attributeType = AttributeUtil.getAttributeType(vars.get("$field.AB_ATTRIBUTE_ID"));
+result.string(AttributeTypeUtil.getContentType(attributeType));
\ No newline at end of file
diff --git a/entity/AttributeRelation_entity/entityfields/valueproxy/displayValueProcess.js b/entity/AttributeRelation_entity/entityfields/valueproxy/displayValueProcess.js
index c2cd0971b53da78645efc3ea3db900d49d9d412a..9a11a4c055e222f0f397c6bfe71862f12e362553 100644
--- a/entity/AttributeRelation_entity/entityfields/valueproxy/displayValueProcess.js
+++ b/entity/AttributeRelation_entity/entityfields/valueproxy/displayValueProcess.js
@@ -4,7 +4,7 @@ import("system.vars");
 import("Attribute_lib");
 import("Keyword_lib");
 
-var attrType = AttributeHandler.begin(vars.get("$field.AB_ATTRIBUTE_ID")).getAttributeType();
+var attrType = AttributeUtil.getAttributeType(vars.get("$field.AB_ATTRIBUTE_ID"));
 var value;
 if (attrType == $AttributeTypes.COMBO)
     value = AttributeUtil.getSimpleAttributeName(vars.get("$field.ID_VALUE"));
diff --git a/entity/AttributeRelation_entity/entityfields/valueproxy/onValueChange.js b/entity/AttributeRelation_entity/entityfields/valueproxy/onValueChange.js
index 5d8c07fa23edf16c4178d05f5de69dec3196dd17..150cb4b05da6e73456d57d8573aa7b77865a2960 100644
--- a/entity/AttributeRelation_entity/entityfields/valueproxy/onValueChange.js
+++ b/entity/AttributeRelation_entity/entityfields/valueproxy/onValueChange.js
@@ -1,10 +1,33 @@
+import("system.neon");
 import("system.vars");
 import("Entity_lib");
 import("Attribute_lib");
 
 var attrValue = vars.exists("$field.valueProxy") ? vars.get("$field.valueProxy") : "";
 attrValue = ProcessHandlingUtils.getOnValidationValue(attrValue);
-var attribute = AttributeHandler.begin(vars.get("$field.AB_ATTRIBUTE_ID"));
 
-if(attrValue != null)
-    attribute.setAttributeValue(attrValue);
\ No newline at end of file
+if (attrValue != null)
+{
+    var attributeType = AttributeUtil.getAttributeType(vars.get("$field.AB_ATTRIBUTE_ID"));
+    var attrField = (function ()
+    {
+        switch (this)
+        {
+            case $AttributeTypes.TEXT:
+                return "$field.CHAR_VALUE";
+            case $AttributeTypes.DATE:
+                return "$field.DATE_VALUE";
+            case $AttributeTypes.NUMBER:
+                return "$field.NUMBER_VALUE";
+            case $AttributeTypes.BOOLEAN:
+                return "$field.INT_VALUE";
+            case $AttributeTypes.COMBO:
+            case $AttributeTypes.KEYWORD:
+                return "$field.ID_VALUE";
+            default:
+                return null;
+        }
+    }).call(attributeType);
+    if (attrField)
+        neon.setFieldValue(attrField, attrValue);
+}
\ No newline at end of file
diff --git a/entity/AttributeRelation_entity/entityfields/valueproxy/possibleItemsProcess.js b/entity/AttributeRelation_entity/entityfields/valueproxy/possibleItemsProcess.js
index 4a7f1e46eda7a88afbfe7523691dd836a6f774bf..4f20aef0cd61ad7176e01ec946b5b3a0934e28b6 100644
--- a/entity/AttributeRelation_entity/entityfields/valueproxy/possibleItemsProcess.js
+++ b/entity/AttributeRelation_entity/entityfields/valueproxy/possibleItemsProcess.js
@@ -6,7 +6,7 @@ import("Attribute_lib");
 import("Sql_lib");
 
 var attributeId = vars.get("$field.AB_ATTRIBUTE_ID");
-var attrType = AttributeHandler.begin(attributeId).getAttributeType();
+var attrType = AttributeUtil.getAttributeType(attributeId);
 
 if (attrType == $AttributeTypes.COMBO)
 {
diff --git a/entity/AttributeRelation_entity/entityfields/valueproxy/valueProcess.js b/entity/AttributeRelation_entity/entityfields/valueproxy/valueProcess.js
index bea46eecb189b5b83f3704ecf8ea3f019d0581c4..572e01f1e130b05c78e5bf8762959e16daa895d0 100644
--- a/entity/AttributeRelation_entity/entityfields/valueproxy/valueProcess.js
+++ b/entity/AttributeRelation_entity/entityfields/valueproxy/valueProcess.js
@@ -1,20 +1,39 @@
+import("system.logging");
 import("system.neon");
 import("system.result");
 import("system.vars");
 import("Attribute_lib");
 
-"$field.CHAR_VALUE";
-"$field.DATE_VALUE";
-"$field.NUMBER_VALUE";
-"$field.INT_VALUE";
-"$field.ID_VALUE";
-
 if(vars.get("$sys.recordstate") != neon.OPERATINGSTATE_NEW)
 {
-    var attrField = AttributeHandler.begin(vars.get("$field.AB_ATTRIBUTE_ID")).getAttributeField();
+    var rowId = vars.get("$param.ObjectRowId_param");
+    var objectType = vars.get("$param.ObjectType_param");
+    var attributeId = vars.get("$field.AB_ATTRIBUTE_ID");
+    logging.log(AttributeRelationUtils.getAttribute(attributeId, rowId, objectType))
+    logging.log(AttributeRelationUtils.getAttribute(attributeId, rowId, objectType, true))
+    
+    
+    var attributeType = AttributeUtil.getAttributeType(vars.get("$field.AB_ATTRIBUTE_ID"));
+    var attrField = (function ()
+    {
+        switch (this)
+        {
+            case $AttributeTypes.TEXT:
+                return "$field.CHAR_VALUE";
+            case $AttributeTypes.DATE:
+                return "$field.DATE_VALUE";
+            case $AttributeTypes.NUMBER:
+                return "$field.NUMBER_VALUE";
+            case $AttributeTypes.BOOLEAN:
+                return "$field.INT_VALUE";
+            case $AttributeTypes.COMBO:
+            case $AttributeTypes.KEYWORD:
+                return "$field.ID_VALUE";
+        }
+    }).call(attributeType);
     var value = null;
     if (attrField != null) //load the value from the correct field for the type
-        value = vars.get("$field." + attrField);
+        value = vars.get(attrField);
     
     if(value != null && value != "")
         result.string(value); 
diff --git a/entity/Attribute_entity/entityfields/attribute_type/displayValueProcess.js b/entity/Attribute_entity/entityfields/attribute_type/displayValueProcess.js
index 1b16072cc5a33cdaf35fd48c69d9b74e98b526f7..84b0b0897c6ca1df575eb8bf7f5bd4bb3e94c15c 100644
--- a/entity/Attribute_entity/entityfields/attribute_type/displayValueProcess.js
+++ b/entity/Attribute_entity/entityfields/attribute_type/displayValueProcess.js
@@ -8,7 +8,7 @@ import("KeywordRegistry_basic");
 
 if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && vars.get("$field.ATTRIBUTE_PARENT_ID") != "")
 {
-    var type = AttributeHandler.begin(vars.get("$field.ATTRIBUTE_PARENT_ID")).getAttributeType();
+    var type = AttributeUtil.getAttributeType(vars.get("$field.ATTRIBUTE_PARENT_ID"));
     if (type == $AttributeTypes.COMBO)
         result.string(KeywordUtils.getViewValue($KeywordRegistry.attributeType(), $AttributeTypes.COMBOVALUE));
 }
\ No newline at end of file
diff --git a/entity/Attribute_entity/entityfields/attribute_type/valueProcess.js b/entity/Attribute_entity/entityfields/attribute_type/valueProcess.js
index 8c60a83409d16ed0c06f474820e356a9c71b4fbb..28020da1dda1e2253c7b1693b379f63d9e100d8c 100644
--- a/entity/Attribute_entity/entityfields/attribute_type/valueProcess.js
+++ b/entity/Attribute_entity/entityfields/attribute_type/valueProcess.js
@@ -6,7 +6,7 @@ import("Attribute_lib");
 
 if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && vars.get("$field.ATTRIBUTE_PARENT_ID") != "")
 {
-    var type = AttributeHandler.begin(vars.get("$field.ATTRIBUTE_PARENT_ID")).getAttributeType();
+    var type = AttributeUtil.getAttributeType(vars.get("$field.ATTRIBUTE_PARENT_ID"));
     if (type == $AttributeTypes.COMBO)
         result.string($AttributeTypes.COMBOVALUE);
 }
\ No newline at end of file
diff --git a/neonContext/AttributeRelationTree/AttributeRelationTree.aod b/neonContext/AttributeRelationTree/AttributeRelationTree.aod
index 9acb4ce97d8d3d086df679b67f01a23ac945eb63..be8de92fa69a5d08edd83d856cb8f2dc0516a26c 100644
--- a/neonContext/AttributeRelationTree/AttributeRelationTree.aod
+++ b/neonContext/AttributeRelationTree/AttributeRelationTree.aod
@@ -2,6 +2,7 @@
 <neonContext xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.0" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonContext/1.1.0">
   <name>AttributeRelationTree</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
+  <editview>AttributeRelationTreeEdit_view</editview>
   <entity>AttributeRelationTree_entity</entity>
   <references>
     <neonViewReference>
diff --git a/neonView/AttributeRelationTree_view/AttributeRelationTree_view.aod b/neonView/AttributeRelationTree_view/AttributeRelationTree_view.aod
index 47d34ce205514a2df8cb6cb601ec8925ba2ff69d..0dbe7b672e013f65aec5bdb8f094a0b52aa983ae 100644
--- a/neonView/AttributeRelationTree_view/AttributeRelationTree_view.aod
+++ b/neonView/AttributeRelationTree_view/AttributeRelationTree_view.aod
@@ -1,18 +1,18 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.1">
-  <name>AttributeRelationTree_view</name>
-  <majorModelMode>DISTRIBUTED</majorModelMode>
-  <layout>
-    <boxLayout>
-      <name>layout</name>
-    </boxLayout>
-  </layout>
-  <children>
-    <treeViewTemplate>
-      <name>AttributeRelationTree</name>
-      <parentField>PARENT_ID</parentField>
-      <titleField>TITLE</titleField>
-      <entityField>#ENTITY</entityField>
-    </treeViewTemplate>
-  </children>
-</neonView>
+<?xml version="1.0" encoding="UTF-8"?>
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.1">
+  <name>AttributeRelationTree_view</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <layout>
+    <boxLayout>
+      <name>layout</name>
+    </boxLayout>
+  </layout>
+  <children>
+    <treeViewTemplate>
+      <name>AttributeRelationTree</name>
+      <parentField>PARENT_ID</parentField>
+      <titleField>VALUE</titleField>
+      <entityField>#ENTITY</entityField>
+    </treeViewTemplate>
+  </children>
+</neonView>
diff --git a/process/Attribute_lib/process.js b/process/Attribute_lib/process.js
index 4833062c4d4339456153be1f9e59a7978ce05498..77622496e39d17b337328ae1a7c66461aeb10bde 100644
--- a/process/Attribute_lib/process.js
+++ b/process/Attribute_lib/process.js
@@ -155,6 +155,22 @@ AttributeUtil.hasRelations = function (pAttributeId)
     ) == "true";
 }
 
+/**
+ * returns the type of an attribute
+ * 
+ * @param {String} pAttributeId the id of the attribute
+ * 
+ * @result {String} attribute type
+ */
+AttributeUtil.getAttributeType = function (pAttributeId)
+{
+    var attrTypeSelect = "select ATTRIBUTE_TYPE from AB_ATTRIBUTE";
+    attrTypeSelect = SqlCondition.begin()
+        .andPrepare("AB_ATTRIBUTE.AB_ATTRIBUTEID", pAttributeId)
+        .buildSql(attrTypeSelect);
+    return db.cell(attrTypeSelect).trim();
+}
+
 /*********************************************************************************************************************/
 
 /**
@@ -171,25 +187,39 @@ function AttributeRelationUtils () {}
  * @param {String} pAttributeId attribute-id
  * @param {String} pObjectRowId row-id of the dataset
  * @param {String} [pObjectType=null] object-type
+ * @param {String} [pGetViewValue=false] if true the values are resolved and formatted
  * 
  * @return {String|null} the value of the attribute
  */
-AttributeRelationUtils.getAttribute = function (pAttributeId, pObjectRowId, pObjectType)
+AttributeRelationUtils.getAttribute = function (pAttributeId, pObjectRowId, pObjectType, pGetViewValue)
 {
     var attrCond = SqlCondition.begin()
-        .andPrepare("AB_ATTRIBUTERELATION.AB_ATTRIBUTE_ID", pAttributeId)
-        .andPrepare("AB_ATTRIBUTERELATION.OBJECT_ROWID", pObjectRowId);
+        .andPrepare("AB_ATTRIBUTERELATION.OBJECT_ROWID", pObjectRowId)
+        .andPrepare("AB_ATTRIBUTERELATION.AB_ATTRIBUTE_ID", pAttributeId);
     if (pObjectType != null)
-        attrCond.andPrepare("AB_ATTRIBUTERELATION.OBJECT_TYPE", pAttributeId);
+        attrCond.andPrepare("AB_ATTRIBUTERELATION.OBJECT_TYPE", pObjectType);
+    
+    var defaultFields = [
+        "AB_ATTRIBUTE.ATTRIBUTE_TYPE", 
+        "AB_ATTRIBUTE.KEYWORD_CONTAINER", 
+        "COMBOVAL.ATTRIBUTE_NAME"
+    ];
+    var valueFields = AttributeTypeUtil.getAllDatabaseFields();
+    var attributeSql = attrCond.buildSql("select " + defaultFields.join(", ") + ", " + valueFields.join(", ")
+        + " from AB_ATTRIBUTERELATION join AB_ATTRIBUTE on AB_ATTRIBUTE_ID = AB_ATTRIBUTE.AB_ATTRIBUTEID"
+        + " left join AB_ATTRIBUTE COMBOVAL on " + $AttributeTypes.COMBO.databaseField + " = COMBOVAL.AB_ATTRIBUTEID");
     
-    var attributeSql = attrCond.buildSql("select ATTRIBUTE_TYPE, " + AttributeTypeUtil.getAllDatabaseFields().join(", ")
-        + " from AB_ATTRIBUTERELATION join AB_ATTRIBUTE on AB_ATTRIBUTE_ID = AB_ATTRIBUTEID");
     var attributeValues = db.array(db.ROW, attributeSql);
-    if (attributeValues.length == 0)
+    if (!attributeValues.length)
         return null;
     
-    var valueIndex = AttributeTypeUtil.getTypeColumnIndex(attributeValues[0]) + 1;
-    return attributeValues[valueIndex];
+    let value = attributeValues[AttributeTypeUtil.getTypeColumnIndex(attributeValues[0]) + defaultFields.length];
+    if (pGetViewValue && attributeValues[1].trim() == $AttributeTypes.COMBO)
+        value = attributeValues[2];
+    else if (pGetViewValue)
+        value = AttributeTypeUtil.getAttributeViewValue(attributeValues[0].trim(), value, attributeValues[1]);
+    
+    return value;
 }
 
 /**
@@ -197,43 +227,45 @@ AttributeRelationUtils.getAttribute = function (pAttributeId, pObjectRowId, pObj
  * 
  * @param {String} pObjectRowId object rowid
  * @param {String} [pObjectType=null] object-type
- * @param {String} [pResolveNames=false] if true the full attribute names are used instead of the ids
- * @param {String} [pGetUID=false] include the attributeRelation id
+ * @param {String} [pUseAttributeIds=false] if true the ids are used instead of the full attribute names
+ * @param {String} [pUseIdValues=false] if true the values are not resolved or formatted
  * 
- * @return {String[][]} two-dimensional array a row is [attributeId|attributeName, value] or if pGetUID is true, [attriuteRelationId, attributeId|attributeName, value]
+ * @return {String[][]} two-dimensional array a row is [attributeId|attributeName, value]
  */
-AttributeRelationUtils.getAllAttributes = function (pObjectRowId, pObjectType, pResolveNames, pGetUID)
+AttributeRelationUtils.getAllAttributes = function (pObjectRowId, pObjectType, pUseAttributeIds, pUseIdValues)
 {
     var attrCond = SqlCondition.begin()
         .andPrepare("AB_ATTRIBUTERELATION.OBJECT_ROWID", pObjectRowId);
     if (pObjectType != null)
         attrCond.andPrepare("AB_ATTRIBUTERELATION.OBJECT_TYPE", pObjectType);
     
-    var attributeSql = attrCond.buildSql("select AB_ATTRIBUTERELATIONID, AB_ATTRIBUTE_ID, AB_ATTRIBUTE.ATTRIBUTE_TYPE, AB_ATTRIBUTE.KEYWORD_CONTAINER, COMBOVAL.ATTRIBUTE_NAME, " 
-        + AttributeTypeUtil.getAllDatabaseFields().join(", ")
+    var defaultFields = [
+        "AB_ATTRIBUTE_ID", 
+        "AB_ATTRIBUTE.ATTRIBUTE_TYPE", 
+        "AB_ATTRIBUTE.KEYWORD_CONTAINER", 
+        "COMBOVAL.ATTRIBUTE_NAME"
+    ];
+    var valueFields = AttributeTypeUtil.getAllDatabaseFields();
+    var attributeSql = attrCond.buildSql("select " + defaultFields.join(", ") + ", " + valueFields.join(", ")
         + " from AB_ATTRIBUTERELATION join AB_ATTRIBUTE on AB_ATTRIBUTE_ID = AB_ATTRIBUTE.AB_ATTRIBUTEID"
         + " left join AB_ATTRIBUTE COMBOVAL on " + $AttributeTypes.COMBO.databaseField + " = COMBOVAL.AB_ATTRIBUTEID");
     
     var attributeNameMap = {};
     var attributeValues = db.table(attributeSql).map(function (row) 
     {
-        let attribute = row[1];
-        if (pResolveNames)
+        let attribute = row[0];
+        if (!pUseAttributeIds)
         {
             if (!(attribute in attributeNameMap))
                 attributeNameMap[attribute] = AttributeUtil.getFullAttributeName(attribute);
             attribute = attributeNameMap[attribute];
         }
-        let value;
-        if (row[2].trim() == $AttributeTypes.COMBO)
-            value = row[4];
-        else
-        {
-            value = row[AttributeTypeUtil.getTypeColumnIndex(row[2]) + 5];
-            value = AttributeTypeUtil.getAttributeViewValue(row[2].trim(), value, row[3]);
-        }
-        if (pGetUID)
-            return [row[0], attribute, value];
+        let value = row[AttributeTypeUtil.getTypeColumnIndex(row[1]) + defaultFields.length];
+        if (!pUseIdValues && row[1].trim() == $AttributeTypes.COMBO)
+            value = row[3];
+        else if (!pUseIdValues)
+            value = AttributeTypeUtil.getAttributeViewValue(row[1].trim(), value, row[2]);
+        
         return [attribute, value];
     });
     
@@ -255,81 +287,6 @@ AttributeRelationUtils.setAttribute = function ()
 
 /*********************************************************************************************************************/
 
-/**
- * This is used in the AttributeRelation enitiy to make the work with attributes there
- * easier. You probaly won't need this for anything else.
- * 
- * @param {String} pAttrId the id of the attribute
- * 
- * @class
- */
-function AttributeHandler (pAttrId)   //TODO: find out if this class is necessary, maybe there is a more elegant solution, this could also be static
-{
-    this.attributeId = pAttrId;
-    this._attributeType = null;
-}
-
-/**
- * Returns a new AttributeHandler for the given Attribute
- */
-AttributeHandler.begin = function (pAttrId)
-{
-    return new AttributeHandler(pAttrId);
-}
-
-/**
- * gets the type of the attribute by the attributeId, after the first call the value
- * is stored so that the sql selection is done only once
- * 
- * @return {String} attribute type
- */
-AttributeHandler.prototype.getAttributeType = function () //TODO: maybe the type should be an own field in the entity instead of getting the type from the attribute id
-{
-    if (this._attributeType == null && this.attributeId != null)
-    {
-        var attrTypeSelect = "select ATTRIBUTE_TYPE from AB_ATTRIBUTE";
-        attrTypeSelect = SqlCondition.begin()
-            .andPrepare("AB_ATTRIBUTE.AB_ATTRIBUTEID", this.attributeId)
-            .buildSql(attrTypeSelect);
-        this._attributeType = db.cell(attrTypeSelect).trim();
-    }
-    return this._attributeType;
-}
-
-/**
- * returns the field that belongs to the type of the attribute
- * 
- * @return {String} attribute field
- */
-AttributeHandler.prototype.getAttributeField = function ()
-{
-    return AttributeTypeUtil.getEntityField(this.getAttributeType());
-}
-
-/**
- * returns the content type that belongs to the type of the attribute
- * 
- * @return {String} attribute field
- */
-AttributeHandler.prototype.getAttributeContentType = function ()
-{
-    return AttributeTypeUtil.getContentType(this.getAttributeType());
-}
-
-/**
- * Sets the value to the AttributeField and also return s the value again.
- * 
- * @param pValue the value
- * 
- * @return {Any} the value
- */
-AttributeHandler.prototype.setAttributeValue = function (pValue)
-{
-    var field = "$field." + this.getAttributeField();
-    if (field != null && vars.exists(field))
-        neon.setFieldValue(field, pValue)
-    return pValue;
-}
 
 /**
  * Object for the enumeration and management of all attribute types.
@@ -341,7 +298,6 @@ AttributeHandler.prototype.setAttributeValue = function (pValue)
  * keyword = the key of the corresponding keyword
  * contentType = the value that is returned in the contentType process for the attribute
  * databaseField = the database field that holds values of attributes with the type
- * entityField = the field in the AttributeRelation enity that holds the value of the attribute for that type
  * 
  * The display name is controlled by the keyword 'AttributeType'
  */
@@ -351,15 +307,13 @@ $AttributeTypes.TEXT = {
     toString : function () {return this.keyword},
     keyword : "TEXT",
     contentType : "TEXT", 
-    databaseField : "CHAR_VALUE", 
-    entityField : "CHAR_VALUE"
+    databaseField : "CHAR_VALUE"
 };
 $AttributeTypes.DATE = {
     toString : function () {return this.keyword},
     keyword : "DATE",
     contentType : "DATE", 
-    databaseField : "DATE_VALUE", 
-    entityField : "DATE_VALUE",
+    databaseField : "DATE_VALUE",
     getViewValue : function (pValue)
         {
             return datetime.toDate(pValue, translate.text("dd.MM.yyyy"));
@@ -369,15 +323,13 @@ $AttributeTypes.NUMBER = {
     toString : function () {return this.keyword},
     keyword : "NUMBER",
     contentType : "NUMBER", 
-    databaseField : "NUMBER_VALUE", 
-    entityField : "NUMBER_VALUE"
+    databaseField : "NUMBER_VALUE"
 };
 $AttributeTypes.BOOLEAN = {
     toString : function () {return this.keyword},
     keyword : "BOOLEAN",
     contentType : "BOOLEAN", 
-    databaseField : "INT_VALUE", 
-    entityField : "INT_VALUE",
+    databaseField : "INT_VALUE",
     getViewValue : function (pValue)
         {
             return pValue == "1" ? translate.text("Yes") : translate.text("No");
@@ -387,29 +339,25 @@ $AttributeTypes.COMBO = {
     toString : function () {return this.keyword},
     keyword : "COMBO",
     contentType : "UNKNOWN",
-    databaseField : "ID_VALUE", 
-    entityField : "ID_VALUE"
+    databaseField : "ID_VALUE"
 };
 $AttributeTypes.COMBOVALUE = {
     toString : function () {return this.keyword},
     keyword : "COMBOVALUE",
     contentType : null, 
-    databaseField : null, 
-    entityField : null
+    databaseField : null
 };
 $AttributeTypes.GROUP = {
     toString : function () {return this.keyword},
     keyword : "GROUP",
     contentType : null, 
-    databaseField : null, 
-    entityField : null
+    databaseField : null
 };
 $AttributeTypes.KEYWORD = {
     toString : function () {return this.keyword},
     keyword : "KEYWORD",
     contentType : "UNKNOWN", 
     databaseField : "ID_VALUE", 
-    entityField : "ID_VALUE",
     getViewValue : function (pValue, pKeyword)
         {
             return KeywordUtils.getViewValue(pKeyword, pValue);
diff --git a/process/Organisation_lib/process.js b/process/Organisation_lib/process.js
index 7f7bba96f84861008454d5cd16c1b4243afe2177..6072424e6228442074a63db68852cf478a1ecfe0 100644
--- a/process/Organisation_lib/process.js
+++ b/process/Organisation_lib/process.js
@@ -121,7 +121,7 @@ OrgUtils.openOrgReport = function(pOrgId)
     });
     histData = ReportData.begin(["ENTRYDATE", "MEDIUM", "LOGIN", "INFO"]).add(histData);
     
-    var attr = AttributeRelationUtils.getAllAttributes(pOrgId, null, true)
+    var attr = AttributeRelationUtils.getAllAttributes(pOrgId)
         .map(function (row) {return row.join(": ")})
         .join("\n");