You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@atlas.apache.org by sa...@apache.org on 2019/03/13 08:44:47 UTC

[atlas] branch master updated: ATLAS-3070: Create patch framework to persist typedef patches applied to atlas

This is an automated email from the ASF dual-hosted git repository.

sarath pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/atlas.git


The following commit(s) were added to refs/heads/master by this push:
     new 4925ec3  ATLAS-3070: Create patch framework to persist typedef patches applied to atlas
4925ec3 is described below

commit 4925ec35933b8be6a75e758654629f55bb12ee60
Author: Sarath Subramanian <ss...@hortonworks.com>
AuthorDate: Wed Mar 13 01:43:59 2019 -0700

    ATLAS-3070: Create patch framework to persist typedef patches applied to atlas
---
 .../001-base_model_replication_attributes.json     |   2 +
 .../patches/002-base_model_add_service_type.json   |  66 +++++-
 .../patches/001-hive_column_add_position.json      |   2 +
 .../patches/002-hive_column_table_add_options.json |   4 +
 ...hive_column_update_table_remove_constraint.json |   2 +
 ...04-hbase_table_column_family_add_attribute.json |   4 +
 ...ble_column_family_add_additional_attribute.json |   4 +
 .../patches/006-kafka_topic_add_attribute.json     |   2 +
 .../patches/007-hadoop_model_add_service_type.json | 110 +++++++++-
 .../patches/008-remove-hive-legacy-attributes.json |  10 +
 .../001-rdbms_column_table_add_options.json        |   4 +
 .../patches/002-rdbms_model_add_service_type.json  |  32 ++-
 .../003-remove-rdbms-legacy-attributes.json        |  18 ++
 .../patches/001-cloud_model_add_service_type.json  |  22 ++
 .../org/apache/atlas/repository/Constants.java     |   9 +
 .../org/apache/atlas/model/patches/AtlasPatch.java | 225 +++++++++++++++++++++
 .../java/org/apache/atlas/type/AtlasTypeUtil.java  |   2 +
 .../repository/graph/GraphBackedSearchIndexer.java |   6 +
 .../bootstrap/AtlasTypeDefStoreInitializer.java    | 224 ++++++++++++++++----
 .../store/graph/v2/AtlasGraphUtilsV2.java          |  98 ++++++++-
 .../store/graph/v2/AtlasTypeDefGraphStoreV2.java   |   2 +-
 .../apache/atlas/web/resources/AdminResource.java  |  20 +-
 22 files changed, 819 insertions(+), 49 deletions(-)

