diff --git a/process/ImporterMappingFunctions_lib/process.js b/process/ImporterMappingFunctions_lib/process.js
index 6aac697100b39082af111adfeeb977d22b833802..a7c2ddaf30f6f6b136c938af767e55cb40c67334 100644
--- a/process/ImporterMappingFunctions_lib/process.js
+++ b/process/ImporterMappingFunctions_lib/process.js
@@ -8,6 +8,7 @@ import("system.util");
 import("system.datetime");
 import("system.logging");
 import("Attribute_lib");
+import("KeywordRegistry_basic");
 import("Sql_lib");
 import("Importer_lib");
 
@@ -178,90 +179,134 @@ function iAttribute(pObject) {
 
 /*
  * Values of the mapping line:
- * Attribute req -- the column index with the new attribute value
- * AType req -- the type of the attribute
- * Container req -- the container name of the keyword
- * Keyword opt -- a new keyword name or an existing KeyId (AB_KEYWORD_ATTRIBUTERELATION)
- * Value opt - the value of the relation (AB_KEYWORD_ATTRIBUTERELATION)
+ * - attribute (required): The column index with the new attribute value.
+ * - attributeType (required): The type of the attribute.
+ * - keywordContainer (required): The container name of the keyword.
+ * - keyword (optional): A new keyword name or an existing KeyId (AB_KEYWORD_ATTRIBUTERELATION).
+ * - value (optional): The value of the relation (AB_KEYWORD_ATTRIBUTERELATION).
  *
  * @name iKeywordAttribute
- * @param {Object} pObject req the mapping line
+ * @param {Object} pObject (required) the mapping line.
  * @return {Boolean} true
  * */
+
 function iKeywordAttribute(pObject) {
     if (!this.doIfCheck(pObject)) return true;
     
-    var attribute = this.InputRecord[pObject.Attribute];
-    if(attribute == undefined) attribute = this.resolveSymbol(pObject, pObject.Attribute);
-    var atype = this.InputRecord[pObject.AType];
-    if(atype == undefined) atype = this.resolveSymbol(pObject, pObject.AType);
-    var container = this.InputRecord[pObject.Container];
-    if(container == undefined) container = this.resolveSymbol(pObject, pObject.Container);
-    var keyword = this.InputRecord[pObject.Keyword];
-    if(keyword == undefined) keyword = this.resolveSymbol(pObject, pObject.Keyword);
-    var value = this.InputRecord[pObject.Value];
-    if(value == undefined) value = this.resolveSymbol(pObject, pObject.Value);
+    var keywordAttribute = this.InputRecord[pObject.attribute];
+    if(keywordAttribute == undefined) keywordAttribute = this.resolveSymbol(pObject, pObject.attribute);
+
+    var keywordAttributeType = this.InputRecord[pObject.attributeType];
+    if(keywordAttributeType == undefined) keywordAttributeType = this.resolveSymbol(pObject, pObject.attributeType);
+
+    var keywordContainer = this.InputRecord[pObject.keywordContainer];
+    if(keywordContainer == undefined) keywordContainer = this.resolveSymbol(pObject, pObject.keywordContainer);
     
-    if (!attribute || !container || !atype) return true;
-    atype = atype.toUpperCase();
+    var keyword = this.InputRecord[pObject.keyword];
+    if(keyword == undefined) keyword = this.resolveSymbol(pObject, pObject.keyword);
+    
+    var keywordAttrRelValue = this.InputRecord[pObject.keywordAttrRelValue];
+    if(keywordAttrRelValue == undefined) keywordAttrRelValue = this.resolveSymbol(pObject, pObject.keywordAttrRelValue);
+    
+    if (!keywordAttribute || !keywordContainer || !keywordAttributeType) return true;
+    keywordAttributeType = keywordAttributeType.toUpperCase();
     
     var valueColumn = "";
-    switch (atype) {
-        case $AttributeTypes.TEXT.toString():
+    
+    switch (keywordAttributeType) {
+        case $KeywordRegistry.keywordAttributeType$char():
             valueColumn = this.getColumnCase("char_value");
             break;
-        case $AttributeTypes.NUMBER.toString():
+        case $KeywordRegistry.keywordAttributeType$number():
             valueColumn = this.getColumnCase("number_value");           
             break;
-        case $AttributeTypes.BOOLEAN.toString():
+        case $KeywordRegistry.keywordAttributeType$bool():
             valueColumn = this.getColumnCase("bool_value");         
             break;
+        case $KeywordRegistry.keywordAttributeType$longChar():
+            valueColumn = this.getColumnCase("long_char_value");
+            break;
         default:
             return true;
     }
     
-    var sql = "select " + this.getColumnCase("ab_keyword_attributeid") + " from  " + this.getTableCase("ab_keyword_attribute") 
-    + " where " + this.getColumnCase("name") + " = ? and " + this.getColumnCase("container") + " = ?";
-    var aid = db.cell([sql, [[attribute, SQLTYPES.VARCHAR], [container, SQLTYPES.VARCHAR]]], this.Config.AliasTo); 
-    if (aid == "" || aid == null) {
-        aid = util.getNewUUID();
-        var columns = [this.getColumnCase("ab_keyword_attributeid"), this.getColumnCase("name"), this.getColumnCase("container"), this.getColumnCase("type")];
-        this.insertData(this.getTableCase("ab_keyword_attribute"), columns, null, [aid, attribute, container, atype], this.Config.AliasTo);
+    var sql = "select " + this.getColumnCase("ab_keyword_attributeid") 
+            + " from  " + this.getTableCase("ab_keyword_attribute") 
+            + " where " + this.getColumnCase("name") 
+            + " = ? and " + this.getColumnCase("container") + " = ?";
+
+    var attributeId = db.cell([sql, [[keywordAttribute, SQLTYPES.VARCHAR], [keywordContainer, SQLTYPES.VARCHAR]]], this.Config.AliasTo); 
+    
+    // Creates the entry in AB_KEYWORD_ATTRIBUTE, case if it not exists.
+    if (attributeId == "" || attributeId == null) {
+        attributeId = util.getNewUUID();
+        var columns = [this.getColumnCase("ab_keyword_attributeid"), 
+                        this.getColumnCase("name"), 
+                        this.getColumnCase("container"), 
+                        this.getColumnCase("kind")];
+
+        this.insertData(this.getTableCase("ab_keyword_attribute"), columns, null, 
+                        [attributeId, keywordAttribute, keywordContainer, keywordAttributeType], this.Config.AliasTo);
     }
     
-    if (keyword && value) {   
-        sql = "select " + this.getColumnCase("keyid") + " from " + this.getTableCase("ab_keyword_entry") + " where " 
-        + this.getColumnCase("keyid") + " = ?";
-        var kid = db.cell([sql, [[keyword, SQLTYPES.CHAR]]], this.Config.AliasTo);      
+    // Creates the entry in AB_KEYWORD_ENTRY and AB_KEYWORD_ATTRIBUTERELATION, case if it not exists.
+    if (keyword && keywordAttrRelValue) {   
+        sql = "select " + this.getColumnCase("ab_keyword_entryid")
+            + " from " + this.getTableCase("ab_keyword_entry")
+            + " where " + this.getColumnCase("keyid") + " = ?";
+    
+        var keywordId = db.cell([sql, [[keyword, SQLTYPES.CHAR]]], this.Config.AliasTo);      
         
-        if (kid == "" || kid == null) {
-            sql = "select " + this.getColumnCase("keyid") + " from " + this.getTableCase("ab_keyword_entry") + " where " 
-            + this.getColumnCase("container") + " = ? and " + this.getColumnCase("title") + " = ?";
-            kid = db.cell([sql, [[container, SQLTYPES.VARCHAR], [keyword, SQLTYPES.VARCHAR]]], this.Config.AliasTo);
-            if (kid == "" || kid == null) {
+        if (keywordId == "" || keywordId == null) {
+            
+            sql = "select " + this.getColumnCase("keyid") 
+                + " from " + this.getTableCase("ab_keyword_entry") 
+                + " where " + this.getColumnCase("container") 
+                + " = ? and " + this.getColumnCase("title") + " = ?";
+            
+            keywordId = db.cell([sql, [[keywordContainer, SQLTYPES.VARCHAR], [keyword, SQLTYPES.VARCHAR]]], this.Config.AliasTo);
+            
+            if (keywordId == "" || keywordId == null) {
+                
                 columns = [this.getColumnCase("ab_keyword_entryid"), this.getColumnCase("keyid"), this.getColumnCase("container"),
-                this.getColumnCase("title"), this.getColumnCase("sorting"), this.getColumnCase("isactive"), this.getColumnCase("isessential")]; 
+                            this.getColumnCase("title"), this.getColumnCase("sorting"), this.getColumnCase("isactive"),
+                            this.getColumnCase("isessential")]; 
+                
                 sql = "select max(coalesce(sorting, 0))+1 from ab_keyword_entry where container = ?";
-                var sort = db.cell([sql, [[container, SQLTYPES.VARCHAR]]], this.Config.AliasTo);
+                
+                var sort = db.cell([sql, [[keywordContainer, SQLTYPES.VARCHAR]]], this.Config.AliasTo);
+                
                 if(sort == "") sort = "0";
-                kid = util.getNewUUID();
+                
+                keywordId = util.getNewUUID();
+                
                 this.insertData(this.getTableCase("ab_keyword_entry"), columns, null, 
-                    [kid, util.getNewUUID(), container, keyword, sort, "1", "0"], this.Config.AliasTo);
+                    [keywordId, util.getNewUUID(), keywordContainer, keyword, sort, "1", "0"], this.Config.AliasTo);
             }
         }
         
-        sql = "select " + this.getColumnCase("ab_keyword_attributerelationid") + " from " + this.getTableCase("ab_keyword_attributerelation") 
-        + " where " + this.getColumnCase("ab_keyword_entry_id") + " = ? and " + this.getColumnCase("ab_keyword_attribute_id") + " = ?";
-        id = db.cell([sql, [[kid, SQLTYPES.CHAR], [aid, SQLTYPES.CHAR]]], this.Config.AliasTo);
+        // Creates or updates the keyword attributerelation.
+        sql = "select " + this.getColumnCase("ab_keyword_attributerelationid") 
+            + " from " + this.getTableCase("ab_keyword_attributerelation") 
+            + " where " + this.getColumnCase("ab_keyword_entry_id") 
+            + " = ? and " + this.getColumnCase("ab_keyword_attribute_id") + " = ?";
+        
+        id = db.cell([sql, [[keywordId, SQLTYPES.CHAR], [attributeId, SQLTYPES.CHAR]]], this.Config.AliasTo);
+        
         if (id == "" || id == null) {
-            columns = [this.getColumnCase("ab_keyword_attributerelationid"), this.getColumnCase("ab_keyword_entry_id"), 
-            this.getColumnCase("ab_keyword_attribute_id"), valueColumn];
+            columns = [this.getColumnCase("ab_keyword_attributerelationid"), 
+                        this.getColumnCase("ab_keyword_entry_id"), 
+                        this.getColumnCase("ab_keyword_attribute_id"), 
+                        valueColumn];
+                    
             id = util.getNewUUID();
-            this.insertData(this.getTableCase("ab_keyword_attributerelation"), columns, null, [id, kid, aid, value], this.Config.AliasTo);
+            this.insertData(this.getTableCase("ab_keyword_attributerelation"), columns, null,
+                            [id, keywordId, attributeId, keywordAttrRelValue], this.Config.AliasTo);
+            
         } else {
             if (this.Config.ImportCommand.indexOf("update") != -1) {
                 cond = this.getColumnCase("ab_keyword_attributerelationid") + " = '" + id + "'";
-                this.updateData(this.getTableCase("ab_keyword_attributerelation"), [valueColumn], null, [value], cond, this.Config.AliasTo);
+                this.updateData(this.getTableCase("ab_keyword_attributerelation"), [valueColumn], null, [keywordAttrRelValue], cond, this.Config.AliasTo);
             }            
         }       
     }