Index: events/pom.xml
===================================================================
--- events/pom.xml	(revision 25)
+++ events/pom.xml	(revision 26)
@@ -6,5 +6,5 @@
 	<groupId>geniusweb</groupId>
 	<artifactId>events</artifactId>
-	<version>1.5.4</version> <!-- must equal ${geniusweb.version} -->
+	<version>1.5.5</version> <!-- must equal ${geniusweb.version} -->
 	<packaging>jar</packaging>
 
@@ -17,5 +17,5 @@
 		<passwd>${env.ARTIFACTORY_PASS}</passwd>
 		<jackson-2-version>2.9.10</jackson-2-version>
-		<geniusweb.version>1.5.4</geniusweb.version>
+		<geniusweb.version>1.5.5</geniusweb.version>
 	</properties>
 
Index: events/src/main/java/geniusweb/actions/Votes.java
===================================================================
--- events/src/main/java/geniusweb/actions/Votes.java	(revision 25)
+++ events/src/main/java/geniusweb/actions/Votes.java	(revision 26)
@@ -2,8 +2,8 @@
 
 import java.util.Collections;
-import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Optional;
+import java.util.Set;
 import java.util.stream.Collectors;
 
@@ -18,5 +18,5 @@
  */
 public class Votes extends AbstractAction {
-	private final List<Vote> votes;
+	private final Set<Vote> votes;
 
 	/**
@@ -24,10 +24,10 @@
 	 * @param id    party id
 	 * @param votes the {@link Vote}s that the party can agree on, if the
-	 *              condition of the Vote holds. There can be at most 1
-	 *              {@link Vote} for each bid.
+	 *              condition of the Vote holds. Every {@link Vote#getActor()}
+	 *              should equal the id
 	 */
 	@JsonCreator
 	public Votes(@JsonProperty("actor") PartyId id,
-			@JsonProperty("votes") List<Vote> votes) {
+			@JsonProperty("votes") Set<Vote> votes) {
 		super(id);
 		this.votes = votes;
@@ -40,4 +40,5 @@
 			}
 		}
