anchor.diff:                || {OFName, Tr, OFMergeFn} <- OFMerges])
              | Transforms]).
   
  -render_omissible_merger({FName, {overwrite, {PMsg, NMsg}}}, Var) ->
  +render_omissible_merger({FName, {overwrite, {PMsg, NMsg}}}, Var,
  +                        TrUserDataVar) ->
       ?expr(case {'PMsg', 'NMsg'} of
                 {_, '#{fname := NF}'} -> 'Var#{fname=>NF}';
                 {'#{fname := PF}', _} -> 'Var#{fname=>PF}';
                 _                     -> 'Var'
             end,
  -          std_omitable_merge_transforms(PMsg, NMsg, FName, Var));
  -render_omissible_merger({FName, {merge, {{PMsg, NMsg}, Tr, MergeFn}}}, Var) ->
  -    Trs = std_omitable_merge_transforms(PMsg, NMsg, FName, Var),
  -    MergeCallTmpl = ?expr('merge'('PF','NF'), Trs),
  +          std_omitable_merge_transforms(PMsg, NMsg, FName, Var, TrUserDataVar));
  +render_omissible_merger({FName, {merge, {{PMsg, NMsg}, Tr, MergeFn}}}, Var,
  +                        TrUserDataVar) ->
  +    Trs = std_omitable_merge_transforms(PMsg, NMsg, FName, Var, TrUserDataVar),
  +    MergeCallTmpl = ?expr('merge'('PF','NF', 'TrUserData'), Trs),
       ?expr(case {'PMsg', 'NMsg'} of
                 {'#{fname := PF}', '#{fname := NF}'} ->
                     'Var#{fname=>merge(PF,NF)}';
  
positive.code: format_merge_msgs_top_level(MsgNames, Opts) ->
      case get_records_or_maps_by_opts(Opts) of
          records ->
              gpb_codegen:format_fn(
                merge_msgs,
                fun(Prev, New) when element(1, Prev) =:= element(1, New) ->
                        case Prev of
                            '<msg-type>' -> '<merge-msg>'(Prev, New)
                        end
                end,
                [repeat_clauses(
                   '<msg-type>',
                   [[replace_tree('<msg-type>', record_match(MsgName, [])),
                     replace_term('<merge-msg>', mk_fn(merge_msg_, MsgName))]
                    || MsgName <- MsgNames])]);
          maps ->
              gpb_codegen:format_fn(
                merge_msgs,
                fun(Prev, New, MsgName) ->
                        case MsgName of
                            '<msg-type>' -> '<merge-msg>'(Prev, New)
                        end
                end,
                [repeat_clauses(
                   '<msg-type>',
                   [[replace_tree('<msg-type>', erl_syntax:atom(MsgName)),
                     replace_term('<merge-msg>', mk_fn(merge_msg_, MsgName))]
                    || MsgName <- MsgNames])])
      end.
  
  format_msg_merger(MsgName, [], _AnRes, _Opts) ->
      gpb_codegen:format_fn(
        mk_fn(merge_msg_, MsgName),
        fun(_Prev, New) -> New end);
  format_msg_merger(MsgName, MsgDef, AnRes, Opts) ->
      {PrevMatch, NewMatch, ExtraInfo} =
          format_msg_merger_fnclause_match(MsgName, MsgDef, Opts),
      {MandatoryMergings, OptMergings} = compute_msg_field_mergers(
                                           ExtraInfo, MsgName, AnRes),
      gpb_codegen:format_fn(
        mk_fn(merge_msg_, MsgName),
        fun('Prev', 'New')                 -> '<merge-it>'
        end,
        [replace_tree('Prev',  PrevMatch),
         replace_tree('New',   NewMatch),
         splice_trees(
           '<merge-it>',
           do_exprs(fun render_omissible_merger/2,
                    render_field_mergers(MsgName, MandatoryMergings, Opts),
                    OptMergings))]).
  
  format_msg_merger_fnclause_match(_MsgName, [], _Opts) ->
      {?expr(PF), ?expr(_), no_fields};
  
negative.code:                       ++ OneofTransforms,
                    MmO = map_match([{FName, ?expr({'tag', 'OPF'}, Trs2)}]),
                    MmN = map_match([{FName, ?expr({'tag', 'ONF'}, Trs2)}]),
                    MergeCall = ?expr({'tag','merge'('OPF','ONF', 'TrUserData')},
                                      Trs2),
                    [replace_tree(
                       '{#{fname := {tag,OPF}}, #{fname := {tag,ONF}}}',
                       ?expr({'#{fname := {tag,OPF}}', '#{fname := {tag,ONF}}'},
  