anchor.diff:                      X when erlang:is_tuple(X) ->
                           {TLog1, X}
                   end;
  -            {number_add, _Key, X} when X == 0 -> % no op
  -                % note: tolerate integer and float
  -                {TLog0, {ok}};
               {number_add, Key, X} ->
                   {TLog1, Result1} = single_req(TLog0, {rdht_tx_read, Key}),
                   case Result1 of
                       {ok, OldValue} when erlang:is_number(OldValue) ->
  -                        NewValue = OldValue + X,
  -                        single_req(TLog1, {rdht_tx_write, Key, encode_value(NewValue)});
  +                        case X == 0 of % also accepts 0.0
  +                            true -> {TLog1, {ok}}; % no op
  +                            _ ->
  +                                NewValue = OldValue + X,
  +                                single_req(TLog1, {rdht_tx_write, Key, encode_value(NewValue)})
  +                        end;
                       {fail, not_found} ->
                           NewValue = X,
                           single_req(TLog1, {rdht_tx_write, Key, encode_value(NewValue)});
  
positive.code:             {commit} when AbortCommits ->
                  {TLog0, {fail, abort}};
              % special functions:
              {set_change, _Key, [], []} ->
                  {TLog0, {ok}};
              {set_change, Key, ToAdd, ToRemove} ->
                  {TLog1, Result1} = single_req(TLog0, {rdht_tx_read, Key}),
                  case Result1 of
                      {ok, OldValue} when erlang:is_list(OldValue) ->
                          NewValue1 = lists:append(ToAdd, OldValue),
                          NewValue2 = util:minus(NewValue1, ToRemove),
                          single_req(TLog1, {rdht_tx_write, Key, encode_value(NewValue2)});
                      {fail, not_found} ->
                          NewValue2 = util:minus(ToAdd, ToRemove),
                          single_req(TLog1, {rdht_tx_write, Key, encode_value(NewValue2)});
  
negative.code:         {write, Key, Value} ->
              map_phase1(Rest, Key, [{rdht_tx_write, Key, Value} | FirstReqs]);
          % special (2-steps) functions:
          {set_change, Key, _ToAdd, _ToRemove} ->
              map_phase1(Rest, Key, [{rdht_tx_read, Key} | FirstReqs]);
          {number_add, Key, _X} ->
              map_phase1(Rest, Key, [{rdht_tx_read, Key} | FirstReqs]);
          {test_and_set, Key, _Old, _New} ->
  