Index: profile/src/main/java/geniusweb/profile/DefaultPartialOrdering.java
===================================================================
--- profile/src/main/java/geniusweb/profile/DefaultPartialOrdering.java	(revision 53)
+++ 	(revision )
@@ -1,173 +1,0 @@
-package geniusweb.profile;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import com.fasterxml.jackson.annotation.JsonAutoDetect;
-import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility;
-import com.fasterxml.jackson.annotation.JsonCreator;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.fasterxml.jackson.core.JsonGenerator;
-import com.fasterxml.jackson.databind.DeserializationContext;
-import com.fasterxml.jackson.databind.JsonSerializer;
-import com.fasterxml.jackson.databind.KeyDeserializer;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.SerializerProvider;
-import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
-import com.fasterxml.jackson.databind.annotation.JsonSerialize;
-
-import geniusweb.issuevalue.Bid;
-import geniusweb.issuevalue.Domain;
-
-/**
- * Strange that we need to do this. Bid is completely standard. The complication
- * that this solves is that the keys are places as STRING in the json code
- * because json allows only strings as key.
- */
-@SuppressWarnings("serial")
-class BidDeserializer extends KeyDeserializer {
-	private ObjectMapper jackson = new ObjectMapper();
-
-	@Override
-	public Bid deserializeKey(String key, DeserializationContext ctxt)
-			throws IOException {
-		return jackson.readValue(key, Bid.class);
-	}
-
-}
-
-/**
- * Serializes a Bid to string. Unfortunately by default jackson uses
- * key.toString() for serializing (rather than
- * {@link ObjectMapper#writeValueAsString(Object)}).
- *
- */
-class BidSerializer extends JsonSerializer<Bid> {
-	private ObjectMapper jackson = new ObjectMapper();
-
-	@Override
-	public void serialize(Bid bid, JsonGenerator gen,
-			SerializerProvider serializers) throws IOException {
-		gen.writeFieldName(jackson.writeValueAsString(bid));
-	}
-
-}
-
-/**
- * Default implementation of partial ordering that stores all is-better
- * relations explicitly in a map.
- * 
- * NOTICE this can handle profiles of max size Integer. This is because various
- * functions used here rely on basic java functions that can handle only int.
- * Besides, the size of partial maps grows very rapidly so this approach is
- * limited anyway.
- */
-@JsonAutoDetect(fieldVisibility = Visibility.ANY, getterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE, isGetterVisibility = Visibility.NONE)
-public class DefaultPartialOrdering extends DefaultProfile
-		implements PartialOrdering {
-
-	/**
-	 * Set is sparsely filled. If a Bid is not a key, it is not better than any
-	 * other bid.
-	 */
-	@JsonDeserialize(keyUsing = BidDeserializer.class)
-	@JsonSerialize(keyUsing = BidSerializer.class)
-	private final Map<Bid, Set<Bid>> better;
-
-	/**
-	 * @param name           the name for the profile
-	 * @param domain         the {@link Domain} description
-	 * @param reservationbid the reservation {@link Bid}
-	 * @param better         a map with keys = a better bid and value=a less
-	 *                       good bid.
-	 */
-	@JsonCreator
-	public DefaultPartialOrdering(@JsonProperty("name") String name,
-			@JsonProperty("domain") Domain domain,
-			@JsonProperty("reservationBid") Bid reservationbid,
-			@JsonProperty("better") Map<Bid, Set<Bid>> better) {
-		super(name, domain, reservationbid);
-		this.better = better;
-	}
-
-	@Override
-	public boolean isPreferredOrEqual(Bid bid1, Bid bid2) {
-		if (!better.containsKey(bid1))
-			return false;
-		return better.get(bid1).contains(bid2);
-	}
-
-	/**
-	 * 
-	 * @return a list with all the bids that are referred to, either as better
-	 *         or as worse than another bid
-	 */
-	public List<Bid> getBids() {
-		// FIXME the iteration order may not be guaranteed!
-		Set<Bid> bids = new HashSet<>();
-		for (Bid bid : better.keySet()) {
-			bids.add(bid);
-			bids.addAll(better.get(bid));
-		}
-		return new ArrayList<Bid>(bids);
-	}
-
-	/**
-	 * 
-	 * @return a list of tuples [bid1index, bid2index]. It indicates that
-	 *         bids[bid1index] isbetterthan bids[bid2index].
-	 */
-	public List<List<Integer>> getBetter() {
-		List<List<Integer>> betterlist = new LinkedList<>();
-		List<Bid> bidslist = getBids();
-
-		for (Bid bid : bidslist) {
-			if (better.containsKey(bid)) {
-				for (Bid worsebid : better.get(bid)) {
-					betterlist.add(Arrays.asList(bidslist.indexOf(bid),
-							bidslist.indexOf(worsebid)));
-				}
-			}
-		}
-
-		return betterlist;
-	}
-
-	@Override
-	public String toString() {
-		return "DefaultPartialOrdering[" + getValuesString() + "," + better
-				+ "]";
-	}
-
-	@Override
-	public int hashCode() {
-		final int prime = 31;
-		int result = super.hashCode();
-		result = prime * result + ((better == null) ? 0 : better.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;
-		DefaultPartialOrdering other = (DefaultPartialOrdering) obj;
-		if (better == null) {
-			if (other.better != null)
-				return false;
-		} else if (!better.equals(other.better))
-			return false;
-		return true;
-	}
-
-}
Index: profile/src/main/java/geniusweb/profile/DefaultProfile.java
===================================================================
--- profile/src/main/java/geniusweb/profile/DefaultProfile.java	(revision 53)
+++ 	(revision )
@@ -1,101 +1,0 @@
-package geniusweb.profile;
-
-import com.fasterxml.jackson.annotation.JsonCreator;
-import com.fasterxml.jackson.annotation.JsonIgnore;
-
-import geniusweb.issuevalue.Bid;
-import geniusweb.issuevalue.Domain;
-
-/**
- * Set up such that jackson can look at the getters.
- *
- */
-public abstract class DefaultProfile implements Profile {
-	private final String name;
-	private final Domain domain;
-	private final Bid reservationbid;
-
-	/**
-	 * 
-	 * @param name           the name for the profile
-	 * @param domain         the {@link Domain} description
-	 * @param reservationbid the reservation {@link Bid}
-	 */
-	@JsonCreator
-	public DefaultProfile(String name, Domain domain, Bid reservationbid) {
-		this.name = name;
-		this.domain = domain;
-		this.reservationbid = reservationbid;
-		if (reservationbid != null) {
-			String message = domain.isFitting(reservationbid);
-			if (message != null)
-				throw new IllegalArgumentException(
-						"reservationbid is not fitting domain: " + message);
-		}
-
-	}
-
-	@Override
-	public String getName() {
-		return name;
-	}
-
-	@Override
-	public Domain getDomain() {
-		return domain;
-	}
-
-	@Override
-	public Bid getReservationBid() {
-		return reservationbid;
-	}
-
-	/**
-	 * 
-	 * @return string of values contained in here. Useful to make derived
-	 *         toString functions
-	 */
-	@JsonIgnore
-	public String getValuesString() {
-		return name + "," + domain + "," + reservationbid;
-	}
-
-	@Override
-	public int hashCode() {
-		final int prime = 31;
-		int result = 1;
-		result = prime * result + ((domain == null) ? 0 : domain.hashCode());
-		result = prime * result + ((name == null) ? 0 : name.hashCode());
-		result = prime * result
-				+ ((reservationbid == null) ? 0 : reservationbid.hashCode());
-		return result;
-	}
-
-	@Override
-	public boolean equals(Object obj) {
-		if (this == obj)
-			return true;
-		if (obj == null)
-			return false;
-		if (getClass() != obj.getClass())
-			return false;
-		DefaultProfile other = (DefaultProfile) obj;
-		if (domain == null) {
-			if (other.domain != null)
-				return false;
-		} else if (!domain.equals(other.domain))
-			return false;
-		if (name == null) {
-			if (other.name != null)
-				return false;
-		} else if (!name.equals(other.name))
-			return false;
-		if (reservationbid == null) {
-			if (other.reservationbid != null)
-				return false;
-		} else if (!reservationbid.equals(other.reservationbid))
-			return false;
-		return true;
-	}
-
-}
Index: profile/src/main/java/geniusweb/profile/FullOrdering.java
===================================================================
--- profile/src/main/java/geniusweb/profile/FullOrdering.java	(revision 53)
+++ profile/src/main/java/geniusweb/profile/FullOrdering.java	(revision 1)
@@ -11,17 +11,13 @@
 	 * @param bid1 the first item's utility/preference
 	 * @param bid2 the second item's utility/preference
-	 * @return true iff bid1 is considered better or equal (&ge;) than bid 2. In
-	 *         all other cases false is returned.
+	 * @return true iff bid1 is considered better or equal (&ge;) than bid 2. In all
+	 *         other cases false is returned.
 	 * 
 	 *         This predicate should be implemented such that
-	 *         <ul>
 	 *         <li>For all b1 and b2, either b1 &ge; b2 or b2 &ge; b1.
 	 *         <li>b &ge; b (every bid is better or equal to itself)
-	 *         <li>If b1&ge;b2 and b2&ge;b1 then the two bids are considered
-	 *         equally good. Note that this differes from a partial order in
-	 *         mathematics.
-	 *         <li>it behaves transitive: if b1&ge;b2 and b2&ge;b3 then
-	 *         b1&ge;b3.
-	 *         </ul>
+	 *         <li>If b1&ge;b2 and b2&ge;b1 then the two bids are considered equally
+	 *         good. Note that this differes from a partial order in mathematics.
+	 *         <li>it behaves transitive: if b1&ge;b2 and b2&ge;b3 then b1&ge;b3.
 	 */
 	@Override
Index: profile/src/main/java/geniusweb/profile/PartialOrdering.java
===================================================================
--- profile/src/main/java/geniusweb/profile/PartialOrdering.java	(revision 53)
+++ profile/src/main/java/geniusweb/profile/PartialOrdering.java	(revision 1)
@@ -13,17 +13,13 @@
 	 * @param bid1 the first item's utility/preference
 	 * @param bid2 the second item's utility/preference
-	 * @return true iff bid1 is considered better or equal (&ge;) than bid 2. In
-	 *         all other cases false is returned. A bid may not have a &ge;
-	 *         relation at all.
+	 * @return true iff bid1 is considered better or equal (&ge;) than bid 2. In all
+	 *         other cases false is returned. A bid may not have a &ge; relation at
+	 *         all.
 	 * 
 	 *         This predicate should be implemented such that
-	 *         <ul>
 	 *         <li>b &ge; b (every bid is better or equal to itself)
-	 *         <li>If b1&ge;b2 and b2&ge;b1 then the two bids are considered
-	 *         equally good. Note that this differes from a partial order in
-	 *         mathematics.
-	 *         <li>it behaves transitive: if b1&ge;b2 and b2&ge;b3 then
-	 *         b1&ge;b3.
-	 *         </ul>
+	 *         <li>If b1&ge;b2 and b2&ge;b1 then the two bids are considered equally
+	 *         good. Note that this differes from a partial order in mathematics.
+	 *         <li>it behaves transitive: if b1&ge;b2 and b2&ge;b3 then b1&ge;b3.
 	 */
 	boolean isPreferredOrEqual(Bid bid1, Bid bid2);
Index: profile/src/main/java/geniusweb/profile/Profile.java
===================================================================
--- profile/src/main/java/geniusweb/profile/Profile.java	(revision 53)
+++ profile/src/main/java/geniusweb/profile/Profile.java	(revision 1)
@@ -7,5 +7,4 @@
 import geniusweb.issuevalue.Domain;
 import geniusweb.profile.utilityspace.LinearAdditiveUtilitySpace;
-import geniusweb.profile.utilityspace.SumOfGroupsUtilitySpace;
 
 /**
@@ -17,7 +16,5 @@
  */
 @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.WRAPPER_OBJECT)
