anchor.diff:          send({identity, I}, ?C_ROOM_ANY, data:format(Room, User, in))
           || #t_user{id = I} <- db:select_room_user(Room)
       ],
  +    case {Type, Data} of
  +        {?T_ROOM_DIRECT, none} -> ok;
  +        {?T_ROOM_DIRECT, Credential} ->
  +            (catch handle(Client, ?C_ROOM_INVITE,
  +                          [uuid:uuid_to_string(Room#t_room.id), Credential]));
  +        {_, _} -> ok
  +    end,
       {ok, Client, uuid:uuid_to_string(Room#t_room.id)};
   
   handle(#s_client{identity = Identity} = Client,
  
positive.code:         send({identity, I}, ?C_ROOM_ANY, data:format(Room, User, in))
          || #t_user{id = I} <- db:select_room_user(Room)
      ],
      {ok, Client};
  
  handle(#s_client{identity = Identity} = Client,
  
negative.code: 
  handle(#s_client{identity = Identity} = Client,
         ?C_ROOM_INVITE, [Id, Credential]) ->
      [Room] = db:select_room(#t_room{id = uuid:string_to_uuid(Id)}),
      [_] = db:select_user_room(#t_user{id = Identity}, Room),
      [Username, Provider] = string:tokens(Credential, "@"),
      [Alias] = db:select_alias(#t_alias{provider = Provider,
                                         username = Username}),
      [User] = db:select_user(#t_user{id = Alias#t_alias.user_id}),
      {ok, _} = db:sym_insert_user_room(User, Room, true),
      send({identity, Alias#t_alias.user_id}, ?C_ROOM_SELF, data:format(Room)),
  