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 {
