Index: events/src/main/java/geniusweb/actions/Vote.java
===================================================================
--- events/src/main/java/geniusweb/actions/Vote.java	(revision 33)
+++ events/src/main/java/geniusweb/actions/Vote.java	(revision 34)
@@ -15,5 +15,5 @@
 
 	/**
-	 * @param id       the {@link PartyId} that does the action
+	 * @param actor    the {@link PartyId} that does the action
 	 * @param bid      the bid that is voted on
 	 * @param minPower the minimum power this bid must get in order for the vote
@@ -26,8 +26,9 @@
 	 */
 	@JsonCreator
-	public Vote(@JsonProperty("actor") PartyId id, @JsonProperty("bid") Bid bid,
+	public Vote(@JsonProperty("actor") PartyId actor,
+			@JsonProperty("bid") Bid bid,
 			@JsonProperty("minPower") Integer minPower,
 			@JsonProperty("maxPower") Integer maxPower) {
-		super(id, bid);
+		super(actor, bid);
 		this.minPower = minPower;
 		this.maxPower = maxPower;
Index: events/src/main/java/geniusweb/actions/Votes.java
===================================================================
--- events/src/main/java/geniusweb/actions/Votes.java	(revision 33)
+++ events/src/main/java/geniusweb/actions/Votes.java	(revision 34)
@@ -2,9 +2,8 @@
 
 import java.util.Collections;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Optional;
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.List;
 import java.util.Set;
-import java.util.stream.Collectors;
 
 import com.fasterxml.jackson.annotation.JsonCreator;
@@ -22,33 +21,30 @@
 	/**
 	 * 
-	 * @param id    party id
+	 * @param actor party id
 	 * @param votes the {@link Vote}s that the party can agree on, if the
 	 *              condition of the Vote holds. Every {@link Vote#getActor()}
-	 *              should equal the id
+	 *              should equal the id. There may be at most 1 vote per
+	 *              {@link Bid}.
 	 */
 	@JsonCreator
-	public Votes(@JsonProperty("actor") PartyId id,
+	public Votes(@JsonProperty("actor") PartyId actor,
 			@JsonProperty("votes") Set<Vote> votes) {
-		super(id);
-		this.votes = votes;
+		super(actor);
+		this.votes = new HashSet<>(votes);
 		if (votes == null)
 			throw new NullPointerException("votes must be not null");
+
+		List<Bid> votedBids = new LinkedList<>();
 		for (Vote vote : votes) {
-			if (!vote.getActor().equals(id)) {
+			if (!vote.getActor().equals(actor))
 				throw new IllegalArgumentException("All votes must come from "
-						+ id + " but found " + vote);
-			}
+						+ actor + " but found " + vote);
+
+			Bid bid = vote.getBid();
+			if (votedBids.contains(bid))
+				throw new IllegalArgumentException(
+						"Votes contains multiple Vote's for " + bid);
+			votedBids.add(bid);
 		}
-		// check for duplicate Vote's, possibly with different powers
-		Map<Bid, Long> counts = votes.stream().map(vote -> vote.getBid())
-				.collect(Collectors.groupingBy(bid -> bid,
-						Collectors.counting()));
-		Optional<Entry<Bid, Long>> nonunique = counts.entrySet().stream()
-				.filter(entry -> entry.getValue() > 1).findAny();
-		if (nonunique.isPresent())
-			throw new IllegalArgumentException(
-					"Votes contains multiple Vote's for "
-							+ nonunique.get().getKey());
-
 	}
 
Index: events/src/main/java/geniusweb/events/CurrentState.java
===================================================================
--- events/src/main/java/geniusweb/events/CurrentState.java	(revision 33)
+++ events/src/main/java/geniusweb/events/CurrentState.java	(revision 34)
@@ -20,4 +20,9 @@
  */
 public abstract class CurrentState extends ProtocolEvent {
-	// all should implement NegoState getState();
+	public CurrentState() {
+	}
+
+	public CurrentState(Long now) {
+		super(now);
+	}
 }
Index: events/src/main/java/geniusweb/inform/OptIn.java
===================================================================
--- events/src/main/java/geniusweb/inform/OptIn.java	(revision 33)
+++ events/src/main/java/geniusweb/inform/OptIn.java	(revision 34)
@@ -2,9 +2,6 @@
 
 import java.util.Collections;
+import java.util.LinkedList;
 import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Optional;
-import java.util.stream.Collectors;
 
 import com.fasterxml.jackson.annotation.JsonCreator;
@@ -28,14 +25,12 @@
 		this.votes = votes;
 
-		Map<PartyId, Long> counts = votes.stream().map(vote -> vote.getActor())
-				.collect(Collectors.groupingBy(actor -> actor,
-						Collectors.counting()));
-		Optional<Entry<PartyId, Long>> nonunique = counts.entrySet().stream()
-				.filter(entry -> entry.getValue() > 1).findAny();
-		if (nonunique.isPresent())
-			throw new IllegalArgumentException(
-					"OptIn contains multiple Votes for party "
-							+ nonunique.get().getKey());
-
+		List<PartyId> partyVotes = new LinkedList<>();
+		for (Votes vote : votes) {
+			PartyId party = vote.getActor();
+			if (partyVotes.contains(party))
+				throw new IllegalArgumentException(
+						"OptIn contains multiple Votes for party " + party);
+			partyVotes.add(party);
+		}
 	}
 
Index: events/src/main/java/geniusweb/inform/Voting.java
===================================================================
--- events/src/main/java/geniusweb/inform/Voting.java	(revision 33)
+++ events/src/main/java/geniusweb/inform/Voting.java	(revision 34)
@@ -27,8 +27,13 @@
 
 	/**
-	 * @return list of bids to be voted on
+	 * @return list of offers to be voted on
 	 */
+	public List<Offer> getOffers() {
+		return Collections.unmodifiableList(offers);
+	}
+
+	@Deprecated
 	public List<Offer> getBids() {
-		return Collections.unmodifiableList(offers);
+		return getOffers();
 	}
 
