Merge branch 'poc2'
diff --git a/api.go b/api.go
index 241e472..3361c74 100644
--- a/api.go
+++ b/api.go
@@ -98,12 +98,7 @@
 		return errorResponse(reason, errorCode)
 	}
 
-	/*
-	 * NOTE: that here c.expired_at has been commented out because it is not
-	 * kept track of by Cassandra (hence always defaults to -1). FIXME
-	 */
-
-	sSql = "SELECT ap.res_names, ap.env, c.issued_at, c.status, a.cback_url, d.username, d.id FROM APP_CREDENTIAL AS c INNER JOIN APP AS a ON c.app_id = a.id INNER JOIN DEVELOPER AS d ON a.dev_id = d.id INNER JOIN APP_AND_API_PRODUCT_MAPPER as mp ON mp.app_cred_id = c.id INNER JOIN API_PRODUCT as ap ON ap.id = mp.api_prdt_id WHERE (UPPER(d.sts) = 'ACTIVE' AND mp.api_prdt_id = ap.id AND mp.app_id = a.id AND mp.app_cred_id = c.id AND UPPER(mp.api_prdt_status) = 'APPROVED' AND UPPER(a.status) = 'APPROVED' AND UPPER(c.status) = 'APPROVED' AND c.id = '" + key + "' AND c.org = '" + org + "');"
+	sSql = "SELECT ap.api_resources, ap.environments, c.issued_at, c.status, a.callback_url, d.username, d.id FROM APP_CREDENTIAL AS c INNER JOIN APP AS a ON c.app_id = a.id INNER JOIN DEVELOPER AS d ON a.developer_id = d.id INNER JOIN APP_CREDENTIAL_APIPRODUCT_MAPPER as mp ON mp.appcred_id = c.id INNER JOIN API_PRODUCT as ap ON ap.id = mp.apiprdt_id WHERE (UPPER(d.status) = 'ACTIVE' AND mp.apiprdt_id = ap.id AND mp.app_id = a.id AND mp.appcred_id = c.id AND UPPER(mp.status) = 'APPROVED' AND UPPER(a.status) = 'APPROVED' AND c.id = '" + key + "' AND c._apid_scope = '" + org + "');"
 
 	err = db.QueryRow(sSql).Scan(&resName, &resEnv, &issuedAt, &status,
 		&redirectionURIs, &developerAppName, &developerId)
diff --git a/api_test.go b/api_test.go
index 2d9d921..50d1567 100644
--- a/api_test.go
+++ b/api_test.go
@@ -5,7 +5,7 @@
 	"encoding/json"
 	"github.com/30x/apid"
 	"github.com/30x/apid/factory"
-	. "github.com/30x/apidApigeeSync" // for direct access to Payload types
+	"github.com/apigee-labs/transicator/common"
 	. "github.com/onsi/ginkgo"
 	. "github.com/onsi/gomega"
 	"io/ioutil"
@@ -39,8 +39,10 @@
 
 		db, err = apid.Data().DB()
 		Expect(err).NotTo(HaveOccurred())
-		insertTestData(db)
-
+		txn, err := db.Begin()
+		Expect(err).ShouldNot(HaveOccurred())
+		insertTestData(db, txn)
+		txn.Commit()
 		server = httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
 			if req.URL.Path == apiPath {
 				handleRequest(w, req)
@@ -66,33 +68,33 @@
 			Expect(respj.ErrInfo.ErrorCode).Should(Equal("REQ_ENTRY_NOT_FOUND"))
 
 		})
+		/*
+			It("should reject a key once it's deleted", func() {
+				pd0 := &DataPayload{
+					EntityIdentifier: "app_credential_0",
+				}
+				res := deleteCredential(*pd0, db)
+				Expect(res).Should(BeTrue())
 
-		It("should reject a key once it's deleted", func() {
-			pd0 := &DataPayload{
-				EntityIdentifier: "credential_0",
-			}
-			res := deleteCredential(*pd0, db, "Org_0")
-			Expect(res).Should(BeTrue())
+				var respj kmsResponseFail
+				rsp, err := verifyAPIKey("app_credential_0", "/test", "Env_0", "Org_0", "verify")
+				Expect(err).ShouldNot(HaveOccurred())
 
-			var respj kmsResponseFail
-			rsp, err := verifyAPIKey("credential_0", "/test", "Env_0", "Org_0", "verify")
-			Expect(err).ShouldNot(HaveOccurred())
-
-			json.Unmarshal(rsp, &respj)
-			Expect(respj.Type).Should(Equal("ErrorResult"))
-			Expect(respj.ErrInfo.ErrorCode).Should(Equal("REQ_ENTRY_NOT_FOUND"))
-		})
-
+				json.Unmarshal(rsp, &respj)
+				Expect(respj.Type).Should(Equal("ErrorResult"))
+				Expect(respj.ErrInfo.ErrorCode).Should(Equal("REQ_ENTRY_NOT_FOUND"))
+			})
+		*/
 		It("should successfully verify good keys", func() {
 			for i := 1; i < 10; i++ {
 				resulti := strconv.FormatInt(int64(i), 10)
-				rsp, err := verifyAPIKey("credential_"+resulti, "/test", "Env_0", "Org_0", "verify")
+				rsp, err := verifyAPIKey("app_credential_"+resulti, "/test", "Env_0", "Org_0", "verify")
 				Expect(err).ShouldNot(HaveOccurred())
 
 				var respj kmsResponseSuccess
 				json.Unmarshal(rsp, &respj)
 				Expect(respj.Type).Should(Equal("APIKeyContext"))
-				Expect(respj.RspInfo.Key).Should(Equal("credential_" + resulti))
+				Expect(respj.RspInfo.Key).Should(Equal("app_credential_" + resulti))
 			}
 		})
 	})
@@ -134,7 +136,7 @@
 
 			v := url.Values{}
 			v.Add("organization", "Org_0")
-			v.Add("key", "credential_1")
+			v.Add("key", "app_credential_1")
 			v.Add("environment", "Env_0")
 			v.Add("uriPath", "/test")
 			v.Add("action", "verify")
@@ -152,42 +154,101 @@
 			Expect(err).ShouldNot(HaveOccurred())
 			json.Unmarshal(body, &respj)
 			Expect(respj.Type).Should(Equal("APIKeyContext"))
-			Expect(respj.RspInfo.Key).Should(Equal("credential_1"))
+			Expect(respj.RspInfo.Key).Should(Equal("app_credential_1"))
 		})
 	})
 })
 
