Index: exampleparties/randomparty/src/main/java/geniusweb/exampleparties/randomparty/RandomParty.java
===================================================================
--- exampleparties/randomparty/src/main/java/geniusweb/exampleparties/randomparty/RandomParty.java	(revision 24)
+++ exampleparties/randomparty/src/main/java/geniusweb/exampleparties/randomparty/RandomParty.java	(revision 25)
@@ -63,4 +63,5 @@
 	private Settings settings;
 	private Votes lastvotes;
+	private String protocol;
 
 	public RandomParty() {
@@ -81,4 +82,6 @@
 				this.progress = settings.getProgress();
 				this.settings = settings;
+				this.protocol = settings.getProtocol().getURI().getPath();
+
 			} else if (info instanceof ActionDone) {
 				Action otheract = ((ActionDone) info).getAction();
@@ -88,5 +91,4 @@
 			} else if (info instanceof YourTurn) {
 				makeOffer();
-				nextRound();
 			} else if (info instanceof Finished) {
 				getReporter().log(Level.INFO, "Final ourcome:" + info);
@@ -94,20 +96,12 @@
 				lastvotes = vote((Voting) info);
 				getConnection().send(lastvotes);
-				nextRound();
 			} else if (info instanceof OptIn) {
 				// just repeat our last vote.
 				getConnection().send(lastvotes);
-				nextRound();
 			}
 		} catch (Exception e) {
 			throw new RuntimeException("Failed to handle info", e);
 		}
-	}
-
-	private void nextRound() {
-		if (progress instanceof ProgressRounds) {
-			progress = ((ProgressRounds) progress).advance();
-		}
-
+		updateRound(info);
 	}
 
@@ -125,9 +119,37 @@
 
 	/**
+	 * Update {@link #progress}
+	 * 
+	 * @param info the received info. Used to determine if this is the last info
+	 *             of the round
+	 */
+	private void updateRound(Inform info) {
+		if (protocol == null)
+			return;
+		switch (protocol) {
+		case "SAOP":
+		case "SHAOP":
+			if (!(info instanceof YourTurn))
+				return;
+			break;
+		case "MOPAC":
+			if (!(info instanceof OptIn))
+				return;
+			break;
+		default:
+			return;
+		}
+		// if we get here, round must be increased.
+		if (progress instanceof ProgressRounds) {
+			progress = ((ProgressRounds) progress).advance();
+		}
+
+	}
+
+	/**
 	 * send our next offer
 	 */
 	private void makeOffer() throws IOException {
 		Action action;
-		String protocol = settings.getProtocol().getURI().getPath();
 		if ((protocol.equals("SAOP") || protocol.equals("SHAOP"))
 				&& isGood(lastReceivedBid)) {
Index: exampleparties/randomparty/src/test/java/geniusweb/exampleparties/randomparty/RandomPartyTest.java
===================================================================
--- exampleparties/randomparty/src/test/java/geniusweb/exampleparties/randomparty/RandomPartyTest.java	(revision 24)
+++ exampleparties/randomparty/src/test/java/geniusweb/exampleparties/randomparty/RandomPartyTest.java	(revision 25)
@@ -7,4 +7,5 @@
 import static org.mockito.Matchers.eq;
 import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
@@ -42,4 +43,5 @@
 import geniusweb.inform.Finished;
 import geniusweb.inform.Inform;
+import geniusweb.inform.OptIn;
 import geniusweb.inform.Settings;
 import geniusweb.inform.Voting;
@@ -68,6 +70,7 @@
 	private final TestConnection connection = new TestConnection();
 	private final ProtocolRef protocol = new ProtocolRef(SAOP);
+	private final ProtocolRef mopacProtocol = new ProtocolRef("MOPAC");
 	private final ProgressRounds progress = mock(ProgressRounds.class);
-	private Settings settings;
+	private Settings settings, mopacSettings;
 	private LinearAdditive profile;
 	private final Parameters parameters = new Parameters();
@@ -80,4 +83,7 @@
 				new ProfileRef(new URI("file:" + PROFILE)), protocol, progress,
 				parameters);
+		mopacSettings = new Settings(PARTY1,
+				new ProfileRef(new URI("file:" + PROFILE)), mopacProtocol,
+				progress, parameters);
 
 		String serialized = new String(Files.readAllBytes(Paths.get(PROFILE)),
@@ -174,5 +180,5 @@
 
 	@Test
-	public void testAgentsUpdatesProgress() {
+	public void testAgentsUpdatesSAOPProgress() {
 		party.connect(connection);
 		party.notifyChange(settings);
@@ -180,4 +186,18 @@
 		party.notifyChange(new YourTurn());
 		verify(progress).advance();
+	}
+
+	@Test
+	public void testAgentsUpdatesMOPACProgress() {
+		party.connect(connection);
+		party.notifyChange(mopacSettings);
+		// in mopac, progress happens only after optin phase
+		party.notifyChange(new YourTurn());
+		verify(progress, times(0)).advance();
+		party.notifyChange(
+				new Voting(Collections.emptyList(), Collections.emptyMap()));
+		verify(progress, times(0)).advance();
+		party.notifyChange(new OptIn(Collections.emptyList()));
+		verify(progress, times(1)).advance();
 	}
 
@@ -199,7 +219,7 @@
 
 	@Test
-	public void testVoting() {
-		party.connect(connection);
-		party.notifyChange(settings);
+	public void testVoting() throws URISyntaxException {
+		party.connect(connection);
+		party.notifyChange(mopacSettings);
 
 		Bid bid = findGoodBid();
