diff --git a/listener.go b/listener.go
index de80a9b..ade4e1d 100644
--- a/listener.go
+++ b/listener.go
@@ -248,6 +248,107 @@
 }
 
 /*
+ * Performs Bulk insert of Company Developers
+ */
+func insertCompanyDevelopers(rows []common.Row, txn *sql.Tx) bool {
+	var scope, EntityIdentifier, DeveloperId, tenantId, CreatedBy, LastModifiedBy string
+	var CreatedAt, LastModifiedAt int64
+
+	prep, err := txn.Prepare("INSERT INTO COMPANY_DEVELOPER (_change_selector,id,tenant_id,developer_id,created_at,created_by,updated_at,updated_by) VALUES($1,$2,$3,$4,$5,$6,$7,$8);")
+	if err != nil {
+		log.Error("INSERT COMPANY_DEVELOPER Failed: ", err)
+		return false
+	}
+	defer prep.Close()
+	for _, ele := range rows {
+
+		ele.Get("_change_selector", &scope)
+		ele.Get("id", &EntityIdentifier)
+		ele.Get("tenant_id", &tenantId)
+		ele.Get("developer_id", &DeveloperId)
+		ele.Get("created_at", &CreatedAt)
+		ele.Get("created_by", &CreatedBy)
+		ele.Get("updated_at", &LastModifiedAt)
+		ele.Get("updated_by", &LastModifiedBy)
+
+		/* Mandatory params check */
+		if EntityIdentifier == "" || scope == "" || tenantId == "" {
+			log.Error("INSERT COMPANY_DEVELOPER: i/p args missing")
+			return false
+		}
+		_, err = txn.Stmt(prep).Exec(
+			scope,
+			EntityIdentifier,
+			tenantId,
+			CreatedAt,
+			CreatedBy,
+			LastModifiedAt,
+			LastModifiedBy)
+
+		if err != nil {
+			log.Error("INSERT COMPANY_DEVELOPER Failed: (", EntityIdentifier, ", ", scope, ")", err)
+			return false
+		} else {
+			log.Debug("INSERT COMPANY_DEVELOPER Success: (", EntityIdentifier, ", ", scope, ")")
+		}
+	}
+	return true
+}
+
+/*
+ * Performs Bulk insert of Companies
+ */
+func insertCompanies(rows []common.Row, txn *sql.Tx) bool {
+	var scope, EntityIdentifier, Name, DisplayName, Status, tenantId, CreatedBy, LastModifiedBy string
+	var CreatedAt, LastModifiedAt int64
+
+	prep, err := txn.Prepare("INSERT INTO COMAPNY (_change_selector,id,tenant_id,status,name,display_name,created_at,created_by,updated_at,updated_by) VALUES($1,$2,$3,$4,$5,$6,$7,$8,$9,$10);")
+	if err != nil {
+		log.Error("INSERT COMPANY Failed: ", err)
+		return false
+	}
+	defer prep.Close()
+	for _, ele := range rows {
+
+		ele.Get("_change_selector", &scope)
+		ele.Get("id", &EntityIdentifier)
+		ele.Get("tenant_id", &tenantId)
+		ele.Get("status", &Status)
+		ele.Get("name", &Name)
+		ele.Get("display_name", &DisplayName)
+		ele.Get("created_at", &CreatedAt)
+		ele.Get("created_by", &CreatedBy)
+		ele.Get("updated_at", &LastModifiedAt)
+		ele.Get("updated_by", &LastModifiedBy)
+
+		/* Mandatory params check */
+		if EntityIdentifier == "" || scope == "" || tenantId == "" {
+			log.Error("INSERT COMPANY: i/p args missing")
+			return false
+		}
+		_, err = txn.Stmt(prep).Exec(
+			scope,
+			EntityIdentifier,
+			tenantId,
+			Status,
+			Name,
+			DisplayName,
+			CreatedAt,
+			CreatedBy,
+			LastModifiedAt,
+			LastModifiedBy)
+
+		if err != nil {
+			log.Error("INSERT COMPANY Failed: (", EntityIdentifier, ", ", scope, ")", err)
+			return false
+		} else {
+			log.Debug("INSERT COMPANY Success: (", EntityIdentifier, ", ", scope, ")")
+		}
+	}
+	return true
+}
+
+/*
  * Performs Bulk insert of API products
  */
 func insertAPIproducts(rows []common.Row, txn *sql.Tx) bool {
@@ -404,7 +505,34 @@
 			case common.Delete:
 				ok = deleteObject("APP", payload.OldRow, txn)
 			}
+		case "kms.company":
+			switch payload.Operation {
+			case common.Insert:
+				rows = append(rows, payload.NewRow)
+				ok = insertApplications(rows, txn)
 
+			case common.Update:
+				ok = deleteObject("COMPANY", payload.OldRow, txn)
+				rows = append(rows, payload.NewRow)
+				ok = insertApplications(rows, txn)
+
+			case common.Delete:
+				ok = deleteObject("COMPANY", payload.OldRow, txn)
+			}
+		case "kms.company_developer":
+			switch payload.Operation {
+			case common.Insert:
+				rows = append(rows, payload.NewRow)
+				ok = insertApplications(rows, txn)
+
+			case common.Update:
+				ok = deleteObject("COMPANY_DEVELOPER", payload.OldRow, txn)
+				rows = append(rows, payload.NewRow)
+				ok = insertApplications(rows, txn)
+
+			case common.Delete:
+				ok = deleteObject("COMPANY_DEVELOPER", payload.OldRow, txn)
+			}
 		case "kms.app_credential":
 			switch payload.Operation {
 			case common.Insert:
diff --git a/listener_test.go b/listener_test.go
index 8305836..c1d66d5 100644
--- a/listener_test.go
+++ b/listener_test.go
@@ -50,6 +50,45 @@
 				},
 			}
 
