diff --git a/api.go b/api.go
index 50d340f..f72ec1b 100644
--- a/api.go
+++ b/api.go
@@ -3,15 +3,18 @@
 import (
 	"encoding/json"
 	"github.com/30x/apid-core"
+	"github.com/30x/apidQuota/constants"
+	"github.com/30x/apidQuota/globalVariables"
 	"github.com/30x/apidQuota/quotaBucket"
+	"github.com/30x/apidQuota/util"
 	"io/ioutil"
 	"net/http"
 	"strconv"
 )
 
 func InitAPI(services apid.Services) {
-	Log.Debug("initialized API's exposed by apidQuota plugin")
-	quotaBasePath := Config.GetString(ConfigQuotaBasePath)
+	globalVariables.Log.Debug("initialized API's exposed by apidQuota plugin")
+	quotaBasePath := globalVariables.Config.GetString(constants.ConfigQuotaBasePath)
 	services.API().HandleFunc(quotaBasePath, getAllQuotaValues).Methods("GET") //yet to implement.
 	services.API().HandleFunc(quotaBasePath+"/{quotaItentifier}", incrementAndCheckQuotaLimit).Methods("POST")
 
@@ -30,27 +33,27 @@
 	bodyBytes, err := ioutil.ReadAll(req.Body)
 	defer req.Body.Close()
 	if err != nil {
-		WriteErrorResponse(http.StatusBadRequest, UnableToParseBody, "unable to read request body: "+err.Error(), res, req)
+		util.WriteErrorResponse(http.StatusBadRequest, constants.UnableToParseBody, "unable to read request body: "+err.Error(), res, req)
 		return
 	}
 
 	quotaBucketMap := make(map[string]interface{}, 0)
 	if err := json.Unmarshal(bodyBytes, &quotaBucketMap); err != nil {
-		WriteErrorResponse(http.StatusBadRequest, UnMarshalJSONError, "unable to convert request body to an object: "+err.Error(), res, req)
+		util.WriteErrorResponse(http.StatusBadRequest, constants.UnMarshalJSONError, "unable to convert request body to an object: "+err.Error(), res, req)
 		return
 	}
-	Log.Println("quotaBucketMap from request: ", quotaBucketMap)
+	globalVariables.Log.Println("quotaBucketMap from request: ", quotaBucketMap)
 
 	// parse the request body into the Event struct
 	qBucket := new(quotaBucket.QuotaBucket)
 	if err = qBucket.FromAPIRequest(quotaBucketMap); err != nil {
-		WriteErrorResponse(http.StatusBadRequest, ErrorConvertReqBodyToEntity, err.Error(), res, req)
+		util.WriteErrorResponse(http.StatusBadRequest, constants.ErrorConvertReqBodyToEntity, err.Error(), res, req)
 		return
 	}
 
 	quotaCount, err := qBucket.GetQuotaCount()
 	if err != nil {
-		WriteErrorResponse(http.StatusBadRequest, UnMarshalJSONError, "error retrieving count for the give identifier "+err.Error(), res, req)
+		util.WriteErrorResponse(http.StatusBadRequest, constants.UnMarshalJSONError, "error retrieving count for the give identifier "+err.Error(), res, req)
 		return
 	}
 
diff --git a/api_test.go b/api_test.go
index 8a83c8f..9d6452c 100644
--- a/api_test.go
+++ b/api_test.go
@@ -2,8 +2,16 @@
 
 import (
 	. "github.com/onsi/ginkgo"
+	//"net/http"
 )
 
-var _ = Describe("Api", func() {
+func init() {
+	//testAPIDQuotaURL = ""
+}
 
+var _ = Describe("Api", func() {
+	It("test Synchronous quota", func() {
+
+		//req, err := http.NewRequest("POST", )
+	})
 })
diff --git a/constants.go b/constants.go
deleted file mode 100644
index 588b808..0000000
--- a/constants.go
+++ /dev/null
@@ -1,9 +0,0 @@
-package apidQuota
-
-const (
-	UnableToParseBody           = "unable_to_parse_body"
-	UnMarshalJSONError          = "unmarshal_json_error"
-	ErrorConvertReqBodyToEntity = "error_convert_reqBody_to_entity"
-	ConfigQuotaBasePath         = "quota_base_path"
-	quotaBasePathDefault        = "/quota"
-)
diff --git a/constants/constants.go b/constants/constants.go
new file mode 100644
index 0000000..9ced04b
--- /dev/null
+++ b/constants/constants.go
@@ -0,0 +1,14 @@
+package constants
+
+const (
+	UnableToParseBody           = "unable_to_parse_body"
+	UnMarshalJSONError          = "unmarshal_json_error"
+	ErrorConvertReqBodyToEntity = "error_convert_reqBody_to_entity"
+	ConfigQuotaBasePath         = "quota_base_path"
+	QuotaBasePathDefault        = "/quota"
+
+	ConfigCounterServiceBasePath = "counterService_base_path"
+	URLCounterServiceNotSet      = "url_counter_service_not_set"
+	URLCounterServiceInvalid     = "url_counter_service_invalid"
+	MarshalJSONError             = "marshal_JSON_error"
+)
diff --git a/globalVariables/globalVariables.go b/globalVariables/globalVariables.go
new file mode 100644
index 0000000..50a4df0
--- /dev/null
+++ b/globalVariables/globalVariables.go
@@ -0,0 +1,9 @@
+package globalVariables
+
+import "github.com/30x/apid-core"
+
+var (
+	Log               apid.LogService
+	Config            apid.ConfigService
+	CounterServiceURL string
+)
diff --git a/init.go b/init.go
index 93e1c1b..66e0a40 100644
--- a/init.go
+++ b/init.go
@@ -2,20 +2,31 @@
 
 import (
 	"github.com/30x/apid-core"
-)
-
-var (
-	Log    apid.LogService
-	Config apid.ConfigService
+	"github.com/30x/apidQuota/constants"
+	"github.com/30x/apidQuota/globalVariables"
 )
 
 func init() {
 	apid.RegisterPlugin(initPlugin)
+	initCounterService()
+}
+
+// set config for counter service.
+func initCounterService() {
+	//counterBasePath := globalVariables.Config.Get(constants.ConfigCounterServiceBasePath)
+	//fmt.Println("counterBasePath: ", counterBasePath , "//")
+	/*if counterBasePath != nil {
+		if reflect.TypeOf(counterBasePath).Kind() != reflect.String{
+			globalVariables.Log.Fatal("value of: " + constants.ConfigCounterServiceBasePath + " in the config should be string")
+		}
+		globalVariables.CounterServiceURL = counterBasePath.(string)
+	}*/
+	globalVariables.CounterServiceURL = "http://54.86.114.219:8989/increment"
 }
 
 func initPlugin(services apid.Services) (apid.PluginData, error) {
-	Log = services.Log().ForModule("apidQuota")
-	Log.Debug("start init")
+	globalVariables.Log = services.Log().ForModule("apidQuota")
+	globalVariables.Log.Debug("start init")
 
 	setConfig(services)
 	InitAPI(services)
@@ -25,8 +36,8 @@
 
 func setConfig(services apid.Services) {
 	// set configuration
-	Config = services.Config()
+	globalVariables.Config = services.Config()
 	// set plugin config defaults
-	Config.SetDefault(ConfigQuotaBasePath, quotaBasePathDefault)
+	globalVariables.Config.SetDefault(constants.ConfigQuotaBasePath, constants.QuotaBasePathDefault)
 
 }
diff --git a/quotaBucket/apiUtil.go b/quotaBucket/apiUtil.go
index 155a24d..c29e427 100644
--- a/quotaBucket/apiUtil.go
+++ b/quotaBucket/apiUtil.go
@@ -90,56 +90,6 @@
 	startTime = int64(startTimeFloat)
 	//fmt.Println("startTime: ", startTime)
 
-	quotaPeriod := QuotaPeriod{}
-	value, ok = quotaBucketMap["period"]
-	//if period is not sent in the request, it is calculated based in the startTime, quotaType and interval.
-	if ok {
-		var inStartInt, startInt, endInt int64
-
-		isPeriodMap := reflect.TypeOf(value)
-		if isPeriodMap.Kind() != reflect.Map {
-			return errors.New(`invalid type : 'period' should be a Map`)
-		}
-		periodMap := value.(map[string]interface{})
-
-		inStartTimeValue, ok := periodMap["inputStartTime"]
-		if !ok {
-			//set period.inputStart time from qBucket.startTime
-			inStartInt = startTime
-		} else {
-			if inStartType := reflect.TypeOf(inStartTimeValue); inStartType.Kind() != reflect.Float64 {
-				return errors.New(`invalid type : 'inputStartTime' in 'period' should be UNIX timestamp`)
-			}
-			inStartFloat := inStartTimeValue.(float64)
-			inStartInt = int64(inStartFloat)
-			if startTime != inStartInt {
-				return errors.New(`invalid value : 'inputStartTime' in 'period' should be same as 'startTime'' in request`)
-			}
-		}
-
-		startTimeValue, ok := periodMap["startTime"]
-		if !ok {
-			return errors.New(`missing field : 'startTime' in 'period' cannot be empty`)
-		}
-		if periodStartType := reflect.TypeOf(startTimeValue); periodStartType.Kind() != reflect.Float64 {
-			return errors.New(`invalid type : 'startTime' in 'period' should be UNIX timestamp`)
-		}
-		periodStartFloat := startTimeValue.(float64)
-		startInt = int64(periodStartFloat)
-
-		periodEndValue, ok := periodMap["endTime"]
-		if !ok {
-			return errors.New(`missing field : 'endTime' in 'period' cannot be empty`)
-		}
-		if periodEndType := reflect.TypeOf(periodEndValue); periodEndType.Kind() != reflect.Float64 {
-			return errors.New(`invalid type : 'endTime' in 'period' should be UNIX timestamp`)
-		}
-		periodEndFloat := periodEndValue.(float64)
-		endInt = int64(periodEndFloat)
-
-		quotaPeriod = NewQuotaPeriod(inStartInt, startInt, endInt)
-	}
-
 	value, ok = quotaBucketMap["maxCount"]
 	if !ok {
 		return errors.New(`missing field: 'maxCount' is required`)
@@ -162,7 +112,12 @@
 	bucketType = value.(string)
 	//fmt.Println("bucketType: ", bucketType)
 
-	newQBucket := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, quotaPeriod, startTime, maxCount, bucketType)
+	newQBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType)
+	if err != nil {
+		return errors.New("error creating newquotaBucket: " + err.Error())
+
+	}
+
 	qBucket.quotaBucketData = newQBucket.quotaBucketData
 
 	if err := qBucket.Validate(); err != nil {
diff --git a/quotaBucket/quotaBucket.go b/quotaBucket/quotaBucket.go
index 99bc6ba..119482b 100644
--- a/quotaBucket/quotaBucket.go
+++ b/quotaBucket/quotaBucket.go
@@ -3,6 +3,8 @@
 import (
 	"errors"
 	"fmt"
+	"github.com/30x/apidQuota/services"
+	"strings"
 	"time"
 )
 
@@ -22,9 +24,10 @@
 	//todo: Add other accepted bucketTypes
 
 	//errors
-	InvalidQuotaTimeUnitType = "invalidQuotaTimeUnitType"
-	InvalidQuotaBucketType   = "invalidQuotaBucketType"
-	InvalidQuotaPeriod       = "invalidQuotaPeriod"
+	InvalidQuotaTimeUnitType   = "invalidQuotaTimeUnitType"
+	InvalidQuotaDescriptorType = "invalidQuotaTimeUnitType"
+	InvalidQuotaBucketType     = "invalidQuotaBucketType"
+	InvalidQuotaPeriod         = "invalidQuotaPeriod"
 )
 
 var (
@@ -85,7 +88,7 @@
 	ID                    string
 	Interval              int
 	TimeUnit              string //TimeUnit {SECOND, MINUTE, HOUR, DAY, WEEK, MONTH}
-	QuotaType             string //Type {CALENDAR, FLEXI, ROLLING_WINDOW}
+	QuotaDescriptorType   string //Type {CALENDAR, FLEXI, ROLLING_WINDOW}
 	PreciseAtSecondsLevel bool
 	Period                QuotaPeriod
 	StartTime             time.Time
@@ -98,18 +101,18 @@
 }
 
 func NewQuotaBucket(edgeOrgID string, id string, interval int,
-	timeUnit string, quotaType string, preciseAtSecondsLevel bool, period QuotaPeriod,
-	startTime int64, maxCount int, bucketType string) *QuotaBucket {
+	timeUnit string, quotaType string, preciseAtSecondsLevel bool,
+	startTime int64, maxCount int, bucketType string) (*QuotaBucket, error) {
 
 	fromUNIXTime := time.Unix(startTime, 0)
+
 	quotaBucketDataStruct := &quotaBucketData{
 		EdgeOrgID:             edgeOrgID,
 		ID:                    id,
 		Interval:              interval,
 		TimeUnit:              timeUnit,
-		QuotaType:             quotaType,
+		QuotaDescriptorType:   quotaType,
 		PreciseAtSecondsLevel: preciseAtSecondsLevel,
-		Period:                period,
 		StartTime:             fromUNIXTime,
 		MaxCount:              maxCount,
 		BucketType:            bucketType,
@@ -119,13 +122,28 @@
 		quotaBucketData: *quotaBucketDataStruct,
 	}
 
-	return quotaBucket
+	err := quotaBucket.setCurrentPeriod()
+	if err != nil {
+		return nil, err
+	}
+	return quotaBucket, nil
 
 }
 
 func (q *QuotaBucket) Validate() error {
+
+	//check valid quotaTimeUnit
+	if ok := IsValidTimeUnit(strings.ToLower(q.GetTimeUnit())); !ok {
+		return errors.New(InvalidQuotaTimeUnitType)
+	}
+
+	//check valid quotaBucketType
+	if ok := IsValidQuotaBucketType(strings.ToLower(q.GetBucketType())); !ok {
+		return errors.New(InvalidQuotaBucketType)
+	}
+
 	//check if the period is valid
-	period,err := q.GetQuotaBucketPeriod()
+	period, err := q.GetQuotaBucketPeriod()
 	if err != nil {
 		return err
 	}
@@ -133,16 +151,6 @@
 		return errors.New("invalid Period: " + err.Error())
 	}
 
-	//check valid quotaTimeUnit
-	if ok := IsValidTimeUnit(q.GetTimeUnit()); !ok {
-		return errors.New(InvalidQuotaTimeUnitType)
-	}
-
-	//check valid quotaBucketType
-	if ok := IsValidQuotaBucketType(q.GetBucketType()); !ok {
-		return errors.New(InvalidQuotaBucketType)
-	}
-
 	return nil
 }
 
@@ -167,16 +175,16 @@
 }
 
 func (q *QuotaBucket) GetQuotaType() string {
-	return q.quotaBucketData.QuotaType
+	return q.quotaBucketData.QuotaDescriptorType
 }
 
 func (q *QuotaBucket) GetPreciseAtSecondsLevel() bool {
 	return q.quotaBucketData.PreciseAtSecondsLevel
 }
 
-//Calls setCurrentPeriod if QuotaType is rollingWindow or period.endTime is before now.
+//Calls setCurrentPeriod if QuotaDescriptorType is rollingWindow or period.endTime is before now.
 func (q *QuotaBucket) GetPeriod() (*QuotaPeriod, error) {
-	if q.quotaBucketData.QuotaType == QuotaTypeRollingWindow {
+	if q.quotaBucketData.QuotaDescriptorType == QuotaTypeRollingWindow {
 		qRWType := RollingWindowQuotaDescriptorType{}
 		err := qRWType.SetCurrentPeriod(q)
 		if err != nil {
@@ -184,12 +192,12 @@
 		}
 	}
 
-	period,err := q.GetQuotaBucketPeriod()
+	period, err := q.GetQuotaBucketPeriod()
 	if err != nil {
-		return nil,err
+		return nil, err
 	}
 	//setCurrentPeriod if endTime > time.now()
-	if period.endTime.Before(time.Now()) || period.endTime.Equal(time.Now()){
+	if period.endTime.Before(time.Now().UTC()) || period.endTime.Equal(time.Now().UTC()) {
 		if err := q.setCurrentPeriod(); err != nil {
 			return nil, err
 		}
@@ -199,19 +207,17 @@
 }
 
 //setCurrentPeriod only for rolling window else just return the value of QuotaPeriod
-func (q *QuotaBucket) GetQuotaBucketPeriod() (*QuotaPeriod,error) {
-	if q.quotaBucketData.QuotaType == QuotaTypeRollingWindow {
+func (q *QuotaBucket) GetQuotaBucketPeriod() (*QuotaPeriod, error) {
+	if q.quotaBucketData.QuotaDescriptorType == QuotaTypeRollingWindow {
 		qRWType := RollingWindowQuotaDescriptorType{}
 		err := qRWType.SetCurrentPeriod(q)
 		if err != nil {
 			return nil, err
 		}
 	}
-	return &q.quotaBucketData.Period,nil
+	return &q.quotaBucketData.Period, nil
 }
 
-
-
 func (q *QuotaBucket) GetMaxCount() int {
 	return q.quotaBucketData.MaxCount
 }
@@ -230,7 +236,7 @@
 
 func (q *QuotaBucket) setCurrentPeriod() error {
 
-	qDescriptorType, err := GetQuotaTypeHandler(q.GetQuotaType())
+	qDescriptorType, err := GetQuotaDescriptorTypeHandler(q.GetQuotaType())
 	if err != nil {
 		return err
 	}
@@ -241,15 +247,15 @@
 func (period *QuotaPeriod) IsCurrentPeriod(qBucket *QuotaBucket) bool {
 	if qBucket != nil && qBucket.GetBucketType() != "" {
 		if qBucket.GetQuotaType() == QuotaTypeRollingWindow {
-			return (period.inputStartTime.Equal(time.Now()) || period.inputStartTime.Before(time.Now()) )
+			return (period.inputStartTime.Equal(time.Now().UTC()) || period.inputStartTime.Before(time.Now().UTC()))
 		}
 
-		return (period.inputStartTime.Equal(time.Now()) || period.inputStartTime.Before(time.Now())) &&
+		return (period.inputStartTime.Equal(time.Now().UTC()) || period.inputStartTime.Before(time.Now().UTC())) &&
 			period.startTime.String() != "" &&
 			period.endTime.String() != "" &&
 			period.startTime.Before(period.endTime) &&
-			(period.startTime.Equal(time.Now()) || period.startTime.Before(time.Now()))&&
-			(period.endTime.Equal(time.Now()) || period.endTime.After(time.Now()))
+			(period.startTime.Equal(time.Now().UTC()) || period.startTime.Before(time.Now().UTC())) &&
+			(period.endTime.Equal(time.Now().UTC()) || period.endTime.After(time.Now().UTC()))
 	}
 	return false
 }
@@ -265,9 +271,12 @@
 	}
 	fmt.Println("period set: ", period)
 
-	//todo API call to counter service using Period start end and keyspace.
+	resp, err := services.IncrementAndGetCount(q.GetEdgeOrgID(), q.GetID(), 0)
+	if err != nil {
+		return 0, err
+	}
 
-	return 10, nil
+	return resp, nil
 }
 
 func (q *QuotaBucket) IncrementQuota() (int, error) {
diff --git a/quotaBucket/quotaBucketType_test.go b/quotaBucket/quotaBucketType_test.go
index 70ee53d..d6ac8c0 100644
--- a/quotaBucket/quotaBucketType_test.go
+++ b/quotaBucket/quotaBucketType_test.go
@@ -5,5 +5,7 @@
 )
 
 var _ = Describe("QuotaBucketType", func() {
-
+	It("test QuotaBucketType", func() {
+		//fmt.Println("inside QuotaBucketType")
+	})
 })
diff --git a/quotaBucket/quotaBucket_suite_test.go b/quotaBucket/quotaBucket_suite_test.go
index b05019b..43fa8cb 100644
--- a/quotaBucket/quotaBucket_suite_test.go
+++ b/quotaBucket/quotaBucket_suite_test.go
@@ -3,7 +3,6 @@
 import (
 	. "github.com/onsi/ginkgo"
 	. "github.com/onsi/gomega"
-	"fmt"
 	"testing"
 )
 
@@ -12,11 +11,11 @@
 	RunSpecs(t, "QuotaBucket Suite")
 }
 
-var _ = BeforeSuite(func() {
-	fmt.Println("before suite")
-
-})
-
-var _ = AfterSuite(func() {
-	fmt.Println("after suite")
-})
+//var _ = BeforeSuite(func() {
+//	fmt.Println("before suite")
+//
+//})
+//
+//var _ = AfterSuite(func() {
+//	fmt.Println("after suite")
+//})
diff --git a/quotaBucket/quotaBucket_test.go b/quotaBucket/quotaBucket_test.go
index df50e82..4d1e166 100644
--- a/quotaBucket/quotaBucket_test.go
+++ b/quotaBucket/quotaBucket_test.go
@@ -11,49 +11,59 @@
 var _ = Describe("Test QuotaPeriod", func() {
 	It("Valid NewQuotaPeriod", func() {
 		//startTime before endTime
-		period := NewQuotaPeriod(1492324596, 1490047028, 1492725428)
+		period := NewQuotaPeriod(time.Now().UTC().AddDate(0, -1, 0).Unix(),
+			time.Now().UTC().AddDate(0, 0, -1).Unix(),
+			time.Now().UTC().AddDate(0, 1, 0).Unix())
 		isValid, err := period.Validate()
 
-		if !isValid || err != nil {
-			Fail("expected isValid: true and error: nil for NewQuotaPeriod")
+		if !isValid {
+			Fail("expected isValid true but got false")
+		}
+		if err != nil {
+			Fail("expected error <nil> but got " + err.Error())
 		}
 	})
 
 	It("Invalid NewQuotaPeriod", func() {
 		//startTime after endTime
-		period := NewQuotaPeriod(1492324596, 1492725428, 1490047028)
+		period := NewQuotaPeriod(time.Now().UTC().AddDate(0, -1, 0).Unix(),
+			time.Now().UTC().AddDate(0, 1, 0).Unix(),
+			time.Now().UTC().AddDate(0, 0, -1).Unix())
 		isValid, err := period.Validate()
-		if err == nil || isValid {
-			Fail("Expected isValid: false and error: <notNil> for invalid NewQuotaPeriod. startTime should be before endTime")
+		if isValid {
+			Fail("Expected isValid false but got true")
+		}
+
+		if err == nil {
+			Fail(" Expected error but got <nil>")
 		}
 	})
-
 })
 
 var _ = Describe("Test AcceptedQuotaTimeUnitTypes", func() {
 	It("testTimeUnit", func() {
 		if !IsValidTimeUnit("second") {
-			Fail("second is a valid TimeUnit")
+			Fail("Expected true: second is a valid TimeUnit")
 		}
 		if !IsValidTimeUnit("minute") {
-			Fail("minute is a valid TimeUnit")
+			Fail("Expected true: minute is a valid TimeUnit")
 		}
 		if !IsValidTimeUnit("hour") {
-			Fail("hour is a valid TimeUnit")
+			Fail("Expected true: hour is a valid TimeUnit")
 		}
 		if !IsValidTimeUnit("day") {
-			Fail("day is a valid TimeUnit")
+			Fail("Expected true: day is a valid TimeUnit")
 		}
 		if !IsValidTimeUnit("week") {
-			Fail("week is a valid TimeUnit")
+			Fail("Expected true: week is a valid TimeUnit")
 		}
 		if !IsValidTimeUnit("month") {
-			Fail("month is a valid TimeUnit")
+			Fail("Expected true: month is a valid TimeUnit")
 		}
 
 		//invalid type
 		if IsValidTimeUnit("invalidType") {
-			Fail("invalidType is a invalid TimeUnit")
+			Fail("Expected false: invalidType is not a valid TimeUnit")
 		}
 	})
 })
@@ -61,18 +71,18 @@
 var _ = Describe("Test AcceptedQuotaBucketTypes", func() {
 	It("testTimeUnit", func() {
 		if !IsValidQuotaBucketType("synchronous") {
-			Fail("synchronous is a valid quotaBucket")
+			Fail("Expected true: synchronous is a valid quotaBucket")
 		}
 		if !IsValidQuotaBucketType("asynchronous") {
-			Fail("asynchronous is a valid quotaBucket")
+			Fail("Expected true: asynchronous is a valid quotaBucket")
 		}
 		if !IsValidQuotaBucketType("nonDistributed") {
-			Fail("nonDistributed is a valid quotaBucket")
+			Fail("Expected true: nonDistributed is a valid quotaBucket")
 		}
 
 		//invalid type
 		if IsValidQuotaBucketType("invalidType") {
-			Fail("invalidType is a invalid quotaBucket")
+			Fail("Expected false: invalidType is a invalid quotaBucket")
 		}
 	})
 })
@@ -87,15 +97,13 @@
 		interval := 1
 		maxCount := 10
 		preciseAtSecondsLevel := true
-		period := NewQuotaPeriod(time.Now().AddDate(0,-1,0).Unix(),
-			time.Now().AddDate(0,0,-1).Unix(),
-			time.Now().AddDate(0,1,0).Unix())
-		startTime := int64(1492324596)
+		startTime := time.Now().UTC().AddDate(0, -1, 0).Unix()
 
-		quotaBucket := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, period, startTime, maxCount, bucketType)
-		err := quotaBucket.Validate()
+		quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType)
 		Expect(err).NotTo(HaveOccurred())
 
+		err = quotaBucket.Validate()
+		Expect(err).NotTo(HaveOccurred())
 
 		//also check if all the fields are set as expected
 		sTime := time.Unix(startTime, 0)
@@ -110,10 +118,13 @@
 		Expect(preciseAtSecondsLevel).To(Equal(quotaBucket.GetPreciseAtSecondsLevel()))
 		getPeriod, err := quotaBucket.GetPeriod()
 		Expect(err).NotTo(HaveOccurred())
-		Expect(period).To(Equal(*getPeriod))
+		Expect(getPeriod.GetPeriodInputStartTime().String()).ShouldNot(BeEmpty())
+		Expect(getPeriod.GetPeriodStartTime().String()).ShouldNot(BeEmpty())
+		Expect(getPeriod.GetPeriodEndTime().String()).ShouldNot(BeEmpty())
 
 	})
 
+	//end before start
 	It("Test invalid quotaPeriod", func() {
 		edgeOrgID := "sampleOrg"
 		id := "sampleID"
@@ -123,11 +134,13 @@
 		interval := 1
 		maxCount := 10
 		preciseAtSecondsLevel := true
-		period := NewQuotaPeriod(1492324596, 1492725428, 1490047028)
-		startTime := int64(1492324596)
+		startTime := time.Now().UTC().AddDate(0, -1, 0).Unix()
 
-		quotaBucket := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, period, startTime, maxCount, bucketType)
-		err := quotaBucket.Validate()
+		quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType)
+		Expect(err).NotTo(HaveOccurred())
+
+		quotaBucket.SetPeriod(time.Now().UTC().UTC().AddDate(0, 1, 0), time.Now().AddDate(0, 0, -1))
+		err = quotaBucket.Validate()
 		if err == nil {
 			Fail("error expected but got <nil>")
 		}
@@ -146,18 +159,15 @@
 		interval := 1
 		maxCount := 10
 		preciseAtSecondsLevel := true
-		period := NewQuotaPeriod(time.Now().AddDate(0,-1,0).Unix(),
-			time.Now().AddDate(0,0,-1).Unix(),
-			time.Now().AddDate(0,1,0).Unix())
-		startTime := int64(1492324596)
+		startTime := time.Now().UTC().AddDate(0, -1, 0).Unix()
+		quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType)
+		Expect(err).To(HaveOccurred())
 
-		quotaBucket := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, period, startTime, maxCount, bucketType)
-		err := quotaBucket.Validate()
-		if err == nil {
-			Fail("error expected but got <nil>")
+		if !strings.Contains(err.Error(), InvalidQuotaTimeUnitType) {
+			Fail("expected: " + InvalidQuotaTimeUnitType + "but got: " + err.Error())
 		}
-		if err.Error() != InvalidQuotaTimeUnitType {
-			Fail("expected: " + InvalidQuotaBucketType + "but got: " + err.Error())
+		if quotaBucket != nil {
+			Fail("quotaBucket returned should be nil.")
 		}
 
 	})
