diff --git a/dashboardv2/public/js/templates/audit/CreateAuditTableLayoutView_tmpl.html b/dashboardv2/public/js/templates/audit/CreateAuditTableLayoutView_tmpl.html
index 52a0919..fc8e6cc 100644
--- a/dashboardv2/public/js/templates/audit/CreateAuditTableLayoutView_tmpl.html
+++ b/dashboardv2/public/js/templates/audit/CreateAuditTableLayoutView_tmpl.html
@@ -14,6 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
 -->
+<h4>Name: <span data-id="tagHeader"></span></h4>
 <table class="table table-bordered table-striped" data-id="tableAudit">
     <thead>
         <tr data-id="auditHeaderValue">
diff --git a/dashboardv2/public/js/utils/CommonViewFunction.js b/dashboardv2/public/js/utils/CommonViewFunction.js
index e49d2b7..de46667 100644
--- a/dashboardv2/public/js/utils/CommonViewFunction.js
+++ b/dashboardv2/public/js/utils/CommonViewFunction.js
@@ -88,7 +88,12 @@
             }
         });
     }
-    CommonViewFunction.propertyTable = function(scope, valueObject, entityDef) {
+    CommonViewFunction.propertyTable = function(options) {
+        var scope = options.scope,
+            valueObject = options.valueObject,
+            extractJSON = options.extractJSON,
+            entityDef = options.entityDef;
+
         var table = "",
             fetchInputOutputValue = function(id) {
                 var that = this;
@@ -117,92 +122,110 @@
                     },
                     complete: function() {}
                 });
