diff --git a/entity/KeywordEntry_entity/KeywordEntry_entity.aod b/entity/KeywordEntry_entity/KeywordEntry_entity.aod
index 97125bb8039cdfc95b82b1a17c2dc1f1e9d0d198..daf9a9b371d958db9e78f601137e38a4c9b642c5 100644
--- a/entity/KeywordEntry_entity/KeywordEntry_entity.aod
+++ b/entity/KeywordEntry_entity/KeywordEntry_entity.aod
@@ -22,6 +22,8 @@
       <mandatory v="true" />
       <possibleItemsProcess>%aditoprj%/entity/KeywordEntry_entity/entityfields/container/possibleItemsProcess.js</possibleItemsProcess>
       <groupable v="true" />
+      <state>READONLY</state>
+      <stateProcess>%aditoprj%/entity/KeywordEntry_entity/entityfields/container/stateProcess.js</stateProcess>
     </entityField>
     <entityField>
       <name>AB_KEYWORD_ENTRYID</name>
@@ -30,10 +32,13 @@
     </entityField>
     <entityField>
       <name>KEYID</name>
+      <documentation>%aditoprj%/entity/KeywordEntry_entity/entityfields/keyid/documentation.adoc</documentation>
       <title>Key</title>
+      <mandatory v="true" />
       <state>READONLY</state>
       <stateProcess>%aditoprj%/entity/KeywordEntry_entity/entityfields/keyid/stateProcess.js</stateProcess>
       <valueProcess>%aditoprj%/entity/KeywordEntry_entity/entityfields/keyid/valueProcess.js</valueProcess>
+      <onValidation>%aditoprj%/entity/KeywordEntry_entity/entityfields/keyid/onValidation.js</onValidation>
     </entityField>
     <entityField>
       <name>TITLE</name>
diff --git a/entity/KeywordEntry_entity/entityfields/container/documentation.adoc b/entity/KeywordEntry_entity/entityfields/container/documentation.adoc
index b46aaac93ed420d5150d4d5202dc302a4898ca70..e1cfb215ac798637843c387c914479f4428e301a 100644
--- a/entity/KeywordEntry_entity/entityfields/container/documentation.adoc
+++ b/entity/KeywordEntry_entity/entityfields/container/documentation.adoc
@@ -1 +1,2 @@
- `CONTAINER` is the a name and used for grouping keyword-entries. This is was a keyword-container essentially is.
\ No newline at end of file
+ `CONTAINER` is the a name and used for grouping keyword-entries. This is was a keyword-container essentially is.
+After creation of an entry it cannot be changed anymore.
\ No newline at end of file
diff --git a/entity/KeywordEntry_entity/entityfields/container/stateProcess.js b/entity/KeywordEntry_entity/entityfields/container/stateProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..82fc64847e6ac4e59a674fac7873eef6161aa741
--- /dev/null
+++ b/entity/KeywordEntry_entity/entityfields/container/stateProcess.js
@@ -0,0 +1,19 @@
+import("system.result");
+import("system.neon");
+import("system.vars");
+
+/*allowing the CONTAINER to change later would result in a lot of problems like
+ * - what happens to SORTING-value?
+ * - what happens with already created keyword-attributerelations?
+ * - what happens when a key is specified twice after the change?
+ * - what happens when the keywordentry has been already used?
+ * 
+ * Therefore just forbid to change it after the record has been inserted
+ */
+var fieldState;
+if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW)
+    fieldState = neon.COMPONENTSTATE_AUTO;
+else
+    fieldState = neon.COMPONENTSTATE_READONLY;
+
+result.string(fieldState);
\ No newline at end of file
diff --git a/entity/KeywordEntry_entity/entityfields/keyid/documentation.adoc b/entity/KeywordEntry_entity/entityfields/keyid/documentation.adoc
new file mode 100644
index 0000000000000000000000000000000000000000..543e079982a272d1ea3414231414004150915df5
--- /dev/null
+++ b/entity/KeywordEntry_entity/entityfields/keyid/documentation.adoc
@@ -0,0 +1,7 @@
+The key of an keyword-entry is a internal, technical representation which is stored in references.
+It's unique within a keyword-container but not within the whole keyword-module (like the `AB_KEYWORD_ENTRYID` is).
+
+A UUID is generated and used as preset-value but it's possible to overwrite the `KEYID` with an own value (as long as the custom key follows the rules, like keyword-entry-level-uniqueness)
+This could for example be ISO-standardised value or a value that is maintained within an ERP-system.
+
+After creation of an entry it cannot be changed anymore.
\ No newline at end of file
diff --git a/entity/KeywordEntry_entity/entityfields/keyid/onValidation.js b/entity/KeywordEntry_entity/entityfields/keyid/onValidation.js
new file mode 100644
index 0000000000000000000000000000000000000000..a0830f5196463702be757aa76d46e9b3d3c1c8f4
--- /dev/null
+++ b/entity/KeywordEntry_entity/entityfields/keyid/onValidation.js
@@ -0,0 +1,26 @@
+import("system.translate");
+import("system.result");
+import("system.db");
+import("system.vars");
+import("Sql_lib");
+import("Entity_lib");
+
+var container = vars.get("$field.CONTAINER");
+var keyId = ProcessHandlingUtils.getOnValidationValue(vars.get("$field.KEYID")).trim();
+
+//a KEY has always to be unique within one container and since the user can specify the key on insert we've to ensure that it's unique
+if (container && keyId)
+{
+    var selfEntryId = vars.get("$field.AB_KEYWORD_ENTRYID");
+    var sqlMasks = new SqlMaskingUtils();
+    var alreadyExistsSql = SqlCondition.begin()
+                                        .andPrepare(sqlMasks.trim("AB_KEYWORD_ENTRY.KEYID"), keyId, null, SqlUtils.getSingleColumnType("AB_KEYWORD_ENTRY", "KEYID"))
+                                        .andPrepare("AB_KEYWORD_ENTRY.CONTAINER", container)
+                                        .andPrepare("AB_KEYWORD_ENTRY.AB_KEYWORD_ENTRYID", selfEntryId, "# != ?")
+                                        .buildSql("select AB_KEYWORD_ENTRY.AB_KEYWORD_ENTRYID from AB_KEYWORD_ENTRY");
+    var alreadyExistantEntryId = db.cell(alreadyExistsSql);
+    
+    if (alreadyExistantEntryId != "")
+        result.string(translate.text("the specified key has to be unique for that container but does already exist"));
+    
+}
\ No newline at end of file
diff --git a/entity/KeywordEntry_entity/entityfields/keyid/valueProcess.js b/entity/KeywordEntry_entity/entityfields/keyid/valueProcess.js
index 4af99287f59a86e98d9b4c552c010fe13c106cc7..2fc41228ab188dc70af71478adb1d1afd7c1cb77 100644
--- a/entity/KeywordEntry_entity/entityfields/keyid/valueProcess.js
+++ b/entity/KeywordEntry_entity/entityfields/keyid/valueProcess.js
@@ -3,5 +3,5 @@ import("system.result");
 import("system.neon");
 import("system.vars");
 
