Index: protocol/src/main/java/geniusweb/protocol/NegoState.java
===================================================================
--- protocol/src/main/java/geniusweb/protocol/NegoState.java	(revision 47)
+++ protocol/src/main/java/geniusweb/protocol/NegoState.java	(revision 48)
@@ -1,3 +1,5 @@
 package geniusweb.protocol;
+
+import java.util.List;
 
 import com.fasterxml.jackson.annotation.JsonAutoDetect;
@@ -7,4 +9,5 @@
 import com.fasterxml.jackson.annotation.JsonTypeInfo;
 
+import geniusweb.protocol.session.SessionResult;
 import geniusweb.protocol.session.SessionState;
 import geniusweb.protocol.tournament.TournamentState;
@@ -40,3 +43,10 @@
 	boolean isFinal(long currentTimeMs);
 
+	/**
+	 * 
+	 * @return List of the{@link SessionResult}s. Each SessionResult is a short
+	 *         report of the final outcome. Assumes {@link #isFinal(long)}.
+	 *         result may be undefined if not.
+	 */
+	List<SessionResult> getResults();
 }
Index: protocol/src/main/java/geniusweb/protocol/session/SessionResult.java
===================================================================
--- protocol/src/main/java/geniusweb/protocol/session/SessionResult.java	(revision 47)
+++ protocol/src/main/java/geniusweb/protocol/session/SessionResult.java	(revision 48)
@@ -34,6 +34,10 @@
 	 *                     be null. Some of them may have entered later of left
 	 *                     early. This list should contain them all.
-	 * @param agreements   the final Agreements.
-	 * @param penalties    the penalties in [0,1] for each participant.
+	 * @param agreements   the final Agreements. The key is the party ID, value
+	 *                     is the bid that the party agreed on. Only parties
+	 *                     that reached an agreement are in this list.
+	 * @param penalties    Key is the party ID, the value is the penalties in
+	 *                     [0,1] for that participant. A penalty only applies to
+	 *                     an agreement, not to a reservation bid.
 	 * @param error        a fatal error that terminated the session. Non-fatal
 	 *                     errors (warnings) are not to be reported. Null if no
Index: protocol/src/main/java/geniusweb/protocol/session/SessionState.java
===================================================================
--- protocol/src/main/java/geniusweb/protocol/session/SessionState.java	(revision 47)
+++ protocol/src/main/java/geniusweb/protocol/session/SessionState.java	(revision 48)
@@ -65,10 +65,3 @@
 	Agreements getAgreements();
 
-	/**
-	 * 
-	 * @return the {@link SessionResult} which is a short report of the final
-	 *         outcome. Assumes {@link #isFinal(long)}. result may be undefined
-	 *         if not.
-	 */
-	SessionResult getResult();
 }
Index: protocol/src/main/java/geniusweb/protocol/session/amop/AMOPState.java
===================================================================
--- protocol/src/main/java/geniusweb/protocol/session/amop/AMOPState.java	(revision 47)
+++ protocol/src/main/java/geniusweb/protocol/session/amop/AMOPState.java	(revision 48)
@@ -1,4 +1,5 @@
 package geniusweb.protocol.session.amop;
 
+import java.util.Arrays;
 import java.util.Collections;
 import java.util.Comparator;
@@ -251,7 +252,7 @@
 
 	@Override
