anchor.diff:          {'DOWN', _, _, _, _} ->
               ok = gen_server:call(Cp, {worker_done, self()}, infinity);
           {changes, ChangesManager, Changes, ReportSeq} ->
  -            IdRevs = find_missing(Changes, Target),
  +            %% get docinfo of missing ids
  +            MissingDocInfoList = find_missing(Changes, Target),
               NumChecked = length(Changes),
  +            %% use ptr in docinfo to fetch document from storage
               {ok, DataRepd} = local_process_batch(
  -                               IdRevs, Cp, Source, Target, #batch{}),
  -            ok = gen_server:call(Cp, {report_seq_done, ReportSeq, NumChecked, length(IdRevs), DataRepd}, infinity),
  +                               MissingDocInfoList, Cp, Source, Target, #batch{}),
  +            ok = gen_server:call(Cp, {report_seq_done, ReportSeq, NumChecked, length(MissingDocInfoList), DataRepd}, infinity),
               ?xdcr_debug("Worker reported completion of seq ~p", [ReportSeq]),
               queue_fetch_loop(Source, Target, Cp, ChangesManager)
       end.
  
positive.code:     %% return total data flushed
      {ok, DataFlushed + DataFlushed2}.
  
  fetch_doc(Source, {Id, _Rev}, DocHandler, Acc) ->
      couch_api_wrap:open_doc(
        Source, Id, [deleted], DocHandler, Acc).
  
  
  local_doc_handler({ok, Doc}, {Target, DocList, Cp}) ->
      {ok, {Target, [Doc | DocList], Cp}};
  
negative.code:             exit({failed_write, Props})
      end.
  
  %% return list of Docsinfos of missing keys
  -spec find_missing(list(), #httpdb{}) -> list().
  find_missing(DocInfos, Target) ->
      {IdRevs, AllRevsCount} = lists:foldr(
                                 fun(#doc_info{id = Id, rev = Rev}, {IdRevAcc, CountAcc}) ->
  