Index: /bidspace/pom.xml
===================================================================
--- /bidspace/pom.xml	(revision 17)
+++ /bidspace/pom.xml	(revision 18)
@@ -6,5 +6,5 @@
 	<groupId>geniusweb</groupId>
 	<artifactId>bidspace</artifactId>
-			<version>1.4.0</version>
+	<version>1.4.1</version> <!-- must equal ${geniusweb.version} -->
 	<packaging>jar</packaging>
 
@@ -16,4 +16,5 @@
 		<passwd>${env.ARTIFACTORY_PASS}</passwd>
 		<jackson-2-version>2.9.10</jackson-2-version>
+		<geniusweb.version>1.4.1</geniusweb.version>
 	</properties>
 
@@ -36,5 +37,5 @@
 			<groupId>geniusweb</groupId>
 			<artifactId>profile</artifactId>
-			<version>1.4.0</version>
+			<version>${geniusweb.version}</version>
 		</dependency>
 
@@ -42,5 +43,5 @@
 			<groupId>tudelft.utilities</groupId>
 			<artifactId>immutablelist</artifactId>
-			<version>1.0.1</version>
+			<version>1.1.0</version>
 		</dependency>
 
@@ -103,5 +104,5 @@
 			<groupId>tudelft.utilities</groupId>
 			<artifactId>junit</artifactId>
-			<version>1.0.1</version>
+			<version>1.0.3</version>
 			<scope>test</scope>
 		</dependency>
Index: /events/pom.xml
===================================================================
--- /events/pom.xml	(revision 17)
+++ /events/pom.xml	(revision 18)
@@ -6,5 +6,5 @@
 	<groupId>geniusweb</groupId>
 	<artifactId>events</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>
 
@@ -43,10 +44,10 @@
 			<groupId>geniusweb</groupId>
 			<artifactId>issuevalue</artifactId>
-			<version>1.4.0</version>
+			<version>${geniusweb.version}</version>
 		</dependency>
 		<dependency>
 			<groupId>geniusweb</groupId>
 			<artifactId>references</artifactId>
-			<version>1.4.0</version>
+			<version>${geniusweb.version}</version>
 		</dependency>
 
@@ -108,5 +109,5 @@
 			<groupId>tudelft.utilities</groupId>
 			<artifactId>junit</artifactId>
-			<version>1.0.2</version>
+			<version>1.0.3</version>
 			<scope>test</scope>
 		</dependency>
Index: /exampleparties/anac2019/agentgg/pom.xml
===================================================================
--- /exampleparties/anac2019/agentgg/pom.xml	(revision 17)
+++ /exampleparties/anac2019/agentgg/pom.xml	(revision 18)
@@ -6,5 +6,5 @@
 	<groupId>geniusweb.exampleparties.anac2019</groupId>
 	<artifactId>agentgg</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.6</jackson-2-version>
+		<geniusweb.version>1.4.1</geniusweb.version>
 	</properties>
 
@@ -32,5 +33,5 @@
 			<groupId>geniusweb</groupId>
 			<artifactId>issuevalue</artifactId>
-			<version>1.4.0</version>
+			<version>${geniusweb.version}</version>
 		</dependency>
 
@@ -38,5 +39,5 @@
 			<groupId>geniusweb</groupId>
 			<artifactId>party</artifactId>
-			<version>1.4.0</version>
+			<version>${geniusweb.version}</version>
 		</dependency>
 
@@ -44,10 +45,10 @@
 			<groupId>geniusweb</groupId>
 			<artifactId>bidspace</artifactId>
-			<version>1.4.0</version>
+			<version>${geniusweb.version}</version>
 		</dependency>
 		<dependency>
 			<groupId>geniusweb</groupId>
 			<artifactId>profileconnection</artifactId>
-			<version>1.4.0</version>
+			<version>${geniusweb.version}</version>
 		</dependency>
 		<dependency>
@@ -59,5 +60,5 @@
 			<groupId>tudelft.utilities</groupId>
 			<artifactId>immutablelist</artifactId>
-			<version>1.0.1</version>
+			<version>1.1.0</version>
 		</dependency>
 
Index: /exampleparties/anac2019/winkyagent/pom.xml
===================================================================
--- /exampleparties/anac2019/winkyagent/pom.xml	(revision 17)
+++ /exampleparties/anac2019/winkyagent/pom.xml	(revision 18)
@@ -6,5 +6,5 @@
 	<groupId>geniusweb.exampleparties.anac2019</groupId>
 	<artifactId>winkyagent</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.6</jackson-2-version>
+		<geniusweb.version>1.4.1</geniusweb.version>
 	</properties>
 
@@ -32,5 +33,5 @@
 			<groupId>geniusweb</groupId>
 			<artifactId>issuevalue</artifactId>
-			<version>1.4.0</version>
+			<version>${geniusweb.version}</version>
 		</dependency>
 
@@ -38,5 +39,5 @@
 			<groupId>geniusweb</groupId>
 			<artifactId>party</artifactId>
-			<version>1.4.0</version>
+			<version>${geniusweb.version}</version>
 		</dependency>
 
@@ -44,10 +45,10 @@
 			<groupId>geniusweb</groupId>
 			<artifactId>bidspace</artifactId>
-			<version>1.4.0</version>
+			<version>${geniusweb.version}</version>
 		</dependency>
 		<dependency>
 			<groupId>geniusweb</groupId>
 			<artifactId>profileconnection</artifactId>
-			<version>1.4.0</version>
+			<version>${geniusweb.version}</version>
 		</dependency>
 		<dependency>
@@ -59,5 +60,5 @@
 			<groupId>tudelft.utilities</groupId>
 			<artifactId>immutablelist</artifactId>
-			<version>1.0.1</version>
+			<version>1.1.0</version>
 		</dependency>
 
Index: /exampleparties/boulware/pom.xml
===================================================================
--- /exampleparties/boulware/pom.xml	(revision 17)
+++ /exampleparties/boulware/pom.xml	(revision 18)
@@ -6,5 +6,5 @@
 	<groupId>geniusweb.exampleparties</groupId>
 	<artifactId>boulware</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>
 
@@ -33,5 +34,5 @@
 			<groupId>geniusweb.exampleparties</groupId>
 			<artifactId>timedependentparty</artifactId>
-			<version>1.4.0</version>
+			<version>1.4.1</version> <!-- must equal ${geniusweb.version} -->
 		</dependency>
 		<dependency>
Index: /exampleparties/comparebids/pom.xml
===================================================================
--- /exampleparties/comparebids/pom.xml	(revision 17)
+++ /exampleparties/comparebids/pom.xml	(revision 18)
@@ -6,5 +6,5 @@
 	<groupId>geniusweb.exampleparties</groupId>
 	<artifactId>comparebids</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.6</jackson-2-version>
+		<geniusweb.version>1.4.1</geniusweb.version>
 	</properties>
 
@@ -33,5 +34,5 @@
 			<groupId>geniusweb</groupId>
 			<artifactId>party</artifactId>
-			<version>1.4.0</version>
+			<version>${geniusweb.version}</version>
 		</dependency>
 
@@ -39,10 +40,10 @@
 			<groupId>geniusweb</groupId>
 			<artifactId>bidspace</artifactId>
-			<version>1.4.0</version>
+			<version>${geniusweb.version}</version>
 		</dependency>
 		<dependency>
 			<groupId>geniusweb</groupId>
 			<artifactId>profileconnection</artifactId>
-			<version>1.4.0</version>
+			<version>${geniusweb.version}</version>
 		</dependency>
 		<dependency>
@@ -54,5 +55,5 @@
 			<groupId>tudelft.utilities</groupId>
 			<artifactId>immutablelist</artifactId>
-			<version>1.0.1</version>
+			<version>1.1.0</version>
 		</dependency>
 
Index: /exampleparties/conceder/pom.xml
===================================================================
--- /exampleparties/conceder/pom.xml	(revision 17)
+++ /exampleparties/conceder/pom.xml	(revision 18)
@@ -6,5 +6,5 @@
 	<groupId>geniusweb.exampleparties</groupId>
 	<artifactId>conceder</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>
 
@@ -33,5 +34,5 @@
 			<groupId>geniusweb.exampleparties</groupId>
 			<artifactId>timedependentparty</artifactId>
-			<version>1.4.0</version>
+			<version>${geniusweb.version}</version>
 		</dependency>
 		<dependency>
Index: /exampleparties/hardliner/pom.xml
===================================================================
--- /exampleparties/hardliner/pom.xml	(revision 17)
+++ /exampleparties/hardliner/pom.xml	(revision 18)
@@ -6,5 +6,5 @@
 	<groupId>geniusweb.exampleparties</groupId>
 	<artifactId>hardliner</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>
 
@@ -33,5 +34,5 @@
 			<groupId>geniusweb.exampleparties</groupId>
 			<artifactId>timedependentparty</artifactId>
-			<version>1.4.0</version>
+			<version>${geniusweb.version}</version>
 		</dependency>
 		<dependency>
