diff --git a/data.go b/data.go
index 695ef8e..6270b43 100644
--- a/data.go
+++ b/data.go
@@ -59,42 +59,13 @@
 	getApiKeyDetails(dataWrapper *VerifyApiKeyRequestResponseDataWrapper) error
 }
 
-func (dbc *dbManager) getKmsAttributesOld(tenantId, entityId string) []Attribute {
-
-	db := dbc.db
-	var attName, attValue sql.NullString
-	sql := "select name, value from kms_attributes where tenant_id = $1 and entity_id = $2"
-	attributesForQuery := []Attribute{}
-	attributes, err := db.Query(sql, tenantId, entityId)
-	if err != nil {
-		log.Error("Error while fetching attributes for tenant id : %s and entityId : %s", tenantId, entityId, err)
-		return attributesForQuery
-	}
-
-	for attributes.Next() {
-		err := attributes.Scan(
-			&attName,
-			&attValue,
-		)
-		if err != nil {
-			log.Error("error fetching attributes for entityid ", entityId, err)
-		}
-		if attName.String != "" {
-			att := Attribute{Name: attName.String, Value: attValue.String}
-			attributesForQuery = append(attributesForQuery, att)
-		}
-	}
-	log.Debug("attributes returned for query ", sql, " are ", attributesForQuery, tenantId, entityId)
-	return attributesForQuery
-}
-
 func (dbc *dbManager) getKmsAttributes(tenantId string, entities ...string) map[string][]Attribute {
 
 	db := dbc.db
 	var attName, attValue sql.NullString
 	var entity_id string
 	// TODO : is there no other better way to do in caluse???
-	sql := `select entity_id, name, value from kms_attributes where tenant_id = $1 and entity_id in ('` + strings.Join(entities, `','`) + `')`
+	sql := sql_GET_KMS_ATTRIBUTES_FOR_TENANT + ` and entity_id in ('` + strings.Join(entities, `','`) + `')`
 	mapOfAttributes := make(map[string][]Attribute)
 	attributes, err := db.Query(sql, tenantId)
 	if err != nil {
@@ -122,105 +93,8 @@
 func (dbc dbManager) getApiKeyDetails(dataWrapper *VerifyApiKeyRequestResponseDataWrapper) error {
 
 	db := dbc.db
-	sSql := `
-			SELECT
-				COALESCE("developer","") as ctype,
-				COALESCE(c.tenant_id,""),
 
-				COALESCE(c.status,""),
-				COALESCE(c.consumer_secret,""),
-
-				COALESCE(ad.id,"") as dev_id,
-				COALESCE(ad.username,"") as dev_username,
-				COALESCE(ad.first_name,"") as dev_first_name,
-				COALESCE(ad.last_name,"") as dev_last_name,
-				COALESCE(ad.email,"") as dev_email,
-				COALESCE(ad.status,"") as dev_status,
-				COALESCE(ad.created_at,"") as dev_created_at,
-				COALESCE(ad.created_by,"") as dev_created_by,
-				COALESCE(ad.updated_at,"") as dev_updated_at,
-				COALESCE(ad.updated_by,"") as dev_updated_by,
-
-				COALESCE(a.id,"") as app_id,
-				COALESCE(a.name,"") as app_name,
-				COALESCE(a.access_type,"") as app_access_type,
-				COALESCE(a.callback_url,"") as app_callback_url,
-				COALESCE(a.display_name,"") as app_display_name,
-				COALESCE(a.status,"") as app_status,
-				COALESCE(a.app_family,"") as app_app_family,
-				COALESCE(a.company_id,"") as app_company_id,
-				COALESCE(a.created_at,"") as app_created_at,
-				COALESCE(a.created_by,"") as app_created_by,
-				COALESCE(a.updated_at,"") as app_updated_at,
-				COALESCE(a.updated_by,"") as app_updated_by
-
-			FROM
-				KMS_APP_CREDENTIAL AS c
-				INNER JOIN KMS_APP AS a
-					ON c.app_id = a.id
-				INNER JOIN KMS_DEVELOPER AS ad
-					ON ad.id = a.developer_id
-				INNER JOIN KMS_APP_CREDENTIAL_APIPRODUCT_MAPPER as mp
-					ON mp.appcred_id = c.id
-				INNER JOIN KMS_ORGANIZATION AS o
-					ON o.tenant_id = c.tenant_id
-			WHERE 	(
-				mp.app_id = a.id
-				AND mp.appcred_id = c.id
-				AND c.id = $1
-				AND o.name = $2)
-			UNION ALL
-			SELECT
-				COALESCE("company","") as ctype,
-				COALESCE(c.tenant_id,""),
-
-				COALESCE(c.status,""),
-				COALESCE(c.consumer_secret,""),
-
-				COALESCE(ad.id,"") as dev_id,
-				COALESCE(ad.display_name,"") as dev_username,
-				COALESCE("","") as dev_first_name,
-				COALESCE("","") as dev_last_name,
-				COALESCE("","") as dev_email,
-				COALESCE(ad.status,"") as dev_status,
-				COALESCE(ad.created_at,"") as dev_created_at,
-				COALESCE(ad.created_by,"") as dev_created_by,
-				COALESCE(ad.updated_at,"") as dev_updated_at,
-				COALESCE(ad.updated_by,"") as dev_updated_by,
-
-				COALESCE(a.id,"") as app_id,
-				COALESCE(a.name,"") as app_name,
-				COALESCE(a.access_type,"") as app_access_type,
-				COALESCE(a.callback_url,"") as app_callback_url,
-				COALESCE(a.display_name,"") as app_display_name,
-				COALESCE(a.status,"") as app_status,
-				COALESCE(a.app_family,"") as app_app_family,
-				COALESCE(a.company_id,"") as app_company_id,
-				COALESCE(a.created_at,"") as app_created_at,
-				COALESCE(a.created_by,"") as app_created_by,
-				COALESCE(a.updated_at,"") as app_updated_at,
-				COALESCE(a.updated_by,"") as app_updated_by
-
-			FROM
-				KMS_APP_CREDENTIAL AS c
-				INNER JOIN KMS_APP AS a
-					ON c.app_id = a.id
-				INNER JOIN KMS_COMPANY AS ad
-					ON ad.id = a.company_id
-				INNER JOIN KMS_APP_CREDENTIAL_APIPRODUCT_MAPPER as mp
-					ON mp.appcred_id = c.id
-				INNER JOIN KMS_ORGANIZATION AS o
-					ON o.tenant_id = c.tenant_id
-			WHERE   (
-				mp.app_id = a.id
-				AND mp.appcred_id = c.id
-				AND c.id = $1
-				AND o.name = $2)
-		;`
-
-	//cid,csecret,did,dusername,dfirstname,dlastname,demail,dstatus,dcreated_at,dcreated_by,dlast_modified_at,dlast_modified_by, aid,aname,aaccesstype,acallbackurl,adisplay_name,astatus,aappfamily, acompany,acreated_at,acreated_by,alast_modified_at,alast_modified_by,pid,pname,pdisplayname,pquota_limit,pqutoainterval,pquotatimeout,pcreated_at,pcreated_by,plast_modified_at,plast_modified_by sql.NullString
-
-	err := db.QueryRow(sSql, dataWrapper.verifyApiKeyRequest.Key, dataWrapper.verifyApiKeyRequest.OrganizationName).
+	err := db.QueryRow(sql_GET_API_KEY_DETAILS_SQL , dataWrapper.verifyApiKeyRequest.Key, dataWrapper.verifyApiKeyRequest.OrganizationName).
 		Scan(
 			&dataWrapper.ctype,
 			&dataWrapper.tenant_id,
@@ -273,36 +147,8 @@
 	db := dbc.db
 	allProducts := []ApiProductDetails{}
 	var proxies, environments, resources string
-	sSql := `
-			SELECT
-				COALESCE(ap.id,"") as prod_id,
-				COALESCE(ap.name,"") as prod_name,
-				COALESCE(ap.display_name,"") as prod_display_name,
-				COALESCE(ap.quota,"") as prod_quota,
-				COALESCE(ap.quota_interval, 0) as prod_quota_interval,
-				COALESCE(ap.quota_time_unit,"") as prod_quota_time_unit,
-				COALESCE(ap.created_at,"") as prod_created_at,
-				COALESCE(ap.created_by,"") as prod_created_by,
-				COALESCE(ap.updated_at,"") as prod_updated_at,
-				COALESCE(ap.updated_by,"") as prod_updated_by,
-				COALESCE(ap.proxies,"") as prod_proxies,
-				COALESCE(ap.environments,"") as prod_environments,
-				COALESCE(ap.api_resources,"") as prod_resources
-			FROM
-				KMS_APP_CREDENTIAL AS c
-				INNER JOIN KMS_APP_CREDENTIAL_APIPRODUCT_MAPPER as mp
-					ON mp.appcred_id = c.id
-				INNER JOIN KMS_API_PRODUCT as ap
-					ON ap.id = mp.apiprdt_id
-			WHERE 	(mp.apiprdt_id = ap.id
-				AND mp.appcred_id = c.id
-				AND c.id = $1
-				AND ap.tenant_id = $2)
-		;`
 
-	//cid,csecret,did,dusername,dfirstname,dlastname,demail,dstatus,dcreated_at,dcreated_by,dlast_modified_at,dlast_modified_by, aid,aname,aaccesstype,acallbackurl,adisplay_name,astatus,aappfamily, acompany,acreated_at,acreated_by,alast_modified_at,alast_modified_by,pid,pname,pdisplayname,pquota_limit,pqutoainterval,pquotatimeout,pcreated_at,pcreated_by,plast_modified_at,plast_modified_by sql.NullString
-
-	rows, err := db.Query(sSql, key, tenantId)
+	rows, err := db.Query(sql_GET_API_PRODUCTS_FOR_KEY_SQL, key, tenantId)
 
 	if err != nil {
 		log.Error("error fetching apiProduct details", err)
diff --git a/sqlQueries.go b/sqlQueries.go
new file mode 100644
index 0000000..609c3b3
--- /dev/null
+++ b/sqlQueries.go
@@ -0,0 +1,142 @@
+// 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 apidVerifyApiKey
+
+const sql_GET_API_KEY_DETAILS_SQL = `
+			SELECT
+				COALESCE("developer","") as ctype,
+				COALESCE(c.tenant_id,""),
+
+				COALESCE(c.status,""),
+				COALESCE(c.consumer_secret,""),
+
+				COALESCE(ad.id,"") as dev_id,
+				COALESCE(ad.username,"") as dev_username,
+				COALESCE(ad.first_name,"") as dev_first_name,
+				COALESCE(ad.last_name,"") as dev_last_name,
+				COALESCE(ad.email,"") as dev_email,
+				COALESCE(ad.status,"") as dev_status,
+				COALESCE(ad.created_at,"") as dev_created_at,
+				COALESCE(ad.created_by,"") as dev_created_by,
+				COALESCE(ad.updated_at,"") as dev_updated_at,
+				COALESCE(ad.updated_by,"") as dev_updated_by,
+
+				COALESCE(a.id,"") as app_id,
+				COALESCE(a.name,"") as app_name,
+				COALESCE(a.access_type,"") as app_access_type,
+				COALESCE(a.callback_url,"") as app_callback_url,
+				COALESCE(a.display_name,"") as app_display_name,
+				COALESCE(a.status,"") as app_status,
+				COALESCE(a.app_family,"") as app_app_family,
+				COALESCE(a.company_id,"") as app_company_id,
+				COALESCE(a.created_at,"") as app_created_at,
+				COALESCE(a.created_by,"") as app_created_by,
+				COALESCE(a.updated_at,"") as app_updated_at,
+				COALESCE(a.updated_by,"") as app_updated_by
+
+			FROM
+				KMS_APP_CREDENTIAL AS c
+				INNER JOIN KMS_APP AS a
+					ON c.app_id = a.id
+				INNER JOIN KMS_DEVELOPER AS ad
+					ON ad.id = a.developer_id
+				INNER JOIN KMS_APP_CREDENTIAL_APIPRODUCT_MAPPER as mp
+					ON mp.appcred_id = c.id
+				INNER JOIN KMS_ORGANIZATION AS o
+					ON o.tenant_id = c.tenant_id
+			WHERE 	(
+				mp.app_id = a.id
+				AND mp.appcred_id = c.id
+				AND c.id = $1
+				AND o.name = $2)
+			UNION ALL
+			SELECT
+				COALESCE("company","") as ctype,
+				COALESCE(c.tenant_id,""),
+
+				COALESCE(c.status,""),
+				COALESCE(c.consumer_secret,""),
+
+				COALESCE(ad.id,"") as dev_id,
+				COALESCE(ad.display_name,"") as dev_username,
+				COALESCE("","") as dev_first_name,
+				COALESCE("","") as dev_last_name,
+				COALESCE("","") as dev_email,
+				COALESCE(ad.status,"") as dev_status,
+				COALESCE(ad.created_at,"") as dev_created_at,
+				COALESCE(ad.created_by,"") as dev_created_by,
+				COALESCE(ad.updated_at,"") as dev_updated_at,
+				COALESCE(ad.updated_by,"") as dev_updated_by,
+
+				COALESCE(a.id,"") as app_id,
+				COALESCE(a.name,"") as app_name,
+				COALESCE(a.access_type,"") as app_access_type,
+				COALESCE(a.callback_url,"") as app_callback_url,
+				COALESCE(a.display_name,"") as app_display_name,
+				COALESCE(a.status,"") as app_status,
+				COALESCE(a.app_family,"") as app_app_family,
+				COALESCE(a.company_id,"") as app_company_id,
+				COALESCE(a.created_at,"") as app_created_at,
+				COALESCE(a.created_by,"") as app_created_by,
+				COALESCE(a.updated_at,"") as app_updated_at,
+				COALESCE(a.updated_by,"") as app_updated_by
+
+			FROM
+				KMS_APP_CREDENTIAL AS c
+				INNER JOIN KMS_APP AS a
+					ON c.app_id = a.id
+				INNER JOIN KMS_COMPANY AS ad
+					ON ad.id = a.company_id
+				INNER JOIN KMS_APP_CREDENTIAL_APIPRODUCT_MAPPER as mp
+					ON mp.appcred_id = c.id
+				INNER JOIN KMS_ORGANIZATION AS o
+					ON o.tenant_id = c.tenant_id
+			WHERE   (
+				mp.app_id = a.id
+				AND mp.appcred_id = c.id
+				AND c.id = $1
+				AND o.name = $2)
+		;`
+
+
+const sql_GET_API_PRODUCTS_FOR_KEY_SQL = `
+			SELECT
+				COALESCE(ap.id,"") as prod_id,
+				COALESCE(ap.name,"") as prod_name,
+				COALESCE(ap.display_name,"") as prod_display_name,
+				COALESCE(ap.quota,"") as prod_quota,
+				COALESCE(ap.quota_interval, 0) as prod_quota_interval,
+				COALESCE(ap.quota_time_unit,"") as prod_quota_time_unit,
+				COALESCE(ap.created_at,"") as prod_created_at,
+				COALESCE(ap.created_by,"") as prod_created_by,
+				COALESCE(ap.updated_at,"") as prod_updated_at,
+				COALESCE(ap.updated_by,"") as prod_updated_by,
+				COALESCE(ap.proxies,"") as prod_proxies,
+				COALESCE(ap.environments,"") as prod_environments,
+				COALESCE(ap.api_resources,"") as prod_resources
+			FROM
+				KMS_APP_CREDENTIAL AS c
+				INNER JOIN KMS_APP_CREDENTIAL_APIPRODUCT_MAPPER as mp
+					ON mp.appcred_id = c.id
+				INNER JOIN KMS_API_PRODUCT as ap
+					ON ap.id = mp.apiprdt_id
+			WHERE 	(mp.apiprdt_id = ap.id
+				AND mp.appcred_id = c.id
+				AND c.id = $1
+				AND ap.tenant_id = $2
+				AND mp.status = 'APPROVED')
+		;`
+
+
+const sql_GET_KMS_ATTRIBUTES_FOR_TENANT = "select entity_id, name, value from kms_attributes where tenant_id = $1"
