misc
diff --git a/api.go b/api.go
index f72ec1b..cebd66b 100644
--- a/api.go
+++ b/api.go
@@ -2,6 +2,7 @@
 
 import (
 	"encoding/json"
+	"fmt"
 	"github.com/30x/apid-core"
 	"github.com/30x/apidQuota/constants"
 	"github.com/30x/apidQuota/globalVariables"
@@ -9,26 +10,16 @@
 	"github.com/30x/apidQuota/util"
 	"io/ioutil"
 	"net/http"
-	"strconv"
 )
 
 func InitAPI(services apid.Services) {
-	globalVariables.Log.Debug("initialized API's exposed by apidQuota plugin")
+	globalVariables.Log.Debug("initializing apidQuota plugin APIs")
 	quotaBasePath := globalVariables.Config.GetString(constants.ConfigQuotaBasePath)
-	services.API().HandleFunc(quotaBasePath, getAllQuotaValues).Methods("GET") //yet to implement.
-	services.API().HandleFunc(quotaBasePath+"/{quotaItentifier}", incrementAndCheckQuotaLimit).Methods("POST")
+	services.API().HandleFunc(quotaBasePath, checkQuotaLimitExceeded).Methods("POST")
 
 }
 
-func getAllQuotaValues(res http.ResponseWriter, req *http.Request) {
-	stringbytes := []byte("yet to implement")
-	res.Header().Set("Content-Type", "application/json")
-	res.WriteHeader(http.StatusOK)
-	res.Write(stringbytes)
-
-}
-
-func incrementAndCheckQuotaLimit(res http.ResponseWriter, req *http.Request) {
+func checkQuotaLimitExceeded(res http.ResponseWriter, req *http.Request) {
 
 	bodyBytes, err := ioutil.ReadAll(req.Body)
 	defer req.Body.Close()
@@ -42,24 +33,26 @@
 		util.WriteErrorResponse(http.StatusBadRequest, constants.UnMarshalJSONError, "unable to convert request body to an object: "+err.Error(), res, req)
 		return
 	}
-	globalVariables.Log.Println("quotaBucketMap from request: ", quotaBucketMap)
 
-	// parse the request body into the Event struct
+	// parse the request body into the QuotaBucket struct
 	qBucket := new(quotaBucket.QuotaBucket)
 	if err = qBucket.FromAPIRequest(quotaBucketMap); err != nil {
 		util.WriteErrorResponse(http.StatusBadRequest, constants.ErrorConvertReqBodyToEntity, err.Error(), res, req)
 		return
 	}
 
-	quotaCount, err := qBucket.GetQuotaCount()
+	results, err := qBucket.IncrementQuotaLimit()
 	if err != nil {
 		util.WriteErrorResponse(http.StatusBadRequest, constants.UnMarshalJSONError, "error retrieving count for the give identifier "+err.Error(), res, req)
 		return
 	}
 
-	stringbytes := []byte(strconv.Itoa(quotaCount))
+	respMap := results.ToAPIResponse()
+	fmt.Println("results from inc quota: ", results)
+	respbytes, err := json.Marshal(respMap)
+
 	res.Header().Set("Content-Type", "application/json")
 	res.WriteHeader(http.StatusOK)
-	res.Write(stringbytes)
+	res.Write(respbytes)
 
 }
diff --git a/init.go b/init.go
index 66e0a40..8938f9a 100644
--- a/init.go
+++ b/init.go
@@ -1,32 +1,20 @@
 package apidQuota
 
 import (
+	"fmt"
 	"github.com/30x/apid-core"
 	"github.com/30x/apidQuota/constants"
 	"github.com/30x/apidQuota/globalVariables"
+	"reflect"
 )
 
 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) {
 	globalVariables.Log = services.Log().ForModule("apidQuota")
-	globalVariables.Log.Debug("start init")
+	globalVariables.Log.Debug("start init for apidQuota")
 
 	setConfig(services)
 	InitAPI(services)
@@ -40,4 +28,14 @@
 	// set plugin config defaults
 	globalVariables.Config.SetDefault(constants.ConfigQuotaBasePath, constants.QuotaBasePathDefault)
 
+	counterServiceBasePath := globalVariables.Config.Get(constants.ConfigCounterServiceBasePath)
+	fmt.Println("counterBasePath: ", counterServiceBasePath, "//")
+	if counterServiceBasePath != nil {
+		if reflect.TypeOf(counterServiceBasePath).Kind() != reflect.String {
+			globalVariables.Log.Fatal("value of: " + constants.ConfigCounterServiceBasePath + " in the config should be string")
+		}
+		globalVariables.CounterServiceURL = counterServiceBasePath.(string)
+	}
+	globalVariables.CounterServiceURL = "http://54.86.114.219:8989/increment" //todo: comment it once the above code works.
+
 }