Index: /exampleparties/humangui/pom.xml
===================================================================
--- /exampleparties/humangui/pom.xml	(revision 17)
+++ /exampleparties/humangui/pom.xml	(revision 18)
@@ -6,5 +6,5 @@
 	<groupId>geniusweb.exampleparties</groupId>
 	<artifactId>humangui</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.6</jackson-2-version>
+		<geniusweb.version>1.4.1</geniusweb.version>
 	</properties>
 
@@ -33,5 +34,5 @@
 			<groupId>geniusweb</groupId>
 			<artifactId>party</artifactId>
-			<version>1.4.0</version>
+			<version>${geniusweb.version}</version>
 		</dependency>
 
@@ -39,15 +40,15 @@
 			<groupId>geniusweb</groupId>
 			<artifactId>bidspace</artifactId>
-			<version>1.4.0</version>
+			<version>${geniusweb.version}</version>
 		</dependency>
 		<dependency>
 			<groupId>geniusweb</groupId>
 			<artifactId>profileconnection</artifactId>
-			<version>1.4.0</version>
+			<version>${geniusweb.version}</version>
 		</dependency>
 		<dependency>
 			<groupId>tudelft.utilities</groupId>
 			<artifactId>immutablelist</artifactId>
-			<version>1.0.1</version>
+			<version>1.1.0</version>
 		</dependency>
 		<dependency>
Index: /exampleparties/linear/pom.xml
===================================================================
--- /exampleparties/linear/pom.xml	(revision 17)
+++ /exampleparties/linear/pom.xml	(revision 18)
@@ -6,5 +6,5 @@
 	<groupId>geniusweb.exampleparties</groupId>
 	<artifactId>linear</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>
 
@@ -33,5 +34,5 @@
 			<groupId>geniusweb.exampleparties</groupId>
 			<artifactId>timedependentparty</artifactId>
-			<version>1.4.0</version>
+			<version>${geniusweb.version}</version>
 		</dependency>
 		<dependency>
Index: /exampleparties/randomparty/pom.xml
===================================================================
--- /exampleparties/randomparty/pom.xml	(revision 17)
+++ /exampleparties/randomparty/pom.xml	(revision 18)
@@ -6,5 +6,5 @@
 	<groupId>geniusweb.exampleparties</groupId>
 	<artifactId>randomparty</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.6</jackson-2-version>
+		<geniusweb.version>1.4.1</geniusweb.version>
 	</properties>
 
@@ -33,5 +34,5 @@
 			<groupId>geniusweb</groupId>
 			<artifactId>party</artifactId>
-			<version>1.4.0</version>
+			<version>${geniusweb.version}</version>
 		</dependency>
 
@@ -39,10 +40,10 @@
 			<groupId>geniusweb</groupId>
 			<artifactId>bidspace</artifactId>
-			<version>1.4.0</version>
+			<version>${geniusweb.version}</version>
 		</dependency>
 		<dependency>
 			<groupId>geniusweb</groupId>
 			<artifactId>profileconnection</artifactId>
-			<version>1.4.0</version>
+			<version>${geniusweb.version}</version>
 		</dependency>
 		<dependency>
@@ -54,5 +55,5 @@
 			<groupId>tudelft.utilities</groupId>
 			<artifactId>immutablelist</artifactId>
-			<version>1.0.1</version>
+			<version>1.1.0</version>
 		</dependency>
 
Index: /exampleparties/randompartypy/pom.xml
===================================================================
--- /exampleparties/randompartypy/pom.xml	(revision 17)
+++ /exampleparties/randompartypy/pom.xml	(revision 18)
@@ -6,5 +6,5 @@
 	<groupId>geniusweb.exampleparties</groupId>
 	<artifactId>randompyparty</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,5 +32,5 @@
 			<groupId>geniusweb</groupId>
 			<artifactId>pythonadapter</artifactId>
-			<version>1.4.0</version>
+			<version>${geniusweb.version}</version>
 		</dependency>
 
@@ -37,15 +38,15 @@
 			<groupId>geniusweb</groupId>
 			<artifactId>bidspace</artifactId>
-			<version>1.4.0</version>
+			<version>${geniusweb.version}</version>
 		</dependency>
 		<dependency>
 			<groupId>geniusweb</groupId>
 			<artifactId>profileconnection</artifactId>
-			<version>1.4.0</version>
+			<version>${geniusweb.version}</version>
 		</dependency>
 		<dependency>
 			<groupId>tudelft.utilities</groupId>
 			<artifactId>immutablelist</artifactId>
-			<version>1.0.1</version>
+			<version>1.1.0</version>
 		</dependency>
 
Index: /exampleparties/simpleshaop/pom.xml
===================================================================
--- /exampleparties/simpleshaop/pom.xml	(revision 17)
+++ /exampleparties/simpleshaop/pom.xml	(revision 18)
@@ -6,5 +6,5 @@
 	<groupId>geniusweb.exampleparties</groupId>
 	<artifactId>simpleshaop</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.6</jackson-2-version>
+		<geniusweb.version>1.4.1</geniusweb.version>
 	</properties>
 
@@ -33,5 +34,5 @@
 			<groupId>geniusweb</groupId>
 			<artifactId>party</artifactId>
-			<version>1.4.0</version>
+			<version>${geniusweb.version}</version>
 		</dependency>
 
@@ -39,10 +40,10 @@
 			<groupId>geniusweb</groupId>
 			<artifactId>bidspace</artifactId>
-			<version>1.4.0</version>
+			<version>${geniusweb.version}</version>
 		</dependency>
 		<dependency>
 			<groupId>geniusweb</groupId>
 			<artifactId>profileconnection</artifactId>
-			<version>1.4.0</version>
+			<version>${geniusweb.version}</version>
 		</dependency>
 		<dependency>
@@ -54,5 +55,5 @@
 			<groupId>tudelft.utilities</groupId>
 			<artifactId>immutablelist</artifactId>
-			<version>1.0.1</version>
+			<version>1.1.0</version>
 		</dependency>
 
Index: /exampleparties/timedependentparty/pom.xml
===================================================================
--- /exampleparties/timedependentparty/pom.xml	(revision 17)
+++ /exampleparties/timedependentparty/pom.xml	(revision 18)
@@ -6,5 +6,5 @@
 	<groupId>geniusweb.exampleparties</groupId>
 	<artifactId>timedependentparty</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>
 
@@ -33,5 +34,5 @@
 			<groupId>geniusweb</groupId>
 			<artifactId>party</artifactId>
-			<version>1.4.0</version>
+	<version>${geniusweb.version}</version>
 		</dependency>
 
@@ -39,10 +40,10 @@
 			<groupId>geniusweb</groupId>
 			<artifactId>bidspace</artifactId>
-			<version>1.4.0</version>
+	<version>${geniusweb.version}</version>
 		</dependency>
 		<dependency>
 			<groupId>geniusweb</groupId>
 			<artifactId>profileconnection</artifactId>
-			<version>1.4.0</version>
+	<version>${geniusweb.version}</version>
 		</dependency>
 		<dependency>
@@ -54,5 +55,5 @@
 			<groupId>tudelft.utilities</groupId>
 			<artifactId>immutablelist</artifactId>
-			<version>1.0.1</version>
+			<version>1.1.0</version>
 		</dependency>
 
Index: /exampleparties/timedependentparty/src/main/java/geniusweb/exampleparties/timedependentparty/TimeDependentParty.java
===================================================================
--- /exampleparties/timedependentparty/src/main/java/geniusweb/exampleparties/timedependentparty/TimeDependentParty.java	(revision 17)
+++ /exampleparties/timedependentparty/src/main/java/geniusweb/exampleparties/timedependentparty/TimeDependentParty.java	(revision 18)
@@ -70,5 +70,5 @@
 				this.me = settings.getID();
 				this.progress = settings.getProgress();