-@JsonSubTypes({ @JsonSubTypes.Type(value = LinearAdditiveUtilitySpace.class),
-		@JsonSubTypes.Type(value = DefaultPartialOrdering.class),
-		@JsonSubTypes.Type(value = SumOfGroupsUtilitySpace.class) })
+@JsonSubTypes({ @JsonSubTypes.Type(value = LinearAdditiveUtilitySpace.class) })
 public interface Profile {
 
@@ -36,10 +33,10 @@
 	 * 
 	 * @return a (hypothetical) bid that is the best alternative to a
-	 *         non-agreement. Only bids that are equal or better should be
-	 *         accepted. If a negotiation does not reach an agreement, the party
-	 *         can get this offer somewhere else. This replaces the older notion
-	 *         of a "reservation value" and is more general. If null, there is
-	 *         no reservation bid and any agreement is better than no agreement.
-	 *         This bid can be partial.
+	 *         non-agreement. Only bids that are
+	 *         {@link #isPreferredOrEqual(Bid, Bid)} should be accepted. If a
+	 *         negotiation does not reach an agreement, the party can get this
+	 *         offer somewhere else. This replaces the older notion of a
+	 *         "reservation value" and is more general. If null, there is no
+	 *         reservation bid and any agreement is better than no agreement.
 	 * 
 	 */
Index: profile/src/main/java/geniusweb/profile/utilityspace/DiscreteValueSetUtilities.java
===================================================================
--- profile/src/main/java/geniusweb/profile/utilityspace/DiscreteValueSetUtilities.java	(revision 53)
+++ profile/src/main/java/geniusweb/profile/utilityspace/DiscreteValueSetUtilities.java	(revision 1)
@@ -2,5 +2,4 @@
 
 import java.math.BigDecimal;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -15,13 +14,14 @@
 import geniusweb.issuevalue.ValueSet;
 
+import com.fasterxml.jackson.annotation.JsonTypeName;
+
 /**
  * Links a set of values to utilities for that value. Does not link to some
  * issue so may need further checking when used for an actual issue. Constructor
  * guarantees that
- * <ul>
  * <li>All values in the provided map (the utilities) are in [0,1]
  * <li>All keys are proper {@link DiscreteValue}s
- * </ul>
  */
+@JsonTypeName("discreteutils")
 @JsonAutoDetect(fieldVisibility = Visibility.ANY, getterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE)
 public class DiscreteValueSetUtilities implements ValueSetUtilities {
@@ -37,23 +37,19 @@
 	 * create new object based on the given mapping from values to utilities.
 	 * 
-	 * @param valueUtils map with key {@link DiscreteValue}s and value a Double
-	 *                   in the range [0,1].
+	 * @param valueUtils map with key {@link DiscreteValue}s and value a Double in
+	 *                   the range [0,1].
 	 * @throws NullPointerException     if one of the args is null
 	 * @throws IllegalArgumentException if values are not in range [0,1].
 	 */
-	public DiscreteValueSetUtilities(
-			Map<DiscreteValue, BigDecimal> valueUtils) {
+	public DiscreteValueSetUtilities(Map<DiscreteValue, BigDecimal> valueUtils) {
 		if (valueUtils == null) {
 			throw new NullPointerException("valueUtils==null");
 		}
 		if (valueUtils.keySet().contains(null)) {
-			throw new NullPointerException(
-					"one of the keys in valueUtils is null");
+			throw new NullPointerException("one of the keys in valueUtils is null");
 		}
 		if (valueUtils.values().stream()
-				.anyMatch(v -> v == null || v.compareTo(BigDecimal.ZERO) < 0
-						|| v.compareTo(BigDecimal.ONE) > 0)) {
-			throw new IllegalArgumentException(
-					"Weights in valueUtils must all be in [0,1]");
+				.anyMatch(v -> v == null || v.compareTo(BigDecimal.ZERO) < 0 || v.compareTo(BigDecimal.ONE) > 0)) {
+			throw new IllegalArgumentException("Weights in valueUtils must all be in [0,1]");
 		}
 		this.valueUtilities.putAll(valueUtils);
@@ -69,22 +65,12 @@
 	}
 
-	/**
-	 * @return copy of the value-utility pair map.
-	 */
-	public Map<DiscreteValue, BigDecimal> getUtilities() {
-		return Collections.unmodifiableMap(valueUtilities);
-	}
-
 	@Override
 	public String isFitting(ValueSet valueset) {
 		if (!(valueset instanceof DiscreteValueSet)) {
-			return "The utilities are for a discrete valueset but the given values are "
-					+ valueset;
+			return "The utilities are for a discrete valueset but the given values are " + valueset;
 		}
 		DiscreteValueSet discvalueset = (DiscreteValueSet) valueset;
-		if (!valueUtilities.keySet()
-				.equals(new HashSet<>(discvalueset.getValues())))
-			return "The values in the set " + valueset
-					+ " do not match the values mapped to utilities "
+		if (!valueUtilities.keySet().equals(new HashSet<>(discvalueset.getValues())))
+			return "The values in the set " + valueset + " do not match the values mapped to utilities "
 					+ valueUtilities.keySet();
 		return null;
@@ -93,5 +79,5 @@
 	@Override
 	public String toString() {
-		return "DiscreteValueSetUtilities" + valueUtilities;
+		return "ValueSetUtilities" + valueUtilities;
 	}
 
@@ -100,6 +86,5 @@
 		final int prime = 31;
 		int result = 1;
-		result = prime * result
-				+ ((valueUtilities == null) ? 0 : valueUtilities.hashCode());
+		result = prime * result + ((valueUtilities == null) ? 0 : valueUtilities.hashCode());
 		return result;
 	}
Index: profile/src/main/java/geniusweb/profile/utilityspace/LinearAdditive.java
===================================================================
--- profile/src/main/java/geniusweb/profile/utilityspace/LinearAdditive.java	(revision 53)
+++ 	(revision )
@@ -1,30 +1,0 @@
-
-package geniusweb.profile.utilityspace;
-
-import java.math.BigDecimal;
-import java.util.Map;
-
-/**
- * interface to a Utilityspace that is linear-additive.
- *
- */
-public interface LinearAdditive extends UtilitySpace {
-	/**
-	 * @return the map from issue names to valuesetutilities (un-weighted)
-	 */
-	Map<String, ValueSetUtilities> getUtilities();
-
-	/**
-	 * 
-	 * @return the map from issue names to weights. weights sum to 1.
-	 */
-	Map<String, BigDecimal> getWeights();
-
-	/**
-	 * 
-	 * @param issue the issue name
-	 * @return the weight of the given issue
-	 */
-	BigDecimal getWeight(String issue);
-
-}
Index: profile/src/main/java/geniusweb/profile/utilityspace/LinearAdditiveUtilitySpace.java
===================================================================
--- profile/src/main/java/geniusweb/profile/utilityspace/LinearAdditiveUtilitySpace.java	(revision 53)
+++ profile/src/main/java/geniusweb/profile/utilityspace/LinearAdditiveUtilitySpace.java	(revision 1)
@@ -8,10 +8,11 @@
 import com.fasterxml.jackson.annotation.JsonAutoDetect;
 import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility;
-import com.fasterxml.jackson.annotation.JsonCreator;
-import com.fasterxml.jackson.annotation.JsonProperty;
 
 import geniusweb.issuevalue.Bid;
 import geniusweb.issuevalue.Domain;
 import geniusweb.issuevalue.Value;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonProperty;
 
 /**
@@ -20,12 +21,10 @@
  * 
  * Constructor guarantees that
- * <ul>
  * <li>weights are normalized to 1
  * <li>the issues in the utility map and weights map match those in the domain
  * <li>The utilities for each issue are proper {@link ValueSetUtilities} objects
- * </ul>
  */
 @JsonAutoDetect(fieldVisibility = Visibility.ANY, getterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE, isGetterVisibility = Visibility.NONE)
-public class LinearAdditiveUtilitySpace implements LinearAdditive {
+public class LinearAdditiveUtilitySpace implements UtilitySpace {
 
 	private final String name;
@@ -49,12 +48,12 @@
 	 * @param domain  the {@link Domain} in which this profile is defined.
 	 * @param name    the name of this profile. Must be simple name (a-Z, 0-9)
-	 * @param issueUtilities   a map with key: issue names (String) and value: the values
+	 * @param utils   a map with key: issue names (String) and value: the values
 	 *                for that issue. There MUST NOT be a null issue. All values
 	 *                MUST NOT be null.
-	 * @param issueWeights the weight of each issue in the computation of the
+	 * @param weights the weight of each issue in the computation of the
 	 *                weighted sum. The issues must be the same as those in the
 	 *                utils map. All weights MUST NOT be null. The weights MUST
 	 *                sum to 1.
-	 * @param reservationBid  the reservation bid. Only bids that are
+	 * @param resBid  the reservation bid. Only bids that are
 	 *                {@link #isPreferredOrEqual(Bid, Bid)} should be accepted.
 	 *                Can be null, meaning that there is no reservation bid and
@@ -66,26 +65,24 @@
 	public LinearAdditiveUtilitySpace(@JsonProperty("domain") Domain domain,
 			@JsonProperty("name") String name,
-			@JsonProperty("issueUtilities") Map<String, ValueSetUtilities> issueUtilities,
-			@JsonProperty("issueWeights") Map<String, BigDecimal> issueWeights,
-			@JsonProperty("reservationBid") Bid reservationBid) {
-
+			@JsonProperty("issueUtilities") Map<String, ValueSetUtilities> utils,
+			@JsonProperty("issueWeights") Map<String, BigDecimal> weights,
+			@JsonProperty("reservationBid") Bid resBid) {
 		if (domain == null) {
 			throw new NullPointerException("domain=null");
 		}
-		if (issueUtilities == null) {
+		if (utils == null) {
 			throw new NullPointerException("utils=null");
 		}
-		if (issueWeights == null) {
+		if (weights == null) {
 			throw new NullPointerException("weights=null");
 		}
-		if (issueUtilities.values().contains(null)) {
+		if (utils.values().contains(null)) {
 			throw new NullPointerException(
-					"One of the ValueSetUtilities in issueUtilitiesis null:"
-							+ issueUtilities);
-		}
-		if (issueWeights.values().contains(null)) {
+					"One of the ValueSetUtilities is null");
+		}
+		if (weights.values().contains(null)) {
 			throw new NullPointerException("One of the weights is null");
 		}
-		if (issueUtilities.keySet().contains(null)) {
+		if (utils.keySet().contains(null)) {
 			throw new NullPointerException("One of the issue names is null");
 		}
@@ -94,14 +91,14 @@
 					"Name must be simple (a-Z, 0-9) but got " + name);
 		}
-		if (!(issueUtilities.keySet().equals(domain.getIssues()))) {
+		if (!(utils.keySet().equals(domain.getIssues()))) {
 			throw new IllegalArgumentException(
 					"The issues in  utilityspace and domain do not match: utilityspace has issues "
-							+ issueUtilities.keySet() + " but domain contains "
+							+ utils.keySet() + " but domain contains "
 							+ domain.getIssues());
 		}
-		if (!(issueWeights.keySet().equals(domain.getIssues()))) {
+		if (!(weights.keySet().equals(domain.getIssues()))) {
 			throw new IllegalArgumentException(
 					"The issues in weights and domain do not match: weights has "
-							+ issueWeights.keySet() + " but domain contains "
+							+ weights.keySet() + " but domain contains "
 							+ domain.getIssues());
 		}
@@ -113,24 +110,16 @@
 		}
 
-		BigDecimal sum = issueWeights.values().stream().reduce(BigDecimal.ZERO,
+		BigDecimal sum = weights.values().stream().reduce(BigDecimal.ZERO,
 				BigDecimal::add);
 		if (BigDecimal.ONE.compareTo(sum) != 0) { // equals does NOT work for
 													// comparing BigDecimals!!
 			throw new IllegalArgumentException("The sum of the weights ("
-					+ issueWeights.values() + ") must be 1");
-		}
-		if (reservationBid != null) {
-			String message = domain.isFitting(reservationBid);
-			if (message != null)
-				throw new IllegalArgumentException(
-						"reservationbid is not fitting domain: " + message);
-		}
-
+					+ weights.values() + ") must be 1");
+		}
 		this.domain = domain;
 		this.name = name;
-		this.reservationBid = reservationBid;
-		this.issueUtilities.putAll(issueUtilities);
-		this.issueWeights.putAll(issueWeights);
-
+		this.reservationBid = resBid;
+		issueUtilities.putAll(utils);
+		issueWeights.putAll(weights);
 	}
 
@@ -142,5 +131,16 @@
 	}
 
-	@Override
+	/**
+	 * 
+	 * @param issue the issue to get weighted util for
+	 * @param value the issue value to use (typically coming from a bid)
+	 * @return weighted util of just the issue value:
+	 *         issueUtilities[issue].utility(value) * issueWeights[issue)
+	 */
+	private BigDecimal util(String issue, Value value) {
+		return issueWeights.get(issue)
+				.multiply(issueUtilities.get(issue).getUtility(value));
+	}
+
 	public BigDecimal getWeight(String issue) {
 		return issueWeights.get(issue);
@@ -220,25 +220,18 @@
 	}
 
-	@Override
+	/**
+	 * @return the map from issue names to valuesetutilities
+	 */
 	public Map<String, ValueSetUtilities> getUtilities() {
 		return Collections.unmodifiableMap(issueUtilities);
 	}
 
-	@Override
+	/**
+	 * 
+	 * @return the map from issue names to weights. weights sum to 1.
+	 */
 	public Map<String, BigDecimal> getWeights() {
 		return Collections.unmodifiableMap(issueWeights);
 	}
 
-	/**
-	 * 
-	 * @param issue the issue to get weighted util for
-	 * @param value the issue value to use (typically coming from a bid)
-	 * @return weighted util of just the issue value:
-	 *         issueUtilities[issue].utility(value) * issueWeights[issue)
-	 */
-	private BigDecimal util(String issue, Value value) {
-		return issueWeights.get(issue)
-				.multiply(issueUtilities.get(issue).getUtility(value));
-	}
-
 }
Index: profile/src/main/java/geniusweb/profile/utilityspace/NumberValueSetUtilities.java
===================================================================
--- profile/src/main/java/geniusweb/profile/utilityspace/NumberValueSetUtilities.java	(revision 53)
+++ profile/src/main/java/geniusweb/profile/utilityspace/NumberValueSetUtilities.java	(revision 1)
@@ -6,6 +6,4 @@
 import com.fasterxml.jackson.annotation.JsonAutoDetect;
 import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility;
-import com.fasterxml.jackson.annotation.JsonCreator;
-import com.fasterxml.jackson.annotation.JsonProperty;
 
 import geniusweb.issuevalue.NumberValue;
@@ -13,4 +11,9 @@
 import geniusweb.issuevalue.Value;
 import geniusweb.issuevalue.ValueSet;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+
 import tudelft.utilities.immutablelist.Range;
 
@@ -20,4 +23,5 @@
  *
  */
+@JsonTypeName("numberutils")
 @JsonAutoDetect(fieldVisibility = Visibility.ANY, getterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE)
 public class NumberValueSetUtilities implements ValueSetUtilities {
@@ -38,5 +42,5 @@
 	 * @param lowUtility  the utility of the {@link #lowValue}
 	 * @param highValue   the high value of the {@link Range}. Must be
-	 *                    &gt;lowValue.
+	 *                    >lowValue.
 	 * @param highUtility the utility of the {@link #highValue}
 	 */
@@ -49,6 +53,5 @@
 		if (lowValue == null || highValue == null || lowUtility == null
 				|| highUtility == null) {
-			throw new NullPointerException(
-					"arguments lowValue, lowUtility, highValue and highUtility must be non-null");
+			throw new NullPointerException("arguments must be non-null");
 		}
 		if (!isInZeroOne(lowUtility)) {
@@ -97,6 +100,6 @@
 		}
 		if (numvalset.getRange().getHigh().compareTo(highValue) != 0) {
-			return "the utilities are specified up to " + highValue
-					+ " but the valueset ends at "
+			return "the utilities are specified down to " + highValue
+					+ " but the valueset starts at "
 					+ numvalset.getRange().getHigh();
 		}
@@ -105,38 +108,7 @@
 	}
 
-	/**
-	 * @return the lowest value
-	 */
-	public BigDecimal getLowValue() {
-		return lowValue;
-	}
-
-	/**
-	 * 
-	 * @return the highest value
-	 */
-	public BigDecimal getHighValue() {
-		return highValue;
-	}
-
-	/**
-	 * 
-	 * @return the utility of the lowest value
-	 */
-	public BigDecimal getLowUtility() {
-		return lowUtility;
-	}
-
-	/**
-	 * 
-	 * @return the utility of the highest value
-	 */
-	public BigDecimal getHighUtility() {
-		return highUtility;
-	}
-
 	@Override
 	public String toString() {
-		return "NumberValueSetUtilities(" + lowValue + "->" + lowUtility + ","
+		return "NumberValUtility(" + lowValue + "->" + lowUtility + ","
 				+ highValue + "->" + highUtility + ")";
 	}
Index: profile/src/main/java/geniusweb/profile/utilityspace/PartsUtilities.java
===================================================================
--- profile/src/main/java/geniusweb/profile/utilityspace/PartsUtilities.java	(revision 53)
+++ 	(revision )
@@ -1,271 +1,0 @@
-package geniusweb.profile.utilityspace;
-
-import java.math.BigDecimal;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.stream.Collectors;
-
-import com.fasterxml.jackson.annotation.JsonAutoDetect;
-import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility;
-import com.fasterxml.jackson.annotation.JsonCreator;
-import com.fasterxml.jackson.annotation.JsonProperty;
-
-import geniusweb.issuevalue.Domain;
-import geniusweb.issuevalue.Value;
-import geniusweb.issuevalue.ValueSet;
-import tudelft.utilities.immutablelist.ImmutableList;
-import tudelft.utilities.immutablelist.Outer;
-
-/**
- * Contains utilities of a ProductOfValue of a {@link SumOfGroupsUtilitySpace}.
- * So this is similar to a {@link DiscreteValueSetUtilities} but instead of
- * issues this contains an (ordered) list of issues. This object serializes to
- * something like <code> 
- * {"partsutils":
- * {"issues":["issue1","issue2"],
- * "utilslist":[{"values":["low","low"],"util":0.3},{"values":["high","high"],"util":0.9}]}}
- </code> The issues field contains a list of N issues in the domain, The
- * utilslist contains a list of dictionaries, with "values" containing a list of
- * N issue values, in the same order as the issues list and with "util"
- * containng the utility value of that set of values.
- */
-@JsonAutoDetect(fieldVisibility = Visibility.ANY, getterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE, isGetterVisibility = Visibility.NONE)
-public class PartsUtilities implements ValueSetUtilities {
-	private final List<String> issues;
-	// the real but not-serializable values (because Map can only have String
-	// keys in jackson)
-	private transient final Map<ProductOfValue, BigDecimal> utilities = new HashMap<>();
-	// copy only for serializing
-	private final List<PartUtil> utilslist = new LinkedList<>();
-
-	/**
-	 * 
-	 * @param issues list of issues
-	 * @param utils  with keys: list of values, one for each issue in issues (in
-	 *               the order of the list of issues) and value: utility value
-	 *               for that list of values. All list-of-values missing from
-	 *               the map are assumed to have utility 0. This includes
-	 *               partial bids where list-of-values contain null objects.
-	 */
-	public PartsUtilities(List<String> issues,
-			Map<ProductOfValue, BigDecimal> utils) {
-		if (issues == null || utils == null || issues.isEmpty()) {
-			throw new IllegalArgumentException(
-					"issues and utils must be not null or empty");
-		}
-
-		this.issues = issues;
-		this.utilities.putAll(utils);
-
-		checkUtilities();
-		for (ProductOfValue pval : utils.keySet()) {
-			utilslist.add(new PartUtil(pval.getValues(), utils.get(pval)));
-		}
-	}
-
-	@JsonCreator
-	public PartsUtilities(@JsonProperty("issues") List<String> issues,
-			@JsonProperty("utilslist") List<PartUtil> utilslist) {
-		this(issues, list2map(utilslist));
-	}
-
-	/**
-	 * 
-	 * @param pval the {@link ProductOfValue} value
-	 * @return the utility of the value, in the same order as
-	 *         {@link #getIssues()}. Returns 0 if there is no utility set for
-	 *         the given combination of values. Notice, partial bids will
-	 *         usually have utility 0.
-	 * 
-	 */
-	@Override
-	public BigDecimal getUtility(Value pval) {
-		BigDecimal val = utilities.get(pval);
-		if (val == null)
-			return BigDecimal.ZERO;
-		return val;
-	}
-
-	@Override
-	public String isFitting(ValueSet valueset) {
-		return null; // what can we tests here?
-	}
-
-	/**
-	 * @return the issues that are contained here.
-	 */
-	public List<String> getIssues() {
-		return issues;
-	}
-
-	/**
-	 * 
-	 * @return map with all available values and their utilities. The map and
-	 *         its contents should all be immutable.
-	 */
-	public Map<ProductOfValue, BigDecimal> getUtilities() {
-		return Collections.unmodifiableMap(utilities);
-	}
-
-	/**
-	 * 
-	 * @param other another {@link PartsUtilities} map. The issues in the other
-	 *              map must be different from {@link #issues}.
-	 * @return new PartsUtils, with the powermap of all combinations of one
-	 *         element from this and one from the other map, and with the
-	 *         utilities computed as the sum of thisvalue + othervalue.
-	 */
-	public PartsUtilities add(PartsUtilities other) {
-		for (String issue : issues) {
-			if (other.issues.contains(issue)) {
-				throw new IllegalArgumentException(
-						"Issue " + issue + " exists already");
-			}
-		}
-
-		List<String> combinedissues = new LinkedList<String>(issues);
-		combinedissues.addAll(other.issues);
-
-		Map<ProductOfValue, BigDecimal> combinedvalues = new HashMap<>();
-		for (ProductOfValue productOfValue : this.utilities.keySet()) {
-			for (ProductOfValue otherProductOfValue : other.utilities
-					.keySet()) {
-				BigDecimal combinedutil = getUtility(productOfValue)
-						.add(other.getUtility(otherProductOfValue));
-				combinedvalues.put(productOfValue.merge(otherProductOfValue),
-						combinedutil);
-			}
-		}
-		return new PartsUtilities(combinedissues, combinedvalues);
-
-	}
-
-	@Override
-	public int hashCode() {
-		final int prime = 31;
-		int result = 1;
-		result = prime * result + ((issues == null) ? 0 : issues.hashCode());
-		result = prime * result
-				+ ((utilities == null) ? 0 : utilities.hashCode());
-		return result;
-	}
-
-	/**
-	 * Check that all needed values have been set to a utility.
-	 * 
-	 * @param domain the domain for which this should be parts. We need this to
-	 *               check that the values used are actually from the dmoain
-	 * @throws IllegalArgumentException if a problem is found
-	 */
-	public void checkComplete(Domain domain) {
-
-		final List<ImmutableList<Value>> valuesofissues = issues.stream()
-				.map(iss -> domain.getValues(iss)).collect(Collectors.toList());
-
-		// check that all possible value combinations are handled
-		for (ImmutableList<Value> vals : new Outer<Value>(valuesofissues)) {
-			ProductOfValue expected = ProductOfValue.create(vals);
-			if (!utilities.containsKey(expected))
-				throw new IllegalArgumentException(
-						"Values " + vals + " must be assigned a utility");
-		}
-	}
-
-	@Override
-	public boolean equals(Object obj) {
-		if (this == obj)
-			return true;
-		if (obj == null)
-			return false;
-		if (getClass() != obj.getClass())
-			return false;
-		PartsUtilities other = (PartsUtilities) obj;
-		if (issues == null) {
-			if (other.issues != null)
-				return false;
-		} else if (!issues.equals(other.issues))
-			return false;
-		if (utilities == null) {
-			if (other.utilities != null)
-				return false;
-		} else if (!utilities.equals(other.utilities))
-			return false;
-		return true;
-	}
-
-	@Override
-	public String toString() {
-		return "PartsUtilities[" + issues + "," + utilities + "]";
-	}
-
-	/**
-	 * Check that the set of utilities is complete and no weird utility values
-	 * were used
-	 * 
-	 */
-	private void checkUtilities() {
-		for (BigDecimal value : utilities.values()) {
-			if (value == null || value.compareTo(BigDecimal.ZERO) < 0
-					|| value.compareTo(BigDecimal.ONE) > 0)
-				throw new IllegalArgumentException(
-						"part weights must all be in [0,1] but found " + value);
-		}
-	}
-
-	private static Map<ProductOfValue, BigDecimal> list2map(
-			List<PartUtil> list) {
-		Map<ProductOfValue, BigDecimal> map = new HashMap<>();
-		for (PartUtil partutil : list) {
-			map.put(new ProductOfValue(partutil.getValues()),
-					partutil.getUtil());
-		}
-		return map;
-	}
-
-	/**
-	 * @return the max utility of all values contained here.
-	 */
-	public BigDecimal getMaxUtility() {
-		BigDecimal maxutil = BigDecimal.ZERO;
-		for (ProductOfValue vakye : utilities.keySet()) {
-			if (utilities.get(vakye).compareTo(maxutil) > 0) {
-				maxutil = utilities.get(vakye);
-			}
-
-		}
-		return maxutil;
-	}
-
-}
-
-/**
- * contains list of values, and the utility for this combi of values. The values
- * make only sense with a corresponding list of issues, but that is managed in
- * (see {@link PartsUtilities}.
- * <p>
- * immutable.
- */
-@JsonAutoDetect(fieldVisibility = Visibility.ANY, getterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE, isGetterVisibility = Visibility.NONE)
-class PartUtil {
-	private final List<Value> values;
-
-	private final BigDecimal util;
-
-	@JsonCreator
-	public PartUtil(@JsonProperty("values") List<Value> values,
-			@JsonProperty("util") BigDecimal util) {
-		this.values = values;
-		this.util = util;
-	}
-
-	public List<Value> getValues() {
-		return values;
-	}
-
-	public BigDecimal getUtil() {
-		return util;
-	}
-}
Index: profile/src/main/java/geniusweb/profile/utilityspace/ProductOfValue.java
===================================================================
--- profile/src/main/java/geniusweb/profile/utilityspace/ProductOfValue.java	(revision 53)
+++ 	(revision )
@@ -1,90 +1,0 @@
-package geniusweb.profile.utilityspace;
-
-import java.util.ArrayList;
-import java.util.LinkedList;
-import java.util.List;
-
-import com.fasterxml.jackson.annotation.JsonCreator;
-import com.fasterxml.jackson.annotation.JsonValue;
-import com.fasterxml.jackson.databind.JsonDeserializer;
-import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
-
-import geniusweb.issuevalue.Value;
-import tudelft.utilities.immutablelist.ImmutableList;
-
-/**
- * A {@link Value} that is a list of a number of values in the space
- */
-@JsonDeserialize(using = JsonDeserializer.None.class)
-public class ProductOfValue implements Value {
-	private final List<Value> values = new ArrayList<Value>();
-
-	/**
-	 * @param newvals the values to make a product of
-	 */
-	@JsonCreator
-	public ProductOfValue(List<Value> newvals) {
-		values.addAll(newvals);
-	}
-
-	public static ProductOfValue create(ImmutableList<Value> vals) {
-		List<Value> list = new LinkedList<>();
-		for (Value val : vals) {
-			list.add(val);
-		}
-		return new ProductOfValue(list);
-	}
-
-	@JsonValue
-	public List<Value> getValues() {
-		return values;
-	}
-
-	@Override
-	public String toString() {
-		return values.toString();
-	}
-
-	@Override
-	public int hashCode() {
-		final int prime = 31;
-		int result = 1;
-		result = prime * result + ((values == null) ? 0 : values.hashCode());
-		return result;
-	}
-
-	/**
-	 * 
-	 * @param other a {@link ProductOfValue} with more issues to be merged into
-	 *              this.
-	 * @return new ProductOfValue that contains this and other values.
-	 */
-	public ProductOfValue merge(ProductOfValue other) {
-		List<Value> newvalues = new ArrayList<Value>(values);
-		newvalues.addAll(other.getValues());
-		return new ProductOfValue(newvalues);
-	}
-
-	@Override
-	public boolean equals(Object obj) {
-		if (this == obj)
-			return true;
-		if (obj == null)
-			return false;
-		if (getClass() != obj.getClass())
-			return false;
-		ProductOfValue other = (ProductOfValue) obj;
-		if (values == null) {
-			if (other.values != null)
-				return false;
-		} else if (!values.equals(other.values))
-			return false;
-		return true;
-	}
-
-	@Override
-	public Object getValue() {
-		return getValues();
-	}
-
-}
Index: profile/src/main/java/geniusweb/profile/utilityspace/SumOfGroupsUtilitySpace.java
===================================================================
--- profile/src/main/java/geniusweb/profile/utilityspace/SumOfGroupsUtilitySpace.java	(revision 53)
+++ 	(revision )
@@ -1,297 +1,0 @@
-package geniusweb.profile.utilityspace;
-
-import java.math.BigDecimal;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import com.fasterxml.jackson.annotation.JsonAutoDetect;
-import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility;
-import com.fasterxml.jackson.annotation.JsonCreator;
-import com.fasterxml.jackson.annotation.JsonProperty;
-
-import geniusweb.issuevalue.Bid;
-import geniusweb.issuevalue.Domain;
-import geniusweb.issuevalue.NumberValueSet;
-import geniusweb.issuevalue.Value;
-import geniusweb.profile.DefaultProfile;
-
-/**
- * This is a utility space that defines the utility of bids as a sum of the
- * utilities of a number of subsets, or groups, of the issue values.
- * <p>
- * A group defines the utility of a non-empty subset of the issues in the
- * domain. The parts are non-overlapping. Missing issue values have utility 0.
- * <p>
- * This space enables handling {@link UtilitySpace}s that are not simply linear
- * additive, but with interacting issue values. For example, if you would like
- * to have a car with good speakers but only if there is also a good hifi set,
- * you can make a part that has {@link PartsUtilities} like
- * <code> { { speakers:yes, hifi:yes }:1, {speakers, no: hifh:yes}:0.2, ...} </code>
- * <p>
- * NOTICE this space is completely discrete. There is no equivalent of the
- * {@link NumberValueSet} here.
- */
-@JsonAutoDetect(fieldVisibility = Visibility.ANY, getterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE, isGetterVisibility = Visibility.NONE)
-public class SumOfGroupsUtilitySpace extends DefaultProfile
-		implements UtilitySpace {
-	/**
-	 * the key is the part name, the value is the valuesetutilities for this
-	 * issue. Should be immutable so do not return direct access to this field.
-	 */
-	private final HashMap<String, PartsUtilities> partUtilities = new HashMap<>();
-
-	/**
-	 * @param domain    the {@link Domain} in which this profile is defined.
-	 * @param name      the name of this profile. Must be simple name (a-Z, 0-9)
-	 * @param partutils a map with key: part names (String) and value: the
-	 *                  {@link PartsUtilities} for that part. There MUST NOT be
-	 *                  a null part name. The PartsUtilities must be complete:
-	 *                  all possible combinations of all parts must cover all
-	 *                  combinations of issue values and assign a proper utility
-	 *                  in [0,1].
-	 * @param resBid    the reservation bid. Only bids that are
-	 *                  {@link #isPreferredOrEqual(Bid, Bid)} should be
-	 *                  accepted. Can be null, meaning that there is no
-	 *                  reservation bid and any agreement is better than no
-	 *                  agreement. Read the note about partial bids in
-	 *                  {@link #getUtility(Bid)}.
-	 * @throws NullPointerException     if values are incorrectly null.
-	 * @throws IllegalArgumentException if preconditions not met.
-	 */
-	@JsonCreator
-	public SumOfGroupsUtilitySpace(@JsonProperty("domain") Domain domain,
-			@JsonProperty("name") String name,
-			@JsonProperty("partUtilities") HashMap<String, PartsUtilities> partutils,
-			@JsonProperty("reservationBid") Bid resBid) {
-		super(name, domain, resBid);
-		this.partUtilities.putAll(partutils);
-
-		checkParts();
-	}
-
-	/**
-	 * Copy settings in las. This will have the exact same utilities as the
-	 * {@link LinearAdditive} space but this then gives you the power to change
-	 * it into a non-linear space by grouping.
-	 * 
-	 * @param las the {@link LinearAdditive} to be converted/copied.
-	 * 
-	 */
-	public static SumOfGroupsUtilitySpace create(LinearAdditive las) {
-		return new SumOfGroupsUtilitySpace(las.getDomain(), las.getName(),
-				las2parts(las), las.getReservationBid());
-	}
-
-	/**
-	 * 
-	 * @return all partsutilities
-	 */
-	public Map<String, PartsUtilities> getPartsUtilities() {
-		return Collections.unmodifiableMap(partUtilities);
-	}
-
-	/**
-	 * 
-	 * Note: If bid is partial for a group, the utility of that group can not be
-	 * evaluated and is set to 0.
-	 * 
-	 */
-	@Override
-	public BigDecimal getUtility(Bid bid) {
-		BigDecimal sum = BigDecimal.ZERO;
-		for (String partname : partUtilities.keySet()) {
-			sum = sum.add(util(partname, bid));
-		}
-		return sum;
-	}
-
-	@Override
-	public String toString() {
-		return "SumOfGroupsUtilitySpace[" + getName() + "," + partUtilities
-				+ "," + getReservationBid() + "]";
-	}
-
-	/**
-	 * 
-	 * @param partnames   the partnames to remove from this. There must be at
-	 *                    least 2 parts
-	 * @param newpartname the name of the new part that contains all partnames,
-	 *                    grouped into 1 "issue". This name must not be an issue
-	 *                    in this.
-	 * @return new {@link SumOfGroupsUtilitySpace} that takes all partnames out
-	 *         of this, and makes a newaprtname that contains these.
-	 */
-	public SumOfGroupsUtilitySpace group(List<String> partnames,
-			String newpartname) {
-		final Set<String> allpartnames = partUtilities.keySet();
-
-		if (partnames.size() < 2) {
-			throw new IllegalArgumentException(
-					"Group must contain at least 2 parts");
-		}
-		if (allpartnames.contains(newpartname)) {
-			throw new IllegalArgumentException(
-					"newpartname " + newpartname + " is already in use");
-		}
-		for (String name : partnames) {
-			if (!allpartnames.contains(name)) {
-				throw new IllegalArgumentException("Unknown part name " + name);
-			}
-		}
-
-		HashMap<String, PartsUtilities> newutils = new HashMap<String, PartsUtilities>();
-
-		PartsUtilities newpartutils = null;
-
-		for (String name : partUtilities.keySet()) {
-			if (partnames.contains(name)) {
-				if (newpartutils == null) {
-					newpartutils = partUtilities.get(name);
-				} else {
-					newpartutils = newpartutils.add(partUtilities.get(name));
-				}
-			} else {
-				newutils.put(name, partUtilities.get(name));
-			}
-		}
-		newutils.put(newpartname, newpartutils);
-
-		return new SumOfGroupsUtilitySpace(getDomain(), getName(), newutils,
-				getReservationBid());
-	}
-
-	@Override
-	public int hashCode() {
-		final int prime = 31;
-		int result = super.hashCode();
-		result = prime * result
-				+ ((partUtilities == null) ? 0 : partUtilities.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;
-		SumOfGroupsUtilitySpace other = (SumOfGroupsUtilitySpace) obj;
-		if (partUtilities == null) {
-			if (other.partUtilities != null)
-				return false;
-		} else if (!partUtilities.equals(other.partUtilities))
-			return false;
-		return true;
-	}
-
-	/***************************** private funcs ***************************/
-	/**
-	 * 
-	 * @param partname the name of the part to get the utility of
-	 * @param bid      the bid
-	 * @return weighted util of just the part: utilities[part].getUtility(part
-	 *         of bid)
-	 */
-	private BigDecimal util(String partname, Bid bid) {
-		PartsUtilities partutils = partUtilities.get(partname);
-		ProductOfValue value = collectValues(bid, partutils);
-		return partutils.getUtility(value);
-	}
-
-	/**
-	 * 
-	 * @param bid       a full bid
-	 * @param partutils the part utils for which a list of values from the bid
-	 *                  is needed
-	 * @return a list of values from the given bid, ordered as indicated in
-	 *         partutils
-	 */
-	private ProductOfValue collectValues(Bid bid, PartsUtilities partutils) {
-		List<Value> values = new LinkedList<>();
-		for (String issue : partutils.getIssues()) {
-			values.add(bid.getValue(issue));
-		}
-		return new ProductOfValue(values);
-	}
-
-	/**
-	 * 
-	 * @param las a {@link LinearAdditive}
-	 * @return a Map with partname-PartsUtilities. The partnames are identical
-	 *         to the issues in the given las.
-	 */
-	private static HashMap<String, PartsUtilities> las2parts(
-			LinearAdditive las) {
-
-		HashMap<String, PartsUtilities> map = new HashMap<>();
-		for (String issue : las.getUtilities().keySet()) {
-			ValueSetUtilities valset = las.getUtilities().get(issue);
-			Map<ProductOfValue, BigDecimal> utilslist = new HashMap<>();
-			BigDecimal weight = las.getWeight(issue);
-			for (Value val : las.getDomain().getValues(issue)) {
-				BigDecimal util = valset.getUtility(val).multiply(weight);
-				if (BigDecimal.ZERO.compareTo(util) != 0) {
-					utilslist.put(new ProductOfValue(Arrays.asList(val)), util);
-				}
-			}
-			map.put(issue, new PartsUtilities(Arrays.asList(issue), utilslist));
-		}
-		return map;
-	}
-
-	/**
-	 * 
-	 * @return error string, or null if no error (all parts seem fine)
-	 */
-	private void checkParts() throws IllegalArgumentException {
-
-		Set<String> collectedIssues = new HashSet<>();
-		for (String partname : partUtilities.keySet()) {
-			PartsUtilities part = partUtilities.get(partname);
-			if (part == null) {
-				throw new IllegalArgumentException(
-						"partUtilities " + partname + " contains null value");
-			}
-			List<String> issues = part.getIssues();
-			HashSet<String> intersection = new HashSet<String>(collectedIssues);
-			intersection.retainAll(issues);
-			if (!intersection.isEmpty()) {
-				throw new IllegalArgumentException(
-						"issues " + intersection + " occur multiple times");
-			}
-			part.checkComplete(getDomain());
-			collectedIssues.addAll(issues);
-		}
-
-		if (!collectedIssues.equals(getDomain().getIssues())) {
-			throw new IllegalArgumentException(
-					"parts must cover the domain issues "
-							+ getDomain().getIssues() + " but cover "
-							+ collectedIssues);
-		}
-		if (getMaxUtility().compareTo(BigDecimal.ONE) > 0) {
-			throw new IllegalArgumentException(
-					"Max utility of the space exceedds 1");
-		}
-
-	}
-
-	/**
-	 * 
-	 * @return the max possible utility in this utility space.
-	 */
-	private BigDecimal getMaxUtility() {
-		return partUtilities.values().stream()
-				.map(partutils -> partutils.getMaxUtility())
-				.reduce(BigDecimal.ZERO, BigDecimal::add);
-	}
-
-}
Index: profile/src/main/java/geniusweb/profile/utilityspace/ValueSetUtilities.java
===================================================================
--- profile/src/main/java/geniusweb/profile/utilityspace/ValueSetUtilities.java	(revision 53)
+++ profile/src/main/java/geniusweb/profile/utilityspace/ValueSetUtilities.java	(revision 1)
@@ -5,8 +5,9 @@
 import com.fasterxml.jackson.annotation.JsonSubTypes;
 import com.fasterxml.jackson.annotation.JsonSubTypes.Type;
-import com.fasterxml.jackson.annotation.JsonTypeInfo;
 
 import geniusweb.issuevalue.Value;
 import geniusweb.issuevalue.ValueSet;
+
+import com.fasterxml.jackson.annotation.JsonTypeInfo;
 
 /**
@@ -15,12 +16,11 @@
  */
 @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.WRAPPER_OBJECT)
-@JsonSubTypes({ @Type(value = DiscreteValueSetUtilities.class),
-		@Type(value = NumberValueSetUtilities.class) })
+@JsonSubTypes({ @Type(value = DiscreteValueSetUtilities.class), @Type(value = NumberValueSetUtilities.class) })
 public interface ValueSetUtilities {
 	/**
 	 * 
-	 * @param value the {@link Value} to get the utility for
-	 * @return the utility of the given value. MUST be in [0,1]. Should return 0
-	 *         if the value is unknown.
+	 * @param value
+	 * @return the utility of the given value. MUST be in [0,1]. Should return 0 if
+	 *         the value is unknown.
 	 */
 	BigDecimal getUtility(Value value);
@@ -28,8 +28,8 @@
 	/**
 	 * 
-	 * @param valueset the valueset that is supposed match with this
+	 * @param values the valueset that
 	 * @return null if the ValueSetUtilities fits the given set of values , that
-	 *         means it can give utilities for all possible values in valueset.
-	 *         Or a string containing an explanation why not.
+	 *         means it can give utilities for all possible values in valueset. Or a
+	 *         string containing an explanation why not.
 	 */
 	String isFitting(ValueSet valueset);
