diff --git a/accessEntity/accessEntity_suite_test.go b/accessEntity/accessEntity_suite_test.go
new file mode 100644
index 0000000..f8a1ed1
--- /dev/null
+++ b/accessEntity/accessEntity_suite_test.go
@@ -0,0 +1,49 @@
+// 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 accessEntity
+
+import (
+	. "github.com/onsi/ginkgo"
+	. "github.com/onsi/gomega"
+
+	"github.com/apid/apid-core"
+	"github.com/apid/apid-core/factory"
+	"github.com/apid/apidVerifyApiKey/common"
+	"os"
+	"testing"
+)
+
+const testTempDirBase = "./tmp/"
+
+var (
+	testTempDir string
+)
+
+var _ = BeforeSuite(func() {
+	_ = os.MkdirAll(testTempDirBase, os.ModePerm)
+	s := factory.DefaultServicesFactory()
+	apid.Initialize(s)
+	SetApidServices(s, apid.Log())
+	common.SetApidServices(s, s.Log())
+})
+
+var _ = AfterSuite(func() {
+	apid.Events().Close()
+	os.RemoveAll(testTempDirBase)
+})
+
+func TestVerifyAPIKey(t *testing.T) {
+	RegisterFailHandler(Fail)
+	RunSpecs(t, "VerifyAPIKey Suite")
+}
diff --git a/accessEntity/api.go b/accessEntity/api.go
index 534e913..160b79e 100644
--- a/accessEntity/api.go
+++ b/accessEntity/api.go
@@ -1,4 +1,3 @@
-
 // Copyright 2017 Google Inc.
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
@@ -16,12 +15,268 @@
 package accessEntity
 
 import (
+	"encoding/json"
+	"fmt"
+	"github.com/apid/apidVerifyApiKey/common"
+	"net/http"
+	"strconv"
+	"strings"
 )
 
+const (
+	AccessEntityPath         = "/entities"
+	EndpointApp              = "/apps"
+	EndpointApiProduct       = "/apiproducts"
+	EndpointCompany          = "/companies"
+	EndpointCompanyDeveloper = "/companydevelopers"
+	EndpointDeveloper        = "/developers"
+	EndpointAppCredentials   = "/appcredentials"
+)
 
+const (
+	IdentifierAppId          = "appid"
+	IdentifierApiProductName = "apiproductname"
+	IdentifierAppName        = "appname"
+	IdentifierApiResource    = "apiresource"
+	IdentifierDeveloperId    = "developerid"
+	IdentifierDeveloperEmail = "developeremail"
+	IdentifierConsumerKey    = "consumerkey"
+	IdentifierCompanyName    = "companyname"
+)
+
+var (
+	Identifiers = map[string]bool{
+		"appid":          true,
+		"apiproductname": true,
+		"appname":        true,
+		"apiresource":    true,
+		"developerid":    true,
+		"companyname":    true,
+		"developeremail": true,
+		"consumerkey":    true,
+	}
+
+	ErrInvalidPar = &common.ErrorResponse{
+		ResponseCode:    strconv.Itoa(INVALID_PARAMETERS),
+		ResponseMessage: "invalid identifiers",
+		StatusCode:      http.StatusBadRequest,
+	}
+
+	IdentifierTree = map[string]map[string][]string{
+		EndpointApiProduct: {
+			IdentifierApiProductName: {},
+			IdentifierAppId:          {IdentifierApiResource},
+			IdentifierAppName:        {IdentifierApiResource, IdentifierDeveloperEmail, IdentifierDeveloperId, IdentifierCompanyName},
+			IdentifierConsumerKey:    {IdentifierApiResource},
+		},
+		EndpointApp: {
+			IdentifierAppId:       {},
+			IdentifierAppName:     {IdentifierDeveloperEmail, IdentifierDeveloperId, IdentifierCompanyName},
+			IdentifierConsumerKey: {},
+		},
+		EndpointCompany: {
+			IdentifierAppId:       {},
+			IdentifierCompanyName: {},
+			IdentifierConsumerKey: {},
+		},
+		EndpointCompanyDeveloper: {
+			IdentifierCompanyName: {},
+		},
+		EndpointAppCredentials: {
+			IdentifierConsumerKey: {},
+		},
+		EndpointDeveloper: {
+			IdentifierDeveloperEmail: {},
+			IdentifierAppId:          {},
+			IdentifierDeveloperId:    {},
+			IdentifierConsumerKey:    {},
+		},
+	}
+)
+
+const (
+	INVALID_PARAMETERS = iota
+	DB_ERROR
+	DATA_ERROR
+)
 
 type ApiManager struct {
-	DbMan             DbManagerInterface
-	apiInitialized    bool
+	DbMan            DbManagerInterface
+	AccessEntityPath string
+	apiInitialized   bool
 }
 