-				Object newe = settings.getParemeters().get("e");
+				Object newe = settings.getParameters().get("e");
 				if (newe != null) {
 					if (newe instanceof Double) {
Index: /issuevalue/pom.xml
===================================================================
--- /issuevalue/pom.xml	(revision 17)
+++ /issuevalue/pom.xml	(revision 18)
@@ -6,5 +6,5 @@
 	<groupId>geniusweb</groupId>
 	<artifactId>issuevalue</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>
 
@@ -86,5 +87,5 @@
 			<groupId>tudelft.utilities</groupId>
 			<artifactId>junit</artifactId>
-			<version>1.0.2</version>
+			<version>1.0.3</version>
 			<scope>test</scope>
 		</dependency>
@@ -92,5 +93,5 @@
 			<groupId>tudelft.utilities</groupId>
 			<artifactId>immutablelist</artifactId>
-			<version>1.0.1</version>
+			<version>1.1.0</version>
 		</dependency>
 
Index: /opponentmodel/pom.xml
===================================================================
--- /opponentmodel/pom.xml	(revision 17)
+++ /opponentmodel/pom.xml	(revision 18)
@@ -6,5 +6,5 @@
 	<groupId>geniusweb</groupId>
 	<artifactId>opponentmodel</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,15 +32,25 @@
 			<groupId>geniusweb</groupId>
 			<artifactId>issuevalue</artifactId>
-			<version>1.4.0</version>
+			<version>${geniusweb.version}</version>
 		</dependency>
 		<dependency>
 			<groupId>geniusweb</groupId>
 			<artifactId>profile</artifactId>
-			<version>1.4.0</version>
+			<version>${geniusweb.version}</version>
 		</dependency>
 		<dependency>
 			<groupId>geniusweb</groupId>
 			<artifactId>references</artifactId>
-			<version>1.4.0</version>
+			<version>${geniusweb.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>geniusweb</groupId>
+			<artifactId>events</artifactId>
+			<version>${geniusweb.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>geniusweb</groupId>
+			<artifactId>timeline</artifactId>
+			<version>${geniusweb.version}</version>
 		</dependency>
 
Index: /opponentmodel/src/main/java/geniusweb/opponentmodel/FrequencyOpponentModel.java
===================================================================
--- /opponentmodel/src/main/java/geniusweb/opponentmodel/FrequencyOpponentModel.java	(revision 17)
+++ /opponentmodel/src/main/java/geniusweb/opponentmodel/FrequencyOpponentModel.java	(revision 18)
@@ -6,4 +6,6 @@
 import java.util.stream.Collectors;
 
+import geniusweb.actions.Action;
+import geniusweb.actions.Offer;
 import geniusweb.issuevalue.Bid;
 import geniusweb.issuevalue.Domain;
@@ -12,4 +14,5 @@
 import geniusweb.profile.utilityspace.NumberValueSetUtilities;
 import geniusweb.profile.utilityspace.UtilitySpace;
+import geniusweb.progress.Progress;
 
 /**
@@ -23,5 +26,5 @@
  *
  */
-public class FrequencyOpponentModel implements OpponentModel, UtilitySpace {
+public class FrequencyOpponentModel implements UtilitySpace, OpponentModel {
 
 	private static final int DECIMALS = 4; // accuracy of our computations.
@@ -32,5 +35,9 @@
 
 	public FrequencyOpponentModel(Domain domain) {
-		// map with empth hashmap for each issue.
+		/*
+		 * simply reset the whole model and make a new one... maybe this can be
+		 * done smarter for minor changes? map with empth hashmap for each
+		 * issue.
+		 */
 		this(domain,
 				domain.getIssues().stream().collect(
@@ -39,4 +46,26 @@
 	}
 
+	/**
+	 * internal constructor. Assumes the freqs keyset is equal to the available
+	 * issues.
+	 * 
+	 * @param domain the domain
+	 * @param freqs  the observed frequencies for all issue values. This map is
+	 *               assumed to be a fresh private-access only copy.
+	 * @param total  the total number of bids contained in the freqs map. This
+	 *               must be equal to the sum of the Integer values in the
+	 *               {@link #bidFrequencies} for each issue (this is not
+	 *               checked).
+	 */
+	private FrequencyOpponentModel(Domain domain,
+			Map<String, Map<Value, Integer>> freqs, BigDecimal total) {
+		if (domain == null) {
+			throw new NullPointerException("domain=null");
+		}
+		this.domain = domain;
+		this.bidFrequencies = freqs;
+		this.totalBids = total;
+	}
+
 	@Override
 	public BigDecimal getUtility(Bid bid) {
@@ -86,6 +115,16 @@
 	}
 
-	@Override
-	public FrequencyOpponentModel update(Bid bid) {
+	/**
+	 * {@inheritDoc}
+	 * 
+	 * <h1>change info</h1> This replaces update(Bid). Now you pass the entire
+	 * action and the progress instead of just the bid.
+	 */
+	@Override
+	public FrequencyOpponentModel with(Action action, Progress progress) {
+		if (!(action instanceof Offer))
+			return this;
+
+		Bid bid = ((Offer) action).getBid();
 		String err = domain.isComplete(bid);
 		if (err != null) {
@@ -108,26 +147,4 @@
 
 	/**
-	 * internal constructor. Assumes the freqs keyset is equal to the available
-	 * issues.
-	 * 
-	 * @param domain the domain
-	 * @param freqs  the observed frequencies for all issue values. This map is
-	 *               assumed to be a fresh private-access only copy.
-	 * @param total  the total number of bids contained in the freqs map. This
-	 *               must be equal to the sum of the Integer values in the
-	 *               {@link #bidFrequencies} for each issue (this is not
-	 *               checked).
-	 */
-	private FrequencyOpponentModel(Domain domain,
-			Map<String, Map<Value, Integer>> freqs, BigDecimal total) {
-		if (domain == null) {
-			throw new NullPointerException("domain=null");
-		}
-		this.domain = domain;
-		this.bidFrequencies = freqs;
-		this.totalBids = total;
-	}
-
-	/**
 	 * 
 	 * @param freqs
@@ -141,4 +158,10 @@
 		}
 		return map;
+	}
+
+	@Override
+	public Bid getReservationBid() {
+		// don't throw but we really have no clue.
+		return new Bid(new HashMap<>());
 	}
 
@@ -188,8 +211,3 @@
 	}
 
-	@Override
-	public Bid getReservationBid() {
-		throw new UnsupportedOperationException();
-	}
-
 }
Index: /opponentmodel/src/main/java/geniusweb/opponentmodel/OpponentModel.java
===================================================================
--- /opponentmodel/src/main/java/geniusweb/opponentmodel/OpponentModel.java	(revision 17)
+++ /opponentmodel/src/main/java/geniusweb/opponentmodel/OpponentModel.java	(revision 18)
@@ -1,19 +1,30 @@
 package geniusweb.opponentmodel;
 
-import geniusweb.issuevalue.Bid;
+import geniusweb.actions.Action;
+import geniusweb.issuevalue.Domain;
 import geniusweb.profile.Profile;
 import geniusweb.profile.utilityspace.UtilitySpace;
+import geniusweb.progress.Progress;
 
 /**
  * An opponentmodel estimates a {@link UtilitySpace} from received opponent
- * bids.
+ * actions.
+ * <h1>Requirement</h1> A OpponentModel must have a constructor that takes the
+ * Domain as argument. unfortunately this can not be enforced in a java
+ * interface
  */
 public interface OpponentModel extends Profile {
+
 	/**
-	 *
-	 * @param bid the next bid that was received
-	 * @return a new {@link OpponentModel} that takes the next bid into account.
+	 * Update this with a new action that was done by the opponent that this
+	 * model is modeling. {@link #with(Domain)} must be called before calling
+	 * this.
+	 * 
+	 * @param action   the new incoming action.
+	 * @param progress the current progress of the negotiation. Calls to this
+	 *                 must be done with increasing progress.
+	 * @return the updated {@link OpponentModel}
 	 */
-	OpponentModel update(Bid bid);
+	OpponentModel with(Action action, Progress progress);
 
 }
Index: /opponentmodel/src/test/java/geniusweb/profile/opponentmodel/FrequencyOppModelTest.java
===================================================================
--- /opponentmodel/src/test/java/geniusweb/profile/opponentmodel/FrequencyOppModelTest.java	(revision 17)
+++ /opponentmodel/src/test/java/geniusweb/profile/opponentmodel/FrequencyOppModelTest.java	(revision 18)
@@ -3,4 +3,5 @@
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.mock;
 
 import java.math.BigDecimal;
@@ -14,4 +15,6 @@
 import org.junit.Test;
 
+import geniusweb.actions.Offer;
+import geniusweb.actions.PartyId;
 import geniusweb.issuevalue.Bid;
 import geniusweb.issuevalue.DiscreteValue;
@@ -23,4 +26,5 @@
 import geniusweb.issuevalue.ValueSet;
 import geniusweb.opponentmodel.FrequencyOpponentModel;
+import geniusweb.progress.Progress;
 import tudelft.utilities.junit.GeneralTests;
 
@@ -32,4 +36,6 @@
 	private static final DiscreteValue I1V2 = new DiscreteValue("i1v2");
 	private static final DiscreteValue I1V2b = new DiscreteValue("i1v2b");
+	private static final Progress progress = mock(Progress.class);
+	private static final PartyId other = new PartyId("other");
 
 	private static Domain domain, domain2, domain3;
@@ -85,5 +91,5 @@
 		oppModel2 = new FrequencyOpponentModel(domain2);
 		oppModel3 = new FrequencyOpponentModel(domain3);
-		oppModel4 = (FrequencyOpponentModel) oppModel3.update(bid1);
+		oppModel4 = oppModel3.with(new Offer(other, bid1), progress);
 
 	}
@@ -106,5 +112,5 @@
 
 	@Test(expected = NullPointerException.class)
-	public void smokeNullTest() {
+	public void smokeTestNull() {
 		new FrequencyOpponentModel(null);
 	}
@@ -124,5 +130,6 @@
 	@Test
 	public void testUpdate() {
-		FrequencyOpponentModel oppModel = oppModel1.update(bid1);
+		FrequencyOpponentModel oppModel = oppModel1.with(new Offer(other, bid1),
+				progress);
 		assertTrue(BigDecimal.ONE.compareTo(oppModel.getUtility(bid1)) == 0);
 		assertTrue(BigDecimal.ZERO.compareTo(oppModel.getUtility(bid3)) == 0);
@@ -135,5 +142,7 @@
 		// bid1 and bid2 both want I1V1. They differ on the number value.
 		// bid3 wants I1V2 but does have the number value from bid2
-		FrequencyOpponentModel oppModel = oppModel1.update(bid1).update(bid2);
+		FrequencyOpponentModel oppModel = oppModel1
+				.with(new Offer(other, bid1), progress)
+				.with(new Offer(other, bid2), progress);
 		assertTrue(new BigDecimal("0.75")
 				.compareTo(oppModel.getUtility(bid1)) == 0);
Index: /party/pom.xml
===================================================================
--- /party/pom.xml	(revision 17)
+++ /party/pom.xml	(revision 18)
@@ -6,5 +6,5 @@
 	<groupId>geniusweb</groupId>
 	<artifactId>party</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,20 +32,20 @@
 			<groupId>geniusweb</groupId>
 			<artifactId>timeline</artifactId>
-			<version>1.4.0</version>
+			<version>${geniusweb.version}</version>
 		</dependency>
 		<dependency>
 			<groupId>geniusweb</groupId>
 			<artifactId>profile</artifactId>
-			<version>1.4.0</version>
+			<version>${geniusweb.version}</version>
 		</dependency>
 		<dependency>
 			<groupId>geniusweb</groupId>
 			<artifactId>events</artifactId>
-			<version>1.4.0</version>
+			<version>${geniusweb.version}</version>
 		</dependency>
 		<dependency>
 			<groupId>geniusweb</groupId>
 			<artifactId>references</artifactId>
-			<version>1.4.0</version>
+			<version>${geniusweb.version}</version>
 		</dependency>
 		<dependency>
@@ -116,5 +117,5 @@
 			<groupId>tudelft.utilities</groupId>
 			<artifactId>junit</artifactId>
-			<version>1.0.2</version>
+			<version>1.0.3</version>
 			<scope>test</scope>
 		</dependency>
Index: /party/src/main/java/geniusweb/party/inform/Settings.java
===================================================================
--- /party/src/main/java/geniusweb/party/inform/Settings.java	(revision 17)
+++ /party/src/main/java/geniusweb/party/inform/Settings.java	(revision 18)
@@ -89,5 +89,5 @@
 	 *         that can be used by the party.
 	 */
-	public HashMap<String, Object> getParemeters() {
+	public HashMap<String, Object> getParameters() {
 		return parameters;
 	}
Index: /profile/pom.xml
===================================================================
--- /profile/pom.xml	(revision 17)
+++ /profile/pom.xml	(revision 18)
@@ -6,5 +6,5 @@
 	<groupId>geniusweb</groupId>
 	<artifactId>profile</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,10 +32,15 @@
 			<groupId>geniusweb</groupId>
 			<artifactId>issuevalue</artifactId>
-			<version>1.4.0</version>
+			<version>${geniusweb.version}</version>
 		</dependency>
 		<dependency>
 			<groupId>geniusweb</groupId>
 			<artifactId>references</artifactId>
-			<version>1.4.0</version>
+			<version>${geniusweb.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>tudelft.utilities</groupId>
+			<artifactId>immutablelist</artifactId>
+			<version>1.1.0</version>
 		</dependency>
 
@@ -84,5 +90,5 @@
 			<groupId>tudelft.utilities</groupId>
 			<artifactId>junit</artifactId>
-			<version>1.0.2</version>
+			<version>1.0.3</version>
 			<scope>test</scope>
 		</dependency>
Index: /profileconnection/pom.xml
===================================================================
--- /profileconnection/pom.xml	(revision 17)
+++ /profileconnection/pom.xml	(revision 18)
@@ -6,5 +6,5 @@
 	<groupId>geniusweb</groupId>
 	<artifactId>profileconnection</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,5 +32,5 @@
 			<groupId>geniusweb</groupId>
 			<artifactId>profile</artifactId>
-			<version>1.4.0</version>
+			<version>${geniusweb.version}</version>
 		</dependency>
 
Index: /protocol/pom.xml
===================================================================
--- /protocol/pom.xml	(revision 17)
+++ /protocol/pom.xml	(revision 18)
@@ -6,5 +6,5 @@
 	<groupId>geniusweb</groupId>
 	<artifactId>protocol</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,25 +32,25 @@
 			<groupId>geniusweb</groupId>
 			<artifactId>profile</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</groupId>
 			<artifactId>references</artifactId>
-			<version>1.4.0</version>
+			<version>${geniusweb.version}</version>
 		</dependency>
 		<dependency>
 			<groupId>geniusweb</groupId>
 			<artifactId>events</artifactId>
-			<version>1.4.0</version>
+			<version>${geniusweb.version}</version>
 		</dependency>
 		<dependency>
 			<groupId>tudelft.utilities</groupId>
 			<artifactId>immutablelist</artifactId>
-			<version>1.0.1</version>
+			<version>1.1.0</version>
 		</dependency>
 		<dependency>
Index: /protocol/src/main/java/geniusweb/protocol/session/shaop/BareSHAOPState.java
===================================================================
--- /protocol/src/main/java/geniusweb/protocol/session/shaop/BareSHAOPState.java	(revision 17)
+++ /protocol/src/main/java/geniusweb/protocol/session/shaop/BareSHAOPState.java	(revision 18)
@@ -22,4 +22,5 @@
  */
 public abstract class BareSHAOPState implements SessionState {
+
 	protected final List<Action> actions;
 
@@ -167,3 +168,65 @@
 	}
 
+	@Override
+	public int hashCode() {
+		final int prime = 31;
+		int result = 1;
+		result = prime * result + ((actions == null) ? 0 : actions.hashCode());
+		result = prime * result + ((error == null) ? 0 : error.hashCode());
+		result = prime * result
+				+ ((partyNumbers == null) ? 0 : partyNumbers.hashCode());
+		result = prime * result
+				+ ((progress == null) ? 0 : progress.hashCode());
+		result = prime * result
+				+ ((settings == null) ? 0 : settings.hashCode());
+		result = prime * result + teamNr;
+		result = prime * result
+				+ ((totalSpent == null) ? 0 : totalSpent.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;
+		BareSHAOPState other = (BareSHAOPState) obj;
+		if (actions == null) {
+			if (other.actions != null)
+				return false;
+		} else if (!actions.equals(other.actions))
+			return false;
+		if (error == null) {
+			if (other.error != null)
+				return false;
+		} else if (!error.equals(other.error))
+			return false;
+		if (partyNumbers == null) {
+			if (other.partyNumbers != null)
+				return false;
+		} else if (!partyNumbers.equals(other.partyNumbers))
+			return false;
+		if (progress == null) {
+			if (other.progress != null)
+				return false;
+		} else if (!progress.equals(other.progress))
+			return false;
+		if (settings == null) {
+			if (other.settings != null)
+				return false;
+		} else if (!settings.equals(other.settings))
+			return false;
+		if (teamNr != other.teamNr)
+			return false;
+		if (totalSpent == null) {
+			if (other.totalSpent != null)
+				return false;
+		} else if (!totalSpent.equals(other.totalSpent))
+			return false;
+		return true;
+	}
+
 }
Index: /protocol/src/main/java/geniusweb/protocol/session/shaop/SHAOP.java
===================================================================
--- /protocol/src/main/java/geniusweb/protocol/session/shaop/SHAOP.java	(revision 17)
+++ /protocol/src/main/java/geniusweb/protocol/session/shaop/SHAOP.java	(revision 18)
@@ -50,5 +50,6 @@
  * party of this type can execute a RequestComparison(userid) action, which
  * increases the total bother with the elicitationcost. The call results in the
- * associated COB party to execute a Comparison action.
+ * associated COB party to execute a Comparison action. If this parameter is not
+ * set, the {@link SHAOPState#DEFAULT_ELICITATATION_COST} is used.
  * <p>
  * A SHAOP party keeps the turn until it does an action that is not a
@@ -58,7 +59,7 @@
  * <p>
  * The Comparison/ComparisonTest actions are private between the
- * {@link ShaopTeam}. A SHAOP party can do a {@link ElicitComparison} action
- * at any time. These actions are completely transparent to the other parties
- * and are not dependent or influencing the normal turn taking.
+ * {@link ShaopTeam}. A SHAOP party can do a {@link ElicitComparison} action at
+ * any time. These actions are completely transparent to the other parties and
+ * are not dependent or influencing the normal turn taking.
  */
 public class SHAOP extends DefaultListenable<ProtocolEvent>
@@ -162,6 +163,6 @@
 			ProtocolToPartyConnFactory connectionfactory)
 			throws InterruptedException, IOException {
-		List<PartyWithProfile> participants = state.getSettings()
-				.getTeams().stream().map(team -> team.getAllParties())
+		List<PartyWithProfile> participants = state.getSettings().getTeams()
+				.stream().map(team -> team.getAllParties())
 				.flatMap(List::stream).collect(Collectors.toList());
 		List<Reference> parties = participants.stream()
Index: /protocol/src/main/java/geniusweb/protocol/session/shaop/SHAOPState.java
===================================================================
--- /protocol/src/main/java/geniusweb/protocol/session/shaop/SHAOPState.java	(revision 17)
+++ /protocol/src/main/java/geniusweb/protocol/session/shaop/SHAOPState.java	(revision 18)
@@ -30,5 +30,5 @@
 public class SHAOPState extends BareSHAOPState {
 
-	private static final double DEFAULT_ELICITATATION_COST = 0.1d;
+	public static final double DEFAULT_ELICITATATION_COST = 0.01d;
 
 	/**
@@ -277,6 +277,9 @@
 			// shaop party does real action, move to next SHAOP party.
 			newTeam = (teamNr + 1) % settings.getTeams().size();
-			if (newprogress instanceof ProgressRounds) {
+			// check if we completed a round
+			if (newprogress instanceof ProgressRounds && newTeam == 0) {
 				newprogress = ((ProgressRounds) newprogress).advance();
+				System.out.println("Progressed rounds " + newprogress
+						+ " after action " + action + "");
 			}
 		}
Index: /protocol/src/main/java/geniusweb/protocol/tournament/allpermutations/AllPermutationsSettings.java
===================================================================
--- /protocol/src/main/java/geniusweb/protocol/tournament/allpermutations/AllPermutationsSettings.java	(revision 17)
+++ /protocol/src/main/java/geniusweb/protocol/tournament/allpermutations/AllPermutationsSettings.java	(revision 18)
@@ -1,6 +1,8 @@
 package geniusweb.protocol.tournament.allpermutations;
 
+import java.math.BigInteger;
 import java.util.Collections;
 import java.util.List;
+import java.util.function.BiFunction;
 
 import com.fasterxml.jackson.annotation.JsonCreator;
@@ -17,5 +19,4 @@
 import geniusweb.references.PartyWithProfile;
 import tudelft.utilities.immutablelist.FixedList;
-import tudelft.utilities.immutablelist.Function2;
 import tudelft.utilities.immutablelist.ImmutableList;
 import tudelft.utilities.immutablelist.MapList;
@@ -25,4 +26,5 @@
 import tudelft.utilities.immutablelist.PermutationsWithReturn;
 import tudelft.utilities.immutablelist.PermutationsWithoutReturn;
+import tudelft.utilities.immutablelist.Repeat;
 import tudelft.utilities.immutablelist.Tuple;
 import tudelft.utilities.immutablelist.Tuples;
@@ -56,5 +58,4 @@
 public class AllPermutationsSettings implements TournamentSettings {
 
-	public static final String COB_PARTY = "comparebids-1.2.0";
 	private final List<Team> teams;
 	private final List<ProfileList> profileslists;
@@ -62,22 +63,27 @@
 	private final int teamsPerSession;
 	private final SessionSettings sessionsettings;
+	private final int numberTournaments;
 
 	/**
 	 * 
-	 * @param teams           a list of {@link Team}s. Must contain at least
-	 *                        {@link #teamsPerSession} elements. The <teamsize>
-	 *                        must match the protocol: (SAOP:1, SHAOP:2)
-	 * @param reuseTeams      if true, we use PermutationsWithReturn, if false
-	 *                        we use PermutationsWithoutReturn to create the
-	 *                        teams.
-	 * @param plists          list of available {@link ProfileList}s to be
-	 *                        permutated over the teams. Each
-	 *                        {@link ProfileList} must contain <teamsize>
-	 *                        elements.
-	 * @param teamsPerSession number of parties per session, must be at least 2.
-	 * @param sesettings      The generic {@link SessionSetting}.
-	 *                        {@link SessionSettings#with(PartyWithProfile)}
-	 *                        will be used to add the required
-	 *                        {@link PartyWithProfile}s
+	 * @param teams             a list of {@link Team}s. Must contain at least
+	 *                          {@link #teamsPerSession} elements. The
+	 *                          <teamsize> must match the protocol: (SAOP:1,
+	 *                          SHAOP:2)
+	 * @param reuseTeams        if true, we use PermutationsWithReturn, if false
+	 *                          we use PermutationsWithoutReturn to create the
+	 *                          teams.
+	 * @param plists            list of available {@link ProfileList}s to be
+	 *                          permutated over the teams. Each
+	 *                          {@link ProfileList} must contain <teamsize>
+	 *                          elements.
+	 * @param teamsPerSession   number of parties per session, must be at least
+	 *                          2.
+	 * @param sesettings        The generic {@link SessionSetting}.
+	 *                          {@link SessionSettings#with(PartyWithProfile)}
+	 *                          will be used to add the required
+	 *                          {@link PartyWithProfile}s
+	 * @param numberTournaments the number of times the tournament should be
+	 *                          run.
 	 */
 	@JsonCreator
@@ -86,5 +92,6 @@
 			@JsonProperty("reuseTeams") boolean reuseTeams,
 			@JsonProperty("teamsPerSession") int teamsPerSession,
-			@JsonProperty("sessionsettings") SessionSettings sesettings) {
+			@JsonProperty("sessionsettings") SessionSettings sesettings,
+			@JsonProperty("numberTournaments") int nTournaments) {
 		if (teamsPerSession < 2)
 			throw new IllegalArgumentException("teamsPerSession must be >=2");
@@ -96,4 +103,6 @@
 					"profileslist must contain at least " + teamsPerSession
 							+ " ProfileList's");
+		if (nTournaments <= 0)
+			throw new IllegalArgumentException("nTournaments must be >0");
 		int teamsize;
 		if (sesettings instanceof SAOPSettings)
@@ -117,5 +126,4 @@
 								+ teamsize + " but found "
 								+ profile.getProfiles().size());
-
 			}
 		}
@@ -125,4 +133,5 @@
 		this.profileslists = plists;
 		this.sessionsettings = sesettings;
+		this.numberTournaments = nTournaments;
 	}
 
@@ -159,5 +168,5 @@
 		return "AllPermutationsSettings[" + teams + "," + reuseTeams + ","
 				+ profileslists + "," + teamsPerSession + "," + sessionsettings
-				+ "]";
+				+ "," + numberTournaments + "]";
 	}
 
@@ -166,6 +175,5 @@
 		final int prime = 31;
 		int result = 1;
-		result = prime * result + ((teams == null) ? 0 : teams.hashCode());
-		result = prime * result + teamsPerSession;
+		result = prime * result + numberTournaments;
 		result = prime * result
 				+ ((profileslists == null) ? 0 : profileslists.hashCode());
@@ -173,4 +181,6 @@
 		result = prime * result
 				+ ((sessionsettings == null) ? 0 : sessionsettings.hashCode());
+		result = prime * result + ((teams == null) ? 0 : teams.hashCode());
+		result = prime * result + teamsPerSession;
 		return result;
 	}
@@ -185,4 +195,18 @@
 			return false;
 		AllPermutationsSettings other = (AllPermutationsSettings) obj;
+		if (numberTournaments != other.numberTournaments)
+			return false;
+		if (profileslists == null) {
+			if (other.profileslists != null)
+				return false;
+		} else if (!profileslists.equals(other.profileslists))
+			return false;
+		if (reuseTeams != other.reuseTeams)
+			return false;
+		if (sessionsettings == null) {
+			if (other.sessionsettings != null)
+				return false;
+		} else if (!sessionsettings.equals(other.sessionsettings))
+			return false;
 		if (teams == null) {
 			if (other.teams != null)
@@ -191,16 +215,4 @@
 			return false;
 		if (teamsPerSession != other.teamsPerSession)
-			return false;
-		if (profileslists == null) {
-			if (other.profileslists != null)
-				return false;
-		} else if (!profileslists.equals(other.profileslists))
-			return false;
-		if (reuseTeams != other.reuseTeams)
-			return false;
-		if (sessionsettings == null) {
-			if (other.sessionsettings != null)
-				return false;
-		} else if (!sessionsettings.equals(other.sessionsettings))
 			return false;
 		return true;
@@ -251,6 +263,9 @@
 				partiesPermutations, profilesPermutations);
 
-		return new MapList<Tuple<ImmutableList<Team>, ImmutableList<ProfileList>>, ImmutableList<TeamOfPartiesAndProfiles>>(
+		MapList<Tuple<ImmutableList<Team>, ImmutableList<ProfileList>>, ImmutableList<TeamOfPartiesAndProfiles>> tournamentsettings = new MapList<Tuple<ImmutableList<Team>, ImmutableList<ProfileList>>, ImmutableList<TeamOfPartiesAndProfiles>>(
 				tuple -> teamlist(tuple), tuples);
+		return new Repeat<ImmutableList<TeamOfPartiesAndProfiles>>(
+				tournamentsettings, BigInteger.valueOf(numberTournaments),
+				true);
 	}
 
@@ -264,5 +279,5 @@
 	private ImmutableList<TeamOfPartiesAndProfiles> teamlist(
 			Tuple<ImmutableList<Team>, ImmutableList<ProfileList>> tuple) {
-		Function2<Team, ProfileList, TeamOfPartiesAndProfiles> makeparty = new Function2<Team, ProfileList, TeamOfPartiesAndProfiles>() {
+		BiFunction<Team, ProfileList, TeamOfPartiesAndProfiles> makeparty = new BiFunction<Team, ProfileList, TeamOfPartiesAndProfiles>() {
 			@Override
 			public TeamOfPartiesAndProfiles apply(Team team,
@@ -288,34 +303,3 @@
 	}
 
-//	/**
-//	 * Extract the raw URL, without the part after the question mark
-//	 * 
-//	 * @param party   a party reference (for another party)
-//	 * @param profile a profile that may have a filter like "?partial=XX"
-//	 * @return profile without the filter and with a cob party on the same
-//	 *         machine. IT IS ASSUMED that there will the default
-//	 *         "comparebids-1.0.0" party on the same machine as where the other
-//	 *         party is
-//	 */
-//	protected static PartyWithProfile makeCob(PartyRef party,
-//			ProfileRef profile) {
-//		try {
-//			URI profileuri = profile.getURI();
-//			URI partyuri = party.getURI();
-//			ProfileRef cobprof = new ProfileRef(profileuri.getScheme() + "://"
-//					+ profileuri.getAuthority() + profileuri.getPath());
-//			String partypath = partyuri.getPath();
-//			partypath = partypath.substring(0, partypath.lastIndexOf('/'));
-//			PartyWithParameters cobparty = new PartyWithParameters(new PartyRef(
-//					partyuri.getScheme() + "://" + partyuri.getAuthority()
-//							+ partypath + "/" + COB_PARTY),
-//					new Parameters());
-//			return new PartyWithProfile(cobparty, cobprof);
-//
-//		} catch (URISyntaxException e) {
-//			throw new IllegalArgumentException(
-//					"Failed making cob party with profile " + profile, e);
-//		}
-//	}
-
 }
Index: /protocol/src/test/java/geniusweb/protocol/session/shaop/SHAOPStateTest.java
===================================================================
--- /protocol/src/test/java/geniusweb/protocol/session/shaop/SHAOPStateTest.java	(revision 18)
+++ /protocol/src/test/java/geniusweb/protocol/session/shaop/SHAOPStateTest.java	(revision 18)
@@ -0,0 +1,316 @@
+package geniusweb.protocol.session.shaop;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import java.util.Arrays;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import geniusweb.actions.Accept;
+import geniusweb.actions.Action;
+import geniusweb.actions.EndNegotiation;
+import geniusweb.actions.Offer;
+import geniusweb.actions.PartyId;
+import geniusweb.issuevalue.Bid;
+import geniusweb.progress.Progress;
+import geniusweb.progress.ProgressRounds;
+import geniusweb.progress.ProgressTime;
+import geniusweb.protocol.ProtocolException;
+import geniusweb.protocol.partyconnection.ProtocolToPartyConn;
+import geniusweb.protocol.partyconnection.ProtocolToPartyConnections;
+import geniusweb.protocol.session.TeamOfPartiesAndProfiles;
+import tudelft.utilities.junit.GeneralTests;
+
+public class SHAOPStateTest extends GeneralTests<SHAOPState> {
+	private final long NOW = 1000;
+
+	private PartyId party1 = new PartyId("party1");
+	private PartyId party2 = new PartyId("party2");
+	private PartyId party3 = new PartyId("party3");
+	private PartyId party4 = new PartyId("party4");
+	private List<Action> actions = new LinkedList<>();
+	private Action action = mock(Action.class);
+	private List<Action> actions2 = Arrays.asList(action);
+
+	private ProtocolToPartyConn party1conn = mock(ProtocolToPartyConn.class);
+	private ProtocolToPartyConn party2conn = mock(ProtocolToPartyConn.class);
+	private ProtocolToPartyConn party3conn = mock(ProtocolToPartyConn.class);
+	private ProtocolToPartyConn party4conn = mock(ProtocolToPartyConn.class);
+
+	private ProtocolToPartyConnections connections = new ProtocolToPartyConnections(
+			Arrays.asList(party1conn, party2conn));
+	private ProtocolToPartyConnections connections2 = new ProtocolToPartyConnections(
+			Arrays.asList(party1conn, party3conn));
+	private ProtocolToPartyConnections connections3 = new ProtocolToPartyConnections(
+			Arrays.asList(party1conn, party2conn, party3conn));
+	private ProtocolToPartyConnections connections4 = new ProtocolToPartyConnections(
+			Arrays.asList(party1conn, party2conn, party3conn, party4conn));
+
+	private Progress progresstime = mock(ProgressTime.class);
+	private ProgressRounds progressrounds = mock(ProgressRounds.class);
+	private ProgressRounds progressrounds1 = mock(ProgressRounds.class);
+	private SHAOPSettings settings = mock(SHAOPSettings.class);
+	private SHAOPState state1, state1a, state2, state3, state4;
+
+	private Bid bid1 = mock(Bid.class);
+	private Bid otherbid = mock(Bid.class);
+	private Accept accept1 = new Accept(party1, bid1);
+	private Accept accept2 = new Accept(party2, bid1);
+	private Accept acceptother = new Accept(party2, otherbid);
+	private Offer offer1 = new Offer(party1, bid1);
+	private EndNegotiation endNegotiation1 = new EndNegotiation(party1);
+	private Map<PartyId, Integer> partynrs = new HashMap<>();
+
+	private TeamOfPartiesAndProfiles team1 = mock(
+			TeamOfPartiesAndProfiles.class);
+	private TeamOfPartiesAndProfiles team2 = mock(
+			TeamOfPartiesAndProfiles.class);
+
+	@Before
+	public void before() {
+		when(party1conn.getParty()).thenReturn(party1);
+		when(party2conn.getParty()).thenReturn(party2);
+		when(party3conn.getParty()).thenReturn(party3);
+		when(party1conn.toString()).thenReturn("conn1");
+		when(party2conn.toString()).thenReturn("conn2");
+		when(party3conn.toString()).thenReturn("conn3");
+		when(party4conn.toString()).thenReturn("conn4");
+		when(action.toString()).thenReturn("act1");
+		when(settings.toString()).thenReturn("settings");
+		when(progressrounds.toString()).thenReturn("progressrounds");
+		when(progresstime.toString()).thenReturn("progresstime");
+
+		when(progressrounds.getTerminationTime())
+				.thenReturn(new Date(System.currentTimeMillis() + 3600000l));
+		when(progressrounds1.getTerminationTime())
+				.thenReturn(new Date(System.currentTimeMillis() + 3600000l));
+		when(progressrounds.advance()).thenReturn(progressrounds1);
+
+		partynrs.put(party1, 0);
+		partynrs.put(party2, 1);
+		partynrs.put(party3, 2);
+		partynrs.put(party4, 3);
+		Map<PartyId, Double> totalspent = new HashMap<>();
+
+		state1 = new SHAOPState(actions, connections, progresstime, settings,
+				null, 0, partynrs, totalspent);
+		state1a = new SHAOPState(actions, connections, progresstime, settings,
+				null, 0, partynrs, totalspent);
+		state2 = new SHAOPState(actions2, connections, progresstime, settings,
+				null, 0, partynrs, totalspent);
+		state3 = new SHAOPState(actions, connections, progressrounds, settings,
+				null, 0, partynrs, totalspent);
+		state4 = new SHAOPState(actions, connections, progresstime, settings,
+				null, 1, partynrs, totalspent);
+
+		when(settings.getTeams()).thenReturn(Arrays.asList(team1, team2));
+
+	}
+
+	@Override
+	public List<List<SHAOPState>> getGeneralTestData() {
+		return Arrays.asList(Arrays.asList(state1, state1a),
+				Arrays.asList(state2), Arrays.asList(state3),
+				Arrays.asList(state4));
+	}
+
+	@Override
+	public List<String> getGeneralTestStrings() {
+		return Arrays.asList(
+				"SHAOPState.*\\[\\].*ConnectionWithParties.*conn1.*conn2.*progresstime.*settings.*",
+				"SHAOPState.*\\[act1\\].*ConnectionWithParties.*conn1.*conn2.*progresstime.*settings.*",
+				"SHAOPState.*\\[\\].*ConnectionWithParties.*conn1.*conn2.*progressrounds.*settings.*",
+				"SHAOPState.*\\[\\].*ConnectionWithParties.*conn1.*conn2.*progresstime.*settings.*");
+	}
+
+	@Test
+	public void constructWith0Connection() {
+		new SHAOPState(actions, new ProtocolToPartyConnections(Arrays.asList()),
+				progresstime, settings, null, 0, null, null);
+	}
+
+	@Test
+	public void constructWithNullConnection() {
+		SHAOPState state = new SHAOPState(actions, null, progresstime, settings,
+				null, 0, null, null);
+		assertEquals(0, state.getConnections().size());
+	}
+
+	@Test
+	public void testCurrentActor() {
+		assertEquals(party1, state1.getCurrentTeam());
+	}
+
+	@Test
+	public void testNextActor2() {
+		ProtocolToPartyConnections conns = new ProtocolToPartyConnections(
+				Arrays.asList(party2conn, party3conn));
+		SHAOPState state = new SHAOPState(actions, conns, progresstime,
+				settings, null, 0, partynrs, null);
+		assertEquals(party2, state.getCurrentTeam());
+	}
+
+	@Test
+	public void testNextActorAfterAction() {
+		List<Action> actions = Arrays.asList(action);
+		SHAOPState state = new SHAOPState(actions, connections, progresstime,
+				settings, null, 0, null, null);
+		assertEquals(party1, state.getCurrentTeam());
+	}
+
+	@Test
+	public void isFinalTest() {
+		assertFalse(state1.isFinal(NOW));
+		SHAOPState state = new SHAOPState(actions, connections, progresstime,
+				settings, mock(ProtocolException.class), 0, null, null);
+		assertTrue(state.isFinal(NOW));
+	}
+
+	@Test
+	public void withExceptionTest() {
+		SHAOPState finalstate1 = state1.with(mock(ProtocolException.class));
+		assertTrue(finalstate1.isFinal(NOW));
+		SHAOPState finalstate2 = finalstate1
+				.with(mock(ProtocolException.class));
+		assertTrue(finalstate2.isFinal(NOW));
+	}
+
+	@Test
+	public void isOfferAgreementTest1() {
+		List<Action> actions = Arrays.asList(offer1);
+		SHAOPState state = new SHAOPState(actions, connections3, progressrounds,
+				settings, null, 0, null, null);
+		assertNull(state.getAgreement());
+	}
+
+	@Test
+	public void isOfferAcceptAgreementTest() {
+		List<Action> actions = Arrays.asList(offer1, accept2);
+		SHAOPState state = new SHAOPState(actions, connections4, progressrounds,
+				settings, null, 0, null, null);
+		assertNotNull(state.getAgreement());
+		assertTrue(state.isFinal(NOW));
+	}
+
+	@Test
+	public void isOfferAcceptOfferAgreementTest() {
+		List<Action> actions = Arrays.asList(offer1, accept1, offer1);
+		SHAOPState state = new SHAOPState(actions, connections3, progressrounds,
+				settings, null, 0, null, null);
+		assertNull(state.getAgreement());
+	}
+
+	@Test
+	public void isOfferAcceptAcceptotherAgreementTest() {
+		List<Action> actions = Arrays.asList(offer1, accept1, acceptother);
+		SHAOPState state = new SHAOPState(actions, connections3, progressrounds,
+				settings, null, 0, null, null);
+		assertEquals(null, state.getAgreement());
+	}
+
+	@Test(expected = IllegalArgumentException.class)
+	public void withWrongActionTest() {
+		// wrong because action has actor null which does not match party1
+		SHAOPState state = state1.with(party1, action);
+	}
+
+	@Test(expected = IllegalArgumentException.class)
+	public void withActionTest() {
+		when(action.getActor()).thenReturn(party1);
+		state1.with(party1, action);
+	}
+
+	@Test
+	public void withConnectionTest() {
+		SHAOPState state = state1.with(party3conn);
+		assertEquals(3, state.getConnections().size());
+	}
+
+	@Test
+	public void isEndNegotiationFinalTest() {
+		List<Action> actions = Arrays.asList(endNegotiation1);
+		SHAOPState state = new SHAOPState(actions, connections3, progressrounds,
+				settings, null, 0, null, null);
+		assertEquals(null, state.getAgreement());
+		assertEquals(null, state.getError());
+		assertTrue(state.isFinal(NOW));
+
+	}
+
+	@Test
+	public void isProtocolErrorFinal() {
+		SHAOPState state = new SHAOPState(actions, connections3, progressrounds,
+				settings, new ProtocolException("test error", "test"), 0, null,
+				null);
+		assertTrue(state.isFinal(NOW));
+		assertNotNull(state.getError());
+	}
+
+	@Test(expected = IllegalArgumentException.class)
+	public void RefuseImmediateAccept() {
+		Accept nullaccept = new Accept(party1, null);
+		SHAOPState state = state1.with(party1, nullaccept);
+	}
+
+	@Test(expected = IllegalArgumentException.class)
+	public void RefuseNotMyTurn() {
+		List<Action> actions = Arrays.asList(offer1);
+		SHAOPState state = new SHAOPState(actions, connections3, progressrounds,
+				settings, null, 1, partynrs, null);
+
+		state.with(party1, offer1);
+	}
+
+	@Test(expected = IllegalArgumentException.class)
+	public void RefuseNullAccept() {
+		List<Action> actions = Arrays.asList(offer1);
+		SHAOPState state = new SHAOPState(actions, connections3, progressrounds,
+				settings, null, 0, partynrs, null);
+
+		Accept nullaccept = new Accept(party2, null);
+		state = state.with(party2, nullaccept);
+		assertTrue(state.isFinal(NOW));
+	}
+
+	@Test(expected = IllegalArgumentException.class)
+	public void RefuseNullAction() {
+		List<Action> actions = Arrays.asList(offer1);
+		SHAOPState state = new SHAOPState(actions, connections3, progressrounds,
+				settings, null, 0, null, null);
+
+		state = state.with(party2, null);
+	}
+
+	@Test
+	public void testRoundNumberAfterActions() {
+
+		SHAOPState state = new SHAOPState(actions, connections4,
+				new ProgressRounds(10, 0, null), settings, null, 0, partynrs,
+				null);
+
+		assertEquals((Double) 0d,
+				state.getProgress().get(System.currentTimeMillis()));
+		Offer act1 = new Offer(party1, bid1);
+		state = state.with(party1, act1);
+		assertEquals((Double) 0d,
+				state.getProgress().get(System.currentTimeMillis()));
+		Offer act2 = new Offer(party3, bid1);
+		state = state.with(party3, act2);
+		assertEquals((Double) 0.1d,
+				state.getProgress().get(System.currentTimeMillis()));
+
+	}
+
+}
Index: /protocol/src/test/java/geniusweb/protocol/tournament/allpermutations/AllPermutationsSettingsTest.java
===================================================================
--- /protocol/src/test/java/geniusweb/protocol/tournament/allpermutations/AllPermutationsSettingsTest.java	(revision 17)
+++ /protocol/src/test/java/geniusweb/protocol/tournament/allpermutations/AllPermutationsSettingsTest.java	(revision 18)
@@ -32,7 +32,7 @@
 	private final ObjectMapper jackson = new ObjectMapper();
 
-	private final String serialized = "{\"AllPermutationsSettings\":{\"teams\":[{\"Team\":[{\"partyref\":\"party1\",\"parameters\":{}}]},{\"Team\":[{\"partyref\":\"party2\",\"parameters\":{}}]}],\"profileslists\":[{\"ProfileList\":[\"profile1\"]},{\"ProfileList\":[\"profile2\"]},{\"ProfileList\":[\"profile3\"]}],\"reuseTeams\":false,\"teamsPerSession\":2,\"sessionsettings\":{\"SAOPSettings\":{\"participants\":[],\"deadline\":{\"deadlinetime\":{\"durationms\":10000}}}}}}";
+	private final String serialized = "{\"AllPermutationsSettings\":{\"teams\":[{\"Team\":[{\"partyref\":\"party1\",\"parameters\":{}}]},{\"Team\":[{\"partyref\":\"party2\",\"parameters\":{}}]}],\"profileslists\":[{\"ProfileList\":[\"profile1\"]},{\"ProfileList\":[\"profile2\"]},{\"ProfileList\":[\"profile3\"]}],\"reuseTeams\":false,\"teamsPerSession\":2,\"sessionsettings\":{\"SAOPSettings\":{\"participants\":[],\"deadline\":{\"deadlinetime\":{\"durationms\":10000}}}},\"numberTournaments\":1}}";
 	private AllPermutationsSettings settings, settings1a, settings2, settings3,
-			settings4;
+			settings4, settings5;
 
 	// use directly because there is some hard coding currently.
@@ -76,19 +76,22 @@
 
 		settings = new AllPermutationsSettings(parties, profiles, false, 2,
-				saopsettings);
+				saopsettings, 1);
 
 		settings1a = new AllPermutationsSettings(parties, profiles, false, 2,
-				saopsettings);
+				saopsettings, 1);
 
 		settings2 = new AllPermutationsSettings(Arrays.asList(partywithparams1,
 				partywithparams2, partywithparams3), profiles, false, 2,
-				saopsettings);
+				saopsettings, 1);
 
 		settings3 = new AllPermutationsSettings(parties, profiles, true, 2,
-				saopsettings);
+				saopsettings, 1);
 
 		settings4 = new AllPermutationsSettings(parties,
 				Arrays.asList(profiles1, profiles2, profiles3, profiles1),
-				false, 2, saopsettings);
+				false, 2, saopsettings, 1);
+
+		settings5 = new AllPermutationsSettings(parties, profiles, false, 2,
+				saopsettings, 2);
 
 	}
@@ -98,5 +101,5 @@
 		return Arrays.asList(Arrays.asList(settings, settings1a),
 				Arrays.asList(settings2), Arrays.asList(settings3),
-				Arrays.asList(settings4));
+				Arrays.asList(settings4), Arrays.asList(settings5));
 	}
 
@@ -104,8 +107,9 @@
 	public List<String> getGeneralTestStrings() {
 		return Arrays.asList(
-				"AllPermutationsSettings.*party1.*party2.*,false,.*profile1.*profile2.*profile3.*,2,SAOPSettings.*",
-				"AllPermutationsSettings.*party1.*party2.*party3.*,false,.*profile1.*profile2.*profile3.*,2,SAOPSettings.*",
-				"AllPermutationsSettings.*party1.*party2.*,true,.*profile1.*profile2.*profile3.*,2,SAOPSettings.*",
-				"AllPermutationsSettings.*party1.*party2.*,false,.*profile1.*profile2.*profile3.*profile1.*,2,SAOPSettings.*");
+				"AllPermutationsSettings.*party1.*party2.*,false,.*profile1.*profile2.*profile3.*,2,SAOPSettings.*1.*",
+				"AllPermutationsSettings.*party1.*party2.*party3.*,false,.*profile1.*profile2.*profile3.*,2,SAOPSettings.*1.*",
+				"AllPermutationsSettings.*party1.*party2.*,true,.*profile1.*profile2.*profile3.*,2,SAOPSettings.*1.*",
+				"AllPermutationsSettings.*party1.*party2.*,false,.*profile1.*profile2.*profile3.*profile1.*,2,SAOPSettings.*1.*",
+				"AllPermutationsSettings.*party1.*party2.*,false,.*profile1.*profile2.*profile3.*,2,SAOPSettings.*2.*");
 	}
 
@@ -137,5 +141,5 @@
 		new AllPermutationsSettings(null,
 				Arrays.asList(profiles1, profiles2, profiles3, profiles1), true,
-				2, saopsettings);
+				2, saopsettings, 1);
 
 	}
