diff --git a/apigee_sync.go b/apigee_sync.go
index 25a590f..40335e2 100644
--- a/apigee_sync.go
+++ b/apigee_sync.go
@@ -41,8 +41,8 @@
 			} else {
 				times = pollInterval
 			}
-			log.Debugf("sleep for %d secs", time.Duration(times))
-			time.Sleep(time.Duration(times) * time.Second)
+			log.Debugf("Connecting to changeserver...")
+			time.Sleep(time.Duration(times) * 100 * time.Millisecond)
 		} else {
 			// Reset sleep interval
 			times = 1
@@ -151,6 +151,7 @@
  */
 func getBearerToken() bool {
 
+	log.Info("Getting a Bearer token.")
 	uri, err := url.Parse(config.GetString(configProxyServerBaseURI))
 	if err != nil {
 		log.Error(err)
@@ -168,7 +169,7 @@
 	client := &http.Client{}
 	resp, err := client.Do(req)
 	if err != nil {
-		log.Error(err)
+		log.Error("Unable to Connect to Edge Proxy Server ", err)
 		return false
 	}
 	defer resp.Body.Close()
@@ -178,7 +179,7 @@
 	}
 	body, err := ioutil.ReadAll(resp.Body)
 	if err != nil {
-		log.Error(err)
+		log.Error("Unable to read EdgeProxy Sever response ", err)
 		return false
 	}
 
@@ -190,7 +191,7 @@
 	}
 	token = oauthResp.AccessToken
 	tokenActive = true
-	log.Info("Got a new token..")
+	log.Info("Got a new Bearer token.")
 	return true
 }
 
@@ -251,9 +252,25 @@
 	if downloadBootSnapshot == false {
 		scopes = append(scopes, (config.GetString(configScopeId)))
 	} else {
-		scopes = findScopesforId(config.GetString(configScopeId))
-	}
 
+		/*
+		 * With WAL there is a chance, commits happening might take
+		 * a bit, give some time if another session is in Committing
+		 * the scopes
+		 */
+		for count := 0; count < 60; count++ {
+			scopes = findScopesforId(config.GetString(configScopeId))
+			if scopes == nil {
+				log.Info("User Scopes not found in DB, retry in a bit.")
+				time.Sleep(time.Duration(count) * 100 * time.Millisecond)
+			} else {
+				break
+			}
+		}
+		if scopes == nil {
+			log.Fatal("Scope cannot be found to download snapshot")
+		}
+	}
 	/* Frame and send the snapshot request */
 	snapshotUri.Path = path.Join(snapshotUri.Path, "/snapshots")
 
diff --git a/apigee_sync_test.go b/apigee_sync_test.go
index b3a2910..d7dbe86 100644
--- a/apigee_sync_test.go
+++ b/apigee_sync_test.go
@@ -4,12 +4,14 @@
 	"encoding/json"
 	"github.com/30x/apid"
 	"github.com/30x/apid/factory"
+	"github.com/30x/transicator/common"
 	. "github.com/onsi/ginkgo"
 	. "github.com/onsi/gomega"
 	"io/ioutil"
 	"net/http"
 	"net/http/httptest"
 	"os"