-            }
-        _.sortBy(_.keys(valueObject)).map(function(key) {
-            key = _.escape(key)
-            var keyValue = valueObject[key],
-                valueOfArray = [];
-            var defEntity = _.find(entityDef, { name: key });
-            if (defEntity) {
-                var defEntityType = defEntity.typeName.toLocaleLowerCase();
-                if (defEntityType === 'date' || defEntityType === 'time') {
-                    table += '<tr><td>' + _.escape(key) + '</td><td>' + new Date(keyValue) + '</td></tr>';
-                } else if (_.isObject(keyValue)) {
-                    if (!_.isArray(keyValue) && _.isObject(keyValue)) {
-                        keyValue = [keyValue];
+            },
+            extractObject = function(keyValue) {
+                var valueOfArray = [];
+                if (!_.isArray(keyValue) && _.isObject(keyValue)) {
+                    keyValue = [keyValue];
+                }
+                var subLink = "";
+                for (var i = 0; i < keyValue.length; i++) {
+                    var inputOutputField = keyValue[i],
+                        id = inputOutputField.guid || (_.isObject(inputOutputField.id) ? inputOutputField.id.id : inputOutputField.id),
+                        tempLink = "",
+                        status = inputOutputField.status || (_.isObject(inputOutputField.id) ? inputOutputField.id.state : inputOutputField.state),
+                        readOnly = Enums.entityStateReadOnly[status];
+                    if (!inputOutputField.attributes && inputOutputField.values) {
+                        inputOutputField['attributes'] = inputOutputField.values;
                     }
-                    var subLink = "";
-                    for (var i = 0; i < keyValue.length; i++) {
-                        var inputOutputField = keyValue[i],
-                            id = inputOutputField.guid || (_.isObject(inputOutputField.id) ? inputOutputField.id.id : inputOutputField.id),
-                            tempLink = "",
-                            status = inputOutputField.status || (_.isObject(inputOutputField.id) ? inputOutputField.id.state : inputOutputField.state),
-                            readOnly = Enums.entityStateReadOnly[status];
-                        if (!inputOutputField.attributes && inputOutputField.values) {
-                            inputOutputField['attributes'] = inputOutputField.values;
+                    if (_.isString(inputOutputField) || _.isBoolean(inputOutputField) || _.isNumber(inputOutputField)) {
+                        var tempVarfor$check = inputOutputField.toString();
+                        if (tempVarfor$check.indexOf("$") == -1) {
+                            valueOfArray.push('<span>' + _.escape(inputOutputField) + '</span>');
                         }
-                        if (_.isString(inputOutputField) || _.isBoolean(inputOutputField) || _.isNumber(inputOutputField)) {
-                            var tempVarfor$check = inputOutputField.toString();
+                    } else if (_.isObject(inputOutputField) && !id) {
+                        var attributesList = inputOutputField;
+                        if (scope.typeHeaders && inputOutputField.typeName) {
+                            var typeNameCategory = scope.typeHeaders.fullCollection.findWhere({ name: inputOutputField.typeName });
+                            if (attributesList.attributes && typeNameCategory && typeNameCategory.get('category') === 'STRUCT') {
+                                attributesList = attributesList.attributes;
+                            }
+                        }
+                        _.each(attributesList, function(objValue, objKey) {
+                            var value = objValue,
+                                tempVarfor$check = objKey.toString();
                             if (tempVarfor$check.indexOf("$") == -1) {
-                                valueOfArray.push('<span>' + _.escape(inputOutputField) + '</span>');
-                            }
-                        } else if (_.isObject(inputOutputField) && !id) {
-                            var attributesList = inputOutputField;
-                            if (scope.typeHeaders && inputOutputField.typeName) {
-                                var typeNameCategory = scope.typeHeaders.fullCollection.findWhere({ name: inputOutputField.typeName });
-                                if (attributesList.attributes && typeNameCategory && typeNameCategory.get('category') === 'STRUCT') {
-                                    attributesList = attributesList.attributes;
+                                if (_.isObject(value)) {
+                                    value = JSON.stringify(value);
                                 }
-                            }
-                            _.each(attributesList, function(objValue, objKey) {
-                                var value = objValue,
-                                    tempVarfor$check = objKey.toString();
-                                if (tempVarfor$check.indexOf("$") == -1) {
-                                    if (_.isObject(value)) {
-                                        value = JSON.stringify(value);
+                                if (extractJSON) {
+                                    if (extractJSON && extractJSON.extractKey) {
+                                        if (_.isObject(extractJSON.extractKey)) {
+                                            _.each(extractJSON.extractKey, function(extractKey) {
+                                                if (objKey === extractKey) {
+                                                    valueOfArray.push('<span>' + _.escape(objKey) + ':' + _.escape(value) + '</span>');
+                                                }
+                                            });
+                                        } else if (_.isString(extractJSON.extractKey) && extractJSON.extractKey === objKey) {
+                                            valueOfArray.push(_.escape(value));
+                                        }
                                     }
+                                } else {
                                     valueOfArray.push('<span>' + _.escape(objKey) + ':' + _.escape(value) + '</span>');
                                 }
-                            });
-                        }
-
-                        if (id && inputOutputField) {
-                            var name = Utils.getName(inputOutputField);
-                            if (name === "-" || name === id) {
-                                var fetch = true;
-                                var fetchId = (_.isObject(id) ? id.id : id);
-                                fetchInputOutputValue(fetchId);
-                                tempLink += '<div data-id="' + fetchId + '"></div>';
-                            } else {
-                                tempLink += '<a href="#!/detailPage/' + id + '">' + name + '</a>'
                             }
-                        }
-                        if (readOnly) {
-                            if (!fetch) {
-                                tempLink += '<button title="Deleted" class="btn btn-atlasAction btn-atlas deleteBtn"><i class="fa fa-trash"></i></button>';
-                                subLink += '<div class="block readOnlyLink">' + tempLink + '</div>';
-                            } else {
-                                fetch = false;
-                                subLink += tempLink;
-                            }
-
+                        });
+                    }
+                    if (id && inputOutputField) {
+                        var name = Utils.getName(inputOutputField);
+                        if (name === "-" || name === id) {
+                            var fetch = true;
+                            var fetchId = (_.isObject(id) ? id.id : id);
+                            fetchInputOutputValue(fetchId);
+                            tempLink += '<div data-id="' + fetchId + '"></div>';
                         } else {
-                            if (tempLink.search('href') != -1) {
-                                subLink += '<div>' + tempLink + '</div>'
-                            } else if (tempLink.length) {
-                                subLink += tempLink
-                            }
+                            tempLink += '<a href="#!/detailPage/' + id + '">' + name + '</a>'
                         }
                     }
-                    if (valueOfArray.length) {
-                        subLink = valueOfArray.join(', ');
-                    }
-                    table += '<tr><td>' + _.escape(key) + '</td><td>' + subLink + '</td></tr>';
+                    if (readOnly) {
+                        if (!fetch) {
+                            tempLink += '<button title="Deleted" class="btn btn-atlasAction btn-atlas deleteBtn"><i class="fa fa-trash"></i></button>';
+                            subLink += '<div class="block readOnlyLink">' + tempLink + '</div>';
+                        } else {
+                            fetch = false;
+                            subLink += tempLink;
+                        }
 
-                } else {
-                    table += '<tr><td>' + _.escape(key) + '</td><td>' + _.escape(valueObject[key]) + '</td></tr>';
+                    } else {
+                        if (tempLink.search('href') != -1) {
+                            subLink += '<div>' + tempLink + '</div>'
+                        } else if (tempLink.length) {
+                            subLink += tempLink
+                        }
+                    }
+                }
+                if (valueOfArray.length) {
+                    subLink = valueOfArray.join(', ');
+                }
+                return subLink;
+            }
+        _.sortBy(_.keys(valueObject)).map(function(key) {
+            key = _.escape(key);
+            var keyValue = valueObject[key];
+            var defEntity = _.find(entityDef, { name: key });
+            if (defEntity && defEntity.typeName) {
+                var defEntityType = defEntity.typeName.toLocaleLowerCase();
+                if (defEntityType === 'date' || defEntityType === 'time') {
+                    keyValue = new Date(keyValue);
+                } else if (_.isObject(keyValue)) {
+                    keyValue = extractObject(keyValue);
+                }
+            } else {
+                if (_.isObject(keyValue)) {
+                    keyValue = extractObject(keyValue)
                 }
             }
+            table += '<tr><td>' + _.escape(key) + '</td><td>' + (_.isObject(valueObject[key]) ? keyValue : _.escape(keyValue)) + '</td></tr>';
         });
         return table;
     }
diff --git a/dashboardv2/public/js/utils/Utils.js b/dashboardv2/public/js/utils/Utils.js
index e09220c..1d614a8 100644
--- a/dashboardv2/public/js/utils/Utils.js
+++ b/dashboardv2/public/js/utils/Utils.js
@@ -401,7 +401,13 @@
                     return returnObj;
                 }
                 if (collectionJSON.attributes.id) {
-                    returnObj.name = _.escape(collectionJSON.attributes.id);
+                    if (_.isObject(collectionJSON.attributes.id)) {
+                        if (collectionJSON.id.id) {
+                            returnObj.name = _.escape(collectionJSON.attributes.id.id);
+                        }
+                    } else {
+                        returnObj.name = _.escape(collectionJSON.attributes.id);
+                    }
                     returnObj.key = 'id';
                     return returnObj;
                 }
@@ -427,7 +433,13 @@
                 return returnObj;
             }
             if (collectionJSON.id) {
-                returnObj.name = _.escape(collectionJSON.id);
+                if (_.isObject(collectionJSON.id)) {
+                    if (collectionJSON.id.id) {
+                        returnObj.name = _.escape(collectionJSON.id.id);
+                    }
+                } else {
+                    returnObj.name = _.escape(collectionJSON.id);
+                }
                 returnObj.key = 'id';
                 return returnObj;
             }
diff --git a/dashboardv2/public/js/views/audit/CreateAuditTableLayoutView.js b/dashboardv2/public/js/views/audit/CreateAuditTableLayoutView.js
index 3f6be02..34c56cb 100644
--- a/dashboardv2/public/js/views/audit/CreateAuditTableLayoutView.js
+++ b/dashboardv2/public/js/views/audit/CreateAuditTableLayoutView.js
@@ -41,7 +41,8 @@
                 auditCreate: "[data-id='auditCreate']",
                 noData: "[data-id='noData']",
                 tableAudit: "[data-id='tableAudit']",
-                auditHeaderValue: "[data-id='auditHeaderValue']"
+                auditHeaderValue: "[data-id='auditHeaderValue']",
+                tagHeader: "[data-id='tagHeader']"
             },
             /** ui events hash */
             events: function() {
@@ -79,13 +80,11 @@
                         }
                     }
                     var values = parseDetailsObject.values;
-                    if (this.action && (Enums.auditAction.ENTITY_CREATE !== this.action && Enums.auditAction.ENTITY_UPDATE !== this.action) && name) {
-                        this.ui.auditHeaderValue.html('<th>' + this.action + '</th>');
-                        this.ui.auditValue.html("<tr><td>" + (name ? name : this.entityName) + "</td></tr>");
-                    } else if (parseDetailsObject && parseDetailsObject.values) {
+                    if (parseDetailsObject && parseDetailsObject.values) {
+                        var tagHeader = ((name ? name : this.entityName));
+                        this.ui.tagHeader.append(tagHeader);
                         this.ui.auditHeaderValue.html('<th>Key</th><th>New Value</th>');
-                        //CommonViewFunction.findAndmergeRefEntity(attributeObject, that.referredEntities);
-                        table = CommonViewFunction.propertyTable(this, values, this.entityDef);
+                        table = CommonViewFunction.propertyTable({ scope: this, valueObject: values, entityDef: this.entityDef, extractJSON: { extractKey: 'value' } });
                         if (table.length) {
                             this.ui.noData.hide();
                             this.ui.tableAudit.show();
@@ -94,9 +93,7 @@
                             this.ui.noData.show();
                             this.ui.tableAudit.hide();
                         }
-                    }
-                } else {
-                    if (Enums.auditAction.ENTITY_DELETE === this.action) {
+                    } else {
                         this.ui.auditHeaderValue.html('<th>' + this.action + '</th>');
                         this.ui.auditValue.html("<tr><td>" + (name ? name : this.entityName) + "</td></tr>");
                     }
diff --git a/dashboardv2/public/js/views/entity/EntityDetailTableLayoutView.js b/dashboardv2/public/js/views/entity/EntityDetailTableLayoutView.js
index 480305e..79f7807 100644
--- a/dashboardv2/public/js/views/entity/EntityDetailTableLayoutView.js
+++ b/dashboardv2/public/js/views/entity/EntityDetailTableLayoutView.js
@@ -65,7 +65,7 @@
                     });
                     attributeObject.columns = valueSorted;
                 }
-                var table = CommonViewFunction.propertyTable(this, attributeObject, this.entityDef);
+                var table = CommonViewFunction.propertyTable({ scope: this, valueObject: attributeObject, entityDef: this.entityDef });
                 that.ui.detailValue.append(table);
             }
         });
