diff --git a/data.go b/data.go
index aeb0203..eca1491 100644
--- a/data.go
+++ b/data.go
@@ -516,6 +516,54 @@
 	return err
 }
 
+func (dbc *dbManager) getClusterCount() (numApidClusters int, err error) {
+	rows, err := dbc.db.Query("SELECT COUNT(*) FROM edgex_apid_cluster")
+	if err != nil {
+		return
+	}
+	defer rows.Close()
+	rows.Next()
+	err = rows.Scan(&numApidClusters)
+	return
+}
+
+func (dbc *dbManager) alterClusterTable() (err error) {
+	_, err = dbc.db.Exec("ALTER TABLE edgex_apid_cluster ADD COLUMN last_sequence text DEFAULT ''")
+	if err.Error() == "duplicate column name: last_sequence" {
+		return nil
+	}
+	return
+}
+
+func (dbc *dbManager) writeTransaction(changes *common.ChangeList) bool {
+	tx, err := dbc.getDb().Begin()
+	if err != nil {
+		log.Panicf("Error processing ChangeList: %v", err)
+	}
+	defer tx.Rollback()
+	var ok bool
+	for _, change := range changes.Changes {
+		switch change.Operation {
+		case common.Insert:
+			ok = dbc.insert(change.Table, []common.Row{change.NewRow}, tx)
+		case common.Update:
+			ok = dbc.update(change.Table, []common.Row{change.OldRow}, []common.Row{change.NewRow}, tx)
+		case common.Delete:
+			ok = dbc.deleteRowsFromTable(change.Table, []common.Row{change.OldRow}, tx)
+		}
+		if !ok {
+			log.Error("Sql Operation error. Operation rollbacked")
+			return ok
+		}
+	}
+	err = tx.Commit()
+	if err != nil {
+		log.Errorf("Error processing ChangeList: %v", err)
+		return false
+	}
+	return ok
+}
+
 /*
  * generates a random uuid (mix of timestamp & crypto random string)
  */
diff --git a/data_test.go b/data_test.go
index 11a4a6c..e1bf8dc 100644
--- a/data_test.go
+++ b/data_test.go
@@ -19,37 +19,44 @@
 	. "github.com/onsi/ginkgo"
 	. "github.com/onsi/gomega"
 	"sort"
