anchor.diff:  	end,
   	NewAcc = lists:foldl(F, Acc, SubscriptionIdData),
   	char_attr_nas_ip(CCR, NewAcc);
  +char_attr_username(#'3gpp_gx_CCR'{'Subscription-Id' = SubscriptionIdData} = CCR, Acc)
  +		when length(SubscriptionIdData) > 0 ->
  +	F = fun(#'3gpp_gx_Subscription-Id'{'Subscription-Id-Type' = ?'3GPP_RO_SUBSCRIPTION-ID-TYPE_END_USER_E164',
  +				'Subscription-Id-Data' = MSISDN}, Acc1) ->
  +			[{struct, [{"name", "msisdn"}, {"value", binary_to_list(MSISDN)}]} | Acc1];
  +		(#'3gpp_gx_Subscription-Id'{'Subscription-Id-Type' = ?'3GPP_RO_SUBSCRIPTION-ID-TYPE_END_USER_IMSI',
  +				'Subscription-Id-Data' = IMSI}, Acc1) ->
  +			[{struct, [{"name", "imsi"}, {"value", binary_to_list(IMSI)}]} | Acc1];
  +		(_, Acc1) ->
  +			Acc1
  +	end,
  +	NewAcc = lists:foldl(F, Acc, SubscriptionIdData),
  +	char_attr_nas_ip(CCR, NewAcc);
   char_attr_username(#'3gpp_ro_CCR'{'User-Name' = [Username]} = CCR, Acc)
   		when is_binary(Username) ->
   	NewAcc = [{struct, [{"name", "username"},
   			{"value", binary_to_list(Username)}]} | Acc],
   	char_attr_nas_ip(CCR, NewAcc);
  -char_attr_username(#'3gpp_ro_CCR'{} = CCR, Acc) ->
  +char_attr_username(CCR, Acc) ->
   	char_attr_nas_ip(CCR, Acc);
   char_attr_username(Attributes, Acc) ->
   	NewAcc = case radius_attributes:find(?UserName, Attributes) of
  
positive.code: 	NewAcc = [{struct, [{"name", "acctSessionTime"},
  			{"value", Duration}]} | Acc],
  	char_attr_input_octets(CCR, NewAcc);
  char_attr_session_time(#'3gpp_ro_CCR'{} = CCR, Acc) ->
  	char_attr_input_octets(CCR, Acc);
  char_attr_session_time(Attributes, Acc) ->
  	NewAcc = case radius_attributes:find(?AcctSessionTime, Attributes) of
  
negative.code: 	NewAcc = [{struct, [{"name", "callingStationId"},
  			{"value", binary_to_list(Called)}]} | Acc],
  	char_attr_nas_id(CCR, NewAcc);
  char_attr_calling_id(CCR, Acc) ->
  	char_attr_nas_id(CCR, Acc);
  char_attr_calling_id(Attributes, Acc) ->
  	NewAcc = case radius_attributes:find(?CallingStationId, Attributes) of
  