diff --git a/accessEntity/api.go b/accessEntity/api.go
index cffeea0..1736376 100644
--- a/accessEntity/api.go
+++ b/accessEntity/api.go
@@ -209,10 +209,11 @@
 
 func extractIdentifiers(pars map[string][]string) (map[string]string, string, error) {
 	m := make(map[string]string)
-	org := ""
-	if orgs := pars["organization"]; len(orgs) > 0 {
-		org = orgs[0]
+	orgs := pars["organization"]
+	if len(orgs) == 0 {
+		return nil, "", fmt.Errorf("no org specified")
 	}
+	org := orgs[0]
 	for k, v := range pars {
 		k = strings.ToLower(k)
 		if Identifiers[k] {
@@ -233,7 +234,7 @@
 	}
 	priKey, priVal, secKey, secVal := keyVals[0], keyVals[1], keyVals[2], keyVals[3]
 
-	devs, err := a.DbMan.GetCompanyDevelopers(priKey, priVal, secKey, secVal)
+	devs, err := a.DbMan.GetCompanyDevelopers(org, priKey, priVal, secKey, secVal)
 	if err != nil {
 		log.Errorf("getCompanyDeveloper: %v", err)
 		return nil, newDbError(err)
@@ -274,7 +275,7 @@
 	}
 	priKey, priVal, secKey, secVal := keyVals[0], keyVals[1], keyVals[2], keyVals[3]
 
-	devs, err := a.DbMan.GetDevelopers(priKey, priVal, secKey, secVal)
+	devs, err := a.DbMan.GetDevelopers(org, priKey, priVal, secKey, secVal)
 	if err != nil {
 		log.Errorf("getDeveloper: %v", err)
 		return nil, newDbError(err)
@@ -313,7 +314,7 @@
 	}
 	priKey, priVal, secKey, secVal := keyVals[0], keyVals[1], keyVals[2], keyVals[3]
 
-	coms, err := a.DbMan.GetCompanies(priKey, priVal, secKey, secVal)
+	coms, err := a.DbMan.GetCompanies(org, priKey, priVal, secKey, secVal)
 	if err != nil {
 		log.Errorf("getCompany: %v", err)
 		return nil, newDbError(err)
@@ -347,7 +348,7 @@
 	}
 	priKey, priVal, secKey, secVal := keyVals[0], keyVals[1], keyVals[2], keyVals[3]
 
-	prods, err := a.DbMan.GetApiProducts(priKey, priVal, secKey, secVal)
+	prods, err := a.DbMan.GetApiProducts(org, priKey, priVal, secKey, secVal)
 	if err != nil {
 		log.Errorf("getApiProduct: %v", err)
 		return nil, newDbError(err)
@@ -380,7 +381,7 @@
 	}
 	priKey, priVal, secKey, secVal := keyVals[0], keyVals[1], keyVals[2], keyVals[3]
 
-	appCreds, err := a.DbMan.GetAppCredentials(priKey, priVal, secKey, secVal)
+	appCreds, err := a.DbMan.GetAppCredentials(org, priKey, priVal, secKey, secVal)
 	if err != nil {
 		log.Errorf("getAppCredential: %v", err)
 		return nil, newDbError(err)
@@ -394,7 +395,7 @@
 	}
 	appCred := &appCreds[0]
 	attrs := a.DbMan.GetKmsAttributes(appCred.TenantId, appCred.Id)[appCred.Id]
-	apps, err := a.DbMan.GetApps(IdentifierAppId, appCred.AppId, "", "")
+	apps, err := a.DbMan.GetApps(org, IdentifierAppId, appCred.AppId, "", "")
 	if err != nil {
 		log.Errorf("getAppCredential: %v", err)
 		return nil, newDbError(err)
@@ -434,7 +435,7 @@
 	}
 	priKey, priVal, secKey, secVal := keyVals[0], keyVals[1], keyVals[2], keyVals[3]
 
-	apps, err := a.DbMan.GetApps(priKey, priVal, secKey, secVal)
+	apps, err := a.DbMan.GetApps(org, priKey, priVal, secKey, secVal)
 	if err != nil {
 		log.Errorf("getApp: %v", err)
 		return nil, newDbError(err)
@@ -462,7 +463,7 @@
 		log.Errorf("getApp error getting parent status: %v", err)
 		return nil, newDbError(err)
 	}
-	creds, err := a.DbMan.GetAppCredentials(IdentifierAppId, app.Id, "", "")
+	creds, err := a.DbMan.GetAppCredentials(org, IdentifierAppId, app.Id, "", "")
 	if err != nil {
 		log.Errorf("getApp error getting parent status: %v", err)
 		return nil, newDbError(err)
diff --git a/accessEntity/data.go b/accessEntity/data.go
index 0307c7a..8c2450c 100644
--- a/accessEntity/data.go
+++ b/accessEntity/data.go
@@ -22,6 +22,7 @@
 const (
 	sql_select_api_product = `SELECT * FROM kms_api_product AS ap `
 	sql_select_org         = `SELECT * FROM kms_organization AS o WHERE o.tenant_id=$1 LIMIT 1;`
+	sql_select_tenant_org  = ` (SELECT o.tenant_id FROM kms_organization AS o WHERE o.name=?)`
 )
 
 type DbManager struct {
@@ -191,35 +192,35 @@
 	return status.String, nil
 }
 
-func (d *DbManager) GetApiProducts(priKey, priVal, secKey, secVal string) (apiProducts []common.ApiProduct, err error) {
+func (d *DbManager) GetApiProducts(org, priKey, priVal, secKey, secVal string) (apiProducts []common.ApiProduct, err error) {
 	if priKey == IdentifierAppId {
-		apiProducts, err = d.getApiProductsByAppId(priVal)
+		apiProducts, err = d.getApiProductsByAppId(priVal, org)
 		if err != nil {
 			return
 		}
 	} else if priKey == IdentifierApiProductName {
-		apiProducts, err = d.getApiProductsByName(priVal)
+		apiProducts, err = d.getApiProductsByName(priVal, org)
 		if err != nil {
 			return
 		}
 	} else if priKey == IdentifierAppName {
 		switch secKey {
 		case IdentifierDeveloperEmail:
-			apiProducts, err = d.getApiProductsByAppName(priVal, secVal, "", "")
+			apiProducts, err = d.getApiProductsByAppName(priVal, secVal, "", "", org)
 		case IdentifierDeveloperId:
-			apiProducts, err = d.getApiProductsByAppName(priVal, "", secVal, "")
+			apiProducts, err = d.getApiProductsByAppName(priVal, "", secVal, "", org)
 		case IdentifierCompanyName:
-			apiProducts, err = d.getApiProductsByAppName(priVal, "", "", secVal)
+			apiProducts, err = d.getApiProductsByAppName(priVal, "", "", secVal, org)
 		case IdentifierApiResource:
 			fallthrough
 		case "":
-			apiProducts, err = d.getApiProductsByAppName(priVal, "", "", "")
+			apiProducts, err = d.getApiProductsByAppName(priVal, "", "", "", org)
 		}
 		if err != nil {
 			return
 		}
 	} else if priKey == IdentifierConsumerKey {
-		apiProducts, err = d.getApiProductsByConsumerKey(priVal)
+		apiProducts, err = d.getApiProductsByConsumerKey(priVal, org)
 		if err != nil {
 			return
 		}
@@ -231,76 +232,79 @@
 	return
 }
 
-func (d *DbManager) GetApps(priKey, priVal, secKey, secVal string) (apps []common.App, err error) {
+func (d *DbManager) GetApps(org, priKey, priVal, secKey, secVal string) (apps []common.App, err error) {
 	switch priKey {
 	case IdentifierAppId:
-		return d.getAppByAppId(priVal)
+		return d.getAppByAppId(priVal, org)
 	case IdentifierAppName:
 		switch secKey {
 		case IdentifierDeveloperEmail:
-			return d.getAppByAppName(priVal, secVal, "", "")
+			return d.getAppByAppName(priVal, secVal, "", "", org)
 		case IdentifierDeveloperId:
-			return d.getAppByAppName(priVal, "", secVal, "")
+			return d.getAppByAppName(priVal, "", secVal, "", org)
 		case IdentifierCompanyName:
-			return d.getAppByAppName(priVal, "", "", secVal)
+			return d.getAppByAppName(priVal, "", "", secVal, org)
 		case "":
-			return d.getAppByAppName(priVal, "", "", "")
+			return d.getAppByAppName(priVal, "", "", "", org)
 		}
 	case IdentifierConsumerKey:
-		return d.getAppByConsumerKey(priVal)
+		return d.getAppByConsumerKey(priVal, org)
 	}
 	return
 }
 
-func (d *DbManager) GetCompanies(priKey, priVal, secKey, secVal string) (companies []common.Company, err error) {
+func (d *DbManager) GetCompanies(org, priKey, priVal, secKey, secVal string) (companies []common.Company, err error) {
 	switch priKey {
 	case IdentifierAppId:
-		return d.getCompanyByAppId(priVal)
+		return d.getCompanyByAppId(priVal, org)
 	case IdentifierCompanyName:
-		return d.getCompanyByName(priVal)
+		return d.getCompanyByName(priVal, org)
 	case IdentifierConsumerKey:
-		return d.getCompanyByConsumerKey(priVal)
+		return d.getCompanyByConsumerKey(priVal, org)
 	}
 	return
 }
 
-func (d *DbManager) GetCompanyDevelopers(priKey, priVal, secKey, secVal string) (companyDevelopers []common.CompanyDeveloper, err error) {
+func (d *DbManager) GetCompanyDevelopers(org, priKey, priVal, secKey, secVal string) (companyDevelopers []common.CompanyDeveloper, err error) {
 	if priKey == IdentifierCompanyName {
-		return d.getCompanyDeveloperByComName(priVal)
+		return d.getCompanyDeveloperByComName(priVal, org)
 	}
 	return
 }
 
-func (d *DbManager) GetAppCredentials(priKey, priVal, secKey, secVal string) (appCredentials []common.AppCredential, err error) {
+func (d *DbManager) GetAppCredentials(org, priKey, priVal, secKey, secVal string) (appCredentials []common.AppCredential, err error) {
 	if priKey == IdentifierConsumerKey {
-		return d.getAppCredentialByConsumerKey(priVal)
+		return d.getAppCredentialByConsumerKey(priVal, org)
 	}
 	return
 }
 
-func (d *DbManager) GetDevelopers(priKey, priVal, secKey, secVal string) (developers []common.Developer, err error) {
+func (d *DbManager) GetDevelopers(org, priKey, priVal, secKey, secVal string) (developers []common.Developer, err error) {
 	switch priKey {
 	case IdentifierAppId:
-		return d.getDeveloperByAppId(priVal)
+		return d.getDeveloperByAppId(priVal, org)
 	case IdentifierDeveloperEmail:
-		return d.getDeveloperByEmail(priVal)
+		return d.getDeveloperByEmail(priVal, org)
 	case IdentifierConsumerKey:
-		return d.getDeveloperByConsumerKey(priVal)
+		return d.getDeveloperByConsumerKey(priVal, org)
 	case IdentifierDeveloperId:
-		return d.getDeveloperById(priVal)
+		return d.getDeveloperById(priVal, org)
 	}
 	return
 }
 
-func (d *DbManager) getApiProductsByName(apiProdName string) (apiProducts []common.ApiProduct, err error) {
+func (d *DbManager) getApiProductsByName(apiProdName string, org string) (apiProducts []common.ApiProduct, err error) {
 	err = d.GetDb().QueryStructs(&apiProducts,
-		sql_select_api_product+`WHERE ap.name = $1;`,
+		sql_select_api_product+
+			`WHERE ap.name = ? AND ap.tenant_id IN `+
+			sql_select_tenant_org,
 		apiProdName,
+		org,
 	)
 	return
 }
 
-func (d *DbManager) getApiProductsByAppId(appId string) (apiProducts []common.ApiProduct, err error) {
+func (d *DbManager) getApiProductsByAppId(appId string, org string) (apiProducts []common.ApiProduct, err error) {
 	cols := []string{"*"}
 	query := selectApiProductsById(
 		selectAppCredentialMapperByAppId(
@@ -308,13 +312,13 @@
 			"apiprdt_id",
 		),
 		cols...,
-	)
+	) + " AND ap.tenant_id IN " + sql_select_tenant_org
 	log.Debugf("getApiProductsByAppId: %v", query)
-	err = d.GetDb().QueryStructs(&apiProducts, query)
+	err = d.GetDb().QueryStructs(&apiProducts, query, org)
 	return
 }
 
-func (d *DbManager) getApiProductsByConsumerKey(consumerKey string) (apiProducts []common.ApiProduct, err error) {
+func (d *DbManager) getApiProductsByConsumerKey(consumerKey string, org string) (apiProducts []common.ApiProduct, err error) {
 	cols := []string{"*"}
 	query := selectApiProductsById(
 		selectAppCredentialMapperByConsumerKey(
@@ -322,13 +326,13 @@
 			"apiprdt_id",
 		),
 		cols...,
-	)
+	) + " AND ap.tenant_id IN " + sql_select_tenant_org
 	log.Debugf("getApiProductsByConsumerKey: %v", query)
-	err = d.GetDb().QueryStructs(&apiProducts, query)
+	err = d.GetDb().QueryStructs(&apiProducts, query, org)
 	return
 }
 
-func (d *DbManager) getApiProductsByAppName(appName, devEmail, devId, comName string) (apiProducts []common.ApiProduct, err error) {
+func (d *DbManager) getApiProductsByAppName(appName, devEmail, devId, comName, org string) (apiProducts []common.ApiProduct, err error) {
 	cols := []string{"*"}
 	var appQuery string
 	switch {
@@ -369,24 +373,24 @@
 			"apiprdt_id",
 		),
 		cols...,
-	)
+	) + " AND ap.tenant_id IN " + sql_select_tenant_org
 	log.Debugf("getApiProductsByAppName: %v", query)
-	err = d.GetDb().QueryStructs(&apiProducts, query)
+	err = d.GetDb().QueryStructs(&apiProducts, query, org)
 	return
 }
 
-func (d *DbManager) getAppByAppId(id string) (apps []common.App, err error) {
+func (d *DbManager) getAppByAppId(id, org string) (apps []common.App, err error) {
 	cols := []string{"*"}
 	query := selectAppById(
 		"'"+id+"'",
 		cols...,
-	)
+	) + " AND a.tenant_id IN " + sql_select_tenant_org
 	log.Debugf("getAppByAppId: %v", query)
-	err = d.GetDb().QueryStructs(&apps, query)
+	err = d.GetDb().QueryStructs(&apps, query, org)
 	return
 }
 
-func (d *DbManager) getAppByAppName(appName, devEmail, devId, comName string) (apps []common.App, err error) {
+func (d *DbManager) getAppByAppName(appName, devEmail, devId, comName, org string) (apps []common.App, err error) {
 	cols := []string{"*"}
 	var query string
 	switch {
@@ -420,12 +424,13 @@
 			cols...,
 		)
 	}
-	log.Debugf("getAppByAppName: %v", query)
+	query += " AND a.tenant_id IN " + sql_select_tenant_org
+	log.Debugf("getAppByAppName: %v", query, org)
 	err = d.GetDb().QueryStructs(&apps, query)
 	return
 }
 
-func (d *DbManager) getAppByConsumerKey(consumerKey string) (apps []common.App, err error) {
+func (d *DbManager) getAppByConsumerKey(consumerKey, org string) (apps []common.App, err error) {
 	cols := []string{"*"}
 	query := selectAppById(
 		selectAppCredentialMapperByConsumerKey(
@@ -433,24 +438,24 @@
 			"app_id",
 		),
 		cols...,
-	)
+	) + " AND a.tenant_id IN " + sql_select_tenant_org
 	log.Debugf("getAppByConsumerKey: %v", query)
-	err = d.GetDb().QueryStructs(&apps, query)
+	err = d.GetDb().QueryStructs(&apps, query, org)
 	return
 }
 
-func (d *DbManager) getAppCredentialByConsumerKey(consumerKey string) (appCredentials []common.AppCredential, err error) {
+func (d *DbManager) getAppCredentialByConsumerKey(consumerKey, org string) (appCredentials []common.AppCredential, err error) {
 	cols := []string{"*"}
 	query := selectAppCredentialByConsumerKey(
 		"'"+consumerKey+"'",
 		cols...,
-	)
+	) + " AND a.tenant_id IN " + sql_select_tenant_org
 	log.Debugf("getAppCredentialByConsumerKey: %v", query)
-	err = d.GetDb().QueryStructs(&appCredentials, query)
+	err = d.GetDb().QueryStructs(&appCredentials, query, org)
 	return
 }
 
-func (d *DbManager) getCompanyByAppId(appId string) (companies []common.Company, err error) {
+func (d *DbManager) getCompanyByAppId(appId, org string) (companies []common.Company, err error) {
 	cols := []string{"*"}
 	query := selectCompanyByComId(
 		selectAppById(
@@ -458,24 +463,24 @@
 			"company_id",
 		),
 		cols...,
-	)
+	) + " AND com.tenant_id IN " + sql_select_tenant_org
 	log.Debugf("getCompanyByAppId: %v", query)
-	err = d.GetDb().QueryStructs(&companies, query)
+	err = d.GetDb().QueryStructs(&companies, query, org)
 	return
 }
 
-func (d *DbManager) getCompanyByName(name string) (companies []common.Company, err error) {
+func (d *DbManager) getCompanyByName(name, org string) (companies []common.Company, err error) {
 	cols := []string{"*"}
 	query := selectCompanyByName(
 		"'"+name+"'",
 		cols...,
-	)
+	) + " AND com.tenant_id IN " + sql_select_tenant_org
 	log.Debugf("getCompanyByName: %v", query)
-	err = d.GetDb().QueryStructs(&companies, query)
+	err = d.GetDb().QueryStructs(&companies, query, org)
 	return
 }
 
-func (d *DbManager) getCompanyByConsumerKey(consumerKey string) (companies []common.Company, err error) {
+func (d *DbManager) getCompanyByConsumerKey(consumerKey, org string) (companies []common.Company, err error) {
 	cols := []string{"*"}
 	query := selectCompanyByComId(
 		selectAppById(
@@ -486,13 +491,13 @@
 			"company_id",
 		),
 		cols...,
-	)
+	) + " AND com.tenant_id IN " + sql_select_tenant_org
 	log.Debugf("getCompanyByConsumerKey: %v", query)
-	err = d.GetDb().QueryStructs(&companies, query)
+	err = d.GetDb().QueryStructs(&companies, query, org)
 	return
 }
 
-func (d *DbManager) getCompanyDeveloperByComName(comName string) (companyDevelopers []common.CompanyDeveloper, err error) {
+func (d *DbManager) getCompanyDeveloperByComName(comName, org string) (companyDevelopers []common.CompanyDeveloper, err error) {
 	cols := []string{"*"}
 	query := selectCompanyDeveloperByComId(
 		selectCompanyByName(
@@ -500,13 +505,13 @@
 			"id",
 		),
 		cols...,
-	)
+	) + " AND cd.tenant_id IN " + sql_select_tenant_org
 	log.Debugf("getCompanyDeveloperByComName: %v", query)
-	err = d.GetDb().QueryStructs(&companyDevelopers, query)
+	err = d.GetDb().QueryStructs(&companyDevelopers, query, org)
 	return
 }
 
-func (d *DbManager) getDeveloperByAppId(appId string) (developers []common.Developer, err error) {
+func (d *DbManager) getDeveloperByAppId(appId, org string) (developers []common.Developer, err error) {
 	cols := []string{"*"}
 	query := selectDeveloperById(
 		selectAppById(
@@ -514,13 +519,13 @@
 			"developer_id",
 		),
 		cols...,
-	)
+	) + " AND dev.tenant_id IN " + sql_select_tenant_org
 	log.Debugf("getDeveloperByAppId: %v", query)
-	err = d.GetDb().QueryStructs(&developers, query)
+	err = d.GetDb().QueryStructs(&developers, query, org)
 	return
 }
 
-func (d *DbManager) getDeveloperByConsumerKey(consumerKey string) (developers []common.Developer, err error) {
+func (d *DbManager) getDeveloperByConsumerKey(consumerKey, org string) (developers []common.Developer, err error) {
 	cols := []string{"*"}
 	query := selectDeveloperById(
 		selectAppById(
@@ -531,31 +536,31 @@
 			"developer_id",
 		),
 		cols...,
-	)
+	) + " AND dev.tenant_id IN " + sql_select_tenant_org
 	log.Debugf("getDeveloperByConsumerKey: %v", query)
-	err = d.GetDb().QueryStructs(&developers, query)
+	err = d.GetDb().QueryStructs(&developers, query, org)
 	return
 }
 
-func (d *DbManager) getDeveloperByEmail(email string) (developers []common.Developer, err error) {
+func (d *DbManager) getDeveloperByEmail(email, org string) (developers []common.Developer, err error) {
 	cols := []string{"*"}
 	query := selectDeveloperByEmail(
 		"'"+email+"'",
 		cols...,
-	)
+	) + " AND dev.tenant_id IN " + sql_select_tenant_org
 	log.Debugf("getDeveloperByEmail: %v", query)
-	err = d.GetDb().QueryStructs(&developers, query)
+	err = d.GetDb().QueryStructs(&developers, query, org)
 	return
 }
 
-func (d *DbManager) getDeveloperById(id string) (developers []common.Developer, err error) {
+func (d *DbManager) getDeveloperById(id, org string) (developers []common.Developer, err error) {
 	cols := []string{"*"}
 	query := selectDeveloperById(
 		"'"+id+"'",
 		cols...,
-	)
+	) + " AND dev.tenant_id IN " + sql_select_tenant_org
 	log.Debugf("getDeveloperById: %v", query)
-	err = d.GetDb().QueryStructs(&developers, query)
+	err = d.GetDb().QueryStructs(&developers, query, org)
 	return
 }
 
diff --git a/accessEntity/data_test.go b/accessEntity/data_test.go
index 4cf7b78..e836dd2 100644
--- a/accessEntity/data_test.go
+++ b/accessEntity/data_test.go
@@ -48,6 +48,7 @@
 
 		It("should get apiProducts", func() {
 			setupTestDb(dbMan.GetDb())
+			org := "edgex01"
 			testData := [][]string{
 				//positive tests
 				{IdentifierApiProductName, "apstest", "", ""},
@@ -118,7 +119,7 @@
 
 			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)
+				prods, err := dbMan.GetApiProducts(org, priKey, priVal, secKey, secVal)
 				Expect(err).Should(Succeed())
 				if len(results[i]) > 0 {
 					Expect(prods).Should(Equal(results[i]))
diff --git a/accessEntity/interfaces.go b/accessEntity/interfaces.go
index cdf4154..94506ec 100644
--- a/accessEntity/interfaces.go
+++ b/accessEntity/interfaces.go
@@ -12,13 +12,12 @@
 
 type DbManagerInterface interface {
 	common.DbManagerInterface
-	GetOrgName(tenantId string) (string, error)
-	GetApiProducts(priKey, priVal, secKey, secVal string) (apiProducts []common.ApiProduct, err error)
-	GetApps(priKey, priVal, secKey, secVal string) (apps []common.App, err error)
-	GetCompanies(priKey, priVal, secKey, secVal string) (companies []common.Company, err error)
-	GetCompanyDevelopers(priKey, priVal, secKey, secVal string) (companyDevelopers []common.CompanyDeveloper, err error)
-	GetAppCredentials(priKey, priVal, secKey, secVal string) (appCredentials []common.AppCredential, err error)
-	GetDevelopers(priKey, priVal, secKey, secVal string) (developers []common.Developer, err error)
+	GetApiProducts(org, priKey, priVal, secKey, secVal string) (apiProducts []common.ApiProduct, err error)
+	GetApps(org, priKey, priVal, secKey, secVal string) (apps []common.App, err error)
+	GetCompanies(org, priKey, priVal, secKey, secVal string) (companies []common.Company, err error)
+	GetCompanyDevelopers(org, priKey, priVal, secKey, secVal string) (companyDevelopers []common.CompanyDeveloper, err error)
+	GetAppCredentials(org, priKey, priVal, secKey, secVal string) (appCredentials []common.AppCredential, err error)
+	GetDevelopers(org, priKey, priVal, secKey, secVal string) (developers []common.Developer, err error)
 	GetApiProductNamesByAppId(appId string) ([]string, error)
 	GetAppNamesByComId(comId string) ([]string, error)
 	GetComNamesByDevId(devId string) ([]string, error)
@@ -26,4 +25,5 @@
 	GetComNameByComId(comId string) (string, error)
 	GetDevEmailByDevId(devId string) (string, error)
 	GetStatus(id, t string) (string, error)
+	GetOrgName(tenantId string) (string, error)
 }