+func (a *ApiManager) InitAPI() {
+	if a.apiInitialized {
+		return
+	}
+	services.API().HandleFunc(a.AccessEntityPath+EndpointApp, a.HandleApps).Methods("GET")
+	services.API().HandleFunc(a.AccessEntityPath+EndpointApiProduct, a.HandleApiProducts).Methods("GET")
+	services.API().HandleFunc(a.AccessEntityPath+EndpointCompany, a.HandleCompanies).Methods("GET")
+	services.API().HandleFunc(a.AccessEntityPath+EndpointCompanyDeveloper, a.HandleCompanyDevelopers).Methods("GET")
+	services.API().HandleFunc(a.AccessEntityPath+EndpointDeveloper, a.HandleDevelopers).Methods("GET")
+	services.API().HandleFunc(a.AccessEntityPath+EndpointAppCredentials, a.HandleConsumers).Methods("GET")
+	a.apiInitialized = true
+	log.Debug("API endpoints initialized")
+}
+
+func (a *ApiManager) HandleApps(w http.ResponseWriter, r *http.Request) {
+
+}
+
+func (a *ApiManager) HandleApiProducts(w http.ResponseWriter, r *http.Request) {
+	ids, err := extractIdentifiers(r.URL.Query())
+	if err != nil {
+		common.WriteError(w, err.Error(), INVALID_PARAMETERS, http.StatusBadRequest)
+	}
+	details, errRes := a.getApiProduct(ids)
+	if errRes != nil {
+		writeJson(errRes, w, r)
+		return
+	}
+	writeJson(details, w, r)
+}
+
+func (a *ApiManager) HandleCompanies(w http.ResponseWriter, r *http.Request) {
+
+}
+func (a *ApiManager) HandleCompanyDevelopers(w http.ResponseWriter, r *http.Request) {
+
+}
+func (a *ApiManager) HandleDevelopers(w http.ResponseWriter, r *http.Request) {
+
+}
+func (a *ApiManager) HandleConsumers(w http.ResponseWriter, r *http.Request) {
+
+}
+
+func extractIdentifiers(pars map[string][]string) (map[string]string, error) {
+	m := make(map[string]string)
+	for k, v := range pars {
+		k = strings.ToLower(k)
+		if Identifiers[k] {
+			if len(v) == 1 {
+				m[k] = v[0]
+			} else {
+				return nil, fmt.Errorf("each identifier must have only 1 value")
+			}
+		}
+	}
+	return m, nil
+}
+
+func (a *ApiManager) getApiProduct(ids map[string]string) (*ApiProductDetails, *common.ErrorResponse) {
+	valid, keyVals := parseIdentifiers(EndpointApiProduct, ids)
+	if !valid {
+		return nil, ErrInvalidPar
+	}
+	priKey, priVal, secKey, secVal := keyVals[0], keyVals[1], keyVals[2], keyVals[3]
+
+	prods, err := a.DbMan.GetApiProducts(priKey, priVal, secKey, secVal)
+	if err != nil {
+		log.Errorf("getApiProduct: %v", err)
+		return nil, newDbError(err)
+	}
+
+	var prod *common.ApiProduct
+	var attrs []common.Attribute
+	if len(prods) > 0 {
+		prod = &prods[0]
+		attrs = a.DbMan.GetKmsAttributes(prod.TenantId, prod.Id)[prod.Id]
+	}
+
+	return makeApiProductDetails(prod, attrs, priKey, priVal, secKey, secVal)
+}
+
+func makeApiProductDetails(prod *common.ApiProduct, attrs []common.Attribute, priKey, priVal, secKey, secVal string) (*ApiProductDetails, *common.ErrorResponse) {
+	var a *ApiProductDetails
+	if prod != nil {
+		quotaLimit, err := strconv.Atoi(prod.Quota)
+		if err != nil {
+			return nil, newDataError(err)
+		}
+		a = &ApiProductDetails{
+			APIProxies:     common.JsonToStringArray(prod.Proxies),
+			APIResources:   common.JsonToStringArray(prod.ApiResources),
+			ApprovalType:   prod.ApprovalType,
+			Attributes:     attrs,
+			CreatedAt:      prod.CreatedAt,
+			CreatedBy:      prod.CreatedBy,
+			Description:    prod.Description,
+			DisplayName:    prod.DisplayName,
+			Environments:   common.JsonToStringArray(prod.Environments),
+			ID:             prod.Id,
+			LastModifiedAt: prod.UpdatedAt,
+			LastModifiedBy: prod.UpdatedBy,
+			Name:           prod.Name,
+			QuotaInterval:  prod.QuotaInterval,
+			QuotaLimit:     int64(quotaLimit),
+			QuotaTimeUnit:  prod.QuotaTimeUnit,
+			Scopes:         common.JsonToStringArray(prod.Scopes),
+		}
+	} else {
+		a = new(ApiProductDetails)
+	}
+
+	setResIdentifiers(a, priKey, priVal, secKey, secVal)
+	return a, nil
+}
+
+func setResIdentifiers(a *ApiProductDetails, priKey, priVal, secKey, secVal string) {
+	a.PrimaryIdentifierType = priKey
+	a.PrimaryIdentifierValue = priVal
+	a.SecondaryIdentifierType = secKey
+	a.PrimaryIdentifierValue = secVal
+}
+
+func parseIdentifiers(endpoint string, ids map[string]string) (valid bool, keyVals []string) {
+	if len(ids) > 2 {
+		return false, nil
+	}
+	if m := IdentifierTree[endpoint]; m != nil {
+		for key, val := range ids {
+			if m[key] != nil {
+				keyVals = append(keyVals, key, val)
+				for _, id := range m[key] {
+					if ids[id] != "" {
+						keyVals = append(keyVals, id, ids[id])
+						return true, keyVals
+					}
+				}
+				if len(ids) == 2 {
+					return false, nil
+				}
+				keyVals = append(keyVals, "", "")
+				return true, keyVals
+			}
+		}
+	}
+	return false, nil
+}
+
+func newDbError(err error) *common.ErrorResponse {
+	return &common.ErrorResponse{
+		ResponseCode:    strconv.Itoa(DB_ERROR),
+		ResponseMessage: err.Error(),
+		StatusCode:      http.StatusInternalServerError,
+	}
+}
+
+func newDataError(err error) *common.ErrorResponse {
+	return &common.ErrorResponse{
+		ResponseCode:    strconv.Itoa(DATA_ERROR),
+		ResponseMessage: err.Error(),
+		StatusCode:      http.StatusInternalServerError,
+	}
+}
+
+func writeJson(obj interface{}, w http.ResponseWriter, r *http.Request) {
+	bytes, err := json.Marshal(obj)
+	if err != nil {
+		log.Error("unable to marshal errorResponse: " + err.Error())
+		w.Write([]byte("unable to marshal errorResponse: " + err.Error()))
+	} else {
+		w.Header().Set("Content-Type", "application/json")
+		w.Write(bytes)
+	}
+}
diff --git a/accessEntity/api_response.go b/accessEntity/api_response.go
index d61042c..07b3f49 100644
--- a/accessEntity/api_response.go
+++ b/accessEntity/api_response.go
@@ -1 +1,68 @@
 package accessEntity