-if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW)
+if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && !vars.get("$this.value"))
     result.string(util.getNewUUID());
\ No newline at end of file
diff --git a/entity/KeywordEntry_entity/recordcontainers/db/onDBUpdate.js b/entity/KeywordEntry_entity/recordcontainers/db/onDBUpdate.js
index d9f8978acd6592e20a2851d1e46b490b2ff398d7..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644
--- a/entity/KeywordEntry_entity/recordcontainers/db/onDBUpdate.js
+++ b/entity/KeywordEntry_entity/recordcontainers/db/onDBUpdate.js
@@ -1,29 +0,0 @@
-import("system.translate");
-import("system.db");
-import("system.vars");
-import("system.text");
-import("system.neon");
-import("Sql_lib");
-
-var changedFields = vars.get("$local.changed");
-//whenever the container is changed data that depends on the keyword-container has be "fixed" to keep consistency
-//this could be information like Keyword-attributes or the sorting-position
-// TODO: maybe it'd be better to lock KeywordContainer as read-only after creation
-if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_EDIT && changedFields.indexOf("AB_KEYWORD_ENTRY.CONTAINER") > -1)
-{
-    var keyContainer = vars.get("$field.CONTAINER");
-    if (keyContainer)
-    {
-        var cond = SqlCondition.begin().andPrepare("AB_KEYWORD_ENTRY.CONTAINER", keyContainer);
-        var maskingHelper = new SqlMaskingUtils();
-        var newCodeNumber = db.cell(cond.buildSql("select " + maskingHelper.max("AB_KEYWORD_ENTRY.SORTING") + " from AB_KEYWORD_ENTRY", "1 = 2"));
-        newCodeNumber = Number(newCodeNumber);//if no number exists till no, start value will be 1 (due to: ++0)
-        if (isNaN(newCodeNumber))
-            throw new TypeError(translate.text("The code number is not a valid number."));
-
-        var cols = ["SORTING"];
-        var vals = [++newCodeNumber];
-        cond.clear().andPrepare("AB_KEYWORD_ENTRY.AB_KEYWORD_ENTRYID", vars.get("$sys.uid"));
-        db.updateData("AB_KEYWORD_ENTRY", cols, null, vals, cond.build("1 = 2"));
-    }
-}
\ No newline at end of file