diff --git a/quotaBucket/apiUtil.go b/quotaBucket/apiUtil.go
index c29e427..5515271 100644
--- a/quotaBucket/apiUtil.go
+++ b/quotaBucket/apiUtil.go
@@ -2,18 +2,25 @@
 
 import (
 	"errors"
-	"fmt"
 	"reflect"
 )
 
+type QuotaBucketResults struct {
+	EdgeOrgID      string
+	ID             string
+	exceededTokens bool
+	allowedTokens  int64
+	MaxCount       int64
+	startedAt      int64
+	expiresAt      int64
+}
+
 func (qBucket *QuotaBucket) FromAPIRequest(quotaBucketMap map[string]interface{}) error {
 	var edgeOrgID, id, timeUnit, quotaType, bucketType string
-	var interval, maxCount int
-	var startTime int64
+	var interval int
+	var startTime, maxCount, weight int64
 	var preciseAtSecondsLevel bool
 
-	fmt.Println("quotaBucketMap: ", quotaBucketMap)
-
 	value, ok := quotaBucketMap["edgeOrgID"]
 	if !ok {
 		return errors.New(`missing field: 'edgeOrgID' is required`)
@@ -22,7 +29,6 @@
 		return errors.New(`invalid type : 'edgeOrgID' should be a string`)
 	}
 	edgeOrgID = value.(string)
-	//fmt.Println("edgeOrgID: ", edgeOrgID)
 
 	value, ok = quotaBucketMap["id"]
 	if !ok {
@@ -32,7 +38,6 @@
 		return errors.New(`invalid type : 'id' should be a string`)
 	}
 	id = value.(string)
-	//fmt.Println("id: ", id)
 
 	value, ok = quotaBucketMap["interval"]
 	if !ok {
@@ -44,7 +49,6 @@
 	}
 	intervalFloat := value.(float64)
 	interval = int(intervalFloat)
-	//fmt.Println("interval: ", interval)
 
 	//TimeUnit {SECOND, MINUTE, HOUR, DAY, WEEK, MONTH}
 	value, ok = quotaBucketMap["timeUnit"]
@@ -55,7 +59,6 @@
 		return errors.New(`invalid type : 'timeUnit' should be a string`)
 	}
 	timeUnit = value.(string)
-	//fmt.Println("timeUnit: ", timeUnit)
 
 	//Type {CALENDAR, FLEXI, ROLLING_WINDOW}
 	value, ok = quotaBucketMap["quotaType"]
@@ -66,7 +69,6 @@
 		return errors.New(`invalid type : 'quotaType' should be a string`)
 	}
 	quotaType = value.(string)
-	//fmt.Println("quotaType: ", quotaType)
 
 	value, ok = quotaBucketMap["preciseAtSecondsLevel"]
 	if !ok {
@@ -76,7 +78,6 @@
 		return errors.New(`invalid type : 'preciseAtSecondsLevel' should be boolean`)
 	}
 	preciseAtSecondsLevel = value.(bool)
-	//fmt.Println("preciseAtSecondsLevel: ", preciseAtSecondsLevel)
 
 	value, ok = quotaBucketMap["startTime"]
 	if !ok {
@@ -88,7 +89,6 @@
 	}
 	startTimeFloat := value.(float64)
 	startTime = int64(startTimeFloat)
-	//fmt.Println("startTime: ", startTime)
 
 	value, ok = quotaBucketMap["maxCount"]
 	if !ok {
@@ -99,8 +99,7 @@
 		return errors.New(`invalid type : 'maxCount' should be a number`)
 	}
 	maxCountFloat := value.(float64)