+
+import "github.com/apid/apidVerifyApiKey/common"
+
+type ApiProductDetails struct {
+	// api proxies
+	APIProxies []string `json:"apiProxies,omitempty"`
+
+	// api resources
+	APIResources []string `json:"apiResources,omitempty"`
+
+	// approval type
+	ApprovalType string `json:"approvalType,omitempty"`
+
+	// Attributes associated with the apiproduct.
+	Attributes []common.Attribute `json:"attributes,omitempty"`
+
+	// ISO-8601
+	CreatedAt string `json:"createdAt,omitempty"`
+
+	// created by
+	CreatedBy string `json:"createdBy,omitempty"`
+
+	// description
+	Description string `json:"description,omitempty"`
+
+	// display name
+	DisplayName string `json:"displayName,omitempty"`
+
+	// environments
+	Environments []string `json:"environments,omitempty"`
+
+	// id
+	ID string `json:"id,omitempty"`
+
+	// ISO-8601
+	LastModifiedAt string `json:"lastModifiedAt,omitempty"`
+
+	// last modified by
+	LastModifiedBy string `json:"lastModifiedBy,omitempty"`
+
+	// name
+	Name string `json:"name,omitempty"`
+
+	// primary identifier type
+	PrimaryIdentifierType string `json:"primaryIdentifierType,omitempty"`
+
+	// primary identifier value
+	PrimaryIdentifierValue string `json:"primaryIdentifierValue,omitempty"`
+
+	// quota interval
+	QuotaInterval int64 `json:"quotaInterval,omitempty"`
+
+	// quota limit
+	QuotaLimit int64 `json:"quotaLimit,omitempty"`
+
+	// quota time unit
+	QuotaTimeUnit string `json:"quotaTimeUnit,omitempty"`
+
+	// scopes
+	Scopes []string `json:"scopes,omitempty"`
+
+	// secondary identifier type
+	SecondaryIdentifierType string `json:"secondaryIdentifierType,omitempty"`
+
+	// secondary identifier value
+	SecondaryIdentifierValue string `json:"secondaryIdentifierValue,omitempty"`
+}
diff --git a/accessEntity/data.go b/accessEntity/data.go
index d61042c..dabb2a3 100644
--- a/accessEntity/data.go
+++ b/accessEntity/data.go
@@ -1 +1,254 @@
+// 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 accessEntity
+
+import (
+	"github.com/apid/apidVerifyApiKey/common"
+	"strings"
+)
+
+const (
+	sql_select_api_product = `SELECT * FROM kms_api_product AS ap `
+	sql_select_api         = `
+	SELECT * FROM kms_api_product AS ap WHERE ap.id IN (
+		SELECT apiprdt_id FROM kms_app_credential_apiproduct_mapper AS acm WHERE acm.app_id IN (
+			SELECT a.id FROM kms_app AS a WHERE a.name IN ('apstest')
+		)
+	);
+
+	`
+)
+
+type DbManager struct {
+	common.DbManager
+}
+
+func (d *DbManager) GetApiProducts(priKey, priVal, secKey, secVal string) (apiProducts []common.ApiProduct, err error) {
+	if priKey == IdentifierAppId {
+		apiProducts, err = d.getApiProductsByAppId(priVal)
+		if err != nil {
+			return
+		}
+	} else if priKey == IdentifierApiProductName {
+		apiProducts, err = d.getApiProductsByName(priVal)
+		if err != nil {
+			return
+		}
+	} else if priKey == IdentifierAppName {
+		switch secKey {
+		case IdentifierDeveloperEmail:
+			apiProducts, err = d.getApiProductsByAppName(priVal, secVal, "", "")
+		case IdentifierDeveloperId:
+			apiProducts, err = d.getApiProductsByAppName(priVal, "", secVal, "")
+		case IdentifierCompanyName:
+			apiProducts, err = d.getApiProductsByAppName(priVal, "", "", secVal)
+		case IdentifierApiResource:
+			fallthrough
+		case "":
+			apiProducts, err = d.getApiProductsByAppName(priVal, "", "", "")
+		}
+		if err != nil {
+			return
+		}
+	} else if priKey == IdentifierConsumerKey {
+		apiProducts, err = d.getApiProductsByConsumerKey(priVal)
+		if err != nil {
+			return
+		}
+	}
+
+	if secKey == IdentifierApiResource {
+		apiProducts = filterApiProductsByResource(apiProducts, secVal)
+	}
+	return
+}
+
+func (d *DbManager) getApiProductsByName(apiProdName string) (apiProducts []common.ApiProduct, err error) {
+	err = d.GetDb().QueryStructs(&apiProducts,
+		sql_select_api_product+`WHERE ap.name = $1;`,
+		apiProdName,
+	)
+	return
+}
+
+func (d *DbManager) getApiProductsByAppId(appId string) (apiProducts []common.ApiProduct, err error) {
+	cols := []string{"*"}
+	query := selectApiProductsByIds(
+		selectAppCredentialMapperByAppIds(
+			"'"+appId+"'",
+			"apiprdt_id",
+		),
+		cols...,
+	)
+	log.Debugf("getApiProductsByAppId: %v", query)
+	err = d.GetDb().QueryStructs(&apiProducts, query)
+	return
+}
+
+func (d *DbManager) getApiProductsByConsumerKey(consumerKey string) (apiProducts []common.ApiProduct, err error) {
+	cols := []string{"*"}
+	query := selectApiProductsByIds(
+		selectAppCredentialMapperByAppIds(
+			selectAppCredentialByConsumerKey(
+				"'"+consumerKey+"'",
+				"app_id",
+			),
+			"apiprdt_id",
+		),
+		cols...,
+	)
+	log.Debugf("getApiProductsByConsumerKey: %v", query)
+	err = d.GetDb().QueryStructs(&apiProducts, query)
+	return
+}
+
+func (d *DbManager) getApiProductsByAppName(appName, devEmail, devId, comName string) (apiProducts []common.ApiProduct, err error) {
+	cols := []string{"*"}
+	var appQuery string
+	switch {
+	case devEmail != "":
+		appQuery = selectAppByNameAndDeveloperId(
+			"'"+appName+"'",
+			selectDeveloperByEmail(
+				"'"+devEmail+"'",
+				"id",
+			),
+			"id",
+		)
+	case devId != "":
+		appQuery = selectAppByNameAndDeveloperId(
+			"'"+appName+"'",
+			"'"+devId+"'",
+			"id",
+		)
+	case comName != "":
+		appQuery = selectAppByNameAndCompanyId(
+			"'"+appName+"'",
+			selectCompanyByName(
+				"'"+comName+"'",
+				"id",
+			),
+			"id",
+		)
+	default:
+		appQuery = selectAppByName(
+			"'"+appName+"'",
+			"id",
+		)
+	}
+
+	query := selectApiProductsByIds(
+		selectAppCredentialMapperByAppIds(
+			appQuery,
+			"apiprdt_id",
+		),
+		cols...,
+	)
+	log.Debugf("getApiProductsByAppName: %v", query)
+	err = d.GetDb().QueryStructs(&apiProducts, query)
+	return
+}
+
+func selectApiProductsByIds(idQuery string, colNames ...string) string {
+	query := "SELECT " +
+		strings.Join(colNames, ",") +
+		" FROM kms_api_product AS ap WHERE ap.id IN (" +
+		idQuery +
+		")"
+
+	return query
+}
+
+func selectAppCredentialMapperByAppIds(idQuery string, colNames ...string) string {
+	query := "SELECT " +
+		strings.Join(colNames, ",") +
+		" FROM kms_app_credential_apiproduct_mapper AS acm WHERE acm.app_id IN (" +
+		idQuery +
+		")"
+	return query
+}
+
+func selectAppByName(nameQuery string, colNames ...string) string {
+	query := "SELECT " +
+		strings.Join(colNames, ",") +
+		" FROM kms_app AS a WHERE a.name IN (" +
+		nameQuery +
+		")"
+	return query
+}
+
+func selectAppByNameAndDeveloperId(nameQuery string, developerIdQuery string, colNames ...string) string {
+	query := selectAppByName(nameQuery, colNames...) +
+		" AND developer_id IN (" +
+		developerIdQuery +
+		")"
+	return query
+}
+
+func selectAppByNameAndCompanyId(nameQuery string, companyIdQuery string, colNames ...string) string {
+	query := selectAppByName(nameQuery, colNames...) +
+		" AND company_id IN (" +
+		companyIdQuery +
+		")"
+	return query
+}
+
+func selectDeveloperByEmail(emailQuery string, colNames ...string) string {
+	query := "SELECT " +
+		strings.Join(colNames, ",") +
+		" FROM kms_developer AS dev WHERE dev.email IN (" +
+		emailQuery +
+		")"
+	return query
+}
+
+func selectCompanyByName(nameQuery string, colNames ...string) string {
+	query := "SELECT " +
+		strings.Join(colNames, ",") +
+		" FROM kms_company AS com WHERE com.name IN (" +
+		nameQuery +
+		")"
+	return query
+}
+
+func selectAppCredentialByConsumerKey(consumerQuery string, colNames ...string) string {
+	query := "SELECT " +
+		strings.Join(colNames, ",") +
+		" FROM kms_app_credential AS ac WHERE ac.consumer_secret IN (" +
+		consumerQuery +
+		")"
+	return query
+}
+
+func filterApiProductsByResource(apiProducts []common.ApiProduct, resource string) []common.ApiProduct {
+	log.Debugf("Before filter: %v", apiProducts)
+	var prods []common.ApiProduct
+	for _, prod := range apiProducts {
+		resources := common.JsonToStringArray(prod.ApiResources)
+		if InSlice(resources, resource) {
+			prods = append(prods, prod)
+		}
+	}
+	log.Debugf("After filter: %v", prods)
+	return prods
+}
+
+func InSlice(sl []string, str string) bool {
+	for _, s := range sl {
+		if s == str {
+			return true
+		}
+	}
+	return false
+}
diff --git a/accessEntity/data_test.go b/accessEntity/data_test.go
new file mode 100644
index 0000000..4cf7b78
--- /dev/null
+++ b/accessEntity/data_test.go
@@ -0,0 +1,141 @@
+// 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 accessEntity
+
+import (
+	"github.com/apid/apid-core"
+	"github.com/apid/apidVerifyApiKey/common"
+	. "github.com/onsi/ginkgo"
+	. "github.com/onsi/gomega"
+	"io/ioutil"
+	"sync"
+)
+
+const (
+	fileDataTest = "data_test.sql"
+)
+
+var _ = Describe("DataTest", func() {
+
+	Context("query Db to get entities", func() {
+		var dataTestTempDir string
+		var dbMan *DbManager
+		BeforeEach(func() {
+			var err error
+			dataTestTempDir, err = ioutil.TempDir(testTempDirBase, "sqlite3")
+			Expect(err).NotTo(HaveOccurred())
+			services.Config().Set("local_storage_path", dataTestTempDir)
+
+			dbMan = &DbManager{
+				DbManager: common.DbManager{
+					Data:  services.Data(),
+					DbMux: sync.RWMutex{},
+				},
+			}
+			dbMan.SetDbVersion(dataTestTempDir)
+		})
+
+		It("should get apiProducts", func() {
+			setupTestDb(dbMan.GetDb())
+			testData := [][]string{
+				//positive tests
+				{IdentifierApiProductName, "apstest", "", ""},
+				{IdentifierAppId, "408ad853-3fa0-402f-90ee-103de98d71a5", "", ""},
+				{IdentifierAppId, "408ad853-3fa0-402f-90ee-103de98d71a5", IdentifierApiResource, "/**"},
+				{IdentifierAppName, "apstest", "", ""},
+				{IdentifierConsumerKey, "abcd", "", ""},
+				{IdentifierConsumerKey, "abcd", IdentifierApiResource, "/**"},
+				{IdentifierAppName, "apstest", IdentifierDeveloperId, "e41f04e8-9d3f-470a-8bfd-c7939945896c"},
+				{IdentifierAppName, "apstest", IdentifierDeveloperEmail, "bar@google.com"},
+				{IdentifierAppName, "apstest", IdentifierCompanyName, "DevCompany"},
+				{IdentifierAppName, "apstest", IdentifierApiResource, "/**"},
+				// negative tests
+				{IdentifierApiProductName, "non-existent", "", ""},
+				{IdentifierAppId, "non-existent", "", ""},
+				{IdentifierAppId, "non-existent", IdentifierApiResource, "non-existent"},
+				{IdentifierAppName, "non-existent", "", ""},
+				{IdentifierConsumerKey, "non-existent", "", ""},
+				{IdentifierConsumerKey, "non-existent", IdentifierApiResource, "non-existent"},
+				{IdentifierAppName, "non-existent", IdentifierDeveloperId, "non-existent"},
+				{IdentifierAppName, "non-existent", IdentifierDeveloperEmail, "non-existent"},
+				{IdentifierAppName, "non-existent", IdentifierCompanyName, "non-existent"},
+				{IdentifierAppName, "non-existent", IdentifierApiResource, "non-existent"},
+			}
+
+			var expectedApiProd = common.ApiProduct{
+				Id:            "b7e0970c-4677-4b05-8105-5ea59fdcf4e7",
+				Name:          "apstest",
+				DisplayName:   "apstest",
+				Description:   "",
+				ApiResources:  "{/**}",
+				ApprovalType:  "AUTO",
+				Scopes:        `{""}`,
+				Proxies:       `{aps,perfBenchmark}`,
+				Environments:  `{prod,test}`,
+				Quota:         "10000000",
+				QuotaTimeUnit: "MINUTE",
+				QuotaInterval: 1,
+				CreatedAt:     "2017-08-18 22:12:49.363+00:00",
+				CreatedBy:     "haoming@apid.git",
+				UpdatedAt:     "2017-08-18 22:26:50.153+00:00",
+				UpdatedBy:     "haoming@apid.git",
+				TenantId:      "515211e9",
+			}
+
+			results := [][]common.ApiProduct{
+				{expectedApiProd},
+				{expectedApiProd},
+				{expectedApiProd},
+				{expectedApiProd},
+				{expectedApiProd},
+				{expectedApiProd},
+				{expectedApiProd},
+				{expectedApiProd},
+				{expectedApiProd},
+				{expectedApiProd},
+				nil,
+				nil,
+				nil,
+				nil,
+				nil,
+				nil,
+				nil,
+				nil,
+				nil,
+				nil,
+			}
+
+			for i, data := range testData {
+				priKey, priVal, secKey, secVal := data[0], data[1], data[2], data[3]
+				prods, err := dbMan.GetApiProducts(priKey, priVal, secKey, secVal)
+				Expect(err).Should(Succeed())
+				if len(results[i]) > 0 {
+					Expect(prods).Should(Equal(results[i]))
+				} else {
+					Expect(prods).Should(BeZero())
+				}
+			}
+		})
+	})
+
+})
+
+func setupTestDb(db apid.DB) {
+	bytes, err := ioutil.ReadFile(fileDataTest)
+	Expect(err).Should(Succeed())
+	query := string(bytes)
+	log.Debug(query)
+	_, err = db.Exec(query)
+	Expect(err).Should(Succeed())
+}
diff --git a/accessEntity/data_test.sql b/accessEntity/data_test.sql
new file mode 100644
index 0000000..9a774df
--- /dev/null
+++ b/accessEntity/data_test.sql
@@ -0,0 +1,40 @@
+PRAGMA foreign_keys=OFF;
+BEGIN TRANSACTION;
+CREATE TABLE kms_app (id text,tenant_id text,name text,display_name text,access_type text,callback_url text,status text,app_family text,company_id text,developer_id text,parent_id text,type text,created_at blob,created_by text,updated_at blob,updated_by text,_change_selector text, primary key (id,tenant_id));
+INSERT INTO "kms_app" VALUES('408ad853-3fa0-402f-90ee-103de98d71a5','515211e9','apstest','','','','APPROVED','default','8ba5b747-5104-4a40-89ca-a0a51798fe34','e41f04e8-9d3f-470a-8bfd-c7939945896c','e41f04e8-9d3f-470a-8bfd-c7939945896c','DEVELOPER','2017-08-18 22:13:18.325+00:00','haoming@apid.git','2017-08-18 22:13:18.325+00:00','haoming@apid.git','515211e9');
+INSERT INTO "kms_app" VALUES('ae053aee-f12d-4591-84ef-2e6ae0d4205d','515211e9','apigee-remote-proxy','','','','APPROVED','default','','590f33bf-f05c-48c1-bb93-183759bd9ee1','590f33bf-f05c-48c1-bb93-183759bd9ee1','DEVELOPER','2017-09-20 23:05:59.125+00:00','haoming@apid.git','2017-09-20 23:05:59.125+00:00','haoming@apid.git','515211e9');
+CREATE TABLE kms_attributes (tenant_id text,entity_id text,cust_id text,org_id text,dev_id text,comp_id text,apiprdt_id text,app_id text,appcred_id text,name text,type text,value text,_change_selector text, primary key (tenant_id,entity_id,name,type));
+INSERT INTO "kms_attributes" VALUES('515211e9','e2cc4caf-40d6-4ecb-8149-ed32d04184b2','','e2cc4caf-40d6-4ecb-8149-ed32d04184b2','','','','','','features.isSmbOrganization','ORGANIZATION','false','515211e9');
+INSERT INTO "kms_attributes" VALUES('515211e9','e2cc4caf-40d6-4ecb-8149-ed32d04184b2','','e2cc4caf-40d6-4ecb-8149-ed32d04184b2','','','','','','features.mgmtGroup','ORGANIZATION','management-edgex','515211e9');
+INSERT INTO "kms_attributes" VALUES('515211e9','e2cc4caf-40d6-4ecb-8149-ed32d04184b2','','e2cc4caf-40d6-4ecb-8149-ed32d04184b2','','','','','','features.isEdgexEnabled','ORGANIZATION','true','515211e9');
+INSERT INTO "kms_attributes" VALUES('515211e9','e2cc4caf-40d6-4ecb-8149-ed32d04184b2','','e2cc4caf-40d6-4ecb-8149-ed32d04184b2','','','','','','features.isCpsEnabled','ORGANIZATION','true','515211e9');
+INSERT INTO "kms_attributes" VALUES('515211e9','b7e0970c-4677-4b05-8105-5ea59fdcf4e7','','','','','b7e0970c-4677-4b05-8105-5ea59fdcf4e7','','','access','APIPRODUCT','public','515211e9');
+INSERT INTO "kms_attributes" VALUES('515211e9','408ad853-3fa0-402f-90ee-103de98d71a5','','','','','','408ad853-3fa0-402f-90ee-103de98d71a5','','DisplayName','APP','apstest','515211e9');
+INSERT INTO "kms_attributes" VALUES('515211e9','408ad853-3fa0-402f-90ee-103de98d71a5','','','','','','408ad853-3fa0-402f-90ee-103de98d71a5','','Notes','APP','','515211e9');
+INSERT INTO "kms_attributes" VALUES('515211e9','db90a25a-15c8-42ad-96c1-63ed9682b5a9','','','','','db90a25a-15c8-42ad-96c1-63ed9682b5a9','','','access','APIPRODUCT','public','515211e9');
+INSERT INTO "kms_attributes" VALUES('515211e9','ae053aee-f12d-4591-84ef-2e6ae0d4205d','','','','','','ae053aee-f12d-4591-84ef-2e6ae0d4205d','','DisplayName','APP','apigee-remote-proxy','515211e9');
+INSERT INTO "kms_attributes" VALUES('515211e9','ae053aee-f12d-4591-84ef-2e6ae0d4205d','','','','','','ae053aee-f12d-4591-84ef-2e6ae0d4205d','','Notes','APP','','515211e9');
+CREATE TABLE kms_company (id text,tenant_id text,name text,display_name text,status text,created_at blob,created_by text,updated_at blob,updated_by text,_change_selector text, primary key (id,tenant_id));
+INSERT INTO "kms_company" VALUES('8ba5b747-5104-4a40-89ca-a0a51798fe34','5aa3e93f','DevCompany','East India Company','ACTIVE','2017-08-15 03:29:02.449+00:00','haoming@apid.git','2017-08-15 03:29:02.449+00:00','haoming@apid.git','5aa3e93f');
+CREATE TABLE kms_company_developer (tenant_id text,company_id text,developer_id text,roles text,created_at blob,created_by text,updated_at blob,updated_by text,_change_selector text, primary key (tenant_id,company_id,developer_id));
+CREATE TABLE kms_developer (id text,tenant_id text,username text,first_name text,last_name text,password text,email text,status text,encrypted_password text,salt text,created_at blob,created_by text,updated_at blob,updated_by text,_change_selector text, primary key (id,tenant_id));
+INSERT INTO "kms_developer" VALUES('e41f04e8-9d3f-470a-8bfd-c7939945896c','515211e9','haoming','haoming','zhang','','bar@google.com','ACTIVE','','','2017-08-16 22:39:46.669+00:00','foo@google.com','2017-08-16 22:39:46.669+00:00','foo@google.com','515211e9');
+INSERT INTO "kms_developer" VALUES('47d862db-884f-4b8e-9649-fe6d0be1a739','515211e9','qwe','qwe','qwe','','barfoo@google.com','ACTIVE','','','2017-10-12 19:12:48.306+00:00','haoming@apid.git','2017-10-12 19:12:48.306+00:00','haoming@apid.git','515211e9');
+INSERT INTO "kms_developer" VALUES('590f33bf-f05c-48c1-bb93-183759bd9ee1','515211e9','remoteproxy','remote','proxy','','fooo@google.com','ACTIVE','','','2017-09-20 23:03:52.327+00:00','haoming@apid.git','2017-09-20 23:03:52.327+00:00','haoming@apid.git','515211e9');
+CREATE TABLE edgex_apid_cluster (id text,name text,description text,umbrella_org_app_name text,created blob,created_by text,updated blob,updated_by text,_change_selector text, last_sequence text DEFAULT '', primary key (id));
+INSERT INTO "edgex_apid_cluster" VALUES('950b30f1-8c41-4bf5-94a3-f10c104ff5d4','edgex01OrgCluster','','X-sZXhaOymL6VtWnNQqK7uPsFyPvZYq6FFnrc8','2017-08-23 23:31:49.134+00:00','temp@google.com','2017-08-23 23:31:49.134+00:00','temp@google.com','950b30f1-8c41-4bf5-94a3-f10c104ff5d4','');
+CREATE TABLE kms_api_product (id text,tenant_id text,name text,display_name text,description text,api_resources text,approval_type text,scopes text,proxies text,environments text,quota text,quota_time_unit text,quota_interval integer,created_at blob,created_by text,updated_at blob,updated_by text,_change_selector text, primary key (id,tenant_id));
+INSERT INTO "kms_api_product" VALUES('b7e0970c-4677-4b05-8105-5ea59fdcf4e7','515211e9','apstest','apstest','','{/**}','AUTO','{""}','{aps,perfBenchmark}','{prod,test}','10000000','MINUTE',1,'2017-08-18 22:12:49.363+00:00','haoming@apid.git','2017-08-18 22:26:50.153+00:00','haoming@apid.git','515211e9');
+INSERT INTO "kms_api_product" VALUES('8501392f-c5f7-4d6a-8841-e038ad5913b4','515211e9','ApigeenTestApp','ApigeenTestApp','','{/}','AUTO','{scope1,scope2,scope3}','{}','{prod,test}','','',NULL,'2017-09-20 22:29:06.451+00:00','haoming@apid.git','2017-09-20 22:29:06.451+00:00','haoming@apid.git','515211e9');
+INSERT INTO "kms_api_product" VALUES('e4ae89d0-ea47-4b23-b0dc-2723efb15c84','515211e9','ApigeenTestApp2','ApigeenTestApp2','','{/}','AUTO','{scope1,scope2,scope3}','{}','{prod,test}','','',NULL,'2017-09-20 22:29:08.988+00:00','haoming@apid.git','2017-09-20 22:29:08.988+00:00','haoming@apid.git','515211e9');
+INSERT INTO "kms_api_product" VALUES('07419482-e5a1-4fd0-9d78-3560ba522b44','515211e9','ApigeenTestApp3','ApigeenTestApp3','','{/}','AUTO','{}','{}','{prod,test}','','',NULL,'2017-09-20 22:29:11.482+00:00','haoming@apid.git','2017-09-20 22:29:11.482+00:00','haoming@apid.git','515211e9');
+INSERT INTO "kms_api_product" VALUES('db90a25a-15c8-42ad-96c1-63ed9682b5a9','515211e9','apigee-remote-proxy','apigee-remote-proxy','','{/**,/}','AUTO','{""}','{apigee-remote-proxy}','{prod,test}','','',NULL,'2017-09-20 23:05:09.234+00:00','haoming@apid.git','2017-09-20 23:05:09.234+00:00','haoming@apid.git','515211e9');
+CREATE TABLE kms_app_credential (id text,tenant_id text,consumer_secret text,app_id text,method_type text,status text,issued_at blob,expires_at blob,app_status text,scopes text,created_at blob,created_by text,updated_at blob,updated_by text,_change_selector text, primary key (id,tenant_id));
+INSERT INTO "kms_app_credential" VALUES('qUQLHViLHm9a4L623DSnmZohz6m7C83C','515211e9','abcd','408ad853-3fa0-402f-90ee-103de98d71a5','','APPROVED','2017-08-18 22:13:18.35+00:00','','','{}','2017-08-18 22:13:18.35+00:00','-NA-','2017-08-18 22:13:18.352+00:00','-NA-','515211e9');
+INSERT INTO "kms_app_credential" VALUES('00A0RcOti8kEtstbt5knxbRXFpIUGOMP','515211e9','dcba','ae053aee-f12d-4591-84ef-2e6ae0d4205d','','APPROVED','2017-09-20 23:05:59.148+00:00','','','{}','2017-09-20 23:05:59.148+00:00','-NA-','2017-09-20 23:05:59.151+00:00','-NA-','515211e9');
+CREATE TABLE kms_app_credential_apiproduct_mapper (tenant_id text,appcred_id text,app_id text,apiprdt_id text,status text,_change_selector text, primary key (tenant_id,appcred_id,app_id,apiprdt_id));
+INSERT INTO "kms_app_credential_apiproduct_mapper" VALUES('515211e9','qUQLHViLHm9a4L623DSnmZohz6m7C83C','408ad853-3fa0-402f-90ee-103de98d71a5','b7e0970c-4677-4b05-8105-5ea59fdcf4e7','APPROVED','515211e9');
+INSERT INTO "kms_app_credential_apiproduct_mapper" VALUES('515211e9','00A0RcOti8kEtstbt5knxbRXFpIUGOMP','ae053aee-f12d-4591-84ef-2e6ae0d4205d','db90a25a-15c8-42ad-96c1-63ed9682b5a9','APPROVED','515211e9');
+CREATE TABLE kms_organization (id text,name text,display_name text,type text,tenant_id text,customer_id text,description text,created_at blob,created_by text,updated_at blob,updated_by text,_change_selector text, primary key (id,tenant_id));
+INSERT INTO "kms_organization" VALUES('e2cc4caf-40d6-4ecb-8149-ed32d04184b2','edgex01','edgex01','paid','515211e9','94cd5075-7f33-4afb-9545-a53a254277a1','','2017-08-16 22:16:06.544+00:00','foobar@google.com','2017-08-16 22:29:23.046+00:00','foobar@google.com','515211e9');
+COMMIT;
diff --git a/accessEntity/init.go b/accessEntity/init.go
index d61042c..ed5de94 100644
--- a/accessEntity/init.go
+++ b/accessEntity/init.go
@@ -1 +1,28 @@
+// 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 accessEntity
+
+import (
+	"github.com/apid/apid-core"
+)
+
+var (
+	services apid.Services
+	log      apid.LogService
+)
+
+func SetApidServices(s apid.Services, l apid.LogService) {
+	services = s
+	log = l
+}
diff --git a/accessEntity/interfaces.go b/accessEntity/interfaces.go
new file mode 100644
index 0000000..da5c25e
--- /dev/null
+++ b/accessEntity/interfaces.go
@@ -0,0 +1,16 @@
+package accessEntity
+
+import (
+	"github.com/apid/apidVerifyApiKey/common"
+	"net/http"
+)
+
+type ApiManagerInterface interface {
+	common.ApiManagerInterface
+	HandleRequest(w http.ResponseWriter, r *http.Request)
+}
+
+type DbManagerInterface interface {
+	common.DbManagerInterface
+	GetApiProducts(priKey, priVal, secKey, secVal string) (apiProducts []common.ApiProduct, err error)
+}
diff --git a/accessEntity/manager_interfaces.go b/accessEntity/manager_interfaces.go
deleted file mode 100644
index 07746ca..0000000
--- a/accessEntity/manager_interfaces.go
+++ /dev/null
@@ -1,17 +0,0 @@
-package accessEntity
-
-import (
-	"net/http"
-	"github.com/apid/apid-core"
-)
-
-type ApiManagerInterface interface {
-	InitAPI()
-	HandleRequest(w http.ResponseWriter, r *http.Request)
-}
-
-type DbManagerInterface interface {
-	SetDbVersion(string)
-	GetDb() apid.DB
-	GetDbVersion() string
-}
\ No newline at end of file
diff --git a/common/data.go b/common/data.go
index b750195..9a824a8 100644
--- a/common/data.go
+++ b/common/data.go
@@ -2,9 +2,11 @@
 
 import (
 	"database/sql"
+	"encoding/json"
 	"github.com/apid/apid-core"
 	"strings"
 	"sync"
+	"unicode/utf8"
 )
 
 type DbManager struct {
@@ -82,3 +84,17 @@
 	log.Debug("attributes returned for query ", sql, " are ", mapOfAttributes)
 	return mapOfAttributes
 }