@@ -145,5 +149,5 @@
 		new AllPermutationsSettings(Collections.emptyList(),
 				Arrays.asList(profiles1, profiles2, profiles3, profiles1), true,
-				2, saopsettings);
+				2, saopsettings, 1);
 
 	}
@@ -151,5 +155,5 @@
 	@Test(expected = IllegalArgumentException.class)
 	public void testNullProfiles() {
-		new AllPermutationsSettings(parties, null, true, 2, saopsettings);
+		new AllPermutationsSettings(parties, null, true, 2, saopsettings, 1);
 
 	}
@@ -159,5 +163,5 @@
 		new AllPermutationsSettings(parties,
 				Arrays.asList(profiles1, profiles2, profiles3, profiles1), true,
-				4, saopsettings);
+				4, saopsettings, 1);
 
 	}
@@ -167,5 +171,5 @@
 		new AllPermutationsSettings(parties,
 				Arrays.asList(profiles1, profiles2, profiles3, profiles1), true,
-				4, null);
+				4, null, 1);
 
 	}
@@ -175,5 +179,5 @@
 		new AllPermutationsSettings(parties,
 				Arrays.asList(profiles1, profiles2, profiles3, profiles1), true,
-				1, saopsettings);
+				1, saopsettings, 1);
 
 	}