@@ -171,28 +181,23 @@
 		interval := 1
 		maxCount := 10
 		preciseAtSecondsLevel := true
-		period := NewQuotaPeriod(time.Now().AddDate(0,-1,0).Unix(),
-			time.Now().AddDate(0,0,-1).Unix(),
-			time.Now().AddDate(0,1,0).Unix())
-		startTime := time.Now().AddDate(0,-1,0).Unix()
+		startTime := time.Now().UTC().AddDate(0, -1, 0).Unix()
 
-		quotaBucket := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, period, startTime, maxCount, bucketType)
-		err := quotaBucket.Validate()
+		quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType)
+		Expect(err).NotTo(HaveOccurred())
+
+		err = quotaBucket.Validate()
 		if err == nil {
 			Fail("error expected but got <nil>")
 		}
-		if err.Error() != InvalidQuotaBucketType {
-			Fail("expected: " + InvalidQuotaBucketType + "but got: " + err.Error())
+		if !strings.Contains(err.Error(), InvalidQuotaBucketType) {
+			Fail("expected: " + InvalidQuotaBucketType + " in the error message but got: " + err.Error())
 		}
-
 	})
 
 })
 
-
-
-
-var _ = Describe("IsCurrentPeriod", func(){
+var _ = Describe("IsCurrentPeriod", func() {
 	It("Test RollingType Window Valid TestCase", func() {
 
 		edgeOrgID := "sampleOrg"
@@ -204,30 +209,34 @@
 		maxCount := 10
 		preciseAtSecondsLevel := true
 		//InputStart time is before now
-		period := NewQuotaPeriod(time.Now().AddDate(0, -1,0).Unix(),
-			time.Now().AddDate(0,0, -1).Unix(),
-			time.Now().AddDate(0,1,0).Unix())
-		startTime := time.Now().AddDate(0,-1,0).Unix()
+		startTime := time.Now().UTC().AddDate(0, -1, 0).Unix()
 
-		quotaBucket := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, period, startTime, maxCount, bucketType)
-		err := quotaBucket.Validate()
+		quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType)
 		Expect(err).NotTo(HaveOccurred())
-		if ok := period.IsCurrentPeriod(quotaBucket); !ok{
+		err = quotaBucket.Validate()
+		Expect(err).NotTo(HaveOccurred())
+
+		period, err := quotaBucket.GetPeriod()
+		if err != nil {
+			Fail("no error expected")
+		}
+		if ok := period.IsCurrentPeriod(quotaBucket); !ok {
 			Fail("Exprected true, returned: false")
 		}
 
 		//InputStart time is now
-		period = NewQuotaPeriod(time.Now().Unix(),
-			time.Now().AddDate(0,0,-1).Unix(),
-			time.Now().AddDate(0,1,0).Unix())
-		startTime = time.Now().Unix()
-		quotaBucket = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, period, startTime, maxCount, bucketType)
+		startTime = time.Now().UTC().Unix()
+		quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType)
+		Expect(err).NotTo(HaveOccurred())
 		err = quotaBucket.Validate()
 		Expect(err).NotTo(HaveOccurred())
 
-
+		period, err = quotaBucket.GetPeriod()
+		if err != nil {
+			Fail("no error expected")
+		}
 		period.IsCurrentPeriod(quotaBucket)
-		if ok := period.IsCurrentPeriod(quotaBucket); !ok{
+		if ok := period.IsCurrentPeriod(quotaBucket); !ok {
 			Fail("Exprected true, returned: false")
 		}
 	})
@@ -243,30 +252,33 @@
 		maxCount := 10
 		preciseAtSecondsLevel := true
 		//InputStart time is after now.
-		period := NewQuotaPeriod(time.Now().AddDate(0,1,0).Unix(),
-			time.Now().AddDate(0,1,0).Unix(), time.Now().AddDate(0,0,1).Unix())
-		startTime := time.Now().AddDate(0,1,0).Unix()
+		startTime := time.Now().UTC().AddDate(0, 1, 0).Unix()
 
-		quotaBucket := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, period, startTime, maxCount, bucketType)
-		err := quotaBucket.Validate()
+		quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType)
 		Expect(err).NotTo(HaveOccurred())
 
