Index: events/src/main/java/geniusweb/actions/Action.java
===================================================================
--- events/src/main/java/geniusweb/actions/Action.java	(revision 9)
+++ events/src/main/java/geniusweb/actions/Action.java	(revision 10)
@@ -12,6 +12,9 @@
  */
 @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = As.WRAPPER_OBJECT)
-@JsonSubTypes({ @JsonSubTypes.Type(value = EndNegotiation.class), @JsonSubTypes.Type(value = Offer.class),
-		@JsonSubTypes.Type(value = Accept.class) })
+@JsonSubTypes({ @JsonSubTypes.Type(value = EndNegotiation.class),
+		@JsonSubTypes.Type(value = Offer.class),
+		@JsonSubTypes.Type(value = Accept.class),
+		@JsonSubTypes.Type(value = Comparison.class),
+		@JsonSubTypes.Type(value = ElicitComparison.class) })
 public interface Action {
 	/**
Index: events/src/main/java/geniusweb/actions/ActionWithBid.java
===================================================================
--- events/src/main/java/geniusweb/actions/ActionWithBid.java	(revision 9)
+++ events/src/main/java/geniusweb/actions/ActionWithBid.java	(revision 10)
@@ -7,5 +7,6 @@
 
 /**
- * An {@link Action} containing a bid.
+ * An {@link Action} containing a bid. Note that the presense of a bid does not
+ * necessarily mean that an offer was placed for this bid.
  * 
  */
Index: events/src/main/java/geniusweb/actions/Comparison.java
===================================================================
--- events/src/main/java/geniusweb/actions/Comparison.java	(revision 10)
+++ events/src/main/java/geniusweb/actions/Comparison.java	(revision 10)
@@ -0,0 +1,94 @@
+package geniusweb.actions;
+
+import java.util.List;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+import geniusweb.issuevalue.Bid;
+
+/**
+ * A statement from a Party that some bids are better and worse than
+ * {@link #getBid()} bid. Typically this is a response to a CompareWithBid
+ * inform
+ *
+ */
+public class Comparison extends ActionWithBid {
+
+	private List<Bid> better;
+	private List<Bid> worse;
+
+	/**
+	 * @param id     the party id that made this comparison
+	 * @param bid    the bid that is compared wiht
+	 * @param better list of bids that are better than bid
+	 * @param worse  list of bids that are worse than bid
+	 */
+	@JsonCreator
+	public Comparison(@JsonProperty("id") PartyId id,
+			@JsonProperty("bid") Bid bid,
+			@JsonProperty("better") List<Bid> better,
+			@JsonProperty("worse") List<Bid> worse) {
+		super(id, bid);
+		if (bid == null || better == null || worse == null)
+			throw new IllegalArgumentException(
+					"bid, better and worse must not be null");
+		this.better = better;
+		this.worse = worse;
+	}
+
+	/**
+	 * @return All bids that are better than the bid. Maybe empty
+	 * 
+	 */
+	public List<Bid> getBetter() {
+		return better;
+	}
+
+	/**
+	 * @return All bids that are worse than the bid. Maybe empty
+	 * 
+	 */
+
+	public List<Bid> getWorse() {
+		return worse;
+	}
+
+	@Override
+	public String toString() {
+		return "Comparison[" + getActor() + "," + getBid() + ",better=" + better
+				+ ",worse=" + worse + "]";
+	}
+
+	@Override
+	public int hashCode() {
+		final int prime = 31;
+		int result = super.hashCode();
+		result = prime * result + ((better == null) ? 0 : better.hashCode());
+		result = prime * result + ((worse == null) ? 0 : worse.hashCode());
+		return result;
+	}
+
+	@Override
+	public boolean equals(Object obj) {
+		if (this == obj)
+			return true;
+		if (!super.equals(obj))
+			return false;
+		if (getClass() != obj.getClass())
+			return false;
+		Comparison other = (Comparison) obj;
+		if (better == null) {
+			if (other.better != null)
+				return false;
+		} else if (!better.equals(other.better))
+			return false;
+		if (worse == null) {
+			if (other.worse != null)
+				return false;
+		} else if (!worse.equals(other.worse))
+			return false;
+		return true;
+	}
+
+}
Index: events/src/main/java/geniusweb/actions/ElicitComparison.java
===================================================================
--- events/src/main/java/geniusweb/actions/ElicitComparison.java	(revision 10)
+++ events/src/main/java/geniusweb/actions/ElicitComparison.java	(revision 10)
@@ -0,0 +1,80 @@
+package geniusweb.actions;
+
+import java.util.Collections;
+import java.util.LinkedList;
+import java.util.List;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+import geniusweb.issuevalue.Bid;
+
+/**
+ * Request a comparison from the cob party. The party can do a
+ * {@link Comparison} action as a response.
+ */
+public class ElicitComparison extends ActionWithBid {
+	private final List<Bid> options = new LinkedList<>();
+
+	/**
+	 * @param id   the eliciting party.
+	 * @param bid  the bid to compare the options with
+	 * @param opts the available options that may be chosen from. Must not be
+	 *             null and must have at least 2 options.
+	 */
+	@JsonCreator
+	public ElicitComparison(@JsonProperty("actor") PartyId id,
+			@JsonProperty("bid") Bid bid,
+			@JsonProperty("options") List<Bid> opts) {
+		super(id, bid);
+		if (bid == null)
+			throw new IllegalArgumentException(
+					"Bid to compare with must not be null");
+		if (opts == null || opts.size() < 1) {
+			throw new IllegalArgumentException(
+					"opts must not be null and have at least 1 option");
+		}
+		this.options.addAll(opts);
+	}
+
+	/**
+	 * 
+	 * @return the list of {@link Bid}s to compare {@link #getBid()} with
+	 */
+	public List<Bid> getOptions() {
+		return Collections.unmodifiableList(options);
+	}
+
+	@Override
+	public int hashCode() {
+		final int prime = 31;
+		int result = super.hashCode();
+		result = prime * result + ((options == null) ? 0 : options.hashCode());
+		return result;
+	}
+
+	@Override
+	public boolean equals(Object obj) {
+		if (this == obj)
+			return true;
+		if (!super.equals(obj))
+			return false;
+		if (getClass() != obj.getClass())
+			return false;
+		ElicitComparison other = (ElicitComparison) obj;
+		if (options == null) {
+			if (other.options != null)
+				return false;
+		} else if (!options.equals(other.options))
+			return false;
+		return true;
+	}
+
+	@Override
+	public String toString() {
+		return "ElicitComparison[" + getActor() + "," + getBid() + "," + options
+				+ "]";
+
+	}
+
+}
Index: events/src/test/java/actions/ComparisonTest.java
===================================================================
--- events/src/test/java/actions/ComparisonTest.java	(revision 10)
+++ events/src/test/java/actions/ComparisonTest.java	(revision 10)
@@ -0,0 +1,100 @@
+package 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.actions.Action;
+import geniusweb.actions.Comparison;
+import geniusweb.actions.PartyId;
+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/actions/ElicitComparisonTest.java
===================================================================
--- events/src/test/java/actions/ElicitComparisonTest.java	(revision 10)
+++ events/src/test/java/actions/ElicitComparisonTest.java	(revision 10)
@@ -0,0 +1,92 @@
+package 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.actions.Action;
+import geniusweb.actions.ElicitComparison;
+import geniusweb.actions.PartyId;
+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);
+	}
+
+}
