anchor.diff:      ValueVerifierFn2 = find_translation(ElemPath, verify, AnRes,
                                           ValueVerifierFn1),
   
  -    [nowarn_dialyzer_attr(FnName, 2),
  +    TrUserDataVar = ?expr(TrUserData),
  +    TrUserDataReplacements =
  +        case {ValueType,{ValueVerifierFn1, ValueVerifierFn2}} of
  +            {{msg,_}, _} ->
  +                [replace_tree('MaybeTrUserDataArg', TrUserDataVar),
  +                 replace_tree('MaybeTrUserData', TrUserDataVar)];
  +            {_, {X,Y}} when X /= Y ->
  +                %% Translation exists
  +                [replace_tree('MaybeTrUserDataArg', TrUserDataVar),
  +                 replace_tree('MaybeTrUserData', TrUserDataVar)];
  +            _ ->
  +                [replace_tree('MaybeTrUserDataArg', ?expr(_)),
  +                 splice_trees('MaybeTrUserData', [])]
  +        end,
  +    [nowarn_dialyzer_attr(FnName, 3),
        case RecordsOrMaps of
            records ->
                gpb_codegen:format_fn(
                  FnName,
  -               fun(KVs, Path) when is_list(KVs) ->
  +               fun(KVs, Path, 'MaybeTrUserDataArg') when is_list(KVs) ->
                          [case X of
                               {Key, Value} ->
                                   'VerifyKey'(Key, ['key' | Path]),
  -                                'VerifyValue'(Value, ['value' | Path]);
  +                                'VerifyValue'(Value, ['value' | Path],
  +                                             'MaybeTrUserData');
                               _ ->
                                   mk_type_error(invalid_key_value_tuple, X, Path)
                           end
                           || X <- KVs],
                          ok;
  -                  (X, Path) ->
  +                  (X, Path, _TrUserData) ->
                          mk_type_error(invalid_list_of_key_value_tuples, X, Path)
                  end,
                  [replace_term('VerifyKey', KeyVerifierFn),
  -                replace_term('VerifyValue', ValueVerifierFn2)]);
  +                replace_term('VerifyValue', ValueVerifierFn2)]
  +               ++ TrUserDataReplacements);
            maps ->
                gpb_codegen:format_fn(
                  FnName,
  -               fun(M, Path) when is_map(M) ->
  +               fun(M, Path, 'MaybeTrUserDataArg') when is_map(M) ->
                          [begin
                               'VerifyKey'(Key, ['key' | Path]),
  -                            'VerifyValue'(Value, ['value' | Path])
  +                            'VerifyValue'(Value, ['value' | Path],
  +                                         'MaybeTrUserData')
                           end
                           || {Key, Value} <- maps:to_list(M)],
                          ok;
  -                  (X, Path) ->
  +                  (X, Path, _TrUserData) ->
                          mk_type_error(invalid_map, X, Path)
                  end,
                  [replace_term('VerifyKey', KeyVerifierFn),
  -                replace_term('VerifyValue', ValueVerifierFn2)])
  +                replace_term('VerifyValue', ValueVerifierFn2)]
  +               ++ TrUserDataReplacements)
        end].
   
   format_verifier_auxiliaries(Defs) ->
  
positive.code:            maps    -> ?f("-export([merge_msgs/3, merge_msgs/4]).~n")
         end,
         case get_records_or_maps_by_opts(Opts) of
             records -> ?f("-export([verify_msg/1]).~n");
             maps    -> ?f("-export([verify_msg/2]).~n")
         end,
         ?f("-export([get_msg_defs/0]).~n"),
         ?f("-export([get_msg_names/0]).~n"),
  
negative.code:             %% FIXME: check especially for `undefined'
              %% and if found, error out with required_field_not_set
              %% specifying expected type
              ?expr('<verify-fn>'('<F>', ['<FName>' | Path], 'MaybeTrUserData'),
                    Replacements);
          repeated when not IsMapField ->
              ?expr(if is_list('<F>') ->
  