add cleanup for test
diff --git a/dockertests/const.go b/dockertests/const.go
index 26926ff..1fdd217 100644
--- a/dockertests/const.go
+++ b/dockertests/const.go
@@ -15,15 +15,21 @@
 package dockertests
 
 const (
-	pluginName                       = "apigeeSyncDockerTest"
-	configApidClusterId       = "apigeesync_cluster_id"
-	configProxyServerBaseURI         = "apigeesync_proxy_server_base"
-	configLocalStoragePath = "local_storage_path"
-	configConsumerKey                = "apigeesync_consumer_key"
-	configConsumerSecret             = "apigeesync_consumer_secret"
-	configName                       = "apigeesync_instance_name"
-	ApigeeSyncEventSelector          = "ApigeeSync"
-	testInitUser = "dockerTestInit"
+	pluginName               = "apigeeSyncDockerTest"
+	configApidClusterId      = "apigeesync_cluster_id"
+	configProxyServerBaseURI = "apigeesync_proxy_server_base"
+	configLocalStoragePath   = "local_storage_path"
+	configConsumerKey        = "apigeesync_consumer_key"
+	configConsumerSecret     = "apigeesync_consumer_secret"
+	configName               = "apigeesync_instance_name"
+	ApigeeSyncEventSelector  = "ApigeeSync"
+	testInitUser             = "dockerTestInit"
+	basicTables              = map[string]bool{
+		"deployment_history": true,
+		"deployment":         true,
+		"bundle_config":      true,
+		"configuration":      true,
+		"apid_cluster":       true,
+		"data_scope":         true,
+	}
 )
-
-
diff --git a/dockertests/docker_test.go b/dockertests/docker_test.go
index 1e0b24d..c787115 100644
--- a/dockertests/docker_test.go
+++ b/dockertests/docker_test.go
@@ -15,26 +15,26 @@
 package dockertests
 
 import (
+	"encoding/json"
 	"github.com/30x/apid-core"
 	"github.com/30x/apid-core/factory"
 	_ "github.com/30x/apidApigeeSync"
+	"github.com/apigee-labs/transicator/common"
 	. "github.com/onsi/ginkgo"
 	. "github.com/onsi/gomega"
 	"net/http/httptest"
 	"os"
 	"testing"
 	"time"
-	"encoding/json"
-	"github.com/apigee-labs/transicator/common"
 )
 
 var (
-	services  apid.Services
-	log       apid.LogService
-	dataService     apid.DataService
-	config    apid.ConfigService
-	pgUrl     string
-	pgManager *ManagementPg
+	services            apid.Services
+	log                 apid.LogService
+	dataService         apid.DataService
+	config              apid.ConfigService
+	pgUrl               string
+	pgManager           *ManagementPg
 	clusterIdFromConfig string
 )
 
@@ -48,8 +48,6 @@
 	pgUrl = os.Getenv("APIGEE_SYNC_DOCKER_PG_URL") + "?sslmode=disable"
 	os.Setenv("APID_CONFIG_FILE", "./apid_config.yaml")
 
-
-
 	apid.Initialize(factory.DefaultServicesFactory())
 	config = apid.Config()
 
@@ -73,7 +71,6 @@
 	initDone := make(chan bool)
 	handler := &waitSnapshotHandler{initDone}
 
-
 	// hang until snapshot received
 	apid.Events().Listen(ApigeeSyncEventSelector, handler)
 
@@ -83,47 +80,44 @@
 	apid.RegisterPlugin(initPlugin)
 	apid.InitializePlugins("dockerTest")
 
-	<- initDone
+	<-initDone
 }, 5)
 
 var _ = AfterSuite(func() {
-	//pgManager.CleanupAll()
+	err := pgManager.CleanupAll()
+	Expect(err).Should(Succeed())
 })
 
 var _ = Describe("dockerIT", func() {
 
+	/*
+	 * Isolation between tests is not perfect.
+	 * If in a test you listen to any event, please make sure you stop listening to it,
+	 * and don't let it mess up later tests.
+	 */
 	Context("Generic Replication", func() {
 		var _ = BeforeEach(func() {
 
 		})
 
 		var _ = AfterEach(func() {
-			//pgManager.CleanupTest()
+			err := pgManager.CleanupTest()
+			Expect(err).Should(Succeed())
 		})
 
 		It("should succesfully download new table from pg", func(done Done) {
-			//log.Debug("CS: " + config.GetString(configChangeServerBaseURI))
-			//log.Debug("SS: " + config.GetString(configSnapServerBaseURI))
-			//log.Debug("Auth: " + config.GetString(configProxyServerBaseURI))
 			tableName := "docker_test"
 			targetTablename := "edgex_" + tableName
-			apid.Events().ListenFunc(ApigeeSyncEventSelector, func(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(targetTablename, sqliteDb)).To(BeTrue())
-						dropTestTable(tableName, sqliteDb)
-						close(done)
-					}()
-				}
-			})
+			handler := &newTableHandler{
+				targetTablename: targetTablename,
+				done:            done,
+			}
 
-			createTestTable(tableName);
-
+			apid.Events().Listen(ApigeeSyncEventSelector, handler)
+			createTestTable(tableName)
 
 		}, 1)
+
 	})
 })
 
@@ -153,7 +147,7 @@
 		err = rows.Scan(&tableName)
 		Expect(err).Should(Succeed())
 
-		if tableName==targetTableName {
+		if tableName == targetTableName {
 			return true
 		}
 	}