Index: /pythonadapter/pom.xml
===================================================================
--- /pythonadapter/pom.xml	(revision 17)
+++ /pythonadapter/pom.xml	(revision 18)
@@ -6,5 +6,5 @@
 	<groupId>geniusweb</groupId>
 	<artifactId>pythonadapter</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,5 +32,5 @@
 			<groupId>geniusweb</groupId>
 			<artifactId>party</artifactId>
-			<version>1.4.0</version>
+			<version>${geniusweb.version}</version>
 		</dependency>
 
Index: /references/pom.xml
===================================================================
--- /references/pom.xml	(revision 17)
+++ /references/pom.xml	(revision 18)
@@ -6,5 +6,5 @@
 	<groupId>geniusweb</groupId>
 	<artifactId>references</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>
 
@@ -37,5 +38,5 @@
 			<groupId>tudelft.utilities</groupId>
 			<artifactId>repository</artifactId>
-			<version>1.0.1</version>
+			<version>1.1.0</version>
 		</dependency>
 		<!-- the core, which includes Streaming API, shared low-level abstractions 
@@ -95,5 +96,5 @@
 			<groupId>tudelft.utilities</groupId>
 			<artifactId>junit</artifactId>
-			<version>1.0.2</version>
+			<version>1.0.3</version>
 			<scope>test</scope>
 		</dependency>