+		err = quotaBucket.Validate()
+		Expect(err).NotTo(HaveOccurred())
 
-		if ok := period.IsCurrentPeriod(quotaBucket); ok{
+		quotaBucket.SetPeriod(time.Now().UTC().AddDate(0, -1, 0), time.Now().UTC().AddDate(0, 0, 1))
+		period, err := quotaBucket.GetPeriod()
+		Expect(err).NotTo(HaveOccurred())
+		if ok := period.IsCurrentPeriod(quotaBucket); ok {
 			Fail("Exprected true, returned: false")
 		}
 
 		//endTime before startTime in period
-		startTime = time.Now().AddDate(0,-1,0).Unix()
-		quotaBucket = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, period, startTime, maxCount, bucketType)
-		quotaBucket.SetPeriod(time.Now(), time.Now().AddDate(0,1,0))
-		if ok := period.IsCurrentPeriod(quotaBucket); ok{
+		startTime = time.Now().UTC().AddDate(0, -1, 0).Unix()
+		quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType)
+		Expect(err).NotTo(HaveOccurred())
+
+		quotaBucket.SetPeriod(time.Now().UTC(), time.Now().UTC().AddDate(0, -1, 0))
+		if ok := period.IsCurrentPeriod(quotaBucket); ok {
 			Fail("Exprected false, returned: true")
 		}
 	})
 