-	maxCount = int(maxCountFloat)
-	//fmt.Println("maxCount: ", maxCount)
+	maxCount = int64(maxCountFloat)
 
 	value, ok = quotaBucketMap["bucketType"]
 	if !ok {
@@ -110,9 +109,20 @@
 		return errors.New(`invalid type : 'bucketType' should be a string`)
 	}
 	bucketType = value.(string)
-	//fmt.Println("bucketType: ", bucketType)
 
-	newQBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType)
+	value, ok = quotaBucketMap["weight"]
+	if !ok {
+		return errors.New(`missing field: 'weight' is required`)
+	}
+	//from input when its read its float, need to then convert to int.
+	if weightType := reflect.TypeOf(value); weightType.Kind() != reflect.Float64 {
+		return errors.New(`invalid type : 'maxCount' should be a number`)
+	}
+	weightFloat := value.(float64)
+	weight = int64(weightFloat)
+
+
+	newQBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType, weight)
 	if err != nil {
 		return errors.New("error creating newquotaBucket: " + err.Error())
 
@@ -127,3 +137,17 @@
 	return nil
 
 }
+
+func  (qBucketResults *QuotaBucketResults)  ToAPIResponse() (map[string]interface{}) {
+	resultsMap := make(map[string]interface{})
+	resultsMap["edgeOrgID"] = qBucketResults.ID
+	resultsMap["id"] = qBucketResults.ID
+	resultsMap["exceededTokens"] = qBucketResults.exceededTokens
+	resultsMap["allowedTokens"] = qBucketResults.allowedTokens
+	resultsMap["MaxCount"] = qBucketResults.MaxCount
+	resultsMap["startedAt"] = qBucketResults.startedAt
+	resultsMap["expiresAt"] = qBucketResults.expiresAt
+
+
+	return resultsMap
+}
\ No newline at end of file
diff --git a/quotaBucket/quotaBucket.go b/quotaBucket/quotaBucket.go
index 119482b..871baa5 100644
--- a/quotaBucket/quotaBucket.go
+++ b/quotaBucket/quotaBucket.go
@@ -92,8 +92,9 @@
 	PreciseAtSecondsLevel bool
 	Period                QuotaPeriod
 	StartTime             time.Time
-	MaxCount              int
+	MaxCount              int64
 	BucketType            string // SyncDistributed, AsyncDistributed, NonDistributed
