anchor.diff:  is_joined(Node, Cluster) ->
       lists:member(Node, Cluster).
   
  -cluster_commands(#state{joined_nodes=JoinedNodes}) ->
  +cluster_commands(_State) ->
       [
  -    {call, ?MODULE, sync_join_cluster, [node_name(), JoinedNodes]},
  -    {call, ?MODULE, sync_leave_cluster, [node_name(), JoinedNodes]}
  +    % TODO: Disabled, because nodes shutdown on removal from the cluster.
  +    % {call, ?MODULE, sync_join_cluster, [node_name(), node_name()]},
  +    {call, ?MODULE, sync_leave_cluster, [node_name()]}
       ].
   
   name_to_nodename(Name) ->
  
positive.code:             precondition_debug("precondition sync_join_cluster: no nodes left to join.", []),
              false %% Might need to be changed when there's no read/write operations.
      end;
  precondition(#state{joined_nodes=JoinedNodes}, {call, _Mod, sync_leave_cluster, [Node, JoinedNodes]}) -> 
      %% Only allow dropping of the last node in the join list, for ease of debugging.
      precondition_debug("precondition sync_leave_cluster: invoked for node ~p joined_nodes ~p", [Node, JoinedNodes]),
  
  
negative.code: wait_until_nodes_agree_on_membership(Nodes) ->
      AgreementFun = fun(Node) ->
          %% Get membership at node.
          {ok, Members} = rpc:call(Node, ?MANAGER, members, []),
  
          %% Sort.
          SortedNodes = lists:usort(Nodes),
          SortedMembers = lists:usort(Members),
  
          %% Ensure the lists are the same -- barrier for proceeding.
          case SortedNodes =:= SortedMembers of
              true ->
                  debug("node ~p agrees on membership: ~p", 
                        [Node, SortedMembers]),
                  true;
              false ->
                  debug("node ~p disagrees on membership: ~p != ~p", 
                        [Node, SortedMembers, SortedNodes]),
                  error
          end
      end,
  