-
-	It("Test NonRollingType Window Valid TestCases", func() {
+	It("Test calendarType Window Valid TestCases", func() {
 
 		edgeOrgID := "sampleOrg"
 		id := "sampleID"
@@ -277,61 +289,74 @@
 		maxCount := 10
 		preciseAtSecondsLevel := true
 
-
 		//InputStart time is before now
-		period := NewQuotaPeriod(time.Now().AddDate(0, -1,0).Unix(),
-			time.Now().AddDate(0,0, -1).Unix(),
-			time.Now().AddDate(0,1,0).Unix())
-		startTime := time.Now().AddDate(0,-1,0).Unix()
+		startTime := time.Now().UTC().UTC().AddDate(-1, -1, 0).Unix()
 
-		quotaBucket := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, period, startTime, maxCount, bucketType)
-		err := quotaBucket.Validate()
+		quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType)
 		Expect(err).NotTo(HaveOccurred())
 
-		if ok := period.IsCurrentPeriod(quotaBucket); !ok{
-			Fail("Exprected true, returned: false")
-		}
-
-
-		//InputStart time is now
-		period = NewQuotaPeriod(time.Now().Unix(),
-			time.Now().AddDate(0,0,-1).Unix(),
-			time.Now().AddDate(0,1,0).Unix())
-		startTime = time.Now().Unix()
-		quotaBucket = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, period, startTime, maxCount, bucketType)
 		err = quotaBucket.Validate()
 		Expect(err).NotTo(HaveOccurred())
 
+		period, err := quotaBucket.GetPeriod()
+		if err != nil {
+			Fail("no error expected but returned " + err.Error())
+		}
+		if ok := period.IsCurrentPeriod(quotaBucket); !ok {
+			Fail("Exprected true, returned: false")
+		}
+
+		//InputStart time is now
+		startTime = time.Now().UTC().Unix()
+		quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType)
+		Expect(err).NotTo(HaveOccurred())
+
+		err = quotaBucket.Validate()
+		Expect(err).NotTo(HaveOccurred())
+
+		period, err = quotaBucket.GetPeriod()
+		if err != nil {
+			Fail("no error expected but returned " + err.Error())
+		}
 		period.IsCurrentPeriod(quotaBucket)
-		if ok := period.IsCurrentPeriod(quotaBucket); !ok{
+		if ok := period.IsCurrentPeriod(quotaBucket); !ok {
 			Fail("Exprected true, returned: false")
 		}
 
 		//start Time in period is before now
-		startTime = time.Now().Unix()
-		period = NewQuotaPeriod(time.Now().AddDate(0,-1,0).Unix(),
-			time.Now().AddDate(0,0,-1).Unix(),
-			time.Now().AddDate(0,1,0).Unix())
-		quotaBucket = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, period, startTime, maxCount, bucketType)
+		startTime = time.Now().UTC().Unix()
+		quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType)
+		Expect(err).NotTo(HaveOccurred())
+
 		err = quotaBucket.Validate()
 		Expect(err).NotTo(HaveOccurred())
 
+		quotaBucket.SetPeriod(time.Now().UTC().AddDate(0, 0, -1),
+			time.Now().UTC().AddDate(0, 1, 0))
+		period, err = quotaBucket.GetPeriod()
+		if err != nil {
+			Fail("no error expected but returned " + err.Error())
+		}
 		period.IsCurrentPeriod(quotaBucket)
-		if ok := period.IsCurrentPeriod(quotaBucket); !ok{
+		if ok := period.IsCurrentPeriod(quotaBucket); !ok {
 			Fail("Exprected true, returned: false")
 		}
 
 		//start Time in period is now
-		startTime = time.Now().Unix()
-		period = NewQuotaPeriod(time.Now().AddDate(0,-1,0).Unix(),
-			time.Now().Unix(),
-			time.Now().AddDate(0,1,0).Unix())
-		quotaBucket = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, period, startTime, maxCount, bucketType)
-		err = quotaBucket.Validate()
+		startTime = time.Now().UTC().Unix()
+		quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType)
 		Expect(err).NotTo(HaveOccurred())
 
+		err = quotaBucket.Validate()
+		Expect(err).NotTo(HaveOccurred())
+		quotaBucket.SetPeriod(time.Now().UTC(),
+			time.Now().UTC().AddDate(0, 1, 0))
+		period, err = quotaBucket.GetPeriod()
+		if err != nil {
+			Fail("no error expected but returned " + err.Error())
+		}
 		period.IsCurrentPeriod(quotaBucket)