diff --git a/addons/models/0000-Area0/patches/001-base_model_replication_attributes.json b/addons/models/0000-Area0/patches/001-base_model_replication_attributes.json
index 92c561f..1bedea7 100644
--- a/addons/models/0000-Area0/patches/001-base_model_replication_attributes.json
+++ b/addons/models/0000-Area0/patches/001-base_model_replication_attributes.json
@@ -1,6 +1,8 @@
 {
   "patches": [
     {
+      "id": "TYPEDEF_PATCH_0000_001",
+      "description": "Add 'replicatedFrom' and 'replicatedTo' attributes to Referenceable",
       "action": "ADD_ATTRIBUTE",
       "typeName": "Referenceable",
       "applyToVersion": "1.0",
diff --git a/addons/models/0000-Area0/patches/002-base_model_add_service_type.json b/addons/models/0000-Area0/patches/002-base_model_add_service_type.json
index 6d4e80d..13e55fa 100644
--- a/addons/models/0000-Area0/patches/002-base_model_add_service_type.json
+++ b/addons/models/0000-Area0/patches/002-base_model_add_service_type.json
@@ -1,13 +1,17 @@
 {
   "patches": [
     {
+      "id":              "TYPEDEF_PATCH_0000_002",
+      "description":     "Set serviceType 'atlas_core' to Referenceable",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "Referenceable",
-      "applyToVersion":  "1.0",
-      "updateToVersion": "1.1",
+      "applyToVersion":  "1.1",
+      "updateToVersion": "1.2",
 	  "serviceType":     "atlas_core"
     },
     {
+      "id":              "TYPEDEF_PATCH_0000_003",
+      "description":     "Set serviceType 'atlas_core' to __internal",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "__internal",
       "applyToVersion":  "1.0",
@@ -15,6 +19,8 @@
 	  "serviceType":     "atlas_core"
     },
     {
+      "id":              "TYPEDEF_PATCH_0000_004",
+      "description":     "Set serviceType 'atlas_core' to Asset",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "Asset",
       "applyToVersion":  "1.1",
@@ -22,6 +28,8 @@
 	  "serviceType":     "atlas_core"
     },
     {
+      "id":              "TYPEDEF_PATCH_0000_005",
+      "description":     "Set serviceType 'atlas_core' to DataSet",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "DataSet",
       "applyToVersion":  "1.1",
@@ -29,6 +37,8 @@
 	  "serviceType":     "atlas_core"
     },
     {
+      "id":              "TYPEDEF_PATCH_0000_006",
+      "description":     "Set serviceType 'atlas_core' to Infrastructure",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "Infrastructure",
       "applyToVersion":  "1.1",
@@ -36,6 +46,8 @@
 	  "serviceType":     "atlas_core"
     },
     {
+      "id":              "TYPEDEF_PATCH_0000_007",
+      "description":     "Set serviceType 'atlas_core' to Process",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "Process",
       "applyToVersion":  "1.1",
@@ -43,6 +55,8 @@
 	  "serviceType":     "atlas_core"
     },
     {
+      "id":              "TYPEDEF_PATCH_0000_008",
+      "description":     "Set serviceType 'atlas_core' to AtlasServer",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "AtlasServer",
       "applyToVersion":  "1.0",
@@ -50,6 +64,8 @@
 	  "serviceType":     "atlas_core"
     },
     {
+      "id":              "TYPEDEF_PATCH_0000_009",
+      "description":     "Set serviceType 'atlas_core' to __AtlasUserProfile",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "__AtlasUserProfile",
       "applyToVersion":  "1.0",
@@ -57,6 +73,8 @@
 	  "serviceType":     "atlas_core"
     },
     {
+      "id":              "TYPEDEF_PATCH_0000_010",
+      "description":     "Set serviceType 'atlas_core' to __AtlasUserSavedSearch",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "__AtlasUserSavedSearch",
       "applyToVersion":  "1.0",
@@ -64,6 +82,8 @@
 	  "serviceType":     "atlas_core"
     },
     {
+      "id":              "TYPEDEF_PATCH_0000_011",
+      "description":     "Set serviceType 'atlas_core' to __ExportImportAuditEntry",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "__ExportImportAuditEntry",
       "applyToVersion":  "1.0",
@@ -71,6 +91,8 @@
 	  "serviceType":     "atlas_core"
     },
     {
+      "id":              "TYPEDEF_PATCH_0000_012",
+      "description":     "Set serviceType 'atlas_core' to dataset_process_inputs",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "dataset_process_inputs",
       "applyToVersion":  "1.0",
@@ -78,6 +100,8 @@
 	  "serviceType":     "atlas_core"
     },
     {
+      "id":              "TYPEDEF_PATCH_0000_013",
+      "description":     "Set serviceType 'atlas_core' to process_dataset_outputs",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "process_dataset_outputs",
       "applyToVersion":  "1.0",
@@ -85,6 +109,8 @@
 	  "serviceType":     "atlas_core"
     },
     {
+      "id":              "TYPEDEF_PATCH_0000_014",
+      "description":     "Set serviceType 'atlas_core' to __AtlasUserProfile_savedsearches",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "__AtlasUserProfile_savedsearches",
       "applyToVersion":  "1.0",
@@ -92,6 +118,8 @@
 	  "serviceType":     "atlas_core"
     },
     {
+      "id":              "TYPEDEF_PATCH_0000_015",
+      "description":     "Set serviceType 'atlas_core' to AtlasGlossaryTermRelationshipStatus",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "AtlasGlossaryTermRelationshipStatus",
       "applyToVersion":  "1.0",
@@ -99,6 +127,8 @@
       "serviceType":     "atlas_core"
     },
     {
+      "id":              "TYPEDEF_PATCH_0000_016",
+      "description":     "Set serviceType 'atlas_core' to AtlasGlossaryTermAssignmentStatus",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "AtlasGlossaryTermAssignmentStatus",
       "applyToVersion":  "1.0",
@@ -106,6 +136,8 @@
       "serviceType":     "atlas_core"
     },
     {
+      "id":              "TYPEDEF_PATCH_0000_017",
+      "description":     "Set serviceType 'atlas_core' to AtlasGlossary",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "AtlasGlossary",
       "applyToVersion":  "1.0",
@@ -113,6 +145,8 @@
       "serviceType":     "atlas_core"
     },
     {
+      "id":              "TYPEDEF_PATCH_0000_018",
+      "description":     "Set serviceType 'atlas_core' to AtlasGlossaryTerm",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "AtlasGlossaryTerm",
       "applyToVersion":  "1.0",
@@ -120,6 +154,8 @@
       "serviceType":     "atlas_core"
     },
     {
+      "id":              "TYPEDEF_PATCH_0000_019",
+      "description":     "Set serviceType 'atlas_core' to AtlasGlossaryCategory",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "AtlasGlossaryCategory",
       "applyToVersion":  "1.0",
@@ -127,6 +163,8 @@
       "serviceType":     "atlas_core"
     },
     {
+      "id":              "TYPEDEF_PATCH_0000_020",
+      "description":     "Set serviceType 'atlas_core' to AtlasGlossarySemanticAssignment",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "AtlasGlossarySemanticAssignment",
       "applyToVersion":  "1.0",
@@ -134,6 +172,8 @@
       "serviceType":     "atlas_core"
     },
     {
+      "id":              "TYPEDEF_PATCH_0000_021",
+      "description":     "Set serviceType 'atlas_core' to AtlasGlossaryTermAnchor",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "AtlasGlossaryTermAnchor",
       "applyToVersion":  "1.0",
@@ -141,6 +181,8 @@
       "serviceType":     "atlas_core"
     },
     {
+      "id":              "TYPEDEF_PATCH_0000_022",
+      "description":     "Set serviceType 'atlas_core' to AtlasGlossaryTermCategorization",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "AtlasGlossaryTermCategorization",
       "applyToVersion":  "1.0",
@@ -148,6 +190,8 @@
       "serviceType":     "atlas_core"
     },
     {
+      "id":              "TYPEDEF_PATCH_0000_023",
+      "description":     "Set serviceType 'atlas_core' to AtlasGlossaryCategoryAnchor",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "AtlasGlossaryCategoryAnchor",
       "applyToVersion":  "1.0",
@@ -155,6 +199,8 @@
       "serviceType":     "atlas_core"
     },
     {
+      "id":              "TYPEDEF_PATCH_0000_024",
+      "description":     "Set serviceType 'atlas_core' to AtlasGlossaryCategoryHierarchyLink",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "AtlasGlossaryCategoryHierarchyLink",
       "applyToVersion":  "1.0",
@@ -162,6 +208,8 @@
       "serviceType":     "atlas_core"
     },
     {
+      "id":              "TYPEDEF_PATCH_0000_025",
+      "description":     "Set serviceType 'atlas_core' to AtlasGlossaryRelatedTerm",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "AtlasGlossaryRelatedTerm",
       "applyToVersion":  "1.0",
@@ -169,6 +217,8 @@
       "serviceType":     "atlas_core"
     },
     {
+      "id":              "TYPEDEF_PATCH_0000_026",
+      "description":     "Set serviceType 'atlas_core' to AtlasGlossarySynonym",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "AtlasGlossarySynonym",
       "applyToVersion":  "1.0",
@@ -176,6 +226,8 @@
       "serviceType":     "atlas_core"
     },
     {
+      "id":              "TYPEDEF_PATCH_0000_027",
+      "description":     "Set serviceType 'atlas_core' to AtlasGlossaryAntonym",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "AtlasGlossaryAntonym",
       "applyToVersion":  "1.0",
@@ -183,6 +235,8 @@
       "serviceType":     "atlas_core"
     },
     {
+      "id":              "TYPEDEF_PATCH_0000_028",
+      "description":     "Set serviceType 'atlas_core' to AtlasGlossaryPreferredTerm",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "AtlasGlossaryPreferredTerm",
       "applyToVersion":  "1.0",
@@ -190,6 +244,8 @@
       "serviceType":     "atlas_core"
     },
     {
+      "id":              "TYPEDEF_PATCH_0000_029",
+      "description":     "Set serviceType 'atlas_core' to AtlasGlossaryReplacementTerm",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "AtlasGlossaryReplacementTerm",
       "applyToVersion":  "1.0",
@@ -197,6 +253,8 @@
       "serviceType":     "atlas_core"
     },
     {
+      "id":              "TYPEDEF_PATCH_0000_030",
+      "description":     "Set serviceType 'atlas_core' to AtlasGlossaryTranslation",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "AtlasGlossaryTranslation",
       "applyToVersion":  "1.0",
@@ -204,6 +262,8 @@
       "serviceType":     "atlas_core"
     },
     {
+      "id":              "TYPEDEF_PATCH_0000_031",
+      "description":     "Set serviceType 'atlas_core' to AtlasGlossaryIsARelationship",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "AtlasGlossaryIsARelationship",
       "applyToVersion":  "1.0",
@@ -211,6 +271,8 @@
       "serviceType":     "atlas_core"
     },
     {
+      "id":              "TYPEDEF_PATCH_0000_032",
+      "description":     "Set serviceType 'atlas_core' to AtlasGlossaryValidValue",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "AtlasGlossaryValidValue",
       "applyToVersion":  "1.0",
diff --git a/addons/models/1000-Hadoop/patches/001-hive_column_add_position.json b/addons/models/1000-Hadoop/patches/001-hive_column_add_position.json
index eeab74a..703a4c3 100644
--- a/addons/models/1000-Hadoop/patches/001-hive_column_add_position.json
+++ b/addons/models/1000-Hadoop/patches/001-hive_column_add_position.json
@@ -1,6 +1,8 @@
 {
   "patches": [
     {
+      "id": "TYPEDEF_PATCH_1000_033",
+      "description": "Add 'position' attribute to hive_column",
       "action": "ADD_ATTRIBUTE",
       "typeName": "hive_column",
       "applyToVersion": "1.0",
diff --git a/addons/models/1000-Hadoop/patches/002-hive_column_table_add_options.json b/addons/models/1000-Hadoop/patches/002-hive_column_table_add_options.json
index 5f00bd2..697cecd 100644
--- a/addons/models/1000-Hadoop/patches/002-hive_column_table_add_options.json
+++ b/addons/models/1000-Hadoop/patches/002-hive_column_table_add_options.json
@@ -1,6 +1,8 @@
 {
   "patches": [
     {
+      "id": "TYPEDEF_PATCH_1000_034",
+      "description": "Add 'schemaAttributes' typeDefOptions to hive_column",
       "action": "UPDATE_TYPEDEF_OPTIONS",
       "typeName": "hive_column",
       "applyToVersion": "1.1",
@@ -10,6 +12,8 @@
       }
     },
     {
+      "id": "TYPEDEF_PATCH_1000_035",
+      "description": "Add 'schemaElementsAttribute' typeDefOptions to hive_table",
       "action": "UPDATE_TYPEDEF_OPTIONS",
       "typeName": "hive_table",
       "applyToVersion": "1.0",
diff --git a/addons/models/1000-Hadoop/patches/003-hive_column_update_table_remove_constraint.json b/addons/models/1000-Hadoop/patches/003-hive_column_update_table_remove_constraint.json
index db80722..4bfb4be 100644
--- a/addons/models/1000-Hadoop/patches/003-hive_column_update_table_remove_constraint.json
+++ b/addons/models/1000-Hadoop/patches/003-hive_column_update_table_remove_constraint.json
@@ -1,6 +1,8 @@
 {
   "patches": [
     {
+      "id": "TYPEDEF_PATCH_1000_036",
+      "description": "Update 'table' attribute in hive_column",
       "action": "UPDATE_ATTRIBUTE",
       "typeName": "hive_column",
       "applyToVersion": "1.2",
diff --git a/addons/models/1000-Hadoop/patches/004-hbase_table_column_family_add_attribute.json b/addons/models/1000-Hadoop/patches/004-hbase_table_column_family_add_attribute.json
index 80291f3..15a3ac9 100644
--- a/addons/models/1000-Hadoop/patches/004-hbase_table_column_family_add_attribute.json
+++ b/addons/models/1000-Hadoop/patches/004-hbase_table_column_family_add_attribute.json
@@ -1,6 +1,8 @@
 {
   "patches": [
     {
+      "id": "TYPEDEF_PATCH_1000_037",
+      "description": "Add 'parameters', 'createTime' and 'modifiedTime' attributes to hbase_table",
       "action": "ADD_ATTRIBUTE",
       "typeName": "hbase_table",
       "applyToVersion": "1.1",
@@ -34,6 +36,8 @@
       ]
     },
     {
+      "id": "TYPEDEF_PATCH_1000_038",
+      "description": "Add 'createTime' and 'modifiedTime' attributes to hbase_column_family",
       "action": "ADD_ATTRIBUTE",
       "typeName": "hbase_column_family",
       "applyToVersion": "1.0",
diff --git a/addons/models/1000-Hadoop/patches/005-hbase_table_column_family_add_additional_attribute.json b/addons/models/1000-Hadoop/patches/005-hbase_table_column_family_add_additional_attribute.json
index 14b1fbe..4daeeae 100644
--- a/addons/models/1000-Hadoop/patches/005-hbase_table_column_family_add_additional_attribute.json
+++ b/addons/models/1000-Hadoop/patches/005-hbase_table_column_family_add_additional_attribute.json
@@ -1,6 +1,8 @@
 {
   "patches": [
     {
+      "id": "TYPEDEF_PATCH_1000_039",
+      "description": "Add attributes to hbase_table",
       "action": "ADD_ATTRIBUTE",
       "typeName": "hbase_table",
       "applyToVersion": "1.2",
@@ -59,6 +61,8 @@
       ]
     },
     {
+      "id": "TYPEDEF_PATCH_1000_040",
+      "description": "Add attributes to hbase_column_family",
       "action": "ADD_ATTRIBUTE",
       "typeName": "hbase_column_family",
       "applyToVersion": "1.1",
diff --git a/addons/models/1000-Hadoop/patches/006-kafka_topic_add_attribute.json b/addons/models/1000-Hadoop/patches/006-kafka_topic_add_attribute.json
index 6e1c9bc..c3711b1 100644
--- a/addons/models/1000-Hadoop/patches/006-kafka_topic_add_attribute.json
+++ b/addons/models/1000-Hadoop/patches/006-kafka_topic_add_attribute.json
@@ -1,6 +1,8 @@
 {
   "patches": [
     {
+      "id": "TYPEDEF_PATCH_1000_041",
+      "description": "Add 'partitionCount' attribute to kafka_topic",
       "action": "ADD_ATTRIBUTE",
       "typeName": "kafka_topic",
       "applyToVersion": "1.0",
diff --git a/addons/models/1000-Hadoop/patches/007-hadoop_model_add_service_type.json b/addons/models/1000-Hadoop/patches/007-hadoop_model_add_service_type.json
index 627bbae..4ef257f 100644
--- a/addons/models/1000-Hadoop/patches/007-hadoop_model_add_service_type.json
+++ b/addons/models/1000-Hadoop/patches/007-hadoop_model_add_service_type.json
@@ -1,6 +1,8 @@
 {
   "patches": [
     {
+      "id":              "TYPEDEF_PATCH_1000_042",
+      "description":     "Set serviceType 'file_system' to file_action",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "file_action",
       "applyToVersion":  "1.0",
@@ -8,6 +10,8 @@
       "serviceType":     "file_system"
     },
     {
+      "id":              "TYPEDEF_PATCH_1000_043",
+      "description":     "Set serviceType 'file_system' to fs_permissions",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "fs_permissions",
       "applyToVersion":  "1.0",
@@ -15,6 +19,8 @@
       "serviceType":     "file_system"
     },
     {
+      "id":              "TYPEDEF_PATCH_1000_044",
+      "description":     "Set serviceType 'file_system' to fs_path",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "fs_path",
       "applyToVersion":  "1.0",
@@ -22,6 +28,8 @@
       "serviceType":     "file_system"
     },
     {
+      "id":              "TYPEDEF_PATCH_1000_045",
+      "description":     "Set serviceType 'file_system' to hdfs_path",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "hdfs_path",
       "applyToVersion":  "1.1",
@@ -29,6 +37,8 @@
       "serviceType":     "file_system"
     },
     {
+      "id":              "TYPEDEF_PATCH_1000_046",
+      "description":     "Set serviceType 'hive' to hive_principal_type",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "hive_principal_type",
       "applyToVersion":  "1.0",
@@ -36,6 +46,8 @@
       "serviceType":     "hive"
     },
     {
+      "id":              "TYPEDEF_PATCH_1000_047",
+      "description":     "Set serviceType 'hive' to hive_order",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "hive_order",
       "applyToVersion":  "1.0",
@@ -43,6 +55,8 @@
       "serviceType":     "hive"
     },
     {
+      "id":              "TYPEDEF_PATCH_1000_048",
+      "description":     "Set serviceType 'hive' to hive_serde",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "hive_serde",
       "applyToVersion":  "1.0",
@@ -50,6 +64,8 @@
       "serviceType":     "hive"
     },
     {
+      "id":              "TYPEDEF_PATCH_1000_049",
+      "description":     "Set serviceType 'hive' to hive_process",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "hive_process",
       "applyToVersion":  "1.0",
@@ -57,6 +73,8 @@
       "serviceType":     "hive"
     },
     {
+      "id":              "TYPEDEF_PATCH_1000_050",
+      "description":     "Set serviceType 'hive' to hive_table",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "hive_table",
       "applyToVersion":  "1.1",
@@ -64,6 +82,8 @@
       "serviceType":     "hive"
     },
     {
+      "id":              "TYPEDEF_PATCH_1000_051",
+      "description":     "Set serviceType 'hive' to hive_storagedesc",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "hive_storagedesc",
       "applyToVersion":  "1.0",
@@ -71,6 +91,8 @@
       "serviceType":     "hive"
     },
     {
+      "id":              "TYPEDEF_PATCH_1000_052",
+      "description":     "Set serviceType 'hive' to hive_db",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "hive_db",
       "applyToVersion":  "1.1",
@@ -78,6 +100,8 @@
       "serviceType":     "hive"
     },
     {
+      "id":              "TYPEDEF_PATCH_1000_053",
+      "description":     "Set serviceType 'hive' to hive_column",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "hive_column",
       "applyToVersion":  "1.3",
@@ -85,6 +109,8 @@
       "serviceType":     "hive"
     },
     {
+      "id":              "TYPEDEF_PATCH_1000_054",
+      "description":     "Set serviceType 'hive' to hive_column_lineage",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "hive_column_lineage",
       "applyToVersion":  "1.0",
@@ -92,6 +118,8 @@
       "serviceType":     "hive"
     },
     {
+      "id":              "TYPEDEF_PATCH_1000_055",
+      "description":     "Set serviceType 'hive' to hive_table_db",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "hive_table_db",
       "applyToVersion":  "1.0",
@@ -99,6 +127,8 @@
       "serviceType":     "hive"
     },
     {
+      "id":              "TYPEDEF_PATCH_1000_056",
+      "description":     "Set serviceType 'hive' to hive_table_columns",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "hive_table_columns",
       "applyToVersion":  "1.0",
@@ -106,6 +136,8 @@
       "serviceType":     "hive"
     },
     {
+      "id":              "TYPEDEF_PATCH_1000_057",
+      "description":     "Set serviceType 'hive' to hive_table_partitionkeys",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "hive_table_partitionkeys",
       "applyToVersion":  "1.0",
@@ -113,6 +145,8 @@
       "serviceType":     "hive"
     },
     {
+      "id":              "TYPEDEF_PATCH_1000_058",
+      "description":     "Set serviceType 'hive' to hive_table_storagedesc",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "hive_table_storagedesc",
       "applyToVersion":  "1.0",
@@ -120,6 +154,8 @@
       "serviceType":     "hive"
     },
     {
+      "id":              "TYPEDEF_PATCH_1000_059",
+      "description":     "Set serviceType 'hive' to hive_process_column_lineage",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "hive_process_column_lineage",
       "applyToVersion":  "1.0",
@@ -127,6 +163,8 @@
       "serviceType":     "hive"
     },
     {
+      "id":              "TYPEDEF_PATCH_1000_060",
+      "description":     "Set serviceType 'sqoop' to sqoop_process",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "sqoop_process",
       "applyToVersion":  "1.0",
@@ -134,6 +172,8 @@
       "serviceType":     "sqoop"
     },
     {
+      "id":              "TYPEDEF_PATCH_1000_061",
+      "description":     "Set serviceType 'sqoop' to sqoop_dbdatastore",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "sqoop_dbdatastore",
       "applyToVersion":  "1.0",
@@ -141,6 +181,8 @@
       "serviceType":     "sqoop"
     },
     {
+      "id":              "TYPEDEF_PATCH_1000_062",
+      "description":     "Set serviceType 'falcon' to falcon_feed_replication",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "falcon_feed_replication",
       "applyToVersion":  "1.0",
@@ -148,6 +190,8 @@
       "serviceType":     "falcon"
     },
     {
+      "id":              "TYPEDEF_PATCH_1000_063",
+      "description":     "Set serviceType 'falcon' to falcon_cluster",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "falcon_cluster",
       "applyToVersion":  "1.0",
@@ -155,6 +199,8 @@
       "serviceType":     "falcon"
     },
     {
+      "id":              "TYPEDEF_PATCH_1000_064",
+      "description":     "Set serviceType 'falcon' to falcon_feed",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "falcon_feed",
       "applyToVersion":  "1.0",
@@ -162,6 +208,8 @@
       "serviceType":     "falcon"
     },
     {
+      "id":              "TYPEDEF_PATCH_1000_065",
+      "description":     "Set serviceType 'falcon' to falcon_process",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "falcon_process",
       "applyToVersion":  "1.0",
@@ -169,6 +217,8 @@
       "serviceType":     "falcon"
     },
     {
+      "id":              "TYPEDEF_PATCH_1000_066",
+      "description":     "Set serviceType 'falcon' to falcon_feed_creation",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "falcon_feed_creation",
       "applyToVersion":  "1.0",
@@ -176,6 +226,8 @@
       "serviceType":     "falcon"
     },
     {
+      "id":              "TYPEDEF_PATCH_1000_067",
+      "description":     "Set serviceType 'falcon' to falcon_feed_cluster",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "falcon_feed_cluster",
       "applyToVersion":  "1.0",
@@ -183,6 +235,8 @@
       "serviceType":     "falcon"
     },
     {
+      "id":              "TYPEDEF_PATCH_1000_068",
+      "description":     "Set serviceType 'falcon' to falcon_cluster_process",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "falcon_cluster_process",
       "applyToVersion":  "1.0",
@@ -190,6 +244,8 @@
       "serviceType":     "falcon"
     },
     {
+      "id":              "TYPEDEF_PATCH_1000_069",
+      "description":     "Set serviceType 'falcon' to falcon_cluster_feed_creation",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "falcon_cluster_feed_creation",
       "applyToVersion":  "1.0",
@@ -197,6 +253,8 @@
       "serviceType":     "falcon"
     },
     {
+      "id":              "TYPEDEF_PATCH_1000_070",
+      "description":     "Set serviceType 'hbase' to hbase_namespace",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "hbase_namespace",
       "applyToVersion":  "1.0",
@@ -204,6 +262,8 @@
       "serviceType":     "hbase"
     },
     {
+      "id":              "TYPEDEF_PATCH_1000_071",
+      "description":     "Set serviceType 'hbase' to hbase_table",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "hbase_table",
       "applyToVersion":  "1.3",
@@ -211,6 +271,8 @@
       "serviceType":     "hbase"
     },
     {
+      "id":              "TYPEDEF_PATCH_1000_072",
+      "description":     "Set serviceType 'hbase' to hbase_column_family",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "hbase_column_family",
       "applyToVersion":  "1.2",
@@ -218,6 +280,8 @@
       "serviceType":     "hbase"
     },
     {
+      "id":              "TYPEDEF_PATCH_1000_073",
+      "description":     "Set serviceType 'hbase' to hbase_column",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "hbase_column",
       "applyToVersion":  "1.0",
@@ -225,6 +289,8 @@
       "serviceType":     "hbase"
     },
     {
+      "id":              "TYPEDEF_PATCH_1000_074",
+      "description":     "Set serviceType 'hbase' to hbase_table_namespace",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "hbase_table_namespace",
       "applyToVersion":  "1.0",
@@ -232,6 +298,8 @@
       "serviceType":     "hbase"
     },
     {
+      "id":              "TYPEDEF_PATCH_1000_075",
+      "description":     "Set serviceType 'hbase' to hbase_table_column_families",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "hbase_table_column_families",
       "applyToVersion":  "1.0",
@@ -239,6 +307,8 @@
       "serviceType":     "hbase"
     },
     {
+      "id":              "TYPEDEF_PATCH_1000_076",
+      "description":     "Set serviceType 'hbase' to hbase_column_family_columns",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "hbase_column_family_columns",
       "applyToVersion":  "1.0",
@@ -246,6 +316,8 @@
       "serviceType":     "hbase"
     },
     {
+      "id":              "TYPEDEF_PATCH_1000_077",
+      "description":     "Set serviceType 'avro' to avro_type",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "avro_type",
       "applyToVersion":  "1.0",
@@ -253,6 +325,8 @@
       "serviceType":     "avro"
     },
     {
+      "id":              "TYPEDEF_PATCH_1000_078",
+      "description":     "Set serviceType 'avro' to avro_field",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "avro_field",
       "applyToVersion":  "1.0",
@@ -260,6 +334,8 @@
       "serviceType":     "avro"
     },
     {
+      "id":              "TYPEDEF_PATCH_1000_079",
+      "description":     "Set serviceType 'avro' to avro_record",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "avro_record",
       "applyToVersion":  "1.0",
@@ -267,6 +343,8 @@
       "serviceType":     "avro"
     },
     {
+      "id":              "TYPEDEF_PATCH_1000_080",
+      "description":     "Set serviceType 'avro' to avro_schema",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "avro_schema",
       "applyToVersion":  "1.0",
@@ -274,6 +352,8 @@
       "serviceType":     "avro"
     },
     {
+      "id":              "TYPEDEF_PATCH_1000_081",
+      "description":     "Set serviceType 'avro' to avro_primitive",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "avro_primitive",
       "applyToVersion":  "1.0",
@@ -281,6 +361,8 @@
       "serviceType":     "avro"
     },
     {
+      "id":              "TYPEDEF_PATCH_1000_082",
+      "description":     "Set serviceType 'avro' to avro_fixed",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "avro_fixed",
       "applyToVersion":  "1.0",
@@ -288,6 +370,8 @@
       "serviceType":     "avro"
     },
     {
+      "id":              "TYPEDEF_PATCH_1000_083",
+      "description":     "Set serviceType 'avro' to avro_enum",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "avro_enum",
       "applyToVersion":  "1.0",
@@ -295,6 +379,8 @@
       "serviceType":     "avro"
     },
     {
+      "id":              "TYPEDEF_PATCH_1000_084",
+      "description":     "Set serviceType 'avro' to avro_collection",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "avro_collection",
       "applyToVersion":  "1.0",
@@ -302,6 +388,8 @@
       "serviceType":     "avro"
     },
     {
+      "id":              "TYPEDEF_PATCH_1000_085",
+      "description":     "Set serviceType 'avro' to avro_schema_associatedEntities",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "avro_schema_associatedEntities",
       "applyToVersion":  "1.0",
@@ -309,6 +397,8 @@
       "serviceType":     "avro"
     },
     {
+      "id":              "TYPEDEF_PATCH_1000_086",
+      "description":     "Set serviceType 'avro' to avro_record_fields",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "avro_record_fields",
       "applyToVersion":  "1.0",
@@ -316,6 +406,8 @@
       "serviceType":     "avro"
     },
     {
+      "id":              "TYPEDEF_PATCH_1000_087",
+      "description":     "Set serviceType 'avro' to avro_field_types",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "avro_field_types",
       "applyToVersion":  "1.0",
@@ -323,6 +415,8 @@
       "serviceType":     "avro"
     },
     {
+      "id":              "TYPEDEF_PATCH_1000_088",
+      "description":     "Set serviceType 'kafka' to kafka_topic",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "kafka_topic",
       "applyToVersion":  "1.1",
@@ -330,6 +424,8 @@
       "serviceType":     "kafka"
     },
     {
+      "id":              "TYPEDEF_PATCH_1000_089",
+      "description":     "Set serviceType 'kafka' to jms_topic",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "jms_topic",
       "applyToVersion":  "1.0",
@@ -337,6 +433,8 @@
       "serviceType":     "kafka"
     },
     {
+      "id":              "TYPEDEF_PATCH_1000_090",
+      "description":     "Set serviceType 'kafka' to kafka_topic_avroSchema",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "kafka_topic_avroSchema",
       "applyToVersion":  "1.0",
@@ -344,6 +442,8 @@
       "serviceType":     "kafka"
     },
     {
+      "id":              "TYPEDEF_PATCH_1000_091",
+      "description":     "Set serviceType 'storm' to storm_topology",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "storm_topology",
       "applyToVersion":  "1.0",
@@ -351,6 +451,8 @@
       "serviceType":     "storm"
     },
     {
+      "id":              "TYPEDEF_PATCH_1000_092",
+      "description":     "Set serviceType 'storm' to storm_node",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "storm_node",
       "applyToVersion":  "1.0",
@@ -358,6 +460,8 @@
       "serviceType":     "storm"
     },
     {
+      "id":              "TYPEDEF_PATCH_1000_093",
+      "description":     "Set serviceType 'storm' to storm_spout",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "storm_spout",
       "applyToVersion":  "1.0",
@@ -365,6 +469,8 @@
       "serviceType":     "storm"
     },
     {
+      "id":              "TYPEDEF_PATCH_1000_094",
+      "description":     "Set serviceType 'storm' to storm_bolt",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "storm_bolt",
       "applyToVersion":  "1.0",
@@ -372,6 +478,8 @@
       "serviceType":     "storm"
     },
     {
+      "id":              "TYPEDEF_PATCH_1000_095",
+      "description":     "Set serviceType 'storm' to storm_topology_nodes",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "storm_topology_nodes",
       "applyToVersion":  "1.0",
@@ -379,4 +487,4 @@
       "serviceType":     "storm"
     }
   ]
-}
+}
\ No newline at end of file
diff --git a/addons/models/1000-Hadoop/patches/008-remove-hive-legacy-attributes.json b/addons/models/1000-Hadoop/patches/008-remove-hive-legacy-attributes.json
index 32a0876..2c863f0 100644
--- a/addons/models/1000-Hadoop/patches/008-remove-hive-legacy-attributes.json
+++ b/addons/models/1000-Hadoop/patches/008-remove-hive-legacy-attributes.json
@@ -1,6 +1,8 @@
 {
   "patches": [
     {
+      "id":              "TYPEDEF_PATCH_1000_096",
+      "description":     "Remove legacy reference attribute 'db' from hive_table",
       "action":          "REMOVE_LEGACY_REF_ATTRIBUTES",
       "typeName":        "hive_table_db",
       "applyToVersion":  "1.1",
@@ -10,6 +12,8 @@
       }
     },
     {
+      "id":              "TYPEDEF_PATCH_1000_097",
+      "description":     "Remove legacy reference attribute 'columns' from hive_table",
       "action":          "REMOVE_LEGACY_REF_ATTRIBUTES",
       "typeName":        "hive_table_columns",
       "applyToVersion":  "1.1",
@@ -19,6 +23,8 @@
       }
     },
     {
+      "id":              "TYPEDEF_PATCH_1000_098",
+      "description":     "Remove legacy reference attribute 'partitionkeys' from hive_table",
       "action":          "REMOVE_LEGACY_REF_ATTRIBUTES",
       "typeName":        "hive_table_partitionkeys",
       "applyToVersion":  "1.1",
@@ -28,6 +34,8 @@
       }
     },
     {
+      "id":              "TYPEDEF_PATCH_1000_099",
+      "description":     "Remove legacy reference attribute 'sd' from hive_table",
       "action":          "REMOVE_LEGACY_REF_ATTRIBUTES",
       "typeName":        "hive_table_storagedesc",
       "applyToVersion":  "1.1",
@@ -37,6 +45,8 @@
       }
     },
     {
+      "id":              "TYPEDEF_PATCH_1000_100",
+      "description":     "Remove legacy reference attribute 'query' from hive_column_lineage",
       "action":          "REMOVE_LEGACY_REF_ATTRIBUTES",
       "typeName":        "hive_process_column_lineage",
       "applyToVersion":  "1.1",
diff --git a/addons/models/2000-RDBMS/patches/001-rdbms_column_table_add_options.json b/addons/models/2000-RDBMS/patches/001-rdbms_column_table_add_options.json
index 675b0fd..f37d6da 100644
--- a/addons/models/2000-RDBMS/patches/001-rdbms_column_table_add_options.json
+++ b/addons/models/2000-RDBMS/patches/001-rdbms_column_table_add_options.json
@@ -1,6 +1,8 @@
 {
   "patches": [
     {
+      "id": "TYPEDEF_PATCH_2000_101",
+      "description": "Add 'schemaAttributes' typeDefOptions to rdbms_column",
       "action": "UPDATE_TYPEDEF_OPTIONS",
       "typeName": "rdbms_column",
       "applyToVersion": "1.1",
@@ -10,6 +12,8 @@
       }
     },
     {
+      "id": "TYPEDEF_PATCH_2000_102",
+      "description": "Add 'schemaElementsAttribute' typeDefOptions to rdbms_table",
       "action": "UPDATE_TYPEDEF_OPTIONS",
       "typeName": "rdbms_table",
       "applyToVersion": "1.1",
diff --git a/addons/models/2000-RDBMS/patches/002-rdbms_model_add_service_type.json b/addons/models/2000-RDBMS/patches/002-rdbms_model_add_service_type.json
index c0ce143..2ef1f28 100644
--- a/addons/models/2000-RDBMS/patches/002-rdbms_model_add_service_type.json
+++ b/addons/models/2000-RDBMS/patches/002-rdbms_model_add_service_type.json
@@ -1,6 +1,8 @@
 {
   "patches": [
     {
+      "id":              "TYPEDEF_PATCH_2000_103",
+      "description":     "Set serviceType 'rdbms' to rdbms_instance",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "rdbms_instance",
       "applyToVersion":  "1.1",
@@ -8,6 +10,8 @@
       "serviceType":     "rdbms"
     },
     {
+      "id":              "TYPEDEF_PATCH_2000_104",
+      "description":     "Set serviceType 'rdbms' to rdbms_db",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "rdbms_db",
       "applyToVersion":  "1.1",
@@ -15,6 +19,8 @@
       "serviceType":     "rdbms"
     },
     {
+      "id":              "TYPEDEF_PATCH_2000_105",
+      "description":     "Set serviceType 'rdbms' to rdbms_table",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "rdbms_table",
       "applyToVersion":  "1.2",
@@ -22,6 +28,8 @@
       "serviceType":     "rdbms"
     },
     {
+      "id":              "TYPEDEF_PATCH_2000_106",
+      "description":     "Set serviceType 'rdbms' to rdbms_column",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "rdbms_column",
       "applyToVersion":  "1.2",
@@ -29,6 +37,8 @@
       "serviceType":     "rdbms"
     },
     {
+      "id":              "TYPEDEF_PATCH_2000_107",
+      "description":     "Set serviceType 'rdbms' to rdbms_index",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "rdbms_index",
       "applyToVersion":  "1.1",
@@ -36,6 +46,8 @@
       "serviceType":     "rdbms"
     },
     {
+      "id":              "TYPEDEF_PATCH_2000_108",
+      "description":     "Set serviceType 'rdbms' to rdbms_foreign_key",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "rdbms_foreign_key",
       "applyToVersion":  "1.1",
@@ -43,6 +55,8 @@
       "serviceType":     "rdbms"
     },
     {
+      "id":              "TYPEDEF_PATCH_2000_109",
+      "description":     "Set serviceType 'rdbms' to rdbms_instance_databases",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "rdbms_instance_databases",
       "applyToVersion":  "1.0",
@@ -50,6 +64,8 @@
       "serviceType":     "rdbms"
     },
     {
+      "id":              "TYPEDEF_PATCH_2000_110",
+      "description":     "Set serviceType 'rdbms' to rdbms_db_tables",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "rdbms_db_tables",
       "applyToVersion":  "1.0",
@@ -57,6 +73,8 @@
       "serviceType":     "rdbms"
     },
     {
+      "id":              "TYPEDEF_PATCH_2000_111",
+      "description":     "Set serviceType 'rdbms' to rdbms_table_columns",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "rdbms_table_columns",
       "applyToVersion":  "1.0",
@@ -64,6 +82,8 @@
       "serviceType":     "rdbms"
     },
     {
+      "id":              "TYPEDEF_PATCH_2000_112",
+      "description":     "Set serviceType 'rdbms' to rdbms_table_indexes",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "rdbms_table_indexes",
       "applyToVersion":  "1.0",
@@ -71,6 +91,8 @@
       "serviceType":     "rdbms"
     },
     {
+      "id":              "TYPEDEF_PATCH_2000_113",
+      "description":     "Set serviceType 'rdbms' to rdbms_index_columns",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "rdbms_index_columns",
       "applyToVersion":  "1.0",
@@ -78,6 +100,8 @@
       "serviceType":     "rdbms"
     },
     {
+      "id":              "TYPEDEF_PATCH_2000_114",
+      "description":     "Set serviceType 'rdbms' to rdbms_table_foreign_key",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "rdbms_table_foreign_key",
       "applyToVersion":  "1.0",
@@ -85,6 +109,8 @@
       "serviceType":     "rdbms"
     },
     {
+      "id":              "TYPEDEF_PATCH_2000_115",
+      "description":     "Set serviceType 'rdbms' to rdbms_foreign_key_key_columns",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "rdbms_foreign_key_key_columns",
       "applyToVersion":  "1.0",
@@ -92,6 +118,8 @@
       "serviceType":     "rdbms"
     },
     {
+      "id":              "TYPEDEF_PATCH_2000_116",
+      "description":     "Set serviceType 'rdbms' to rdbms_foreign_key_table_references",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "rdbms_foreign_key_table_references",
       "applyToVersion":  "1.0",
@@ -99,6 +127,8 @@
       "serviceType":     "rdbms"
     },
     {
+      "id":              "TYPEDEF_PATCH_2000_117",
+      "description":     "Set serviceType 'rdbms' to rdbms_foreign_key_column_references",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "rdbms_foreign_key_column_references",
       "applyToVersion":  "1.0",
@@ -106,4 +136,4 @@
       "serviceType":     "rdbms"
     }
   ]
-}
+}
\ No newline at end of file
diff --git a/addons/models/2000-RDBMS/patches/003-remove-rdbms-legacy-attributes.json b/addons/models/2000-RDBMS/patches/003-remove-rdbms-legacy-attributes.json
index 5531bee..990d4e9 100644
--- a/addons/models/2000-RDBMS/patches/003-remove-rdbms-legacy-attributes.json
+++ b/addons/models/2000-RDBMS/patches/003-remove-rdbms-legacy-attributes.json
@@ -1,6 +1,8 @@
 {
   "patches": [
     {
+      "id":              "TYPEDEF_PATCH_2000_118",
+      "description":     "Remove legacy reference attribute 'databases' from rdbms_instance",
       "action":          "REMOVE_LEGACY_REF_ATTRIBUTES",
       "typeName":        "rdbms_instance_databases",
       "applyToVersion":  "1.1",
@@ -11,6 +13,8 @@
       }
     },
     {
+      "id":              "TYPEDEF_PATCH_2000_119",
+      "description":     "Remove legacy reference attribute 'tables' from rdbms_db",
       "action":          "REMOVE_LEGACY_REF_ATTRIBUTES",
       "typeName":        "rdbms_db_tables",
       "applyToVersion":  "1.1",
@@ -21,6 +25,8 @@
       }
     },
     {
+      "id":              "TYPEDEF_PATCH_2000_120",
+      "description":     "Remove legacy reference attribute 'columns' from rdbms_table",
       "action":          "REMOVE_LEGACY_REF_ATTRIBUTES",
       "typeName":        "rdbms_table_columns",
       "applyToVersion":  "1.1",
@@ -31,6 +37,8 @@
       }
     },
     {
+      "id":              "TYPEDEF_PATCH_2000_121",
+      "description":     "Remove legacy reference attribute 'indexes' from rdbms_table",
       "action":          "REMOVE_LEGACY_REF_ATTRIBUTES",
       "typeName":        "rdbms_table_indexes",
       "applyToVersion":  "1.1",
@@ -41,6 +49,8 @@
       }
     },
     {
+      "id":              "TYPEDEF_PATCH_2000_122",
+      "description":     "Remove legacy reference attribute 'foreign_keys' from rdbms_table",
       "action":          "REMOVE_LEGACY_REF_ATTRIBUTES",
       "typeName":        "rdbms_table_foreign_key",
       "applyToVersion":  "1.1",
@@ -51,6 +61,8 @@
       }
     },
     {
+      "id":              "TYPEDEF_PATCH_2000_123",
+      "description":     "Remove legacy reference attribute 'columns' from rdbms_index",
       "action":          "REMOVE_LEGACY_REF_ATTRIBUTES",
       "typeName":        "rdbms_index_columns",
       "applyToVersion":  "1.1",
@@ -60,6 +72,8 @@
       }
     },
     {
+      "id":              "TYPEDEF_PATCH_2000_124",
+      "description":     "Remove legacy reference attribute 'key_columns' from rdbms_foreign_key",
       "action":          "REMOVE_LEGACY_REF_ATTRIBUTES",
       "typeName":        "rdbms_foreign_key_key_columns",
       "applyToVersion":  "1.1",
@@ -69,6 +83,8 @@
       }
     },
     {
+      "id":              "TYPEDEF_PATCH_2000_125",
+      "description":     "Remove legacy reference attribute 'references_table' from rdbms_foreign_key",
       "action":          "REMOVE_LEGACY_REF_ATTRIBUTES",
       "typeName":        "rdbms_foreign_key_table_references",
       "applyToVersion":  "1.1",
@@ -78,6 +94,8 @@
       }
     },
     {
+      "id":              "TYPEDEF_PATCH_2000_126",
+      "description":     "Remove legacy reference attribute 'references_columns' from rdbms_foreign_key",
       "action":          "REMOVE_LEGACY_REF_ATTRIBUTES",
       "typeName":        "rdbms_foreign_key_column_references",
       "applyToVersion":  "1.1",
diff --git a/addons/models/3000-Cloud/patches/001-cloud_model_add_service_type.json b/addons/models/3000-Cloud/patches/001-cloud_model_add_service_type.json
index 320ae63..d6be60b 100644
--- a/addons/models/3000-Cloud/patches/001-cloud_model_add_service_type.json
+++ b/addons/models/3000-Cloud/patches/001-cloud_model_add_service_type.json
@@ -1,6 +1,8 @@
 {
   "patches": [
     {
+      "id":              "TYPEDEF_PATCH_3000_127",
+      "description":     "Set serviceType 'aws' to aws_tag",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "aws_tag",
       "applyToVersion":  "1.0",
@@ -8,6 +10,8 @@
       "serviceType":     "aws"
     },
     {
+      "id":              "TYPEDEF_PATCH_3000_128",
+      "description":     "Set serviceType 'aws' to aws_cloud_watch_metric",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "aws_cloud_watch_metric",
       "applyToVersion":  "1.0",
@@ -15,6 +19,8 @@
       "serviceType":     "aws"
     },
     {
+      "id":              "TYPEDEF_PATCH_3000_129",
+      "description":     "Set serviceType 'aws' to aws_s3_bucket_lifeCycleRule",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "aws_s3_bucket_lifeCycleRule",
       "applyToVersion":  "1.0",
@@ -22,6 +28,8 @@
       "serviceType":     "aws"
     },
     {
+      "id":              "TYPEDEF_PATCH_3000_130",
+      "description":     "Set serviceType 'aws' to aws_s3_access_policy",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "aws_s3_access_policy",
       "applyToVersion":  "1.0",
@@ -29,6 +37,8 @@
       "serviceType":     "aws"
     },
     {
+      "id":              "TYPEDEF_PATCH_3000_131",
+      "description":     "Set serviceType 'aws' to aws_s3_object",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "aws_s3_object",
       "applyToVersion":  "1.0",
@@ -36,6 +46,8 @@
       "serviceType":     "aws"
     },
     {
+      "id":              "TYPEDEF_PATCH_3000_132",
+      "description":     "Set serviceType 'aws' to aws_s3_pseudo_dir",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "aws_s3_pseudo_dir",
       "applyToVersion":  "1.0",
@@ -43,6 +55,8 @@
       "serviceType":     "aws"
     },
     {
+      "id":              "TYPEDEF_PATCH_3000_133",
+      "description":     "Set serviceType 'aws' to aws_s3_bucket",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "aws_s3_bucket",
       "applyToVersion":  "1.0",
@@ -50,6 +64,8 @@
       "serviceType":     "aws"
     },
     {
+      "id":              "TYPEDEF_PATCH_3000_134",
+      "description":     "Set serviceType 'aws' to aws_s3_bucket_aws_s3_pseudo_dirs",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "aws_s3_bucket_aws_s3_pseudo_dirs",
       "applyToVersion":  "1.0",
@@ -57,6 +73,8 @@
       "serviceType":     "aws"
     },
     {
+      "id":              "TYPEDEF_PATCH_3000_135",
+      "description":     "Set serviceType 'aws' to aws_s3_pseudo_dir_aws_objects",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "aws_s3_pseudo_dir_aws_objects",
       "applyToVersion":  "1.0",
@@ -64,6 +82,8 @@
       "serviceType":     "aws"
     },
     {
+      "id":              "TYPEDEF_PATCH_3000_136",
+      "description":     "Set serviceType 'aws' to aws_s3_object_avro_schema",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "aws_s3_object_avro_schema",
       "applyToVersion":  "1.0",
@@ -71,6 +91,8 @@
       "serviceType":     "aws"
     },
     {
+      "id":              "TYPEDEF_PATCH_3000_137",
+      "description":     "Set serviceType 'aws' to aws_s3_pseudo_dir_avro_schema",
       "action":          "SET_SERVICE_TYPE",
       "typeName":        "aws_s3_pseudo_dir_avro_schema",
       "applyToVersion":  "1.0",
diff --git a/common/src/main/java/org/apache/atlas/repository/Constants.java b/common/src/main/java/org/apache/atlas/repository/Constants.java
index 6c1e032..5055a04 100644
--- a/common/src/main/java/org/apache/atlas/repository/Constants.java
+++ b/common/src/main/java/org/apache/atlas/repository/Constants.java
@@ -86,6 +86,15 @@ public final class Constants {
     public static final String MODIFIED_BY_KEY      = encodePropertyKey(INTERNAL_PROPERTY_KEY_PREFIX + "modifiedBy");
 
     /**
+     * Patch vertices property keys.
+     */
+    public static final String PATCH_ID_PROPERTY_KEY          = encodePropertyKey(INTERNAL_PROPERTY_KEY_PREFIX + "patch.id");
+    public static final String PATCH_DESCRIPTION_PROPERTY_KEY = encodePropertyKey(INTERNAL_PROPERTY_KEY_PREFIX + "patch.description");
+    public static final String PATCH_TYPE_PROPERTY_KEY        = encodePropertyKey(INTERNAL_PROPERTY_KEY_PREFIX + "patch.type");
+    public static final String PATCH_ACTION_PROPERTY_KEY      = encodePropertyKey(INTERNAL_PROPERTY_KEY_PREFIX + "patch.action");
+    public static final String PATCH_STATE_PROPERTY_KEY       = encodePropertyKey(INTERNAL_PROPERTY_KEY_PREFIX + "patch.state");
+
+    /**
      * The homeId field is used when saving into Atlas a copy of an object that is being imported from another
      * repository. The homeId will be set to a String that identifies the other repository. The specific format
      * of repository identifiers is domain dependent. Where it is set by Open Metadata Repository Services it will
diff --git a/intg/src/main/java/org/apache/atlas/model/patches/AtlasPatch.java b/intg/src/main/java/org/apache/atlas/model/patches/AtlasPatch.java
new file mode 100644
index 0000000..cdf2441
--- /dev/null
+++ b/intg/src/main/java/org/apache/atlas/model/patches/AtlasPatch.java
@@ -0,0 +1,225 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.atlas.model.patches;
+
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlRootElement;
+import java.io.Serializable;
+import java.util.List;
+import java.util.Objects;
+
+import static com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility.NONE;
+import static com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility.PUBLIC_ONLY;
+
+/**
+ * Display all atlas patches.
+ */
+@JsonAutoDetect(getterVisibility = PUBLIC_ONLY, setterVisibility = PUBLIC_ONLY, fieldVisibility = NONE)
+@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
+@JsonIgnoreProperties(ignoreUnknown = true)
+@XmlRootElement
+@XmlAccessorType(XmlAccessType.PROPERTY)
+public class AtlasPatch implements Serializable {
+    private String      id;
+    private String      description;
+    private String      type;
+    private String      action;
+    private String      updatedBy;
+    private String      createdBy;
+    private long        createdTime;
+    private long        updatedTime;
+    private PatchStatus status;
+
+    public enum PatchStatus { APPLIED, SKIPPED, FAILED, UNKNOWN }
+
+    public AtlasPatch() { }
+
+    public AtlasPatch(String id, String patchName, String type, String action, PatchStatus status, String updatedBy,
+                      String createdBy, long createdTime, long updatedTime) {
+        this.id          = id;
+        this.description = patchName;
+        this.type        = type;
+        this.action      = action;
+        this.status      = status;
+        this.updatedBy   = updatedBy;
+        this.createdBy   = createdBy;
+        this.createdTime = createdTime;
+        this.updatedTime = updatedTime;
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public String getAction() {
+        return action;
+    }
+
+    public void setAction(String action) {
+        this.action = action;
+    }
+
+    public PatchStatus getStatus() {
+        return status;
+    }
+
+    public void setStatus(PatchStatus status) {
+        this.status = status;
+    }
+
+    public String getUpdatedBy() {
+        return updatedBy;
+    }
+
+    public void setUpdatedBy(String updatedBy) {
+        this.updatedBy = updatedBy;
+    }
+
+    public String getCreatedBy() {
+        return createdBy;
+    }
+
+    public void setCreatedBy(String createdBy) {
+        this.createdBy = createdBy;
+    }
+
+    public long getCreatedTime() {
+        return createdTime;
+    }
+
+    public void setCreatedTime(long createdTime) {
+        this.createdTime = createdTime;
+    }
+
+    public long getUpdatedTime() {
+        return updatedTime;
+    }
+
+    public void setUpdatedTime(long updatedTime) {
+        this.updatedTime = updatedTime;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        AtlasPatch that = (AtlasPatch) o;
+        return createdTime == that.createdTime &&
+                updatedTime == that.updatedTime &&
+                Objects.equals(id, that.id) &&
+                Objects.equals(description, that.description) &&
+                Objects.equals(type, that.type) &&
+                Objects.equals(action, that.action) &&
+                Objects.equals(updatedBy, that.updatedBy) &&
+                Objects.equals(createdBy, that.createdBy) &&
+                status == that.status;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(id, description, type, action, updatedBy, createdBy, createdTime, updatedTime, status);
+    }
+
+    @Override
+    public String toString() {
+        final StringBuilder sb = new StringBuilder("AtlasPatch{");
+
+        sb.append("id=").append(id);
+        sb.append(", description='").append(description).append('\'');
+        sb.append(", type='").append(type).append('\'');
+        sb.append(", action='").append(action).append('\'');
+        sb.append(", updatedBy='").append(updatedBy).append('\'');
+        sb.append(", createdBy='").append(createdBy).append('\'');
+        sb.append(", createdTime=").append(createdTime);
+        sb.append(", updatedTime=").append(updatedTime);
+        sb.append(", status=").append(status);
+        sb.append('}');
+
+        return sb.toString();
+    }
+
+    @JsonAutoDetect(getterVisibility = PUBLIC_ONLY, setterVisibility = PUBLIC_ONLY, fieldVisibility = NONE)
+    @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
+    @JsonIgnoreProperties(ignoreUnknown = true)
+    @XmlRootElement
+    @XmlAccessorType(XmlAccessType.PROPERTY)
+    public static class AtlasPatches implements Serializable {
+        private List<AtlasPatch> patches;
+
+        public AtlasPatches(List<AtlasPatch> patches) {
+            this.patches = patches;
+        }
+
+        public AtlasPatches() {
+        }
+
+        public List<AtlasPatch> getPatches() {
+            return patches;
+        }
+
+        public void setPatches(List<AtlasPatch> patches) {
+            this.patches = patches;
+        }
+
+        @Override
+        public boolean equals(Object o) {
+            if (this == o) return true;
+            if (o == null || getClass() != o.getClass()) return false;
+            AtlasPatches that = (AtlasPatches) o;
+            return Objects.equals(patches, that.patches);
+        }
+
+        @Override
+        public int hashCode() {
+            return Objects.hash(patches);
+        }
+
+        @Override
+        public String toString() {
+            final StringBuilder sb = new StringBuilder("AtlasPatches{");
+            sb.append("patches=").append(patches);
+            sb.append('}');
+            return sb.toString();
+        }
+    }
+}
\ No newline at end of file
diff --git a/intg/src/main/java/org/apache/atlas/type/AtlasTypeUtil.java b/intg/src/main/java/org/apache/atlas/type/AtlasTypeUtil.java
index 5955aec..3ba8a12 100644
--- a/intg/src/main/java/org/apache/atlas/type/AtlasTypeUtil.java
+++ b/intg/src/main/java/org/apache/atlas/type/AtlasTypeUtil.java
@@ -332,6 +332,8 @@ public class AtlasTypeUtil {
         if (typeDef != null) {
             if (typeDef.getClass().equals(AtlasEntityDef.class)) {
                 ret.getEntityDefs().add((AtlasEntityDef) typeDef);
+            } else if (typeDef.getClass().equals(AtlasRelationshipDef.class)) {
+                ret.getRelationshipDefs().add((AtlasRelationshipDef) typeDef);
             } else if (typeDef.getClass().equals(AtlasClassificationDef.class)) {
                 ret.getClassificationDefs().add((AtlasClassificationDef) typeDef);
             } else if (typeDef.getClass().equals(AtlasStructDef.class)) {
diff --git a/repository/src/main/java/org/apache/atlas/repository/graph/GraphBackedSearchIndexer.java b/repository/src/main/java/org/apache/atlas/repository/graph/GraphBackedSearchIndexer.java
index b1a686a..4805435 100755
--- a/repository/src/main/java/org/apache/atlas/repository/graph/GraphBackedSearchIndexer.java
+++ b/repository/src/main/java/org/apache/atlas/repository/graph/GraphBackedSearchIndexer.java
@@ -280,6 +280,12 @@ public class GraphBackedSearchIndexer implements SearchIndexer, ActiveStateChang
             createVertexIndex(management, TRAIT_NAMES_PROPERTY_KEY, UniqueKind.NONE, String.class, SET, true, true);
             createVertexIndex(management, PROPAGATED_TRAIT_NAMES_PROPERTY_KEY, UniqueKind.NONE, String.class, LIST, true, true);
 
+            createVertexIndex(management, PATCH_ID_PROPERTY_KEY, UniqueKind.GLOBAL_UNIQUE, String.class, SINGLE, true, false);
+            createVertexIndex(management, PATCH_DESCRIPTION_PROPERTY_KEY, UniqueKind.NONE, String.class, SINGLE, true, false);
+            createVertexIndex(management, PATCH_TYPE_PROPERTY_KEY, UniqueKind.NONE, String.class, SINGLE, true, false);
+            createVertexIndex(management, PATCH_ACTION_PROPERTY_KEY, UniqueKind.NONE, String.class, SINGLE, true, false);
+            createVertexIndex(management, PATCH_STATE_PROPERTY_KEY, UniqueKind.NONE, String.class, SINGLE, true, false);
+
             // create vertex-centric index
             createVertexCentricIndex(management, CLASSIFICATION_LABEL, AtlasEdgeDirection.BOTH, CLASSIFICATION_EDGE_NAME_PROPERTY_KEY, String.class, SINGLE);
             createVertexCentricIndex(management, CLASSIFICATION_LABEL, AtlasEdgeDirection.BOTH, CLASSIFICATION_EDGE_IS_PROPAGATED_PROPERTY_KEY, Boolean.class, SINGLE);
diff --git a/repository/src/main/java/org/apache/atlas/repository/store/bootstrap/AtlasTypeDefStoreInitializer.java b/repository/src/main/java/org/apache/atlas/repository/store/bootstrap/AtlasTypeDefStoreInitializer.java
index b0c224c..337a6db 100644
--- a/repository/src/main/java/org/apache/atlas/repository/store/bootstrap/AtlasTypeDefStoreInitializer.java
+++ b/repository/src/main/java/org/apache/atlas/repository/store/bootstrap/AtlasTypeDefStoreInitializer.java
@@ -29,6 +29,7 @@ import org.apache.atlas.authorize.AtlasAuthorizerFactory;
 import org.apache.atlas.exception.AtlasBaseException;
 import org.apache.atlas.ha.HAConfiguration;
 import org.apache.atlas.listener.ActiveStateChangeHandler;
+import org.apache.atlas.model.patches.AtlasPatch.PatchStatus;
 import org.apache.atlas.model.typedef.AtlasBaseTypeDef;
 import org.apache.atlas.model.typedef.AtlasClassificationDef;
 import org.apache.atlas.model.typedef.AtlasEntityDef;
@@ -40,6 +41,10 @@ import org.apache.atlas.model.typedef.AtlasRelationshipEndDef;
 import org.apache.atlas.model.typedef.AtlasStructDef;
 import org.apache.atlas.model.typedef.AtlasStructDef.AtlasAttributeDef;
 import org.apache.atlas.model.typedef.AtlasTypesDef;
+import org.apache.atlas.repository.graph.AtlasGraphProvider;
+import org.apache.atlas.repository.graphdb.AtlasGraph;
+import org.apache.atlas.repository.graphdb.AtlasVertex;
+import org.apache.atlas.repository.store.graph.v2.AtlasTypeDefGraphStoreV2;
 import org.apache.atlas.store.AtlasTypeDefStore;
 import org.apache.atlas.type.AtlasEntityType;
 import org.apache.atlas.type.AtlasStructType.AtlasAttribute;
@@ -71,27 +76,46 @@ import java.util.Map;
 
 import static com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility.NONE;
 import static com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility.PUBLIC_ONLY;
+import static org.apache.atlas.model.patches.AtlasPatch.PatchStatus.APPLIED;
+import static org.apache.atlas.model.patches.AtlasPatch.PatchStatus.FAILED;
+import static org.apache.atlas.model.patches.AtlasPatch.PatchStatus.SKIPPED;
+import static org.apache.atlas.model.patches.AtlasPatch.PatchStatus.UNKNOWN;
+import static org.apache.atlas.repository.Constants.CREATED_BY_KEY;
+import static org.apache.atlas.repository.Constants.MODIFICATION_TIMESTAMP_PROPERTY_KEY;
+import static org.apache.atlas.repository.Constants.MODIFIED_BY_KEY;
+import static org.apache.atlas.repository.Constants.PATCH_ACTION_PROPERTY_KEY;
+import static org.apache.atlas.repository.Constants.PATCH_ID_PROPERTY_KEY;
+import static org.apache.atlas.repository.Constants.PATCH_DESCRIPTION_PROPERTY_KEY;
+import static org.apache.atlas.repository.Constants.PATCH_STATE_PROPERTY_KEY;
+import static org.apache.atlas.repository.Constants.PATCH_TYPE_PROPERTY_KEY;
+import static org.apache.atlas.repository.Constants.TIMESTAMP_PROPERTY_KEY;
+import static org.apache.atlas.repository.store.graph.v2.AtlasGraphUtilsV2.findByPatchId;
+import static org.apache.atlas.repository.store.graph.v2.AtlasGraphUtilsV2.initPatchesRegistry;
+import static org.apache.atlas.repository.store.graph.v2.AtlasGraphUtilsV2.setEncodedProperty;
 
 /**
  * Class that handles initial loading of models and patches into typedef store
  */
 @Service
 public class AtlasTypeDefStoreInitializer implements ActiveStateChangeHandler {
-    private static final Logger LOG = LoggerFactory.getLogger(AtlasTypeDefStoreInitializer.class);
+    public static final Logger LOG                    = LoggerFactory.getLogger(AtlasTypeDefStoreInitializer.class);
     public static final String PATCHES_FOLDER_NAME    = "patches";
     public static final String RELATIONSHIP_LABEL     = "relationshipLabel";
     public static final String RELATIONSHIP_CATEGORY  = "relationshipCategory";
     public static final String RELATIONSHIP_SWAP_ENDS = "swapEnds";
+    public static final String TYPEDEF_PATCH_TYPE     = "TYPEDEF_PATCH";
 
     private final AtlasTypeDefStore atlasTypeDefStore;
     private final AtlasTypeRegistry atlasTypeRegistry;
+    private final AtlasGraph        atlasGraph;
     private final Configuration     conf;
 
-
     @Inject
-    public AtlasTypeDefStoreInitializer(AtlasTypeDefStore atlasTypeDefStore, AtlasTypeRegistry atlasTypeRegistry, Configuration conf) {
+    public AtlasTypeDefStoreInitializer(AtlasTypeDefStore atlasTypeDefStore, AtlasTypeRegistry atlasTypeRegistry,
+                                        AtlasGraph atlasGraph, Configuration conf) {
         this.atlasTypeDefStore = atlasTypeDefStore;
         this.atlasTypeRegistry = atlasTypeRegistry;
+        this.atlasGraph        = atlasGraph;
         this.conf              = conf;
     }
 
@@ -134,6 +158,7 @@ public class AtlasTypeDefStoreInitializer implements ActiveStateChangeHandler {
             // look for folders we need to load models from
             File   topModeltypesDir  = new File(modelsDirName);
             File[] modelsDirContents = topModeltypesDir.exists() ? topModeltypesDir.listFiles() : null;
+            Map<String, PatchStatus> patchesRegistry = initPatchesRegistry();
 
             if (modelsDirContents != null && modelsDirContents.length > 0) {
 	            Arrays.sort(modelsDirContents);
@@ -144,13 +169,13 @@ public class AtlasTypeDefStoreInitializer implements ActiveStateChangeHandler {
 	                        continue;
 	                    } else if (!folder.getName().equals(PATCHES_FOLDER_NAME)){
 	                        // load the models alphabetically in the subfolders apart from patches
-	                        loadModelsInFolder(folder);
+	                        loadModelsInFolder(folder, patchesRegistry);
 	                    }
 	            }
             }
 
             // load any files in the top models folder and any associated patches.
-            loadModelsInFolder(topModeltypesDir);
+            loadModelsInFolder(topModeltypesDir, patchesRegistry);
         }
         LOG.info("<== AtlasTypeDefStoreInitializer.loadBootstrapTypeDefs()");
     }
@@ -158,8 +183,9 @@ public class AtlasTypeDefStoreInitializer implements ActiveStateChangeHandler {
     /**
      * Load all the model files in the supplied folder followed by the contents of the patches folder.
      * @param typesDir
+     * @param patchesRegistry
      */
-    private void loadModelsInFolder(File typesDir) {
+    private void loadModelsInFolder(File typesDir, Map<String, PatchStatus> patchesRegistry) {
         LOG.info("==> AtlasTypeDefStoreInitializer({})", typesDir);
 
         String typesDirName = typesDir.getName();
@@ -201,7 +227,7 @@ public class AtlasTypeDefStoreInitializer implements ActiveStateChangeHandler {
                 }
             }
 
-            applyTypePatches(typesDir.getPath());
+            applyTypePatches(typesDir.getPath(), patchesRegistry);
         }
         LOG.info("<== AtlasTypeDefStoreInitializer({})", typesDir);
     }
@@ -399,7 +425,7 @@ public class AtlasTypeDefStoreInitializer implements ActiveStateChangeHandler {
         return ret;
     }
 
-    private void applyTypePatches(String typesDirName) {
+    private void applyTypePatches(String typesDirName, Map<String, PatchStatus> patchesRegistry) {
         String typePatchesDirName = typesDirName + File.separator + PATCHES_FOLDER_NAME;
         File   typePatchesDir     = new File(typePatchesDirName);
         File[] typePatchFiles     = typePatchesDir.exists() ? typePatchesDir.listFiles() : null;
@@ -430,43 +456,99 @@ public class AtlasTypeDefStoreInitializer implements ActiveStateChangeHandler {
 
             for (File typePatchFile : typePatchFiles) {
                 if (typePatchFile.isFile()) {
+                    String patchFile = typePatchFile.getAbsolutePath();
 
-                    LOG.info("Applying patches in file {}", typePatchFile.getAbsolutePath());
+                    LOG.info("Applying patches in file {}", patchFile);
 
                     try {
-                        String jsonStr = new String(Files.readAllBytes(typePatchFile.toPath()), StandardCharsets.UTF_8);
+                        String         jsonStr = new String(Files.readAllBytes(typePatchFile.toPath()), StandardCharsets.UTF_8);
                         TypeDefPatches patches = AtlasType.fromJson(jsonStr, TypeDefPatches.class);
 
                         if (patches == null || CollectionUtils.isEmpty(patches.getPatches())) {
-                            LOG.info("No patches in file {}", typePatchFile.getAbsolutePath());
+                            LOG.info("No patches in file {}", patchFile);
 
                             continue;
                         }
 
+                        int patchIndex = 0;
+
                         for (TypeDefPatch patch : patches.getPatches()) {
                             PatchHandler patchHandler = patchHandlerRegistry.get(patch.getAction());
 
                             if (patchHandler == null) {
-                                LOG.error("Unknown patch action {} in file {}. Ignored",
-                                        patch.getAction(), typePatchFile.getAbsolutePath());
-
+                                LOG.error("Unknown patch action {} in file {}. Ignored", patch.getAction(), patchFile);
                                 continue;
                             }
 
-                            try {
-                                patchHandler.applyPatch(patch);
-                            } catch (AtlasBaseException excp) {
-                                LOG.error("Failed to apply {} patch in file {}. Ignored", patch.getAction(), typePatchFile.getAbsolutePath(), excp);
+                            String patchId = patch.getId();
+
+                            if (StringUtils.isEmpty(patchId)) {
+                                patchId = typePatchFile.getName() + "_" + patchIndex;
+
+                                patch.setId(patchId);
+                            }
+
+                            if (isPatchApplicable(patchId, patchesRegistry)) {
+                                PatchStatus status;
+
+                                try {
+                                    status = patchHandler.applyPatch(patch);
+                                } catch (AtlasBaseException ex) {
+                                    status = FAILED;
+
+                                    LOG.error("Failed to apply {} (status: {}; action: {}) in file: {}. Ignored.",
+                                               patchId, status.toString(), patch.getAction(), patchFile);
+                                }
+
+                                createOrUpdatePatchVertex(patch, status, patchesRegistry);
+
+                                LOG.info("{} (status: {}; action: {}) in file: {}", patchId, status.toString(), patch.getAction(), patchFile);
+                            } else {
+                                LOG.info("{} in file: {} already {}. Ignoring.", patchId, patchFile, patchesRegistry.get(patchId).toString());
                             }
+
+                            patchIndex++;
                         }
                     } catch (Throwable t) {
-                        LOG.error("Failed to apply patches in file {}. Ignored", typePatchFile.getAbsolutePath(), t);
+                        LOG.error("Failed to apply patches in file {}. Ignored", patchFile, t);
                     }
                 }
             }
         }
     }
 
+    private boolean isPatchApplicable(String patchId, Map<String, PatchStatus> patchesRegistry) {
+        if (MapUtils.isEmpty(patchesRegistry) || !patchesRegistry.containsKey(patchId)) {
+            return true;
+        }
+
+        PatchStatus status = patchesRegistry.get(patchId);
+
+        if (status == FAILED || status == UNKNOWN) {
+            return true;
+        }
+
+        return false;
+    }
+
+    private void createOrUpdatePatchVertex(TypeDefPatch patch, PatchStatus patchStatus, Map<String, PatchStatus> patchesRegistry) {
+        String      patchId           = patch.getId();
+        boolean     isPatchRegistered = MapUtils.isNotEmpty(patchesRegistry) && patchesRegistry.containsKey(patchId);
+        AtlasVertex patchVertex       = isPatchRegistered ? findByPatchId(patchId) : atlasGraph.addVertex();
+
+        setEncodedProperty(patchVertex, PATCH_ID_PROPERTY_KEY, patchId);
+        setEncodedProperty(patchVertex, PATCH_DESCRIPTION_PROPERTY_KEY, patch.getDescription());
+        setEncodedProperty(patchVertex, PATCH_TYPE_PROPERTY_KEY, TYPEDEF_PATCH_TYPE);
+        setEncodedProperty(patchVertex, PATCH_ACTION_PROPERTY_KEY, patch.getAction());
+        setEncodedProperty(patchVertex, PATCH_STATE_PROPERTY_KEY, patchStatus.toString());
+        setEncodedProperty(patchVertex, TIMESTAMP_PROPERTY_KEY, RequestContext.get().getRequestTime());
+        setEncodedProperty(patchVertex, MODIFICATION_TIMESTAMP_PROPERTY_KEY, RequestContext.get().getRequestTime());
+        setEncodedProperty(patchVertex, CREATED_BY_KEY, AtlasTypeDefGraphStoreV2.getCurrentUser());
+        setEncodedProperty(patchVertex, MODIFIED_BY_KEY, AtlasTypeDefGraphStoreV2.getCurrentUser());
+
+        AtlasGraphProvider.getGraphInstance().commit();
+    }
+
     /**
      * typedef patch details
      */
@@ -476,6 +558,8 @@ public class AtlasTypeDefStoreInitializer implements ActiveStateChangeHandler {
     @XmlRootElement
     @XmlAccessorType(XmlAccessType.PROPERTY)
     static class TypeDefPatch {
+        private String                  id;
+        private String                  description;
         private String                  action;
         private String                  typeName;
         private String                  applyToVersion;
@@ -485,6 +569,22 @@ public class AtlasTypeDefStoreInitializer implements ActiveStateChangeHandler {
         private Map<String, String>     typeDefOptions;
         private String                  serviceType;
 
+        public String getId() {
+            return id;
+        }
+
+        public void setId(String id) {
+            this.id = id;
+        }
+
+        public String getDescription() {
+            return description;
+        }
+
+        public void setDescription(String description) {
+            this.description = description;
+        }
+
         public String getAction() {
             return action;
         }
@@ -583,7 +683,7 @@ public class AtlasTypeDefStoreInitializer implements ActiveStateChangeHandler {
 
         public String[] getSupportedActions() { return supportedActions; }
 
-        public abstract void applyPatch(TypeDefPatch patch) throws AtlasBaseException;
+        public abstract PatchStatus applyPatch(TypeDefPatch patch) throws AtlasBaseException;
 
         protected boolean isPatchApplicable(TypeDefPatch patch, AtlasBaseTypeDef currentTypeDef) {
             String currentVersion = currentTypeDef.getTypeVersion();
@@ -601,9 +701,10 @@ public class AtlasTypeDefStoreInitializer implements ActiveStateChangeHandler {
         }
 
         @Override
-        public void applyPatch(TypeDefPatch patch) throws AtlasBaseException {
-            String           typeName = patch.getTypeName();
-            AtlasBaseTypeDef typeDef  = typeRegistry.getTypeDefByName(typeName);
+        public PatchStatus applyPatch(TypeDefPatch patch) throws AtlasBaseException {
+            String           typeName       = patch.getTypeName();
+            AtlasBaseTypeDef typeDef        = typeRegistry.getTypeDefByName(typeName);
+            PatchStatus      ret;
 
             if (typeDef == null) {
                 throw new AtlasBaseException(AtlasErrorCode.PATCH_FOR_UNKNOWN_TYPE, patch.getAction(), typeName);
@@ -616,35 +717,48 @@ public class AtlasTypeDefStoreInitializer implements ActiveStateChangeHandler {
                     for (AtlasAttributeDef attributeDef : patch.getAttributeDefs()) {
                         updatedDef.addAttribute(attributeDef);
                     }
+
                     updatedDef.setTypeVersion(patch.getUpdateToVersion());
 
                     typeDefStore.updateEntityDefByName(typeName, updatedDef);
+
+                    ret = APPLIED;
                 } else if (typeDef.getClass().equals(AtlasClassificationDef.class)) {
                     AtlasClassificationDef updatedDef = new AtlasClassificationDef((AtlasClassificationDef)typeDef);
 
                     for (AtlasAttributeDef attributeDef : patch.getAttributeDefs()) {
                         updatedDef.addAttribute(attributeDef);
                     }
+
                     updatedDef.setTypeVersion(patch.getUpdateToVersion());
 
                     typeDefStore.updateClassificationDefByName(typeName, updatedDef);
+
+                    ret = APPLIED;
                 } else if (typeDef.getClass().equals(AtlasStructDef.class)) {
                     AtlasStructDef updatedDef = new AtlasStructDef((AtlasStructDef)typeDef);
 
                     for (AtlasAttributeDef attributeDef : patch.getAttributeDefs()) {
                         updatedDef.addAttribute(attributeDef);
                     }
+
                     updatedDef.setTypeVersion(patch.getUpdateToVersion());
 
                     typeDefStore.updateStructDefByName(typeName, updatedDef);
+
+                    ret = APPLIED;
                 } else {
-                    throw new AtlasBaseException(AtlasErrorCode.PATCH_NOT_APPLICABLE_FOR_TYPE,
-                            patch.getAction(), typeDef.getClass().getSimpleName());
+                    throw new AtlasBaseException(AtlasErrorCode.PATCH_NOT_APPLICABLE_FOR_TYPE, patch.getAction(), typeDef.getClass().getSimpleName());
                 }
             } else {
                 LOG.info("patch skipped: typeName={}; applyToVersion={}; updateToVersion={}",
-                        patch.getTypeName(), patch.getApplyToVersion(), patch.getUpdateToVersion());
+                          patch.getTypeName(), patch.getApplyToVersion(), patch.getUpdateToVersion());
+
+                ret = SKIPPED;
+
             }
+
+            return ret;
         }
     }
 
@@ -654,9 +768,10 @@ public class AtlasTypeDefStoreInitializer implements ActiveStateChangeHandler {
         }
 
         @Override
-        public void applyPatch(TypeDefPatch patch) throws AtlasBaseException {
-            String           typeName = patch.getTypeName();
-            AtlasBaseTypeDef typeDef  = typeRegistry.getTypeDefByName(typeName);
+        public PatchStatus applyPatch(TypeDefPatch patch) throws AtlasBaseException {
+            String           typeName       = patch.getTypeName();
+            AtlasBaseTypeDef typeDef        = typeRegistry.getTypeDefByName(typeName);
+            PatchStatus      ret;
 
             if (typeDef == null) {
                 throw new AtlasBaseException(AtlasErrorCode.PATCH_FOR_UNKNOWN_TYPE, patch.getAction(), typeName);
@@ -671,6 +786,8 @@ public class AtlasTypeDefStoreInitializer implements ActiveStateChangeHandler {
                     updatedDef.setTypeVersion(patch.getUpdateToVersion());
 
                     typeDefStore.updateEntityDefByName(typeName, updatedDef);
+
+                    ret = APPLIED;
                 } else if (typeDef.getClass().equals(AtlasClassificationDef.class)) {
                     AtlasClassificationDef updatedDef = new AtlasClassificationDef((AtlasClassificationDef)typeDef);
 
@@ -679,6 +796,8 @@ public class AtlasTypeDefStoreInitializer implements ActiveStateChangeHandler {
                     updatedDef.setTypeVersion(patch.getUpdateToVersion());
 
                     typeDefStore.updateClassificationDefByName(typeName, updatedDef);
+
+                    ret = APPLIED;
                 } else if (typeDef.getClass().equals(AtlasStructDef.class)) {
                     AtlasStructDef updatedDef = new AtlasStructDef((AtlasStructDef)typeDef);
 
@@ -688,14 +807,18 @@ public class AtlasTypeDefStoreInitializer implements ActiveStateChangeHandler {
 
                     typeDefStore.updateStructDefByName(typeName, updatedDef);
 
+                    ret = APPLIED;
                 } else {
-                    throw new AtlasBaseException(AtlasErrorCode.PATCH_NOT_APPLICABLE_FOR_TYPE,
-                                                 patch.getAction(), typeDef.getClass().getSimpleName());
+                    throw new AtlasBaseException(AtlasErrorCode.PATCH_NOT_APPLICABLE_FOR_TYPE, patch.getAction(), typeDef.getClass().getSimpleName());
                 }
             } else {
                 LOG.info("patch skipped: typeName={}; applyToVersion={}; updateToVersion={}",
                           patch.getTypeName(), patch.getApplyToVersion(), patch.getUpdateToVersion());
+
+                ret = SKIPPED;
             }
+
+            return ret;
         }
 
         private void addOrUpdateAttributes(AtlasStructDef structDef, List<AtlasAttributeDef> attributesToUpdate) {
@@ -717,9 +840,10 @@ public class AtlasTypeDefStoreInitializer implements ActiveStateChangeHandler {
         }
 
         @Override
-        public void applyPatch(TypeDefPatch patch) throws AtlasBaseException {
-            String           typeName = patch.getTypeName();
-            AtlasBaseTypeDef typeDef  = typeRegistry.getTypeDefByName(typeName);
+        public PatchStatus applyPatch(TypeDefPatch patch) throws AtlasBaseException {
+            String           typeName       = patch.getTypeName();
+            AtlasBaseTypeDef typeDef        = typeRegistry.getTypeDefByName(typeName);
+            PatchStatus      ret            = null;
 
             if (typeDef == null) {
                 throw new AtlasBaseException(AtlasErrorCode.PATCH_FOR_UNKNOWN_TYPE, patch.getAction(), typeName);
@@ -810,6 +934,8 @@ public class AtlasTypeDefStoreInitializer implements ActiveStateChangeHandler {
                         RequestContext.get().setInTypePatching(true); // to allow removal of attributes
 
                         typeDefStore.updateTypesDef(typesDef);
+
+                        ret = APPLIED;
                     } finally {
                         RequestContext.get().setInTypePatching(false);
                     }
@@ -817,7 +943,11 @@ public class AtlasTypeDefStoreInitializer implements ActiveStateChangeHandler {
             } else {
                 LOG.info("patch skipped: typeName={}; applyToVersion={}; updateToVersion={}",
                          patch.getTypeName(), patch.getApplyToVersion(), patch.getUpdateToVersion());
+
+                ret = SKIPPED;
             }
+
+            return ret;
         }
     }
 
@@ -827,9 +957,10 @@ public class AtlasTypeDefStoreInitializer implements ActiveStateChangeHandler {
         }
 
         @Override
-        public void applyPatch(TypeDefPatch patch) throws AtlasBaseException {
+        public PatchStatus applyPatch(TypeDefPatch patch) throws AtlasBaseException {
             String           typeName = patch.getTypeName();
             AtlasBaseTypeDef typeDef  = typeRegistry.getTypeDefByName(typeName);
+            PatchStatus      ret;
 
             if (typeDef == null) {
                 throw new AtlasBaseException(AtlasErrorCode.PATCH_FOR_UNKNOWN_TYPE, patch.getAction(), typeName);
@@ -848,10 +979,16 @@ public class AtlasTypeDefStoreInitializer implements ActiveStateChangeHandler {
                 typeDef.setTypeVersion(patch.getUpdateToVersion());
 
                 typeDefStore.updateTypesDef(AtlasTypeUtil.getTypesDef(typeDef));
+
+                ret = APPLIED;
             } else {
                 LOG.info("patch skipped: typeName={}; applyToVersion={}; updateToVersion={}",
                          patch.getTypeName(), patch.getApplyToVersion(), patch.getUpdateToVersion());
+
+                ret = SKIPPED;
             }
+
+            return ret;
         }
     }
 
@@ -861,9 +998,10 @@ public class AtlasTypeDefStoreInitializer implements ActiveStateChangeHandler {
         }
 
         @Override
-        public void applyPatch(TypeDefPatch patch) throws AtlasBaseException {
-            String           typeName = patch.getTypeName();
-            AtlasBaseTypeDef typeDef  = typeRegistry.getTypeDefByName(typeName);
+        public PatchStatus applyPatch(TypeDefPatch patch) throws AtlasBaseException {
+            String           typeName       = patch.getTypeName();
+            AtlasBaseTypeDef typeDef        = typeRegistry.getTypeDefByName(typeName);
+            PatchStatus      ret;
 
             if (typeDef == null) {
                 throw new AtlasBaseException(AtlasErrorCode.PATCH_FOR_UNKNOWN_TYPE, patch.getAction(), typeName);
@@ -874,10 +1012,16 @@ public class AtlasTypeDefStoreInitializer implements ActiveStateChangeHandler {
                 typeDef.setTypeVersion(patch.getUpdateToVersion());
 
                 typeDefStore.updateTypesDef(AtlasTypeUtil.getTypesDef(typeDef));
+
+                ret = APPLIED;
             } else {
-                LOG.info("patch skipped: typeName={}; applyToVersion={}; updateToVersion={}",
-                        patch.getTypeName(), patch.getApplyToVersion(), patch.getUpdateToVersion());
+                LOG.info("patch skipped: typeName={}; applyToVersion={}; updateToVersion={}", patch.getTypeName(),
+                          patch.getApplyToVersion(), patch.getUpdateToVersion());
+
+                ret = SKIPPED;
             }
+
+            return ret;
         }
     }
 }
diff --git a/repository/src/main/java/org/apache/atlas/repository/store/graph/v2/AtlasGraphUtilsV2.java b/repository/src/main/java/org/apache/atlas/repository/store/graph/v2/AtlasGraphUtilsV2.java
index 8f4baa1..5827dad 100644
--- a/repository/src/main/java/org/apache/atlas/repository/store/graph/v2/AtlasGraphUtilsV2.java
+++ b/repository/src/main/java/org/apache/atlas/repository/store/graph/v2/AtlasGraphUtilsV2.java
@@ -23,10 +23,14 @@ import org.apache.atlas.AtlasErrorCode;
 import org.apache.atlas.GraphTransactionInterceptor;
 import org.apache.atlas.RequestContext;
 import org.apache.atlas.SortOrder;
+import org.apache.atlas.annotation.GraphTransaction;
 import org.apache.atlas.discovery.SearchProcessor;
 import org.apache.atlas.exception.AtlasBaseException;
 import org.apache.atlas.model.TypeCategory;
 import org.apache.atlas.model.instance.AtlasEntity;
+import org.apache.atlas.model.patches.AtlasPatch;
+import org.apache.atlas.model.patches.AtlasPatch.AtlasPatches;
+import org.apache.atlas.model.patches.AtlasPatch.PatchStatus;
 import org.apache.atlas.model.typedef.AtlasBaseTypeDef;
 import org.apache.atlas.repository.Constants;
 import org.apache.atlas.repository.graph.AtlasGraphProvider;
@@ -35,12 +39,14 @@ import org.apache.atlas.repository.graphdb.AtlasEdge;
 import org.apache.atlas.repository.graphdb.AtlasElement;
 import org.apache.atlas.repository.graphdb.AtlasGraphQuery;
 import org.apache.atlas.repository.graphdb.AtlasIndexQuery;
+import org.apache.atlas.repository.graphdb.AtlasIndexQuery.Result;
 import org.apache.atlas.repository.graphdb.AtlasVertex;
 import org.apache.atlas.type.AtlasEntityType;
 import org.apache.atlas.type.AtlasStructType;
 import org.apache.atlas.type.AtlasStructType.AtlasAttribute;
 import org.apache.atlas.type.AtlasType;
 import org.apache.atlas.utils.AtlasPerfMetrics.MetricRecorder;
+import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.collections.MapUtils;
 import org.apache.commons.configuration.Configuration;
 import org.apache.commons.lang.StringUtils;
@@ -51,13 +57,25 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Date;
+import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
+import static org.apache.atlas.model.patches.AtlasPatch.PatchStatus.UNKNOWN;
+import static org.apache.atlas.repository.Constants.CREATED_BY_KEY;
 import static org.apache.atlas.repository.Constants.INDEX_SEARCH_VERTEX_PREFIX_DEFAULT;
 import static org.apache.atlas.repository.Constants.INDEX_SEARCH_VERTEX_PREFIX_PROPERTY;
+import static org.apache.atlas.repository.Constants.MODIFICATION_TIMESTAMP_PROPERTY_KEY;
+import static org.apache.atlas.repository.Constants.MODIFIED_BY_KEY;
+import static org.apache.atlas.repository.Constants.PATCH_ACTION_PROPERTY_KEY;
+import static org.apache.atlas.repository.Constants.PATCH_ID_PROPERTY_KEY;
+import static org.apache.atlas.repository.Constants.PATCH_DESCRIPTION_PROPERTY_KEY;
+import static org.apache.atlas.repository.Constants.PATCH_STATE_PROPERTY_KEY;
+import static org.apache.atlas.repository.Constants.PATCH_TYPE_PROPERTY_KEY;
+import static org.apache.atlas.repository.Constants.TIMESTAMP_PROPERTY_KEY;
+import static org.apache.atlas.repository.Constants.VERTEX_INDEX;
 import static org.apache.atlas.repository.graphdb.AtlasGraphQuery.SortOrder.*;
 
 /**
@@ -320,6 +338,22 @@ public class AtlasGraphUtilsV2 {
         return vertex;
     }
 
+    public static AtlasVertex findByPatchId(String patchId) {
+        AtlasVertex ret        = null;
+        String      indexQuery = getIndexSearchPrefix() + "\"" + PATCH_ID_PROPERTY_KEY + "\" : ("+ patchId +")";
+        Iterator<Result<Object, Object>> results = AtlasGraphProvider.getGraphInstance().indexQuery(VERTEX_INDEX, indexQuery).vertices();
+
+        while (results != null && results.hasNext()) {
+            ret = results.next().getVertex();
+
+            if (ret != null) {
+                break;
+            }
+        }
+
+        return ret;
+    }
+
     public static AtlasVertex findByGuid(String guid) {
         AtlasVertex ret = GraphTransactionInterceptor.getVertexFromCache(guid);
 
@@ -433,6 +467,64 @@ public class AtlasGraphUtilsV2 {
         return vertex;
     }
 
+    public static Map<String, PatchStatus> initPatchesRegistry() {
+        Map<String, PatchStatus>  ret     = new HashMap<>();
+        AtlasPatches              patches = getPatches();
+
+        for (AtlasPatch patch : patches.getPatches()) {
+            String      patchId     = patch.getId();
+            PatchStatus patchStatus = patch.getStatus();
+
+            if (patchId != null && patchStatus != null) {
+                ret.put(patchId, patchStatus);
+            }
+        }
+
+        return ret;
+    }
+
+    public static AtlasPatches getPatches() {
+        List<AtlasPatch>                 patches    = new ArrayList<>();
+        String                           indexQuery = getIndexSearchPrefix() + "\"" + PATCH_ID_PROPERTY_KEY + "\" : (*)";
+        Iterator<Result<Object, Object>> results    = AtlasGraphProvider.getGraphInstance().indexQuery(VERTEX_INDEX, indexQuery).vertices();
+
+        while (results != null && results.hasNext()) {
+            AtlasVertex patchVertex = results.next().getVertex();
+            AtlasPatch  patch       = toAtlasPatch(patchVertex);
+
+            patches.add(patch);
+        }
+
+        // Sort the patches based on patch id
+        if (CollectionUtils.isNotEmpty(patches)) {
+            Collections.sort(patches, (p1, p2) -> p1.getId().compareTo(p2.getId()));
+        }
+
+        return new AtlasPatches(patches);
+    }
+
+    private static AtlasPatch toAtlasPatch(AtlasVertex vertex) {
+        AtlasPatch ret = new AtlasPatch();
+
+        ret.setId(getEncodedProperty(vertex, PATCH_ID_PROPERTY_KEY, String.class));
+        ret.setDescription(getEncodedProperty(vertex, PATCH_DESCRIPTION_PROPERTY_KEY, String.class));
+        ret.setType(getEncodedProperty(vertex, PATCH_TYPE_PROPERTY_KEY, String.class));
+        ret.setAction(getEncodedProperty(vertex, PATCH_ACTION_PROPERTY_KEY, String.class));
+        ret.setCreatedBy(getEncodedProperty(vertex, CREATED_BY_KEY, String.class));
+        ret.setUpdatedBy(getEncodedProperty(vertex, MODIFIED_BY_KEY, String.class));
+        ret.setCreatedTime(getEncodedProperty(vertex, TIMESTAMP_PROPERTY_KEY, Long.class));
+        ret.setUpdatedTime(getEncodedProperty(vertex, MODIFICATION_TIMESTAMP_PROPERTY_KEY, Long.class));
+        ret.setStatus(getPatchStatus(vertex));
+
+        return ret;
+    }
+
+    private static PatchStatus getPatchStatus(AtlasVertex vertex) {
+        String patchStatus = AtlasGraphUtilsV2.getEncodedProperty(vertex, PATCH_STATE_PROPERTY_KEY, String.class);
+
+        return patchStatus != null ? PatchStatus.valueOf(patchStatus) : UNKNOWN;
+    }
+
     public static List<String> findEntityGUIDsByType(String typename, SortOrder sortOrder) {
         AtlasGraphQuery query = AtlasGraphProvider.getGraphInstance().query()
                                                   .has(Constants.ENTITY_TYPE_PROPERTY_KEY, typename);
@@ -555,9 +647,9 @@ public class AtlasGraphUtilsV2 {
         String          propertyName = attribute.getVertexPropertyName();
         AtlasIndexQuery query        = getIndexQuery(entityType, propertyName, attrVal.toString());
 
-        for (Iterator<AtlasIndexQuery.Result> iter = query.vertices(); iter.hasNext(); ) {
-            AtlasIndexQuery.Result result = iter.next();
-            AtlasVertex            vertex = result.getVertex();
+        for (Iterator<Result> iter = query.vertices(); iter.hasNext(); ) {
+            Result      result = iter.next();
+            AtlasVertex vertex = result.getVertex();
 
             // skip non-entity vertices, if any got returned
             if (vertex == null || !vertex.getPropertyKeys().contains(Constants.GUID_PROPERTY_KEY)) {
diff --git a/repository/src/main/java/org/apache/atlas/repository/store/graph/v2/AtlasTypeDefGraphStoreV2.java b/repository/src/main/java/org/apache/atlas/repository/store/graph/v2/AtlasTypeDefGraphStoreV2.java
index c6cf2a0..f360eef 100644
--- a/repository/src/main/java/org/apache/atlas/repository/store/graph/v2/AtlasTypeDefGraphStoreV2.java
+++ b/repository/src/main/java/org/apache/atlas/repository/store/graph/v2/AtlasTypeDefGraphStoreV2.java
@@ -534,7 +534,7 @@ public class AtlasTypeDefGraphStoreV2 extends AtlasTypeDefGraphStore {
         vertex.setProperty(Constants.VERSION_PROPERTY_KEY, newVersion);
     }
 
-    private String getCurrentUser() {
+    public static String getCurrentUser() {
         String ret = RequestContext.getCurrentUser();
 
         if (StringUtils.isBlank(ret)) {
diff --git a/webapp/src/main/java/org/apache/atlas/web/resources/AdminResource.java b/webapp/src/main/java/org/apache/atlas/web/resources/AdminResource.java
index 088aafc..01bdcf7 100755
--- a/webapp/src/main/java/org/apache/atlas/web/resources/AdminResource.java
+++ b/webapp/src/main/java/org/apache/atlas/web/resources/AdminResource.java
@@ -28,7 +28,6 @@ import org.apache.atlas.authorize.AtlasPrivilege;
 import org.apache.atlas.authorize.AtlasAuthorizationUtils;
 import org.apache.atlas.discovery.SearchContext;
 import org.apache.atlas.exception.AtlasBaseException;
-import org.apache.atlas.model.discovery.AtlasSearchResult;
 import org.apache.atlas.model.impexp.AtlasServer;
 import org.apache.atlas.model.impexp.AtlasExportRequest;
 import org.apache.atlas.model.impexp.AtlasExportResult;
@@ -39,6 +38,7 @@ import org.apache.atlas.model.impexp.MigrationStatus;
 import org.apache.atlas.model.instance.AtlasCheckStateRequest;
 import org.apache.atlas.model.instance.AtlasCheckStateResult;
 import org.apache.atlas.model.metrics.AtlasMetrics;
+import org.apache.atlas.model.patches.AtlasPatch.AtlasPatches;
 import org.apache.atlas.repository.impexp.AtlasServerService;
 import org.apache.atlas.repository.impexp.ExportImportAuditService;
 import org.apache.atlas.repository.impexp.ExportService;
@@ -47,6 +47,7 @@ import org.apache.atlas.repository.impexp.MigrationProgressService;
 import org.apache.atlas.repository.impexp.ZipSink;
 import org.apache.atlas.repository.impexp.ZipSource;
 import org.apache.atlas.repository.store.graph.AtlasEntityStore;
+import org.apache.atlas.repository.store.graph.v2.AtlasGraphUtilsV2;
 import org.apache.atlas.services.MetricsService;
 import org.apache.atlas.type.AtlasType;
 import org.apache.atlas.type.AtlasTypeRegistry;
@@ -555,6 +556,23 @@ public class AdminResource {
         }
     }
 
+    @GET
+    @Path("patches")
+    @Produces(Servlets.JSON_MEDIA_TYPE)
+    public AtlasPatches getAtlasPatches() {
+        if (LOG.isDebugEnabled()) {
+            LOG.debug("==> AdminResource.getAtlasPatches()");
+        }
+
+        AtlasPatches ret = AtlasGraphUtilsV2.getPatches();
+
+        if (LOG.isDebugEnabled()) {
+            LOG.debug("<== AdminResource.getAtlasPatches()");
+        }
+
+        return ret;
+    }
+
     private String getEditableEntityTypes(Configuration config) {
         String ret = DEFAULT_EDITABLE_ENTITY_TYPES;