Index: simplerunner/pom.xml
===================================================================
--- simplerunner/pom.xml	(revision 14)
+++ simplerunner/pom.xml	(revision 18)
@@ -6,5 +6,5 @@
 	<groupId>geniusweb</groupId>
 	<artifactId>simplerunner</artifactId>
-	<version>1.4.0</version>
+	<version>1.4.1</version> <!-- must equal ${geniusweb.version} -->
 	<packaging>jar</packaging>
 
@@ -17,4 +17,5 @@
 		<passwd>${env.ARTIFACTORY_PASS}</passwd>
 		<jackson-2-version>2.9.10</jackson-2-version>
+		<geniusweb.version>1.4.1</geniusweb.version>
 	</properties>
 
@@ -31,28 +32,34 @@
 			<groupId>geniusweb</groupId>
 			<artifactId>protocol</artifactId>
-			<version>1.4.0</version>
+			<version>${geniusweb.version}</version>
 		</dependency>
 		<dependency>
 			<groupId>geniusweb</groupId>
 			<artifactId>party</artifactId>
-			<version>1.4.0</version>
+			<version>${geniusweb.version}</version>
 		</dependency>
 		<dependency>
 			<groupId>geniusweb.exampleparties</groupId>
 			<artifactId>randomparty</artifactId>
-			<version>1.4.0</version>
-			<scope>test</scope>
+			<version>${geniusweb.version}</version>
+			<scope>
+				test
+			</scope>
 		</dependency>
 		<dependency>
 			<groupId>geniusweb.exampleparties</groupId>
 			<artifactId>comparebids</artifactId>
-			<version>1.4.0</version>
-			<scope>test</scope>
+			<version>${geniusweb.version}</version>
+			<scope>
+				test
+			</scope>
 		</dependency>
 		<dependency>
 			<groupId>geniusweb.exampleparties</groupId>
 			<artifactId>simpleshaop</artifactId>
-			<version>1.4.0</version>
-			<scope>test</scope>
+			<version>${geniusweb.version}</version>
+			<scope>
+				test
+			</scope>
 		</dependency>
 
Index: simplerunner/src/main/java/geniusweb/simplerunner/NegoRunner.java
===================================================================
--- simplerunner/src/main/java/geniusweb/simplerunner/NegoRunner.java	(revision 14)
+++ simplerunner/src/main/java/geniusweb/simplerunner/NegoRunner.java	(revision 18)
@@ -7,4 +7,5 @@
 import java.util.logging.Level;
 
+import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
 
@@ -13,6 +14,6 @@
 import geniusweb.protocol.NegoProtocol;
 import geniusweb.protocol.NegoSettings;
+import geniusweb.protocol.NegoState;
 import geniusweb.protocol.partyconnection.ProtocolToPartyConnFactory;
-import tudelft.utilities.logging.ReportToLogger;
 import tudelft.utilities.logging.Reporter;
 
@@ -27,5 +28,5 @@
 	private final NegoProtocol protocol;
 	private final ProtocolToPartyConnFactory connectionfactory;
-	private final Reporter log;
+	protected final Reporter log;
 	private final static ObjectMapper jackson = new ObjectMapper();
 
@@ -55,10 +56,22 @@
 
 	protected void stop() {
-		if (protocol.getState().getError() != null) {
-			log.log(Level.WARNING, "protocol terminated abnormally",
-					protocol.getState().getError());
-		} else {
-			log.log(Level.INFO,
-					"protocol ended normally: " + protocol.getState());
+		Level level = protocol.getState().getError() == null ? Level.INFO
+				: Level.WARNING;
+		logFinal(level, protocol.getState());
+	}
+
+	/**
+	 * Separate so that we can intercept this when mocking, as this will crash
+	 * on mocks
+	 * 
+	 * @param level
+	 * @param state
+	 */
+	protected void logFinal(Level level, NegoState state) {
+		try {
+			log.log(level, "protocol ended normally: "
+					+ jackson.writeValueAsString(protocol.getState()));
+		} catch (JsonProcessingException e) {
+			e.printStackTrace();
 		}
 	}
@@ -75,6 +88,5 @@
 
 		NegoRunner runner = new NegoRunner(settings,
-				new ClassPathConnectionFactory(),
-				new ReportToLogger("sessionrunner"));
+				new ClassPathConnectionFactory(), new StdOutReporter());
 		runner.run();
 	}
