anchor.diff:  					{service_network, ServiceNetwork}, {result, Other}]),
   			throw(table_lookup_failed)
   	end;
  -rate4(Protocol, Service, Buckets, Price,
  +rate4(Protocol, Service, Product, Buckets, Price,
   		Flag, DebitAmounts, ReserveAmounts, State) ->
  -	charge(Protocol, Service, Buckets, Price,
  +	charge(Protocol, Service, Product, Buckets, Price,
   			Flag, DebitAmounts, ReserveAmounts, State).
   %% @hidden
   
   
  -charge(_Protocol, #service{enabled = false} = Service,
  +charge(_Protocol, #service{enabled = false} = Service, Product,
   		Buckets, #price{units = Units} = _Price, initial,
   		_DebitAmounts, _ReserveAmounts, State) ->
  -	charge3(Service, Buckets, initial,
  +	charge3(Service, Product, Buckets, initial,
   			{Units, 0}, {Units, 0}, {Units, 0}, {Units, 0}, State);
  -charge(radius, Service, Buckets, #price{units = Units} = Price,
  +charge(radius, Service, Product, Buckets, #price{units = Units} = Price,
   		initial, [], [], State) ->
  -	charge2(Service, Buckets, Price, initial, {Units, 0}, get_reserve(Price), State);
  -charge(radius, Service, Buckets, #price{units = Units} = Price,
  +	charge2(Service, Product, Buckets, Price, initial, {Units, 0}, get_reserve(Price), State);
  +charge(radius, Service, Product, Buckets, #price{units = Units} = Price,
   		interim, DebitAmounts, ReserveAmounts, State) ->
   	DebitAmount = case lists:keyfind(Units, 1, DebitAmounts) of
   		{Units, DebitUnits} ->
  
positive.code: 	case filter_prices_dir(Direction, FilteredPrices3) of
  		[Price | _] ->
  			RoamingTable = roaming_table_prefix(Price),
  			rate3(Protocol, Service, Buckets, Address,
  					Price, Flag, DebitAmounts, ReserveAmounts,
  					State#state{roaming_tb_prefix = RoamingTable});
  		_ ->
  			throw(price_not_found)
  	end;
  rate2(Protocol, Service, Buckets, Timestamp, Address, Direction,
  		#offer{specification = ProdSpec, price = Prices} = _Offer,
  		Flag, DebitAmounts, ReserveAmounts,
  		#state{charging_key = ChargingKey} = State)
  
negative.code: 				end
  		end,
  		[#offer{name = OfferName} = Offer | _] = lists:foldl(F, [], Bundle),
  		rate2(Protocol, Product, Service, Buckets, Timestamp,
  				Address, Direction, Offer, Flag, DebitAmounts,
  				ReserveAmounts, State#state{rated = #rated{product = OfferName}})
  	catch
  		_:_ ->
  			throw(invalid_bundle_product)
  	end;
  rate1(Protocol, Service, Product, Buckets, Timestamp, Address,
  		Direction, #offer{name = OfferName} = Offer,
  		Flag, DebitAmounts, ReserveAmounts, #state{service_type = ServiceType} = State) ->
  	case mnesia:read(offer, OfferName, read) of
  		[#offer{specification = Spec, status = Status} = _P] when
  				((Status == active) orelse (Status == undefined))
  				and
  				(((Protocol == radius)
  