anchor.diff:  check_extracted_tarball_structure(MemRef, #object{type = ?SYMLINK_TYPE} = Object, _, CurrentPath, root_dir) ->
       check_symlink(MemRef, CurrentPath, Object, api_test_memory:get(MemRef, scope, private));
   check_extracted_tarball_structure(_MemRef, #object{name = Filename}, no_files, CurrentPath, _ParentDirType) ->
  -    {ok, TmpDirContentAfter} = file:list_dir(CurrentPath),
  -    ?assertEqual(false, lists:member(binary_to_list(Filename), TmpDirContentAfter)).
  +    ?assertEqual({error, enoent}, file:list_dir(filename:join(CurrentPath, Filename))).
   
   
   %% @private
   -spec check_symlink(api_test_memory:mem_ref(), file_meta:path(), onenv_file_test_utils:object_spec(), public | private) -> ok.
   check_symlink(MemRef, CurrentPath, Object, private) ->
  -    #object{name = Filename, symlink_value = LinkPath} = Object,
  -    case api_test_memory:get(MemRef, follow_symlinks) of
  -        true ->
  +    #object{name = Filename, symlink_value = LinkValue} = Object,
  +    % NOTE: custom_id in LinkValue is used only for internal symlinks
  +    case {api_test_memory:get(MemRef, follow_symlinks), LinkValue} of
  +        {true, {custom_id, Content}} ->
  +            ?assertEqual({ok, Content}, file:read_file(filename:join(CurrentPath, Filename)));
  +        {true, _} ->
               % link target files has its name as content
  -            ?assertEqual({ok, filename:basename(LinkPath)}, file:read_file(filename:join(CurrentPath, Filename)));
  -        false ->
  -            ?assertEqual({ok, binary_to_list(LinkPath)}, file:read_link(filename:join(CurrentPath, Filename)))
  +            ?assertEqual({ok, filename:basename(LinkValue)}, file:read_file(filename:join(CurrentPath, Filename)));
  +        {false, {custom_id, Content}} ->
  +            % internal symlinks are modified to target files in tarball even with follow_symlinks = false
  +            ?assertEqual({ok, Content}, file:read_file(filename:join(CurrentPath, Filename)));
  +        {false, _} ->
  +            ?assertEqual({ok, binary_to_list(LinkValue)}, file:read_link(filename:join(CurrentPath, Filename)))
       end;
   check_symlink(_MemRef, CurrentPath, Object, public) ->
       #object{name = Filename} = Object,
  
positive.code: ) ->
      onenv_api_test_runner:setup_fun().
  build_download_file_setup_fun(MemRef, Spec) ->
      SpaceId = oct_background:get_space_id(space_krk_par),
  
      fun() ->
          Object = onenv_file_test_utils:create_and_sync_file_tree(
              user3, SpaceId, utils:ensure_list(Spec), krakow
          ),
          api_test_memory:set(MemRef, file_tree_object, Object)
      end.
  
negative.code: ) ->
      ok.
  gui_download_test_base(Config, FileTreeSpec, ClientSpec, ScenarioPrefix) ->
      gui_download_test_base(Config, FileTreeSpec, ClientSpec, ScenarioPrefix, #{}).
  
  %% @private
  -spec gui_download_test_base(
      test_config:config(),
      onenv_file_test_utils:object_spec() | [onenv_file_test_utils:file_spec()],
      onenv_api_test_runner:client_spec(),
      binary(), 
      #{
          download_type => simulate_failures | uninterrupted_download,
          create_files_mode => parallel | sequential
      }
  ) ->
      ok.
  gui_download_test_base(Config, FileTreeSpec, ClientSpec, ScenarioPrefix, Opts) ->
      Providers = ?config(op_worker_nodes, Config),
  
      SpaceId = oct_background:get_space_id(space_krk_par),
  