diff --git a/api.go b/api.go
index 241e472..9bbce01 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.app_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 UPPER(c.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/init.go b/init.go
index 483fa68..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='API_PRODUCT';")
+	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)
 	}
@@ -52,26 +52,26 @@
 func createTables(db *sql.DB) {
 	_, err := db.Exec(`
 CREATE TABLE api_product (
-    id uuid,
+    id text,
     tenant_id text,
     name text,
     display_name text,
     description text,
     api_resources text[],
     approval_type text,
-    scopes text[],
+    _apid_scope text,
     proxies text[],
     environments text[],
     quota text,
     quota_time_unit text,
     quota_interval int,
-    created_at timestamp,
+    created_at int64,
     created_by text,
-    updated_at timestamp,
+    updated_at int64,
     updated_by text,
     PRIMARY KEY (tenant_id, id));
 CREATE TABLE developer (
-    id uuid,
+    id text,
     tenant_id text,
     username text,
     first_name text,
@@ -81,41 +81,40 @@
     status text,
     encrypted_password text,
     salt text,
-    created_at timestamp,
+    _apid_scope text,
+    created_at int64,
     created_by text,
-    updated_at timestamp,
+    updated_at int64,
     updated_by text,
-    PRIMARY KEY (tenant_id, id),
-    constraint developer_email_uq unique(tenant_id, email)
+    PRIMARY KEY (tenant_id, id)
 );
 CREATE TABLE company (
-    id uuid,
+    id text,
     tenant_id text,
     name text,
     display_name text,
     status text,
-    created_at timestamp,
+    created_at int64,
     created_by text,
-    updated_at timestamp,
+    updated_at int64,
     updated_by text,
-    PRIMARY KEY (tenant_id, id),
-    constraint comp_name_uq unique(tenant_id, name)
+    _apid_scope text,
+    PRIMARY KEY (tenant_id, id)
 );
 CREATE TABLE company_developer (
      tenant_id text,
-     company_id uuid,
-     developer_id uuid,
+     company_id text,
+     developer_id text,
     roles text[],
-    created_at timestamp,
+    created_at int64,
     created_by text,
-    updated_at timestamp,
+    updated_at int64,
     updated_by text,
-    PRIMARY KEY (tenant_id, company_id,developer_id),
-    FOREIGN KEY (tenant_id,company_id) references company(tenant_id,id),
-    FOREIGN KEY (tenant_id,developer_id) references developer(tenant_id,id)
+    _apid_scope text,
+    PRIMARY KEY (tenant_id, company_id,developer_id)
 );
 CREATE TABLE app (
-    id uuid,
+    id text,
     tenant_id text,
     name text,
     display_name text,
@@ -123,72 +122,37 @@
     callback_url text,
     status text,
     app_family text,
-    company_id uuid,
-    developer_id uuid,
-    type app_type,
-    created_at timestamp,
+    company_id text,
+    developer_id text,
+    type int,
+    created_at int64,
     created_by text,
-    updated_at timestamp,
+    updated_at int64,
     updated_by text,
-    PRIMARY KEY (tenant_id, id),
-    constraint app_name_uq unique(tenant_id, name),
-    FOREIGN KEY (tenant_id,company_id) references company(tenant_id,id),
-    FOREIGN KEY (tenant_id,developer_id) references developer(tenant_id,id)
+    _apid_scope text,
+    PRIMARY KEY (tenant_id, id)
 );
 CREATE TABLE app_credential (
     id text,
     tenant_id text,
     consumer_secret text,
-    app_id uuid,
+    app_id text,
     method_type text,
     status text,
-    issued_at timestamp,
-    expires_at timestamp,
+    issued_at int64,
+    expires_at int64,
     app_status text,
-    scopes text[],
-    PRIMARY KEY (tenant_id, id),
-    FOREIGN KEY (tenant_id,app_id) references app(tenant_id,id)
+    _apid_scope text,
+    PRIMARY KEY (tenant_id, id)
 );
 CREATE TABLE app_credential_apiproduct_mapper (
     tenant_id text,
     appcred_id text,
-    app_id uuid,
-    apiprdt_id uuid,
-    status appcred_apiprdt_status,
-    PRIMARY KEY (tenant_id,appcred_id,app_id,apiprdt_id),
-    FOREIGN KEY (tenant_id,appcred_id) references app_credential(tenant_id,id),
-    FOREIGN KEY (tenant_id,app_id) references app(tenant_id,id)
-);
-CREATE TABLE attributes (
-   tenant_id text,
-   dev_id uuid,
-   comp_id uuid,
-   apiprdt_id uuid,
-   app_id uuid,
-   appcred_id text,
-   type entity_type,
-   name text ,
-   value text,
-   PRIMARY KEY (tenant_id,dev_id,comp_id,apiprdt_id,app_id,appcred_id,type,name),
-   FOREIGN KEY (tenant_id,appcred_id) references app_credential(tenant_id,id),
-   FOREIGN KEY (tenant_id,app_id) references app(tenant_id,id),
-   FOREIGN KEY (tenant_id,dev_id) references developer(tenant_id,id),
-   FOREIGN KEY (tenant_id,comp_id) references company(tenant_id,id),
-   FOREIGN KEY (tenant_id,apiprdt_id) references api_product(tenant_id,id)
-);
-CREATE TABLE apidconfig (
-    id uuid,
-    consumer_key text,
-    consumer_secret text,
-    scope text[],
-    app_id uuid,
-    created_at timestamp,
-    created_by text,
-    updated_at timestamp,
-    updated_by text,
-    PRIMARY KEY(id),
-    constraint apidconfig_key_uq unique(consumer_key),
-    constraint apidconfig_appid_uq unique(app_id)
+    app_id text,
+    apiprdt_id text,
+    _apid_scope text,
+    status text,
+    PRIMARY KEY (appcred_id, app_id, apiprdt_id,tenant_id)
 );
 `)
 	if err != nil {
diff --git a/listener.go b/listener.go
index 6aec26f..6c025c7 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/30x/transicator/common"
 )
 
 type handler struct {
@@ -17,174 +16,223 @@
 // 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!")
-		return
-	}
 
-	log.Debugf("apigeeSyncEvent: %d changes", len(changeSet.Changes))
+	snapData, ok := e.(*common.Snapshot)
+	if ok {
+		processSnapshot(snapData)
+	} else {
+		changeSet, ok := e.(*common.ChangeList)
+		if ok {
+			processChange(changeSet)
+		} else {
+			log.Errorf("Received Invalid event. This shouldn't happen!")
+		}
+	}
+	return
+}
+
+func processSnapshot(snapshot *common.Snapshot) {
+
+	log.Debugf("Process Snapshot data")
 
 	db, err := data.DB()
 	if err != nil {
-		panic("help me!") // todo: handle
+		panic("Unable to access Sqlite DB")
 	}
 
-	for _, payload := range changeSet.Changes {
+	for _, payload := range snapshot.Tables {
 
-		org := payload.Data.PldCont.Organization
-
-		switch payload.Data.EntityType {
+		switch payload.Name {
 		case "developer":
-			switch payload.Data.Operation {
-			case "create":
-				insertCreateDeveloper(payload.Data, db, org)
+			for _, row := range payload.Rows {
+				insertCreateDeveloper(row, db)
 			}
-
 		case "app":
-			switch payload.Data.Operation {
-			case "create":
-				insertCreateApplication(payload.Data, db, org)
+			for _, row := range payload.Rows {
+				insertCreateApplication(row, db)
+			}
+		case "app_credential":
+			for _, row := range payload.Rows {
+				insertCreateCredential(row, db)
+			}
+		case "api_product":
+			for _, row := range payload.Rows {
+				insertAPIproduct(row, db)
+			}
+		case "app_credential_apiproduct_mapper":
+			for _, row := range payload.Rows {
+				insertApiProductMapper(row, db)
 			}
 
-		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)
-			}
 		}
+	}
+}
 
+func processChange(changes *common.ChangeList) {
+
+	log.Debugf("apigeeSyncEvent: %d changes", len(changes.Changes))
+
+	db, err := data.DB()
+	if err != nil {
+		panic("Unable to access Sqlite DB")
+	}
+
+	for _, payload := range changes.Changes {
+
+		switch payload.Table {
+		case "public.developer":
+			switch payload.Operation {
+			case 1:
+				insertCreateDeveloper(payload.NewRow, db)
+			}
+
+		case "public.app":
+			switch payload.Operation {
+			case 1:
+				insertCreateApplication(payload.NewRow, db)
+			}
+
+		case "public.app_credential":
+			switch payload.Operation {
+			case 1:
+				insertCreateCredential(payload.NewRow, db)
+			}
+		case "public.api_product":
+			switch payload.Operation {
+			case 1:
+				insertAPIproduct(payload.NewRow, db)
+			}
+
+		case "public.app_credential_apiproduct_mapper":
+			switch payload.Operation {
+			case 1:
+				insertApiProductMapper(payload.NewRow, db)
+			}
+
+		}
 	}
 }
 
 /*
  * INSERT INTO APP_CREDENTIAL op
  */
-func insertCreateCredential(ele apidApigeeSync.DataPayload, db *sql.DB, org string) bool {
+func insertCreateCredential(ele common.Row, db *sql.DB) {
+
+	var scope, id, appId, consumerSecret, appstatus, status, tenantId string
+	var issuedAt int64
 
 	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)
+	err := ele.Get("_apid_scope", &scope)
+	err = ele.Get("id", &id)
+	err = ele.Get("app_id", &appId)
+	err = ele.Get("consumer_secret", &consumerSecret)
+	err = ele.Get("app_status", &appstatus)
+	err = ele.Get("status", &status)
+	err = ele.Get("issued_at", &issuedAt)
+	err = ele.Get("tenant_id", &tenantId)
+
+	_, err = txn.Exec("INSERT INTO APP_CREDENTIAL (_apid_scope, id, app_id, consumer_secret, app_status, status, issued_at, tenant_id)VALUES(?,?,?,?,?,?,?,?);",
+		scope,
+		id,
+		appId,
+		consumerSecret,
+		appstatus,
+		status,
+		issuedAt,
+		tenantId)
 
 	if err != nil {
-		isPass = false
-		log.Error("INSERT CRED Failed: ", ele.EntityIdentifier, org, ")", err)
-		goto OT
+		log.Error("INSERT CRED Failed: ", id, ", ", scope, ")", err)
+		txn.Rollback()
 	} else {
-		log.Info("INSERT CRED Success: (", ele.EntityIdentifier, org, ")")
+		log.Info("INSERT CRED Success: (", id, ", ", scope, ")")
+		txn.Commit()
 	}
 
+}
+func insertApiProductMapper(ele common.Row, db *sql.DB) {
+
+	var ApiProduct, AppId, EntityIdentifier, tenantId, Scope, Status string
+
+	txn, _ := db.Begin()
+	err := ele.Get("apiprdt_id", &ApiProduct)
+	err = ele.Get("app_id", &AppId)
+	err = ele.Get("appcred_id", &EntityIdentifier)
+	err = ele.Get("tenant_id", &tenantId)
+	err = ele.Get("_apid_scope", &Scope)
+	err = ele.Get("status", &Status)
+
 	/*
 	 * 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_CREDENTIAL_APIPRODUCT_MAPPER(apiprdt_id, app_id, appcred_id, tenant_id, _apid_scope, status) VALUES(?,?,?,?,?,?);",
+		ApiProduct,
+		AppId,
+		EntityIdentifier,
+		tenantId,
+		Scope,
+		Status)
 
-		_, 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)
-
-		if err != nil {
-			isPass = false
-			log.Error("INSERT APP_AND_API_PRODUCT_MAPPER Failed: (",
-				org,
-				elem.ApiProduct,
-				ele.PldCont.AppId,
-				ele.EntityIdentifier,
-				")",
-				err)
-			break
-		} else {
-			log.Info("INSERT APP_AND_API_PRODUCT_MAPPER Success: (",
-				org,
-				elem.ApiProduct,
-				ele.PldCont.AppId,
-				ele.EntityIdentifier,
-				")")
-		}
-	}
-OT:
-	if isPass == true {
-		txn.Commit()
-	} else {
+	if err != nil {
+		log.Error("INSERT APP_CREDENTIAL_APIPRODUCT_MAPPER Failed: (",
+			ApiProduct,
+			AppId,
+			EntityIdentifier,
+			tenantId,
+			Scope,
+			Status,
+			")",
+			err)
 		txn.Rollback()
+	} else {
+		log.Info("INSERT APP_CREDENTIAL_APIPRODUCT_MAPPER Success: (",
+			ApiProduct,
+			AppId,
+			EntityIdentifier,
+			tenantId,
+			Scope,
+			Status,
+			")")
+		txn.Commit()
 	}
-	return isPass
-
 }
 
 /*
  * DELETE CRED
  */
-func deleteCredential(ele apidApigeeSync.DataPayload, db *sql.DB, org string) bool {
+func deleteCredential(ele common.Row, db *sql.DB) {
 
-	txn, _ := db.Begin()
-
-	_, err := txn.Exec("DELETE FROM APP_CREDENTIAL WHERE org=? AND id=?;", org, ele.EntityIdentifier)
-
-	if err != nil {
-		log.Error("DELETE CRED Failed: (", ele.EntityIdentifier, org, ")", err)
-		txn.Rollback()
-		return false
-	} else {
-		log.Info("DELETE CRED Success: (", ele.EntityIdentifier, org, ")")
-		txn.Commit()
-		return true
-	}
-
-}
-
-/*
- * Helper function to convert string slice in to JSON format
- */
-func convertSlicetoStringFormat(inpslice []string) string {
-
-	bytes, _ := json.Marshal(inpslice)
-	return string(bytes)
 }
 
 /*
  * INSERT INTO API product op
  */
-func insertAPIproduct(ele apidApigeeSync.DataPayload, db *sql.DB, org string) bool {
+func insertAPIproduct(ele common.Row, db *sql.DB) {
+
+	var scope, apiProduct, res, env, tenantId string
 
 	txn, _ := db.Begin()
-	restr := convertSlicetoStringFormat(ele.PldCont.Resources)
-	envstr := convertSlicetoStringFormat(ele.PldCont.Environments)
+	err := ele.Get("_apid_scope", &scope)
+	err = ele.Get("id", &apiProduct)
+	err = ele.Get("api_resources", &res)
+	err = ele.Get("environments", &env)
+	err = ele.Get("tenant_id", &tenantId)
 
-	_, err := txn.Exec("INSERT INTO API_PRODUCT (org, id, res_names, env) VALUES(?,?,?,?)",
-		org,
-		ele.PldCont.AppName,
-		restr,
-		envstr)
+	_, err = txn.Exec("INSERT INTO API_PRODUCT (id, api_resources, environments, tenant_id,_apid_scope) VALUES(?,?,?,?,?)",
+		apiProduct,
+		res,
+		env,
+		tenantId,
+		scope)
 
 	if err != nil {
-		log.Error("INSERT API_PRODUCT Failed: (", ele.PldCont.AppName, org, ")", err)
+		log.Error("INSERT API_PRODUCT Failed: (", apiProduct, tenantId, ")", err)
 		txn.Rollback()
-		return false
 	} else {
-		log.Info("INSERT API_PRODUCT Success: (", ele.PldCont.AppName, org, ")")
+		log.Info("INSERT API_PRODUCT Success: (", apiProduct, tenantId, ")")
 		txn.Commit()
-		return true
 	}
 
 }
@@ -192,31 +240,45 @@
 /*
  * INSERT INTO APP op
  */
-func insertCreateApplication(ele apidApigeeSync.DataPayload, db *sql.DB, org string) bool {
+func insertCreateApplication(ele common.Row, db *sql.DB) {
 
+	var scope, EntityIdentifier, DeveloperId, CallbackUrl, Status, AppName, AppFamily, tenantId, CreatedBy, LastModifiedBy string
+	var CreatedAt, LastModifiedAt int64
 	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 := ele.Get("_apid_scope", &scope)
+	err = ele.Get("id", &EntityIdentifier)
+	err = ele.Get("developer_id", &DeveloperId)
+	err = ele.Get("callback_url", &CallbackUrl)
+	err = ele.Get("status", &Status)
+	err = ele.Get("name", &AppName)
+	err = ele.Get("app_family", &AppFamily)
+	err = ele.Get("created_at", &CreatedAt)
+	err = ele.Get("created_by", &CreatedBy)
+	err = ele.Get("updated_at", &LastModifiedAt)
+	err = ele.Get("updated_by", &LastModifiedBy)
+	err = ele.Get("tenant_id", &tenantId)
+
+	_, err = txn.Exec("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(?,?,?,?,?,?,?,?,?,?,?,?);",
+		scope,
+		EntityIdentifier,
+		DeveloperId,
+		CallbackUrl,
+		Status,
+		AppName,
+		AppFamily,
+		CreatedAt,
+		CreatedBy,
+		LastModifiedAt,
+		LastModifiedBy,
+		tenantId)
 
 	if err != nil {
-		log.Error("INSERT APP Failed: (", ele.EntityIdentifier, org, ")", err)
+		log.Error("INSERT APP Failed: (", EntityIdentifier, tenantId, ")", err)
 		txn.Rollback()
-		return false
 	} else {
-		log.Info("INSERT APP Success: (", ele.EntityIdentifier, org, ")")
+		log.Info("INSERT APP Success: (", EntityIdentifier, tenantId, ")")
 		txn.Commit()
-		return true
 	}
 
 }
@@ -224,31 +286,43 @@
 /*
  * INSERT INTO DEVELOPER op
  */
-func insertCreateDeveloper(ele apidApigeeSync.DataPayload, db *sql.DB, org string) bool {
-
+func insertCreateDeveloper(ele common.Row, db *sql.DB) {
+	var scope, EntityIdentifier, Email, Status, UserName, FirstName, LastName, tenantId, CreatedBy, LastModifiedBy, Username string
+	var CreatedAt, LastModifiedAt int64
 	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)
+	err := ele.Get("_apid_scope", &scope)
+	err = ele.Get("email", &Email)
+	err = ele.Get("id", &EntityIdentifier)
+	err = ele.Get("tenant_id", &tenantId)
+	err = ele.Get("status", &Status)
+	err = ele.Get("username", &Username)
+	err = ele.Get("first_name", &FirstName)
+	err = ele.Get("last_name", &LastName)
+	err = ele.Get("created_at", &CreatedAt)
+	err = ele.Get("created_by", &CreatedBy)
+	err = ele.Get("updated_at", &LastModifiedAt)
+	err = ele.Get("updated_by", &LastModifiedBy)
+
+	_, err = txn.Exec("INSERT INTO DEVELOPER (_apid_scope,email,id,tenant_id,status,username,first_name,last_name,created_at,created_by,updated_at,updated_by) VALUES(?,?,?,?,?,?,?,?,?,?,?,?);",
+		scope,
+		Email,
+		EntityIdentifier,
+		tenantId,
+		Status,
+		UserName,
+		FirstName,
+		LastName,
+		CreatedAt,
+		CreatedBy,
+		LastModifiedAt,
+		LastModifiedBy)
 
 	if err != nil {
-		log.Error("INSERT DEVELOPER Failed: (", ele.PldCont.UserName, org, ")", err)
+		log.Error("INSERT DEVELOPER Failed: (", EntityIdentifier, scope, ")", err)
 		txn.Rollback()
-		return false
 	} else {
-		log.Info("INSERT DEVELOPER Success: (", ele.PldCont.UserName, org, ")")
+		log.Info("INSERT DEVELOPER Success: (", EntityIdentifier, scope, ")")
 		txn.Commit()
-		return true
 	}
-
 }
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_path.go b/validate_path.go
index f3cfb99..ac107cb 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 {
@@ -41,5 +41,5 @@
 	}
 
 	/* if the i/p resource is empty, no checks need to be made */
-	return len(basePaths) == 0
+	return len(fs) == 0
 }
