diff --git a/apigeeSync_suite_test.go b/apigeeSync_suite_test.go
index 476919b..3008b7d 100644
--- a/apigeeSync_suite_test.go
+++ b/apigeeSync_suite_test.go
@@ -43,34 +43,43 @@
 	config.Set(configConsumerKey, "XXXXXXX")
 	config.Set(configConsumerSecret, "YYYYYYY")
 
-	registerMockServer(testRouter)
+	// set up mock server
+	mockParms := MockParms{
+		ReliableAPI:                 true,
+		ClusterID:                   config.GetString(configApidClusterId),
+		TokenKey:                    config.GetString(configConsumerKey),
+		TokenSecret:                 config.GetString(configConsumerSecret),
+		Scope:                       "ert452",
+		Organization:                "att",
+		Environment:                 "prod",
+	}
+	Mock(mockParms, testRouter)
 
 	// This is actually the first test :)
 	// Tests that entire bootstrap and set of sync operations work
+	var lastSnapshot *common.Snapshot
 	apid.Events().ListenFunc(ApigeeSyncEventSelector, func(event apid.Event) {
 		defer GinkgoRecover()
 
 		if s, ok := event.(*common.Snapshot); ok {
 
+			lastSnapshot = s
+
 			for _, t := range s.Tables {
 				switch t.Name {
 
 				case "edgex.apid_cluster":
 					Expect(t.Rows).To(HaveLen(1))
 					r := t.Rows[0]
-					var cs, id string
-					r.Get("_change_selector", &cs)
+					var id string
 					r.Get("id", &id)
-
-					Expect(cs).To(Equal("bootstrap"))
 					Expect(id).To(Equal("bootstrap"))
 
 				case "edgex.data_scope":
 					Expect(t.Rows).To(HaveLen(2))
 					r := t.Rows[1] // get the non-cluster row
 
-					var cs, id, clusterID, env, org, scope string
-					r.Get("_change_selector", &cs)
+					var id, clusterID, env, org, scope string
 					r.Get("id", &id)
 					r.Get("apid_cluster_id", &clusterID)
 					r.Get("env", &env)
@@ -78,43 +87,39 @@
 					r.Get("scope", &scope)
 
 					Expect(id).To(Equal("ert452"))
-					Expect(cs).To(Equal("ert452"))
 					Expect(scope).To(Equal("ert452"))
 					Expect(clusterID).To(Equal("bootstrap"))
 					Expect(env).To(Equal("prod"))
 					Expect(org).To(Equal("att"))
-
-				//case "kms.api_product":
-				//	Expect(t.Rows).To(HaveLen(0))
-
-				//default:
-				//	Fail("invalid table: " + t.Name)
 				}
 			}
 
 		} else if cl, ok := event.(*common.ChangeList); ok {
 
-			//Expect(cl.LastSequence).To(Equal("lastSeq_01"))
-			Expect(cl.Changes).To(HaveLen(1))
+			// ensure that snapshot switched DB versions
+			Expect(apidInfo.LastSnapshot).To(Equal(lastSnapshot.SnapshotInfo))
+			expectedDB, err := data.DBVersion(lastSnapshot.SnapshotInfo)
+			Expect(err).NotTo(HaveOccurred())
+			Expect(getDB() == expectedDB).Should(BeTrue())
 
-			c := cl.Changes[0]
-			Expect(c.Table).To(Equal("edgex.data_scope"))
-			Expect(c.Operation).To(Equal(common.Insert))
+			Expect(cl.Changes).To(HaveLen(6))
 
-			Expect(c.NewRow).ToNot(BeNil())
+			var tables []string
+			for _, c := range cl.Changes {
+				tables = append(tables, c.Table)
+				Expect(c.NewRow).ToNot(BeNil())
 
-			var id, clusterID, env, org, scope string
-			c.NewRow.Get("id", &id)
-			c.NewRow.Get("apid_cluster_id", &clusterID)
-			c.NewRow.Get("env", &env)
-			c.NewRow.Get("org", &org)
-			c.NewRow.Get("scope", &scope)
+				var tenantID string
+				c.NewRow.Get("tenant_id", &tenantID)
+				Expect(tenantID).To(Equal("ert452"))
+			}
 
-			Expect(id).To(Equal("apid_config_scope_id_1"))
-			Expect(clusterID).To(Equal("bootstrap"))
-			Expect(env).To(Equal("prod"))
-			Expect(org).To(Equal("att"))
-			Expect(scope).To(Equal("ert452"))
+			Expect(tables).To(ContainElement("kms.app_credential"))
+			Expect(tables).To(ContainElement("kms.app_credential_apiproduct_mapper"))
+			Expect(tables).To(ContainElement("kms.developer"))
+			Expect(tables).To(ContainElement("kms.company_developer"))
+			Expect(tables).To(ContainElement("kms.api_product"))
+			Expect(tables).To(ContainElement("kms.app"))
 
 			events.ListenFunc(apid.EventDeliveredSelector, func(e apid.Event) {
 				defer GinkgoRecover()
diff --git a/apigee_sync.go b/apigee_sync.go
index 3ad929c..c045a2f 100644
--- a/apigee_sync.go
+++ b/apigee_sync.go
@@ -31,7 +31,7 @@
 		if ev, ok := ede.Event.(*common.ChangeList); ok {
 			if lastSequence != ev.LastSequence {
 				lastSequence = ev.LastSequence
-				err := persistChange(lastSequence)
+				err := updateLastSequence(lastSequence)
 				if err != nil {
 					log.Panic("Unable to update Sequence in DB")
 				}
@@ -105,7 +105,7 @@
 	 * Check to see if we have lastSequence already saved in the DB,
 	 * in which case, it has to be used to prevent re-reading same data
 	 */
-	lastSequence = findApidConfigInfo(lastSequence)
+	lastSequence = getLastSequence()
 	for {
 		log.Debug("polling...")
 		if token == "" {
@@ -168,14 +168,6 @@
 			return err
 		}
 
-		if lastSequence != resp.LastSequence {
-			lastSequence = resp.LastSequence
-			err := persistChange(lastSequence)
-			if err != nil {
-				log.Panic("Unable to update Sequence in DB")
-			}
-		}
-
 		/* If valid data present, Emit to plugins */
 		if len(resp.Changes) > 0 {
 			changeFinished = false
@@ -203,7 +195,7 @@
 
 			if lastSequence != resp.LastSequence {
 				lastSequence = resp.LastSequence
-				err := persistChange(lastSequence)
+				err := updateLastSequence(lastSequence)
 				if err != nil {
 					log.Panic("Unable to update Sequence in DB")
 				}
@@ -341,9 +333,6 @@
 	// Skip Downloading snapshot if there is already a snapshot available from previous run of APID
 	if apidInfo.LastSnapshot != "" {
 
-		downloadDataSnapshot = true
-		downloadBootSnapshot = true
-
 		log.Infof("Starting on downloaded snapshot: %s", apidInfo.LastSnapshot)
 
 		// ensure DB version will be accessible on behalf of dependant plugins
@@ -356,7 +345,12 @@
 		snap := &common.Snapshot{
 			SnapshotInfo: apidInfo.LastSnapshot,
 		}
-		events.Emit(ApigeeSyncEventSelector, snap)
+		events.EmitWithCallback(ApigeeSyncEventSelector, snap, func(event apid.Event) {
+			downloadBootSnapshot = true
+			downloadDataSnapshot = true
+
+			go updatePeriodicChanges()
+		})
 
 		return
 	}
@@ -386,6 +380,8 @@
 	} else {
 		log.Panic("Snapshot for bootscope failed")
 	}
+
+	go updatePeriodicChanges()
 }
 
 func downloadSnapshot() {
diff --git a/cmd/mockServer/main.go b/cmd/mockServer/main.go
index e3cf6c3..4adfe94 100644
--- a/cmd/mockServer/main.go
+++ b/cmd/mockServer/main.go
@@ -7,6 +7,7 @@
 	"github.com/30x/apidApigeeSync"
 )
 
+// runs a mock server standalone
 func main() {
 	apid.Initialize(factory.DefaultServicesFactory())
 
@@ -17,7 +18,6 @@
 	config.SetDefault("api_port", "9001")
 
 	router := apid.API().Router()
-	//server := httptest.NewServer(testRouter)
 
 	params := apidApigeeSync.MockParms{
 		ReliableAPI:                 true,
@@ -28,8 +28,7 @@
 		Organization:                "att",
 		Environment:                 "prod",
 		NumDevelopers:               5,
-		NumApplicationsPerDeveloper: 1,
-		AddDeveloperEvery:           1 * time.Second,
+		AddDeveloperEvery:           3 * time.Second,
 		UpdateDeveloperEvery:        1 * time.Second,
 		NumDeployments:              100,
 		ReplaceDeploymentEvery:      3 * time.Second,
diff --git a/data.go b/data.go
index 6618531..3ce623e 100644
--- a/data.go
+++ b/data.go
@@ -15,12 +15,12 @@
 )
 
 type dataApidCluster struct {
-	ChangeSelector, ID, Name, OrgAppName, CreatedBy, UpdatedBy, Description string
+	ID, Name, OrgAppName, CreatedBy, UpdatedBy, Description string
 	Updated, Created                                                        string
 }
 
 type dataDataScope struct {
-	ChangeSelector, ID, ClusterID, Scope, Org, Env, CreatedBy, UpdatedBy string
+	ID, ClusterID, Scope, Org, Env, CreatedBy, UpdatedBy string
 	Updated, Created                                                     string
 }
 
@@ -46,7 +46,6 @@
 	    created_by text,
 	    updated text,
 	    updated_by text,
-	    _change_selector text,
 	    last_sequence text,
 	    PRIMARY KEY (id)
 	);
@@ -60,7 +59,6 @@
 	    created_by text,
 	    updated text,
 	    updated_by text,
-	    _change_selector text,
 	    PRIMARY KEY (id, apid_cluster_id)
 	);
 	`)
@@ -91,9 +89,9 @@
 
 	stmt, err := txn.Prepare(`
 	INSERT INTO APID_CLUSTER
-		(id, _change_selector, name, umbrella_org_app_name,
+		(id, description, name, umbrella_org_app_name,
 		created, created_by, updated, updated_by,
-		description)
+		last_sequence)
 	VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9);
 	`)
 	if err != nil {
@@ -103,9 +101,9 @@
 	defer stmt.Close()
 
 	_, err = stmt.Exec(
-		dac.ID, dac.ChangeSelector, dac.Name, dac.OrgAppName,
+		dac.ID, dac.Description, dac.Name, dac.OrgAppName,
 		dac.Created, dac.CreatedBy, dac.Updated, dac.UpdatedBy,
-		dac.Description)
+		"")
 
 	if err != nil {
 		log.Errorf("insert APID_CLUSTER failed: %v", err)
@@ -122,8 +120,8 @@
 	INSERT INTO DATA_SCOPE
 		(id, apid_cluster_id, scope, org,
 		env, created, created_by, updated,
-		updated_by, _change_selector)
-	VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10);
+		updated_by)
+	VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9);
 	`)
 	if err != nil {
 		log.Errorf("insert DATA_SCOPE failed: %v", err)
@@ -134,7 +132,7 @@
 	_, err = stmt.Exec(
 		ds.ID, ds.ClusterID, ds.Scope, ds.Org,
 		ds.Env, ds.Created, ds.CreatedBy, ds.Updated,
-		ds.UpdatedBy, ds.ChangeSelector)
+		ds.UpdatedBy)
 
 	if err != nil {
 		log.Errorf("insert DATA_SCOPE failed: %v", err)
@@ -194,24 +192,15 @@
 /*
  * Retrieve SnapshotInfo for the given apidConfigId from apid_config table
  */
-func findApidConfigInfo(qparam string) (info string) {
+func getLastSequence() (lastSequence string) {
 
-	log.Debugf("findApidConfigInfo: %s", qparam)
-
-	db := getDB()
-
-	rows, err := db.Query("select ? from APID_CLUSTER", qparam)
-	if err != nil {
-		log.Errorf("Failed to query APID_CLUSTER: %v", err)
+	err := getDB().QueryRow("select last_sequence from APID_CLUSTER LIMIT 1").Scan(&lastSequence)
+	if err != nil && err != sql.ErrNoRows {
+		log.Panicf("Failed to query APID_CLUSTER: %v", err)
 		return
 	}
-	defer rows.Close()
-	for rows.Next() {
-		rows.Scan(&info)
-	}
 
-	log.Debugf("info: %s", info)
-
+	log.Debugf("lastSequence: %s", lastSequence)
 	return
 }
 
@@ -219,26 +208,24 @@
  * Persist the last change Id each time a change has been successfully
  * processed by the plugin(s)
  */
-func persistChange(lastChange string) error {
+func updateLastSequence(lastSequence string) error {
 
-	log.Debugf("persistChange: %s", lastChange)
+	log.Debugf("updateLastSequence: %s", lastSequence)
 
-	db := getDB()
-
-	stmt, err := db.Prepare("UPDATE APID_CLUSTER SET last_sequence=$1;")
+	stmt, err := getDB().Prepare("UPDATE APID_CLUSTER SET last_sequence=$1;")
 	if err != nil {
 		log.Errorf("UPDATE APID_CLUSTER Failed: %v", err)
 		return err
 	}
 	defer stmt.Close()
 
-	_, err = stmt.Exec(lastChange)
+	_, err = stmt.Exec(lastSequence)
 	if err != nil {
 		log.Errorf("UPDATE DATA_SCOPE Failed: %v", err)
 		return err
 	}
 
-	log.Infof("UPDATE DATA_SCOPE Success: %s", lastChange)
+	log.Infof("UPDATE DATA_SCOPE Success: %s", lastSequence)
 
 	return nil
 }
diff --git a/init.go b/init.go
index e78b399..88d8274 100644
--- a/init.go
+++ b/init.go
@@ -147,10 +147,6 @@
 
 		go bootstrap()
 
-		/* Begin Looking for changes periodically */
-		log.Debug("starting update goroutine")
-		go updatePeriodicChanges()
-
 		events.Listen(ApigeeSyncEventSelector, &handler{})
 		log.Debug("Done post plugin init")
 	}
diff --git a/listener.go b/listener.go
index f488e68..bd4baee 100644
--- a/listener.go
+++ b/listener.go
@@ -138,7 +138,6 @@
 	dac := dataApidCluster{}
 
 	row.Get("id", &dac.ID)
-	row.Get("_change_selector", &dac.ChangeSelector)
 	row.Get("name", &dac.Name)
 	row.Get("umbrella_org_app_name", &dac.OrgAppName)
 	row.Get("created", &dac.Created)
@@ -155,7 +154,6 @@
 	ds := dataDataScope{}
 
 	row.Get("id", &ds.ID)
-	row.Get("_change_selector", &ds.ChangeSelector)
 	row.Get("apid_cluster_id", &ds.ClusterID)
 	row.Get("scope", &ds.Scope)
 	row.Get("org", &ds.Org)
diff --git a/listener_test.go b/listener_test.go
index ad2c272..93a9588 100644
--- a/listener_test.go
+++ b/listener_test.go
@@ -55,7 +55,6 @@
 						Rows: []common.Row{
 							{
 								"id":                    &common.ColumnVal{Value: "i"},
-								"_change_selector":      &common.ColumnVal{Value: "c"},
 								"name":                  &common.ColumnVal{Value: "n"},
 								"umbrella_org_app_name": &common.ColumnVal{Value: "o"},
 								"created":               &common.ColumnVal{Value: "c"},
@@ -71,7 +70,6 @@
 						Rows: []common.Row{
 							{
 								"id":               &common.ColumnVal{Value: "i"},
-								"_change_selector": &common.ColumnVal{Value: "c"},
 								"apid_cluster_id":  &common.ColumnVal{Value: "a"},
 								"scope":            &common.ColumnVal{Value: "s"},
 								"org":              &common.ColumnVal{Value: "o"},
@@ -100,8 +98,7 @@
 
 			rows, err := db.Query(`
 			SELECT id, name, description, umbrella_org_app_name,
-				created, created_by, updated, updated_by,
-				_change_selector
+				created, created_by, updated, updated_by
 			FROM APID_CLUSTER`)
 			Expect(err).NotTo(HaveOccurred())
 			defer rows.Close()
@@ -109,8 +106,7 @@
 			c := dataApidCluster{}
 			for rows.Next() {
 				rows.Scan(&c.ID, &c.Name, &c.Description, &c.OrgAppName,
-					&c.Created, &c.CreatedBy, &c.Updated, &c.UpdatedBy,
-					&c.ChangeSelector)
+					&c.Created, &c.CreatedBy, &c.Updated, &c.UpdatedBy)
 				dcs = append(dcs, c)
 			}
 
@@ -125,7 +121,6 @@
 			Expect(dc.CreatedBy).To(Equal("c"))
 			Expect(dc.Updated).To(Equal("u"))
 			Expect(dc.UpdatedBy).To(Equal("u"))
-			Expect(dc.ChangeSelector).To(Equal("c"))
 
 			// Data Scope
 			var dds []dataDataScope
@@ -133,7 +128,7 @@
 			rows, err = db.Query(`
 			SELECT id, apid_cluster_id, scope, org,
 				env, created, created_by, updated,
-				updated_by, _change_selector
+				updated_by
 			FROM DATA_SCOPE`)
 			Expect(err).NotTo(HaveOccurred())
 			defer rows.Close()
@@ -142,7 +137,7 @@
 			for rows.Next() {
 				rows.Scan(&d.ID, &d.ClusterID, &d.Scope, &d.Org,
 					&d.Env, &d.Created, &d.CreatedBy, &d.Updated,
-					&d.UpdatedBy, &d.ChangeSelector)
+					&d.UpdatedBy)
 				dds = append(dds, d)
 			}
 
@@ -157,7 +152,6 @@
 			Expect(ds.CreatedBy).To(Equal("c"))
 			Expect(ds.Updated).To(Equal("u"))
 			Expect(ds.UpdatedBy).To(Equal("u"))
-			Expect(ds.ChangeSelector).To(Equal("c"))
 		})
 	})
 
@@ -209,7 +203,6 @@
 							Table:     LISTENER_TABLE_DATA_SCOPE,
 							NewRow: common.Row{
 								"id":               &common.ColumnVal{Value: "i"},
-								"_change_selector": &common.ColumnVal{Value: "c"},
 								"apid_cluster_id":  &common.ColumnVal{Value: "a"},
 								"scope":            &common.ColumnVal{Value: "s"},
 								"org":              &common.ColumnVal{Value: "o"},
@@ -230,7 +223,7 @@
 				rows, err := getDB().Query(`
 				SELECT id, apid_cluster_id, scope, org,
 					env, created, created_by, updated,
-					updated_by, _change_selector
+					updated_by
 				FROM DATA_SCOPE`)
 				Expect(err).NotTo(HaveOccurred())
 				defer rows.Close()
@@ -239,7 +232,7 @@
 				for rows.Next() {
 					rows.Scan(&d.ID, &d.ClusterID, &d.Scope, &d.Org,
 						&d.Env, &d.Created, &d.CreatedBy, &d.Updated,
-						&d.UpdatedBy, &d.ChangeSelector)
+						&d.UpdatedBy)
 					dds = append(dds, d)
 				}
 
@@ -254,7 +247,6 @@
 				Expect(ds.CreatedBy).To(Equal("c"))
 				Expect(ds.Updated).To(Equal("u"))
 				Expect(ds.UpdatedBy).To(Equal("u"))
-				Expect(ds.ChangeSelector).To(Equal("c"))
 			})
 
 			It("delete event should delete", func() {
@@ -266,7 +258,6 @@
 							Table:     LISTENER_TABLE_DATA_SCOPE,
 							NewRow: common.Row{
 								"id":               &common.ColumnVal{Value: "i"},
-								"_change_selector": &common.ColumnVal{Value: "c"},
 								"apid_cluster_id":  &common.ColumnVal{Value: "a"},
 								"scope":            &common.ColumnVal{Value: "s"},
 								"org":              &common.ColumnVal{Value: "o"},
diff --git a/mock_server.go b/mock_server.go
index 72da244..592748e 100644
--- a/mock_server.go
+++ b/mock_server.go
@@ -10,20 +10,25 @@
 	"time"
 	"fmt"
 	. "github.com/onsi/ginkgo"
+	"math/rand"
+	"sync/atomic"
 )
+
 /*
-Currently limited to: 1 cluster, 1 data_scope, 1 organization, 1 env, 1 company
+Currently limited to:
+  1 cluster, 1 scope, 1 org, 1 env, 1 company
+  1 app & 1 product per developer
 
 Notes:
-cluster_id is static per params
-_change_selector == data_scope
-data_scope == org + env
-tenant_id == org
+  Scope ~= org + env
+  tenant_id == Scope for our purposes
+  (technically, data_scope.scope = tenant_id)
 
-company => * developer
-developer => * app
-application => * app_credential
-product => * app_credential
+Relations:
+  company => * developer
+  developer => * app
+  application => * app_credential
+  product => * app_credential
 */
 
 type MockParms struct {
@@ -35,9 +40,10 @@
 	Organization                string
 	Environment                 string
 	NumDevelopers               int
-	NumApplicationsPerDeveloper int
 	AddDeveloperEvery           time.Duration
 	UpdateDeveloperEvery        time.Duration
+
+	// todo: deployments
 	NumDeployments              int
 	ReplaceDeploymentEvery      time.Duration
 }
@@ -51,30 +57,6 @@
 	return m
 }
 
-func registerMockServer(testRouter apid.Router) {
-
-	p := MockParms{
-		ReliableAPI:                 true,
-		ClusterID:                   config.GetString(configApidClusterId),
-		TokenKey:                    config.GetString(configConsumerKey),
-		TokenSecret:                 config.GetString(configConsumerSecret),
-		Scope:                       "ert452",
-		Organization:                "att",
-		Environment:                 "prod",
-		NumDevelopers:               5,
-		NumApplicationsPerDeveloper: 1,
-		UpdateDeveloperEvery:        1 * time.Second,
-		NumDeployments:              100,
-		ReplaceDeploymentEvery:      3 * time.Second,
-	}
-
-	m := MockServer{}
-	m.params = p
-
-	m.init()
-	m.registerRoutes(testRouter)
-}
-
 // table name -> common.Row
 type tableRowMap map[string]common.Row
 
@@ -83,12 +65,32 @@
 	oauthToken        string
 	snapshotID        string
 	snapshotTables    map[string][]common.Table	// key = scopeID
-	sequenceID        string
 	changeChannel     chan []byte
+	sequenceID        *int64
+	maxDevID          *int64
+}
+
+func (m *MockServer) lastSequenceID() string {
+	return strconv.FormatInt(atomic.LoadInt64(m.sequenceID), 10)
+}
+
+func (m *MockServer) nextSequenceID() string {
+	return strconv.FormatInt(atomic.AddInt64(m.sequenceID, 1), 10)
+}
+
+func (m *MockServer) nextDeveloperID() string {
+	return strconv.FormatInt(atomic.AddInt64(m.maxDevID, 1), 10)
+}
+
+func (m *MockServer) randomDeveloperID() string {
+	return strconv.FormatInt(rand.Int63n(atomic.LoadInt64(m.maxDevID)), 10)
 }
 
 func (m *MockServer) init() {
+	m.sequenceID = new(int64)
+	m.maxDevID = new(int64)
 	m.changeChannel = make(chan []byte)
+
 	go m.developerGenerator()
 
 	// cluster "scope"
@@ -126,35 +128,41 @@
 
 	// generate one company
 	companyID := m.params.Organization
-	tenantID := m.params.Organization
+	tenantID := m.params.Scope
 	changeSelector := m.params.Scope
 	company := tableRowMap{
 		"kms.company": m.newRow(map[string]string{
 			"id": companyID,
 			"status": "Active",
 			"tenant_id": tenantID,
-			"_change_selector": changeSelector,
 			"name": companyID,
 			"display_name": companyID,
+			"_change_selector": changeSelector,
 		}),
 	}
 	snapshotTableRows = append(snapshotTableRows, company)
 
 	// generate a bunch of developers
 	for i := 0; i < m.params.NumDevelopers; i++ {
-		developerID := generateUUID()
-		devRows := m.createDeveloper(developerID)
-		productID := generateUUID()
-		productRows := m.createProduct(productID)
-		appRows := m.createApplication(developerID, productID)
-
-		developer := m.mergeTableRowMaps(devRows, productRows, appRows)
+		developer := m.createDeveloperWithProductAndApp()
 		snapshotTableRows = append(snapshotTableRows, developer)
 	}
 
 	m.snapshotTables[m.params.Scope] = m.concatTableRowMaps(snapshotTableRows...)
 }
 
+// developer, product, application, credential will have the same ID (developerID)
+func (m *MockServer) createDeveloperWithProductAndApp() tableRowMap {
+
+	developerID := m.nextDeveloperID()
+
+	devRows := m.createDeveloper(developerID)
+	productRows := m.createProduct(developerID)
+	appRows := m.createApplication(developerID, developerID, developerID, developerID)
+
+	return m.mergeTableRowMaps(devRows, productRows, appRows)
+}
+
 func (m *MockServer) registerRoutes(router apid.Router) {
 
 	router.HandleFunc("/accesstoken", m.unreliable(m.sendToken)).Methods("POST")
@@ -223,7 +231,6 @@
 	w.Write(body)
 }
 
-// todo: does "since" have any value?
 func (m *MockServer) sendChanges(w http.ResponseWriter, req *http.Request) {
 	defer GinkgoRecover()
 	m.registerFailHandler(w)
@@ -238,59 +245,31 @@
 	Expect(q.Get("snapshot")).To(Equal(m.snapshotID))
 
 	Expect(scopes).To(ContainElement(m.params.ClusterID))
-	Expect(scopes).To(ContainElement(m.params.Scope))
+	//Expect(scopes).To(ContainElement(m.params.Scope))
 
-	if block > 0 && since == m.sequenceID && since != "" {
+	if since != "" {
 		m.sendChange(w, time.Duration(block) * time.Second)
 		return
 	}
 
-	// todo: This is just legacy for the existing test in apigeeSync_suite_test
-	m.sequenceID = generateUUID()
-	res := &common.ChangeList{
-		LastSequence: m.sequenceID,
+	// todo: the following is just legacy for the existing test in apigeeSync_suite_test
+	developer := m.createDeveloperWithProductAndApp()
+	changeList := m.createInsertChange(developer)
+	body, err := json.Marshal(changeList)
+	if err != nil {
+		fmt.Printf("Error generating developer!\n%v\n", err)
 	}
-
-	apidDataScopeRow := m.newRow(map[string]string{
-		"id":              "apid_config_scope_id_1", // adding a new scope
-		"scope":           m.params.Scope,
-		"org":             m.params.Organization,
-		"env":             m.params.Environment,
-		"apid_cluster_id": m.params.ClusterID,
-	})
-
-	res.Changes = []common.Change{
-		{
-			Table:     "edgex.data_scope",
-			Operation: common.Insert,
-			NewRow:    apidDataScopeRow,
-		},
-	}
-
-	body, err := json.Marshal(res)
-	Expect(err).NotTo(HaveOccurred())
-
 	w.Write(body)
 }
 
+// generate developers w/ product and app
 func (m *MockServer) developerGenerator() {
 
-	tick := time.Tick(m.params.AddDeveloperEvery)
-	for range tick {
+	for range time.Tick(m.params.AddDeveloperEvery) {
 
-		// generate a random developer w/ product and app
-		developerID := generateUUID()
-		devRows := m.createDeveloper(developerID)
-		productID := generateUUID()
-		productRows := m.createProduct(productID)
-		appRows := m.createApplication(developerID, productID)
-
-		developer := m.mergeTableRowMaps(devRows, productRows, appRows)
+		developer := m.createDeveloperWithProductAndApp()
 		changeList := m.createInsertChange(developer)
 
-		m.sequenceID = generateUUID()
-		changeList.LastSequence = m.sequenceID
-
 		body, err := json.Marshal(changeList)
 		if err != nil {
 			fmt.Printf("Error generating developer!\n%v\n", err)
@@ -302,6 +281,36 @@
 	}
 }
 
+// update random developers - set username
+func (m *MockServer) developerUpdater() {
+
+	for range time.Tick(m.params.UpdateDeveloperEvery) {
+
+		developerID := m.randomDeveloperID()
+
+		oldDev := m.createDeveloper(developerID)
+		newDev := m.createDeveloper(developerID)
+
+		newRow := newDev["kms.developer"]
+		newRow["username"] = m.stringColumnVal("i_am_not_a_number")
+
+		changeList := m.createUpdateChange(oldDev, newDev)
+
+		body, err := json.Marshal(changeList)
+		if err != nil {
+			fmt.Printf("Error generating developer!\n%v\n", err)
+		}
+
+		fmt.Println("adding developer")
+		fmt.Println(string(body))
+		m.changeChannel <- body
+	}
+}
+
+func (m *MockServer) deploymentUpdater() {
+	// todo
+}
+
 func (m *MockServer) sendChange(w http.ResponseWriter, timeout time.Duration) {
 	select {
 	case change := <-m.changeChannel:
@@ -347,8 +356,7 @@
 	RegisterFailHandler(func(message string, callerSkip ...int) {
 		w.WriteHeader(400)
 		w.Write([]byte(message))
-		fmt.Printf("sending error: %#v\n", message)
-		panic(GINKGO_PANIC)
+		panic(message)
 	})
 }
 
@@ -357,19 +365,26 @@
 
 	row = common.Row{}
 	for k, v := range keyAndVals {
-		row[k] = &common.ColumnVal{
-			Value: v,
-			Type:  1,
-		}
+		row[k] = m.stringColumnVal(v)
 	}
+
+	// todo: remove this once apidVerifyAPIKey can deal with not having the field
+	row["_change_selector"] = m.stringColumnVal(m.params.Scope)
+
 	return
 }
 
+func (m *MockServer) stringColumnVal(v string) *common.ColumnVal {
+	return &common.ColumnVal{
+		Value: v,
+		Type:  1,
+	}
+}
+
 func (m *MockServer) createDeveloper(developerID string) tableRowMap {
 
 	companyID := m.params.Organization
-	tenantID := m.params.Organization
-	changeSelector := m.params.Scope
+	tenantID := m.params.Scope
 
 	rows := tableRowMap{}
 
@@ -377,14 +392,12 @@
 		"id": developerID,
 		"status": "Active",
 		"tenant_id": tenantID,
-		"_change_selector": changeSelector,
 	})
 
 	// map developer onto to existing company
 	rows["kms.company_developer"] = m.newRow(map[string]string{
 		"id": developerID,
 		"tenant_id": tenantID,
-		"_change_selector": changeSelector,
 		"company_id": companyID,
 		"developer_id": developerID,
 	})
@@ -394,36 +407,32 @@
 
 func (m *MockServer) createProduct(productID string) tableRowMap {
 
-	tenantID := m.params.Organization
-	changeSelector := m.params.Scope
+	tenantID := m.params.Scope
+
+	environments := fmt.Sprintf("{%s}", m.params.Environment)
+	resources := fmt.Sprintf("{%s}", "/") // todo: what should be here?
 
 	rows := tableRowMap{}
-	rows["kms.product"] = m.newRow(map[string]string{
+	rows["kms.api_product"] = m.newRow(map[string]string{
 		"id": productID,
-		"api_resources": "{}",
-		"environments": "{Env_0, Env_1}",
+		"api_resources": resources,
+		"environments": environments,
 		"tenant_id": tenantID,
-		"_change_selector": changeSelector,
 	})
 	return rows
 }
 
-func (m *MockServer) createApplication(developerID, productID string) tableRowMap {
+func (m *MockServer) createApplication(developerID, productID, applicationID, credentialID string) tableRowMap {
 
-	tenantID := m.params.Organization
-	changeSelector := m.params.Scope
+	tenantID := m.params.Scope
 
 	rows := tableRowMap{}
 
-	applicationID := generateUUID()
-	credentialID := generateUUID()
-
 	rows["kms.app"] = m.newRow(map[string]string{
 		"id": applicationID,
 		"developer_id": developerID,
 		"status": "Approved",
 		"tenant_id": tenantID,
-		"_change_selector": changeSelector,
 	})
 
 	rows["kms.app_credential"] = m.newRow(map[string]string{
@@ -431,7 +440,6 @@
 		"app_id": applicationID,
 		"tenant_id": tenantID,
 		"status": "Approved",
-		"_change_selector": changeSelector,
 	})
 
 	rows["kms.app_credential_apiproduct_mapper"] = m.newRow(map[string]string{
@@ -439,7 +447,6 @@
 		"app_id": applicationID,
 		"appcred_id": credentialID,
 		"status": "Approved",
-		"_change_selector": changeSelector,
 		"tenant_id": tenantID,
 	})
 
@@ -449,6 +456,8 @@
 func (m *MockServer) createInsertChange(newRows tableRowMap) common.ChangeList {
 
 	var changeList = common.ChangeList{}
+	changeList.FirstSequence = m.lastSequenceID()
+	changeList.LastSequence = m.nextSequenceID()
 	for table, row := range newRows {
 		change := common.Change{
 			Table: table,
@@ -464,6 +473,8 @@
 func (m *MockServer) createDeleteChange(oldRows tableRowMap) common.ChangeList {
 
 	var changeList = common.ChangeList{}
+	changeList.FirstSequence = m.lastSequenceID()
+	changeList.LastSequence = m.nextSequenceID()
 	for table, row := range oldRows {
 		change := common.Change{
 			Table: table,
@@ -479,6 +490,8 @@
 func (m *MockServer) createUpdateChange(oldRows, newRows tableRowMap) common.ChangeList {
 
 	var changeList = common.ChangeList{}
+	changeList.FirstSequence = m.lastSequenceID()
+	changeList.LastSequence = m.nextSequenceID()
 	for table, oldRow := range oldRows {
 		change := common.Change{
 			Table: table,
@@ -498,7 +511,7 @@
 	for _, m := range maps {
 		for name, row := range m {
 			if _, ok:= merged[name]; ok {
-				panic(fmt.Sprintf("bad merge. name: %#v, row: %#v", name, row))
+				panic(fmt.Sprintf("overwrite. name: %#v, row: %#v", name, row))
 			}
 			merged[name] = row
 		}
