anchor.diff:  -export([start/6,start/7]).
   -export([start_link/3,start_link/6,start_link/7]).
   -ifdef(TEST).
  --export([test_link/4, test_link/8]).
  +-export([test_link/4]).
   -endif.
   -export([init/1, handle_event/3, handle_sync_event/4,
            handle_info/3, terminate/3, code_change/4]).
  --export([prepare/2, validate/2, execute/2, waiting_vnode/2, postcommit/2]).
  +-export([prepare/2, validate/2, execute/2, waiting_vnode/2, postcommit/2, finish/2]).
  +
  +
  +-type detail_info() :: timing.
  +-type detail() :: true |
  +                  false |
  +                  [detail_info()].
   
   -type option() :: {w, pos_integer()} |
                     {dw, pos_integer()} |
  -                  {timeout, pos_integer() | infinity}.
  +                  {timeout, pos_integer() | infinity} |
  +                  {detail, detail()}
   -type options() :: [option()].
   
   -record(state, {from :: {raw, integer(), pid()},
  
positive.code:                 num_fail = 0 :: non_neg_integer(),
                  w_fail_threshold :: undefined | non_neg_integer(),
                  dw_fail_threshold :: undefined | non_neg_integer(),
                  final_obj :: undefined | riak_object:riak_object()
                 }).
  
  
  
negative.code:     StateData1 = add_vnode_result(Reply, StateData),
      {next_state, postcommit, StateData1, 0}.
  
  finish(timeout, StateData = #state{timing = Timing, reply = Reply}) ->
      case Reply of
          {error, _} ->
              ok;
          _Ok ->
              %% TODO: Improve reporting of timing
              %% For now can add debug tracers to view the return from calc_timing
              {Duration, _Stages} = calc_timing(Timing),
              riak_kv_stat:update({put_fsm_time, Duration})
      end,
      {stop, normal, StateData};
  finish(Reply, StateData) -> % late responses - add to state
      StateData1 = add_vnode_result(Reply, StateData),
      {next_state, finish, StateData1, 0}.
  
  %% @private
  handle_event(_Event, _StateName, StateData) ->
  