anchor.diff:          })
       } end;
   
  -translate_group(#gri{aspect = instance, scope = protected}, Group) ->
  +translate_group(#gri{id = GroupId, aspect = instance, scope = protected}, Group) ->
       #{
           <<"name">> := Name,
           <<"type">> := Type,
           <<"creator">> := Creator,
           <<"creationTime">> := CreationTime
       } = Group,
  -    #{
  +    fun(?USER(UserId)) -> #{
           <<"name">> => Name,
           <<"type">> => Type,
           <<"info">> => maps:merge(translate_creator(Creator), #{
               <<"creationTime">> => CreationTime
           }),
  -        <<"scope">> => <<"protected">>
  -    };
  +        <<"scope">> => <<"protected">>,
  +        <<"directMembership">> => group_logic:has_direct_user(GroupId, UserId)
  +    } end;
   
   translate_group(#gri{aspect = instance, scope = shared}, Group) ->
       #{
  
positive.code:             <<"creationTime">> => CreationTime
          }),
          <<"canViewPrivateData">> => false
      };
  
  translate_cluster(#gri{aspect = users}, Users) ->
      #{
  
negative.code:         ({Type, Id}, {AccGRIs, AccDirectMembership}) ->
              GRI = gs_protocol:gri_to_string(#gri{
                  type = Type, id = Id, aspect = instance, scope = auto
              }),
              {AccGRIs ++ [GRI], AccDirectMembership}
      end, {[], false}, Intermediaries),
      #{
          <<"intermediaries">> => GRIs,
          <<"directMembership">> => DirectMembership
  