anchor.diff:  
   go(_, [], _) ->
       {ok, []};
  -go(DbName, AllDocs, Opts) ->
  +go(DbName, AllDocs0, Opts) ->
  +    AllDocs = tag_docs(AllDocs0),
       validate_atomic_update(DbName, AllDocs, lists:member(all_or_nothing, Opts)),
       Options = lists:delete(all_or_nothing, Opts),
       GroupedDocs = lists:map(fun({#shard{name=Name, node=Node} = Shard, Docs}) ->
  -        Ref = rexi:cast(Node, {fabric_rpc, update_docs, [Name, Docs, Options]}),
  +        Docs1 = untag_docs(Docs),
  +        Ref = rexi:cast(Node, {fabric_rpc, update_docs, [Name,Docs1,Options]}),
           {Shard#shard{ref=Ref}, Docs}
       end, group_docs_by_shard(DbName, AllDocs)),
       {Workers, _} = lists:unzip(GroupedDocs),
       RexiMon = fabric_util:create_monitors(Workers),
       W = couch_util:get_value(w, Options, integer_to_list(mem3:quorum(DbName))),
       Acc0 = {length(Workers), length(AllDocs), list_to_integer(W), GroupedDocs,
  -        dict:from_list([{Doc,[]} || Doc <- AllDocs])},
  +        dict:new()},
       Timeout = fabric_util:request_timeout(),
       try rexi_utils:recv(Workers, #shard.ref, fun handle_message/3, Acc0, infinity, Timeout) of
       {ok, {Health, Results}} when Health =:= ok; Health =:= accepted ->
  
positive.code:     handle_message({ok, [X || _D <- Docs]}, Worker, Acc0);
  handle_message({bad_request, Msg}, _, _) ->
      throw({bad_request, Msg}).
  
  force_reply(Doc, [], {_, W, Acc}) ->
      {error, W, [{Doc, {error, internal_server_error}} | Acc]};
  
negative.code:             {ok, {WaitingCount - 1, DocCount, W, NewGrpDocs, DocReplyDict}};
          {stop, W, FinalReplies} ->
              {stop, {ok, FinalReplies}}
          end;
      _ ->
          {ok, {WaitingCount - 1, DocCount, W, NewGrpDocs, DocReplyDict}}
      end;
  handle_message({missing_stub, Stub}, _, _) ->
      throw({missing_stub, Stub});
  