Index: /simplerunner/pom.xml
===================================================================
--- /simplerunner/pom.xml	(revision 17)
+++ /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 17)
+++ /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 17)
+++ /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 17)
+++ /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 17)
+++ /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"}}}}
Index: /timeline/pom.xml
===================================================================
--- /timeline/pom.xml	(revision 17)
+++ /timeline/pom.xml	(revision 18)
@@ -6,5 +6,5 @@
 	<groupId>geniusweb</groupId>
 	<artifactId>timeline</artifactId>
-	<version>1.4.0</version>
+	<version>1.4.1</version> <!-- must equal ${geniusweb.version} -->
 	<packaging>jar</packaging>
 
@@ -16,4 +16,5 @@
 		<passwd>${env.ARTIFACTORY_PASS}</passwd>
 		<jackson-2-version>2.9.10</jackson-2-version>
+		<geniusweb.version>1.4.1</geniusweb.version>
 	</properties>
 
Index: /timeline/src/main/java/geniusweb/progress/Progress.java
===================================================================
--- /timeline/src/main/java/geniusweb/progress/Progress.java	(revision 17)
+++ /timeline/src/main/java/geniusweb/progress/Progress.java	(revision 18)
@@ -34,5 +34,5 @@
 	 *         eye on {@link #getTerminationTime()}.
 	 */
-	Double get(long currentTimeMs);
+	Double get(Long currentTimeMs);
 
 	/**
@@ -51,4 +51,4 @@
 	 * @return true iff the progress has passed the deadline.
 	 */
-	boolean isPastDeadline(long currentTimeMs);
+	boolean isPastDeadline(Long currentTimeMs);
 }
