anchor.diff:  			{Units, 0}
   	end,
   	ReserveAmount = {Units, 0},
  -	charge2(Service, Buckets, Price, Flag, DebitAmount, ReserveAmount, State);
  -charge(_Protocol, Service, Buckets, #price{units = Units} = Price,
  +	charge2(Service, Product, Buckets, Price, Flag, DebitAmount, ReserveAmount, State);
  +charge(_Protocol, Service, Product, Buckets, #price{units = Units} = Price,
   		Flag, DebitAmounts, ReserveAmounts, State)
   		when is_list(ReserveAmounts) ->
   	DebitAmount = case lists:keyfind(Units, 1, DebitAmounts) of
  
positive.code: 					{Debits, Buckets4} = get_final(ServiceId,
  							ChargingKey, SessionId, Buckets3),
  					Rated3 = rated(Debits, Rated2),
  					charge3(Service, Buckets4, final, DebitAmount, {Units, TotalUnits},
  							ReserveAmount, ReserveAmount, State#state{rated = Rated3});
  				{PriceCharged, Buckets3}  when PriceCharged < PriceCharge ->
  					TotalUnits = UnitsCharged + (PriceCharged div UnitPrice),
  
negative.code: 					((ServiceType == ?DIAMETERVOICE) and ((Spec == "5") orelse (Spec == "9")))
  					orelse
  					((ServiceType == ?DIAMETERSMS) and ((Spec == "10") orelse (Spec == "11"))))) ->
  			rate2(Protocol, Service, Product, Buckets, Timestamp, Address,
  					Direction, Offer, Flag, DebitAmounts, ReserveAmounts,
  					State#state{rated = #rated{product = OfferName}});
  		_ ->
  			throw(invalid_service_type)
  	end.
  rate2(Protocol, Service, Product, Buckets, Timestamp, Address, Direction,
  		#offer{specification = ProdSpec, price = Prices} = _Offer,
  		Flag, DebitAmounts, ReserveAmounts,
  		#state{charging_key = ChargingKey} = State)
  