-		if ok := period.IsCurrentPeriod(quotaBucket); !ok{
+		if ok := period.IsCurrentPeriod(quotaBucket); !ok {
 			Fail("Exprected true, returned: false")
 		}
 
@@ -353,30 +378,40 @@
 		//}
 
 		//end Time in period is after now
-		startTime = time.Now().Unix()
-		period = NewQuotaPeriod(time.Now().AddDate(0,-1,0).Unix(),
-			time.Now().AddDate(0,0,-1).Unix(),
-			time.Now().AddDate(0,1,0).Unix())
-		quotaBucket = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, period, startTime, maxCount, bucketType)
+		startTime = time.Now().UTC().Unix()
+		quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType)
+		Expect(err).NotTo(HaveOccurred())
+
 		err = quotaBucket.Validate()
 		Expect(err).NotTo(HaveOccurred())
 
+		quotaBucket.SetPeriod(time.Now().UTC().AddDate(0, 0, -1),
+			time.Now().UTC().AddDate(0, 1, 0))
+		period, err = quotaBucket.GetPeriod()
+		if err != nil {
+			Fail("no error expected but returned " + err.Error())
+		}
+
 		period.IsCurrentPeriod(quotaBucket)
-		if ok := period.IsCurrentPeriod(quotaBucket); !ok{
+		if ok := period.IsCurrentPeriod(quotaBucket); !ok {
 			Fail("Exprected true, returned: false")
 		}
 
 		//start time in period is before end time
-		startTime = time.Now().Unix()
-		period = NewQuotaPeriod(time.Now().AddDate(0,-1,0).Unix(),
-			time.Now().AddDate(0,-1,0).Unix(),
-			time.Now().AddDate(0,1,0).Unix())
-		quotaBucket = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, period, startTime, maxCount, bucketType)
-		err = quotaBucket.Validate()
+		startTime = time.Now().UTC().Unix()
+		quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType)
 		Expect(err).NotTo(HaveOccurred())
 
+		err = quotaBucket.Validate()
+		Expect(err).NotTo(HaveOccurred())
+		quotaBucket.SetPeriod(time.Now().UTC().AddDate(0, 0, -1),
+			time.Now().UTC().AddDate(0, 1, 0))
+		period, err = quotaBucket.GetPeriod()
+		if err != nil {
+			Fail("no error expected but returned " + err.Error())
+		}
 		period.IsCurrentPeriod(quotaBucket)
-		if ok := period.IsCurrentPeriod(quotaBucket); !ok{
+		if ok := period.IsCurrentPeriod(quotaBucket); !ok {
 			Fail("Exprected true, returned: false")
 		}
 
@@ -394,49 +429,51 @@
 		preciseAtSecondsLevel := true
 
 		//InputStart time is after now.
-		period := NewQuotaPeriod(time.Now().AddDate(0,1,0).Unix(),
-			time.Now().AddDate(0,1,0).Unix(), time.Now().AddDate(1,0,1).Unix())
-		startTime := time.Now().AddDate(0,1,0).Unix()
+		period := NewQuotaPeriod(time.Now().UTC().AddDate(0, 1, 0).Unix(),
+			time.Now().UTC().AddDate(0, 1, 0).Unix(), time.Now().AddDate(1, 0, 1).Unix())
+		startTime := time.Now().UTC().AddDate(0, 1, 0).Unix()
 
-		quotaBucket := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, period, startTime, maxCount, bucketType)
-		err := quotaBucket.Validate()
+		quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType)
 		Expect(err).NotTo(HaveOccurred())
 
-		if ok := period.IsCurrentPeriod(quotaBucket); ok{
-			Fail("Exprected true, returned: false")
-		}
-
-
-		//endTime is before start time
-		startTime = time.Now().AddDate(0,-1,0).Unix()
-		quotaBucket = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, period, startTime, maxCount, bucketType)
 		err = quotaBucket.Validate()
 		Expect(err).NotTo(HaveOccurred())
 
-		quotaBucket.SetPeriod(time.Now(), time.Now().AddDate(0,-1,0))
+		if ok := period.IsCurrentPeriod(quotaBucket); ok {
+			Fail("Exprected true, returned: false")
+		}
 
-		if ok := period.IsCurrentPeriod(quotaBucket); ok{
+		//endTime is before start time
+		startTime = time.Now().UTC().AddDate(0, -1, 0).Unix()
+		quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType)
+		Expect(err).NotTo(HaveOccurred())
+
+		err = quotaBucket.Validate()
+		Expect(err).NotTo(HaveOccurred())
+
+		quotaBucket.SetPeriod(time.Now().UTC(), time.Now().UTC().AddDate(0, -1, 0))
+
+		if ok := period.IsCurrentPeriod(quotaBucket); ok {
 			Fail("Exprected true, returned: false")
 		}
 
 		//start time in period after now
-		quotaBucket.SetPeriod(time.Now().AddDate(0,1,0), time.Now().AddDate(1,1,0))
+		quotaBucket.SetPeriod(time.Now().AddDate(0, 1, 0), time.Now().AddDate(1, 1, 0))
 
-		if ok := period.IsCurrentPeriod(quotaBucket); ok{
+		if ok := period.IsCurrentPeriod(quotaBucket); ok {
 			Fail("Exprected true, returned: false")
 		}
 
 		//end time in period is before now
-		quotaBucket.SetPeriod(time.Now().AddDate(-1,-1,0), time.Now().AddDate(0,-1,0))
+		quotaBucket.SetPeriod(time.Now().UTC().AddDate(-1, -1, 0), time.Now().UTC().AddDate(0, -1, 0))
 
-		if ok := period.IsCurrentPeriod(quotaBucket); ok{
+		if ok := period.IsCurrentPeriod(quotaBucket); ok {
 			Fail("Exprected true, returned: false")
 		}
 
 	})
 })
 
-
 var _ = Describe("Test GetPeriod and setCurrentPeriod", func() {
 	It("Valid GetPeriod", func() {
 		edgeOrgID := "sampleOrg"
@@ -448,60 +485,58 @@
 		maxCount := 10
 		preciseAtSecondsLevel := true
 		//InputStart time is before now
-		period := NewQuotaPeriod(time.Now().AddDate(0, -1,0).Unix(),
-			time.Now().AddDate(0,0, -1).Unix(),
-			time.Now().AddDate(0,1,0).Unix())
-		startTime := time.Now().AddDate(0,-1,0).Unix()
-		quotaBucket := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, period, startTime, maxCount, bucketType)
-		err := quotaBucket.Validate()
+		startTime := time.Now().UTC().AddDate(0, -1, 0).Unix()
+		quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType)
+		Expect(err).NotTo(HaveOccurred())
+
+		quotaBucket.SetPeriod(time.Now().UTC().AddDate(0, 0, -1), time.Now().UTC().AddDate(0, 1, 0))
+		err = quotaBucket.Validate()
 		Expect(err).NotTo(HaveOccurred())
 		qPeriod, err := quotaBucket.GetPeriod()
 		Expect(err).NotTo(HaveOccurred())
 
 		// check if the rolling window was set properly
 		Expect(qPeriod.GetPeriodInputStartTime()).Should(Equal(quotaBucket.GetStartTime()))
-		if !qPeriod.GetPeriodEndTime().After(qPeriod.GetPeriodStartTime()){
+		if !qPeriod.GetPeriodEndTime().After(qPeriod.GetPeriodStartTime()) {
 			Fail("Rolling Window was not set as expected")
 		}
 		intervalDuration := qPeriod.GetPeriodEndTime().Sub(qPeriod.GetPeriodStartTime())
 		expectedDuration, err := GetIntervalDurtation(quotaBucket)
 		Expect(intervalDuration).Should(Equal(expectedDuration))
 
-
 		//for non rolling Type window do not setCurrentPeriod as endTime is > time.now.
 		quotaType = "calendar"
-		pstartTime := time.Now().AddDate(0,-1,0)
-		pendTime := time.Now().AddDate(0,1,0)
-		quotaBucket = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, period, startTime, maxCount, bucketType)
+		pstartTime := time.Now().UTC().AddDate(0, -1, 0)
+		pendTime := time.Now().UTC().AddDate(0, 1, 0)
+		quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType)
+		Expect(err).NotTo(HaveOccurred())
+
 		quotaBucket.SetPeriod(pstartTime, pendTime)
 		qPeriod, err = quotaBucket.GetPeriod()
 		Expect(err).NotTo(HaveOccurred())
 		// check if the calendar window was set properly
 		Expect(qPeriod.GetPeriodInputStartTime()).Should(Equal(quotaBucket.GetStartTime()))
-		if !qPeriod.GetPeriodEndTime().After(qPeriod.GetPeriodStartTime()){
+		if !qPeriod.GetPeriodEndTime().After(qPeriod.GetPeriodStartTime()) {
 			Fail("Rolling Window was not set as expected")
 		}
 
 		//for non rolling Type window setCurrentPeriod as endTime is < time.now.
 		quotaType = "calendar"
-		pstartTime = time.Now().AddDate(0,-1,0)
-		pendTime = time.Now().AddDate(0,-1,0)
-		quotaBucket = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, period, startTime, maxCount, bucketType)
+		pstartTime = time.Now().UTC().AddDate(0, -1, 0)
+		pendTime = time.Now().UTC().AddDate(0, -1, 0)
+		quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType)
+		Expect(err).NotTo(HaveOccurred())
+
 		quotaBucket.SetPeriod(pstartTime, pendTime)
 		qPeriod, err = quotaBucket.GetPeriod()
 		Expect(err).NotTo(HaveOccurred())
 		// check if the calendar window was set properly
 		Expect(qPeriod.GetPeriodInputStartTime()).Should(Equal(quotaBucket.GetStartTime()))