+
+func JsonToStringArray(fjson string) []string {
+	var array []string
+	if err := json.Unmarshal([]byte(fjson), &array); err == nil {
+		return array
+	}
+	s := strings.TrimPrefix(fjson, "{")
+	s = strings.TrimSuffix(s, "}")
+	if utf8.RuneCountInString(s) > 0 {
+		array = strings.Split(s, ",")
+	}
+	log.Debug("unmarshall error for string, performing custom unmarshal ", fjson, " and result is : ", array)
+	return array
+}
diff --git a/common/data_structs.go b/common/data_structs.go
index 2a319fd..13dc1e9 100644
--- a/common/data_structs.go
+++ b/common/data_structs.go
@@ -47,6 +47,7 @@
 	CreatedBy     string `db:"created_by"`
 	UpdatedAt     string `db:"updated_at"`
 	UpdatedBy     string `db:"updated_by"`
+	TenantId      string `db:"tenant_id"`
 }
 
 type App struct {
diff --git a/interfaces.go b/common/interfaces.go
similarity index 88%
rename from interfaces.go
rename to common/interfaces.go
index 0974bbd..dda46f3 100644
--- a/interfaces.go
+++ b/common/interfaces.go
@@ -11,20 +11,19 @@
 // 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 apidVerifyApiKey
+package common
 
 import (
 	"github.com/apid/apid-core"
-	"net/http"
 )
 
 type ApiManagerInterface interface {
 	InitAPI()
-	HandleRequest(w http.ResponseWriter, r *http.Request)
 }
 
 type DbManagerInterface interface {
 	SetDbVersion(string)
 	GetDb() apid.DB
 	GetDbVersion() string
+	GetKmsAttributes(tenantId string, entities ...string) map[string][]Attribute
 }
diff --git a/glide.yaml b/glide.yaml
index da46400..936dfe3 100644
--- a/glide.yaml
+++ b/glide.yaml
@@ -15,7 +15,7 @@
 package: github.com/apid/apidVerifyApiKey
 import:
 - package: github.com/apid/apid-core
-  version: master
+  version: ISSUE-68272561
 - package: github.com/apid/apidApigeeSync
   version: master
 testImport:
diff --git a/init.go b/init.go
index 5131f64..37fecd3 100644
--- a/init.go
+++ b/init.go
@@ -38,7 +38,13 @@
 	accessEntity.SetApidServices(services, log)
 	common.SetApidServices(services, log)
 	log.Debug("start init")
+	initManagers(services)
+	log.Debug("end init")
 
+	return pluginData, nil
+}
+
+func initManagers(services apid.Services) apigeeSyncHandler {
 	verifyDbMan := &verifyApiKey.DbManager{
 		DbManager: common.DbManager{
 			Data:  services.Data(),
@@ -50,14 +56,22 @@
 		VerifiersEndpoint: verifyApiKey.ApiPath,
 	}
 
-	syncHandler := apigeeSyncHandler{
-		dbMans:  []DbManagerInterface{verifyDbMan},
-		apiMans: []ApiManagerInterface{verifyApiMan},
+	entityDbMan := &accessEntity.DbManager{
+		DbManager: common.DbManager{
+			Data:  services.Data(),
+			DbMux: sync.RWMutex{},
+		},
 	}
 
+	entityApiMan := &accessEntity.ApiManager{
+		DbMan:            entityDbMan,
+		AccessEntityPath: accessEntity.AccessEntityPath,
+	}
+
+	syncHandler := apigeeSyncHandler{
+		dbMans:  []common.DbManagerInterface{verifyDbMan, entityDbMan},
+		apiMans: []common.ApiManagerInterface{verifyApiMan, entityApiMan},
+	}
 	syncHandler.initListener(services)
-
-	log.Debug("end init")
-
-	return pluginData, nil
+	return syncHandler
 }
diff --git a/listener.go b/listener.go
index 5174026..7f2ec69 100644
--- a/listener.go
+++ b/listener.go
@@ -16,7 +16,8 @@
 
 import (
 	"github.com/apid/apid-core"
-	"github.com/apigee-labs/transicator/common"
+	"github.com/apid/apidVerifyApiKey/common"
+	tran "github.com/apigee-labs/transicator/common"
 )
 
 const (
@@ -24,8 +25,8 @@
 )
 
 type apigeeSyncHandler struct {
-	dbMans  []DbManagerInterface
-	apiMans []ApiManagerInterface
+	dbMans  []common.DbManagerInterface
+	apiMans []common.ApiManagerInterface
 }
 
 func (h *apigeeSyncHandler) initListener(services apid.Services) {
@@ -36,7 +37,7 @@
 	return "verifyAPIKey"
 }
 
-func (h *apigeeSyncHandler) processSnapshot(snapshot *common.Snapshot) {
+func (h *apigeeSyncHandler) processSnapshot(snapshot *tran.Snapshot) {
 	log.Debugf("Snapshot received. Switching to DB version: %s", snapshot.SnapshotInfo)
 	// set db version for all packages
 	for _, dbMan := range h.dbMans {
@@ -51,7 +52,7 @@
 
 func (h *apigeeSyncHandler) Handle(e apid.Event) {
 
-	if snapData, ok := e.(*common.Snapshot); ok {
+	if snapData, ok := e.(*tran.Snapshot); ok {
 		h.processSnapshot(snapData)
 	} else {
 		log.Debugf("Received event. No action required for verifyApiKey plugin. Ignoring. %v", e)
diff --git a/listener_test.go b/listener_test.go
index a4689c4..c82b96a 100644
--- a/listener_test.go
+++ b/listener_test.go
@@ -17,13 +17,11 @@
 import (
 	"github.com/apid/apid-core"
 	"github.com/apid/apid-core/factory"
-	"github.com/apid/apidVerifyApiKey/verifyApiKey"
-	"github.com/apigee-labs/transicator/common"
+	tran "github.com/apigee-labs/transicator/common"
 	. "github.com/onsi/ginkgo"
 	. "github.com/onsi/gomega"
 	"io/ioutil"
 	"os"
-	"sync"
 )
 
 var _ = Describe("listener", func() {
@@ -40,22 +38,7 @@
 		Expect(err).NotTo(HaveOccurred())
 
 		apid.InitializePlugins("")
-
-		db, err := apid.Data().DB()
-		Expect(err).NotTo(HaveOccurred())
-
-		dbMan := &verifyApiKey.DbManager{
-			Data:  s.Data(),
-			DbMux: sync.RWMutex{},
-			Db:    db,
-		}
-
-		listnerTestSyncHandler = apigeeSyncHandler{
-			dbMans:  []DbManagerInterface{dbMan},
-			apiMans: []ApiManagerInterface{&verifyApiKey.ApiManager{}},
-		}
-
-		listnerTestSyncHandler.initListener(s)
+		listnerTestSyncHandler = initManagers(s)
 	})
 
 	var _ = AfterEach(func() {
@@ -65,9 +48,9 @@
 	Context("Apigee Sync Event Processing", func() {
 
 		It("should set DB to appropriate version", func() {
-			s := &common.Snapshot{
+			s := &tran.Snapshot{
 				SnapshotInfo: "test_snapshot",
-				Tables:       []common.Table{},
+				Tables:       []tran.Table{},
 			}
 			listnerTestSyncHandler.Handle(s)
 			for _, dbMan := range listnerTestSyncHandler.dbMans {
@@ -79,7 +62,7 @@
 		It("should not change version for chang event", func() {
 
 			version := listnerTestSyncHandler.dbMans[0].GetDbVersion()
-			s := &common.Change{
+			s := &tran.Change{
 				ChangeSequence: 12321,
 				Table:          "",
 			}
diff --git a/verifyApiKey/data.go b/verifyApiKey/data.go
index 56ae2d2..769a92d 100644
--- a/verifyApiKey/data.go
+++ b/verifyApiKey/data.go
@@ -15,15 +15,11 @@
 
 import (
 	"errors"
-	"github.com/apid/apid-core"
 	"github.com/apid/apidVerifyApiKey/common"
 )
 
 type DbManagerInterface interface {
-	SetDbVersion(string)
-	GetDb() apid.DB
-	GetDbVersion() string
-	GetKmsAttributes(tenantId string, entities ...string) map[string][]common.Attribute
+	common.DbManagerInterface
 	getApiKeyDetails(dataWrapper *VerifyApiKeyRequestResponseDataWrapper) error
 }
 
@@ -113,9 +109,9 @@
 			&environments,
 			&resources,
 		)
-		apiProductDetais.Apiproxies = jsonToStringArray(proxies)
-		apiProductDetais.Environments = jsonToStringArray(environments)
-		apiProductDetais.Resources = jsonToStringArray(resources)
+		apiProductDetais.Apiproxies = common.JsonToStringArray(proxies)
+		apiProductDetais.Environments = common.JsonToStringArray(environments)
+		apiProductDetais.Resources = common.JsonToStringArray(resources)
 
 		allProducts = append(allProducts, apiProductDetais)
 	}
diff --git a/verifyApiKey/verifyApiKeyUtil.go b/verifyApiKey/verifyApiKeyUtil.go
index ee571b5..85aa8c5 100644
--- a/verifyApiKey/verifyApiKeyUtil.go
+++ b/verifyApiKey/verifyApiKeyUtil.go
@@ -15,10 +15,8 @@
 package verifyApiKey
 
 import (
-	"encoding/json"
 	"regexp"
 	"strings"
-	"unicode/utf8"
 )
 
 /*
@@ -56,20 +54,6 @@
 	return len(fs) == 0
 }
 
-func jsonToStringArray(fjson string) []string {
-	var array []string
-	if err := json.Unmarshal([]byte(fjson), &array); err == nil {
-		return array
-	}
-	s := strings.TrimPrefix(fjson, "{")
-	s = strings.TrimSuffix(s, "}")
-	if utf8.RuneCountInString(s) > 0 {
-		array = strings.Split(s, ",")
-	}
-	log.Debug("unmarshall error for string, performing custom unmarshal ", fjson, " and result is : ", array)
-	return array
-}
-
 func contains(givenArray []string, searchString string) bool {
 	for _, element := range givenArray {
 		if element == searchString {
diff --git a/verifyApiKey/verifyApiKeyUtil_test.go b/verifyApiKey/verifyApiKeyUtil_test.go
index 95aef55..0ff7f22 100644
--- a/verifyApiKey/verifyApiKeyUtil_test.go
+++ b/verifyApiKey/verifyApiKeyUtil_test.go
@@ -15,6 +15,7 @@
 package verifyApiKey
 
 import (
+	"github.com/apid/apidVerifyApiKey/common"
 	. "github.com/onsi/ginkgo"
 	. "github.com/onsi/gomega"
 	"reflect"
@@ -40,30 +41,30 @@
 	})
 })
 
-var _ = Describe("Validate jsonToStringArray", func() {
+var _ = Describe("Validate common.JsonToStringArray", func() {
 
 	It("should tranform simple valid json", func() {
-		array := jsonToStringArray("[\"test-1\", \"test-2\"]")
+		array := common.JsonToStringArray("[\"test-1\", \"test-2\"]")
 		Expect(reflect.DeepEqual(array, []string{"test-1", "test-2"})).Should(BeTrue())
 	})
 	It("should tranform simple single valid json", func() {
-		array := jsonToStringArray("[\"test-1\"]")
+		array := common.JsonToStringArray("[\"test-1\"]")
 		Expect(reflect.DeepEqual(array, []string{"test-1"})).Should(BeTrue())
 	})
 	It("should tranform simple fake json", func() {
-		s := jsonToStringArray("{test-1,test-2}")
+		s := common.JsonToStringArray("{test-1,test-2}")
 		Expect(reflect.DeepEqual(s, []string{"test-1", "test-2"})).Should(BeTrue())
 	})
 	It("should tranform simple single valued fake json", func() {
-		s := jsonToStringArray("{test-1}")
+		s := common.JsonToStringArray("{test-1}")
 		Expect(reflect.DeepEqual(s, []string{"test-1"})).Should(BeTrue())
 	})
 	It("space between fields considered as valid char", func() {
-		s := jsonToStringArray("{test-1, test-2}")
+		s := common.JsonToStringArray("{test-1, test-2}")
 		Expect(reflect.DeepEqual(s, []string{"test-1", " test-2"})).Should(BeTrue())
 	})
 	It("remove only last braces", func() {
-		s := jsonToStringArray("{test-1,test-2}}")
+		s := common.JsonToStringArray("{test-1,test-2}}")
 		Expect(reflect.DeepEqual(s, []string{"test-1", "test-2}"})).Should(BeTrue())
 	})
 
