Index: issuevalue/src/main/java/geniusweb/issuevalue/Bid.java
===================================================================
--- issuevalue/src/main/java/geniusweb/issuevalue/Bid.java	(revision 53)
+++ issuevalue/src/main/java/geniusweb/issuevalue/Bid.java	(revision 1)
@@ -3,5 +3,4 @@
 import java.util.Collections;
 import java.util.HashMap;
-import java.util.HashSet;
 import java.util.Map;
 import java.util.Set;
@@ -41,20 +40,5 @@
 
 	/**
-	 * Makes partial bid with just 1 issue and value.
-	 * 
-	 * @param issue the issue name
-	 * @param value the {@link Value}
-	 */
-	public Bid(String issue, Value value) {
-		if (issue == null || value == null) {
-			throw new NullPointerException("issue and value must be not =null");
-		}
-
-		issuevalues = new HashMap<>();
-		issuevalues.put(issue, value);
-	}
-
-	/**
-	 * @param issue name of the issue
+	 * @param issue
 	 * @return the value for the given issue, or null if there is no value for
 	 *         the given issue.
@@ -65,5 +49,6 @@
 
 	/**
-	 * @param issue name of the issue
+	 * 
+	 * @param issue
 	 * @return true iff the bid contains a value for the given issue.
 	 */
@@ -74,33 +59,4 @@
 	public Set<String> getIssues() {
 		return Collections.unmodifiableSet(issuevalues.keySet());
-	}
-
-	/**
-	 * Merges this partial bid with another partial bid.
-	 * 
-	 * @param otherbid another partial bid.
-	 * @return a bid with the combined values of both partial bids.
-	 * @throws IllegalArgumentException if issues overlap.
-	 */
-	public Bid merge(Bid otherbid) {
-		Set<String> ourissues = new HashSet<>(issuevalues.keySet());
-		ourissues.retainAll(otherbid.getIssues());
-		if (!ourissues.isEmpty()) {
-			throw new IllegalArgumentException(
-					"Otherbid contains issues that are already set:"
-							+ ourissues);
-		}
-		HashMap<String, Value> newvalues = new HashMap<>(issuevalues);
-		newvalues.putAll(otherbid.issuevalues);
-		return new Bid(newvalues);
-
-	}
-
-	/**
-	 * 
-	 * @return (unmodifyable) map with all issues and values in the bid.
-	 */
-	public Map<String, Value> getIssueValues() {
-		return Collections.unmodifiableMap(issuevalues);
 	}
 
Index: issuevalue/src/main/java/geniusweb/issuevalue/DiscreteValueSet.java
===================================================================
--- issuevalue/src/main/java/geniusweb/issuevalue/DiscreteValueSet.java	(revision 53)
+++ issuevalue/src/main/java/geniusweb/issuevalue/DiscreteValueSet.java	(revision 1)
@@ -11,4 +11,5 @@
 import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonTypeName;
 import com.fasterxml.jackson.databind.JsonDeserializer;
 import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
@@ -19,4 +20,5 @@
  * set of discrete values
  */
+@JsonTypeName("discreteset")
 // disable the inherited deserializer to prevent getting into infinite loop...
 @JsonDeserialize(using = JsonDeserializer.None.class)
Index: issuevalue/src/main/java/geniusweb/issuevalue/Domain.java
===================================================================
--- issuevalue/src/main/java/geniusweb/issuevalue/Domain.java	(revision 53)
+++ issuevalue/src/main/java/geniusweb/issuevalue/Domain.java	(revision 1)
@@ -12,5 +12,7 @@
 
 /**
- * A dmain description.
+ * A dmain description. Two domains are equal if they have the same issues in
+ * the same order.
+ *
  */
 @JsonAutoDetect(fieldVisibility = Visibility.ANY, getterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE)
@@ -23,27 +25,26 @@
 	/**
 	 * 
-	 * @param name   a short name for display/toString. This name must contain
-	 *               simple characters only (a-z, A-Z, 0-9).
-	 * @param issues the issues, Map with key: the issue name and value:
-	 *               {@link ValueSet} with the allowed values for the issue.
+	 * @param shortName a short name for display/toString. This name must
+	 *                  contain simple characters only (a-z, A-Z, 0-9).
+	 * @param issues    the issues, list because order may be important.
 	 */
 	@JsonCreator
