diff --git a/ontology-engine/graph-engine_2.11/src/main/scala/org/sunbird/graph/utils/NodeUtil.scala b/ontology-engine/graph-engine_2.11/src/main/scala/org/sunbird/graph/utils/NodeUtil.scala
index adc726827312f42ed74126423bab1115f7a1b5ad..7791890f5cc67a49b394e0733abbb4fd5ccf4dfa 100644
--- a/ontology-engine/graph-engine_2.11/src/main/scala/org/sunbird/graph/utils/NodeUtil.scala
+++ b/ontology-engine/graph-engine_2.11/src/main/scala/org/sunbird/graph/utils/NodeUtil.scala
@@ -20,15 +20,17 @@ object NodeUtil {
     def serialize(node: Node, fields: util.List[String], schemaName: String): util.Map[String, AnyRef] = {
         val metadataMap = node.getMetadata
         metadataMap.put("identifier", node.getIdentifier)
-        if (CollectionUtils.isNotEmpty(fields))
-            metadataMap.keySet.retainAll(fields)
         val jsonProps = DefinitionNode.fetchJsonProps(node.getGraphId, "1.0", schemaName)
         val updatedMetadataMap:util.Map[String, AnyRef] = metadataMap.entrySet().asScala.filter(entry => null != entry.getValue).map((entry: util.Map.Entry[String, AnyRef]) => handleKeyNames(entry, fields) ->  convertJsonProperties(entry, jsonProps)).toMap.asJava
         val definitionMap = DefinitionNode.getRelationDefinitionMap(node.getGraphId, "1.0", schemaName).asJava
         val relMap:util.Map[String, util.List[util.Map[String, AnyRef]]] = getRelationMap(node, updatedMetadataMap, definitionMap)
         var finalMetadata = new util.HashMap[String, AnyRef]()
+        finalMetadata.put("objectType",node.getObjectType)
         finalMetadata.putAll(updatedMetadataMap)
         finalMetadata.putAll(relMap)
+        if (CollectionUtils.isNotEmpty(fields))
+            finalMetadata.keySet.retainAll(fields)
+        finalMetadata.put("identifier", node.getIdentifier)
         finalMetadata.put("languageCode", getLanguageCodes(node))
         finalMetadata
     }
@@ -42,6 +44,13 @@ object NodeUtil {
                 nodeMap.get(entry._1).asInstanceOf[util.List[util.Map[String, AnyRef]]].asScala.map(relMap => {
                     if("in".equalsIgnoreCase(entry._2.asInstanceOf[util.Map[String, AnyRef]].get("direction").asInstanceOf[String])) {
                         val rel:Relation = new Relation(relMap.get("identifier").asInstanceOf[String], entry._2.asInstanceOf[util.Map[String, AnyRef]].get("type").asInstanceOf[String], node.getIdentifier)
+                        rel.setStartNodeObjectType(relMap.get("objectType").asInstanceOf[String])
+                        rel.setEndNodeObjectType(node.getObjectType)
+                        rel.setStartNodeName(relMap.get("name").asInstanceOf[String])
+                        rel.setStartNodeMetadata(new util.HashMap[String, AnyRef](){{
+                            put("description", relMap.get("description"))
+                            put("status", relMap.get("status"))
+                        }})
                         if(null != relMap.get("index") && 0 < relMap.get("index").asInstanceOf[Integer]){
                             rel.setMetadata(new util.HashMap[String, AnyRef](){{
                                 put(SystemProperties.IL_SEQUENCE_INDEX.name(), relMap.get("index"))
@@ -50,6 +59,13 @@ object NodeUtil {
                         inRelations.add(rel)
                     } else {
                         val rel:Relation = new Relation(node.getIdentifier, entry._2.asInstanceOf[util.Map[String, AnyRef]].get("type").asInstanceOf[String], relMap.get("identifier").asInstanceOf[String])
+                        rel.setStartNodeObjectType(node.getObjectType)
+                        rel.setEndNodeObjectType(relMap.get("objectType").asInstanceOf[String])
+                        rel.setEndNodeName(relMap.get("name").asInstanceOf[String])
+                        rel.setEndNodeMetadata(new util.HashMap[String, AnyRef]() {{
+                            put("description", relMap.get("description"))
+                            put("status", relMap.get("status"))
+                        }})
                         if(null != relMap.get("index") && 0 < relMap.get("index").asInstanceOf[Integer]){
                             rel.setMetadata(new util.HashMap[String, AnyRef](){{
                                 put(SystemProperties.IL_SEQUENCE_INDEX.name(), relMap.get("index"))
diff --git a/ontology-engine/graph-engine_2.11/src/test/scala/org/sunbird/graph/utils/NodeUtilTest.scala b/ontology-engine/graph-engine_2.11/src/test/scala/org/sunbird/graph/utils/NodeUtilTest.scala
new file mode 100644
index 0000000000000000000000000000000000000000..2729fd9c8b9b6cc0d9eebffdf3cf3d626e518e9d
--- /dev/null
+++ b/ontology-engine/graph-engine_2.11/src/test/scala/org/sunbird/graph/utils/NodeUtilTest.scala
@@ -0,0 +1,156 @@
+package org.sunbird.graph.utils
+
+import java.util
+import org.scalatest.{FlatSpec, Matchers}
+import org.sunbird.common.JsonUtils
+import org.sunbird.graph.dac.model.Node
+
+class NodeUtilTest extends FlatSpec with Matchers {
+
+	"serialize with fields" should "return only node property which are present in fields" in {
+		val node: Node = new Node("do_1234", "DATA_NODE", "Content");
+		node.setMetadata(new util.HashMap[String, AnyRef]() {{
+			put("language", new util.ArrayList[String]() {{
+				add("English")
+			}})
+			put("contentType", "Resource")
+			put("name", "Test Resource Content")
+			put("code", "test.res.1")
+		}})
+		val fields: util.ArrayList[String] = new util.ArrayList[String]() {{
+			add("contentType")
+			add("name")
+		}}
+		val result: util.Map[String, AnyRef] = NodeUtil.serialize(node, fields, "content")
+		result.isEmpty shouldBe false
+		result.size() shouldBe 4
+		result.containsKey("identifier") shouldBe true
+		result.containsKey("contentType") shouldBe true
+		result.containsKey("name") shouldBe true
+		result.containsKey("languageCode") shouldBe true
+	}
+
+	"deserialize with valid data" should "return a node with all data" in {
+		val nodeString :String = """{
+		                           |  "ownershipType": [
+		                           |    "createdBy"
+		                           |  ],
+		                           |  "code": "test.res.1",
+		                           |  "channel": "test",
+		                           |  "language": [
+		                           |    "English"
+		                           |  ],
+		                           |  "mimeType": "application/pdf",
+		                           |  "idealScreenSize": "normal",
+		                           |  "createdOn": "2020-01-17T16:17:39.931+0530",
+		                           |  "objectType": "Content",
+		                           |  "collections": [
+		                           |    {
+		                           |      "identifier": "LP_FT-74320",
+		                           |      "name": "LP_FT-74320",
+		                           |      "description": "test desc",
+		                           |      "objectType": "Content",
+		                           |      "relation": "hasSequenceMember",
+		                           |      "status": "Live"
+		                           |    }
+		                           |  ],
+		                           |  "contentDisposition": "inline",
+		                           |  "lastUpdatedOn": "2020-01-17T16:17:39.931+0530",
+		                           |  "contentEncoding": "identity",
+		                           |  "contentType": "Resource",
+		                           |  "dialcodeRequired": "No",
+		                           |  "identifier": "do_11293728197296947212",
+		                           |  "lastStatusChangedOn": "2020-01-17T16:17:39.931+0530",
+		                           |  "audience": [
+		                           |    "Learner"
+		                           |  ],
+		                           |  "os": [
+		                           |    "All"
+		                           |  ],
+		                           |  "visibility": "Default",
+		                           |  "resources": [
+		                           |    "Speaker",
+		                           |    "Touch"
+		                           |  ],
+		                           |  "mediaType": "content",
+		                           |  "osId": "org.ekstep.quiz.app",
+		                           |  "languageCode": [
+		                           |    "en"
+		                           |  ],
+		                           |  "version": 2,
+		                           |  "versionKey": "1579258059931",
+		                           |  "license": "CC BY 4.0",
+		                           |  "idealScreenDensity": "hdpi",
+		                           |  "framework": "NCF",
+		                           |  "concepts": [
+		                           |    {
+		                           |      "identifier": "LO1",
+		                           |      "name": "Word Meaning",
+		                           |      "description": "Understanding meaning of words",
+		                           |      "objectType": "Concept",
+		                           |      "relation": "associatedTo",
+		                           |      "status": "Live"
+		                           |    }
+		                           |  ],
+		                           |  "compatibilityLevel": 1,
+		                           |  "name": "Resource Content 1",
+		                           |  "status": "Live"
+		                           |}""".stripMargin
+		val nodeMap: util.Map[String, AnyRef] = JsonUtils.deserialize(nodeString.asInstanceOf[String], classOf[java.util.Map[String, AnyRef]])
+		val relString = """{
+		                  |  "concepts": {
+		                  |    "objects": [
+		                  |      "Concept"
+		                  |    ],
+		                  |    "type": "associatedTo",
+		                  |    "direction": "out"
+		                  |  },
+		                  |  "children": {
+		                  |    "objects": [
+		                  |      "Content",
+		                  |      "ContentImage"
+		                  |    ],
+		                  |    "type": "hasSequenceMember",
+		                  |    "direction": "out"
+		                  |  },
+		                  |  "collections": {
+		                  |    "objects": [
+		                  |      "Content",
+		                  |      "ContentImage"
+		                  |    ],
+		                  |    "type": "hasSequenceMember",
+		                  |    "direction": "in"
+		                  |  },
+		                  |  "usesContent": {
+		                  |    "objects": [
+		                  |      "Content"
+		                  |    ],
+		                  |    "type": "associatedTo",
+		                  |    "direction": "out"
+		                  |  },
+		                  |  "questions": {
+		                  |    "objects": [
+		                  |      "AssessmentItem"
+		                  |    ],
+		                  |    "type": "associatedTo",
+		                  |    "direction": "out"
+		                  |  },
+		                  |  "usedByContent": {
+		                  |    "objects": [
+		                  |      "Content"
+		                  |    ],
+		                  |    "type": "associatedTo",
+		                  |    "direction": "in"
+		                  |  }
+		                  |}""".stripMargin
+		val relationMap: util.Map[String, AnyRef] = JsonUtils.deserialize(relString.asInstanceOf[String], classOf[java.util.Map[String, AnyRef]])
+		val node = NodeUtil.deserialize(nodeMap, "content", relationMap)
+		node.getIdentifier shouldBe "do_11293728197296947212"
+		node.getOutRelations.size() shouldEqual 1
+		node.getOutRelations().get(0).getRelationType shouldEqual "associatedTo"
+		node.getOutRelations.get(0).getEndNodeId shouldEqual "LO1"
+		node.getInRelations.size() shouldEqual 1
+		node.getInRelations().get(0).getRelationType shouldEqual "hasSequenceMember"
+		node.getInRelations.get(0).getStartNodeId shouldEqual "LP_FT-74320"
+	}
+}