anchor.diff:          Other -> Other
       end.
   
  -prepare_locks([], _, Locks, Unlocks, _Dict) ->
  +prepare_locks([], _, Locks, Unlocks, _Dict, _AltDeps) ->
       {Locks, Unlocks};
  -prepare_locks([Name|Names], Deps, Locks, Unlocks, Dict) ->
  +prepare_locks([Name|Names], Deps, Locks, Unlocks, Dict, AltDeps) ->
       AtomName = binary_to_atom(Name, utf8),
       case lists:keyfind(Name, 1, Locks) of
           {_, _, 0} = Lock ->
               case rebar_utils:tup_find(AtomName, Deps) of
                   false ->
                       ?WARN("Dependency ~s has been removed and will not be upgraded", [Name]),
  -                    prepare_locks(Names, Deps, Locks, Unlocks, Dict);
  +                    prepare_locks(Names, Deps, Locks, Unlocks, Dict, AltDeps);
                   Dep ->
                       {Source, NewLocks, NewUnlocks} = prepare_lock(Dep, Lock, Locks, Dict),
                       prepare_locks(Names, Deps, NewLocks,
  -                                  [{Name, Source, 0} | NewUnlocks ++ Unlocks], Dict)
  +                                  [{Name, Source, 0} | NewUnlocks ++ Unlocks], Dict, AltDeps)
               end;
           {_, _, Level} = Lock when Level > 0 ->
               case rebar_utils:tup_find(AtomName, Deps) of
  
positive.code:                 Dep -> % Dep has been promoted
                      {Source, NewLocks, NewUnlocks} = prepare_lock(Dep, Lock, Locks, Dict),
                      prepare_locks(Names, Deps, NewLocks,
                                    [{Name, Source, 0} | NewUnlocks ++ Unlocks], Dict)
              end;
          false ->
              ?PRV_ERROR({unknown_dependency, Name})
      end.
  
  prepare_lock(Dep, Lock, Locks, Dict) ->
  
negative.code:                    is_atom(Dep) orelse is_atom(element(1, Dep))],
      Names = parse_names(ec_cnv:to_binary(proplists:get_value(package, Args, <<"">>)), Locks),
      DepsDict = deps_dict(rebar_state:all_deps(State)),
      %% Find alternative deps in non-default profiles since they may
      %% need to be passed through (they are never locked)
      AltProfiles = rebar_state:current_profiles(State) -- [default],
      AltProfileDeps = lists:append([
          rebar_state:get(State, {deps, Profile}, []) || Profile <- AltProfiles]
      ),
      AltDeps = [Dep || Dep <- AltProfileDeps,
                        is_atom(Dep) orelse is_atom(element(1, Dep))
                        andalso not lists:member(Dep, Deps)],
      case prepare_locks(Names, Deps, Locks, [], DepsDict, AltDeps) of
          {error, Reason} ->
              {error, Reason};
          {Locks0, _Unlocks0} ->
  