anchor.diff:          check_ended(Worker, [TaskID, TaskID2])
       end, Workers).
   
  +multiple_traverse_test(Config) ->
  +    [Worker | _] = ?config(op_worker_nodes, Config),
  +    multiple_traverse_test_base(Config, lists:duplicate(10, Worker), <<"multiple_traverse_test">>).
  +
  +external_multiple_traverse_test(Config) ->
  +    [_, _, Worker] = ?config(op_worker_nodes, Config),
  +    multiple_traverse_test_base(Config, lists:duplicate(10, Worker), <<"external_multiple_traverse_test">>).
  +
  +mixed_multiple_traverse_test(Config) ->
  +    [Worker, _, Worker2] = ?config(op_worker_nodes, Config),
  +    Workers = lists:flatten(lists:duplicate(5, [Worker, Worker2])),
  +    multiple_traverse_test_base(Config, Workers, <<"mixed_multiple_traverse_test">>).
  +
  +multiple_traverse_test_base(Config, StartTaskWorkers, DirName) ->
  +    [Worker | _] = Workers = ?config(op_worker_nodes, Config),
  +    {SessId, _} = {?config({session_id, {<<"user1">>, ?GET_DOMAIN(Worker)}}, Config),
  +        ?config({user_id, <<"user1">>}, Config)},
  +    [{_SpaceId, SpaceName} | _] = ?config({spaces, <<"user1">>}, Config),
  +
  +    Dir1 = <<"/", SpaceName/binary, "/", DirName/binary>>,
  +    {ok, Guid1} = ?assertMatch({ok, _}, lfm_proxy:mkdir(Worker, SessId, Dir1)),
  +    build_traverse_tree(Worker, SessId, Dir1, 1),
  +
  +    lists:foreach(fun(StartTaskWorker) ->
  +
  +        {SessId2, _} = {?config({session_id, {<<"user1">>, ?GET_DOMAIN(StartTaskWorker)}}, Config),
  +            ?config({user_id, <<"user1">>}, Config)},
  +        ?assertMatch({ok, _}, lfm_proxy:resolve_guid(StartTaskWorker, SessId2, Dir1), 30)
  +    end, StartTaskWorkers),
  +
  +    ExecutorID = rpc:call(Worker, oneprovider, get_id_or_undefined, []),
  +    RunOptions = #{
  +        target_provider_id => ExecutorID,
  +        batch_size => 1,
  +        traverse_info => self()
  +    },
  +    TaskIDs = lists:map(fun(StartTaskWorker) ->
  +        {ok, TaskID} = ?assertMatch({ok, _}, rpc:call(StartTaskWorker, tree_traverse, run,
  +            [?MODULE, file_ctx:new_by_guid(Guid1), RunOptions])),
  +        TaskID
  +    end, StartTaskWorkers),
  +
  +    Expected = get_expected_jobs(),
  +    Ans = get_slave_ans(),
  +
  +    SJobsNum = length(Expected),
  +    MJobsNum = SJobsNum * 4 div 3 - 1,
  +    Description = #{
  +        slave_jobs_delegated => SJobsNum,
  +        slave_jobs_done => SJobsNum,
  +        slave_jobs_failed => 0,
  +        master_jobs_delegated => MJobsNum,
  +        master_jobs_done => MJobsNum
  +    },
  +
  +    Check = lists:flatten(lists:duplicate(length(StartTaskWorkers), Expected)),
  +    ?assertEqual(lists:sort(Check), lists:sort(Ans)),
  +
  +    lists:foreach(fun(W) ->
  +        lists:foreach(fun(TaskID) ->
  +            ?assertMatch({ok, #document{value = #traverse_task{description = Description, enqueued = false,
  +                canceled = false, status = finished}}}, rpc:call(W, tree_traverse, get_task, [?MODULE, TaskID]), 30)
  +        end, TaskIDs),
  +        ?assertMatch({ok, [], _}, rpc:call(W, traverse_task_list, list, [atom_to_binary(?MODULE, utf8), ongoing]), 30),
  +        ?assertMatch({ok, [], _}, rpc:call(W, traverse_task_list, list, [atom_to_binary(?MODULE, utf8), scheduled]), 30),
  +        check_ended(Worker, TaskIDs),
  +
  +        case W of
  +            Worker -> check_callbacks(W, 0, 0, 10);
  +            _ -> check_callbacks(W, 0, 0, 0)
  +        end
  +    end, Workers).
  +
   %%%===================================================================
   %%% SetUp and TearDown functions
   %%%===================================================================
  
positive.code:     db_sync_many_ops_test_base/1, multi_space_test/1, rtransfer_test/1, rtransfer_test_base/1,
      rtransfer_multisource_test/1, rtransfer_blocking_test/1, traverse_test/1, external_traverse_test/1,
      traverse_cancel_test/1, external_traverse_cancel_test/1, traverse_external_cancel_test/1,
      queued_traverse_cancel_test/1, queued_traverse_external_cancel_test/1, traverse_restart_test/1
  ]).
  
  %% Pool callbacks
  
negative.code:     multi_space_test, rtransfer_test, rtransfer_multisource_test, rtransfer_blocking_test,
      traverse_test, external_traverse_test, traverse_cancel_test, external_traverse_cancel_test,
      traverse_external_cancel_test, queued_traverse_cancel_test, queued_traverse_external_cancel_test,
      traverse_restart_test, multiple_traverse_test, external_multiple_traverse_test, mixed_multiple_traverse_test
  ]).
  
  -define(PERFORMANCE_TEST_CASES, [
  