@@ -90,2 +102,16 @@
 	}
 }
+
+class StdOutReporter implements Reporter {
+
+	@Override
+	public void log(Level arg0, String arg1) {
+		System.out.println(arg0 + ":" + arg1);
+	}
+
+	@Override
+	public void log(Level arg0, String arg1, Throwable arg2) {
+		System.out.println(arg0 + ">" + arg1);
+	}
+
+}
Index: simplerunner/src/test/java/geniusweb/simplerunner/SessionRunnerTest.java
===================================================================
--- simplerunner/src/test/java/geniusweb/simplerunner/SessionRunnerTest.java	(revision 14)
+++ simplerunner/src/test/java/geniusweb/simplerunner/SessionRunnerTest.java	(revision 18)
@@ -17,4 +17,5 @@
 
 import geniusweb.protocol.CurrentNegoState;
+import geniusweb.protocol.NegoState;
 import geniusweb.protocol.ProtocolException;
 import geniusweb.protocol.partyconnection.ProtocolToPartyConnFactory;
@@ -22,5 +23,4 @@
 import geniusweb.protocol.session.SessionSettings;
 import geniusweb.protocol.session.SessionState;
-import geniusweb.simplerunner.NegoRunner;
 import tudelft.utilities.listener.Listener;
 import tudelft.utilities.logging.ReportToLogger;
@@ -59,6 +59,5 @@
 				ProtocolToPartyConnFactory.class);
 
-		NegoRunner runner = spy(
-				new NegoRunner(settings, factory, logger));
+		NegoRunner runner = spy(new NegoRunner(settings, factory, logger));
 		runner.run();
 
@@ -82,6 +81,10 @@
 		ProtocolToPartyConnFactory factory = mock(
 				ProtocolToPartyConnFactory.class);
-		NegoRunner runner = spy(
-				new NegoRunner(settings, factory, logger));
+		NegoRunner runner = spy(new NegoRunner(settings, factory, logger) {
+			@Override
+			protected void logFinal(Level level, NegoState state) {
+				log.log(level, state.toString());
+			}
+		});
 		ArgumentCaptor<Listener> listener = ArgumentCaptor
 				.forClass(Listener.class);
@@ -109,6 +112,10 @@
 		ProtocolToPartyConnFactory factory = mock(
 				ProtocolToPartyConnFactory.class);
-		NegoRunner runner = spy(
-				new NegoRunner(settings, factory, logger));
+		NegoRunner runner = spy(new NegoRunner(settings, factory, logger) {
+			@Override
+			protected void logFinal(Level level, NegoState state) {
+				log.log(level, state.toString());
+			}
+		});
 		ArgumentCaptor<Listener> listener = ArgumentCaptor
 				.forClass(Listener.class);
@@ -120,6 +127,5 @@
 		verify(runner, times(1)).stop();
 		// check that the protocol error is logged properly
-		verify(logger, times(1)).log(eq(Level.WARNING), any(String.class),
-				eq(PROTOCOL_EXC));
+		verify(logger, times(1)).log(eq(Level.WARNING), any(String.class));
 	}
 
Index: simplerunner/src/test/resources/settings2.json
===================================================================
--- simplerunner/src/test/resources/settings2.json	(revision 14)
+++ simplerunner/src/test/resources/settings2.json	(revision 18)
@@ -13,4 +13,5 @@
 			}
 		}
+		
 	}
 }
Index: simplerunner/src/test/resources/shaoptoursettings.json
===================================================================
--- simplerunner/src/test/resources/shaoptoursettings.json	(revision 14)
+++ simplerunner/src/test/resources/shaoptoursettings.json	(revision 18)
@@ -59,5 +59,6 @@
 				}
 			}
-		}
+		},
+		"numberTournaments":1
 	}
 }