@@ -193,7 +187,7 @@
 }
 
 func initPgData() {
-	clusterIdFromConfig = config.GetString(configApidClusterId)//"4c6bb536-0d64-43ca-abae-17c08f1a7e58"
+	clusterIdFromConfig = config.GetString(configApidClusterId) //"4c6bb536-0d64-43ca-abae-17c08f1a7e58"
 	clusterId := clusterIdFromConfig
 	scopeId := "ae418890-2c22-4c6a-b218-69e261034b96"
 	deploymentId := "633af126-ee79-4a53-bef7-7ba30da8aad6"
@@ -228,45 +222,44 @@
 	}
 
 	bf := bundleConfigData{
-		Id: bundleConfigId,
-		Created: t.Format(time.RFC3339),
+		Id:        bundleConfigId,
+		Created:   t.Format(time.RFC3339),
 		CreatedBy: testInitUser,
-		Updated: t.Format(time.RFC3339),
+		Updated:   t.Format(time.RFC3339),
 		UpdatedBy: testInitUser,
-		Name: bundleConfigName,
-		Uri: bundleUri,
+		Name:      bundleConfigName,
+		Uri:       bundleUri,
 	}
 
 	jsonBytes, err := json.Marshal(bf)
 	Expect(err).Should(Succeed())
 
-
 	bfr := &bundleConfigRow{
-		id: bf.Id,
-		scopeId: scopeId,
-		name: bf.Name,
-		uri: bf.Uri,
+		id:           bf.Id,
+		scopeId:      scopeId,
+		name:         bf.Name,
+		uri:          bf.Uri,
 		checksumType: "",
-		checksum: "",
-		created: t,
-		createdBy: bf.CreatedBy,
-		updated: t,
-		updatedBy: bf.UpdatedBy,
+		checksum:     "",
+		created:      t,
+		createdBy:    bf.CreatedBy,
+		updated:      t,
+		updatedBy:    bf.UpdatedBy,
 	}
 
 	d := &deploymentRow{
-		id: deploymentId,
-		configId: bundleConfigId,
-		clusterId: clusterId,
-		scopeId: scopeId,
+		id:               deploymentId,
+		configId:         bundleConfigId,
+		clusterId:        clusterId,
+		scopeId:          scopeId,
 		bundleConfigName: bundleConfigName,
 		bundleConfigJson: string(jsonBytes),
-		configJson: "{}",
-		created: t,
-		createdBy: testInitUser,
-		updated: t,
-		updatedBy: testInitUser,
-		changeSelector: clusterId,
+		configJson:       "{}",
+		created:          t,
+		createdBy:        testInitUser,
+		updated:          t,
+		updatedBy:        testInitUser,
+		changeSelector:   clusterId,
 	}
 
 	tx, err := pgManager.BeginTransaction()
@@ -295,6 +288,24 @@
 	}
 }
 
+type newTableHandler struct {
+	targetTablename string
+	done            Done
+}
+
+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)
+		}()
+	}
+}
+
 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 d46c8c6..b8a6f3d 100644
--- a/dockertests/management_pg.go
+++ b/dockertests/management_pg.go
@@ -17,6 +17,7 @@
 import (
 	"database/sql"
 	_ "github.com/lib/pq"
+	"fmt"
 )
 
 type ManagementPg struct {
@@ -179,9 +180,39 @@
 	return tx, err
 }
 
+/*
+ * Delete all new tables or rows created by a test from pg.
+ * Only test data for the whole suite will remain in the pg.
+ */
 func (m *ManagementPg) CleanupTest() error {
+	tablesToDelete := make([]string, 0)
+	rows, err := m.pg.Query("SELECT table_name FROM information_schema.tables WHERE table_schema='edgex';")
+	if err != nil {
+		return err
+	}
+	defer rows.Close()
+	for rows.Next() {
+		var tableName string
+		err = rows.Scan(&tableName)
+		if err != nil {
+			return err
+		}
+
+		if !basicTables[tableName] {
+			tablesToDelete = append(tablesToDelete, tableName)
+		}
+	}
+
+	for _, tableName := range tablesToDelete {
+		fmt.Println("Drop table: " + tableName)
+		cleanupSql := "DROP TABLE edgex." + tableName + ";"
+		_, err := m.pg.Exec(cleanupSql)
+		if err != nil {
+			return err
+		}
+	}
 	cleanupSql := "DELETE FROM edgex.apid_cluster WHERE created_by!='" + testInitUser + "';"
-	_, err := m.pg.Exec(cleanupSql)
+	_, err = m.pg.Exec(cleanupSql)
 	return err
 }
 
diff --git a/dockertests/pg_table_data.go b/dockertests/pg_table_data.go
index 12d047b..0a1aecd 100644
--- a/dockertests/pg_table_data.go
+++ b/dockertests/pg_table_data.go
@@ -78,13 +78,12 @@
 	changeSelector   string
 }
 
-
 type bundleConfigData struct {
-	Id string `json:"id"`
-	Created string `json:"created"`
+	Id        string `json:"id"`
+	Created   string `json:"created"`
 	CreatedBy string `json:"createdBy"`
-	Updated string `json:"updated"`
+	Updated   string `json:"updated"`
 	UpdatedBy string `json:"updatedBy"`
-	Name string `json:"name"`
-	Uri string `json:"uri"`
-}
\ No newline at end of file
+	Name      string `json:"name"`
+	Uri       string `json:"uri"`
+}