-	public SessionResult getResult() {
-		return new SessionResult(partyprofiles, getAgreements(),
-				Collections.emptyMap(), null);
+	public List<SessionResult> getResults() {
+		return Arrays.asList(new SessionResult(partyprofiles, getAgreements(),
+				Collections.emptyMap(), null));
 	}
 
Index: protocol/src/main/java/geniusweb/protocol/session/learn/LearnState.java
===================================================================
--- protocol/src/main/java/geniusweb/protocol/session/learn/LearnState.java	(revision 47)
+++ protocol/src/main/java/geniusweb/protocol/session/learn/LearnState.java	(revision 48)
@@ -1,4 +1,5 @@
 package geniusweb.protocol.session.learn;
 
+import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
@@ -68,7 +69,7 @@
 
 	@Override
-	public SessionResult getResult() {
-		return new SessionResult(getPartyProfiles(), getAgreements(),
-				Collections.emptyMap(), null);
+	public List<SessionResult> getResults() {
+		return Arrays.asList(new SessionResult(getPartyProfiles(),
+				getAgreements(), Collections.emptyMap(), null));
 	}
 
Index: protocol/src/main/java/geniusweb/protocol/session/mopac/MOPACState.java
===================================================================
--- protocol/src/main/java/geniusweb/protocol/session/mopac/MOPACState.java	(revision 47)
+++ protocol/src/main/java/geniusweb/protocol/session/mopac/MOPACState.java	(revision 48)
@@ -151,7 +151,7 @@
 
 	@Override
-	public SessionResult getResult() {
-		return new SessionResult(partyprofiles, getAgreements(),
-				Collections.emptyMap(), null);
+	public List<SessionResult> getResults() {
+		return Arrays.asList(new SessionResult(partyprofiles, getAgreements(),
+				Collections.emptyMap(), null));
 	}
 
Index: protocol/src/main/java/geniusweb/protocol/session/mopac2/MOPAC2State.java
===================================================================
--- protocol/src/main/java/geniusweb/protocol/session/mopac2/MOPAC2State.java	(revision 47)
+++ protocol/src/main/java/geniusweb/protocol/session/mopac2/MOPAC2State.java	(revision 48)
@@ -151,7 +151,7 @@
 
 	@Override
-	public SessionResult getResult() {
-		return new SessionResult(partyprofiles, getAgreements(),
-				Collections.emptyMap(), null);
+	public List<SessionResult> getResults() {
+		return Arrays.asList(new SessionResult(partyprofiles, getAgreements(),
+				Collections.emptyMap(), null));
 	}
 
Index: protocol/src/main/java/geniusweb/protocol/session/saop/SAOPState.java
===================================================================
--- protocol/src/main/java/geniusweb/protocol/session/saop/SAOPState.java	(revision 47)
+++ protocol/src/main/java/geniusweb/protocol/session/saop/SAOPState.java	(revision 48)
@@ -1,4 +1,5 @@
 package geniusweb.protocol.session.saop;
 
+import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashSet;
@@ -191,7 +192,7 @@
 
 	@Override
-	public SessionResult getResult() {
-		return new SessionResult(getPartyProfiles(), getAgreements(),
-				Collections.emptyMap(), getError());
+	public List<SessionResult> getResults() {
+		return Arrays.asList(new SessionResult(getPartyProfiles(),
+				getAgreements(), Collections.emptyMap(), getError()));
 	}
 
Index: protocol/src/main/java/geniusweb/protocol/session/shaop/BareSHAOPState.java
===================================================================
--- protocol/src/main/java/geniusweb/protocol/session/shaop/BareSHAOPState.java	(revision 47)
+++ protocol/src/main/java/geniusweb/protocol/session/shaop/BareSHAOPState.java	(revision 48)
@@ -1,4 +1,5 @@
 package geniusweb.protocol.session.shaop;
 
+import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashMap;
@@ -171,5 +172,5 @@
 
 	@Override
-	public SessionResult getResult() {
+	public List<SessionResult> getResults() {
 		Map<PartyId, Double> penalties = new HashMap<>();
 		for (PartyId party : partyNumbers.keySet()) {
@@ -185,6 +186,6 @@
 				.stream().collect(Collectors.toMap(pid -> pid, pid -> settings
 						.getAllParties().get(partyNumbers.get(pid))));
-		return new SessionResult(allparties, getAgreements(), penalties,
-				getError());
+		return Arrays.asList(new SessionResult(allparties, getAgreements(),
+				penalties, getError()));
 
 	}
Index: protocol/src/main/java/geniusweb/protocol/tournament/TournamentState.java
===================================================================
--- protocol/src/main/java/geniusweb/protocol/tournament/TournamentState.java	(revision 47)
+++ protocol/src/main/java/geniusweb/protocol/tournament/TournamentState.java	(revision 48)
@@ -3,6 +3,10 @@
 import com.fasterxml.jackson.annotation.JsonAutoDetect;
 import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility;
+import com.fasterxml.jackson.annotation.JsonSubTypes;
+import com.fasterxml.jackson.annotation.JsonSubTypes.Type;
 
 import geniusweb.protocol.NegoState;
+import geniusweb.protocol.tournament.allpermutations.AllPermutationsState;
+import geniusweb.protocol.tournament.allpermutationslearn.AllPermutationsLearnState;
 
 /**
@@ -13,4 +17,6 @@
  */
 @JsonAutoDetect(fieldVisibility = Visibility.ANY, getterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE)
+@JsonSubTypes({ @Type(value = AllPermutationsState.class),
+		@Type(value = AllPermutationsLearnState.class) })
 public interface TournamentState extends NegoState {
 
Index: protocol/src/main/java/geniusweb/protocol/tournament/allpermutations/AllPermutationsProtocol.java
===================================================================
--- protocol/src/main/java/geniusweb/protocol/tournament/allpermutations/AllPermutationsProtocol.java	(revision 47)
+++ protocol/src/main/java/geniusweb/protocol/tournament/allpermutations/AllPermutationsProtocol.java	(revision 48)
@@ -1,4 +1,5 @@
 package geniusweb.protocol.tournament.allpermutations;
 
+import java.util.List;
 import java.util.logging.Level;
 
@@ -81,6 +82,6 @@
 			long now = System.currentTimeMillis();
 			if (sessionstate.isFinal(now)) {
-				SessionResult result = sessionstate.getResult();
-				state = state.with(result);
+				List<SessionResult> results = sessionstate.getResults();
+				state = state.with(results);
 				notifyListeners(new CurrentNegoState(state));
 				if (!state.isFinal(now)) {
Index: protocol/src/main/java/geniusweb/protocol/tournament/allpermutations/AllPermutationsSettings.java
===================================================================
--- protocol/src/main/java/geniusweb/protocol/tournament/allpermutations/AllPermutationsSettings.java	(revision 47)
+++ protocol/src/main/java/geniusweb/protocol/tournament/allpermutations/AllPermutationsSettings.java	(revision 48)
@@ -67,4 +67,5 @@
 	protected final SessionSettings sessionsettings;
 	protected final int numberTournaments;
+	private final transient ImmutableList<SessionSettings> perms; // cache
 
 	/**
@@ -127,4 +128,6 @@
 		this.sessionsettings = sesettings;
 		this.numberTournaments = nTournaments;
+
+		this.perms = permutations1();
 	}
 
@@ -146,13 +149,20 @@
 	public TournamentProtocol getProtocol(Reporter logger) {
 		AllPermutationsState state = new AllPermutationsState(this,
-				permutations(), Collections.emptyList());
+				Collections.emptyList());
 		return new AllPermutationsProtocol(state, logger);
 	}
 
 	/**
-	 * @return {@link ImmutableList} containing all {@link SessionSettings} for
-	 *         all Sessions in the correct order.
+	 * @return All {@link SessionSettings} for the tournament, in the correct
+	 *         order.
 	 */
 	public ImmutableList<SessionSettings> permutations() {
+		return perms;
+	}
+
+	/**
+	 * @return list of all {@link SessionSettings} for this tournament
+	 */
+	private ImmutableList<SessionSettings> permutations1() {
 		ImmutableList<ImmutableList<TeamInfo>> partylistlist;
 		ImmutableList<Team> partieslist = new FixedList<Team>(teams);
Index: protocol/src/main/java/geniusweb/protocol/tournament/allpermutations/AllPermutationsState.java
===================================================================
--- protocol/src/main/java/geniusweb/protocol/tournament/allpermutations/AllPermutationsState.java	(revision 47)
+++ protocol/src/main/java/geniusweb/protocol/tournament/allpermutations/AllPermutationsState.java	(revision 48)
@@ -5,8 +5,10 @@
 import java.util.List;
 
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
 import geniusweb.protocol.session.SessionResult;
 import geniusweb.protocol.session.SessionSettings;
 import geniusweb.protocol.tournament.TournamentState;
-import tudelft.utilities.immutablelist.ImmutableList;
 
 /**
@@ -16,13 +18,12 @@
 
 	protected final AllPermutationsSettings toursettings; // original settings
-	protected final ImmutableList<SessionSettings> sessionsettings;
 	// limited to MAX_INT elements. But we need to store results anyway
 	protected final List<SessionResult> results;
 
-	public AllPermutationsState(AllPermutationsSettings toursettings,
-			ImmutableList<SessionSettings> settings,
-			List<SessionResult> results) {
+	@JsonCreator
+	public AllPermutationsState(
+			@JsonProperty("toursettings") AllPermutationsSettings toursettings,
+			@JsonProperty("results") List<SessionResult> results) {
 		this.toursettings = toursettings;
-		this.sessionsettings = settings;
 		this.results = results;
 	}
@@ -34,5 +35,5 @@
 	@Override
 	public boolean isFinal(long currentTimeMs) {
-		return sessionsettings.size().intValue() == results.size();
+		return toursettings.permutations().size().intValue() == results.size();
 	}
 
@@ -43,5 +44,6 @@
 		if (isFinal(0l))
 			return null;
-		return sessionsettings.get(BigInteger.valueOf(results.size()));
+		return toursettings.permutations()
+				.get(BigInteger.valueOf(results.size()));
 	}
 
@@ -53,5 +55,5 @@
 	 *                                  matching the expected participants
 	 */
-	public AllPermutationsState with(SessionResult result) {
+	public AllPermutationsState with(List<SessionResult> res) {
 		// FIXME do we really need this? Why is this not working?
 		// if (!new HashSet<PartyWithProfile>(getNextSettings().getAllParties())
@@ -60,7 +62,6 @@
 		// }
 		ArrayList<SessionResult> newresults = new ArrayList<>(results);
-		newresults.add(result);
-		return new AllPermutationsState(toursettings, sessionsettings,
-				newresults);
+		newresults.addAll(res);
+		return new AllPermutationsState(toursettings, newresults);
 	}
 
@@ -70,5 +71,5 @@
 	 */
 	public BigInteger getSize() {
-		return sessionsettings.size();
+		return toursettings.permutations().size();
 	}
 
Index: protocol/src/main/java/geniusweb/protocol/tournament/allpermutationslearn/AllPermutationsLearnSettings.java
===================================================================
--- protocol/src/main/java/geniusweb/protocol/tournament/allpermutationslearn/AllPermutationsLearnSettings.java	(revision 47)
+++ protocol/src/main/java/geniusweb/protocol/tournament/allpermutationslearn/AllPermutationsLearnSettings.java	(revision 48)
@@ -59,4 +59,5 @@
 
 	private final LearnSettings learnSettings;
+	private final transient ImmutableList<SessionSettings> perms2; // cache
 
 	/**
@@ -96,4 +97,5 @@
 				nTournaments);
 		this.learnSettings = learnSet;
+		this.perms2 = permutations2();
 	}
 
@@ -101,5 +103,5 @@
 	public TournamentProtocol getProtocol(Reporter logger) {
 		AllPermutationsLearnState state = new AllPermutationsLearnState(this,
-				permutations(), Collections.emptyList());
+				Collections.emptyList());
 		return new AllPermutationsLearnProtocol(state, logger);
 	}
@@ -112,10 +114,15 @@
 	}
 
+	@Override
+	public ImmutableList<SessionSettings> permutations() {
+		return this.perms2;
+	}
+
 	/**
 	 * @return {@link ImmutableList} containing all {@link SessionSettings} for
-	 *         all Sessions in the correct order.
-	 */
-	@Override
-	public ImmutableList<SessionSettings> permutations() {
+	 *         all Sessions in the correct order. Overrides the parent version
+	 *         of this.
+	 */
+	protected ImmutableList<SessionSettings> permutations2() {
 
 		ImmutableList<ImmutableList<TeamInfo>> partylistlist;
Index: protocol/src/main/java/geniusweb/protocol/tournament/allpermutationslearn/AllPermutationsLearnState.java
===================================================================
--- protocol/src/main/java/geniusweb/protocol/tournament/allpermutationslearn/AllPermutationsLearnState.java	(revision 47)
+++ protocol/src/main/java/geniusweb/protocol/tournament/allpermutationslearn/AllPermutationsLearnState.java	(revision 48)
@@ -4,8 +4,10 @@
 import java.util.List;
 
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
 import geniusweb.protocol.session.SessionResult;
-import geniusweb.protocol.session.SessionSettings;
+import geniusweb.protocol.tournament.allpermutations.AllPermutationsSettings;
 import geniusweb.protocol.tournament.allpermutations.AllPermutationsState;
-import tudelft.utilities.immutablelist.ImmutableList;
 
 /**
@@ -14,8 +16,9 @@
 public class AllPermutationsLearnState extends AllPermutationsState {
 
-	public AllPermutationsLearnState(AllPermutationsLearnSettings toursettings,
-			ImmutableList<SessionSettings> settings,
-			List<SessionResult> results) {
-		super(toursettings, settings, results);
+	@JsonCreator
+	public AllPermutationsLearnState(
+			@JsonProperty("toursettings") AllPermutationsSettings toursettings,
+			@JsonProperty("results") List<SessionResult> results) {
+		super(toursettings, results);
 	}
 
@@ -28,10 +31,9 @@
 	 */
 	@Override
-	public AllPermutationsLearnState with(SessionResult result) {
+	public AllPermutationsLearnState with(List<SessionResult> result) {
 		ArrayList<SessionResult> newresults = new ArrayList<>(results);
-		newresults.add(result);
+		newresults.addAll(result);
 		return new AllPermutationsLearnState(
-				(AllPermutationsLearnSettings) toursettings, sessionsettings,
-				newresults);
+				(AllPermutationsLearnSettings) toursettings, newresults);
 	}
 