-func insertTestData(db *sql.DB) {
+func insertTestData(db *sql.DB, txn *sql.Tx) {
 
 	for i := 0; i < 10; i++ {
+		var rows []common.Row
+		srvItems := common.Row{}
 		result := strconv.FormatInt(int64(i), 10)
-		pd0 := &DataPayload{
-			PldCont: Payload{
-				AppName:      "Api_product_" + result,
-				Resources:    []string{"/**", "/test"},
-				Environments: []string{"Env_0", "Env_1"},
-			},
-		}
 
-		res := insertAPIproduct(*pd0, db, "Org_0")
+		scv := &common.ColumnVal{
+			Value: "api_product_" + result,
+			Type:  1,
+		}
+		srvItems["id"] = scv
+
+		scv = &common.ColumnVal{
+			Value: "{/**, /test}",
+			Type:  1,
+		}
+		srvItems["api_resources"] = scv
+
+		scv = &common.ColumnVal{
+			Value: "{Env_0, Env_1}",
+			Type:  1,
+		}
+		srvItems["environments"] = scv
+
+		scv = &common.ColumnVal{
+			Value: "Org_0",
+			Type:  1,
+		}
+		srvItems["_apid_scope"] = scv
+
+		scv = &common.ColumnVal{
+			Value: "tenant_id_xxxx",
+			Type:  1,
+		}
+		srvItems["tenant_id"] = scv
+		rows = append(rows, srvItems)
+		res := insertAPIproducts(rows, db, txn)
 		Expect(res).Should(BeTrue())
 	}
 
 	for i := 0; i < 10; i++ {
+		var rows []common.Row
+		srvItems := common.Row{}
 		result := strconv.FormatInt(int64(i), 10)
 
-		pd1 := &DataPayload{
-			EntityIdentifier: "developer_id_" + result,
-			PldCont: Payload{
-				Email:     "person_0@apigee.com",
-				Status:    "Active",
-				UserName:  "user_0",
-				FirstName: "user_first_name0",
-				LastName:  "user_last_name0",
-			},
+		scv := &common.ColumnVal{
+			Value: "developer_id_" + result,
+			Type:  1,
 		}
+		srvItems["id"] = scv
 
-		res := insertCreateDeveloper(*pd1, db, "Org_0")
+		scv = &common.ColumnVal{
+			Value: "test@apigee.com",
+			Type:  1,
+		}
+		srvItems["email"] = scv
+
+		scv = &common.ColumnVal{
+			Value: "Active",
+			Type:  1,
+		}
+		srvItems["status"] = scv
+
+		scv = &common.ColumnVal{
+			Value: "Apigee",
+			Type:  1,
+		}
+		srvItems["firstName"] = scv
+
+		scv = &common.ColumnVal{
+			Value: "Google",
+			Type:  1,
+		}
+		srvItems["lastName"] = scv
+
+		scv = &common.ColumnVal{
+			Value: "Org_0",
+			Type:  1,
+		}
+		srvItems["_apid_scope"] = scv
+
+		scv = &common.ColumnVal{
+			Value: "tenant_id_xxxx",
+			Type:  1,
+		}
+		srvItems["tenant_id"] = scv
+
+		rows = append(rows, srvItems)
+		res := insertDevelopers(rows, db, txn)
 		Expect(res).Should(BeTrue())
 	}
 
@@ -195,44 +256,133 @@
 	for i := 0; i < 10; i++ {
 		resulti := strconv.FormatInt(int64(i), 10)
 		for j = k; j < 10+k; j++ {
-			resultj := strconv.FormatInt(int64(j), 10)
-			pd2 := &DataPayload{
-				EntityIdentifier: "application_id_" + resultj,
-				PldCont: Payload{
-					Email:       "person_0@apigee.com",
-					Status:      "Approved",
-					AppName:     "application_id_" + resultj,
-					DeveloperId: "developer_id_" + resulti,
-					CallbackUrl: "call_back_url_0",
-				},
-			}
+			var rows []common.Row
 
-			res := insertCreateApplication(*pd2, db, "Org_0")
+			srvItems := common.Row{}
+			resultj := strconv.FormatInt(int64(j), 10)
+
+			scv := &common.ColumnVal{
+				Value: "application_id_" + resultj,
+				Type:  1,
+			}
+			srvItems["id"] = scv
+
+			scv = &common.ColumnVal{
+				Value: "developer_id_" + resulti,
+				Type:  1,
+			}
+			srvItems["developer_id"] = scv
+
+			scv = &common.ColumnVal{
+				Value: "approved",
+				Type:  1,
+			}
+			srvItems["status"] = scv
+
+			scv = &common.ColumnVal{
+				Value: "http://apigee.com",
+				Type:  1,
+			}
+			srvItems["callback_url"] = scv
+
+			scv = &common.ColumnVal{
+				Value: "Org_0",
+				Type:  1,
+			}
+			srvItems["_apid_scope"] = scv
+
+			scv = &common.ColumnVal{
+				Value: "tenant_id_xxxx",
+				Type:  1,
+			}
+			srvItems["tenant_id"] = scv
+			rows = append(rows, srvItems)
+			res := insertApplications(rows, db, txn)
 			Expect(res).Should(BeTrue())
 		}
 		k = j
 	}
 
-	j = 0
-	k = 0
 	for i := 0; i < 10; i++ {
-		resulti := strconv.FormatInt(int64(i), 10)
-		for j = k; j < 10+k; j++ {
-			resultj := strconv.FormatInt(int64(j), 10)
-			pd3 := &DataPayload{
-				EntityIdentifier: "credential_" + resultj,
-				PldCont: Payload{
-					AppId:          "application_id_" + resulti,
-					Status:         "Approved",
-					ConsumerSecret: "consumer_secret_0",
-					IssuedAt:       349583485,
-					ApiProducts:    []Apip{{ApiProduct: "Api_product_0", Status: "Approved"}},
-				},
-			}
+		var rows []common.Row
+		srvItems := common.Row{}
+		result := strconv.FormatInt(int64(i), 10)
 
-			res := insertCreateCredential(*pd3, db, "Org_0")
-			Expect(res).Should(BeTrue())
+		scv := &common.ColumnVal{
+			Value: "app_credential_" + result,
+			Type:  1,
 		}
-		k = j
+		srvItems["id"] = scv
+
+		scv = &common.ColumnVal{
+			Value: "application_id_" + result,
+			Type:  1,
+		}
+		srvItems["app_id"] = scv
+
+		scv = &common.ColumnVal{
+			Value: "approved",
+			Type:  1,
+		}
+		srvItems["status"] = scv
+
+		scv = &common.ColumnVal{
+			Value: "Org_0",
+			Type:  1,
+		}
+		srvItems["_apid_scope"] = scv
+
+		scv = &common.ColumnVal{
+			Value: "tenant_id_xxxx",
+			Type:  1,
+		}
+		srvItems["tenant_id"] = scv
+		rows = append(rows, srvItems)
+		res := insertCredentials(rows, db, txn)
+		Expect(res).Should(BeTrue())
 	}
+
+	for i := 0; i < 10; i++ {
+		var rows []common.Row
+		srvItems := common.Row{}
+		result := strconv.FormatInt(int64(i), 10)
+
+		scv := &common.ColumnVal{
+			Value: "api_product_" + result,
+			Type:  1,
+		}
+		srvItems["apiprdt_id"] = scv
+
+		scv = &common.ColumnVal{
+			Value: "application_id_" + result,
+			Type:  1,
+		}
+		srvItems["app_id"] = scv
+
+		scv = &common.ColumnVal{
+			Value: "app_credential_" + result,
+			Type:  1,
+		}
+		srvItems["appcred_id"] = scv
+		scv = &common.ColumnVal{
+			Value: "approved",
+			Type:  1,
+		}
+		srvItems["status"] = scv
+		scv = &common.ColumnVal{
+			Value: "Org_0",
+			Type:  1,
+		}
+		srvItems["_apid_scope"] = scv
+
+		scv = &common.ColumnVal{
+			Value: "tenant_id_xxxx",
+			Type:  1,
+		}
+		srvItems["tenant_id"] = scv
+		rows = append(rows, srvItems)
+		res := insertAPIProductMappers(rows, db, txn)
+		Expect(res).Should(BeTrue())
+	}
+
 }
diff --git a/init.go b/init.go
index 5c243ce..bae3a3f 100644
--- a/init.go
+++ b/init.go
@@ -7,7 +7,7 @@
 )
 
 const (
-	apiPath = "/verifyAPIKey"
+	apiPath = "/verifiers/apikey"
 )
 
 var (
@@ -33,7 +33,7 @@
 	}
 
 	var count int
-	row := db.QueryRow("SELECT count(*) FROM sqlite_master WHERE type='table' AND name='company';")
+	row := db.QueryRow("SELECT count(*) FROM sqlite_master WHERE type='table' AND name='API_PRODUCT' COLLATE NOCASE;")
 	if err := row.Scan(&count); err != nil {
 		log.Panic("Unable to setup database", err)
 	}
@@ -50,7 +50,111 @@
 }
 
 func createTables(db *sql.DB) {
-	_, err := db.Exec("CREATE TABLE COMPANY (org varchar(255), id varchar(255), PRIMARY KEY (id, org));CREATE TABLE DEVELOPER (org varchar(255), email varchar(255), id varchar(255), sts varchar(255), username varchar(255), firstname varchar(255), lastname varchar(255), apigee_scope varchar(255), enc_password varchar(255), salt varchar(255), created_at integer, created_by varchar(255), updated_at integer, updated_by varchar(255), PRIMARY KEY (id, org));CREATE TABLE APP (org varchar(255), id varchar(255), dev_id varchar(255) null, cmp_id varchar(255) null, display_name varchar(255), apigee_scope varchar(255), type varchar(255), access_type varchar(255), cback_url varchar(255), status varchar(255), name varchar(255), app_family varchar(255), created_at integer, created_by varchar(255), updated_at integer, updated_by varchar(255), PRIMARY KEY (id, org), FOREIGN KEY (dev_id, org) references DEVELOPER (id, org) ON DELETE CASCADE);CREATE TABLE APP_CREDENTIAL (org varchar(255), id varchar(255), app_id varchar(255), cons_secret varchar(255), method_type varchar(255), status varchar(255), issued_at integer, expire_at integer, created_at integer, created_by varchar(255), updated_at integer, updated_by varchar(255), PRIMARY KEY (id, org), FOREIGN KEY (app_id, org) references app (id, org) ON DELETE CASCADE);CREATE TABLE API_PRODUCT (org varchar(255), id varchar(255), res_names varchar(255), env varchar(255), PRIMARY KEY (id, org));CREATE TABLE COMPANY_DEVELOPER (org varchar(255), dev_id varchar(255), id varchar(255), cmpny_id varchar(255), PRIMARY KEY (id, org), FOREIGN KEY (cmpny_id) references company(id) ON DELETE CASCADE, FOREIGN KEY (dev_id, org) references DEVELOPER(id, org) ON DELETE CASCADE);CREATE TABLE APP_AND_API_PRODUCT_MAPPER (org varchar(255), api_prdt_id varchar(255), app_id varchar(255), app_cred_id varchar(255), api_prdt_status varchar(255), PRIMARY KEY (org, api_prdt_id, app_id, app_cred_id), FOREIGN KEY (api_prdt_id, org) references api_product(id, org) ON DELETE CASCADE, FOREIGN KEY (app_cred_id, org) references app_credential(id, org) ON DELETE CASCADE, FOREIGN KEY (app_id, org) references app(id, org) ON DELETE CASCADE);")
+	_, err := db.Exec(`
+CREATE TABLE api_product (
+    id text,
+    tenant_id text,
+    name text,
+    display_name text,
+    description text,
+    api_resources text[],
+    approval_type text,
+    _apid_scope text,
+    proxies text[],
+    environments text[],
+    quota text,
+    quota_time_unit text,
+    quota_interval int,
+    created_at int64,
+    created_by text,
+    updated_at int64,
+    updated_by text,
+    PRIMARY KEY (tenant_id, id));
+CREATE TABLE developer (
+    id text,
+    tenant_id text,
+    username text,
+    first_name text,
+    last_name text,
+    password text,
+    email text,
+    status text,
+    encrypted_password text,
+    salt text,
+    _apid_scope text,
+    created_at int64,
+    created_by text,
+    updated_at int64,
+    updated_by text,
+    PRIMARY KEY (tenant_id, id)
+);
+CREATE TABLE company (
+    id text,
+    tenant_id text,
+    name text,
+    display_name text,
+    status text,
+    created_at int64,
+    created_by text,
+    updated_at int64,
+    updated_by text,
+    _apid_scope text,
+    PRIMARY KEY (tenant_id, id)
+);
+CREATE TABLE company_developer (
+     tenant_id text,
+     company_id text,
+     developer_id text,
+    roles text[],
+    created_at int64,
+    created_by text,
+    updated_at int64,
+    updated_by text,
+    _apid_scope text,
+    PRIMARY KEY (tenant_id, company_id,developer_id)
+);
+CREATE TABLE app (
+    id text,
+    tenant_id text,
+    name text,
+    display_name text,
+    access_type text,
+    callback_url text,
+    status text,
+    app_family text,
+    company_id text,
+    developer_id text,
+    type int,
+    created_at int64,
+    created_by text,
+    updated_at int64,
+    updated_by text,
+    _apid_scope text,
+    PRIMARY KEY (tenant_id, id)
+);
+CREATE TABLE app_credential (
+    id text,
+    tenant_id text,
+    consumer_secret text,
+    app_id text,
+    method_type text,
+    status text,
+    issued_at int64,
+    expires_at int64,
+    app_status text,
+    _apid_scope text,
+    PRIMARY KEY (tenant_id, id)
+);
+CREATE TABLE app_credential_apiproduct_mapper (
+    tenant_id text,
+    appcred_id text,
+    app_id text,
+    apiprdt_id text,
+    _apid_scope text,
+    status text,
+    PRIMARY KEY (appcred_id, app_id, apiprdt_id,tenant_id)
+);
+`)
 	if err != nil {
 		log.Panic("Unable to initialize DB", err)
 	}
diff --git a/listener.go b/listener.go
index 6aec26f..9908f8d 100644
--- a/listener.go
+++ b/listener.go
@@ -2,9 +2,8 @@
 
 import (
 	"database/sql"
-	"encoding/json"
 	"github.com/30x/apid"
-	"github.com/30x/apidApigeeSync"
+	"github.com/apigee-labs/transicator/common"
 )
 
 type handler struct {
@@ -14,241 +13,475 @@
 	return "verifyAPIKey"
 }
 
-// todo: The following was basically just copied from old APID - needs review.
-
 func (h *handler) Handle(e apid.Event) {
-	changeSet, ok := e.(*apidApigeeSync.ChangeSet)
-	if !ok {
-		log.Errorf("Received non-ChangeSet event. This shouldn't happen!")
+
+	res := true
+	db, err := data.DB()
+	if err != nil {
+		panic("Unable to access Sqlite DB")
+	}
+
+	txn, err := db.Begin()
+	if err != nil {
+		log.Error("Unable to create Sqlite transaction")
 		return
 	}
 
-	log.Debugf("apigeeSyncEvent: %d changes", len(changeSet.Changes))
-
-	db, err := data.DB()
-	if err != nil {
-		panic("help me!") // todo: handle
-	}
-
-	for _, payload := range changeSet.Changes {
-
-		org := payload.Data.PldCont.Organization
-
-		switch payload.Data.EntityType {
-		case "developer":
-			switch payload.Data.Operation {
-			case "create":
-				insertCreateDeveloper(payload.Data, db, org)
-			}
-
-		case "app":
-			switch payload.Data.Operation {
-			case "create":
-				insertCreateApplication(payload.Data, db, org)
-			}
-
-		case "credential":
-			switch payload.Data.Operation {
-			case "create":
-				insertCreateCredential(payload.Data, db, org)
-
-			case "delete":
-				deleteCredential(payload.Data, db, org)
-			}
-
-		case "apiproduct":
-			switch payload.Data.Operation {
-			case "create":
-				insertAPIproduct(payload.Data, db, org)
-			}
+	snapData, ok := e.(*common.Snapshot)
+	if ok {
+		res = processSnapshot(snapData, txn)
+	} else {
+		changeSet, ok := e.(*common.ChangeList)
+		if ok {
+			res = processChange(changeSet, txn)
+		} else {
+			log.Errorf("Received Invalid event. This shouldn't happen!")
 		}
-
 	}
+	if res == true {
+		txn.Commit()
+	} else {
+		txn.Rollback()
+	}
+	return
+}
+
+func processSnapshot(snapshot *common.Snapshot, txn *sql.Tx) bool {
+
+	res := true
+	log.Debugf("Process Snapshot data")
+	/*
+	 * Iterate the tables, and insert the rows,
+	 * Commit them in bulk.
+	 */
+	for _, payload := range snapshot.Tables {
+		switch payload.Name {
+		case "kms.developer":
+			res = insertDevelopers(payload.Rows, txn)
+		case "kms.app":
+			res = insertApplications(payload.Rows, txn)
+		case "kms.app_credential":
+			res = insertCredentials(payload.Rows, txn)
+		case "kms.api_product":
+			res = insertAPIproducts(payload.Rows, txn)
+		case "kms.app_credential_apiproduct_mapper":
+			res = insertAPIProductMappers(payload.Rows, txn)
+		}
+		if res == false {
+			log.Error("Error encountered in Downloading Snapshot for VerifyApiKey")
+			return false
+		}
+	}
+	log.Debug("Downloading Snapshot for VerifyApiKey complete")
+	return true
 }
 
 /*
- * INSERT INTO APP_CREDENTIAL op
+ * Performs bulk insert of credentials
  */
-func insertCreateCredential(ele apidApigeeSync.DataPayload, db *sql.DB, org string) bool {
+func insertCredentials(rows []common.Row, txn *sql.Tx) bool {
 
-	txn, _ := db.Begin()
-	isPass := true
-	_, err := txn.Exec("INSERT INTO APP_CREDENTIAL (org, id, app_id, cons_secret, status, issued_at)VALUES(?,?,?,?,?,?);",
-		org,
-		ele.EntityIdentifier,
-		ele.PldCont.AppId,
-		ele.PldCont.ConsumerSecret,
-		ele.PldCont.Status,
-		ele.PldCont.IssuedAt)
+	var scope, id, appId, consumerSecret, appstatus, status, tenantId string
+	var issuedAt int64
 
+	prep, err := txn.Prepare("INSERT INTO APP_CREDENTIAL (_apid_scope, id, app_id, consumer_secret, app_status, status, issued_at, tenant_id)VALUES($1,$2,$3,$4,$5,$6,$7,$8);")
 	if err != nil {
-		isPass = false
-		log.Error("INSERT CRED Failed: ", ele.EntityIdentifier, org, ")", err)
-		goto OT
-	} else {
-		log.Info("INSERT CRED Success: (", ele.EntityIdentifier, org, ")")
+		log.Error("INSERT Cred Failed: ", err)
+		return false
 	}
-
-	/*
-	 * If the credentials has been successfully inserted, insert the
-	 * mapping entries associated with the credential
-	 */
-
-	for _, elem := range ele.PldCont.ApiProducts {
-
-		_, err = txn.Exec("INSERT INTO APP_AND_API_PRODUCT_MAPPER (org, api_prdt_id, app_id, app_cred_id, api_prdt_status) VALUES(?,?,?,?,?);",
-			org,
-			elem.ApiProduct,
-			ele.PldCont.AppId,
-			ele.EntityIdentifier,
-			elem.Status)
+	defer prep.Close()
+	for _, ele := range rows {
+		ele.Get("_apid_scope", &scope)
+		ele.Get("id", &id)
+		ele.Get("app_id", &appId)
+		ele.Get("consumer_secret", &consumerSecret)
+		ele.Get("app_status", &appstatus)
+		ele.Get("status", &status)
+		ele.Get("issued_at", &issuedAt)
+		ele.Get("tenant_id", &tenantId)
+		_, err = txn.Stmt(prep).Exec(
+			scope,
+			id,
+			appId,
+			consumerSecret,
+			appstatus,
+			status,
+			issuedAt,
+			tenantId)
 
 		if err != nil {
-			isPass = false
-			log.Error("INSERT APP_AND_API_PRODUCT_MAPPER Failed: (",
-				org,
-				elem.ApiProduct,
-				ele.PldCont.AppId,
-				ele.EntityIdentifier,
+			log.Error("INSERT CRED Failed: ", id, ", ", scope, ")", err)
+			return false
+		} else {
+			log.Debug("INSERT CRED Success: (", id, ", ", scope, ")")
+		}
+	}
+	return true
+}
+
+/*
+ * Performs Bulk insert of Applications
+ */
+func insertApplications(rows []common.Row, txn *sql.Tx) bool {
+
+	var scope, EntityIdentifier, DeveloperId, CallbackUrl, Status, AppName, AppFamily, tenantId, CreatedBy, LastModifiedBy string
+	var CreatedAt, LastModifiedAt int64
+
+	prep, err := txn.Prepare("INSERT INTO APP (_apid_scope, id, developer_id,callback_url,status, name, app_family, created_at, created_by,updated_at, updated_by,tenant_id) VALUES($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12);")
+	if err != nil {
+		log.Error("INSERT APP Failed: ", err)
+		return false
+	}
+
+	defer prep.Close()
+	for _, ele := range rows {
+
+		ele.Get("_apid_scope", &scope)
+		ele.Get("id", &EntityIdentifier)
+		ele.Get("developer_id", &DeveloperId)
+		ele.Get("callback_url", &CallbackUrl)
+		ele.Get("status", &Status)
+		ele.Get("name", &AppName)
+		ele.Get("app_family", &AppFamily)
+		ele.Get("created_at", &CreatedAt)
+		ele.Get("created_by", &CreatedBy)
+		ele.Get("updated_at", &LastModifiedAt)
+		ele.Get("updated_by", &LastModifiedBy)
+		ele.Get("tenant_id", &tenantId)
+
+		_, err = txn.Stmt(prep).Exec(
+			scope,
+			EntityIdentifier,
+			DeveloperId,
+			CallbackUrl,
+			Status,
+			AppName,
+			AppFamily,
+			CreatedAt,
+			CreatedBy,
+			LastModifiedAt,
+			LastModifiedBy,
+			tenantId)
+
+		if err != nil {
+			log.Error("INSERT APP Failed: (", EntityIdentifier, ", ", tenantId, ")", err)
+			return false
+		} else {
+			log.Debug("INSERT APP Success: (", EntityIdentifier, ", ", tenantId, ")")
+		}
+	}
+	return true
+
+}
+
+/*
+ * Performs bulk insert of Developers
+ */
+func insertDevelopers(rows []common.Row, txn *sql.Tx) bool {
+
+	var scope, EntityIdentifier, Email, Status, UserName, FirstName, LastName, tenantId, CreatedBy, LastModifiedBy, Username string
+	var CreatedAt, LastModifiedAt int64
+
+	prep, err := txn.Prepare("INSERT INTO DEVELOPER (_apid_scope,email,id,tenant_id,status,username,first_name,last_name,created_at,created_by,updated_at,updated_by) VALUES($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12);")
+	if err != nil {
+		log.Error("INSERT DEVELOPER Failed: ", err)
+		return false
+	}
+
+	defer prep.Close()
+	for _, ele := range rows {
+
+		ele.Get("_apid_scope", &scope)
+		ele.Get("email", &Email)
+		ele.Get("id", &EntityIdentifier)
+		ele.Get("tenant_id", &tenantId)
+		ele.Get("status", &Status)
+		ele.Get("username", &Username)
+		ele.Get("first_name", &FirstName)
+		ele.Get("last_name", &LastName)
+		ele.Get("created_at", &CreatedAt)
+		ele.Get("created_by", &CreatedBy)
+		ele.Get("updated_at", &LastModifiedAt)
+		ele.Get("updated_by", &LastModifiedBy)
+
+		_, err = txn.Stmt(prep).Exec(
+			scope,
+			Email,
+			EntityIdentifier,
+			tenantId,
+			Status,
+			UserName,
+			FirstName,
+			LastName,
+			CreatedAt,
+			CreatedBy,
+			LastModifiedAt,
+			LastModifiedBy)
+
+		if err != nil {
+			log.Error("INSERT DEVELOPER Failed: (", EntityIdentifier, ", ", scope, ")", err)
+			return false
+		} else {
+			log.Debug("INSERT DEVELOPER Success: (", EntityIdentifier, ", ", scope, ")")
+		}
+	}
+	return true
+}
+
+/*
+ * Performs Bulk insert of API products
+ */
+func insertAPIproducts(rows []common.Row, txn *sql.Tx) bool {
+
+	var scope, apiProduct, res, env, tenantId string
+
+	prep, err := txn.Prepare("INSERT INTO API_PRODUCT (id, api_resources, environments, tenant_id,_apid_scope) VALUES($1,$2,$3,$4,$5)")
+	if err != nil {
+		log.Error("INSERT API_PRODUCT Failed: ", err)
+		return false
+	}
+
+	defer prep.Close()
+	for _, ele := range rows {
+
+		ele.Get("_apid_scope", &scope)
+		ele.Get("id", &apiProduct)
+		ele.Get("api_resources", &res)
+		ele.Get("environments", &env)
+		ele.Get("tenant_id", &tenantId)
+
+		_, err = txn.Stmt(prep).Exec(
+			apiProduct,
+			res,
+			env,
+			tenantId,
+			scope)
+
+		if err != nil {
+			log.Error("INSERT API_PRODUCT Failed: (", apiProduct, ", ", tenantId, ")", err)
+			return false
+		} else {
+			log.Debug("INSERT API_PRODUCT Success: (", apiProduct, ", ", tenantId, ")")
+		}
+	}
+	return true
+}
+
+/*
+ * Performs a bulk insert of all APP_CREDENTIAL_APIPRODUCT_MAPPER rows
+ */
+func insertAPIProductMappers(rows []common.Row, txn *sql.Tx) bool {
+
+	var ApiProduct, AppId, EntityIdentifier, tenantId, Scope, Status string
+
+	prep, err := txn.Prepare("INSERT INTO APP_CREDENTIAL_APIPRODUCT_MAPPER(apiprdt_id, app_id, appcred_id, tenant_id, _apid_scope, status) VALUES($1,$2,$3,$4,$5,$6);")
+	if err != nil {
+		log.Error("INSERT APP_CREDENTIAL_APIPRODUCT_MAPPER Failed: ", err)
+		return false
+	}
+
+	defer prep.Close()
+	for _, ele := range rows {
+
+		ele.Get("apiprdt_id", &ApiProduct)
+		ele.Get("app_id", &AppId)
+		ele.Get("appcred_id", &EntityIdentifier)
+		ele.Get("tenant_id", &tenantId)
+		ele.Get("_apid_scope", &Scope)
+		ele.Get("status", &Status)
+
+		/*
+		 * If the credentials has been successfully inserted, insert the
+		 * mapping entries associated with the credential
+		 */
+
+		_, err = txn.Stmt(prep).Exec(
+			ApiProduct,
+			AppId,
+			EntityIdentifier,
+			tenantId,
+			Scope,
+			Status)
+
+		if err != nil {
+			log.Error("INSERT APP_CREDENTIAL_APIPRODUCT_MAPPER Failed: (",
+				ApiProduct, ", ",
+				AppId, ", ",
+				EntityIdentifier, ", ",
+				tenantId, ", ",
+				Scope, ", ",
+				Status,
 				")",
 				err)
-			break
+
+			return false
 		} else {
-			log.Info("INSERT APP_AND_API_PRODUCT_MAPPER Success: (",
-				org,
-				elem.ApiProduct,
-				ele.PldCont.AppId,
-				ele.EntityIdentifier,
+			log.Debug("INSERT APP_CREDENTIAL_APIPRODUCT_MAPPER Success: (",
+				ApiProduct, ", ",
+				AppId, ", ",
+				EntityIdentifier, ", ",
+				tenantId, ", ",
+				Scope, ", ",
+				Status,
 				")")
 		}
 	}
-OT:
-	if isPass == true {
-		txn.Commit()
-	} else {
-		txn.Rollback()
-	}
-	return isPass
+	return true
+}
 
+func processChange(changes *common.ChangeList, txn *sql.Tx) bool {
+
+	var rows []common.Row
+	res := true
+
+	log.Debugf("apigeeSyncEvent: %d changes", len(changes.Changes))
+	for _, payload := range changes.Changes {
+		rows = nil
+		switch payload.Table {
+		case "kms.developer":
+			switch payload.Operation {
+			case common.Insert:
+				rows = append(rows, payload.NewRow)
+				res = insertDevelopers(rows, txn)
+
+			case common.Update:
+				res = deleteObject("DEVELOPER", payload.OldRow, txn)
+				rows = append(rows, payload.NewRow)
+				res = insertDevelopers(rows, txn)
+
+			case common.Delete:
+				res = deleteObject("DEVELOPER", payload.OldRow, txn)
+			}
+		case "kms.app":
+			switch payload.Operation {
+			case common.Insert:
+				rows = append(rows, payload.NewRow)
+				res = insertApplications(rows, txn)
+
+			case common.Update:
+				res = deleteObject("APP", payload.OldRow, txn)
+				rows = append(rows, payload.NewRow)
+				res = insertApplications(rows, txn)
+
+			case common.Delete:
+				res = deleteObject("APP", payload.OldRow, txn)
+			}
+
+		case "kms.app_credential":
+			switch payload.Operation {
+			case common.Insert:
+				rows = append(rows, payload.NewRow)
+				res = insertCredentials(rows, txn)
+
+			case common.Update:
+				res = deleteObject("APP_CREDENTIAL", payload.OldRow, txn)
+				rows = append(rows, payload.NewRow)
+				res = insertCredentials(rows, txn)
+
+			case common.Delete:
+				res = deleteObject("APP_CREDENTIAL", payload.OldRow, txn)
+			}
+		case "kms.api_product":
+			switch payload.Operation {
+			case common.Insert:
+				rows = append(rows, payload.NewRow)
+				res = insertAPIproducts(rows, txn)
+
+			case common.Update:
+				res = deleteObject("API_PRODUCT", payload.OldRow, txn)
+				rows = append(rows, payload.NewRow)
+				res = insertAPIproducts(rows, txn)
+
+			case common.Delete:
+				res = deleteObject("API_PRODUCT", payload.OldRow, txn)
+			}
+
+		case "kms.app_credential_apiproduct_mapper":
+			switch payload.Operation {
+			case common.Insert:
+				rows = append(rows, payload.NewRow)
+				res = insertAPIProductMappers(rows, txn)
+
+			case common.Update:
+				res = deleteAPIproductMapper(payload.OldRow, txn)
+				rows = append(rows, payload.NewRow)
+				res = insertAPIProductMappers(rows, txn)
+
+			case common.Delete:
+				res = deleteAPIproductMapper(payload.OldRow, txn)
+			}
+		}
+		if res == false {
+			log.Error("Sql Operation error. Operation rollbacked")
+			return false
+		}
+	}
+	return true
 }
 
 /*
- * DELETE CRED
+ * DELETE OBJECT as passed in the input
  */
-func deleteCredential(ele apidApigeeSync.DataPayload, db *sql.DB, org string) bool {
+func deleteObject(object string, ele common.Row, txn *sql.Tx) bool {
 
-	txn, _ := db.Begin()
-
-	_, err := txn.Exec("DELETE FROM APP_CREDENTIAL WHERE org=? AND id=?;", org, ele.EntityIdentifier)
-
+	var scope, apiProduct string
+	ssql := "DELETE FROM " + object + " WHERE id = $1 AND _apid_scope = $2"
+	prep, err := txn.Prepare(ssql)
 	if err != nil {
-		log.Error("DELETE CRED Failed: (", ele.EntityIdentifier, org, ")", err)
-		txn.Rollback()
+		log.Error("DELETE ", object, " Failed: ", err)
+		return false
+	}
+	defer prep.Close()
+	ele.Get("_apid_scope", &scope)
+	ele.Get("id", &apiProduct)
+
+	_, err = txn.Stmt(prep).Exec(apiProduct, scope)
+	if err != nil {
+		log.Error("DELETE ", object, " Failed: (", apiProduct, ", ", scope, ")", err)
 		return false
 	} else {
-		log.Info("DELETE CRED Success: (", ele.EntityIdentifier, org, ")")
-		txn.Commit()
+		log.Debug("DELETE ", object, " Success: (", apiProduct, ", ", scope, ")")
 		return true
 	}
 
 }
 
 /*
- * Helper function to convert string slice in to JSON format
+ * DELETE  APIPRDT MAPPER
  */
-func convertSlicetoStringFormat(inpslice []string) string {
+func deleteAPIproductMapper(ele common.Row, txn *sql.Tx) bool {
+	var ApiProduct, AppId, EntityIdentifier, apid_scope string
 
-	bytes, _ := json.Marshal(inpslice)
-	return string(bytes)
-}
-
-/*
- * INSERT INTO API product op
- */
-func insertAPIproduct(ele apidApigeeSync.DataPayload, db *sql.DB, org string) bool {
-
-	txn, _ := db.Begin()
-	restr := convertSlicetoStringFormat(ele.PldCont.Resources)
-	envstr := convertSlicetoStringFormat(ele.PldCont.Environments)
-
-	_, err := txn.Exec("INSERT INTO API_PRODUCT (org, id, res_names, env) VALUES(?,?,?,?)",
-		org,
-		ele.PldCont.AppName,
-		restr,
-		envstr)
-
+	prep, err := txn.Prepare("DELETE FROM APP_CREDENTIAL_APIPRODUCT_MAPPER WHERE apiprdt_id=$1 AND app_id=$2 AND appcred_id=$3 AND _apid_scope=$4;")
 	if err != nil {
-		log.Error("INSERT API_PRODUCT Failed: (", ele.PldCont.AppName, org, ")", err)
-		txn.Rollback()
+		log.Error("DELETE APP_CREDENTIAL_APIPRODUCT_MAPPER Failed: ", err)
 		return false
-	} else {
-		log.Info("INSERT API_PRODUCT Success: (", ele.PldCont.AppName, org, ")")
-		txn.Commit()
-		return true
 	}
 
-}
+	defer prep.Close()
 
-/*
- * INSERT INTO APP op
- */
-func insertCreateApplication(ele apidApigeeSync.DataPayload, db *sql.DB, org string) bool {
+	ele.Get("apiprdt_id", &ApiProduct)
+	ele.Get("app_id", &AppId)
+	ele.Get("appcred_id", &EntityIdentifier)
+	ele.Get("_apid_scope", &apid_scope)
 
-	txn, _ := db.Begin()
-
-	_, err := txn.Exec("INSERT INTO APP (org, id, dev_id,cback_url,status, name, app_family, created_at, created_by,updated_at, updated_by) VALUES(?,?,?,?,?,?,?,?,?,?,?);",
-		org,
-		ele.EntityIdentifier,
-		ele.PldCont.DeveloperId,
-		ele.PldCont.CallbackUrl,
-		ele.PldCont.Status,
-		ele.PldCont.AppName,
-		ele.PldCont.AppFamily,
-		ele.PldCont.CreatedAt,
-		ele.PldCont.CreatedBy,
-		ele.PldCont.LastModifiedAt,
-		ele.PldCont.LastModifiedBy)
-
+	_, err = txn.Stmt(prep).Exec(ApiProduct, AppId, EntityIdentifier, apid_scope)
 	if err != nil {
-		log.Error("INSERT APP Failed: (", ele.EntityIdentifier, org, ")", err)
-		txn.Rollback()
+		log.Error("DELETE APP_CREDENTIAL_APIPRODUCT_MAPPER Failed: (",
+			ApiProduct, ", ",
+			AppId, ", ",
+			EntityIdentifier, ", ",
+			apid_scope,
+			")",
+			err)
 		return false
 	} else {
-		log.Info("INSERT APP Success: (", ele.EntityIdentifier, org, ")")
-		txn.Commit()
+		log.Debug("DELETE APP_CREDENTIAL_APIPRODUCT_MAPPER Success: (",
+			ApiProduct, ", ",
+			AppId, ", ",
+			EntityIdentifier, ", ",
+			apid_scope,
+			")")
 		return true
 	}
-
-}
-
-/*
- * INSERT INTO DEVELOPER op
- */
-func insertCreateDeveloper(ele apidApigeeSync.DataPayload, db *sql.DB, org string) bool {
-
-	txn, _ := db.Begin()
-
-	_, err := txn.Exec("INSERT INTO DEVELOPER (org, email, id, sts, username, firstname, lastname, created_at,created_by, updated_at, updated_by) VALUES(?,?,?,?,?,?,?,?,?,?,?);",
-		org,
-		ele.PldCont.Email,
-		ele.EntityIdentifier,
-		ele.PldCont.Status,
-		ele.PldCont.UserName,
-		ele.PldCont.FirstName,
-		ele.PldCont.LastName,
-		ele.PldCont.CreatedAt,
-		ele.PldCont.CreatedBy,
-		ele.PldCont.LastModifiedAt,
-		ele.PldCont.LastModifiedBy)
-
-	if err != nil {
-		log.Error("INSERT DEVELOPER Failed: (", ele.PldCont.UserName, org, ")", err)
-		txn.Rollback()
-		return false
-	} else {
-		log.Info("INSERT DEVELOPER Success: (", ele.PldCont.UserName, org, ")")
-		txn.Commit()
-		return true
-	}
-
 }
diff --git a/listener_test.go b/listener_test.go
index cb283d7..6a51136 100644
--- a/listener_test.go
+++ b/listener_test.go
@@ -4,105 +4,251 @@
 	"encoding/json"
 	"github.com/30x/apid"
 	. "github.com/30x/apidApigeeSync" // for direct access to Payload types
+	"github.com/apigee-labs/transicator/common"
 	. "github.com/onsi/ginkgo"
 	. "github.com/onsi/gomega"
 )
 
+var count int = 0
 var _ = Describe("listener", func() {
 
 	It("should store data from ApigeeSync in the database", func(done Done) {
 
-		var event = ChangeSet{}
-		event.Changes = []ChangePayload{
+		var event = common.ChangeList{}
+		var event2 = common.ChangeList{}
+
+		/* API Product */
+		srvItems := common.Row{}
+		scv := &common.ColumnVal{
+			Value: "ch_api_product_0",
+			Type:  1,
+		}
+		srvItems["id"] = scv
+
+		scv = &common.ColumnVal{
+			Value: "{}",
+			Type:  1,
+		}
+		srvItems["api_resources"] = scv
+
+		scv = &common.ColumnVal{
+			Value: "{Env_0, Env_1}",
+			Type:  1,
+		}
+		srvItems["environments"] = scv
+
+		scv = &common.ColumnVal{
+			Value: "tenant_id_0",
+			Type:  1,
+		}
+		srvItems["tenant_id"] = scv
+
+		scv = &common.ColumnVal{
+			Value: "test_org0",
+			Type:  1,
+		}
+		srvItems["_apid_scope"] = scv
+
+		/* DEVELOPER */
+		devItems := common.Row{}
+		scv = &common.ColumnVal{
+			Value: "ch_developer_id_0",
+			Type:  1,
+		}
+		devItems["id"] = scv
+
+		scv = &common.ColumnVal{
+			Value: "Active",
+			Type:  1,
+		}
+		devItems["status"] = scv
+
+		scv = &common.ColumnVal{
+			Value: "tenant_id_0",
+			Type:  1,
+		}
+		devItems["tenant_id"] = scv
+
+		scv = &common.ColumnVal{
+			Value: "test_org0",
+			Type:  1,
+		}
+		devItems["_apid_scope"] = scv
+
+		/* APP */
+		appItems := common.Row{}
+		scv = &common.ColumnVal{
+			Value: "ch_application_id_0",
+			Type:  1,
+		}
+		appItems["id"] = scv
+
+		scv = &common.ColumnVal{
+			Value: "ch_developer_id_0",
+			Type:  1,
+		}
+		appItems["developer_id"] = scv
+
+		scv = &common.ColumnVal{
+			Value: "tenant_id_0",
+			Type:  1,
+		}
+		appItems["tenant_id"] = scv
+
+		scv = &common.ColumnVal{
+			Value: "Approved",
+			Type:  1,
+		}
+		appItems["status"] = scv
+
+		scv = &common.ColumnVal{
+			Value: "test_org0",
+			Type:  1,
+		}
+		appItems["_apid_scope"] = scv
+
+		/* CRED */
+		credItems := common.Row{}
+		scv = &common.ColumnVal{
+			Value: "ch_app_credential_0",
+			Type:  1,
+		}
+		credItems["id"] = scv
+
+		scv = &common.ColumnVal{
+			Value: "ch_application_id_0",
+			Type:  1,
+		}
+		credItems["app_id"] = scv
+
+		scv = &common.ColumnVal{
+			Value: "tenant_id_0",
+			Type:  1,
+		}
+		credItems["tenant_id"] = scv
+
+		scv = &common.ColumnVal{
+			Value: "Approved",
+			Type:  1,
+		}
+		credItems["status"] = scv
+
+		scv = &common.ColumnVal{
+			Value: "test_org0",
+			Type:  1,
+		}
+		credItems["_apid_scope"] = scv
+
+		/* APP_CRED_APIPRD_MAPPER */
+		mpItems := common.Row{}
+		scv = &common.ColumnVal{
+			Value: "ch_api_product_0",
+			Type:  1,
+		}
+		mpItems["apiprdt_id"] = scv
+
+		scv = &common.ColumnVal{
+			Value: "ch_application_id_0",
+			Type:  1,
+		}
+		mpItems["app_id"] = scv
+
+		scv = &common.ColumnVal{
+			Value: "ch_app_credential_0",
+			Type:  1,
+		}
+		mpItems["appcred_id"] = scv
+
+		scv = &common.ColumnVal{
+			Value: "Approved",
+			Type:  1,
+		}
+		mpItems["status"] = scv
+
+		scv = &common.ColumnVal{
+			Value: "test_org0",
+			Type:  1,
+		}
+		mpItems["_apid_scope"] = scv
+
+		event.Changes = []common.Change{
 			{
-				Data: DataPayload{
-					EntityType: "apiproduct",
-					Operation: "create",
-					PldCont: Payload{
-						Organization: "test_org",
-						AppName:      "Api_product_sync",
-						Resources:    []string{"/**", "/test"},
-						Environments: []string{"Env_0", "Env_1"},
-					},
-				},
+				Table:     "kms.api_product",
+				NewRow:    srvItems,
+				Operation: 1,
 			},
 			{
-				Data: DataPayload{
-					EntityType: "developer",
-					Operation: "create",
-					EntityIdentifier: "developer_id_sync",
-					PldCont: Payload{
-						Organization: "test_org",
-						Email:     "person_sync@apigee.com",
-						Status:    "Active",
-						UserName:  "user_sync",
-						FirstName: "user_first_name_sync",
-						LastName:  "user_last_name_sync",
-					},
-				},
+				Table:     "kms.developer",
+				NewRow:    devItems,
+				Operation: 1,
 			},
 			{
-				Data: DataPayload{
-					EntityType: "app",
-					Operation: "create",
-					EntityIdentifier: "application_id_sync",
-					PldCont: Payload{
-						Organization: "test_org",
-						Email:       "person_sync@apigee.com",
-						Status:      "Approved",
-						AppName:     "application_id_sync",
-						DeveloperId: "developer_id_sync",
-						CallbackUrl: "call_back_url",
-					},
-				},
+				Table:     "kms.app",
+				NewRow:    appItems,
+				Operation: 1,
 			},
 			{
-				Data: DataPayload{
-					EntityType: "credential",
-					Operation: "create",
-					EntityIdentifier: "credential_sync",
-					PldCont: Payload{
-						Organization: "test_org",
-						AppId:          "application_id_sync",
-						Status:         "Approved",
-						ConsumerSecret: "consumer_secret_sync",
-						IssuedAt:       349583485,
-						ApiProducts:    []Apip{
-							{
-								ApiProduct: "Api_product_sync",
-								Status: "Approved",
-							},
-						},
-					},
-				},
+				Table:     "kms.app_credential",
+				NewRow:    credItems,
+				Operation: 1,
+			},
+			{
+				Table:     "kms.app_credential_apiproduct_mapper",
+				NewRow:    mpItems,
+				Operation: 1,
 			},
 		}
 
+		event2.Changes = []common.Change{
+			{
+				Table:     "kms.api_product",
+				OldRow:    srvItems,
+				Operation: 3,
+			},
+			{
+				Table:     "kms.developer",
+				OldRow:    devItems,
+				Operation: 3,
+			},
+			{
+				Table:     "kms.app",
+				OldRow:    appItems,
+				Operation: 3,
+			},
+			{
+				Table:     "kms.app_credential",
+				OldRow:    credItems,
+				Operation: 3,
+			},
+			{
+				Table:     "kms.app_credential_apiproduct_mapper",
+				OldRow:    mpItems,
+				Operation: 3,
+			},
+		}
 		h := &test_handler{
-			"checkDatabase",
+			"checkDatabase post Insertion",
 			func(e apid.Event) {
-
 				// ignore the first event, let standard listener process it
-				changeSet := e.(*ChangeSet)
+				changeSet := e.(*common.ChangeList)
 				if len(changeSet.Changes) > 0 {
 					return
 				}
-
-				rsp, err := verifyAPIKey("credential_sync", "/test", "Env_0", "test_org", "verify")
+				rsp, err := verifyAPIKey("ch_app_credential_0", "/test", "Env_0", "test_org0", "verify")
 				Expect(err).ShouldNot(HaveOccurred())
-
 				var respj kmsResponseSuccess
 				json.Unmarshal(rsp, &respj)
 				Expect(respj.Type).Should(Equal("APIKeyContext"))
-				Expect(respj.RspInfo.Key).Should(Equal("credential_sync"))
-
+				Expect(respj.RspInfo.Key).Should(Equal("ch_app_credential_0"))
 				close(done)
 			},
 		}
 
 		apid.Events().Listen(ApigeeSyncEventSelector, h)
-		apid.Events().Emit(ApigeeSyncEventSelector, &event) // for standard listener
-		apid.Events().Emit(ApigeeSyncEventSelector, &ChangeSet{}) // for test listener
+		apid.Events().Emit(ApigeeSyncEventSelector, &event)
+		apid.Events().Emit(ApigeeSyncEventSelector, &event2)
+		apid.Events().Emit(ApigeeSyncEventSelector, &event)
+		apid.Events().Emit(ApigeeSyncEventSelector, &common.ChangeList{})
 	})
 
 })
diff --git a/validate_env.go b/validate_env.go
index df0382d..d90e27c 100644
--- a/validate_env.go
+++ b/validate_env.go
@@ -1,15 +1,16 @@
 package apidVerifyApiKey
 
-import "encoding/json"
+import "strings"
 
 /*
  * Ensure the ENV matches.
  */
-func validateEnv(envLocal, envInPath string) bool {
+func validateEnv(envLocal string, envInPath string) bool {
 
-	var ePaths []string
-	json.Unmarshal([]byte(envLocal), &ePaths)
-	for _, a := range ePaths {
+	s := strings.TrimPrefix(envLocal, "{")
+	s = strings.TrimSuffix(s, "}")
+	fs := strings.Split(s, ",")
+	for _, a := range fs {
 		if a == envInPath {
 			return true
 		}
diff --git a/validate_env_test.go b/validate_env_test.go
index 3942d7a..268f9dd 100644
--- a/validate_env_test.go
+++ b/validate_env_test.go
@@ -8,19 +8,19 @@
 var _ = Describe("Validate Env", func() {
 
 	It("validation1", func() {
-		s := validateEnv("[\"foo\",\"bar\"]", "foo")
+		s := validateEnv("{foo,bar}", "foo")
 		Expect(s).Should(BeTrue())
 	})
 	It("validation2", func() {
-		s := validateEnv("[\"foo\",\"bar\"]", "bar")
+		s := validateEnv("{foo,bar}", "bar")
 		Expect(s).Should(BeTrue())
 	})
 	It("validation3", func() {
-		s := validateEnv("[\"foo\",\"bar\"]", "xxx")
+		s := validateEnv("{foo,bar}", "xxx")
 		Expect(s).Should(BeFalse())
 	})
 	It("validation4", func() {
-		s := validateEnv("[]", "xxx")
+		s := validateEnv("{}", "xxx")
 		Expect(s).Should(BeFalse())
 	})
 })
diff --git a/validate_path.go b/validate_path.go
index f3cfb99..cd6e021 100644
--- a/validate_path.go
+++ b/validate_path.go
@@ -1,7 +1,6 @@
 package apidVerifyApiKey
 
 import (
-	"encoding/json"
 	"regexp"
 	"strings"
 )
@@ -14,9 +13,10 @@
  */
 func validatePath(basePath, requestBase string) bool {
 
-	var basePaths []string
-	json.Unmarshal([]byte(basePath), &basePaths)
-	for _, a := range basePaths {
+	s := strings.TrimPrefix(basePath, "{")
+	s = strings.TrimSuffix(s, "}")
+	fs := strings.Split(s, ",")
+	for _, a := range fs {
 		str1 := strings.Replace(a, "**", "(.*)", -1)
 		str2 := strings.Replace(a, "*", "([^/]+)", -1)
 		if a != str1 {
@@ -39,7 +39,6 @@
 		 * FIXME: SINGLE_FORWARD_SLASH_PATTERN not supported yet
 		 */
 	}
-
 	/* if the i/p resource is empty, no checks need to be made */
-	return len(basePaths) == 0
+	return s == ""
 }
diff --git a/validate_path_test.go b/validate_path_test.go
index 0b76b07..a5e5e63 100644
--- a/validate_path_test.go
+++ b/validate_path_test.go
@@ -16,79 +16,79 @@
 		Expect(s).Should(BeTrue())
 	})
 	It("validation3", func() {
-		s := validatePath("[]", "foo")
+		s := validatePath("{}", "foo")
 		Expect(s).Should(BeTrue())
 	})
 	It("validation4", func() {
-		s := validatePath("[\"/**\"]", "/foo")
+		s := validatePath("{/**}", "/foo")
 		Expect(s).Should(BeTrue())
 	})
 	It("validation5", func() {
-		s := validatePath("[\"/**\"]", "foo")
+		s := validatePath("{/**}", "foo")
 		Expect(s).Should(BeFalse())
 	})
 	It("validation6", func() {
-		s := validatePath("[\"/**\"]", "/")
+		s := validatePath("{/**}", "/")
 		Expect(s).Should(BeTrue())
 	})
 	It("validation7", func() {
-		s := validatePath("[\"/foo/**\"]", "/")
+		s := validatePath("{/foo/**}", "/")
 		Expect(s).Should(BeFalse())
 	})
 	It("validation8", func() {
-		s := validatePath("[\"/foo/**\"]", "/foo/")
+		s := validatePath("{/foo/**}", "/foo/")
 		Expect(s).Should(BeTrue())
 	})
 	It("validation9", func() {
-		s := validatePath("[\"/foo/**\"]", "/foo/bar")
+		s := validatePath("{/foo/**}", "/foo/bar")
 		Expect(s).Should(BeTrue())
 	})
 	It("validation10", func() {
-		s := validatePath("[\"/foo/**\"]", "foo")
+		s := validatePath("{/foo/**}", "foo")
 		Expect(s).Should(BeFalse())
 	})
 	It("validation11", func() {
-		s := validatePath("[\"/foo/bar/**\"]", "/foo/bar/xx/yy")
+		s := validatePath("{/foo/bar/**}", "/foo/bar/xx/yy")
 		Expect(s).Should(BeTrue())
 	})
 	It("validation12", func() {
-		s := validatePath("[\"/foo/bar/*\"]", "/foo/bar/xxx")
+		s := validatePath("/foo/bar/*}", "/foo/bar/xxx")
 		Expect(s).Should(BeTrue())
 	})
 	It("validation13", func() {
-		s := validatePath("[\"/foo/bar/*/\"]", "/foo/bar/xxx")
+		s := validatePath("{/foo/bar/*/}", "/foo/bar/xxx")
 		Expect(s).Should(BeFalse())
 	})
 	It("validation14", func() {
-		s := validatePath("[\"/foo/bar/**\"]", "/foo/bar/xx/yy")
+		s := validatePath("{/foo/bar/**}", "/foo/bar/xx/yy")
 		Expect(s).Should(BeTrue())
 	})
 	It("validation15", func() {
-		s := validatePath("[\"/foo/*/**/\"]", "/foo/bar")
+		s := validatePath("{/foo/*/**/}", "/foo/bar")
 		Expect(s).Should(BeFalse())
 	})
 	It("validation16", func() {
-		s := validatePath("[\"/foo/bar/*/xxx\"]", "/foo/bar/yyy/xxx")
+		s := validatePath("{/foo/bar/*/xxx}", "/foo/bar/yyy/xxx")
 		Expect(s).Should(BeTrue())
 	})
 	It("validation17", func() {
-		s := validatePath("[\"/foo/bar/*/xxx/\"]", "/foo/bar/yyy/xxx")
+		s := validatePath("{/foo/bar/*/xxx/}", "/foo/bar/yyy/xxx")
 		Expect(s).Should(BeFalse())
 	})
 	It("validation18", func() {
-		s := validatePath("[\"/foo/bar/**/xxx/\"]", "/foo/bar/aaa/bbb/xxx/")
+		s := validatePath("{/foo/bar/**/xxx/}", "/foo/bar/aaa/bbb/xxx/")
 		Expect(s).Should(BeTrue())
 	})
 	It("validation19", func() {
-		s := validatePath("[\"/foo/bar/***/xxx/\"]", "/foo/bar/aaa/bbb/xxx/")
+		s := validatePath("{/foo/bar/***/xxx/}", "/foo/bar/aaa/bbb/xxx/")
 		Expect(s).Should(BeTrue())
 	})
 	It("validation20", func() {
-		s := validatePath("[\"/foo/\", \"/bar/\"]", "/foo/")
+		s := validatePath("{/foo/, /bar/}", "/foo/")
 		Expect(s).Should(BeTrue())
 	})
 	It("validation21", func() {
-		s := validatePath("[\"/foo/bar/yy*/xxx\"]", "/foo/bar/yyy/xxx")
+		s := validatePath("{/foo/bar/yy*/xxx}", "/foo/bar/yyy/xxx")
 		Expect(s).Should(BeTrue())
 	})
 })