Index: protocol/src/main/java/geniusweb/protocol/NegoProtocol.java
===================================================================
--- protocol/src/main/java/geniusweb/protocol/NegoProtocol.java	(revision 8)
+++ protocol/src/main/java/geniusweb/protocol/NegoProtocol.java	(revision 9)
@@ -10,5 +10,5 @@
 import geniusweb.events.CurrentState;
 import geniusweb.events.ProtocolEvent;
-import geniusweb.protocol.partyconnection.ConnectionWithPartyFactory;
+import geniusweb.protocol.partyconnection.ProtocolToPartyConnFactory;
 import geniusweb.protocol.session.SessionProtocol;
 import geniusweb.protocol.session.SessionSettings;
@@ -70,9 +70,9 @@
 	 * 
 	 * 
-	 * @param connectionfactory the {@link ConnectionWithPartyFactory} that allows
+	 * @param connectionfactory the {@link ProtocolToPartyConnFactory} that allows
 	 *                          the protocol to connect with the {@link Reference}s
 	 *                          in the settings
 	 */
-	void start(ConnectionWithPartyFactory connectionfactory);
+	void start(ProtocolToPartyConnFactory connectionfactory);
 
 	/**
Index: protocol/src/main/java/geniusweb/protocol/partyconnection/ProtocolToPartyConn.java
===================================================================
--- protocol/src/main/java/geniusweb/protocol/partyconnection/ProtocolToPartyConn.java	(revision 9)
+++ protocol/src/main/java/geniusweb/protocol/partyconnection/ProtocolToPartyConn.java	(revision 9)
@@ -0,0 +1,19 @@
+package geniusweb.protocol.partyconnection;
+
+import geniusweb.actions.Action;
+import geniusweb.actions.PartyId;
+import geniusweb.connection.ConnectionEnd;
+import geniusweb.party.inform.Inform;
+
+/**
+ * Connection of the protocol with a party. Note, this is the opposite direction
+ * of a connection of the party with the protocol.
+ */
+public interface ProtocolToPartyConn extends ConnectionEnd<Action, Inform> {
+
+	/**
+	 * 
+	 * @return the partyId of the party that this connects to
+	 */
+	PartyId getParty();
+}
Index: protocol/src/main/java/geniusweb/protocol/partyconnection/ProtocolToPartyConnFactory.java
===================================================================
--- protocol/src/main/java/geniusweb/protocol/partyconnection/ProtocolToPartyConnFactory.java	(revision 9)
+++ protocol/src/main/java/geniusweb/protocol/partyconnection/ProtocolToPartyConnFactory.java	(revision 9)
@@ -0,0 +1,39 @@
+package geniusweb.protocol.partyconnection;
+
+import java.io.IOException;
+import java.util.List;
+
+import geniusweb.actions.Action;
+import geniusweb.connection.ConnectionFactory;
+import geniusweb.party.inform.Inform;
+import geniusweb.references.Reference;
+import tudelft.utilities.repository.NoResourcesNowException;
+
+/**
+ * An extended {@link ConnectionFactory} that store PartyIDs with the
+ * connections, making it possible to find back the appropriate connection given
+ * a PartyID. Also, it allows the connection factory to actually assign the
+ * PartyIDs.
+ *
+ */
+public interface ProtocolToPartyConnFactory
+		extends ConnectionFactory<Action, Inform> {
+	@Override
+	public ProtocolToPartyConn connect(Reference reference)
+			throws IOException, NoResourcesNowException;
+
+	/**
+	 * Connects a set of References in one go, following a modified Banker's
+	 * algorthm.
+	 * 
+	 * @param references the list of references to connect with
+	 * @return a List of connections, one fore each Reference.
+	 * @throws IOException             if a connection is failing irrecoverably.
+	 * @throws NoResourcesNowException is there are insufficient resources now.
+	 *                                 This also includes a suggested moment to
+	 *                                 retry.
+	 */
+	List<ProtocolToPartyConn> connect(List<Reference> references)
+			throws IOException, NoResourcesNowException;
+
+}
Index: protocol/src/main/java/geniusweb/protocol/partyconnection/ProtocolToPartyConnections.java
===================================================================
--- protocol/src/main/java/geniusweb/protocol/partyconnection/ProtocolToPartyConnections.java	(revision 9)
+++ protocol/src/main/java/geniusweb/protocol/partyconnection/ProtocolToPartyConnections.java	(revision 9)
@@ -0,0 +1,123 @@
+package geniusweb.protocol.partyconnection;
+
+import java.io.IOException;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import geniusweb.actions.PartyId;
+import geniusweb.party.inform.Inform;
+
+/**
+ * Contains all parties with their connections. immutable
+ */
+public class ProtocolToPartyConnections implements Iterable<ProtocolToPartyConn> {
+	private List<ProtocolToPartyConn> connections;
+
+	public ProtocolToPartyConnections(List<ProtocolToPartyConn> connections) {
+		this.connections = connections;
+	}
+
+	/**
+	 * @param id the {@link PartyId} needed
+	 * @return a connection with that party, or null if no such connection.
+	 */
+	public ProtocolToPartyConn get(PartyId id) {
+		return connections.stream().filter(conn -> id.equals(conn.getParty()))
+				.findAny().orElse(null);
+	}
+
+	/**
+	 * 
+	 * @return true iff all parties have one connection only
+	 */
+	public boolean allunique() {
+		return getParties().size() == connections.size();
+	}
+
+	/**
+	 * 
+	 * @return list of parties currently in the connections.
+	 */
+	private List<PartyId> getParties() {
+		return connections.stream().map(conn -> conn.getParty()).distinct()
+				.collect(Collectors.toList());
+	}
+
+	/**
+	 * Broadcast info to all parties
+	 * 
+	 * @param info the {@link Inform} to broadcast
+	 */
+	public void broadcast(Inform info) throws IOException {
+		for (ProtocolToPartyConn conn : connections) {
+			conn.send(info);
+		}
+	}
+
+	/**
+	 * 
+	 * @return number of connections available
+	 */
+	public int size() {
+		return connections.size();
+	}
+
+	/**
+	 * @param i
+	 * @return the ith connection
+	 */
+	public ProtocolToPartyConn get(int i) {
+		return connections.get(i);
+	}
+
+	public Stream<ProtocolToPartyConn> stream() {
+		return connections.stream();
+	}
+
+	@Override
+	public Iterator<ProtocolToPartyConn> iterator() {
+		return connections.iterator();
+	}
+
+	public ProtocolToPartyConnections with(ProtocolToPartyConn conn) {
+		List<ProtocolToPartyConn> newconnections = new LinkedList<>(
+				connections);
+		newconnections.add(conn);
+		return new ProtocolToPartyConnections(newconnections);
+	}
+
+	@Override
+	public String toString() {
+		return "ConnectionWithParties" + connections;
+	}
+
+	@Override
+	public int hashCode() {
+		final int prime = 31;
+		int result = 1;
+		result = prime * result
+				+ ((connections == null) ? 0 : connections.hashCode());
+		return result;
+	}
+
+	@Override
+	public boolean equals(Object obj) {
+		if (this == obj)
+			return true;
+		if (obj == null)
+			return false;
+		if (getClass() != obj.getClass())
+			return false;
+		ProtocolToPartyConnections other = (ProtocolToPartyConnections) obj;
+		if (connections == null) {
+			if (other.connections != null)
+				return false;
+		} else if (!connections.equals(other.connections))
+			return false;
+		return true;
+	}
+
+}
Index: protocol/src/main/java/geniusweb/protocol/session/DefaultSessionState.java
===================================================================
--- protocol/src/main/java/geniusweb/protocol/session/DefaultSessionState.java	(revision 8)
+++ protocol/src/main/java/geniusweb/protocol/session/DefaultSessionState.java	(revision 9)
@@ -10,5 +10,5 @@
 import geniusweb.progress.Progress;
 import geniusweb.protocol.ProtocolException;
