anchor.diff:  %%
   %% @doc All topics
   %%
  --spec topics() -> list(topic()).
   topics() ->
   	mnesia:dirty_all_keys(topic).
   
   %%
  -%% @doc Subscribe Topic
  -%%
  --spec subscribe({Topic :: binary(), Qos :: mqtt_qos()}, SubPid :: pid()) -> any().
  +%% @doc Subscribe Topic or Topics
  +%%
   subscribe({Topic, Qos}, SubPid) when is_binary(Topic) and is_pid(SubPid) ->
  -	gen_server:call(?SERVER, {subscribe, {Topic, Qos}, SubPid}).
  -
  -
  -
  -%%
  -%% @doc Unsubscribe Topic
  -%%
  --spec unsubscribe(Topic :: binary(), SubPid :: pid()) -> any().
  +    subscribe([{Topic, Qos}], SubPid);
  +
  +subscribe(Topics, SubPid) when is_list(Topics) and is_pid(SubPid) ->
  +    gen_server:call(?SERVER, {subscribe, Topics, SubPid}).
  +
  +%%
  +%% @doc Unsubscribe Topic or Topics
  +%%
   unsubscribe(Topic, SubPid) when is_binary(Topic) and is_pid(SubPid) ->
  -	gen_server:cast(?SERVER, {unsubscribe, Topic, SubPid}).
  +    unsubscribe([Topic], SubPid);
  +
  +unsubscribe(Topics, SubPid) when is_list(Topics) and is_pid(SubPid) ->
  +	gen_server:cast(?SERVER, {unsubscribe, Topics, SubPid}).
   
   %%
   %% @doc Publish to cluster node.
  
positive.code: 	[TrieNode=#topic_trie_node{topic=undefined}] ->
  		mnesia:write(TrieNode#topic_trie_node{topic=Topic});
  	[#topic_trie_node{topic=Topic}] ->
  		ignore;
  	[] ->
  		%add trie path
  		[trie_add_path(Triple) || Triple <- emqtt_topic:triples(Topic)],
  
negative.code: 	ets:new(topic_subscriber, [bag, named_table, {keypos, 2}]),
  	{ok, #state{}}.
  
  handle_call({subscribe, Topics, SubPid}, _From, State) ->
      Result = [subscribe_topic({Topic, Qos}, SubPid) || {Topic, Qos} <- Topics],
      Reply = 
      case [Err || Err = {error, _} <- Result] of
          [] -> {ok, [Qos || {ok, Qos} <- Result]};
          Errors -> hd(Errors)
      end,
      {reply, Reply, State};
  
  handle_call(Req, _From, State) ->
  	{stop, {badreq, Req}, State}.
  
  handle_cast({unsubscribe, Topics, SubPid}, State) ->
      lists:foreach(fun(Topic) -> 
          ets:match_delete(topic_subscriber, #topic_subscriber{topic=Topic, qos ='_', subpid=SubPid}),
          try_remove_topic(Topic)
      end, Topics),
  	{noreply, State};
  
  handle_cast(Msg, State) ->
  