diff --git a/listener.go b/listener.go
index a557a25..c8d9418 100644
--- a/listener.go
+++ b/listener.go
@@ -13,8 +13,6 @@
 	return "ApigeeSync"
 }
 
-// todo: The following was basically just copied from old APID - needs review.
-
 func (h *handler) Handle(e apid.Event) {
 
 	res := true
@@ -31,11 +29,11 @@
 
 	snapData, ok := e.(*common.Snapshot)
 	if ok {
-		res = processSnapshot(snapData, db, txn)
+		res = processSnapshot(snapData, txn)
 	} else {
 		changeSet, ok := e.(*common.ChangeList)
 		if ok {
-			res = processChange(changeSet, db, txn)
+			res = processChange(changeSet, txn)
 		} else {
 			log.Fatal("Received Invalid event. This shouldn't happen!")
 		}
@@ -48,7 +46,7 @@
 	return
 }
 
-func processSnapshot(snapshot *common.Snapshot, db *sql.DB, txn *sql.Tx) bool {
+func processSnapshot(snapshot *common.Snapshot, txn *sql.Tx) bool {
 
 	log.Debugf("Process Snapshot data")
 	res := true
@@ -57,9 +55,9 @@
 
 		switch payload.Name {
 		case "edgex.apid_config":
-			res = insertApidConfig(payload.Rows, db, txn, snapshot.SnapshotInfo)
+			res = insertApidConfig(payload.Rows, txn, snapshot.SnapshotInfo)
 		case "edgex.apid_config_scope":
-			res = insertApidConfigScopes(payload.Rows, db, txn)
+			res = insertApidConfigScopes(payload.Rows, txn)
 		}
 		if res == false {
 			log.Error("Error encountered in Downloading Snapshot for ApidApigeeSync")
@@ -69,7 +67,7 @@
 	return res
 }
 
-func processChange(changes *common.ChangeList, db *sql.DB, txn *sql.Tx) bool {
+func processChange(changes *common.ChangeList, txn *sql.Tx) bool {
 
 	log.Debugf("apigeeSyncEvent: %d changes", len(changes.Changes))
 	var rows []common.Row
@@ -82,7 +80,7 @@
 			switch payload.Operation {
 			case common.Insert:
 				rows = append(rows, payload.NewRow)
-				res = insertApidConfigScopes(rows, db, txn)
+				res = insertApidConfigScopes(rows, txn)
 			}
 		}
 		if res == false {
@@ -96,12 +94,12 @@
 /*
  * INSERT INTO APP_CREDENTIAL op
  */
-func insertApidConfig(rows []common.Row, db *sql.DB, txn *sql.Tx, snapInfo string) bool {
+func insertApidConfig(rows []common.Row, txn *sql.Tx, snapInfo string) bool {
 
 	var scope, id, name, orgAppName, createdBy, updatedBy, Description string
 	var updated, created int64
 
-	prep, err := db.Prepare("INSERT INTO APID_CONFIG (id, _apid_scope, name, umbrella_org_app_name, created, created_by, updated, updated_by, snapshotInfo)VALUES($1,$2,$3,$4,$5,$6,$7,$8,$9);")
+	prep, err := txn.Prepare("INSERT INTO APID_CONFIG (id, _apid_scope, name, umbrella_org_app_name, created, created_by, updated, updated_by, snapshotInfo)VALUES($1,$2,$3,$4,$5,$6,$7,$8,$9);")
 	if err != nil {
 		log.Error("INSERT APID_CONFIG Failed: ", err)
 		return false
@@ -119,7 +117,8 @@
 		ele.Get("updated_by", &updatedBy)
 		ele.Get("description", &Description)
 
-		_, err = txn.Stmt(prep).Exec(
+		s := txn.Stmt(prep)
+		_, err = s.Exec(
 			id,
 			scope,
 			name,
@@ -129,7 +128,7 @@
 			updated,
 			updatedBy,
 			snapInfo)
-
+		s.Close()
 		if err != nil {
 			log.Error("INSERT APID_CONFIG Failed: ", id, ", ", scope, ")", err)
 			return false
@@ -143,12 +142,12 @@
 /*
  * INSERT INTO APP_CREDENTIAL op
  */
-func insertApidConfigScopes(rows []common.Row, db *sql.DB, txn *sql.Tx) bool {
+func insertApidConfigScopes(rows []common.Row, txn *sql.Tx) bool {
 
 	var id, scopeId, apiConfigId, scope, createdBy, updatedBy string
 	var created, updated int64
 
-	prep, err := db.Prepare("INSERT INTO APID_CONFIG_SCOPE (id, _apid_scope, apid_config_id, scope, created, created_by, updated, updated_by)VALUES($1,$2,$3,$4,$5,$6,$7,$8);")
+	prep, err := txn.Prepare("INSERT INTO APID_CONFIG_SCOPE (id, _apid_scope, apid_config_id, scope, created, created_by, updated, updated_by)VALUES($1,$2,$3,$4,$5,$6,$7,$8);")
 	if err != nil {
 		log.Error("INSERT APID_CONFIG_SCOPE Failed: ", err)
 		return false
@@ -166,7 +165,8 @@
 		ele.Get("updated", &updated)
 		ele.Get("updated_by", &updatedBy)
 
-		_, err = txn.Stmt(prep).Exec(
+		s := txn.Stmt(prep)
+		_, err = s.Exec(
 			id,
 			scopeId,
 			apiConfigId,
@@ -175,6 +175,7 @@
 			createdBy,
 			updated,
 			updatedBy)
+		s.Close()
 
 		if err != nil {
 			log.Error("INSERT APID_CONFIG_SCOPE Failed: ", id, ", ", scope, ")", err)