+	Weight                int64
 }
 
 type QuotaBucket struct {
@@ -102,7 +103,7 @@
 
 func NewQuotaBucket(edgeOrgID string, id string, interval int,
 	timeUnit string, quotaType string, preciseAtSecondsLevel bool,
-	startTime int64, maxCount int, bucketType string) (*QuotaBucket, error) {
+	startTime int64, maxCount int64, bucketType string, weight int64) (*QuotaBucket, error) {
 
 	fromUNIXTime := time.Unix(startTime, 0)
 
@@ -116,6 +117,7 @@
 		StartTime:             fromUNIXTime,
 		MaxCount:              maxCount,
 		BucketType:            bucketType,
+		Weight:                weight,
 	}
 
 	quotaBucket := &QuotaBucket{
@@ -196,8 +198,9 @@
 	if err != nil {
 		return nil, err
 	}
+
 	//setCurrentPeriod if endTime > time.now()
-	if period.endTime.Before(time.Now().UTC()) || period.endTime.Equal(time.Now().UTC()) {
+	if period == nil || period.endTime.Before(time.Now().UTC()) || period.endTime.Equal(time.Now().UTC()) {
 		if err := q.setCurrentPeriod(); err != nil {
 			return nil, err
 		}
@@ -218,7 +221,7 @@
 	return &q.quotaBucketData.Period, nil
 }
 
-func (q *QuotaBucket) GetMaxCount() int {
+func (q *QuotaBucket) GetMaxCount() int64 {
 	return q.quotaBucketData.MaxCount
 }
 
@@ -226,6 +229,10 @@
 	return q.quotaBucketData.BucketType
 }
 
+func (q *QuotaBucket) GetBucketWeight() int64 {
+	return q.quotaBucketData.Weight
+}
+
 func (q *QuotaBucket) SetPeriod(startTime time.Time, endTime time.Time) {
 	period := QuotaPeriod{inputStartTime: q.GetStartTime(),
 		startTime: startTime,
@@ -260,28 +267,69 @@
 	return false
 }
 
-func (q *QuotaBucket) GetQuotaCount() (int, error) {
-	err := q.setCurrentPeriod()
-	if err != nil {
-		return 0, errors.New("error setCurrentPeriod(): " + err.Error())
-	}
+func (q *QuotaBucket) IncrementQuotaLimit() (*QuotaBucketResults, error) {
+	maxCount := q.GetMaxCount()
+	exceededCount := false
+	allowedCount := int64(0)
+	weight := q.GetBucketWeight()
 	period, err := q.GetPeriod()
 	if err != nil {
-		return 0, errors.New("error getting period: " + err.Error())
+		return nil, errors.New("error getting period: " + err.Error())
 	}
-	fmt.Println("period set: ", period)
+	fmt.Println("period set, start time: ", period.GetPeriodStartTime().String(), " end time: ", period.GetPeriodEndTime().String())
 
-	resp, err := services.IncrementAndGetCount(q.GetEdgeOrgID(), q.GetID(), 0)
+	//first retrieve the count from counter service.
+	currentCount, err := services.IncrementAndGetCount(q.GetEdgeOrgID(), q.GetID(), 0, period.GetPeriodStartTime().Unix(), period.GetPeriodEndTime().Unix())
 	if err != nil {
-		return 0, err
+		return nil, err
 	}
 
-	return resp, nil
-}
+	fmt.Println("startTime get period : ", period.GetPeriodStartTime().String())
+	fmt.Println("endTime get period : ", period.GetPeriodEndTime().String())
 
-func (q *QuotaBucket) IncrementQuota() (int, error) {
-	//todo
-	return 0, nil
+	if period.IsCurrentPeriod(q) {
+
+		if currentCount < maxCount {
+			allowed := maxCount - currentCount
+
+			if allowed > weight {
+
+				if weight != 0 {
+
+					currentCount, err = services.IncrementAndGetCount(q.GetEdgeOrgID(), q.GetID(), weight, period.GetPeriodStartTime().Unix(), period.GetPeriodEndTime().Unix())
+					if err != nil {
+						return nil, err
+					}
+				}
+
+				allowedCount = currentCount + weight
+			} else {
+
+				if weight != 0 {
+
+					exceededCount = true
+				}
+				allowedCount = currentCount + weight
+			}
+		} else {
+
+			exceededCount = true
+			allowedCount = currentCount
+		}
+	}
+
+	results := &QuotaBucketResults{
+		EdgeOrgID      : q.GetEdgeOrgID(),
+		ID             : q.GetID(),
+		exceededTokens : exceededCount,
+		allowedTokens  : allowedCount,
+		MaxCount       : maxCount,
+		startedAt      : period.GetPeriodStartTime().Unix(),
+		expiresAt      : period.GetPeriodEndTime().Unix(),
+
+	}
+
+	return results, nil
 }
 
 func IsValidTimeUnit(timeUnit string) bool {
diff --git a/quotaBucket/quotaBucket_test.go b/quotaBucket/quotaBucket_test.go
index 4d1e166..3adfce6 100644
--- a/quotaBucket/quotaBucket_test.go
+++ b/quotaBucket/quotaBucket_test.go
@@ -95,11 +95,12 @@
 		quotaType := "calendar"
 		bucketType := "synchronous"
 		interval := 1
-		maxCount := 10
+		maxCount := int64(10)
+		weight := int64(1)
 		preciseAtSecondsLevel := true
 		startTime := time.Now().UTC().AddDate(0, -1, 0).Unix()
 
-		quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType)
+		quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType, weight)
 		Expect(err).NotTo(HaveOccurred())
 
 		err = quotaBucket.Validate()
@@ -132,11 +133,12 @@
 		quotaType := "calendar"
 		bucketType := "synchronous"
 		interval := 1
-		maxCount := 10
+		maxCount := int64(10)
+		weight := int64(1)
 		preciseAtSecondsLevel := true
 		startTime := time.Now().UTC().AddDate(0, -1, 0).Unix()
 
-		quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType)
+		quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType, weight)
 		Expect(err).NotTo(HaveOccurred())
 
 		quotaBucket.SetPeriod(time.Now().UTC().UTC().AddDate(0, 1, 0), time.Now().AddDate(0, 0, -1))
@@ -157,10 +159,11 @@
 		quotaType := "calendar"
 		bucketType := "synchronous"
 		interval := 1
-		maxCount := 10
+		maxCount := int64(10)
+		weight := int64(1)
 		preciseAtSecondsLevel := true
 		startTime := time.Now().UTC().AddDate(0, -1, 0).Unix()
-		quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType)
+		quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType, weight)
 		Expect(err).To(HaveOccurred())
 
 		if !strings.Contains(err.Error(), InvalidQuotaTimeUnitType) {
@@ -179,11 +182,12 @@
 		quotaType := "calendar"
 		bucketType := "invalidQuotaBucket"
 		interval := 1
-		maxCount := 10
+		maxCount := int64(10)
+		weight := int64(1)
 		preciseAtSecondsLevel := true
 		startTime := time.Now().UTC().AddDate(0, -1, 0).Unix()
 
-		quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType)
+		quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType, weight)
 		Expect(err).NotTo(HaveOccurred())
 
 		err = quotaBucket.Validate()
