diff --git a/api_test.go b/api_test.go
index 566897f..ee10d70 100644
--- a/api_test.go
+++ b/api_test.go
@@ -160,6 +160,7 @@
 func insertTestData(db *sql.DB) {
 
 	for i := 0; i < 10; i++ {
+		var rows []common.Row
 		srvItems := common.Row{}
 		result := strconv.FormatInt(int64(i), 10)
 
@@ -192,11 +193,13 @@
 			Type:  1,
 		}
 		srvItems["tenant_id"] = scv
-		res := insertAPIproduct(srvItems, db)
+		rows = append(rows, srvItems)
+		res := insertAPIproducts(rows, db)
 		Expect(res).Should(BeTrue())
 	}
 
 	for i := 0; i < 10; i++ {
+		var rows []common.Row
 		srvItems := common.Row{}
 		result := strconv.FormatInt(int64(i), 10)
 
@@ -242,7 +245,8 @@
 		}
 		srvItems["tenant_id"] = scv
 
-		res := insertDeveloper(srvItems, db)
+		rows = append(rows, srvItems)
+		res := insertDevelopers(rows, db)
 		Expect(res).Should(BeTrue())
 	}
 
@@ -250,6 +254,7 @@
 	for i := 0; i < 10; i++ {
 		resulti := strconv.FormatInt(int64(i), 10)
 		for j = k; j < 10+k; j++ {
+			var rows []common.Row
 
 			srvItems := common.Row{}
 			resultj := strconv.FormatInt(int64(j), 10)
@@ -289,13 +294,15 @@
 				Type:  1,
 			}
 			srvItems["tenant_id"] = scv
-			res := insertApplication(srvItems, db)
+			rows = append(rows, srvItems)
+			res := insertApplications(rows, db)
 			Expect(res).Should(BeTrue())
 		}
 		k = j
 	}
 
 	for i := 0; i < 10; i++ {
+		var rows []common.Row
 		srvItems := common.Row{}
 		result := strconv.FormatInt(int64(i), 10)
 
@@ -328,11 +335,13 @@
 			Type:  1,
 		}
 		srvItems["tenant_id"] = scv
-		res := insertCredential(srvItems, db)
+		rows = append(rows, srvItems)
+		res := insertCredentials(rows, db)
 		Expect(res).Should(BeTrue())
 	}
 
 	for i := 0; i < 10; i++ {
+		var rows []common.Row
 		srvItems := common.Row{}
 		result := strconv.FormatInt(int64(i), 10)
 
@@ -369,7 +378,8 @@
 			Type:  1,
 		}
 		srvItems["tenant_id"] = scv
-		res := insertAPIProductMapper(srvItems, db)
+		rows = append(rows, srvItems)
+		res := insertAPIProductMappers(rows, db)
 		Expect(res).Should(BeTrue())
 	}
 
diff --git a/listener.go b/listener.go
index 91eb2a2..6ac0999 100644
--- a/listener.go
+++ b/listener.go
@@ -13,8 +13,6 @@
 	return "verifyAPIKey"
 }
 
