anchor.diff:  
   suite() -> [{ct_hooks,[{ts_install_cth,[{nodenames,2}]}]}].
   
  -all() -> [{group, basic}, {group, setup}, {group, payload}, {group, pem_cache}].
  +all() -> [{group, setup}, {group, payload}].
   
   groups() ->
  -    [{basic, [], [basic_pem_cache]},
  -     {setup, [{repeat, 3}], [setup_sequential, setup_concurrent]},
  -     {payload, [{repeat, 3}], [payload_simple]},
  -     {pem_cache, [{repeat, 3}], [use_pem_cache, bypass_pem_cache]}
  +    [{setup, [{repeat, 3}], [setup_sequential, setup_sequential_noreuse, setup_sequential_13,
  +                             setup_concurrent, setup_concurrent_noreuse, setup_concurrent_13]},
  +     {payload, [{repeat, 3}], [payload, payload_13]}
       ].
   
   init_per_group(_GroupName, Config) ->
  
positive.code: 	    {ok, Ack}
      end.
  
  setup_server_init(Type, Tc, Loop, PC) ->
      _ = ssl:stop(),
      {ok, _} = ensure_all_started(ssl, []),
      Me = self(),
      Pid = spawn_link(fun() -> server_init(Type, Tc, Loop, PC, Me) end),
      Res = receive
  	      {Pid, {init, Host, Port}} -> {ok, {Pid, Host, Port}};
  	      {Pid, Error} -> {error, Error}
  
negative.code: setup_sequential(Config) ->
      Server = proplists:get_value(server_node, Config),
      Server =/= undefined orelse error(no_server),
      Cfg = [{version, 'tlsv1.2'}],
      {ok, Result} = do_test(ssl, {setup_connection,Cfg}, ?COUNT * 20, 1, Server),
      ct_event:notify(#event{name = benchmark_data,
  			   data=[{value, Result},
  				 {suite, "ssl"}, {name, "Sequential setup"}]}),
      ok.
  
  setup_sequential_noreuse(Config) ->
      Server = proplists:get_value(server_node, Config),
      Server =/= undefined orelse error(no_server),
      Cfg = [{version, 'tlsv1.2'}, no_reuse],
      {ok, Result} = do_test(ssl, {setup_connection,Cfg}, ?COUNT * 20, 1, Server),
      ct_event:notify(#event{name = benchmark_data,
  			   data=[{value, Result},
  				 {suite, "ssl"}, {name, "Seq setup 1.2 no session"}]}),
      ok.
  
  setup_sequential_13(Config) ->
      Server = proplists:get_value(server_node, Config),
      Server =/= undefined orelse error(no_server),
      Cfg = [{version, 'tlsv1.3'}],
      {ok, Result} = do_test(ssl, {setup_connection,Cfg}, ?COUNT * 20, 1, Server),
      ct_event:notify(#event{name = benchmark_data,
  			   data=[{value, Result},
  				 {suite, "ssl"}, {name, "Seq setup 1.3"}]}),
      ok.
  
  setup_concurrent(Config) ->
      Server = proplists:get_value(server_node, Config),
      Server =/= undefined orelse error(no_server),
      Cfg = [{version, 'tlsv1.2'}],
      {ok, Result} = do_test(ssl, {setup_connection,Cfg}, ?COUNT, 100, Server),
      ct_event:notify(#event{name = benchmark_data,
  			   data=[{value, Result},
  				 {suite, "ssl"}, {name, "Concurrent setup"}]}),
      ok.
  
  setup_concurrent_noreuse(Config) ->
      Server = proplists:get_value(server_node, Config),
      Server =/= undefined orelse error(no_server),
      Cfg = [{version, 'tlsv1.2'}, no_reuse],
      {ok, Result} = do_test(ssl, {setup_connection,Cfg}, ?COUNT, 100, Server),
      ct_event:notify(#event{name = benchmark_data,
  			   data=[{value, Result},
  				 {suite, "ssl"}, {name, "Conc setup 1.2 no session"}]}),
      ok.
  
  setup_concurrent_13(Config) ->
      Server = proplists:get_value(server_node, Config),
      Server =/= undefined orelse error(no_server),
      Cfg = [{version, 'tlsv1.3'}],
      {ok, Result} = do_test(ssl, {setup_connection,Cfg}, ?COUNT, 100, Server),
      ct_event:notify(#event{name = benchmark_data,
  			   data=[{value, Result},
  				 {suite, "ssl"}, {name, "Conc setup 1.3"}]}),
      ok.
  
  payload(Config) ->
      Server = proplists:get_value(server_node, Config),
      Server =/= undefined orelse error(no_server),
      Cfg = [{version, 'tlsv1.2'}],
      {ok, Result} = do_test(ssl, {payload, Cfg}, ?COUNT*300, 10, Server),
      ct_event:notify(#event{name = benchmark_data,
  			   data=[{value, Result},
  				 {suite, "ssl"}, {name, "Payload simple"}]}),
      ok.
  
  payload_13(Config) ->
      Server = proplists:get_value(server_node, Config),
      Server =/= undefined orelse error(no_server),
      Cfg = [{version, 'tlsv1.3'}],
      {ok, Result} = do_test(ssl, {payload, Cfg}, ?COUNT*300, 10, Server),
      ct_event:notify(#event{name = benchmark_data,
  			   data=[{value, Result},
  				 {suite, "ssl"}, {name, "Payload 1.3"}]}),
      ok.
  
  ssl() ->
      test(ssl, ?COUNT).
  
  test(Type, Count) ->
      Server = ssl_bench_test_lib:setup(perf_server),
      (do_test(Type, {setup_connection, [{version, 'tlsv1.2'}]}, Count * 20, 1, Server)),
      (do_test(Type, {setup_connection, [{version, 'tlsv1.3'}]}, Count * 20, 1, Server)),
      (do_test(Type, {setup_connection, [{version, 'tlsv1.2'}, no_reuse]}, Count * 20, 1, Server)),
      (do_test(Type, {setup_connection, [{version, 'tlsv1.2'}]}, Count, 100, Server)),
      (do_test(Type, {payload, [{version, 'tlsv1.2'}]}, Count*300, 10, Server)),
      ok.
  
  do_test(Type, {Func, _}=TC, Loop, ParallellConnections, Server) ->
      _ = ssl:stop(),
      {ok, _} = ensure_all_started(ssl, []),
      Certs = cert_data(),
      {ok, {SPid, Host, Port}} = rpc:call(Server, ?MODULE, setup_server_init,
  					[Type, TC, Loop, ParallellConnections, Certs]),
      link(SPid),
      Me = self(),
      Test = fun(Id) ->
  		   CData = client_init(Me, Type, TC, Host, Port, Certs),
  		   receive
  		       go ->
  			   ?FPROF_CLIENT andalso Id =:= 1 andalso
  			       start_profile(fprof, [self(),new]),
  			   ?EPROF_CLIENT andalso Id =:= 1 andalso
  			       start_profile(eprof, [ssl_connection_sup, ssl_manager]),
  			   ok = ?MODULE:Func(Loop, Type, CData),
  			   ?FPROF_CLIENT andalso Id =:= 1 andalso
  			       stop_profile(fprof, "test_connection_client_res.fprof"),
  			   ?EPROF_CLIENT andalso Id =:= 1 andalso
  