@@ -206,12 +210,13 @@
 		quotaType := "rollingwindow"
 		bucketType := "synchronous"
 		interval := 1
-		maxCount := 10
+		maxCount := int64(10)
+		weight := int64(1)
 		preciseAtSecondsLevel := true
 		//InputStart time is before now
 		startTime := time.Now().UTC().AddDate(0, -1, 0).Unix()
 
-		quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType)
+		quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType, weight)
 		Expect(err).NotTo(HaveOccurred())
 		err = quotaBucket.Validate()
 		Expect(err).NotTo(HaveOccurred())
@@ -226,7 +231,7 @@
 
 		//InputStart time is now
 		startTime = time.Now().UTC().Unix()
-		quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType)
+		quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType, weight)
 		Expect(err).NotTo(HaveOccurred())
 		err = quotaBucket.Validate()
 		Expect(err).NotTo(HaveOccurred())
@@ -249,12 +254,13 @@
 		quotaType := "rollingwindow"
 		bucketType := "synchronous"
 		interval := 1
-		maxCount := 10
+		maxCount := int64(10)
+		weight := int64(1)
 		preciseAtSecondsLevel := true
 		//InputStart time is after now.
 		startTime := time.Now().UTC().AddDate(0, 1, 0).Unix()
 
-		quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType)
+		quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType, weight)
 		Expect(err).NotTo(HaveOccurred())
 
 		err = quotaBucket.Validate()
@@ -269,7 +275,7 @@
 
 		//endTime before startTime in period
 		startTime = time.Now().UTC().AddDate(0, -1, 0).Unix()
-		quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType)
+		quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType, weight)
 		Expect(err).NotTo(HaveOccurred())
 
 		quotaBucket.SetPeriod(time.Now().UTC(), time.Now().UTC().AddDate(0, -1, 0))
@@ -286,13 +292,14 @@
 		quotaType := "calendar"
 		bucketType := "synchronous"
 		interval := 1
-		maxCount := 10
+		maxCount := int64(10)
+		weight := int64(1)
 		preciseAtSecondsLevel := true
 
 		//InputStart time is before now
 		startTime := time.Now().UTC().UTC().AddDate(-1, -1, 0).Unix()
 
-		quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType)
+		quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType, weight)
 		Expect(err).NotTo(HaveOccurred())
 
 		err = quotaBucket.Validate()
@@ -308,7 +315,7 @@
 
 		//InputStart time is now
 		startTime = time.Now().UTC().Unix()
-		quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType)
+		quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType, weight)
 		Expect(err).NotTo(HaveOccurred())
 
 		err = quotaBucket.Validate()
@@ -325,7 +332,7 @@
 
 		//start Time in period is before now
 		startTime = time.Now().UTC().Unix()
-		quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType)
+		quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType, weight)
 		Expect(err).NotTo(HaveOccurred())
 
 		err = quotaBucket.Validate()
@@ -344,7 +351,7 @@
 
 		//start Time in period is now
 		startTime = time.Now().UTC().Unix()
