diff --git a/dockertests/docker_test.go b/dockertests/docker_test.go
index c787115..87eff5d 100644
--- a/dockertests/docker_test.go
+++ b/dockertests/docker_test.go
@@ -106,7 +106,7 @@
 		})
 
 		It("should succesfully download new table from pg", func(done Done) {
-			tableName := "docker_test"
+			tableName := "docker_test_a"
 			targetTablename := "edgex_" + tableName
 			handler := &newTableHandler{
 				targetTablename: targetTablename,
@@ -118,6 +118,18 @@
 
 		}, 1)
 
+		It("should get data according to data scope", func(done Done) {
+			tableName := "docker_test_b"
+			targetTablename := "edgex_" + tableName
+			handler := &newTableHandler{
+				targetTablename: targetTablename,
+				done:            done,
+			}
+
+			apid.Events().Listen(ApigeeSyncEventSelector, handler)
+			createTestTableWithData(tableName)
+
+		}, 1)
 	})
 })
 
@@ -129,6 +141,17 @@
 	Expect(err).Should(Succeed())
 	_, err = tx.Exec("ALTER TABLE edgex." + tableName + " replica identity full;")
 	Expect(err).Should(Succeed())
+	tx.Commit()
+}
+
+func createTestTableWithData(tableName string) {
+	tx, err := pgManager.BeginTransaction()
+	Expect(err).Should(Succeed())
+	defer tx.Rollback()
+	_, err = tx.Exec("CREATE TABLE edgex." + tableName + " (id varchar primary key, val integer, _change_selector varchar);")
+	Expect(err).Should(Succeed())
+	_, err = tx.Exec("ALTER TABLE edgex." + tableName + " replica identity full;")
+	Expect(err).Should(Succeed())
 	_, err = tx.Exec("INSERT INTO edgex." + tableName + " values ('one', 1, 'foo');")
 	Expect(err).Should(Succeed())
 	_, err = tx.Exec("INSERT INTO edgex." + tableName + " values ('two', 2, 'bar');")
@@ -138,22 +161,6 @@
 	tx.Commit()
 }
 
-func verifyTestTable(targetTableName string, sqliteDb apid.DB) bool {
-	rows, err := sqliteDb.Query("SELECT DISTINCT tableName FROM _transicator_tables;")
-	Expect(err).Should(Succeed())
-	defer rows.Close()
-	for rows.Next() {
-		var tableName string
-		err = rows.Scan(&tableName)
-		Expect(err).Should(Succeed())
-
-		if tableName == targetTableName {
-			return true
-		}
-	}
-	return false
-}
-
 func dropTestTable(targetTableName string, sqliteDb apid.DB) {
 	tx, err := pgManager.BeginTransaction()
 	Expect(err).Should(Succeed())
@@ -295,17 +302,60 @@
 
 func (n *newTableHandler) Handle(event apid.Event) {
 	if s, ok := event.(*common.Snapshot); ok {
-		go func() {
-			defer GinkgoRecover()
-			sqliteDb, err := dataService.DBVersion(s.SnapshotInfo)
-			Expect(err).Should(Succeed())
-			Expect(verifyTestTable(n.targetTablename, sqliteDb)).To(BeTrue())
-			apid.Events().StopListening(ApigeeSyncEventSelector, n)
-			close(n.done)
-		}()
+		sqliteDb, err := dataService.DBVersion(s.SnapshotInfo)
+		Expect(err).Should(Succeed())
+		Expect(verifyTestTableExist(n.targetTablename, sqliteDb)).To(BeTrue())
+		apid.Events().StopListening(ApigeeSyncEventSelector, n)
+		close(n.done)
 	}
 }
 
+func verifyTestTableExist(targetTableName string, sqliteDb apid.DB) bool {
+	rows, err := sqliteDb.Query("SELECT DISTINCT tableName FROM _transicator_tables;")
+	Expect(err).Should(Succeed())
+	defer rows.Close()
+	for rows.Next() {
+		var tableName string
+		err = rows.Scan(&tableName)
+		Expect(err).Should(Succeed())
+
+		if tableName == targetTableName {
+			return true
+		}
+	}
+	return false
+}
+
+type newTableScopeHandler struct {
+	targetTablename string
+	done            Done
+}
+
+func (n *newTableScopeHandler) Handle(event apid.Event) {
+	if s, ok := event.(*common.Snapshot); ok {
+		sqliteDb, err := dataService.DBVersion(s.SnapshotInfo)
+		Expect(err).Should(Succeed())
+		verifyTestTableData(n.targetTablename, sqliteDb)
+		apid.Events().StopListening(ApigeeSyncEventSelector, n)
+		close(n.done)
+	}
+}
+
+func verifyTestTableData(targetTableName string, sqliteDb apid.DB) {
+	rows, err := sqliteDb.Query("SELECT id FROM " + targetTableName + ";")
+	Expect(err).Should(Succeed())
+	defer rows.Close()
+	count := 0
+	for rows.Next() {
+		var id string
+		err = rows.Scan(&id)
+		Expect(err).Should(Succeed())
+		Expect(id).To(Equal("three"))
+		count += 1
+	}
+	Expect(count).To(Equal(1))
+}
+
 func TestDockerApigeeSync(t *testing.T) {
 	RegisterFailHandler(Fail)
 	RunSpecs(t, "ApigeeSync Docker Suite")
diff --git a/dockertests/management_pg.go b/dockertests/management_pg.go
index 0a5048f..6c7dfd4 100644
--- a/dockertests/management_pg.go
+++ b/dockertests/management_pg.go
@@ -16,7 +16,6 @@
 
 import (
 	"database/sql"
-	"fmt"
 	_ "github.com/lib/pq"
 )
 
@@ -215,7 +214,6 @@
 	}
 
 	for _, tableName := range tablesToDelete {
-		fmt.Println("Drop table: " + tableName)
 		cleanupSql := "DROP TABLE edgex." + tableName + ";"
 		_, err := m.pg.Exec(cleanupSql)
 		if err != nil {
