anchor.diff:  %% rpc endpoints
   %%  call to with_db will supply your M:F with a #db{} and then remaining args
   
  -changes(DbName, #changes_args{} = Args, StartSeq) ->
  -    changes(DbName, [Args], StartSeq);
  -changes(DbName, Options, StartVector) ->
  +%% @equiv changes(DbName, Args, StartSeq, [])
  +changes(DbName, Args, StartSeq) ->
  +    changes(DbName, Args, StartSeq, []).
  +
  +changes(DbName, #changes_args{} = Args, StartSeq, DbOptions) ->
  +    changes(DbName, [Args], StartSeq, DbOptions);
  +changes(DbName, Options, StartVector, DbOptions) ->
       erlang:put(io_priority, {interactive, DbName}),
       #changes_args{dir=Dir} = Args = lists:keyfind(changes_args, 1, Options),
  -    case get_or_create_db(DbName, []) of
  +    case get_or_create_db(DbName, DbOptions) of
       {ok, Db} ->
           StartSeq = calculate_start_seq(Db, node(), StartVector),
           Enum = fun changes_enumerator/2,
  
positive.code:     VAcc0 = #vacc{db=Db},
      couch_mrview:query_all_docs(Db, Args, fun view_cb/2, VAcc0).
  
  map_view(DbName, DDoc, ViewName, Args0) ->
      Args = fix_skip_and_limit(Args0),
      {ok, Db} = get_or_create_db(DbName, []),
      VAcc0 = #vacc{db=Db},
      couch_mrview:query_view(Db, DDoc, ViewName, Args, fun view_cb/2, VAcc0).
  
  reduce_view(DbName, DDoc, ViewName, Args0) ->
      Args = fix_skip_and_limit(Args0),
      {ok, Db} = get_or_create_db(DbName, []),
      VAcc0 = #vacc{db=Db},
      couch_mrview:query_view(Db, DDoc, ViewName, Args, fun reduce_cb/2, VAcc0).
  
  
negative.code:     Docs = make_att_readers(Docs0),
      with_db(DbName, Options, {couch_db, update_docs, [Docs, Options, X]}).
  
  %% @equiv group_info(DbName, DDocId, [])
  group_info(DbName, DDocId) ->
      group_info(DbName, DDocId, []).
  
  group_info(DbName, DDocId, DbOptions) ->
      with_db(DbName, DbOptions, {couch_mrview, get_info, [DDocId]}).
  
  reset_validation_funs(DbName) ->
      case get_or_create_db(DbName, []) of
  