Index: simplerunner/troep.log
===================================================================
--- simplerunner/troep.log	(revision 18)
+++ simplerunner/troep.log	(revision 18)
@@ -0,0 +1,5 @@
+INFO:SAOP connect [PartyRef[classpath:geniusweb.exampleparties.randomparty.RandomParty], PartyRef[classpath:geniusweb.exampleparties.randomparty.RandomParty]]
+Connecting with party 'geniusweb.exampleparties.randomparty.RandomParty'
+Connecting with party 'geniusweb.exampleparties.randomparty.RandomParty'
+INFO:SAOP deadline set to 2020/06/08 17:06:53
+INFO:protocol ended normally: {"SAOPState":{"actions":[{"offer":{"actor":"geniusweb_exampleparties_randomparty_RandomParty_1","bid":{"issuevalues":{"lease car":"yes","permanent contract":"yes","career development opportunities":"low","salary":"4000","fte":"0.8"}}}},{"offer":{"actor":"geniusweb_exampleparties_randomparty_RandomParty_2","bid":{"issuevalues":{"permanent contract":"no","career development opportunities":"low","salary":"2000","work from home":"0","fte":"1.0"}}}},{"offer":{"actor":"geniusweb_exampleparties_randomparty_RandomParty_1","bid":{"issuevalues":{"lease car":"yes","permanent contract":"yes","salary":"4000","fte":"0.8"}}}},{"offer":{"actor":"geniusweb_exampleparties_randomparty_RandomParty_2","bid":{"issuevalues":{"lease car":"yes","permanent contract":"no","career development opportunities":"low","fte":"1.0","salary":"3000","work from home":"0"}}}},{"offer":{"actor":"geniusweb_exampleparties_randomparty_RandomParty_1","bid":{"issuevalues":{"lease car":"no","permanent contract":"yes","career development opportunities":"high","salary":"3500","fte":"1.0"}}}},{"offer":{"actor":"geniusweb_exampleparties_randomparty_RandomParty_2","bid":{"issuevalues":{"lease car":"yes","permanent contract":"yes","career development opportunities":"medium","fte":"1.0","salary":"2000","work from home":"0"}}}},{"offer":{"actor":"geniusweb_exampleparties_randomparty_RandomParty_1","bid":{"issuevalues":{"lease car":"yes","permanent contract":"yes","salary":"4000","work from home":"0","fte":"1.0"}}}},{"offer":{"actor":"geniusweb_exampleparties_randomparty_RandomParty_2","bid":{"issuevalues":{"lease car":"no","permanent contract":"no","career development opportunities":"low","fte":"0.8","salary":"2500","work from home":"1"}}}},{"offer":{"actor":"geniusweb_exampleparties_randomparty_RandomParty_1","bid":{"issuevalues":{"permanent contract":"no","career development opportunities":"high","salary":"4000","work from home":"2","fte":"1.0"}}}},{"offer":{"actor":"geniusweb_exampleparties_randomparty_RandomParty_2","bid":{"issuevalues":{"lease car":"no","permanent contract":"no","career development opportunities":"low","fte":"0.6","salary":"3000","work from home":"0"}}}},{"offer":{"actor":"geniusweb_exampleparties_randomparty_RandomParty_1","bid":{"issuevalues":{"permanent contract":"yes","career development opportunities":"low","salary":"2500","work from home":"1","fte":"0.6"}}}},{"offer":{"actor":"geniusweb_exampleparties_randomparty_RandomParty_2","bid":{"issuevalues":{"lease car":"yes","career development opportunities":"high","salary":"3500","work from home":"1"}}}},{"offer":{"actor":"geniusweb_exampleparties_randomparty_RandomParty_1","bid":{"issuevalues":{"lease car":"yes","permanent contract":"yes","career development opportunities":"low","fte":"1.0","salary":"3000","work from home":"2"}}}},{"offer":{"actor":"geniusweb_exampleparties_randomparty_RandomParty_2","bid":{"issuevalues":{"permanent contract":"no","salary":"2000","work from home":"0"}}}},{"offer":{"actor":"geniusweb_exampleparties_randomparty_RandomParty_1","bid":{"issuevalues":{"lease car":"yes","permanent contract":"no","career development opportunities":"high","fte":"1.0","salary":"3500","work from home":"0"}}}},{"offer":{"actor":"geniusweb_exampleparties_randomparty_RandomParty_2","bid":{"issuevalues":{"permanent contract":"yes","career development opportunities":"low","salary":"2000","work from home":"0","fte":"0.8"}}}},{"offer":{"actor":"geniusweb_exampleparties_randomparty_RandomParty_1","bid":{"issuevalues":{"lease car":"no","permanent contract":"yes","career development opportunities":"high","fte":"1.0","salary":"4000","work from home":"0"}}}},{"offer":{"actor":"geniusweb_exampleparties_randomparty_RandomParty_2","bid":{"issuevalues":{"permanent contract":"no","salary":"2000","work from home":"0"}}}},{"offer":{"actor":"geniusweb_exampleparties_randomparty_RandomParty_1","bid":{"issuevalues":{"lease car":"no","permanent contract":"no","career development opportunities":"medium","fte":"1.0","salary":"4000","work from home":"2"}}}},{"offer":{"actor":"geniusweb_exampleparties_randomparty_RandomParty_2","bid":{"issuevalues":{"lease car":"no","permanent contract":"no","salary":"2000","work from home":"0"}}}},{"offer":{"actor":"geniusweb_exampleparties_randomparty_RandomParty_1","bid":{"issuevalues":{"lease car":"yes","permanent contract":"yes","career development opportunities":"low","fte":"0.8","salary":"4000","work from home":"1"}}}},{"offer":{"actor":"geniusweb_exampleparties_randomparty_RandomParty_2","bid":{"issuevalues":{"lease car":"no","permanent contract":"no","career development opportunities":"low","fte":"0.8","salary":"2000","work from home":"2"}}}},{"offer":{"actor":"geniusweb_exampleparties_randomparty_RandomParty_1","bid":{"issuevalues":{"lease car":"yes","permanent contract":"yes","career development opportunities":"medium","salary":"3500","fte":"1.0"}}}},{"offer":{"actor":"geniusweb_exampleparties_randomparty_RandomParty_2","bid":{"issuevalues":{"lease car":"no","permanent contract":"no","career development opportunities":"medium","fte":"0.6","salary":"2000","work from home":"0"}}}},{"offer":{"actor":"geniusweb_exampleparties_randomparty_RandomParty_1","bid":{"issuevalues":{"lease car":"yes","permanent contract":"yes","career development opportunities":"low","fte":"0.6","salary":"4000","work from home":"2"}}}},{"offer":{"actor":"geniusweb_exampleparties_randomparty_RandomParty_2","bid":{"issuevalues":{"lease car":"yes","permanent contract":"no","career development opportunities":"medium","salary":"2500","work from home":"0"}}}},{"offer":{"actor":"geniusweb_exampleparties_randomparty_RandomParty_1","bid":{"issuevalues":{"permanent contract":"yes","career development opportunities":"medium","salary":"4000","work from home":"2","fte":"1.0"}}}},{"offer":{"actor":"geniusweb_exampleparties_randomparty_RandomParty_2","bid":{"issuevalues":{"lease car":"no","permanent contract":"yes","career development opportunities":"low","fte":"1.0","salary":"2000","work from home":"0"}}}},{"offer":{"actor":"geniusweb_exampleparties_randomparty_RandomParty_1","bid":{"issuevalues":{"lease car":"yes","permanent contract":"yes","career development opportunities":"low","salary":"2000","work from home":"2"}}}},{"offer":{"actor":"geniusweb_exampleparties_randomparty_RandomParty_2","bid":{"issuevalues":{"lease car":"no","permanent contract":"no","career development opportunities":"high","fte":"1.0","salary":"2000","work from home":"1"}}}},{"offer":{"actor":"geniusweb_exampleparties_randomparty_RandomParty_1","bid":{"issuevalues":{"lease car":"yes","permanent contract":"yes","career development opportunities":"medium","fte":"1.0","salary":"3000","work from home":"1"}}}},{"offer":{"actor":"geniusweb_exampleparties_randomparty_RandomParty_2","bid":{"issuevalues":{"lease car":"yes","permanent contract":"no","salary":"2000","work from home":"0","fte":"1.0"}}}},{"offer":{"actor":"geniusweb_exampleparties_randomparty_RandomParty_1","bid":{"issuevalues":{"lease car":"yes","permanent contract":"yes","career development opportunities":"low","fte":"1.0","salary":"2500","work from home":"1"}}}},{"offer":{"actor":"geniusweb_exampleparties_randomparty_RandomParty_2","bid":{"issuevalues":{"lease car":"yes","permanent contract":"no","career development opportunities":"medium","fte":"1.0","salary":"2000","work from home":"1"}}}},{"offer":{"actor":"geniusweb_exampleparties_randomparty_RandomParty_1","bid":{"issuevalues":{"lease car":"yes","permanent contract":"no","career development opportunities":"high","fte":"1.0","salary":"3500","work from home":"1"}}}},{"offer":{"actor":"geniusweb_exampleparties_randomparty_RandomParty_2","bid":{"issuevalues":{"permanent contract":"no","career development opportunities":"low","salary":"2500","work from home":"0","fte":"0.8"}}}},{"offer":{"actor":"geniusweb_exampleparties_randomparty_RandomParty_1","bid":{"issuevalues":{"lease car":"yes","permanent contract":"yes","salary":"3500","work from home":"0","fte":"1.0"}}}},{"offer":{"actor":"geniusweb_exampleparties_randomparty_RandomParty_2","bid":{"issuevalues":{"permanent contract":"no","salary":"3000","work from home":"2"}}}},{"offer":{"actor":"geniusweb_exampleparties_randomparty_RandomParty_1","bid":{"issuevalues":{"permanent contract":"yes","salary":"3500","work from home":"1","fte":"1.0"}}}},{"offer":{"actor":"geniusweb_exampleparties_randomparty_RandomParty_2","bid":{"issuevalues":{"permanent contract":"yes","career development opportunities":"low","salary":"2000","work from home":"0","fte":"0.8"}}}},{"offer":{"actor":"geniusweb_exampleparties_randomparty_RandomParty_1","bid":{"issuevalues":{"lease car":"yes","career development opportunities":"high","salary":"2000","work from home":"2"}}}},{"offer":{"actor":"geniusweb_exampleparties_randomparty_RandomParty_2","bid":{"issuevalues":{"lease car":"no","permanent contract":"no","career development opportunities":"medium","salary":"2500","work from home":"0"}}}},{"offer":{"actor":"geniusweb_exampleparties_randomparty_RandomParty_1","bid":{"issuevalues":{"lease car":"yes","career development opportunities":"medium","salary":"3500","work from home":"2","fte":"1.0"}}}},{"offer":{"actor":"geniusweb_exampleparties_randomparty_RandomParty_2","bid":{"issuevalues":{"lease car":"no","permanent contract":"yes","career development opportunities":"medium","fte":"1.0","salary":"3500","work from home":"1"}}}},{"accept":{"actor":"geniusweb_exampleparties_randomparty_RandomParty_1","bid":{"issuevalues":{"lease car":"no","permanent contract":"yes","career development opportunities":"medium","fte":"1.0","salary":"3500","work from home":"1"}}}}],"progress":{"time":{"duration":100,"start":1591628813120}},"settings":{"SAOPSettings":{"participants":[{"party":{"partyref":"classpath:geniusweb.exampleparties.randomparty.RandomParty","parameters":{}},"profile":"file:src/test/resources/jobs/jobs1.json"},{"party":{"partyref":"classpath:geniusweb.exampleparties.randomparty.RandomParty","parameters":{}},"profile":"file:src/test/resources/jobs/jobs2.json"}],"deadline":{"deadlinetime":{"durationms":100}}}},"error":null,"partyprofiles":{"geniusweb_exampleparties_randomparty_RandomParty_1":{"party":{"partyref":"classpath:geniusweb.exampleparties.randomparty.RandomParty","parameters":{}},"profile":"file:src/test/resources/jobs/jobs1.json"},"geniusweb_exampleparties_randomparty_RandomParty_2":{"party":{"partyref":"classpath:geniusweb.exampleparties.randomparty.RandomParty","parameters":{}},"profile":"file:src/test/resources/jobs/jobs2.json"}}}}
