Index: exampleparties/timedependentparty/src/main/java/geniusweb/exampleparties/timedependentparty/ExtendedUtilSpace.java
===================================================================
--- exampleparties/timedependentparty/src/main/java/geniusweb/exampleparties/timedependentparty/ExtendedUtilSpace.java	(revision 52)
+++ exampleparties/timedependentparty/src/main/java/geniusweb/exampleparties/timedependentparty/ExtendedUtilSpace.java	(revision 53)
@@ -9,16 +9,30 @@
 import geniusweb.bidspace.Interval;
 import geniusweb.bidspace.IssueInfo;
+import geniusweb.bidspace.SumOfGroupsLinAdditiveAdapter;
 import geniusweb.issuevalue.Bid;
 import geniusweb.issuevalue.Value;
 import geniusweb.profile.utilityspace.LinearAdditive;
+import geniusweb.profile.utilityspace.SumOfGroupsUtilitySpace;
+import geniusweb.profile.utilityspace.UtilitySpace;
 import tudelft.utilities.immutablelist.ImmutableList;
+import tudelft.utilities.immutablelist.MapList;
 
 /**
- * Inner class for TimeDependentParty, made public for testing purposes. This
- * class may change in the future, use at your own risk.
+ * Inner class for TimeDependentParty, Handles mechanisms for searching the bid
+ * space, and using adapters to handle the nonlinear
+ * {@link SumOfGroupsUtilitySpace}.
+ * 
+ * This class is public for testing purposes. This class may change in the
+ * future, use at your own risk.
  *
  */
 public class ExtendedUtilSpace {
-	private LinearAdditive utilspace;
+	private UtilitySpace utilspace;
+	// linear approximation of utilspace (possibly utilspace itself)
+	// thsi may have different utilityes issues and values than utilspace.
+	private LinearAdditive linapprox;
+
+	// bidutils tolerance minUtil maxUtil all work on linapprox
+	private BidsWithUtility bidutils;
 	/**
 	 * The tolerance for a utility. Generally utilities can be this amount
@@ -26,15 +40,18 @@
 	 */
 	private BigDecimal tolerance;
-	private BidsWithUtility bidutils;
 	// min and max achievable utility
 	private BigDecimal minUtil;
 	private BigDecimal maxUtil;
 
-	public ExtendedUtilSpace(LinearAdditive space) {
+	public ExtendedUtilSpace(UtilitySpace space) {
 		this.utilspace = space;
-		bidutils = new BidsWithUtility(utilspace);
+		if (space instanceof LinearAdditive)
+			linapprox = (LinearAdditive) space;
+		else
+			linapprox = SumOfGroupsLinAdditiveAdapter
+					.create((SumOfGroupsUtilitySpace) space);
+		bidutils = new BidsWithUtility(linapprox);
 		computeMinMax();
 		this.tolerance = computeTolerance();
-
 	}
 
@@ -52,7 +69,7 @@
 		this.maxUtil = range.getMax();
 
-		Bid rvbid = utilspace.getReservationBid();
+		Bid rvbid = linapprox.getReservationBid();
 		if (rvbid != null) {
-			BigDecimal rv = utilspace.getUtility(rvbid);
+			BigDecimal rv = linapprox.getUtility(rvbid);
 			if (rv.compareTo(minUtil) > 0)
 				minUtil = rv;
@@ -65,7 +82,7 @@
 	 * best and one-but-best utility.
 	 * 
-	 * @return the minimum tolerance required, which is the minimum difference
-	 *         between the weighted utility of the best and one-but-best issue
-	 *         value.
+	 * @return the minimum tolerance required in the {@link #linapprox} space,
+	 *         which is the minimum difference between the weighted utility of
+	 *         the best and one-but-best issue value.
 	 */
 	protected BigDecimal computeTolerance() {
@@ -87,8 +104,14 @@
 	}
 
+	/**
+	 * @return the minimum utility in the {@link #linapprox} space
+	 */
 	public BigDecimal getMin() {
 		return minUtil;
 	}
 
+	/**
+	 * @return the maximum utility in the {@link #linapprox} space
+	 */
 	public BigDecimal getMax() {
 		return maxUtil;
@@ -96,11 +119,22 @@
 
 	/**
-	 * @param utilityGoal the requested utility
+	 * @param utilityGoal the requested utility in the {@link #linapprox} space
 	 * @return bids with utility inside [utilitygoal-{@link #tolerance},
-	 *         utilitygoal]
+	 *         utilitygoal], converted back to bids in the utilspace
 	 */
 	public ImmutableList<Bid> getBids(BigDecimal utilityGoal) {
-		return bidutils.getBids(
+		ImmutableList<Bid> bidslist = bidutils.getBids(
 				new Interval(utilityGoal.subtract(tolerance), utilityGoal));
+		return new MapList<>((Bid b) -> realBid(b), bidslist);
+	}
+
+	/**
+	 * @param b a bid in the linapprox space
+	 * @return a bid in the original space
+	 */
+	private Bid realBid(Bid b) {
+		if (linapprox instanceof SumOfGroupsLinAdditiveAdapter)
+			return ((SumOfGroupsLinAdditiveAdapter) linapprox).toGroupBid(b);
+		return b;
 	}
 
Index: exampleparties/timedependentparty/src/main/java/geniusweb/exampleparties/timedependentparty/TimeDependentParty.java
===================================================================
--- exampleparties/timedependentparty/src/main/java/geniusweb/exampleparties/timedependentparty/TimeDependentParty.java	(revision 52)
+++ exampleparties/timedependentparty/src/main/java/geniusweb/exampleparties/timedependentparty/TimeDependentParty.java	(revision 53)
@@ -74,10 +74,10 @@
  * </table>
  * <p>
- * TimeDependentParty requires a {@link UtilitySpace}
+ * TimeDependentParty requires a {@link LinearAdditive} utilityspace.
  */
 public class TimeDependentParty extends DefaultParty {
 
 	private ProfileInterface profileint = null;
-	private LinearAdditive utilspace = null; // last received space
+	private UtilitySpace utilspace = null; // last received space
 	private PartyId me;
 	private Progress progress;
@@ -238,8 +238,8 @@
 	}
 
-	private LinearAdditive updateUtilSpace() throws IOException {
+	private UtilitySpace updateUtilSpace() throws IOException {
 		Profile newutilspace = profileint.getProfile();
 		if (!newutilspace.equals(utilspace)) {
-			utilspace = (LinearAdditive) newutilspace;
+			utilspace = (UtilitySpace) newutilspace;
 			extendedspace = new ExtendedUtilSpace(utilspace);
 		}
Index: exampleparties/timedependentparty/src/test/java/geniusweb/exampleparties/timedependentparty/ExtendedUtilSpaceTest.java
===================================================================
--- exampleparties/timedependentparty/src/test/java/geniusweb/exampleparties/timedependentparty/ExtendedUtilSpaceTest.java	(revision 52)
+++ exampleparties/timedependentparty/src/test/java/geniusweb/exampleparties/timedependentparty/ExtendedUtilSpaceTest.java	(revision 53)
@@ -1,8 +1,7 @@
 package geniusweb.exampleparties.timedependentparty;
 
-import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.assertEquals;
 
 import java.io.IOException;
-import java.math.BigDecimal;
 import java.nio.file.Files;
 import java.nio.file.Paths;
@@ -19,10 +18,10 @@
 
 import geniusweb.profile.Profile;
-import geniusweb.profile.utilityspace.LinearAdditiveUtilitySpace;
+import geniusweb.profile.utilityspace.UtilitySpace;
 
 @RunWith(Parameterized.class)
 public class ExtendedUtilSpaceTest {
 	private final static ObjectMapper jackson = new ObjectMapper();
-	private final static BigDecimal SMALL = new BigDecimal("0.0001");
+	private final static double SMALL = 0.0001;
 
 	@Parameters
@@ -31,14 +30,17 @@
 				{ "src/test/resources/jobs/jobs1.json", 0.02 },
 				{ "src/test/resources/7issues/7issues1.json", 0.0055 },
-				{ "src/test/resources/9issues/9issues1.json", 0.0013 } });
+				{ "src/test/resources/9issues/9issues1.json", 0.0013 },
+				// tolerance in computerbuy is quite small because approximation
+				// scales the space
+				{ "src/test/resources/computer/computerbuy.json", 0.0016 } });
 	}
 
 	private String filename;
-	private BigDecimal expectedTolerance;
+	private double expectedTolerance;
 	private ExtendedUtilSpace space;
 
 	public ExtendedUtilSpaceTest(String filename, double expectedTolerance) {
 		this.filename = filename;
-		this.expectedTolerance = BigDecimal.valueOf(expectedTolerance);
+		this.expectedTolerance = expectedTolerance;
 	}
 
@@ -46,6 +48,6 @@
 	public void before() throws IOException {
 		String file = new String(Files.readAllBytes(Paths.get(filename)));
-		LinearAdditiveUtilitySpace profile = (LinearAdditiveUtilitySpace) jackson
-				.readValue(file, Profile.class);
+		UtilitySpace profile = (UtilitySpace) jackson.readValue(file,
+				Profile.class);
 		space = new ExtendedUtilSpace(profile);
 	}
@@ -58,6 +60,6 @@
 	@Test
 	public void testTolerance() {
-		assertTrue(space.computeTolerance().subtract(expectedTolerance).abs()
-				.compareTo(SMALL) < 0);
+		assertEquals(expectedTolerance, space.computeTolerance().doubleValue(),
+				SMALL);
 	}
 }
Index: exampleparties/timedependentparty/src/test/resources/computer/computerbuy.json
===================================================================
--- exampleparties/timedependentparty/src/test/resources/computer/computerbuy.json	(revision 53)
+++ exampleparties/timedependentparty/src/test/resources/computer/computerbuy.json	(revision 53)
@@ -0,0 +1,618 @@
+{
+	"SumOfGroupsUtilitySpace": {
+		"domain": {
+			"name": "computer",
+			"issuesValues": {
+				"box": {
+					"values": [
+						"all-in-one",
+						"small box",
+						"tower"
+					]
+				},
+				"graphics": {
+					"values": [
+						"built-in",
+						"low 8G",
+						"medium 16G",
+						"high 32G"
+					]
+				},
+				"main mem": {
+					"values": [
+						"8GB",
+						"16GB",
+						"32GB",
+						"64GB"
+					]
+				},
+				"SSD": {
+					"values": [
+						"64GB",
+						"1TB",
+						"2TB",
+						"4TB",
+						"8TB"
+					]
+				},
+				"display": {
+					"values": [
+						"24-1K",
+						"27-4K",
+						"32-4K",
+						"27-4K gaming",
+						"34-4K gaming"
+					]
+				},
+				"input": {
+					"values": [
+						"standard keybd,mouse",
+						"wireless keybd,mouse",
+						"gaming keybd,mouse"
+					]
+				},
+				"price": {
+					"values": [
+						"614",
+						"663",
+						"716",
+						"773",
+						"835",
+						"902",
+						"974",
+						"1052",
+						"1136",
+						"1227",
+						"1326",
+						"1432",
+						"1546",
+						"1670",
+						"1803",
+						"1948",
+						"2104",
+						"2272",
+						"2454",
+						"2650",
+						"2862",
+						"3091",
+						"3338",
+						"3605",
+						"3893",
+						"4205",
+						"4541",
+						"4905",
+						"5297"
+					]
+				},
+				"rounding": {
+					"values": [
+						"1"
+					]
+				}
+			}
+		},
+		"name": "computerbuy",
+		"partUtilities": {
+			"boxandgraphics": {
+				"PartsUtilities": {
+					"issues": [
+						"box",
+						"graphics"
+					],
+					"utilslist": [
+						{
+							"values": [
+								"all-in-one",
+								"built-in"
+							],
+							"util": 0.09
+						},
+						{
+							"values": [
+								"all-in-one",
+								"low 8G"
+							],
+							"util": 0
+						},
+						{
+							"values": [
+								"all-in-one",
+								"medium 16G"
+							],
+							"util": 0
+						},
+						{
+							"values": [
+								"all-in-one",
+								"high 32G"
+							],
+							"util": 0
+						},
+						{
+							"values": [
+								"small box",
+								"built-in"
+							],
+							"util": 0.12
+						},
+						{
+							"values": [
+								"small box",
+								"low 8G"
+							],
+							"util": 0.15
+						},
+						{
+							"values": [
+								"small box",
+								"medium 16G"
+							],
+							"util": 0.003
+						},
+						{
+							"values": [
+								"small box",
+								"high 32G"
+							],
+							"util": 0.003
+						},
+						{
+							"values": [
+								"tower",
+								"built-in"
+							],
+							"util": 0.09
+						},
+						{
+							"values": [
+								"tower",
+								"low 8G"
+							],
+							"util": 0.18
+						},
+						{
+							"values": [
+								"tower",
+								"medium 16G"
+							],
+							"util": 0.24
+						},
+						{
+							"values": [
+								"tower",
+								"high 32G"
+							],
+							"util": 0.003
+						}
+					]
+				}
+			},
+			"display": {
+				"PartsUtilities": {
+					"issues": [
+						"display"
+					],
+					"utilslist": [
+						{
+							"values": [
+								"24-1K"
+							],
+							"util": 0.08
+						},
+						{
+							"values": [
+								"27-4K"
+							],
+							"util": 0.12
+						},
+						{
+							"values": [
+								"32-4K"
+							],
+							"util": 0.18
+						},
+						{
+							"values": [
+								"27-4K gaming"
+							],
+							"util": 0.18
+						},
+						{
+							"values": [
+								"34-4K gaming"
+							],
+							"util": 0.2
+						}
+					]
+				}
+			},
+			"input": {
+				"PartsUtilities": {
+					"issues": [
+						"input"
+					],
+					"utilslist": [
+						{
+							"values": [
+								"standard keybd,mouse"
+							],
+							"util": 0.04
+						},
+						{
+							"values": [
+								"wireless keybd,mouse"
+							],
+							"util": 0.06
+						},
+						{
+							"values": [
+								"gaming keybd,mouse"
+							],
+							"util": 0.09
+						}
+					]
+				}
+			},
+			"rounding": {
+				"PartsUtilities": {
+					"issues": [
+						"rounding"
+					],
+					"utilslist": [
+						{
+							"values": [
+								"1"
+							],
+							"util": 0.0
+						}
+					]
+				}
+			},
+			"memory": {
+				"PartsUtilities": {
+					"issues": [
+						"main mem",
+						"SSD"
+					],
+					"utilslist": [
+						{
+							"values": [
+								"8GB",
+								"64GB"
+							],
+							"util": 0.005
+						},
+						{
+							"values": [
+								"16GB",
+								"64GB"
+							],
+							"util": 0.01
+						},
+						{
+							"values": [
+								"32GB",
+								"64GB"
+							],
+							"util": 0.01
+						},
+						{
+							"values": [
+								"64GB",
+								"64GB"
+							],
+							"util": 0.01
+						},
+						{
+							"values": [
+								"8GB",
+								"1TB"
+							],
+							"util": 0.015
+						},
+						{
+							"values": [
+								"16GB",
+								"1TB"
+							],
+							"util": 0.02
+						},
+						{
+							"values": [
+								"32GB",
+								"1TB"
+							],
+							"util": 0.02
+						},
+						{
+							"values": [
+								"64GB",
+								"1TB"
+							],
+							"util": 0.02
+						},
+						{
+							"values": [
+								"8GB",
+								"2TB"
+							],
+							"util": 0.03
+						},
+						{
+							"values": [
+								"16GB",
+								"2TB"
+							],
+							"util": 0.04
+						},
+						{
+							"values": [
+								"32GB",
+								"2TB"
+							],
+							"util": 0.04
+						},
+						{
+							"values": [
+								"64GB",
+								"2TB"
+							],
+							"util": 0.04
+						},
+						{
+							"values": [
+								"8GB",
+								"4TB"
+							],
+							"util": 0.04
+						},
+						{
+							"values": [
+								"16GB",
+								"4TB"
+							],
+							"util": 0.05
+						},
+						{
+							"values": [
+								"32GB",
+								"4TB"
+							],
+							"util": 0.07
+						},
+						{
+							"values": [
+								"64GB",
+								"4TB"
+							],
+							"util": 0.09
+						},
+						{
+							"values": [
+								"8GB",
+								"8TB"
+							],
+							"util": 0.06
+						},
+						{
+							"values": [
+								"16GB",
+								"8TB"
+							],
+							"util": 0.07
+						},
+						{
+							"values": [
+								"32GB",
+								"8TB"
+							],
+							"util": 0.08
+						},
+						{
+							"values": [
+								"64GB",
+								"8TB"
+							],
+							"util": 0.10
+						}
+					]
+				}
+			},
+			"price": {
+				"PartsUtilities": {
+					"issues": [
+						"price"
+					],
+					"utilslist": [
+						{
+							"values": [
+								"614"
+							],
+							"util": 0.3
+						},
+						{
+							"values": [
+								"663"
+							],
+							"util": 0.29
+						},
+						{
+							"values": [
+								"716"
+							],
+							"util": 0.28
+						},
+						{
+							"values": [
+								"773"
+							],
+							"util": 0.27
+						},
+						{
+							"values": [
+								"835"
+							],
+							"util": 0.26
+						},
+						{
+							"values": [
+								"902"
+							],
+							"util": 0.25
+						},
+						{
+							"values": [
+								"974"
+							],
+							"util": 0.24
+						},
+						{
+							"values": [
+								"1052"
+							],
+							"util": 0.23
+						},
+						{
+							"values": [
+								"1136"
+							],
+							"util": 0.22
+						},
+						{
+							"values": [
+								"1227"
+							],
+							"util": 0.21
+						},
+						{
+							"values": [
+								"1326"
+							],
+							"util": 0.2
+						},
+						{
+							"values": [
+								"1432"
+							],
+							"util": 0.19
+						},
+						{
+							"values": [
+								"1546"
+							],
+							"util": 0.18
+						},
+						{
+							"values": [
+								"1670"
+							],
+							"util": 0.17
+						},
+						{
+							"values": [
+								"1803"
+							],
+							"util": 0.16
+						},
+						{
+							"values": [
+								"1948"
+							],
+							"util": 0.15
+						},
+						{
+							"values": [
+								"2104"
+							],
+							"util": 0.14
+						},
+						{
+							"values": [
+								"2272"
+							],
+							"util": 0.13
+						},
+						{
+							"values": [
+								"2454"
+							],
+							"util": 0.12
+						},
+						{
+							"values": [
+								"2650"
+							],
+							"util": 0.11
+						},
+						{
+							"values": [
+								"2862"
+							],
+							"util": 0.1
+						},
+						{
+							"values": [
+								"3091"
+							],
+							"util": 0.09
+						},
+						{
+							"values": [
+								"3338"
+							],
+							"util": 0.08
+						},
+						{
+							"values": [
+								"3605"
+							],
+							"util": 0.07
+						},
+						{
+							"values": [
+								"3893"
+							],
+							"util": 0.06
+						},
+						{
+							"values": [
+								"4205"
+							],
+							"util": 0.05
+						},
+						{
+							"values": [
+								"4541"
+							],
+							"util": 0.04
+						},
+						{
+							"values": [
+								"4905"
+							],
+							"util": 0.03
+						},
+						{
+							"values": [
+								"5297"
+							],
+							"util": 0.02
+						}
+					]
+				}
+			}
+		},
+		"reservationBid": {
+			"issuevalues": {
+				"box": "small box",
+				"graphics": "low 8G",
+				"main mem": "8GB",
+				"SSD": "1TB",
+				"display": "32-4K",
+				"input": "gaming keybd,mouse",
+				"price": "1432",
+				"rounding":"1"
+			}
+		}
+	}
+}
