diff --git a/chaincode/controller/bid/bid_controller.go b/chaincode/controller/bid/bid_controller.go
index c6a19ef80489404a2cd258b8adfda659e7eef201..16503d78fbdbd7ecf5754d8c312b1810ba6d1919 100644
--- a/chaincode/controller/bid/bid_controller.go
+++ b/chaincode/controller/bid/bid_controller.go
@@ -14,6 +14,7 @@ import (
 	"git.code.tecnalia.com/ledgerbuilder/sdk/shared"
 	"github.com/mitchellh/mapstructure"
 
+	"git.code.tecnalia.com/blockchain/hypercog/controller/stats"
 	errs "git.code.tecnalia.com/traceblock/sdk/constants"
 	"git.code.tecnalia.com/traceblock/sdk/controller/base"
 	"git.code.tecnalia.com/traceblock/sdk/controller/split"
@@ -224,22 +225,20 @@ func (c BidDecisionController) RejectBid(stub shared.LedgerBuildrStubInterface,
 	return c.SaveAbstractAsset(stub, biddableAsset)
 }
 
-func (c BidDecisionController) AcceptBid(stub shared.LedgerBuildrStubInterface, params shared.LedgerBuildrAsset) protos.Response {
-	fnName := "BidController:AcceptBid"
-
+func  (c BidDecisionController) _acceptBid(stub shared.LedgerBuildrStubInterface, params shared.LedgerBuildrAsset) (*protos.Response, error) {
 	biddableAsset, bid, err := c.bidResponse(stub, params, true)
 	if err != nil {
-		return api.NewApiResponsePtr(fnName, err, nil).SendResponse()
+		return nil, err
 	}
 
 	if biddableAsset.Quantity < bid.Quantity {
-		return api.NewApiResponsePtr(fnName, errInvalidBidQuantity, nil).SendResponse()
+		return nil, errInvalidBidQuantity
 	}
 
 	// TODO check is this transactional?
 	respAcceptedStock:= c.SaveAbstractAsset(stub, biddableAsset)
 	if respAcceptedStock.Status != shared.OK {
-		return respAcceptedStock
+		return &respAcceptedStock, nil
 	}
 
 	var soldStock *model.TraceableAsset
@@ -256,7 +255,7 @@ func (c BidDecisionController) AcceptBid(stub shared.LedgerBuildrStubInterface,
 
 		subAssets, err := split.SplitAsset(c.TraceblockBaseController, stub, biddableAsset, *splitParams)
 		if err != nil {
-			return api.NewApiResponsePtr(fnName, err, nil).SendResponse()
+			return nil, err
 		}
 
 		newStock := subAssets[0]
@@ -267,7 +266,7 @@ func (c BidDecisionController) AcceptBid(stub shared.LedgerBuildrStubInterface,
 
 		respNewStock:= c.SaveAbstractAsset(stub, &newStock)
 		if respNewStock.Status != shared.OK {
-			return respNewStock
+			return &respNewStock, nil
 		}
 
 		soldStock = &subAssets[1]
@@ -286,5 +285,19 @@ func (c BidDecisionController) AcceptBid(stub shared.LedgerBuildrStubInterface,
 
 	transferredAsset := transfer.TransferAsset(stub, soldStock, transferParams)
 	
-	return c.SaveAbstractAsset(stub, transferredAsset)
+	err = stats.RegisterSale(stub, soldStock.Quantity, bid.Price, soldStock.Units)
+	if err != nil {
+		return nil, err
+	}
+
+	ret := c.SaveAbstractAsset(stub, transferredAsset)
+	return &ret, nil
+}
+
+func (c BidDecisionController) AcceptBid(stub shared.LedgerBuildrStubInterface, params shared.LedgerBuildrAsset) protos.Response {
+	ret, err := c._acceptBid(stub, params)
+	if err != nil {
+		return api.NewApiResponsePtr("BidController:AcceptBid", err, nil).SendResponse()
+	}
+	return *ret
 }
\ No newline at end of file
diff --git a/chaincode/controller/stats/stub.go b/chaincode/controller/stats/stub.go
index be2689c9b104472d95d5c773746006e74e4b569f..35dc18f7bc83c705f60edb91f1a2c03cb7607b07 100644
--- a/chaincode/controller/stats/stub.go
+++ b/chaincode/controller/stats/stub.go
@@ -94,7 +94,7 @@ func AddOrgIfNotExist(stub shared.LedgerBuildrStubInterface, org string) (err er
 }
 
 
-func RetrieveExistingStats(stub shared.LedgerBuildrStubInterface) (*model.RawStats, *model.RawStats, error) {
+func retrieveExistingStats(stub shared.LedgerBuildrStubInterface) (*model.RawStats, *model.RawStats, error) {
 	org, err := stub.GetOrganization()
 	if err != nil {
 		return nil, nil, err
@@ -113,7 +113,7 @@ func RetrieveExistingStats(stub shared.LedgerBuildrStubInterface) (*model.RawSta
 	return globalStats, customStats, nil
 }
 
-func UpgradeStats(stub shared.LedgerBuildrStubInterface, globalStats *model.RawStats, customStats *model.RawStats) (error) {
+func upgradeStats(stub shared.LedgerBuildrStubInterface, globalStats *model.RawStats, customStats *model.RawStats) (error) {
 	org, err := stub.GetOrganization()
 	if err != nil {
 		return err
@@ -134,5 +134,40 @@ func UpgradeStats(stub shared.LedgerBuildrStubInterface, globalStats *model.RawS
 		return err
 	}
 
+	return nil
+}
+
+
+func RegisterSlag(stub shared.LedgerBuildrStubInterface, quantity uint32, units string) (error) {
+	globalStats, customStats, err := retrieveExistingStats(stub)
+	if err != nil {
+		return err
+	}
+
+	customStats.RegisterSlag(quantity, units)
+	globalStats.RegisterSlag(quantity, units)
+
+	err = upgradeStats(stub, globalStats, customStats)
+	if err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func RegisterSale(stub shared.LedgerBuildrStubInterface, quantity uint32, price float32, units string) (error) {
+	globalStats, orgStats, err := retrieveExistingStats(stub)
+	if err != nil {
+		return err
+	}
+	
+	orgStats.UpgradeSell(quantity, price, units)
+	orgStats.UpgradeSell(quantity, price, units)
+
+	err = upgradeStats(stub, globalStats, orgStats)
+	if err != nil {
+		return err
+	}
+
 	return nil
 }
\ No newline at end of file
diff --git a/chaincode/middleware/stats.go b/chaincode/middleware/stats.go
index 6b62c81dc0bfb441d4a440d7487cc8b68f8991bd..71dd771f39162b62144e00957e1cebac7925e59c 100644
--- a/chaincode/middleware/stats.go
+++ b/chaincode/middleware/stats.go
@@ -24,15 +24,7 @@ func _updateSlagProduction(stub shared.LedgerBuildrStubInterface, ctl shared.Con
 
 	status, ok := asst.Get("status")
 	if ok && status == "slag" {
-		globalStats, customStats, err := stats.RetrieveExistingStats(stub)
-		if err != nil {
-			return nil, err
-		}
-
-		customStats.RegisterSlag(asst.Quantity, asst.Units)
-		globalStats.RegisterSlag(asst.Quantity, asst.Units)
-
-		err = stats.UpgradeStats(stub, globalStats, customStats)
+		err := stats.RegisterSlag(stub, asst.Quantity, asst.Units)
 		if err != nil {
 			return nil, err
 		}