Index: src/main/webapp/newsession.xhtml
===================================================================
--- src/main/webapp/newsession.xhtml	(revision 17)
+++ src/main/webapp/newsession.xhtml	(revision 18)
@@ -40,5 +40,5 @@
 	<br /> Domain/Profile Server:
 	<input type="url" name="url" id="profilesserverurl"
-		value="localhost:8080/profilesserver-1.5.0"
+		value="localhost:8080/profilesserver-1.5.1"
 		pattern=".*:[0-9]+/profilesserver" size="30"
 		onchange="connectDomain()"> </input>
@@ -54,5 +54,5 @@
 		<br /> <b>Participants</b> <br /> Parties Server: <input type="url"
 			name="url" id="partiesserverurl"
-			value="localhost:8080/partiesserver-1.5.0"
+			value="localhost:8080/partiesserver-1.5.1"
 			pattern=".*:[0-9]+/partiesserver" size="30"
 			onchange="connectParties()"> </input> <br /> <br /> <b>Party
@@ -294,8 +294,8 @@
 	 refresh table: copy all parties elements in there.
 	 Typically parties is something like
-	 [{"uri":"http:130.161.180.1:8080/partiesserver/run/randomparty-1.5.0",
+	 [{"uri":"http:130.161.180.1:8080/partiesserver/run/randomparty-1.5.1",
 		 "capabilities":{"protocols":["SAOP"]},
 		 "description":"places random bids until it can accept an offer with utility >0.6",
-		 "id":"randomparty-1.5.0",
+		 "id":"randomparty-1.5.1",
 		 "partyClass":"geniusweb.exampleparties.randomparty.RandomParty"},
 		 		 ...]
@@ -632,6 +632,6 @@
 	function init() {
 		selectProtocol();
-		document.getElementById("partiesserverurl").value =window.location.hostname+":8080/partiesserver-1.5.0"
-		document.getElementById("profilesserverurl").value =window.location.hostname+":8080/profilesserver-1.5.0"
+		document.getElementById("partiesserverurl").value =window.location.hostname+":8080/partiesserver-1.5.1"
+		document.getElementById("profilesserverurl").value =window.location.hostname+":8080/profilesserver-1.5.1"
 		connectDomain();
 		connectParties();
Index: src/main/webapp/newtournament.xhtml
===================================================================
--- src/main/webapp/newtournament.xhtml	(revision 17)
+++ src/main/webapp/newtournament.xhtml	(revision 18)
@@ -585,6 +585,6 @@
 	*/
 	function init() {
-		document.getElementById("partiesserverurl").value =window.location.hostname+":8080/partiesserver-1.5.0";
-		document.getElementById("profilesserverurl").value =window.location.hostname+":8080/profilesserver-1.5.0";
+		document.getElementById("partiesserverurl").value =window.location.hostname+":8080/partiesserver-1.5.1";
+		document.getElementById("profilesserverurl").value =window.location.hostname+":8080/profilesserver-1.5.1";
 
 		selectProtocol();
Index: src/main/webapp/plotlog.xhtml
===================================================================
--- src/main/webapp/plotlog.xhtml	(revision 17)
+++ src/main/webapp/plotlog.xhtml	(revision 18)
@@ -91,5 +91,9 @@
         	} else if (json['SHAOPState']!=undefined) {
         		processSHAOP(json['SHAOPState']);
-        	} else {
+        	} else if (json['MOPACState']!=undefined) {
+        		// just use the SAOP processor, which shows the
+        		// utilities of all Offers in sequence.
+        		processSAOP(json['MOPACState']);
+        	} else{
             	setStatus("Unknown log file contents "+Object.keys(json));
             }
Index: src/main/webapp/utilstable.xhtml
===================================================================
--- src/main/webapp/utilstable.xhtml	(revision 17)
+++ src/main/webapp/utilstable.xhtml	(revision 18)
@@ -28,5 +28,5 @@
 			<tr>
 				<th align="center">run nr</th>
-				<th align="center">accepted bid</th>
+				<th align="center">accepted bid(s)</th>
 				<th align="center">party utility - penalty</th>
 			</tr>
@@ -212,6 +212,48 @@
         }
 
-        	
-        
+        /**
+        @return true if object1, object2 are 'deep equal'. That means,
+        if they are dicts then we check that the keys and their values are equal, 
+        recursively.
+        */
+       function deepEqual(object1, object2) {
+    	   const keys1 = Object.keys(object1);
+    	   const keys2 = Object.keys(object2);
+
+    	   if (keys1.length !== keys2.length) {
+    	     return false;
+    	   }
+
+    	   for (const key of keys1) {
+    	     const val1 = object1[key];
+    	     const val2 = object2[key];
+    	     const areObjects = isObject(val1) && isObject(val2);
+    	     if (
+    	       areObjects && !deepEqual(val1, val2) ||      !areObjects && val1 !== val2
+    	     ) {
+    	       return false;
+    	     }
+    	   }
+
+    	   return true;
+    	 }
+
+    	 function isObject(object) {
+    	   return object != null && typeof object === 'object';
+    	 } 
+    	 
+    	 /**
+    	 @param list the list to add value to
+    	 @param value the value to add
+    	 @return list with the value added, but only if not already in list.
+    	 Uses deepEqual to check equality of list members 
+    	 */
+    	 function addSet(list, value) {
+    		 for (const v of list) {
+    			 if (deepEqual(v, value))
+    				 return list;
+    		 }
+    		 return list.concat(value);
+    	 }
 
         /**
@@ -219,5 +261,5 @@
         @param nr the row number
         @param result a single json result from the APP results section. 
-        Contains participants, agreement and error
+        Contains participants, agreements and error
         */
         function fillRow(row, nr, result) {
@@ -234,8 +276,17 @@
         	}
 
-        	var agreedbid = result['agreement'];
-        	row.insertCell(-1).innerHTML = (agreedbid==null?"none":JSON.stringify(agreedbid['issuevalues']));
-        	if (agreedbid==null) agreedbid = {};
-        	else agreedbid = agreedbid['issuevalues'];
+        	// collect unique bids in agreements.
+        	var agreements = result['agreements'];
+        	var bids = [];
+        	for (const pid in agreements) {
+        		bids=addSet(bids, agreements[pid]['issuevalues']);
+        	}
+        		
+        		
+        	// a dict, keys are party ids. 
+        	// FIXME this does not work ok with MOPAC.
+        	row.insertCell(-1).innerHTML = JSON.stringify(bids);
+        	var agreedbid={};
+        	if (bids.length>0) agreedbid = bids[0];
         	
         	// fill in the columns. If SHAOP, only the even parties 
