anchor.diff:  -define(SCENARIO_TIMEOUT,  120000).
   -define(REQUEST_TIMEOUT,   20000).
   
  +-type katt_run_result() :: { nonempty_string()    % scenario name
  +                           , [ { string()         % operation description
  +                               , #katt_request{}
  +                               , pass | { fail
  +                                        , atom()  % reason
  +                                        , any()   % details
  +                                        }
  +                               }
  +                             ]
  +                           } | { error
  +                               , atom()           % reason
  +                               , any()            % details
  +                               }.
  +
   %%%_* API ==============================================================
  --spec run(string()) ->
  -             [{string(), pass|{fail, {atom(), any()}}}|{error, any()}].
  +-spec run(nonempty_string()) -> katt_run_result().
  +
   %% @doc Run test scenario. Argument is the full path to the scenario file.
   %% The scenario file should be a KATT Blueprint file.
   %% @end
   run(Scenario) -> run(Scenario, []).
   
  --spec run(string(), list()) ->
  -             [{string(), pass|{fail, {atom(), any()}}}|{error, any()}].
  +-spec run(nonempty_string(), list()) -> katt_run_result().
  +%% @doc Run test scenario. Argument is the full path to the scenario file.
  +%% The scenario file should be a KATT Blueprint file.
  +%% @end
  +run(Scenario, Params) -> run(Scenario, Params, []).
  +
  +
  +-spec run(nonempty_string(), list(), list()) -> katt_run_result().
   %% @doc Run test scenario. First argument is the full path to the scenario file.
   %% Second argument is a key-value list of parameters, such as hostname, port.
   %% You can also pass custom variable names (atoms) and values (strings).
  +%% Third argument is a key-value list of special options such as custom
  +%% parser to use instead of the built-in default parser (maybe_parse_body).
   %% @end
  -run(Scenario, Params) ->
  -  spawn_link(?MODULE, run, [self(), Scenario, Params]),
  +run(Scenario, Params, Options) ->
  +  ScenarioTimeout = proplists:get_value( scenario_timeout
  +                                       , Options
  +                                       , ?SCENARIO_TIMEOUT
  +                                       ),
  +  spawn_link(?MODULE, run, [self(), Scenario, Params, Options]),
     receive {done, Result}    -> Result
  -  after   ?SCENARIO_TIMEOUT -> {error, timeout}
  +  after   ScenarioTimeout -> {error, timeout, ScenarioTimeout}
     end.
   
   %%%_* Internal export --------------------------------------------------
   %% @private
  -run(From, Scenario, ScenarioParams) ->
  +run(From, Scenario, ScenarioParams, ScenarioOptions) ->
     {ok, Blueprint} = katt_blueprint_parse:file(Scenario),
  -  Params0 = make_params(ScenarioParams),
  -  Params = ordsets:from_list(Params0),
  -  Result = {Scenario, run_scenario(Scenario, Blueprint, Params)},
  +  Params = ordsets:from_list(make_params(ScenarioParams)),
  +  Options = make_options(ScenarioOptions),
  +  Result = {Scenario, run_scenario(Scenario, Blueprint, Params, Options)},
     From ! {done, Result}.
   
   %%%_* Internal =========================================================
  
positive.code:             run_operations( Scenario
                            , T
                            , NewParams
                            , [{Description, Request, Pass}|Acc]
                            );
      _    -> [{Description, Request, ValidationResult}|Acc]
    end;
  run_operations(_Scenario, [], _Params, Acc) ->
    Acc.
  
  make_request_url(Url = "http://" ++ _, _Params)  -> Url;
  
negative.code: %% API
  -export([ run/1
          , run/2
          , run/3
          ]).
  
  %% Internal exports
  -export([ run/4
          ]).
  
  %%%_* Imports ==========================================================
  