-// todo: The following was basically just copied from old APID - needs review.
-
 func (h *handler) Handle(e apid.Event) {
 
 	snapData, ok := e.(*common.Snapshot)
@@ -56,7 +54,7 @@
 		case "kms.api_product":
 			res = insertAPIproducts(payload.Rows, db)
 		case "kms.app_credential_apiproduct_mapper":
-			res = insertApiProductMappers(payload.Rows, db)
+			res = insertAPIProductMappers(payload.Rows, db)
 		}
 		if res == false {
 			log.Error("Error encountered in Downloading Snapshot for VerifyApiKey")
@@ -269,7 +267,7 @@
 /*
  * Performs a bulk insert of all APP_CREDENTIAL_APIPRODUCT_MAPPER rows
  */
-func insertApiProductMappers(rows []common.Row, db *sql.DB) bool {
+func insertAPIProductMappers(rows []common.Row, db *sql.DB) bool {
 
 	var ApiProduct, AppId, EntityIdentifier, tenantId, Scope, Status string
 
@@ -333,6 +331,7 @@
 func processChange(changes *common.ChangeList) {
 
 	log.Debugf("apigeeSyncEvent: %d changes", len(changes.Changes))
+	var rows []common.Row
 
 	db, err := data.DB()
 	if err != nil {
@@ -340,12 +339,13 @@
 	}
 
 	for _, payload := range changes.Changes {
-
+		rows = nil
 		switch payload.Table {
 		case "kms.developer":
 			switch payload.Operation {
 			case 1:
-				insertDeveloper(payload.NewRow, db)
+				rows = append(rows, payload.NewRow)
+				insertDevelopers(rows, db)
 			case 2:
 				updateDeveloper(payload.NewRow, payload.OldRow, db)
 			case 3:
@@ -354,7 +354,8 @@
 		case "kms.app":
 			switch payload.Operation {
 			case 1:
-				insertApplication(payload.NewRow, db)
+				rows = append(rows, payload.NewRow)
+				insertApplications(rows, db)
 			case 2:
 				updateApplication(payload.NewRow, payload.OldRow, db)
 			case 3:
@@ -364,7 +365,8 @@
 		case "kms.app_credential":
 			switch payload.Operation {
 			case 1:
-				insertCredential(payload.NewRow, db)
+				rows = append(rows, payload.NewRow)
+				insertCredentials(rows, db)
 			case 2:
 				updateCredential(payload.NewRow, payload.OldRow, db)
 			case 3:
@@ -373,7 +375,8 @@
 		case "kms.api_product":
 			switch payload.Operation {
 			case 1:
-				insertAPIproduct(payload.NewRow, db)
+				rows = append(rows, payload.NewRow)
+				insertAPIproducts(rows, db)
 			case 2:
 				updateAPIproduct(payload.NewRow, payload.OldRow, db)
 			case 3:
@@ -383,7 +386,8 @@
 		case "kms.app_credential_apiproduct_mapper":
 			switch payload.Operation {
 			case 1:
-				insertAPIProductMapper(payload.NewRow, db)
+				rows = append(rows, payload.NewRow)
+				insertAPIProductMappers(rows, db)
 			case 2:
 				updateAPIproductMapper(payload.NewRow, payload.OldRow, db)
 			case 3:
@@ -394,235 +398,6 @@
 }
 
 /*
- * INSERT INTO APP_CREDENTIAL op
- */
-func insertCredential(ele common.Row, db *sql.DB) bool {
-
-	var scope, id, appId, consumerSecret, appstatus, status, tenantId string
-	var issuedAt int64
-
-	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)
-
-	stmt, err := db.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 {
-		log.Error("INSERT CRED Failed: ", id, ", ", scope, ")", err)
-		return false
-	}
-	_, err = stmt.Exec(
-		scope,
-		id,
-		appId,
-		consumerSecret,
-		appstatus,
-		status,
-		issuedAt,
-		tenantId)
-
-	if err != nil {
-		log.Error("INSERT CRED Failed: ", id, ", ", scope, ")", err)
-		return false
-	} else {
-		log.Info("INSERT CRED Success: (", id, ", ", scope, ")")
-		return true
-	}
-
-}
-
-func insertAPIProductMapper(ele common.Row, db *sql.DB) bool {
-
-	var ApiProduct, AppId, EntityIdentifier, tenantId, Scope, Status string
-
-	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
-	 */
-
-	stmt, err := db.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
-	}
-	_, err = stmt.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)
-		return false
-	} else {
-		log.Info("INSERT APP_CREDENTIAL_APIPRODUCT_MAPPER Success: (",
-			ApiProduct, ", ",
-			AppId, ", ",
-			EntityIdentifier, ", ",
-			tenantId, ", ",
-			Scope, ", ",
-			Status,
-			")")
-		return true
-	}
-}
-
-/*
- * INSERT INTO API product op
- */
-func insertAPIproduct(ele common.Row, db *sql.DB) bool {
-
-	var scope, apiProduct, res, env, tenantId string
-
-	ele.Get("_apid_scope", &scope)
-	ele.Get("id", &apiProduct)
-	ele.Get("api_resources", &res)
-	ele.Get("environments", &env)
-	ele.Get("tenant_id", &tenantId)
-
-	stmt, err := db.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
-	}
-	_, err = stmt.Exec(
-		apiProduct,
-		res,
-		env,
-		tenantId,
-		scope)
-
-	if err != nil {
-		log.Error("INSERT API_PRODUCT Failed: (", apiProduct, ", ", tenantId, ")", err)
-		return false
-	} else {
-		log.Info("INSERT API_PRODUCT Success: (", apiProduct, ", ", tenantId, ")")
-		return true
-	}
-
-}
-
-/*
- * INSERT INTO APP op
- */
-func insertApplication(ele common.Row, db *sql.DB) bool {
-
-	var scope, EntityIdentifier, DeveloperId, CallbackUrl, Status, AppName, AppFamily, tenantId, CreatedBy, LastModifiedBy string
-	var CreatedAt, LastModifiedAt int64
-
-	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)
-
-	stmt, err := db.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
-	}
-	_, err = stmt.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.Info("INSERT APP Success: (", EntityIdentifier, ", ", tenantId, ")")
-		return true
-	}
-
-}
-
-/*
- * INSERT INTO DEVELOPER op
- */
-func insertDeveloper(ele common.Row, db *sql.DB) bool {
-	var scope, EntityIdentifier, Email, Status, UserName, FirstName, LastName, tenantId, CreatedBy, LastModifiedBy, Username string
-	var CreatedAt, LastModifiedAt int64
-
-	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)
-
-	stmt, err := db.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
-	}
-
-	_, err = stmt.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.Info("INSERT DEVELOPER Success: (", EntityIdentifier, ", ", scope, ")")
-		return true
-	}
-}
-
-/*
  * DELETE APP
  */
 func deleteApplication(ele common.Row, db *sql.DB) bool {