-import geniusweb.protocol.partyconnection.ConnectionWithParties;
+import geniusweb.protocol.partyconnection.ProtocolToPartyConnections;
 import geniusweb.references.PartyWithProfile;
 
@@ -19,5 +19,5 @@
 	private final List<Action> actions;
 
-	private final transient ConnectionWithParties connections;
+	private final transient ProtocolToPartyConnections connections;
 
 	private final Progress progress;
@@ -60,5 +60,5 @@
 	 */
 	public DefaultSessionState(List<Action> actions,
-			ConnectionWithParties conns, Progress progr,
+			ProtocolToPartyConnections conns, Progress progr,
 			SessionSettings settings,
 			Map<PartyId, PartyWithProfile> partyprofiles, ProtocolException e) {
@@ -67,5 +67,5 @@
 		}
 		if (conns == null) {
-			this.connections = new ConnectionWithParties(
+			this.connections = new ProtocolToPartyConnections(
 					Collections.EMPTY_LIST);
 		} else {
@@ -92,5 +92,5 @@
 	 * @return existing connections.
 	 */
-	public ConnectionWithParties getConnections() {
+	public ProtocolToPartyConnections getConnections() {
 		return connections;
 	}
Index: protocol/src/main/java/geniusweb/protocol/session/saop/SAOP.java
===================================================================
--- protocol/src/main/java/geniusweb/protocol/session/saop/SAOP.java	(revision 8)
+++ protocol/src/main/java/geniusweb/protocol/session/saop/SAOP.java	(revision 9)
@@ -23,6 +23,6 @@
 import geniusweb.protocol.CurrentNegoState;
 import geniusweb.protocol.ProtocolException;
-import geniusweb.protocol.partyconnection.ConnectionWithParty;
-import geniusweb.protocol.partyconnection.ConnectionWithPartyFactory;
+import geniusweb.protocol.partyconnection.ProtocolToPartyConn;
+import geniusweb.protocol.partyconnection.ProtocolToPartyConnFactory;
 import geniusweb.protocol.session.SessionProtocol;
 import geniusweb.protocol.session.SessionSettings;
@@ -95,5 +95,5 @@
 	@Override
 	public synchronized void start(
-			ConnectionWithPartyFactory connectionfactory) {
+			ProtocolToPartyConnFactory connectionfactory) {
 
 		try {
@@ -151,5 +151,5 @@
 	 */
 	protected synchronized void connect(
-			ConnectionWithPartyFactory connectionfactory)
+			ProtocolToPartyConnFactory connectionfactory)
 			throws InterruptedException, IOException {
 		List<PartyWithProfile> participants = state.getSettings()
@@ -158,5 +158,5 @@
 				.map(parti -> (parti.getParty().getPartyRef()))
 				.collect(Collectors.toList());
-		List<ConnectionWithParty> connections = null;
+		List<ProtocolToPartyConn> connections = null;
 		log.log(Level.INFO, "SAOP connect " + parties);
 		while (connections == null) {
@@ -218,9 +218,9 @@
 	 */
 	protected synchronized void setupParties() throws ProtocolException {
-		for (ConnectionWithParty conn : state.getConnections()) {
+		for (ProtocolToPartyConn conn : state.getConnections()) {
 			conn.addListener(action -> actionRequest(conn, action));
 		}
 
-		for (ConnectionWithParty connection : state.getConnections()) {
+		for (ProtocolToPartyConn connection : state.getConnections()) {
 			try {
 				sendSettings(connection);
@@ -239,5 +239,5 @@
 	 * @throws IOException if party got disconnected
 	 */
-	private synchronized void sendSettings(ConnectionWithParty connection)
+	private synchronized void sendSettings(ProtocolToPartyConn connection)
 			throws IOException {
 		PartyId partyid = connection.getParty();
@@ -261,9 +261,13 @@
 	 */
 	protected synchronized void actionRequest(
-			final ConnectionWithParty partyconn, final Action action) {
+			final ProtocolToPartyConn partyconn, final Action action) {
 		if (action == null) {
-			handleError(partyconn
-					+ " did null action, breaching the protocol. Closing session",
-					partyconn.getParty().getName(), null);
+			Throwable err = partyconn.getError();
+			if (err == null) {
+				err = new ProtocolException("Party sent a null action",
+						partyconn.getParty().getName());
+			}
+			handleError(partyconn + "Protocol error",
+					partyconn.getParty().getName(), err);
 			return;
 		}
@@ -348,11 +352,11 @@
 			return;
 		Inform finished = new Finished(state.getAgreement());
-		for (ConnectionWithParty conn : state.getConnections()) {
+		for (ProtocolToPartyConn conn : state.getConnections()) {
 			sendFinish(conn, finished);
 		}
-		notifyChange(new CurrentNegoState(state));
-	}
-
-	private void sendFinish(ConnectionWithParty connection, Inform finished) {
+		notifyListeners(new CurrentNegoState(state));
+	}
+
+	private void sendFinish(ProtocolToPartyConn connection, Inform finished) {
 		try {
 			connection.send(finished);
Index: protocol/src/main/java/geniusweb/protocol/session/saop/SAOPState.java
===================================================================
--- protocol/src/main/java/geniusweb/protocol/session/saop/SAOPState.java	(revision 8)
+++ protocol/src/main/java/geniusweb/protocol/session/saop/SAOPState.java	(revision 9)
@@ -16,6 +16,6 @@
 import geniusweb.progress.ProgressRounds;
 import geniusweb.protocol.ProtocolException;
-import geniusweb.protocol.partyconnection.ConnectionWithParties;
-import geniusweb.protocol.partyconnection.ConnectionWithParty;
+import geniusweb.protocol.partyconnection.ProtocolToPartyConnections;
+import geniusweb.protocol.partyconnection.ProtocolToPartyConn;
 import geniusweb.protocol.session.DefaultSessionState;
 import geniusweb.protocol.session.SessionSettings;
@@ -42,5 +42,5 @@
 	 *                      occurred.
 	 */
-	public SAOPState(List<Action> actions, ConnectionWithParties conns,
+	public SAOPState(List<Action> actions, ProtocolToPartyConnections conns,
 			Progress progress, SessionSettings settings,
 			Map<PartyId, PartyWithProfile> partyprofiles, ProtocolException e) {
@@ -55,5 +55,5 @@
 	public SAOPState(SAOPSettings settings) {
 		this(Collections.emptyList(),
-				new ConnectionWithParties(Collections.emptyList()), null,
+				new ProtocolToPartyConnections(Collections.emptyList()), null,
 				settings, null, null);
 
@@ -82,5 +82,5 @@
 	/**
 	 * 
-	 * @param connection   the new {@link ConnectionWithParty}
+	 * @param connection   the new {@link ProtocolToPartyConn}
 	 * @param partyprofile the {@link PartyWithProfile} that is associated with
 	 *                     this state
@@ -91,8 +91,8 @@
 	 *         state currently indicate if that already happened or not.
 	 */
-	public SAOPState with(ConnectionWithParty connection,
+	public SAOPState with(ProtocolToPartyConn connection,
 			PartyWithProfile partyprofile) {
 		// Only called from the SAOP initialization phase.
-		ConnectionWithParties newconns = getConnections().with(connection);
+		ProtocolToPartyConnections newconns = getConnections().with(connection);
 		Map<PartyId, PartyWithProfile> newprofiles = new HashMap<>(
 				getPartyProfiles());
Index: protocol/src/main/java/geniusweb/protocol/tournament/allpermutations/AllPermutationsProtocol.java
===================================================================
--- protocol/src/main/java/geniusweb/protocol/tournament/allpermutations/AllPermutationsProtocol.java	(revision 8)
+++ protocol/src/main/java/geniusweb/protocol/tournament/allpermutations/AllPermutationsProtocol.java	(revision 9)
@@ -7,5 +7,5 @@
 import geniusweb.protocol.CurrentNegoState;
 import geniusweb.protocol.SessionResult;
-import geniusweb.protocol.partyconnection.ConnectionWithPartyFactory;
+import geniusweb.protocol.partyconnection.ProtocolToPartyConnFactory;
 import geniusweb.protocol.session.SessionProtocol;
 import geniusweb.protocol.session.SessionSettings;
@@ -29,5 +29,5 @@
 	private final transient Reporter log;
 
-	private ConnectionWithPartyFactory connectionFactory; // FINAL
+	private ProtocolToPartyConnFactory connectionFactory; // FINAL
 	private AllPermutationsState state; // MUTABLE
 
@@ -45,7 +45,7 @@
 
 	@Override
-	public void start(ConnectionWithPartyFactory connectionfactory) {
+	public void start(ProtocolToPartyConnFactory connectionfactory) {
 		this.connectionFactory = connectionfactory;
-		notifyChange(new TournamentStarted(state.getSize().longValue()));
+		notifyListeners(new TournamentStarted(state.getSize().longValue()));
 		startNextSession();
 	}
@@ -85,5 +85,5 @@
 						sessionstate.getAgreement(), sessionstate.getError());
 				state = state.with(result);
-				notifyChange(new CurrentNegoState(state));
+				notifyListeners(new CurrentNegoState(state));
 				if (!state.isFinal(now)) {
 					startNextSession();