+	"sync"
 )
 
 var _ = Describe("data access tests", func() {
-
+	var testCount int
+	var testDbMan *dbManager
 	BeforeEach(func() {
-		db := getDB()
+		testCount += 1
+		testDbMan = &dbManager{
+			dbMux: sync.RWMutex{},
+		}
+
+		db := testDbMan.getDb()
 
 		//all tests in this file operate on the api_product table.  Create the necessary tables for this here
-		getDB().Exec("CREATE TABLE _transicator_tables " +
+		db.Exec("CREATE TABLE _transicator_tables " +
 			"(tableName varchar not null, columnName varchar not null, " +
 			"typid integer, primaryKey bool);")
-		getDB().Exec("DELETE from _transicator_tables")
-		getDB().Exec("INSERT INTO _transicator_tables VALUES('kms_api_product','id',2950,1)")
-		getDB().Exec("INSERT INTO _transicator_tables VALUES('kms_api_product','tenant_id',1043,1)")
-		getDB().Exec("INSERT INTO _transicator_tables VALUES('kms_api_product','description',1043,0)")
-		getDB().Exec("INSERT INTO _transicator_tables VALUES('kms_api_product','api_resources',1015,0)")
-		getDB().Exec("INSERT INTO _transicator_tables VALUES('kms_api_product','approval_type',1043,0)")
-		getDB().Exec("INSERT INTO _transicator_tables VALUES('kms_api_product','scopes',1015,0)")
-		getDB().Exec("INSERT INTO _transicator_tables VALUES('kms_api_product','proxies',1015,0)")
-		getDB().Exec("INSERT INTO _transicator_tables VALUES('kms_api_product','environments',1015,0)")
-		getDB().Exec("INSERT INTO _transicator_tables VALUES('kms_api_product','created_at',1114,1)")
-		getDB().Exec("INSERT INTO _transicator_tables VALUES('kms_api_product','created_by',1043,0)")
-		getDB().Exec("INSERT INTO _transicator_tables VALUES('kms_api_product','updated_at',1114,1)")
-		getDB().Exec("INSERT INTO _transicator_tables VALUES('kms_api_product','updated_by',1043,0)")
-		getDB().Exec("INSERT INTO _transicator_tables VALUES('kms_api_product','_change_selector',1043,0)")
+		db.Exec("DELETE from _transicator_tables")
+		db.Exec("INSERT INTO _transicator_tables VALUES('kms_api_product','id',2950,1)")
+		db.Exec("INSERT INTO _transicator_tables VALUES('kms_api_product','tenant_id',1043,1)")
+		db.Exec("INSERT INTO _transicator_tables VALUES('kms_api_product','description',1043,0)")
+		db.Exec("INSERT INTO _transicator_tables VALUES('kms_api_product','api_resources',1015,0)")
+		db.Exec("INSERT INTO _transicator_tables VALUES('kms_api_product','approval_type',1043,0)")
+		db.Exec("INSERT INTO _transicator_tables VALUES('kms_api_product','scopes',1015,0)")
+		db.Exec("INSERT INTO _transicator_tables VALUES('kms_api_product','proxies',1015,0)")
+		db.Exec("INSERT INTO _transicator_tables VALUES('kms_api_product','environments',1015,0)")
+		db.Exec("INSERT INTO _transicator_tables VALUES('kms_api_product','created_at',1114,1)")
+		db.Exec("INSERT INTO _transicator_tables VALUES('kms_api_product','created_by',1043,0)")
+		db.Exec("INSERT INTO _transicator_tables VALUES('kms_api_product','updated_at',1114,1)")
+		db.Exec("INSERT INTO _transicator_tables VALUES('kms_api_product','updated_by',1043,0)")
+		db.Exec("INSERT INTO _transicator_tables VALUES('kms_api_product','_change_selector',1043,0)")
 
-		getDB().Exec("CREATE TABLE kms_api_product (id text,tenant_id text,name text, description text, " +
+		db.Exec("CREATE TABLE kms_api_product (id text,tenant_id text,name text, description text, " +
 			"api_resources text,approval_type text,scopes text,proxies text, environments text," +
 			"created_at blob, created_by text,updated_at blob,updated_by text,_change_selector text, " +
 			"primary key (id,tenant_id,created_at,updated_at));")
-		getDB().Exec("DELETE from kms_api_product")
+		db.Exec("DELETE from kms_api_product")
 
 		setDB(db)
 		initDB(db)
diff --git a/init.go b/init.go
index 3ad221e..d8226de 100644
--- a/init.go
+++ b/init.go
@@ -22,6 +22,7 @@
 	"time"
 
 	"github.com/30x/apid-core"
+	"sync"
 )
 
 const (
@@ -102,7 +103,9 @@
 		},
 	}
 
-	dbMan = &dbManager{}
+	dbMan = &dbManager{
+		dbMux: sync.RWMutex{},
+	}
 
 	// set up default database
 	err := dbMan.initDefaultDb()
diff --git a/listener.go b/listener.go
index c269b8f..76ec295 100644
--- a/listener.go
+++ b/listener.go
@@ -52,71 +52,27 @@
 
 func (lm *listenerManager) processSqliteSnapshot(db apid.DB) {
 
-	var numApidClusters int
-	apidClusters, err := db.Query("SELECT COUNT(*) FROM edgex_apid_cluster")
-	if err != nil {
-		log.Panicf("Unable to read database: %s", err.Error())
-	}
-	apidClusters.Next()
-	err = apidClusters.Scan(&numApidClusters)
-	if err != nil {
-		log.Panicf("Unable to read database: %s", err.Error())
+	if count, err := lm.dbm.getClusterCount(); err != nil || count != 1 {
+		log.Panicf("Illegal state for apid_cluster. Must be a single row. %v", err)
 	}
 
-	if numApidClusters != 1 {
-		log.Panic("Illegal state for apid_cluster. Must be a single row.")
-	}
-
-	_, err = db.Exec("ALTER TABLE edgex_apid_cluster ADD COLUMN last_sequence text DEFAULT ''")
-	if err != nil {
-		if err.Error() == "duplicate column name: last_sequence" {
-			return
-		} else {
-			log.Error("[[" + err.Error() + "]]")
-			log.Panicf("Unable to create last_sequence column on DB.  Unrecoverable error ", err)
-		}
+	if err := lm.dbm.alterClusterTable(); err != nil {
+		log.Panicf("Unable to create last_sequence column on DB.  Unrecoverable error %v", err)
 	}
 }
 
 func (lm *listenerManager) processChangeList(changes *common.ChangeList) bool {
 
-	ok := false
-
-	tx, err := lm.dbm.getDb().Begin()
-	if err != nil {
-		log.Panicf("Error processing ChangeList: %v", err)
-		return ok
-	}
-	defer tx.Rollback()
-
 	log.Debugf("apigeeSyncEvent: %d changes", len(changes.Changes))
 
 	for _, change := range changes.Changes {
 		if change.Table == LISTENER_TABLE_APID_CLUSTER {
 			log.Panicf("illegal operation: %s for %s", change.Operation, change.Table)
 		}
-		switch change.Operation {
-		case common.Insert:
-			ok = lm.dbm.insert(change.Table, []common.Row{change.NewRow}, tx)
-		case common.Update:
-			if change.Table == LISTENER_TABLE_DATA_SCOPE {
-				log.Panicf("illegal operation: %s for %s", change.Operation, change.Table)
-			}
-			ok = lm.dbm.update(change.Table, []common.Row{change.OldRow}, []common.Row{change.NewRow}, tx)
-		case common.Delete:
-			ok = lm.dbm.deleteRowsFromTable(change.Table, []common.Row{change.OldRow}, tx)
-		}
-		if !ok {
-			log.Error("Sql Operation error. Operation rollbacked")
-			return ok
+		if change.Operation == common.Update && change.Table == LISTENER_TABLE_DATA_SCOPE {
+			log.Panicf("illegal operation: %s for %s", change.Operation, change.Table)
 		}
 	}
 
-	err = tx.Commit()
-	if err != nil {
-		log.Panicf("Error processing ChangeList: %v", err)
-		return false
-	}
-
-	return ok
+	return lm.dbm.writeTransaction(changes)
 }
diff --git a/managerInterfaces.go b/managerInterfaces.go
index 53a4492..e406784 100644
--- a/managerInterfaces.go
+++ b/managerInterfaces.go
@@ -58,6 +58,9 @@
 	getApidInstanceInfo() (info apidInstanceInfo, err error)
 	getLastSequence() string
 	updateLastSequence(lastSequence string) error
+	getClusterCount() (numApidClusters int, err error)
+	alterClusterTable() (err error)
+	writeTransaction(*common.ChangeList) bool
 }
 
 type listenerManagerInterface interface {
diff --git a/token.go b/token.go
index 991463c..e21a10d 100644
--- a/token.go
+++ b/token.go
@@ -51,6 +51,9 @@
 		invalidateDone:      make(chan bool),
 		isClosed:            &isClosedInt,
 		dbm:                 dbm,
+		proxyServerBaseUri:  config.GetString(configProxyServerBaseURI),
+		clientId:            config.GetString(configConsumerKey),
+		clientSecret:        config.GetString(configConsumerSecret),
 	}
 	return t
 }
@@ -67,6 +70,9 @@
 	invalidateDone      chan bool
 	dbm                 dbManagerInterface
 	notNewInstanceId    bool
+	proxyServerBaseUri  string
+	clientId            string
+	clientSecret        string
 }
 
 func (t *tokenManager) start() {
@@ -144,10 +150,10 @@
 func (t *tokenManager) retrieveNewToken() {
 
 	log.Debug("Getting OAuth token...")
-	uriString := config.GetString(configProxyServerBaseURI)
+	uriString := t.proxyServerBaseUri
 	uri, err := url.Parse(uriString)
 	if err != nil {
-		log.Panicf("unable to parse uri config '%s' value: '%s': %v", configProxyServerBaseURI, uriString, err)
+		log.Panicf("unable to parse uri value: '%s': %v", uriString, err)
 	}
 	uri.Path = path.Join(uri.Path, "/accesstoken")
 
@@ -158,8 +164,8 @@
 	return func(_ chan bool) error {
 		form := url.Values{}
 		form.Set("grant_type", "client_credentials")
-		form.Add("client_id", config.GetString(configConsumerKey))
-		form.Add("client_secret", config.GetString(configConsumerSecret))
+		form.Add("client_id", t.clientId)
+		form.Add("client_secret", t.clientSecret)
 		req, err := http.NewRequest("POST", uri.String(), bytes.NewBufferString(form.Encode()))
 		req.Header.Set("Content-Type", "application/x-www-form-urlencoded; param=value")
 		req.Header.Set("display_name", apidInfo.InstanceName)
@@ -219,7 +225,6 @@
 			}
 		}
 		t.token = &token
-		config.Set(configBearerToken, token.AccessToken)
 
 		return nil
 	}
diff --git a/token_test.go b/token_test.go
index 4a0c3e6..e75b54d 100644
--- a/token_test.go
+++ b/token_test.go
@@ -221,37 +221,57 @@
 func (d *dummyDbMan) initDefaultDb() error {
 	return nil
 }
+
 func (d *dummyDbMan) setDb(apid.DB) {}
+
 func (d *dummyDbMan) getDb() apid.DB {
 	return nil
 }
+
 func (d *dummyDbMan) insert(tableName string, rows []common.Row, txn *sql.Tx) bool {
 	return true
 }
+
 func (d *dummyDbMan) deleteRowsFromTable(tableName string, rows []common.Row, txn *sql.Tx) bool {
 	return true
 }
+
 func (d *dummyDbMan) update(tableName string, oldRows, newRows []common.Row, txn *sql.Tx) bool {
 	return true
 }
+
 func (d *dummyDbMan) getPkeysForTable(tableName string) ([]string, error) {
 	return nil, nil
 }
+
 func (d *dummyDbMan) findScopesForId(configId string) []string {
 	return nil
 }
+
 func (d *dummyDbMan) getDefaultDb() (apid.DB, error) {
 	return nil, nil
 }
+
 func (d *dummyDbMan) updateApidInstanceInfo() error {
 	return nil
 }
+
 func (d *dummyDbMan) getApidInstanceInfo() (info apidInstanceInfo, err error) {
 	return
 }
+
 func (d *dummyDbMan) getLastSequence() string {
 	return ""
 }
+
 func (d *dummyDbMan) updateLastSequence(lastSequence string) error {
 	return nil
 }
+
+func (d *dummyDbMan) getClusterCount() (int, error) {
+	return 1, nil
+}
+
+func (d *dummyDbMan) alterClusterTable() error {
+	return nil
+}
