anchor.diff:          _Class:_Error ->
   	    send_packet(Session, exmpp_iq:error(IQ, forbidden))
       end;
  -
   process_iq(_Session, _Type, _NS, IQ) ->
       process_generic(IQ).
   
  
positive.code: route_packet([], _Packet) ->
      ok.
  
  %% Various helpers
  
  -spec send_packet(pid(), #xmlel{}) -> ok.
  send_packet(Session, El) ->
      exmpp_component:send_packet(Session, El).
  
  -spec client_spawn(list(), list()) -> {tuple(), pid()} | false.
  client_spawn(JID, Password) ->
      try
          [User, Domain] = string:tokens(JID, "@"),
  
negative.code: process_generic(Packet) ->
      Sender = exmpp_stanza:get_sender(Packet),
      Recipient = exmpp_stanza:get_recipient(Packet),
      ok = update_route(Sender, Recipient),
      ok = route_packet(Sender, Recipient, Packet).
  
  -spec update_route(binary(), binary()) -> ok.
  update_route(Sender, Recipient) ->
      case exmpp_jid:domain(exmpp_jid:parse(Sender)) of
          <<"chat.facebook.com">> ->
              New = binary_to_list(Recipient),
              [Old, _, _] = string:tokens(New, "_"),
              ej2j_route:update(Old, New);
          _Else -> ok
      end.
  
  -spec route_packet(binary() | undefined, binary() | undefined, #xmlel{}) -> ok.
  route_packet(Sender, Recipient, Packet) when Sender =/= undefined,
                                                Recipient =/= undefined ->    
      From = exmpp_jid:parse(Sender),
      To = exmpp_jid:parse(Recipient),
      Routes = get_routes(From, To),
      route_packet(Routes, Packet);
  route_packet(_Sender, _Recipient, _Packet) -> 
      ok.
  
  -spec route_packet(list(), #xmlel{}) -> ok.
  route_packet([{{client, Session}, NewFrom, NewTo}|Tail], Packet) ->
  