add new test of enum
diff --git a/dockertests/docker_test.go b/dockertests/docker_test.go
index 0851a41..93192dc 100644
--- a/dockertests/docker_test.go
+++ b/dockertests/docker_test.go
@@ -106,11 +106,12 @@
 		})
 
 		It("should succesfully download new table from pg", func(done Done) {
-			tableName := "docker_test_a"
+			tableName := "docker_test_download"
 			targetTablename := "edgex_" + tableName
 			handler := &newTableHandler{
 				targetTablename: targetTablename,
 				done:            done,
+				verifyFunc:      verifyTestTableExist,
 			}
 
 			apid.Events().Listen(ApigeeSyncEventSelector, handler)
@@ -119,17 +120,32 @@
 		}, 1)
 
 		It("should get data according to data scope", func(done Done) {
-			tableName := "docker_test_b"
+			tableName := "docker_test_scope"
 			targetTablename := "edgex_" + tableName
-			handler := &newTableScopeHandler{
+			handler := &newTableHandler{
 				targetTablename: targetTablename,
 				done:            done,
+				verifyFunc:      verifyTestTableData,
 			}
 
 			apid.Events().Listen(ApigeeSyncEventSelector, handler)
 			createTestTableWithData(tableName)
 
 		}, 1)
+
+		It("should replicate ENUM type of pg correctly", func(done Done) {
+			tableName := "docker_test_enum"
+			targetTablename := "edgex_" + tableName
+			handler := &newTableHandler{
+				targetTablename: targetTablename,
+				done:            done,
+				verifyFunc:      verifyTestTableEnum,
+			}
+
+			apid.Events().Listen(ApigeeSyncEventSelector, handler)
+			createTestTableWithEnum(tableName)
+
+		}, 1)
 	})
 })
 
@@ -163,6 +179,25 @@
 	tx.Commit()
 }
 
+func createTestTableWithEnum(tableName string) {
+	tx, err := pgManager.BeginTransaction()
+	Expect(err).Should(Succeed())
+	defer tx.Rollback()
+	_, err = tx.Exec("CREATE TYPE mood AS ENUM ('sad', 'ok', 'happy');")
+	Expect(err).Should(Succeed())
+	_, err = tx.Exec("CREATE TABLE edgex." + tableName + " (id varchar primary key, val mood, _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', 'sad', 'foo');")
+	Expect(err).Should(Succeed())
+	_, err = tx.Exec("INSERT INTO edgex." + tableName + " values ('two', 'ok', 'bar');")
+	Expect(err).Should(Succeed())
+	_, err = tx.Exec("INSERT INTO edgex." + tableName + " values ('three', 'happy', '" + clusterIdFromConfig + "');")
+	Expect(err).Should(Succeed())
+	tx.Commit()
+}
+
 func dropTestTable(targetTableName string, sqliteDb apid.DB) {
 	tx, err := pgManager.BeginTransaction()
 	Expect(err).Should(Succeed())
@@ -300,6 +335,7 @@
 type newTableHandler struct {
 	targetTablename string
 	done            Done
+	verifyFunc      func (string, apid.DB)
 }
 
 func (n *newTableHandler) Handle(event apid.Event) {
@@ -307,13 +343,13 @@
 		defer GinkgoRecover()
 		sqliteDb, err := dataService.DBVersion(s.SnapshotInfo)
 		Expect(err).Should(Succeed())
-		Expect(verifyTestTableExist(n.targetTablename, sqliteDb)).To(BeTrue())
+		n.verifyFunc(n.targetTablename, sqliteDb)
 		apid.Events().StopListening(ApigeeSyncEventSelector, n)
 		close(n.done)
 	}
 }
 
-func verifyTestTableExist(targetTableName string, sqliteDb apid.DB) bool {
+func verifyTestTableExist(targetTableName string, sqliteDb apid.DB) {
 	rows, err := sqliteDb.Query("SELECT DISTINCT tableName FROM _transicator_tables;")
 	Expect(err).Should(Succeed())
 	defer rows.Close()
@@ -323,26 +359,10 @@
 		Expect(err).Should(Succeed())
 
 		if tableName == targetTableName {
-			return true
+			return
 		}
 	}
-	return false
-}
-
-type newTableScopeHandler struct {
-	targetTablename string
-	done            Done
-}
-
-func (n *newTableScopeHandler) Handle(event apid.Event) {
-	if s, ok := event.(*common.Snapshot); ok {
-		defer GinkgoRecover()
-		sqliteDb, err := dataService.DBVersion(s.SnapshotInfo)
-		Expect(err).Should(Succeed())
-		verifyTestTableData(n.targetTablename, sqliteDb)
-		apid.Events().StopListening(ApigeeSyncEventSelector, n)
-		close(n.done)
-	}
+	Fail("Table " + targetTableName + " doesn'r exist!")
 }
 
 func verifyTestTableData(targetTableName string, sqliteDb apid.DB) {
@@ -360,6 +380,21 @@
 	Expect(count).To(Equal(1))
 }
 
+func verifyTestTableEnum(targetTableName string, sqliteDb apid.DB) {
+	rows, err := sqliteDb.Query("SELECT val FROM " + targetTableName + ";")
+	Expect(err).Should(Succeed())
+	defer rows.Close()
+	count := 0
+	for rows.Next() {
+		var val string
+		err = rows.Scan(&val)
+		Expect(err).Should(Succeed())
+		Expect(val).To(Equal("happy"))
+		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 6c7dfd4..bbe28e9 100644
--- a/dockertests/management_pg.go
+++ b/dockertests/management_pg.go
@@ -195,6 +195,8 @@
  * Only test data for the whole suite will remain in the pg.
  */
 func (m *ManagementPg) CleanupTest() error {
+
+	// clean tables
 	tablesToDelete := make([]string, 0)
 	rows, err := m.pg.Query("SELECT table_name FROM information_schema.tables WHERE table_schema='edgex';")
 	if err != nil {
@@ -222,7 +224,34 @@
 	}
 	cleanupSql := "DELETE FROM edgex.apid_cluster WHERE created_by!='" + testInitUser + "';"
 	_, err = m.pg.Exec(cleanupSql)
-	return err
+	if err != nil {
+		return err
+	}
+
+	// clean enum types
+	typesToDelete := make([]string, 0)
+	typeRows, err := m.pg.Query("SELECT DISTINCT pg_type.typname AS enumtype FROM pg_type JOIN pg_enum ON pg_enum.enumtypid = pg_type.oid;")
+	if err != nil {
+		return err
+	}
+	defer typeRows.Close()
+	for typeRows.Next() {
+		var typeName string
+		err = typeRows.Scan(&typeName)
+		if err != nil {
+			return err
+		}
+		typesToDelete = append(typesToDelete, typeName)
+	}
+
+	for _, typeName := range typesToDelete {
+		cleanupSql := "DROP TYPE edgex." + typeName + ";"
+		_, err := m.pg.Exec(cleanupSql)
+		if err != nil {
+			return err
+		}
+	}
+	return nil
 }
 
 func (m *ManagementPg) CleanupAll() error {