+	"time"
 )
 
 var _ = Describe("api", func() {
@@ -26,8 +28,9 @@
 	})
 
 	It("perform sync round-trip", func(done Done) {
-		count := 0
-		org := "test-org"
+		scount := 0
+		phase := 0
+		scope := "bootstrap"
 		key := "XXXXXXX"
 		secret := "YYYYYYY"
 
@@ -35,19 +38,13 @@
 		server = httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
 
 			// first request is for a token
-			if req.URL.Path == "/v1/edgex/accesstoken" {
+			if req.URL.Path == "/accesstoken" {
 				Expect(req.Method).To(Equal("POST"))
 				Expect(req.Header.Get("Content-Type")).To(Equal("application/x-www-form-urlencoded; param=value"))
 
-				user, pw, ok := req.BasicAuth()
-				Expect(ok).To(BeTrue())
-				Expect(user).To(Equal(key))
-				Expect(pw).To(Equal(secret))
-
 				err := req.ParseForm()
 				Expect(err).NotTo(HaveOccurred())
 				Expect(req.Form.Get("grant_type")).To(Equal("client_credentials"))
-				Expect(req.Form.Get("org")).To(Equal(org))
 
 				res := oauthTokenResp{}
 				res.AccessToken = "accesstoken"
@@ -58,25 +55,132 @@
 			}
 
 			// next requests are for changes
-			if req.URL.Path == "/v1/edgex/changeagent/changes" {
+			if req.URL.Path == "/snapshots" {
 				Expect(req.Method).To(Equal("GET"))
+				q := req.URL.Query()
 
-				// break polling after first time
-				if count > 0 {
-					w.WriteHeader(http.StatusUnauthorized)
+				if phase == 0 {
+					phase = 1
+					Expect(q.Get("scope")).To(Equal(scope))
+
+					apidcfgItem := common.Row{}
+					apidcfgItems := []common.Row{}
+					apidcfgItemCh := common.Row{}
+					apidcfgItemsCh := []common.Row{}
+					scv := &common.ColumnVal{
+						Value: scope,
+						Type:  1,
+					}
+					apidcfgItem["id"] = scv
+					scv = &common.ColumnVal{
+						Value: scope,
+						Type:  1,
+					}
+					apidcfgItem["_apid_scope"] = scv
+					apidcfgItems = append(apidcfgItems, apidcfgItem)
+
+					scv = &common.ColumnVal{
+						Value: "apid_config_scope_id_0",
+						Type:  1,
+					}
+					apidcfgItemCh["id"] = scv
+
+					scv = &common.ColumnVal{
+						Value: "apid_config_scope_id_0",
+						Type:  1,
+					}
+					apidcfgItemCh["_apid_scope"] = scv
+
+					scv = &common.ColumnVal{
+						Value: scope,
+						Type:  1,
+					}
+					apidcfgItemCh["apid_config_id"] = scv
+
+					scv = &common.ColumnVal{
+						Value: "att~prod",
+						Type:  1,
+					}
+					apidcfgItemCh["scope"] = scv
+
+					apidcfgItemsCh = append(apidcfgItemsCh, apidcfgItemCh)
+
+					res := &common.Snapshot{}
+					res.SnapshotInfo = "snapinfo1"
+
+					res.Tables = []common.Table{
+						{
+							Name: "edgex.apid_config",
+							Rows: apidcfgItems,
+						},
+						{
+							Name: "edgex.apid_config_scope",
+							Rows: apidcfgItemsCh,
+						},
+					}
+
+					body, err := json.Marshal(res)
+					Expect(err).NotTo(HaveOccurred())
+					w.Write(body)
+					return
+				} else {
+					phase = 2
+					Expect(q.Get("scope")).To(Equal("att~prod"))
+					res := &common.Snapshot{}
+					res.SnapshotInfo = "snapinfo1"
+
+					apidcfgItems := []common.Row{}
+					res.Tables = []common.Table{
+						{
+							Name: "kms.api_product",
+							Rows: apidcfgItems,
+						},
+					}
+
+					body, err := json.Marshal(res)
+					Expect(err).NotTo(HaveOccurred())
+					w.Write(body)
 					return
 				}
-				count++
 
+			}
+			// next requests are for changes
+			if req.URL.Path == "/changes" {
+				Expect(req.Method).To(Equal("GET"))
 				q := req.URL.Query()
-				Expect(q.Get("block")).To(Equal("60"))
-				Expect(q.Get("since")).To(Equal("0"))
-				Expect(q.Get("tag")).To(Equal("org:" + org))
+				Expect(q.Get("snapshot")).To(Equal("snapinfo1"))
+				scparams := q["scope"]
+				Expect(scparams).To(ContainElement("att~prod"))
+				Expect(scparams).To(ContainElement("bootstrap"))
 
-				var res = ChangeSet{}
-				res.Changes = []ChangePayload{
+				res := &common.ChangeList{}
+
+				res.LastSequence = "lastSeq_01"
+				mpItems := common.Row{}
+
+				scv := &common.ColumnVal{
+					Value: "apid_config_scope_id_1",
+					Type:  1,
+				}
+				mpItems["id"] = scv
+
+				scv = &common.ColumnVal{
+					Value: scope,
+					Type:  1,
+				}
+				mpItems["apid_config_id"] = scv
+
+				scv = &common.ColumnVal{
+					Value: "att~test",
+					Type:  1,
+				}
+				mpItems["scope"] = scv
+
+				res.Changes = []common.Change{
 					{
-						LastMsId: 10,
+						Table:     "edgex.apid_config_scope",
+						NewRow:    mpItems,
+						Operation: 1,
 					},
 				}
 				body, err := json.Marshal(res)
@@ -84,26 +188,25 @@
 				w.Write(body)
 				return
 			}
-
 			Fail("should not reach")
 		}))
 
 		config = apid.Config()
 		config.Set(configProxyServerBaseURI, server.URL)
-		config.Set(configOrganization, org)
+		config.Set(configSnapServerBaseURI, server.URL)
+		config.Set(configChangeServerBaseURI, server.URL)
+		config.Set(configScopeId, "apid_config_scope_0")
+		config.Set(configSnapshotProtocol, "json")
+		config.Set(configScopeId, scope)
 		config.Set(configConsumerKey, key)
 		config.Set(configConsumerSecret, secret)
 
 		// set up temporary test database
-		tmpDir, err := ioutil.TempDir("", "sync_test")
+		tmpDir, err := ioutil.TempDir("", "apigee_sync_test")
 		Expect(err).NotTo(HaveOccurred())
 		defer os.RemoveAll(tmpDir)
 
 		config.Set("data_path", tmpDir)
-		db, err := apid.Data().DB()
-		Expect(err).NotTo(HaveOccurred())
-		_, err = db.Exec("create table change_id (org varchar(255), snapshot_change_id integer, PRIMARY KEY (org))")
-		Expect(err).NotTo(HaveOccurred())
 
 		// start process -  plugin will automatically start polling
 		apid.InitializePlugins()
@@ -111,21 +214,33 @@
 		h := &test_handler{
 			"sync data",
 			func(event apid.Event) {
+				_, ok := event.(*common.Snapshot)
+				if ok {
+					if phase > 1 {
+						db, err := data.DB()
+						Expect(err).NotTo(HaveOccurred())
+						// verify event data (post snapshot)
+						err = db.QueryRow("Select count(scp.id) from apid_config_scope as scp INNER JOIN apid_config as ap WHERE scp.apid_config_id = ap.id").Scan(&scount)
+						Expect(err).NotTo(HaveOccurred())
+						Expect(scount).Should(Equal(1))
+					}
+				} else {
+					// verify event data (post change)
+					// There should be 2 scopes now
+					_, ok := event.(*common.ChangeList)
+					if ok {
+						time.Sleep(200 * time.Millisecond)
+						db, err := data.DB()
+						Expect(err).NotTo(HaveOccurred())
+						err = db.QueryRow("Select count(scp.id) from apid_config_scope as scp INNER JOIN apid_config as ap WHERE scp.apid_config_id = ap.id").Scan(&scount)
+						Expect(err).NotTo(HaveOccurred())
+						Expect(scount).Should(Equal(2))
+						close(done)
+					} else {
+						Fail("Unexpected event")
+					}
+				}
 
-				// verify event data
-				changes := event.(ChangeSet)
-				Expect(len(changes.Changes)).Should(Equal(1))
-				Expect(changes.Changes[0].LastMsId).Should(Equal(int64(10)))
-
-				// verify database update
-				db, err := data.DB()
-				Expect(err).ShouldNot(HaveOccurred())
-				var lastId int64
-				err = db.QueryRow("select snapshot_change_id from change_id where org=?", org).Scan(&lastId)
-				Expect(err).ShouldNot(HaveOccurred())
-				Expect(lastId).Should(Equal(int64(10)))
-
-				close(done)
 			},
 		}
 
diff --git a/init.go b/init.go
index 33e8297..a086b8d 100644
--- a/init.go
+++ b/init.go
@@ -102,6 +102,7 @@
     updated_by text,
     _apid_scope text,
     snapshotInfo text,
+    lastSequence text,
     PRIMARY KEY (id)
 );
 CREATE TABLE apid_config_scope (
diff --git a/listener.go b/listener.go
index ce6074e..c264cd2 100644
--- a/listener.go
+++ b/listener.go
@@ -48,9 +48,7 @@
 				insertApidConfig(row, db, snapshot.SnapshotInfo)
 			}
 		case "edgex.apid_config_scope":
-			for _, row := range payload.Rows {
-				insertApidConfigScope(row, db)
-			}
+			insertApidConfigScopes(payload.Rows, db)
 		}
 	}
 }
