Index: protocol/src/main/java/geniusweb/protocol/ProtocolException.java
===================================================================
--- protocol/src/main/java/geniusweb/protocol/ProtocolException.java	(revision 1)
+++ protocol/src/main/java/geniusweb/protocol/ProtocolException.java	(revision 4)
@@ -13,5 +13,4 @@
 
 	/**
-	 * 
 	 * @param message the error message
 	 * @param party   offending party, either the {@link PartyId} or a
@@ -19,9 +18,14 @@
 	 */
 	public ProtocolException(String message, String party) {
-		super(party + ":" + message);
-		this.party = party;
+		this(message, party, null);
 	}
 
 	/**
+	 * ProtocolException is special, in that it does not auto-fill the
+	 * stacktrace. This is needed because usually a ProtocolException is caused
+	 * by a party doing a bad action. Creating a stacktrace pointing to the
+	 * class reporting the protocol exception (usually, the protocol handler)
+	 * makes no sense as the protocol handler is doing the correct job there.
+	 * 
 	 * 
 	 * @param message the error message
@@ -31,5 +35,5 @@
 	 */
 	public ProtocolException(String message, String party, Throwable e) {
-		super(party + ":" + message, e);
+		super(party + ":" + message, e, true, false);
 		this.party = party;
 	}
Index: protocol/src/main/java/geniusweb/protocol/session/saop/SAOP.java
===================================================================
--- protocol/src/main/java/geniusweb/protocol/session/saop/SAOP.java	(revision 1)
+++ protocol/src/main/java/geniusweb/protocol/session/saop/SAOP.java	(revision 4)
@@ -2,4 +2,6 @@
 
 import java.io.IOException;
+import java.sql.Date;
+import java.text.SimpleDateFormat;
 import java.util.List;
 import java.util.Timer;
@@ -190,4 +192,6 @@
 							"BUG. Deadline timer has triggered but state is not final");
 				}
+				log.log(Level.WARNING,
+						"SAOP deadline reached. Terminating session.");
 				finish();
 			}
@@ -196,4 +200,8 @@
 		// early
 		deadlinetimer.schedule(task, deadline.getDuration() + TIME_MARGIN);
+		log.log(Level.INFO, "SAOP deadline set to "
+				+ new SimpleDateFormat("yyyy/MM/dd HH:mm:ss")
+						.format(new Date(System.currentTimeMillis()
+								+ deadline.getDuration() + TIME_MARGIN)));
 	}
 
@@ -251,5 +259,6 @@
 			final ConnectionWithParty partyconn, final Action action) {
 		if (action == null) {
-			handleError("Received null from " + partyconn + ". Closing session",
+			handleError(partyconn
+					+ " did null action, breaching the protocol. Closing session",
 					partyconn.getParty().getName(), null);
 			return;
@@ -259,5 +268,6 @@
 			if (!partyconn.getParty().equals(state.getNextActor())) {
 				// party does not have the turn.
-				throw new ProtocolException(" act without having the turn",
+				throw new ProtocolException(
+						"Party acts without having the turn",
 						partyconn.getParty().getName());
 			}
Index: protocol/src/main/java/geniusweb/protocol/session/saop/SAOPState.java
===================================================================
--- protocol/src/main/java/geniusweb/protocol/session/saop/SAOPState.java	(revision 1)
+++ protocol/src/main/java/geniusweb/protocol/session/saop/SAOPState.java	(revision 4)
@@ -189,5 +189,5 @@
 		}
 		if (!actor.equals(getNextActor())) {
-			throw new ProtocolException("actor does not have the turn ",
+			throw new ProtocolException("Party does not have the turn ",
 					actor.getName());
 
@@ -211,6 +211,6 @@
 			if (!bid.equals(((Accept) action).getBid())) {
 				throw new ProtocolException(
-						"Accepts a bid that was not offered (last offer =" + bid
-								+ ", action=" + action + ")",
+						"Party accepts a bid differing from the last offer ="
+								+ bid + ", action=" + action + ")",
 						actor.getName());
 			}
Index: protocol/src/test/java/geniusweb/protocol/session/saop/SAOPStateTest.java
===================================================================
--- protocol/src/test/java/geniusweb/protocol/session/saop/SAOPStateTest.java	(revision 1)
+++ protocol/src/test/java/geniusweb/protocol/session/saop/SAOPStateTest.java	(revision 4)
@@ -284,5 +284,5 @@
 		assertTrue(state.isFinal(NOW));
 		assertEquals(
-				"geniusweb.protocol.ProtocolException: party1:actor does not have the turn ",
+				"geniusweb.protocol.ProtocolException: party1:Party does not have the turn ",
 				state.getError().toString());
 	}
@@ -297,6 +297,6 @@
 		state = state.with(party2, nullaccept);
 		assertTrue(state.isFinal(NOW));
-		assertTrue(state.getError().toString()
-				.matches(".*party2.*Accepts a bid that was not offered.*"));
+		assertTrue(state.getError().toString().matches(
+				".*party2.*Party accepts a bid differing from the last offer.*"));
 	}
 