-	public Domain(@JsonProperty("name") String name,
+	public Domain(@JsonProperty("name") String shortName,
 			@JsonProperty("issuesValues") Map<String, ValueSet> issues) {
 		if (issues == null) {
 			throw new NullPointerException("issues=null");
 		}
-		if (name == null) {
-			throw new NullPointerException("name=null");
+		if (shortName == null) {
+			throw new NullPointerException("shortName=null");
 		}
-		if (!name.matches("[a-zA-Z0-9]+")) {
+		if (!shortName.matches("[a-zA-Z0-9]+")) {
 			throw new IllegalArgumentException(
 					"domain name can have only simple characters but found "
-							+ name);
+							+ shortName);
 		}
 		if (issues.isEmpty()) {
 			throw new IllegalArgumentException("issues is empty set");
 		}
-		this.name = name;
+		this.name = shortName;
 		this.issuesValues = new HashMap<>(issues);
 	}
@@ -72,25 +73,5 @@
 	/**
 	 * 
-	 * @param bid the {@link Bid} to be checked
-	 * @return null if bid is fitting, or a string containing a message
-	 *         explaining why not. A bid is fitting if all issues are in the
-	 *         domain and all issue values are known values.
-	 */
-	public String isFitting(Bid bid) {
-		for (String issue : bid.getIssues()) {
-			if (!(issuesValues.containsKey(issue)))
-				return "bid " + bid + " refers to non-domain issue '" + issue
-						+ "'";
-			if (!issuesValues.get(issue).contains(bid.getValue(issue))) {
-				return "issue '" + issue + "' in bid has illegal value "
-						+ bid.getValue(issue);
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * 
-	 * @param bid a Bid
+	 * @param domain the domain to check the bid in
 	 * @return null if this bid is complete, or an error message explaining why
 	 *         the bid is not complete. Complete means that the bid contains a
@@ -104,5 +85,11 @@
 					+ issuesValues.keySet() + ")";
 		}
-		return isFitting(bid);
+		for (String issue : getIssues()) {
+			if (!issuesValues.get(issue).contains(bid.getValue(issue))) {
+				return "bid issue " + issue + " has illegal value "
+						+ bid.getValue(issue);
+			}
+		}
+		return null;
 	}
 
Index: issuevalue/src/main/java/geniusweb/issuevalue/NumberValue.java
===================================================================
--- issuevalue/src/main/java/geniusweb/issuevalue/NumberValue.java	(revision 53)
+++ issuevalue/src/main/java/geniusweb/issuevalue/NumberValue.java	(revision 1)
@@ -32,10 +32,8 @@
 	@Override
 	public int hashCode() {
-		// WORKAROUND FOR BigDecimal hashCode. NOT auto generated.
-		// Very large numbers and numbers that differ only in a fraction
-		// beyond reach of double may get the same hashcode,
-		// but this is not an issue as equal hashcode only indicates that
-		// numbers MAY be equal.
-		return Double.hashCode(value.doubleValue());
+		final int prime = 31;
+		int result = 1;
+		result = prime * result + ((value == null) ? 0 : value.hashCode());
+		return result;
 	}
 
@@ -52,6 +50,5 @@
 			if (other.value != null)
 				return false;
-		} else if (value.compareTo(other.value) != 0)
-			// MANUAL FIX, DO NOT USE value.equals
+		} else if (!value.equals(other.value))
 			return false;
 		return true;
Index: issuevalue/src/main/java/geniusweb/issuevalue/NumberValueSet.java
===================================================================
--- issuevalue/src/main/java/geniusweb/issuevalue/NumberValueSet.java	(revision 53)
+++ issuevalue/src/main/java/geniusweb/issuevalue/NumberValueSet.java	(revision 1)
@@ -9,4 +9,5 @@
 import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonTypeName;
 import com.fasterxml.jackson.databind.JsonDeserializer;
 import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
@@ -17,4 +18,5 @@
  * number range from low to high with given step size
  */
+@JsonTypeName("numberset")
 // disable the inherited deserializer to prevent getting into infinite loop...
 @JsonDeserialize(using = JsonDeserializer.None.class)
@@ -58,7 +60,4 @@
 	@Override
 	public NumberValue get(BigInteger index) {
-		if (index.compareTo(size()) > 0) {
-			return null;
-		}
 		return new NumberValue(range.get(index));
 	}
Index: issuevalue/src/main/java/geniusweb/issuevalue/Value.java
===================================================================
--- issuevalue/src/main/java/geniusweb/issuevalue/Value.java	(revision 53)
+++ issuevalue/src/main/java/geniusweb/issuevalue/Value.java	(revision 1)
@@ -19,8 +19,4 @@
 @JsonDeserialize(using = ValueDeserializer.class)
 public interface Value {
-	/**
-	 * @return the contained value (String, BigDecimal)
-	 */
-	public Object getValue();
 
 }
Index: issuevalue/src/main/java/geniusweb/issuevalue/ValueSet.java
===================================================================
--- issuevalue/src/main/java/geniusweb/issuevalue/ValueSet.java	(revision 53)
+++ issuevalue/src/main/java/geniusweb/issuevalue/ValueSet.java	(revision 1)
@@ -17,8 +17,8 @@
  * by a String)).
  * 
- * Value is the type of objects in this value set. We do not implement ValueSet
- * right away because types are lost at runtime. Implementing separate classes
- * for implementing the ValueSet ensures we can get back the type at runtime.
- * immutable. Thread safe.
+ * @param <T> type of objects in this value set. We do not implement ValueSet
+ *        right away because types are lost at runtime. Implementing separate
+ *        classes for implementing the ValueSet ensures we can get back the type
+ *        at runtime. immutable. Thread safe.
  */
 @JsonDeserialize(using = ValueSetDeserializer.class)
@@ -62,6 +62,5 @@
 			return codec.treeToValue(node, DiscreteValueSet.class);
 		}
-		throw new IllegalArgumentException(
-				"Expected 'range' or 'values' property for ValueSet contents");
+		throw new IllegalArgumentException("Expected 'range' or 'values' property for ValueSet contents");
 	}
 