+		// check for duplicate Vote's, possibly with different powers
 		Map<Bid, Long> counts = votes.stream().map(vote -> vote.getBid())
 				.collect(Collectors.groupingBy(bid -> bid,
@@ -86,6 +87,6 @@
 	}
 
-	public List<Vote> getVotes() {
-		return Collections.unmodifiableList(votes);
+	public Set<Vote> getVotes() {
+		return Collections.unmodifiableSet(votes);
 	}
 
Index: events/src/main/java/geniusweb/inform/Agreements.java
===================================================================
--- events/src/main/java/geniusweb/inform/Agreements.java	(revision 25)
+++ events/src/main/java/geniusweb/inform/Agreements.java	(revision 26)
@@ -5,4 +5,5 @@
 import java.util.Map;
 import java.util.Set;
+import java.util.stream.Collectors;
 
 import com.fasterxml.jackson.annotation.JsonAutoDetect;
@@ -29,6 +30,15 @@
 
 	@JsonCreator
-	private Agreements(Map<PartyId, Bid> agrees) {
+	protected Agreements(Map<PartyId, Bid> agrees) {
 		this.agreements = agrees;
+	}
+
+	/**
+	 * @param bid     a bid that all parties agreed on
+	 * @param parties the {@link PartyId}s of the agreeing parties
+	 */
+	public Agreements(Bid bid, Set<PartyId> parties) {
+		this(parties.stream()
+				.collect(Collectors.toMap(pid -> pid, pid -> bid)));
 	}
 
@@ -48,25 +58,4 @@
 		}
 		return new Agreements(newagrees);
-	}
-
-	/**
-	 * @param bid     a {@link Bid} to be added
-	 * @param parties {@link Set} of the {@link PartyId}s that accepted the bid
-	 * @return new Agreements, with the new bid/parties added.
-	 */
-	public Agreements with(Bid bid, Set<PartyId> parties) {
-		if (parties.size() < 2) {
-			throw new IllegalArgumentException(
-					"Agreement must contain at least 2 parties");
-		}
-		Map<PartyId, Bid> newagreements = new HashMap<>(agreements);
-		for (PartyId party : parties) {
-			if (agreements.containsKey(party)) {
-				throw new IllegalArgumentException(
-						"A party can agree only on 1 bid");
-			}
-			newagreements.put(party, bid);
-		}
-		return new Agreements(newagreements);
 	}
 
Index: events/src/main/java/geniusweb/inform/Voting.java
===================================================================
--- events/src/main/java/geniusweb/inform/Voting.java	(revision 25)
+++ events/src/main/java/geniusweb/inform/Voting.java	(revision 26)
@@ -8,6 +8,6 @@
 import com.fasterxml.jackson.annotation.JsonProperty;
 
+import geniusweb.actions.Offer;
 import geniusweb.actions.PartyId;
-import geniusweb.issuevalue.Bid;
 
 /**
@@ -16,11 +16,11 @@
 public class Voting implements Inform {
 
-	private final List<Bid> bids;
+	private final List<Offer> offers;
 	private final Map<PartyId, Integer> powers;
 
 	@JsonCreator
-	public Voting(@JsonProperty("bids") List<Bid> bids,
+	public Voting(@JsonProperty("offers") List<Offer> offers,
 			@JsonProperty("powers") Map<PartyId, Integer> powers) {
-		this.bids = bids;
+		this.offers = offers;
 		this.powers = powers;
 	}
@@ -29,6 +29,6 @@
 	 * @return list of bids to be voted on
 	 */
-	public List<Bid> getBids() {
-		return Collections.unmodifiableList(bids);
+	public List<Offer> getBids() {
+		return Collections.unmodifiableList(offers);
 	}
 
@@ -47,5 +47,5 @@
 		final int prime = 31;
 		int result = 1;
-		result = prime * result + ((bids == null) ? 0 : bids.hashCode());
+		result = prime * result + ((offers == null) ? 0 : offers.hashCode());
 		result = prime * result + ((powers == null) ? 0 : powers.hashCode());
 		return result;
@@ -61,8 +61,8 @@
 			return false;
 		Voting other = (Voting) obj;
-		if (bids == null) {
-			if (other.bids != null)
+		if (offers == null) {
+			if (other.offers != null)
 				return false;
-		} else if (!bids.equals(other.bids))
+		} else if (!offers.equals(other.offers))
 			return false;
 		if (powers == null) {
@@ -76,5 +76,5 @@
 	@Override
 	public String toString() {
-		return "Voting[" + bids + "," + powers + "]";
+		return "Voting[" + offers + "," + powers + "]";
 	}
 
Index: events/src/test/java/geniusweb/actions/AcceptTest.java
===================================================================
--- events/src/test/java/geniusweb/actions/AcceptTest.java	(revision 26)
+++ events/src/test/java/geniusweb/actions/AcceptTest.java	(revision 26)
@@ -0,0 +1,91 @@
+package geniusweb.actions;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.IOException;
+import java.util.Arrays;
+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 com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import geniusweb.issuevalue.Bid;
+import geniusweb.issuevalue.DiscreteValue;
+import geniusweb.issuevalue.NumberValue;
+import geniusweb.issuevalue.Value;
+import tudelft.utilities.junit.GeneralTests;
+
+public class AcceptTest extends GeneralTests<Accept> {
+	private final ObjectMapper jackson = new ObjectMapper();
+
+	private static final PartyId id = new PartyId("party1");
+	private static final PartyId id2 = new PartyId("party2");
+	private final static Map<String, Value> issuevalues = new HashMap<String, Value>();
+	private final static Map<String, Value> issuevaluesb = new HashMap<String, Value>();
+	private static Bid bid;
+	private static Bid bidb;
+	private final static String ISSUE1 = "issue1";
+	private final static Value VALUE1 = new DiscreteValue("value1");
+	private final static String ISSUE2 = "issue2";
+	private final static Value VALUE2 = new NumberValue("10");
+	// issue 2 is NUMBER and thus serializes with leading '='
+	private final String acceptstring = "{\"accept\":{\"actor\":\"party1\",\"bid\":{\"issuevalues\":{\"issue2\":10,\"issue1\":\"value1\"}}}}";
+
+	private static Accept accept, accept1, accept2, acceptb;
+
+	static {
+		issuevalues.put(ISSUE1, VALUE1);
+		issuevalues.put(ISSUE2, VALUE2);
+		bid = new Bid(issuevalues);
+		accept = new Accept(id, bid);
+		accept1 = new Accept(id, bid);
+
+		accept2 = new Accept(id2, bid);
+
+		// values swapped, so different issuevalues.
+		issuevaluesb.put(ISSUE1, VALUE2);
+		issuevaluesb.put(ISSUE2, VALUE2);
+		bidb = new Bid(issuevaluesb);
+		acceptb = new Accept(id, bidb);
+
+	}
+
+	@Override
+	public List<List<Accept>> getGeneralTestData() {
+		List<List<Accept>> list = new LinkedList<>();
+		list.add(Arrays.asList(accept, accept1));
+		list.add(Arrays.asList(accept2));
+		list.add(Arrays.asList(acceptb));
+		return list;
+	}
+
+	@Override
+	public List<String> getGeneralTestStrings() {
+		return Arrays.asList("Accept.*" + id + ".*]", "Accept.*" + id2 + ".*]",
+				"Accept.*" + id + ".*]");
+	}
+
+	@Before
+	public void before() {
+
+	}
+
+	@Test
+	public void serializeAcceptTest() throws JsonProcessingException {
+		System.out.println(jackson.writeValueAsString(accept));
+		assertEquals(acceptstring, jackson.writeValueAsString(accept));
+	}
+
+	@Test
+	public void deserializeAcceptTest() throws IOException {
+		Action act = jackson.readValue(acceptstring, Action.class);
+		assertEquals(accept, act);
+	}
+
+}
Index: events/src/test/java/geniusweb/actions/ComparisonTest.java
===================================================================
--- events/src/test/java/geniusweb/actions/ComparisonTest.java	(revision 26)
+++ events/src/test/java/geniusweb/actions/ComparisonTest.java	(revision 26)
@@ -0,0 +1,97 @@
+package geniusweb.actions;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import geniusweb.issuevalue.Bid;
+import geniusweb.issuevalue.DiscreteValue;
+import geniusweb.issuevalue.NumberValue;
+import geniusweb.issuevalue.Value;
+import tudelft.utilities.junit.GeneralTests;
+
+public class ComparisonTest extends GeneralTests<Comparison> {
+	private final ObjectMapper jackson = new ObjectMapper();
+
+	private static final PartyId id = new PartyId("party1");
+	private static final PartyId id2 = new PartyId("party2");
+	private final static Map<String, Value> issuevalues = new HashMap<String, Value>();
+	private final static Map<String, Value> issuevaluesb = new HashMap<String, Value>();
+	private static Bid bid;
+	private static Bid bidb;
+	private final static String ISSUE1 = "issue1";
+	private final static Value VALUE1 = new DiscreteValue("value1");
+	private final static String ISSUE2 = "issue2";
+	private final static Value VALUE2 = new NumberValue("10");
+	// issue 2 is NUMBER and thus serializes with leading '='
+	private final String acceptstring = "{\"Comparison\":{\"bid\":{\"issuevalues\":{\"issue2\":10,\"issue1\":\"value1\"}},\"better\":[],\"worse\":[],\"actor\":\"party1\"}}";
+
+	private static Comparison accept, accept1, accept2, acceptb, acceptc,
+			acceptd;
+
+	@Before
+	public void before() {
+		issuevalues.put(ISSUE1, VALUE1);
+		issuevalues.put(ISSUE2, VALUE2);
+		bid = new Bid(issuevalues);
+		List<Bid> better = Collections.EMPTY_LIST;
+		List<Bid> worse = Collections.EMPTY_LIST;
+		accept = new Comparison(id, bid, better, worse);
+		accept1 = new Comparison(id, bid, better, worse);
+
+		accept2 = new Comparison(id2, bid, better, worse);
+
+		// values swapped, so different issuevalues.
+		issuevaluesb.put(ISSUE1, VALUE2);
+		issuevaluesb.put(ISSUE2, VALUE2);
+		bidb = new Bid(issuevaluesb);
+		acceptb = new Comparison(id, bidb, better, worse);
+
+		List<Bid> better1 = Arrays.asList(bid);
+		List<Bid> worse1 = Arrays.asList(bidb);
+		acceptc = new Comparison(id, bidb, better1, worse);
+		acceptd = new Comparison(id, bidb, better, worse1);
+
+	}
+
+	@Override
+	public List<List<Comparison>> getGeneralTestData() {
+		return Arrays.asList(Arrays.asList(accept, accept1),
+				Arrays.asList(accept2), Arrays.asList(acceptb),
+				Arrays.asList(acceptc), Arrays.asList(acceptd));
+	}
+
+	@Override
+	public List<String> getGeneralTestStrings() {
+		return Arrays.asList(
+				"Comparison.*Bid.*issue2=10.*issue1=\"value1\".*better=\\[\\].*worse=\\[\\].*",
+				"Comparison.*party2.*Bid.*issue2=10.*issue1=\"value1\".*better=\\[\\].*worse=\\[\\].*",
+				"Comparison.*party1.*Bid.*issue2=10.*issue1=10.*better=\\[\\].*worse=\\[\\].*",
+				"Comparison.*party1.*Bid.*issue2=10.*issue1=10.*better=\\[Bid.*issue2=10.*issue1=\"value1\".*\\].*worse=\\[\\].*",
+				"Comparison.*party1.*Bid.*issue2=10.*issue1=10.*better=\\[\\].*worse=\\[Bid.*issue2=10.*issue1=10.*\\].*");
+	}
+
+	@Test
+	public void serializeAcceptTest() throws JsonProcessingException {
+		System.out.println(jackson.writeValueAsString(accept));
+		assertEquals(acceptstring, jackson.writeValueAsString(accept));
+	}
+
+	@Test
+	public void deserializeAcceptTest() throws IOException {
+		Action act = jackson.readValue(acceptstring, Action.class);
+		assertEquals(accept, act);
+	}
+
+}
Index: events/src/test/java/geniusweb/actions/ElicitComparisonTest.java
===================================================================
--- events/src/test/java/geniusweb/actions/ElicitComparisonTest.java	(revision 26)
+++ events/src/test/java/geniusweb/actions/ElicitComparisonTest.java	(revision 26)
@@ -0,0 +1,89 @@
+package geniusweb.actions;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import geniusweb.issuevalue.Bid;
+import geniusweb.issuevalue.DiscreteValue;
+import geniusweb.issuevalue.NumberValue;
+import geniusweb.issuevalue.Value;
+import tudelft.utilities.junit.GeneralTests;
+
+public class ElicitComparisonTest extends GeneralTests<ElicitComparison> {
+	private final ObjectMapper jackson = new ObjectMapper();
+
+	private static final PartyId id = new PartyId("party1");
+	private static final PartyId id2 = new PartyId("party2");
+	private final static Map<String, Value> issuevalues = new HashMap<String, Value>();
+	private final static Map<String, Value> issuevaluesb = new HashMap<String, Value>();
+	private static Bid bid;
+	private static Bid bidb;
+	private final static String ISSUE1 = "issue1";
+	private final static Value VALUE1 = new DiscreteValue("value1");
+	private final static String ISSUE2 = "issue2";
+	private final static Value VALUE2 = new NumberValue("10");
+	// issue 2 is NUMBER and thus serializes with leading '='
+	private final String acceptstring = "{\"ElicitComparison\":{\"actor\":\"party1\",\"bid\":{\"issuevalues\":{\"issue2\":10,\"issue1\":\"value1\"}},\"options\":[{\"issuevalues\":{\"issue2\":10,\"issue1\":\"value1\"}}]}}";
+
+	private static ElicitComparison accept1, accept1a, accept2, accept3,
+			accept4;
+
+	@Before
+	public void before() {
+		issuevalues.put(ISSUE1, VALUE1);
+		issuevalues.put(ISSUE2, VALUE2);
+
+		issuevaluesb.put(ISSUE1, VALUE2);
+		bid = new Bid(issuevalues);
+		bidb = new Bid(issuevaluesb);
+
+		List<Bid> opts = Arrays.asList(bid);
+		List<Bid> opts2 = Arrays.asList(bidb);
+
+		accept1 = new ElicitComparison(id, bid, opts);
+		accept1a = new ElicitComparison(id, bid, opts);
+		accept2 = new ElicitComparison(id2, bid, opts);
+		accept3 = new ElicitComparison(id, bidb, opts);
+		accept4 = new ElicitComparison(id, bid, opts2);
+	}
+
+	@Override
+	public List<List<ElicitComparison>> getGeneralTestData() {
+		return Arrays.asList(Arrays.asList(accept1, accept1a),
+				Arrays.asList(accept2), Arrays.asList(accept3),
+				Arrays.asList(accept4));
+	}
+
+	@Override
+	public List<String> getGeneralTestStrings() {
+		return Arrays.asList(
+				"ElicitComparison.*party1.*Bid.*10.*value1.*\\[.*Bid.*10.*value1.*\\].*",
+				"ElicitComparison.*party2.*Bid.*10.*value1.*\\[.*Bid.*10.*value1.*\\].*",
+				"ElicitComparison.*party1.*Bid.*10.*\\[.*Bid.*10.*value1.*\\].*",
+				"ElicitComparison.*party1.*Bid.*10.*value1.*\\[.*Bid.*10.*\\].*");
+	}
+
+	@Test
+	public void serializeAcceptTest() throws JsonProcessingException {
+		System.out.println(jackson.writeValueAsString(accept1));
+		assertEquals(acceptstring, jackson.writeValueAsString(accept1));
+	}
+
+	@Test
+	public void deserializeAcceptTest() throws IOException {
+		Action act = jackson.readValue(acceptstring, Action.class);
+		assertEquals(accept1, act);
+	}
+
+}
Index: events/src/test/java/geniusweb/actions/EndNegoTest.java
===================================================================
--- events/src/test/java/geniusweb/actions/EndNegoTest.java	(revision 26)
+++ events/src/test/java/geniusweb/actions/EndNegoTest.java	(revision 26)
@@ -0,0 +1,52 @@
+package geniusweb.actions;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.List;
+
+import org.junit.Test;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import tudelft.utilities.junit.GeneralTests;
+
+public class EndNegoTest extends GeneralTests<EndNegotiation> {
+	private final ObjectMapper jackson = new ObjectMapper();
+
+	private final PartyId id = new PartyId("party1");
+	private final PartyId idb = new PartyId("party2");
+
+	private final EndNegotiation endnego = new EndNegotiation(id);
+	private final EndNegotiation endnego1 = new EndNegotiation(id);
+	private final EndNegotiation endnegob = new EndNegotiation(idb);
+
+	private final String endnegostring = "{\"endnegotiation\":{\"actor\":\"party1\"}}";
+
+	@Override
+	public List<List<EndNegotiation>> getGeneralTestData() {
+		return Arrays.asList(Arrays.asList(endnego, endnego1),
+				Arrays.asList(endnegob));
+	}
+
+	@Override
+	public List<String> getGeneralTestStrings() {
+		return Arrays.asList("EndNegotiation\\[.*" + id + ".*\\]",
+				"EndNegotiation\\[.*" + idb + ".*\\]");
+	}
+
+	@Test
+	public void serializeEndNegoTest() throws JsonProcessingException {
+		System.out.println(jackson.writeValueAsString(endnego));
+		assertEquals(endnegostring, jackson.writeValueAsString(endnego));
+	}
+
+	@Test
+	public void deserializeEndNegoTest() throws IOException {
+		Action act = jackson.readValue(endnegostring, Action.class);
+		assertEquals(endnego, act);
+	}
+
+}
Index: events/src/test/java/geniusweb/actions/OfferTest.java
===================================================================
--- events/src/test/java/geniusweb/actions/OfferTest.java	(revision 26)
+++ events/src/test/java/geniusweb/actions/OfferTest.java	(revision 26)
@@ -0,0 +1,79 @@
+package geniusweb.actions;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.junit.Test;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import geniusweb.issuevalue.Bid;
+import geniusweb.issuevalue.DiscreteValue;
+import geniusweb.issuevalue.NumberValue;
+import geniusweb.issuevalue.Value;
+import tudelft.utilities.junit.GeneralTests;
+
+public class OfferTest extends GeneralTests<Offer> {
+	private final ObjectMapper jackson = new ObjectMapper();
+
+	private static final PartyId id = new PartyId("party1");
+	private static final Map<String, Value> issuevalues = new HashMap<String, Value>();
+	private static final Map<String, Value> issuevaluesb = new HashMap<String, Value>();
+	private static Bid bid;
+	private static Bid bidb;
+	private static final String ISSUE1 = "issue1";
+	private static final Value VALUE1 = new DiscreteValue("value1");
+	private static final String ISSUE2 = "issue2";
+	private static final Value VALUE2 = new NumberValue("10");
+	private static final String acceptstring = "{\"offer\":{\"actor\":\"party1\",\"bid\":{\"issuevalues\":{\"issue2\":10,\"issue1\":\"value1\"}}}}";
+
+	private static Offer offer;
+	private static Offer offer1;
+	private static Offer offerb;
+
+	static {
+		issuevalues.put(ISSUE1, VALUE1);
+		issuevalues.put(ISSUE2, VALUE2);
+		bid = new Bid(issuevalues);
+		offer = new Offer(id, bid);
+		offer1 = new Offer(id, bid);
+
+		// values swapped, so different issuevalues.
+		issuevaluesb.put(ISSUE1, VALUE2);
+		issuevaluesb.put(ISSUE2, VALUE2);
+		bidb = new Bid(issuevaluesb);
+		offerb = new Offer(id, bidb);
+
+	}
+
+	@Override
+	public List<List<Offer>> getGeneralTestData() {
+		return Arrays.asList(Arrays.asList(offer, offer1),
+				Arrays.asList(offerb));
+	}
+
+	@Override
+	public List<String> getGeneralTestStrings() {
+		return Arrays.asList("Offer\\[.*" + id + ".*Bid.*\\]",
+				"Offer\\[.*" + id + ".*Bid.*\\]");
+	}
+
+	@Test
+	public void serializeAcceptTest() throws JsonProcessingException {
+		System.out.println(jackson.writeValueAsString(offer));
+		assertEquals(acceptstring, jackson.writeValueAsString(offer));
+	}
+
+	@Test
+	public void deserializeAcceptTest() throws IOException {
+		Action act = jackson.readValue(acceptstring, Action.class);
+		assertEquals(offer, act);
+	}
+
+}
Index: events/src/test/java/geniusweb/actions/PartyIdTest.java
===================================================================
--- events/src/test/java/geniusweb/actions/PartyIdTest.java	(revision 26)
+++ events/src/test/java/geniusweb/actions/PartyIdTest.java	(revision 26)
@@ -0,0 +1,74 @@
+package geniusweb.actions;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.junit.Test;
+
+import tudelft.utilities.junit.GeneralTests;
+
+public class PartyIdTest extends GeneralTests<PartyId> {
+	private final PartyId id = new PartyId("party1");
+	private final PartyId id1 = new PartyId("party1");
+	private final PartyId idb = new PartyId("party2");
+
+	@Override
+	public List<List<PartyId>> getGeneralTestData() {
+		return Arrays.asList(Arrays.asList(id, id1), Arrays.asList(idb));
+	}
+
+	@Override
+	public List<String> getGeneralTestStrings() {
+		return Arrays.asList("party1", "party2");
+	}
+
+	@SuppressWarnings("unused")
+	@Test(expected = IllegalArgumentException.class)
+	public void testRestrictions() {
+		new PartyId("");
+	}
+
+	@SuppressWarnings("unused")
+	@Test(expected = IllegalArgumentException.class)
+	public void testRestrictions2() {
+		new PartyId("@2");
+	}
+
+	@SuppressWarnings("unused")
+	@Test(expected = IllegalArgumentException.class)
+	public void testRestrictions3() {
+		new PartyId("_12");
+	}
+
+	@SuppressWarnings("unused")
+	@Test(expected = IllegalArgumentException.class)
+	public void testRestrictions4() {
+		new PartyId("12A");
+	}
+
+	@SuppressWarnings("unused")
+	@Test(expected = IllegalArgumentException.class)
+	public void testRestrictions5() {
+		new PartyId(" fds ");
+	}
+
+	@Test
+	public void testGetName() {
+		assertEquals("party1", id.getName());
+	}
+
+	@SuppressWarnings("unused")
+	@Test
+	public void testRestrictions6() {
+		new PartyId("A_1_23_ok");
+	}
+
+	@SuppressWarnings("unused")
+	@Test
+	public void testRestrictions7() {
+		new PartyId("a_1_23_ok");
+	}
+
+}
Index: events/src/test/java/geniusweb/actions/PartyIdTest1.java
===================================================================
--- events/src/test/java/geniusweb/actions/PartyIdTest1.java	(revision 26)
+++ events/src/test/java/geniusweb/actions/PartyIdTest1.java	(revision 26)
@@ -0,0 +1,74 @@
+package geniusweb.actions;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.IOException;
+import java.net.URISyntaxException;
+import java.util.Arrays;
+import java.util.List;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import com.fasterxml.jackson.core.JsonParseException;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.JsonMappingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import tudelft.utilities.junit.GeneralTests;
+
+public class PartyIdTest1 extends GeneralTests<PartyId> {
+
+	private PartyId party1, party1a, party2, party3;
+	private String asJson = "\"party1\"";
+
+	@Before
+	public void before() throws URISyntaxException {
+		party1 = new PartyId("party1");
+		party1a = new PartyId("party1");
+		party2 = new PartyId("party2");
+		party3 = new PartyId("party3");
+	}
+
+	@Override
+	public List<List<PartyId>> getGeneralTestData() {
+		return Arrays.asList(Arrays.asList(party1, party1a),
+				Arrays.asList(party2), Arrays.asList(party3));
+	}
+
+	@Override
+	public List<String> getGeneralTestStrings() {
+		return Arrays.asList("party1", "party2", "party3");
+	}
+
+	@SuppressWarnings("unused")
+	@Test(expected = IllegalArgumentException.class)
+	public void smokeTest() throws URISyntaxException {
+		new PartyId("*Csh789&@#^!^@^&");
+	}
+
+	@SuppressWarnings("unused")
+	@Test(expected = IllegalArgumentException.class)
+	public void nullTest() throws URISyntaxException {
+		new PartyId(null);
+	}
+
+	@Test
+	public void testSerialize() throws JsonProcessingException {
+		ObjectMapper jackson = new ObjectMapper();
+
+		String json = jackson.writeValueAsString(party1);
+		System.out.println(json);
+		assertEquals(asJson, json);
+	}
+
+	@Test
+	public void testDeserialize()
+			throws JsonParseException, JsonMappingException, IOException {
+		ObjectMapper jackson = new ObjectMapper();
+		PartyId p = jackson.readValue(asJson, PartyId.class);
+		System.out.println(p);
+		assertEquals(party1, p);
+	}
+
+}
Index: events/src/test/java/geniusweb/actions/VoteTest.java
===================================================================
--- events/src/test/java/geniusweb/actions/VoteTest.java	(revision 26)
+++ events/src/test/java/geniusweb/actions/VoteTest.java	(revision 26)
@@ -0,0 +1,94 @@
+package geniusweb.actions;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import geniusweb.issuevalue.Bid;
+import geniusweb.issuevalue.DiscreteValue;
+import geniusweb.issuevalue.NumberValue;
+import geniusweb.issuevalue.Value;
+import tudelft.utilities.junit.GeneralTests;
+
+public class VoteTest extends GeneralTests<Vote> {
+	private final ObjectMapper jackson = new ObjectMapper();
+
+	private static final PartyId id = new PartyId("party1");
+	private static final PartyId id2 = new PartyId("party2");
+	private final static Map<String, Value> issuevalues = new HashMap<String, Value>();
+	private final static Map<String, Value> issuevaluesb = new HashMap<String, Value>();
+	private static Bid bid;
+	private static Bid bidb;
+	private final static String ISSUE1 = "issue1";
+	private final static Value VALUE1 = new DiscreteValue("value1");
+	private final static String ISSUE2 = "issue2";
+	private final static Value VALUE2 = new NumberValue("10");
+	// issue 2 is NUMBER and thus serializes with leading '='
+	private final String votestring = "{\"vote\":{\"actor\":\"party1\",\"bid\":{\"issuevalues\":{\"issue2\":10,\"issue1\":\"value1\"}},\"minPower\":1,\"maxPower\":2}}";
+
+	private static Vote vote1, vote1a, vote2, vote3, vote4, vote5;
+
+	static {
+		issuevalues.put(ISSUE1, VALUE1);
+		issuevalues.put(ISSUE2, VALUE2);
+		bid = new Bid(issuevalues);
+		vote1 = new Vote(id, bid, 1, 2);
+		vote1a = new Vote(id, bid, 1, 2);
+
+		vote2 = new Vote(id2, bid, 1, 2);
+
+		// values swapped, so different issuevalues.
+		issuevaluesb.put(ISSUE1, VALUE2);
+		issuevaluesb.put(ISSUE2, VALUE2);
+		bidb = new Bid(issuevaluesb);
+		vote3 = new Vote(id, bidb, 1, 2);
+
+		vote4 = new Vote(id, bid, 2, 2);
+		vote5 = new Vote(id, bid, 1, 3);
+
+	}
+
+	@Override
+	public List<List<Vote>> getGeneralTestData() {
+		return Arrays.asList(Arrays.asList(vote1, vote1a), Arrays.asList(vote2),
+				Arrays.asList(vote3), Arrays.asList(vote4),
+				Arrays.asList(vote5));
+	}
+
+	@Override
+	public List<String> getGeneralTestStrings() {
+		return Arrays.asList("Vote.*party1.*issue2=10.*issue1=.value1.*1.*2.*",
+				"Vote.*party2.*issue2=10.*issue1=.value1.*1.*2.*",
+				"Vote.*party1.*issue2=10.*issue1=10.*1.*2.*",
+				"Vote.*party1.*issue2=10.*issue1=.value1.*2.*2.*",
+				"Vote.*party1.*issue2=10.*issue1=.value1.*1.*3.*");
+	}
+
+	@Before
+	public void before() {
+
+	}
+
+	@Test
+	public void serializeTest() throws JsonProcessingException {
+		System.out.println(jackson.writeValueAsString(vote1));
+		assertEquals(votestring, jackson.writeValueAsString(vote1));
+	}
+
+	@Test
+	public void deserializeAcceptTest() throws IOException {
+		Action act = jackson.readValue(votestring, Action.class);
+		assertEquals(vote1, act);
+	}
+
+}
Index: events/src/test/java/geniusweb/actions/VotesTest.java
===================================================================
--- events/src/test/java/geniusweb/actions/VotesTest.java	(revision 26)
+++ events/src/test/java/geniusweb/actions/VotesTest.java	(revision 26)
@@ -0,0 +1,147 @@
+package geniusweb.actions;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+
+import org.junit.Test;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import geniusweb.issuevalue.Bid;
+import geniusweb.issuevalue.DiscreteValue;
+import tudelft.utilities.junit.GeneralTests;
+
+public class VotesTest extends GeneralTests<Votes> {
+	private final ObjectMapper jackson = new ObjectMapper();
+	private final String votestring = "{\"Votes\":{\"actor\":\"partyA\",\"votes\":[{\"vote\":{\"actor\":\"partyA\",\"bid\":{\"issuevalues\":{\"is1\":\"val1\"}},\"minPower\":2,\"maxPower\":9}},{\"vote\":{\"actor\":\"partyA\",\"bid\":{\"issuevalues\":{\"is1\":\"val2\"}},\"minPower\":2,\"maxPower\":9}}]}}";
+
+	private PartyId partyA = new PartyId("partyA");
+	private PartyId partyB = new PartyId("partyB");
+	private Bid bid1 = new Bid("is1", new DiscreteValue("val1")),
+			bid2 = new Bid("is1", new DiscreteValue("val2"));
+	private Vote voteA1 = new Vote(partyA, bid1, 2, 9);
+	private Vote voteA2 = new Vote(partyA, bid2, 2, 9);
+	private Vote voteB1 = new Vote(partyB, bid1, 2, 9);
+	private Vote voteB2 = new Vote(partyB, bid2, 2, 9);
+
+	private Votes votes1 = new Votes(partyA,
+			new HashSet<>(Arrays.asList(voteA1, voteA2)));
+	private Votes votes1a = new Votes(partyA,
+			new HashSet<>(Arrays.asList(voteA1, voteA2)));
+	private Votes votes2 = new Votes(partyB,
+			new HashSet<>(Arrays.asList(voteB1, voteB2)));
+
+	@Override
+	public List<List<Votes>> getGeneralTestData() {
+		return Arrays.asList(Arrays.asList(votes1, votes1a),
+				Arrays.asList(votes2));
+	}
+
+	@Override
+	public List<String> getGeneralTestStrings() {
+		return Arrays.asList(
+				"Votes.*Vote.*partyA,Bid.*is1.*val1.*2.*Vote.*partyA,Bid.*is1.*val2.*2.*",
+				"Votes.*Vote.*partyB,Bid.*is1.*val2.*2.*Vote.*partyB,Bid.*is1.*val1.*2.*");
+	}
+
+	@SuppressWarnings("unused")
+	@Test(expected = IllegalArgumentException.class)
+	public void testRejectVoteWithIncorrectParty() {
+		new Votes(partyA, Collections.singleton(voteB1));
+	}
+
+	@Test
+	public void serializeTest() throws JsonProcessingException {
+		System.out.println(jackson.writeValueAsString(votes1));
+		assertEquals(votestring, jackson.writeValueAsString(votes1));
+	}
+
+	@Test
+	public void deserializeTest() throws IOException {
+		Action act = jackson.readValue(votestring, Action.class);
+		assertEquals(votes1, act);
+	}
+
+	@Test(expected = IllegalArgumentException.class)
+	public void testWrongPartyName() {
+		new Votes(partyA, new HashSet<>(Arrays.asList(voteB1, voteB2)));
+	}
+
+	@Test
+	public void isExtendingTestExtraVote() {
+		Votes otherVotes = new Votes(partyA, Collections.singleton(voteA1));
+		assertTrue(votes1.isExtending(otherVotes));
+	}
+
+	@Test
+	public void isExtendingTestNoVotes() {
+		Votes otherVotes = new Votes(partyA, Collections.emptySet());
+		assertTrue(votes1.isExtending(otherVotes));
+	}
+
+	@Test
+	public void isExtendingTestMissing() {
+		Votes otherVotes = new Votes(partyA, Collections.singleton(voteA1));
+		assertFalse(otherVotes.isExtending(votes1));
+	}
+
+	@Test
+	public void isExtendingIdenticalVotes() {
+		assertTrue(votes1.isExtending(votes1));
+	}
+
+	@Test
+	public void isReallyExtendingVotesMin() {
+		Vote powervoteA1 = new Vote(partyA, bid1, 1, 9);
+		Votes powerVotes = new Votes(partyA,
+				new HashSet<>(Arrays.asList(powervoteA1, voteA2)));
+		assertTrue(powerVotes.isExtending(votes1));
+	}
+
+	@Test
+	public void isReallyExtendingVotesMax() {
+		Vote powervoteA1 = new Vote(partyA, bid1, 2, 10);
+		Votes powerVotes = new Votes(partyA,
+				new HashSet<>(Arrays.asList(powervoteA1, voteA2)));
+		assertTrue(powerVotes.isExtending(votes1));
+	}
+
+	@Test
+	public void IsNarrowingOneVoteRemoved() {
+		Votes narrowVotes = new Votes(partyA, Collections.singleton(voteA2));
+		assertFalse(narrowVotes.isExtending(votes1));
+	}
+
+	@Test
+	public void isNarrowingTestMoreMinPower() {
+		Vote narrowVoteA1 = new Vote(partyA, bid1, 3, 9);
+		Votes narrowVotes = new Votes(partyA,
+				new HashSet<>(Arrays.asList(narrowVoteA1, voteA2)));
+		assertFalse(narrowVotes.isExtending(votes1));
+		assertTrue(votes1.isExtending(narrowVotes));
+	}
+
+	@Test
+	public void isNarrowingLessMaxPower() {
+		Vote powervoteA1 = new Vote(partyA, bid1, 2, 8);
+		Votes narrowVotes = new Votes(partyA,
+				new HashSet<>(Arrays.asList(powervoteA1, voteA2)));
+		assertFalse(narrowVotes.isExtending(votes1));
+		assertTrue(votes1.isExtending(narrowVotes));
+	}
+
+	@Test(expected = IllegalArgumentException.class)
+	public void testDuplicateBidsNotAllowed() {
+		Vote voteA1similar = new Vote(partyA, bid1, 3, 9);
+		Votes votes = new Votes(partyA,
+				new HashSet<>(Arrays.asList(voteA1, voteA1similar)));
+	}
+}
Index: events/src/test/java/geniusweb/events/ActionEventTest.java
===================================================================
--- events/src/test/java/geniusweb/events/ActionEventTest.java	(revision 26)
+++ events/src/test/java/geniusweb/events/ActionEventTest.java	(revision 26)
@@ -0,0 +1,71 @@
+package geniusweb.events;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Mockito.mock;
+
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.List;
+
+import org.junit.Test;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import geniusweb.actions.Action;
+import geniusweb.actions.EndNegotiation;
+import geniusweb.actions.PartyId;
+import tudelft.utilities.junit.GeneralTests;
+
+public class ActionEventTest extends GeneralTests<ActionEvent> {
+	private static final long NOW = 101l;
+	private final ObjectMapper jackson = new ObjectMapper();
+	private final String string = "{\"actionevent\":{\"action\":{\"endnegotiation\":{\"actor\":\"party1\"}},\"time\":101}}";
+	private final PartyId id = new PartyId("party1");
+	private final Action action = new EndNegotiation(id);
+	private final ActionEvent evt = new ActionEvent(action, NOW);
+	private final ActionEvent evt1 = new ActionEvent(action, NOW);
+	private final ActionEvent evtb = new ActionEvent(action, NOW + 1);
+
+	@Override
+	public List<List<ActionEvent>> getGeneralTestData() {
+		return Arrays.asList(Arrays.asList(evt, evt1), Arrays.asList(evtb));
+	}
+
+	@Override
+	public List<String> getGeneralTestStrings() {
+		return Arrays.asList("ActionEvent\\[.*" + NOW + ".*EndNegotiation.*\\]",
+				"ActionEvent\\[.*" + (NOW + 1) + ".*EndNegotiation.*\\]");
+	}
+
+	@Test
+	public void smoketest() {
+		Action action = mock(EndNegotiation.class);
+		ActionEvent evt = new ActionEvent(action, 0l);
+	}
+
+	@Test
+	public void serializeTest() throws JsonProcessingException {
+		System.out.println(jackson.writeValueAsString(evt));
+		assertEquals(string, jackson.writeValueAsString(evt));
+	}
+
+	@Test
+	public void deserializeTestReadActionEvent() throws IOException {
+		ActionEvent evt1 = jackson.readValue(string, ActionEvent.class);
+		// compare fields, as evt is a derived/new inner class
+		assertEquals(EndNegotiation.class, evt1.getAction().getClass());
+		assertEquals((Long) 101l, evt1.getTime());
+	}
+
+	@Test
+	public void deserializeTestReadEvent() throws IOException {
+		NegotiationEvent evt1 = jackson.readValue(string,
+				NegotiationEvent.class);
+		assertEquals(ActionEvent.class, evt1.getClass());
+		ActionEvent ev1 = (ActionEvent) evt1;
+		assertEquals(EndNegotiation.class, ev1.getAction().getClass());
+		assertEquals((Long) 101l, ev1.getTime());
+	}
+
+}
Index: events/src/test/java/geniusweb/events/SessionStartedTest.java
===================================================================
--- events/src/test/java/geniusweb/events/SessionStartedTest.java	(revision 26)
+++ events/src/test/java/geniusweb/events/SessionStartedTest.java	(revision 26)
@@ -0,0 +1,95 @@
+package geniusweb.events;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.LinkedList;
+import java.util.List;
+
+import org.junit.Test;
+import org.junit.experimental.theories.DataPoint;
+import org.junit.experimental.theories.DataPoints;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import geniusweb.actions.PartyId;
+import tudelft.utilities.junit.GeneralTests;
+
+public class SessionStartedTest extends GeneralTests<SessionStarted> {
+
+	private final ObjectMapper jackson = new ObjectMapper();
+
+	private static final Long SESSIONNR = 1l;
+	protected static final Long NOW = (long) 101;
+	protected static final Long NOW1 = NOW + 1;
+
+	private static final PartyId PARTY1 = new PartyId("party1");
+	private static final PartyId PARTY2 = new PartyId("party2");
+
+	private static List<PartyId> parties = Arrays.asList(PARTY1, PARTY2);
+
+	private static final SessionStarted sessionStartedLater = new SessionStarted(
+			SESSIONNR, parties, NOW1);
+	private static final SessionStarted othersessionStarted = new SessionStarted(
+			SESSIONNR + 1, parties, NOW);
+
+	public static SessionStarted sessionStarted = new SessionStarted(SESSIONNR,
+			parties, NOW);
+	private static final SessionStarted sessionStarted1 = new SessionStarted(
+			SESSIONNR, parties, NOW);
+	// jackson expected format.
+	private static String sessionstartedstring = "{\"sessionstarted\":{\"sessionNumber\":1,\"parties\":[\"party1\",\"party2\"],\"time\":101}}";
+	// "{\"sessionstarted\":{\"time\":101,\"sessionNumber\":1,\"parties\":[\"party1\",\"party2\"]}}";
+	public static String expectedstring = "SessionStarted.*101.*";
+
+	@Override
+	public List<List<SessionStarted>> getGeneralTestData() {
+		List<List<SessionStarted>> list = new LinkedList<>();
+		list.add(Arrays.asList(sessionStarted, sessionStarted1));
+		list.add(Arrays.asList(sessionStartedLater));
+		list.add(Arrays.asList(othersessionStarted));
+		return list;
+	}
+
+	@Override
+	public List<String> getGeneralTestStrings() {
+		return Arrays.asList("SessionStarted.*" + SESSIONNR + ".*" + NOW + ".*",
+				"SessionStarted.*" + SESSIONNR + ".*" + NOW1 + ".*",
+				"SessionStarted.*" + (SESSIONNR + 1) + ".*" + NOW + ".*");
+	}
+
+	@DataPoints("equal")
+	public static SessionStarted[] equal() {
+		return new SessionStarted[] { sessionStarted, sessionStarted1 };
+	}
+
+	@DataPoints("notequal")
+	public static SessionStarted[] notequal() {
+		return new SessionStarted[] { sessionStartedLater,
+				sessionStartedLater };
+	}
+
+	@DataPoint("equalstring")
+
+	@Test
+	public void serializeStartedTest() throws JsonProcessingException {
+		System.out.println(jackson.writeValueAsString(sessionStarted));
+		assertEquals(sessionstartedstring,
+				jackson.writeValueAsString(sessionStarted));
+	}
+
+	@Test
+	public void deserializeStartedTest() throws IOException {
+		NegotiationEvent evt = jackson.readValue(sessionstartedstring,
+				NegotiationEvent.class);
+		assertEquals(SessionStarted.class, evt.getClass());
+		SessionStarted event = (SessionStarted) evt;
+		// compare fields, as sessionended is a derived/new inner class
+		assertEquals(NOW, event.getTime());
+		assertEquals(SESSIONNR, event.getSessionNumber());
+		assertEquals(2, event.getParties().size());
+	}
+
+}
Index: events/src/test/java/geniusweb/events/TournamentStartedTest.java
===================================================================
--- events/src/test/java/geniusweb/events/TournamentStartedTest.java	(revision 26)
+++ events/src/test/java/geniusweb/events/TournamentStartedTest.java	(revision 26)
@@ -0,0 +1,84 @@
+package geniusweb.events;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.LinkedList;
+import java.util.List;
+
+import org.junit.Test;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import tudelft.utilities.junit.GeneralTests;
+
+public class TournamentStartedTest extends GeneralTests<TournamentStarted> {
+
+	private final ObjectMapper jackson = new ObjectMapper();
+
+	private static final Long SESSIONNR = 1l;
+	protected static final Long NOW = (long) 101;
+	protected static final Long NOW1 = NOW + 1;
+	private static final Long NSESSIONS = 5l;
+
+	private static TournamentStarted tournamentStarted = new TournamentStarted(
+			NSESSIONS, NOW);
+	private static TournamentStarted tournamentStarteda = new TournamentStarted(
+			NSESSIONS, NOW);
+	private TournamentStarted otherTournamentStarted = new TournamentStarted(
+			NSESSIONS + 1, NOW);
+	private TournamentStarted tournamentStartedLater = new TournamentStarted(
+			NSESSIONS, NOW1);
+
+	private String tournamentstartedstring = "{\"tournamentstarted\":{\"time\":101,\"numberOfSessions\":5}}";
+
+	@Override
+	public List<List<TournamentStarted>> getGeneralTestData() {
+		List<List<TournamentStarted>> list = new LinkedList<>();
+		list.add(Arrays.asList(tournamentStarted, tournamentStarteda));
+		list.add(Arrays.asList(otherTournamentStarted));
+		list.add(Arrays.asList(tournamentStartedLater));
+		return list;
+	}
+
+	@Override
+	public List<String> getGeneralTestStrings() {
+		return Arrays.asList(
+				"TournamentStarted\\[.*" + NOW + ".*" + NSESSIONS + ".*\\]",
+				"TournamentStarted\\[.*" + NOW + ".*" + (NSESSIONS + 1)
+						+ ".*\\]",
+				"TournamentStarted\\[.*" + NOW1 + ".*" + NSESSIONS + ".*\\]");
+	}
+
+	@Test
+	public void serializeTournamentStartedTest()
+			throws JsonProcessingException {
+		System.out.println(jackson.writeValueAsString(tournamentStarted));
+		assertEquals(tournamentstartedstring,
+				jackson.writeValueAsString(tournamentStarted));
+	}
+
+	@Test
+	public void deserializeTournamentStartedTest() throws IOException {
+		NegotiationEvent evt = jackson.readValue(tournamentstartedstring,
+				NegotiationEvent.class);
+		assertEquals(TournamentStarted.class, evt.getClass());
+		TournamentStarted event = (TournamentStarted) evt;
+		// compare fields, as sessionended is a derived/new inner class
+		assertEquals(NSESSIONS, event.getNumberOfSessions());
+		assertEquals(NOW, event.getTime());
+	}
+
+	@Test(expected = IllegalArgumentException.class)
+	public void testNullTime() {
+		new TournamentStarted(NSESSIONS, null);
+	}
+
+	@Test(expected = IllegalArgumentException.class)
+	public void testNegativeTime() {
+		new TournamentStarted(NSESSIONS, -1l);
+	}
+
+}
Index: events/src/test/java/geniusweb/inform/ActionDoneTest.java
===================================================================
--- events/src/test/java/geniusweb/inform/ActionDoneTest.java	(revision 26)
+++ events/src/test/java/geniusweb/inform/ActionDoneTest.java	(revision 26)
@@ -0,0 +1,69 @@
+package geniusweb.inform;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.List;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import geniusweb.actions.Action;
+import geniusweb.actions.EndNegotiation;
+import geniusweb.actions.PartyId;
+import tudelft.utilities.junit.GeneralTests;
+
+public class ActionDoneTest extends GeneralTests<ActionDone> {
+	private final ObjectMapper jackson = new ObjectMapper();
+
+	private static final PartyId id = new PartyId("party1");
+	private static final PartyId id2 = new PartyId("party2");
+
+	private final String actiondonestr = "{\"ActionDone\":{\"action\":{\"endnegotiation\":{\"actor\":\"party1\"}}}}";
+
+	private final static Action act1 = new EndNegotiation(id);
+	private final static Action act2 = new EndNegotiation(id2);
+
+	private final static ActionDone done1 = new ActionDone(act1);
+	private final static ActionDone done1a = new ActionDone(act1);
+	private final static ActionDone done2 = new ActionDone(act2);
+
+	@Override
+	public List<List<ActionDone>> getGeneralTestData() {
+		return Arrays.asList(Arrays.asList(done1, done1a),
+				Arrays.asList(done2));
+	}
+
+	@Override
+	public List<String> getGeneralTestStrings() {
+		return Arrays.asList("ActionDone.*EndNegotiation.*party1.*",
+				"ActionDone.*EndNegotiation.*party2.*");
+	}
+
+	@Before
+	public void before() {
+
+	}
+
+	@Test
+	public void serializeAcceptTest() throws JsonProcessingException {
+		System.out.println(jackson.writeValueAsString(done1));
+		assertEquals(actiondonestr, jackson.writeValueAsString(done1));
+	}
+
+	@Test
+	public void deserializeAcceptTest() throws IOException {
+		Inform act = jackson.readValue(actiondonestr, Inform.class);
+		assertEquals(done1, act);
+	}
+
+	@Test
+	public void testGet() {
+		assertEquals(act1, done1.getAction());
+	}
+
+}
Index: events/src/test/java/geniusweb/inform/AgreementsTest.java
===================================================================
--- events/src/test/java/geniusweb/inform/AgreementsTest.java	(revision 26)
+++ events/src/test/java/geniusweb/inform/AgreementsTest.java	(revision 26)
@@ -0,0 +1,100 @@
+package geniusweb.inform;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import geniusweb.actions.PartyId;
+import geniusweb.issuevalue.Bid;
+import geniusweb.issuevalue.DiscreteValue;
+import geniusweb.issuevalue.Value;
+import tudelft.utilities.junit.GeneralTests;
+
+public class AgreementsTest extends GeneralTests<Agreements> {
+	private final ObjectMapper jackson = new ObjectMapper();
+
+	private static final PartyId id = new PartyId("party1");
+	private static final PartyId id2 = new PartyId("party2");
+	private final static Value VALUE1 = new DiscreteValue("value1");
+	private static Bid bid = new Bid(
+			Collections.singletonMap("issue1", VALUE1));
+	private static Bid bid2 = new Bid(
+			Collections.singletonMap("issue2", VALUE1));
+
+	private final String finishedstring = "{\"party1\":{\"issuevalues\":{\"issue1\":\"value1\"}}}";
+
+	private final static Agreements agrees1 = new Agreements(
+			Collections.singletonMap(id, bid));
+	private final static Agreements agrees1a = new Agreements(
+			Collections.singletonMap(id, bid));
+	private final static Agreements agrees2 = new Agreements(
+			Collections.singletonMap(id2, bid));
+	private final static Agreements agrees3 = new Agreements(
+			Collections.singletonMap(id, bid2));
+
+	@Override
+	public List<List<Agreements>> getGeneralTestData() {
+		return Arrays.asList(Arrays.asList(agrees1, agrees1a),
+				Arrays.asList(agrees2), Arrays.asList(agrees3));
+	}
+
+	@Override
+	public List<String> getGeneralTestStrings() {
+		return Arrays.asList("Agreements.*party1.*Bid.*issue1.*",
+				"Agreements.*party2.*Bid.*issue1.*",
+				"Agreements.*party1.*Bid.*issue2.*");
+	}
+
+	@Before
+	public void before() {
+
+	}
+
+	@Test
+	public void serializeAcceptTest() throws JsonProcessingException {
+		System.out.println(jackson.writeValueAsString(agrees1));
+		assertEquals(finishedstring, jackson.writeValueAsString(agrees1));
+	}
+
+	@Test
+	public void deserializeAcceptTest() throws IOException {
+		Agreements act = jackson.readValue(finishedstring, Agreements.class);
+		assertEquals(agrees1, act);
+	}
+
+	@SuppressWarnings("unused")
+	@Test
+	public void testNull() {
+		new Agreements();
+	}
+
+	@Test(expected = IllegalArgumentException.class)
+	public void testWithAlreadyActed() {
+		agrees1.with(agrees1);
+	}
+
+	@Test
+	public void testWith() {
+		Agreements agrees = agrees1.with(agrees2);
+		assertEquals(bid, agrees.getMap().get(id));
+		assertEquals(bid, agrees.getMap().get(id2));
+	}
+
+	@Test
+	public void testBidConstructor() {
+		Agreements agrees = new Agreements(bid,
+				new HashSet<PartyId>(Arrays.asList(id, id2)));
+		assertEquals(bid, agrees.getMap().get(id));
+		assertEquals(bid, agrees.getMap().get(id2));
+	}
+}
Index: events/src/test/java/geniusweb/inform/FinishedTest.java
===================================================================
--- events/src/test/java/geniusweb/inform/FinishedTest.java	(revision 26)
+++ events/src/test/java/geniusweb/inform/FinishedTest.java	(revision 26)
@@ -0,0 +1,76 @@
+package geniusweb.inform;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import geniusweb.actions.PartyId;
+import geniusweb.issuevalue.Bid;
+import geniusweb.issuevalue.DiscreteValue;
+import geniusweb.issuevalue.Value;
+import tudelft.utilities.junit.GeneralTests;
+
+public class FinishedTest extends GeneralTests<Finished> {
+	private final ObjectMapper jackson = new ObjectMapper();
+
+	private static final PartyId id = new PartyId("party1");
+	private static final PartyId id2 = new PartyId("party2");
+	private final static Value VALUE1 = new DiscreteValue("value1");
+	private static Bid bid = new Bid(
+			Collections.singletonMap("issue1", VALUE1));
+
+	private final String finishedstring = "{\"Finished\":{\"agreements\":{\"party1\":{\"issuevalues\":{\"issue1\":\"value1\"}}}}}";
+
+	private final static Agreements agrees1 = new Agreements(
+			Collections.singletonMap(id, bid));
+	private final static Agreements agrees2 = new Agreements(
+			Collections.singletonMap(id2, bid));
+
+	private final static Finished finished1 = new Finished(agrees1);
+	private final static Finished finished1a = new Finished(agrees1);
+	private final static Finished finished2 = new Finished(agrees2);
+
+	@Override
+	public List<List<Finished>> getGeneralTestData() {
+		return Arrays.asList(Arrays.asList(finished1, finished1a),
+				Arrays.asList(finished2));
+	}
+
+	@Override
+	public List<String> getGeneralTestStrings() {
+		return Arrays.asList("Finished.*party1.*Bid.*",
+				"Finished.*party2.*Bid.*");
+	}
+
+	@Before
+	public void before() {
+
+	}
+
+	@Test
+	public void serializeAcceptTest() throws JsonProcessingException {
+		System.out.println(jackson.writeValueAsString(finished1));
+		assertEquals(finishedstring, jackson.writeValueAsString(finished1));
+	}
+
+	@Test
+	public void deserializeAcceptTest() throws IOException {
+		Inform act = jackson.readValue(finishedstring, Inform.class);
+		assertEquals(finished1, act);
+	}
+
+	@Test(expected = NullPointerException.class)
+	public void testNull() {
+		new Finished(null);
+	}
+
+}
Index: events/src/test/java/geniusweb/inform/OptInTest.java
===================================================================
--- events/src/test/java/geniusweb/inform/OptInTest.java	(revision 26)
+++ events/src/test/java/geniusweb/inform/OptInTest.java	(revision 26)
@@ -0,0 +1,77 @@
+package geniusweb.inform;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+
+import org.junit.Test;
+
+import com.fasterxml.jackson.core.JsonParseException;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.JsonMappingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import geniusweb.actions.PartyId;
+import geniusweb.actions.Vote;
+import geniusweb.actions.Votes;
+import geniusweb.issuevalue.Bid;
+import geniusweb.issuevalue.DiscreteValue;
+import tudelft.utilities.junit.GeneralTests;
+
+public class OptInTest extends GeneralTests<OptIn> {
+
+	private Bid bid1 = new Bid("iss", new DiscreteValue("val1"));
+	private Bid bid2 = new Bid("iss", new DiscreteValue("val2"));
+	private PartyId partyA = new PartyId("partyA");
+	private PartyId partyB = new PartyId("partyB");
+
+	private final Vote voteA1 = new Vote(partyA, bid1, 2, 9);
+	private final Vote voteB1 = new Vote(partyB, bid1, 2, 9);
+	private final Vote voteB2 = new Vote(partyB, bid2, 2, 9);
+
+	private Votes votesA = new Votes(partyA, Collections.singleton(voteA1));
+	private Votes votesB = new Votes(partyB,
+			new HashSet<>(Arrays.asList(voteB1, voteB2)));
+
+	private final OptIn optIn1 = new OptIn(Arrays.asList(votesA, votesB));
+	private final OptIn optIn1a = new OptIn(Arrays.asList(votesA, votesB));
+	private final OptIn optIn2 = new OptIn(Arrays.asList(votesA));
+
+	private String asJson = "{\"OptIn\":{\"votes\":[{\"Votes\":{\"actor\":\"partyA\",\"votes\":[{\"vote\":{\"actor\":\"partyA\",\"bid\":{\"issuevalues\":{\"iss\":\"val1\"}},\"minPower\":2,\"maxPower\":9}}]}},{\"Votes\":{\"actor\":\"partyB\",\"votes\":[{\"vote\":{\"actor\":\"partyB\",\"bid\":{\"issuevalues\":{\"iss\":\"val2\"}},\"minPower\":2,\"maxPower\":9}},{\"vote\":{\"actor\":\"partyB\",\"bid\":{\"issuevalues\":{\"iss\":\"val1\"}},\"minPower\":2,\"maxPower\":9}}]}}]}}";
+
+	@Override
+	public List<List<OptIn>> getGeneralTestData() {
+		return Arrays.asList(Arrays.asList(optIn1, optIn1a),
+				Arrays.asList(optIn2));
+	}
+
+	@Override
+	public List<String> getGeneralTestStrings() {
+		return Arrays.asList(
+				"OptIn.*Votes.*Vote.*partyA.*iss.*val1.*2.*Votes.*Vote.*partyB.*iss.*val2.*.*2.*Vote.*partyB.*iss.*val1.*2.*",
+				"OptIn.*Votes.*Vote.*partyA.*iss.*val.*2.*");
+	}
+
+	@Test
+	public void testSerialize() throws JsonProcessingException {
+		ObjectMapper jackson = new ObjectMapper();
+
+		String json = jackson.writeValueAsString(optIn1);
+		System.out.println(json);
+		assertEquals(asJson, json);
+	}
+
+	@Test
+	public void testDeserialize()
+			throws JsonParseException, JsonMappingException, IOException {
+		ObjectMapper jackson = new ObjectMapper();
+		Inform p = jackson.readValue(asJson, Inform.class);
+		System.out.println(p);
+		assertEquals(optIn1, p);
+	}
+
+}
Index: events/src/test/java/geniusweb/inform/SettingsTest.java
===================================================================
--- events/src/test/java/geniusweb/inform/SettingsTest.java	(revision 26)
+++ events/src/test/java/geniusweb/inform/SettingsTest.java	(revision 26)
@@ -0,0 +1,128 @@
+package geniusweb.inform;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.IOException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import com.fasterxml.jackson.core.JsonParseException;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.JsonMappingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import geniusweb.actions.PartyId;
+import geniusweb.progress.ProgressRounds;
+import geniusweb.references.Parameters;
+import geniusweb.references.PartyRef;
+import geniusweb.references.ProfileRef;
+import geniusweb.references.ProtocolRef;
+import tudelft.utilities.junit.GeneralTests;
+
+public class SettingsTest extends GeneralTests<Settings> {
+
+	private PartyId id = new PartyId("party1");
+	private PartyId id2 = new PartyId("party2");
+
+	private final String asJson = "{\"Settings\":"
+			+ "{\"id\":\"party1\",\"profile\":\"ws:profile1\","
+			+ "\"protocol\":\"ws:localhost/protocol1\","
+			+ "\"progress\":{\"rounds\":{\"duration\":10,\"currentRound\":0,\"endtime\":999}},"
+			+ "\"parameters\":{}}}";
+
+	private Settings negoinfo1, negoinfo1a;
+	private Settings negoinfo2, negoinfo3, negoinfo4, negoinfo5;
+	private final Date date = new Date(999);
+	private final static ObjectMapper jackson = new ObjectMapper();
+
+	@Before
+	public void before() throws URISyntaxException, JsonParseException,
+			JsonMappingException, IOException {
+		// we can't mock because we want to test the serializer
+		ProfileRef profile1 = new ProfileRef(new URI("ws:profile1"));
+		// jackson.readValue(serialized, Profile.class);
+
+		ProtocolRef protocol1 = new ProtocolRef(
+				new URI("ws:localhost/protocol1"));
+		ProtocolRef protocol1a = new ProtocolRef(
+				new URI("ws:localhost/protocol1"));
+		ProtocolRef protocol2 = new ProtocolRef(
+				new URI("ws:localhost/protocol2"));
+		ProgressRounds progress1 = new ProgressRounds(10, 0, date);
+		ProgressRounds progress1a = new ProgressRounds(10, 0, date);
+		ProgressRounds progress2 = new ProgressRounds(12, 0, date);
+
+		Parameters settings1 = new Parameters();
+		Parameters settings2 = new Parameters();
+		settings2.put("a", 1);
+
+		negoinfo1 = new Settings(id, profile1, protocol1, progress1, settings1);
+		negoinfo1a = new Settings(id, profile1, protocol1a, progress1a,
+				settings1);
+		negoinfo2 = new Settings(id, profile1, protocol2, progress1, settings1);
+		negoinfo3 = new Settings(id, profile1, protocol1, progress2, settings1);
+		negoinfo4 = new Settings(id2, profile1, protocol1, progress2,
+				settings1);
+		negoinfo5 = new Settings(id, profile1, protocol1, progress1, settings2);
+	}
+
+	@Override
+	public List<List<Settings>> getGeneralTestData() {
+		return Arrays.asList(Arrays.asList(negoinfo1, negoinfo1a),
+				Arrays.asList(negoinfo2), Arrays.asList(negoinfo3),
+				Arrays.asList(negoinfo4), Arrays.asList(negoinfo5));
+	}
+
+	@Override
+	public List<String> getGeneralTestStrings() {
+		return Arrays.asList(
+				"Settings.*party1.*ProtocolRef.*protocol1.*ProgressRounds.*0.*10.*",
+				"Settings.*party1.*ProtocolRef.*protocol2.*ProgressRounds.*0.*10.*",
+				"Settings.*party1.*ProtocolRef.*protocol1.*ProgressRounds.*0.*12.*",
+				"Settings.*party2.*ProtocolRef.*protocol1.*ProgressRounds.*0.*12.*",
+				"Settings.*party1.*ProtocolRef.*protocol1.*ProgressRounds.*0.*10.*");
+	}
+
+	@Test
+	public void smokeTest() throws URISyntaxException {
+		new PartyRef(new URI("ws:localhost"));
+	}
+
+	@Test(expected = IllegalArgumentException.class)
+	public void nullTest() throws URISyntaxException {
+		new PartyRef((URI) null);
+	}
+
+	@Test
+	public void testSerialize() throws JsonProcessingException {
+
+		String json = jackson.writeValueAsString(negoinfo1);
+		System.out.println(json);
+		assertEquals(asJson, json);
+	}
+
+	@Test
+	public void testDeserialize()
+			throws JsonParseException, JsonMappingException, IOException {
+		Settings p = (Settings) jackson.readValue(asJson, Inform.class);
+		System.out.println(p);
+		assertEquals(negoinfo1, p);
+	}
+
+	@Test
+	public void testGeneralDict()
+			throws JsonParseException, JsonMappingException, IOException {
+		Map val = jackson.readValue("{\"a\":0.3,\"b\":{\"x\":3},\"c\":[1,2,3]}",
+				HashMap.class);
+		System.out.println(val);
+	}
+
+}
Index: events/src/test/java/geniusweb/inform/VotingTest.java
===================================================================
--- events/src/test/java/geniusweb/inform/VotingTest.java	(revision 26)
+++ events/src/test/java/geniusweb/inform/VotingTest.java	(revision 26)
@@ -0,0 +1,75 @@
+package geniusweb.inform;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
+import org.junit.Test;
+
+import com.fasterxml.jackson.core.JsonParseException;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.JsonMappingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import geniusweb.actions.Offer;
+import geniusweb.actions.PartyId;
+import geniusweb.issuevalue.Bid;
+import geniusweb.issuevalue.DiscreteValue;
+import tudelft.utilities.junit.GeneralTests;
+
+public class VotingTest extends GeneralTests<Voting> {
+
+	private PartyId party1 = new PartyId("party1");
+	private Bid bid1 = new Bid("iss", new DiscreteValue("val1"));
+	private Bid bid2 = new Bid("iss", new DiscreteValue("val2"));
+
+	private Map<PartyId, Integer> powers1 = Collections.singletonMap(party1, 2);
+	private Map<PartyId, Integer> powers2 = Collections.singletonMap(party1, 3);
+
+	private final Voting voting1 = new Voting(
+			Arrays.asList(new Offer(party1, bid1)), powers1);
+	private final Voting voting1a = new Voting(
+			Arrays.asList(new Offer(party1, bid1)), powers1);
+	private final Voting voting2 = new Voting(
+			Arrays.asList(new Offer(party1, bid2)), powers1);
+	private final Voting voting3 = new Voting(
+			Arrays.asList(new Offer(party1, bid1)), powers2);
+
+	private String asJson = "{\"Voting\":{\"offers\":[{\"offer\":{\"actor\":\"party1\",\"bid\":{\"issuevalues\":{\"iss\":\"val1\"}}}}],\"powers\":{\"party1\":2}}}";
+
+	@Override
+	public List<List<Voting>> getGeneralTestData() {
+		return Arrays.asList(Arrays.asList(voting1, voting1a),
+				Arrays.asList(voting2), Arrays.asList(voting3));
+	}
+
+	@Override
+	public List<String> getGeneralTestStrings() {
+		return Arrays.asList("Voting.*Bid.*iss.*val1.*party1.*2.*",
+				"Voting.*Bid.*iss.*val2.*party1.*2.*",
+				"Voting.*Bid.*iss.*val1.*party1.*3.*");
+	}
+
+	@Test
+	public void testSerialize() throws JsonProcessingException {
+		ObjectMapper jackson = new ObjectMapper();
+
+		String json = jackson.writeValueAsString(voting1);
+		System.out.println(json);
+		assertEquals(asJson, json);
+	}
+
+	@Test
+	public void testDeserialize()
+			throws JsonParseException, JsonMappingException, IOException {
+		ObjectMapper jackson = new ObjectMapper();
+		Inform p = jackson.readValue(asJson, Inform.class);
+		System.out.println(p);
+		assertEquals(voting1, p);
+	}
+
+}
Index: events/src/test/java/geniusweb/inform/YourTurnTest.java
===================================================================
--- events/src/test/java/geniusweb/inform/YourTurnTest.java	(revision 26)
+++ events/src/test/java/geniusweb/inform/YourTurnTest.java	(revision 26)
@@ -0,0 +1,70 @@
+package geniusweb.inform;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.IOException;
+import java.net.URISyntaxException;
+import java.util.Arrays;
+import java.util.List;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import com.fasterxml.jackson.core.JsonParseException;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.JsonMappingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import tudelft.utilities.junit.GeneralTests;
+
+public class YourTurnTest extends GeneralTests<YourTurn> {
+
+	private YourTurn yourturn1, yourturn1b;
+
+	private String asJson = "{\"YourTurn\":{}}";
+
+	private YourTurn yourturnb;
+
+	@Before
+	public void before() throws URISyntaxException {
+
+		yourturn1 = new YourTurn();
+		yourturn1b = new YourTurn();
+		yourturnb = new YourTurn() {
+			@Override
+			public int hashCode() {
+				return 2;
+			}
+		};
+	}
+
+	@Override
+	public List<List<YourTurn>> getGeneralTestData() {
+		return Arrays.asList(Arrays.asList(yourturn1, yourturn1b),
+				Arrays.asList(yourturnb));
+	}
+
+	@Override
+	public List<String> getGeneralTestStrings() {
+		return Arrays.asList("YourTurn*", "YourTurn*");
+	}
+
+	@Test
+	public void testSerialize() throws JsonProcessingException {
+		ObjectMapper jackson = new ObjectMapper();
+
+		String json = jackson.writeValueAsString(yourturn1);
+		System.out.println(json);
+		assertEquals(asJson, json);
+	}
+
+	@Test
+	public void testDeserialize()
+			throws JsonParseException, JsonMappingException, IOException {
+		ObjectMapper jackson = new ObjectMapper();
+		YourTurn p = (YourTurn) jackson.readValue(asJson, Inform.class);
+		System.out.println(p);
+		assertEquals(yourturn1, p);
+	}
+
+}