@@ -58,19 +56,20 @@
 func processChange(changes *common.ChangeList) {
 
 	log.Debugf("apigeeSyncEvent: %d changes", len(changes.Changes))
-
+	var rows []common.Row
 	db, err := data.DB()
 	if err != nil {
 		panic("Unable to access Sqlite DB")
 	}
 
 	for _, payload := range changes.Changes {
-
+		rows = nil
 		switch payload.Table {
 		case "edgex.apid_config_scope":
 			switch payload.Operation {
 			case 1:
-				insertApidConfigScope(payload.NewRow, db)
+				rows = append(rows, payload.NewRow)
+				insertApidConfigScopes(rows, db)
 			}
 		}
 	}
@@ -84,6 +83,14 @@
 	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);")
+	if err != nil {
+		log.Error("INSERT APID_CONFIG Failed: ", err)
+		return false
+	}
+
+	txn, err := db.Begin()
+
 	ele.Get("id", &id)
 	ele.Get("_apid_scope", &scope)
 	ele.Get("name", &name)
@@ -94,12 +101,7 @@
 	ele.Get("updated_by", &updatedBy)
 	ele.Get("description", &Description)
 
-	stmt, 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);")
-	if err != nil {
-		log.Error("INSERT APID_CONFIG Failed: ", err)
-		return false
-	}
-	_, err = stmt.Exec(
+	_, err = txn.Stmt(prep).Exec(
 		id,
 		scope,
 		name,
@@ -112,9 +114,11 @@
 
 	if err != nil {
 		log.Error("INSERT APID_CONFIG Failed: ", id, ", ", scope, ")", err)
+		txn.Rollback()
 		return false
 	} else {
 		log.Info("INSERT APID_CONFIG Success: (", id, ", ", scope, ")")
+		txn.Commit()
 		return true
 	}
 
@@ -123,38 +127,47 @@
 /*
  * INSERT INTO APP_CREDENTIAL op
  */
-func insertApidConfigScope(ele common.Row, db *sql.DB) bool {
+func insertApidConfigScopes(rows []common.Row, db *sql.DB) bool {
 
 	var id, scopeId, apiConfigId, scope, createdBy, updatedBy string
 	var created, updated int64
 
-	ele.Get("id", &id)
-	ele.Get("_apid_scope", &scopeId)
-	ele.Get("apid_config_id", &apiConfigId)
-	ele.Get("scope", &scope)
-	ele.Get("created", &created)
-	ele.Get("created_by", &createdBy)
-	ele.Get("updated", &updated)
-	ele.Get("updated_by", &updatedBy)
-
-	stmt, 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);")
-
-	_, err = stmt.Exec(
-		id,
-		scopeId,
-		apiConfigId,
-		scope,
-		created,
-		createdBy,
-		updated,
-		updatedBy)
-
+	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);")
 	if err != nil {
-		log.Error("INSERT APID_CONFIG_SCOPE Failed: ", id, ", ", scope, ")", err)
+		log.Error("INSERT APID_CONFIG_SCOPE Failed: ", err)
 		return false
-	} else {
-		log.Info("INSERT APID_CONFIG_SCOPE Success: (", id, ", ", scope, ")")
-		return true
 	}
 
+	txn, err := db.Begin()
+	for _, ele := range rows {
+
+		ele.Get("id", &id)
+		ele.Get("_apid_scope", &scopeId)
+		ele.Get("apid_config_id", &apiConfigId)
+		ele.Get("scope", &scope)
+		ele.Get("created", &created)
+		ele.Get("created_by", &createdBy)
+		ele.Get("updated", &updated)
+		ele.Get("updated_by", &updatedBy)
+
+		_, err = txn.Stmt(prep).Exec(
+			id,
+			scopeId,
+			apiConfigId,
+			scope,
+			created,
+			createdBy,
+			updated,
+			updatedBy)
+
+		if err != nil {
+			log.Error("INSERT APID_CONFIG_SCOPE Failed: ", id, ", ", scope, ")", err)
+			txn.Rollback()
+			return false
+		} else {
+			log.Info("INSERT APID_CONFIG_SCOPE Success: (", id, ", ", scope, ")")
+		}
+	}
+	txn.Commit()
+	return true
 }