+			companyItems := common.Row{
+				"id": {
+					Value: "ch_company_id_2",
+				},
+				"status": {
+					Value: "Active",
+				},
+				"tenant_id": {
+					Value: "tenant_id_0",
+				},
+				"_change_selector": {
+					Value: "test_org0",
+				},
+				"name": {
+					Value: "test_company_name0",
+				},
+				"display_name": {
+					Value: "test_company_display_name0",
+				},
+			}
+
+			companyDeveloperItems := common.Row{
+				"id": {
+					Value: "ch_developer_id_2",
+				},
+				"tenant_id": {
+					Value: "tenant_id_0",
+				},
+				"_change_selector": {
+					Value: "test_org0",
+				},
+				"company_id": {
+					Value: "ch_company_id_2",
+				},
+				"developer_id": {
+					Value: "ch_developer_id_2",
+				},
+			}
+
 			/* APP */
 			appItems := common.Row{
 				"id": {
@@ -136,6 +175,16 @@
 					NewRow:    mpItems,
 					Operation: 1,
 				},
+				{
+					Table:     "kms.company",
+					NewRow:    companyItems,
+					Operation: 1,
+				},
+				{
+					Table:     "kms.company_developer",
+					NewRow:    companyDeveloperItems,
+					Operation: 1,
+				},
 			}
 
 			h := &test_handler{
@@ -231,6 +280,45 @@
 			},
 		}
 
+		companyItemsOld := common.Row{
+			"id": {
+				Value: "ch_company_id_0",
+			},
+			"status": {
+				Value: "Active",
+			},
+			"tenant_id": {
+				Value: "tenant_id_0",
+			},
+			"_change_selector": {
+				Value: "test_org0",
+			},
+			"name": {
+				Value: "test_company_name0",
+			},
+			"display_name": {
+				Value: "test_company_display_name0",
+			},
+		}
+
+		companyDeveloperItemsOld := common.Row{
+			"id": {
+				Value: "ch_developer_id_0",
+			},
+			"tenant_id": {
+				Value: "tenant_id_0",
+			},
+			"_change_selector": {
+				Value: "test_org0",
+			},
+			"company_id": {
+				Value: "ch_company_id_0",
+			},
+			"developer_id": {
+				Value: "ch_developer_id_0",
+			},
+		}
+
 		/* CRED */
 		credItemsOld := common.Row{
 			"id": {
@@ -308,6 +396,45 @@
 			},
 		}
 
+		companyItemsNew := common.Row{
+			"id": {
+				Value: "ch_company_id_1",
+			},
+			"status": {
+				Value: "Active",
+			},
+			"tenant_id": {
+				Value: "tenant_id_0",
+			},
+			"_change_selector": {
+				Value: "test_org0",
+			},
+			"name": {
+				Value: "test_company_name0",
+			},
+			"display_name": {
+				Value: "test_company_display_name0",
+			},
+		}
+
+		companyDeveloperItemsNew := common.Row{
+			"id": {
+				Value: "ch_developer_id_1",
+			},
+			"tenant_id": {
+				Value: "tenant_id_0",
+			},
+			"_change_selector": {
+				Value: "test_org0",
+			},
+			"company_id": {
+				Value: "ch_company_id_1",
+			},
+			"developer_id": {
+				Value: "ch_developer_id_1",
+			},
+		}
+
 		/* APP */
 		appItemsNew := common.Row{
 			"id": {
@@ -380,6 +507,16 @@
 				Operation: 1,
 			},
 			{
+				Table:     "kms.company",
+				NewRow:    companyItemsOld,
+				Operation: 1,
+			},
+			{
+				Table:     "kms.company_developer",
+				NewRow:    companyDeveloperItemsOld,
+				Operation: 1,
+			},
+			{
 				Table:     "kms.app",
 				NewRow:    appItemsOld,
 				Operation: 1,
@@ -410,6 +547,18 @@
 				Operation: 2,
 			},
 			{
+				Table:     "kms.company",
+				OldRow:    companyItemsOld,
+				NewRow:    companyItemsNew,
+				Operation: 2,
+			},
+			{
+				Table:     "kms.company_developer",
+				OldRow:    companyDeveloperItemsOld,
+				NewRow:    companyDeveloperItemsNew,
+				Operation: 2,
+			},
+			{
 				Table:     "kms.app",
 				OldRow:    appItemsOld,
 				NewRow:    appItemsNew,
@@ -461,7 +610,6 @@
 		apid.Events().Emit("ApigeeSync", &event2)
 		apid.Events().Emit("ApigeeSync", &common.ChangeList{})
 	})
-
 })
 
 type test_handler struct {
