add map to store columns
diff --git a/apigee_sync_test.go b/apigee_sync_test.go
index d81ec32..b885593 100644
--- a/apigee_sync_test.go
+++ b/apigee_sync_test.go
@@ -84,7 +84,7 @@
 			apid.Events().ListenFunc(ApigeeSyncEventSelector, func(event apid.Event) {
 				if s, ok := event.(*common.Snapshot); ok {
 
-					Expect(16).To(Equal(len(knownTables)))
+					Expect(12).To(Equal(len(knownTables)))
 					Expect(changesRequireDDLSync(expectedSnapshotTables)).To(BeFalse())
 
 					lastSnapshot = s
diff --git a/changes.go b/changes.go
index 993613f..9f26466 100644
--- a/changes.go
+++ b/changes.go
@@ -317,6 +317,27 @@
 }
 
 /*
+ * Determine if any columns added/dropped in any table
+ */
+func changesHavecolumnsChanged(a map[string]bool, changes []common.Change) bool {
+
+	//nil maps should not be passed in.  Making the distinction between nil map and empty map
+	if a == nil {
+		log.Warn("Nil map passed to function changesHaveNewTables, may be bug")
+		return true
+	}
+
+	for _, change := range changes {
+		if !a[normalizeTableName(change.Table)] {
+			log.Infof("Unable to find %s table in current known tables", change.Table)
+			return true
+		}
+	}
+
+	return false
+}
+
+/*
  * seqCurr.Compare() will return 1, if its newer than seqPrev,
  * else will return 0, if same, or -1 if older.
  */
diff --git a/snapshot.go b/snapshot.go
index 960b4fc..ae889e3 100644
--- a/snapshot.go
+++ b/snapshot.go
@@ -201,6 +201,46 @@
 
 }
 
+func extractTableColumnsFromSnapshot(snapshot *common.Snapshot) (map[string][]string) {
+
+	columns := make(map[string][]string)
+	tables := make([]string, 0)
+
+	log.Debug("Extracting table names from snapshot")
+	db, err := dataService.DBVersion(snapshot.SnapshotInfo)
+	if err != nil {
+		log.Panicf("Database inaccessible: %v", err)
+	}
+	rows, err := db.Query("SELECT DISTINCT tableName FROM _transicator_tables;")
+	if err != nil {
+		log.Panicf("Unable to read in known snapshot tables from sqlite file")
+	}
+	defer rows.Close()
+	for rows.Next() {
+		var tableName string
+		rows.Scan(&tableName)
+		if err != nil {
+			log.Panic("Error scaning tableNames from _transicator_tables")
+		}
+		tables = append(tables, tableName)
+	}
+
+	for _, tableName := range tables {
+
+		dummyRows, err := db.Query("SELECT * FROM " + tableName + " LIMIT 0;")
+		if err != nil {
+			log.Panicf("Get table info failed: %v", err)
+		}
+		defer dummyRows.Close()
+		cols, err := dummyRows.Columns()
+		if err != nil {
+			log.Panicf("Get table columns failed: %v", err)
+		}
+		columns[tableName] = cols
+	}
+	return columns
+}
+
 func extractTablesFromDB(db apid.DB) (tables map[string]bool) {
 
 	tables = make(map[string]bool)
diff --git a/snapshot_test.go b/snapshot_test.go
new file mode 100644
index 0000000..ffad61a
--- /dev/null
+++ b/snapshot_test.go
@@ -0,0 +1,61 @@
+// Copyright 2017 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+package apidApigeeSync
+import (
+	"github.com/apigee-labs/transicator/common"
+	. "github.com/onsi/ginkgo"
+	"os"
+	"strings"
+)
+
+var _ = Describe("Change Agent", func() {
+
+	const testDbId = "test_snapshot"
+
+	Context("Change Agent Unit Tests", func() {
+		testHandler := handler{}
+
+		var createTestDb = func(sqlfile string, dbId string) common.Snapshot {
+			initDb(sqlfile, "./mockdb_snapshot.sqlite3")
+			file, err := os.Open("./mockdb_snapshot.sqlite3")
+			if err != nil {
+				Fail("Failed to open mock db for test")
+			}
+
+			s := common.Snapshot{}
+			err = processSnapshotServerFileResponse(dbId, file, &s)
+			if err != nil {
+				Fail("Error processing test snapshots")
+			}
+			return s
+		}
+
+		BeforeEach(func() {
+			event := createTestDb("./sql/init_mock_db.sql", testDbId)
+			testHandler.Handle(&event)
+			knownTables = extractTablesFromDB(getDB())
+		})
+
+		It("test extract table columns", func() {
+			s := &common.Snapshot{
+				SnapshotInfo: testDbId,
+			}
+			columns := extractTableColumnsFromSnapshot(s)
+			for table, cols := range columns {
+				log.Error("snapshot TABLE: " + table + " COLUMN: " + strings.Join(cols, "|"))
+			}
+		})
+
+	})
+})
\ No newline at end of file
diff --git a/sql/init_mock_db.sql b/sql/init_mock_db.sql
index f1b8471..4df6654 100644
--- a/sql/init_mock_db.sql
+++ b/sql/init_mock_db.sql
@@ -22,17 +22,17 @@
 columnName varchar not null,
 typid integer,
 primaryKey bool);
-INSERT INTO "_transicator_tables" VALUES('kms_bundle_config','id',1043,1);
-INSERT INTO "_transicator_tables" VALUES('kms_bundle_config','data_scope_id',1043,1);
-INSERT INTO "_transicator_tables" VALUES('kms_bundle_config','name',25,0);
-INSERT INTO "_transicator_tables" VALUES('kms_bundle_config','uri',25,0);
-INSERT INTO "_transicator_tables" VALUES('kms_bundle_config','checksumtype',25,0);
-INSERT INTO "_transicator_tables" VALUES('kms_bundle_config','checksum',25,0);
-INSERT INTO "_transicator_tables" VALUES('kms_bundle_config','created',1114,0);
-INSERT INTO "_transicator_tables" VALUES('kms_bundle_config','created_by',25,0);
-INSERT INTO "_transicator_tables" VALUES('kms_bundle_config','updated',1114,0);
-INSERT INTO "_transicator_tables" VALUES('kms_bundle_config','updated_by',25,0);
-INSERT INTO "_transicator_tables" VALUES('kms_bundle_config','crc',25,0);
+-- INSERT INTO "_transicator_tables" VALUES('kms_bundle_config','id',1043,1);
+-- INSERT INTO "_transicator_tables" VALUES('kms_bundle_config','data_scope_id',1043,1);
+-- INSERT INTO "_transicator_tables" VALUES('kms_bundle_config','name',25,0);
+-- INSERT INTO "_transicator_tables" VALUES('kms_bundle_config','uri',25,0);
+-- INSERT INTO "_transicator_tables" VALUES('kms_bundle_config','checksumtype',25,0);
+-- INSERT INTO "_transicator_tables" VALUES('kms_bundle_config','checksum',25,0);
+-- INSERT INTO "_transicator_tables" VALUES('kms_bundle_config','created',1114,0);
+-- INSERT INTO "_transicator_tables" VALUES('kms_bundle_config','created_by',25,0);
+-- INSERT INTO "_transicator_tables" VALUES('kms_bundle_config','updated',1114,0);
+-- INSERT INTO "_transicator_tables" VALUES('kms_bundle_config','updated_by',25,0);
+-- INSERT INTO "_transicator_tables" VALUES('kms_bundle_config','crc',25,0);
 INSERT INTO "_transicator_tables" VALUES('kms_deployment','id',1043,1);
 INSERT INTO "_transicator_tables" VALUES('kms_deployment','bundle_config_id',1043,1);
 INSERT INTO "_transicator_tables" VALUES('kms_deployment','apid_cluster_id',1043,1);
@@ -107,21 +107,6 @@
 INSERT INTO "_transicator_tables" VALUES('edgex_apid_cluster','updated',1114,0);
 INSERT INTO "_transicator_tables" VALUES('edgex_apid_cluster','updated_by',25,0);
 INSERT INTO "_transicator_tables" VALUES('edgex_apid_cluster','_change_selector',25,1);
-INSERT INTO "_transicator_tables" VALUES('kms_deployment_history','id',2950,1);
-INSERT INTO "_transicator_tables" VALUES('kms_deployment_history','name',1043,0);
-INSERT INTO "_transicator_tables" VALUES('kms_deployment_history','ext_ref_id',1043,1);
-INSERT INTO "_transicator_tables" VALUES('kms_deployment_history','display_name',1043,0);
-INSERT INTO "_transicator_tables" VALUES('kms_deployment_history','description',1043,0);
-INSERT INTO "_transicator_tables" VALUES('kms_deployment_history','created_at',1114,1);
-INSERT INTO "_transicator_tables" VALUES('kms_deployment_history','created_by',1043,0);
-INSERT INTO "_transicator_tables" VALUES('kms_deployment_history','updated_at',1114,1);
-INSERT INTO "_transicator_tables" VALUES('kms_deployment_history','updated_by',1043,0);
-INSERT INTO "_transicator_tables" VALUES('configuration','id',1043,1);
-INSERT INTO "_transicator_tables" VALUES('configuration','body',25,0);
-INSERT INTO "_transicator_tables" VALUES('configuration','created',1114,0);
-INSERT INTO "_transicator_tables" VALUES('configuration','created_by',25,0);
-INSERT INTO "_transicator_tables" VALUES('configuration','updated',1114,0);
-INSERT INTO "_transicator_tables" VALUES('configuration','updated_by',25,0);
 INSERT INTO "_transicator_tables" VALUES('edgex_data_scope','id',1043,1);
 INSERT INTO "_transicator_tables" VALUES('edgex_data_scope','apid_cluster_id',1043,1);
 INSERT INTO "_transicator_tables" VALUES('edgex_data_scope','scope',25,0);
@@ -156,18 +141,6 @@
 INSERT INTO "_transicator_tables" VALUES('kms_company_developer','updated_at',1114,0);
 INSERT INTO "_transicator_tables" VALUES('kms_company_developer','updated_by',1043,0);
 INSERT INTO "_transicator_tables" VALUES('kms_company_developer','_change_selector',1043,0);
-INSERT INTO "_transicator_tables" VALUES('edgex_deployment_history','id',1043,1);
-INSERT INTO "_transicator_tables" VALUES('edgex_deployment_history','deployment_id',1043,0);
-INSERT INTO "_transicator_tables" VALUES('edgex_deployment_history','action',25,0);
-INSERT INTO "_transicator_tables" VALUES('edgex_deployment_history','bundle_config_id',1043,0);
-INSERT INTO "_transicator_tables" VALUES('edgex_deployment_history','apid_cluster_id',1043,0);
-INSERT INTO "_transicator_tables" VALUES('edgex_deployment_history','data_scope_id',1043,0);
-INSERT INTO "_transicator_tables" VALUES('edgex_deployment_history','bundle_config_json',25,0);
-INSERT INTO "_transicator_tables" VALUES('edgex_deployment_history','config_json',25,0);
-INSERT INTO "_transicator_tables" VALUES('edgex_deployment_history','created',1114,0);
-INSERT INTO "_transicator_tables" VALUES('edgex_deployment_history','created_by',25,0);
-INSERT INTO "_transicator_tables" VALUES('edgex_deployment_history','updated',1114,0);
-INSERT INTO "_transicator_tables" VALUES('edgex_deployment_history','updated_by',25,0);
 INSERT INTO "_transicator_tables" VALUES('kms_app','id',2950,1);
 INSERT INTO "_transicator_tables" VALUES('kms_app','tenant_id',1043,1);
 INSERT INTO "_transicator_tables" VALUES('kms_app','name',1043,1);