anchor.diff:  
       %% Get all running nodes, because we need the list of *everything*
       %% to analyze the graph for connectedness.
  -    ClientsFromMarathon = clients_from_marathon(),
  -    ServersFromMarathon = servers_from_marathon(),
  -    Nodes = sets:union(ClientsFromMarathon, ServersFromMarathon),
  +    Clients = clients_from_marathon(),
  +    Servers = servers_from_marathon(),
  +    ServerNames = node_names(sets:to_list(Servers)),
  +    ClientNames = node_names(sets:to_list(Clients)),
  +    Root = hd(ServerNames),
  +    Nodes = ServerNames ++ ClientNames,
  +
  +    %% Build the tree.
  +    Tree = digraph:new(),
  +    populate_tree(Root, Nodes, Tree),
   
       %% Build the graph.
       Graph = digraph:new(),
  -
  -    %% Get bucket name.
  -    BucketName = bucket_name(),
  -
  -    GraphFun = fun({N, _, _}=Peer, OrphanedNodes) ->
  -                       Node = prefix(atom_to_list(N)),
  -                       try
  -                           Result = erlcloud_s3:get_object(BucketName, Node),
  -                           Body = proplists:get_value(content, Result, undefined),
  -                           case Body of
  -                               undefined ->
  -                                   OrphanedNodes;
  -                               _ ->
  -                                   Membership = binary_to_term(Body),
  -                                   case Membership of
  -                                       [N] ->
  -                                           populate_graph(N, [], Graph),
  -                                           [Peer|OrphanedNodes];
  -                                       _ ->
  -                                           populate_graph(N, Membership, Graph),
  -                                           OrphanedNodes
  -                                   end
  -                           end
  -                       catch
  -                           _:{aws_error, Error} ->
  -                               populate_graph(N, [], Graph),
  -                               lager:info("Could not get graph object; ~p", [Error]),
  -                               OrphanedNodes
  -                       end
  -               end,
  -
  -    Orphaned = sets:fold(GraphFun, [], Nodes),
  +    Orphaned = populate_graph(Nodes, Graph),
   
       {SymmetricViews, VisitedNames} = breath_first(node(), Graph, ordsets:new()),
       AllNodesVisited = sets:size(Nodes) == length(VisitedNames),
  
positive.code:     [Name|node_names(T)].
  
  %% @private
  populate_tree(Root, Nodes, Tree) ->
      DebugTree = plumtree_broadcast:debug_get_tree(Root, Nodes),
      lists:foreach(
          fun({Node, Peers}) ->
              case Peers of
                  down ->
                      populate_graph(Node, [], Tree);
                  {Eager, _Lazy} ->
                      populate_graph(Node, Eager, Tree)
              end
          end,
          DebugTree
      ).
  
negative.code: 
      ServerNames = node_names(sets:to_list(Servers)),
      ClientNames = node_names(sets:to_list(Clients)),
      Nodes = ServerNames ++ ClientNames,
  
      schedule_membership_refresh(),
  
      {noreply, State#state{nodes=Nodes,
                            servers=ServerNames,
                            attempted_nodes=AttemptedNodes}};
  
  handle_info(?ARTIFACT_MESSAGE, State) ->
      %% Get bucket name.
  