Index: /timeline/src/main/java/geniusweb/progress/ProgressRounds.java
===================================================================
--- /timeline/src/main/java/geniusweb/progress/ProgressRounds.java	(revision 17)
+++ /timeline/src/main/java/geniusweb/progress/ProgressRounds.java	(revision 18)
@@ -9,5 +9,5 @@
 /**
  * progress in terms of number of rounds. The round has to be updated by the
- * user of this class, calling {@link #advance()}.
+ * user of this class, calling {@link #advance()}. immutable.
  */
 @JsonTypeName("rounds")
@@ -49,6 +49,8 @@
 	/**
 	 * 
-	 * @return the current round. First round is 0. It is not recommended to use
-	 *         this, as this may make your code working with rounds only.
+	 * @return the current round. First round is 0. It is recommended that you
+	 *         use the functions in {@link Progress} instead of this, to ensure
+	 *         your code works with all implementations of Progress including
+	 *         future developments.
 	 */
 	public Integer getCurrentRound() {
@@ -58,6 +60,8 @@
 	/**
 	 * 
-	 * @return total number of rounds. It is not recommended to use this, as
-	 *         this may make your code working with rounds only.
+	 * @return total number of rounds. It is recommended that you use the
+	 *         functions in {@link Progress} instead of this, to ensure your
+	 *         code works with all implementations of Progress including future
+	 *         developments.
 	 */
 	public Integer getTotalRounds() {
@@ -66,5 +70,5 @@
 
 	@Override
-	public Double get(long currentTimeMs) {
+	public Double get(Long currentTimeMs) {
 		// deadline and current both are limited to MAXINT is 32 bits; double
 		// fits 52
@@ -79,5 +83,5 @@
 
 	@Override
-	public boolean isPastDeadline(long currentTimeMs) {
+	public boolean isPastDeadline(Long currentTimeMs) {
 		return currentRound >= duration || currentTimeMs > endtime.getTime();
 	}
Index: /timeline/src/main/java/geniusweb/progress/ProgressTime.java
===================================================================
--- /timeline/src/main/java/geniusweb/progress/ProgressTime.java	(revision 17)
+++ /timeline/src/main/java/geniusweb/progress/ProgressTime.java	(revision 18)
@@ -51,5 +51,5 @@
 
 	@Override
-	public Double get(long currentTimeMs) {
+	public Double get(Long currentTimeMs) {
 		long delta = currentTimeMs - start.getTime();
 		// double should have ~53 digits of precision, and we're computing
@@ -66,5 +66,5 @@
 
 	@Override
-	public boolean isPastDeadline(long currentTimeMs) {
+	public boolean isPastDeadline(Long currentTimeMs) {
 		return currentTimeMs > start.getTime() + duration;
 	}