-		quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType)
+		quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType, weight)
 		Expect(err).NotTo(HaveOccurred())
 
 		err = quotaBucket.Validate()
@@ -379,7 +386,7 @@
 
 		//end Time in period is after now
 		startTime = time.Now().UTC().Unix()
-		quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType)
+		quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType, weight)
 		Expect(err).NotTo(HaveOccurred())
 
 		err = quotaBucket.Validate()
@@ -399,7 +406,7 @@
 
 		//start time in period is before end time
 		startTime = time.Now().UTC().Unix()
-		quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType)
+		quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType, weight)
 		Expect(err).NotTo(HaveOccurred())
 
 		err = quotaBucket.Validate()
@@ -425,7 +432,8 @@
 		quotaType := "calendar"
 		bucketType := "synchronous"
 		interval := 1
-		maxCount := 10
+		maxCount := int64(10)
+		weight := int64(1)
 		preciseAtSecondsLevel := true
 
 		//InputStart time is after now.
@@ -433,7 +441,7 @@
 			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, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType)
+		quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType, weight)
 		Expect(err).NotTo(HaveOccurred())
 
 		err = quotaBucket.Validate()
@@ -445,7 +453,7 @@
 
 		//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)
+		quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType, weight)
 		Expect(err).NotTo(HaveOccurred())
 
 		err = quotaBucket.Validate()
@@ -482,11 +490,12 @@
 		quotaType := "rollingwindow"
 		bucketType := "synchronous"
 		interval := 1
-		maxCount := 10
+		maxCount := int64(10)
+		weight := int64(1)
 		preciseAtSecondsLevel := true
 		//InputStart time is before now
 		startTime := time.Now().UTC().AddDate(0, -1, 0).Unix()
-		quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType)
+		quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType, weight)
 		Expect(err).NotTo(HaveOccurred())
 
 		quotaBucket.SetPeriod(time.Now().UTC().AddDate(0, 0, -1), time.Now().UTC().AddDate(0, 1, 0))
@@ -508,7 +517,7 @@
 		quotaType = "calendar"
 		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)
+		quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType, weight)
 		Expect(err).NotTo(HaveOccurred())
 
 		quotaBucket.SetPeriod(pstartTime, pendTime)
@@ -524,7 +533,7 @@
 		quotaType = "calendar"
 		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)
+		quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType, weight)
 		Expect(err).NotTo(HaveOccurred())
 
 		quotaBucket.SetPeriod(pstartTime, pendTime)
diff --git a/quotaBucket/quotaDescriptorType.go b/quotaBucket/quotaDescriptorType.go
index 87e8f0c..8dec92c 100644
--- a/quotaBucket/quotaDescriptorType.go
+++ b/quotaBucket/quotaDescriptorType.go
@@ -144,7 +144,7 @@
 			return currentEnd.Sub(currentStart), nil
 		case QuotaTypeRollingWindow:
 			currentEnd = now
-			currentStart = currentEnd.AddDate(0, -qb.Interval, 0)
+			currentStart = currentEnd.AddDate(0, (-1)*qb.Interval, 0)
 			return currentEnd.Sub(currentStart), nil
 		default:
 			return time.Duration(0), errors.New(InvalidQuotaDescriptorType + " : ignoring unrecognized quotaType : " + quotaType)
diff --git a/quotaBucket/quotaDescriptorType_test.go b/quotaBucket/quotaDescriptorType_test.go
index 5c83148..30c7c68 100644
--- a/quotaBucket/quotaDescriptorType_test.go
+++ b/quotaBucket/quotaDescriptorType_test.go
@@ -4,17 +4,16 @@
 	. "github.com/30x/apidQuota/quotaBucket"
 	. "github.com/onsi/ginkgo"
 	. "github.com/onsi/gomega"
-	"time"
-	"strings"
 	"reflect"
+	"strings"
+	"time"
 )
 
-
 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{}){
+		if reflect.TypeOf(descriptorType) != reflect.TypeOf(&CalendarQuotaDescriptorType{}) {
 			Fail("Excepted CalendarQuotaDescriptorType, but got: " + reflect.TypeOf(descriptorType).String())
 		}
 	})