-		if !qPeriod.GetPeriodEndTime().After(qPeriod.GetPeriodStartTime()){
-			Fail("Rolling Window was not set as expected")
+		if !qPeriod.GetPeriodEndTime().After(qPeriod.GetPeriodStartTime()) {
+			Fail("period for Non Rolling Window Type was not set as expected")
 		}
 		intervalDuration = qPeriod.GetPeriodEndTime().Sub(qPeriod.GetPeriodStartTime())
 		expectedDuration, err = GetIntervalDurtation(quotaBucket)
 		Expect(intervalDuration).Should(Equal(expectedDuration))
-
-
-
 	})
-
 })
-
diff --git a/quotaBucket/quotaDescriptorType.go b/quotaBucket/quotaDescriptorType.go
index c94333c..87e8f0c 100644
--- a/quotaBucket/quotaDescriptorType.go
+++ b/quotaBucket/quotaDescriptorType.go
@@ -2,7 +2,6 @@
 
 import (
 	"errors"
-	"fmt"
 	"strings"
 	"time"
 )
@@ -17,7 +16,7 @@
 	SetCurrentPeriod(bucket *QuotaBucket) error
 }
 
-func GetQuotaTypeHandler(qType string) (QuotaDescriptorType, error) {
+func GetQuotaDescriptorTypeHandler(qType string) (QuotaDescriptorType, error) {
 	var qDescriptor QuotaDescriptorType
 	quotaType := strings.ToLower(strings.TrimSpace(qType))
 	switch quotaType {
@@ -28,7 +27,7 @@
 		qDescriptor = &RollingWindowQuotaDescriptorType{}
 		return qDescriptor, nil
 	default:
-		return nil, errors.New("Quota type " + qType + " in the request is not supported")
+		return nil, errors.New(InvalidQuotaDescriptorType + " Quota type " + qType + " in the request is not supported")
 
 	}
 }
@@ -37,11 +36,11 @@
 
 func (c CalendarQuotaDescriptorType) SetCurrentPeriod(qbucket *QuotaBucket) error {
 	startTime := qbucket.GetStartTime()
-	currentPeriod,err := qbucket.GetQuotaBucketPeriod()
-if err != nil {
-	return err
-}
-	if startTime.Before(time.Now()) || startTime.Equal(time.Now()) {
+	currentPeriod, err := qbucket.GetQuotaBucketPeriod()
+	if err != nil {
+		return err
+	}
+	if startTime.Before(time.Now().UTC()) || startTime.Equal(time.Now().UTC()) {
 		if currentPeriod != nil {
 			if currentPeriod.IsCurrentPeriod(qbucket) {
 				return nil
@@ -60,7 +59,7 @@
 	}
 
 	var currentStart, currentEnd time.Time
-	now := time.Now()
+	now := time.Now().UTC()
 	timeUnit := strings.ToLower(strings.TrimSpace(qbucket.TimeUnit))
 	switch timeUnit {
 	case TimeUnitSECOND:
@@ -95,19 +94,22 @@
 		currentStart = time.Date(now.Year(), now.Month(), 0, 0, 0, 0, 0, time.UTC)
 		currentEnd = currentStart.AddDate(0, qbucket.Interval, 0)
 		break
+	default:
+		return errors.New(InvalidQuotaTimeUnitType + " : ignoring unrecognized timeUnit : " + timeUnit)
+
 	}
 
 	qbucket.SetPeriod(currentStart, currentEnd)
-	fmt.Println("inside calendar set period: ", qbucket.quotaBucketData.Period)
 	return nil
 }
 
 type RollingWindowQuotaDescriptorType struct{}
 
 func (c RollingWindowQuotaDescriptorType) SetCurrentPeriod(qbucket *QuotaBucket) error {
+
 	//yet to implement
 	var currentStart, currentEnd time.Time
-	currentEnd = time.Now()
+	currentEnd = time.Now().UTC()
 	interval, err := GetIntervalDurtation(qbucket)
 	if err != nil {
 		return errors.New("error in SetCurrentPeriod: " + err.Error())
@@ -118,6 +120,7 @@
 	return nil
 }
 func GetIntervalDurtation(qb *QuotaBucket) (time.Duration, error) {
+
 	timeUnit := strings.ToLower(strings.TrimSpace(qb.TimeUnit))
 	switch timeUnit {
 	case TimeUnitSECOND:
@@ -131,9 +134,9 @@
 	case TimeUnitWEEK:
 		return time.Duration(int64(qb.Interval*24*7) * time.Hour.Nanoseconds()), nil
 	case TimeUnitMONTH:
-		now := time.Now()
+		now := time.Now().UTC()
 		var currentStart, currentEnd time.Time
-		quotaType := strings.ToLower(strings.TrimSpace(qb.QuotaType))
+		quotaType := strings.ToLower(strings.TrimSpace(qb.QuotaDescriptorType))
 		switch quotaType {
 		case QuotaTypeCalendar:
 			currentStart = time.Date(now.Year(), now.Month(), 0, 0, 0, 0, 0, time.UTC)
@@ -144,11 +147,11 @@
 			currentStart = currentEnd.AddDate(0, -qb.Interval, 0)
 			return currentEnd.Sub(currentStart), nil
 		default:
-			return time.Duration(0), errors.New("Ignoring unrecognized quotaType : " + quotaType)
+			return time.Duration(0), errors.New(InvalidQuotaDescriptorType + " : ignoring unrecognized quotaType : " + quotaType)
 
 		}
 	default:
-		return time.Duration(0), errors.New("Ignoring unrecognized timeUnit : " + timeUnit)
+		return time.Duration(0), errors.New(InvalidQuotaTimeUnitType + " : ignoring unrecognized timeUnit : " + timeUnit)
 
 	}
 
diff --git a/quotaBucket/quotaDescriptorType_test.go b/quotaBucket/quotaDescriptorType_test.go
index 22a4a08..0bd44cf 100644
--- a/quotaBucket/quotaDescriptorType_test.go
+++ b/quotaBucket/quotaDescriptorType_test.go
@@ -1,9 +1,411 @@
 package quotaBucket_test
 
 import (
+	. "github.com/30x/apidQuota/quotaBucket"
 	. "github.com/onsi/ginkgo"
+	. "github.com/onsi/gomega"
+	"time"
+	"strings"
+	"reflect"
 )
 
-var _ = Describe("QuotaDescriptorType", func() {
 
+var _ = Describe("Check Descriptor Type ", func() {
+	It("test Calendar Type descriptor", func() {
+		descriptorType, err := GetQuotaDescriptorTypeHandler("calendar")
+		Expect(err).NotTo(HaveOccurred())
+		if reflect.TypeOf(descriptorType)!= reflect.TypeOf(&CalendarQuotaDescriptorType{}){
+			Fail("Excepted CalendarQuotaDescriptorType, but got: " + reflect.TypeOf(descriptorType).String())
+		}
+	})
+
+	FIt("test RollingWindow Type descriptor", func() {
+		descriptorType, err := GetQuotaDescriptorTypeHandler("rollingwindow")
+		Expect(err).NotTo(HaveOccurred())
+		if reflect.TypeOf(descriptorType)!= reflect.TypeOf(&RollingWindowQuotaDescriptorType{}){
+			Fail("Excepted RollingWindowQuotaDescriptorType, but got: " + reflect.TypeOf(descriptorType).String())
+		}
+	})
+
+	FIt("test invalid Type descriptor", func() {
+		_, err := GetQuotaDescriptorTypeHandler("invalidDescriptorType")
+		Expect(err).To(HaveOccurred())
+		if !strings.Contains(err.Error(), InvalidQuotaDescriptorType) {
+			Fail("Excepted error to contain: " + InvalidQuotaDescriptorType + " but got: " + err.Error())
+		}
+	})
 })
+
+var _ = Describe("QuotaDescriptorType", func() {
+	It("Valid testcases for CalendarType", func() {
+
+		// test set period for timeUnit=second
+		edgeOrgID := "sampleOrg"
+		id := "sampleID"
+		timeUnit := "second"
+		quotaType := "calendar"
+		bucketType := "synchronous"
+		interval := 1
+		maxCount := 10
+		preciseAtSecondsLevel := true
+		startTime := time.Now().UTC().UTC().AddDate(0, -1, 0).Unix()
+
+		quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType)
+		Expect(err).NotTo(HaveOccurred())
+
+		err = quotaBucket.Validate()
+		Expect(err).NotTo(HaveOccurred())
+
+		period, err := quotaBucket.GetPeriod()
+		Expect(err).NotTo(HaveOccurred())
+		// check if the calendar window was set properly
+		Expect(period.GetPeriodInputStartTime()).Should(Equal(quotaBucket.GetStartTime()))
+		if !period.GetPeriodEndTime().After(period.GetPeriodStartTime()) {
+			Fail("period for Calendar Type was not set as expected")
+		}
+		Expect(period.GetPeriodStartTime().String()).ShouldNot(BeEmpty())
+		Expect(period.GetPeriodEndTime().String()).ShouldNot(BeEmpty())
+		intervalDuration := period.GetPeriodEndTime().Sub(period.GetPeriodStartTime())
+		Expect(intervalDuration).Should(Equal(time.Second))
+
+
+		// test set period for timeUnit=minute
+		timeUnit = "minute"
+
+		quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType)
+		Expect(err).NotTo(HaveOccurred())
+
+		err = quotaBucket.Validate()
+		Expect(err).NotTo(HaveOccurred())
+
+		period, err = quotaBucket.GetPeriod()
+		Expect(err).NotTo(HaveOccurred())
+		// check if the calendar window was set properly
+		Expect(period.GetPeriodInputStartTime()).Should(Equal(quotaBucket.GetStartTime()))
+		if !period.GetPeriodEndTime().After(period.GetPeriodStartTime()) {
+			Fail("period for Calendar Type was not set as expected")
+		}
+		Expect(period.GetPeriodStartTime().String()).ShouldNot(BeEmpty())
+		Expect(period.GetPeriodEndTime().String()).ShouldNot(BeEmpty())
+		intervalDuration = period.GetPeriodEndTime().Sub(period.GetPeriodStartTime())
+		Expect(intervalDuration).Should(Equal(time.Minute))
+
+		// test set period for timeUnit=hour
+		timeUnit = "hour"
+
+		quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType)
+		Expect(err).NotTo(HaveOccurred())
+
+		err = quotaBucket.Validate()
+		Expect(err).NotTo(HaveOccurred())
+
+		period, err = quotaBucket.GetPeriod()
+		Expect(err).NotTo(HaveOccurred())
+		// check if the calendar window was set properly
+		Expect(period.GetPeriodInputStartTime()).Should(Equal(quotaBucket.GetStartTime()))
+		if !period.GetPeriodEndTime().After(period.GetPeriodStartTime()) {
+			Fail("period for Calendar Type was not set as expected")
+		}
+		Expect(period.GetPeriodStartTime().String()).ShouldNot(BeEmpty())
+		Expect(period.GetPeriodEndTime().String()).ShouldNot(BeEmpty())
+		intervalDuration = period.GetPeriodEndTime().Sub(period.GetPeriodStartTime())
+		Expect(intervalDuration).Should(Equal(time.Hour))
+
+
+		// test set period for timeUnit=day
+		timeUnit = "day"
+
+		quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType)
+		Expect(err).NotTo(HaveOccurred())
+
+		err = quotaBucket.Validate()
+		Expect(err).NotTo(HaveOccurred())
+
+		period, err = quotaBucket.GetPeriod()
+		Expect(err).NotTo(HaveOccurred())
+		// check if the calendar window was set properly
+		Expect(period.GetPeriodInputStartTime()).Should(Equal(quotaBucket.GetStartTime()))
+		if !period.GetPeriodEndTime().After(period.GetPeriodStartTime()) {
+			Fail("period for Calendar Type was not set as expected")
+		}
+		Expect(period.GetPeriodStartTime().String()).ShouldNot(BeEmpty())
+		Expect(period.GetPeriodEndTime().String()).ShouldNot(BeEmpty())
+		intervalDuration = period.GetPeriodEndTime().Sub(period.GetPeriodStartTime())
+		Expect(intervalDuration).Should(Equal(24 * time.Hour))
+
+		// test set period for timeUnit=week
+		timeUnit = "week"
+
+		quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType)
+		Expect(err).NotTo(HaveOccurred())
+
+		err = quotaBucket.Validate()
+		Expect(err).NotTo(HaveOccurred())
+
+		period, err = quotaBucket.GetPeriod()
+		Expect(err).NotTo(HaveOccurred())
+		// check if the calendar window was set properly
+		Expect(period.GetPeriodInputStartTime()).Should(Equal(quotaBucket.GetStartTime()))
+		if !period.GetPeriodEndTime().After(period.GetPeriodStartTime()) {
+			Fail("period for Calendar Type was not set as expected")
+		}
+		Expect(period.GetPeriodStartTime().String()).ShouldNot(BeEmpty())
+		Expect(period.GetPeriodEndTime().String()).ShouldNot(BeEmpty())
+		intervalDuration = period.GetPeriodEndTime().Sub(period.GetPeriodStartTime())
+		Expect(intervalDuration).Should(Equal(7 * 24 * time.Hour))
+
+
+		// test set period for timeUnit=month
+		timeUnit = "month"
+
+		quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType)
+		Expect(err).NotTo(HaveOccurred())
+
+		err = quotaBucket.Validate()
+		Expect(err).NotTo(HaveOccurred())
+
+		period, err = quotaBucket.GetPeriod()
+		Expect(err).NotTo(HaveOccurred())
+		// check if the calendar window was set properly
+		Expect(period.GetPeriodInputStartTime()).Should(Equal(quotaBucket.GetStartTime()))
+		if !period.GetPeriodEndTime().After(period.GetPeriodStartTime()) {
+			Fail("period for Calendar Type was not set as expected")
+		}
+		Expect(period.GetPeriodStartTime().String()).ShouldNot(BeEmpty())
+		Expect(period.GetPeriodEndTime().String()).ShouldNot(BeEmpty())
+		intervalDuration = period.GetPeriodEndTime().Sub(period.GetPeriodStartTime())
+		addMonthToStartDate := period.GetPeriodStartTime().AddDate(0,interval*1,0)
+		actualDuration := addMonthToStartDate.Sub(period.GetPeriodStartTime())
+		Expect(intervalDuration).Should(Equal(actualDuration))
+
+	})
+
+	It("inValid testcases for CalendarType", func() {
+
+		// test set period for timeUnit=second
+		edgeOrgID := "sampleOrg"
+		id := "sampleID"
+		timeUnit := "second"
+		quotaType := "calendar"
+		bucketType := "synchronous"
+		interval := 1
+		maxCount := 10
+		preciseAtSecondsLevel := true
+		startTime := time.Now().UTC().UTC().AddDate(0, -1, 0).Unix()
+
+		quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType)
+		Expect(err).NotTo(HaveOccurred())
+
+		err = quotaBucket.Validate()
+		Expect(err).NotTo(HaveOccurred())
+
+		period, err := quotaBucket.GetPeriod()
+		Expect(err).NotTo(HaveOccurred())
+		// check if the calendar window was set properly
+		Expect(period.GetPeriodInputStartTime()).Should(Equal(quotaBucket.GetStartTime()))
+		if !period.GetPeriodEndTime().After(period.GetPeriodStartTime()) {
+			Fail("period for Calendar Type was not set as expected")
+		}
+		Expect(period.GetPeriodStartTime().String()).ShouldNot(BeEmpty())
+		Expect(period.GetPeriodEndTime().String()).ShouldNot(BeEmpty())
+		intervalDuration := period.GetPeriodEndTime().Sub(period.GetPeriodStartTime())
+		Expect(intervalDuration).Should(Equal(time.Second))
+
+
+		// test set period for timeUnit=month
+		timeUnit = "invalidTimeUnit"
+
+		quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType)
+		Expect(err).To(HaveOccurred())
+		if ok := strings.Contains(err.Error(),InvalidQuotaTimeUnitType); !ok {
+			Fail("expected error to contain " + InvalidQuotaTimeUnitType + " but got different error message: " + err.Error())
+		}
+
+	})
+
+	It("Valid testcases for RollingWindow Type", func() {
+
+		// test set period for timeUnit=second
+		edgeOrgID := "sampleOrg"
+		id := "sampleID"
+		timeUnit := "second"
+		quotaType := "rollingWindow"
+		bucketType := "synchronous"
+		interval := 1
+		maxCount := 10
+		preciseAtSecondsLevel := true
+		startTime := time.Now().UTC().UTC().AddDate(0, -1, 0).Unix()
+
+		quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType)
+		Expect(err).NotTo(HaveOccurred())
+
+		err = quotaBucket.Validate()
+		Expect(err).NotTo(HaveOccurred())
+
+		period, err := quotaBucket.GetPeriod()
+		Expect(err).NotTo(HaveOccurred())
+		// check if the calendar window was set properly
+		Expect(period.GetPeriodInputStartTime()).Should(Equal(quotaBucket.GetStartTime()))
+		if !period.GetPeriodEndTime().After(period.GetPeriodStartTime()) {
+			Fail("period for Rolling Window Type was not set as expected")
+		}
+		Expect(period.GetPeriodStartTime().String()).ShouldNot(BeEmpty())
+		Expect(period.GetPeriodEndTime().String()).ShouldNot(BeEmpty())
+		intervalDuration := period.GetPeriodEndTime().Sub(period.GetPeriodStartTime())
+		Expect(intervalDuration).Should(Equal(time.Second))
+
+
+		// test set period for timeUnit=minute
+		timeUnit = "minute"
+
+		quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType)
+		Expect(err).NotTo(HaveOccurred())
+
+		err = quotaBucket.Validate()
+		Expect(err).NotTo(HaveOccurred())
+
+		period, err = quotaBucket.GetPeriod()
+		Expect(err).NotTo(HaveOccurred())
+		// check if the calendar window was set properly
+		Expect(period.GetPeriodInputStartTime()).Should(Equal(quotaBucket.GetStartTime()))
+		if !period.GetPeriodEndTime().After(period.GetPeriodStartTime()) {
+			Fail("period for Rolling Window Type was not set as expected")
+		}
+		Expect(period.GetPeriodStartTime().String()).ShouldNot(BeEmpty())
+		Expect(period.GetPeriodEndTime().String()).ShouldNot(BeEmpty())
+		intervalDuration = period.GetPeriodEndTime().Sub(period.GetPeriodStartTime())
+		Expect(intervalDuration).Should(Equal(time.Minute))
+
+		// test set period for timeUnit=hour
+		timeUnit = "hour"
+
+		quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType)
+		Expect(err).NotTo(HaveOccurred())
+
+		err = quotaBucket.Validate()
+		Expect(err).NotTo(HaveOccurred())
+
+		period, err = quotaBucket.GetPeriod()
+		Expect(err).NotTo(HaveOccurred())
+		// check if the calendar window was set properly
+		Expect(period.GetPeriodInputStartTime()).Should(Equal(quotaBucket.GetStartTime()))
+		if !period.GetPeriodEndTime().After(period.GetPeriodStartTime()) {
+			Fail("period for Rolling Window Type was not set as expected")
+		}
+		Expect(period.GetPeriodStartTime().String()).ShouldNot(BeEmpty())
+		Expect(period.GetPeriodEndTime().String()).ShouldNot(BeEmpty())
+		intervalDuration = period.GetPeriodEndTime().Sub(period.GetPeriodStartTime())
+		Expect(intervalDuration).Should(Equal(time.Hour))
+
+
+		// test set period for timeUnit=day
+		timeUnit = "day"
+
+		quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType)
+		Expect(err).NotTo(HaveOccurred())
+
+		err = quotaBucket.Validate()
+		Expect(err).NotTo(HaveOccurred())
+
+		period, err = quotaBucket.GetPeriod()
+		Expect(err).NotTo(HaveOccurred())
+		// check if the calendar window was set properly
+		Expect(period.GetPeriodInputStartTime()).Should(Equal(quotaBucket.GetStartTime()))
+		if !period.GetPeriodEndTime().After(period.GetPeriodStartTime()) {
+			Fail("period for Rolling Window Type was not set as expected")
+		}
+		Expect(period.GetPeriodStartTime().String()).ShouldNot(BeEmpty())
+		Expect(period.GetPeriodEndTime().String()).ShouldNot(BeEmpty())
+		intervalDuration = period.GetPeriodEndTime().Sub(period.GetPeriodStartTime())
+		Expect(intervalDuration).Should(Equal(24 * time.Hour))
+
+		// test set period for timeUnit=week
+		timeUnit = "week"
+
+		quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType)
+		Expect(err).NotTo(HaveOccurred())
+
+		err = quotaBucket.Validate()
+		Expect(err).NotTo(HaveOccurred())
+
+		period, err = quotaBucket.GetPeriod()
+		Expect(err).NotTo(HaveOccurred())
+		// check if the calendar window was set properly
+		Expect(period.GetPeriodInputStartTime()).Should(Equal(quotaBucket.GetStartTime()))
+		if !period.GetPeriodEndTime().After(period.GetPeriodStartTime()) {
+			Fail("period for Rolling Window Type was not set as expected")
+		}
+		Expect(period.GetPeriodStartTime().String()).ShouldNot(BeEmpty())
+		Expect(period.GetPeriodEndTime().String()).ShouldNot(BeEmpty())
+		intervalDuration = period.GetPeriodEndTime().Sub(period.GetPeriodStartTime())
+		Expect(intervalDuration).Should(Equal(7 * 24 * time.Hour))
+
+
+		// test set period for timeUnit=month
+		timeUnit = "month"
+
+		quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType)
+		Expect(err).NotTo(HaveOccurred())
+
+		err = quotaBucket.Validate()
+		Expect(err).NotTo(HaveOccurred())
+
+		period, err = quotaBucket.GetPeriod()
+		Expect(err).NotTo(HaveOccurred())
+		// check if the calendar window was set properly
+		Expect(period.GetPeriodInputStartTime()).Should(Equal(quotaBucket.GetStartTime()))
+		if !period.GetPeriodEndTime().After(period.GetPeriodStartTime()) {
+			Fail("period for Rolling Window Type was not set as expected")
+		}
+		Expect(period.GetPeriodStartTime().String()).ShouldNot(BeEmpty())
+		Expect(period.GetPeriodEndTime().String()).ShouldNot(BeEmpty())
+		intervalDuration = period.GetPeriodEndTime().Sub(period.GetPeriodStartTime())
+		addMonthToStartDate := period.GetPeriodStartTime().AddDate(0,interval*1,0)
+		actualDuration := addMonthToStartDate.Sub(period.GetPeriodStartTime())
+		Expect(intervalDuration).Should(Equal(actualDuration))
+
+	})
+
+	It("inValid testcases for RollingWindow Type", func() {
+
+		// test set period for timeUnit=second
+		edgeOrgID := "sampleOrg"
+		id := "sampleID"
+		timeUnit := "second"
+		quotaType := "rollingwindow"
+		bucketType := "synchronous"
+		interval := 1
+		maxCount := 10
+		preciseAtSecondsLevel := true
+		startTime := time.Now().UTC().UTC().AddDate(0, -1, 0).Unix()
+
+		quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType)
+		Expect(err).NotTo(HaveOccurred())
+
+		err = quotaBucket.Validate()
+		Expect(err).NotTo(HaveOccurred())
+
+		period, err := quotaBucket.GetPeriod()
+		Expect(err).NotTo(HaveOccurred())
+		// check if the calendar window was set properly
+		Expect(period.GetPeriodInputStartTime()).Should(Equal(quotaBucket.GetStartTime()))
+		if !period.GetPeriodEndTime().After(period.GetPeriodStartTime()) {
+			Fail("period for Rolling Window Type was not set as expected")
+		}
+		Expect(period.GetPeriodStartTime().String()).ShouldNot(BeEmpty())
+		Expect(period.GetPeriodEndTime().String()).ShouldNot(BeEmpty())
+		intervalDuration := period.GetPeriodEndTime().Sub(period.GetPeriodStartTime())
+		Expect(intervalDuration).Should(Equal(time.Second))
+
+
+		// test set period for timeUnit=month
+		timeUnit = "invalidTimeUnit"
+
+		quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType)
+		Expect(err).To(HaveOccurred())
+		if ok := strings.Contains(err.Error(),InvalidQuotaTimeUnitType); !ok {
+			Fail("expected error to contain " + InvalidQuotaTimeUnitType + " but got different error message: " + err.Error())
+		}
+
+	})
+})
\ No newline at end of file
diff --git a/services/counterServiceHelper.go b/services/counterServiceHelper.go
new file mode 100644
index 0000000..8568d8d
--- /dev/null
+++ b/services/counterServiceHelper.go
@@ -0,0 +1,101 @@
+package services
+
+import (
+	"bytes"
+	"encoding/json"
+	"errors"
+	"github.com/30x/apidQuota/constants"
+	"github.com/30x/apidQuota/globalVariables"
+	"io/ioutil"
+	"net/http"
+	"net/url"
+	"time"
+)
+
+const (
+	edgeOrgID = "orgId"
+	key       = "key"
+	delta     = "delta"
+)
+
+var client *http.Client = &http.Client{
+	//setting the timeout to 60 sec for requests to counterService
+	Timeout: time.Duration(60 * time.Second),
+}
+
+func IncrementAndGetCount(orgID string, quotaKey string, count int) (int, error) {
+	headers := http.Header{}
+	headers.Set("Accept", "application/json")
+	headers.Set("Content-Type", "application/json")
+
+	method := "POST"
+
+	if globalVariables.CounterServiceURL == "" {
+		return 0, errors.New(constants.URLCounterServiceNotSet)
+	}
+
+	serviceURL, err := url.Parse(globalVariables.CounterServiceURL)
+	if err != nil {
+		return 0, errors.New(constants.URLCounterServiceInvalid)
+	}
+
+	//'{  "orgId": "test_org",  "delta": 1,  "key": "fixed-test-key" } '
+	reqBody := make(map[string]interface{})
+	reqBody[edgeOrgID] = orgID
+	reqBody[key] = quotaKey
+	reqBody[delta] = count
+
+	reqBodyBytes, err := json.Marshal(reqBody)
+	if err != nil {
+		return 0, errors.New(constants.MarshalJSONError)
+	}
+
+	contentLength := len(reqBodyBytes)
+	request := &http.Request{
+		Header:        headers,
+		Method:        method,
+		URL:           serviceURL,
+		Body:          ioutil.NopCloser(bytes.NewReader(reqBodyBytes)),
+		ContentLength: int64(contentLength),
+	}
+
+	resp, err := client.Do(request)
+
+	if err != nil {
+		return 0, errors.New("error calling CounterService: " + err.Error())
+	}
+
+	globalVariables.Log.Debug("response: ", resp)
+	if resp.StatusCode != http.StatusOK {
+		if resp.StatusCode == http.StatusNotFound {
+			return 0, errors.New(err.Error())
+		}
+		respBodyBytes, err := ioutil.ReadAll(resp.Body)
+		if err != nil {
+
+		}
+		return 0, errors.New("response from counter service: " + resp.Status + " and response body is: " + string(respBodyBytes))
+
+	}
+
+	respBodyBytes, err := ioutil.ReadAll(resp.Body)
+	respBody := make(map[string]interface{})
+	err = json.Unmarshal(respBodyBytes, &respBody)
+	if err != nil {
+		return 0, errors.New("unable to parse response from counter service, error: " + err.Error())
+	}
+
+	respCount, ok := respBody["count"]
+	if !ok {
+		return 0, errors.New(`invalid response from counter service. field 'count' not sent in the response`)
+	}
+
+	globalVariables.Log.Debug("responseCount: ", respCount)
+	respCountInt, ok := respCount.(int)
+	if !ok {
+		return 0, errors.New(`invalid response from counter service. field 'count' sent in the response is not int`)
+	}
+
+	return respCountInt, nil
+
+}
diff --git a/util.go b/util/util.go
similarity index 96%
rename from util.go
rename to util/util.go
index 696d5bc..5e8d6b6 100644
--- a/util.go
+++ b/util/util.go
@@ -1,4 +1,4 @@
-package apidQuota
+package util
 
 import (
 	"encoding/json"