@@ -22,7 +21,7 @@
 	It("test RollingWindow Type descriptor", func() {
 		descriptorType, err := GetQuotaDescriptorTypeHandler("rollingwindow")
 		Expect(err).NotTo(HaveOccurred())
-		if reflect.TypeOf(descriptorType)!= reflect.TypeOf(&RollingWindowQuotaDescriptorType{}){
+		if reflect.TypeOf(descriptorType) != reflect.TypeOf(&RollingWindowQuotaDescriptorType{}) {
 			Fail("Excepted RollingWindowQuotaDescriptorType, but got: " + reflect.TypeOf(descriptorType).String())
 		}
 	})
@@ -46,11 +45,13 @@
 		quotaType := "calendar"
 		bucketType := "synchronous"
 		interval := 1
-		maxCount := 10
+		maxCount := int64(10)
+		weight := int64(1)
+
 		preciseAtSecondsLevel := true
 		startTime := time.Now().UTC().UTC().AddDate(0, -1, 0).Unix()
 
-		quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType)
+		quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType, weight)
 		Expect(err).NotTo(HaveOccurred())
 
 		err = quotaBucket.Validate()
@@ -68,11 +69,10 @@
 		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)
+		quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType, weight)
 		Expect(err).NotTo(HaveOccurred())
 
 		err = quotaBucket.Validate()
@@ -93,7 +93,7 @@
 		// test set period for timeUnit=hour
 		timeUnit = "hour"
 
-		quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType)
+		quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType, weight)
 		Expect(err).NotTo(HaveOccurred())
 
 		err = quotaBucket.Validate()
@@ -111,11 +111,10 @@
 		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)
+		quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType, weight)
 		Expect(err).NotTo(HaveOccurred())
 
 		err = quotaBucket.Validate()
@@ -136,7 +135,7 @@
 		// test set period for timeUnit=week
 		timeUnit = "week"
 
-		quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType)
+		quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType, weight)
 		Expect(err).NotTo(HaveOccurred())
 
 		err = quotaBucket.Validate()
@@ -154,11 +153,10 @@
 		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)
+		quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType, weight)
 		Expect(err).NotTo(HaveOccurred())
 
 		err = quotaBucket.Validate()
@@ -174,7 +172,7 @@
 		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)
+		addMonthToStartDate := period.GetPeriodStartTime().AddDate(0, interval*1, 0)
 		actualDuration := addMonthToStartDate.Sub(period.GetPeriodStartTime())
 		Expect(intervalDuration).Should(Equal(actualDuration))
 
@@ -189,11 +187,12 @@
 		quotaType := "calendar"
 		bucketType := "synchronous"
 		interval := 1
-		maxCount := 10
+		maxCount := int64(10)
+		weight := int64(1)
 		preciseAtSecondsLevel := true
 		startTime := time.Now().UTC().UTC().AddDate(0, -1, 0).Unix()
 
-		quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType)
+		quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType, weight)
 		Expect(err).NotTo(HaveOccurred())
 
 		err = quotaBucket.Validate()
@@ -211,13 +210,12 @@
 		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)
+		quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType, weight)
 		Expect(err).To(HaveOccurred())
-		if ok := strings.Contains(err.Error(),InvalidQuotaTimeUnitType); !ok {
+		if ok := strings.Contains(err.Error(), InvalidQuotaTimeUnitType); !ok {
 			Fail("expected error to contain " + InvalidQuotaTimeUnitType + " but got different error message: " + err.Error())
 		}
 
@@ -232,11 +230,12 @@
 		quotaType := "rollingWindow"
 		bucketType := "synchronous"
 		interval := 1
-		maxCount := 10
+		maxCount := int64(10)
+		weight := int64(1)
 		preciseAtSecondsLevel := true
 		startTime := time.Now().UTC().UTC().AddDate(0, -1, 0).Unix()
 
-		quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType)
+		quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType, weight)
 		Expect(err).NotTo(HaveOccurred())
 
 		err = quotaBucket.Validate()
@@ -254,11 +253,10 @@
 		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)
+		quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType, weight)
 		Expect(err).NotTo(HaveOccurred())
 
 		err = quotaBucket.Validate()
@@ -279,7 +277,7 @@
 		// test set period for timeUnit=hour
 		timeUnit = "hour"
 
-		quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType)
+		quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType, weight)
 		Expect(err).NotTo(HaveOccurred())
 
 		err = quotaBucket.Validate()
@@ -297,11 +295,10 @@
 		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)
+		quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType, weight)
 		Expect(err).NotTo(HaveOccurred())
 
 		err = quotaBucket.Validate()
@@ -322,7 +319,7 @@
 		// test set period for timeUnit=week
 		timeUnit = "week"
 
-		quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType)
+		quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType, weight)
 		Expect(err).NotTo(HaveOccurred())
 
 		err = quotaBucket.Validate()
@@ -340,11 +337,10 @@
 		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)
+		quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType, weight)
 		Expect(err).NotTo(HaveOccurred())
 
 		err = quotaBucket.Validate()
@@ -360,8 +356,8 @@
 		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())
+		subMonthToEndtDate := period.GetPeriodEndTime().AddDate(0, -interval*1, 0)
+		actualDuration := period.GetPeriodEndTime().Sub(subMonthToEndtDate)
 		Expect(intervalDuration).Should(Equal(actualDuration))
 
 	})
@@ -375,11 +371,12 @@
 		quotaType := "rollingwindow"
 		bucketType := "synchronous"
 		interval := 1
-		maxCount := 10
+		maxCount := int64(10)
+		weight := int64(1)
 		preciseAtSecondsLevel := true
 		startTime := time.Now().UTC().UTC().AddDate(0, -1, 0).Unix()
 
-		quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType)
+		quotaBucket, err := NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType, weight)
 		Expect(err).NotTo(HaveOccurred())
 
 		err = quotaBucket.Validate()
@@ -397,15 +394,14 @@
 		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)
+		quotaBucket, err = NewQuotaBucket(edgeOrgID, id, interval, timeUnit, quotaType, preciseAtSecondsLevel, startTime, maxCount, bucketType, weight)
 		Expect(err).To(HaveOccurred())
-		if ok := strings.Contains(err.Error(),InvalidQuotaTimeUnitType); !ok {
+		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
index 8568d8d..1f08a6b 100644
--- a/services/counterServiceHelper.go
+++ b/services/counterServiceHelper.go
@@ -4,6 +4,7 @@
 	"bytes"
 	"encoding/json"
 	"errors"
+	"fmt"
 	"github.com/30x/apidQuota/constants"
 	"github.com/30x/apidQuota/globalVariables"
 	"io/ioutil"
@@ -23,7 +24,7 @@
 	Timeout: time.Duration(60 * time.Second),
 }
 
-func IncrementAndGetCount(orgID string, quotaKey string, count int) (int, error) {
+func IncrementAndGetCount(orgID string, quotaKey string, count int64, startTimeInt int64, endTimeInt int64) (int64, error) {
 	headers := http.Header{}
 	headers.Set("Accept", "application/json")
 	headers.Set("Content-Type", "application/json")
@@ -44,6 +45,11 @@
 	reqBody[edgeOrgID] = orgID
 	reqBody[key] = quotaKey
 	reqBody[delta] = count
+	reqBody["startTime"] = startTimeInt
+	reqBody["endTime"] = endTimeInt
+
+	fmt.Println("startTime: ", startTimeInt)
+	fmt.Println("endTime: ", endTimeInt)
 
 	reqBodyBytes, err := json.Marshal(reqBody)
 	if err != nil {
@@ -89,13 +95,15 @@
 	if !ok {
 		return 0, errors.New(`invalid response from counter service. field 'count' not sent in the response`)
 	}
+	fmt.Println("respcount: ", respCount)
 
 	globalVariables.Log.Debug("responseCount: ", respCount)
-	respCountInt, ok := respCount.(int)
+
+	respCountInt, ok := respCount.(float64)
 	if !ok {
-		return 0, errors.New(`invalid response from counter service. field 'count' sent in the response is not int`)
+		return 0, errors.New(`invalid response from counter service. field 'count' sent in the response is not float`)
 	}
 
-	return respCountInt, nil
+	return int64(respCountInt), nil
 
 }