Index: /bidspace/pom.xml
===================================================================
--- /bidspace/pom.xml	(revision 53)
+++ /bidspace/pom.xml	(revision 1)
@@ -6,5 +6,5 @@
 	<groupId>geniusweb</groupId>
 	<artifactId>bidspace</artifactId>
-	<version>2.2.1</version>  <!-- equals the geniusweb version -->
+	<version>1.0.0</version>
 	<packaging>jar</packaging>
 
@@ -15,6 +15,5 @@
 		<basedir>.</basedir>
 		<passwd>${env.ARTIFACTORY_PASS}</passwd>
-		<jackson-2-version>2.12.3</jackson-2-version>
-		<geniusweb.version>${project.version}</geniusweb.version>
+		<jackson-2-version>2.9.6</jackson-2-version>
 	</properties>
 
@@ -22,5 +21,5 @@
 		<repository>
 			<id>artifactory.ewi.tudelft.nl</id>
-			<url>https://artifactory.ewi.tudelft.nl/artifactory/libs-release</url>
+			<url>http://artifactory.ewi.tudelft.nl/artifactory/libs-release</url>
 		</repository>
 	</distributionManagement>
@@ -37,11 +36,11 @@
 			<groupId>geniusweb</groupId>
 			<artifactId>profile</artifactId>
-			<version>${geniusweb.version}</version>
+			<version>1.0.0</version>
 		</dependency>
 
 		<dependency>
 			<groupId>tudelft.utilities</groupId>
-			<artifactId>utilities</artifactId>
-			<version>1.3.1</version>
+			<artifactId>immutablelist</artifactId>
+			<version>1.0.0</version>
 		</dependency>
 
@@ -96,6 +95,6 @@
 		<dependency>
 			<groupId>org.mockito</groupId>
-			<artifactId>mockito-core</artifactId>
-			<version>3.11.2</version>
+			<artifactId>mockito-all</artifactId>
+			<version>1.9.5</version>
 			<scope>test</scope>
 		</dependency>
@@ -104,19 +103,8 @@
 			<groupId>tudelft.utilities</groupId>
 			<artifactId>junit</artifactId>
-			<version>1.0.5</version>
+			<version>1.0.1</version>
 			<scope>test</scope>
 		</dependency>
-		<dependency>
-			<groupId>org.openjdk.jol</groupId>
-			<artifactId>jol-core</artifactId>
-			<version>0.16</version>
-			<scope>test</scope>
-		</dependency>
-		<dependency>
-			<groupId>org.apache.commons</groupId>
-			<artifactId>commons-math</artifactId>
-			<version>2.2</version>
-			<scope>test</scope>
-		</dependency>
+
 	</dependencies>
 
@@ -125,22 +113,18 @@
 		<repository>
 			<id>artifactory.ewi.tudelft.nl</id>
-			<url>https://artifactory.ewi.tudelft.nl/artifactory/libs-release</url>
+			<url>http://artifactory.ewi.tudelft.nl/artifactory/libs-release</url>
 			<snapshots>
 				<enabled>false</enabled>
 			</snapshots>
 		</repository>
+
 	</repositories>
 
 	<pluginRepositories>
 		<pluginRepository>
-			<id>central</id>
-			<url>https://repo1.maven.org/maven2</url>
-		</pluginRepository>
-		<pluginRepository>
-			<id>artifactory.ewi.tudelft.nl</id>
-			<url>https://artifactory.ewi.tudelft.nl/artifactory/libs-release</url>
+			<id>jcenter</id>
+			<url>http://jcenter.bintray.com</url>
 		</pluginRepository>
 	</pluginRepositories>
-
 
 
@@ -157,22 +141,9 @@
 				</configuration>
 			</plugin>
-			<plugin>
-				<groupId>org.apache.maven.plugins</groupId>
-				<artifactId>maven-source-plugin</artifactId>
-				<version>3.1.0</version>
-				<executions>
-					<execution>
-						<id>attach-sources</id>
-						<goals>
-							<goal>jar</goal>
-						</goals>
-					</execution>
-				</executions>
-			</plugin>
 
 			<plugin>
 				<groupId>org.apache.maven.plugins</groupId>
 				<artifactId>maven-javadoc-plugin</artifactId>
-				<version>3.2.0</version>
+				<version>2.10.1</version>
 				<executions>
 					<execution>
@@ -181,4 +152,8 @@
 							<goal>jar</goal>
 						</goals>
+						<configuration>
+							<additionalparam>${javadoc.opts}</additionalparam>
+							<additionalparam>-Xdoclint:none</additionalparam>
+						</configuration>
 					</execution>
 				</executions>
@@ -188,5 +163,5 @@
 				<groupId>org.jfrog.buildinfo</groupId>
 				<artifactId>artifactory-maven-plugin</artifactId>
-				<version>3.2.3</version>
+				<version>2.6.1</version>
 				<executions>
 					<execution>
Index: /bidspace/src/main/java/geniusweb/bidspace/AllBidsList.java
===================================================================
--- /bidspace/src/main/java/geniusweb/bidspace/AllBidsList.java	(revision 53)
+++ /bidspace/src/main/java/geniusweb/bidspace/AllBidsList.java	(revision 1)
@@ -26,8 +26,6 @@
 
 	/**
-	 * This object contains s list containing all bids in the space. This is an
-	 * ImmutableList so it can contain all bids without pre-computing them.
-	 * 
-	 * @param domain the {@link Domain}
+	 * A list containing all bids in the space. This is an ImmutableList so it
+	 * can contain all bids without pre-computing them.
 	 * 
 	 */
Index: /bidspace/src/main/java/geniusweb/bidspace/AllPartialBidsList.java
===================================================================
--- /bidspace/src/main/java/geniusweb/bidspace/AllPartialBidsList.java	(revision 53)
+++ /bidspace/src/main/java/geniusweb/bidspace/AllPartialBidsList.java	(revision 1)
@@ -32,5 +32,4 @@
 	 * pre-computing them.
 	 * 
-	 * @param domain the {@link Domain}
 	 */
 	public AllPartialBidsList(Domain domain) {
Index: dspace/src/main/java/geniusweb/bidspace/BidsWithUtility.java
===================================================================
--- /bidspace/src/main/java/geniusweb/bidspace/BidsWithUtility.java	(revision 53)
+++ 	(revision )
@@ -1,278 +1,0 @@
-package geniusweb.bidspace;
-
-import java.math.BigDecimal;
-import java.math.BigInteger;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.stream.Collectors;
-
-import geniusweb.issuevalue.Bid;
-import geniusweb.issuevalue.Domain;
-import geniusweb.issuevalue.Value;
-import geniusweb.profile.utilityspace.LinearAdditive;
-import tudelft.utilities.immutablelist.AbstractImmutableList;
-import tudelft.utilities.immutablelist.FixedList;
-import tudelft.utilities.immutablelist.ImmutableList;
-import tudelft.utilities.immutablelist.JoinedList;
-import tudelft.utilities.immutablelist.MapList;
-import tudelft.utilities.immutablelist.Tuple;
-
-/**
- * Tool class containing functions dealing with utilities of all bids in a given
- * {@link LinearAdditive}. This class caches previously computed values to
- * accelerate the calls and subsequent calls. Re-use the object to keep/reuse
- * the cache.
- * <h2>Rounding</h2> Internally, utilities of bids are rounded to the given
- * precision. This may cause inclusion/exclusion of some bids in the results.
- * See {@link #BidsWithUtility(LinearAdditive, int)} for more details
- */
-public class BidsWithUtility {
-
-	private final List<IssueInfo> issueInfo;
-	private final int precision; // #digits used for Intervals
-
-	/**
-	 * cache. Key = call arguments for {@link #get(int, Interval)}. Value=return
-	 * value of that call.
-	 */
-	private final Map<Tuple<Integer, Interval>, ImmutableList<Bid>> cache = new HashMap<>();
-	private ImmutableList<Bid> emptylist = new FixedList<>(
-			Collections.emptyList());
-
-	/**
-	 * Default constructor, uses default precision 6. This value seems practical
-	 * for the common range of issues, utilities and weights. See
-	 * {@link #BidsWithUtility(LinearAdditive, int)} for more details on the
-	 * precision.
-	 * 
-	 * @param space the {@link LinearAdditive} to analyze
-	 */
-	public BidsWithUtility(LinearAdditive space) {
-		this(space, 6);
-	}
-
-	/**
-	 * 
-	 * @param space     the {@link LinearAdditive} to analyze
-	 * @param precision the number of digits to use for computations. In
-	 *                  practice, 6 seems a good default value.
-	 *                  <p>
-	 *                  All utilities * weight are rounded to this number of
-	 *                  digits. This value should match the max number of
-	 *                  (digits used in the weight of an issue + number of
-	 *                  digits used in the issue utility). To determine the
-	 *                  optimal value, one may consider the step size of the
-	 *                  issues, and the range of interest. For instance if the
-	 *                  utility function has values 1/3 and 2/3, then these have
-	 *                  an 'infinite' number of relevant digits. But if the goal
-	 *                  is to search bids between utility 0.1 and 0.2, then
-	 *                  computing in 2 digits might already be sufficient.
-	 *                  <p>
-	 *                  This algorithm has memory and space complexity O(
-	 *                  |nissues| 10^precision ). For spaces up to 7 issues, 7
-	 *                  digits should be feasible; for 9 issues, 6 digits may be
-	 *                  the maximum.
-	 */
-	public BidsWithUtility(LinearAdditive space, int precision) {
-		this(getInfo(space, precision), precision);
-	}
-
-	/**
-	 * 
-	 * @param issuesInfo List of the relevant issues (in order of relevance) and
-	 *                   all info of each issue.
-	 * @param precision  the number of digits used in Intervals.
-	 */
-	public BidsWithUtility(List<IssueInfo> issuesInfo, int precision) {
-		if (issuesInfo == null || issuesInfo.isEmpty()) {
-			throw new IllegalArgumentException(
-					"sortedissues list must contain at least 1 element");
-		}
-
-		this.issueInfo = issuesInfo;
-		this.precision = precision;
-
-	}
-
-	/**
-	 * @return the (rounded) utility {@link Interval} of this space: minimum and
-	 *         maximum achievable utility.
-	 */
-	public Interval getRange() {
-		return getRange(issueInfo.size() - 1);
-	}
-
-	/**
-	 * 
-	 * @param range the minimum and maximum utility required of the bids. to be
-	 *              included (both ends inclusive).
-	 * @return a list with bids that have a (rounded) utility inside range.
-	 *         possibly empty.
-	 */
-	public ImmutableList<Bid> getBids(Interval range) {
-		return get(issueInfo.size() - 1, range.round(precision));
-	}
-
-	public List<IssueInfo> getInfo() {
-		return Collections.unmodifiableList(issueInfo);
-	}
-
-	/**
-	 * 
-	 * @param isMax the extreme bid required
-	 * @return the extreme bid, either the minimum if isMax=false or maximum if
-	 *         isMax=true
-	 */
-	public Bid getExtremeBid(boolean isMax) {
-		Map<String, Value> map = new HashMap<>();
-		for (IssueInfo info : issueInfo) {
-			map.put(info.getName(), info.getExtreme(isMax));
-		}
-		return new Bid(map);
-	}
-
-	/**
-	 * Create partial BidsWithUtil list considering only issues 0..n, with
-	 * utilities in given range.
-	 * <h2>Memory use</h2> Memory use of the return value can be large, if large
-	 * domains are given and the requested interval contains large numbers of
-	 * bids. To give some idea, here are some typical memory uses:
-	 * <table border="1">
-	 * <tr>
-	 * <td>domain</td>
-	 * <td>mem use (MB) of returned object</td>
-	 * <td>nr. of selected bids</td>
-	 * </tr>
-	 * <tr>
-	 * <td>jobs1</td>
-	 * <td>0.028</td>
-	 * <td>23</td>
-	 * </tr>
-	 * <tr>
-	 * <td>7issues1</td>
-	 * <td>34</td>
-	 * <td>346327</td>
-	 * </tr>
-	 * <tr>
-	 * <td>9issues1</td>
-	 * <td>98</td>
-	 * <td>37160666</td>
-	 * </tr>
-	 * </table>
-	 * 
-	 * @param n    the number of issueRanges to consider, we consider 0..n here.
-	 *             The recursion decreases n until n=0
-	 * @param goal the minimum and maximum utility required of the bids. to be
-	 *             included (both ends inclusive)
-	 * @return BidsWithUtil list, possibly empty.
-	 */
-	protected ImmutableList<Bid> get(int n, Interval goal) {
-		if (goal == null) {
-			throw new NullPointerException("Interval=null");
-		}
-
-		// clamp goal into what is reachable. Avoid caching empty
-		goal = goal.intersect(getRange(n));
-		if (goal.isEmpty()) {
-			return new FixedList<>(Collections.emptyList());
-		}
-
-		Tuple<Integer, Interval> cachetuple = new Tuple<>(n, goal);
-		ImmutableList<Bid> cached = cache.get(cachetuple);
-		if (cached != null) {
-			// hits++;
-			return cached;
-		}
-
-		ImmutableList<Bid> result = checkedGet(n, goal);
-		cache.put(cachetuple, result);
-		return result;
-	}
-
-	private static List<IssueInfo> getInfo(LinearAdditive space2,
-			int precision) {
-		Domain dom = space2.getDomain();
-		return space2.getDomain().getIssues().stream()
-				.map(issue -> new IssueInfo(issue, dom.getValues(issue),
-						space2.getUtilities().get(issue),
-						space2.getWeight(issue), precision))
-				.collect(Collectors.toList());
-	}
-
-	private ImmutableList<Bid> checkedGet(int n, Interval goal) {
-		IssueInfo info = issueInfo.get(n);
-		// issue is the first issuesWithRange.
-		String issue = info.getName();
-
-		if (n == 0)
-			return new OneIssueSubset(info, goal);
-
-		// make new list, joining all sub-lists
-		ImmutableList<Bid> fulllist = emptylist;
-		for (Value val : info.getValues()) {
-			BigDecimal weightedutil = info.getWeightedUtil(val);
-			Interval subgoal = goal.subtract(weightedutil);
-			// recurse: get list of bids for the subspace
-			ImmutableList<Bid> partialbids = get(n - 1, subgoal);
-
-			ImmutableList<Bid> fullbids = new MapList<Bid, Bid>(
-					pbid -> pbid.merge(new Bid(issue, val)), partialbids);
-			if (!fullbids.size().equals(BigInteger.ZERO))
-				fulllist = new JoinedList<Bid>(
-						Arrays.asList(fullbids, fulllist));
-		}
-		return fulllist;
-	}
-
-	/**
-	 * @param n the maximum issuevalue utility to include. Use n=index of last
-	 *          issue s= (#issues in the domain - 1) for the full range of this
-	 *          domain.
-	 * @return Interval (min, max) of the total weighted utility Interval of
-	 *         issues 0..n. All weighted utilities have been rounded to the set
-	 *         {@link #precision}
-	 */
-	private Interval getRange(int n) {
-		Interval value = Interval.ZERO;
-		for (int i = 0; i <= n; i++) {
-			value = value.add(issueInfo.get(i).getInterval());
-		}
-		return value;
-	}
-
-}
-
-/**
- * List of all one-issue bids that have utility inside given interval.
- */
-class OneIssueSubset extends AbstractImmutableList<Bid> {
-	private final IssueInfo info;
-	private final Interval interval;
-	private BigInteger size;
-
-	/**
-	 * 
-	 * @param info     the {@link IssueInfo}
-	 * @param interval a utility interval (weighted)
-	 */
-	OneIssueSubset(IssueInfo info, Interval interval) {
-		this.info = info;
-		this.interval = interval;
-		this.size = BigInteger.valueOf(info.subsetSize(interval));
-	}
-
-	@Override
-	public Bid get(BigInteger index) {
-		return new Bid(info.getName(),
-				info.subset(interval).get(index.intValue()));
-	}
-
-	@Override
-	public BigInteger size() {
-		return size;
-	}
-
-}
Index: /bidspace/src/main/java/geniusweb/bidspace/FrequencyOpponentModel.java
===================================================================
--- /bidspace/src/main/java/geniusweb/bidspace/FrequencyOpponentModel.java	(revision 1)
+++ /bidspace/src/main/java/geniusweb/bidspace/FrequencyOpponentModel.java	(revision 1)
@@ -0,0 +1,194 @@
+package geniusweb.bidspace;
+
+import java.math.BigDecimal;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+import geniusweb.issuevalue.Bid;
+import geniusweb.issuevalue.Domain;
+import geniusweb.issuevalue.NumberValue;
+import geniusweb.issuevalue.Value;
+import geniusweb.profile.utilityspace.NumberValueSetUtilities;
+
+/**
+ * implements an {@link OpponentModel} by counting frequencies of bids placed by
+ * the opponent.
+ * <p>
+ * NOTE: {@link NumberValue}s are also treated as 'discrete', so the frequency
+ * of one value does not influence the influence the frequency of nearby values
+ * (as you might expect as {@link NumberValueSetUtilities} is only affected by
+ * the endpoints).
+ *
+ */
+public class FrequencyOpponentModel implements OpponentModel {
+
+	private static final int DECIMALS = 4; // accuracy of our computations.
+	private final Domain domain;
+	private final Map<String, Map<Value, Integer>> bidFrequencies;
+	private final BigDecimal totalBids;
+	private static int serial = 1; // counter for auto name generation
+
+	public FrequencyOpponentModel(Domain domain) {
+		// map with empth hashmap for each issue.
+		this(domain,
+				domain.getIssues().stream().collect(
+						Collectors.toMap(iss -> iss, iss -> new HashMap<>())),
+				BigDecimal.ZERO);
+	}
+
+	@Override
+	public BigDecimal getUtility(Bid bid) {
+		String err = domain.isComplete(bid);
+		if (err != null) {
+			throw new IllegalArgumentException(err);
+		}
+		if (totalBids == BigDecimal.ZERO) {
+			return BigDecimal.ONE;
+		}
+		BigDecimal sum = BigDecimal.ZERO;
+		// Assume all issues have equal weight.
+		for (String issue : domain.getIssues()) {
+			sum = sum.add(getFraction(issue, bid.getValue(issue)));
+		}
+		return sum.divide(new BigDecimal(bidFrequencies.size()), DECIMALS,
+				BigDecimal.ROUND_HALF_UP);
+	}
+
+	@Override
+	public String getName() {
+		return "FreqOppModel" + (serial++) + "For" + domain;
+	}
+
+	/**
+	 * 
+	 * @param issue the issue to check
+	 * @param value the value to check
+	 * @return the fraction of the total cases that bids contained given value
+	 *         for the issue.
+	 */
+	private BigDecimal getFraction(String issue, Value value) {
+		if (totalBids == BigDecimal.ZERO) {
+			return BigDecimal.ONE;
+		}
+		Integer freq = bidFrequencies.get(issue).get(value);
+		if (freq == null) {
+			freq = 0;
+		}
+		return new BigDecimal(freq).divide(totalBids, DECIMALS,
+				BigDecimal.ROUND_HALF_UP);
+	}
+
+	@Override
+	public Domain getDomain() {
+		return domain;
+	}
+
+	@Override
+	public OpponentModel update(Bid bid) {
+		String err = domain.isComplete(bid);
+		if (err != null) {
+			throw new IllegalArgumentException(err);
+		}
+		Map<String, Map<Value, Integer>> newFreqs = cloneMap(bidFrequencies);
+		for (String issue : domain.getIssues()) {
+			Map<Value, Integer> freqs = newFreqs.get(issue);
+			Value value = bid.getValue(issue);
+			Integer oldfreq = freqs.get(value);
+			if (oldfreq == null) {
+				oldfreq = 0;
+			}
+			freqs.put(value, oldfreq + 1);
+		}
+
+		return new FrequencyOpponentModel(domain, newFreqs,
+				totalBids.add(BigDecimal.ONE));
+	}
+
+	/**
+	 * internal constructor. Assumes the freqs keyset is equal to the available
+	 * issues.
+	 * 
+	 * @param domain the domain
+	 * @param freqs  the observed frequencies for all issue values. This map is
+	 *               assumed to be a fresh private-access only copy.
+	 * @param total  the total number of bids contained in the freqs map. This
+	 *               must be equal to the sum of the Integer values in the
+	 *               {@link #bidFrequencies} for each issue (this is not
+	 *               checked).
+	 */
+	private FrequencyOpponentModel(Domain domain,
+			Map<String, Map<Value, Integer>> freqs, BigDecimal total) {
+		if (domain == null) {
+			throw new NullPointerException("domain=null");
+		}
+		this.domain = domain;
+		this.bidFrequencies = freqs;
+		this.totalBids = total;
+	}
+
+	/**
+	 * 
+	 * @param freqs
+	 * @return deep copy of freqs map.
+	 */
+	private static Map<String, Map<Value, Integer>> cloneMap(
+			Map<String, Map<Value, Integer>> freqs) {
+		Map<String, Map<Value, Integer>> map = new HashMap<>();
+		for (String issue : freqs.keySet()) {
+			map.put(issue, new HashMap<Value, Integer>(freqs.get(issue)));
+		}
+		return map;
+	}
+
+	@Override
+	public int hashCode() {
+		final int prime = 31;
+		int result = 1;
+		result = prime * result
+				+ ((bidFrequencies == null) ? 0 : bidFrequencies.hashCode());
+		result = prime * result + ((domain == null) ? 0 : domain.hashCode());
+		result = prime * result
+				+ ((totalBids == null) ? 0 : totalBids.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;
+		FrequencyOpponentModel other = (FrequencyOpponentModel) obj;
+		if (bidFrequencies == null) {
+			if (other.bidFrequencies != null)
+				return false;
+		} else if (!bidFrequencies.equals(other.bidFrequencies))
+			return false;
+		if (domain == null) {
+			if (other.domain != null)
+				return false;
+		} else if (!domain.equals(other.domain))
+			return false;
+		if (totalBids == null) {
+			if (other.totalBids != null)
+				return false;
+		} else if (!totalBids.equals(other.totalBids))
+			return false;
+		return true;
+	}
+
+	@Override
+	public String toString() {
+		return "FrequencyOpponentModel[" + totalBids + "," + bidFrequencies
+				+ "]";
+	}
+
+	@Override
+	public Bid getReservationBid() {
+		throw new UnsupportedOperationException();
+	}
+
+}
Index: dspace/src/main/java/geniusweb/bidspace/Interval.java
===================================================================
--- /bidspace/src/main/java/geniusweb/bidspace/Interval.java	(revision 53)
+++ 	(revision )
@@ -1,161 +1,0 @@
-package geniusweb.bidspace;
-
-import java.math.BigDecimal;
-import java.math.RoundingMode;
-
-/**
- * An interval [min, max].
- *
- */
-public class Interval {
-	public static Interval ZERO = new Interval(BigDecimal.ZERO,
-			BigDecimal.ZERO);
-
-	private final BigDecimal min;
-	private final BigDecimal max;
-
-	/**
-	 * AN interval [min,max]. If min &gt; max, then there are no values in this
-	 * interval.
-	 * 
-	 * @param min the minimum value of the interval (inclusive)
-	 * @param max the maximum value of the interval (inclusive)
-	 */
-	public Interval(BigDecimal min, BigDecimal max) {
-		if (min == null || max == null) {
-			throw new NullPointerException("min and max must contain not null");
-		}
-		this.min = min;
-		this.max = max;
-	}
-
-	/**
-	 * 
-	 * @return the minimum value of the interval
-	 */
-	public BigDecimal getMin() {
-		return min;
-	}
-
-	/**
-	 * 
-	 * @return the maximum value of the interval
-	 */
-	public BigDecimal getMax() {
-		return max;
-	}
-
-	/**
-	 * 
-	 * @return true iff this range does not contain any element.
-	 */
-	public boolean isEmpty() {
-		return min.compareTo(max) > 0;
-	}
-
-	/**
-	 * 
-	 * @param value the value to test
-	 * @return true iff min &le; value &le; max
-	 */
-	public boolean contains(BigDecimal value) {
-		return min.compareTo(value) <= 0 && max.compareTo(value) >= 0;
-	}
-
-	/**
-	 * 
-	 * @param other {@link Interval} to be added to this
-	 * @return new interval [ this.min + other.min , this.max + other.max ]
-	 */
-	public Interval add(Interval other) {
-		return new Interval(min.add(other.min), max.add(other.max));
-	}
-
-	/**
-	 * 
-	 * @param other another {@link Interval} intersect with
-	 * @return intersection of this with other. returns null if intersection is
-	 *         empty.
-	 */
-	public Interval intersect(Interval other) {
-		return new Interval(min.max(other.min), max.min(other.max));
-	}
-
-	/**
-	 * 
-	 * @param other the other minmax to deal with
-	 * @return the range of values that, when added to a value from other, will
-	 *         possibly get in our range. effectively, [min-other.max,
-	 *         max-other.min]. Returns null if the resulting range is empty.
-	 */
-	public Interval invert(Interval other) {
-		BigDecimal newmin = min.subtract(other.max);
-		BigDecimal newmax = max.subtract(other.min);
-		if (newmin.compareTo(newmax) > 0)
-			return null;
-		return new Interval(newmin, newmax);
-	}
-
-	/**
-	 * 
-	 * @param value the value to subtract
-	 * @return Interval with both min and max reduced by value.
-	 */
-	public Interval subtract(BigDecimal value) {
-		return new Interval(min.subtract(value), max.subtract(value));
-	}
-
-	public Interval multiply(BigDecimal weight) {
-		return new Interval(min.multiply(weight), max.multiply(weight));
-	}
-
-	@Override
-	public String toString() {
-		return "Interval[" + min + "," + max + "]";
-	}
-
-	/**
-	 * @param precision number of digits required
-	 * @return this but with modified precision. The interval is rounded so that
-	 *         the new interval is inside the old one.
-	 */
-	public Interval round(int precision) {
-		return new Interval(min.setScale(precision, RoundingMode.UP),
-				max.setScale(precision, RoundingMode.DOWN));
-	}
-
-	@Override
-	public int hashCode() {
-		final int prime = 31;
-		int result = 1;
-		result = prime * result + ((max == null) ? 0 : max.hashCode());
-		result = prime * result + ((min == null) ? 0 : min.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;
-		Interval other = (Interval) obj;
-		if (max == null) {
-			if (other.max != null)
-				return false;
-
-		} else if (max.compareTo(other.max) != 0)
-			// THIS WAS FIXED MANUALLY TO USE COMPARETO
-			return false;
-		if (min == null) {
-			if (other.min != null)
-				return false;
-		} else if (min.compareTo(other.min) != 0)
-			// THIS WAS FIXED MANUALLY TO USE COMPARETO
-			return false;
-		return true;
-	}
-
-}
Index: dspace/src/main/java/geniusweb/bidspace/IssueInfo.java
===================================================================
--- /bidspace/src/main/java/geniusweb/bidspace/IssueInfo.java	(revision 53)
+++ 	(revision )
@@ -1,165 +1,0 @@
-package geniusweb.bidspace;
-
-import java.math.BigDecimal;
-import java.math.RoundingMode;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import geniusweb.issuevalue.Value;
-import geniusweb.issuevalue.ValueSet;
-import geniusweb.profile.utilityspace.ValueSetUtilities;
-
-/**
- * Tool class to collect all relevant info about one issue (from LinearAdditive)
- * in one class. Used for internally grouping data for more efficient
- * processing. This class may change in the future, not recommended for direct
- * use.
- * <p>
- * immutable
- */
-public class IssueInfo {
-	private final String name;
-	private final ValueSet values;
-	private final Interval interval;
-	private final Map<Value, BigDecimal> weightedUtils;
-
-	/**
-	 * 
-	 * @param name      the issue name
-	 * @param values    the {@link ValueSet} of the issue
-	 * @param utils     the {@link ValueSetUtilities} of the issue profile
-	 * @param weight    the weight of the {@link ValueSetUtilities}
-	 * @param precision the precision to compute with. Basically the number of
-	 *                  decimal places used for the computations.
-	 * 
-	 */
-	public IssueInfo(String name, ValueSet values, ValueSetUtilities utils,
-			BigDecimal weight, int precision) {
-		this.name = name;
-		this.values = values;
-		this.weightedUtils = computeWeightedUtils(utils, weight, precision);
-		this.interval = getRange();
-	}
-
-	public ValueSet getValues() {
-		return values;
-	}
-
-	public String getName() {
-		return name;
-	}
-
-	/**
-	 * 
-	 * @return weighted minimum and maximum utility achievable with this issue,
-	 *         rounded to the requested precision.
-	 */
-	public Interval getInterval() {
-		return interval;
-	}
-
-	/**
-	 * 
-	 * @param isMax if true the max {@link Value} is returned, else the min is
-	 *              returned.
-	 * @return the extreme value, either the minimum if isMax=false or maximum
-	 *         if isMax=true
-	 */
-	public Value getExtreme(boolean isMax) {
-		BigDecimal extremeutil = null;
-		Value extremeval = null;
-		for (Value val : values) {
-			BigDecimal util = weightedUtils.get(val);
-			if (extremeval == null) {
-				extremeutil = weightedUtils.get(val);
-				extremeval = val;
-			} else {
-				if (isMax) {
-					if (util.compareTo(extremeutil) > 0) {
-						extremeutil = util;
-						extremeval = val;
-					}
-				} else {
-					if (util.compareTo(extremeutil) < 0) {
-						extremeutil = util;
-						extremeval = val;
-					}
-
-				}
-			}
-		}
-		return extremeval;
-	}
-
-	/**
-	 * @param val the issue value to be evaluated
-	 * @return weighted utility of given value, rounded to nearest value with
-	 *         the requested precision number of digits.
-	 */
-	public BigDecimal getWeightedUtil(Value val) {
-		return weightedUtils.get(val);
-	}
-
-	/**
-	 * 
-	 * @param interval an {@link Interval} of utility values.
-	 * @return all values that are inside the interval.
-	 */
-	protected List<Value> subset(Interval interval) {
-
-		List<Value> selection = new ArrayList<>();
-		for (Value value : values) {
-			if (interval.contains(getWeightedUtil(value)))
-				selection.add(value);
-		}
-		return selection;
-	}
-
-	/**
-	 * Faster way to determine subset size, it does not create a list
-	 * 
-	 * @param interval an {@link Interval} of utility values.
-	 * @return size of the subset that you will get from calling subset
-	 */
-	protected int subsetSize(Interval interval) {
-		int n = 0;
-		for (Value value : values)
-			if (interval.contains(getWeightedUtil(value)))
-				n++;
-		return n;
-	}
-
-	/**
-	 * @return the {@link Interval} (minimum and maximum) of the utility of the
-	 *         weighted utility of this issue, properly rounded to the
-	 *         {@link #precision}/
-	 * 
-	 */
-	private Interval getRange() {
-		BigDecimal min = BigDecimal.ONE;
-		BigDecimal max = BigDecimal.ZERO;
-		for (Value value : values) {
-			BigDecimal util = getWeightedUtil(value);
-			if (util.compareTo(min) < 0)
-				min = util;
-			if (util.compareTo(max) > 0)
-				max = util;
-		}
-		return new Interval(min, max);
-
-	}
-
-	private Map<Value, BigDecimal> computeWeightedUtils(
-			ValueSetUtilities utilities, BigDecimal w, int prec) {
-		Map<Value, BigDecimal> map = new HashMap<>();
-
-		for (Value val : values) {
-			map.put(val, utilities.getUtility(val).multiply(w).setScale(prec,
-					RoundingMode.HALF_UP));
-		}
-		return map;
-	}
-
-}
Index: /bidspace/src/main/java/geniusweb/bidspace/OpponentModel.java
===================================================================
--- /bidspace/src/main/java/geniusweb/bidspace/OpponentModel.java	(revision 1)
+++ /bidspace/src/main/java/geniusweb/bidspace/OpponentModel.java	(revision 1)
@@ -0,0 +1,18 @@
+package geniusweb.bidspace;
+
+import geniusweb.issuevalue.Bid;
+import geniusweb.profile.utilityspace.UtilitySpace;
+
+/**
+ * An opponentmodel estimates a {@link UtilitySpace} from received opponent
+ * bids.
+ */
+public interface OpponentModel extends UtilitySpace {
+	/**
+	 *
+	 * @param bid the next bid that was received
+	 * @return a new {@link OpponentModel} that takes the next bid into account.
+	 */
+	OpponentModel update(Bid bid);
+
+}
Index: dspace/src/main/java/geniusweb/bidspace/PartialSpaceFromUtility.java
===================================================================
--- /bidspace/src/main/java/geniusweb/bidspace/PartialSpaceFromUtility.java	(revision 53)
+++ 	(revision )
@@ -1,96 +1,0 @@
-package geniusweb.bidspace;
-
-import java.math.BigInteger;
-import java.security.SecureRandom;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
-import geniusweb.issuevalue.Bid;
-import geniusweb.profile.DefaultPartialOrdering;
-import geniusweb.profile.PartialOrdering;
-import geniusweb.profile.utilityspace.UtilitySpace;
-import tudelft.utilities.immutablelist.ListWithRemove;
-import tudelft.utilities.immutablelist.Tuple;
-import tudelft.utilities.immutablelist.Tuples;
-
-/**
- * Simple demo converting a {@link UtilitySpace} into a {@link PartialOrdering}.
- * Notice, a UtilitySpace IS a PartialOrdering, but a special one that is in
- * fact a full ordering. This converter makes it a space that really has all
- * info removed except for a few basic "isBetter" informations.
- */
-public class PartialSpaceFromUtility extends DefaultPartialOrdering {
-	public PartialSpaceFromUtility(UtilitySpace space, int nRankings) {
-		super(space.getName() + "_" + nRankings, space.getDomain(),
-				space.getReservationBid(), pickBetter(space, nRankings));
-	}
-
-	/**
-	 * Pick subset of static isbetter rankings. Notice, ShuffledList currently
-	 * can't handle really large lists which also limits this. This has to be
-	 * fixed.
-	 * 
-	 * @param space     the space to sample from
-	 * @param nRankings the number of rankings to be placed in the
-	 *                  PartialOrdering.
-	 * @return a subset creating a partial profile of the geiven UtilitySpace
-	 */
-	private static Map<Bid, Set<Bid>> pickBetter(UtilitySpace space,
-			int nRankings) {
-		Map<Bid, Set<Bid>> eqOrBetter = new HashMap<>();
-
-		AllBidsList allbids = new AllBidsList(space.getDomain());
-		ListWithRemove<Tuple<Bid, Bid>> available = new ListWithRemove<>(
-				new Tuples<Bid, Bid>(allbids, allbids), Collections.emptySet());
-		for (int n = 0; n < nRankings; n++) {
-			BigInteger sel = rnd(available.size());
-			Tuple<Bid, Bid> tuple = available.get(sel);
-			Bid bid1 = tuple.get1();
-			Bid bid2 = tuple.get2();
-			switch (space.getUtility(bid1).compareTo(space.getUtility(bid2))) {
-			case -1: // bid1 is worse
-				add(eqOrBetter, bid2, bid1);
-				break;
-			case 0:
-				add(eqOrBetter, bid2, bid1);
-				add(eqOrBetter, bid1, bid2);
-				break;
-			case 1:// bid1 is better
-				add(eqOrBetter, bid1, bid2);
-				break;
-			}
-			available = available.remove(sel);
-		}
-		return eqOrBetter;
-	}
-
-	/**
-	 * 
-	 * @param eqOrBetter map to be extended with (key=bid1, value=bid2)
-	 * @param bid1       the key to add a value to
-	 * @param bid2       the value to be added
-	 */
-	private static void add(Map<Bid, Set<Bid>> eqOrBetter, Bid bid1, Bid bid2) {
-		Set<Bid> set = eqOrBetter.get(bid1);
-		if (set == null) {
-			set = new HashSet<Bid>();
-		}
-		set.add(bid2);
-		eqOrBetter.put(bid1, set);
-	}
-
-	/**
-	 * Bit simplistic way to generate random in [0,n>. Simplistic because the
-	 * mod() operator that we use causes bias in the random numbers.
-	 * 
-	 * @param n the maximum value for the random number
-	 * @return random in [0,n>
-	 * 
-	 */
-	private static final BigInteger rnd(BigInteger n) {
-		return new BigInteger(n.bitLength(), new SecureRandom()).mod(n);
-	}
-}
Index: dspace/src/main/java/geniusweb/bidspace/SumOfGroupsLinAdditiveAdapter.java
===================================================================
--- /bidspace/src/main/java/geniusweb/bidspace/SumOfGroupsLinAdditiveAdapter.java	(revision 53)
+++ 	(revision )
@@ -1,337 +1,0 @@
-package geniusweb.bidspace;
-
-import java.math.BigDecimal;
-import java.math.BigInteger;
-import java.math.MathContext;
-import java.math.RoundingMode;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.stream.Collectors;
-
-import geniusweb.bidspace.pareto.ParetoLinearAdditive;
-import geniusweb.issuevalue.Bid;
-import geniusweb.issuevalue.DiscreteValue;
-import geniusweb.issuevalue.Domain;
-import geniusweb.issuevalue.Value;
-import geniusweb.issuevalue.ValueSet;
-import geniusweb.profile.utilityspace.DiscreteValueSetUtilities;
-import geniusweb.profile.utilityspace.LinearAdditive;
-import geniusweb.profile.utilityspace.LinearAdditiveUtilitySpace;
-import geniusweb.profile.utilityspace.PartsUtilities;
-import geniusweb.profile.utilityspace.ProductOfValue;
-import geniusweb.profile.utilityspace.SumOfGroupsUtilitySpace;
-import geniusweb.profile.utilityspace.ValueSetUtilities;
-import tudelft.utilities.immutablelist.ArrayListSet;
-
-/**
- * ValueSet with ProductOfValue objects as elements. Otherwise just a
- * DiscreteValueSet. Storing the ProductOfValues here directly (instead of
- * strings) makes it easier to map back and forth
- *
- */
-class GroupValueSet implements ValueSet {
-
-	/*
-	 * final, must be immutable so do not provide external access to this list.
-	 * ArrayList (instead of List) to help Jackson serializer which avoids
-	 * per-field type annotations.
-	 */
-	private final ArrayListSet<ProductOfValue> values = new ArrayListSet<>();
-
-	public GroupValueSet(Collection<ProductOfValue> issuevalues) {
-		this.values.addAll(issuevalues);
-	}
-
-	public List<ProductOfValue> getValues() {
-		return Collections.unmodifiableList(values);
-	}
-
-	@Override
-	public Boolean contains(Value value) {
-		return values.contains(value);
-	}
-
-	@Override
-	public ProductOfValue get(BigInteger index) {
-		return values.get(index.intValue());
-	}
-
-	@Override
-	public BigInteger size() {
-		return BigInteger.valueOf(values.size());
-	}
-
-	@Override
-	public ProductOfValue get(long index) {
-		return values.get((int) index);
-	}
-
-	@Override
-	public Iterator iterator() {
-		return values.iterator();
-	}
-
-	@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;
-	}
-
-	@Override
-	public boolean equals(Object obj) {
-		if (this == obj)
-			return true;
-		if (obj == null)
-			return false;
-		if (getClass() != obj.getClass())
-			return false;
-		GroupValueSet other = (GroupValueSet) obj;
-		if (values == null) {
-			if (other.values != null)
-				return false;
-		} else if (!values.equals(other.values))
-			return false;
-		return true;
-	}
-}
-
-/**
- * As {@link DiscreteValueSetUtilities} but with ProductOfValue instead of Value
- */
-class GroupValueSetUtilities implements ValueSetUtilities {
-	private final Map<ProductOfValue, BigDecimal> valueUtilities = new HashMap<>();
-
-	public GroupValueSetUtilities(Map<ProductOfValue, BigDecimal> utilities) {
-		valueUtilities.putAll(utilities);
-	}
-
-	@Override
-	public BigDecimal getUtility(Value value) {
-		if (!valueUtilities.containsKey(value)) {
-			return BigDecimal.ZERO;
-		}
-		return valueUtilities.get(value);
-	}
-
-	@Override
-	public String isFitting(ValueSet valueset) {
-		if (!(valueset instanceof GroupValueSet)) {
-			return "The utilities are for a GroupValueSet valueset but the given values are "
-					+ valueset;
-		}
-		GroupValueSet discvalueset = (GroupValueSet) valueset;
-		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;
-	}
-
-	@Override
-	public String toString() {
-		return valueUtilities.toString();
-	}
-}
-
-/**
- * Creates a {@link LinearAdditive} profile matching a
- * {@link SumOfGroupsUtilitySpace}. THe {@link LinearAdditive} can then be used
- * with tools like {@link ParetoLinearAdditive} or linear parties. Note that
- * TimeDependentParty and all derivatives use this already and thus seamlessly
- * support {@link SumOfGroupsUtilitySpace}.
- * 
- * <p>
- * 
- * The domain, issues values and utilities are all different from the
- * {@link SumOfGroupsUtilitySpace}. The methods {@link #toLinearBid(Bid)} and
- * {@link #toGroupBid(Bid)} can be used to convert back and forth. The space is
- * made such that there is a constant scaling between utilities in the
- * {@link SumOfGroupsUtilitySpace} and those in the adapted
- * {@link LinearAdditive} space.
- * 
- */
-public class SumOfGroupsLinAdditiveAdapter extends LinearAdditiveUtilitySpace {
-
-	/*
-	 * special character, used as separator char in constructed issue names.
-	 * Must not be used in any original issue names. can be a non-printable
-	 * char, as this class does not serialize but for debugging it's nice to get
-	 * something readable
-	 */
-	private final static String SEP = "~";
-	private final static MathContext mc = new MathContext(10,
-			RoundingMode.DOWN);
-	private static final DiscreteValue WCVALUE = new DiscreteValue("C");
-	private static final ProductOfValue WC = new ProductOfValue(
-			Arrays.asList(WCVALUE));
-	private static final ValueSet WEIGHTCORRECTION = new GroupValueSet(
-			Collections.singletonList(WC));
-	private static final Map<ProductOfValue, BigDecimal> WEIGHTCORRUTIL = Collections
-			.singletonMap(WC, BigDecimal.ZERO);
-
-	private final SumOfGroupsUtilitySpace groupspace;
-
-	/**
-	 * Basically LinearAdditive constructor plus the original group space. Use
-	 * {@link #create(SumOfGroupsUtilitySpace)} to create a
-	 * {@link SumOfGroupsLinAdditiveAdapter}
-	 */
-	private SumOfGroupsLinAdditiveAdapter(SumOfGroupsUtilitySpace groupspace,
-			LinearAdditiveUtilitySpace lin) {
-		super(lin.getDomain(), groupspace.getName(), lin.getUtilities(),
-				lin.getWeights(), lin.getReservationBid());
-		this.groupspace = groupspace;
-	}
-
-	public static SumOfGroupsLinAdditiveAdapter create(
-			SumOfGroupsUtilitySpace groupspace) {
-		checkSpecialCharacter(groupspace);
-
-		final HashMap<String, ValueSetUtilities> linIssueUtilities = new HashMap<>();
-		final HashMap<String, BigDecimal> weights = new HashMap<>();
-		final Map<String, ValueSet> issueValues = new HashMap<>();
-		final BigDecimal SIZE = BigDecimal
-				.valueOf(groupspace.getPartsUtilities().size());
-		final BigDecimal weight = BigDecimal.ONE.divide(SIZE, mc);
-
-		// compute the joned-issue-names, values and utility maps
-		for (final PartsUtilities part : groupspace.getPartsUtilities()
-				.values()) {
-
-			// part is a group, containing a set of issues and
-			// ProductOfValue for every possible combination.
-			final String joinedissue = String.join(SEP, part.getIssues());
-			weights.put(joinedissue, weight);
-
-			issueValues.put(joinedissue,
-					new GroupValueSet(part.getUtilities().keySet()));
-			linIssueUtilities.put(joinedissue,
-					new GroupValueSetUtilities(part.getUtilities()));
-
-		}
-
-		// weight correction. Add issue with name SEP filling the remainder
-		issueValues.put(SEP, WEIGHTCORRECTION);
-		linIssueUtilities.put(SEP, new GroupValueSetUtilities(WEIGHTCORRUTIL));
-		weights.put(SEP, BigDecimal.ONE.subtract(weight.multiply(SIZE)));
-
-		final Domain lindomain = new Domain(groupspace.getDomain().getName(),
-				issueValues);
-		final Bid resbid = toLinearBid(groupspace.getReservationBid(),
-				groupspace);
-		final LinearAdditiveUtilitySpace linspace = new LinearAdditiveUtilitySpace(
-				lindomain, groupspace.getName(), linIssueUtilities, weights,
-				resbid);
-		return new SumOfGroupsLinAdditiveAdapter(groupspace, linspace);
-
-	}
-
-	/**
-	 * Check for occurences of {@link #SEP} in this space.
-	 * 
-	 * @param space2 the space to check
-	 */
-	private static void checkSpecialCharacter(SumOfGroupsUtilitySpace space2) {
-		Domain dom = space2.getDomain();
-		for (String issue : dom.getIssues()) {
-			checkString(issue);
-			for (Value val : dom.getValues(issue)) {
-				if (val instanceof DiscreteValue) {
-					checkString(((DiscreteValue) val).getValue());
-				}
-			}
-		}
-	}
-
-	/**
-	 * check that name does not contain the {@link #SEP} characte to avoid
-	 * problems later. This ensures 1-1 mapping between original names and names
-	 * in converted space.
-	 * 
-	 * @param name the name to check
-	 */
-	private static void checkString(String name) {
-		if (name.contains(SEP))
-			throw new IllegalArgumentException("space should not use  " + name
-					+ " : character '" + SEP + "' is reserved");
-	}
-
-	@Override
-	public String toString() {
-		return "LinearAdditiveAdapter[" + super.toString() + "]";
-	}
-
-	/**
-	 * 
-	 * @param bid
-	 * @param groupspace
-	 * @return bid converted to {@link LinearAdditiveUtilitySpace.
-	 */
-	public static Bid toLinearBid(Bid bid, SumOfGroupsUtilitySpace groupspace) {
-		if (bid == null)
-			return null;
-
-		final Map<String, Value> map = new HashMap<>();
-
-		for (PartsUtilities part : groupspace.getPartsUtilities().values()) {
-			String linissue = String.join(SEP, part.getIssues());
-			List<Value> values = part.getIssues().stream()
-					.map(iss -> bid.getValue(iss)).collect(Collectors.toList());
-			map.put(linissue, new ProductOfValue(values));
-		}
-		return new Bid(map);
-	}
-
-	/**
-	 * 
-	 * @param bid possibly partial {@link Bid} from {@link LinearAdditive} space
-	 * @return a possibly partial Bid in the {@link SumOfGroupsUtilitySpace}.
-	 */
-	public Bid toGroupBid(Bid bid) {
-		if (bid == null)
-			return null;
-
-		final Map<String, Value> allvalues = new HashMap<>();
-
-		for (String linissue : bid.getIssues()) {
-			allvalues.putAll(toGroupValues(linissue,
-					(ProductOfValue) bid.getValue(linissue)));
-		}
-		return new Bid(allvalues);
-	}
-
-	/**
-	 * 
-	 * @param linissue an issue in the {@link LinearAdditive} space
-	 * @param value    a value in the {@link LinearAdditive} space
-	 * @return a map of issue-value pairs in the {@link SumOfGroupsUtilitySpace}
-	 */
-	private Map<String, Value> toGroupValues(String linissue,
-			ProductOfValue value) {
-		if (linissue.equals(SEP))
-			// ignore the weight-balancer issue
-			return Collections.emptyMap();
-
-		final Map<String, Value> values = new HashMap<>();
-		final String[] issues = linissue.split(SEP);
-		for (int n = 0; n < issues.length; n = n + 1) {
-			values.put(issues[n], value.getValues().get(n));
-		}
-
-		return values;
-	}
-}
Index: /bidspace/src/main/java/geniusweb/bidspace/pareto/GenericPareto.java
===================================================================
--- /bidspace/src/main/java/geniusweb/bidspace/pareto/GenericPareto.java	(revision 53)
+++ /bidspace/src/main/java/geniusweb/bidspace/pareto/GenericPareto.java	(revision 1)
@@ -1,6 +1,4 @@
 package geniusweb.bidspace.pareto;
 
-import java.util.ArrayList;
-import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
@@ -16,11 +14,10 @@
 /**
  * A set of all pareto points associated with a set of profiles. Generally
- * applicable but slow. It is recommended to use {@link ParetoLinearAdditive} if
- * applicable.
+ * applicable but slow.
  */
 public class GenericPareto implements ParetoFrontier {
 
 	private final List<? extends PartialOrdering> profiles;
-	private transient Set<Bid> paretobids = null; // cache
+	private Set<Bid> paretobids = null;
 
 	/**
@@ -38,5 +35,5 @@
 					"at least 2 profiles are needed");
 		}
-		if (profiles.contains(null)) {
+		if (profiles.stream().anyMatch(profile -> profile == null)) {
 			throw new IllegalArgumentException("Profiles must not be null");
 		}
@@ -49,10 +46,10 @@
 			}
 		}
-		this.profiles = new ArrayList<>(profiles);
+		this.profiles = profiles;
 	}
 
 	@Override
-	public List<Profile> getProfiles() {
-		return Collections.unmodifiableList(profiles);
+	public List<? extends Profile> getProfiles() {
+		return profiles;
 	}
 
@@ -61,5 +58,5 @@
 		if (paretobids == null)
 			computePareto();
-		return Collections.unmodifiableSet(paretobids);
+		return paretobids;
 	}
 
Index: /bidspace/src/main/java/geniusweb/bidspace/pareto/ParetoLinearAdditive.java
===================================================================
--- /bidspace/src/main/java/geniusweb/bidspace/pareto/ParetoLinearAdditive.java	(revision 53)
+++ /bidspace/src/main/java/geniusweb/bidspace/pareto/ParetoLinearAdditive.java	(revision 1)
@@ -10,13 +10,13 @@
 import geniusweb.issuevalue.Domain;
 import geniusweb.profile.Profile;
-import geniusweb.profile.utilityspace.LinearAdditive;
+import geniusweb.profile.utilityspace.LinearAdditiveUtilitySpace;
 
 /**
- * pareto frontier implementation for {@link LinearAdditive}. This is a highly
- * optimized pareto method for {@link LinearAdditive} spaces
+ * pareto frontier implementation for {@link LinearAdditiveUtilitySpace}.
+ * Simplistic implementation that iterates over all bids.
  */
 public class ParetoLinearAdditive implements ParetoFrontier {
 
-	private final List<LinearAdditive> utilSpaces;
+	private final List<LinearAdditiveUtilitySpace> utilSpaces;
 	private Set<Bid> points = null;
 	// all issues in a deterministic order
@@ -24,8 +24,9 @@
 	/**
 	 * 
-	 * @param utilSpaces. Must contain at least two {@link LinearAdditive}s and
-	 *                    all must be defined on the same donain.
+	 * @param utilSpaces. Must contain at least two
+	 *                    {@link LinearAdditiveUtilitySpace}s and all must be
+	 *                    defined on the same donain.
 	 */
-	public ParetoLinearAdditive(List<LinearAdditive> utilSpaces) {
+	public ParetoLinearAdditive(List<LinearAdditiveUtilitySpace> utilSpaces) {
 		if (utilSpaces == null || utilSpaces.size() < 2) {
 			throw new IllegalArgumentException(
@@ -33,5 +34,5 @@
 		}
 		Domain domain = utilSpaces.get(0).getDomain();
-		for (LinearAdditive space : utilSpaces) {
+		for (LinearAdditiveUtilitySpace space : utilSpaces) {
 			if (!space.getDomain().equals(domain)) {
 				throw new IllegalArgumentException(
Index: /bidspace/src/main/java/geniusweb/bidspace/pareto/ParetoPoint.java
===================================================================
--- /bidspace/src/main/java/geniusweb/bidspace/pareto/ParetoPoint.java	(revision 53)
+++ /bidspace/src/main/java/geniusweb/bidspace/pareto/ParetoPoint.java	(revision 1)
@@ -3,9 +3,12 @@
 import java.math.BigDecimal;
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.LinkedList;
 import java.util.List;
+import java.util.Map;
 
 import geniusweb.issuevalue.Bid;
-import geniusweb.profile.utilityspace.LinearAdditive;
+import geniusweb.issuevalue.Value;
+import geniusweb.profile.utilityspace.LinearAdditiveUtilitySpace;
 
 /**
@@ -23,10 +26,10 @@
 	 * 
 	 * @param bid    a (possibly partial) {@link Bid}
-	 * @param spaces the {@link LinearAdditive}s to consider
+	 * @param spaces the {@link LinearAdditiveUtilitySpace}s to consider
 	 */
-	public ParetoPoint(Bid bid, List<LinearAdditive> spaces) {
+	public ParetoPoint(Bid bid, List<LinearAdditiveUtilitySpace> spaces) {
 		this.bid = bid;
 		utilities = new ArrayList<>();
-		for (LinearAdditive space : spaces) {
+		for (LinearAdditiveUtilitySpace space : spaces) {
 			utilities.add(space.getUtility(bid));
 		}
@@ -46,4 +49,11 @@
 	 */
 	public ParetoPoint merge(ParetoPoint otherpoint) {
+		Map<String, Value> issuevalues = new HashMap<>();
+		for (String issue : bid.getIssues()) {
+			issuevalues.put(issue, bid.getValue(issue));
+		}
+		for (String issue : otherpoint.bid.getIssues()) {
+			issuevalues.put(issue, otherpoint.bid.getValue(issue));
+		}
 		List<BigDecimal> summedutils = new LinkedList<>();
 		for (int n = 0; n < utilities.size(); n++) {
@@ -51,5 +61,5 @@
 		}
 
-		return new ParetoPoint(summedutils, bid.merge(otherpoint.getBid()));
+		return new ParetoPoint(summedutils, new Bid(issuevalues));
 	}
 
Index: /bidspace/src/main/java/geniusweb/bidspace/pareto/PartialPareto.java
===================================================================
--- /bidspace/src/main/java/geniusweb/bidspace/pareto/PartialPareto.java	(revision 53)
+++ /bidspace/src/main/java/geniusweb/bidspace/pareto/PartialPareto.java	(revision 1)
@@ -8,5 +8,5 @@
 import geniusweb.issuevalue.Bid;
 import geniusweb.issuevalue.Value;
-import geniusweb.profile.utilityspace.LinearAdditive;
+import geniusweb.profile.utilityspace.LinearAdditiveUtilitySpace;
 
 /**
@@ -28,5 +28,5 @@
 	 * implemented recursively (O(log(#issues))).
 	 * 
-	 * @param utilSpaces the {@link LinearAdditive}s
+	 * @param utilSpaces the {@link LinearAdditiveUtilitySpace}s
 	 * @param issues     the issues (subset of all issues in the space) to be
 	 *                   used for this pareto
@@ -34,6 +34,6 @@
 	 *         given issues.
 	 */
-	public static PartialPareto create(List<LinearAdditive> utilSpaces,
-			List<String> issues) {
+	public static PartialPareto create(
+			List<LinearAdditiveUtilitySpace> utilSpaces, List<String> issues) {
 
 		if (issues.size() == 1) {
Index: dspace/src/test/java/geniusweb/bidspace/BidsWithUtilityTest.java
===================================================================
--- /bidspace/src/test/java/geniusweb/bidspace/BidsWithUtilityTest.java	(revision 53)
+++ 	(revision )
@@ -1,154 +1,0 @@
-package geniusweb.bidspace;
-
-import static org.junit.Assert.assertTrue;
-
-import java.io.IOException;
-import java.math.BigDecimal;
-import java.math.BigInteger;
-import java.math.RoundingMode;
-import java.nio.file.Files;
-import java.nio.file.Paths;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Random;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-import org.junit.runners.Parameterized.Parameters;
-
-import com.fasterxml.jackson.databind.ObjectMapper;
-
-import geniusweb.issuevalue.Bid;
-import geniusweb.profile.Profile;
-import geniusweb.profile.utilityspace.LinearAdditiveUtilitySpace;
-import tudelft.utilities.immutablelist.ImmutableList;
-
-@RunWith(Parameterized.class)
-public class BidsWithUtilityTest {
-	private final static ObjectMapper jackson = new ObjectMapper();
-	private final Interval utilityGoal = new Interval(new BigDecimal("0.50"),
-			new BigDecimal("0.51"));
-	private LinearAdditiveUtilitySpace profile;
-	private long expectedSize;
-	private int accuracy = 5;
-	private final static Runtime r = Runtime.getRuntime();
-
-	@Parameters
-	public static Collection<Object[]> data() {
-		return Arrays.asList(new Object[][] {
-				{ "src/test/resources/jobs/jobs1.json", 11 },
-				{ "src/test/resources/7issues/7issues1.json", 260000 },
-				{ "src/test/resources/9issues/9issues1.json", 25000000 } });
-	}
-
-	public BidsWithUtilityTest(String filename, long expectedsize)
-			throws IOException {
-		String file = new String(Files.readAllBytes(Paths.get(filename)));
-		profile = (LinearAdditiveUtilitySpace) jackson.readValue(file,
-				Profile.class);
-		this.expectedSize = expectedsize;
-	}
-
-	/**
-	 * Test if the values are within acceptable range from the goal.
-	 */
-	@Test
-	public void test() {
-		ImmutableList<Bid> list = new BidsWithUtility(profile, accuracy)
-				.getBids(utilityGoal);
-		Random rand = new Random();
-		// check not all but only 10000 random bids as list may be way too large
-		// to test them all. Testing 1 billion bids may take 15 minutes or so on
-		// quad core i7 @2.4GHz.....
-		// also notice that we may be checking only part of the list if
-		// the size of the list would become bigger than maxint.
-		for (int n = 0; n < 10000; n++) {
-			Bid bid = list.get(rand.nextInt(list.size().intValue()));
-			assertTrue(utilityGoal.contains(profile.getUtility(bid)
-					.setScale(accuracy - 1, RoundingMode.HALF_UP)));
-		}
-		assertTrue(
-				list.size().compareTo(BigInteger.valueOf(expectedSize)) >= 0);
-
-	}
-
-	@Test
-	public void testMaxUtil() {
-		BidsWithUtility bidswithutil = new BidsWithUtility(profile);
-		// notice, this is the *rounded* max util
-		BigDecimal maxutil = bidswithutil.getRange().getMax();
-		Interval goal = new Interval(
-				maxutil.subtract(new BigDecimal("0.00001")), maxutil);
-
-		ImmutableList<Bid> bidsnearmax = bidswithutil.getBids(goal);
-		assertTrue(bidsnearmax.size() != BigInteger.ZERO);
-
-		BigDecimal foundmax = BigDecimal.ZERO;
-		for (Bid bid : bidsnearmax) {
-			BigDecimal util = profile.getUtility(bid);
-			if (util.compareTo(foundmax) > 0) {
-				foundmax = util;
-			}
-		}
-		// found maximum may be slightly lower or higher because we rounded
-		// all weighted utilities.
-		assertTrue(Math
-				.abs(foundmax.doubleValue() - maxutil.doubleValue()) < 0.0001);
-	}
-
-	@Test
-	public void benchmark() {
-		System.out.println("\nBenchmarking " + profile.getName());
-		BigInteger domainsize = new AllBidsList(profile.getDomain()).size();
-
-		long presize = usedMemory();
-		long start = System.currentTimeMillis();
-		BidsWithUtility body = new BidsWithUtility(profile, accuracy);
-		ImmutableList<Bid> list = body.getBids(utilityGoal);
-		long end = System.currentTimeMillis();
-		long postsize = usedMemory();
-		System.out.println("run time: " + (end - start) / 1000. + "s");
-		System.out.println("Total size of complete domain:" + domainsize);
-		System.out.println("size of selection: " + list.size());
-		System.out.println("Memory use of selection(MB):"
-				+ (double) (postsize - presize) / (1024 * 1024));
-	}
-
-	/**
-	 * see https://www.geeksforgeeks.org/java-lang-runtime-class-in-java/
-	 * 
-	 * @return currently used memory after doing GC.
-	 * 
-	 */
-	public static long usedMemory() {
-		for (int n = 0; n < 4; n++)
-			gc1(); // repeat as gct seems getting more agressive then
-		return used();
-	}
-
-	/**
-	 * 
-	 * @return used heap mem. Does NOT GC. Uses {@link Runtime#totalMemory()}
-	 *         and {@link Runtime#freeMemory()} to avoid problems when JVM gets
-	 *         more system memory which can happen at any time.
-	 */
-	private static long used() {
-		return r.totalMemory() - r.freeMemory();
-	}
-
-	/**
-	 * repeat garbage collection till heap memory gets stable
-	 */
-	private static void gc1() {
-		long usedMem1 = used(), usedMem2 = Long.MAX_VALUE;
-		for (int i = 0; (usedMem1 < usedMem2) && (i < 500); ++i) {
-			r.runFinalization();
-			r.gc();
-			Thread.currentThread().yield();
-
-			usedMem2 = usedMem1;
-			usedMem1 = used();
-		}
-	}
-}
Index: /bidspace/src/test/java/geniusweb/bidspace/FrequencyOppModelTest.java
===================================================================
--- /bidspace/src/test/java/geniusweb/bidspace/FrequencyOppModelTest.java	(revision 1)
+++ /bidspace/src/test/java/geniusweb/bidspace/FrequencyOppModelTest.java	(revision 1)
@@ -0,0 +1,138 @@
+package geniusweb.bidspace;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.math.BigDecimal;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
+import org.junit.Test;
+
+import geniusweb.bidspace.FrequencyOpponentModel;
+import geniusweb.bidspace.OpponentModel;
+import geniusweb.issuevalue.Bid;
+import geniusweb.issuevalue.DiscreteValue;
+import geniusweb.issuevalue.DiscreteValueSet;
+import geniusweb.issuevalue.Domain;
+import geniusweb.issuevalue.NumberValue;
+import geniusweb.issuevalue.NumberValueSet;
+import geniusweb.issuevalue.Value;
+import geniusweb.issuevalue.ValueSet;
+import tudelft.utilities.junit.GeneralTests;
+
+public class FrequencyOppModelTest extends GeneralTests<FrequencyOpponentModel> {
+	private final static String ISS1 = "issue1";
+	private final static String ISS2 = "issue2";
+	private static final DiscreteValue I1V1 = new DiscreteValue("i1v1");
+	private static final DiscreteValue I1V2 = new DiscreteValue("i1v2");
+	private static final DiscreteValue I1V2b = new DiscreteValue("i1v2b");
+
+	private static Domain domain, domain2, domain3;
+	private static FrequencyOpponentModel oppModel1, oppModel1b, oppModel2, oppModel3, oppModel4;
+
+	private final static List<List<Bid>> list = new LinkedList<>();
+
+	private final static Bid bid1, bid2, bid3;
+	private static final BigDecimal HALF = new BigDecimal("0.5");
+
+	static {
+		Map<String, ValueSet> issues = new HashMap<>();
+		Collection<DiscreteValue> discretevalues1 = new LinkedList<>();
+		discretevalues1.add(I1V1);
+		discretevalues1.add(I1V2);
+		DiscreteValueSet values1 = new DiscreteValueSet(discretevalues1);
+		issues.put(ISS1, values1);
+		NumberValueSet values2 = new NumberValueSet(BigDecimal.ZERO, BigDecimal.TEN, new BigDecimal("0.3"));
+		issues.put(ISS2, values2);
+		domain = new Domain("test", issues);
+		domain2 = new Domain("test2", issues);
+
+		// slightly different issue1
+		issues = new HashMap<>();
+		discretevalues1 = new LinkedList<>();
+		discretevalues1.add(I1V1);
+		discretevalues1.add(I1V2b);
+		values1 = new DiscreteValueSet(discretevalues1);
+		issues.put(ISS1, values1);
+		values2 = new NumberValueSet(BigDecimal.ZERO, BigDecimal.TEN, new BigDecimal("0.3"));
+		issues.put(ISS2, values2);
+		domain3 = new Domain("test", issues);
+
+		// all bids are for domain
+		Map<String, Value> issuevalues = new HashMap<>();
+		issuevalues.put(ISS1, I1V1);
+		issuevalues.put(ISS2, new NumberValue(new BigDecimal("1.2")));
+		bid1 = new Bid(issuevalues);
+
+		issuevalues.put(ISS1, I1V1);
+		issuevalues.put(ISS2, new NumberValue(new BigDecimal("1.5")));
+		bid2 = new Bid(issuevalues);
+
+		issuevalues.put(ISS1, I1V2);
+		issuevalues.put(ISS2, new NumberValue(new BigDecimal("1.5")));
+		bid3 = new Bid(issuevalues);
+
+		oppModel1 = new FrequencyOpponentModel(domain);
+		oppModel1b = new FrequencyOpponentModel(domain);
+		oppModel2 = new FrequencyOpponentModel(domain2);
+		oppModel3 = new FrequencyOpponentModel(domain3);
+		oppModel4 = (FrequencyOpponentModel) oppModel3.update(bid1);
+
+	}
+
+	@Override
+	public List<List<FrequencyOpponentModel>> getGeneralTestData() {
+		return Arrays.asList(Arrays.asList(oppModel1, oppModel1b), Arrays.asList(oppModel2), Arrays.asList(oppModel3),
+				Arrays.asList(oppModel4));
+	}
+
+	@Override
+	public List<String> getGeneralTestStrings() {
+		return Arrays.asList("FrequencyOpponentModel\\[0,\\{issue2=\\{\\}, issue1=\\{\\}\\}\\]",
+				"FrequencyOpponentModel\\[0,\\{issue2=\\{\\}, issue1=\\{\\}\\}\\]",
+				"FrequencyOpponentModel\\[0,\\{issue2=\\{\\}, issue1=\\{\\}\\}\\]",
+				"FrequencyOpponentModel\\[1,\\{issue2=\\{1.2=1\\}, issue1=\\{\"i1v1\"=1\\}\\}\\]");
+	}
+
+	@Test(expected = NullPointerException.class)
+	public void smokeNullTest() {
+		new FrequencyOpponentModel(null);
+	}
+
+	@Test
+	public void smokeTest() {
+		new FrequencyOpponentModel(domain);
+	}
+
+	@Test
+	public void testEmptyModel() {
+		FrequencyOpponentModel oppModel = new FrequencyOpponentModel(domain);
+		assertEquals(BigDecimal.ONE, oppModel.getUtility(bid1));
+		assertEquals(BigDecimal.ONE, oppModel.getUtility(bid2));
+	}
+
+	@Test
+	public void testUpdate() {
+		OpponentModel oppModel = oppModel1.update(bid1);
+		assertTrue(BigDecimal.ONE.compareTo(oppModel.getUtility(bid1)) == 0);
+		assertTrue(BigDecimal.ZERO.compareTo(oppModel.getUtility(bid3)) == 0);
+		// bid2 has 1 of 2 issue values same as bid1.
+		assertTrue(HALF.compareTo(oppModel.getUtility(bid2)) == 0);
+	}
+
+	@Test
+	public void testUpdate2() {
+		// bid1 and bid2 both want I1V1. They differ on the number value.
+		// bid3 wants I1V2 but does have the number value from bid2
+		OpponentModel oppModel = oppModel1.update(bid1).update(bid2);
+		assertTrue(new BigDecimal("0.75").compareTo(oppModel.getUtility(bid1)) == 0);
+		assertTrue(new BigDecimal("0.75").compareTo(oppModel.getUtility(bid2)) == 0);
+		assertTrue(new BigDecimal("0.25").compareTo(oppModel.getUtility(bid3)) == 0);
+	}
+
+}
Index: dspace/src/test/java/geniusweb/bidspace/IntervalTest.java
===================================================================
--- /bidspace/src/test/java/geniusweb/bidspace/IntervalTest.java	(revision 53)
+++ 	(revision )
@@ -1,118 +1,0 @@
-package geniusweb.bidspace;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
-import java.math.BigDecimal;
-import java.util.Arrays;
-import java.util.List;
-
-import org.junit.Test;
-
-import tudelft.utilities.junit.GeneralTests;
-
-public class IntervalTest extends GeneralTests<Interval> {
-
-	private static final BigDecimal ZERO = BigDecimal.ZERO;
-	private static final BigDecimal ONE = BigDecimal.ONE;
-	private static final BigDecimal TWO = BigDecimal.valueOf(2);
-	private static final BigDecimal THREE = BigDecimal.valueOf(3);
-	private static final BigDecimal TEN = BigDecimal.TEN;
-	private static final Interval int1 = new Interval(ZERO, ONE);
-	private static final Interval int1a = new Interval(ZERO, ONE);
-	private static final Interval int2 = new Interval(ONE, TEN);
-	private static final Interval int3 = new Interval(TWO, TEN);
-
-	@Override
-	public List<List<Interval>> getGeneralTestData() {
-		return Arrays.asList(Arrays.asList(int1, int1a), Arrays.asList(int2),
-				Arrays.asList(int3));
-	}
-
-	@Override
-	public List<String> getGeneralTestStrings() {
-		return Arrays.asList("Interval\\[0,1\\]", "Interval\\[1,10\\]",
-				"Interval\\[2,10\\]");
-	}
-
-	@Test
-	public void smokeTest() {
-		new Interval(BigDecimal.ZERO, BigDecimal.ONE);
-	}
-
-	@Test
-	public void smokeTestBad() {
-		Interval i = new Interval(BigDecimal.TEN, BigDecimal.ONE);
-		assertTrue(i.isEmpty());
-	}
-
-	@Test(expected = NullPointerException.class)
-	public void smokeNull1() {
-		new Interval(null, BigDecimal.ZERO);
-	}
-
-	@Test(expected = NullPointerException.class)
-	public void smokeNull2() {
-		new Interval(BigDecimal.ZERO, null);
-	}
-
-	@Test
-	public void testMin() {
-		assertEquals(BigDecimal.ZERO, int1.getMin());
-		assertEquals(BigDecimal.ONE, int2.getMin());
-	}
-
-	@Test
-	public void testMax() {
-		assertEquals(BigDecimal.ONE, int1.getMax());
-		assertEquals(BigDecimal.TEN, int2.getMax());
-	}
-
-	@Test
-	public void containsTest() {
-		assertTrue(int1.contains(BigDecimal.valueOf(0.3)));
-		assertFalse(int1.contains(BigDecimal.valueOf(-0.3)));
-		assertFalse(int1.contains(BigDecimal.valueOf(1.3)));
-
-		assertFalse(int3.contains(ZERO));
-		assertFalse(int3.contains(ONE));
-		assertTrue(int3.contains(TWO));
-		assertTrue(int3.contains(THREE));
-		assertTrue(int3.contains(TEN));
-		assertFalse(int3.contains(BigDecimal.valueOf(10.3)));
-
-	}
-
-	@Test
-	public void testIntersect() {
-		assertEquals(int1, int1.intersect(int1));
-		assertEquals(new Interval(ONE, ONE), int1.intersect(int2));
-		assertTrue(int1.intersect(int3).isEmpty());
-		assertEquals(new Interval(ONE, TWO),
-				new Interval(ZERO, TEN).intersect(new Interval(ONE, TWO)));
-		assertEquals(new Interval(ONE, TWO),
-				new Interval(ONE, TWO).intersect(new Interval(ZERO, TEN)));
-		assertEquals(new Interval(ONE, TWO),
-				new Interval(ZERO, TWO).intersect(new Interval(ONE, TEN)));
-		assertEquals(new Interval(ONE, TWO),
-				new Interval(ONE, TEN).intersect(new Interval(ZERO, TWO)));
-	}
-
-	@Test
-	public void subtractTest() {
-		assertEquals(new Interval(BigDecimal.valueOf(-1), ZERO),
-				int1.subtract(ONE));
-	}
-
-	@Test
-	public void invertTest() {
-		assertEquals(new Interval(BigDecimal.valueOf(-10), ZERO),
-				int1.invert(int2));
-		assertEquals(new Interval(ZERO, TEN), int2.invert(int1));
-		assertEquals(
-				new Interval(BigDecimal.valueOf(-9), BigDecimal.valueOf(8)),
-				int2.invert(int3));
-	}
-
-}
Index: dspace/src/test/java/geniusweb/bidspace/IssueInfoTest.java
===================================================================
--- /bidspace/src/test/java/geniusweb/bidspace/IssueInfoTest.java	(revision 53)
+++ 	(revision )
@@ -1,68 +1,0 @@
-package geniusweb.bidspace;
-
-import static org.junit.Assert.assertEquals;
-
-import java.math.BigDecimal;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
-import org.junit.Before;
-import org.junit.Test;
-
-import geniusweb.issuevalue.DiscreteValue;
-import geniusweb.issuevalue.DiscreteValueSet;
-import geniusweb.issuevalue.ValueSet;
-import geniusweb.profile.utilityspace.DiscreteValueSetUtilities;
-import geniusweb.profile.utilityspace.ValueSetUtilities;
-
-public class IssueInfoTest {
-
-	private static final String NAME = "name";
-	private static final DiscreteValue VAL1 = new DiscreteValue("v1"),
-			VAL2 = new DiscreteValue("v2"), VAL3 = new DiscreteValue("v3");
-	private static final BigDecimal N03 = new BigDecimal("0.3");
-	private static final BigDecimal N04 = new BigDecimal("0.4");
-	private static final BigDecimal N05 = new BigDecimal("0.5");
-	private static final BigDecimal N06 = new BigDecimal("0.6");
-	private IssueInfo info;
-
-	@Before
-	public void before() {
-		Set<DiscreteValue> issuevalues = new HashSet<>();
-		issuevalues.add(VAL1);
-		issuevalues.add(VAL2);
-		issuevalues.add(VAL3);
-		ValueSet values = new DiscreteValueSet(issuevalues);
-		Map<DiscreteValue, BigDecimal> valueUtils = new HashMap<>();
-		valueUtils.put(VAL1, N03);
-		valueUtils.put(VAL2, N04);
-		valueUtils.put(VAL3, N05);
-		ValueSetUtilities utils = new DiscreteValueSetUtilities(valueUtils);
-		info = new IssueInfo(NAME, values, utils, N06, 6);
-	}
-
-	@Test
-	public void smokeTest() {
-
-	}
-
-	@Test
-	public void testGetExtremeMin() {
-
-		assertEquals(VAL1, info.getExtreme(false));
-		assertEquals(VAL3, info.getExtreme(true));
-	}
-
-	@Test
-	public void getNameTest() {
-		assertEquals(NAME, info.getName());
-	}
-
-	@Test
-	public void getIntervalTest() {
-		assertEquals(new Interval(N03.multiply(N06), N05.multiply(N06)),
-				info.getInterval());
-	}
-}
Index: dspace/src/test/java/geniusweb/bidspace/PartialSpaceFromUtilityTest.java
===================================================================
--- /bidspace/src/test/java/geniusweb/bidspace/PartialSpaceFromUtilityTest.java	(revision 53)
+++ 	(revision )
@@ -1,32 +1,0 @@
-package geniusweb.bidspace;
-
-import static org.junit.Assert.assertTrue;
-
-import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.Paths;
-
-import org.junit.Test;
-
-import com.fasterxml.jackson.databind.ObjectMapper;
-
-import geniusweb.profile.Profile;
-import geniusweb.profile.utilityspace.LinearAdditiveUtilitySpace;
-
-public class PartialSpaceFromUtilityTest {
-	private final static ObjectMapper jackson = new ObjectMapper();
-
-	@Test
-	public void createPartialSpaceJobs() throws IOException {
-		String file1 = new String(Files
-				.readAllBytes(Paths.get("src/test/resources/jobs/jobs1.json")));
-		LinearAdditiveUtilitySpace profile = (LinearAdditiveUtilitySpace) jackson
-				.readValue(file1, Profile.class);
-		PartialSpaceFromUtility partial = new PartialSpaceFromUtility(profile,
-				20);
-		System.out.println(jackson.writeValueAsString(partial));
-		int size = partial.getBetter().size();
-		assertTrue(size >= 20); // sometimes 20, sometimes 21
-		assertTrue(size <= 21);
-	}
-}
Index: dspace/src/test/java/geniusweb/bidspace/SumOfGroupsLinAdditiveAdapterTest.java
===================================================================
--- /bidspace/src/test/java/geniusweb/bidspace/SumOfGroupsLinAdditiveAdapterTest.java	(revision 53)
+++ 	(revision )
@@ -1,93 +1,0 @@
-package geniusweb.bidspace;
-
-import static org.junit.Assert.assertEquals;
-
-import java.io.IOException;
-import java.math.BigInteger;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Random;
-
-import org.junit.Test;
-
-import com.fasterxml.jackson.core.JsonParseException;
-import com.fasterxml.jackson.databind.JsonMappingException;
-import com.fasterxml.jackson.databind.ObjectMapper;
-
-import geniusweb.issuevalue.Bid;
-import geniusweb.issuevalue.DiscreteValue;
-import geniusweb.issuevalue.Value;
-import geniusweb.profile.utilityspace.ProductOfValue;
-import geniusweb.profile.utilityspace.SumOfGroupsUtilitySpace;
-
-public class SumOfGroupsLinAdditiveAdapterTest {
-	private final ObjectMapper jackson = new ObjectMapper();
-	private final Random random = new Random();
-	private final SumOfGroupsLinAdditiveAdapter adapter;
-	private final SumOfGroupsUtilitySpace groupspace;
-
-	public SumOfGroupsLinAdditiveAdapterTest()
-			throws JsonParseException, JsonMappingException, IOException {
-		groupspace = jackson.readValue(
-				getClass().getResourceAsStream("/computer/computerbuy.json"),
-				SumOfGroupsUtilitySpace.class);
-		adapter = SumOfGroupsLinAdditiveAdapter.create(groupspace);
-
-	}
-
-	@Test
-	public void smokeTest() {
-		System.out.println("" + adapter);
-	}
-
-	@Test
-	public void checkUtility() throws IOException {
-		AllBidsList bidspace = new AllBidsList(groupspace.getDomain());
-		int NISS = adapter.getDomain().getIssues().size() - 1;
-
-		// compare utility of many random bids
-		for (int n = 0; n < 100; n += 1) {
-			// space is small, do this simple
-
-			int i = random.nextInt(bidspace.size().intValue());
-			// this is bid in the group space.
-			Bid groupbid = bidspace.get(BigInteger.valueOf(i));
-
-			Bid linbid = adapter.toLinearBid(groupbid, groupspace);
-
-			assertEquals(groupspace.getUtility(groupbid).floatValue(),
-					NISS * adapter.getUtility(linbid).floatValue(), 0.000001);
-
-			assertEquals(groupbid, adapter.toGroupBid(linbid));
-		}
-	}
-
-	@Test
-	public void checkReservationBid() {
-		assertEquals(groupspace.getReservationBid(),
-				adapter.toGroupBid(adapter.getReservationBid()));
-	}
-
-	@Test
-	public void testGroupValueSet() {
-		final Value val1 = new DiscreteValue("val1");
-		final ProductOfValue pov = new ProductOfValue(Arrays.asList(val1));
-		final Collection<ProductOfValue> issuevalues = Arrays.asList(pov);
-		final GroupValueSet gvs = new GroupValueSet(issuevalues);
-		final GroupValueSet gvs1 = new GroupValueSet(issuevalues);
-
-		assertEquals(issuevalues, gvs.getValues());
-		assertEquals(BigInteger.ONE, gvs.size());
-		assertEquals(pov, gvs.get(BigInteger.ZERO));
-		assertEquals(pov, gvs.get(0));
-		assertEquals(pov, gvs.iterator().next());
-		assertEquals("[" + pov + "]", gvs.toString());
-
-		// poor man's GenericTests, we can't do GenericTests because that's on a
-		// class level
-		// and we can't make a class level test here.
-		assertEquals(gvs, gvs);
-		assertEquals(gvs1, gvs);
-		assertEquals(gvs.hashCode(), gvs1.hashCode());
-	}
-}
Index: /bidspace/src/test/java/geniusweb/bidspace/pareto/GenericParetoTest.java
===================================================================
--- /bidspace/src/test/java/geniusweb/bidspace/pareto/GenericParetoTest.java	(revision 53)
+++ /bidspace/src/test/java/geniusweb/bidspace/pareto/GenericParetoTest.java	(revision 1)
@@ -2,11 +2,10 @@
 
 import static org.junit.Assert.assertEquals;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.eq;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
 import java.math.BigDecimal;
-import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
@@ -15,9 +14,8 @@
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
 
-import org.junit.Before;
 import org.junit.Test;
 
+import geniusweb.bidspace.pareto.GenericPareto;
 import geniusweb.issuevalue.Bid;
 import geniusweb.issuevalue.DiscreteValue;
@@ -29,5 +27,4 @@
 import geniusweb.issuevalue.ValueSet;
 import geniusweb.profile.PartialOrdering;
-import geniusweb.profile.Profile;
 
 public class GenericParetoTest {
@@ -42,17 +39,13 @@
 	private static final Map<String, ValueSet> issues = new HashMap<>();
 
-	private static ValueSet values1;
-	private static ValueSet values2;
+	private static final ValueSet values1;
+	private static final ValueSet values2;
 	private static final BigDecimal TWO = new BigDecimal("2");
 	private static final BigDecimal THREE = new BigDecimal("3");
 
-	private static Domain domain;
+	private static final Domain domain;
 	private static Bid bid1, bid2, bid3;
 
-	private PartialOrdering profile1, profile2, profile3;
-	private GenericPareto pareto;
-
-	@Before
-	public void before() {
+	static {
 		Collection<DiscreteValue> discretevalues1 = new LinkedList<>();
 		discretevalues1.add(I1V1);
@@ -77,17 +70,13 @@
 		bid3 = new Bid(issuevalues);
 
-		profile1 = mock(PartialOrdering.class);
-		profile2 = mock(PartialOrdering.class);
-		profile3 = mock(PartialOrdering.class);
-		when(profile1.getDomain()).thenReturn(domain);
-		when(profile2.getDomain()).thenReturn(domain);
-		when(profile3.getDomain()).thenReturn(domain);
-
-		pareto = new GenericPareto(Arrays.asList(profile1, profile2));
-
 	}
 
 	@Test
 	public void genericParetoTest() {
+		PartialOrdering profile1 = mock(PartialOrdering.class);
+		PartialOrdering profile2 = mock(PartialOrdering.class);
+
+		when(profile1.getDomain()).thenReturn(domain);
+		when(profile2.getDomain()).thenReturn(domain);
 
 		// fefault: there is no preference at all, all isPreferredOrEqual
@@ -103,4 +92,9 @@
 	@Test
 	public void genericParetoTest1() {
+		PartialOrdering profile1 = mock(PartialOrdering.class);
+		PartialOrdering profile2 = mock(PartialOrdering.class);
+
+		when(profile1.getDomain()).thenReturn(domain);
+		when(profile2.getDomain()).thenReturn(domain);
 
 		// both prefer bid1 over any other bid.
@@ -109,4 +103,7 @@
 		when(profile2.isPreferredOrEqual(eq(bid1), any(Bid.class)))
 				.thenReturn(true);
+
+		List<PartialOrdering> profiles = Arrays.asList(profile1, profile2);
+		GenericPareto pareto = new GenericPareto(profiles);
 
 		Collection<Bid> points = pareto.getPoints();
@@ -117,4 +114,9 @@
 	@Test
 	public void genericParetoTest2() {
+		PartialOrdering profile1 = mock(PartialOrdering.class);
+		PartialOrdering profile2 = mock(PartialOrdering.class);
+
+		when(profile1.getDomain()).thenReturn(domain);
+		when(profile2.getDomain()).thenReturn(domain);
 
 		// both prefer bid2 over any other bid.
@@ -123,4 +125,6 @@
 		when(profile2.isPreferredOrEqual(eq(bid2), any(Bid.class)))
 				.thenReturn(true);
+		List<PartialOrdering> profiles = Arrays.asList(profile1, profile2);
+		GenericPareto pareto = new GenericPareto(profiles);
 
 		Collection<Bid> points = pareto.getPoints();
@@ -132,4 +136,10 @@
 	@Test
 	public void genericParetoTest3() {
+		PartialOrdering profile1 = mock(PartialOrdering.class);
+		PartialOrdering profile2 = mock(PartialOrdering.class);
+
+		when(profile1.getDomain()).thenReturn(domain);
+		when(profile2.getDomain()).thenReturn(domain);
+
 		// profile1 prefers bid1, profile2 prefers bid2.
 		// now neither bid1 nor bid2 are dominating each other
@@ -139,4 +149,6 @@
 		when(profile2.isPreferredOrEqual(eq(bid2), any(Bid.class)))
 				.thenReturn(true);
+		List<PartialOrdering> profiles = Arrays.asList(profile1, profile2);
+		GenericPareto pareto = new GenericPareto(profiles);
 
 		Collection<Bid> points = pareto.getPoints();
@@ -147,4 +159,9 @@
 	@Test
 	public void genericParetoTest4() {
+		PartialOrdering profile1 = mock(PartialOrdering.class);
+		PartialOrdering profile2 = mock(PartialOrdering.class);
+
+		when(profile1.getDomain()).thenReturn(domain);
+		when(profile2.getDomain()).thenReturn(domain);
 
 		// profile1 prefers bid1, profile2 prefers bid2.
@@ -158,4 +175,6 @@
 		when(profile2.isPreferredOrEqual(eq(bid2), any(Bid.class)))
 				.thenReturn(true);
+		List<PartialOrdering> profiles = Arrays.asList(profile1, profile2);
+		GenericPareto pareto = new GenericPareto(profiles);
 
 		Collection<Bid> points = pareto.getPoints();
@@ -164,31 +183,3 @@
 	}
 
-	@Test(expected = IllegalArgumentException.class)
-	public void testNullNotOk() {
-		new GenericPareto(Arrays.asList(profile1, null, profile1));
-	}
-
-	@Test
-	public void testImmutable() {
-		List<PartialOrdering> list = new ArrayList<>(
-				Arrays.asList(profile1, profile2));
-		GenericPareto pareto = new GenericPareto(list);
-		// if we modify the list, the pareto should not change
-		list.add(profile3);
-		assertEquals(2, pareto.getProfiles().size());
-	}
-
-	@Test(expected = UnsupportedOperationException.class)
-	public void testGetParetoAndAdd() {
-		List<Profile> list = pareto.getProfiles();
-		list.add(profile3);
-
-	}
-
-	@Test(expected = UnsupportedOperationException.class)
-	public void testGetPointsAndAdd() {
-		Set<Bid> list = pareto.getPoints();
-		list.add(bid1);
-	}
-
 }
Index: /bidspace/src/test/java/geniusweb/bidspace/pareto/ParetoE2Etest.java
===================================================================
--- /bidspace/src/test/java/geniusweb/bidspace/pareto/ParetoE2Etest.java	(revision 53)
+++ /bidspace/src/test/java/geniusweb/bidspace/pareto/ParetoE2Etest.java	(revision 1)
@@ -19,6 +19,8 @@
 import com.fasterxml.jackson.databind.ObjectMapper;
 
+import geniusweb.bidspace.pareto.GenericPareto;
+import geniusweb.bidspace.pareto.ParetoFrontier;
+import geniusweb.bidspace.pareto.ParetoLinearAdditive;
 import geniusweb.profile.Profile;
-import geniusweb.profile.utilityspace.LinearAdditive;
 import geniusweb.profile.utilityspace.LinearAdditiveUtilitySpace;
 
@@ -36,5 +38,5 @@
 						"src/test/resources/jobs/jobs2.json", 18 },
 				{ "src/test/resources/7issues/7issues1.json",
-						"src/test/resources/7issues/7issues2.json", 557 } });
+						"src/test/resources/7issues/7issues2.json", 351 } });
 	}
 
@@ -59,5 +61,5 @@
 				.readValue(file2, Profile.class);
 
-		List<LinearAdditive> profiles = new LinkedList<>();
+		List<LinearAdditiveUtilitySpace> profiles = new LinkedList<>();
 		profiles.add(profile1);
 		profiles.add(profile2);
Index: /bidspace/src/test/java/geniusweb/bidspace/pareto/ParetoPointTest.java
===================================================================
--- /bidspace/src/test/java/geniusweb/bidspace/pareto/ParetoPointTest.java	(revision 53)
+++ /bidspace/src/test/java/geniusweb/bidspace/pareto/ParetoPointTest.java	(revision 1)
@@ -4,5 +4,5 @@
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
-import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Matchers.eq;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
@@ -10,13 +10,13 @@
 import java.math.BigDecimal;
 import java.util.Arrays;
-import java.util.HashMap;
-import java.util.Map;
+import java.util.HashSet;
 
 import org.junit.Before;
 import org.junit.Test;
 
+import geniusweb.bidspace.pareto.ParetoPoint;
 import geniusweb.issuevalue.Bid;
 import geniusweb.issuevalue.Value;
-import geniusweb.profile.utilityspace.LinearAdditive;
+import geniusweb.profile.utilityspace.LinearAdditiveUtilitySpace;
 
 public class ParetoPointTest {
@@ -26,6 +26,7 @@
 	private static final BigDecimal D0_4 = BigDecimal.valueOf(0.4);
 	private static final BigDecimal D0_5 = BigDecimal.valueOf(0.5);
-	private final LinearAdditive space1 = mock(LinearAdditive.class),
-			space2 = mock(LinearAdditive.class);
+	private final LinearAdditiveUtilitySpace space1 = mock(
+			LinearAdditiveUtilitySpace.class),
+			space2 = mock(LinearAdditiveUtilitySpace.class);
 	private final Bid bid11 = mock(Bid.class), bid12 = mock(Bid.class),
 			bid21 = mock(Bid.class), bid22 = mock(Bid.class);
@@ -86,15 +87,21 @@
 	@Test
 	public void mergeTest() {
+		// partial bid 020_010 has value 0.2 for issue 2 in space1 and 0.1 for
+		// issue 2 in space2.
+		Bid partialbid020_010 = mock(Bid.class),
+				partialbid102_301 = mock(Bid.class);
+		// merged this should be a bid 122_311 so it has utilities
+		// 1+2+2=0.5 in space1 and 3+1+1=0.5 in space2
+
+		when(partialbid020_010.getIssues())
+				.thenReturn(new HashSet<String>(Arrays.asList("issue2")));
+		when(partialbid102_301.getIssues()).thenReturn(
+				new HashSet<String>(Arrays.asList("issue1", "issue3")));
+
 		Value value1 = mock(Value.class), value2 = mock(Value.class),
 				value3 = mock(Value.class);
-		// partial bid 020_010 has value 0.2 for issue 2 in space1 and 0.1 for
-		// issue 2 in space2.
-		Bid partialbid020_010 = new Bid("issue2", value2);
-		Map<String, Value> vals2 = new HashMap<>();
-		vals2.put("issue1", value1);
-		vals2.put("issue3", value3);
-		Bid partialbid102_301 = new Bid(vals2);
-		// merged this should be a bid 122_311 so it has utilities
-		// 1+2+2=0.5 in space1 and 3+1+1=0.5 in space2
+		when(partialbid020_010.getValue(eq("issue2"))).thenReturn(value2);
+		when(partialbid102_301.getValue(eq("issue1"))).thenReturn(value1);
+		when(partialbid102_301.getValue(eq("issue3"))).thenReturn(value3);
 
 		when(space1.getUtility(eq(partialbid020_010))).thenReturn(D0_2);
@@ -110,4 +117,11 @@
 		ParetoPoint p = p1.merge(p2);
 		Bid bid = p.getBid();
+		assertEquals(
+				new HashSet<String>(
+						Arrays.asList("issue1", "issue2", "issue3")),
+				bid.getIssues());
+		assertEquals(value1, bid.getValue("issue1"));
+		assertEquals(value2, bid.getValue("issue2"));
+		assertEquals(value3, bid.getValue("issue3"));
 		assertEquals(D0_5, p.getUtilities().get(0));
 		assertEquals(D0_5, p.getUtilities().get(1));
Index: dspace/src/test/java/geniusweb/bidspace/pareto/ParetoRandomTest.java
===================================================================
--- /bidspace/src/test/java/geniusweb/bidspace/pareto/ParetoRandomTest.java	(revision 53)
+++ 	(revision )
@@ -1,136 +1,0 @@
-package geniusweb.bidspace.pareto;
-
-import java.io.IOException;
-import java.math.BigDecimal;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.commons.math.stat.descriptive.DescriptiveStatistics;
-import org.junit.Test;
-
-import geniusweb.issuevalue.DiscreteValue;
-import geniusweb.issuevalue.DiscreteValueSet;
-import geniusweb.issuevalue.Domain;
-import geniusweb.issuevalue.ValueSet;
-import geniusweb.profile.utilityspace.DiscreteValueSetUtilities;
-import geniusweb.profile.utilityspace.LinearAdditive;
-import geniusweb.profile.utilityspace.LinearAdditiveUtilitySpace;
-import geniusweb.profile.utilityspace.ValueSetUtilities;
-
-/**
- * Test pareto on random space.
- */
-public class ParetoRandomTest {
-
-	private final int DIMENSION = 2; // #participants. 2 is normal bilateral
-										// space
-	private final int NISSUES = 3; // number of issues
-	private final int NVALS = 10; // number values per issue
-	private final int NRUNS = 50; // number of runs (to average result)
-
-	@Test
-	public void checkGenerciPareto() throws IOException {
-
-		DescriptiveStatistics time = new DescriptiveStatistics();
-		DescriptiveStatistics paretopoints = new DescriptiveStatistics();
-
-		for (int run = 0; run < NRUNS; run++) {
-			System.gc(); // free memory before each test run
-			System.out.print(".");
-			long startTime = System.nanoTime();
-			ParetoLinearAdditive pareto = runOneTest();
-			paretopoints.addValue(pareto.getPoints().size());
-
-			double dt = (System.nanoTime() - startTime) / 1000000000d;
-
-			time.addValue(dt);
-		}
-		System.out.println();
-		System.out.println("Results averaged over " + NRUNS + " runs");
-		System.out.println("DIMENSION=" + DIMENSION);
-		System.out.println("NISSUES=" + NISSUES);
-		System.out.println("NVALS=" + NVALS);
-		System.out.println("bidspace=" + Math.pow(NVALS, NISSUES));
-		System.out.println("runtime: " + time.getMean() + "s, stdev="
-				+ time.getStandardDeviation());
-		System.out.println("points on pareto: " + paretopoints.getMean()
-				+ ", stdev=" + paretopoints.getStandardDeviation());
-		System.out.println("{" + DIMENSION + "," + NISSUES + "," + NVALS + ","
-				+ time.getMean() + "," + time.getStandardDeviation() + ","
-				+ paretopoints.getMean() + ","
-				+ paretopoints.getStandardDeviation() + "}");
-	}
-
-	private ParetoLinearAdditive runOneTest() {
-		Domain domain = getRandomDomain();
-
-		List<LinearAdditive> profiles = new LinkedList<>();
-		for (int n = 0; n < DIMENSION; n++) {
-			LinearAdditiveUtilitySpace rspace = getRandomSpace(domain);
-			profiles.add(rspace);
-		}
-		return new ParetoLinearAdditive(profiles);
-
-	}
-
-	private Domain getRandomDomain() {
-		Map<String, ValueSet> issues = new HashMap<>();
-		List<BigDecimal> w = getRandomWeights();
-		for (int iss = 0; iss < NISSUES; iss++) {
-			Collection<DiscreteValue> values = new LinkedList<>();
-			for (int val = 0; val < NVALS; val++) {
-				DiscreteValue v = new DiscreteValue("iss" + iss + "val" + val);
-				values.add(v);
-			}
-			String issuename = "issue" + iss;
-			issues.put(issuename, new DiscreteValueSet(values));
-
-		}
-		return new Domain("dom", issues);
-	}
-
-	/**
-	 * 
-	 * @param domain some domain with discrete issue values
-	 * @return random LA utilspace for this domain
-	 */
-	private LinearAdditiveUtilitySpace getRandomSpace(Domain domain) {
-		List<String> issuelist = new LinkedList(domain.getIssues());
-		Map<String, ValueSetUtilities> utils = new HashMap<>();
-		Map<String, BigDecimal> weights = new HashMap<>();
-		List<BigDecimal> w = getRandomWeights();
-		for (int iss = 0; iss < NISSUES; iss++) {
-			String issuename = issuelist.get(iss);
-			Map<DiscreteValue, BigDecimal> utilsmap = new HashMap<>();
-			for (int val = 0; val < NVALS; val++) {
-				DiscreteValue v = (DiscreteValue) domain.getValues(issuename)
-						.get(val);
-				utilsmap.put(v, BigDecimal.valueOf(Math.random()));
-			}
-			weights.put(issuename, w.get(iss));
-			utils.put(issuename, new DiscreteValueSetUtilities(utilsmap));
-		}
-		return new LinearAdditiveUtilitySpace(domain, "name", utils, weights,
-				null);
-	}
-
-	/**
-	 * 
-	 * @return list of NISSUES BigDecimals, summing to 1
-	 */
-	private List<BigDecimal> getRandomWeights() {
-		List<BigDecimal> doubles = new LinkedList<>();
-		BigDecimal remainder = BigDecimal.ONE;
-		for (int n = 0; n < NISSUES - 1; n++) {
-			BigDecimal next = BigDecimal.valueOf(Math.random() / NISSUES);
-			doubles.add(next);
-			remainder = remainder.subtract(next);
-		}
-		doubles.add(remainder);
-		return doubles;
-	}
-
-}
Index: /bidspace/src/test/java/geniusweb/bidspace/pareto/PartialParetoTest.java
===================================================================
--- /bidspace/src/test/java/geniusweb/bidspace/pareto/PartialParetoTest.java	(revision 53)
+++ /bidspace/src/test/java/geniusweb/bidspace/pareto/PartialParetoTest.java	(revision 1)
@@ -16,9 +16,10 @@
 import org.junit.Test;
 
+import geniusweb.bidspace.pareto.PartialPareto;
 import geniusweb.issuevalue.Bid;
 import geniusweb.issuevalue.Domain;
 import geniusweb.issuevalue.Value;
 import geniusweb.issuevalue.ValueSet;
-import geniusweb.profile.utilityspace.LinearAdditive;
+import geniusweb.profile.utilityspace.LinearAdditiveUtilitySpace;
 
 public class PartialParetoTest {
@@ -30,6 +31,7 @@
 	private static final BigDecimal D0_5 = BigDecimal.valueOf(0.5);
 
-	private final LinearAdditive space1 = mock(LinearAdditive.class),
-			space2 = mock(LinearAdditive.class);
+	private final LinearAdditiveUtilitySpace space1 = mock(
+			LinearAdditiveUtilitySpace.class),
+			space2 = mock(LinearAdditiveUtilitySpace.class);
 
 	private Domain domain = mock(Domain.class);
Index: /bidspace/src/test/resources/7issues/7issues1.json
===================================================================
--- /bidspace/src/test/resources/7issues/7issues1.json	(revision 53)
+++ /bidspace/src/test/resources/7issues/7issues1.json	(revision 1)
@@ -4,57 +4,64 @@
 		"issueUtilities": {
 			"i1": {
-				"NumberValueSetUtilities": {
+				"numberutils": {
 					"lowValue": 0,
 					"lowUtility": 0.11,
 					"highValue": 9,
 					"highUtility": 0.99
+
 				}
 			},
 			"i2": {
-				"NumberValueSetUtilities": {
+				"numberutils": {
 					"lowValue": 0,
 					"lowUtility": 0.12,
 					"highValue": 9,
 					"highUtility": 0.97
+
 				}
 			},
 			"i3": {
-				"NumberValueSetUtilities": {
+				"numberutils": {
 					"lowValue": 0,
 					"lowUtility": 0.13,
 					"highValue": 9,
 					"highUtility": 0.96
+
 				}
 			},
 			"i4": {
-				"NumberValueSetUtilities": {
+				"numberutils": {
 					"lowValue": 0,
 					"lowUtility": 0.14,
 					"highValue": 9,
 					"highUtility": 0.94
+
 				}
 			},
 			"i5": {
-				"NumberValueSetUtilities": {
+				"numberutils": {
 					"lowValue": 0,
 					"lowUtility": 0.15,
 					"highValue": 9,
 					"highUtility": 0.93
+
 				}
 			},
 			"i6": {
-				"NumberValueSetUtilities": {
+				"numberutils": {
 					"lowValue": 0,
 					"lowUtility": 0.16,
 					"highValue": 9,
 					"highUtility": 0.92
+
 				}
 			},
 			"i7": {
-				"NumberValueSetUtilities": {
+				"numberutils": {
 					"lowValue": 0,
 					"lowUtility": 0.16,
 					"highValue": 9,
 					"highUtility": 0.91
+
 				}
 			}
@@ -73,23 +80,23 @@
 			"issuesValues": {
 				"i1": {
-					"range": {"low":0,"high":9,"step":1} 
+					"range": ["0", "9", "1"]
 				},
 				"i2": {
-					"range": {"low":0,"high":9,"step":1} 
+					"range": ["0", "9", "1"]
 				},
 				"i3": {
-					"range": {"low":0,"high":9,"step":1} 
+					"range": ["0", "9", "1"]
 				},
 				"i4": {
-					"range": {"low":0,"high":9,"step":1} 
+					"range": ["0", "9", "1"]
 				},
 				"i5": {
-					"range": {"low":0,"high":9,"step":1} 
+					"range": ["0", "9", "1"]
 				},
 				"i6": {
-					"range": {"low":0,"high":9,"step":1} 
+					"range": ["0", "9", "1"]
 				},
 				"i7": {
-					"range": {"low":0,"high":9,"step":1} 
+					"range": ["0", "9", "1"]
 				}
 			}
Index: /bidspace/src/test/resources/7issues/7issues2.json
===================================================================
--- /bidspace/src/test/resources/7issues/7issues2.json	(revision 53)
+++ /bidspace/src/test/resources/7issues/7issues2.json	(revision 1)
@@ -4,68 +4,75 @@
 		"issueUtilities": {
 			"i1": {
-				"NumberValueSetUtilities": {
+				"numberutils": {
 					"lowValue": 0,
 					"lowUtility": 0.51,
 					"highValue": 9,
 					"highUtility": 0.11
+
 				}
 			},
 			"i2": {
-				"NumberValueSetUtilities": {
+				"numberutils": {
 					"lowValue": 0,
 					"lowUtility": 0.92,
 					"highValue": 9,
 					"highUtility": 0.21
+
 				}
 			},
 			"i3": {
-				"NumberValueSetUtilities": {
+				"numberutils": {
 					"lowValue": 0,
 					"lowUtility": 0.93,
 					"highValue": 9,
 					"highUtility": 0.13
+
 				}
 			},
 			"i4": {
-				"NumberValueSetUtilities": {
+				"numberutils": {
 					"lowValue": 0,
 					"lowUtility": 0.94,
 					"highValue": 9,
 					"highUtility": 0.14
+
 				}
 			},
 			"i5": {
-				"NumberValueSetUtilities": {
+				"numberutils": {
 					"lowValue": 0,
 					"lowUtility": 0.95,
 					"highValue": 9,
 					"highUtility": 0.15
+
 				}
 			},
 			"i6": {
-				"NumberValueSetUtilities": {
+				"numberutils": {
 					"lowValue": 0,
 					"lowUtility": 0.96,
 					"highValue": 9,
 					"highUtility": 0.16
+
 				}
 			},
 			"i7": {
-				"NumberValueSetUtilities": {
+				"numberutils": {
 					"lowValue": 0,
 					"lowUtility": 0.97,
 					"highValue": 9,
 					"highUtility": 0.17
+
 				}
 			}
 		},
 		"issueWeights": {
-			"i1": 0.24746,
-			"i2": 0.118241,
-			"i3": 0.186047,
-			"i4": 0.206295,
-			"i5": 0.161126,
+			"i1": 0.24745759773026107,
+			"i2": 0.11824193959921694,
+			"i3": 0.1860471425098606,
+			"i4": 0.20629555826677742,
+			"i5": 0.16112666189388397,
 			"i6": 0.0538874,
-			"i7": 0.0269436
+			"i7": 0.0269437
 		},
 		"domain": {
@@ -73,23 +80,23 @@
 			"issuesValues": {
 				"i1": {
-					"range": {"low":0,"high":9,"step":1} 
+					"range": ["0", "9", "1"]
 				},
 				"i2": {
-					"range": {"low":0,"high":9,"step":1} 
+					"range": ["0", "9", "1"]
 				},
 				"i3": {
-					"range": {"low":0,"high":9,"step":1} 
+					"range": ["0", "9", "1"]
 				},
 				"i4": {
-					"range": {"low":0,"high":9,"step":1} 
+					"range": ["0", "9", "1"]
 				},
 				"i5": {
-					"range": {"low":0,"high":9,"step":1} 
+					"range": ["0", "9", "1"]
 				},
 				"i6": {
-					"range": {"low":0,"high":9,"step":1} 
+					"range": ["0", "9", "1"]
 				},
 				"i7": {
-					"range": {"low":0,"high":9,"step":1} 
+					"range": ["0", "9", "1"]
 				}
 			}
Index: /bidspace/src/test/resources/jobs/jobs1.json
===================================================================
--- /bidspace/src/test/resources/jobs/jobs1.json	(revision 53)
+++ /bidspace/src/test/resources/jobs/jobs1.json	(revision 1)
@@ -3,5 +3,5 @@
 		"issueUtilities": {
 			"salary": {
-				"DiscreteValueSetUtilities": {
+				"discreteutils": {
 					"valueUtilities": {
 						"2000": 0,
@@ -14,5 +14,5 @@
 			},
 			"fte": {
-				"DiscreteValueSetUtilities": {
+				"discreteutils": {
 					"valueUtilities": {
 						"0.6": 0.25,
@@ -23,5 +23,5 @@
 			},
 			"work from home": {
-				"DiscreteValueSetUtilities": {
+				"discreteutils": {
 					"valueUtilities": {
 						"0": 0.333333333,
@@ -32,5 +32,5 @@
 			},
 			"lease car": {
-				"DiscreteValueSetUtilities": {
+				"discreteutils": {
 					"valueUtilities": {
 						"yes":1,
@@ -40,5 +40,5 @@
 			},
 			"permanent contract": {
-				"DiscreteValueSetUtilities": {
+				"discreteutils": {
 					"valueUtilities": {
 						"yes":1,
@@ -48,5 +48,5 @@
 			},
 			"career development opportunities": {
-				"DiscreteValueSetUtilities": {
+				"discreteutils": {
 					"valueUtilities": {
 						"low":0,
Index: /bidspace/src/test/resources/jobs/jobs2.json
===================================================================
--- /bidspace/src/test/resources/jobs/jobs2.json	(revision 53)
+++ /bidspace/src/test/resources/jobs/jobs2.json	(revision 1)
@@ -3,5 +3,5 @@
 		"issueUtilities": {
 			"salary": {
-				"DiscreteValueSetUtilities": {
+				"discreteutils": {
 					"valueUtilities": {
 						"2000": 1.0,
@@ -14,5 +14,5 @@
 			},
 			"fte": {
-				"DiscreteValueSetUtilities": {
+				"discreteutils": {
 					"valueUtilities": {
 						"0.6": 0.363636363636363636,
@@ -23,5 +23,5 @@
 			},
 			"work from home": {
-				"DiscreteValueSetUtilities": {
+				"discreteutils": {
 					"valueUtilities": {
 						"0": 1.0,
@@ -32,5 +32,5 @@
 			},
 			"lease car": {
-				"DiscreteValueSetUtilities": {
+				"discreteutils": {
 					"valueUtilities": {
 						"yes":0,
@@ -40,5 +40,5 @@
 			},
 			"permanent contract": {
-				"DiscreteValueSetUtilities": {
+				"discreteutils": {
 					"valueUtilities": {
 						"yes":0.23809523809523808,
@@ -48,5 +48,5 @@
 			},
 			"career development opportunities": {
-				"DiscreteValueSetUtilities": {
+				"discreteutils": {
 					"valueUtilities": {
 						"low":1.0,
Index: llectparties.sh
===================================================================
--- /collectparties.sh	(revision 53)
+++ 	(revision )
@@ -1,27 +1,0 @@
-#!/bin/bash
-
-# this script collects all parties that are standard parties
-# on the partiesserver, and renames the jar-with-dependencies
-# The collected parties are placed in a new directory "collectedparties".
-
-rm -rf collectedparties
-mkdir collectedparties
-VERSION=2.2.1
-
-cp "exampleparties/anac2019/agentgg/target/agentgg-${VERSION}-jar-with-dependencies.jar" collectedparties
-cp "exampleparties/boulware/target/boulware-${VERSION}-jar-with-dependencies.jar" collectedparties
-cp "exampleparties/comparebids/target/comparebids-${VERSION}-jar-with-dependencies.jar" collectedparties
-cp "exampleparties/conceder/target/conceder-${VERSION}-jar-with-dependencies.jar" collectedparties
-cp "exampleparties/hardliner/target/hardliner-${VERSION}-jar-with-dependencies.jar" collectedparties
-cp "exampleparties/linear/target/linear-${VERSION}-jar-with-dependencies.jar" collectedparties
-cp "exampleparties/randomparty/target/randomparty-${VERSION}-jar-with-dependencies.jar" collectedparties
-cp "exampleparties/randompartypy/target/randompyparty-${VERSION}-jar-with-dependencies.jar" collectedparties
-cp "exampleparties/simpleshaop/target/simpleshaop-${VERSION}-jar-with-dependencies.jar" collectedparties
-cp "exampleparties/timedependentparty/target/timedependentparty-${VERSION}-jar-with-dependencies.jar" collectedparties
-cp "exampleparties/anac2019/winkyagent/target/winkyagent-${VERSION}-jar-with-dependencies.jar" collectedparties
-cp "boa/target/boa-${VERSION}-jar-with-dependencies.jar" collectedparties
-
-cd collectedparties
- for filename in ./*; do mv "./$filename" "./$(echo "$filename" | sed -e 's/-jar-with-dependencies//g')";  done
-
-
Index: /design/classdiagram.graphml
===================================================================
--- /design/classdiagram.graphml	(revision 53)
+++ /design/classdiagram.graphml	(revision 1)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <graphml xmlns="http://graphml.graphdrawing.org/xmlns" xmlns:java="http://www.yworks.com/xml/yfiles-common/1.0/java" xmlns:sys="http://www.yworks.com/xml/yfiles-common/markup/primitives/2.0" xmlns:x="http://www.yworks.com/xml/yfiles-common/markup/2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:y="http://www.yworks.com/xml/graphml" xmlns:yed="http://www.yworks.com/xml/yed/3" xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns http://www.yworks.com/xml/schema/graphml/1.1/ygraphml.xsd">
-  <!--Created by yEd 3.20-->
+  <!--Created by yEd 3.14.3-->
   <key attr.name="Description" attr.type="string" for="graph" id="d0"/>
   <key for="port" id="d1" yfiles.type="portgraphics"/>
@@ -14,7 +14,7 @@
   <key for="edge" id="d10" yfiles.type="edgegraphics"/>
   <graph edgedefault="directed" id="G">
-    <data key="d0" xml:space="preserve"/>
+    <data key="d0"/>
     <node id="n0" yfiles.foldertype="group">
-      <data key="d4" xml:space="preserve"/>
+      <data key="d4"/>
       <data key="d6">
         <y:ProxyAutoBoundsNode>
@@ -24,5 +24,5 @@
               <y:Fill color="#F5F5F5" color2="#FFFF00" transparent="false"/>
               <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
-              <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.666015625" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="t" textColor="#000000" verticalTextPosition="bottom" visible="true" width="326.07519531249994" x="0.0" xml:space="preserve" y="0.0">RunServer</y:NodeLabel>
+              <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.666015625" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="326.07519531249994" x="0.0" y="0.0">RunServer</y:NodeLabel>
               <y:Shape type="roundrectangle"/>
               <y:State closed="false" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/>
@@ -34,5 +34,5 @@
               <y:Fill color="#F5F5F5" transparent="false"/>
               <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
-              <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.666015625" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="tr" textColor="#000000" verticalTextPosition="bottom" visible="true" width="63.75830078125" x="-13.75830078125" xml:space="preserve" y="0.0">Folder 1</y:NodeLabel>
+              <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.666015625" modelName="internal" modelPosition="tr" textColor="#000000" visible="true" width="63.75830078125" x="-13.75830078125" y="0.0">Folder 1</y:NodeLabel>
               <y:Shape type="roundrectangle"/>
               <y:State closed="true" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/>
@@ -47,9 +47,15 @@
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="30.0" width="141.3125" x="431.4545898437501" y="544.83349609375"/>
-              <y:Fill color="#FFCC00" transparent="false"/>
-              <y:BorderStyle color="#000000" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="131.3125" x="5.0" xml:space="preserve" y="5.93359375">RunningSessionsRepo
-<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+              <y:Geometry height="30.0" width="141.31249999999994" x="431.4545898437501" y="544.83349609375"/>
+              <y:Fill color="#FFCC00" transparent="false"/>
+              <y:BorderStyle color="#000000" type="line" width="1.0"/>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="131.3125" x="5.0" y="5.93359375">RunningSessionsRepo
+<y:LabelModel>
+                  <y:SmartNodeLabelModel distance="4.0"/>
+                </y:LabelModel>
+                <y:ModelParameter>
+                  <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+                </y:ModelParameter>
+              </y:NodeLabel>
               <y:Shape type="rectangle"/>
             </y:ShapeNode>
@@ -62,5 +68,11 @@
               <y:Fill color="#FFCC00" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="95.998046875" x="5.0" xml:space="preserve" y="5.93359375">RunningSession<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="95.998046875" x="5.0" y="5.93359375">RunningSession<y:LabelModel>
+                  <y:SmartNodeLabelModel distance="4.0"/>
+                </y:LabelModel>
+                <y:ModelParameter>
+                  <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+                </y:ModelParameter>
+              </y:NodeLabel>
               <y:Shape type="rectangle"/>
             </y:ShapeNode>
@@ -73,5 +85,11 @@
               <y:Fill color="#FFCC00" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="112.427734375" x="4.999999999999943" xml:space="preserve" y="5.93359375">SessionsListSocket<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="112.427734375" x="4.999999999999943" y="5.93359375">SessionsListSocket<y:LabelModel>
+                  <y:SmartNodeLabelModel distance="4.0"/>
+                </y:LabelModel>
+                <y:ModelParameter>
+                  <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+                </y:ModelParameter>
+              </y:NodeLabel>
               <y:Shape type="rectangle"/>
             </y:ShapeNode>
@@ -84,7 +102,13 @@
               <y:Fill color="#FFCC00" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="46.3984375" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="70.15234375" x="5.0" xml:space="preserve" y="5.0">RunSession
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="46.3984375" modelName="custom" textColor="#000000" visible="true" width="70.15234375" x="5.0" y="5.0">RunSession
 doGet()
-doPost()<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+doPost()<y:LabelModel>
+                  <y:SmartNodeLabelModel distance="4.0"/>
+                </y:LabelModel>
+                <y:ModelParameter>
+                  <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+                </y:ModelParameter>
+              </y:NodeLabel>
               <y:Shape type="rectangle"/>
             </y:ShapeNode>
@@ -94,13 +118,13 @@
     </node>
     <node id="n1" yfiles.foldertype="group">
-      <data key="d4" xml:space="preserve"/>
+      <data key="d4"/>
       <data key="d6">
         <y:ProxyAutoBoundsNode>
           <y:Realizers active="0">
             <y:GroupNode>
-              <y:Geometry height="433.931640625" width="436.9794921874998" x="1946.6643064236116" y="289.77001953125"/>
+              <y:Geometry height="433.931640625" width="436.9794921875" x="1821.58251953125" y="627.15087890625"/>
               <y:Fill color="#F5F5F5" color2="#FFFF00" transparent="false"/>
               <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
-              <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.666015625" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="t" textColor="#000000" verticalTextPosition="bottom" visible="true" width="436.9794921874998" x="0.0" xml:space="preserve" y="0.0">PartiesServer</y:NodeLabel>
+              <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.666015625" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="436.9794921875" x="0.0" y="0.0">PartiesServer</y:NodeLabel>
               <y:Shape type="roundrectangle"/>
               <y:State closed="false" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/>
@@ -112,5 +136,5 @@
               <y:Fill color="#F5F5F5" transparent="false"/>
               <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
-              <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.666015625" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="t" textColor="#000000" verticalTextPosition="bottom" visible="true" width="63.75830078125" x="-6.879150390625" xml:space="preserve" y="0.0">Folder 2</y:NodeLabel>
+              <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.666015625" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="63.75830078125" x="-6.879150390625" y="0.0">Folder 2</y:NodeLabel>
               <y:Shape type="roundrectangle"/>
               <y:State closed="true" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/>
@@ -125,11 +149,17 @@
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="70.53125" width="239.287109375" x="2129.3566892361114" y="326.43603515625"/>
-              <y:Fill color="#FFCC00" transparent="false"/>
-              <y:BorderStyle color="#000000" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="60.53125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="229.287109375" x="5.0" xml:space="preserve" y="5.0">PartyFactory
+              <y:Geometry height="70.53125" width="239.287109375" x="2004.27490234375" y="663.81689453125"/>
+              <y:Fill color="#FFCC00" transparent="false"/>
+              <y:BorderStyle color="#000000" type="line" width="1.0"/>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="60.53125" modelName="custom" textColor="#000000" visible="true" width="229.287109375" x="5.0" y="5.0">PartyFactory
 WebSocketURI create(name, profileRef)
 maximumSlots()
-availableSlots()<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+availableSlots()<y:LabelModel>
+                  <y:SmartNodeLabelModel distance="4.0"/>
+                </y:LabelModel>
+                <y:ModelParameter>
+                  <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+                </y:ModelParameter>
+              </y:NodeLabel>
               <y:Shape type="rectangle"/>
             </y:ShapeNode>
@@ -139,11 +169,17 @@
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="70.53125" width="213.751953125" x="2147.1242673611114" y="584.43603515625"/>
-              <y:Fill color="#FFCC00" transparent="false"/>
-              <y:BorderStyle color="#000000" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="60.53125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="203.751953125" x="5.0" xml:space="preserve" y="5.0">PartyFactorySocketAdapter
+              <y:Geometry height="70.53125" width="213.751953125" x="2022.04248046875" y="921.81689453125"/>
+              <y:Fill color="#FFCC00" transparent="false"/>
+              <y:BorderStyle color="#000000" type="line" width="1.0"/>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="60.53125" modelName="custom" textColor="#000000" visible="true" width="203.751953125" x="5.0" y="5.0">PartyFactorySocketAdapter
 
 URI create(String name, ProfileRef)
-List&lt;String&gt; getNames()<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+List&lt;String&gt; getNames()<y:LabelModel>
+                  <y:SmartNodeLabelModel distance="4.0"/>
+                </y:LabelModel>
+                <y:ModelParameter>
+                  <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+                </y:ModelParameter>
+              </y:NodeLabel>
               <y:Shape type="rectangle"/>
             </y:ShapeNode>
@@ -153,8 +189,8 @@
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="141.1953125" width="178.37890625" x="1989.8107907986118" y="420.10400390625"/>
+              <y:Geometry height="141.1953125" width="178.37890625" x="1864.72900390625" y="757.48486328125"/>
               <y:Fill color="#FFFFFF" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="131.1953125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="168.37890625" x="5.0" xml:space="preserve" y="5.0">Party(PartyRef):
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="131.1953125" modelName="custom" textColor="#000000" visible="true" width="168.37890625" x="5.0" y="5.0">Party(PartyRef):
 Listener&lt;NegotiationEvent&gt;
 
@@ -164,5 +200,11 @@
 destroy()
 Action getAction()
-inform(info)<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+inform(info)<y:LabelModel>
+                  <y:SmartNodeLabelModel distance="4.0"/>
+                </y:LabelModel>
+                <y:ModelParameter>
+                  <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+                </y:ModelParameter>
+              </y:NodeLabel>
               <y:Shape type="rectangle"/>
             </y:ShapeNode>
@@ -172,8 +214,14 @@
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="30.0" width="76.671875" x="1961.6643064236116" y="584.70166015625"/>
-              <y:Fill color="#FFCC00" transparent="false"/>
-              <y:BorderStyle color="#000000" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="66.671875" x="5.0" xml:space="preserve" y="5.93359375">WebSocket<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+              <y:Geometry height="30.0" width="76.671875" x="1836.58251953125" y="922.08251953125"/>
+              <y:Fill color="#FFCC00" transparent="false"/>
+              <y:BorderStyle color="#000000" type="line" width="1.0"/>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="66.671875" x="5.0" y="5.93359375">WebSocket<y:LabelModel>
+                  <y:SmartNodeLabelModel distance="4.0"/>
+                </y:LabelModel>
+                <y:ModelParameter>
+                  <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+                </y:ModelParameter>
+              </y:NodeLabel>
               <y:Shape type="rectangle"/>
             </y:ShapeNode>
@@ -183,8 +231,14 @@
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="30.0" width="127.19140625" x="2008.4045407986118" y="678.70166015625"/>
-              <y:Fill color="#FFCC00" transparent="false"/>
-              <y:BorderStyle color="#000000" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="117.19140625" x="5.0" xml:space="preserve" y="5.93359375">PartySocketAdapter<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+              <y:Geometry height="30.0" width="127.19140625" x="1883.32275390625" y="1016.08251953125"/>
+              <y:Fill color="#FFCC00" transparent="false"/>
+              <y:BorderStyle color="#000000" type="line" width="1.0"/>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="117.19140625" x="5.0" y="5.93359375">PartySocketAdapter<y:LabelModel>
+                  <y:SmartNodeLabelModel distance="4.0"/>
+                </y:LabelModel>
+                <y:ModelParameter>
+                  <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+                </y:ModelParameter>
+              </y:NodeLabel>
               <y:Shape type="rectangle"/>
             </y:ShapeNode>
@@ -194,13 +248,13 @@
     </node>
     <node id="n2" yfiles.foldertype="group">
-      <data key="d4" xml:space="preserve"/>
+      <data key="d4"/>
       <data key="d6">
         <y:ProxyAutoBoundsNode>
           <y:Realizers active="0">
             <y:GroupNode>
-              <y:Geometry height="290.666015625" width="418.9794921875" x="1386.0896559456346" y="1556.910267466314"/>
+              <y:Geometry height="290.666015625" width="418.9794921875" x="1078.8408203125" y="1737.727161997564"/>
               <y:Fill color="#F5F5F5" color2="#FFFF00" transparent="false"/>
               <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
-              <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.666015625" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="t" textColor="#000000" verticalTextPosition="bottom" visible="true" width="418.9794921875" x="0.0" xml:space="preserve" y="0.0">ProfilesServer</y:NodeLabel>
+              <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.666015625" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="418.9794921875" x="0.0" y="0.0">ProfilesServer</y:NodeLabel>
               <y:Shape type="roundrectangle"/>
               <y:State closed="false" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/>
@@ -212,5 +266,5 @@
               <y:Fill color="#F5F5F5" transparent="false"/>
               <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
-              <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.666015625" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="t" textColor="#000000" verticalTextPosition="bottom" visible="true" width="63.75830078125" x="-6.879150390625" xml:space="preserve" y="0.0">Folder 3</y:NodeLabel>
+              <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.666015625" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="63.75830078125" x="-6.879150390625" y="0.0">Folder 3</y:NodeLabel>
               <y:Shape type="roundrectangle"/>
               <y:State closed="true" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/>
@@ -225,13 +279,19 @@
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="98.796875" width="204.529296875" x="1585.5398512581346" y="1613.177845591314"/>
+              <y:Geometry height="98.796875" width="204.529296875" x="1278.291015625" y="1793.994740122564"/>
               <y:Fill color="#FFFFFF" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="88.796875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="194.529296875" x="5.0" xml:space="preserve" y="5.0">ProfileFactory
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="88.796875" modelName="custom" textColor="#000000" visible="true" width="194.529296875" x="5.0" y="5.0">ProfileFactory
 
 getDomain(domain name)
 getProfile(profile name)
 add(domain desc, domain name)
-add(profile desc, profile name)<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+add(profile desc, profile name)<y:LabelModel>
+                  <y:SmartNodeLabelModel distance="4.0"/>
+                </y:LabelModel>
+                <y:ModelParameter>
+                  <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+                </y:ModelParameter>
+              </y:NodeLabel>
               <y:Shape type="rectangle"/>
             </y:ShapeNode>
@@ -241,8 +301,14 @@
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="30.0" width="141.4296875" x="1401.0896559456346" y="1593.576283091314"/>
-              <y:Fill color="#FFCC00" transparent="false"/>
-              <y:BorderStyle color="#000000" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="131.4296875" x="5.0" xml:space="preserve" y="5.93359375">DefaultProfilesFactory<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+              <y:Geometry height="30.0" width="141.4296875" x="1093.8408203125" y="1774.393177622564"/>
+              <y:Fill color="#FFCC00" transparent="false"/>
+              <y:BorderStyle color="#000000" type="line" width="1.0"/>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="131.4296875" x="5.0" y="5.93359375">DefaultProfilesFactory<y:LabelModel>
+                  <y:SmartNodeLabelModel distance="4.0"/>
+                </y:LabelModel>
+                <y:ModelParameter>
+                  <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+                </y:ModelParameter>
+              </y:NodeLabel>
               <y:Shape type="rectangle"/>
             </y:ShapeNode>
@@ -252,8 +318,14 @@
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="30.0" width="179.83203125" x="1471.8884840706346" y="1735.576283091314"/>
-              <y:Fill color="#FFCC00" transparent="false"/>
-              <y:BorderStyle color="#000000" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="169.83203125" x="5.0" xml:space="preserve" y="5.93359375">AutoUpdatingProfilesFactory<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+              <y:Geometry height="30.0" width="179.83203125" x="1164.6396484375" y="1916.393177622564"/>
+              <y:Fill color="#FFCC00" transparent="false"/>
+              <y:BorderStyle color="#000000" type="line" width="1.0"/>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="169.83203125" x="5.0" y="5.93359375">AutoUpdatingProfilesFactory<y:LabelModel>
+                  <y:SmartNodeLabelModel distance="4.0"/>
+                </y:LabelModel>
+                <y:ModelParameter>
+                  <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+                </y:ModelParameter>
+              </y:NodeLabel>
               <y:Shape type="rectangle"/>
             </y:ShapeNode>
@@ -263,8 +335,14 @@
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="30.0" width="108.962890625" x="1606.3230543831346" y="1790.576283091314"/>
-              <y:Fill color="#FFCC00" transparent="false"/>
-              <y:BorderStyle color="#000000" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="98.962890625" x="5.0" xml:space="preserve" y="5.93359375">GetProfileSocket<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+              <y:Geometry height="30.0" width="108.962890625" x="1299.07421875" y="1971.393177622564"/>
+              <y:Fill color="#FFCC00" transparent="false"/>
+              <y:BorderStyle color="#000000" type="line" width="1.0"/>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="98.962890625" x="5.0" y="5.93359375">GetProfileSocket<y:LabelModel>
+                  <y:SmartNodeLabelModel distance="4.0"/>
+                </y:LabelModel>
+                <y:ModelParameter>
+                  <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+                </y:ModelParameter>
+              </y:NodeLabel>
               <y:Shape type="rectangle"/>
             </y:ShapeNode>
@@ -274,8 +352,14 @@
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="30.0" width="115.70703125" x="1467.9509840706346" y="1802.576283091314"/>
-              <y:Fill color="#FFCC00" transparent="false"/>
-              <y:BorderStyle color="#000000" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="105.70703125" x="5.0" xml:space="preserve" y="5.93359375">ProfilesListSocket<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+              <y:Geometry height="30.0" width="115.70703125" x="1160.7021484375" y="1983.393177622564"/>
+              <y:Fill color="#FFCC00" transparent="false"/>
+              <y:BorderStyle color="#000000" type="line" width="1.0"/>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="105.70703125" x="5.0" y="5.93359375">ProfilesListSocket<y:LabelModel>
+                  <y:SmartNodeLabelModel distance="4.0"/>
+                </y:LabelModel>
+                <y:ModelParameter>
+                  <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+                </y:ModelParameter>
+              </y:NodeLabel>
               <y:Shape type="rectangle"/>
             </y:ShapeNode>
@@ -285,13 +369,13 @@
     </node>
     <node id="n3" yfiles.foldertype="group">
-      <data key="d4" xml:space="preserve"/>
+      <data key="d4"/>
       <data key="d6">
         <y:ProxyAutoBoundsNode>
           <y:Realizers active="0">
             <y:GroupNode>
-              <y:Geometry height="324.666015625" width="389.82013632411326" x="1387.7986403206346" y="1067.2266791433133"/>
+              <y:Geometry height="324.666015625" width="399.6455078125" x="352.58154296875" y="1416.78076171875"/>
               <y:Fill color="#F5F5F5" transparent="false"/>
               <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
-              <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.666015625" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="t" textColor="#000000" verticalTextPosition="bottom" visible="true" width="389.82013632411326" x="0.0" xml:space="preserve" y="0.0">IssueValue</y:NodeLabel>
+              <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.666015625" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="399.6455078125" x="0.0" y="0.0">IssueValue</y:NodeLabel>
               <y:Shape type="roundrectangle"/>
               <y:State closed="false" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/>
@@ -303,5 +387,5 @@
               <y:Fill color="#F5F5F5" transparent="false"/>
               <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
-              <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.666015625" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="t" textColor="#000000" verticalTextPosition="bottom" visible="true" width="63.75830078125" x="-6.879150390625" xml:space="preserve" y="0.0">Folder 5</y:NodeLabel>
+              <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.666015625" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="63.75830078125" x="-6.879150390625" y="0.0">Folder 5</y:NodeLabel>
               <y:Shape type="roundrectangle"/>
               <y:State closed="true" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/>
@@ -316,10 +400,16 @@
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="56.3984375" width="78.65234375" x="1536.6599684456346" y="1211.6934760183133"/>
+              <y:Geometry height="56.3984375" width="78.65234375" x="501.44287109375" y="1561.24755859375"/>
               <y:Fill color="#FFFFFF" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="46.3984375" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="68.65234375" x="5.0" xml:space="preserve" y="5.0">ValueSet
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="46.3984375" modelName="custom" textColor="#000000" visible="true" width="68.65234375" x="5.0" y="5.0">ValueSet
 
-getValues()<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+getValues()<y:LabelModel>
+                  <y:SmartNodeLabelModel distance="4.0"/>
+                </y:LabelModel>
+                <y:ModelParameter>
+                  <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+                </y:ModelParameter>
+              </y:NodeLabel>
               <y:Shape type="rectangle"/>
             </y:ShapeNode>
@@ -329,8 +419,14 @@
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="30.0" width="111.201171875" x="1416.2039137581346" y="1346.8926947683133"/>
-              <y:Fill color="#FFCC00" transparent="false"/>
-              <y:BorderStyle color="#000000" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="101.201171875" x="5.0" xml:space="preserve" y="5.93359375">DiscreteValueSet<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+              <y:Geometry height="30.0" width="111.201171875" x="529.16845703125" y="1507.44677734375"/>
+              <y:Fill color="#FFCC00" transparent="false"/>
+              <y:BorderStyle color="#000000" type="line" width="1.0"/>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="101.201171875" x="5.0" y="5.93359375">DiscreteValueSet<y:LabelModel>
+                  <y:SmartNodeLabelModel distance="4.0"/>
+                </y:LabelModel>
+                <y:ModelParameter>
+                  <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+                </y:ModelParameter>
+              </y:NodeLabel>
               <y:Shape type="rectangle"/>
             </y:ShapeNode>
@@ -340,8 +436,14 @@
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="30.0" width="110.375" x="1402.7986403206346" y="1183.8926947683133"/>
-              <y:Fill color="#FFCC00" transparent="false"/>
-              <y:BorderStyle color="#000000" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="100.375" x="5.0" xml:space="preserve" y="5.93359375">NumberValueSet<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+              <y:Geometry height="30.0" width="110.375" x="367.58154296875" y="1533.44677734375"/>
+              <y:Fill color="#FFCC00" transparent="false"/>
+              <y:BorderStyle color="#000000" type="line" width="1.0"/>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="100.375" x="5.0" y="5.93359375">NumberValueSet<y:LabelModel>
+                  <y:SmartNodeLabelModel distance="4.0"/>
+                </y:LabelModel>
+                <y:ModelParameter>
+                  <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+                </y:ModelParameter>
+              </y:NodeLabel>
               <y:Shape type="rectangle"/>
             </y:ShapeNode>
@@ -351,13 +453,19 @@
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="98.796875" width="102.916015625" x="1659.7027610197479" y="1149.4942572683133"/>
-              <y:Fill color="#FFCC00" transparent="false"/>
-              <y:BorderStyle color="#000000" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="88.796875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="92.916015625" x="5.0" xml:space="preserve" y="5.0">Domain
+              <y:Geometry height="98.796875" width="102.916015625" x="634.31103515625" y="1561.04833984375"/>
+              <y:Fill color="#FFCC00" transparent="false"/>
+              <y:BorderStyle color="#000000" type="line" width="1.0"/>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="88.796875" modelName="custom" textColor="#000000" visible="true" width="92.916015625" x="5.0" y="5.0">Domain
 
 getName()
 getIssues()
 getValues()
-iscomplete(Bid)<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+iscomplete(Bid)<y:LabelModel>
+                  <y:SmartNodeLabelModel distance="4.0"/>
+                </y:LabelModel>
+                <y:ModelParameter>
+                  <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+                </y:ModelParameter>
+              </y:NodeLabel>
               <y:Shape type="rectangle"/>
             </y:ShapeNode>
@@ -367,8 +475,14 @@
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="30.0" width="46.07421875" x="1599.9490309456346" y="1291.8926947683133"/>
+              <y:Geometry height="30.0" width="46.07421875" x="564.73193359375" y="1641.44677734375"/>
               <y:Fill color="#FFFFFF" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="36.07421875" x="5.0" xml:space="preserve" y="5.93359375">Value<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="36.07421875" x="5.0" y="5.93359375">Value<y:LabelModel>
+                  <y:SmartNodeLabelModel distance="4.0"/>
+                </y:LabelModel>
+                <y:ModelParameter>
+                  <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+                </y:ModelParameter>
+              </y:NodeLabel>
               <y:Shape type="rectangle"/>
             </y:ShapeNode>
@@ -378,8 +492,14 @@
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="30.0" width="31.923828125" x="1541.0242262581346" y="1103.8926947683133"/>
-              <y:Fill color="#FFCC00" transparent="false"/>
-              <y:BorderStyle color="#000000" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="21.923828125" x="5.0" xml:space="preserve" y="5.93359375">Bid<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+              <y:Geometry height="30.0" width="31.923828125" x="505.80712890625" y="1453.44677734375"/>
+              <y:Fill color="#FFCC00" transparent="false"/>
+              <y:BorderStyle color="#000000" type="line" width="1.0"/>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="21.923828125" x="5.0" y="5.93359375">Bid<y:LabelModel>
+                  <y:SmartNodeLabelModel distance="4.0"/>
+                </y:LabelModel>
+                <y:ModelParameter>
+                  <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+                </y:ModelParameter>
+              </y:NodeLabel>
               <y:Shape type="rectangle"/>
             </y:ShapeNode>
@@ -389,8 +509,14 @@
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="30.0" width="93.564453125" x="1416.2039137581346" y="1291.8926947683133"/>
-              <y:Fill color="#FFCC00" transparent="false"/>
-              <y:BorderStyle color="#000000" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="83.564453125" x="5.0" xml:space="preserve" y="5.93359375">DiscreteValue<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+              <y:Geometry height="30.0" width="93.564453125" x="380.98681640625" y="1641.44677734375"/>
+              <y:Fill color="#FFCC00" transparent="false"/>
+              <y:BorderStyle color="#000000" type="line" width="1.0"/>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="83.564453125" x="5.0" y="5.93359375">DiscreteValue<y:LabelModel>
+                  <y:SmartNodeLabelModel distance="4.0"/>
+                </y:LabelModel>
+                <y:ModelParameter>
+                  <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+                </y:ModelParameter>
+              </y:NodeLabel>
               <y:Shape type="rectangle"/>
             </y:ShapeNode>
@@ -400,8 +526,14 @@
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="30.0" width="92.73828125" x="1557.4050856331346" y="1346.8926947683133"/>
-              <y:Fill color="#FFCC00" transparent="false"/>
-              <y:BorderStyle color="#000000" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="82.73828125" x="5.0" xml:space="preserve" y="5.93359375">NumberValue<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+              <y:Geometry height="30.0" width="92.73828125" x="463.39990234375" y="1696.44677734375"/>
+              <y:Fill color="#FFCC00" transparent="false"/>
+              <y:BorderStyle color="#000000" type="line" width="1.0"/>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="82.73828125" x="5.0" y="5.93359375">NumberValue<y:LabelModel>
+                  <y:SmartNodeLabelModel distance="4.0"/>
+                </y:LabelModel>
+                <y:ModelParameter>
+                  <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+                </y:ModelParameter>
+              </y:NodeLabel>
               <y:Shape type="rectangle"/>
             </y:ShapeNode>
@@ -411,17 +543,17 @@
     </node>
     <node id="n4" yfiles.foldertype="group">
-      <data key="d4" xml:space="preserve"/>
+      <data key="d4"/>
       <data key="d6">
         <y:ProxyAutoBoundsNode>
           <y:Realizers active="0">
             <y:GroupNode>
-              <y:Geometry height="470.662049179532" width="440.0228778595131" x="768.4453711591059" y="1207.9499526592672"/>
+              <y:Geometry height="458.130859375" width="516.02734375" x="870.56884765625" y="1026.483642578125"/>
               <y:Fill color="#F5F5F5" transparent="false"/>
               <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
-              <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.666015625" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="t" textColor="#000000" verticalTextPosition="bottom" visible="true" width="440.0228778595131" x="0.0" xml:space="preserve" y="0.0">Profile</y:NodeLabel>
+              <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.666015625" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="516.02734375" x="0.0" y="0.0">Profile</y:NodeLabel>
               <y:Shape type="roundrectangle"/>
               <y:State closed="false" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/>
               <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
-              <y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/>
+              <y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="56" rightF="55.755859375" top="0" topF="0.0"/>
             </y:GroupNode>
             <y:GroupNode>
@@ -429,5 +561,5 @@
               <y:Fill color="#F5F5F5" transparent="false"/>
               <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
-              <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.666015625" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="t" textColor="#000000" verticalTextPosition="bottom" visible="true" width="63.75830078125" x="-6.879150390625" xml:space="preserve" y="0.0">Folder 6</y:NodeLabel>
+              <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.666015625" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="63.75830078125" x="-6.879150390625" y="0.0">Folder 6</y:NodeLabel>
               <y:Shape type="roundrectangle"/>
               <y:State closed="true" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/>
@@ -440,14 +572,20 @@
       <graph edgedefault="directed" id="n4:">
         <node id="n4::n0">
-          <data key="d4" xml:space="preserve"/>
-          <data key="d6">
-            <y:ShapeNode>
-              <y:Geometry height="70.53125" width="134.46875" x="897.769030268619" y="1593.0807518387992"/>
+          <data key="d4"/>
+          <data key="d6">
+            <y:ShapeNode>
+              <y:Geometry height="70.53125" width="134.46875" x="1020.14111328125" y="1399.083251953125"/>
               <y:Fill color="#FFFFFF" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="60.53125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="124.46875" x="6.0" xml:space="preserve" y="6.0">Profile
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="60.53125" modelName="custom" textColor="#000000" visible="true" width="124.46875" x="6.0" y="6.0">Profile
 
 String name()
-Domain getDomain()<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.5" labelRatioY="0.5" nodeRatioX="0.5" nodeRatioY="0.5" offsetX="-4.0" offsetY="-4.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+Domain getDomain()<y:LabelModel>
+                  <y:SmartNodeLabelModel distance="4.0"/>
+                </y:LabelModel>
+                <y:ModelParameter>
+                  <y:SmartNodeLabelModelParameter labelRatioX="0.5" labelRatioY="0.5" nodeRatioX="0.5" nodeRatioY="0.5" offsetX="-4.0" offsetY="-4.0" upX="0.0" upY="-1.0"/>
+                </y:ModelParameter>
+              </y:NodeLabel>
               <y:Shape type="rectangle"/>
             </y:ShapeNode>
@@ -457,9 +595,15 @@
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="30.0" width="164.685546875" x="1028.782702143619" y="1485.3463768387992"/>
-              <y:Fill color="#FFCC00" transparent="false"/>
-              <y:BorderStyle color="#000000" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="154.685546875" x="5.0" xml:space="preserve" y="5.93359375">LinearAdditiveUtilitySpace
-<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+              <y:Geometry height="30.0" width="164.685546875" x="1151.15478515625" y="1291.348876953125"/>
+              <y:Fill color="#FFCC00" transparent="false"/>
+              <y:BorderStyle color="#000000" type="line" width="1.0"/>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="154.685546875" x="5.0" y="5.93359375">LinearAdditiveUtilitySpace
+<y:LabelModel>
+                  <y:SmartNodeLabelModel distance="4.0"/>
+                </y:LabelModel>
+                <y:ModelParameter>
+                  <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+                </y:ModelParameter>
+              </y:NodeLabel>
               <y:Shape type="rectangle"/>
             </y:ShapeNode>
@@ -469,8 +613,14 @@
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="30.0" width="98.439453125" x="1092.980944331119" y="1253.271184239799"/>
-              <y:Fill color="#FFCC00" transparent="false"/>
-              <y:BorderStyle color="#000000" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="88.439453125" x="5.0" xml:space="preserve" y="5.93359375">DiscreteProfile<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+              <y:Geometry height="30.0" width="98.439453125" x="949.15576171875" y="1345.348876953125"/>
+              <y:Fill color="#FFCC00" transparent="false"/>
+              <y:BorderStyle color="#000000" type="line" width="1.0"/>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="88.439453125" x="5.0" y="5.93359375">DiscreteProfile<y:LabelModel>
+                  <y:SmartNodeLabelModel distance="4.0"/>
+                </y:LabelModel>
+                <y:ModelParameter>
+                  <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+                </y:ModelParameter>
+              </y:NodeLabel>
               <y:Shape type="rectangle"/>
             </y:ShapeNode>
@@ -480,11 +630,17 @@
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="70.53125" width="118.37890625" x="929.938952143619" y="1244.6159682842672"/>
+              <y:Geometry height="70.53125" width="118.37890625" x="949.18603515625" y="1197.083251953125"/>
               <y:Fill color="#FFFFFF" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="60.53125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="108.37890625" x="5.0" xml:space="preserve" y="5.0">ValueSetUtilities
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="60.53125" modelName="custom" textColor="#000000" visible="true" width="108.37890625" x="5.0" y="5.0">ValueSetUtilities
 
 getUtility(Value)
-isFitting(ValueSet)<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+isFitting(ValueSet)<y:LabelModel>
+                  <y:SmartNodeLabelModel distance="4.0"/>
+                </y:LabelModel>
+                <y:ModelParameter>
+                  <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+                </y:ModelParameter>
+              </y:NodeLabel>
               <y:Shape type="rectangle"/>
             </y:ShapeNode>
@@ -494,8 +650,14 @@
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="30.0" width="97.61328125" x="783.4453711591059" y="1285.1472182842672"/>
-              <y:Fill color="#FFCC00" transparent="false"/>
-              <y:BorderStyle color="#000000" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="87.61328125" x="5.0" xml:space="preserve" y="5.93359375">NumberProfile<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+              <y:Geometry height="30.0" width="97.61328125" x="885.56884765625" y="1291.348876953125"/>
+              <y:Fill color="#FFCC00" transparent="false"/>
+              <y:BorderStyle color="#000000" type="line" width="1.0"/>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="87.61328125" x="5.0" y="5.93359375">NumberProfile<y:LabelModel>
+                  <y:SmartNodeLabelModel distance="4.0"/>
+                </y:LabelModel>
+                <y:ModelParameter>
+                  <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+                </y:ModelParameter>
+              </y:NodeLabel>
               <y:Shape type="rectangle"/>
             </y:ShapeNode>
@@ -505,10 +667,16 @@
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="56.3984375" width="160.58984375" x="1030.830553706119" y="1371.2467674637992"/>
+              <y:Geometry height="56.3984375" width="160.58984375" x="1153.20263671875" y="1177.249267578125"/>
               <y:Fill color="#FFFFFF" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="46.3984375" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="150.58984375" x="5.0" xml:space="preserve" y="5.0">UtilitySpace
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="46.3984375" modelName="custom" textColor="#000000" visible="true" width="150.58984375" x="5.0" y="5.0">UtilitySpace
 
-BigDecimal getUtility(Bid)<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+BigDecimal getUtility(Bid)<y:LabelModel>
+                  <y:SmartNodeLabelModel distance="4.0"/>
+                </y:LabelModel>
+                <y:ModelParameter>
+                  <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+                </y:ModelParameter>
+              </y:NodeLabel>
               <y:Shape type="rectangle"/>
             </y:ShapeNode>
@@ -518,10 +686,16 @@
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="56.3984375" width="170.251953125" x="800.877428706119" y="1485.3463768387992"/>
+              <y:Geometry height="56.3984375" width="170.251953125" x="1051.24951171875" y="1063.149658203125"/>
               <y:Fill color="#FFFFFF" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="46.3984375" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="160.251953125" x="5.0" xml:space="preserve" y="5.0">PartialOrdering
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="46.3984375" modelName="custom" textColor="#000000" visible="true" width="160.251953125" x="5.0" y="5.0">PartialOrdering
 
-isPreferredOrEqual(Bid,Bid)<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+isPreferredOrEqual(Bid,Bid)<y:LabelModel>
+                  <y:SmartNodeLabelModel distance="4.0"/>
+                </y:LabelModel>
+                <y:ModelParameter>
+                  <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+                </y:ModelParameter>
+              </y:NodeLabel>
               <y:Shape type="rectangle"/>
             </y:ShapeNode>
@@ -529,11 +703,17 @@
         </node>
         <node id="n4::n7">
-          <data key="d4" xml:space="preserve"/>
-          <data key="d6">
-            <y:ShapeNode>
-              <y:Geometry height="30.0" width="95.322265625" x="876.342272456119" y="1337.3463768387992"/>
+          <data key="d4"/>
+          <data key="d6">
+            <y:ShapeNode>
+              <y:Geometry height="30.0" width="122.181640625" x="985.28466796875" y="1143.348876953125"/>
               <y:Fill color="#FFFFFF" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="85.322265625" x="5.0" xml:space="preserve" y="5.93359375">TotalOrdering<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="85.322265625" x="18.4296875" y="5.93359375">TotalOrdering<y:LabelModel>
+                  <y:SmartNodeLabelModel distance="4.0"/>
+                </y:LabelModel>
+                <y:ModelParameter>
+                  <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+                </y:ModelParameter>
+              </y:NodeLabel>
               <y:Shape type="rectangle"/>
             </y:ShapeNode>
@@ -543,8 +723,14 @@
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="30.0" width="78.44140625" x="1071.904772456119" y="1569.4442772294242"/>
-              <y:Fill color="#FFCC00" transparent="false"/>
-              <y:BorderStyle color="#000000" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="68.44140625" x="5.0" xml:space="preserve" y="5.93359375">BigDecimal<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+              <y:Geometry height="30.0" width="78.44140625" x="1194.27685546875" y="1375.44677734375"/>
+              <y:Fill color="#FFCC00" transparent="false"/>
+              <y:BorderStyle color="#000000" type="line" width="1.0"/>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="68.44140625" x="5.0" y="5.93359375">BigDecimal<y:LabelModel>
+                  <y:SmartNodeLabelModel distance="4.0"/>
+                </y:LabelModel>
+                <y:ModelParameter>
+                  <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+                </y:ModelParameter>
+              </y:NodeLabel>
               <y:Shape type="rectangle"/>
             </y:ShapeNode>
@@ -554,13 +740,13 @@
     </node>
     <node id="n5" yfiles.foldertype="group">
-      <data key="d4" xml:space="preserve"/>
+      <data key="d4"/>
       <data key="d6">
         <y:ProxyAutoBoundsNode>
           <y:Realizers active="0">
             <y:GroupNode>
-              <y:Geometry height="350.6650390625" width="967.9170236011676" x="139.66845703125" y="755.757654065266"/>
+              <y:Geometry height="430.33203125" width="739.3134765625" x="32.66845703125" y="823.016845703125"/>
               <y:Fill color="#F5F5F5" transparent="false"/>
               <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
-              <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.666015625" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="t" textColor="#000000" verticalTextPosition="bottom" visible="true" width="967.9170236011676" x="0.0" xml:space="preserve" y="0.0">events</y:NodeLabel>
+              <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.666015625" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="739.3134765625" x="0.0" y="0.0">events</y:NodeLabel>
               <y:Shape type="roundrectangle"/>
               <y:State closed="false" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/>
@@ -572,5 +758,5 @@
               <y:Fill color="#F5F5F5" transparent="false"/>
               <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
-              <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.666015625" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="t" textColor="#000000" verticalTextPosition="bottom" visible="true" width="63.75830078125" x="-6.879150390625" xml:space="preserve" y="0.0">Folder 7</y:NodeLabel>
+              <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.666015625" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="63.75830078125" x="-6.879150390625" y="0.0">Folder 7</y:NodeLabel>
               <y:Shape type="roundrectangle"/>
               <y:State closed="true" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/>
@@ -583,13 +769,13 @@
       <graph edgedefault="directed" id="n5:">
         <node id="n5::n0" yfiles.foldertype="group">
-          <data key="d4" xml:space="preserve"/>
+          <data key="d4"/>
           <data key="d6">
             <y:ProxyAutoBoundsNode>
               <y:Realizers active="0">
                 <y:GroupNode>
-                  <y:Geometry height="290.666015625" width="293.7763671875" x="495.56884765625" y="792.423669690266"/>
+                  <y:Geometry height="290.666015625" width="293.7763671875" x="463.20556640625" y="859.682861328125"/>
                   <y:Fill color="#F5F5F5" transparent="false"/>
                   <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
-                  <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.666015625" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="t" textColor="#000000" verticalTextPosition="bottom" visible="true" width="293.7763671875" x="0.0" xml:space="preserve" y="0.0">actions</y:NodeLabel>
+                  <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.666015625" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="293.7763671875" x="0.0" y="0.0">actions</y:NodeLabel>
                   <y:Shape type="roundrectangle"/>
                   <y:State closed="false" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/>
@@ -601,5 +787,5 @@
                   <y:Fill color="#F5F5F5" transparent="false"/>
                   <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
-                  <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.666015625" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="t" textColor="#000000" verticalTextPosition="bottom" visible="true" width="63.75830078125" x="-6.879150390625" xml:space="preserve" y="0.0">Folder 1</y:NodeLabel>
+                  <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.666015625" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="63.75830078125" x="-6.879150390625" y="0.0">Folder 1</y:NodeLabel>
                   <y:Shape type="roundrectangle"/>
                   <y:State closed="true" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/>
@@ -614,8 +800,14 @@
               <data key="d6">
                 <y:ShapeNode>
-                  <y:Geometry height="30.0" width="51.201171875" x="585.87353515625" y="876.089685315266"/>
+                  <y:Geometry height="30.0" width="51.201171875" x="553.51025390625" y="943.348876953125"/>
                   <y:Fill color="#FFFFFF" transparent="false"/>
                   <y:BorderStyle color="#000000" type="line" width="1.0"/>
-                  <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="41.201171875" x="5.0" xml:space="preserve" y="5.93359375">Action<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+                  <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="41.201171875" x="5.0" y="5.93359375">Action<y:LabelModel>
+                      <y:SmartNodeLabelModel distance="4.0"/>
+                    </y:LabelModel>
+                    <y:ModelParameter>
+                      <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+                    </y:ModelParameter>
+                  </y:NodeLabel>
                   <y:Shape type="rectangle"/>
                 </y:ShapeNode>
@@ -625,8 +817,14 @@
               <data key="d6">
                 <y:ShapeNode>
-                  <y:Geometry height="30.0" width="94.794921875" x="613.07666015625" y="1038.089685315266"/>
+                  <y:Geometry height="30.0" width="94.794921875" x="580.71337890625" y="1105.348876953125"/>
                   <y:Fill color="#FFFFFF" transparent="false"/>
                   <y:BorderStyle color="#000000" type="line" width="1.0"/>
-                  <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="84.794921875" x="5.0" xml:space="preserve" y="5.93359375">ActionWithBid<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+                  <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="84.794921875" x="5.0" y="5.93359375">ActionWithBid<y:LabelModel>
+                      <y:SmartNodeLabelModel distance="4.0"/>
+                    </y:LabelModel>
+                    <y:ModelParameter>
+                      <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+                    </y:ModelParameter>
+                  </y:NodeLabel>
                   <y:Shape type="rectangle"/>
                 </y:ShapeNode>
@@ -636,8 +834,14 @@
               <data key="d6">
                 <y:ShapeNode>
-                  <y:Geometry height="30.0" width="43.7421875" x="730.60302734375" y="1010.089685315266"/>
+                  <y:Geometry height="30.0" width="43.7421875" x="698.23974609375" y="1077.348876953125"/>
                   <y:Fill color="#FFCC00" transparent="false"/>
                   <y:BorderStyle color="#000000" type="line" width="1.0"/>
-                  <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="33.7421875" x="5.0" xml:space="preserve" y="5.93359375">Offer<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+                  <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="33.7421875" x="5.0" y="5.93359375">Offer<y:LabelModel>
+                      <y:SmartNodeLabelModel distance="4.0"/>
+                    </y:LabelModel>
+                    <y:ModelParameter>
+                      <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+                    </y:ModelParameter>
+                  </y:NodeLabel>
                   <y:Shape type="rectangle"/>
                 </y:ShapeNode>
@@ -647,8 +851,14 @@
               <data key="d6">
                 <y:ShapeNode>
-                  <y:Geometry height="30.0" width="103.267578125" x="648.84033203125" y="930.089685315266"/>
+                  <y:Geometry height="30.0" width="103.267578125" x="616.47705078125" y="997.348876953125"/>
                   <y:Fill color="#FFCC00" transparent="false"/>
                   <y:BorderStyle color="#000000" type="line" width="1.0"/>
-                  <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="93.267578125" x="5.0" xml:space="preserve" y="5.93359375">EndNegotiation<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+                  <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="93.267578125" x="5.0" y="5.93359375">EndNegotiation<y:LabelModel>
+                      <y:SmartNodeLabelModel distance="4.0"/>
+                    </y:LabelModel>
+                    <y:ModelParameter>
+                      <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+                    </y:ModelParameter>
+                  </y:NodeLabel>
                   <y:Shape type="rectangle"/>
                 </y:ShapeNode>
@@ -658,8 +868,14 @@
               <data key="d6">
                 <y:ShapeNode>
-                  <y:Geometry height="30.0" width="53.298828125" x="536.82470703125" y="1015.089685315266"/>
+                  <y:Geometry height="30.0" width="53.298828125" x="504.46142578125" y="1082.348876953125"/>
                   <y:Fill color="#FFCC00" transparent="false"/>
                   <y:BorderStyle color="#000000" type="line" width="1.0"/>
-                  <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="43.298828125" x="5.0" xml:space="preserve" y="5.93359375">Accept<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+                  <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="43.298828125" x="5.0" y="5.93359375">Accept<y:LabelModel>
+                      <y:SmartNodeLabelModel distance="4.0"/>
+                    </y:LabelModel>
+                    <y:ModelParameter>
+                      <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+                    </y:ModelParameter>
+                  </y:NodeLabel>
                   <y:Shape type="rectangle"/>
                 </y:ShapeNode>
@@ -669,8 +885,14 @@
               <data key="d6">
                 <y:ShapeNode>
-                  <y:Geometry height="30.0" width="99.810546875" x="510.56884765625" y="937.089685315266"/>
+                  <y:Geometry height="30.0" width="99.810546875" x="478.20556640625" y="1004.348876953125"/>
                   <y:Fill color="#FFCC00" transparent="false"/>
                   <y:BorderStyle color="#000000" type="line" width="1.0"/>
-                  <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="89.810546875" x="5.0" xml:space="preserve" y="5.93359375">AbstractAction<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+                  <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="89.810546875" x="5.0" y="5.93359375">AbstractAction<y:LabelModel>
+                      <y:SmartNodeLabelModel distance="4.0"/>
+                    </y:LabelModel>
+                    <y:ModelParameter>
+                      <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+                    </y:ModelParameter>
+                  </y:NodeLabel>
                   <y:Shape type="rectangle"/>
                 </y:ShapeNode>
@@ -680,8 +902,14 @@
               <data key="d6">
                 <y:ShapeNode>
-                  <y:Geometry height="30.0" width="55.373046875" x="689.78759765625" y="829.089685315266"/>
+                  <y:Geometry height="30.0" width="55.373046875" x="657.42431640625" y="896.348876953125"/>
                   <y:Fill color="#FFCC00" transparent="false"/>
                   <y:BorderStyle color="#000000" type="line" width="1.0"/>
-                  <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="45.373046875" x="5.0" xml:space="preserve" y="5.93359375">PartyID<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+                  <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="45.373046875" x="5.0" y="5.93359375">PartyID<y:LabelModel>
+                      <y:SmartNodeLabelModel distance="4.0"/>
+                    </y:LabelModel>
+                    <y:ModelParameter>
+                      <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+                    </y:ModelParameter>
+                  </y:NodeLabel>
                   <y:Shape type="rectangle"/>
                 </y:ShapeNode>
@@ -691,13 +919,13 @@
         </node>
         <node id="n5::n1" yfiles.foldertype="group">
-          <data key="d4" xml:space="preserve"/>
+          <data key="d4"/>
           <data key="d6">
             <y:ProxyAutoBoundsNode>
               <y:Realizers active="0">
                 <y:GroupNode>
-                  <y:Geometry height="278.666015625" width="302.7109375" x="154.66845703125" y="812.756677502766"/>
+                  <y:Geometry height="278.666015625" width="302.7109375" x="47.66845703125" y="959.682861328125"/>
                   <y:Fill color="#F5F5F5" transparent="false"/>
                   <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
-                  <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.666015625" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="t" textColor="#000000" verticalTextPosition="bottom" visible="true" width="302.7109375" x="0.0" xml:space="preserve" y="0.0">events</y:NodeLabel>
+                  <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.666015625" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="302.7109375" x="0.0" y="0.0">events</y:NodeLabel>
                   <y:Shape type="roundrectangle"/>
                   <y:State closed="false" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/>
@@ -709,5 +937,5 @@
                   <y:Fill color="#F5F5F5" transparent="false"/>
                   <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
-                  <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.666015625" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="t" textColor="#000000" verticalTextPosition="bottom" visible="true" width="63.75830078125" x="-6.879150390625" xml:space="preserve" y="0.0">Folder 2</y:NodeLabel>
+                  <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.666015625" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="63.75830078125" x="-6.879150390625" y="0.0">Folder 2</y:NodeLabel>
                   <y:Shape type="roundrectangle"/>
                   <y:State closed="true" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/>
@@ -722,8 +950,14 @@
               <data key="d6">
                 <y:ShapeNode>
-                  <y:Geometry height="30.0" width="113.099609375" x="319.56103515625" y="928.422693127766"/>
+                  <y:Geometry height="30.0" width="113.099609375" x="212.56103515625" y="1075.348876953125"/>
                   <y:Fill color="#FFFFFF" transparent="false"/>
                   <y:BorderStyle color="#000000" type="line" width="1.0"/>
-                  <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="103.099609375" x="5.0" xml:space="preserve" y="5.93359375">NegotiationEvent<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+                  <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="103.099609375" x="5.0" y="5.93359375">NegotiationEvent<y:LabelModel>
+                      <y:SmartNodeLabelModel distance="4.0"/>
+                    </y:LabelModel>
+                    <y:ModelParameter>
+                      <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+                    </y:ModelParameter>
+                  </y:NodeLabel>
                   <y:Shape type="rectangle"/>
                 </y:ShapeNode>
@@ -733,8 +967,14 @@
               <data key="d6">
                 <y:ShapeNode>
-                  <y:Geometry height="30.0" width="82.537109375" x="359.84228515625" y="849.422693127766"/>
+                  <y:Geometry height="30.0" width="82.537109375" x="252.84228515625" y="996.348876953125"/>
                   <y:Fill color="#FFCC00" transparent="false"/>
                   <y:BorderStyle color="#000000" type="line" width="1.0"/>
-                  <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="72.537109375" x="5.0" xml:space="preserve" y="5.93359375">ActionEvent<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+                  <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="72.537109375" x="5.0" y="5.93359375">ActionEvent<y:LabelModel>
+                      <y:SmartNodeLabelModel distance="4.0"/>
+                    </y:LabelModel>
+                    <y:ModelParameter>
+                      <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+                    </y:ModelParameter>
+                  </y:NodeLabel>
                   <y:Shape type="rectangle"/>
                 </y:ShapeNode>
@@ -744,8 +984,14 @@
               <data key="d6">
                 <y:ShapeNode>
-                  <y:Geometry height="30.0" width="98.884765625" x="169.66845703125" y="938.422693127766"/>
+                  <y:Geometry height="30.0" width="98.884765625" x="62.66845703125" y="1085.348876953125"/>
                   <y:Fill color="#FFCC00" transparent="false"/>
                   <y:BorderStyle color="#000000" type="line" width="1.0"/>
-                  <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="88.884765625" x="5.0" xml:space="preserve" y="5.93359375">SessionStarted<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+                  <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="88.884765625" x="5.0" y="5.93359375">SessionStarted<y:LabelModel>
+                      <y:SmartNodeLabelModel distance="4.0"/>
+                    </y:LabelModel>
+                    <y:ModelParameter>
+                      <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+                    </y:ModelParameter>
+                  </y:NodeLabel>
                   <y:Shape type="rectangle"/>
                 </y:ShapeNode>
@@ -755,8 +1001,14 @@
               <data key="d6">
                 <y:ShapeNode>
-                  <y:Geometry height="30.0" width="93.412109375" x="316.40478515625" y="1046.422693127766"/>
+                  <y:Geometry height="30.0" width="93.412109375" x="209.40478515625" y="1193.348876953125"/>
                   <y:Fill color="#FFCC00" transparent="false"/>
                   <y:BorderStyle color="#000000" type="line" width="1.0"/>
-                  <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="83.412109375" x="5.0" xml:space="preserve" y="5.93359375">SessionEnded<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+                  <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="83.412109375" x="5.0" y="5.93359375">SessionEnded<y:LabelModel>
+                      <y:SmartNodeLabelModel distance="4.0"/>
+                    </y:LabelModel>
+                    <y:ModelParameter>
+                      <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+                    </y:ModelParameter>
+                  </y:NodeLabel>
                   <y:Shape type="rectangle"/>
                 </y:ShapeNode>
@@ -766,8 +1018,14 @@
               <data key="d6">
                 <y:ShapeNode>
-                  <y:Geometry height="30.0" width="126.4296875" x="208.89599609375" y="852.422693127766"/>
+                  <y:Geometry height="30.0" width="126.4296875" x="101.89599609375" y="999.348876953125"/>
                   <y:Fill color="#FFCC00" transparent="false"/>
                   <y:BorderStyle color="#000000" type="line" width="1.0"/>
-                  <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="116.4296875" x="5.0" xml:space="preserve" y="5.93359375">TournamentStarted<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+                  <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="116.4296875" x="5.0" y="5.93359375">TournamentStarted<y:LabelModel>
+                      <y:SmartNodeLabelModel distance="4.0"/>
+                    </y:LabelModel>
+                    <y:ModelParameter>
+                      <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+                    </y:ModelParameter>
+                  </y:NodeLabel>
                   <y:Shape type="rectangle"/>
                 </y:ShapeNode>
@@ -777,8 +1035,14 @@
               <data key="d6">
                 <y:ShapeNode>
-                  <y:Geometry height="30.0" width="93.095703125" x="242.56298828125" y="992.422693127766"/>
+                  <y:Geometry height="30.0" width="93.095703125" x="135.56298828125" y="1139.348876953125"/>
                   <y:Fill color="#FFFFFF" transparent="false"/>
                   <y:BorderStyle color="#000000" type="line" width="1.0"/>
-                  <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="83.095703125" x="5.0" xml:space="preserve" y="5.93359375">ProtocolEvent<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+                  <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="83.095703125" x="5.0" y="5.93359375">ProtocolEvent<y:LabelModel>
+                      <y:SmartNodeLabelModel distance="4.0"/>
+                    </y:LabelModel>
+                    <y:ModelParameter>
+                      <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+                    </y:ModelParameter>
+                  </y:NodeLabel>
                   <y:Shape type="rectangle"/>
                 </y:ShapeNode>
@@ -787,113 +1051,16 @@
           </graph>
         </node>
-        <node id="n5::n2" yfiles.foldertype="group">
-          <data key="d4" xml:space="preserve"/>
-          <data key="d6">
-            <y:ProxyAutoBoundsNode>
-              <y:Realizers active="0">
-                <y:GroupNode>
-                  <y:Geometry height="274.3256133960185" width="255.8809034887986" x="836.704577143619" y="800.5374793215135"/>
-                  <y:Fill color="#F5F5F5" transparent="false"/>
-                  <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
-                  <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.666015625" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="t" textColor="#000000" verticalTextPosition="bottom" visible="true" width="255.8809034887986" x="0.0" xml:space="preserve" y="0.0">inform</y:NodeLabel>
-                  <y:Shape type="roundrectangle"/>
-                  <y:State closed="false" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/>
-                  <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
-                  <y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/>
-                </y:GroupNode>
-                <y:GroupNode>
-                  <y:Geometry height="50.0" width="50.0" x="1270.75146484375" y="650.24951171875"/>
-                  <y:Fill color="#F5F5F5" transparent="false"/>
-                  <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
-                  <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.666015625" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="t" textColor="#000000" verticalTextPosition="bottom" visible="true" width="63.75830078125" x="-6.879150390625" xml:space="preserve" y="0.0">Folder 1</y:NodeLabel>
-                  <y:Shape type="roundrectangle"/>
-                  <y:State closed="true" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/>
-                  <y:Insets bottom="5" bottomF="5.0" left="5" leftF="5.0" right="5" rightF="5.0" top="5" topF="5.0"/>
-                  <y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/>
-                </y:GroupNode>
-              </y:Realizers>
-            </y:ProxyAutoBoundsNode>
-          </data>
-          <graph edgedefault="directed" id="n5::n2:">
-            <node id="n5::n2::n0">
-              <data key="d6">
-                <y:ShapeNode>
-                  <y:Geometry height="30.0" width="52.80078125" x="918.9868384631493" y="889.1822882595691"/>
-                  <y:Fill color="#FFCC00" transparent="false"/>
-                  <y:BorderStyle color="#000000" type="line" width="1.0"/>
-                  <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="42.80078125" x="5.0" xml:space="preserve" y="5.93359375">Inform<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
-                  <y:Shape type="rectangle"/>
-                </y:ShapeNode>
-              </data>
-            </node>
-            <node id="n5::n2::n1">
-              <data key="d6">
-                <y:ShapeNode>
-                  <y:Geometry height="30.0" width="81.693359375" x="874.1478676689328" y="837.2034949465135"/>
-                  <y:Fill color="#FFCC00" transparent="false"/>
-                  <y:BorderStyle color="#000000" type="line" width="1.0"/>
-                  <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="71.693359375" x="5.0" xml:space="preserve" y="5.93359375">ActionDone<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
-                  <y:Shape type="rectangle"/>
-                </y:ShapeNode>
-              </data>
-            </node>
-            <node id="n5::n2::n2">
-              <data key="d6">
-                <y:ShapeNode>
-                  <y:Geometry height="30.0" width="60.640625" x="1016.9448556324176" y="855.970972776048"/>
-                  <y:Fill color="#FFCC00" transparent="false"/>
-                  <y:BorderStyle color="#000000" type="line" width="1.0"/>
-                  <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="50.640625" x="5.0" xml:space="preserve" y="5.93359375">Settings<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
-                  <y:Shape type="rectangle"/>
-                </y:ShapeNode>
-              </data>
-            </node>
-            <node id="n5::n2::n3">
-              <data key="d6">
-                <y:ShapeNode>
-                  <y:Geometry height="30.0" width="62.62109375" x="950.302233393619" y="959.5226904885506"/>
-                  <y:Fill color="#FFCC00" transparent="false"/>
-                  <y:BorderStyle color="#000000" type="line" width="1.0"/>
-                  <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="52.62109375" x="5.0" xml:space="preserve" y="5.93359375">Finished<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
-                  <y:Shape type="rectangle"/>
-                </y:ShapeNode>
-              </data>
-            </node>
-            <node id="n5::n2::n4">
-              <data key="d6">
-                <y:ShapeNode>
-                  <y:Geometry height="30.0" width="68.59765625" x="851.704577143619" y="959.5226904885506"/>
-                  <y:Fill color="#FFCC00" transparent="false"/>
-                  <y:BorderStyle color="#000000" type="line" width="1.0"/>
-                  <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="58.59765625" x="5.0" xml:space="preserve" y="5.93359375">YourTurn<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
-                  <y:Shape type="rectangle"/>
-                </y:ShapeNode>
-              </data>
-            </node>
-            <node id="n5::n2::n5">
-              <data key="d6">
-                <y:ShapeNode>
-                  <y:Geometry height="30.0" width="83.984375" x="939.620592768619" y="1029.863092717532"/>
-                  <y:Fill color="#FFCC00" transparent="false"/>
-                  <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
-                  <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="73.984375" x="5.0" xml:space="preserve" y="5.93359375">Agreements<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
-                  <y:Shape type="rectangle"/>
-                </y:ShapeNode>
-              </data>
-            </node>
-          </graph>
-        </node>
       </graph>
     </node>
     <node id="n6" yfiles.foldertype="group">
-      <data key="d4" xml:space="preserve"/>
+      <data key="d4"/>
       <data key="d6">
         <y:ProxyAutoBoundsNode>
           <y:Realizers active="0">
             <y:GroupNode>
-              <y:Geometry height="278.666015625" width="142.05859375" x="1370.0791062408841" y="672.0411376953125"/>
+              <y:Geometry height="353.4990234375" width="436.46484375" x="1255.75146484375" y="613.58349609375"/>
               <y:Fill color="#F5F5F5" transparent="false"/>
               <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
-              <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.666015625" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="t" textColor="#000000" verticalTextPosition="bottom" visible="true" width="142.05859375" x="0.0" xml:space="preserve" y="0.0">Party</y:NodeLabel>
+              <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.666015625" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="436.46484375" x="0.0" y="0.0">Party</y:NodeLabel>
               <y:Shape type="roundrectangle"/>
               <y:State closed="false" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/>
@@ -905,5 +1072,5 @@
               <y:Fill color="#F5F5F5" transparent="false"/>
               <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
-              <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.666015625" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="t" textColor="#000000" verticalTextPosition="bottom" visible="true" width="63.75830078125" x="-6.879150390625" xml:space="preserve" y="0.0">Folder 8</y:NodeLabel>
+              <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.666015625" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="63.75830078125" x="-6.879150390625" y="0.0">Folder 8</y:NodeLabel>
               <y:Shape type="roundrectangle"/>
               <y:State closed="true" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/>
@@ -918,8 +1085,14 @@
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="30.0" width="81.828125" x="1385.0791062408841" y="708.7071533203125"/>
-              <y:Fill color="#FFCC00" transparent="false"/>
-              <y:BorderStyle color="#000000" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="71.828125" x="5.0" xml:space="preserve" y="5.93359375">Capabilities<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+              <y:Geometry height="30.0" width="81.828125" x="1565.15771484375" y="725.08251953125"/>
+              <y:Fill color="#FFCC00" transparent="false"/>
+              <y:BorderStyle color="#000000" type="line" width="1.0"/>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="71.828125" x="5.0" y="5.93359375">Capabilities<y:LabelModel>
+                  <y:SmartNodeLabelModel distance="4.0"/>
+                </y:LabelModel>
+                <y:ModelParameter>
+                  <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+                </y:ModelParameter>
+              </y:NodeLabel>
               <y:Shape type="rectangle"/>
             </y:ShapeNode>
@@ -929,11 +1102,17 @@
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="70.53125" width="108.2890625" x="1388.8486374908841" y="776.4415283203125"/>
+              <y:Geometry height="70.53125" width="108.2890625" x="1568.92724609375" y="792.81689453125"/>
               <y:Fill color="#FFFFFF" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="60.53125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="98.2890625" x="5.0" xml:space="preserve" y="5.0">Party
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="60.53125" modelName="custom" textColor="#000000" visible="true" width="98.2890625" x="5.0" y="5.0">Party
 getCapabilities()
 terminate()
-getDescription()<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+getDescription()<y:LabelModel>
+                  <y:SmartNodeLabelModel distance="4.0"/>
+                </y:LabelModel>
+                <y:ModelParameter>
+                  <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+                </y:ModelParameter>
+              </y:NodeLabel>
               <y:Shape type="rectangle"/>
             </y:ShapeNode>
@@ -943,16 +1122,138 @@
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="30.0" width="85.044921875" x="1396.4707078033841" y="905.7071533203125"/>
-              <y:Fill color="#FFCC00" transparent="false"/>
-              <y:BorderStyle color="#000000" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="75.044921875" x="5.0" xml:space="preserve" y="5.93359375">DefaultParty<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
-              <y:Shape type="rectangle"/>
-            </y:ShapeNode>
-          </data>
+              <y:Geometry height="30.0" width="85.044921875" x="1576.54931640625" y="922.08251953125"/>
+              <y:Fill color="#FFCC00" transparent="false"/>
+              <y:BorderStyle color="#000000" type="line" width="1.0"/>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="75.044921875" x="5.0" y="5.93359375">DefaultParty<y:LabelModel>
+                  <y:SmartNodeLabelModel distance="4.0"/>
+                </y:LabelModel>
+                <y:ModelParameter>
+                  <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+                </y:ModelParameter>
+              </y:NodeLabel>
+              <y:Shape type="rectangle"/>
+            </y:ShapeNode>
+          </data>
+        </node>
+        <node id="n6::n3" yfiles.foldertype="group">
+          <data key="d4"/>
+          <data key="d6">
+            <y:ProxyAutoBoundsNode>
+              <y:Realizers active="0">
+                <y:GroupNode>
+                  <y:Geometry height="202.666015625" width="272.1669921875" x="1270.75146484375" y="650.24951171875"/>
+                  <y:Fill color="#F5F5F5" transparent="false"/>
+                  <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
+                  <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.666015625" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="272.1669921875" x="0.0" y="0.0">inform</y:NodeLabel>
+                  <y:Shape type="roundrectangle"/>
+                  <y:State closed="false" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/>
+                  <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
+                  <y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/>
+                </y:GroupNode>
+                <y:GroupNode>
+                  <y:Geometry height="50.0" width="50.0" x="0.0" y="60.0"/>
+                  <y:Fill color="#F5F5F5" transparent="false"/>
+                  <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
+                  <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.666015625" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="63.75830078125" x="-6.879150390625" y="0.0">Folder 1</y:NodeLabel>
+                  <y:Shape type="roundrectangle"/>
+                  <y:State closed="true" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/>
+                  <y:Insets bottom="5" bottomF="5.0" left="5" leftF="5.0" right="5" rightF="5.0" top="5" topF="5.0"/>
+                  <y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/>
+                </y:GroupNode>
+              </y:Realizers>
+            </y:ProxyAutoBoundsNode>
+          </data>
+          <graph edgedefault="directed" id="n6::n3:">
+            <node id="n6::n3::n0">
+              <data key="d6">
+                <y:ShapeNode>
+                  <y:Geometry height="30.0" width="52.80078125" x="1370.67138671875" y="746.91552734375"/>
+                  <y:Fill color="#FFCC00" transparent="false"/>
+                  <y:BorderStyle color="#000000" type="line" width="1.0"/>
+                  <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="42.80078125" x="5.0" y="5.93359375">Inform<y:LabelModel>
+                      <y:SmartNodeLabelModel distance="4.0"/>
+                    </y:LabelModel>
+                    <y:ModelParameter>
+                      <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+                    </y:ModelParameter>
+                  </y:NodeLabel>
+                  <y:Shape type="rectangle"/>
+                </y:ShapeNode>
+              </data>
+            </node>
+            <node id="n6::n3::n1">
+              <data key="d6">
+                <y:ShapeNode>
+                  <y:Geometry height="30.0" width="81.693359375" x="1446.22509765625" y="740.91552734375"/>
+                  <y:Fill color="#FFCC00" transparent="false"/>
+                  <y:BorderStyle color="#000000" type="line" width="1.0"/>
+                  <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="71.693359375" x="5.0" y="5.93359375">ActionDone<y:LabelModel>
+                      <y:SmartNodeLabelModel distance="4.0"/>
+                    </y:LabelModel>
+                    <y:ModelParameter>
+                      <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+                    </y:ModelParameter>
+                  </y:NodeLabel>
+                  <y:Shape type="rectangle"/>
+                </y:ShapeNode>
+              </data>
+            </node>
+            <node id="n6::n3::n2">
+              <data key="d6">
+                <y:ShapeNode>
+                  <y:Geometry height="30.0" width="60.640625" x="1285.75146484375" y="692.91552734375"/>
+                  <y:Fill color="#FFCC00" transparent="false"/>
+                  <y:BorderStyle color="#000000" type="line" width="1.0"/>
+                  <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="50.640625" x="5.0" y="5.93359375">Settings<y:LabelModel>
+                      <y:SmartNodeLabelModel distance="4.0"/>
+                    </y:LabelModel>
+                    <y:ModelParameter>
+                      <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+                    </y:ModelParameter>
+                  </y:NodeLabel>
+                  <y:Shape type="rectangle"/>
+                </y:ShapeNode>
+              </data>
+            </node>
+            <node id="n6::n3::n3">
+              <data key="d6">
+                <y:ShapeNode>
+                  <y:Geometry height="30.0" width="62.62109375" x="1388.76123046875" y="686.91552734375"/>
+                  <y:Fill color="#FFCC00" transparent="false"/>
+                  <y:BorderStyle color="#000000" type="line" width="1.0"/>
+                  <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="52.62109375" x="5.0" y="5.93359375">Finished<y:LabelModel>
+                      <y:SmartNodeLabelModel distance="4.0"/>
+                    </y:LabelModel>
+                    <y:ModelParameter>
+                      <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+                    </y:ModelParameter>
+                  </y:NodeLabel>
+                  <y:Shape type="rectangle"/>
+                </y:ShapeNode>
+              </data>
+            </node>
+            <node id="n6::n3::n4">
+              <data key="d6">
+                <y:ShapeNode>
+                  <y:Geometry height="30.0" width="68.59765625" x="1402.77294921875" y="807.91552734375"/>
+                  <y:Fill color="#FFCC00" transparent="false"/>
+                  <y:BorderStyle color="#000000" type="line" width="1.0"/>
+                  <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="58.59765625" x="5.0" y="5.93359375">YourTurn<y:LabelModel>
+                      <y:SmartNodeLabelModel distance="4.0"/>
+                    </y:LabelModel>
+                    <y:ModelParameter>
+                      <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+                    </y:ModelParameter>
+                  </y:NodeLabel>
+                  <y:Shape type="rectangle"/>
+                </y:ShapeNode>
+              </data>
+            </node>
+          </graph>
         </node>
       </graph>
     </node>
     <node id="n7" yfiles.foldertype="group">
-      <data key="d4" xml:space="preserve"/>
+      <data key="d4"/>
       <data key="d6">
         <y:ProxyAutoBoundsNode>
@@ -962,5 +1263,5 @@
               <y:Fill color="#F5F5F5" transparent="false"/>
               <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
-              <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.666015625" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="t" textColor="#000000" verticalTextPosition="bottom" visible="true" width="395.412109375" x="0.0" xml:space="preserve" y="0.0">Timeline</y:NodeLabel>
+              <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.666015625" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="395.412109375" x="0.0" y="0.0">Timeline</y:NodeLabel>
               <y:Shape type="roundrectangle"/>
               <y:State closed="false" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/>
@@ -972,5 +1273,5 @@
               <y:Fill color="#F5F5F5" transparent="false"/>
               <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
-              <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.666015625" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="t" textColor="#000000" verticalTextPosition="bottom" visible="true" width="73.2431640625" x="-11.62158203125" xml:space="preserve" y="0.0">Folder 11</y:NodeLabel>
+              <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.666015625" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="73.2431640625" x="-11.62158203125" y="0.0">Folder 11</y:NodeLabel>
               <y:Shape type="roundrectangle"/>
               <y:State closed="true" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/>
@@ -988,6 +1289,12 @@
               <y:Fill color="#FFFFFF" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="32.265625" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="112.955078125" x="6.0" xml:space="preserve" y="6.0">Progress(Deadline)
-value()<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.5" labelRatioY="0.5" nodeRatioX="0.5" nodeRatioY="0.5" offsetX="-4.0" offsetY="-4.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="32.265625" modelName="custom" textColor="#000000" visible="true" width="112.955078125" x="6.0" y="6.0">Progress(Deadline)
+value()<y:LabelModel>
+                  <y:SmartNodeLabelModel distance="4.0"/>
+                </y:LabelModel>
+                <y:ModelParameter>
+                  <y:SmartNodeLabelModelParameter labelRatioX="0.5" labelRatioY="0.5" nodeRatioX="0.5" nodeRatioY="0.5" offsetX="-4.0" offsetY="-4.0" upX="0.0" upY="-1.0"/>
+                </y:ModelParameter>
+              </y:NodeLabel>
               <y:Shape type="rectangle"/>
             </y:ShapeNode>
@@ -1000,5 +1307,11 @@
               <y:Fill color="#FFCC00" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="97.75" x="5.0" xml:space="preserve" y="5.93359375">ProgressRounds<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="97.75" x="5.0" y="5.93359375">ProgressRounds<y:LabelModel>
+                  <y:SmartNodeLabelModel distance="4.0"/>
+                </y:LabelModel>
+                <y:ModelParameter>
+                  <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+                </y:ModelParameter>
+              </y:NodeLabel>
               <y:Shape type="rectangle"/>
             </y:ShapeNode>
@@ -1011,5 +1324,11 @@
               <y:Fill color="#FFCC00" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="83.171875" x="5.0" xml:space="preserve" y="5.93359375">ProgressTime<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="83.171875" x="5.0" y="5.93359375">ProgressTime<y:LabelModel>
+                  <y:SmartNodeLabelModel distance="4.0"/>
+                </y:LabelModel>
+                <y:ModelParameter>
+                  <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+                </y:ModelParameter>
+              </y:NodeLabel>
               <y:Shape type="rectangle"/>
             </y:ShapeNode>
@@ -1022,5 +1341,11 @@
               <y:Fill color="#FFFFFF" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="54.923828125" x="5.0" xml:space="preserve" y="5.93359375">Deadline<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="54.923828125" x="5.0" y="5.93359375">Deadline<y:LabelModel>
+                  <y:SmartNodeLabelModel distance="4.0"/>
+                </y:LabelModel>
+                <y:ModelParameter>
+                  <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+                </y:ModelParameter>
+              </y:NodeLabel>
               <y:Shape type="rectangle"/>
             </y:ShapeNode>
@@ -1033,5 +1358,11 @@
               <y:Fill color="#FFCC00" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="83.869140625" x="5.0" xml:space="preserve" y="5.93359375">DeadlineTime<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="83.869140625" x="5.0" y="5.93359375">DeadlineTime<y:LabelModel>
+                  <y:SmartNodeLabelModel distance="4.0"/>
+                </y:LabelModel>
+                <y:ModelParameter>
+                  <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+                </y:ModelParameter>
+              </y:NodeLabel>
               <y:Shape type="rectangle"/>
             </y:ShapeNode>
@@ -1044,5 +1375,11 @@
               <y:Fill color="#FFCC00" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="92.330078125" x="5.0" xml:space="preserve" y="5.93359375">DeadlineRound<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="92.330078125" x="5.0" y="5.93359375">DeadlineRound<y:LabelModel>
+                  <y:SmartNodeLabelModel distance="4.0"/>
+                </y:LabelModel>
+                <y:ModelParameter>
+                  <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+                </y:ModelParameter>
+              </y:NodeLabel>
               <y:Shape type="rectangle"/>
             </y:ShapeNode>
@@ -1052,13 +1389,13 @@
     </node>
     <node id="n8" yfiles.foldertype="group">
-      <data key="d4" xml:space="preserve"/>
+      <data key="d4"/>
       <data key="d6">
         <y:ProxyAutoBoundsNode>
           <y:Realizers active="0">
             <y:GroupNode>
-              <y:Geometry height="536.9638671875" width="428.3330078125" x="1929.3477375088519" y="1281.245228403814"/>
+              <y:Geometry height="536.9638671875" width="428.3330078125" x="1567.20654296875" y="1216.58154296875"/>
               <y:Fill color="#F5F5F5" transparent="false"/>
               <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
-              <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.666015625" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="t" textColor="#000000" verticalTextPosition="bottom" visible="true" width="428.3330078125" x="0.0" xml:space="preserve" y="0.0">BidSpace</y:NodeLabel>
+              <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.666015625" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="428.3330078125" x="0.0" y="0.0">BidSpace</y:NodeLabel>
               <y:Shape type="roundrectangle"/>
               <y:State closed="false" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/>
@@ -1070,5 +1407,5 @@
               <y:Fill color="#F5F5F5" transparent="false"/>
               <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
-              <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.666015625" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="t" textColor="#000000" verticalTextPosition="bottom" visible="true" width="83.2431640625" x="0.0" xml:space="preserve" y="0.0">Folder 12</y:NodeLabel>
+              <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.666015625" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="83.2431640625" x="0.0" y="0.0">Folder 12</y:NodeLabel>
               <y:Shape type="roundrectangle"/>
               <y:State closed="true" closedHeight="31.666015625" closedWidth="83.2431640625" innerGraphDisplayEnabled="false"/>
@@ -1083,13 +1420,19 @@
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="98.796875" width="130.935546875" x="2211.745198446352" y="1393.712025278814"/>
+              <y:Geometry height="98.796875" width="130.935546875" x="1849.60400390625" y="1329.04833984375"/>
               <y:Fill color="#FFFFFF" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="88.796875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="120.935546875" x="5.0" xml:space="preserve" y="5.0">BidSpace
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="88.796875" modelName="custom" textColor="#000000" visible="true" width="120.935546875" x="5.0" y="5.0">BidSpace
 
 pareto())
 nashPoint()
 kalaiPoint()
-socialWelfarePoinit()<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+socialWelfarePoinit()<y:LabelModel>
+                  <y:SmartNodeLabelModel distance="4.0"/>
+                </y:LabelModel>
+                <y:ModelParameter>
+                  <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+                </y:ModelParameter>
+              </y:NodeLabel>
               <y:Shape type="rectangle"/>
             </y:ShapeNode>
@@ -1099,8 +1442,14 @@
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="30.0" width="112.54296875" x="2194.941487508852" y="1547.110462778814"/>
-              <y:Fill color="#FFCC00" transparent="false"/>
-              <y:BorderStyle color="#000000" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="102.54296875" x="5.0" xml:space="preserve" y="5.93359375">BidspaceDiscrete<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+              <y:Geometry height="30.0" width="112.54296875" x="1832.80029296875" y="1482.44677734375"/>
+              <y:Fill color="#FFCC00" transparent="false"/>
+              <y:BorderStyle color="#000000" type="line" width="1.0"/>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="102.54296875" x="5.0" y="5.93359375">BidspaceDiscrete<y:LabelModel>
+                  <y:SmartNodeLabelModel distance="4.0"/>
+                </y:LabelModel>
+                <y:ModelParameter>
+                  <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+                </y:ModelParameter>
+              </y:NodeLabel>
               <y:Shape type="rectangle"/>
             </y:ShapeNode>
@@ -1110,10 +1459,16 @@
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="56.3984375" width="112.6484375" x="2023.8887531338519" y="1317.911244028814"/>
+              <y:Geometry height="56.3984375" width="112.6484375" x="1661.74755859375" y="1253.24755859375"/>
               <y:Fill color="#FFFFFF" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="46.3984375" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="102.6484375" x="5.0" xml:space="preserve" y="5.0">OpponentModel
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="46.3984375" modelName="custom" textColor="#000000" visible="true" width="102.6484375" x="5.0" y="5.0">OpponentModel
 
-receiveMessage()<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+receiveMessage()<y:LabelModel>
+                  <y:SmartNodeLabelModel distance="4.0"/>
+                </y:LabelModel>
+                <y:ModelParameter>
+                  <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+                </y:ModelParameter>
+              </y:NodeLabel>
               <y:Shape type="rectangle"/>
             </y:ShapeNode>
@@ -1123,8 +1478,14 @@
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="30.0" width="166.859375" x="1954.7832843838519" y="1440.110462778814"/>
-              <y:Fill color="#FFCC00" transparent="false"/>
-              <y:BorderStyle color="#000000" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="156.859375" x="5.0" xml:space="preserve" y="5.93359375">FrequencyOpponentModel<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+              <y:Geometry height="30.0" width="166.859375" x="1592.64208984375" y="1375.44677734375"/>
+              <y:Fill color="#FFCC00" transparent="false"/>
+              <y:BorderStyle color="#000000" type="line" width="1.0"/>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="156.859375" x="5.0" y="5.93359375">FrequencyOpponentModel<y:LabelModel>
+                  <y:SmartNodeLabelModel distance="4.0"/>
+                </y:LabelModel>
+                <y:ModelParameter>
+                  <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+                </y:ModelParameter>
+              </y:NodeLabel>
               <y:Shape type="rectangle"/>
             </y:ShapeNode>
@@ -1134,10 +1495,16 @@
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="56.3984375" width="73.73046875" x="1944.3477375088519" y="1558.911244028814"/>
-              <y:Fill color="#FFCC00" transparent="false"/>
-              <y:BorderStyle color="#000000" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="46.3984375" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="63.73046875" x="5.0" xml:space="preserve" y="5.0">AllBidsList
+              <y:Geometry height="56.3984375" width="73.73046875" x="1582.20654296875" y="1494.24755859375"/>
+              <y:Fill color="#FFCC00" transparent="false"/>
+              <y:BorderStyle color="#000000" type="line" width="1.0"/>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="46.3984375" modelName="custom" textColor="#000000" visible="true" width="63.73046875" x="5.0" y="5.0">AllBidsList
 get(n)
-size()<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+size()<y:LabelModel>
+                  <y:SmartNodeLabelModel distance="4.0"/>
+                </y:LabelModel>
+                <y:ModelParameter>
+                  <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+                </y:ModelParameter>
+              </y:NodeLabel>
               <y:Shape type="rectangle"/>
             </y:ShapeNode>
@@ -1145,13 +1512,13 @@
         </node>
         <node id="n8::n5" yfiles.foldertype="group">
-          <data key="d4" xml:space="preserve"/>
+          <data key="d4"/>
           <data key="d6">
             <y:ProxyAutoBoundsNode>
               <y:Realizers active="0">
                 <y:GroupNode>
-                  <y:Geometry height="201.931640625" width="244.580078125" x="2040.8477375088519" y="1601.277454966314"/>
+                  <y:Geometry height="201.931640625" width="244.580078125" x="1678.70654296875" y="1536.61376953125"/>
                   <y:Fill color="#F5F5F5" transparent="false"/>
                   <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
-                  <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.666015625" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="t" textColor="#000000" verticalTextPosition="bottom" visible="true" width="244.580078125" x="0.0" xml:space="preserve" y="0.0">pareto</y:NodeLabel>
+                  <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.666015625" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="244.580078125" x="0.0" y="0.0">pareto</y:NodeLabel>
                   <y:Shape type="roundrectangle"/>
                   <y:State closed="false" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/>
@@ -1163,5 +1530,5 @@
                   <y:Fill color="#F5F5F5" transparent="false"/>
                   <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
-                  <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.666015625" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="t" textColor="#000000" verticalTextPosition="bottom" visible="true" width="63.75830078125" x="-6.879150390625" xml:space="preserve" y="0.0">Folder 1</y:NodeLabel>
+                  <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.666015625" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="63.75830078125" x="-6.879150390625" y="0.0">Folder 1</y:NodeLabel>
                   <y:Shape type="roundrectangle"/>
                   <y:State closed="true" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/>
@@ -1176,11 +1543,17 @@
               <data key="d6">
                 <y:ShapeNode>
-                  <y:Geometry height="70.53125" width="96.4296875" x="2173.998128133852" y="1717.677845591314"/>
+                  <y:Geometry height="70.53125" width="96.4296875" x="1811.85693359375" y="1653.01416015625"/>
                   <y:Fill color="#FFFFFF" transparent="false"/>
                   <y:BorderStyle color="#000000" type="line" width="1.0"/>
-                  <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="60.53125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="86.4296875" x="5.0" xml:space="preserve" y="5.0">ParetoFrontier
+                  <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="60.53125" modelName="custom" textColor="#000000" visible="true" width="86.4296875" x="5.0" y="5.0">ParetoFrontier
 
 getProfiles()
-getPoints()<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+getPoints()<y:LabelModel>
+                      <y:SmartNodeLabelModel distance="4.0"/>
+                    </y:LabelModel>
+                    <y:ModelParameter>
+                      <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+                    </y:ModelParameter>
+                  </y:NodeLabel>
                   <y:Shape type="rectangle"/>
                 </y:ShapeNode>
@@ -1190,9 +1563,15 @@
               <data key="d6">
                 <y:ShapeNode>
-                  <y:Geometry height="30.0" width="133.958984375" x="2068.233479696352" y="1637.943470591314"/>
+                  <y:Geometry height="30.0" width="133.958984375" x="1706.09228515625" y="1573.27978515625"/>
                   <y:Fill color="#FFCC00" transparent="false"/>
                   <y:BorderStyle color="#000000" type="line" width="1.0"/>
-                  <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="123.958984375" x="5.0" xml:space="preserve" y="5.93359375">ParetoLinearAdditive
-<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+                  <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="123.958984375" x="5.0" y="5.93359375">ParetoLinearAdditive
+<y:LabelModel>
+                      <y:SmartNodeLabelModel distance="4.0"/>
+                    </y:LabelModel>
+                    <y:ModelParameter>
+                      <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+                    </y:ModelParameter>
+                  </y:NodeLabel>
                   <y:Shape type="rectangle"/>
                 </y:ShapeNode>
@@ -1202,8 +1581,14 @@
               <data key="d6">
                 <y:ShapeNode>
-                  <y:Geometry height="30.0" width="94.73046875" x="2055.847737508852" y="1745.943470591314"/>
+                  <y:Geometry height="30.0" width="94.73046875" x="1693.70654296875" y="1681.27978515625"/>
                   <y:Fill color="#FFCC00" transparent="false"/>
                   <y:BorderStyle color="#000000" type="line" width="1.0"/>
-                  <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="84.73046875" x="5.0" xml:space="preserve" y="5.93359375">GenericPareto<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+                  <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="84.73046875" x="5.0" y="5.93359375">GenericPareto<y:LabelModel>
+                      <y:SmartNodeLabelModel distance="4.0"/>
+                    </y:LabelModel>
+                    <y:ModelParameter>
+                      <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+                    </y:ModelParameter>
+                  </y:NodeLabel>
                   <y:Shape type="rectangle"/>
                 </y:ShapeNode>
@@ -1215,13 +1600,13 @@
     </node>
     <node id="n9" yfiles.foldertype="group">
-      <data key="d4" xml:space="preserve"/>
+      <data key="d4"/>
       <data key="d6">
         <y:ProxyAutoBoundsNode>
           <y:Realizers active="0">
             <y:GroupNode>
-              <y:Geometry height="122.197265625" width="154.396484375" x="1659.7027610197479" y="750.6085205078125"/>
+              <y:Geometry height="122.197265625" width="154.396484375" x="1409.87353515625" y="1044.151611328125"/>
               <y:Fill color="#F5F5F5" transparent="false"/>
               <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
-              <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.666015625" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="t" textColor="#000000" verticalTextPosition="bottom" visible="true" width="154.396484375" x="0.0" xml:space="preserve" y="0.0">exampleparties</y:NodeLabel>
+              <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.666015625" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="154.396484375" x="0.0" y="0.0">exampleparties</y:NodeLabel>
               <y:Shape type="roundrectangle"/>
               <y:State closed="false" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/>
@@ -1233,5 +1618,5 @@
               <y:Fill color="#F5F5F5" transparent="false"/>
               <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
-              <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.666015625" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="t" textColor="#000000" verticalTextPosition="bottom" visible="true" width="73.2431640625" x="-11.62158203125" xml:space="preserve" y="0.0">Folder 13</y:NodeLabel>
+              <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.666015625" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="73.2431640625" x="-11.62158203125" y="0.0">Folder 13</y:NodeLabel>
               <y:Shape type="roundrectangle"/>
               <y:State closed="true" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/>
@@ -1246,11 +1631,17 @@
           <data key="d6">
             <y:ShapeNode>
-              <y:Geometry height="70.53125" width="124.396484375" x="1674.7027610197479" y="787.2745361328125"/>
-              <y:Fill color="#FFCC00" transparent="false"/>
-              <y:BorderStyle color="#000000" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="60.53125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="114.396484375" x="5.0" xml:space="preserve" y="5.0">Concrete agent, 
+              <y:Geometry height="70.53125" width="124.396484375" x="1424.87353515625" y="1080.817626953125"/>
+              <y:Fill color="#FFCC00" transparent="false"/>
+              <y:BorderStyle color="#000000" type="line" width="1.0"/>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="60.53125" modelName="custom" textColor="#000000" visible="true" width="114.396484375" x="5.0" y="5.0">Concrete agent, 
 eg niceParty, 
 nastyParty,
-Boulware, Bayesian<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+Boulware, Bayesian<y:LabelModel>
+                  <y:SmartNodeLabelModel distance="4.0"/>
+                </y:LabelModel>
+                <y:ModelParameter>
+                  <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+                </y:ModelParameter>
+              </y:NodeLabel>
               <y:Shape type="rectangle"/>
             </y:ShapeNode>
@@ -1260,13 +1651,13 @@
     </node>
     <node id="n10" yfiles.foldertype="group">
-      <data key="d4" xml:space="preserve"/>
+      <data key="d4"/>
       <data key="d6">
         <y:ProxyAutoBoundsNode>
           <y:Realizers active="0">
             <y:GroupNode>
-              <y:Geometry height="370.666015625" width="512.8612738715274" x="734.3403862847226" y="0.0"/>
+              <y:Geometry height="370.666015625" width="495.859375" x="739.58447265625" y="0.0"/>
               <y:Fill color="#F5F5F5" transparent="false"/>
               <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
-              <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.666015625" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="t" textColor="#000000" verticalTextPosition="bottom" visible="true" width="512.8612738715274" x="0.0" xml:space="preserve" y="0.0">protocol</y:NodeLabel>
+              <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.666015625" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="495.859375" x="0.0" y="0.0">protocol</y:NodeLabel>
               <y:Shape type="roundrectangle"/>
               <y:State closed="false" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/>
@@ -1275,8 +1666,8 @@
             </y:GroupNode>
             <y:GroupNode>
-              <y:Geometry height="50.0" width="50.0" x="739.58447265625" y="0.0"/>
+              <y:Geometry height="50.0" width="50.0" x="373.32568359375" y="2196.0"/>
               <y:Fill color="#F5F5F5" transparent="false"/>
               <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
-              <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.666015625" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="t" textColor="#000000" verticalTextPosition="bottom" visible="true" width="73.2431640625" x="-11.62158203125" xml:space="preserve" y="0.0">Folder 14</y:NodeLabel>
+              <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.666015625" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="73.2431640625" x="-11.62158203125" y="0.0">Folder 14</y:NodeLabel>
               <y:Shape type="roundrectangle"/>
               <y:State closed="true" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/>
@@ -1294,5 +1685,11 @@
               <y:Fill color="#FFFFFF" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="76.421875" x="5.0" xml:space="preserve" y="5.93359375">SessionState<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="76.421875" x="5.0" y="5.93359375">SessionState<y:LabelModel>
+                  <y:SmartNodeLabelModel distance="4.0"/>
+                </y:LabelModel>
+                <y:ModelParameter>
+                  <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+                </y:ModelParameter>
+              </y:NodeLabel>
               <y:Shape type="rectangle"/>
             </y:ShapeNode>
@@ -1305,6 +1702,12 @@
               <y:Fill color="#FFFFFF" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="32.265625" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="94.310546875" x="5.0" xml:space="preserve" y="5.0">SessionSettings
-getProtocol()<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="32.265625" modelName="custom" textColor="#000000" visible="true" width="94.310546875" x="5.0" y="5.0">SessionSettings
+getProtocol()<y:LabelModel>
+                  <y:SmartNodeLabelModel distance="4.0"/>
+                </y:LabelModel>
+                <y:ModelParameter>
+                  <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+                </y:ModelParameter>
+              </y:NodeLabel>
               <y:Shape type="rectangle"/>
             </y:ShapeNode>
@@ -1317,5 +1720,11 @@
               <y:Fill color="#FFFFFF" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="95.4296875" x="5.0" xml:space="preserve" y="5.93359375">SessionProtocol<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="95.4296875" x="5.0" y="5.93359375">SessionProtocol<y:LabelModel>
+                  <y:SmartNodeLabelModel distance="4.0"/>
+                </y:LabelModel>
+                <y:ModelParameter>
+                  <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+                </y:ModelParameter>
+              </y:NodeLabel>
               <y:Shape type="rectangle"/>
             </y:ShapeNode>
@@ -1328,5 +1737,11 @@
               <y:Fill color="#FFCC00" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="81.337890625" x="5.0" xml:space="preserve" y="5.93359375">SAOPSettings<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="81.337890625" x="5.0" y="5.93359375">SAOPSettings<y:LabelModel>
+                  <y:SmartNodeLabelModel distance="4.0"/>
+                </y:LabelModel>
+                <y:ModelParameter>
+                  <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+                </y:ModelParameter>
+              </y:NodeLabel>
               <y:Shape type="rectangle"/>
             </y:ShapeNode>
@@ -1339,5 +1754,11 @@
               <y:Fill color="#FFCC00" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="63.44921875" x="5.0" xml:space="preserve" y="5.93359375">SAOPState<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="63.44921875" x="5.0" y="5.93359375">SAOPState<y:LabelModel>
+                  <y:SmartNodeLabelModel distance="4.0"/>
+                </y:LabelModel>
+                <y:ModelParameter>
+                  <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+                </y:ModelParameter>
+              </y:NodeLabel>
               <y:Shape type="rectangle"/>
             </y:ShapeNode>
@@ -1350,5 +1771,11 @@
               <y:Fill color="#FFCC00" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="34.697265625" x="5.0" xml:space="preserve" y="5.93359375">SAOP<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="34.697265625" x="5.0" y="5.93359375">SAOP<y:LabelModel>
+                  <y:SmartNodeLabelModel distance="4.0"/>
+                </y:LabelModel>
+                <y:ModelParameter>
+                  <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+                </y:ModelParameter>
+              </y:NodeLabel>
               <y:Shape type="rectangle"/>
             </y:ShapeNode>
@@ -1361,5 +1788,11 @@
               <y:Fill color="#FFFFFF" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="122.974609375" x="5.0" xml:space="preserve" y="5.93359375">TournamentProtocol<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="122.974609375" x="5.0" y="5.93359375">TournamentProtocol<y:LabelModel>
+                  <y:SmartNodeLabelModel distance="4.0"/>
+                </y:LabelModel>
+                <y:ModelParameter>
+                  <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+                </y:ModelParameter>
+              </y:NodeLabel>
               <y:Shape type="rectangle"/>
             </y:ShapeNode>
@@ -1372,5 +1805,11 @@
               <y:Fill color="#FFFFFF" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="103.966796875" x="5.0" xml:space="preserve" y="5.93359375">TournamentState<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="103.966796875" x="5.0" y="5.93359375">TournamentState<y:LabelModel>
+                  <y:SmartNodeLabelModel distance="4.0"/>
+                </y:LabelModel>
+                <y:ModelParameter>
+                  <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+                </y:ModelParameter>
+              </y:NodeLabel>
               <y:Shape type="rectangle"/>
             </y:ShapeNode>
@@ -1383,5 +1822,11 @@
               <y:Fill color="#FFFFFF" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="121.85546875" x="5.0" xml:space="preserve" y="5.93359375">TournamentSettings<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="121.85546875" x="5.0" y="5.93359375">TournamentSettings<y:LabelModel>
+                  <y:SmartNodeLabelModel distance="4.0"/>
+                </y:LabelModel>
+                <y:ModelParameter>
+                  <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+                </y:ModelParameter>
+              </y:NodeLabel>
               <y:Shape type="rectangle"/>
             </y:ShapeNode>
@@ -1394,5 +1839,11 @@
               <y:Fill color="#FFCC00" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="142.744140625" x="5.0" xml:space="preserve" y="5.93359375">AllPermutationsSettings<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="142.744140625" x="5.0" y="5.93359375">AllPermutationsSettings<y:LabelModel>
+                  <y:SmartNodeLabelModel distance="4.0"/>
+                </y:LabelModel>
+                <y:ModelParameter>
+                  <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+                </y:ModelParameter>
+              </y:NodeLabel>
               <y:Shape type="rectangle"/>
             </y:ShapeNode>
@@ -1405,5 +1856,11 @@
               <y:Fill color="#FFCC00" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="124.85546875" x="5.0" xml:space="preserve" y="5.93359375">AllPermutationsState<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="124.85546875" x="5.0" y="5.93359375">AllPermutationsState<y:LabelModel>
+                  <y:SmartNodeLabelModel distance="4.0"/>
+                </y:LabelModel>
+                <y:ModelParameter>
+                  <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+                </y:ModelParameter>
+              </y:NodeLabel>
               <y:Shape type="rectangle"/>
             </y:ShapeNode>
@@ -1416,51 +1873,11 @@
               <y:Fill color="#FFCC00" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="143.86328125" x="5.0" xml:space="preserve" y="5.93359375">AllPermutationsProtocol<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
-              <y:Shape type="rectangle"/>
-            </y:ShapeNode>
-          </data>
-        </node>
-        <node id="n10::n12">
-          <data key="d6">
-            <y:ShapeNode>
-              <y:Geometry height="30.0" width="48.5703125" x="1165.71484375" y="158.666015625"/>
-              <y:Fill color="#FFCC00" transparent="false"/>
-              <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="38.5703125" x="5.0" xml:space="preserve" y="5.93359375">AMOP<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
-              <y:Shape type="rectangle"/>
-            </y:ShapeNode>
-          </data>
-        </node>
-        <node id="n10::n13">
-          <data key="d6">
-            <y:ShapeNode>
-              <y:Geometry height="30.0" width="53.515625" x="1178.68603515625" y="98.666015625"/>
-              <y:Fill color="#FFCC00" transparent="false"/>
-              <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="43.515625" x="5.0" xml:space="preserve" y="5.93359375">SHAOP<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
-              <y:Shape type="rectangle"/>
-            </y:ShapeNode>
-          </data>
-        </node>
-        <node id="n10::n14">
-          <data key="d5"/>
-          <data key="d6">
-            <y:ShapeNode>
-              <y:Geometry height="30.0" width="56.873046875" x="1115.63525390625" y="63.666015625"/>
-              <y:Fill color="#FFCC00" transparent="false"/>
-              <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="46.873046875" x="5.0" xml:space="preserve" y="5.93359375">MOPAC<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
-              <y:Shape type="rectangle"/>
-            </y:ShapeNode>
-          </data>
-        </node>
-        <node id="n10::n15">
-          <data key="d5"/>
-          <data key="d6">
-            <y:ShapeNode>
-              <y:Geometry height="30.0" width="103.513671875" x="749.3403862847226" y="325.666015625"/>
-              <y:Fill color="#FFCC00" transparent="false"/>
-              <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="93.513671875" x="5.0" xml:space="preserve" y="5.93359375">MOPACSettings<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="143.86328125" x="5.0" y="5.93359375">AllPermutationsProtocol<y:LabelModel>
+                  <y:SmartNodeLabelModel distance="4.0"/>
+                </y:LabelModel>
+                <y:ModelParameter>
+                  <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+                </y:ModelParameter>
+              </y:NodeLabel>
               <y:Shape type="rectangle"/>
             </y:ShapeNode>
@@ -1470,5 +1887,5 @@
     </node>
     <node id="n11" yfiles.foldertype="group">
-      <data key="d4" xml:space="preserve"/>
+      <data key="d4"/>
       <data key="d6">
         <y:ProxyAutoBoundsNode>
@@ -1478,5 +1895,5 @@
               <y:Fill color="#F5F5F5" transparent="false"/>
               <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
-              <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.666015625" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="t" textColor="#000000" verticalTextPosition="bottom" visible="true" width="392.919921875" x="0.0" xml:space="preserve" y="0.0">references</y:NodeLabel>
+              <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.666015625" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="392.919921875" x="0.0" y="0.0">references</y:NodeLabel>
               <y:Shape type="roundrectangle"/>
               <y:State closed="false" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/>
@@ -1488,5 +1905,5 @@
               <y:Fill color="#F5F5F5" transparent="false"/>
               <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
-              <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.666015625" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="t" textColor="#000000" verticalTextPosition="bottom" visible="true" width="73.2431640625" x="-11.62158203125" xml:space="preserve" y="0.0">Folder 15</y:NodeLabel>
+              <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.666015625" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="73.2431640625" x="-11.62158203125" y="0.0">Folder 15</y:NodeLabel>
               <y:Shape type="roundrectangle"/>
               <y:State closed="true" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/>
@@ -1504,5 +1921,11 @@
               <y:Fill color="#FFCC00" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="51.61328125" x="5.0" xml:space="preserve" y="5.93359375">PartyRef<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="51.61328125" x="5.0" y="5.93359375">PartyRef<y:LabelModel>
+                  <y:SmartNodeLabelModel distance="4.0"/>
+                </y:LabelModel>
+                <y:ModelParameter>
+                  <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+                </y:ModelParameter>
+              </y:NodeLabel>
               <y:Shape type="rectangle"/>
             </y:ShapeNode>
@@ -1515,5 +1938,11 @@
               <y:Fill color="#FFFFFF" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="61.24609375" x="5.0" xml:space="preserve" y="5.93359375">Reference<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="61.24609375" x="5.0" y="5.93359375">Reference<y:LabelModel>
+                  <y:SmartNodeLabelModel distance="4.0"/>
+                </y:LabelModel>
+                <y:ModelParameter>
+                  <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+                </y:ModelParameter>
+              </y:NodeLabel>
               <y:Shape type="rectangle"/>
             </y:ShapeNode>
@@ -1526,5 +1955,11 @@
               <y:Fill color="#FFCC00" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="59.634765625" x="5.0" xml:space="preserve" y="5.93359375">ProfileRef<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="59.634765625" x="5.0" y="5.93359375">ProfileRef<y:LabelModel>
+                  <y:SmartNodeLabelModel distance="4.0"/>
+                </y:LabelModel>
+                <y:ModelParameter>
+                  <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+                </y:ModelParameter>
+              </y:NodeLabel>
               <y:Shape type="rectangle"/>
             </y:ShapeNode>
@@ -1537,5 +1972,11 @@
               <y:Fill color="#FFCC00" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="70.4453125" x="5.0" xml:space="preserve" y="5.93359375">ProtocolRef<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="70.4453125" x="5.0" y="5.93359375">ProtocolRef<y:LabelModel>
+                  <y:SmartNodeLabelModel distance="4.0"/>
+                </y:LabelModel>
+                <y:ModelParameter>
+                  <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+                </y:ModelParameter>
+              </y:NodeLabel>
               <y:Shape type="rectangle"/>
             </y:ShapeNode>
@@ -1548,5 +1989,11 @@
               <y:Fill color="#FFCC00" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="95.546875" x="5.0" xml:space="preserve" y="5.93359375">PartyWithProfile<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="95.546875" x="5.0" y="5.93359375">PartyWithProfile<y:LabelModel>
+                  <y:SmartNodeLabelModel distance="4.0"/>
+                </y:LabelModel>
+                <y:ModelParameter>
+                  <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+                </y:ModelParameter>
+              </y:NodeLabel>
               <y:Shape type="rectangle"/>
             </y:ShapeNode>
@@ -1559,5 +2006,11 @@
               <y:Fill color="#FFFFFF" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="70.17578125" x="5.0" xml:space="preserve" y="5.93359375">Connection<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="70.17578125" x="5.0" y="5.93359375">Connection<y:LabelModel>
+                  <y:SmartNodeLabelModel distance="4.0"/>
+                </y:LabelModel>
+                <y:ModelParameter>
+                  <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+                </y:ModelParameter>
+              </y:NodeLabel>
               <y:Shape type="rectangle"/>
             </y:ShapeNode>
@@ -1570,5 +2023,11 @@
               <y:Fill color="#FFFFFF" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="76.22265625" x="5.0" xml:space="preserve" y="5.93359375">Connectable<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="76.22265625" x="5.0" y="5.93359375">Connectable<y:LabelModel>
+                  <y:SmartNodeLabelModel distance="4.0"/>
+                </y:LabelModel>
+                <y:ModelParameter>
+                  <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+                </y:ModelParameter>
+              </y:NodeLabel>
               <y:Shape type="rectangle"/>
             </y:ShapeNode>
@@ -1581,5 +2040,11 @@
               <y:Fill color="#FFCC00" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="112.421875" x="5.0" xml:space="preserve" y="5.93359375">ConnectionFactory<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="112.421875" x="5.0" y="5.93359375">ConnectionFactory<y:LabelModel>
+                  <y:SmartNodeLabelModel distance="4.0"/>
+                </y:LabelModel>
+                <y:ModelParameter>
+                  <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+                </y:ModelParameter>
+              </y:NodeLabel>
               <y:Shape type="rectangle"/>
             </y:ShapeNode>
@@ -1592,5 +2057,11 @@
               <y:Fill color="#FFCC00" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="112.29296875" x="5.0" xml:space="preserve" y="5.93359375">DefaultConnection<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="112.29296875" x="5.0" y="5.93359375">DefaultConnection<y:LabelModel>
+                  <y:SmartNodeLabelModel distance="4.0"/>
+                </y:LabelModel>
+                <y:ModelParameter>
+                  <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+                </y:ModelParameter>
+              </y:NodeLabel>
               <y:Shape type="rectangle"/>
             </y:ShapeNode>
@@ -1603,226 +2074,11 @@
               <y:Fill color="#FFCC00" transparent="false"/>
               <y:BorderStyle color="#000000" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="67.791015625" x="5.0" xml:space="preserve" y="7.8671875">DomainRef<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.5" nodeRatioX="0.0" nodeRatioY="0.5" offsetX="0.0" offsetY="-4.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
-              <y:Shape type="rectangle"/>
-            </y:ShapeNode>
-          </data>
-        </node>
-      </graph>
-    </node>
-    <node id="n12" yfiles.foldertype="group">
-      <data key="d4" xml:space="preserve"/>
-      <data key="d6">
-        <y:ProxyAutoBoundsNode>
-          <y:Realizers active="0">
-            <y:GroupNode>
-              <y:Geometry height="207.71583568762117" width="238.34302662036998" x="1641.0996070845629" y="521.7793502225957"/>
-              <y:Fill color="#F5F5F5" transparent="false"/>
-              <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
-              <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.666015625" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="t" textColor="#000000" verticalTextPosition="bottom" visible="true" width="238.34302662036998" x="0.0" xml:space="preserve" y="0.0">opponentmodel</y:NodeLabel>
-              <y:Shape type="roundrectangle"/>
-              <y:State closed="false" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/>
-              <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
-              <y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/>
-            </y:GroupNode>
-            <y:GroupNode>
-              <y:Geometry height="50.0" width="50.0" x="0.0" y="60.0"/>
-              <y:Fill color="#F5F5F5" transparent="false"/>
-              <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
-              <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.666015625" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="t" textColor="#000000" verticalTextPosition="bottom" visible="true" width="73.2431640625" x="-11.62158203125" xml:space="preserve" y="0.0">Folder 17</y:NodeLabel>
-              <y:Shape type="roundrectangle"/>
-              <y:State closed="true" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/>
-              <y:Insets bottom="5" bottomF="5.0" left="5" leftF="5.0" right="5" rightF="5.0" top="5" topF="5.0"/>
-              <y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/>
-            </y:GroupNode>
-          </y:Realizers>
-        </y:ProxyAutoBoundsNode>
-      </data>
-      <graph edgedefault="directed" id="n12:">
-        <node id="n12::n0">
-          <data key="d6">
-            <y:ShapeNode>
-              <y:Geometry height="30.0" width="107.28125" x="1656.0996070845629" y="558.4453658475957"/>
-              <y:Fill color="#FFCC00" transparent="false"/>
-              <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="97.28125" x="5.0" xml:space="preserve" y="5.93359375">OpponentModel<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
-              <y:Shape type="rectangle"/>
-            </y:ShapeNode>
-          </data>
-        </node>
-        <node id="n12::n1">
-          <data key="d6">
-            <y:ShapeNode>
-              <y:Geometry height="30.0" width="166.859375" x="1697.5832587049329" y="684.4951859102168"/>
-              <y:Fill color="#FFCC00" transparent="false"/>
-              <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="156.859375" x="5.0" xml:space="preserve" y="5.93359375">FrequencyOpponentModel<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
-              <y:Shape type="rectangle"/>
-            </y:ShapeNode>
-          </data>
-        </node>
-      </graph>
-    </node>
-    <node id="n13" yfiles.foldertype="group">
-      <data key="d4" xml:space="preserve"/>
-      <data key="d6">
-        <y:ProxyAutoBoundsNode>
-          <y:Realizers active="0">
-            <y:GroupNode>
-              <y:Geometry height="411.72956655092594" width="365.58818634259205" x="1991.3868000088519" y="759.2886876446762"/>
-              <y:Fill color="#F5F5F5" transparent="false"/>
-              <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
-              <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.666015625" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="t" textColor="#000000" verticalTextPosition="bottom" visible="true" width="365.58818634259205" x="0.0" xml:space="preserve" y="0.0">boa</y:NodeLabel>
-              <y:Shape type="roundrectangle"/>
-              <y:State closed="false" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/>
-              <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
-              <y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/>
-            </y:GroupNode>
-            <y:GroupNode>
-              <y:Geometry height="50.0" width="50.0" x="0.0" y="60.0"/>
-              <y:Fill color="#F5F5F5" transparent="false"/>
-              <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
-              <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.666015625" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="t" textColor="#000000" verticalTextPosition="bottom" visible="true" width="73.2431640625" x="-11.62158203125" xml:space="preserve" y="0.0">Folder 18</y:NodeLabel>
-              <y:Shape type="roundrectangle"/>
-              <y:State closed="true" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/>
-              <y:Insets bottom="5" bottomF="5.0" left="5" leftF="5.0" right="5" rightF="5.0" top="5" topF="5.0"/>
-              <y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/>
-            </y:GroupNode>
-          </y:Realizers>
-        </y:ProxyAutoBoundsNode>
-      </data>
-      <graph edgedefault="directed" id="n13:">
-        <node id="n13::n0">
-          <data key="d6">
-            <y:ShapeNode>
-              <y:Geometry height="30.0" width="63.828125" x="2101.1131747195" y="795.9547032696762"/>
-              <y:Fill color="#FFCC00" transparent="false"/>
-              <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="53.828125" x="5.0" xml:space="preserve" y="5.93359375">BoaParty<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
-              <y:Shape type="rectangle"/>
-            </y:ShapeNode>
-          </data>
-        </node>
-        <node id="n13::n1">
-          <data key="d6">
-            <y:ShapeNode>
-              <y:Geometry height="30.0" width="127.619140625" x="2048.433540749593" y="1016.6557407407408"/>
-              <y:Fill color="#FFCC00" transparent="false"/>
-              <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="117.619140625" x="5.0" xml:space="preserve" y="5.93359375">AcceptanceStrategy<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
-              <y:Shape type="rectangle"/>
-            </y:ShapeNode>
-          </data>
-        </node>
-        <node id="n13::n2">
-          <data key="d6">
-            <y:ShapeNode>
-              <y:Geometry height="42.265625" width="127.619140625" x="2045.9760212183428" y="1113.7526291956021"/>
-              <y:Fill color="#FFCC00" transparent="false"/>
-              <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="32.265625" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="117.619140625" x="5.0" xml:space="preserve" y="5.0">TimeDependent
-AcceptanceStrategy<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
-              <y:Shape type="rectangle"/>
-            </y:ShapeNode>
-          </data>
-        </node>
-        <node id="n13::n3">
-          <data key="d6">
-            <y:ShapeNode>
-              <y:Geometry height="30.0" width="63.65234375" x="2006.3868000088519" y="941.9965536747684"/>
-              <y:Fill color="#FFCC00" transparent="false"/>
-              <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="53.65234375" x="5.0" xml:space="preserve" y="5.93359375">BoaState<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
-              <y:Shape type="rectangle"/>
-            </y:ShapeNode>
-          </data>
-        </node>
-        <node id="n13::n4">
-          <data key="d6">
-            <y:ShapeNode>
-              <y:Geometry height="30.0" width="105.2890625" x="2236.685923851444" y="1003.875"/>
-              <y:Fill color="#FFCC00" transparent="false"/>
-              <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="95.2890625" x="5.0" xml:space="preserve" y="5.93359375">BiddingStrategy<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
-              <y:Shape type="rectangle"/>
-            </y:ShapeNode>
-          </data>
-        </node>
-        <node id="n13::n5">
-          <data key="d6">
-            <y:ShapeNode>
-              <y:Geometry height="42.265625" width="105.2890625" x="2236.281487123049" y="1101.3247773437506"/>
-              <y:Fill color="#FFCC00" transparent="false"/>
-              <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="32.265625" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="95.2890625" x="5.0" xml:space="preserve" y="5.0">TimeDe[endent
-BiddingStrategy<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
-              <y:Shape type="rectangle"/>
-            </y:ShapeNode>
-          </data>
-        </node>
-      </graph>
-    </node>
-    <node id="n14" yfiles.foldertype="group">
-      <data key="d4" xml:space="preserve"/>
-      <data key="d5"/>
-      <data key="d6">
-        <y:ProxyAutoBoundsNode>
-          <y:Realizers active="0">
-            <y:GroupNode>
-              <y:Geometry height="186.35590006840766" width="331.05273437499994" x="280.61083984375006" y="98.78787027829617"/>
-              <y:Fill color="#F5F5F5" transparent="false"/>
-              <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
-              <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.666015625" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="t" textColor="#000000" verticalTextPosition="bottom" visible="true" width="331.05273437499994" x="0.0" xml:space="preserve" y="0.0">Voting</y:NodeLabel>
-              <y:Shape type="roundrectangle"/>
-              <y:State closed="false" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/>
-              <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
-              <y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/>
-            </y:GroupNode>
-            <y:GroupNode>
-              <y:Geometry height="50.0" width="50.0" x="0.0" y="60.0"/>
-              <y:Fill color="#F5F5F5" transparent="false"/>
-              <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
-              <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.666015625" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="t" textColor="#000000" verticalTextPosition="bottom" visible="true" width="73.2431640625" x="-11.62158203125" xml:space="preserve" y="0.0">Folder 19</y:NodeLabel>
-              <y:Shape type="roundrectangle"/>
-              <y:State closed="true" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/>
-              <y:Insets bottom="5" bottomF="5.0" left="5" leftF="5.0" right="5" rightF="5.0" top="5" topF="5.0"/>
-              <y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/>
-            </y:GroupNode>
-          </y:Realizers>
-        </y:ProxyAutoBoundsNode>
-      </data>
-      <graph edgedefault="directed" id="n14:">
-        <node id="n14::n0">
-          <data key="d5"/>
-          <data key="d6">
-            <y:ShapeNode>
-              <y:Geometry height="30.0" width="105.7578125" x="339.0115033465368" y="135.45388590329617"/>
-              <y:Fill hasColor="false" transparent="false"/>
-              <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="95.7578125" x="5.0" xml:space="preserve" y="5.93359375">VotingEvaluator<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
-              <y:Shape type="rectangle"/>
-            </y:ShapeNode>
-          </data>
-        </node>
-        <node id="n14::n1">
-          <data key="d5"/>
-          <data key="d6">
-            <y:ShapeNode>
-              <y:Geometry height="30.0" width="120.576171875" x="295.61083984375006" y="240.14377034670383"/>
-              <y:Fill color="#FFCC00" transparent="false"/>
-              <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="110.576171875" x="5.0" xml:space="preserve" y="5.93359375">LargestAgreement
-<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
-              <y:Shape type="rectangle"/>
-            </y:ShapeNode>
-          </data>
-        </node>
-        <node id="n14::n2">
-          <data key="d5"/>
-          <data key="d6">
-            <y:ShapeNode>
-              <y:Geometry height="30.0" width="150.47656249999994" x="446.1870117187501" y="177.666015625"/>
-              <y:Fill color="#FFCC00" transparent="false"/>
-              <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="140.4765625" x="5.0" xml:space="preserve" y="5.93359375">LargestAgeementsLoop<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" textColor="#000000" visible="true" width="67.791015625" x="5.0" y="7.8671875">DomainRef<y:LabelModel>
+                  <y:SmartNodeLabelModel distance="4.0"/>
+                </y:LabelModel>
+                <y:ModelParameter>
+                  <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.5" nodeRatioX="0.0" nodeRatioY="0.5" offsetX="0.0" offsetY="-4.0" upX="0.0" upY="-1.0"/>
+                </y:ModelParameter>
+              </y:NodeLabel>
               <y:Shape type="rectangle"/>
             </y:ShapeNode>
@@ -1832,5 +2088,5 @@
     </node>
     <edge id="n3::e0" source="n3::n1" target="n3::n6">
-      <data key="d8" xml:space="preserve"/>
+      <data key="d8"/>
       <data key="d10">
         <y:PolyLineEdge>
@@ -1838,5 +2094,12 @@
           <y:LineStyle color="#000000" type="line" width="1.0"/>
           <y:Arrows source="diamond" target="none"/>
-          <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="21.173828125" x="-12.591130187177896" xml:space="preserve" y="-21.566411676999223">   *<y:LabelModel><y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/></y:LabelModel><y:ModelParameter><y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="center" ratio="0.0" segment="0"/></y:ModelParameter><y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/></y:EdgeLabel>
+          <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="21.173828125" x="-27.067684344391296" y="5.0">   *<y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="center" ratio="0.0" segment="0"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
           <y:BendStyle smoothed="false"/>
         </y:PolyLineEdge>
@@ -1844,5 +2107,5 @@
     </edge>
     <edge id="n3::e1" source="n3::n2" target="n3::n7">
-      <data key="d8" xml:space="preserve"/>
+      <data key="d8"/>
       <data key="d10">
         <y:PolyLineEdge>
@@ -1850,5 +2113,12 @@
           <y:LineStyle color="#000000" type="line" width="1.0"/>
           <y:Arrows source="diamond" target="none"/>
-          <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="21.173828125" x="1.994156310160406" xml:space="preserve" y="4.999994573000777">   *<y:LabelModel><y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/></y:LabelModel><y:ModelParameter><y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="center" ratio="0.0" segment="0"/></y:ModelParameter><y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/></y:EdgeLabel>
+          <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="21.173828125" x="-3.079076661654142" y="5.0">   *<y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="center" ratio="0.0" segment="0"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
           <y:BendStyle smoothed="false"/>
         </y:PolyLineEdge>
@@ -1856,5 +2126,5 @@
     </edge>
     <edge id="n3::e2" source="n3::n5" target="n3::n4">
-      <data key="d8" xml:space="preserve"/>
+      <data key="d8"/>
       <data key="d10">
         <y:PolyLineEdge>
@@ -1862,5 +2132,12 @@
           <y:LineStyle color="#000000" type="line" width="1.0"/>
           <y:Arrows source="diamond" target="none"/>
-          <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="50.998046875" x="11.234193102988911" xml:space="preserve" y="4.999994573000777">   *Issue<y:LabelModel><y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/></y:LabelModel><y:ModelParameter><y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="left" ratio="0.0" segment="0"/></y:ModelParameter><y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/></y:EdgeLabel>
+          <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="50.998046875" x="11.23419780188567" y="5.0">   *Issue<y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="left" ratio="0.0" segment="0"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
           <y:BendStyle smoothed="false"/>
         </y:PolyLineEdge>
@@ -1868,5 +2145,5 @@
     </edge>
     <edge id="e0" source="n4::n0" target="n3::n5">
-      <data key="d8" xml:space="preserve"/>
+      <data key="d8"/>
       <data key="d10">
         <y:PolyLineEdge>
@@ -1879,5 +2156,5 @@
     </edge>
     <edge id="n3::e3" source="n3::n1" target="n3::n0">
-      <data key="d8" xml:space="preserve"/>
+      <data key="d8"/>
       <data key="d10">
         <y:PolyLineEdge>
@@ -1890,5 +2167,5 @@
     </edge>
     <edge id="n3::e4" source="n3::n2" target="n3::n0">
-      <data key="d8" xml:space="preserve"/>
+      <data key="d8"/>
       <data key="d10">
         <y:PolyLineEdge>
@@ -1901,5 +2178,5 @@
     </edge>
     <edge id="e1" source="n4::n4" target="n3::n2">
-      <data key="d8" xml:space="preserve"/>
+      <data key="d8"/>
       <data key="d10">
         <y:PolyLineEdge>
@@ -1907,5 +2184,12 @@
           <y:LineStyle color="#000000" type="line" width="1.0"/>
           <y:Arrows source="diamond" target="none"/>
-          <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="22.978515625" x="4.999997623949639" xml:space="preserve" y="-11.734696938457546">   1<y:LabelModel><y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/></y:LabelModel><y:ModelParameter><y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="center" ratio="0.0" segment="0"/></y:ModelParameter><y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/></y:EdgeLabel>
+          <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="22.978515625" x="-41.21470405474156" y="5.0">   1<y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="center" ratio="0.0" segment="0"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
           <y:BendStyle smoothed="false"/>
         </y:PolyLineEdge>
@@ -1913,5 +2197,5 @@
     </edge>
     <edge id="n7::e0" source="n7::n2" target="n7::n0">
-      <data key="d8" xml:space="preserve"/>
+      <data key="d8"/>
       <data key="d10">
         <y:PolyLineEdge>
@@ -1924,5 +2208,5 @@
     </edge>
     <edge id="n7::e1" source="n7::n1" target="n7::n0">
-      <data key="d8" xml:space="preserve"/>
+      <data key="d8"/>
       <data key="d10">
         <y:PolyLineEdge>
@@ -1935,5 +2219,5 @@
     </edge>
     <edge id="e2" source="n6::n0" target="n11::n3">
-      <data key="d8" xml:space="preserve"/>
+      <data key="d8"/>
       <data key="d10">
         <y:PolyLineEdge>
@@ -1941,5 +2225,12 @@
           <y:LineStyle color="#000000" type="line" width="1.0"/>
           <y:Arrows source="diamond" target="none"/>
-          <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="21.173828125" x="-2.077370103505018" xml:space="preserve" y="-23.1328125">   *<y:LabelModel><y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/></y:LabelModel><y:ModelParameter><y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="center" ratio="0.0" segment="0"/></y:ModelParameter><y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/></y:EdgeLabel>
+          <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="21.173828125" x="-11.99655392475779" y="-23.1328125">   *<y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="center" ratio="0.0" segment="0"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
           <y:BendStyle smoothed="false"/>
         </y:PolyLineEdge>
@@ -1947,5 +2238,5 @@
     </edge>
     <edge id="e3" source="n5::n0::n1" target="n3::n5">
-      <data key="d8" xml:space="preserve"/>
+      <data key="d8"/>
       <data key="d10">
         <y:PolyLineEdge>
@@ -1953,5 +2244,12 @@
           <y:LineStyle color="#000000" type="line" width="1.0"/>
           <y:Arrows source="diamond" target="none"/>
-          <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="22.978515625" x="5.0" xml:space="preserve" y="-7.856108614239247">   1<y:LabelModel><y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/></y:LabelModel><y:ModelParameter><y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="center" ratio="0.0" segment="0"/></y:ModelParameter><y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/></y:EdgeLabel>
+          <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="22.978515625" x="-15.78647113305567" y="5.0">   1<y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="center" ratio="0.0" segment="0"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
           <y:BendStyle smoothed="false"/>
         </y:PolyLineEdge>
@@ -1959,5 +2257,5 @@
     </edge>
     <edge id="e4" source="n4" target="n3">
-      <data key="d8" xml:space="preserve"/>
+      <data key="d8"/>
       <data key="d10">
         <y:PolyLineEdge>
@@ -1970,5 +2268,5 @@
     </edge>
     <edge id="e5" source="n5" target="n3">
-      <data key="d8" xml:space="preserve"/>
+      <data key="d8"/>
       <data key="d10">
         <y:PolyLineEdge>
@@ -1981,5 +2279,5 @@
     </edge>
     <edge id="e6" source="n6" target="n4">
-      <data key="d8" xml:space="preserve"/>
+      <data key="d8"/>
       <data key="d10">
         <y:PolyLineEdge>
@@ -1992,5 +2290,5 @@
     </edge>
     <edge id="e7" source="n0" target="n5">
-      <data key="d8" xml:space="preserve"/>
+      <data key="d8"/>
       <data key="d10">
         <y:PolyLineEdge>
@@ -2003,5 +2301,5 @@
     </edge>
     <edge id="n7::e2" source="n7::n5" target="n7::n3">
-      <data key="d8" xml:space="preserve"/>
+      <data key="d8"/>
       <data key="d10">
         <y:PolyLineEdge>
@@ -2014,5 +2312,5 @@
     </edge>
     <edge id="n7::e3" source="n7::n4" target="n7::n3">
-      <data key="d8" xml:space="preserve"/>
+      <data key="d8"/>
       <data key="d10">
         <y:PolyLineEdge>
@@ -2025,5 +2323,5 @@
     </edge>
     <edge id="n7::e4" source="n7::n0" target="n7::n3">
-      <data key="d8" xml:space="preserve"/>
+      <data key="d8"/>
       <data key="d10">
         <y:PolyLineEdge>
@@ -2031,5 +2329,12 @@
           <y:LineStyle color="#000000" type="line" width="1.0"/>
           <y:Arrows source="diamond" target="none"/>
-          <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="22.978515625" x="-31.1295166015625" xml:space="preserve" y="-16.182433197463638">   1<y:LabelModel><y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/></y:LabelModel><y:ModelParameter><y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="center" ratio="0.0" segment="0"/></y:ModelParameter><y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/></y:EdgeLabel>
+          <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="22.978515625" x="-31.1295166015625" y="-16.182433197463638">   1<y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="center" ratio="0.0" segment="0"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
           <y:BendStyle smoothed="false"/>
         </y:PolyLineEdge>
@@ -2037,5 +2342,5 @@
     </edge>
     <edge id="e8" source="n8" target="n4">
-      <data key="d8" xml:space="preserve"/>
+      <data key="d8"/>
       <data key="d10">
         <y:PolyLineEdge>
@@ -2048,5 +2353,5 @@
     </edge>
     <edge id="n3::e5" source="n3::n6" target="n3::n4">
-      <data key="d8" xml:space="preserve"/>
+      <data key="d8"/>
       <data key="d10">
         <y:PolyLineEdge>
@@ -2059,5 +2364,5 @@
     </edge>
     <edge id="n3::e6" source="n3::n7" target="n3::n4">
-      <data key="d8" xml:space="preserve"/>
+      <data key="d8"/>
       <data key="d10">
         <y:PolyLineEdge>
@@ -2070,5 +2375,5 @@
     </edge>
     <edge id="e9" source="n6" target="n8">
-      <data key="d8" xml:space="preserve"/>
+      <data key="d8"/>
       <data key="d10">
         <y:PolyLineEdge>
@@ -2081,5 +2386,5 @@
     </edge>
     <edge id="e10" source="n6" target="n7">
-      <data key="d8" xml:space="preserve"/>
+      <data key="d8"/>
       <data key="d10">
         <y:PolyLineEdge>
@@ -2092,5 +2397,5 @@
     </edge>
     <edge id="e11" source="n1" target="n6">
-      <data key="d8" xml:space="preserve"/>
+      <data key="d8"/>
       <data key="d10">
         <y:PolyLineEdge>
@@ -2103,5 +2408,5 @@
     </edge>
     <edge id="e12" source="n6" target="n5">
-      <data key="d8" xml:space="preserve"/>
+      <data key="d8"/>
       <data key="d10">
         <y:PolyLineEdge>
@@ -2114,5 +2419,5 @@
     </edge>
     <edge id="n3::e7" source="n3::n3" target="n3::n0">
-      <data key="d8" xml:space="preserve"/>
+      <data key="d8"/>
       <data key="d10">
         <y:PolyLineEdge>
@@ -2120,5 +2425,12 @@
           <y:LineStyle color="#000000" type="line" width="1.0"/>
           <y:Arrows source="diamond" target="none"/>
-          <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="39.607421875" x="-41.998933118871264" xml:space="preserve" y="-2.3343379526459103">*Issue<y:LabelModel><y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/></y:LabelModel><y:ModelParameter><y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="center" ratio="0.0" segment="0"/></y:ModelParameter><y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/></y:EdgeLabel>
+          <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="39.607421875" x="-44.607421875" y="-12.658692248113994">*Issue<y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="center" ratio="0.0" segment="0"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
           <y:BendStyle smoothed="false"/>
         </y:PolyLineEdge>
@@ -2126,5 +2438,5 @@
     </edge>
     <edge id="e13" source="n4::n2" target="n3::n1">
-      <data key="d8" xml:space="preserve"/>
+      <data key="d8"/>
       <data key="d10">
         <y:PolyLineEdge>
@@ -2132,5 +2444,12 @@
           <y:LineStyle color="#000000" type="line" width="1.0"/>
           <y:Arrows source="diamond" target="none"/>
-          <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="22.978515625" x="4.9999872998689625" xml:space="preserve" y="-4.382783812665366">   1<y:LabelModel><y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/></y:LabelModel><y:ModelParameter><y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="center" ratio="0.0" segment="0"/></y:ModelParameter><y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/></y:EdgeLabel>
+          <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="22.978515625" x="-38.92449951171875" y="1.6858239792466065">   1<y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="center" ratio="0.0" segment="0"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
           <y:BendStyle smoothed="false"/>
         </y:PolyLineEdge>
@@ -2138,5 +2457,5 @@
     </edge>
     <edge id="n4::e0" source="n4::n1" target="n4::n5">
-      <data key="d8" xml:space="preserve"/>
+      <data key="d8"/>
       <data key="d10">
         <y:PolyLineEdge>
@@ -2149,5 +2468,5 @@
     </edge>
     <edge id="n4::e1" source="n4::n1" target="n4::n8">
-      <data key="d8" xml:space="preserve"/>
+      <data key="d8"/>
       <data key="d10">
         <y:PolyLineEdge>
@@ -2155,5 +2474,12 @@
           <y:LineStyle color="#000000" type="line" width="1.0"/>
           <y:Arrows source="diamond" target="none"/>
-          <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="39.607421875" x="-19.803723637631037" xml:space="preserve" y="4.999941291924188">*Issue<y:LabelModel><y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/></y:LabelModel><y:ModelParameter><y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="center" ratio="0.0" segment="0"/></y:ModelParameter><y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/></y:EdgeLabel>
+          <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="39.607421875" x="-19.8037109375" y="5.0">*Issue<y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="center" ratio="0.0" segment="0"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
           <y:BendStyle smoothed="false"/>
         </y:PolyLineEdge>
@@ -2161,5 +2487,5 @@
     </edge>
     <edge id="n4::e2" source="n4::n1" target="n4::n3">
-      <data key="d8" xml:space="preserve"/>
+      <data key="d8"/>
       <data key="d10">
         <y:PolyLineEdge>
@@ -2167,5 +2493,12 @@
           <y:LineStyle color="#000000" type="line" width="1.0"/>
           <y:Arrows source="diamond" target="none"/>
-          <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="39.607421875" x="-27.587584508039754" xml:space="preserve" y="-23.132871208075812">*Issue<y:LabelModel><y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/></y:LabelModel><y:ModelParameter><y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="center" ratio="0.0" segment="0"/></y:ModelParameter><y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/></y:EdgeLabel>
+          <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="39.607421875" x="-62.596432917827315" y="-23.1328125">*Issue<y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="center" ratio="0.0" segment="0"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
           <y:BendStyle smoothed="false"/>
         </y:PolyLineEdge>
@@ -2173,5 +2506,5 @@
     </edge>
     <edge id="n4::e3" source="n4::n2" target="n4::n3">
-      <data key="d8" xml:space="preserve"/>
+      <data key="d8"/>
       <data key="d10">
         <y:PolyLineEdge>
@@ -2184,5 +2517,5 @@
     </edge>
     <edge id="n4::e4" source="n4::n4" target="n4::n3">
-      <data key="d8" xml:space="preserve"/>
+      <data key="d8"/>
       <data key="d10">
         <y:PolyLineEdge>
@@ -2195,5 +2528,5 @@
     </edge>
     <edge id="n4::e5" source="n4::n5" target="n4::n7">
-      <data key="d8" xml:space="preserve"/>
+      <data key="d8"/>
       <data key="d10">
         <y:PolyLineEdge>
@@ -2206,5 +2539,5 @@
     </edge>
     <edge id="n4::e6" source="n4::n6" target="n4::n0">
-      <data key="d8" xml:space="preserve"/>
+      <data key="d8"/>
       <data key="d10">
         <y:PolyLineEdge>
@@ -2217,5 +2550,5 @@
     </edge>
     <edge id="n4::e7" source="n4::n7" target="n4::n6">
-      <data key="d8" xml:space="preserve"/>
+      <data key="d8"/>
       <data key="d10">
         <y:PolyLineEdge>
@@ -2228,5 +2561,5 @@
     </edge>
     <edge id="n1::e0" source="n1::n1" target="n1::n0">
-      <data key="d8" xml:space="preserve"/>
+      <data key="d8"/>
       <data key="d10">
         <y:PolyLineEdge>
@@ -2239,5 +2572,5 @@
     </edge>
     <edge id="n1::e1" source="n1::n4" target="n1::n3">
-      <data key="d8" xml:space="preserve"/>
+      <data key="d8"/>
       <data key="d10">
         <y:PolyLineEdge>
@@ -2250,5 +2583,5 @@
     </edge>
     <edge id="n1::e2" source="n1::n4" target="n1::n2">
-      <data key="d8" xml:space="preserve"/>
+      <data key="d8"/>
       <data key="d10">
         <y:PolyLineEdge>
@@ -2256,5 +2589,12 @@
           <y:LineStyle color="#000000" type="line" width="1.0"/>
           <y:Arrows source="diamond" target="none"/>
-          <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="26.775390625" x="-12.902739643198402" xml:space="preserve" y="-23.1328125">    1<y:LabelModel><y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/></y:LabelModel><y:ModelParameter><y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="center" ratio="0.0" segment="0"/></y:ModelParameter><y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/></y:EdgeLabel>
+          <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="26.775390625" x="-12.902617355872962" y="-23.1328125">    1<y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="center" ratio="0.0" segment="0"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
           <y:BendStyle smoothed="false"/>
         </y:PolyLineEdge>
@@ -2262,5 +2602,5 @@
     </edge>
     <edge id="e14" source="n9" target="n6">
-      <data key="d8" xml:space="preserve"/>
+      <data key="d8"/>
       <data key="d10">
         <y:PolyLineEdge>
@@ -2272,9 +2612,75 @@
       </data>
     </edge>
+    <edge id="n10::e0" source="n10::n3" target="n10::n1">
+      <data key="d8"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="white_delta"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="n10::e1" source="n10::n4" target="n10::n0">
+      <data key="d8"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="white_delta"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="n10::e2" source="n10::n5" target="n10::n2">
+      <data key="d8"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="white_delta"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="n10::e3" source="n10::n9" target="n10::n8">
+      <data key="d8"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="white_delta"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="n10::e4" source="n10::n10" target="n10::n7">
+      <data key="d8"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="white_delta"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="n10::e5" source="n10::n11" target="n10::n6">
+      <data key="d8"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="white_delta"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
     <edge id="e15" source="n10::n9" target="n11::n0">
-      <data key="d8" xml:space="preserve"/>
-      <data key="d10">
-        <y:PolyLineEdge>
-          <y:Path sx="9.591198890100713" sy="0.0" tx="0.0" ty="0.0"/>
+      <data key="d8"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
           <y:LineStyle color="#000000" type="line" width="1.0"/>
           <y:Arrows source="diamond" target="none"/>
@@ -2284,8 +2690,8 @@
     </edge>
     <edge id="e16" source="n10::n9" target="n11::n2">
-      <data key="d8" xml:space="preserve"/>
-      <data key="d10">
-        <y:PolyLineEdge>
-          <y:Path sx="9.591198890100713" sy="0.0" tx="0.0" ty="0.0"/>
+      <data key="d8"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
           <y:LineStyle color="#000000" type="line" width="1.0"/>
           <y:Arrows source="diamond" target="none"/>
@@ -2295,8 +2701,8 @@
     </edge>
     <edge id="e17" source="n10::n1" target="n11::n4">
-      <data key="d8" xml:space="preserve"/>
-      <data key="d10">
-        <y:PolyLineEdge>
-          <y:Path sx="5.8684164732106865" sy="0.0" tx="0.0" ty="0.0"/>
+      <data key="d8"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
           <y:LineStyle color="#000000" type="line" width="1.0"/>
           <y:Arrows source="diamond" target="none"/>
@@ -2306,5 +2712,5 @@
     </edge>
     <edge id="e18" source="n8::n4" target="n3::n4">
-      <data key="d8" xml:space="preserve"/>
+      <data key="d8"/>
       <data key="d10">
         <y:PolyLineEdge>
@@ -2317,5 +2723,5 @@
     </edge>
     <edge id="e19" source="n8::n3" target="n3::n3">
-      <data key="d8" xml:space="preserve"/>
+      <data key="d8"/>
       <data key="d10">
         <y:PolyLineEdge>
@@ -2328,5 +2734,5 @@
     </edge>
     <edge id="e20" source="n8::n2" target="n4::n5">
-      <data key="d8" xml:space="preserve"/>
+      <data key="d8"/>
       <data key="d10">
         <y:PolyLineEdge>
@@ -2339,5 +2745,5 @@
     </edge>
     <edge id="e21" source="n8::n5::n1" target="n4::n1">
-      <data key="d8" xml:space="preserve"/>
+      <data key="d8"/>
       <data key="d10">
         <y:PolyLineEdge>
@@ -2345,5 +2751,12 @@
           <y:LineStyle color="#000000" type="line" width="1.0"/>
           <y:Arrows source="diamond" target="none"/>
-          <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="21.173828125" x="-26.17374686614812" xml:space="preserve" y="-11.388992459924339">   *<y:LabelModel><y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/></y:LabelModel><y:ModelParameter><y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="center" ratio="0.0" segment="0"/></y:ModelParameter><y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/></y:EdgeLabel>
+          <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="21.173828125" x="-37.507969324213946" y="-23.1328125">   *<y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="center" ratio="0.0" segment="0"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
           <y:BendStyle smoothed="false"/>
         </y:PolyLineEdge>
@@ -2351,5 +2764,5 @@
     </edge>
     <edge id="n8::n5::e0" source="n8::n5::n1" target="n8::n5::n0">
-      <data key="d8" xml:space="preserve"/>
+      <data key="d8"/>
       <data key="d10">
         <y:PolyLineEdge>
@@ -2362,5 +2775,5 @@
     </edge>
     <edge id="n8::e0" source="n8::n1" target="n8::n0">
-      <data key="d8" xml:space="preserve"/>
+      <data key="d8"/>
       <data key="d10">
         <y:PolyLineEdge>
@@ -2373,5 +2786,5 @@
     </edge>
     <edge id="n8::e1" source="n8::n1" target="n8::n5::n1">
-      <data key="d8" xml:space="preserve"/>
+      <data key="d8"/>
       <data key="d10">
         <y:PolyLineEdge>
@@ -2379,5 +2792,12 @@
           <y:LineStyle color="#000000" type="line" width="1.0"/>
           <y:Arrows source="diamond" target="none"/>
-          <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="22.978515625" x="-29.45297115227322" xml:space="preserve" y="4.999989146001553">   1<y:LabelModel><y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/></y:LabelModel><y:ModelParameter><y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="center" ratio="0.0" segment="0"/></y:ModelParameter><y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/></y:EdgeLabel>
+          <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="22.978515625" x="-29.453052411125782" y="5.0">   1<y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="center" ratio="0.0" segment="0"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
           <y:BendStyle smoothed="false"/>
         </y:PolyLineEdge>
@@ -2385,5 +2805,5 @@
     </edge>
     <edge id="n8::e2" source="n8::n3" target="n8::n2">
-      <data key="d8" xml:space="preserve"/>
+      <data key="d8"/>
       <data key="d10">
         <y:PolyLineEdge>
@@ -2396,5 +2816,5 @@
     </edge>
     <edge id="n8::n5::e1" source="n8::n5::n2" target="n8::n5::n0">
-      <data key="d8" xml:space="preserve"/>
+      <data key="d8"/>
       <data key="d10">
         <y:PolyLineEdge>
@@ -2407,5 +2827,5 @@
     </edge>
     <edge id="n5::n0::e0" source="n5::n0::n0" target="n5::n0::n6">
-      <data key="d8" xml:space="preserve"/>
+      <data key="d8"/>
       <data key="d10">
         <y:PolyLineEdge>
@@ -2418,5 +2838,5 @@
     </edge>
     <edge id="n5::n0::e1" source="n5::n0::n1" target="n5::n0::n5">
-      <data key="d8" xml:space="preserve"/>
+      <data key="d8"/>
       <data key="d10">
         <y:PolyLineEdge>
@@ -2429,5 +2849,5 @@
     </edge>
     <edge id="n5::e0" source="n5::n1::n1" target="n5::n0::n0">
-      <data key="d8" xml:space="preserve"/>
+      <data key="d8"/>
       <data key="d10">
         <y:PolyLineEdge>
@@ -2435,5 +2855,12 @@
           <y:LineStyle color="#000000" type="line" width="1.0"/>
           <y:Arrows source="diamond" target="none"/>
-          <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="22.978515625" x="5.0" xml:space="preserve" y="-6.976138971721753">   1<y:LabelModel><y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/></y:LabelModel><y:ModelParameter><y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="center" ratio="0.0" segment="0"/></y:ModelParameter><y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/></y:EdgeLabel>
+          <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="22.978515625" x="5.0" y="-12.13283327336876">   1<y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="center" ratio="0.0" segment="0"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
           <y:BendStyle smoothed="false"/>
         </y:PolyLineEdge>
@@ -2441,5 +2868,5 @@
     </edge>
     <edge id="n5::n1::e0" source="n5::n1::n1" target="n5::n1::n0">
-      <data key="d8" xml:space="preserve"/>
+      <data key="d8"/>
       <data key="d10">
         <y:PolyLineEdge>
@@ -2452,5 +2879,5 @@
     </edge>
     <edge id="n5::n0::e2" source="n5::n0::n2" target="n5::n0::n1">
-      <data key="d8" xml:space="preserve"/>
+      <data key="d8"/>
       <data key="d10">
         <y:PolyLineEdge>
@@ -2463,5 +2890,5 @@
     </edge>
     <edge id="n5::n0::e3" source="n5::n0::n3" target="n5::n0::n0">
-      <data key="d8" xml:space="preserve"/>
+      <data key="d8"/>
       <data key="d10">
         <y:PolyLineEdge>
@@ -2474,5 +2901,5 @@
     </edge>
     <edge id="n5::n0::e4" source="n5::n0::n4" target="n5::n0::n1">
-      <data key="d8" xml:space="preserve"/>
+      <data key="d8"/>
       <data key="d10">
         <y:PolyLineEdge>
@@ -2485,5 +2912,5 @@
     </edge>
     <edge id="n5::n1::e1" source="n5::n1::n2" target="n5::n1::n5">
-      <data key="d8" xml:space="preserve"/>
+      <data key="d8"/>
       <data key="d10">
         <y:PolyLineEdge>
@@ -2496,5 +2923,5 @@
     </edge>
     <edge id="n5::n1::e2" source="n5::n1::n3" target="n5::n1::n5">
-      <data key="d8" xml:space="preserve"/>
+      <data key="d8"/>
       <data key="d10">
         <y:PolyLineEdge>
@@ -2507,5 +2934,5 @@
     </edge>
     <edge id="n5::n1::e3" source="n5::n1::n4" target="n5::n1::n5">
-      <data key="d8" xml:space="preserve"/>
+      <data key="d8"/>
       <data key="d10">
         <y:PolyLineEdge>
@@ -2518,5 +2945,5 @@
     </edge>
     <edge id="n5::n1::e4" source="n5::n1::n5" target="n5::n1::n0">
-      <data key="d8" xml:space="preserve"/>
+      <data key="d8"/>
       <data key="d10">
         <y:PolyLineEdge>
@@ -2529,5 +2956,5 @@
     </edge>
     <edge id="n5::n0::e5" source="n5::n0::n5" target="n5::n0::n0">
-      <data key="d8" xml:space="preserve"/>
+      <data key="d8"/>
       <data key="d10">
         <y:PolyLineEdge>
@@ -2540,5 +2967,5 @@
     </edge>
     <edge id="n11::e0" source="n11::n0" target="n11::n1">
-      <data key="d8" xml:space="preserve"/>
+      <data key="d8"/>
       <data key="d10">
         <y:PolyLineEdge>
@@ -2551,5 +2978,5 @@
     </edge>
     <edge id="n11::e1" source="n11::n2" target="n11::n1">
-      <data key="d8" xml:space="preserve"/>
+      <data key="d8"/>
       <data key="d10">
         <y:PolyLineEdge>
@@ -2562,5 +2989,5 @@
     </edge>
     <edge id="n11::e2" source="n11::n3" target="n11::n1">
-      <data key="d8" xml:space="preserve"/>
+      <data key="d8"/>
       <data key="d10">
         <y:PolyLineEdge>
@@ -2573,5 +3000,5 @@
     </edge>
     <edge id="n11::e3" source="n11::n4" target="n11::n0">
-      <data key="d8" xml:space="preserve"/>
+      <data key="d8"/>
       <data key="d10">
         <y:PolyLineEdge>
@@ -2584,5 +3011,5 @@
     </edge>
     <edge id="n11::e4" source="n11::n4" target="n11::n2">
-      <data key="d8" xml:space="preserve"/>
+      <data key="d8"/>
       <data key="d10">
         <y:PolyLineEdge>
@@ -2595,5 +3022,5 @@
     </edge>
     <edge id="n11::e5" source="n11::n8" target="n11::n5">
-      <data key="d8" xml:space="preserve"/>
+      <data key="d8"/>
       <data key="d10">
         <y:PolyLineEdge>
@@ -2606,5 +3033,5 @@
     </edge>
     <edge id="n11::e6" source="n11::n9" target="n11::n1">
-      <data key="d8" xml:space="preserve"/>
+      <data key="d8"/>
       <data key="d10">
         <y:PolyLineEdge>
@@ -2617,5 +3044,5 @@
     </edge>
     <edge id="n6::e0" source="n6::n1" target="n6::n2">
-      <data key="d8" xml:space="preserve"/>
+      <data key="d8"/>
       <data key="d10">
         <y:PolyLineEdge>
@@ -2627,6 +3054,50 @@
       </data>
     </edge>
+    <edge id="n6::n3::e0" source="n6::n3::n1" target="n6::n3::n0">
+      <data key="d8"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="white_delta"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="n6::n3::e1" source="n6::n3::n2" target="n6::n3::n0">
+      <data key="d8"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="white_delta"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="n6::n3::e2" source="n6::n3::n3" target="n6::n3::n0">
+      <data key="d8"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="white_delta"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="n6::n3::e3" source="n6::n3::n4" target="n6::n3::n0">
+      <data key="d8"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="white_delta"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
     <edge id="n2::e0" source="n2::n1" target="n2::n0">
-      <data key="d8" xml:space="preserve"/>
+      <data key="d8"/>
       <data key="d10">
         <y:PolyLineEdge>
@@ -2639,5 +3110,5 @@
     </edge>
     <edge id="n2::e1" source="n2::n2" target="n2::n1">
-      <data key="d8" xml:space="preserve"/>
+      <data key="d8"/>
       <data key="d10">
         <y:PolyLineEdge>
@@ -2650,5 +3121,5 @@
     </edge>
     <edge id="n2::e2" source="n2::n3" target="n2::n2">
-      <data key="d8" xml:space="preserve"/>
+      <data key="d8"/>
       <data key="d10">
         <y:PolyLineEdge>
@@ -2661,5 +3132,5 @@
     </edge>
     <edge id="n2::e3" source="n2::n4" target="n2::n2">
-      <data key="d8" xml:space="preserve"/>
+      <data key="d8"/>
       <data key="d10">
         <y:PolyLineEdge>
@@ -2672,5 +3143,5 @@
     </edge>
     <edge id="e22" source="n2::n1" target="n4::n0">
-      <data key="d8" xml:space="preserve"/>
+      <data key="d8"/>
       <data key="d10">
         <y:PolyLineEdge>
@@ -2683,5 +3154,5 @@
     </edge>
     <edge id="e23" source="n2::n1" target="n3::n3">
-      <data key="d8" xml:space="preserve"/>
+      <data key="d8"/>
       <data key="d10">
         <y:PolyLineEdge>
@@ -2694,8 +3165,8 @@
     </edge>
     <edge id="e24" source="n10::n3" target="n7::n3">
-      <data key="d8" xml:space="preserve"/>
-      <data key="d10">
-        <y:PolyLineEdge>
-          <y:Path sx="4.706528967303029" sy="0.0" tx="0.0" ty="0.0"/>
+      <data key="d8"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
           <y:LineStyle color="#000000" type="line" width="1.0"/>
           <y:Arrows source="diamond" target="none"/>
@@ -2705,16 +3176,16 @@
     </edge>
     <edge id="e25" source="n6::n1" target="n11::n6">
-      <data key="d8" xml:space="preserve"/>
-      <data key="d10">
-        <y:PolyLineEdge>
-          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
-          <y:LineStyle color="#000000" type="line" width="1.0"/>
-          <y:Arrows source="none" target="white_delta"/>
-          <y:BendStyle smoothed="false"/>
-        </y:PolyLineEdge>
-      </data>
-    </edge>
-    <edge id="e26" source="n5::n2::n2" target="n11::n2">
-      <data key="d8" xml:space="preserve"/>
+      <data key="d8"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="white_delta"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e26" source="n6::n3::n2" target="n11::n2">
+      <data key="d8"/>
       <data key="d10">
         <y:PolyLineEdge>
@@ -2726,6 +3197,6 @@
       </data>
     </edge>
-    <edge id="e27" source="n5::n2::n2" target="n11::n3">
-      <data key="d8" xml:space="preserve"/>
+    <edge id="e27" source="n6::n3::n2" target="n11::n3">
+      <data key="d8"/>
       <data key="d10">
         <y:PolyLineEdge>
@@ -2737,6 +3208,6 @@
       </data>
     </edge>
-    <edge id="n5::e1" source="n5::n2::n2" target="n5::n0::n6">
-      <data key="d8" xml:space="preserve"/>
+    <edge id="e28" source="n6::n3::n2" target="n5::n0::n6">
+      <data key="d8"/>
       <data key="d10">
         <y:PolyLineEdge>
@@ -2748,6 +3219,6 @@
       </data>
     </edge>
-    <edge id="e28" source="n5::n2::n2" target="n7::n0">
-      <data key="d8" xml:space="preserve"/>
+    <edge id="e29" source="n6::n3::n2" target="n7::n0">
+      <data key="d8"/>
       <data key="d10">
         <y:PolyLineEdge>
@@ -2759,316 +3230,54 @@
       </data>
     </edge>
-    <edge id="e29" source="n0::n1" target="n10::n1">
-      <data key="d8" xml:space="preserve"/>
-      <data key="d10">
-        <y:PolyLineEdge>
-          <y:Path sx="0.0" sy="0.0" tx="5.8684164732106865" ty="0.0"/>
-          <y:LineStyle color="#000000" type="line" width="1.0"/>
-          <y:Arrows source="diamond" target="none"/>
-          <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="22.978515625" x="5.673614709180811" xml:space="preserve" y="-23.1328125">   1<y:LabelModel><y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/></y:LabelModel><y:ModelParameter><y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="center" ratio="0.0" segment="0"/></y:ModelParameter><y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/></y:EdgeLabel>
-          <y:BendStyle smoothed="false"/>
-        </y:PolyLineEdge>
-      </data>
-    </edge>
-    <edge id="n0::e0" source="n0::n0" target="n0::n1">
-      <data key="d8" xml:space="preserve"/>
-      <data key="d10">
-        <y:PolyLineEdge>
-          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
-          <y:LineStyle color="#000000" type="line" width="1.0"/>
-          <y:Arrows source="diamond" target="none"/>
-          <y:BendStyle smoothed="false"/>
-        </y:PolyLineEdge>
-      </data>
-    </edge>
-    <edge id="n0::e1" source="n0::n2" target="n0::n0">
-      <data key="d8" xml:space="preserve"/>
-      <data key="d10">
-        <y:PolyLineEdge>
-          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
-          <y:LineStyle color="#000000" type="line" width="1.0"/>
-          <y:Arrows source="diamond" target="none"/>
-          <y:BendStyle smoothed="false"/>
-        </y:PolyLineEdge>
-      </data>
-    </edge>
-    <edge id="n12::e0" source="n12::n1" target="n12::n0">
-      <data key="d10">
-        <y:BezierEdge>
-          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
-          <y:LineStyle color="#000000" type="line" width="1.0"/>
-          <y:Arrows source="none" target="white_delta"/>
-        </y:BezierEdge>
-      </data>
-    </edge>
-    <edge id="e30" source="n12::n0" target="n4::n0">
-      <data key="d10">
-        <y:BezierEdge>
-          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
-          <y:LineStyle color="#000000" type="line" width="1.0"/>
-          <y:Arrows source="none" target="white_delta"/>
-        </y:BezierEdge>
-      </data>
-    </edge>
-    <edge id="n13::e0" source="n13::n2" target="n13::n1">
-      <data key="d10">
-        <y:BezierEdge>
-          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
-          <y:LineStyle color="#000000" type="line" width="1.0"/>
-          <y:Arrows source="none" target="white_delta"/>
-        </y:BezierEdge>
-      </data>
-    </edge>
-    <edge id="e31" source="n12::n0" target="n13::n3">
-      <data key="d10">
-        <y:BezierEdge>
-          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
-          <y:LineStyle color="#000000" type="line" width="1.0"/>
-          <y:Arrows source="none" target="diamond"/>
-          <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="9.783203125" x="285.8427560665989" xml:space="preserve" y="330.41836763961214">*<y:LabelModel><y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/></y:LabelModel><y:ModelParameter><y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="center" ratio="1.0" segment="-1"/></y:ModelParameter><y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/></y:EdgeLabel>
-        </y:BezierEdge>
-      </data>
-    </edge>
-    <edge id="n13::e1" source="n13::n5" target="n13::n4">
-      <data key="d10">
-        <y:BezierEdge>
-          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
-          <y:LineStyle color="#000000" type="line" width="1.0"/>
-          <y:Arrows source="none" target="white_delta"/>
-        </y:BezierEdge>
-      </data>
-    </edge>
-    <edge id="n13::e2" source="n13::n1" target="n13::n0">
-      <data key="d10">
-        <y:BezierEdge>
-          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
-          <y:LineStyle color="#000000" type="line" width="1.0"/>
-          <y:Arrows source="none" target="diamond"/>
-        </y:BezierEdge>
-      </data>
-    </edge>
-    <edge id="n13::e3" source="n13::n4" target="n13::n0">
-      <data key="d10">
-        <y:BezierEdge>
-          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
-          <y:LineStyle color="#000000" type="line" width="1.0"/>
-          <y:Arrows source="none" target="diamond"/>
-        </y:BezierEdge>
-      </data>
-    </edge>
-    <edge id="n13::e4" source="n13::n3" target="n13::n0">
-      <data key="d10">
-        <y:BezierEdge>
-          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
-          <y:LineStyle color="#000000" type="line" width="1.0"/>
-          <y:Arrows source="none" target="diamond"/>
-        </y:BezierEdge>
-      </data>
-    </edge>
-    <edge id="e32" source="n13" target="n6">
-      <data key="d10">
-        <y:BezierEdge>
+    <edge id="n10::e6" source="n10::n1" target="n10::n2">
+      <data key="d8"/>
+      <data key="d10">
+        <y:PolyLineEdge>
           <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
           <y:LineStyle color="#000000" type="dashed" width="1.0"/>
           <y:Arrows source="none" target="plain"/>
-        </y:BezierEdge>
-      </data>
-    </edge>
-    <edge id="n5::n2::e0" source="n5::n2::n1" target="n5::n2::n0">
-      <data key="d8" xml:space="preserve"/>
-      <data key="d10">
-        <y:PolyLineEdge>
-          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
-          <y:LineStyle color="#000000" type="line" width="1.0"/>
-          <y:Arrows source="none" target="white_delta"/>
-          <y:BendStyle smoothed="false"/>
-        </y:PolyLineEdge>
-      </data>
-    </edge>
-    <edge id="n5::n2::e1" source="n5::n2::n2" target="n5::n2::n0">
-      <data key="d8" xml:space="preserve"/>
-      <data key="d10">
-        <y:PolyLineEdge>
-          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
-          <y:LineStyle color="#000000" type="line" width="1.0"/>
-          <y:Arrows source="none" target="white_delta"/>
-          <y:BendStyle smoothed="false"/>
-        </y:PolyLineEdge>
-      </data>
-    </edge>
-    <edge id="n5::n2::e2" source="n5::n2::n3" target="n5::n2::n0">
-      <data key="d8" xml:space="preserve"/>
-      <data key="d10">
-        <y:PolyLineEdge>
-          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
-          <y:LineStyle color="#000000" type="line" width="1.0"/>
-          <y:Arrows source="none" target="white_delta"/>
-          <y:BendStyle smoothed="false"/>
-        </y:PolyLineEdge>
-      </data>
-    </edge>
-    <edge id="n5::n2::e3" source="n5::n2::n4" target="n5::n2::n0">
-      <data key="d8" xml:space="preserve"/>
-      <data key="d10">
-        <y:PolyLineEdge>
-          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
-          <y:LineStyle color="#000000" type="line" width="1.0"/>
-          <y:Arrows source="none" target="white_delta"/>
-          <y:BendStyle smoothed="false"/>
-        </y:PolyLineEdge>
-      </data>
-    </edge>
-    <edge id="n5::n2::e4" source="n5::n2::n5" target="n5::n2::n3">
-      <data key="d10">
-        <y:BezierEdge>
-          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
-          <y:LineStyle color="#000000" type="line" width="1.0"/>
-          <y:Arrows source="none" target="diamond"/>
-        </y:BezierEdge>
-      </data>
-    </edge>
-    <edge id="n10::e0" source="n10::n1" target="n10::n2">
-      <data key="d8" xml:space="preserve"/>
-      <data key="d10">
-        <y:PolyLineEdge>
-          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
-          <y:LineStyle color="#000000" type="dashed" width="1.0"/>
-          <y:Arrows source="none" target="plain"/>
-          <y:BendStyle smoothed="false"/>
-        </y:PolyLineEdge>
-      </data>
-    </edge>
-    <edge id="n10::e1" source="n10::n3" target="n10::n1">
-      <data key="d8" xml:space="preserve"/>
-      <data key="d10">
-        <y:PolyLineEdge>
-          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
-          <y:LineStyle color="#000000" type="line" width="1.0"/>
-          <y:Arrows source="none" target="white_delta"/>
-          <y:BendStyle smoothed="false"/>
-        </y:PolyLineEdge>
-      </data>
-    </edge>
-    <edge id="n10::e2" source="n10::n4" target="n10::n0">
-      <data key="d8" xml:space="preserve"/>
-      <data key="d10">
-        <y:PolyLineEdge>
-          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
-          <y:LineStyle color="#000000" type="line" width="1.0"/>
-          <y:Arrows source="none" target="white_delta"/>
-          <y:BendStyle smoothed="false"/>
-        </y:PolyLineEdge>
-      </data>
-    </edge>
-    <edge id="n10::e3" source="n10::n5" target="n10::n2">
-      <data key="d8" xml:space="preserve"/>
-      <data key="d10">
-        <y:PolyLineEdge>
-          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
-          <y:LineStyle color="#000000" type="line" width="1.0"/>
-          <y:Arrows source="none" target="white_delta"/>
-          <y:BendStyle smoothed="false"/>
-        </y:PolyLineEdge>
-      </data>
-    </edge>
-    <edge id="n10::e4" source="n10::n9" target="n10::n8">
-      <data key="d8" xml:space="preserve"/>
-      <data key="d10">
-        <y:PolyLineEdge>
-          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
-          <y:LineStyle color="#000000" type="line" width="1.0"/>
-          <y:Arrows source="none" target="white_delta"/>
-          <y:BendStyle smoothed="false"/>
-        </y:PolyLineEdge>
-      </data>
-    </edge>
-    <edge id="n10::e5" source="n10::n10" target="n10::n7">
-      <data key="d8" xml:space="preserve"/>
-      <data key="d10">
-        <y:PolyLineEdge>
-          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
-          <y:LineStyle color="#000000" type="line" width="1.0"/>
-          <y:Arrows source="none" target="white_delta"/>
-          <y:BendStyle smoothed="false"/>
-        </y:PolyLineEdge>
-      </data>
-    </edge>
-    <edge id="n10::e6" source="n10::n11" target="n10::n6">
-      <data key="d8" xml:space="preserve"/>
-      <data key="d10">
-        <y:PolyLineEdge>
-          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
-          <y:LineStyle color="#000000" type="line" width="1.0"/>
-          <y:Arrows source="none" target="white_delta"/>
-          <y:BendStyle smoothed="false"/>
-        </y:PolyLineEdge>
-      </data>
-    </edge>
-    <edge id="n10::e7" source="n10::n12" target="n10::n2">
-      <data key="d10">
-        <y:BezierEdge>
-          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
-          <y:LineStyle color="#000000" type="line" width="1.0"/>
-          <y:Arrows source="none" target="white_delta"/>
-        </y:BezierEdge>
-      </data>
-    </edge>
-    <edge id="n10::e8" source="n10::n13" target="n10::n2">
-      <data key="d10">
-        <y:BezierEdge>
-          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
-          <y:LineStyle color="#000000" type="line" width="1.0"/>
-          <y:Arrows source="none" target="white_delta"/>
-        </y:BezierEdge>
-      </data>
-    </edge>
-    <edge id="n10::e9" source="n10::n14" target="n10::n2">
-      <data key="d9"/>
-      <data key="d10">
-        <y:BezierEdge>
-          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
-          <y:LineStyle color="#000000" type="line" width="1.0"/>
-          <y:Arrows source="none" target="white_delta"/>
-        </y:BezierEdge>
-      </data>
-    </edge>
-    <edge id="n14::e0" source="n14::n1" target="n14::n0">
-      <data key="d9"/>
-      <data key="d10">
-        <y:BezierEdge>
-          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
-          <y:LineStyle color="#000000" type="line" width="1.0"/>
-          <y:Arrows source="none" target="white_delta"/>
-        </y:BezierEdge>
-      </data>
-    </edge>
-    <edge id="n14::e1" source="n14::n2" target="n14::n0">
-      <data key="d9"/>
-      <data key="d10">
-        <y:BezierEdge>
-          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
-          <y:LineStyle color="#000000" type="line" width="1.0"/>
-          <y:Arrows source="none" target="white_delta"/>
-        </y:BezierEdge>
-      </data>
-    </edge>
-    <edge id="e33" source="n14::n0" target="n10::n15">
-      <data key="d9"/>
-      <data key="d10">
-        <y:BezierEdge>
-          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
-          <y:LineStyle color="#000000" type="line" width="1.0"/>
-          <y:Arrows source="none" target="diamond"/>
-        </y:BezierEdge>
-      </data>
-    </edge>
-    <edge id="n10::e10" source="n10::n15" target="n10::n1">
-      <data key="d9"/>
-      <data key="d10">
-        <y:BezierEdge>
-          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
-          <y:LineStyle color="#000000" type="line" width="1.0"/>
-          <y:Arrows source="none" target="white_delta"/>
-        </y:BezierEdge>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e30" source="n0::n1" target="n10::n1">
+      <data key="d8"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="diamond" target="none"/>
+          <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="22.978515625" x="5.430217172490757" y="-23.1328125">   1<y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="center" ratio="0.0" segment="0"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="n0::e0" source="n0::n0" target="n0::n1">
+      <data key="d8"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="diamond" target="none"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="n0::e1" source="n0::n2" target="n0::n0">
+      <data key="d8"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="diamond" target="none"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
       </data>
     </edge>
Index: /design/classdiagram.svg
===================================================================
--- /design/classdiagram.svg	(revision 53)
+++ /design/classdiagram.svg	(revision 1)
@@ -1,3 +1,3 @@
-<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill-opacity="1" color-rendering="auto" color-interpolation="auto" text-rendering="auto" stroke="black" stroke-linecap="square" width="2275" stroke-miterlimit="10" shape-rendering="auto" stroke-opacity="1" fill="black" stroke-dasharray="none" font-weight="normal" stroke-width="1" height="1878" font-family="'Dialog'" font-style="normal" stroke-linejoin="miter" font-size="12px" stroke-dashoffset="0" image-rendering="auto">
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill-opacity="1" color-rendering="auto" color-interpolation="auto" text-rendering="auto" stroke="black" stroke-linecap="square" width="2257" stroke-miterlimit="10" shape-rendering="auto" stroke-opacity="1" fill="black" stroke-dasharray="none" font-weight="normal" stroke-width="1" height="2059" font-family="'Dialog'" font-style="normal" stroke-linejoin="miter" font-size="12px" stroke-dashoffset="0" image-rendering="auto">
   <!--Generated by ySVG 2.5-->
   <defs id="genericDefs"/>
@@ -8,55 +8,55 @@
         <stop stop-opacity="1" stop-color="yellow" offset="100%"/>
       </linearGradient>
-      <linearGradient x1="2092.3242" gradientUnits="userSpaceOnUse" x2="2383.6438" y1="289.77" y2="289.77" id="linearGradient2" spreadMethod="reflect">
+      <linearGradient x1="1967.2423" gradientUnits="userSpaceOnUse" x2="2258.562" y1="627.1509" y2="627.1509" id="linearGradient2" spreadMethod="reflect">
         <stop stop-opacity="1" stop-color="rgb(245,245,245)" offset="0%"/>
         <stop stop-opacity="1" stop-color="yellow" offset="100%"/>
       </linearGradient>
-      <linearGradient x1="1525.7495" gradientUnits="userSpaceOnUse" x2="1805.0691" y1="1556.9103" y2="1556.9103" id="linearGradient3" spreadMethod="reflect">
+      <linearGradient x1="1218.5006" gradientUnits="userSpaceOnUse" x2="1497.8203" y1="1737.7272" y2="1737.7272" id="linearGradient3" spreadMethod="reflect">
         <stop stop-opacity="1" stop-color="rgb(245,245,245)" offset="0%"/>
         <stop stop-opacity="1" stop-color="yellow" offset="100%"/>
       </linearGradient>
       <clipPath clipPathUnits="userSpaceOnUse" id="clipPath1">
-        <path d="M0 0 L2275 0 L2275 1878 L0 1878 L0 0 Z"/>
+        <path d="M0 0 L2257 0 L2257 2059 L0 2059 L0 0 Z"/>
       </clipPath>
       <clipPath clipPathUnits="userSpaceOnUse" id="clipPath2">
-        <path d="M124 -15 L2399 -15 L2399 1863 L124 1863 L124 -15 Z"/>
+        <path d="M17 -15 L2274 -15 L2274 2044 L17 2044 L17 -15 Z"/>
       </clipPath>
     </defs>
-    <g fill="white" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="translate(-124,15)" stroke="white">
-      <rect x="124" width="2275" height="1878" y="-15" clip-path="url(#clipPath2)" stroke="none"/>
-    </g>
-    <g fill="url(#linearGradient1)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="url(#linearGradient1)">
+    <g fill="white" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="translate(-17,15)" stroke="white">
+      <rect x="17" width="2257" height="2059" y="-15" clip-path="url(#clipPath2)" stroke="none"/>
+    </g>
+    <g fill="url(#linearGradient1)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-17,15)" stroke="url(#linearGradient1)">
       <rect x="321.0347" y="508.1675" clip-path="url(#clipPath2)" width="326.0752" rx="4" ry="4" height="208.666" stroke="none"/>
       <rect x="321.0347" y="508.1675" clip-path="url(#clipPath2)" fill="rgb(235,235,235)" width="326.0752" height="21.666" stroke="none"/>
     </g>
-    <g font-size="15px" stroke-linecap="butt" transform="matrix(1,0,0,1,-124,15)" text-rendering="geometricPrecision" font-family="sans-serif" shape-rendering="geometricPrecision" stroke-miterlimit="1.45">
+    <g font-size="15px" stroke-linecap="butt" transform="matrix(1,0,0,1,-17,15)" text-rendering="geometricPrecision" font-family="sans-serif" shape-rendering="geometricPrecision" stroke-miterlimit="1.45">
       <text x="572.1753" xml:space="preserve" y="524.6694" clip-path="url(#clipPath2)" stroke="none">RunServer</text>
       <rect x="321.0347" y="508.1675" clip-path="url(#clipPath2)" fill="none" width="326.0752" stroke-dasharray="6,2" rx="4" ry="4" height="208.666"/>
     </g>
-    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="rgb(255,204,0)">
+    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-17,15)" stroke="rgb(255,204,0)">
       <rect x="431.4546" width="141.3125" height="30" y="544.8335" clip-path="url(#clipPath2)" stroke="none"/>
     </g>
-    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-124,15)" stroke-linecap="butt">
+    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-17,15)" stroke-linecap="butt">
       <text x="438.4546" xml:space="preserve" y="564.3687" clip-path="url(#clipPath2)" stroke="none">RunningSessionsRepo</text>
       <rect fill="none" x="431.4546" width="141.3125" height="30" y="544.8335" clip-path="url(#clipPath2)"/>
     </g>
-    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="rgb(255,204,0)">
+    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-17,15)" stroke="rgb(255,204,0)">
       <rect x="526.1118" width="105.998" height="30" y="598.8335" clip-path="url(#clipPath2)" stroke="none"/>
     </g>
-    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-124,15)" stroke-linecap="butt">
+    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-17,15)" stroke-linecap="butt">
       <text x="533.1118" xml:space="preserve" y="618.3687" clip-path="url(#clipPath2)" stroke="none">RunningSession</text>
       <rect fill="none" x="526.1118" width="105.998" height="30" y="598.8335" clip-path="url(#clipPath2)"/>
     </g>
-    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="rgb(255,204,0)">
+    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-17,15)" stroke="rgb(255,204,0)">
       <rect x="451.897" width="122.4277" height="30" y="671.8335" clip-path="url(#clipPath2)" stroke="none"/>
     </g>
-    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-124,15)" stroke-linecap="butt">
+    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-17,15)" stroke-linecap="butt">
       <text x="458.897" xml:space="preserve" y="691.3687" clip-path="url(#clipPath2)" stroke="none">SessionsListSocket</text>
       <rect fill="none" x="451.897" width="122.4277" height="30" y="671.8335" clip-path="url(#clipPath2)"/>
     </g>
-    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="rgb(255,204,0)">
+    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-17,15)" stroke="rgb(255,204,0)">
       <rect x="336.0347" width="80.1523" height="56.3984" y="593.6343" clip-path="url(#clipPath2)" stroke="none"/>
     </g>
-    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-124,15)" stroke-linecap="butt">
+    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-17,15)" stroke-linecap="butt">
       <text x="343.0347" xml:space="preserve" y="612.2358" clip-path="url(#clipPath2)" stroke="none">RunSession</text>
       <text x="354.8237" xml:space="preserve" y="626.3687" clip-path="url(#clipPath2)" stroke="none">doGet()</text>
@@ -68,670 +68,661 @@
       <path d="M511.8116 671.8335 L506.2262 665.2911 L510.6035 657.8857 L516.1889 664.4282 Z" clip-path="url(#clipPath2)" stroke="none"/>
     </g>
-    <g fill="url(#linearGradient2)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="url(#linearGradient2)">
-      <rect x="1946.6643" y="289.77" clip-path="url(#clipPath2)" width="436.9795" rx="4" ry="4" height="433.9316" stroke="none"/>
-      <rect x="1946.6643" y="289.77" clip-path="url(#clipPath2)" fill="rgb(235,235,235)" width="436.9795" height="21.666" stroke="none"/>
-    </g>
-    <g font-size="15px" stroke-linecap="butt" transform="matrix(1,0,0,1,-124,15)" text-rendering="geometricPrecision" font-family="sans-serif" shape-rendering="geometricPrecision" stroke-miterlimit="1.45">
-      <text x="2288.1501" xml:space="preserve" y="306.272" clip-path="url(#clipPath2)" stroke="none">PartiesServer</text>
-      <rect x="1946.6643" y="289.77" clip-path="url(#clipPath2)" fill="none" width="436.9795" stroke-dasharray="6,2" rx="4" ry="4" height="433.9316"/>
-    </g>
-    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="rgb(255,204,0)">
-      <rect x="2129.3567" width="239.2871" height="70.5312" y="326.436" clip-path="url(#clipPath2)" stroke="none"/>
-    </g>
-    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-124,15)" stroke-linecap="butt">
-      <text x="2213.4133" xml:space="preserve" y="345.0376" clip-path="url(#clipPath2)" stroke="none">PartyFactory</text>
-      <text x="2136.3567" xml:space="preserve" y="359.1704" clip-path="url(#clipPath2)" stroke="none">WebSocketURI create(name, profileRef)</text>
-      <text x="2201.8879" xml:space="preserve" y="373.3032" clip-path="url(#clipPath2)" stroke="none">maximumSlots()</text>
-      <text x="2205.7756" xml:space="preserve" y="387.436" clip-path="url(#clipPath2)" stroke="none">availableSlots()</text>
-      <rect fill="none" x="2129.3567" width="239.2871" height="70.5312" y="326.436" clip-path="url(#clipPath2)"/>
-    </g>
-    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="rgb(255,204,0)">
-      <rect x="2147.1243" width="213.752" height="70.5312" y="584.436" clip-path="url(#clipPath2)" stroke="none"/>
-    </g>
-    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-124,15)" stroke-linecap="butt">
-      <text x="2176.2815" xml:space="preserve" y="603.0376" clip-path="url(#clipPath2)" stroke="none">PartyFactorySocketAdapter</text>
-      <text x="2252.1018" xml:space="preserve" y="617.1704" clip-path="url(#clipPath2)" stroke="none"> </text>
-      <text x="2154.1243" xml:space="preserve" y="631.3032" clip-path="url(#clipPath2)" stroke="none">URI create(String name, ProfileRef)</text>
-      <text x="2182.217" xml:space="preserve" y="645.436" clip-path="url(#clipPath2)" stroke="none">List&lt;String&gt; getNames()</text>
-      <rect fill="none" x="2147.1243" width="213.752" height="70.5312" y="584.436" clip-path="url(#clipPath2)"/>
-    </g>
-    <g fill="white" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="white">
-      <rect x="1989.8108" width="178.3789" height="141.1953" y="420.104" clip-path="url(#clipPath2)" stroke="none"/>
-    </g>
-    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-124,15)" stroke-linecap="butt">
-      <text x="2034.929" xml:space="preserve" y="438.7056" clip-path="url(#clipPath2)" stroke="none">Party(PartyRef):</text>
-      <text x="1996.8108" xml:space="preserve" y="452.8384" clip-path="url(#clipPath2)" stroke="none">Listener&lt;NegotiationEvent&gt;</text>
-      <text x="2077.1018" xml:space="preserve" y="466.9712" clip-path="url(#clipPath2)" stroke="none"> </text>
-      <text x="2031.8557" xml:space="preserve" y="481.104" clip-path="url(#clipPath2)" stroke="none">getCapabilities()</text>
-      <text x="2020.4358" xml:space="preserve" y="495.2368" clip-path="url(#clipPath2)" stroke="none">init(NegotiationInfo)</text>
-      <text x="2032.4475" xml:space="preserve" y="509.3696" clip-path="url(#clipPath2)" stroke="none">getDescription()</text>
-      <text x="2053.4006" xml:space="preserve" y="523.5024" clip-path="url(#clipPath2)" stroke="none">destroy()</text>
-      <text x="2026.6702" xml:space="preserve" y="537.6353" clip-path="url(#clipPath2)" stroke="none">Action getAction()</text>
-      <text x="2044.342" xml:space="preserve" y="551.7681" clip-path="url(#clipPath2)" stroke="none">inform(info)</text>
-      <rect fill="none" x="1989.8108" width="178.3789" height="141.1953" y="420.104" clip-path="url(#clipPath2)"/>
-    </g>
-    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="rgb(255,204,0)">
-      <rect x="1961.6643" width="76.6719" height="30" y="584.7017" clip-path="url(#clipPath2)" stroke="none"/>
-    </g>
-    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-124,15)" stroke-linecap="butt">
-      <text x="1968.6643" xml:space="preserve" y="604.2368" clip-path="url(#clipPath2)" stroke="none">WebSocket</text>
-      <rect fill="none" x="1961.6643" width="76.6719" height="30" y="584.7017" clip-path="url(#clipPath2)"/>
-    </g>
-    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="rgb(255,204,0)">
-      <rect x="2008.4045" width="127.1914" height="30" y="678.7017" clip-path="url(#clipPath2)" stroke="none"/>
-    </g>
-    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-124,15)" stroke-linecap="butt">
-      <text x="2015.4045" xml:space="preserve" y="698.2368" clip-path="url(#clipPath2)" stroke="none">PartySocketAdapter</text>
-      <rect fill="none" x="2008.4045" width="127.1914" height="30" y="678.7017" clip-path="url(#clipPath2)"/>
-      <path fill="none" d="M2253.1812 577.4374 L2249.6836 396.9673" clip-path="url(#clipPath2)"/>
-      <path d="M2253.3169 584.436 L2248.1821 577.5343 L2253.0454 570.4387 L2258.1802 577.3404 Z" clip-path="url(#clipPath2)" stroke="none"/>
-      <path fill="none" d="M2060.511 678.7017 L2020.6107 626.6098" clip-path="url(#clipPath2)"/>
-      <path fill="white" d="M2011.4896 614.7016 L2016.4556 631.0521 L2025.9821 623.7552 Z" clip-path="url(#clipPath2)" stroke="none"/>
-      <path fill="none" d="M2011.4896 614.7016 L2016.4556 631.0521 L2025.9821 623.7552 Z" clip-path="url(#clipPath2)"/>
-      <path fill="none" d="M2072.7588 671.7058 L2076.5659 561.2993" clip-path="url(#clipPath2)"/>
-      <path d="M2072.5176 678.7017 L2067.7617 671.5335 L2073 664.71 L2077.7559 671.8781 Z" clip-path="url(#clipPath2)" stroke="none"/>
-      <text x="2061.6147" xml:space="preserve" y="669.1704" clip-path="url(#clipPath2)" stroke="none">    1</text>
-    </g>
-    <g fill="url(#linearGradient3)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="url(#linearGradient3)">
-      <rect x="1386.0897" y="1556.9103" clip-path="url(#clipPath2)" width="418.9795" rx="4" ry="4" height="290.666" stroke="none"/>
-      <rect x="1386.0897" y="1556.9103" clip-path="url(#clipPath2)" fill="rgb(235,235,235)" width="418.9795" height="21.666" stroke="none"/>
-    </g>
-    <g font-size="15px" stroke-linecap="butt" transform="matrix(1,0,0,1,-124,15)" text-rendering="geometricPrecision" font-family="sans-serif" shape-rendering="geometricPrecision" stroke-miterlimit="1.45">
-      <text x="1704.4045" xml:space="preserve" y="1573.4122" clip-path="url(#clipPath2)" stroke="none">ProfilesServer</text>
-      <rect x="1386.0897" y="1556.9103" clip-path="url(#clipPath2)" fill="none" width="418.9795" stroke-dasharray="6,2" rx="4" ry="4" height="290.666"/>
-    </g>
-    <g fill="white" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="white">
-      <rect x="1585.5399" width="204.5293" height="98.7969" y="1613.1778" clip-path="url(#clipPath2)" stroke="none"/>
-    </g>
-    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-124,15)" stroke-linecap="butt">
-      <text x="1648.2068" xml:space="preserve" y="1631.7794" clip-path="url(#clipPath2)" stroke="none">ProfileFactory</text>
-      <text x="1685.906" xml:space="preserve" y="1645.9122" clip-path="url(#clipPath2)" stroke="none"> </text>
-      <text x="1612.3064" xml:space="preserve" y="1660.045" clip-path="url(#clipPath2)" stroke="none">getDomain(domain name)</text>
-      <text x="1619.2849" xml:space="preserve" y="1674.1779" clip-path="url(#clipPath2)" stroke="none">getProfile(profile name)</text>
-      <text x="1592.5398" xml:space="preserve" y="1688.3107" clip-path="url(#clipPath2)" stroke="none">add(domain desc, domain name)</text>
-      <text x="1598.3406" xml:space="preserve" y="1702.4435" clip-path="url(#clipPath2)" stroke="none">add(profile desc, profile name)</text>
-      <rect fill="none" x="1585.5399" width="204.5293" height="98.7969" y="1613.1778" clip-path="url(#clipPath2)"/>
-    </g>
-    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="rgb(255,204,0)">
-      <rect x="1401.0897" width="141.4297" height="30" y="1593.5763" clip-path="url(#clipPath2)" stroke="none"/>
-    </g>
-    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-124,15)" stroke-linecap="butt">
-      <text x="1408.0896" xml:space="preserve" y="1613.1115" clip-path="url(#clipPath2)" stroke="none">DefaultProfilesFactory</text>
-      <rect fill="none" x="1401.0897" width="141.4297" height="30" y="1593.5763" clip-path="url(#clipPath2)"/>
-    </g>
-    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="rgb(255,204,0)">
-      <rect x="1471.8885" width="179.832" height="30" y="1735.5763" clip-path="url(#clipPath2)" stroke="none"/>
-    </g>
-    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-124,15)" stroke-linecap="butt">
-      <text x="1478.8884" xml:space="preserve" y="1755.1115" clip-path="url(#clipPath2)" stroke="none">AutoUpdatingProfilesFactory</text>
-      <rect fill="none" x="1471.8885" width="179.832" height="30" y="1735.5763" clip-path="url(#clipPath2)"/>
-    </g>
-    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="rgb(255,204,0)">
-      <rect x="1606.3231" width="108.9629" height="30" y="1790.5763" clip-path="url(#clipPath2)" stroke="none"/>
-    </g>
-    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-124,15)" stroke-linecap="butt">
-      <text x="1613.323" xml:space="preserve" y="1810.1115" clip-path="url(#clipPath2)" stroke="none">GetProfileSocket</text>
-      <rect fill="none" x="1606.3231" width="108.9629" height="30" y="1790.5763" clip-path="url(#clipPath2)"/>
-    </g>
-    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="rgb(255,204,0)">
-      <rect x="1467.951" width="115.707" height="30" y="1802.5763" clip-path="url(#clipPath2)" stroke="none"/>
-    </g>
-    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-124,15)" stroke-linecap="butt">
-      <text x="1474.9509" xml:space="preserve" y="1822.1115" clip-path="url(#clipPath2)" stroke="none">ProfilesListSocket</text>
-      <rect fill="none" x="1467.951" width="115.707" height="30" y="1802.5763" clip-path="url(#clipPath2)"/>
-      <path fill="none" d="M1531.8044 1623.5763 L1570.9877 1633.3721" clip-path="url(#clipPath2)"/>
-      <path fill="white" d="M1585.5398 1637.0101 L1571.4728 1627.3087 L1568.5623 1638.9504 Z" clip-path="url(#clipPath2)" stroke="none"/>
-      <path fill="none" d="M1585.5398 1637.0101 L1571.4728 1627.3087 L1568.5623 1638.9504 Z" clip-path="url(#clipPath2)"/>
-      <path fill="none" d="M1552.2975 1735.5763 L1489.3416 1636.2458" clip-path="url(#clipPath2)"/>
-      <path fill="white" d="M1481.3115 1623.5763 L1484.8091 1640.3025 L1494.9447 1633.8785 Z" clip-path="url(#clipPath2)" stroke="none"/>
-      <path fill="none" d="M1481.3115 1623.5763 L1484.8091 1640.3025 L1494.9447 1633.8785 Z" clip-path="url(#clipPath2)"/>
-      <path fill="none" stroke-dasharray="6,2" d="M1633.8044 1790.5763 L1593.1753 1768.0045" clip-path="url(#clipPath2)"/>
-      <path stroke-dasharray="6,2" d="M1589.6786 1766.0619 L1597.2546 1777.1345 L1589.6786 1766.0619 L1603.0824 1766.6447 Z" clip-path="url(#clipPath2)" stroke="none"/>
-      <path fill="none" stroke-miterlimit="10" d="M1589.6786 1766.0619 L1597.2546 1777.1345 L1589.6786 1766.0619 L1603.0824 1766.6447 Z" clip-path="url(#clipPath2)" stroke-linecap="square"/>
-      <path fill="none" stroke-dasharray="6,2" d="M1533.8643 1802.5763 L1551.3782 1769.9807" clip-path="url(#clipPath2)"/>
-      <path stroke-dasharray="6,2" d="M1553.2715 1766.4572 L1542.3063 1774.188 L1553.2715 1766.4572 L1552.877 1779.8678 Z" clip-path="url(#clipPath2)" stroke="none"/>
-      <path fill="none" stroke-miterlimit="10" d="M1553.2715 1766.4572 L1542.3063 1774.188 L1553.2715 1766.4572 L1552.877 1779.8678 Z" clip-path="url(#clipPath2)" stroke-linecap="square"/>
-    </g>
-    <g fill="rgb(245,245,245)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="rgb(245,245,245)">
-      <rect x="1387.7986" y="1067.2267" clip-path="url(#clipPath2)" width="389.8201" rx="4" ry="4" height="324.666" stroke="none"/>
-      <rect x="1387.7986" y="1067.2267" clip-path="url(#clipPath2)" fill="rgb(235,235,235)" width="389.8201" height="21.666" stroke="none"/>
-    </g>
-    <g font-size="15px" stroke-linecap="butt" transform="matrix(1,0,0,1,-124,15)" text-rendering="geometricPrecision" font-family="sans-serif" shape-rendering="geometricPrecision" stroke-miterlimit="1.45">
-      <text x="1698.2457" xml:space="preserve" y="1083.7286" clip-path="url(#clipPath2)" stroke="none">IssueValue</text>
-      <rect x="1387.7986" y="1067.2267" clip-path="url(#clipPath2)" fill="none" width="389.8201" stroke-dasharray="6,2" rx="4" ry="4" height="324.666"/>
-    </g>
-    <g fill="white" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="white">
-      <rect x="1536.66" width="78.6523" height="56.3984" y="1211.6935" clip-path="url(#clipPath2)" stroke="none"/>
-    </g>
-    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-124,15)" stroke-linecap="butt">
-      <text x="1551.1306" xml:space="preserve" y="1230.295" clip-path="url(#clipPath2)" stroke="none">ValueSet</text>
-      <text x="1574.0876" xml:space="preserve" y="1244.4279" clip-path="url(#clipPath2)" stroke="none"> </text>
-      <text x="1543.6599" xml:space="preserve" y="1258.5607" clip-path="url(#clipPath2)" stroke="none">getValues()</text>
-      <rect fill="none" x="1536.66" width="78.6523" height="56.3984" y="1211.6935" clip-path="url(#clipPath2)"/>
-    </g>
-    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="rgb(255,204,0)">
-      <rect x="1416.2039" width="111.2012" height="30" y="1346.8927" clip-path="url(#clipPath2)" stroke="none"/>
-    </g>
-    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-124,15)" stroke-linecap="butt">
-      <text x="1423.2039" xml:space="preserve" y="1366.4279" clip-path="url(#clipPath2)" stroke="none">DiscreteValueSet</text>
-      <rect fill="none" x="1416.2039" width="111.2012" height="30" y="1346.8927" clip-path="url(#clipPath2)"/>
-    </g>
-    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="rgb(255,204,0)">
-      <rect x="1402.7986" width="110.375" height="30" y="1183.8927" clip-path="url(#clipPath2)" stroke="none"/>
-    </g>
-    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-124,15)" stroke-linecap="butt">
-      <text x="1409.7986" xml:space="preserve" y="1203.4279" clip-path="url(#clipPath2)" stroke="none">NumberValueSet</text>
-      <rect fill="none" x="1402.7986" width="110.375" height="30" y="1183.8927" clip-path="url(#clipPath2)"/>
-    </g>
-    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="rgb(255,204,0)">
-      <rect x="1659.7028" width="102.916" height="98.7969" y="1149.4943" clip-path="url(#clipPath2)" stroke="none"/>
-    </g>
-    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-124,15)" stroke-linecap="butt">
-      <text x="1688.608" xml:space="preserve" y="1168.0958" clip-path="url(#clipPath2)" stroke="none">Domain</text>
-      <text x="1709.2623" xml:space="preserve" y="1182.2286" clip-path="url(#clipPath2)" stroke="none"> </text>
-      <text x="1681.2399" xml:space="preserve" y="1196.3615" clip-path="url(#clipPath2)" stroke="none">getName()</text>
-      <text x="1679.9596" xml:space="preserve" y="1210.4943" clip-path="url(#clipPath2)" stroke="none">getIssues()</text>
-      <text x="1678.8346" xml:space="preserve" y="1224.6271" clip-path="url(#clipPath2)" stroke="none">getValues()</text>
-      <text x="1666.7028" xml:space="preserve" y="1238.7599" clip-path="url(#clipPath2)" stroke="none">iscomplete(Bid)</text>
-      <rect fill="none" x="1659.7028" width="102.916" height="98.7969" y="1149.4943" clip-path="url(#clipPath2)"/>
-    </g>
-    <g fill="white" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="white">
-      <rect x="1599.949" width="46.0742" height="30" y="1291.8927" clip-path="url(#clipPath2)" stroke="none"/>
-    </g>
-    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-124,15)" stroke-linecap="butt">
-      <text x="1606.949" xml:space="preserve" y="1311.4279" clip-path="url(#clipPath2)" stroke="none">Value</text>
-      <rect fill="none" x="1599.949" width="46.0742" height="30" y="1291.8927" clip-path="url(#clipPath2)"/>
-    </g>
-    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="rgb(255,204,0)">
-      <rect x="1541.0242" width="31.9238" height="30" y="1103.8927" clip-path="url(#clipPath2)" stroke="none"/>
-    </g>
-    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-124,15)" stroke-linecap="butt">
-      <text x="1548.0242" xml:space="preserve" y="1123.4279" clip-path="url(#clipPath2)" stroke="none">Bid</text>
-      <rect fill="none" x="1541.0242" width="31.9238" height="30" y="1103.8927" clip-path="url(#clipPath2)"/>
-    </g>
-    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="rgb(255,204,0)">
-      <rect x="1416.2039" width="93.5645" height="30" y="1291.8927" clip-path="url(#clipPath2)" stroke="none"/>
-    </g>
-    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-124,15)" stroke-linecap="butt">
-      <text x="1423.2039" xml:space="preserve" y="1311.4279" clip-path="url(#clipPath2)" stroke="none">DiscreteValue</text>
-      <rect fill="none" x="1416.2039" width="93.5645" height="30" y="1291.8927" clip-path="url(#clipPath2)"/>
-    </g>
-    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="rgb(255,204,0)">
-      <rect x="1557.4051" width="92.7383" height="30" y="1346.8927" clip-path="url(#clipPath2)" stroke="none"/>
-    </g>
-    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-124,15)" stroke-linecap="butt">
-      <text x="1564.405" xml:space="preserve" y="1366.4279" clip-path="url(#clipPath2)" stroke="none">NumberValue</text>
-      <rect fill="none" x="1557.4051" width="92.7383" height="30" y="1346.8927" clip-path="url(#clipPath2)"/>
-      <path fill="none" d="M1484.6138 1346.8927 L1542.1647 1279.4988" clip-path="url(#clipPath2)"/>
-      <path fill="white" d="M1551.9055 1268.0919 L1536.9525 1276.3629 L1546.078 1284.1555 Z" clip-path="url(#clipPath2)" stroke="none"/>
-      <path fill="none" d="M1551.9055 1268.0919 L1536.9525 1276.3629 L1546.078 1284.1555 Z" clip-path="url(#clipPath2)"/>
-      <path fill="none" d="M1501.1569 1213.8927 L1522.4908 1221.3054" clip-path="url(#clipPath2)"/>
-      <path fill="white" d="M1536.6599 1226.2285 L1523.5155 1215.3096 L1519.577 1226.6449 Z" clip-path="url(#clipPath2)" stroke="none"/>
-      <path fill="none" d="M1536.6599 1226.2285 L1523.5155 1215.3096 L1519.577 1226.6449 Z" clip-path="url(#clipPath2)"/>
-      <path fill="none" d="M1484.0994 1587.5322 L1682.2999 1248.2911" clip-path="url(#clipPath2)"/>
-      <path d="M1480.5682 1593.5763 L1479.7822 1585.01 L1487.6305 1581.4882 L1488.4166 1590.0544 Z" clip-path="url(#clipPath2)" stroke="none"/>
-      <path fill="none" d="M1653.0042 1216.5322 L1615.3123 1227.9646" clip-path="url(#clipPath2)"/>
-      <path d="M1659.7028 1214.5005 L1654.4553 1221.317 L1646.3054 1218.564 L1651.5529 1211.7474 Z" clip-path="url(#clipPath2)" stroke="none"/>
-      <text x="1619.7039" xml:space="preserve" y="1225.7677" clip-path="url(#clipPath2)" stroke="none">*Issue</text>
-      <path fill="none" d="M1564.5708 1140.4976 L1617.7202 1291.8927" clip-path="url(#clipPath2)"/>
-      <path d="M1562.2521 1133.8927 L1569.2885 1138.8413 L1566.8895 1147.1023 L1559.853 1142.1537 Z" clip-path="url(#clipPath2)" stroke="none"/>
-      <text x="1575.4863" xml:space="preserve" y="1152.4943" clip-path="url(#clipPath2)" stroke="none">   *Issue</text>
-      <path fill="none" d="M1468.2913 1339.981 L1465.3911 1321.8927" clip-path="url(#clipPath2)"/>
-      <path d="M1469.3995 1346.8927 L1463.3544 1340.7726 L1467.183 1333.0693 L1473.2281 1339.1893 Z" clip-path="url(#clipPath2)" stroke="none"/>
-      <text x="1458.8083" xml:space="preserve" y="1338.9279" clip-path="url(#clipPath2)" stroke="none">   *</text>
-      <path fill="none" d="M1509.7683 1306.8927 L1584.949 1306.8927" clip-path="url(#clipPath2)"/>
-      <path fill="white" d="M1599.949 1306.8927 L1583.949 1300.8927 L1583.949 1312.8927 Z" clip-path="url(#clipPath2)" stroke="none"/>
-      <path fill="none" d="M1599.949 1306.8927 L1583.949 1300.8927 L1583.949 1312.8927 Z" clip-path="url(#clipPath2)"/>
-      <path fill="none" d="M1476.0688 1219.1102 L1590.3582 1346.8927" clip-path="url(#clipPath2)"/>
-      <path d="M1471.4022 1213.8927 L1479.7957 1215.777 L1480.7355 1224.3278 L1472.342 1222.4435 Z" clip-path="url(#clipPath2)" stroke="none"/>
-      <text x="1475.3964" xml:space="preserve" y="1232.4943" clip-path="url(#clipPath2)" stroke="none">   *</text>
-      <path fill="none" d="M1609.0138 1346.8927 L1612.8 1336.0536" clip-path="url(#clipPath2)"/>
-      <path fill="white" d="M1617.7466 1321.8927 L1606.8059 1335.019 L1618.1346 1338.9763 Z" clip-path="url(#clipPath2)" stroke="none"/>
-      <path fill="none" d="M1617.7466 1321.8927 L1606.8059 1335.019 L1618.1346 1338.9763 Z" clip-path="url(#clipPath2)"/>
-    </g>
-    <g fill="rgb(245,245,245)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="rgb(245,245,245)">
-      <rect x="768.4454" y="1207.95" clip-path="url(#clipPath2)" width="440.0229" rx="4" ry="4" height="470.662" stroke="none"/>
-      <rect x="768.4454" y="1207.95" clip-path="url(#clipPath2)" fill="rgb(235,235,235)" width="440.0229" height="21.666" stroke="none"/>
-    </g>
-    <g font-size="15px" stroke-linecap="butt" transform="matrix(1,0,0,1,-124,15)" text-rendering="geometricPrecision" font-family="sans-serif" shape-rendering="geometricPrecision" stroke-miterlimit="1.45">
-      <text x="1160.2817" xml:space="preserve" y="1224.4519" clip-path="url(#clipPath2)" stroke="none">Profile</text>
-      <rect x="768.4454" y="1207.95" clip-path="url(#clipPath2)" fill="none" width="440.0229" stroke-dasharray="6,2" rx="4" ry="4" height="470.662"/>
-    </g>
-    <g fill="white" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="white">
-      <rect x="897.769" width="134.4688" height="70.5312" y="1593.0808" clip-path="url(#clipPath2)" stroke="none"/>
-    </g>
-    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-124,15)" stroke-linecap="butt">
-      <text x="947.5288" xml:space="preserve" y="1612.6824" clip-path="url(#clipPath2)" stroke="none">Profile</text>
-      <text x="964.105" xml:space="preserve" y="1626.8152" clip-path="url(#clipPath2)" stroke="none"> </text>
-      <text x="927.0913" xml:space="preserve" y="1640.948" clip-path="url(#clipPath2)" stroke="none">String name()</text>
-      <text x="905.769" xml:space="preserve" y="1655.0808" clip-path="url(#clipPath2)" stroke="none">Domain getDomain()</text>
-      <rect fill="none" x="897.769" width="134.4688" height="70.5312" y="1593.0808" clip-path="url(#clipPath2)"/>
-    </g>
-    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="rgb(255,204,0)">
-      <rect x="1028.7827" width="164.6855" height="30" y="1485.3464" clip-path="url(#clipPath2)" stroke="none"/>
-    </g>
-    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-124,15)" stroke-linecap="butt">
-      <text x="1035.7827" xml:space="preserve" y="1504.8816" clip-path="url(#clipPath2)" stroke="none">LinearAdditiveUtilitySpace</text>
-      <rect fill="none" x="1028.7827" width="164.6855" height="30" y="1485.3464" clip-path="url(#clipPath2)"/>
-    </g>
-    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="rgb(255,204,0)">
-      <rect x="1092.9809" width="98.4395" height="30" y="1253.2712" clip-path="url(#clipPath2)" stroke="none"/>
-    </g>
-    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-124,15)" stroke-linecap="butt">
-      <text x="1099.981" xml:space="preserve" y="1272.8064" clip-path="url(#clipPath2)" stroke="none">DiscreteProfile</text>
-      <rect fill="none" x="1092.9809" width="98.4395" height="30" y="1253.2712" clip-path="url(#clipPath2)"/>
-    </g>
-    <g fill="white" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="white">
-      <rect x="929.939" width="118.3789" height="70.5312" y="1244.616" clip-path="url(#clipPath2)" stroke="none"/>
-    </g>
-    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-124,15)" stroke-linecap="butt">
-      <text x="942.2886" xml:space="preserve" y="1263.2175" clip-path="url(#clipPath2)" stroke="none">ValueSetUtilities</text>
-      <text x="987.23" xml:space="preserve" y="1277.3503" clip-path="url(#clipPath2)" stroke="none"> </text>
-      <text x="942.8774" xml:space="preserve" y="1291.4832" clip-path="url(#clipPath2)" stroke="none">getUtility(Value)</text>
-      <text x="936.939" xml:space="preserve" y="1305.616" clip-path="url(#clipPath2)" stroke="none">isFitting(ValueSet)</text>
-      <rect fill="none" x="929.939" width="118.3789" height="70.5312" y="1244.616" clip-path="url(#clipPath2)"/>
-    </g>
-    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="rgb(255,204,0)">
-      <rect x="783.4454" width="97.6133" height="30" y="1285.1472" clip-path="url(#clipPath2)" stroke="none"/>
-    </g>
-    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-124,15)" stroke-linecap="butt">
-      <text x="790.4454" xml:space="preserve" y="1304.6824" clip-path="url(#clipPath2)" stroke="none">NumberProfile</text>
-      <rect fill="none" x="783.4454" width="97.6133" height="30" y="1285.1472" clip-path="url(#clipPath2)"/>
-    </g>
-    <g fill="white" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="white">
-      <rect x="1030.8306" width="160.5898" height="56.3984" y="1371.2468" clip-path="url(#clipPath2)" stroke="none"/>
-    </g>
-    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-124,15)" stroke-linecap="butt">
-      <text x="1077.4048" xml:space="preserve" y="1389.8484" clip-path="url(#clipPath2)" stroke="none">UtilitySpace</text>
-      <text x="1109.2271" xml:space="preserve" y="1403.9812" clip-path="url(#clipPath2)" stroke="none"> </text>
-      <text x="1037.8306" xml:space="preserve" y="1418.114" clip-path="url(#clipPath2)" stroke="none">BigDecimal getUtility(Bid)</text>
-      <rect fill="none" x="1030.8306" width="160.5898" height="56.3984" y="1371.2468" clip-path="url(#clipPath2)"/>
-    </g>
-    <g fill="white" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="white">
-      <rect x="800.8774" width="170.252" height="56.3984" y="1485.3464" clip-path="url(#clipPath2)" stroke="none"/>
-    </g>
-    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-124,15)" stroke-linecap="butt">
-      <text x="842.0024" xml:space="preserve" y="1503.948" clip-path="url(#clipPath2)" stroke="none">PartialOrdering</text>
-      <text x="884.105" xml:space="preserve" y="1518.0808" clip-path="url(#clipPath2)" stroke="none"> </text>
-      <text x="807.8774" xml:space="preserve" y="1532.2136" clip-path="url(#clipPath2)" stroke="none">isPreferredOrEqual(Bid,Bid)</text>
-      <rect fill="none" x="800.8774" width="170.252" height="56.3984" y="1485.3464" clip-path="url(#clipPath2)"/>
-    </g>
-    <g fill="white" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="white">
-      <rect x="876.3423" width="95.3223" height="30" y="1337.3464" clip-path="url(#clipPath2)" stroke="none"/>
-    </g>
-    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-124,15)" stroke-linecap="butt">
-      <text x="883.3423" xml:space="preserve" y="1356.8816" clip-path="url(#clipPath2)" stroke="none">TotalOrdering</text>
-      <rect fill="none" x="876.3423" width="95.3223" height="30" y="1337.3464" clip-path="url(#clipPath2)"/>
-    </g>
-    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="rgb(255,204,0)">
-      <rect x="1071.9048" width="78.4414" height="30" y="1569.4443" clip-path="url(#clipPath2)" stroke="none"/>
-    </g>
-    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-124,15)" stroke-linecap="butt">
-      <text x="1078.9048" xml:space="preserve" y="1588.9795" clip-path="url(#clipPath2)" stroke="none">BigDecimal</text>
-      <rect fill="none" x="1071.9048" width="78.4414" height="30" y="1569.4443" clip-path="url(#clipPath2)"/>
-      <path fill="none" stroke-dasharray="6,2" d="M1208.4359 1364.166 L1383.0548 1301.3647" clip-path="url(#clipPath2)"/>
-      <path stroke-dasharray="6,2" d="M1386.8187 1300.011 L1373.4963 1298.4263 L1386.8187 1300.011 L1377.5575 1309.7181 Z" clip-path="url(#clipPath2)" stroke="none"/>
-      <path fill="none" stroke-miterlimit="10" d="M1386.8187 1300.011 L1373.4963 1298.4263 L1386.8187 1300.011 L1377.5575 1309.7181 Z" clip-path="url(#clipPath2)" stroke-linecap="square"/>
-      <path fill="none" d="M1394.095 1611.6077 L1032.2378 1625.7236" clip-path="url(#clipPath2)"/>
-      <path d="M1401.0896 1611.3348 L1394.2898 1616.6039 L1387.1002 1611.8805 L1393.9 1606.6115 Z" clip-path="url(#clipPath2)" stroke="none"/>
-      <path fill="none" stroke-dasharray="6,2" d="M1005.9819 1593.0808 L1537.2344 1135.8909" clip-path="url(#clipPath2)"/>
-      <path stroke-dasharray="6,2" d="M1540.2662 1133.2817 L1527.2568 1136.5615 L1540.2662 1133.2817 L1535.0845 1145.6571 Z" clip-path="url(#clipPath2)" stroke="none"/>
-      <path fill="none" stroke-miterlimit="10" d="M1540.2662 1133.2817 L1527.2568 1136.5615 L1540.2662 1133.2817 L1535.0845 1145.6571 Z" clip-path="url(#clipPath2)" stroke-linecap="square"/>
-      <path fill="none" d="M1198.1541 1284.1643 L1418.9955 1346.8927" clip-path="url(#clipPath2)"/>
-      <path d="M1191.4204 1282.2517 L1199.5201 1279.3546 L1204.8877 1286.0769 L1196.788 1288.974 Z" clip-path="url(#clipPath2)" stroke="none"/>
-      <text x="1198.4204" xml:space="preserve" y="1291.4705" clip-path="url(#clipPath2)" stroke="none">   1</text>
-      <path fill="none" d="M1099.4358 1479.2216 L1008.6431 1315.1472" clip-path="url(#clipPath2)"/>
-      <path d="M1102.8251 1485.3463 L1095.061 1481.6425 L1096.0466 1473.0967 L1103.8107 1476.8007 Z" clip-path="url(#clipPath2)" stroke="none"/>
-      <text x="1077.2375" xml:space="preserve" y="1475.8152" clip-path="url(#clipPath2)" stroke="none">*Issue</text>
-      <path fill="none" d="M1092.981 1272.0045 L1063.2749 1274.2577" clip-path="url(#clipPath2)"/>
-      <path fill="white" d="M1048.3179 1275.3921 L1064.7258 1280.1649 L1063.8182 1268.1992 Z" clip-path="url(#clipPath2)" stroke="none"/>
-      <path fill="none" d="M1048.3179 1275.3921 L1064.7258 1280.1649 L1063.8182 1268.1992 Z" clip-path="url(#clipPath2)"/>
-      <path fill="none" d="M887.9688 1291.1313 L1402.7986 1207.823" clip-path="url(#clipPath2)"/>
-      <path d="M881.0587 1292.2495 L887.1701 1286.1956 L894.8789 1290.0132 L888.7675 1296.0671 Z" clip-path="url(#clipPath2)" stroke="none"/>
-      <text x="888.0587" xml:space="preserve" y="1294.1163" clip-path="url(#clipPath2)" stroke="none">   1</text>
-      <path fill="none" d="M881.0587 1293.8423 L915.0626 1289.4496" clip-path="url(#clipPath2)"/>
-      <path fill="white" d="M929.939 1287.5278 L913.3021 1283.6272 L914.8395 1295.5282 Z" clip-path="url(#clipPath2)" stroke="none"/>
-      <path fill="none" d="M929.939 1287.5278 L913.3021 1283.6272 L914.8395 1295.5282 Z" clip-path="url(#clipPath2)"/>
-      <path fill="none" d="M1111.1255 1485.3464 L1111.1255 1442.6453" clip-path="url(#clipPath2)"/>
-      <path fill="white" d="M1111.1255 1427.6453 L1105.1255 1443.6453 L1117.1255 1443.6453 Z" clip-path="url(#clipPath2)" stroke="none"/>
-      <path fill="none" d="M1111.1255 1427.6453 L1105.1255 1443.6453 L1117.1255 1443.6453 Z" clip-path="url(#clipPath2)"/>
-      <path fill="none" d="M905.4086 1541.7449 L932.2321 1580.7239" clip-path="url(#clipPath2)"/>
-      <path fill="white" d="M940.7354 1593.0808 L936.608 1576.4988 L926.7224 1583.3014 Z" clip-path="url(#clipPath2)" stroke="none"/>
-      <path fill="none" d="M940.7354 1593.0808 L936.608 1576.4988 L926.7224 1583.3014 Z" clip-path="url(#clipPath2)"/>
-      <path fill="none" d="M1030.8306 1379.2354 L986.2108 1368.0043" clip-path="url(#clipPath2)"/>
-      <path fill="white" d="M971.6646 1364.3429 L985.716 1374.0669 L988.6451 1362.4298 Z" clip-path="url(#clipPath2)" stroke="none"/>
-      <path fill="none" d="M971.6646 1364.3429 L985.716 1374.0669 L988.6451 1362.4298 Z" clip-path="url(#clipPath2)"/>
-      <path fill="none" d="M920.4674 1367.3464 L896.0925 1470.7466" clip-path="url(#clipPath2)"/>
-      <path fill="white" d="M892.6509 1485.3464 L902.1619 1471.1499 L890.4821 1468.3966 Z" clip-path="url(#clipPath2)" stroke="none"/>
-      <path fill="none" d="M892.6509 1485.3464 L902.1619 1471.1499 L890.4821 1468.3966 Z" clip-path="url(#clipPath2)"/>
-      <path fill="none" d="M1111.1255 1522.3464 L1111.1255 1569.4443" clip-path="url(#clipPath2)"/>
-      <path d="M1111.1255 1515.3464 L1116.1255 1522.3464 L1111.1255 1529.3464 L1106.1255 1522.3464 Z" clip-path="url(#clipPath2)" stroke="none"/>
-      <text x="1093.3218" xml:space="preserve" y="1533.948" clip-path="url(#clipPath2)" stroke="none">*Issue</text>
-    </g>
-    <g fill="rgb(245,245,245)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="rgb(245,245,245)">
-      <rect x="139.6685" y="755.7577" clip-path="url(#clipPath2)" width="967.917" rx="4" ry="4" height="350.665" stroke="none"/>
-      <rect x="139.6685" y="755.7577" clip-path="url(#clipPath2)" fill="rgb(235,235,235)" width="967.917" height="21.666" stroke="none"/>
-    </g>
-    <g font-size="15px" stroke-linecap="butt" transform="matrix(1,0,0,1,-124,15)" text-rendering="geometricPrecision" font-family="sans-serif" shape-rendering="geometricPrecision" stroke-miterlimit="1.45">
-      <text x="1058.542" xml:space="preserve" y="772.2596" clip-path="url(#clipPath2)" stroke="none">events</text>
-      <rect x="139.6685" y="755.7577" clip-path="url(#clipPath2)" fill="none" width="967.917" stroke-dasharray="6,2" rx="4" ry="4" height="350.665"/>
-      <path fill="none" stroke-dasharray="6,2" d="M529.7785 716.8433 L544.8076 751.1532" clip-path="url(#clipPath2)"/>
-      <path stroke-dasharray="6,2" d="M546.4125 754.8171 L547.0936 741.418 L546.4125 754.8171 L536.1019 746.2328 Z" clip-path="url(#clipPath2)" stroke="none"/>
-    </g>
-    <g text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)">
-      <path fill="none" d="M546.4125 754.8171 L547.0936 741.418 L546.4125 754.8171 L536.1019 746.2328 Z" clip-path="url(#clipPath2)"/>
-      <path fill="none" stroke-miterlimit="1.45" stroke-dasharray="6,2" d="M1107.5874 1081.7003 L1383.0316 1167.4194" clip-path="url(#clipPath2)" stroke-linecap="butt"/>
-      <path stroke-miterlimit="1.45" stroke-dasharray="6,2" d="M1386.851 1168.6082 L1377.176 1159.3131 L1386.851 1168.6082 L1373.6101 1170.7711 Z" clip-path="url(#clipPath2)" stroke-linecap="butt" stroke="none"/>
-      <path fill="none" d="M1386.851 1168.6082 L1377.176 1159.3131 L1386.851 1168.6082 L1373.6101 1170.7711 Z" clip-path="url(#clipPath2)"/>
-      <rect x="495.5688" y="792.4237" clip-path="url(#clipPath2)" fill="rgb(225,225,225)" width="293.7764" rx="4" ry="4" height="290.666" stroke="none"/>
-      <rect x="495.5688" y="792.4237" clip-path="url(#clipPath2)" fill="rgb(235,235,235)" width="293.7764" height="21.666" stroke="none"/>
-    </g>
-    <g font-size="15px" stroke-linecap="butt" transform="matrix(1,0,0,1,-124,15)" text-rendering="geometricPrecision" font-family="sans-serif" shape-rendering="geometricPrecision" stroke-miterlimit="1.45">
-      <text x="735.2627" xml:space="preserve" y="808.9256" clip-path="url(#clipPath2)" stroke="none">actions</text>
-      <rect x="495.5688" y="792.4237" clip-path="url(#clipPath2)" fill="none" width="293.7764" stroke-dasharray="6,2" rx="4" ry="4" height="290.666"/>
-    </g>
-    <g fill="white" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="white">
-      <rect x="585.8735" width="51.2012" height="30" y="876.0897" clip-path="url(#clipPath2)" stroke="none"/>
-    </g>
-    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-124,15)" stroke-linecap="butt">
-      <text x="592.8735" xml:space="preserve" y="895.6248" clip-path="url(#clipPath2)" stroke="none">Action</text>
-      <rect fill="none" x="585.8735" width="51.2012" height="30" y="876.0897" clip-path="url(#clipPath2)"/>
-    </g>
-    <g fill="white" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="white">
-      <rect x="613.0767" width="94.7949" height="30" y="1038.0897" clip-path="url(#clipPath2)" stroke="none"/>
-    </g>
-    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-124,15)" stroke-linecap="butt">
-      <text x="620.0767" xml:space="preserve" y="1057.6249" clip-path="url(#clipPath2)" stroke="none">ActionWithBid</text>
-      <rect fill="none" x="613.0767" width="94.7949" height="30" y="1038.0897" clip-path="url(#clipPath2)"/>
-    </g>
-    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="rgb(255,204,0)">
-      <rect x="730.603" width="43.7422" height="30" y="1010.0897" clip-path="url(#clipPath2)" stroke="none"/>
-    </g>
-    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-124,15)" stroke-linecap="butt">
-      <text x="737.603" xml:space="preserve" y="1029.6249" clip-path="url(#clipPath2)" stroke="none">Offer</text>
-      <rect fill="none" x="730.603" width="43.7422" height="30" y="1010.0897" clip-path="url(#clipPath2)"/>
-    </g>
-    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="rgb(255,204,0)">
-      <rect x="648.8403" width="103.2676" height="30" y="930.0897" clip-path="url(#clipPath2)" stroke="none"/>
-    </g>
-    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-124,15)" stroke-linecap="butt">
-      <text x="655.8403" xml:space="preserve" y="949.6248" clip-path="url(#clipPath2)" stroke="none">EndNegotiation</text>
-      <rect fill="none" x="648.8403" width="103.2676" height="30" y="930.0897" clip-path="url(#clipPath2)"/>
-    </g>
-    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="rgb(255,204,0)">
-      <rect x="536.8247" width="53.2988" height="30" y="1015.0897" clip-path="url(#clipPath2)" stroke="none"/>
-    </g>
-    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-124,15)" stroke-linecap="butt">
-      <text x="543.8247" xml:space="preserve" y="1034.6249" clip-path="url(#clipPath2)" stroke="none">Accept</text>
-      <rect fill="none" x="536.8247" width="53.2988" height="30" y="1015.0897" clip-path="url(#clipPath2)"/>
-    </g>
-    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="rgb(255,204,0)">
-      <rect x="510.5688" width="99.8105" height="30" y="937.0897" clip-path="url(#clipPath2)" stroke="none"/>
-    </g>
-    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-124,15)" stroke-linecap="butt">
-      <text x="517.5688" xml:space="preserve" y="956.6248" clip-path="url(#clipPath2)" stroke="none">AbstractAction</text>
-      <rect fill="none" x="510.5688" width="99.8105" height="30" y="937.0897" clip-path="url(#clipPath2)"/>
-    </g>
-    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="rgb(255,204,0)">
-      <rect x="689.7876" width="55.373" height="30" y="829.0897" clip-path="url(#clipPath2)" stroke="none"/>
-    </g>
-    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-124,15)" stroke-linecap="butt">
-      <text x="696.7876" xml:space="preserve" y="848.6248" clip-path="url(#clipPath2)" stroke="none">PartyID</text>
-      <rect fill="none" x="689.7876" width="55.373" height="30" y="829.0897" clip-path="url(#clipPath2)"/>
-      <path fill="none" d="M714.8528 1057.0811 L1541.0242 1117.7211" clip-path="url(#clipPath2)"/>
-      <path d="M707.8716 1056.5686 L715.2188 1052.0945 L721.834 1057.5935 L714.4868 1062.0676 Z" clip-path="url(#clipPath2)" stroke="none"/>
-      <text x="714.8716" xml:space="preserve" y="1062.3141" clip-path="url(#clipPath2)" stroke="none">   1</text>
-      <path fill="none" d="M730.603 1031.7461 L722.2217 1034.297" clip-path="url(#clipPath2)"/>
-      <path fill="white" d="M707.8716 1038.6644 L724.9254 1039.7458 L721.4314 1028.2657 Z" clip-path="url(#clipPath2)" stroke="none"/>
-      <path fill="none" d="M707.8716 1038.6644 L724.9254 1039.7458 L721.4314 1028.2657 Z" clip-path="url(#clipPath2)"/>
-      <path fill="none" d="M675.7519 930.0897 L649.0204 913.8706" clip-path="url(#clipPath2)"/>
-      <path fill="white" d="M636.1964 906.0897 L646.763 919.519 L652.9877 909.2597 Z" clip-path="url(#clipPath2)" stroke="none"/>
-      <path fill="none" d="M636.1964 906.0897 L646.763 919.519 L652.9877 909.2597 Z" clip-path="url(#clipPath2)"/>
-      <path fill="none" d="M590.1235 1036.4086 L598.4813 1038.3904" clip-path="url(#clipPath2)"/>
-      <path fill="white" d="M613.0767 1041.8511 L598.8926 1032.3215 L596.124 1043.9978 Z" clip-path="url(#clipPath2)" stroke="none"/>
-      <path fill="none" d="M613.0767 1041.8511 L598.8926 1032.3215 L596.124 1043.9978 Z" clip-path="url(#clipPath2)"/>
-      <path fill="none" d="M645.6226 1038.0897 L585.8793 977.7489" clip-path="url(#clipPath2)"/>
-      <path fill="white" d="M575.3256 967.0897 L582.3192 982.681 L590.8466 974.238 Z" clip-path="url(#clipPath2)" stroke="none"/>
-      <path fill="none" d="M575.3256 967.0897 L582.3192 982.681 L590.8466 974.238 Z" clip-path="url(#clipPath2)"/>
-      <path fill="none" d="M573.0151 937.0897 L589.3118 917.5975" clip-path="url(#clipPath2)"/>
-      <path fill="white" d="M598.9332 906.0897 L584.0673 914.5162 L593.2736 922.2133 Z" clip-path="url(#clipPath2)" stroke="none"/>
-      <path fill="none" d="M598.9332 906.0897 L584.0673 914.5162 L593.2736 922.2133 Z" clip-path="url(#clipPath2)"/>
-      <path fill="none" stroke-dasharray="6,2" d="M637.0747 879.7385 L685.2167 858.3925" clip-path="url(#clipPath2)"/>
-      <path stroke-dasharray="6,2" d="M688.8734 856.7711 L675.4714 856.1501 L688.8734 856.7711 L680.3354 867.1201 Z" clip-path="url(#clipPath2)" stroke="none"/>
-      <path fill="none" stroke-miterlimit="10" d="M688.8734 856.7711 L675.4714 856.1501 L688.8734 856.7711 L680.3354 867.1201 Z" clip-path="url(#clipPath2)" stroke-linecap="square"/>
-    </g>
-    <g fill="rgb(225,225,225)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="rgb(225,225,225)">
-      <rect x="154.6685" y="812.7567" clip-path="url(#clipPath2)" width="302.7109" rx="4" ry="4" height="278.666" stroke="none"/>
-      <rect x="154.6685" y="812.7567" clip-path="url(#clipPath2)" fill="rgb(235,235,235)" width="302.7109" height="21.666" stroke="none"/>
-    </g>
-    <g font-size="15px" stroke-linecap="butt" transform="matrix(1,0,0,1,-124,15)" text-rendering="geometricPrecision" font-family="sans-serif" shape-rendering="geometricPrecision" stroke-miterlimit="1.45">
-      <text x="408.3359" xml:space="preserve" y="829.2586" clip-path="url(#clipPath2)" stroke="none">events</text>
-      <rect x="154.6685" y="812.7567" clip-path="url(#clipPath2)" fill="none" width="302.7109" stroke-dasharray="6,2" rx="4" ry="4" height="278.666"/>
-    </g>
-    <g fill="white" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="white">
-      <rect x="319.561" width="113.0996" height="30" y="928.4227" clip-path="url(#clipPath2)" stroke="none"/>
-    </g>
-    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-124,15)" stroke-linecap="butt">
-      <text x="326.561" xml:space="preserve" y="947.9578" clip-path="url(#clipPath2)" stroke="none">NegotiationEvent</text>
-      <rect fill="none" x="319.561" width="113.0996" height="30" y="928.4227" clip-path="url(#clipPath2)"/>
-    </g>
-    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="rgb(255,204,0)">
-      <rect x="359.8423" width="82.5371" height="30" y="849.4227" clip-path="url(#clipPath2)" stroke="none"/>
-    </g>
-    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-124,15)" stroke-linecap="butt">
-      <text x="366.8423" xml:space="preserve" y="868.9578" clip-path="url(#clipPath2)" stroke="none">ActionEvent</text>
-      <rect fill="none" x="359.8423" width="82.5371" height="30" y="849.4227" clip-path="url(#clipPath2)"/>
-    </g>
-    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="rgb(255,204,0)">
-      <rect x="169.6685" width="98.8848" height="30" y="938.4227" clip-path="url(#clipPath2)" stroke="none"/>
-    </g>
-    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-124,15)" stroke-linecap="butt">
-      <text x="176.6685" xml:space="preserve" y="957.9578" clip-path="url(#clipPath2)" stroke="none">SessionStarted</text>
-      <rect fill="none" x="169.6685" width="98.8848" height="30" y="938.4227" clip-path="url(#clipPath2)"/>
-    </g>
-    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="rgb(255,204,0)">
-      <rect x="316.4048" width="93.4121" height="30" y="1046.4227" clip-path="url(#clipPath2)" stroke="none"/>
-    </g>
-    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-124,15)" stroke-linecap="butt">
-      <text x="323.4048" xml:space="preserve" y="1065.9579" clip-path="url(#clipPath2)" stroke="none">SessionEnded</text>
-      <rect fill="none" x="316.4048" width="93.4121" height="30" y="1046.4227" clip-path="url(#clipPath2)"/>
-    </g>
-    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="rgb(255,204,0)">
-      <rect x="208.896" width="126.4297" height="30" y="852.4227" clip-path="url(#clipPath2)" stroke="none"/>
-    </g>
-    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-124,15)" stroke-linecap="butt">
-      <text x="215.896" xml:space="preserve" y="871.9578" clip-path="url(#clipPath2)" stroke="none">TournamentStarted</text>
-      <rect fill="none" x="208.896" width="126.4297" height="30" y="852.4227" clip-path="url(#clipPath2)"/>
-    </g>
-    <g fill="white" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="white">
-      <rect x="242.563" width="93.0957" height="30" y="992.4227" clip-path="url(#clipPath2)" stroke="none"/>
-    </g>
-    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-124,15)" stroke-linecap="butt">
-      <text x="249.563" xml:space="preserve" y="1011.9578" clip-path="url(#clipPath2)" stroke="none">ProtocolEvent</text>
-      <rect fill="none" x="242.563" width="93.0957" height="30" y="992.4227" clip-path="url(#clipPath2)"/>
-      <path fill="none" d="M449.3238 870.5345 L585.8735 887.8444" clip-path="url(#clipPath2)"/>
-      <path d="M442.3794 869.6542 L449.9526 865.5742 L456.2682 871.4148 L448.695 875.4948 Z" clip-path="url(#clipPath2)" stroke="none"/>
-      <text x="449.3794" xml:space="preserve" y="876.2796" clip-path="url(#clipPath2)" stroke="none">   1</text>
-      <path fill="none" d="M396.364 879.4227 L385.3833 914.1217" clip-path="url(#clipPath2)"/>
-      <path fill="white" d="M380.8577 928.4227 L391.4054 914.9786 L379.9646 911.3581 Z" clip-path="url(#clipPath2)" stroke="none"/>
-      <path fill="none" d="M380.8577 928.4227 L391.4054 914.9786 L379.9646 911.3581 Z" clip-path="url(#clipPath2)"/>
-      <path fill="none" d="M238.5553 968.4227 L257.7897 983.2606" clip-path="url(#clipPath2)"/>
-      <path fill="white" d="M269.6664 992.4227 L260.6627 977.8991 L253.3331 987.4005 Z" clip-path="url(#clipPath2)" stroke="none"/>
-      <path fill="none" d="M269.6664 992.4227 L260.6627 977.8991 L253.3331 987.4005 Z" clip-path="url(#clipPath2)"/>
-      <path fill="none" d="M342.5553 1046.4227 L321.7833 1031.2648" clip-path="url(#clipPath2)"/>
-      <path fill="white" d="M309.6664 1022.4227 L319.0542 1036.701 L326.1279 1027.0076 Z" clip-path="url(#clipPath2)" stroke="none"/>
-      <path fill="none" d="M309.6664 1022.4227 L319.0542 1036.701 L326.1279 1027.0076 Z" clip-path="url(#clipPath2)"/>
-      <path fill="none" d="M273.9323 882.4227 L285.4813 977.532" clip-path="url(#clipPath2)"/>
-      <path fill="white" d="M287.2894 992.4227 L291.317 975.8161 L279.4045 977.2626 Z" clip-path="url(#clipPath2)" stroke="none"/>
-      <path fill="none" d="M287.2894 992.4227 L291.317 975.8161 L279.4045 977.2626 Z" clip-path="url(#clipPath2)"/>
-      <path fill="none" d="M309.5015 992.4227 L343.6374 967.3112" clip-path="url(#clipPath2)"/>
-      <path fill="white" d="M355.7202 958.4227 L339.2765 963.0707 L346.3873 972.7369 Z" clip-path="url(#clipPath2)" stroke="none"/>
-      <path fill="none" d="M355.7202 958.4227 L339.2765 963.0707 L346.3873 972.7369 Z" clip-path="url(#clipPath2)"/>
-    </g>
-    <g fill="rgb(225,225,225)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="rgb(225,225,225)">
-      <rect x="836.7046" y="800.5375" clip-path="url(#clipPath2)" width="255.8809" rx="4" ry="4" height="274.3256" stroke="none"/>
-      <rect x="836.7046" y="800.5375" clip-path="url(#clipPath2)" fill="rgb(235,235,235)" width="255.8809" height="21.666" stroke="none"/>
-    </g>
-    <g font-size="15px" stroke-linecap="butt" transform="matrix(1,0,0,1,-124,15)" text-rendering="geometricPrecision" font-family="sans-serif" shape-rendering="geometricPrecision" stroke-miterlimit="1.45">
-      <text x="1042.0698" xml:space="preserve" y="817.0394" clip-path="url(#clipPath2)" stroke="none">inform</text>
-      <rect x="836.7046" y="800.5375" clip-path="url(#clipPath2)" fill="none" width="255.8809" stroke-dasharray="6,2" rx="4" ry="4" height="274.3256"/>
-    </g>
-    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="rgb(255,204,0)">
-      <rect x="918.9868" width="52.8008" height="30" y="889.1823" clip-path="url(#clipPath2)" stroke="none"/>
-    </g>
-    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-124,15)" stroke-linecap="butt">
-      <text x="925.9868" xml:space="preserve" y="908.7175" clip-path="url(#clipPath2)" stroke="none">Inform</text>
-      <rect fill="none" x="918.9868" width="52.8008" height="30" y="889.1823" clip-path="url(#clipPath2)"/>
-    </g>
-    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="rgb(255,204,0)">
-      <rect x="874.1479" width="81.6934" height="30" y="837.2035" clip-path="url(#clipPath2)" stroke="none"/>
-    </g>
-    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-124,15)" stroke-linecap="butt">
-      <text x="881.1479" xml:space="preserve" y="856.7386" clip-path="url(#clipPath2)" stroke="none">ActionDone</text>
-      <rect fill="none" x="874.1479" width="81.6934" height="30" y="837.2035" clip-path="url(#clipPath2)"/>
-    </g>
-    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="rgb(255,204,0)">
-      <rect x="1016.9449" width="60.6406" height="30" y="855.971" clip-path="url(#clipPath2)" stroke="none"/>
-    </g>
-    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-124,15)" stroke-linecap="butt">
-      <text x="1023.9449" xml:space="preserve" y="875.5061" clip-path="url(#clipPath2)" stroke="none">Settings</text>
-      <rect fill="none" x="1016.9449" width="60.6406" height="30" y="855.971" clip-path="url(#clipPath2)"/>
-    </g>
-    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="rgb(255,204,0)">
-      <rect x="950.3022" width="62.6211" height="30" y="959.5227" clip-path="url(#clipPath2)" stroke="none"/>
-    </g>
-    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-124,15)" stroke-linecap="butt">
-      <text x="957.3022" xml:space="preserve" y="979.0579" clip-path="url(#clipPath2)" stroke="none">Finished</text>
-      <rect fill="none" x="950.3022" width="62.6211" height="30" y="959.5227" clip-path="url(#clipPath2)"/>
-    </g>
-    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="rgb(255,204,0)">
-      <rect x="851.7046" width="68.5977" height="30" y="959.5227" clip-path="url(#clipPath2)" stroke="none"/>
-    </g>
-    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-124,15)" stroke-linecap="butt">
-      <text x="858.7046" xml:space="preserve" y="979.0579" clip-path="url(#clipPath2)" stroke="none">YourTurn</text>
-      <rect fill="none" x="851.7046" width="68.5977" height="30" y="959.5227" clip-path="url(#clipPath2)"/>
-    </g>
-    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="rgb(255,204,0)">
-      <rect x="939.6206" width="83.9844" height="30" y="1029.8631" clip-path="url(#clipPath2)" stroke="none"/>
-    </g>
-    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke-linecap="butt">
-      <rect fill="none" x="939.6206" width="83.9844" height="30" y="1029.8631" clip-path="url(#clipPath2)"/>
-      <text x="946.6206" xml:space="preserve" y="1049.3982" clip-path="url(#clipPath2)" font-family="sans-serif" stroke="none">Agreements</text>
-      <path fill="none" d="M923.7653 867.2035 L929.0452 876.2334" clip-path="url(#clipPath2)"/>
-      <path fill="white" d="M936.6165 889.1823 L933.72 872.3416 L923.3608 878.3987 Z" clip-path="url(#clipPath2)" stroke="none"/>
-      <path fill="none" d="M936.6165 889.1823 L933.72 872.3416 L923.3608 878.3987 Z" clip-path="url(#clipPath2)"/>
-      <path fill="none" d="M1009.968 867.9309 L745.1606 846.3464" clip-path="url(#clipPath2)"/>
-      <path d="M1016.9449 868.4996 L1009.5618 872.9144 L1002.9911 867.3622 L1010.3742 862.9474 Z" clip-path="url(#clipPath2)" stroke="none"/>
-      <path fill="none" d="M1016.9449 880.8551 L986.049 890.9269" clip-path="url(#clipPath2)"/>
-      <path fill="white" d="M971.7876 895.576 L988.8593 896.3215 L985.1401 884.9125 Z" clip-path="url(#clipPath2)" stroke="none"/>
-      <path fill="none" d="M971.7876 895.576 L988.8593 896.3215 L985.1401 884.9125 Z" clip-path="url(#clipPath2)"/>
-      <path fill="none" d="M973.8878 959.5227 L959.98 932.5177" clip-path="url(#clipPath2)"/>
-      <path fill="white" d="M953.1123 919.1823 L955.1038 936.1538 L965.7721 930.6596 Z" clip-path="url(#clipPath2)" stroke="none"/>
-      <path fill="none" d="M953.1123 919.1823 L955.1038 936.1538 L965.7721 930.6596 Z" clip-path="url(#clipPath2)"/>
-      <path fill="none" d="M898.6669 959.5227 L923.0474 930.6439" clip-path="url(#clipPath2)"/>
-      <path fill="white" d="M932.7237 919.1823 L917.8176 927.5375 L926.9869 935.2785 Z" clip-path="url(#clipPath2)" stroke="none"/>
-      <path fill="none" d="M932.7237 919.1823 L917.8176 927.5375 L926.9869 935.2785 Z" clip-path="url(#clipPath2)"/>
-      <path fill="none" d="M981.6128 1029.863 L981.6128 996.5227" clip-path="url(#clipPath2)"/>
-      <path d="M981.6128 989.5227 L986.6128 996.5227 L981.6128 1003.5227 L976.6128 996.5227 Z" clip-path="url(#clipPath2)" stroke="none"/>
-    </g>
-    <g fill="rgb(245,245,245)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="rgb(245,245,245)">
-      <rect x="1370.0791" y="672.0411" clip-path="url(#clipPath2)" width="142.0586" rx="4" ry="4" height="278.666" stroke="none"/>
-      <rect x="1370.0791" y="672.0411" clip-path="url(#clipPath2)" fill="rgb(235,235,235)" width="142.0586" height="21.666" stroke="none"/>
-    </g>
-    <g font-size="15px" stroke-linecap="butt" transform="matrix(1,0,0,1,-124,15)" text-rendering="geometricPrecision" font-family="sans-serif" shape-rendering="geometricPrecision" stroke-miterlimit="1.45">
-      <text x="1473.978" xml:space="preserve" y="688.5431" clip-path="url(#clipPath2)" stroke="none">Party</text>
-      <rect x="1370.0791" y="672.0411" clip-path="url(#clipPath2)" fill="none" width="142.0586" stroke-dasharray="6,2" rx="4" ry="4" height="278.666"/>
-    </g>
-    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="rgb(255,204,0)">
-      <rect x="1385.0791" width="81.8281" height="30" y="708.7072" clip-path="url(#clipPath2)" stroke="none"/>
-    </g>
-    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-124,15)" stroke-linecap="butt">
-      <text x="1392.0791" xml:space="preserve" y="728.2423" clip-path="url(#clipPath2)" stroke="none">Capabilities</text>
-      <rect fill="none" x="1385.0791" width="81.8281" height="30" y="708.7072" clip-path="url(#clipPath2)"/>
-    </g>
-    <g fill="white" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="white">
-      <rect x="1388.8486" width="108.2891" height="70.5312" y="776.4415" clip-path="url(#clipPath2)" stroke="none"/>
-    </g>
-    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-124,15)" stroke-linecap="butt">
-      <text x="1428.5293" xml:space="preserve" y="795.0431" clip-path="url(#clipPath2)" stroke="none">Party</text>
-      <text x="1395.8486" xml:space="preserve" y="809.1759" clip-path="url(#clipPath2)" stroke="none">getCapabilities()</text>
-      <text x="1411.0889" xml:space="preserve" y="823.3087" clip-path="url(#clipPath2)" stroke="none">terminate()</text>
-      <text x="1396.4404" xml:space="preserve" y="837.4415" clip-path="url(#clipPath2)" stroke="none">getDescription()</text>
-      <rect fill="none" x="1388.8486" width="108.2891" height="70.5312" y="776.4415" clip-path="url(#clipPath2)"/>
-    </g>
-    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="rgb(255,204,0)">
-      <rect x="1396.4707" width="85.0449" height="30" y="905.7072" clip-path="url(#clipPath2)" stroke="none"/>
-    </g>
-    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-124,15)" stroke-linecap="butt">
-      <text x="1403.4707" xml:space="preserve" y="925.2423" clip-path="url(#clipPath2)" stroke="none">DefaultParty</text>
-      <rect fill="none" x="1396.4707" width="85.0449" height="30" y="905.7072" clip-path="url(#clipPath2)"/>
-      <path fill="none" stroke-dasharray="6,2" d="M1946.6234 598.6814 L1516.7743 779.5381" clip-path="url(#clipPath2)"/>
-      <path stroke-dasharray="6,2" d="M1513.0874 781.0894 L1526.4751 781.966 L1513.0874 781.0894 L1521.8213 770.9052 Z" clip-path="url(#clipPath2)" stroke="none"/>
-      <path fill="none" stroke-miterlimit="10" d="M1513.0874 781.0894 L1526.4751 781.966 L1513.0874 781.0894 L1521.8213 770.9052 Z" clip-path="url(#clipPath2)" stroke-linecap="square"/>
-      <path fill="none" stroke-dasharray="6,2" d="M1370.0776 910.5338 L1159.9348 1203.8958" clip-path="url(#clipPath2)"/>
-      <path stroke-dasharray="6,2" d="M1157.6055 1207.1475 L1169.4712 1200.8864 L1157.6055 1207.1475 L1159.7159 1193.8982 Z" clip-path="url(#clipPath2)" stroke="none"/>
-      <path fill="none" stroke-miterlimit="10" d="M1157.6055 1207.1475 L1169.4712 1200.8864 L1157.6055 1207.1475 L1159.7159 1193.8982 Z" clip-path="url(#clipPath2)" stroke-linecap="square"/>
-      <path fill="none" stroke-dasharray="6,2" d="M1370.0828 821.7755 L1112.5586 859.4886" clip-path="url(#clipPath2)"/>
-      <path stroke-dasharray="6,2" d="M1108.6008 860.0682 L1121.3435 864.266 L1108.6008 860.0682 L1119.6046 852.3926 Z" clip-path="url(#clipPath2)" stroke="none"/>
-      <path fill="none" stroke-miterlimit="10" d="M1108.6008 860.0682 L1121.3435 864.266 L1108.6008 860.0682 L1119.6046 852.3926 Z" clip-path="url(#clipPath2)" stroke-linecap="square"/>
-      <path fill="none" d="M1441.4423 853.9681 L1439.5436 905.7072" clip-path="url(#clipPath2)"/>
-      <path fill="white" d="M1441.699 846.9728 L1446.4388 854.1514 L1441.1855 860.9634 L1436.4457 853.7847 Z" clip-path="url(#clipPath2)" stroke="none"/>
-      <path fill="none" d="M1441.699 846.9728 L1446.4388 854.1514 L1441.1855 860.9634 L1436.4457 853.7847 Z" clip-path="url(#clipPath2)"/>
-    </g>
-    <g fill="rgb(245,245,245)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="rgb(245,245,245)">
+    <g fill="url(#linearGradient2)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-17,15)" stroke="url(#linearGradient2)">
+      <rect x="1821.5825" y="627.1509" clip-path="url(#clipPath2)" width="436.9795" rx="4" ry="4" height="433.9316" stroke="none"/>
+      <rect x="1821.5825" y="627.1509" clip-path="url(#clipPath2)" fill="rgb(235,235,235)" width="436.9795" height="21.666" stroke="none"/>
+    </g>
+    <g font-size="15px" stroke-linecap="butt" transform="matrix(1,0,0,1,-17,15)" text-rendering="geometricPrecision" font-family="sans-serif" shape-rendering="geometricPrecision" stroke-miterlimit="1.45">
+      <text x="2163.0684" xml:space="preserve" y="643.6528" clip-path="url(#clipPath2)" stroke="none">PartiesServer</text>
+      <rect x="1821.5825" y="627.1509" clip-path="url(#clipPath2)" fill="none" width="436.9795" stroke-dasharray="6,2" rx="4" ry="4" height="433.9316"/>
+    </g>
+    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-17,15)" stroke="rgb(255,204,0)">
+      <rect x="2004.2749" width="239.2871" height="70.5312" y="663.8169" clip-path="url(#clipPath2)" stroke="none"/>
+    </g>
+    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-17,15)" stroke-linecap="butt">
+      <text x="2088.3315" xml:space="preserve" y="682.4185" clip-path="url(#clipPath2)" stroke="none">PartyFactory</text>
+      <text x="2011.2749" xml:space="preserve" y="696.5513" clip-path="url(#clipPath2)" stroke="none">WebSocketURI create(name, profileRef)</text>
+      <text x="2076.8062" xml:space="preserve" y="710.6841" clip-path="url(#clipPath2)" stroke="none">maximumSlots()</text>
+      <text x="2080.6938" xml:space="preserve" y="724.8169" clip-path="url(#clipPath2)" stroke="none">availableSlots()</text>
+      <rect fill="none" x="2004.2749" width="239.2871" height="70.5312" y="663.8169" clip-path="url(#clipPath2)"/>
+    </g>
+    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-17,15)" stroke="rgb(255,204,0)">
+      <rect x="2022.0425" width="213.752" height="70.5312" y="921.8169" clip-path="url(#clipPath2)" stroke="none"/>
+    </g>
+    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-17,15)" stroke-linecap="butt">
+      <text x="2051.1997" xml:space="preserve" y="940.4185" clip-path="url(#clipPath2)" stroke="none">PartyFactorySocketAdapter</text>
+      <text x="2127.02" xml:space="preserve" y="954.5513" clip-path="url(#clipPath2)" stroke="none"> </text>
+      <text x="2029.0425" xml:space="preserve" y="968.6841" clip-path="url(#clipPath2)" stroke="none">URI create(String name, ProfileRef)</text>
+      <text x="2057.1353" xml:space="preserve" y="982.8169" clip-path="url(#clipPath2)" stroke="none">List&lt;String&gt; getNames()</text>
+      <rect fill="none" x="2022.0425" width="213.752" height="70.5312" y="921.8169" clip-path="url(#clipPath2)"/>
+    </g>
+    <g fill="white" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-17,15)" stroke="white">
+      <rect x="1864.729" width="178.3789" height="141.1953" y="757.4849" clip-path="url(#clipPath2)" stroke="none"/>
+    </g>
+    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-17,15)" stroke-linecap="butt">
+      <text x="1909.8472" xml:space="preserve" y="776.0864" clip-path="url(#clipPath2)" stroke="none">Party(PartyRef):</text>
+      <text x="1871.729" xml:space="preserve" y="790.2192" clip-path="url(#clipPath2)" stroke="none">Listener&lt;NegotiationEvent&gt;</text>
+      <text x="1952.02" xml:space="preserve" y="804.3521" clip-path="url(#clipPath2)" stroke="none"> </text>
+      <text x="1906.7739" xml:space="preserve" y="818.4849" clip-path="url(#clipPath2)" stroke="none">getCapabilities()</text>
+      <text x="1895.354" xml:space="preserve" y="832.6177" clip-path="url(#clipPath2)" stroke="none">init(NegotiationInfo)</text>
+      <text x="1907.3657" xml:space="preserve" y="846.7505" clip-path="url(#clipPath2)" stroke="none">getDescription()</text>
+      <text x="1928.3188" xml:space="preserve" y="860.8833" clip-path="url(#clipPath2)" stroke="none">destroy()</text>
+      <text x="1901.5884" xml:space="preserve" y="875.0161" clip-path="url(#clipPath2)" stroke="none">Action getAction()</text>
+      <text x="1919.2603" xml:space="preserve" y="889.1489" clip-path="url(#clipPath2)" stroke="none">inform(info)</text>
+      <rect fill="none" x="1864.729" width="178.3789" height="141.1953" y="757.4849" clip-path="url(#clipPath2)"/>
+    </g>
+    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-17,15)" stroke="rgb(255,204,0)">
+      <rect x="1836.5825" width="76.6719" height="30" y="922.0825" clip-path="url(#clipPath2)" stroke="none"/>
+    </g>
+    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-17,15)" stroke-linecap="butt">
+      <text x="1843.5825" xml:space="preserve" y="941.6177" clip-path="url(#clipPath2)" stroke="none">WebSocket</text>
+      <rect fill="none" x="1836.5825" width="76.6719" height="30" y="922.0825" clip-path="url(#clipPath2)"/>
+    </g>
+    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-17,15)" stroke="rgb(255,204,0)">
+      <rect x="1883.3228" width="127.1914" height="30" y="1016.0825" clip-path="url(#clipPath2)" stroke="none"/>
+    </g>
+    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-17,15)" stroke-linecap="butt">
+      <text x="1890.3228" xml:space="preserve" y="1035.6177" clip-path="url(#clipPath2)" stroke="none">PartySocketAdapter</text>
+      <rect fill="none" x="1883.3228" width="127.1914" height="30" y="1016.0825" clip-path="url(#clipPath2)"/>
+      <path fill="none" d="M2128.0994 914.8182 L2124.6018 734.3481" clip-path="url(#clipPath2)"/>
+      <path d="M2128.2351 921.8169 L2123.1003 914.9152 L2127.9636 907.8195 L2133.0984 914.7213 Z" clip-path="url(#clipPath2)" stroke="none"/>
+      <path fill="none" d="M1935.4291 1016.0825 L1895.5289 963.9907" clip-path="url(#clipPath2)"/>
+      <path fill="white" d="M1886.4078 952.0825 L1891.3738 968.433 L1900.9003 961.136 Z" clip-path="url(#clipPath2)" stroke="none"/>
+      <path fill="none" d="M1886.4078 952.0825 L1891.3738 968.433 L1900.9003 961.136 Z" clip-path="url(#clipPath2)"/>
+      <path fill="none" d="M1947.6769 1009.0867 L1951.484 898.6802" clip-path="url(#clipPath2)"/>
+      <path d="M1947.4357 1016.0825 L1942.6798 1008.9144 L1947.9181 1002.0908 L1952.674 1009.259 Z" clip-path="url(#clipPath2)" stroke="none"/>
+      <text x="1936.5331" xml:space="preserve" y="1006.5513" clip-path="url(#clipPath2)" stroke="none">    1</text>
+    </g>
+    <g fill="url(#linearGradient3)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-17,15)" stroke="url(#linearGradient3)">
+      <rect x="1078.8408" y="1737.7272" clip-path="url(#clipPath2)" width="418.9795" rx="4" ry="4" height="290.666" stroke="none"/>
+      <rect x="1078.8408" y="1737.7272" clip-path="url(#clipPath2)" fill="rgb(235,235,235)" width="418.9795" height="21.666" stroke="none"/>
+    </g>
+    <g font-size="15px" stroke-linecap="butt" transform="matrix(1,0,0,1,-17,15)" text-rendering="geometricPrecision" font-family="sans-serif" shape-rendering="geometricPrecision" stroke-miterlimit="1.45">
+      <text x="1397.1558" xml:space="preserve" y="1754.2291" clip-path="url(#clipPath2)" stroke="none">ProfilesServer</text>
+      <rect x="1078.8408" y="1737.7272" clip-path="url(#clipPath2)" fill="none" width="418.9795" stroke-dasharray="6,2" rx="4" ry="4" height="290.666"/>
+    </g>
+    <g fill="white" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-17,15)" stroke="white">
+      <rect x="1278.291" width="204.5293" height="98.7969" y="1793.9947" clip-path="url(#clipPath2)" stroke="none"/>
+    </g>
+    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-17,15)" stroke-linecap="butt">
+      <text x="1340.958" xml:space="preserve" y="1812.5963" clip-path="url(#clipPath2)" stroke="none">ProfileFactory</text>
+      <text x="1378.6572" xml:space="preserve" y="1826.7291" clip-path="url(#clipPath2)" stroke="none"> </text>
+      <text x="1305.0576" xml:space="preserve" y="1840.8619" clip-path="url(#clipPath2)" stroke="none">getDomain(domain name)</text>
+      <text x="1312.0361" xml:space="preserve" y="1854.9948" clip-path="url(#clipPath2)" stroke="none">getProfile(profile name)</text>
+      <text x="1285.291" xml:space="preserve" y="1869.1276" clip-path="url(#clipPath2)" stroke="none">add(domain desc, domain name)</text>
+      <text x="1291.0918" xml:space="preserve" y="1883.2604" clip-path="url(#clipPath2)" stroke="none">add(profile desc, profile name)</text>
+      <rect fill="none" x="1278.291" width="204.5293" height="98.7969" y="1793.9947" clip-path="url(#clipPath2)"/>
+    </g>
+    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-17,15)" stroke="rgb(255,204,0)">
+      <rect x="1093.8408" width="141.4297" height="30" y="1774.3932" clip-path="url(#clipPath2)" stroke="none"/>
+    </g>
+    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-17,15)" stroke-linecap="butt">
+      <text x="1100.8408" xml:space="preserve" y="1793.9283" clip-path="url(#clipPath2)" stroke="none">DefaultProfilesFactory</text>
+      <rect fill="none" x="1093.8408" width="141.4297" height="30" y="1774.3932" clip-path="url(#clipPath2)"/>
+    </g>
+    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-17,15)" stroke="rgb(255,204,0)">
+      <rect x="1164.6396" width="179.832" height="30" y="1916.3932" clip-path="url(#clipPath2)" stroke="none"/>
+    </g>
+    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-17,15)" stroke-linecap="butt">
+      <text x="1171.6396" xml:space="preserve" y="1935.9283" clip-path="url(#clipPath2)" stroke="none">AutoUpdatingProfilesFactory</text>
+      <rect fill="none" x="1164.6396" width="179.832" height="30" y="1916.3932" clip-path="url(#clipPath2)"/>
+    </g>
+    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-17,15)" stroke="rgb(255,204,0)">
+      <rect x="1299.0742" width="108.9629" height="30" y="1971.3932" clip-path="url(#clipPath2)" stroke="none"/>
+    </g>
+    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-17,15)" stroke-linecap="butt">
+      <text x="1306.0742" xml:space="preserve" y="1990.9283" clip-path="url(#clipPath2)" stroke="none">GetProfileSocket</text>
+      <rect fill="none" x="1299.0742" width="108.9629" height="30" y="1971.3932" clip-path="url(#clipPath2)"/>
+    </g>
+    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-17,15)" stroke="rgb(255,204,0)">
+      <rect x="1160.7021" width="115.707" height="30" y="1983.3932" clip-path="url(#clipPath2)" stroke="none"/>
+    </g>
+    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-17,15)" stroke-linecap="butt">
+      <text x="1167.7021" xml:space="preserve" y="2002.9283" clip-path="url(#clipPath2)" stroke="none">ProfilesListSocket</text>
+      <rect fill="none" x="1160.7021" width="115.707" height="30" y="1983.3932" clip-path="url(#clipPath2)"/>
+      <path fill="none" d="M1224.5557 1804.3932 L1263.7389 1814.189" clip-path="url(#clipPath2)"/>
+      <path fill="white" d="M1278.291 1817.827 L1264.224 1808.1256 L1261.3135 1819.7673 Z" clip-path="url(#clipPath2)" stroke="none"/>
+      <path fill="none" d="M1278.291 1817.827 L1264.224 1808.1256 L1261.3135 1819.7673 Z" clip-path="url(#clipPath2)"/>
+      <path fill="none" d="M1245.0486 1916.3932 L1182.0928 1817.0627" clip-path="url(#clipPath2)"/>
+      <path fill="white" d="M1174.0627 1804.3932 L1177.5603 1821.1194 L1187.6959 1814.6954 Z" clip-path="url(#clipPath2)" stroke="none"/>
+      <path fill="none" d="M1174.0627 1804.3932 L1177.5603 1821.1194 L1187.6959 1814.6954 Z" clip-path="url(#clipPath2)"/>
+      <path fill="none" stroke-dasharray="6,2" d="M1326.5557 1971.3932 L1285.9264 1948.8214" clip-path="url(#clipPath2)"/>
+      <path stroke-dasharray="6,2" d="M1282.4298 1946.8788 L1290.0057 1957.9515 L1282.4298 1946.8788 L1295.8336 1947.4617 Z" clip-path="url(#clipPath2)" stroke="none"/>
+      <path fill="none" stroke-miterlimit="10" d="M1282.4298 1946.8788 L1290.0057 1957.9515 L1282.4298 1946.8788 L1295.8336 1947.4617 Z" clip-path="url(#clipPath2)" stroke-linecap="square"/>
+      <path fill="none" stroke-dasharray="6,2" d="M1226.6154 1983.3932 L1244.1294 1950.7976" clip-path="url(#clipPath2)"/>
+      <path stroke-dasharray="6,2" d="M1246.0227 1947.274 L1235.0575 1955.0049 L1246.0227 1947.274 L1245.6282 1960.6847 Z" clip-path="url(#clipPath2)" stroke="none"/>
+      <path fill="none" stroke-miterlimit="10" d="M1246.0227 1947.274 L1235.0575 1955.0049 L1246.0227 1947.274 L1245.6282 1960.6847 Z" clip-path="url(#clipPath2)" stroke-linecap="square"/>
+    </g>
+    <g fill="rgb(245,245,245)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-17,15)" stroke="rgb(245,245,245)">
+      <rect x="352.5815" y="1416.7808" clip-path="url(#clipPath2)" width="399.6455" rx="4" ry="4" height="324.666" stroke="none"/>
+      <rect x="352.5815" y="1416.7808" clip-path="url(#clipPath2)" fill="rgb(235,235,235)" width="399.6455" height="21.666" stroke="none"/>
+    </g>
+    <g font-size="15px" stroke-linecap="butt" transform="matrix(1,0,0,1,-17,15)" text-rendering="geometricPrecision" font-family="sans-serif" shape-rendering="geometricPrecision" stroke-miterlimit="1.45">
+      <text x="672.854" xml:space="preserve" y="1433.2827" clip-path="url(#clipPath2)" stroke="none">IssueValue</text>
+      <rect x="352.5815" y="1416.7808" clip-path="url(#clipPath2)" fill="none" width="399.6455" stroke-dasharray="6,2" rx="4" ry="4" height="324.666"/>
+    </g>
+    <g fill="white" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-17,15)" stroke="white">
+      <rect x="501.4429" width="78.6523" height="56.3984" y="1561.2476" clip-path="url(#clipPath2)" stroke="none"/>
+    </g>
+    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-17,15)" stroke-linecap="butt">
+      <text x="515.9136" xml:space="preserve" y="1579.8491" clip-path="url(#clipPath2)" stroke="none">ValueSet</text>
+      <text x="538.8706" xml:space="preserve" y="1593.9819" clip-path="url(#clipPath2)" stroke="none"> </text>
+      <text x="508.4429" xml:space="preserve" y="1608.1147" clip-path="url(#clipPath2)" stroke="none">getValues()</text>
+      <rect fill="none" x="501.4429" width="78.6523" height="56.3984" y="1561.2476" clip-path="url(#clipPath2)"/>
+    </g>
+    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-17,15)" stroke="rgb(255,204,0)">
+      <rect x="529.1685" width="111.2012" height="30" y="1507.4468" clip-path="url(#clipPath2)" stroke="none"/>
+    </g>
+    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-17,15)" stroke-linecap="butt">
+      <text x="536.1685" xml:space="preserve" y="1526.9819" clip-path="url(#clipPath2)" stroke="none">DiscreteValueSet</text>
+      <rect fill="none" x="529.1685" width="111.2012" height="30" y="1507.4468" clip-path="url(#clipPath2)"/>
+    </g>
+    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-17,15)" stroke="rgb(255,204,0)">
+      <rect x="367.5815" width="110.375" height="30" y="1533.4468" clip-path="url(#clipPath2)" stroke="none"/>
+    </g>
+    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-17,15)" stroke-linecap="butt">
+      <text x="374.5815" xml:space="preserve" y="1552.9819" clip-path="url(#clipPath2)" stroke="none">NumberValueSet</text>
+      <rect fill="none" x="367.5815" width="110.375" height="30" y="1533.4468" clip-path="url(#clipPath2)"/>
+    </g>
+    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-17,15)" stroke="rgb(255,204,0)">
+      <rect x="634.311" width="102.916" height="98.7969" y="1561.0483" clip-path="url(#clipPath2)" stroke="none"/>
+    </g>
+    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-17,15)" stroke-linecap="butt">
+      <text x="663.2163" xml:space="preserve" y="1579.6499" clip-path="url(#clipPath2)" stroke="none">Domain</text>
+      <text x="683.8706" xml:space="preserve" y="1593.7827" clip-path="url(#clipPath2)" stroke="none"> </text>
+      <text x="655.8481" xml:space="preserve" y="1607.9155" clip-path="url(#clipPath2)" stroke="none">getName()</text>
+      <text x="654.5679" xml:space="preserve" y="1622.0483" clip-path="url(#clipPath2)" stroke="none">getIssues()</text>
+      <text x="653.4429" xml:space="preserve" y="1636.1812" clip-path="url(#clipPath2)" stroke="none">getValues()</text>
+      <text x="641.311" xml:space="preserve" y="1650.314" clip-path="url(#clipPath2)" stroke="none">iscomplete(Bid)</text>
+      <rect fill="none" x="634.311" width="102.916" height="98.7969" y="1561.0483" clip-path="url(#clipPath2)"/>
+    </g>
+    <g fill="white" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-17,15)" stroke="white">
+      <rect x="564.7319" width="46.0742" height="30" y="1641.4468" clip-path="url(#clipPath2)" stroke="none"/>
+    </g>
+    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-17,15)" stroke-linecap="butt">
+      <text x="571.7319" xml:space="preserve" y="1660.9819" clip-path="url(#clipPath2)" stroke="none">Value</text>
+      <rect fill="none" x="564.7319" width="46.0742" height="30" y="1641.4468" clip-path="url(#clipPath2)"/>
+    </g>
+    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-17,15)" stroke="rgb(255,204,0)">
+      <rect x="505.8071" width="31.9238" height="30" y="1453.4468" clip-path="url(#clipPath2)" stroke="none"/>
+    </g>
+    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-17,15)" stroke-linecap="butt">
+      <text x="512.8071" xml:space="preserve" y="1472.9819" clip-path="url(#clipPath2)" stroke="none">Bid</text>
+      <rect fill="none" x="505.8071" width="31.9238" height="30" y="1453.4468" clip-path="url(#clipPath2)"/>
+    </g>
+    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-17,15)" stroke="rgb(255,204,0)">
+      <rect x="380.9868" width="93.5645" height="30" y="1641.4468" clip-path="url(#clipPath2)" stroke="none"/>
+    </g>
+    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-17,15)" stroke-linecap="butt">
+      <text x="387.9868" xml:space="preserve" y="1660.9819" clip-path="url(#clipPath2)" stroke="none">DiscreteValue</text>
+      <rect fill="none" x="380.9868" width="93.5645" height="30" y="1641.4468" clip-path="url(#clipPath2)"/>
+    </g>
+    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-17,15)" stroke="rgb(255,204,0)">
+      <rect x="463.3999" width="92.7383" height="30" y="1696.4468" clip-path="url(#clipPath2)" stroke="none"/>
+    </g>
+    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-17,15)" stroke-linecap="butt">
+      <text x="470.3999" xml:space="preserve" y="1715.9819" clip-path="url(#clipPath2)" stroke="none">NumberValue</text>
+      <rect fill="none" x="463.3999" width="92.7383" height="30" y="1696.4468" clip-path="url(#clipPath2)"/>
+      <path fill="none" d="M574.9183 1537.4468 L567.5219 1548.7095" clip-path="url(#clipPath2)"/>
+      <path fill="white" d="M559.2879 1561.2476 L573.086 1551.1672 L563.0555 1544.5801 Z" clip-path="url(#clipPath2)" stroke="none"/>
+      <path fill="none" d="M559.2879 1561.2476 L573.086 1551.1672 L563.0555 1544.5801 Z" clip-path="url(#clipPath2)"/>
+      <path fill="none" d="M465.9398 1563.4468 L487.2738 1570.8595" clip-path="url(#clipPath2)"/>
+      <path fill="white" d="M501.4429 1575.7826 L488.2985 1564.8636 L484.36 1576.199 Z" clip-path="url(#clipPath2)" stroke="none"/>
+      <path fill="none" d="M501.4429 1575.7826 L488.2985 1564.8636 L484.36 1576.199 Z" clip-path="url(#clipPath2)"/>
+      <path fill="none" d="M1117.8649 1771.9425 L737.2271 1629.6792" clip-path="url(#clipPath2)"/>
+      <path d="M1124.4219 1774.3932 L1116.1144 1776.6261 L1111.3079 1769.4918 L1119.6154 1767.2589 Z" clip-path="url(#clipPath2)" stroke="none"/>
+      <path fill="none" d="M627.3833 1601.991 L580.0952 1595.1423" clip-path="url(#clipPath2)"/>
+      <path d="M634.311 1602.9943 L626.6667 1606.9393 L620.4556 1600.9877 L628.1 1597.0426 Z" clip-path="url(#clipPath2)" stroke="none"/>
+      <text x="591.7036" xml:space="preserve" y="1603.9371" clip-path="url(#clipPath2)" stroke="none">*Issue</text>
+      <path fill="none" d="M529.3537 1490.0516 L582.5031 1641.4468" clip-path="url(#clipPath2)"/>
+      <path d="M527.035 1483.4468 L534.0714 1488.3954 L531.6724 1496.6564 L524.636 1491.7078 Z" clip-path="url(#clipPath2)" stroke="none"/>
+      <text x="540.2692" xml:space="preserve" y="1502.0483" clip-path="url(#clipPath2)" stroke="none">   *Issue</text>
+      <path fill="none" d="M561.8701 1541.9911 L445.3437 1641.4468" clip-path="url(#clipPath2)"/>
+      <path d="M567.1945 1537.4468 L565.116 1545.7942 L556.5457 1546.5354 L558.6241 1538.188 Z" clip-path="url(#clipPath2)" stroke="none"/>
+      <text x="542.1267" xml:space="preserve" y="1556.0483" clip-path="url(#clipPath2)" stroke="none">   *</text>
+      <path fill="none" d="M474.5513 1656.4468 L549.7319 1656.4468" clip-path="url(#clipPath2)"/>
+      <path fill="white" d="M564.7319 1656.4468 L548.7319 1650.4468 L548.7319 1662.4468 Z" clip-path="url(#clipPath2)" stroke="none"/>
+      <path fill="none" d="M564.7319 1656.4468 L548.7319 1650.4468 L548.7319 1662.4468 Z" clip-path="url(#clipPath2)"/>
+      <path fill="none" d="M434.0713 1569.6222 L501.7629 1696.4468" clip-path="url(#clipPath2)"/>
+      <path d="M430.7752 1563.4468 L438.4823 1567.2678 L437.3673 1575.7976 L429.6602 1571.9766 Z" clip-path="url(#clipPath2)" stroke="none"/>
+      <text x="429.6961" xml:space="preserve" y="1582.0483" clip-path="url(#clipPath2)" stroke="none">   *</text>
+      <path fill="none" d="M531.0417 1696.4468 L554.2374 1680.0908" clip-path="url(#clipPath2)"/>
+      <path fill="white" d="M566.4963 1671.4468 L549.9626 1675.7635 L556.8778 1685.5707 Z" clip-path="url(#clipPath2)" stroke="none"/>
+      <path fill="none" d="M566.4963 1671.4468 L549.9626 1675.7635 L556.8778 1685.5707 Z" clip-path="url(#clipPath2)"/>
+    </g>
+    <g fill="rgb(245,245,245)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-17,15)" stroke="rgb(245,245,245)">
+      <rect x="870.5688" y="1026.4836" clip-path="url(#clipPath2)" width="516.0273" rx="4" ry="4" height="458.1309" stroke="none"/>
+      <rect x="870.5688" y="1026.4836" clip-path="url(#clipPath2)" fill="rgb(235,235,235)" width="516.0273" height="21.666" stroke="none"/>
+    </g>
+    <g font-size="15px" stroke-linecap="butt" transform="matrix(1,0,0,1,-17,15)" text-rendering="geometricPrecision" font-family="sans-serif" shape-rendering="geometricPrecision" stroke-miterlimit="1.45">
+      <text x="1338.4097" xml:space="preserve" y="1042.9856" clip-path="url(#clipPath2)" stroke="none">Profile</text>
+      <rect x="870.5688" y="1026.4836" clip-path="url(#clipPath2)" fill="none" width="516.0273" stroke-dasharray="6,2" rx="4" ry="4" height="458.1309"/>
+    </g>
+    <g fill="white" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-17,15)" stroke="white">
+      <rect x="1020.1411" width="134.4688" height="70.5312" y="1399.0833" clip-path="url(#clipPath2)" stroke="none"/>
+    </g>
+    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-17,15)" stroke-linecap="butt">
+      <text x="1069.9009" xml:space="preserve" y="1418.6848" clip-path="url(#clipPath2)" stroke="none">Profile</text>
+      <text x="1086.4771" xml:space="preserve" y="1432.8176" clip-path="url(#clipPath2)" stroke="none"> </text>
+      <text x="1049.4634" xml:space="preserve" y="1446.9504" clip-path="url(#clipPath2)" stroke="none">String name()</text>
+      <text x="1028.1411" xml:space="preserve" y="1461.0833" clip-path="url(#clipPath2)" stroke="none">Domain getDomain()</text>
+      <rect fill="none" x="1020.1411" width="134.4688" height="70.5312" y="1399.0833" clip-path="url(#clipPath2)"/>
+    </g>
+    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-17,15)" stroke="rgb(255,204,0)">
+      <rect x="1151.1548" width="164.6855" height="30" y="1291.3489" clip-path="url(#clipPath2)" stroke="none"/>
+    </g>
+    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-17,15)" stroke-linecap="butt">
+      <text x="1158.1548" xml:space="preserve" y="1310.884" clip-path="url(#clipPath2)" stroke="none">LinearAdditiveUtilitySpace</text>
+      <rect fill="none" x="1151.1548" width="164.6855" height="30" y="1291.3489" clip-path="url(#clipPath2)"/>
+    </g>
+    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-17,15)" stroke="rgb(255,204,0)">
+      <rect x="949.1558" width="98.4395" height="30" y="1345.3489" clip-path="url(#clipPath2)" stroke="none"/>
+    </g>
+    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-17,15)" stroke-linecap="butt">
+      <text x="956.1558" xml:space="preserve" y="1364.884" clip-path="url(#clipPath2)" stroke="none">DiscreteProfile</text>
+      <rect fill="none" x="949.1558" width="98.4395" height="30" y="1345.3489" clip-path="url(#clipPath2)"/>
+    </g>
+    <g fill="white" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-17,15)" stroke="white">
+      <rect x="949.186" width="118.3789" height="70.5312" y="1197.0833" clip-path="url(#clipPath2)" stroke="none"/>
+    </g>
+    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-17,15)" stroke-linecap="butt">
+      <text x="961.5356" xml:space="preserve" y="1215.6848" clip-path="url(#clipPath2)" stroke="none">ValueSetUtilities</text>
+      <text x="1006.4771" xml:space="preserve" y="1229.8176" clip-path="url(#clipPath2)" stroke="none"> </text>
+      <text x="962.1245" xml:space="preserve" y="1243.9504" clip-path="url(#clipPath2)" stroke="none">getUtility(Value)</text>
+      <text x="956.186" xml:space="preserve" y="1258.0833" clip-path="url(#clipPath2)" stroke="none">isFitting(ValueSet)</text>
+      <rect fill="none" x="949.186" width="118.3789" height="70.5312" y="1197.0833" clip-path="url(#clipPath2)"/>
+    </g>
+    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-17,15)" stroke="rgb(255,204,0)">
+      <rect x="885.5688" width="97.6133" height="30" y="1291.3489" clip-path="url(#clipPath2)" stroke="none"/>
+    </g>
+    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-17,15)" stroke-linecap="butt">
+      <text x="892.5688" xml:space="preserve" y="1310.884" clip-path="url(#clipPath2)" stroke="none">NumberProfile</text>
+      <rect fill="none" x="885.5688" width="97.6133" height="30" y="1291.3489" clip-path="url(#clipPath2)"/>
+    </g>
+    <g fill="white" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-17,15)" stroke="white">
+      <rect x="1153.2026" width="160.5898" height="56.3984" y="1177.2493" clip-path="url(#clipPath2)" stroke="none"/>
+    </g>
+    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-17,15)" stroke-linecap="butt">
+      <text x="1199.7769" xml:space="preserve" y="1195.8508" clip-path="url(#clipPath2)" stroke="none">UtilitySpace</text>
+      <text x="1231.5991" xml:space="preserve" y="1209.9836" clip-path="url(#clipPath2)" stroke="none"> </text>
+      <text x="1160.2026" xml:space="preserve" y="1224.1165" clip-path="url(#clipPath2)" stroke="none">BigDecimal getUtility(Bid)</text>
+      <rect fill="none" x="1153.2026" width="160.5898" height="56.3984" y="1177.2493" clip-path="url(#clipPath2)"/>
+    </g>
+    <g fill="white" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-17,15)" stroke="white">
+      <rect x="1051.2495" width="170.252" height="56.3984" y="1063.1497" clip-path="url(#clipPath2)" stroke="none"/>
+    </g>
+    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-17,15)" stroke-linecap="butt">
+      <text x="1092.3745" xml:space="preserve" y="1081.7512" clip-path="url(#clipPath2)" stroke="none">PartialOrdering</text>
+      <text x="1134.4771" xml:space="preserve" y="1095.884" clip-path="url(#clipPath2)" stroke="none"> </text>
+      <text x="1058.2495" xml:space="preserve" y="1110.0168" clip-path="url(#clipPath2)" stroke="none">isPreferredOrEqual(Bid,Bid)</text>
+      <rect fill="none" x="1051.2495" width="170.252" height="56.3984" y="1063.1497" clip-path="url(#clipPath2)"/>
+    </g>
+    <g fill="white" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-17,15)" stroke="white">
+      <rect x="985.2847" width="122.1816" height="30" y="1143.3489" clip-path="url(#clipPath2)" stroke="none"/>
+    </g>
+    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-17,15)" stroke-linecap="butt">
+      <text x="1005.7144" xml:space="preserve" y="1162.884" clip-path="url(#clipPath2)" stroke="none">TotalOrdering</text>
+      <rect fill="none" x="985.2847" width="122.1816" height="30" y="1143.3489" clip-path="url(#clipPath2)"/>
+    </g>
+    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-17,15)" stroke="rgb(255,204,0)">
+      <rect x="1194.2769" width="78.4414" height="30" y="1375.4468" clip-path="url(#clipPath2)" stroke="none"/>
+    </g>
+    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-17,15)" stroke-linecap="butt">
+      <text x="1201.2769" xml:space="preserve" y="1394.9819" clip-path="url(#clipPath2)" stroke="none">BigDecimal</text>
+      <rect fill="none" x="1194.2769" width="78.4414" height="30" y="1375.4468" clip-path="url(#clipPath2)"/>
+      <path fill="none" stroke-dasharray="6,2" d="M870.5613 1400.4462 L756.5829 1464.453" clip-path="url(#clipPath2)"/>
+      <path stroke-dasharray="6,2" d="M753.0953 1466.4116 L766.4962 1465.7673 L753.0953 1466.4116 L760.6204 1455.3043 Z" clip-path="url(#clipPath2)" stroke="none"/>
+      <path fill="none" stroke-miterlimit="10" d="M753.0953 1466.4116 L766.4962 1465.7673 L753.0953 1466.4116 L760.6204 1455.3043 Z" clip-path="url(#clipPath2)" stroke-linecap="square"/>
+      <path fill="none" d="M1159.808 1767.553 L1095.0416 1469.6145" clip-path="url(#clipPath2)"/>
+      <path d="M1161.2949 1774.3932 L1154.9221 1768.615 L1158.321 1760.7126 L1164.6938 1766.4908 Z" clip-path="url(#clipPath2)" stroke="none"/>
+      <path fill="none" stroke-dasharray="6,2" d="M1020.1411 1438.4021 L542.7219 1467.1836" clip-path="url(#clipPath2)"/>
+      <path stroke-dasharray="6,2" d="M538.7291 1467.4243 L551.0685 1472.6913 L538.7291 1467.4243 L550.3463 1460.713 Z" clip-path="url(#clipPath2)" stroke="none"/>
+      <path fill="none" stroke-miterlimit="10" d="M538.7291 1467.4243 L551.0685 1472.6913 L538.7291 1467.4243 L550.3463 1460.713 Z" clip-path="url(#clipPath2)" stroke-linecap="square"/>
+      <path fill="none" d="M953.5844 1377.9031 L623.0428 1507.4468" clip-path="url(#clipPath2)"/>
+      <path d="M960.1017 1375.3489 L955.4088 1382.5583 L947.067 1380.4573 L951.7599 1373.2478 Z" clip-path="url(#clipPath2)" stroke="none"/>
+      <text x="923.1772" xml:space="preserve" y="1390.6362" clip-path="url(#clipPath2)" stroke="none">   1</text>
+      <path fill="none" d="M1181.2147 1289.163 L1067.5649 1251.8051" clip-path="url(#clipPath2)"/>
+      <path d="M1187.8646 1291.3489 L1179.6533 1293.913 L1174.5647 1286.9771 L1182.776 1284.413 Z" clip-path="url(#clipPath2)" stroke="none"/>
+      <text x="1127.2683" xml:space="preserve" y="1281.8176" clip-path="url(#clipPath2)" stroke="none">*Issue</text>
+      <path fill="none" d="M999.5474 1345.3489 L1004.452 1282.569" clip-path="url(#clipPath2)"/>
+      <path fill="white" d="M1005.6204 1267.6145 L998.3924 1283.0985 L1010.3559 1284.0332 Z" clip-path="url(#clipPath2)" stroke="none"/>
+      <path fill="none" d="M1005.6204 1267.6145 L998.3924 1283.0985 L1010.3559 1284.0332 Z" clip-path="url(#clipPath2)"/>
+      <path fill="none" d="M896.3499 1324.343 L454.4674 1533.4468" clip-path="url(#clipPath2)"/>
+      <path d="M902.6772 1321.3489 L898.4885 1328.8625 L890.0225 1327.3372 L894.2112 1319.8235 Z" clip-path="url(#clipPath2)" stroke="none"/>
+      <text x="863.4625" xml:space="preserve" y="1339.9504" clip-path="url(#clipPath2)" stroke="none">   1</text>
+      <path fill="none" d="M949.3755 1291.3489 L962.5032 1278.2211" clip-path="url(#clipPath2)"/>
+      <path fill="white" d="M973.1099 1267.6145 L957.5535 1274.6855 L966.0388 1283.1708 Z" clip-path="url(#clipPath2)" stroke="none"/>
+      <path fill="none" d="M973.1099 1267.6145 L957.5535 1274.6855 L966.0388 1283.1708 Z" clip-path="url(#clipPath2)"/>
+      <path fill="none" d="M1233.4976 1291.3489 L1233.4976 1248.6477" clip-path="url(#clipPath2)"/>
+      <path fill="white" d="M1233.4976 1233.6477 L1227.4976 1249.6477 L1239.4976 1249.6477 Z" clip-path="url(#clipPath2)" stroke="none"/>
+      <path fill="none" d="M1233.4976 1233.6477 L1227.4976 1249.6477 L1239.4976 1249.6477 Z" clip-path="url(#clipPath2)"/>
+      <path fill="none" d="M1132.347 1119.5481 L1094.5348 1384.234" clip-path="url(#clipPath2)"/>
+      <path fill="white" d="M1092.4135 1399.0833 L1100.616 1384.0927 L1088.7366 1382.3955 Z" clip-path="url(#clipPath2)" stroke="none"/>
+      <path fill="none" d="M1092.4135 1399.0833 L1100.616 1384.0927 L1088.7366 1382.3955 Z" clip-path="url(#clipPath2)"/>
+      <path fill="none" d="M1153.2026 1185.2378 L1120.5153 1177.0103" clip-path="url(#clipPath2)"/>
+      <path fill="white" d="M1105.969 1173.3489 L1120.0205 1183.0729 L1122.9496 1171.4358 Z" clip-path="url(#clipPath2)" stroke="none"/>
+      <path fill="none" d="M1105.969 1173.3489 L1120.0205 1183.0729 L1122.9496 1171.4358 Z" clip-path="url(#clipPath2)"/>
+      <path fill="none" d="M1066.5248 1143.3489 L1086.464 1128.5052" clip-path="url(#clipPath2)"/>
+      <path fill="white" d="M1098.496 1119.5481 L1082.079 1124.2896 L1089.2448 1133.9152 Z" clip-path="url(#clipPath2)" stroke="none"/>
+      <path fill="none" d="M1098.496 1119.5481 L1082.079 1124.2896 L1089.2448 1133.9152 Z" clip-path="url(#clipPath2)"/>
+      <path fill="none" d="M1233.4976 1328.3489 L1233.4976 1375.4468" clip-path="url(#clipPath2)"/>
+      <path d="M1233.4976 1321.3489 L1238.4976 1328.3489 L1233.4976 1335.3489 L1228.4976 1328.3489 Z" clip-path="url(#clipPath2)" stroke="none"/>
+      <text x="1215.6938" xml:space="preserve" y="1339.9504" clip-path="url(#clipPath2)" stroke="none">*Issue</text>
+    </g>
+    <g fill="rgb(245,245,245)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-17,15)" stroke="rgb(245,245,245)">
+      <rect x="32.6685" y="823.0168" clip-path="url(#clipPath2)" width="739.3135" rx="4" ry="4" height="430.332" stroke="none"/>
+      <rect x="32.6685" y="823.0168" clip-path="url(#clipPath2)" fill="rgb(235,235,235)" width="739.3135" height="21.666" stroke="none"/>
+    </g>
+    <g font-size="15px" stroke-linecap="butt" transform="matrix(1,0,0,1,-17,15)" text-rendering="geometricPrecision" font-family="sans-serif" shape-rendering="geometricPrecision" stroke-miterlimit="1.45">
+      <text x="722.9385" xml:space="preserve" y="839.5188" clip-path="url(#clipPath2)" stroke="none">events</text>
+      <rect x="32.6685" y="823.0168" clip-path="url(#clipPath2)" fill="none" width="739.3135" stroke-dasharray="6,2" rx="4" ry="4" height="430.332"/>
+      <path fill="none" stroke-dasharray="6,2" d="M464.0396 716.8166 L444.5894 818.1" clip-path="url(#clipPath2)"/>
+      <path stroke-dasharray="6,2" d="M443.8351 822.0282 L451.9905 811.3751 L443.8351 822.0282 L440.2058 809.112 Z" clip-path="url(#clipPath2)" stroke="none"/>
+    </g>
+    <g text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-17,15)">
+      <path fill="none" d="M443.8351 822.0282 L451.9905 811.3751 L443.8351 822.0282 L440.2058 809.112 Z" clip-path="url(#clipPath2)"/>
+      <path fill="none" stroke-miterlimit="1.45" stroke-dasharray="6,2" d="M462.0216 1253.3468 L506.0196 1411.9293" clip-path="url(#clipPath2)" stroke-linecap="butt"/>
+      <path stroke-miterlimit="1.45" stroke-dasharray="6,2" d="M507.089 1415.7837 L509.6624 1402.6165 L507.089 1415.7837 L498.0992 1405.8246 Z" clip-path="url(#clipPath2)" stroke-linecap="butt" stroke="none"/>
+      <path fill="none" d="M507.089 1415.7837 L509.6624 1402.6165 L507.089 1415.7837 L498.0992 1405.8246 Z" clip-path="url(#clipPath2)"/>
+      <rect x="463.2056" y="859.6829" clip-path="url(#clipPath2)" fill="rgb(225,225,225)" width="293.7764" rx="4" ry="4" height="290.666" stroke="none"/>
+      <rect x="463.2056" y="859.6829" clip-path="url(#clipPath2)" fill="rgb(235,235,235)" width="293.7764" height="21.666" stroke="none"/>
+    </g>
+    <g font-size="15px" stroke-linecap="butt" transform="matrix(1,0,0,1,-17,15)" text-rendering="geometricPrecision" font-family="sans-serif" shape-rendering="geometricPrecision" stroke-miterlimit="1.45">
+      <text x="702.8994" xml:space="preserve" y="876.1848" clip-path="url(#clipPath2)" stroke="none">actions</text>
+      <rect x="463.2056" y="859.6829" clip-path="url(#clipPath2)" fill="none" width="293.7764" stroke-dasharray="6,2" rx="4" ry="4" height="290.666"/>
+    </g>
+    <g fill="white" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-17,15)" stroke="white">
+      <rect x="553.5103" width="51.2012" height="30" y="943.3489" clip-path="url(#clipPath2)" stroke="none"/>
+    </g>
+    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-17,15)" stroke-linecap="butt">
+      <text x="560.5103" xml:space="preserve" y="962.884" clip-path="url(#clipPath2)" stroke="none">Action</text>
+      <rect fill="none" x="553.5103" width="51.2012" height="30" y="943.3489" clip-path="url(#clipPath2)"/>
+    </g>
+    <g fill="white" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-17,15)" stroke="white">
+      <rect x="580.7134" width="94.7949" height="30" y="1105.3489" clip-path="url(#clipPath2)" stroke="none"/>
+    </g>
+    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-17,15)" stroke-linecap="butt">
+      <text x="587.7134" xml:space="preserve" y="1124.884" clip-path="url(#clipPath2)" stroke="none">ActionWithBid</text>
+      <rect fill="none" x="580.7134" width="94.7949" height="30" y="1105.3489" clip-path="url(#clipPath2)"/>
+    </g>
+    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-17,15)" stroke="rgb(255,204,0)">
+      <rect x="698.2397" width="43.7422" height="30" y="1077.3489" clip-path="url(#clipPath2)" stroke="none"/>
+    </g>
+    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-17,15)" stroke-linecap="butt">
+      <text x="705.2397" xml:space="preserve" y="1096.884" clip-path="url(#clipPath2)" stroke="none">Offer</text>
+      <rect fill="none" x="698.2397" width="43.7422" height="30" y="1077.3489" clip-path="url(#clipPath2)"/>
+    </g>
+    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-17,15)" stroke="rgb(255,204,0)">
+      <rect x="616.4771" width="103.2676" height="30" y="997.3489" clip-path="url(#clipPath2)" stroke="none"/>
+    </g>
+    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-17,15)" stroke-linecap="butt">
+      <text x="623.4771" xml:space="preserve" y="1016.884" clip-path="url(#clipPath2)" stroke="none">EndNegotiation</text>
+      <rect fill="none" x="616.4771" width="103.2676" height="30" y="997.3489" clip-path="url(#clipPath2)"/>
+    </g>
+    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-17,15)" stroke="rgb(255,204,0)">
+      <rect x="504.4614" width="53.2988" height="30" y="1082.3489" clip-path="url(#clipPath2)" stroke="none"/>
+    </g>
+    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-17,15)" stroke-linecap="butt">
+      <text x="511.4614" xml:space="preserve" y="1101.884" clip-path="url(#clipPath2)" stroke="none">Accept</text>
+      <rect fill="none" x="504.4614" width="53.2988" height="30" y="1082.3489" clip-path="url(#clipPath2)"/>
+    </g>
+    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-17,15)" stroke="rgb(255,204,0)">
+      <rect x="478.2056" width="99.8105" height="30" y="1004.3489" clip-path="url(#clipPath2)" stroke="none"/>
+    </g>
+    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-17,15)" stroke-linecap="butt">
+      <text x="485.2056" xml:space="preserve" y="1023.884" clip-path="url(#clipPath2)" stroke="none">AbstractAction</text>
+      <rect fill="none" x="478.2056" width="99.8105" height="30" y="1004.3489" clip-path="url(#clipPath2)"/>
+    </g>
+    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-17,15)" stroke="rgb(255,204,0)">
+      <rect x="657.4243" width="55.373" height="30" y="896.3489" clip-path="url(#clipPath2)" stroke="none"/>
+    </g>
+    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-17,15)" stroke-linecap="butt">
+      <text x="664.4243" xml:space="preserve" y="915.884" clip-path="url(#clipPath2)" stroke="none">PartyID</text>
+      <rect fill="none" x="657.4243" width="55.373" height="30" y="896.3489" clip-path="url(#clipPath2)"/>
+      <path fill="none" d="M621.4833 1142.0435 L526.3514 1453.4468" clip-path="url(#clipPath2)"/>
+      <path d="M623.5284 1135.3489 L626.2651 1143.5043 L619.4381 1148.738 L616.7014 1140.5826 Z" clip-path="url(#clipPath2)" stroke="none"/>
+      <text x="609.7419" xml:space="preserve" y="1153.9504" clip-path="url(#clipPath2)" stroke="none">   1</text>
+      <path fill="none" d="M698.2397 1099.0052 L689.8584 1101.5562" clip-path="url(#clipPath2)"/>
+      <path fill="white" d="M675.5083 1105.9236 L692.5621 1107.005 L689.0681 1095.5249 Z" clip-path="url(#clipPath2)" stroke="none"/>
+      <path fill="none" d="M675.5083 1105.9236 L692.5621 1107.005 L689.0681 1095.5249 Z" clip-path="url(#clipPath2)"/>
+      <path fill="none" d="M643.3886 997.3489 L616.6572 981.1298" clip-path="url(#clipPath2)"/>
+      <path fill="white" d="M603.8331 973.3489 L614.3998 986.7781 L620.6245 976.5189 Z" clip-path="url(#clipPath2)" stroke="none"/>
+      <path fill="none" d="M603.8331 973.3489 L614.3998 986.7781 L620.6245 976.5189 Z" clip-path="url(#clipPath2)"/>
+      <path fill="none" d="M557.7603 1103.6678 L566.118 1105.6495" clip-path="url(#clipPath2)"/>
+      <path fill="white" d="M580.7133 1109.1104 L566.5293 1099.5807 L563.7607 1111.257 Z" clip-path="url(#clipPath2)" stroke="none"/>
+      <path fill="none" d="M580.7133 1109.1104 L566.5293 1099.5807 L563.7607 1111.257 Z" clip-path="url(#clipPath2)"/>
+      <path fill="none" d="M613.2593 1105.3489 L553.5161 1045.0081" clip-path="url(#clipPath2)"/>
+      <path fill="white" d="M542.9623 1034.3489 L549.956 1049.9402 L558.4833 1041.4972 Z" clip-path="url(#clipPath2)" stroke="none"/>
+      <path fill="none" d="M542.9623 1034.3489 L549.956 1049.9402 L558.4833 1041.4972 Z" clip-path="url(#clipPath2)"/>
+      <path fill="none" d="M540.6518 1004.3489 L556.9485 984.8567" clip-path="url(#clipPath2)"/>
+      <path fill="white" d="M566.5699 973.3489 L551.704 981.7753 L560.9103 989.4724 Z" clip-path="url(#clipPath2)" stroke="none"/>
+      <path fill="none" d="M566.5699 973.3489 L551.704 981.7753 L560.9103 989.4724 Z" clip-path="url(#clipPath2)"/>
+      <path fill="none" stroke-dasharray="6,2" d="M604.7114 946.9977 L652.8535 925.6517" clip-path="url(#clipPath2)"/>
+      <path stroke-dasharray="6,2" d="M656.5101 924.0303 L643.1081 923.4093 L656.5101 924.0303 L647.9721 934.3793 Z" clip-path="url(#clipPath2)" stroke="none"/>
+      <path fill="none" stroke-miterlimit="10" d="M656.5101 924.0303 L643.1081 923.4093 L656.5101 924.0303 L647.9721 934.3793 Z" clip-path="url(#clipPath2)" stroke-linecap="square"/>
+    </g>
+    <g fill="rgb(225,225,225)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-17,15)" stroke="rgb(225,225,225)">
+      <rect x="47.6685" y="959.6829" clip-path="url(#clipPath2)" width="302.7109" rx="4" ry="4" height="278.666" stroke="none"/>
+      <rect x="47.6685" y="959.6829" clip-path="url(#clipPath2)" fill="rgb(235,235,235)" width="302.7109" height="21.666" stroke="none"/>
+    </g>
+    <g font-size="15px" stroke-linecap="butt" transform="matrix(1,0,0,1,-17,15)" text-rendering="geometricPrecision" font-family="sans-serif" shape-rendering="geometricPrecision" stroke-miterlimit="1.45">
+      <text x="301.3359" xml:space="preserve" y="976.1848" clip-path="url(#clipPath2)" stroke="none">events</text>
+      <rect x="47.6685" y="959.6829" clip-path="url(#clipPath2)" fill="none" width="302.7109" stroke-dasharray="6,2" rx="4" ry="4" height="278.666"/>
+    </g>
+    <g fill="white" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-17,15)" stroke="white">
+      <rect x="212.561" width="113.0996" height="30" y="1075.3489" clip-path="url(#clipPath2)" stroke="none"/>
+    </g>
+    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-17,15)" stroke-linecap="butt">
+      <text x="219.561" xml:space="preserve" y="1094.884" clip-path="url(#clipPath2)" stroke="none">NegotiationEvent</text>
+      <rect fill="none" x="212.561" width="113.0996" height="30" y="1075.3489" clip-path="url(#clipPath2)"/>
+    </g>
+    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-17,15)" stroke="rgb(255,204,0)">
+      <rect x="252.8423" width="82.5371" height="30" y="996.3489" clip-path="url(#clipPath2)" stroke="none"/>
+    </g>
+    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-17,15)" stroke-linecap="butt">
+      <text x="259.8423" xml:space="preserve" y="1015.884" clip-path="url(#clipPath2)" stroke="none">ActionEvent</text>
+      <rect fill="none" x="252.8423" width="82.5371" height="30" y="996.3489" clip-path="url(#clipPath2)"/>
+    </g>
+    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-17,15)" stroke="rgb(255,204,0)">
+      <rect x="62.6685" width="98.8848" height="30" y="1085.3489" clip-path="url(#clipPath2)" stroke="none"/>
+    </g>
+    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-17,15)" stroke-linecap="butt">
+      <text x="69.6685" xml:space="preserve" y="1104.884" clip-path="url(#clipPath2)" stroke="none">SessionStarted</text>
+      <rect fill="none" x="62.6685" width="98.8848" height="30" y="1085.3489" clip-path="url(#clipPath2)"/>
+    </g>
+    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-17,15)" stroke="rgb(255,204,0)">
+      <rect x="209.4048" width="93.4121" height="30" y="1193.3489" clip-path="url(#clipPath2)" stroke="none"/>
+    </g>
+    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-17,15)" stroke-linecap="butt">
+      <text x="216.4048" xml:space="preserve" y="1212.884" clip-path="url(#clipPath2)" stroke="none">SessionEnded</text>
+      <rect fill="none" x="209.4048" width="93.4121" height="30" y="1193.3489" clip-path="url(#clipPath2)"/>
+    </g>
+    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-17,15)" stroke="rgb(255,204,0)">
+      <rect x="101.896" width="126.4297" height="30" y="999.3489" clip-path="url(#clipPath2)" stroke="none"/>
+    </g>
+    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-17,15)" stroke-linecap="butt">
+      <text x="108.896" xml:space="preserve" y="1018.884" clip-path="url(#clipPath2)" stroke="none">TournamentStarted</text>
+      <rect fill="none" x="101.896" width="126.4297" height="30" y="999.3489" clip-path="url(#clipPath2)"/>
+    </g>
+    <g fill="white" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-17,15)" stroke="white">
+      <rect x="135.563" width="93.0957" height="30" y="1139.3489" clip-path="url(#clipPath2)" stroke="none"/>
+    </g>
+    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-17,15)" stroke-linecap="butt">
+      <text x="142.563" xml:space="preserve" y="1158.884" clip-path="url(#clipPath2)" stroke="none">ProtocolEvent</text>
+      <rect fill="none" x="135.563" width="93.0957" height="30" y="1139.3489" clip-path="url(#clipPath2)"/>
+      <path fill="none" d="M342.2614 1002.3945 L553.5103 963.1097" clip-path="url(#clipPath2)"/>
+      <path d="M335.3794 1003.6744 L341.3472 997.4788 L349.1434 1001.1147 L343.1756 1007.3102 Z" clip-path="url(#clipPath2)" stroke="none"/>
+      <text x="342.3794" xml:space="preserve" y="1005.1431" clip-path="url(#clipPath2)" stroke="none">   1</text>
+      <path fill="none" d="M289.364 1026.3489 L278.3833 1061.0479" clip-path="url(#clipPath2)"/>
+      <path fill="white" d="M273.8577 1075.3489 L284.4054 1061.9048 L272.9646 1058.2842 Z" clip-path="url(#clipPath2)" stroke="none"/>
+      <path fill="none" d="M273.8577 1075.3489 L284.4054 1061.9048 L272.9646 1058.2842 Z" clip-path="url(#clipPath2)"/>
+      <path fill="none" d="M131.5553 1115.3489 L150.7897 1130.1868" clip-path="url(#clipPath2)"/>
+      <path fill="white" d="M162.6664 1139.3489 L153.6627 1124.8253 L146.333 1134.3267 Z" clip-path="url(#clipPath2)" stroke="none"/>
+      <path fill="none" d="M162.6664 1139.3489 L153.6627 1124.8253 L146.333 1134.3267 Z" clip-path="url(#clipPath2)"/>
+      <path fill="none" d="M235.5553 1193.3489 L214.7833 1178.1909" clip-path="url(#clipPath2)"/>
+      <path fill="white" d="M202.6664 1169.3489 L212.0542 1183.6271 L219.1279 1173.9336 Z" clip-path="url(#clipPath2)" stroke="none"/>
+      <path fill="none" d="M202.6664 1169.3489 L212.0542 1183.6271 L219.1279 1173.9336 Z" clip-path="url(#clipPath2)"/>
+      <path fill="none" d="M166.9323 1029.3489 L178.4813 1124.4583" clip-path="url(#clipPath2)"/>
+      <path fill="white" d="M180.2894 1139.3489 L184.317 1122.7423 L172.4045 1124.1888 Z" clip-path="url(#clipPath2)" stroke="none"/>
+      <path fill="none" d="M180.2894 1139.3489 L184.317 1122.7423 L172.4045 1124.1888 Z" clip-path="url(#clipPath2)"/>
+      <path fill="none" d="M202.5015 1139.3489 L236.6374 1114.2374" clip-path="url(#clipPath2)"/>
+      <path fill="white" d="M248.7202 1105.3489 L232.2765 1109.9968 L239.3873 1119.6631 Z" clip-path="url(#clipPath2)" stroke="none"/>
+      <path fill="none" d="M248.7202 1105.3489 L232.2765 1109.9968 L239.3873 1119.6631 Z" clip-path="url(#clipPath2)"/>
+    </g>
+    <g fill="rgb(245,245,245)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-17,15)" stroke="rgb(245,245,245)">
+      <rect x="1255.7515" y="613.5835" clip-path="url(#clipPath2)" width="436.4648" rx="4" ry="4" height="353.499" stroke="none"/>
+      <rect x="1255.7515" y="613.5835" clip-path="url(#clipPath2)" fill="rgb(235,235,235)" width="436.4648" height="21.666" stroke="none"/>
+    </g>
+    <g font-size="15px" stroke-linecap="butt" transform="matrix(1,0,0,1,-17,15)" text-rendering="geometricPrecision" font-family="sans-serif" shape-rendering="geometricPrecision" stroke-miterlimit="1.45">
+      <text x="1654.0566" xml:space="preserve" y="630.0854" clip-path="url(#clipPath2)" stroke="none">Party</text>
+      <rect x="1255.7515" y="613.5835" clip-path="url(#clipPath2)" fill="none" width="436.4648" stroke-dasharray="6,2" rx="4" ry="4" height="353.499"/>
+    </g>
+    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-17,15)" stroke="rgb(255,204,0)">
+      <rect x="1565.1577" width="81.8281" height="30" y="725.0825" clip-path="url(#clipPath2)" stroke="none"/>
+    </g>
+    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-17,15)" stroke-linecap="butt">
+      <text x="1572.1577" xml:space="preserve" y="744.6177" clip-path="url(#clipPath2)" stroke="none">Capabilities</text>
+      <rect fill="none" x="1565.1577" width="81.8281" height="30" y="725.0825" clip-path="url(#clipPath2)"/>
+    </g>
+    <g fill="white" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-17,15)" stroke="white">
+      <rect x="1568.9272" width="108.2891" height="70.5312" y="792.8169" clip-path="url(#clipPath2)" stroke="none"/>
+    </g>
+    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-17,15)" stroke-linecap="butt">
+      <text x="1608.6079" xml:space="preserve" y="811.4185" clip-path="url(#clipPath2)" stroke="none">Party</text>
+      <text x="1575.9272" xml:space="preserve" y="825.5513" clip-path="url(#clipPath2)" stroke="none">getCapabilities()</text>
+      <text x="1591.1675" xml:space="preserve" y="839.6841" clip-path="url(#clipPath2)" stroke="none">terminate()</text>
+      <text x="1576.519" xml:space="preserve" y="853.8169" clip-path="url(#clipPath2)" stroke="none">getDescription()</text>
+      <rect fill="none" x="1568.9272" width="108.2891" height="70.5312" y="792.8169" clip-path="url(#clipPath2)"/>
+    </g>
+    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-17,15)" stroke="rgb(255,204,0)">
+      <rect x="1576.5493" width="85.0449" height="30" y="922.0825" clip-path="url(#clipPath2)" stroke="none"/>
+    </g>
+    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-17,15)" stroke-linecap="butt">
+      <text x="1583.5493" xml:space="preserve" y="941.6177" clip-path="url(#clipPath2)" stroke="none">DefaultParty</text>
+      <rect fill="none" x="1576.5493" width="85.0449" height="30" y="922.0825" clip-path="url(#clipPath2)"/>
+      <path fill="none" stroke-dasharray="6,2" d="M1821.6045 823.3602 L1697.2003 811.5406" clip-path="url(#clipPath2)"/>
+      <path stroke-dasharray="6,2" d="M1693.2183 811.1624 L1704.597 818.2704 L1693.2183 811.1624 L1705.7319 806.3242 Z" clip-path="url(#clipPath2)" stroke="none"/>
+      <path fill="none" stroke-miterlimit="10" d="M1693.2183 811.1624 L1704.597 818.2704 L1693.2183 811.1624 L1705.7319 806.3242 Z" clip-path="url(#clipPath2)" stroke-linecap="square"/>
+      <path fill="none" stroke-dasharray="6,2" d="M1342.7507 967.089 L1301.6271 1022.4778" clip-path="url(#clipPath2)"/>
+      <path stroke-dasharray="6,2" d="M1299.2426 1025.6895 L1311.2134 1019.6314 L1299.2426 1025.6895 L1301.5786 1012.478 Z" clip-path="url(#clipPath2)" stroke="none"/>
+      <path fill="none" stroke-miterlimit="10" d="M1299.2426 1025.6895 L1311.2134 1019.6314 L1299.2426 1025.6895 L1301.5786 1012.478 Z" clip-path="url(#clipPath2)" stroke-linecap="square"/>
+      <path fill="none" stroke-dasharray="6,2" d="M1255.7472 840.8061 L776.8444 951.5652" clip-path="url(#clipPath2)"/>
+      <path stroke-dasharray="6,2" d="M772.9473 952.4666 L785.9907 955.6083 L772.9473 952.4666 L783.2867 943.9169 Z" clip-path="url(#clipPath2)" stroke="none"/>
+      <path fill="none" stroke-miterlimit="10" d="M772.9473 952.4666 L785.9907 955.6083 L772.9473 952.4666 L783.2867 943.9169 Z" clip-path="url(#clipPath2)" stroke-linecap="square"/>
+      <path fill="none" d="M1621.5209 870.3434 L1619.6222 922.0825" clip-path="url(#clipPath2)"/>
+      <path fill="white" d="M1621.7776 863.3481 L1626.5175 870.5268 L1621.2642 877.3387 L1616.5243 870.1601 Z" clip-path="url(#clipPath2)" stroke="none"/>
+      <path fill="none" d="M1621.7776 863.3481 L1626.5175 870.5268 L1621.2642 877.3387 L1616.5243 870.1601 Z" clip-path="url(#clipPath2)"/>
+    </g>
+    <g fill="rgb(225,225,225)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-17,15)" stroke="rgb(225,225,225)">
+      <rect x="1270.7515" y="650.2495" clip-path="url(#clipPath2)" width="272.167" rx="4" ry="4" height="202.666" stroke="none"/>
+      <rect x="1270.7515" y="650.2495" clip-path="url(#clipPath2)" fill="rgb(235,235,235)" width="272.167" height="21.666" stroke="none"/>
+    </g>
+    <g font-size="15px" stroke-linecap="butt" transform="matrix(1,0,0,1,-17,15)" text-rendering="geometricPrecision" font-family="sans-serif" shape-rendering="geometricPrecision" stroke-miterlimit="1.45">
+      <text x="1492.4028" xml:space="preserve" y="666.7515" clip-path="url(#clipPath2)" stroke="none">inform</text>
+      <rect x="1270.7515" y="650.2495" clip-path="url(#clipPath2)" fill="none" width="272.167" stroke-dasharray="6,2" rx="4" ry="4" height="202.666"/>
+    </g>
+    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-17,15)" stroke="rgb(255,204,0)">
+      <rect x="1370.6714" width="52.8008" height="30" y="746.9155" clip-path="url(#clipPath2)" stroke="none"/>
+    </g>
+    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-17,15)" stroke-linecap="butt">
+      <text x="1377.6714" xml:space="preserve" y="766.4507" clip-path="url(#clipPath2)" stroke="none">Inform</text>
+      <rect fill="none" x="1370.6714" width="52.8008" height="30" y="746.9155" clip-path="url(#clipPath2)"/>
+    </g>
+    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-17,15)" stroke="rgb(255,204,0)">
+      <rect x="1446.2251" width="81.6934" height="30" y="740.9155" clip-path="url(#clipPath2)" stroke="none"/>
+    </g>
+    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-17,15)" stroke-linecap="butt">
+      <text x="1453.2251" xml:space="preserve" y="760.4507" clip-path="url(#clipPath2)" stroke="none">ActionDone</text>
+      <rect fill="none" x="1446.2251" width="81.6934" height="30" y="740.9155" clip-path="url(#clipPath2)"/>
+    </g>
+    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-17,15)" stroke="rgb(255,204,0)">
+      <rect x="1285.7515" width="60.6406" height="30" y="692.9155" clip-path="url(#clipPath2)" stroke="none"/>
+    </g>
+    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-17,15)" stroke-linecap="butt">
+      <text x="1292.7515" xml:space="preserve" y="712.4507" clip-path="url(#clipPath2)" stroke="none">Settings</text>
+      <rect fill="none" x="1285.7515" width="60.6406" height="30" y="692.9155" clip-path="url(#clipPath2)"/>
+    </g>
+    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-17,15)" stroke="rgb(255,204,0)">
+      <rect x="1388.7612" width="62.6211" height="30" y="686.9155" clip-path="url(#clipPath2)" stroke="none"/>
+    </g>
+    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-17,15)" stroke-linecap="butt">
+      <text x="1395.7612" xml:space="preserve" y="706.4507" clip-path="url(#clipPath2)" stroke="none">Finished</text>
+      <rect fill="none" x="1388.7612" width="62.6211" height="30" y="686.9155" clip-path="url(#clipPath2)"/>
+    </g>
+    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-17,15)" stroke="rgb(255,204,0)">
+      <rect x="1402.7729" width="68.5977" height="30" y="807.9155" clip-path="url(#clipPath2)" stroke="none"/>
+    </g>
+    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-17,15)" stroke-linecap="butt">
+      <text x="1409.7729" xml:space="preserve" y="827.4507" clip-path="url(#clipPath2)" stroke="none">YourTurn</text>
+      <rect fill="none" x="1402.7729" width="68.5977" height="30" y="807.9155" clip-path="url(#clipPath2)"/>
+      <path fill="none" d="M1446.2251 758.6386 L1438.439 759.1577" clip-path="url(#clipPath2)"/>
+      <path fill="white" d="M1423.4722 760.1555 L1439.8358 765.0779 L1439.0376 753.1045 Z" clip-path="url(#clipPath2)" stroke="none"/>
+      <path fill="none" d="M1423.4722 760.1555 L1439.8358 765.0779 L1439.0376 753.1045 Z" clip-path="url(#clipPath2)"/>
+      <path fill="none" d="M1338.5718 722.9155 L1362.0911 738.595" clip-path="url(#clipPath2)"/>
+      <path fill="white" d="M1374.5718 746.9155 L1364.5872 733.048 L1357.9308 743.0326 Z" clip-path="url(#clipPath2)" stroke="none"/>
+      <path fill="none" d="M1374.5718 746.9155 L1364.5872 733.048 L1357.9308 743.0326 Z" clip-path="url(#clipPath2)"/>
+      <path fill="none" d="M1279.0892 719.8394 L712.7974 902.4222" clip-path="url(#clipPath2)"/>
+      <path d="M1285.7515 717.6913 L1280.6235 724.5982 L1272.4269 721.9875 L1277.5548 715.0807 Z" clip-path="url(#clipPath2)" stroke="none"/>
+      <path fill="none" d="M1414.3218 716.9155 L1408.1908 732.9094" clip-path="url(#clipPath2)"/>
+      <path fill="white" d="M1402.8218 746.9156 L1414.1512 734.1232 L1402.9463 729.8281 Z" clip-path="url(#clipPath2)" stroke="none"/>
+      <path fill="none" d="M1402.8218 746.9156 L1414.1512 734.1232 L1402.9463 729.8281 Z" clip-path="url(#clipPath2)"/>
+      <path fill="none" d="M1427.2357 807.9155 L1415.1332 789.4592" clip-path="url(#clipPath2)"/>
+      <path fill="white" d="M1406.9078 776.9155 L1410.6641 793.5856 L1420.699 787.0053 Z" clip-path="url(#clipPath2)" stroke="none"/>
+      <path fill="none" d="M1406.9078 776.9155 L1410.6641 793.5856 L1420.699 787.0053 Z" clip-path="url(#clipPath2)"/>
+    </g>
+    <g fill="rgb(245,245,245)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-17,15)" stroke="rgb(245,245,245)">
       <rect x="740.3657" y="438.5005" clip-path="url(#clipPath2)" width="395.4121" rx="4" ry="4" height="242.666" stroke="none"/>
       <rect x="740.3657" y="438.5005" clip-path="url(#clipPath2)" fill="rgb(235,235,235)" width="395.4121" height="21.666" stroke="none"/>
     </g>
-    <g font-size="15px" stroke-linecap="butt" transform="matrix(1,0,0,1,-124,15)" text-rendering="geometricPrecision" font-family="sans-serif" shape-rendering="geometricPrecision" stroke-miterlimit="1.45">
+    <g font-size="15px" stroke-linecap="butt" transform="matrix(1,0,0,1,-17,15)" text-rendering="geometricPrecision" font-family="sans-serif" shape-rendering="geometricPrecision" stroke-miterlimit="1.45">
       <text x="1071.2583" xml:space="preserve" y="455.0024" clip-path="url(#clipPath2)" stroke="none">Timeline</text>
       <rect x="740.3657" y="438.5005" clip-path="url(#clipPath2)" fill="none" width="395.4121" stroke-dasharray="6,2" rx="4" ry="4" height="242.666"/>
     </g>
-    <g fill="white" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="white">
+    <g fill="white" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-17,15)" stroke="white">
       <rect x="997.8228" width="122.9551" height="42.2656" y="519.0337" clip-path="url(#clipPath2)" stroke="none"/>
     </g>
-    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-124,15)" stroke-linecap="butt">
+    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-17,15)" stroke-linecap="butt">
       <text x="1005.8228" xml:space="preserve" y="538.6353" clip-path="url(#clipPath2)" stroke="none">Progress(Deadline)</text>
       <text x="1041.1782" xml:space="preserve" y="552.7681" clip-path="url(#clipPath2)" stroke="none">value()</text>
       <rect fill="none" x="997.8228" width="122.9551" height="42.2656" y="519.0337" clip-path="url(#clipPath2)"/>
     </g>
-    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="rgb(255,204,0)">
+    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-17,15)" stroke="rgb(255,204,0)">
       <rect x="839.4253" width="107.75" height="30" y="636.1665" clip-path="url(#clipPath2)" stroke="none"/>
     </g>
-    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-124,15)" stroke-linecap="butt">
+    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-17,15)" stroke-linecap="butt">
       <text x="846.4253" xml:space="preserve" y="655.7017" clip-path="url(#clipPath2)" stroke="none">ProgressRounds</text>
       <rect fill="none" x="839.4253" width="107.75" height="30" y="636.1665" clip-path="url(#clipPath2)"/>
     </g>
-    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="rgb(255,204,0)">
+    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-17,15)" stroke="rgb(255,204,0)">
       <rect x="969.7144" width="93.1719" height="30" y="631.1665" clip-path="url(#clipPath2)" stroke="none"/>
     </g>
-    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-124,15)" stroke-linecap="butt">
+    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-17,15)" stroke-linecap="butt">
       <text x="976.7144" xml:space="preserve" y="650.7017" clip-path="url(#clipPath2)" stroke="none">ProgressTime</text>
       <rect fill="none" x="969.7144" width="93.1719" height="30" y="631.1665" clip-path="url(#clipPath2)"/>
     </g>
-    <g fill="white" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="white">
+    <g fill="white" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-17,15)" stroke="white">
       <rect x="888.8384" width="64.9238" height="30" y="475.1665" clip-path="url(#clipPath2)" stroke="none"/>
     </g>
-    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-124,15)" stroke-linecap="butt">
+    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-17,15)" stroke-linecap="butt">
       <text x="895.8384" xml:space="preserve" y="494.7017" clip-path="url(#clipPath2)" stroke="none">Deadline</text>
       <rect fill="none" x="888.8384" width="64.9238" height="30" y="475.1665" clip-path="url(#clipPath2)"/>
     </g>
-    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="rgb(255,204,0)">
+    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-17,15)" stroke="rgb(255,204,0)">
       <rect x="755.3657" width="93.8691" height="30" y="565.1665" clip-path="url(#clipPath2)" stroke="none"/>
     </g>
-    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-124,15)" stroke-linecap="butt">
+    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-17,15)" stroke-linecap="butt">
       <text x="762.3657" xml:space="preserve" y="584.7017" clip-path="url(#clipPath2)" stroke="none">DeadlineTime</text>
       <rect fill="none" x="755.3657" width="93.8691" height="30" y="565.1665" clip-path="url(#clipPath2)"/>
     </g>
-    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="rgb(255,204,0)">
+    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-17,15)" stroke="rgb(255,204,0)">
       <rect x="872.1353" width="102.3301" height="30" y="545.1665" clip-path="url(#clipPath2)" stroke="none"/>
     </g>
-    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-124,15)" stroke-linecap="butt">
+    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-17,15)" stroke-linecap="butt">
       <text x="879.1353" xml:space="preserve" y="564.7017" clip-path="url(#clipPath2)" stroke="none">DeadlineRound</text>
       <rect fill="none" x="872.1353" width="102.3301" height="30" y="545.1665" clip-path="url(#clipPath2)"/>
-      <path fill="none" stroke-dasharray="6,2" d="M1370.0925 775.863 L1140.2281 660.9207" clip-path="url(#clipPath2)"/>
-      <path stroke-dasharray="6,2" d="M1136.6505 659.1317 L1144.7 669.8651 L1136.6505 659.1317 L1150.0669 659.1321 Z" clip-path="url(#clipPath2)" stroke="none"/>
-      <path fill="none" stroke-miterlimit="10" d="M1136.6505 659.1317 L1144.7 669.8651 L1136.6505 659.1317 L1150.0669 659.1321 Z" clip-path="url(#clipPath2)" stroke-linecap="square"/>
-      <path fill="none" d="M1048.0654 848.9756 L1058.5315 561.2993" clip-path="url(#clipPath2)"/>
-      <path d="M1047.8109 855.9709 L1043.0687 848.7938 L1048.3199 841.9802 L1053.0621 849.1573 Z" clip-path="url(#clipPath2)" stroke="none"/>
+      <path fill="none" stroke-dasharray="6,2" d="M1255.7789 696.4816 L1140.34 646.8304" clip-path="url(#clipPath2)"/>
+      <path stroke-dasharray="6,2" d="M1136.6654 645.25 L1145.3184 655.5032 L1136.6654 645.25 L1150.0597 644.4796 Z" clip-path="url(#clipPath2)" stroke="none"/>
+      <path fill="none" stroke-miterlimit="10" d="M1136.6654 645.25 L1145.3184 655.5032 L1136.6654 645.25 L1150.0597 644.4796 Z" clip-path="url(#clipPath2)" stroke-linecap="square"/>
+      <path fill="none" d="M1287.2512 689.087 L1091.6481 561.2993" clip-path="url(#clipPath2)"/>
+      <path d="M1293.1115 692.9155 L1284.5166 693.2729 L1281.391 685.2585 L1289.9858 684.9011 Z" clip-path="url(#clipPath2)" stroke="none"/>
       <path fill="none" d="M915.7327 636.1665 L1015.2271 569.6371" clip-path="url(#clipPath2)"/>
       <path fill="white" d="M1027.6963 561.2993 L1011.0607 565.2053 L1017.731 575.1807 Z" clip-path="url(#clipPath2)" stroke="none"/>
@@ -750,271 +741,243 @@
       <path fill="none" d="M921.7289 505.1665 L916.1883 521.3314 L928.1834 520.9886 Z" clip-path="url(#clipPath2)"/>
     </g>
-    <g fill="rgb(245,245,245)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="rgb(245,245,245)">
-      <rect x="1929.3477" y="1281.2452" clip-path="url(#clipPath2)" width="428.333" rx="4" ry="4" height="536.9639" stroke="none"/>
-      <rect x="1929.3477" y="1281.2452" clip-path="url(#clipPath2)" fill="rgb(235,235,235)" width="428.333" height="21.666" stroke="none"/>
-    </g>
-    <g font-size="15px" stroke-linecap="butt" transform="matrix(1,0,0,1,-124,15)" text-rendering="geometricPrecision" font-family="sans-serif" shape-rendering="geometricPrecision" stroke-miterlimit="1.45">
-      <text x="2291.4326" xml:space="preserve" y="1297.7472" clip-path="url(#clipPath2)" stroke="none">BidSpace</text>
-      <rect x="1929.3477" y="1281.2452" clip-path="url(#clipPath2)" fill="none" width="428.333" stroke-dasharray="6,2" rx="4" ry="4" height="536.9639"/>
-    </g>
-    <g fill="white" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="white">
-      <rect x="2211.7452" width="130.9355" height="98.7969" y="1393.712" clip-path="url(#clipPath2)" stroke="none"/>
-    </g>
-    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-124,15)" stroke-linecap="butt">
-      <text x="2251.5137" xml:space="preserve" y="1412.3136" clip-path="url(#clipPath2)" stroke="none">BidSpace</text>
-      <text x="2275.3145" xml:space="preserve" y="1426.4464" clip-path="url(#clipPath2)" stroke="none"> </text>
-      <text x="2252.542" xml:space="preserve" y="1440.5792" clip-path="url(#clipPath2)" stroke="none">pareto())</text>
-      <text x="2244.7871" xml:space="preserve" y="1454.712" clip-path="url(#clipPath2)" stroke="none">nashPoint()</text>
-      <text x="2245.0039" xml:space="preserve" y="1468.8448" clip-path="url(#clipPath2)" stroke="none">kalaiPoint()</text>
-      <text x="2218.7451" xml:space="preserve" y="1482.9777" clip-path="url(#clipPath2)" stroke="none">socialWelfarePoinit()</text>
-      <rect fill="none" x="2211.7452" width="130.9355" height="98.7969" y="1393.712" clip-path="url(#clipPath2)"/>
-    </g>
-    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="rgb(255,204,0)">
-      <rect x="2194.9415" width="112.543" height="30" y="1547.1105" clip-path="url(#clipPath2)" stroke="none"/>
-    </g>
-    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-124,15)" stroke-linecap="butt">
-      <text x="2201.9414" xml:space="preserve" y="1566.6456" clip-path="url(#clipPath2)" stroke="none">BidspaceDiscrete</text>
-      <rect fill="none" x="2194.9415" width="112.543" height="30" y="1547.1105" clip-path="url(#clipPath2)"/>
-    </g>
-    <g fill="white" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="white">
-      <rect x="2023.8888" width="112.6484" height="56.3984" y="1317.9112" clip-path="url(#clipPath2)" stroke="none"/>
-    </g>
-    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-124,15)" stroke-linecap="butt">
-      <text x="2033.5724" xml:space="preserve" y="1336.5128" clip-path="url(#clipPath2)" stroke="none">OpponentModel</text>
-      <text x="2078.3145" xml:space="preserve" y="1350.6456" clip-path="url(#clipPath2)" stroke="none"> </text>
-      <text x="2030.8888" xml:space="preserve" y="1364.7784" clip-path="url(#clipPath2)" stroke="none">receiveMessage()</text>
-      <rect fill="none" x="2023.8888" width="112.6484" height="56.3984" y="1317.9112" clip-path="url(#clipPath2)"/>
-    </g>
-    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="rgb(255,204,0)">
-      <rect x="1954.7833" width="166.8594" height="30" y="1440.1105" clip-path="url(#clipPath2)" stroke="none"/>
-    </g>
-    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-124,15)" stroke-linecap="butt">
-      <text x="1961.7833" xml:space="preserve" y="1459.6456" clip-path="url(#clipPath2)" stroke="none">FrequencyOpponentModel</text>
-      <rect fill="none" x="1954.7833" width="166.8594" height="30" y="1440.1105" clip-path="url(#clipPath2)"/>
-    </g>
-    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="rgb(255,204,0)">
-      <rect x="1944.3477" width="73.7305" height="56.3984" y="1558.9112" clip-path="url(#clipPath2)" stroke="none"/>
-    </g>
-    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-124,15)" stroke-linecap="butt">
-      <text x="1951.3478" xml:space="preserve" y="1577.5128" clip-path="url(#clipPath2)" stroke="none">AllBidsList</text>
-      <text x="1964.2589" xml:space="preserve" y="1591.6456" clip-path="url(#clipPath2)" stroke="none">get(n)</text>
-      <text x="1965.7355" xml:space="preserve" y="1605.7784" clip-path="url(#clipPath2)" stroke="none">size()</text>
-      <rect fill="none" x="1944.3477" width="73.7305" height="56.3984" y="1558.9112" clip-path="url(#clipPath2)"/>
-      <path fill="none" stroke-dasharray="6,2" d="M1512.125 886.0251 L1925.8989 1320.9749" clip-path="url(#clipPath2)"/>
-      <path stroke-dasharray="6,2" d="M1928.656 1323.873 L1924.7322 1311.0432 L1928.656 1323.873 L1916.0378 1319.3142 Z" clip-path="url(#clipPath2)" stroke="none"/>
-      <path fill="none" stroke-miterlimit="10" d="M1928.656 1323.873 L1924.7322 1311.0432 L1928.656 1323.873 L1916.0378 1319.3142 Z" clip-path="url(#clipPath2)" stroke-linecap="square"/>
-      <path fill="none" stroke-dasharray="6,2" d="M1929.3732 1529.9927 L1213.4749 1464.0178" clip-path="url(#clipPath2)"/>
-      <path stroke-dasharray="6,2" d="M1209.4917 1463.6509 L1220.8906 1470.7266 L1209.4917 1463.6509 L1221.9916 1458.7771 Z" clip-path="url(#clipPath2)" stroke="none"/>
-      <path fill="none" stroke-miterlimit="10" d="M1209.4917 1463.6509 L1220.8906 1470.7266 L1209.4917 1463.6509 L1221.9916 1458.7771 Z" clip-path="url(#clipPath2)" stroke-linecap="square"/>
-      <path fill="none" d="M2254.4902 1547.1105 L2263.2183 1507.1632" clip-path="url(#clipPath2)"/>
-      <path fill="white" d="M2266.4199 1492.5089 L2257.1431 1506.8595 L2268.8665 1509.4209 Z" clip-path="url(#clipPath2)" stroke="none"/>
-      <path fill="none" d="M2266.4199 1492.5089 L2257.1431 1506.8595 L2268.8665 1509.4209 Z" clip-path="url(#clipPath2)"/>
-      <path fill="none" d="M2023.8888 1349.2103 L1206.3977 1394.2025" clip-path="url(#clipPath2)"/>
-      <path fill="white" d="M1191.4204 1395.0269 L1207.726 1400.1385 L1207.0665 1388.1566 Z" clip-path="url(#clipPath2)" stroke="none"/>
-      <path fill="none" d="M1191.4204 1395.0269 L1207.726 1400.1385 L1207.0665 1388.1566 Z" clip-path="url(#clipPath2)"/>
-      <path fill="none" d="M2013.5557 1435.7936 L1762.6188 1239.2057" clip-path="url(#clipPath2)"/>
-      <path d="M2019.066 1440.1105 L2010.4722 1439.7296 L2008.0453 1431.4767 L2016.6392 1431.8575 Z" clip-path="url(#clipPath2)" stroke="none"/>
-      <path fill="none" d="M2043.9928 1440.1105 L2063.9539 1388.3065" clip-path="url(#clipPath2)"/>
-      <path fill="white" d="M2069.3472 1374.3097 L2057.9956 1387.0824 L2069.1931 1391.397 Z" clip-path="url(#clipPath2)" stroke="none"/>
-      <path fill="none" d="M2069.3472 1374.3097 L2057.9956 1387.0824 L2069.1931 1391.397 Z" clip-path="url(#clipPath2)"/>
-      <path fill="none" d="M1939.6499 1554.5984 L1642.162 1321.8927" clip-path="url(#clipPath2)"/>
-      <path d="M1945.1635 1558.9113 L1936.5693 1558.5366 L1934.1364 1550.2855 L1942.7305 1550.6602 Z" clip-path="url(#clipPath2)" stroke="none"/>
-    </g>
-    <g fill="rgb(225,225,225)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="rgb(225,225,225)">
-      <rect x="2040.8477" y="1601.2775" clip-path="url(#clipPath2)" width="244.5801" rx="4" ry="4" height="201.9316" stroke="none"/>
-      <rect x="2040.8477" y="1601.2775" clip-path="url(#clipPath2)" fill="rgb(235,235,235)" width="244.5801" height="21.666" stroke="none"/>
-    </g>
-    <g font-size="15px" stroke-linecap="butt" transform="matrix(1,0,0,1,-124,15)" text-rendering="geometricPrecision" font-family="sans-serif" shape-rendering="geometricPrecision" stroke-miterlimit="1.45">
-      <text x="2236.3843" xml:space="preserve" y="1617.7794" clip-path="url(#clipPath2)" stroke="none">pareto</text>
-      <rect x="2040.8477" y="1601.2775" clip-path="url(#clipPath2)" fill="none" width="244.5801" stroke-dasharray="6,2" rx="4" ry="4" height="201.9316"/>
-    </g>
-    <g fill="white" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="white">
-      <rect x="2173.9981" width="96.4297" height="70.5312" y="1717.6778" clip-path="url(#clipPath2)" stroke="none"/>
-    </g>
-    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-124,15)" stroke-linecap="butt">
-      <text x="2180.998" xml:space="preserve" y="1736.2794" clip-path="url(#clipPath2)" stroke="none">ParetoFrontier</text>
-      <text x="2220.3145" xml:space="preserve" y="1750.4122" clip-path="url(#clipPath2)" stroke="none"> </text>
-      <text x="2187.4492" xml:space="preserve" y="1764.545" clip-path="url(#clipPath2)" stroke="none">getProfiles()</text>
-      <text x="2191.2197" xml:space="preserve" y="1778.6779" clip-path="url(#clipPath2)" stroke="none">getPoints()</text>
-      <rect fill="none" x="2173.9981" width="96.4297" height="70.5312" y="1717.6778" clip-path="url(#clipPath2)"/>
-    </g>
-    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="rgb(255,204,0)">
-      <rect x="2068.2335" width="133.959" height="30" y="1637.9435" clip-path="url(#clipPath2)" stroke="none"/>
-    </g>
-    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-124,15)" stroke-linecap="butt">
-      <text x="2075.2334" xml:space="preserve" y="1657.4786" clip-path="url(#clipPath2)" stroke="none">ParetoLinearAdditive</text>
-      <rect fill="none" x="2068.2335" width="133.959" height="30" y="1637.9435" clip-path="url(#clipPath2)"/>
-    </g>
-    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="rgb(255,204,0)">
-      <rect x="2055.8477" width="94.7305" height="30" y="1745.9435" clip-path="url(#clipPath2)" stroke="none"/>
-    </g>
-    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-124,15)" stroke-linecap="butt">
-      <text x="2062.8477" xml:space="preserve" y="1765.4786" clip-path="url(#clipPath2)" stroke="none">GenericPareto</text>
-      <rect fill="none" x="2055.8477" width="94.7305" height="30" y="1745.9435" clip-path="url(#clipPath2)"/>
-      <path fill="none" d="M2226.5457 1581.4261 L2154.3689 1637.9435" clip-path="url(#clipPath2)"/>
-      <path d="M2232.0569 1577.1105 L2229.6282 1585.3628 L2221.0342 1585.7419 L2223.4629 1577.4895 Z" clip-path="url(#clipPath2)" stroke="none"/>
-      <text x="2204.604" xml:space="preserve" y="1595.712" clip-path="url(#clipPath2)" stroke="none">   1</text>
-      <path fill="none" d="M2061.3098 1641.9313 L1193.4683 1512.6161" clip-path="url(#clipPath2)"/>
-      <path d="M2068.2334 1642.963 L2060.573 1646.8767 L2054.3862 1640.8995 L2062.0469 1636.9858 Z" clip-path="url(#clipPath2)" stroke="none"/>
-      <text x="2044.0597" xml:space="preserve" y="1645.1755" clip-path="url(#clipPath2)" stroke="none">   *</text>
-      <path fill="none" d="M2148.2629 1667.9435 L2181.6863 1706.3612" clip-path="url(#clipPath2)"/>
-      <path fill="white" d="M2191.532 1717.6777 L2185.5566 1701.6685 L2176.5034 1709.545 Z" clip-path="url(#clipPath2)" stroke="none"/>
-      <path fill="none" d="M2191.532 1717.6777 L2185.5566 1701.6685 L2176.5034 1709.545 Z" clip-path="url(#clipPath2)"/>
-      <path fill="none" d="M2150.5781 1757.7593 L2159.032 1757.1909" clip-path="url(#clipPath2)"/>
-      <path fill="white" d="M2173.9983 1756.1848 L2157.6318 1751.2715 L2158.4368 1763.2445 Z" clip-path="url(#clipPath2)" stroke="none"/>
-      <path fill="none" d="M2173.9983 1756.1848 L2157.6318 1751.2715 L2158.4368 1763.2445 Z" clip-path="url(#clipPath2)"/>
-    </g>
-    <g fill="rgb(245,245,245)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="rgb(245,245,245)">
-      <rect x="1659.7028" y="750.6085" clip-path="url(#clipPath2)" width="154.3965" rx="4" ry="4" height="122.1973" stroke="none"/>
-      <rect x="1659.7028" y="750.6085" clip-path="url(#clipPath2)" fill="rgb(235,235,235)" width="154.3965" height="21.666" stroke="none"/>
-    </g>
-    <g font-size="15px" stroke-linecap="butt" transform="matrix(1,0,0,1,-124,15)" text-rendering="geometricPrecision" font-family="sans-serif" shape-rendering="geometricPrecision" stroke-miterlimit="1.45">
-      <text x="1700.3097" xml:space="preserve" y="767.1105" clip-path="url(#clipPath2)" stroke="none">exampleparties</text>
-      <rect x="1659.7028" y="750.6085" clip-path="url(#clipPath2)" fill="none" width="154.3965" stroke-dasharray="6,2" rx="4" ry="4" height="122.1973"/>
-    </g>
-    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="rgb(255,204,0)">
-      <rect x="1674.7028" width="124.3965" height="70.5312" y="787.2745" clip-path="url(#clipPath2)" stroke="none"/>
-    </g>
-    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-124,15)" stroke-linecap="butt">
-      <text x="1688.8219" xml:space="preserve" y="805.8761" clip-path="url(#clipPath2)" stroke="none">Concrete agent, </text>
-      <text x="1697.7838" xml:space="preserve" y="820.0089" clip-path="url(#clipPath2)" stroke="none">eg niceParty, </text>
-      <text x="1705.0641" xml:space="preserve" y="834.1417" clip-path="url(#clipPath2)" stroke="none">nastyParty,</text>
-      <text x="1681.7028" xml:space="preserve" y="848.2745" clip-path="url(#clipPath2)" stroke="none">Boulware, Bayesian</text>
-      <rect fill="none" x="1674.7028" width="124.3965" height="70.5312" y="787.2745" clip-path="url(#clipPath2)"/>
-      <path fill="none" stroke-dasharray="6,2" d="M1659.6671 811.6202 L1517.156 811.4598" clip-path="url(#clipPath2)"/>
-      <path stroke-dasharray="6,2" d="M1513.156 811.4553 L1525.1492 817.4689 L1513.156 811.4553 L1525.1628 805.4689 Z" clip-path="url(#clipPath2)" stroke="none"/>
-      <path fill="none" stroke-miterlimit="10" d="M1513.156 811.4553 L1525.1492 817.4689 L1513.156 811.4553 L1525.1628 805.4689 Z" clip-path="url(#clipPath2)" stroke-linecap="square"/>
-    </g>
-    <g fill="rgb(245,245,245)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="rgb(245,245,245)">
-      <rect x="734.3404" y="0" clip-path="url(#clipPath2)" width="512.8613" rx="4" ry="4" height="370.666" stroke="none"/>
-      <rect x="734.3404" y="0" clip-path="url(#clipPath2)" fill="rgb(235,235,235)" width="512.8613" height="21.666" stroke="none"/>
-    </g>
-    <g font-size="15px" stroke-linecap="butt" transform="matrix(1,0,0,1,-124,15)" text-rendering="geometricPrecision" font-family="sans-serif" shape-rendering="geometricPrecision" stroke-miterlimit="1.45">
-      <text x="1184.3521" xml:space="preserve" y="16.502" clip-path="url(#clipPath2)" stroke="none">protocol</text>
-      <rect x="734.3404" y="0" clip-path="url(#clipPath2)" fill="none" width="512.8613" stroke-dasharray="6,2" rx="4" ry="4" height="370.666"/>
-    </g>
-    <g fill="white" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="white">
+    <g fill="rgb(245,245,245)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-17,15)" stroke="rgb(245,245,245)">
+      <rect x="1567.2065" y="1216.5815" clip-path="url(#clipPath2)" width="428.333" rx="4" ry="4" height="536.9639" stroke="none"/>
+      <rect x="1567.2065" y="1216.5815" clip-path="url(#clipPath2)" fill="rgb(235,235,235)" width="428.333" height="21.666" stroke="none"/>
+    </g>
+    <g font-size="15px" stroke-linecap="butt" transform="matrix(1,0,0,1,-17,15)" text-rendering="geometricPrecision" font-family="sans-serif" shape-rendering="geometricPrecision" stroke-miterlimit="1.45">
+      <text x="1929.2915" xml:space="preserve" y="1233.0835" clip-path="url(#clipPath2)" stroke="none">BidSpace</text>
+      <rect x="1567.2065" y="1216.5815" clip-path="url(#clipPath2)" fill="none" width="428.333" stroke-dasharray="6,2" rx="4" ry="4" height="536.9639"/>
+    </g>
+    <g fill="white" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-17,15)" stroke="white">
+      <rect x="1849.604" width="130.9355" height="98.7969" y="1329.0483" clip-path="url(#clipPath2)" stroke="none"/>
+    </g>
+    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-17,15)" stroke-linecap="butt">
+      <text x="1889.3726" xml:space="preserve" y="1347.6499" clip-path="url(#clipPath2)" stroke="none">BidSpace</text>
+      <text x="1913.1733" xml:space="preserve" y="1361.7827" clip-path="url(#clipPath2)" stroke="none"> </text>
+      <text x="1890.4009" xml:space="preserve" y="1375.9155" clip-path="url(#clipPath2)" stroke="none">pareto())</text>
+      <text x="1882.646" xml:space="preserve" y="1390.0483" clip-path="url(#clipPath2)" stroke="none">nashPoint()</text>
+      <text x="1882.8628" xml:space="preserve" y="1404.1812" clip-path="url(#clipPath2)" stroke="none">kalaiPoint()</text>
+      <text x="1856.604" xml:space="preserve" y="1418.314" clip-path="url(#clipPath2)" stroke="none">socialWelfarePoinit()</text>
+      <rect fill="none" x="1849.604" width="130.9355" height="98.7969" y="1329.0483" clip-path="url(#clipPath2)"/>
+    </g>
+    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-17,15)" stroke="rgb(255,204,0)">
+      <rect x="1832.8003" width="112.543" height="30" y="1482.4468" clip-path="url(#clipPath2)" stroke="none"/>
+    </g>
+    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-17,15)" stroke-linecap="butt">
+      <text x="1839.8003" xml:space="preserve" y="1501.9819" clip-path="url(#clipPath2)" stroke="none">BidspaceDiscrete</text>
+      <rect fill="none" x="1832.8003" width="112.543" height="30" y="1482.4468" clip-path="url(#clipPath2)"/>
+    </g>
+    <g fill="white" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-17,15)" stroke="white">
+      <rect x="1661.7476" width="112.6484" height="56.3984" y="1253.2476" clip-path="url(#clipPath2)" stroke="none"/>
+    </g>
+    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-17,15)" stroke-linecap="butt">
+      <text x="1671.4312" xml:space="preserve" y="1271.8491" clip-path="url(#clipPath2)" stroke="none">OpponentModel</text>
+      <text x="1716.1733" xml:space="preserve" y="1285.9819" clip-path="url(#clipPath2)" stroke="none"> </text>
+      <text x="1668.7476" xml:space="preserve" y="1300.1147" clip-path="url(#clipPath2)" stroke="none">receiveMessage()</text>
+      <rect fill="none" x="1661.7476" width="112.6484" height="56.3984" y="1253.2476" clip-path="url(#clipPath2)"/>
+    </g>
+    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-17,15)" stroke="rgb(255,204,0)">
+      <rect x="1592.6421" width="166.8594" height="30" y="1375.4468" clip-path="url(#clipPath2)" stroke="none"/>
+    </g>
+    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-17,15)" stroke-linecap="butt">
+      <text x="1599.6421" xml:space="preserve" y="1394.9819" clip-path="url(#clipPath2)" stroke="none">FrequencyOpponentModel</text>
+      <rect fill="none" x="1592.6421" width="166.8594" height="30" y="1375.4468" clip-path="url(#clipPath2)"/>
+    </g>
+    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-17,15)" stroke="rgb(255,204,0)">
+      <rect x="1582.2065" width="73.7305" height="56.3984" y="1494.2476" clip-path="url(#clipPath2)" stroke="none"/>
+    </g>
+    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-17,15)" stroke-linecap="butt">
+      <text x="1589.2065" xml:space="preserve" y="1512.8491" clip-path="url(#clipPath2)" stroke="none">AllBidsList</text>
+      <text x="1602.1177" xml:space="preserve" y="1526.9819" clip-path="url(#clipPath2)" stroke="none">get(n)</text>
+      <text x="1603.5942" xml:space="preserve" y="1541.1147" clip-path="url(#clipPath2)" stroke="none">size()</text>
+      <rect fill="none" x="1582.2065" width="73.7305" height="56.3984" y="1494.2476" clip-path="url(#clipPath2)"/>
+      <path fill="none" stroke-dasharray="6,2" d="M1552.2008 967.111 L1660.5536 1211.9993" clip-path="url(#clipPath2)"/>
+      <path stroke-dasharray="6,2" d="M1662.172 1215.6572 L1662.8036 1202.2556 L1662.172 1215.6572 L1651.8297 1207.1111 Z" clip-path="url(#clipPath2)" stroke="none"/>
+      <path fill="none" stroke-miterlimit="10" d="M1662.172 1215.6572 L1662.8036 1202.2556 L1662.172 1215.6572 L1651.8297 1207.1111 Z" clip-path="url(#clipPath2)" stroke-linecap="square"/>
+      <path fill="none" stroke-dasharray="6,2" d="M1567.2159 1409.7681 L1391.3019 1347.9185" clip-path="url(#clipPath2)"/>
+      <path stroke-dasharray="6,2" d="M1387.5283 1346.5917 L1396.8589 1356.2322 L1387.5283 1346.5917 L1400.8391 1344.9115 Z" clip-path="url(#clipPath2)" stroke="none"/>
+      <path fill="none" stroke-miterlimit="10" d="M1387.5283 1346.5917 L1396.8589 1356.2322 L1387.5283 1346.5917 L1400.8391 1344.9115 Z" clip-path="url(#clipPath2)" stroke-linecap="square"/>
+      <path fill="none" d="M1892.3491 1482.4468 L1901.077 1442.4995" clip-path="url(#clipPath2)"/>
+      <path fill="white" d="M1904.2788 1427.8452 L1895.0018 1442.1958 L1906.7253 1444.7572 Z" clip-path="url(#clipPath2)" stroke="none"/>
+      <path fill="none" d="M1904.2788 1427.8452 L1895.0018 1442.1958 L1906.7253 1444.7572 Z" clip-path="url(#clipPath2)"/>
+      <path fill="none" d="M1661.7476 1272.6132 L1328.6113 1220.3657" clip-path="url(#clipPath2)"/>
+      <path fill="white" d="M1313.7925 1218.0415 L1328.6696 1226.4482 L1330.5289 1214.5931 Z" clip-path="url(#clipPath2)" stroke="none"/>
+      <path fill="none" d="M1313.7925 1218.0415 L1328.6696 1226.4482 L1330.5289 1214.5931 Z" clip-path="url(#clipPath2)"/>
+      <path fill="none" d="M1601.7178 1406.9648 L737.2271 1599.0151" clip-path="url(#clipPath2)"/>
+      <path d="M1608.5511 1405.4468 L1602.8021 1411.8458 L1594.8843 1408.4829 L1600.6334 1402.0839 Z" clip-path="url(#clipPath2)" stroke="none"/>
+      <path fill="none" d="M1681.8516 1375.4468 L1701.8127 1323.6428" clip-path="url(#clipPath2)"/>
+      <path fill="white" d="M1707.2061 1309.646 L1695.8545 1322.4187 L1707.0519 1326.7333 Z" clip-path="url(#clipPath2)" stroke="none"/>
+      <path fill="none" d="M1707.2061 1309.646 L1695.8545 1322.4187 L1707.0519 1326.7333 Z" clip-path="url(#clipPath2)"/>
+      <path fill="none" d="M1575.2649 1528.1387 L610.8062 1653.4535" clip-path="url(#clipPath2)"/>
+      <path d="M1582.2065 1527.2368 L1575.9091 1533.097 L1568.3232 1529.0405 L1574.6207 1523.1803 Z" clip-path="url(#clipPath2)" stroke="none"/>
+    </g>
+    <g fill="rgb(225,225,225)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-17,15)" stroke="rgb(225,225,225)">
+      <rect x="1678.7065" y="1536.6138" clip-path="url(#clipPath2)" width="244.5801" rx="4" ry="4" height="201.9316" stroke="none"/>
+      <rect x="1678.7065" y="1536.6138" clip-path="url(#clipPath2)" fill="rgb(235,235,235)" width="244.5801" height="21.666" stroke="none"/>
+    </g>
+    <g font-size="15px" stroke-linecap="butt" transform="matrix(1,0,0,1,-17,15)" text-rendering="geometricPrecision" font-family="sans-serif" shape-rendering="geometricPrecision" stroke-miterlimit="1.45">
+      <text x="1874.2432" xml:space="preserve" y="1553.1157" clip-path="url(#clipPath2)" stroke="none">pareto</text>
+      <rect x="1678.7065" y="1536.6138" clip-path="url(#clipPath2)" fill="none" width="244.5801" stroke-dasharray="6,2" rx="4" ry="4" height="201.9316"/>
+    </g>
+    <g fill="white" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-17,15)" stroke="white">
+      <rect x="1811.8569" width="96.4297" height="70.5312" y="1653.0142" clip-path="url(#clipPath2)" stroke="none"/>
+    </g>
+    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-17,15)" stroke-linecap="butt">
+      <text x="1818.8569" xml:space="preserve" y="1671.6157" clip-path="url(#clipPath2)" stroke="none">ParetoFrontier</text>
+      <text x="1858.1733" xml:space="preserve" y="1685.7485" clip-path="url(#clipPath2)" stroke="none"> </text>
+      <text x="1825.3081" xml:space="preserve" y="1699.8813" clip-path="url(#clipPath2)" stroke="none">getProfiles()</text>
+      <text x="1829.0786" xml:space="preserve" y="1714.0142" clip-path="url(#clipPath2)" stroke="none">getPoints()</text>
+      <rect fill="none" x="1811.8569" width="96.4297" height="70.5312" y="1653.0142" clip-path="url(#clipPath2)"/>
+    </g>
+    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-17,15)" stroke="rgb(255,204,0)">
+      <rect x="1706.0923" width="133.959" height="30" y="1573.2798" clip-path="url(#clipPath2)" stroke="none"/>
+    </g>
+    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-17,15)" stroke-linecap="butt">
+      <text x="1713.0923" xml:space="preserve" y="1592.8149" clip-path="url(#clipPath2)" stroke="none">ParetoLinearAdditive</text>
+      <rect fill="none" x="1706.0923" width="133.959" height="30" y="1573.2798" clip-path="url(#clipPath2)"/>
+    </g>
+    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-17,15)" stroke="rgb(255,204,0)">
+      <rect x="1693.7065" width="94.7305" height="30" y="1681.2798" clip-path="url(#clipPath2)" stroke="none"/>
+    </g>
+    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-17,15)" stroke-linecap="butt">
+      <text x="1700.7065" xml:space="preserve" y="1700.8149" clip-path="url(#clipPath2)" stroke="none">GenericPareto</text>
+      <rect fill="none" x="1693.7065" width="94.7305" height="30" y="1681.2798" clip-path="url(#clipPath2)"/>
+      <path fill="none" d="M1864.4044 1516.7625 L1792.2278 1573.2798" clip-path="url(#clipPath2)"/>
+      <path d="M1869.9158 1512.4468 L1867.4871 1520.6991 L1858.8931 1521.0781 L1861.3218 1512.8258 Z" clip-path="url(#clipPath2)" stroke="none"/>
+      <text x="1842.4628" xml:space="preserve" y="1531.0483" clip-path="url(#clipPath2)" stroke="none">   1</text>
+      <path fill="none" d="M1738.1598 1570.0381 L1262.2053 1321.3489" clip-path="url(#clipPath2)"/>
+      <path d="M1744.3639 1573.2798 L1735.8442 1574.4696 L1731.9556 1566.7965 L1740.4752 1565.6066 Z" clip-path="url(#clipPath2)" stroke="none"/>
+      <text x="1708.8561" xml:space="preserve" y="1563.7485" clip-path="url(#clipPath2)" stroke="none">   *</text>
+      <path fill="none" d="M1786.1218 1603.2798 L1819.5452 1641.6975" clip-path="url(#clipPath2)"/>
+      <path fill="white" d="M1829.3906 1653.0142 L1823.4154 1637.0049 L1814.3622 1644.8812 Z" clip-path="url(#clipPath2)" stroke="none"/>
+      <path fill="none" d="M1829.3906 1653.0142 L1823.4154 1637.0049 L1814.3622 1644.8812 Z" clip-path="url(#clipPath2)"/>
+      <path fill="none" d="M1788.437 1693.0956 L1796.8907 1692.5272" clip-path="url(#clipPath2)"/>
+      <path fill="white" d="M1811.8569 1691.5211 L1795.4905 1686.6078 L1796.2954 1698.5808 Z" clip-path="url(#clipPath2)" stroke="none"/>
+      <path fill="none" d="M1811.8569 1691.5211 L1795.4905 1686.6078 L1796.2954 1698.5808 Z" clip-path="url(#clipPath2)"/>
+    </g>
+    <g fill="rgb(245,245,245)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-17,15)" stroke="rgb(245,245,245)">
+      <rect x="1409.8735" y="1044.1516" clip-path="url(#clipPath2)" width="154.3965" rx="4" ry="4" height="122.1973" stroke="none"/>
+      <rect x="1409.8735" y="1044.1516" clip-path="url(#clipPath2)" fill="rgb(235,235,235)" width="154.3965" height="21.666" stroke="none"/>
+    </g>
+    <g font-size="15px" stroke-linecap="butt" transform="matrix(1,0,0,1,-17,15)" text-rendering="geometricPrecision" font-family="sans-serif" shape-rendering="geometricPrecision" stroke-miterlimit="1.45">
+      <text x="1450.4805" xml:space="preserve" y="1060.6536" clip-path="url(#clipPath2)" stroke="none">exampleparties</text>
+      <rect x="1409.8735" y="1044.1516" clip-path="url(#clipPath2)" fill="none" width="154.3965" stroke-dasharray="6,2" rx="4" ry="4" height="122.1973"/>
+    </g>
+    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-17,15)" stroke="rgb(255,204,0)">
+      <rect x="1424.8735" width="124.3965" height="70.5312" y="1080.8176" clip-path="url(#clipPath2)" stroke="none"/>
+    </g>
+    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-17,15)" stroke-linecap="butt">
+      <text x="1438.9927" xml:space="preserve" y="1099.4192" clip-path="url(#clipPath2)" stroke="none">Concrete agent, </text>
+      <text x="1447.9546" xml:space="preserve" y="1113.552" clip-path="url(#clipPath2)" stroke="none">eg niceParty, </text>
+      <text x="1455.2349" xml:space="preserve" y="1127.6848" clip-path="url(#clipPath2)" stroke="none">nastyParty,</text>
+      <text x="1431.8735" xml:space="preserve" y="1141.8176" clip-path="url(#clipPath2)" stroke="none">Boulware, Bayesian</text>
+      <rect fill="none" x="1424.8735" width="124.3965" height="70.5312" y="1080.8176" clip-path="url(#clipPath2)"/>
+      <path fill="none" stroke-dasharray="6,2" d="M1484.5331 1044.1659 L1481.5381 972.1007" clip-path="url(#clipPath2)"/>
+      <path stroke-dasharray="6,2" d="M1481.3719 968.1042 L1475.8755 980.343 L1481.3719 968.1042 L1487.8651 979.8447 Z" clip-path="url(#clipPath2)" stroke="none"/>
+      <path fill="none" stroke-miterlimit="10" d="M1481.3719 968.1042 L1475.8755 980.343 L1481.3719 968.1042 L1487.8651 979.8447 Z" clip-path="url(#clipPath2)" stroke-linecap="square"/>
+    </g>
+    <g fill="rgb(245,245,245)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-17,15)" stroke="rgb(245,245,245)">
+      <rect x="739.5845" y="0" clip-path="url(#clipPath2)" width="495.8594" rx="4" ry="4" height="370.666" stroke="none"/>
+      <rect x="739.5845" y="0" clip-path="url(#clipPath2)" fill="rgb(235,235,235)" width="495.8594" height="21.666" stroke="none"/>
+    </g>
+    <g font-size="15px" stroke-linecap="butt" transform="matrix(1,0,0,1,-17,15)" text-rendering="geometricPrecision" font-family="sans-serif" shape-rendering="geometricPrecision" stroke-miterlimit="1.45">
+      <text x="1172.5942" xml:space="preserve" y="16.502" clip-path="url(#clipPath2)" stroke="none">protocol</text>
+      <rect x="739.5845" y="0" clip-path="url(#clipPath2)" fill="none" width="495.8594" stroke-dasharray="6,2" rx="4" ry="4" height="370.666"/>
+    </g>
+    <g fill="white" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-17,15)" stroke="white">
       <rect x="986.8608" width="86.4219" height="30" y="36.666" clip-path="url(#clipPath2)" stroke="none"/>
     </g>
-    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-124,15)" stroke-linecap="butt">
+    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-17,15)" stroke-linecap="butt">
       <text x="993.8608" xml:space="preserve" y="56.2012" clip-path="url(#clipPath2)" stroke="none">SessionState</text>
       <rect fill="none" x="986.8608" width="86.4219" height="30" y="36.666" clip-path="url(#clipPath2)"/>
     </g>
-    <g fill="white" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="white">
+    <g fill="white" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-17,15)" stroke="white">
       <rect x="934.9165" width="104.3105" height="42.2656" y="253.5332" clip-path="url(#clipPath2)" stroke="none"/>
     </g>
-    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-124,15)" stroke-linecap="butt">
+    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-17,15)" stroke-linecap="butt">
       <text x="941.9165" xml:space="preserve" y="272.1348" clip-path="url(#clipPath2)" stroke="none">SessionSettings</text>
       <text x="949.9614" xml:space="preserve" y="286.2676" clip-path="url(#clipPath2)" stroke="none">getProtocol()</text>
       <rect fill="none" x="934.9165" width="104.3105" height="42.2656" y="253.5332" clip-path="url(#clipPath2)"/>
     </g>
-    <g fill="white" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="white">
+    <g fill="white" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-17,15)" stroke="white">
       <rect x="1001.3569" width="105.4297" height="30" y="164.666" clip-path="url(#clipPath2)" stroke="none"/>
     </g>
-    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-124,15)" stroke-linecap="butt">
+    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-17,15)" stroke-linecap="butt">
       <text x="1008.3569" xml:space="preserve" y="184.2012" clip-path="url(#clipPath2)" stroke="none">SessionProtocol</text>
       <rect fill="none" x="1001.3569" width="105.4297" height="30" y="164.666" clip-path="url(#clipPath2)"/>
     </g>
-    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="rgb(255,204,0)">
+    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-17,15)" stroke="rgb(255,204,0)">
       <rect x="892.4028" width="91.3379" height="30" y="325.666" clip-path="url(#clipPath2)" stroke="none"/>
     </g>
-    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-124,15)" stroke-linecap="butt">
+    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-17,15)" stroke-linecap="butt">
       <text x="899.4028" xml:space="preserve" y="345.2012" clip-path="url(#clipPath2)" stroke="none">SAOPSettings</text>
       <rect fill="none" x="892.4028" width="91.3379" height="30" y="325.666" clip-path="url(#clipPath2)"/>
     </g>
-    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="rgb(255,204,0)">
+    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-17,15)" stroke="rgb(255,204,0)">
       <rect x="1031.3472" width="73.4492" height="30" y="90.666" clip-path="url(#clipPath2)" stroke="none"/>
     </g>
-    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-124,15)" stroke-linecap="butt">
+    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-17,15)" stroke-linecap="butt">
       <text x="1038.3472" xml:space="preserve" y="110.2012" clip-path="url(#clipPath2)" stroke="none">SAOPState</text>
       <rect fill="none" x="1031.3472" width="73.4492" height="30" y="90.666" clip-path="url(#clipPath2)"/>
     </g>
-    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="rgb(255,204,0)">
+    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-17,15)" stroke="rgb(255,204,0)">
       <rect x="959.7231" width="44.6973" height="30" y="110.666" clip-path="url(#clipPath2)" stroke="none"/>
     </g>
-    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-124,15)" stroke-linecap="butt">
+    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-17,15)" stroke-linecap="butt">
       <text x="966.7231" xml:space="preserve" y="130.2012" clip-path="url(#clipPath2)" stroke="none">SAOP</text>
       <rect fill="none" x="959.7231" width="44.6973" height="30" y="110.666" clip-path="url(#clipPath2)"/>
     </g>
-    <g fill="white" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="white">
+    <g fill="white" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-17,15)" stroke="white">
       <rect x="754.5845" width="132.9746" height="30" y="252.666" clip-path="url(#clipPath2)" stroke="none"/>
     </g>
-    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-124,15)" stroke-linecap="butt">
+    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-17,15)" stroke-linecap="butt">
       <text x="761.5845" xml:space="preserve" y="272.2012" clip-path="url(#clipPath2)" stroke="none">TournamentProtocol</text>
       <rect fill="none" x="754.5845" width="132.9746" height="30" y="252.666" clip-path="url(#clipPath2)"/>
     </g>
-    <g fill="white" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="white">
+    <g fill="white" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-17,15)" stroke="white">
       <rect x="850.0884" width="113.9668" height="30" y="56.666" clip-path="url(#clipPath2)" stroke="none"/>
     </g>
-    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-124,15)" stroke-linecap="butt">
+    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-17,15)" stroke-linecap="butt">
       <text x="857.0884" xml:space="preserve" y="76.2012" clip-path="url(#clipPath2)" stroke="none">TournamentState</text>
       <rect fill="none" x="850.0884" width="113.9668" height="30" y="56.666" clip-path="url(#clipPath2)"/>
     </g>
-    <g fill="white" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="white">
+    <g fill="white" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-17,15)" stroke="white">
       <rect x="1006.144" width="131.8555" height="30" y="314.666" clip-path="url(#clipPath2)" stroke="none"/>
     </g>
-    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-124,15)" stroke-linecap="butt">
+    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-17,15)" stroke-linecap="butt">
       <text x="1013.144" xml:space="preserve" y="334.2012" clip-path="url(#clipPath2)" stroke="none">TournamentSettings</text>
       <rect fill="none" x="1006.144" width="131.8555" height="30" y="314.666" clip-path="url(#clipPath2)"/>
     </g>
-    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="rgb(255,204,0)">
+    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-17,15)" stroke="rgb(255,204,0)">
       <rect x="1067.6997" width="152.7441" height="30" y="218.666" clip-path="url(#clipPath2)" stroke="none"/>
     </g>
-    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-124,15)" stroke-linecap="butt">
+    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-17,15)" stroke-linecap="butt">
       <text x="1074.6997" xml:space="preserve" y="238.2012" clip-path="url(#clipPath2)" stroke="none">AllPermutationsSettings</text>
       <rect fill="none" x="1067.6997" width="152.7441" height="30" y="218.666" clip-path="url(#clipPath2)"/>
     </g>
-    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="rgb(255,204,0)">
+    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-17,15)" stroke="rgb(255,204,0)">
       <rect x="759.644" width="134.8555" height="30" y="113.666" clip-path="url(#clipPath2)" stroke="none"/>
     </g>
-    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-124,15)" stroke-linecap="butt">
+    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-17,15)" stroke-linecap="butt">
       <text x="766.644" xml:space="preserve" y="133.2012" clip-path="url(#clipPath2)" stroke="none">AllPermutationsState</text>
       <rect fill="none" x="759.644" width="134.8555" height="30" y="113.666" clip-path="url(#clipPath2)"/>
     </g>
-    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="rgb(255,204,0)">
+    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-17,15)" stroke="rgb(255,204,0)">
       <rect x="825.1401" width="153.8633" height="30" y="177.666" clip-path="url(#clipPath2)" stroke="none"/>
     </g>
-    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-124,15)" stroke-linecap="butt">
+    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-17,15)" stroke-linecap="butt">
       <text x="832.1401" xml:space="preserve" y="197.2012" clip-path="url(#clipPath2)" stroke="none">AllPermutationsProtocol</text>
       <rect fill="none" x="825.1401" width="153.8633" height="30" y="177.666" clip-path="url(#clipPath2)"/>
-    </g>
-    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="rgb(255,204,0)">
-      <rect x="1165.7148" width="48.5703" height="30" y="158.666" clip-path="url(#clipPath2)" stroke="none"/>
-    </g>
-    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke-linecap="butt">
-      <rect fill="none" x="1165.7148" width="48.5703" height="30" y="158.666" clip-path="url(#clipPath2)"/>
-      <text x="1172.7148" xml:space="preserve" y="178.2012" clip-path="url(#clipPath2)" font-family="sans-serif" stroke="none">AMOP</text>
-    </g>
-    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="rgb(255,204,0)">
-      <rect x="1178.686" width="53.5156" height="30" y="98.666" clip-path="url(#clipPath2)" stroke="none"/>
-    </g>
-    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke-linecap="butt">
-      <rect fill="none" x="1178.686" width="53.5156" height="30" y="98.666" clip-path="url(#clipPath2)"/>
-      <text x="1185.686" xml:space="preserve" y="118.2012" clip-path="url(#clipPath2)" font-family="sans-serif" stroke="none">SHAOP</text>
-    </g>
-    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="rgb(255,204,0)">
-      <rect x="1115.6353" width="56.873" height="30" y="63.666" clip-path="url(#clipPath2)" stroke="none"/>
-    </g>
-    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke-linecap="butt">
-      <rect fill="none" x="1115.6353" width="56.873" height="30" y="63.666" clip-path="url(#clipPath2)"/>
-      <text x="1122.6353" xml:space="preserve" y="83.2012" clip-path="url(#clipPath2)" font-family="sans-serif" stroke="none">MOPAC</text>
-    </g>
-    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="rgb(255,204,0)">
-      <rect x="749.3404" width="103.5137" height="30" y="325.666" clip-path="url(#clipPath2)" stroke="none"/>
-    </g>
-    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke-linecap="butt">
-      <rect fill="none" x="749.3404" width="103.5137" height="30" y="325.666" clip-path="url(#clipPath2)"/>
-      <text x="756.3404" xml:space="preserve" y="345.2012" clip-path="url(#clipPath2)" font-family="sans-serif" stroke="none">MOPACSettings</text>
-      <path fill="none" d="M602.8268 594.3963 L967.1334 295.8168" clip-path="url(#clipPath2)"/>
-      <path d="M597.4128 598.8335 L599.6573 590.5292 L608.2408 589.959 L605.9963 598.2634 Z" clip-path="url(#clipPath2)" stroke="none"/>
-      <text x="605.0865" xml:space="preserve" y="589.3022" clip-path="url(#clipPath2)" font-family="sans-serif" stroke="none">   1</text>
+      <path fill="none" d="M602.536 594.3585 L961.6526 295.7988" clip-path="url(#clipPath2)"/>
+      <path d="M597.1533 598.8336 L599.3395 590.5137 L607.9187 589.8834 L605.7325 598.2033 Z" clip-path="url(#clipPath2)" stroke="none"/>
+      <text x="604.5836" xml:space="preserve" y="589.3022" clip-path="url(#clipPath2)" stroke="none">   1</text>
       <path fill="none" stroke-dasharray="6,2" d="M1001.976 253.5332 L1040.6111 198.752" clip-path="url(#clipPath2)"/>
       <path stroke-dasharray="6,2" d="M1042.9165 195.4832 L1031.097 201.8316 L1042.9165 195.4832 L1040.9036 208.7478 Z" clip-path="url(#clipPath2)" stroke="none"/>
       <path fill="none" stroke-miterlimit="10" d="M1042.9165 195.4832 L1031.097 201.8316 L1042.9165 195.4832 L1040.9036 208.7478 Z" clip-path="url(#clipPath2)" stroke-linecap="square"/>
-      <path fill="none" d="M939.6277 362.596 L923.4553 475.1665" clip-path="url(#clipPath2)"/>
-      <path d="M940.6232 355.6672 L944.5769 363.3071 L938.6323 369.5249 L934.6786 361.885 Z" clip-path="url(#clipPath2)" stroke="none"/>
       <path fill="none" d="M949.2081 325.666 L962.4407 307.8425" clip-path="url(#clipPath2)"/>
       <path fill="white" d="M971.3823 295.7988 L957.0272 305.0688 L966.6621 312.222 Z" clip-path="url(#clipPath2)" stroke="none"/>
       <path fill="none" d="M971.3823 295.7988 L957.0272 305.0688 L966.6621 312.222 Z" clip-path="url(#clipPath2)"/>
+      <path fill="none" d="M935.6086 362.6224 L922.983 475.1665" clip-path="url(#clipPath2)"/>
+      <path d="M936.389 355.666 L940.5775 363.1798 L934.8282 369.5787 L930.6398 362.0649 Z" clip-path="url(#clipPath2)" stroke="none"/>
       <path fill="none" d="M1057.5162 90.666 L1049.2598 78.9331" clip-path="url(#clipPath2)"/>
       <path fill="white" d="M1040.6273 66.666 L1044.9285 83.2039 L1054.7421 76.2979 Z" clip-path="url(#clipPath2)" stroke="none"/>
@@ -1032,123 +995,111 @@
       <path fill="white" d="M837.2718 252.666 L853.0884 246.1981 L844.9355 237.3929 Z" clip-path="url(#clipPath2)" stroke="none"/>
       <path fill="none" d="M837.2718 252.666 L853.0884 246.1981 L844.9355 237.3929 Z" clip-path="url(#clipPath2)"/>
-      <path fill="none" d="M1165.7148 174.738 L1121.772 176.6777" clip-path="url(#clipPath2)"/>
-      <path fill="white" d="M1106.7866 177.3391 L1123.0356 182.6277 L1122.5065 170.6394 Z" clip-path="url(#clipPath2)" stroke="none"/>
-      <path fill="none" d="M1106.7866 177.3391 L1123.0356 182.6277 L1122.5065 170.6394 Z" clip-path="url(#clipPath2)"/>
-      <path fill="none" d="M1178.686 125.3327 L1102.2244 158.6709" clip-path="url(#clipPath2)"/>
-      <path fill="white" d="M1088.4745 164.666 L1105.5391 163.7712 L1100.7429 152.7713 Z" clip-path="url(#clipPath2)" stroke="none"/>
-      <path fill="none" d="M1088.4745 164.666 L1105.5391 163.7712 L1100.7429 152.7713 Z" clip-path="url(#clipPath2)"/>
-      <path fill="none" d="M1130.7054 93.666 L1077.4174 153.4671" clip-path="url(#clipPath2)"/>
-      <path fill="white" d="M1067.4381 164.666 L1082.5621 156.7122 L1073.603 148.7288 Z" clip-path="url(#clipPath2)" stroke="none"/>
-      <path fill="none" d="M1067.4381 164.666 L1082.5621 156.7122 L1073.603 148.7288 Z" clip-path="url(#clipPath2)"/>
-      <path fill="none" d="M843.3642 325.666 L920.7803 298.192" clip-path="url(#clipPath2)"/>
-      <path fill="white" d="M934.9165 293.1753 L917.8312 292.872 L921.8446 304.181 Z" clip-path="url(#clipPath2)" stroke="none"/>
-      <path fill="none" d="M934.9165 293.1753 L917.8312 292.872 L921.8446 304.181 Z" clip-path="url(#clipPath2)"/>
-    </g>
-    <g fill="rgb(245,245,245)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="rgb(245,245,245)">
+    </g>
+    <g fill="rgb(245,245,245)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-17,15)" stroke="rgb(245,245,245)">
       <rect x="1416.2983" y="172" clip-path="url(#clipPath2)" width="392.9199" rx="4" ry="4" height="328.666" stroke="none"/>
       <rect x="1416.2983" y="172" clip-path="url(#clipPath2)" fill="rgb(235,235,235)" width="392.9199" height="21.666" stroke="none"/>
     </g>
-    <g font-size="15px" stroke-linecap="butt" transform="matrix(1,0,0,1,-124,15)" text-rendering="geometricPrecision" font-family="sans-serif" shape-rendering="geometricPrecision" stroke-miterlimit="1.45">
+    <g font-size="15px" stroke-linecap="butt" transform="matrix(1,0,0,1,-17,15)" text-rendering="geometricPrecision" font-family="sans-serif" shape-rendering="geometricPrecision" stroke-miterlimit="1.45">
       <text x="1731.3613" xml:space="preserve" y="188.502" clip-path="url(#clipPath2)" stroke="none">references</text>
       <rect x="1416.2983" y="172" clip-path="url(#clipPath2)" fill="none" width="392.9199" stroke-dasharray="6,2" rx="4" ry="4" height="328.666"/>
     </g>
-    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="rgb(255,204,0)">
+    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-17,15)" stroke="rgb(255,204,0)">
       <rect x="1524.2651" width="61.6133" height="30" y="262.666" clip-path="url(#clipPath2)" stroke="none"/>
     </g>
-    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-124,15)" stroke-linecap="butt">
+    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-17,15)" stroke-linecap="butt">
       <text x="1531.2651" xml:space="preserve" y="282.2012" clip-path="url(#clipPath2)" stroke="none">PartyRef</text>
       <rect fill="none" x="1524.2651" width="61.6133" height="30" y="262.666" clip-path="url(#clipPath2)"/>
     </g>
-    <g fill="white" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="white">
+    <g fill="white" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-17,15)" stroke="white">
       <rect x="1547.4487" width="71.2461" height="30" y="370.666" clip-path="url(#clipPath2)" stroke="none"/>
     </g>
-    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-124,15)" stroke-linecap="butt">
+    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-17,15)" stroke-linecap="butt">
       <text x="1554.4487" xml:space="preserve" y="390.2012" clip-path="url(#clipPath2)" stroke="none">Reference</text>
       <rect fill="none" x="1547.4487" width="71.2461" height="30" y="370.666" clip-path="url(#clipPath2)"/>
     </g>
-    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="rgb(255,204,0)">
+    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-17,15)" stroke="rgb(255,204,0)">
       <rect x="1455.2544" width="69.6348" height="30" y="385.666" clip-path="url(#clipPath2)" stroke="none"/>
     </g>
-    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-124,15)" stroke-linecap="butt">
+    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-17,15)" stroke-linecap="butt">
       <text x="1462.2544" xml:space="preserve" y="405.2012" clip-path="url(#clipPath2)" stroke="none">ProfileRef</text>
       <rect fill="none" x="1455.2544" width="69.6348" height="30" y="385.666" clip-path="url(#clipPath2)"/>
     </g>
-    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="rgb(255,204,0)">
+    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-17,15)" stroke="rgb(255,204,0)">
       <rect x="1538.8491" width="80.4453" height="30" y="455.666" clip-path="url(#clipPath2)" stroke="none"/>
     </g>
-    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-124,15)" stroke-linecap="butt">
+    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-17,15)" stroke-linecap="butt">
       <text x="1545.8491" xml:space="preserve" y="475.2012" clip-path="url(#clipPath2)" stroke="none">ProtocolRef</text>
       <rect fill="none" x="1538.8491" width="80.4453" height="30" y="455.666" clip-path="url(#clipPath2)"/>
     </g>
-    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="rgb(255,204,0)">
+    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-17,15)" stroke="rgb(255,204,0)">
       <rect x="1431.2983" width="105.5469" height="30" y="316.666" clip-path="url(#clipPath2)" stroke="none"/>
     </g>
-    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-124,15)" stroke-linecap="butt">
+    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-17,15)" stroke-linecap="butt">
       <text x="1438.2983" xml:space="preserve" y="336.2012" clip-path="url(#clipPath2)" stroke="none">PartyWithProfile</text>
       <rect fill="none" x="1431.2983" width="105.5469" height="30" y="316.666" clip-path="url(#clipPath2)"/>
     </g>
-    <g fill="white" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="white">
+    <g fill="white" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-17,15)" stroke="white">
       <rect x="1683.9839" width="80.1758" height="30" y="370.666" clip-path="url(#clipPath2)" stroke="none"/>
     </g>
-    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-124,15)" stroke-linecap="butt">
+    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-17,15)" stroke-linecap="butt">
       <text x="1690.9839" xml:space="preserve" y="390.2012" clip-path="url(#clipPath2)" stroke="none">Connection</text>
       <rect fill="none" x="1683.9839" width="80.1758" height="30" y="370.666" clip-path="url(#clipPath2)"/>
     </g>
-    <g fill="white" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="white">
+    <g fill="white" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-17,15)" stroke="white">
       <rect x="1642.9604" width="86.2227" height="30" y="437.666" clip-path="url(#clipPath2)" stroke="none"/>
     </g>
-    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-124,15)" stroke-linecap="butt">
+    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-17,15)" stroke-linecap="butt">
       <text x="1649.9604" xml:space="preserve" y="457.2012" clip-path="url(#clipPath2)" stroke="none">Connectable</text>
       <rect fill="none" x="1642.9604" width="86.2227" height="30" y="437.666" clip-path="url(#clipPath2)"/>
     </g>
-    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="rgb(255,204,0)">
+    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-17,15)" stroke="rgb(255,204,0)">
       <rect x="1576.8608" width="122.4219" height="30" y="208.666" clip-path="url(#clipPath2)" stroke="none"/>
     </g>
-    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-124,15)" stroke-linecap="butt">
+    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-17,15)" stroke-linecap="butt">
       <text x="1583.8608" xml:space="preserve" y="228.2012" clip-path="url(#clipPath2)" stroke="none">ConnectionFactory</text>
       <rect fill="none" x="1576.8608" width="122.4219" height="30" y="208.666" clip-path="url(#clipPath2)"/>
     </g>
-    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="rgb(255,204,0)">
+    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-17,15)" stroke="rgb(255,204,0)">
       <rect x="1671.9253" width="122.293" height="30" y="262.666" clip-path="url(#clipPath2)" stroke="none"/>
     </g>
-    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-124,15)" stroke-linecap="butt">
+    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-17,15)" stroke-linecap="butt">
       <text x="1678.9253" xml:space="preserve" y="282.2012" clip-path="url(#clipPath2)" stroke="none">DefaultConnection</text>
       <rect fill="none" x="1671.9253" width="122.293" height="30" y="262.666" clip-path="url(#clipPath2)"/>
     </g>
-    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="rgb(255,204,0)">
+    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-17,15)" stroke="rgb(255,204,0)">
       <rect x="1611.1763" width="77.791" height="30" y="316.666" clip-path="url(#clipPath2)" stroke="none"/>
     </g>
-    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-124,15)" stroke-linecap="butt">
+    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-17,15)" stroke-linecap="butt">
       <text x="1618.1763" xml:space="preserve" y="338.1348" clip-path="url(#clipPath2)" stroke="none">DomainRef</text>
       <rect fill="none" x="1611.1763" width="77.791" height="30" y="316.666" clip-path="url(#clipPath2)"/>
-      <path fill="none" d="M1227.4084 241.7495 L1524.2651 274.2892" clip-path="url(#clipPath2)"/>
-      <path d="M1220.4501 240.9868 L1227.9532 236.7793 L1234.3667 242.5123 L1226.8636 246.7198 Z" clip-path="url(#clipPath2)" stroke="none"/>
+      <path fill="none" d="M1227.4041 242.5872 L1524.2651 274.368" clip-path="url(#clipPath2)"/>
+      <path d="M1220.4438 241.8421 L1227.9363 237.6156 L1234.3643 243.3324 L1226.8718 247.5588 Z" clip-path="url(#clipPath2)" stroke="none"/>
       <path fill="none" d="M1558.9607 292.666 L1575.4185 356.1461" clip-path="url(#clipPath2)"/>
       <path fill="white" d="M1579.1829 370.666 L1580.9755 353.6723 L1569.3595 356.6838 Z" clip-path="url(#clipPath2)" stroke="none"/>
       <path fill="none" d="M1579.1829 370.666 L1580.9755 353.6723 L1569.3595 356.6838 Z" clip-path="url(#clipPath2)"/>
-      <path fill="none" d="M1190.1161 251.7621 L1459.8555 385.666" clip-path="url(#clipPath2)"/>
-      <path d="M1183.8462 248.6495 L1192.3394 247.2835 L1196.3861 254.8746 L1187.8929 256.2406 Z" clip-path="url(#clipPath2)" stroke="none"/>
-      <path fill="none" d="M1066.1866 850.8745 L1475.9489 415.666" clip-path="url(#clipPath2)"/>
-      <path d="M1061.3882 855.9709 L1062.5463 847.447 L1070.9851 845.7779 L1069.827 854.3019 Z" clip-path="url(#clipPath2)" stroke="none"/>
+      <path fill="none" d="M1181.4537 251.7088 L1458.9939 385.666" clip-path="url(#clipPath2)"/>
+      <path d="M1175.1497 248.666 L1183.6272 247.2058 L1187.7578 254.7515 L1179.2804 256.2117 Z" clip-path="url(#clipPath2)" stroke="none"/>
+      <path fill="none" d="M1328.016 686.8245 L1481.577 415.666" clip-path="url(#clipPath2)"/>
+      <path d="M1324.5665 692.9155 L1323.6653 684.3605 L1331.4655 680.7334 L1332.3668 689.2883 Z" clip-path="url(#clipPath2)" stroke="none"/>
       <path fill="none" d="M1524.8892 395.0503 L1532.6401 393.8001" clip-path="url(#clipPath2)"/>
       <path fill="white" d="M1547.4487 391.4117 L1530.6975 388.0359 L1532.6083 399.8828 Z" clip-path="url(#clipPath2)" stroke="none"/>
       <path fill="none" d="M1547.4487 391.4117 L1530.6975 388.0359 L1532.6083 399.8828 Z" clip-path="url(#clipPath2)"/>
-      <path fill="none" d="M1438.6908 702.7178 L1569.9974 485.666" clip-path="url(#clipPath2)"/>
-      <path d="M1435.0675 708.7072 L1434.4127 700.1298 L1442.3141 696.7285 L1442.9689 705.3059 Z" clip-path="url(#clipPath2)" stroke="none"/>
-      <text x="1434.9901" xml:space="preserve" y="699.1759" clip-path="url(#clipPath2)" stroke="none">   *</text>
-      <path fill="none" d="M1072.7854 851.7612 L1559.1442 485.666" clip-path="url(#clipPath2)"/>
-      <path d="M1067.1927 855.9709 L1069.7784 847.7664 L1078.3782 847.5515 L1075.7924 855.756 Z" clip-path="url(#clipPath2)" stroke="none"/>
+      <path fill="none" d="M1603.8705 718.1174 L1580.5751 485.666" clip-path="url(#clipPath2)"/>
+      <path d="M1604.5685 725.0825 L1598.8954 718.616 L1603.1725 711.1523 L1608.8456 717.6188 Z" clip-path="url(#clipPath2)" stroke="none"/>
+      <text x="1594.5719" xml:space="preserve" y="715.5513" clip-path="url(#clipPath2)" stroke="none">   *</text>
+      <path fill="none" d="M1337.8975 688.2268 L1562.4437 485.666" clip-path="url(#clipPath2)"/>
+      <path d="M1332.6998 692.9155 L1334.5483 684.5142 L1343.0951 683.538 L1341.2466 691.9394 Z" clip-path="url(#clipPath2)" stroke="none"/>
       <path fill="none" d="M1579.7777 455.666 L1581.6608 415.6494" clip-path="url(#clipPath2)"/>
       <path fill="white" d="M1582.3658 400.666 L1575.6204 416.3663 L1587.6072 416.9304 Z" clip-path="url(#clipPath2)" stroke="none"/>
       <path fill="none" d="M1582.3658 400.666 L1575.6204 416.3663 L1587.6072 416.9304 Z" clip-path="url(#clipPath2)"/>
-      <path fill="none" d="M1046.2069 280.8481 L1431.2983 325.5412" clip-path="url(#clipPath2)"/>
-      <path d="M1039.2535 280.0411 L1046.7833 275.8814 L1053.1602 281.6551 L1045.6305 285.8147 Z" clip-path="url(#clipPath2)" stroke="none"/>
+      <path fill="none" d="M1046.1815 281.4452 L1431.2983 325.6135" clip-path="url(#clipPath2)"/>
+      <path d="M1039.2271 280.6476 L1046.7511 276.4778 L1053.1359 282.2428 L1045.6118 286.4126 Z" clip-path="url(#clipPath2)" stroke="none"/>
       <path fill="none" d="M1509.3656 312.4284 L1535.3496 292.666" clip-path="url(#clipPath2)"/>
       <path d="M1503.7939 316.666 L1506.3387 308.4487 L1514.9373 308.1909 L1512.3925 316.4082 Z" clip-path="url(#clipPath2)" stroke="none"/>
       <path fill="none" d="M1485.9825 353.6397 L1488.7675 385.666" clip-path="url(#clipPath2)"/>
       <path d="M1485.3761 346.666 L1490.9637 353.2065 L1486.589 360.6134 L1481.0013 354.0729 Z" clip-path="url(#clipPath2)" stroke="none"/>
-      <path fill="none" d="M1466.8688 776.4415 L1667.5071 480.0871" clip-path="url(#clipPath2)"/>
-      <path fill="white" d="M1675.9165 467.6661 L1661.978 477.5514 L1671.9149 484.2789 Z" clip-path="url(#clipPath2)" stroke="none"/>
-      <path fill="none" d="M1675.9165 467.6661 L1661.978 477.5514 L1671.9149 484.2789 Z" clip-path="url(#clipPath2)"/>
+      <path fill="none" d="M1628.9899 792.8169 L1681.072 482.4592" clip-path="url(#clipPath2)"/>
+      <path fill="white" d="M1683.5546 467.666 L1674.9893 482.4524 L1686.8237 484.4384 Z" clip-path="url(#clipPath2)" stroke="none"/>
+      <path fill="none" d="M1683.5546 467.666 L1674.9893 482.4524 L1686.8237 484.4384 Z" clip-path="url(#clipPath2)"/>
       <path fill="none" d="M1731.8218 292.666 L1726.5675 355.7178" clip-path="url(#clipPath2)"/>
       <path fill="white" d="M1725.3218 370.666 L1732.6299 355.2196 L1720.6713 354.223 Z" clip-path="url(#clipPath2)" stroke="none"/>
@@ -1158,134 +1109,4 @@
       <path fill="none" d="M1601.6829 370.666 L1617.9055 365.2972 L1610.3752 355.954 Z" clip-path="url(#clipPath2)"/>
     </g>
-    <g fill="rgb(245,245,245)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="rgb(245,245,245)">
-      <rect x="1641.0996" y="521.7794" clip-path="url(#clipPath2)" width="238.343" rx="4" ry="4" height="207.7158" stroke="none"/>
-      <rect x="1641.0996" y="521.7794" clip-path="url(#clipPath2)" fill="rgb(235,235,235)" width="238.343" height="21.666" stroke="none"/>
-    </g>
-    <g font-size="15px" stroke-linecap="butt" transform="matrix(1,0,0,1,-124,15)" text-rendering="geometricPrecision" font-family="sans-serif" shape-rendering="geometricPrecision" stroke-miterlimit="1.45">
-      <text x="1762.196" xml:space="preserve" y="538.2813" clip-path="url(#clipPath2)" stroke="none">opponentmodel</text>
-      <rect x="1641.0996" y="521.7794" clip-path="url(#clipPath2)" fill="none" width="238.343" stroke-dasharray="6,2" rx="4" ry="4" height="207.7158"/>
-    </g>
-    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="rgb(255,204,0)">
-      <rect x="1656.0996" width="107.2812" height="30" y="558.4454" clip-path="url(#clipPath2)" stroke="none"/>
-    </g>
-    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke-linecap="butt">
-      <rect fill="none" x="1656.0996" width="107.2812" height="30" y="558.4454" clip-path="url(#clipPath2)"/>
-      <text x="1663.0996" xml:space="preserve" y="577.9805" clip-path="url(#clipPath2)" font-family="sans-serif" stroke="none">OpponentModel</text>
-    </g>
-    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="rgb(255,204,0)">
-      <rect x="1697.5833" width="166.8594" height="30" y="684.4952" clip-path="url(#clipPath2)" stroke="none"/>
-    </g>
-    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke-linecap="butt">
-      <rect fill="none" x="1697.5833" width="166.8594" height="30" y="684.4952" clip-path="url(#clipPath2)"/>
-      <text x="1704.5833" xml:space="preserve" y="704.0303" clip-path="url(#clipPath2)" font-family="sans-serif" stroke="none">FrequencyOpponentModel</text>
-      <path fill="none" d="M1699.1505 588.4454 L998.5512 1580.8268" clip-path="url(#clipPath2)"/>
-      <path fill="white" d="M989.9002 1593.0808 L1004.0295 1583.4703 L994.2264 1576.5494 Z" clip-path="url(#clipPath2)" stroke="none"/>
-      <path fill="none" d="M989.9002 1593.0808 L1004.0295 1583.4703 L994.2264 1576.5494 Z" clip-path="url(#clipPath2)"/>
-      <path fill="none" d="M1772.5315 684.4952 L1725.6047 601.5026" clip-path="url(#clipPath2)"/>
-      <path fill="white" d="M1718.2217 588.4454 L1720.874 605.3264 L1731.3198 599.4199 Z" clip-path="url(#clipPath2)" stroke="none"/>
-      <path fill="none" d="M1718.2217 588.4454 L1720.874 605.3264 L1731.3198 599.4199 Z" clip-path="url(#clipPath2)"/>
-    </g>
-    <g fill="rgb(245,245,245)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="rgb(245,245,245)">
-      <rect x="1991.3868" y="759.2887" clip-path="url(#clipPath2)" width="365.5882" rx="4" ry="4" height="411.7296" stroke="none"/>
-      <rect x="1991.3868" y="759.2887" clip-path="url(#clipPath2)" fill="rgb(235,235,235)" width="365.5882" height="21.666" stroke="none"/>
-    </g>
-    <g font-size="15px" stroke-linecap="butt" transform="matrix(1,0,0,1,-124,15)" text-rendering="geometricPrecision" font-family="sans-serif" shape-rendering="geometricPrecision" stroke-miterlimit="1.45">
-      <text x="2328.0366" xml:space="preserve" y="775.7906" clip-path="url(#clipPath2)" stroke="none">boa</text>
-      <rect x="1991.3868" y="759.2887" clip-path="url(#clipPath2)" fill="none" width="365.5882" stroke-dasharray="6,2" rx="4" ry="4" height="411.7296"/>
-    </g>
-    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="rgb(255,204,0)">
-      <rect x="2101.1132" width="63.8281" height="30" y="795.9547" clip-path="url(#clipPath2)" stroke="none"/>
-    </g>
-    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke-linecap="butt">
-      <rect fill="none" x="2101.1132" width="63.8281" height="30" y="795.9547" clip-path="url(#clipPath2)"/>
-      <text x="2108.1133" xml:space="preserve" y="815.4899" clip-path="url(#clipPath2)" font-family="sans-serif" stroke="none">BoaParty</text>
-    </g>
-    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="rgb(255,204,0)">
-      <rect x="2048.4335" width="127.6191" height="30" y="1016.6557" clip-path="url(#clipPath2)" stroke="none"/>
-    </g>
-    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke-linecap="butt">
-      <rect fill="none" x="2048.4335" width="127.6191" height="30" y="1016.6557" clip-path="url(#clipPath2)"/>
-      <text x="2055.4336" xml:space="preserve" y="1036.1909" clip-path="url(#clipPath2)" font-family="sans-serif" stroke="none">AcceptanceStrategy</text>
-    </g>
-    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="rgb(255,204,0)">
-      <rect x="2045.976" width="127.6191" height="42.2656" y="1113.7526" clip-path="url(#clipPath2)" stroke="none"/>
-    </g>
-    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke-linecap="butt">
-      <rect fill="none" x="2045.976" width="127.6191" height="42.2656" y="1113.7526" clip-path="url(#clipPath2)"/>
-      <text x="2063.5464" xml:space="preserve" y="1132.3542" clip-path="url(#clipPath2)" font-family="sans-serif" stroke="none">TimeDependent</text>
-      <text x="2052.9761" xml:space="preserve" y="1146.4871" clip-path="url(#clipPath2)" font-family="sans-serif" stroke="none">AcceptanceStrategy</text>
-    </g>
-    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="rgb(255,204,0)">
-      <rect x="2006.3868" width="63.6523" height="30" y="941.9966" clip-path="url(#clipPath2)" stroke="none"/>
-    </g>
-    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke-linecap="butt">
-      <rect fill="none" x="2006.3868" width="63.6523" height="30" y="941.9966" clip-path="url(#clipPath2)"/>
-      <text x="2013.3868" xml:space="preserve" y="961.5317" clip-path="url(#clipPath2)" font-family="sans-serif" stroke="none">BoaState</text>
-    </g>
-    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="rgb(255,204,0)">
-      <rect x="2236.6859" width="105.2891" height="30" y="1003.875" clip-path="url(#clipPath2)" stroke="none"/>
-    </g>
-    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke-linecap="butt">
-      <rect fill="none" x="2236.6859" width="105.2891" height="30" y="1003.875" clip-path="url(#clipPath2)"/>
-      <text x="2243.686" xml:space="preserve" y="1023.4102" clip-path="url(#clipPath2)" font-family="sans-serif" stroke="none">BiddingStrategy</text>
-    </g>
-    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="rgb(255,204,0)">
-      <rect x="2236.2815" width="105.2891" height="42.2656" y="1101.3248" clip-path="url(#clipPath2)" stroke="none"/>
-    </g>
-    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke-linecap="butt">
-      <rect fill="none" x="2236.2815" width="105.2891" height="42.2656" y="1101.3248" clip-path="url(#clipPath2)"/>
-      <text x="2244.512" xml:space="preserve" y="1119.9264" clip-path="url(#clipPath2)" font-family="sans-serif" stroke="none">TimeDe[endent</text>
-      <text x="2243.2815" xml:space="preserve" y="1134.0592" clip-path="url(#clipPath2)" font-family="sans-serif" stroke="none">BiddingStrategy</text>
-      <path fill="none" stroke-dasharray="6,2" d="M1991.4049 926.8119 L1517.0393 827.3024" clip-path="url(#clipPath2)"/>
-      <path stroke-dasharray="6,2" d="M1513.1245 826.4813 L1523.6371 834.817 L1513.1245 826.4813 L1526.1006 823.0726 Z" clip-path="url(#clipPath2)" stroke="none"/>
-      <path fill="none" stroke-miterlimit="10" d="M1513.1245 826.4813 L1523.6371 834.817 L1513.1245 826.4813 L1526.1006 823.0726 Z" clip-path="url(#clipPath2)" stroke-linecap="square"/>
-      <path fill="none" d="M2113.6558 1016.6558 L2130.9583 832.9239" clip-path="url(#clipPath2)"/>
-      <path d="M2131.6147 825.9547 L2135.9363 833.3928 L2130.3018 839.893 L2125.9802 832.455 Z" clip-path="url(#clipPath2)" stroke="none"/>
-      <path fill="none" d="M2110.2886 1113.7527 L2111.5291 1061.6515" clip-path="url(#clipPath2)"/>
-      <path fill="white" d="M2111.886 1046.6558 L2105.5068 1062.5084 L2117.5037 1062.7939 Z" clip-path="url(#clipPath2)" stroke="none"/>
-      <path fill="none" d="M2111.886 1046.6558 L2105.5068 1062.5084 L2117.5037 1062.7939 Z" clip-path="url(#clipPath2)"/>
-      <path fill="none" d="M1722.5862 588.4454 L2020.8137 936.6798" clip-path="url(#clipPath2)"/>
-      <path d="M2025.3669 941.9966 L2017.016 939.9321 L2016.2605 931.363 L2024.6115 933.4275 Z" clip-path="url(#clipPath2)" stroke="none"/>
-      <text x="2010.429" xml:space="preserve" y="932.4653" clip-path="url(#clipPath2)" font-family="sans-serif" stroke="none">*</text>
-      <path fill="none" d="M2047.9514 941.9966 L2119.4771 831.8259" clip-path="url(#clipPath2)"/>
-      <path d="M2123.2888 825.9547 L2123.6707 834.5486 L2115.6653 837.697 L2115.2834 829.1031 Z" clip-path="url(#clipPath2)" stroke="none"/>
-      <path fill="none" d="M2278.0542 1003.875 L2148.5098 831.55" clip-path="url(#clipPath2)"/>
-      <path d="M2144.3035 825.9547 L2152.5063 828.5455 L2152.7161 837.1453 L2144.5132 834.5545 Z" clip-path="url(#clipPath2)" stroke="none"/>
-      <path fill="none" d="M2289.0085 1101.3248 L2289.2134 1048.8749" clip-path="url(#clipPath2)"/>
-      <path fill="white" d="M2289.272 1033.875 L2283.2095 1049.8514 L2295.2095 1049.8983 Z" clip-path="url(#clipPath2)" stroke="none"/>
-      <path fill="none" d="M2289.272 1033.875 L2283.2095 1049.8514 L2295.2095 1049.8983 Z" clip-path="url(#clipPath2)"/>
-    </g>
-    <g fill="rgb(245,245,245)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="rgb(245,245,245)">
-      <rect x="280.6108" y="98.7879" clip-path="url(#clipPath2)" width="331.0527" rx="4" ry="4" height="186.3559" stroke="none"/>
-      <rect x="280.6108" y="98.7879" clip-path="url(#clipPath2)" fill="rgb(235,235,235)" width="331.0527" height="21.666" stroke="none"/>
-    </g>
-    <g font-size="15px" stroke-linecap="butt" transform="matrix(1,0,0,1,-124,15)" text-rendering="geometricPrecision" font-family="sans-serif" shape-rendering="geometricPrecision" stroke-miterlimit="1.45">
-      <text x="562.0342" xml:space="preserve" y="115.2898" clip-path="url(#clipPath2)" stroke="none">Voting</text>
-      <rect x="280.6108" y="98.7879" clip-path="url(#clipPath2)" fill="none" width="331.0527" stroke-dasharray="6,2" rx="4" ry="4" height="186.3559"/>
-      <rect fill="none" x="339.0115" width="105.7578" height="30" y="135.4539" clip-path="url(#clipPath2)"/>
-      <text x="346.0115" xml:space="preserve" font-size="12px" y="154.989" clip-path="url(#clipPath2)" stroke="none">VotingEvaluator</text>
-    </g>
-    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="rgb(255,204,0)">
-      <rect x="295.6108" width="120.5762" height="30" y="240.1438" clip-path="url(#clipPath2)" stroke="none"/>
-    </g>
-    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke-linecap="butt">
-      <rect fill="none" x="295.6108" width="120.5762" height="30" y="240.1438" clip-path="url(#clipPath2)"/>
-      <text x="302.6108" xml:space="preserve" y="259.6789" clip-path="url(#clipPath2)" font-family="sans-serif" stroke="none">LargestAgreement</text>
-    </g>
-    <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke="rgb(255,204,0)">
-      <rect x="446.187" width="150.4766" height="30" y="177.666" clip-path="url(#clipPath2)" stroke="none"/>
-    </g>
-    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-124,15)" stroke-linecap="butt">
-      <rect fill="none" x="446.187" width="150.4766" height="30" y="177.666" clip-path="url(#clipPath2)"/>
-      <text x="453.187" xml:space="preserve" y="197.2012" clip-path="url(#clipPath2)" font-family="sans-serif" stroke="none">LargestAgeementsLoop</text>
-      <path fill="none" d="M424.1602 165.4539 L762.4797 322.7154" clip-path="url(#clipPath2)"/>
-      <path d="M768.8275 325.666 L760.3721 327.2495 L756.132 319.7647 L764.5873 318.1813 Z" clip-path="url(#clipPath2)" stroke="none"/>
-      <path fill="none" d="M361.0558 240.1438 L381.8568 179.639" clip-path="url(#clipPath2)"/>
-      <path fill="white" d="M386.7336 165.4539 L375.8577 178.634 L387.2057 182.5354 Z" clip-path="url(#clipPath2)" stroke="none"/>
-      <path fill="none" d="M386.7336 165.4539 L375.8577 178.634 L387.2057 182.5354 Z" clip-path="url(#clipPath2)"/>
-      <path fill="none" d="M475.3953 177.666 L452.1822 170.1015" clip-path="url(#clipPath2)"/>
-      <path fill="white" d="M437.9204 165.4539 L451.274 176.116 L454.992 164.7066 Z" clip-path="url(#clipPath2)" stroke="none"/>
-      <path fill="none" d="M437.9204 165.4539 L451.274 176.116 L454.992 164.7066 Z" clip-path="url(#clipPath2)"/>
-    </g>
   </g>
 </svg>
Index: sign/dependencies.graphml
===================================================================
--- /design/dependencies.graphml	(revision 53)
+++ 	(revision )
@@ -1,503 +1,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<graphml xmlns="http://graphml.graphdrawing.org/xmlns" xmlns:java="http://www.yworks.com/xml/yfiles-common/1.0/java" xmlns:sys="http://www.yworks.com/xml/yfiles-common/markup/primitives/2.0" xmlns:x="http://www.yworks.com/xml/yfiles-common/markup/2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:y="http://www.yworks.com/xml/graphml" xmlns:yed="http://www.yworks.com/xml/yed/3" xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns http://www.yworks.com/xml/schema/graphml/1.1/ygraphml.xsd">
-  <!--Created by yEd 3.20-->
-  <key attr.name="Description" attr.type="string" for="graph" id="d0"/>
-  <key for="port" id="d1" yfiles.type="portgraphics"/>
-  <key for="port" id="d2" yfiles.type="portgeometry"/>
-  <key for="port" id="d3" yfiles.type="portuserdata"/>
-  <key attr.name="url" attr.type="string" for="node" id="d4"/>
-  <key attr.name="description" attr.type="string" for="node" id="d5"/>
-  <key for="node" id="d6" yfiles.type="nodegraphics"/>
-  <key for="graphml" id="d7" yfiles.type="resources"/>
-  <key attr.name="url" attr.type="string" for="edge" id="d8"/>
-  <key attr.name="description" attr.type="string" for="edge" id="d9"/>
-  <key for="edge" id="d10" yfiles.type="edgegraphics"/>
-  <graph edgedefault="directed" id="G">
-    <data key="d0"/>
-    <node id="n0">
-      <data key="d5"/>
-      <data key="d6">
-        <y:ShapeNode>
-          <y:Geometry height="30.0" width="60.916015625" x="138.04476996527777" y="356.0"/>
-          <y:Fill color="#FFCC00" transparent="false"/>
-          <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
-          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="50.916015625" x="5.0" xml:space="preserve" y="5.93359375">timeline<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
-          <y:Shape type="rectangle"/>
-        </y:ShapeNode>
-      </data>
-    </node>
-    <node id="n1">
-      <data key="d5"/>
-      <data key="d6">
-        <y:ShapeNode>
-          <y:Geometry height="30.0" width="74.685546875" x="228.96079799107144" y="356.0"/>
-          <y:Fill color="#FFCC00" transparent="false"/>
-          <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
-          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="64.685546875" x="5.0" xml:space="preserve" y="5.93359375">references<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
-          <y:Shape type="rectangle"/>
-        </y:ShapeNode>
-      </data>
-    </node>
-    <node id="n2">
-      <data key="d5"/>
-      <data key="d6">
-        <y:ShapeNode>
-          <y:Geometry height="30.0" width="74.263671875" x="402.65070374503966" y="356.0"/>
-          <y:Fill color="#FFCC00" transparent="false"/>
-          <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
-          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="64.263671875" x="5.0" xml:space="preserve" y="5.93359375">Issuevalue<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
-          <y:Shape type="rectangle"/>
-        </y:ShapeNode>
-      </data>
-    </node>
-    <node id="n3">
-      <data key="d5"/>
-      <data key="d6">
-        <y:ShapeNode>
-          <y:Geometry height="30.0" width="51.869140625000014" x="419.4467788938492" y="279.0"/>
-          <y:Fill color="#FFCC00" transparent="false"/>
-          <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
-          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="41.869140625" x="5.0" xml:space="preserve" y="5.93359375">profile<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
-          <y:Shape type="rectangle"/>
-        </y:ShapeNode>
-      </data>
-    </node>
-    <node id="n4">
-      <data key="d5"/>
-      <data key="d6">
-        <y:ShapeNode>
-          <y:Geometry height="30.0" width="51.634765625" x="221.81476004464287" y="279.0"/>
-          <y:Fill color="#FFCC00" transparent="false"/>
-          <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
-          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="41.634765625" x="5.0" xml:space="preserve" y="5.93359375">events<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
-          <y:Shape type="rectangle"/>
-        </y:ShapeNode>
-      </data>
-    </node>
-    <node id="n5">
-      <data key="d5"/>
-      <data key="d6">
-        <y:ShapeNode>
-          <y:Geometry height="30.0" width="25.021484375" x="20.10671812996032" y="279.0"/>
-          <y:Fill color="#FFCC00" transparent="false"/>
-          <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
-          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="15.021484375" x="5.0" xml:space="preserve" y="5.93359375">ip<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
-          <y:Shape type="rectangle"/>
-        </y:ShapeNode>
-      </data>
-    </node>
-    <node id="n6">
-      <data key="d5"/>
-      <data key="d6">
-        <y:ShapeNode>
-          <y:Geometry height="30.0" width="50.46875000000003" x="20.000148809523793" y="154.0"/>
-          <y:Fill color="#FFCC00" transparent="false"/>
-          <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
-          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="40.46875" x="5.000000000000014" xml:space="preserve" y="4.0">voting<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="-0.5" nodeRatioX="0.0" nodeRatioY="-0.5" offsetX="0.0" offsetY="4.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
-          <y:Shape type="rectangle"/>
-        </y:ShapeNode>
-      </data>
-    </node>
-    <node id="n7">
-      <data key="d5"/>
-      <data key="d6">
-        <y:ShapeNode>
-          <y:Geometry height="30.0" width="65.703125" x="543.6996279761905" y="154.0"/>
-          <y:Fill color="#FFCC00" transparent="false"/>
-          <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
-          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="55.703125" x="5.0" xml:space="preserve" y="5.93359375">bidspace<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
-          <y:Shape type="rectangle"/>
-        </y:ShapeNode>
-      </data>
-    </node>
-    <node id="n8">
-      <data key="d5"/>
-      <data key="d6">
-        <y:ShapeNode>
-          <y:Geometry height="30.0" width="43.84765625" x="164.4464099702381" y="154.0"/>
-          <y:Fill color="#FFCC00" transparent="false"/>
-          <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
-          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="33.84765625" x="5.0" xml:space="preserve" y="5.93359375">party<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
-          <y:Shape type="rectangle"/>
-        </y:ShapeNode>
-      </data>
-    </node>
-    <node id="n9">
-      <data key="d5"/>
-      <data key="d6">
-        <y:ShapeNode>
-          <y:Geometry height="30.0" width="62.6796875" x="29.56452132936508" y="61.0"/>
-          <y:Fill color="#FFCC00" transparent="false"/>
-          <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
-          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="52.6796875" x="5.0" xml:space="preserve" y="5.93359375">protocol<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
-          <y:Shape type="rectangle"/>
-        </y:ShapeNode>
-      </data>
-    </node>
-    <node id="n10">
-      <data key="d5"/>
-      <data key="d6">
-        <y:ShapeNode>
-          <y:Geometry height="30.0" width="115.888671875" x="397.8108227926587" y="154.0"/>
-          <y:Fill color="#FFCC00" transparent="false"/>
-          <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
-          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="105.888671875" x="5.0" xml:space="preserve" y="5.93359375">profileconnection<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
-          <y:Shape type="rectangle"/>
-        </y:ShapeNode>
-      </data>
-    </node>
-    <node id="n11">
-      <data key="d5"/>
-      <data key="d6">
-        <y:ShapeNode>
-          <y:Geometry height="30.0" width="99.01953125" x="122.24459945436507" y="61.0"/>
-          <y:Fill color="#FFCC00" transparent="false"/>
-          <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
-          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="89.01953125" x="5.0" xml:space="preserve" y="5.93359375">pythonadapter<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
-          <y:Shape type="rectangle"/>
-        </y:ShapeNode>
-      </data>
-    </node>
-    <node id="n12">
-      <data key="d5"/>
-      <data key="d6">
-        <y:ShapeNode>
-          <y:Geometry height="30.0" width="106.197265625" x="238.29422433035717" y="154.0"/>
-          <y:Fill color="#FFCC00" transparent="false"/>
-          <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
-          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="96.197265625" x="6.0" xml:space="preserve" y="5.93359375">opponentmodel<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.5" labelRatioY="0.0" nodeRatioX="0.5" nodeRatioY="0.0" offsetX="-4.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
-          <y:Shape type="rectangle"/>
-        </y:ShapeNode>
-      </data>
-    </node>
-    <node id="n13">
-      <data key="d5"/>
-      <data key="d6">
-        <y:ShapeNode>
-          <y:Geometry height="30.0" width="35.55078125" x="433.53611731150795" y="61.0"/>
-          <y:Fill color="#FFCC00" transparent="false"/>
-          <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
-          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="25.55078125" x="5.0" xml:space="preserve" y="5.93359375">boa<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
-          <y:Shape type="rectangle"/>
-        </y:ShapeNode>
-      </data>
-    </node>
-    <node id="n14">
-      <data key="d5"/>
-      <data key="d6">
-        <y:ShapeNode>
-          <y:Geometry height="30.0" width="91.34375" x="103.16245039682539" y="0.0"/>
-          <y:Fill color="#FFCC00" transparent="false"/>
-          <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
-          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="81.34375" x="5.0" xml:space="preserve" y="5.93359375">simplerunner<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
-          <y:Shape type="rectangle"/>
-        </y:ShapeNode>
-      </data>
-    </node>
-    <edge id="e0" source="n3" target="n1">
-      <data key="d9"/>
-      <data key="d10">
-        <y:PolyLineEdge>
-          <y:Path sx="-12.967285156250007" sy="15.0" tx="18.67138671875" ty="-15.0">
-            <y:Point x="432.4140640500992" y="324.5"/>
-            <y:Point x="284.97495814732144" y="324.5"/>
-          </y:Path>
-          <y:LineStyle color="#000000" type="line" width="1.0"/>
-          <y:Arrows source="none" target="standard"/>
-          <y:BendStyle smoothed="false"/>
-        </y:PolyLineEdge>
-      </data>
-    </edge>
-    <edge id="e1" source="n3" target="n2">
-      <data key="d9"/>
-      <data key="d10">
-        <y:PolyLineEdge>
-          <y:Path sx="12.967285156250004" sy="15.0" tx="18.56591796875" ty="-15.0"/>
-          <y:LineStyle color="#000000" type="line" width="1.0"/>
-          <y:Arrows source="none" target="standard"/>
-          <y:BendStyle smoothed="false"/>
-        </y:PolyLineEdge>
-      </data>
-    </edge>
-    <edge id="e2" source="n4" target="n2">
-      <data key="d9"/>
-      <data key="d10">
-        <y:PolyLineEdge>
-          <y:Path sx="17.211588541666664" sy="15.0" tx="-18.56591796875" ty="-15.0">
-            <y:Point x="264.84373139880955" y="340.5"/>
-            <y:Point x="421.21662171378966" y="340.5"/>
-          </y:Path>
-          <y:LineStyle color="#000000" type="line" width="1.0"/>
-          <y:Arrows source="none" target="standard"/>
-          <y:BendStyle smoothed="false"/>
-        </y:PolyLineEdge>
-      </data>
-    </edge>
-    <edge id="e3" source="n4" target="n0">
-      <data key="d9"/>
-      <data key="d10">
-        <y:PolyLineEdge>
-          <y:Path sx="-17.211588541666664" sy="15.0" tx="15.22900390625" ty="-15.0">
-            <y:Point x="230.4205543154762" y="324.5"/>
-            <y:Point x="183.73178168402777" y="324.5"/>
-          </y:Path>
-          <y:LineStyle color="#000000" type="line" width="1.0"/>
-          <y:Arrows source="none" target="standard"/>
-          <y:BendStyle smoothed="false"/>
-        </y:PolyLineEdge>
-      </data>
-    </edge>
-    <edge id="e4" source="n4" target="n1">
-      <data key="d9"/>
-      <data key="d10">
-        <y:PolyLineEdge>
-          <y:Path sx="0.0" sy="15.0" tx="-18.67138671875" ty="-15.0"/>
-          <y:LineStyle color="#000000" type="line" width="1.0"/>
-          <y:Arrows source="none" target="standard"/>
-          <y:BendStyle smoothed="false"/>
-        </y:PolyLineEdge>
-      </data>
-    </edge>
-    <edge id="e5" source="n6" target="n4">
-      <data key="d9"/>
-      <data key="d10">
-        <y:PolyLineEdge>
-          <y:Path sx="12.617187500000007" sy="15.0" tx="-17.211588541666664" ty="-15.0">
-            <y:Point x="57.851711309523814" y="263.5"/>
-            <y:Point x="230.4205543154762" y="263.5"/>
-          </y:Path>
-          <y:LineStyle color="#000000" type="line" width="1.0"/>
-          <y:Arrows source="none" target="standard"/>
-          <y:BendStyle smoothed="false"/>
-        </y:PolyLineEdge>
-      </data>
-    </edge>
-    <edge id="e6" source="n6" target="n5">
-      <data key="d9"/>
-      <data key="d10">
-        <y:PolyLineEdge>
-          <y:Path sx="-12.617187500000007" sy="15.0" tx="0.0" ty="-15.0"/>
-          <y:LineStyle color="#000000" type="line" width="1.0"/>
-          <y:Arrows source="none" target="standard"/>
-          <y:BendStyle smoothed="false"/>
-        </y:PolyLineEdge>
-      </data>
-    </edge>
-    <edge id="e7" source="n7" target="n3">
-      <data key="d9"/>
-      <data key="d10">
-        <y:PolyLineEdge>
-          <y:Path sx="0.0" sy="15.0" tx="20.747656250000006" ty="-15.0">
-            <y:Point x="576.5511904761905" y="199.5"/>
-            <y:Point x="466.1290054563492" y="199.5"/>
-          </y:Path>
-          <y:LineStyle color="#000000" type="line" width="1.0"/>
-          <y:Arrows source="none" target="standard"/>
-          <y:BendStyle smoothed="false"/>
-        </y:PolyLineEdge>
-      </data>
-    </edge>
-    <edge id="e8" source="n8" target="n0">
-      <data key="d9"/>
-      <data key="d10">
-        <y:PolyLineEdge>
-          <y:Path sx="-14.615885416666686" sy="15.0" tx="-15.22900390625" ty="-15.0">
-            <y:Point x="171.75435267857142" y="199.5"/>
-            <y:Point x="153.27380952380952" y="199.5"/>
-          </y:Path>
-          <y:LineStyle color="#000000" type="line" width="1.0"/>
-          <y:Arrows source="none" target="standard"/>
-          <y:BendStyle smoothed="false"/>
-        </y:PolyLineEdge>
-      </data>
-    </edge>
-    <edge id="e9" source="n8" target="n3">
-      <data key="d9"/>
-      <data key="d10">
-        <y:PolyLineEdge>
-          <y:Path sx="14.615885416666668" sy="15.0" tx="-10.373828125000003" ty="-15.0">
-            <y:Point x="200.98612351190476" y="215.5"/>
-            <y:Point x="435.00752108134924" y="215.5"/>
-          </y:Path>
-          <y:LineStyle color="#000000" type="line" width="1.0"/>
-          <y:Arrows source="none" target="standard"/>
-          <y:BendStyle smoothed="false"/>
-        </y:PolyLineEdge>
-      </data>
-    </edge>
-    <edge id="e10" source="n8" target="n4">
-      <data key="d9"/>
-      <data key="d10">
-        <y:PolyLineEdge>
-          <y:Path sx="0.0" sy="15.0" tx="0.0" ty="-15.0">
-            <y:Point x="186.3702380952381" y="247.5"/>
-            <y:Point x="247.63214285714287" y="247.5"/>
-          </y:Path>
-          <y:LineStyle color="#000000" type="line" width="1.0"/>
-          <y:Arrows source="none" target="standard"/>
-          <y:BendStyle smoothed="false"/>
-        </y:PolyLineEdge>
-      </data>
-    </edge>
-    <edge id="e11" source="n9" target="n6">
-      <data key="d9"/>
-      <data key="d10">
-        <y:PolyLineEdge>
-          <y:Path sx="-15.669921875" sy="15.0" tx="0.0" ty="-15.0"/>
-          <y:LineStyle color="#000000" type="line" width="1.0"/>
-          <y:Arrows source="none" target="standard"/>
-          <y:BendStyle smoothed="false"/>
-        </y:PolyLineEdge>
-      </data>
-    </edge>
-    <edge id="e12" source="n9" target="n3">
-      <data key="d9"/>
-      <data key="d10">
-        <y:PolyLineEdge>
-          <y:Path sx="15.669921875" sy="15.0" tx="-20.747656249999977" ty="-15.0">
-            <y:Point x="76.57428695436508" y="106.5"/>
-            <y:Point x="85.96904761904761" y="106.5"/>
-            <y:Point x="85.96904761904761" y="231.5"/>
-            <y:Point x="424.63369295634925" y="231.5"/>
-          </y:Path>
-          <y:LineStyle color="#000000" type="line" width="1.0"/>
-          <y:Arrows source="none" target="standard"/>
-          <y:BendStyle smoothed="false"/>
-        </y:PolyLineEdge>
-      </data>
-    </edge>
-    <edge id="e13" source="n10" target="n3">
-      <data key="d9"/>
-      <data key="d10">
-        <y:PolyLineEdge>
-          <y:Path sx="0.0" sy="15.0" tx="10.373828125000003" ty="-15.0"/>
-          <y:LineStyle color="#000000" type="line" width="1.0"/>
-          <y:Arrows source="none" target="standard"/>
-          <y:BendStyle smoothed="false"/>
-        </y:PolyLineEdge>
-      </data>
-    </edge>
-    <edge id="e14" source="n11" target="n8">
-      <data key="d9"/>
-      <data key="d10">
-        <y:PolyLineEdge>
-          <y:Path sx="0.0" sy="15.0" tx="-14.615885416666668" ty="-15.0"/>
-          <y:LineStyle color="#000000" type="line" width="1.0"/>
-          <y:Arrows source="none" target="standard"/>
-          <y:BendStyle smoothed="false"/>
-        </y:PolyLineEdge>
-      </data>
-    </edge>
-    <edge id="e15" source="n12" target="n3">
-      <data key="d9"/>
-      <data key="d10">
-        <y:PolyLineEdge>
-          <y:Path sx="26.54931640625" sy="15.0" tx="0.0" ty="-15.0">
-            <y:Point x="317.94217354910717" y="199.5"/>
-            <y:Point x="445.3813492063492" y="199.5"/>
-          </y:Path>
-          <y:LineStyle color="#000000" type="line" width="1.0"/>
-          <y:Arrows source="none" target="standard"/>
-          <y:BendStyle smoothed="false"/>
-        </y:PolyLineEdge>
-      </data>
-    </edge>
-    <edge id="e16" source="n12" target="n4">
-      <data key="d9"/>
-      <data key="d10">
-        <y:PolyLineEdge>
-          <y:Path sx="-26.54931640625" sy="15.0" tx="17.211588541666664" ty="-15.0"/>
-          <y:LineStyle color="#000000" type="line" width="1.0"/>
-          <y:Arrows source="none" target="standard"/>
-          <y:BendStyle smoothed="false"/>
-        </y:PolyLineEdge>
-      </data>
-    </edge>
-    <edge id="e17" source="n13" target="n8">
-      <data key="d9"/>
-      <data key="d10">
-        <y:PolyLineEdge>
-          <y:Path sx="-13.33154296875" sy="15.0" tx="14.615885416666671" ty="-15.0">
-            <y:Point x="437.97996496775795" y="122.5"/>
-            <y:Point x="200.9861235119048" y="122.5"/>
-          </y:Path>
-          <y:LineStyle color="#000000" type="line" width="1.0"/>
-          <y:Arrows source="none" target="standard"/>
-          <y:BendStyle smoothed="false"/>
-        </y:PolyLineEdge>
-      </data>
-    </edge>
-    <edge id="e18" source="n13" target="n10">
-      <data key="d9"/>
-      <data key="d10">
-        <y:PolyLineEdge>
-          <y:Path sx="4.44384765625" sy="15.0" tx="0.0" ty="-15.0"/>
-          <y:LineStyle color="#000000" type="line" width="1.0"/>
-          <y:Arrows source="none" target="standard"/>
-          <y:BendStyle smoothed="false"/>
-        </y:PolyLineEdge>
-      </data>
-    </edge>
-    <edge id="e19" source="n13" target="n7">
-      <data key="d9"/>
-      <data key="d10">
-        <y:PolyLineEdge>
-          <y:Path sx="13.33154296875" sy="15.0" tx="0.0" ty="-15.0">
-            <y:Point x="464.64305090525795" y="106.5"/>
-            <y:Point x="576.5511904761905" y="106.5"/>
-          </y:Path>
-          <y:LineStyle color="#000000" type="line" width="1.0"/>
-          <y:Arrows source="none" target="standard"/>
-          <y:BendStyle smoothed="false"/>
-        </y:PolyLineEdge>
-      </data>
-    </edge>
-    <edge id="e20" source="n13" target="n12">
-      <data key="d9"/>
-      <data key="d10">
-        <y:PolyLineEdge>
-          <y:Path sx="-4.44384765625" sy="15.0" tx="0.0" ty="-15.0">
-            <y:Point x="446.86766028025795" y="138.5"/>
-            <y:Point x="291.39285714285717" y="138.5"/>
-          </y:Path>
-          <y:LineStyle color="#000000" type="line" width="1.0"/>
-          <y:Arrows source="none" target="standard"/>
-          <y:BendStyle smoothed="false"/>
-        </y:PolyLineEdge>
-      </data>
-    </edge>
-    <edge id="e21" source="n14" target="n9">
-      <data key="d9"/>
-      <data key="d10">
-        <y:PolyLineEdge>
-          <y:Path sx="-22.8359375" sy="15.0" tx="0.0" ty="-15.0">
-            <y:Point x="125.99838789682539" y="45.5"/>
-            <y:Point x="60.90436507936508" y="45.5"/>
-          </y:Path>
-          <y:LineStyle color="#000000" type="line" width="1.0"/>
-          <y:Arrows source="none" target="standard"/>
-          <y:BendStyle smoothed="false"/>
-        </y:PolyLineEdge>
-      </data>
-    </edge>
-    <edge id="e22" source="n14" target="n8">
-      <data key="d9"/>
-      <data key="d10">
-        <y:PolyLineEdge>
-          <y:Path sx="22.8359375" sy="15.0" tx="0.0" ty="-15.0">
-            <y:Point x="171.6702628968254" y="45.5"/>
-            <y:Point x="236.7642857142857" y="45.5"/>
-            <y:Point x="236.7642857142857" y="106.5"/>
-            <y:Point x="186.3702380952381" y="106.5"/>
-          </y:Path>
-          <y:LineStyle color="#000000" type="line" width="1.0"/>
-          <y:Arrows source="none" target="standard"/>
-          <y:BendStyle smoothed="false"/>
-        </y:PolyLineEdge>
-      </data>
-    </edge>
-  </graph>
-  <data key="d7">
-    <y:Resources/>
-  </data>
-</graphml>
Index: sign/systemoverview.graphml
===================================================================
--- /design/systemoverview.graphml	(revision 53)
+++ 	(revision )
@@ -1,969 +1,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<graphml xmlns="http://graphml.graphdrawing.org/xmlns" xmlns:java="http://www.yworks.com/xml/yfiles-common/1.0/java" xmlns:sys="http://www.yworks.com/xml/yfiles-common/markup/primitives/2.0" xmlns:x="http://www.yworks.com/xml/yfiles-common/markup/2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:y="http://www.yworks.com/xml/graphml" xmlns:yed="http://www.yworks.com/xml/yed/3" xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns http://www.yworks.com/xml/schema/graphml/1.1/ygraphml.xsd">
-  <!--Created by yEd 3.21.1-->
-  <key attr.name="Description" attr.type="string" for="graph" id="d0"/>
-  <key for="port" id="d1" yfiles.type="portgraphics"/>
-  <key for="port" id="d2" yfiles.type="portgeometry"/>
-  <key for="port" id="d3" yfiles.type="portuserdata"/>
-  <key attr.name="url" attr.type="string" for="node" id="d4"/>
-  <key attr.name="description" attr.type="string" for="node" id="d5"/>
-  <key for="node" id="d6" yfiles.type="nodegraphics"/>
-  <key for="graphml" id="d7" yfiles.type="resources"/>
-  <key attr.name="url" attr.type="string" for="edge" id="d8"/>
-  <key attr.name="description" attr.type="string" for="edge" id="d9"/>
-  <key for="edge" id="d10" yfiles.type="edgegraphics"/>
-  <graph edgedefault="directed" id="G">
-    <data key="d0"/>
-    <node id="n0" yfiles.foldertype="group">
-      <data key="d4" xml:space="preserve"/>
-      <data key="d5"/>
-      <data key="d6">
-        <y:ProxyAutoBoundsNode>
-          <y:Realizers active="0">
-            <y:GroupNode>
-              <y:Geometry height="192.28784442999455" width="424.5653632478634" x="459.7098595848596" y="-537.9285255803818"/>
-              <y:Fill color="#F5F5F5" transparent="false"/>
-              <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
-              <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.4609375" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="t" textColor="#000000" verticalTextPosition="bottom" visible="true" width="424.5653632478634" x="0.0" xml:space="preserve" y="0.0">Runserver</y:NodeLabel>
-              <y:Shape type="roundrectangle"/>
-              <y:State closed="false" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/>
-              <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
-              <y:BorderInsets bottom="0" bottomF="5.6843418860808015E-14" left="8" leftF="7.761096945589202" right="0" rightF="0.0" top="0" topF="0.0"/>
-            </y:GroupNode>
-            <y:GroupNode>
-              <y:Geometry height="50.0" width="50.0" x="0.0" y="60.0"/>
-              <y:Fill color="#F5F5F5" transparent="false"/>
-              <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
-              <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.4609375" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="t" textColor="#000000" verticalTextPosition="bottom" visible="true" width="65.201171875" x="-7.6005859375" xml:space="preserve" y="0.0">Folder 1</y:NodeLabel>
-              <y:Shape type="roundrectangle"/>
-              <y:State closed="true" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/>
-              <y:Insets bottom="5" bottomF="5.0" left="5" leftF="5.0" right="5" rightF="5.0" top="5" topF="5.0"/>
-              <y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/>
-            </y:GroupNode>
-          </y:Realizers>
-        </y:ProxyAutoBoundsNode>
-      </data>
-      <graph edgedefault="directed" id="n0:">
-        <node id="n0::n0">
-          <data key="d5"/>
-          <data key="d6">
-            <y:SVGNode>
-              <y:Geometry height="42.970047955635266" width="44.0091125801282" x="510.9680200225124" y="-501.46758808038186"/>
-              <y:Fill color="#CCCCFF" transparent="false"/>
-              <y:BorderStyle color="#000000" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="59.083984375" x="-7.537435897435898" xml:space="preserve" y="46.97004795563521">Protocols<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="-0.5" nodeRatioX="0.0" nodeRatioY="0.5" offsetX="0.0" offsetY="4.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
-              <y:SVGNodeProperties usingVisualBounds="true"/>
-              <y:SVGModel svgBoundsPolicy="0">
-                <y:SVGContent refid="1"/>
-              </y:SVGModel>
-            </y:SVGNode>
-          </data>
-        </node>
-        <node id="n0::n1">
-          <data key="d5"/>
-          <data key="d6">
-            <y:ShapeNode>
-              <y:Geometry height="54.0" width="163.625" x="705.650222832723" y="-498.7548717948719"/>
-              <y:Fill color="#FFCC00" transparent="false"/>
-              <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="153.625" x="5.0" xml:space="preserve" y="11.03125">another running nego eg
-MOPAC protocol<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
-              <y:Shape type="roundrectangle"/>
-            </y:ShapeNode>
-          </data>
-        </node>
-        <node id="n0::n2">
-          <data key="d5"/>
-          <data key="d6">
-            <y:ShapeNode>
-              <y:Geometry height="54.0" width="112.8828125" x="626.3164508928572" y="-425.9021234580799"/>
-              <y:Fill color="#FFCC00" transparent="false"/>
-              <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="102.8828125" x="5.0" xml:space="preserve" y="11.03125">running nego eg
-SAOP protocol<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
-              <y:Shape type="roundrectangle"/>
-            </y:ShapeNode>
-          </data>
-        </node>
-        <node id="n0::n3">
-          <data key="d5"/>
-          <data key="d6">
-            <y:SVGNode>
-              <y:Geometry height="46.887996673583984" width="39.527000427246094" x="512.8744485043258" y="-429.49742782397135"/>
-              <y:Fill color="#CCCCFF" transparent="false"/>
-              <y:BorderStyle color="#000000" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="100.333984375" x="-30.403491973876953" xml:space="preserve" y="50.887996673583984">nego results log<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="-0.5" nodeRatioX="0.0" nodeRatioY="0.5" offsetX="0.0" offsetY="4.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
-              <y:SVGNodeProperties usingVisualBounds="true"/>
-              <y:SVGModel svgBoundsPolicy="0">
-                <y:SVGContent refid="2"/>
-              </y:SVGModel>
-            </y:SVGNode>
-          </data>
-        </node>
-      </graph>
-    </node>
-    <node id="n1" yfiles.foldertype="group">
-      <data key="d4" xml:space="preserve"/>
-      <data key="d5"/>
-      <data key="d6">
-        <y:ProxyAutoBoundsNode>
-          <y:Realizers active="0">
-            <y:GroupNode>
-              <y:Geometry height="115.25419865730476" width="589.8732967032967" x="201.73824175824177" y="-256.64965544871797"/>
-              <y:Fill color="#F5F5F5" transparent="false"/>
-              <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
-              <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.4609375" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="t" textColor="#000000" verticalTextPosition="bottom" visible="true" width="589.8732967032967" x="0.0" xml:space="preserve" y="0.0">Partiesserver</y:NodeLabel>
-              <y:Shape type="roundrectangle"/>
-              <y:State closed="false" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/>
-              <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
-              <y:BorderInsets bottom="0" bottomF="0.0" left="14" leftF="14.421761675824172" right="20" rightF="20.000170510912653" top="4" topF="3.556001663208008"/>
-            </y:GroupNode>
-            <y:GroupNode>
-              <y:Geometry height="50.0" width="50.0" x="0.0" y="60.0"/>
-              <y:Fill color="#F5F5F5" transparent="false"/>
-              <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
-              <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.4609375" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="t" textColor="#000000" verticalTextPosition="bottom" visible="true" width="65.201171875" x="-7.6005859375" xml:space="preserve" y="0.0">Folder 2</y:NodeLabel>
-              <y:Shape type="roundrectangle"/>
-              <y:State closed="true" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/>
-              <y:Insets bottom="5" bottomF="5.0" left="5" leftF="5.0" right="5" rightF="5.0" top="5" topF="5.0"/>
-              <y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/>
-            </y:GroupNode>
-          </y:Realizers>
-        </y:ProxyAutoBoundsNode>
-      </data>
-      <graph edgedefault="directed" id="n1:">
-        <node id="n1::n0">
-          <data key="d5"/>
-          <data key="d6">
-            <y:ShapeNode>
-              <y:Geometry height="30.0" width="125.9609375" x="470.2536887591575" y="-208.18871794871797"/>
-              <y:Fill color="#FFCC00" transparent="false"/>
-              <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="119.775390625" x="3.0927734375" xml:space="preserve" y="6.015625">running linearparty<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
-              <y:Shape type="roundrectangle"/>
-            </y:ShapeNode>
-          </data>
-        </node>
-        <node id="n1::n1">
-          <data key="d5"/>
-          <data key="d6">
-            <y:ShapeNode>
-              <y:Geometry height="30.0" width="130.396484375" x="626.2148835756258" y="-208.18871794871797"/>
-              <y:Fill color="#FFCC00" transparent="false"/>
-              <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="120.396484375" x="5.0" xml:space="preserve" y="6.015625">another linearparty<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
-              <y:Shape type="roundrectangle"/>
-            </y:ShapeNode>
-          </data>
-        </node>
-        <node id="n1::n2">
-          <data key="d5"/>
-          <data key="d6">
-            <y:ShapeNode>
-              <y:Geometry height="30.0" width="119.50390625" x="320.7496647016178" y="-208.18871794871797"/>
-              <y:Fill color="#FFCC00" transparent="false"/>
-              <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="109.50390625" x="5.0" xml:space="preserve" y="6.015625">running boulware<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
-              <y:Shape type="roundrectangle"/>
-            </y:ShapeNode>
-          </data>
-        </node>
-        <node id="n1::n3">
-          <data key="d5"/>
-          <data key="d6">
-            <y:SVGNode>
-              <y:Geometry height="38.26850949409675" width="37.555560897435896" x="235.171285485348" y="-216.63271628550996"/>
-              <y:Fill color="#CCCCFF" transparent="false"/>
-              <y:BorderStyle color="#000000" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="45.578125" x="-4.011282051282052" xml:space="preserve" y="42.26850949409675">parties<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="-0.5" nodeRatioX="0.0" nodeRatioY="0.5" offsetX="0.0" offsetY="4.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
-              <y:SVGNodeProperties usingVisualBounds="true"/>
-              <y:SVGModel svgBoundsPolicy="0">
-                <y:SVGContent refid="1"/>
-              </y:SVGModel>
-            </y:SVGNode>
-          </data>
-        </node>
-      </graph>
-    </node>
-    <node id="n2" yfiles.foldertype="group">
-      <data key="d4" xml:space="preserve"/>
-      <data key="d5"/>
-      <data key="d6">
-        <y:ProxyAutoBoundsNode>
-          <y:Realizers active="0">
-            <y:GroupNode>
-              <y:Geometry height="141.76038455474077" width="383.7089946771978" x="834.5023577724357" y="-260.5676041666667"/>
-              <y:Fill color="#F5F5F5" transparent="false"/>
-              <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
-              <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.4609375" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="t" textColor="#000000" verticalTextPosition="bottom" visible="true" width="383.7089946771978" x="0.0" xml:space="preserve" y="0.0">another partiesserver</y:NodeLabel>
-              <y:Shape type="roundrectangle"/>
-              <y:State closed="false" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/>
-              <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
-              <y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="4" topF="3.556001663208008"/>
-            </y:GroupNode>
-            <y:GroupNode>
-              <y:Geometry height="50.0" width="50.0" x="0.0" y="60.0"/>
-              <y:Fill color="#F5F5F5" transparent="false"/>
-              <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
-              <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.4609375" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="t" textColor="#000000" verticalTextPosition="bottom" visible="true" width="65.201171875" x="-7.6005859375" xml:space="preserve" y="0.0">Folder 3</y:NodeLabel>
-              <y:Shape type="roundrectangle"/>
-              <y:State closed="true" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/>
-              <y:Insets bottom="5" bottomF="5.0" left="5" leftF="5.0" right="5" rightF="5.0" top="5" topF="5.0"/>
-              <y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/>
-            </y:GroupNode>
-          </y:Realizers>
-        </y:ProxyAutoBoundsNode>
-      </data>
-      <graph edgedefault="directed" id="n2:">
-        <node id="n2::n0">
-          <data key="d5"/>
-          <data key="d6">
-            <y:ShapeNode>
-              <y:Geometry height="30.0" width="140.0234375" x="1063.1879149496335" y="-211.32307692307688"/>
-              <y:Fill color="#FFCC00" transparent="false"/>
-              <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="130.0234375" x="5.0" xml:space="preserve" y="6.015625">running customparty<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
-              <y:Shape type="roundrectangle"/>
-            </y:ShapeNode>
-          </data>
-        </node>
-        <node id="n2::n1">
-          <data key="d5"/>
-          <data key="d6">
-            <y:ShapeNode>
-              <y:Geometry height="30.0" width="108.974609375" x="934.3997893295938" y="-212.89025641025637"/>
-              <y:Fill color="#FFCC00" transparent="false"/>
-              <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="98.974609375" x="5.0" xml:space="preserve" y="6.015625">anac2020 party<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
-              <y:Shape type="roundrectangle"/>
-            </y:ShapeNode>
-          </data>
-        </node>
-        <node id="n2::n2">
-          <data key="d5"/>
-          <data key="d6">
-            <y:SVGNode>
-              <y:Geometry height="50.80594539153276" width="41.84683693910267" x="856.2840174278845" y="-220.55066500345868"/>
-              <y:Fill color="#CCCCFF" transparent="false"/>
-              <y:BorderStyle color="#000000" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="55.41015625" x="-6.7816596554487205" xml:space="preserve" y="54.80594539153276">different
-parties<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="-0.5" nodeRatioX="0.0" nodeRatioY="0.5" offsetX="0.0" offsetY="4.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
-              <y:SVGNodeProperties usingVisualBounds="true"/>
-              <y:SVGModel svgBoundsPolicy="0">
-                <y:SVGContent refid="1"/>
-              </y:SVGModel>
-            </y:SVGNode>
-          </data>
-        </node>
-      </graph>
-    </node>
-    <node id="n3" yfiles.foldertype="group">
-      <data key="d4" xml:space="preserve"/>
-      <data key="d5"/>
-      <data key="d6">
-        <y:ProxyAutoBoundsNode>
-          <y:Realizers active="0">
-            <y:GroupNode>
-              <y:Geometry height="301.47416660602283" width="235.5860643161875" x="202.46111517099212" y="-597.6014422470482"/>
-              <y:Fill color="#C0C0C0" transparent="false"/>
-              <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
-              <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.4609375" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="t" textColor="#000000" verticalTextPosition="bottom" visible="true" width="235.5860643161875" x="0.0" xml:space="preserve" y="0.0">Legend</y:NodeLabel>
-              <y:Shape type="roundrectangle"/>
-              <y:State closed="false" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/>
-              <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
-              <y:BorderInsets bottom="16" bottomF="15.671794871794702" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/>
-            </y:GroupNode>
-            <y:GroupNode>
-              <y:Geometry height="50.0" width="50.0" x="0.0" y="60.0"/>
-              <y:Fill color="#F5F5F5" transparent="false"/>
-              <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
-              <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.4609375" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="t" textColor="#000000" verticalTextPosition="bottom" visible="true" width="65.201171875" x="-7.6005859375" xml:space="preserve" y="0.0">Folder 4</y:NodeLabel>
-              <y:Shape type="roundrectangle"/>
-              <y:State closed="true" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/>
-              <y:Insets bottom="5" bottomF="5.0" left="5" leftF="5.0" right="5" rightF="5.0" top="5" topF="5.0"/>
-              <y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/>
-            </y:GroupNode>
-          </y:Realizers>
-        </y:ProxyAutoBoundsNode>
-      </data>
-      <graph edgedefault="directed" id="n3:">
-        <node id="n3::n0">
-          <data key="d5"/>
-          <data key="d6">
-            <y:SVGNode>
-              <y:Geometry height="46.887996673583984" width="39.527000427246094" x="217.46111517099212" y="-561.1405047470482"/>
-              <y:Fill color="#CCCCFF" transparent="false"/>
-              <y:BorderStyle color="#000000" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="76.380859375" x="52.09614744920009" xml:space="preserve" y="20.728341285510055">java classes<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="-0.5" labelRatioY="0.5" nodeRatioX="0.5" nodeRatioY="0.3253091202617201" offsetX="12.569147021953995" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
-              <y:SVGNodeProperties usingVisualBounds="true"/>
-              <y:SVGModel svgBoundsPolicy="0">
-                <y:SVGContent refid="1"/>
-              </y:SVGModel>
-            </y:SVGNode>
-          </data>
-        </node>
-        <node id="n3::n1">
-          <data key="d5"/>
-          <data key="d6">
-            <y:SVGNode>
-              <y:Geometry height="47.612998962402344" width="39.25" x="217.59961538461516" y="-492.54710845555996"/>
-              <y:Fill color="#CCCCFF" transparent="false"/>
-              <y:BorderStyle color="#000000" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="94.0" x="53.33474358974365" xml:space="preserve" y="14.822124481201172">filesystem files<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="-0.5" labelRatioY="0.0" nodeRatioX="0.5" nodeRatioY="0.0" offsetX="14.084743589743653" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
-              <y:SVGNodeProperties usingVisualBounds="true"/>
-              <y:SVGModel svgBoundsPolicy="0">
-                <y:SVGContent refid="2"/>
-              </y:SVGModel>
-            </y:SVGNode>
-          </data>
-        </node>
-        <node id="n3::n2">
-          <data key="d5"/>
-          <data key="d6">
-            <y:ShapeNode>
-              <y:Geometry height="30.0" width="30.0" x="225.35897435897414" y="-425.75496794871765"/>
-              <y:Fill color="#FFCC00" transparent="false"/>
-              <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" horizontalTextPosition="center" iconTextGap="4" modelName="sides" modelPosition="e" textColor="#000000" verticalTextPosition="bottom" visible="true" width="100.498046875" x="34.0" xml:space="preserve" y="6.015625">running process</y:NodeLabel>
-              <y:Shape type="roundrectangle"/>
-            </y:ShapeNode>
-          </data>
-        </node>
-        <node id="n3::n3">
-          <data key="d5"/>
-          <data key="d6">
-            <y:ShapeNode>
-              <y:Geometry height="30.0" width="30.0" x="227.70974358974354" y="-363.06778846153816"/>
-              <y:Fill color="#FFCC00" transparent="false"/>
-              <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="4.0" x="13.0" y="13.0">
-                <y:LabelModel>
-                  <y:SmartNodeLabelModel distance="4.0"/>
-                </y:LabelModel>
-                <y:ModelParameter>
-                  <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
-                </y:ModelParameter>
-              </y:NodeLabel>
-              <y:Shape type="roundrectangle"/>
-            </y:ShapeNode>
-          </data>
-        </node>
-        <node id="n3::n4">
-          <data key="d5"/>
-          <data key="d6">
-            <y:ShapeNode>
-              <y:Geometry height="30.0" width="30.0" x="393.0471794871796" y="-356.7990705128201"/>
-              <y:Fill color="#FFCC00" transparent="false"/>
-              <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="4.0" x="13.0" y="13.0">
-                <y:LabelModel>
-                  <y:SmartNodeLabelModel distance="4.0"/>
-                </y:LabelModel>
-                <y:ModelParameter>
-                  <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
-                </y:ModelParameter>
-              </y:NodeLabel>
-              <y:Shape type="roundrectangle"/>
-            </y:ShapeNode>
-          </data>
-        </node>
-      </graph>
-    </node>
-    <node id="n4" yfiles.foldertype="group">
-      <data key="d4" xml:space="preserve"/>
-      <data key="d5"/>
-      <data key="d6">
-        <y:ProxyAutoBoundsNode>
-          <y:Realizers active="0">
-            <y:GroupNode>
-              <y:Geometry height="138.09464851966266" width="384.21303786057695" x="368.8372185496794" y="-55.53282852564064"/>
-              <y:Fill color="#F5F5F5" transparent="false"/>
-              <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
-              <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.4609375" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="t" textColor="#000000" verticalTextPosition="bottom" visible="true" width="384.21303786057695" x="0.0" xml:space="preserve" y="0.0">Profilesserver</y:NodeLabel>
-              <y:Shape type="roundrectangle"/>
-              <y:State closed="false" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/>
-              <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
-              <y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/>
-            </y:GroupNode>
-            <y:GroupNode>
-              <y:Geometry height="50.0" width="50.0" x="0.0" y="60.0"/>
-              <y:Fill color="#F5F5F5" transparent="false"/>
-              <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
-              <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.4609375" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="t" textColor="#000000" verticalTextPosition="bottom" visible="true" width="65.201171875" x="-7.6005859375" xml:space="preserve" y="0.0">Folder 5</y:NodeLabel>
-              <y:Shape type="roundrectangle"/>
-              <y:State closed="true" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/>
-              <y:Insets bottom="5" bottomF="5.0" left="5" leftF="5.0" right="5" rightF="5.0" top="5" topF="5.0"/>
-              <y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/>
-            </y:GroupNode>
-          </y:Realizers>
-        </y:ProxyAutoBoundsNode>
-      </data>
-      <graph edgedefault="directed" id="n4:">
-        <node id="n4::n0">
-          <data key="d5"/>
-          <data key="d6">
-            <y:SVGNode>
-              <y:Geometry height="47.612998962402344" width="39.25" x="388.4221794871794" y="-2.019928968380327"/>
-              <y:Fill color="#CCCCFF" transparent="false"/>
-              <y:BorderStyle color="#000000" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="48.419921875" x="-4.5849609375" xml:space="preserve" y="51.612998962402344">profiles<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="-0.5" nodeRatioX="0.0" nodeRatioY="0.5" offsetX="0.0" offsetY="4.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
-              <y:SVGNodeProperties usingVisualBounds="true"/>
-              <y:SVGModel svgBoundsPolicy="0">
-                <y:SVGContent refid="2"/>
-              </y:SVGModel>
-            </y:SVGNode>
-          </data>
-        </node>
-        <node id="n4::n1">
-          <data key="d5"/>
-          <data key="d6">
-            <y:ShapeNode>
-              <y:Geometry height="32.35076923076929" width="157.72512820512816" x="489.4287179487178" y="-19.07189102564064"/>
-              <y:Fill color="#FFCC00" transparent="false"/>
-              <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="138.2734375" x="9.725845352564079" xml:space="preserve" y="7.191009615384644">jobs1 profileconnector<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
-              <y:Shape type="roundrectangle"/>
-            </y:ShapeNode>
-          </data>
-        </node>
-        <node id="n4::n2">
-          <data key="d5"/>
-          <data key="d6">
-            <y:ShapeNode>
-              <y:Geometry height="33.917948717948775" width="139.7025641025641" x="598.3476923076922" y="30.29426282051304"/>
-              <y:Fill color="#FFCC00" transparent="false"/>
-              <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="97.076171875" x="21.313196113782055" xml:space="preserve" y="7.9745993589743875">jobs2 prof.conn<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
-              <y:Shape type="roundrectangle"/>
-            </y:ShapeNode>
-          </data>
-        </node>
-      </graph>
-    </node>
-    <node id="n5">
-      <data key="d5"/>
-      <data key="d6">
-        <y:ShapeNode>
-          <y:Geometry height="32.350769230769174" width="149.10564102564103" x="175.2092307692306" y="5.219391025641471"/>
-          <y:Fill color="#FFCC00" transparent="false"/>
-          <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
-          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="105.26171875" x="21.921961137820517" xml:space="preserve" y="7.191009615384587">user edits profile<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
-          <y:Shape type="fatarrow"/>
-        </y:ShapeNode>
-      </data>
-    </node>
-    <node id="n6" yfiles.foldertype="group">
-      <data key="d4" xml:space="preserve"/>
-      <data key="d5"/>
-      <data key="d6">
-        <y:ProxyAutoBoundsNode>
-          <y:Realizers active="0">
-            <y:GroupNode>
-              <y:Geometry height="167.65580929487191" width="287.04790965544896" x="831.18144931891" y="-79.99275749402113"/>
-              <y:Fill color="#F5F5F5" transparent="false"/>
-              <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
-              <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.4609375" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="t" textColor="#000000" verticalTextPosition="bottom" visible="true" width="287.04790965544896" x="0.0" xml:space="preserve" y="0.0">Another Profilesserver</y:NodeLabel>
-              <y:Shape type="roundrectangle"/>
-              <y:State closed="false" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/>
-              <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
-              <y:BorderInsets bottom="5" bottomF="5.269878723926922" left="0" leftF="0.0" right="27" rightF="27.425641025641198" top="0" topF="0.0"/>
-            </y:GroupNode>
-            <y:GroupNode>
-              <y:Geometry height="50.0" width="50.0" x="0.0" y="60.0"/>
-              <y:Fill color="#F5F5F5" transparent="false"/>
-              <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
-              <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.4609375" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="t" textColor="#000000" verticalTextPosition="bottom" visible="true" width="65.201171875" x="-7.6005859375" xml:space="preserve" y="0.0">Folder 6</y:NodeLabel>
-              <y:Shape type="roundrectangle"/>
-              <y:State closed="true" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/>
-              <y:Insets bottom="5" bottomF="5.0" left="5" leftF="5.0" right="5" rightF="5.0" top="5" topF="5.0"/>
-              <y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/>
-            </y:GroupNode>
-          </y:Realizers>
-        </y:ProxyAutoBoundsNode>
-      </data>
-      <graph edgedefault="directed" id="n6:">
-        <node id="n6::n0">
-          <data key="d5"/>
-          <data key="d6">
-            <y:SVGNode>
-              <y:Geometry height="47.612998962402344" width="39.25" x="850.76641025641" y="-2.1885758854784854"/>
-              <y:Fill color="#CCCCFF" transparent="false"/>
-              <y:BorderStyle color="#000000" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="48.419921875" x="-4.5849609375" xml:space="preserve" y="51.612998962402344">profiles<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="-0.5" nodeRatioX="0.0" nodeRatioY="0.5" offsetX="0.0" offsetY="4.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
-              <y:SVGNodeProperties usingVisualBounds="true"/>
-              <y:SVGModel svgBoundsPolicy="0">
-                <y:SVGContent refid="2"/>
-              </y:SVGModel>
-            </y:SVGNode>
-          </data>
-        </node>
-        <node id="n6::n1">
-          <data key="d5"/>
-          <data key="d6">
-            <y:ShapeNode>
-              <y:Geometry height="33.917948717948775" width="134.21743589743573" x="941.5862820512822" y="30.125615903414996"/>
-              <y:Fill color="#FFCC00" transparent="false"/>
-              <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="120.970703125" x="6.623366386217867" xml:space="preserve" y="7.9745993589743875">energy profileconn.<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
-              <y:Shape type="roundrectangle"/>
-            </y:ShapeNode>
-          </data>
-        </node>
-        <node id="n6::n2">
-          <data key="d5"/>
-          <data key="d6">
-            <y:ShapeNode>
-              <y:Geometry height="33.134358974358975" width="124.81435897435904" x="935.3175641025638" y="-43.531819994021134"/>
-              <y:Fill color="#FFCC00" transparent="false"/>
-              <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
-              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="97.83203125" x="13.491163862179405" xml:space="preserve" y="7.582804487179487">car profileconn.<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
-              <y:Shape type="roundrectangle"/>
-            </y:ShapeNode>
-          </data>
-        </node>
-      </graph>
-    </node>
-    <node id="n7">
-      <data key="d5"/>
-      <data key="d6">
-        <y:ShapeNode>
-          <y:Geometry height="44.0" width="209.8607411858975" x="1011.0842203716422" y="-466.084358974359"/>
-          <y:Fill color="#FFCC00" transparent="false"/>
-          <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
-          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="30.173828125" x="89.84345653044875" xml:space="preserve" y="13.015625">user<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
-          <y:Shape type="fatarrow2"/>
-        </y:ShapeNode>
-      </data>
-    </node>
-    <edge id="e0" source="n7" target="n0">
-      <data key="d9"/>
-      <data key="d10">
-        <y:PolyLineEdge>
-          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
-          <y:LineStyle color="#000000" type="line" width="1.0"/>
-          <y:Arrows source="none" target="standard"/>
-          <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="31.9375" horizontalTextPosition="center" iconTextGap="4" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="93.513671875" x="-99.02405599554527" xml:space="preserve" y="-15.698049494027202">request to run 
-negotiation<y:LabelModel><y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/></y:LabelModel><y:ModelParameter><y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="center" ratio="0.0" segment="0"/></y:ModelParameter><y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/></y:EdgeLabel>
-          <y:BendStyle smoothed="false"/>
-        </y:PolyLineEdge>
-      </data>
-    </edge>
-    <edge id="e1" source="n0::n2" target="n1::n1">
-      <data key="d9"/>
-      <data key="d10">
-        <y:PolyLineEdge>
-          <y:Path sx="0.0" sy="-27.0" tx="-1.2736385836384443" ty="4.189647435897712"/>
-          <y:LineStyle color="#000000" type="line" width="5.0"/>
-          <y:Arrows source="standard" target="standard"/>
-          <y:BendStyle smoothed="false"/>
-        </y:PolyLineEdge>
-      </data>
-    </edge>
-    <edge id="e2" source="n0::n2" target="n2::n1">
-      <data key="d9"/>
-      <data key="d10">
-        <y:PolyLineEdge>
-          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
-          <y:LineStyle color="#000000" type="line" width="5.0"/>
-          <y:Arrows source="standard" target="standard"/>
-          <y:BendStyle smoothed="false"/>
-        </y:PolyLineEdge>
-      </data>
-    </edge>
-    <edge id="e3" source="n0::n2" target="n1">
-      <data key="d9"/>
-      <data key="d10">
-        <y:PolyLineEdge>
-          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
-          <y:LineStyle color="#000000" type="line" width="1.0"/>
-          <y:Arrows source="none" target="standard"/>
-          <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="125.224609375" x="-116.25151409199293" xml:space="preserve" y="48.631764355194775">request to run party<y:LabelModel><y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/></y:LabelModel><y:ModelParameter><y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="center" ratio="0.5" segment="0"/></y:ModelParameter><y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/></y:EdgeLabel>
-          <y:BendStyle smoothed="false"/>
-        </y:PolyLineEdge>
-      </data>
-    </edge>
-    <edge id="e4" source="n1::n1" target="n4::n1">
-      <data key="d9"/>
-      <data key="d10">
-        <y:PolyLineEdge>
-          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
-          <y:LineStyle color="#000000" type="line" width="5.0"/>
-          <y:Arrows source="standard" target="standard"/>
-          <y:BendStyle smoothed="false"/>
-        </y:PolyLineEdge>
-      </data>
-    </edge>
-    <edge id="n4::e0" source="n4::n1" target="n4::n0">
-      <data key="d9"/>
-      <data key="d10">
-        <y:PolyLineEdge>
-          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
-          <y:LineStyle color="#000000" type="dotted" width="3.0"/>
-          <y:Arrows source="none" target="standard"/>
-          <y:BendStyle smoothed="false"/>
-        </y:PolyLineEdge>
-      </data>
-    </edge>
-    <edge id="e5" source="n5" target="n4::n0">
-      <data key="d9"/>
-      <data key="d10">
-        <y:PolyLineEdge>
-          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
-          <y:LineStyle color="#000000" type="line" width="1.0"/>
-          <y:Arrows source="none" target="standard"/>
-          <y:BendStyle smoothed="false"/>
-        </y:PolyLineEdge>
-      </data>
-    </edge>
-    <edge id="e6" source="n2::n1" target="n4::n2">
-      <data key="d9"/>
-      <data key="d10">
-        <y:PolyLineEdge>
-          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
-          <y:LineStyle color="#000000" type="line" width="5.0"/>
-          <y:Arrows source="standard" target="standard"/>
-          <y:BendStyle smoothed="false"/>
-        </y:PolyLineEdge>
-      </data>
-    </edge>
-    <edge id="n6::e0" source="n6::n1" target="n6::n0">
-      <data key="d9"/>
-      <data key="d10">
-        <y:PolyLineEdge>
-          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
-          <y:LineStyle color="#000000" type="dotted" width="3.0"/>
-          <y:Arrows source="none" target="standard"/>
-          <y:BendStyle smoothed="false"/>
-        </y:PolyLineEdge>
-      </data>
-    </edge>
-    <edge id="n4::e1" source="n4::n2" target="n4::n0">
-      <data key="d9"/>
-      <data key="d10">
-        <y:PolyLineEdge>
-          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
-          <y:LineStyle color="#000000" type="dotted" width="3.0"/>
-          <y:Arrows source="none" target="standard"/>
-          <y:BendStyle smoothed="false"/>
-        </y:PolyLineEdge>
-      </data>
-    </edge>
-    <edge id="n6::e1" source="n6::n2" target="n6::n0">
-      <data key="d9"/>
-      <data key="d10">
-        <y:PolyLineEdge>
-          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
-          <y:LineStyle color="#000000" type="dotted" width="3.0"/>
-          <y:Arrows source="none" target="standard"/>
-          <y:BendStyle smoothed="false"/>
-        </y:PolyLineEdge>
-      </data>
-    </edge>
-    <edge id="e7" source="n2::n0" target="n6::n1">
-      <data key="d9"/>
-      <data key="d10">
-        <y:PolyLineEdge>
-          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
-          <y:LineStyle color="#000000" type="line" width="5.0"/>
-          <y:Arrows source="standard" target="standard"/>
-          <y:BendStyle smoothed="false"/>
-        </y:PolyLineEdge>
-      </data>
-    </edge>
-    <edge id="e8" source="n1::n0" target="n6::n2">
-      <data key="d9"/>
-      <data key="d10">
-        <y:PolyLineEdge>
-          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
-          <y:LineStyle color="#000000" type="line" width="5.0"/>
-          <y:Arrows source="standard" target="standard"/>
-          <y:BendStyle smoothed="false"/>
-        </y:PolyLineEdge>
-      </data>
-    </edge>
-    <edge id="e9" source="n1::n2" target="n4">
-      <data key="d9"/>
-      <data key="d10">
-        <y:PolyLineEdge>
-          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
-          <y:LineStyle color="#000000" type="line" width="1.0"/>
-          <y:Arrows source="none" target="standard"/>
-          <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="164.20703125" x="-28.578668030102563" xml:space="preserve" y="52.33034309582847">request to get profile conn<y:LabelModel><y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/></y:LabelModel><y:ModelParameter><y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="center" ratio="0.5" segment="0"/></y:ModelParameter><y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/></y:EdgeLabel>
-          <y:BendStyle smoothed="false"/>
-        </y:PolyLineEdge>
-      </data>
-    </edge>
-    <edge id="n0::e0" source="n0::n2" target="n0::n3">
-      <data key="d9"/>
-      <data key="d10">
-        <y:PolyLineEdge>
-          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
-          <y:LineStyle color="#000000" type="dotted" width="3.0"/>
-          <y:Arrows source="none" target="standard"/>
-          <y:BendStyle smoothed="false"/>
-        </y:PolyLineEdge>
-      </data>
-    </edge>
-    <edge id="n3::e0" source="n3::n3" target="n3::n4">
-      <data key="d9"/>
-      <data key="d10">
-        <y:PolyLineEdge>
-          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0">
-            <y:Point x="343.00923076923095" y="-373.14266025641"/>
-          </y:Path>
-          <y:LineStyle color="#000000" type="line" width="1.0"/>
-          <y:Arrows source="none" target="standard"/>
-          <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="121.140625" x="3.3936485251403496" xml:space="preserve" y="-24.975382737379505">http JSON REST call<y:LabelModel><y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/></y:LabelModel><y:ModelParameter><y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="center" ratio="0.5" segment="0"/></y:ModelParameter><y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/></y:EdgeLabel>
-          <y:BendStyle smoothed="false"/>
-        </y:PolyLineEdge>
-      </data>
-    </edge>
-    <edge id="n3::e1" source="n3::n3" target="n3::n4">
-      <data key="d9"/>
-      <data key="d10">
-        <y:PolyLineEdge>
-          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0">
-            <y:Point x="331.2553846153846" y="-317.5077884615382"/>
-          </y:Path>
-          <y:LineStyle color="#000000" type="line" width="5.0"/>
-          <y:Arrows source="standard" target="standard"/>
-          <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="140.025390625" x="3.530347994290878" xml:space="preserve" y="16.397729116586788">Websocket connection<y:LabelModel><y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/></y:LabelModel><y:ModelParameter><y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="center" ratio="1.0" segment="0"/></y:ModelParameter><y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/></y:EdgeLabel>
-          <y:BendStyle smoothed="false"/>
-        </y:PolyLineEdge>
-      </data>
-    </edge>
-  </graph>
-  <data key="d7">
-    <y:Resources>
-      <y:Resource id="1" xml:space="preserve">&lt;?xml version="1.0" encoding="utf-8"?&gt;
-&lt;svg version="1.1"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
-	 x="0px" y="0px" width="41px" height="48px" viewBox="-0.875 -0.887 41 48" enable-background="new -0.875 -0.887 41 48"
-	 xml:space="preserve"&gt;
-&lt;defs&gt;
-&lt;/defs&gt;
-&lt;linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="642.8008" y1="-979.1445" x2="682.0508" y2="-979.1445" gradientTransform="matrix(1 0 0 -1 -642.8008 -939.4756)"&gt;
-	&lt;stop  offset="0" style="stop-color:#3C89C9"/&gt;
-	&lt;stop  offset="0.1482" style="stop-color:#60A6DD"/&gt;
-	&lt;stop  offset="0.3113" style="stop-color:#81C1F0"/&gt;
-	&lt;stop  offset="0.4476" style="stop-color:#95D1FB"/&gt;
-	&lt;stop  offset="0.5394" style="stop-color:#9CD7FF"/&gt;
-	&lt;stop  offset="0.636" style="stop-color:#98D4FD"/&gt;
-	&lt;stop  offset="0.7293" style="stop-color:#8DCAF6"/&gt;
-	&lt;stop  offset="0.8214" style="stop-color:#79BBEB"/&gt;
-	&lt;stop  offset="0.912" style="stop-color:#5EA5DC"/&gt;
-	&lt;stop  offset="1" style="stop-color:#3C89C9"/&gt;
-&lt;/linearGradient&gt;
-&lt;path fill="url(#SVGID_1_)" d="M19.625,36.763C8.787,36.763,0,34.888,0,32.575v10c0,2.313,8.787,4.188,19.625,4.188
-	c10.839,0,19.625-1.875,19.625-4.188v-10C39.25,34.888,30.464,36.763,19.625,36.763z"/&gt;
-&lt;linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="642.8008" y1="-973.1445" x2="682.0508" y2="-973.1445" gradientTransform="matrix(1 0 0 -1 -642.8008 -939.4756)"&gt;
-	&lt;stop  offset="0" style="stop-color:#9CD7FF"/&gt;
-	&lt;stop  offset="0.0039" style="stop-color:#9DD7FF"/&gt;
-	&lt;stop  offset="0.2273" style="stop-color:#BDE5FF"/&gt;
-	&lt;stop  offset="0.4138" style="stop-color:#D1EEFF"/&gt;
-	&lt;stop  offset="0.5394" style="stop-color:#D9F1FF"/&gt;
-	&lt;stop  offset="0.6155" style="stop-color:#D5EFFE"/&gt;
-	&lt;stop  offset="0.6891" style="stop-color:#C9E7FA"/&gt;
-	&lt;stop  offset="0.7617" style="stop-color:#B6DAF3"/&gt;
-	&lt;stop  offset="0.8337" style="stop-color:#9AC8EA"/&gt;
-	&lt;stop  offset="0.9052" style="stop-color:#77B0DD"/&gt;
-	&lt;stop  offset="0.9754" style="stop-color:#4D94CF"/&gt;
-	&lt;stop  offset="1" style="stop-color:#3C89C9"/&gt;
-&lt;/linearGradient&gt;
-&lt;path fill="url(#SVGID_2_)" d="M19.625,36.763c10.839,0,19.625-1.875,19.625-4.188l-1.229-2c0,2.168-8.235,3.927-18.396,3.927
-	c-9.481,0-17.396-1.959-18.396-3.927l-1.229,2C0,34.888,8.787,36.763,19.625,36.763z"/&gt;
-&lt;path fill="#3C89C9" d="M19.625,26.468c10.16,0,19.625,2.775,19.625,2.775c-0.375,2.721-5.367,5.438-19.554,5.438
-	c-12.125,0-18.467-2.484-19.541-4.918C-0.127,29.125,9.465,26.468,19.625,26.468z"/&gt;
-&lt;linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="642.8008" y1="-965.6948" x2="682.0508" y2="-965.6948" gradientTransform="matrix(1 0 0 -1 -642.8008 -939.4756)"&gt;
-	&lt;stop  offset="0" style="stop-color:#3C89C9"/&gt;
-	&lt;stop  offset="0.1482" style="stop-color:#60A6DD"/&gt;
-	&lt;stop  offset="0.3113" style="stop-color:#81C1F0"/&gt;
-	&lt;stop  offset="0.4476" style="stop-color:#95D1FB"/&gt;
-	&lt;stop  offset="0.5394" style="stop-color:#9CD7FF"/&gt;
-	&lt;stop  offset="0.636" style="stop-color:#98D4FD"/&gt;
-	&lt;stop  offset="0.7293" style="stop-color:#8DCAF6"/&gt;
-	&lt;stop  offset="0.8214" style="stop-color:#79BBEB"/&gt;
-	&lt;stop  offset="0.912" style="stop-color:#5EA5DC"/&gt;
-	&lt;stop  offset="1" style="stop-color:#3C89C9"/&gt;
-&lt;/linearGradient&gt;
-&lt;path fill="url(#SVGID_3_)" d="M19.625,23.313C8.787,23.313,0,21.438,0,19.125v10c0,2.313,8.787,4.188,19.625,4.188
-	c10.839,0,19.625-1.875,19.625-4.188v-10C39.25,21.438,30.464,23.313,19.625,23.313z"/&gt;
-&lt;linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="642.8008" y1="-959.6948" x2="682.0508" y2="-959.6948" gradientTransform="matrix(1 0 0 -1 -642.8008 -939.4756)"&gt;
-	&lt;stop  offset="0" style="stop-color:#9CD7FF"/&gt;
-	&lt;stop  offset="0.0039" style="stop-color:#9DD7FF"/&gt;
-	&lt;stop  offset="0.2273" style="stop-color:#BDE5FF"/&gt;
-	&lt;stop  offset="0.4138" style="stop-color:#D1EEFF"/&gt;
-	&lt;stop  offset="0.5394" style="stop-color:#D9F1FF"/&gt;
-	&lt;stop  offset="0.6155" style="stop-color:#D5EFFE"/&gt;
-	&lt;stop  offset="0.6891" style="stop-color:#C9E7FA"/&gt;
-	&lt;stop  offset="0.7617" style="stop-color:#B6DAF3"/&gt;
-	&lt;stop  offset="0.8337" style="stop-color:#9AC8EA"/&gt;
-	&lt;stop  offset="0.9052" style="stop-color:#77B0DD"/&gt;
-	&lt;stop  offset="0.9754" style="stop-color:#4D94CF"/&gt;
-	&lt;stop  offset="1" style="stop-color:#3C89C9"/&gt;
-&lt;/linearGradient&gt;
-&lt;path fill="url(#SVGID_4_)" d="M19.625,23.313c10.839,0,19.625-1.875,19.625-4.188l-1.229-2c0,2.168-8.235,3.926-18.396,3.926
-	c-9.481,0-17.396-1.959-18.396-3.926l-1.229,2C0,21.438,8.787,23.313,19.625,23.313z"/&gt;
-&lt;path fill="#3C89C9" d="M19.476,13.019c10.161,0,19.625,2.775,19.625,2.775c-0.375,2.721-5.367,5.438-19.555,5.438
-	c-12.125,0-18.467-2.485-19.541-4.918C-0.277,15.674,9.316,13.019,19.476,13.019z"/&gt;
-&lt;linearGradient id="SVGID_5_" gradientUnits="userSpaceOnUse" x1="642.8008" y1="-952.4946" x2="682.0508" y2="-952.4946" gradientTransform="matrix(1 0 0 -1 -642.8008 -939.4756)"&gt;
-	&lt;stop  offset="0" style="stop-color:#3C89C9"/&gt;
-	&lt;stop  offset="0.1482" style="stop-color:#60A6DD"/&gt;
-	&lt;stop  offset="0.3113" style="stop-color:#81C1F0"/&gt;
-	&lt;stop  offset="0.4476" style="stop-color:#95D1FB"/&gt;
-	&lt;stop  offset="0.5394" style="stop-color:#9CD7FF"/&gt;
-	&lt;stop  offset="0.636" style="stop-color:#98D4FD"/&gt;
-	&lt;stop  offset="0.7293" style="stop-color:#8DCAF6"/&gt;
-	&lt;stop  offset="0.8214" style="stop-color:#79BBEB"/&gt;
-	&lt;stop  offset="0.912" style="stop-color:#5EA5DC"/&gt;
-	&lt;stop  offset="1" style="stop-color:#3C89C9"/&gt;
-&lt;/linearGradient&gt;
-&lt;path fill="url(#SVGID_5_)" d="M19.625,10.113C8.787,10.113,0,8.238,0,5.925v10c0,2.313,8.787,4.188,19.625,4.188
-	c10.839,0,19.625-1.875,19.625-4.188v-10C39.25,8.238,30.464,10.113,19.625,10.113z"/&gt;
-&lt;linearGradient id="SVGID_6_" gradientUnits="userSpaceOnUse" x1="642.8008" y1="-946.4946" x2="682.0508" y2="-946.4946" gradientTransform="matrix(1 0 0 -1 -642.8008 -939.4756)"&gt;
-	&lt;stop  offset="0" style="stop-color:#9CD7FF"/&gt;
-	&lt;stop  offset="0.0039" style="stop-color:#9DD7FF"/&gt;
-	&lt;stop  offset="0.2273" style="stop-color:#BDE5FF"/&gt;
-	&lt;stop  offset="0.4138" style="stop-color:#D1EEFF"/&gt;
-	&lt;stop  offset="0.5394" style="stop-color:#D9F1FF"/&gt;
-	&lt;stop  offset="0.6155" style="stop-color:#D5EFFE"/&gt;
-	&lt;stop  offset="0.6891" style="stop-color:#C9E7FA"/&gt;
-	&lt;stop  offset="0.7617" style="stop-color:#B6DAF3"/&gt;
-	&lt;stop  offset="0.8337" style="stop-color:#9AC8EA"/&gt;
-	&lt;stop  offset="0.9052" style="stop-color:#77B0DD"/&gt;
-	&lt;stop  offset="0.9754" style="stop-color:#4D94CF"/&gt;
-	&lt;stop  offset="1" style="stop-color:#3C89C9"/&gt;
-&lt;/linearGradient&gt;
-&lt;path fill="url(#SVGID_6_)" d="M19.625,10.113c10.839,0,19.625-1.875,19.625-4.188l-1.229-2c0,2.168-8.235,3.926-18.396,3.926
-	c-9.481,0-17.396-1.959-18.396-3.926L0,5.925C0,8.238,8.787,10.113,19.625,10.113z"/&gt;
-&lt;linearGradient id="SVGID_7_" gradientUnits="userSpaceOnUse" x1="644.0293" y1="-943.4014" x2="680.8223" y2="-943.4014" gradientTransform="matrix(1 0 0 -1 -642.8008 -939.4756)"&gt;
-	&lt;stop  offset="0" style="stop-color:#9CD7FF"/&gt;
-	&lt;stop  offset="1" style="stop-color:#3C89C9"/&gt;
-&lt;/linearGradient&gt;
-&lt;ellipse fill="url(#SVGID_7_)" cx="19.625" cy="3.926" rx="18.396" ry="3.926"/&gt;
-&lt;path opacity="0.24" fill="#FFFFFF" enable-background="new    " d="M31.04,45.982c0,0-4.354,0.664-7.29,0.781
-	c-3.125,0.125-8.952,0-8.952,0l-2.384-10.292l0.044-2.108l-1.251-1.154L9.789,23.024l-0.082-0.119L9.5,20.529l-1.65-1.254
-	L5.329,8.793c0,0,4.213,0.903,7.234,1.07s8.375,0.25,8.375,0.25l3,9.875l-0.25,1.313l1.063,2.168l2.312,9.645l-0.521,1.416
-	l1.46,1.834L31.04,45.982z"/&gt;
-&lt;/svg&gt;
-</y:Resource>
-      <y:Resource id="2" xml:space="preserve">&lt;?xml version="1.0" encoding="utf-8"?&gt;
-&lt;svg version="1.1"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
-	 x="0px" y="0px" width="40px" height="48px" viewBox="0 0 40 48" enable-background="new 0 0 40 48" xml:space="preserve"&gt;
-&lt;defs&gt;
-&lt;/defs&gt;
-&lt;linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="370.2002" y1="655.0938" x2="409.4502" y2="655.0938" gradientTransform="matrix(1 0 0 1 -370.2002 -614.5742)"&gt;
-	&lt;stop  offset="0" style="stop-color:#4D4D4D"/&gt;
-	&lt;stop  offset="0.0558" style="stop-color:#5F5F5F"/&gt;
-	&lt;stop  offset="0.2103" style="stop-color:#8D8D8D"/&gt;
-	&lt;stop  offset="0.3479" style="stop-color:#AEAEAE"/&gt;
-	&lt;stop  offset="0.4623" style="stop-color:#C2C2C2"/&gt;
-	&lt;stop  offset="0.5394" style="stop-color:#C9C9C9"/&gt;
-	&lt;stop  offset="0.6247" style="stop-color:#C5C5C5"/&gt;
-	&lt;stop  offset="0.7072" style="stop-color:#BABABA"/&gt;
-	&lt;stop  offset="0.7885" style="stop-color:#A6A6A6"/&gt;
-	&lt;stop  offset="0.869" style="stop-color:#8B8B8B"/&gt;
-	&lt;stop  offset="0.9484" style="stop-color:#686868"/&gt;
-	&lt;stop  offset="1" style="stop-color:#4D4D4D"/&gt;
-&lt;/linearGradient&gt;
-&lt;path fill="url(#SVGID_1_)" d="M19.625,37.613C8.787,37.613,0,35.738,0,33.425v10c0,2.313,8.787,4.188,19.625,4.188
-	c10.839,0,19.625-1.875,19.625-4.188v-10C39.25,35.738,30.464,37.613,19.625,37.613z"/&gt;
-&lt;linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="370.2002" y1="649.0938" x2="409.4502" y2="649.0938" gradientTransform="matrix(1 0 0 1 -370.2002 -614.5742)"&gt;
-	&lt;stop  offset="0" style="stop-color:#B3B3B3"/&gt;
-	&lt;stop  offset="0.0171" style="stop-color:#B6B6B6"/&gt;
-	&lt;stop  offset="0.235" style="stop-color:#D7D7D7"/&gt;
-	&lt;stop  offset="0.4168" style="stop-color:#EBEBEB"/&gt;
-	&lt;stop  offset="0.5394" style="stop-color:#F2F2F2"/&gt;
-	&lt;stop  offset="0.6579" style="stop-color:#EEEEEE"/&gt;
-	&lt;stop  offset="0.7724" style="stop-color:#E3E3E3"/&gt;
-	&lt;stop  offset="0.8853" style="stop-color:#CFCFCF"/&gt;
-	&lt;stop  offset="0.9965" style="stop-color:#B4B4B4"/&gt;
-	&lt;stop  offset="1" style="stop-color:#B3B3B3"/&gt;
-&lt;/linearGradient&gt;
-&lt;path fill="url(#SVGID_2_)" d="M19.625,37.613c10.839,0,19.625-1.875,19.625-4.188l-1.229-2c0,2.168-8.235,3.927-18.396,3.927
-	c-9.481,0-17.396-1.959-18.396-3.927l-1.229,2C0,35.738,8.787,37.613,19.625,37.613z"/&gt;
-&lt;linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="371.4297" y1="646" x2="408.2217" y2="646" gradientTransform="matrix(1 0 0 1 -370.2002 -614.5742)"&gt;
-	&lt;stop  offset="0" style="stop-color:#C9C9C9"/&gt;
-	&lt;stop  offset="1" style="stop-color:#808080"/&gt;
-&lt;/linearGradient&gt;
-&lt;ellipse fill="url(#SVGID_3_)" cx="19.625" cy="31.425" rx="18.396" ry="3.926"/&gt;
-&lt;linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="370.2002" y1="641.0938" x2="409.4502" y2="641.0938" gradientTransform="matrix(1 0 0 1 -370.2002 -614.5742)"&gt;
-	&lt;stop  offset="0" style="stop-color:#4D4D4D"/&gt;
-	&lt;stop  offset="0.0558" style="stop-color:#5F5F5F"/&gt;
-	&lt;stop  offset="0.2103" style="stop-color:#8D8D8D"/&gt;
-	&lt;stop  offset="0.3479" style="stop-color:#AEAEAE"/&gt;
-	&lt;stop  offset="0.4623" style="stop-color:#C2C2C2"/&gt;
-	&lt;stop  offset="0.5394" style="stop-color:#C9C9C9"/&gt;
-	&lt;stop  offset="0.6247" style="stop-color:#C5C5C5"/&gt;
-	&lt;stop  offset="0.7072" style="stop-color:#BABABA"/&gt;
-	&lt;stop  offset="0.7885" style="stop-color:#A6A6A6"/&gt;
-	&lt;stop  offset="0.869" style="stop-color:#8B8B8B"/&gt;
-	&lt;stop  offset="0.9484" style="stop-color:#686868"/&gt;
-	&lt;stop  offset="1" style="stop-color:#4D4D4D"/&gt;
-&lt;/linearGradient&gt;
-&lt;path fill="url(#SVGID_4_)" d="M19.625,23.613C8.787,23.613,0,21.738,0,19.425v10c0,2.313,8.787,4.188,19.625,4.188
-	c10.839,0,19.625-1.875,19.625-4.188v-10C39.25,21.738,30.464,23.613,19.625,23.613z"/&gt;
-&lt;linearGradient id="SVGID_5_" gradientUnits="userSpaceOnUse" x1="370.2002" y1="635.0938" x2="409.4502" y2="635.0938" gradientTransform="matrix(1 0 0 1 -370.2002 -614.5742)"&gt;
-	&lt;stop  offset="0" style="stop-color:#B3B3B3"/&gt;
-	&lt;stop  offset="0.0171" style="stop-color:#B6B6B6"/&gt;
-	&lt;stop  offset="0.235" style="stop-color:#D7D7D7"/&gt;
-	&lt;stop  offset="0.4168" style="stop-color:#EBEBEB"/&gt;
-	&lt;stop  offset="0.5394" style="stop-color:#F2F2F2"/&gt;
-	&lt;stop  offset="0.6579" style="stop-color:#EEEEEE"/&gt;
-	&lt;stop  offset="0.7724" style="stop-color:#E3E3E3"/&gt;
-	&lt;stop  offset="0.8853" style="stop-color:#CFCFCF"/&gt;
-	&lt;stop  offset="0.9965" style="stop-color:#B4B4B4"/&gt;
-	&lt;stop  offset="1" style="stop-color:#B3B3B3"/&gt;
-&lt;/linearGradient&gt;
-&lt;path fill="url(#SVGID_5_)" d="M19.625,23.613c10.839,0,19.625-1.875,19.625-4.188l-1.229-2c0,2.168-8.235,3.926-18.396,3.926
-	c-9.481,0-17.396-1.959-18.396-3.926l-1.229,2C0,21.738,8.787,23.613,19.625,23.613z"/&gt;
-&lt;linearGradient id="SVGID_6_" gradientUnits="userSpaceOnUse" x1="371.4297" y1="632" x2="408.2217" y2="632" gradientTransform="matrix(1 0 0 1 -370.2002 -614.5742)"&gt;
-	&lt;stop  offset="0" style="stop-color:#C9C9C9"/&gt;
-	&lt;stop  offset="1" style="stop-color:#808080"/&gt;
-&lt;/linearGradient&gt;
-&lt;ellipse fill="url(#SVGID_6_)" cx="19.625" cy="17.426" rx="18.396" ry="3.926"/&gt;
-&lt;linearGradient id="SVGID_7_" gradientUnits="userSpaceOnUse" x1="370.2002" y1="627.5938" x2="409.4502" y2="627.5938" gradientTransform="matrix(1 0 0 1 -370.2002 -614.5742)"&gt;
-	&lt;stop  offset="0" style="stop-color:#4D4D4D"/&gt;
-	&lt;stop  offset="0.0558" style="stop-color:#5F5F5F"/&gt;
-	&lt;stop  offset="0.2103" style="stop-color:#8D8D8D"/&gt;
-	&lt;stop  offset="0.3479" style="stop-color:#AEAEAE"/&gt;
-	&lt;stop  offset="0.4623" style="stop-color:#C2C2C2"/&gt;
-	&lt;stop  offset="0.5394" style="stop-color:#C9C9C9"/&gt;
-	&lt;stop  offset="0.6247" style="stop-color:#C5C5C5"/&gt;
-	&lt;stop  offset="0.7072" style="stop-color:#BABABA"/&gt;
-	&lt;stop  offset="0.7885" style="stop-color:#A6A6A6"/&gt;
-	&lt;stop  offset="0.869" style="stop-color:#8B8B8B"/&gt;
-	&lt;stop  offset="0.9484" style="stop-color:#686868"/&gt;
-	&lt;stop  offset="1" style="stop-color:#4D4D4D"/&gt;
-&lt;/linearGradient&gt;
-&lt;path fill="url(#SVGID_7_)" d="M19.625,10.113C8.787,10.113,0,8.238,0,5.925v10c0,2.313,8.787,4.188,19.625,4.188
-	c10.839,0,19.625-1.875,19.625-4.188v-10C39.25,8.238,30.464,10.113,19.625,10.113z"/&gt;
-&lt;linearGradient id="SVGID_8_" gradientUnits="userSpaceOnUse" x1="370.2002" y1="621.5938" x2="409.4502" y2="621.5938" gradientTransform="matrix(1 0 0 1 -370.2002 -614.5742)"&gt;
-	&lt;stop  offset="0" style="stop-color:#B3B3B3"/&gt;
-	&lt;stop  offset="0.0171" style="stop-color:#B6B6B6"/&gt;
-	&lt;stop  offset="0.235" style="stop-color:#D7D7D7"/&gt;
-	&lt;stop  offset="0.4168" style="stop-color:#EBEBEB"/&gt;
-	&lt;stop  offset="0.5394" style="stop-color:#F2F2F2"/&gt;
-	&lt;stop  offset="0.6579" style="stop-color:#EEEEEE"/&gt;
-	&lt;stop  offset="0.7724" style="stop-color:#E3E3E3"/&gt;
-	&lt;stop  offset="0.8853" style="stop-color:#CFCFCF"/&gt;
-	&lt;stop  offset="0.9965" style="stop-color:#B4B4B4"/&gt;
-	&lt;stop  offset="1" style="stop-color:#B3B3B3"/&gt;
-&lt;/linearGradient&gt;
-&lt;path fill="url(#SVGID_8_)" d="M19.625,10.113c10.839,0,19.625-1.875,19.625-4.188l-1.229-2c0,2.168-8.235,3.926-18.396,3.926
-	c-9.481,0-17.396-1.959-18.396-3.926L0,5.925C0,8.238,8.787,10.113,19.625,10.113z"/&gt;
-&lt;linearGradient id="SVGID_9_" gradientUnits="userSpaceOnUse" x1="371.4297" y1="618.5" x2="408.2217" y2="618.5" gradientTransform="matrix(1 0 0 1 -370.2002 -614.5742)"&gt;
-	&lt;stop  offset="0" style="stop-color:#C9C9C9"/&gt;
-	&lt;stop  offset="1" style="stop-color:#808080"/&gt;
-&lt;/linearGradient&gt;
-&lt;ellipse fill="url(#SVGID_9_)" cx="19.625" cy="3.926" rx="18.396" ry="3.926"/&gt;
-&lt;path opacity="0.24" fill="#FFFFFF" enable-background="new    " d="M31.291,46.792c0,0-4.313,0.578-7.249,0.694
-	C20.917,47.613,15,47.613,15,47.613l-2.443-10.279l-0.119-2.283l-1.231-1.842L9.789,23.024l-0.082-0.119L9.3,20.715l-1.45-1.44
-	L5.329,8.793c0,0,5.296,0.882,7.234,1.07s8.375,0.25,8.375,0.25l3,9.875l-0.25,1.313l1.063,2.168l2.312,9.644l-0.375,1.875
-	l1.627,2.193L31.291,46.792z"/&gt;
-&lt;/svg&gt;
-</y:Resource>
-    </y:Resources>
-  </data>
-</graphml>
Index: /events/pom.xml
===================================================================
--- /events/pom.xml	(revision 53)
+++ /events/pom.xml	(revision 1)
@@ -6,5 +6,5 @@
 	<groupId>geniusweb</groupId>
 	<artifactId>events</artifactId>
-	<version>2.2.1</version>  <!-- equals the geniusweb version -->
+	<version>1.0.0</version>
 	<packaging>jar</packaging>
 
@@ -16,6 +16,5 @@
 		<basedir>.</basedir>
 		<passwd>${env.ARTIFACTORY_PASS}</passwd>
-		<jackson-2-version>2.12.3</jackson-2-version>
-		<geniusweb.version>${project.version}</geniusweb.version>
+		<jackson-2-version>2.9.6</jackson-2-version>
 	</properties>
 
@@ -23,5 +22,5 @@
 		<repository>
 			<id>artifactory.ewi.tudelft.nl</id>
-			<url>https://artifactory.ewi.tudelft.nl/artifactory/libs-release</url>
+			<url>http://artifactory.ewi.tudelft.nl/artifactory/libs-release</url>
 		</repository>
 	</distributionManagement>
@@ -30,38 +29,24 @@
 		<repository>
 			<id>artifactory.ewi.tudelft.nl</id>
-			<url>https://artifactory.ewi.tudelft.nl/artifactory/libs-release</url>
+			<url>http://artifactory.ewi.tudelft.nl/artifactory/libs-release</url>
 			<snapshots>
 				<enabled>false</enabled>
 			</snapshots>
 		</repository>
+
 	</repositories>
 
-	<pluginRepositories>
-		<pluginRepository>
-			<id>central</id>
-			<url>https://repo1.maven.org/maven2</url>
-		</pluginRepository>
-		<pluginRepository>
-			<id>artifactory.ewi.tudelft.nl</id>
-			<url>https://artifactory.ewi.tudelft.nl/artifactory/libs-release</url>
-		</pluginRepository>
-	</pluginRepositories>
-
 
 	<dependencies>
-		<dependency>
-			<groupId>geniusweb</groupId>
-			<artifactId>timeline</artifactId>
-			<version>${geniusweb.version}</version>
-		</dependency>
+
 		<dependency>
 			<groupId>geniusweb</groupId>
 			<artifactId>issuevalue</artifactId>
-			<version>${geniusweb.version}</version>
+			<version>1.0.0</version>
 		</dependency>
 		<dependency>
 			<groupId>geniusweb</groupId>
 			<artifactId>references</artifactId>
-			<version>${geniusweb.version}</version>
+			<version>1.0.0</version>
 		</dependency>
 
@@ -115,6 +100,6 @@
 		<dependency>
 			<groupId>org.mockito</groupId>
-			<artifactId>mockito-core</artifactId>
-			<version>3.11.2</version>
+			<artifactId>mockito-all</artifactId>
+			<version>1.9.5</version>
 			<scope>test</scope>
 		</dependency>
@@ -123,10 +108,18 @@
 			<groupId>tudelft.utilities</groupId>
 			<artifactId>junit</artifactId>
-			<version>1.0.5</version>
+			<version>1.0.2</version>
 			<scope>test</scope>
 		</dependency>
+
 	</dependencies>
 
-	
+
+	<pluginRepositories>
+		<pluginRepository>
+			<id>jcenter</id>
+			<url>http://jcenter.bintray.com</url>
+		</pluginRepository>
+	</pluginRepositories>
+
 
 	<build>
@@ -142,22 +135,9 @@
 				</configuration>
 			</plugin>
-			<plugin>
-				<groupId>org.apache.maven.plugins</groupId>
-				<artifactId>maven-source-plugin</artifactId>
-				<version>3.1.0</version>
-				<executions>
-					<execution>
-						<id>attach-sources</id>
-						<goals>
-							<goal>jar</goal>
-						</goals>
-					</execution>
-				</executions>
-			</plugin>
 
 			<plugin>
 				<groupId>org.apache.maven.plugins</groupId>
 				<artifactId>maven-javadoc-plugin</artifactId>
-				<version>3.2.0</version>
+				<version>2.10.1</version>
 				<executions>
 					<execution>
@@ -166,4 +146,8 @@
 							<goal>jar</goal>
 						</goals>
+						<configuration>
+							<additionalparam>${javadoc.opts}</additionalparam>
+							<additionalparam>-Xdoclint:none</additionalparam>
+						</configuration>
 					</execution>
 				</executions>
@@ -173,5 +157,5 @@
 				<groupId>org.jfrog.buildinfo</groupId>
 				<artifactId>artifactory-maven-plugin</artifactId>
-				<version>3.2.3</version>
+				<version>2.6.1</version>
 				<executions>
 					<execution>
Index: /events/src/main/java/geniusweb/actions/AbstractAction.java
===================================================================
--- /events/src/main/java/geniusweb/actions/AbstractAction.java	(revision 53)
+++ /events/src/main/java/geniusweb/actions/AbstractAction.java	(revision 1)
@@ -6,5 +6,5 @@
 import com.fasterxml.jackson.annotation.JsonProperty;
 
-@JsonAutoDetect(fieldVisibility = Visibility.ANY, getterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE, isGetterVisibility = Visibility.NONE)
+@JsonAutoDetect(fieldVisibility = Visibility.ANY, getterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE)
 public class AbstractAction implements Action {
 
Index: /events/src/main/java/geniusweb/actions/Accept.java
===================================================================
--- /events/src/main/java/geniusweb/actions/Accept.java	(revision 53)
+++ /events/src/main/java/geniusweb/actions/Accept.java	(revision 1)
@@ -3,4 +3,5 @@
 import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonTypeName;
 
 import geniusweb.issuevalue.Bid;
@@ -11,4 +12,5 @@
  * {@link Offer}ed by some party.
  */
+@JsonTypeName("accept")
 public class Accept extends ActionWithBid {
 
Index: /events/src/main/java/geniusweb/actions/Action.java
===================================================================
--- /events/src/main/java/geniusweb/actions/Action.java	(revision 53)
+++ /events/src/main/java/geniusweb/actions/Action.java	(revision 1)
@@ -12,14 +12,6 @@
  */
 @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.Type(value = Comparison.class),
-		@JsonSubTypes.Type(value = ElicitComparison.class),
-		@JsonSubTypes.Type(value = Vote.class),
-		@JsonSubTypes.Type(value = Votes.class),
-		@JsonSubTypes.Type(value = VoteWithValue.class),
-		@JsonSubTypes.Type(value = VotesWithValue.class),
-		@JsonSubTypes.Type(value = LearningDone.class) })
+@JsonSubTypes({ @JsonSubTypes.Type(value = EndNegotiation.class), @JsonSubTypes.Type(value = Offer.class),
+		@JsonSubTypes.Type(value = Accept.class) })
 public interface Action {
 	/**
Index: /events/src/main/java/geniusweb/actions/ActionWithBid.java
===================================================================
--- /events/src/main/java/geniusweb/actions/ActionWithBid.java	(revision 53)
+++ /events/src/main/java/geniusweb/actions/ActionWithBid.java	(revision 1)
@@ -7,6 +7,5 @@
 
 /**
- * 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.
+ * An {@link Action} containing a bid.
  * 
  */
Index: ents/src/main/java/geniusweb/actions/Comparison.java
===================================================================
--- /events/src/main/java/geniusweb/actions/Comparison.java	(revision 53)
+++ 	(revision )
@@ -1,94 +1,0 @@
-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: ents/src/main/java/geniusweb/actions/ElicitComparison.java
===================================================================
--- /events/src/main/java/geniusweb/actions/ElicitComparison.java	(revision 53)
+++ 	(revision )
@@ -1,80 +1,0 @@
-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/main/java/geniusweb/actions/EndNegotiation.java
===================================================================
--- /events/src/main/java/geniusweb/actions/EndNegotiation.java	(revision 53)
+++ /events/src/main/java/geniusweb/actions/EndNegotiation.java	(revision 1)
@@ -3,4 +3,5 @@
 import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonTypeName;
 
 /**
@@ -8,4 +9,5 @@
  *
  */
+@JsonTypeName("endnegotiation")
 public class EndNegotiation extends AbstractAction {
 
Index: ents/src/main/java/geniusweb/actions/FileLocation.java
===================================================================
--- /events/src/main/java/geniusweb/actions/FileLocation.java	(revision 53)
+++ 	(revision )
@@ -1,109 +1,0 @@
-package geniusweb.actions;
-
-import java.io.File;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.util.UUID;
-
-import com.fasterxml.jackson.annotation.JsonCreator;
-import com.fasterxml.jackson.annotation.JsonValue;
-
-/**
- * This contains a "system independent" {@link File}. This is represented by a
- * {@link UUID}. See {@link #getFile()} to get the file referenced by this. The
- * file may or may not yet exist (depending on whether your party already wrote
- * some contents in that file in previous runs), may or may not be empty (your
- * choice), and can contain any type of data. The original intent of this is
- * that parties can store learned data in this file, while the name can be kept
- * for later re-use in later runs (eg negotiation sessions) on the same machine.
- * <p>
- * This file is to be used locally on some other machine (typically a
- * partiesserver). This object itself only contains a file name.
- * {@link #getFile()} turns it into a system-specific {@link File}. <br>
- * <h2>WARNING</h2> if used multiple times on different machines, multiple,
- * separate files will be involved, there is no magical synchronization of
- * multiple items with the same UUID used on different machines.
- */
-public class FileLocation {
-
-	@JsonValue
-	private final UUID name;
-
-	private final static String TMP = System.getProperty("java.io.tmpdir");
-	private final static String GENIUSWEB = "geniusweb";
-	private final static Path rootpath = Paths.get(TMP, GENIUSWEB);
-	private final static File rootfolder = rootpath.toFile();
-
-	/**
-	 * @param name the name of the file (must be UUID to prevent injection of
-	 *             bad filenames like /.. or C:) Use {@link #FileLocation()} to
-	 *             create new FileLocation. That should ensure a new UUID that
-	 *             does not collide with existing ones.
-	 */
-	@JsonCreator
-	public FileLocation(UUID name) {
-		if (!rootfolder.exists()) {
-			rootfolder.mkdir();
-			System.out
-					.println("created FileLocation root dir at " + rootfolder);
-		}
-
-		this.name = name;
-	}
-
-	/**
-	 * Creates a new "random" FileLocation.
-	 */
-	public FileLocation() {
-		this(UUID.randomUUID());
-	}
-
-	/**
-	 * @return the UUID string
-	 */
-	public String getUUIDString() {
-		return name.toString();
-	}
-
-	/**
-	 * 
-	 * @return Actual file that can be used for read/write operations. This file
-	 *         usually resides in the geniusweb folder inside the java.io.tmpdir
-	 *         system property. This temp dir depends on the run configuration,
-	 *         eg some directory inside the user's home directory, or a temp
-	 *         folder inside tomcat.
-	 */
-	public File getFile() {
-		return Paths.get(TMP, GENIUSWEB, name.toString()).toFile();
-	}
-
-	@Override
-	public String toString() {
-		return "FileLocation[" + name + "]";
-	}
-
-	@Override
-	public int hashCode() {
-		final int prime = 31;
-		int result = 1;
-		result = prime * result + ((name == null) ? 0 : name.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;
-		FileLocation other = (FileLocation) obj;
-		if (name == null) {
-			if (other.name != null)
-				return false;
-		} else if (!name.equals(other.name))
-			return false;
-		return true;
-	}
-}
Index: ents/src/main/java/geniusweb/actions/LearningDone.java
===================================================================
--- /events/src/main/java/geniusweb/actions/LearningDone.java	(revision 53)
+++ 	(revision )
@@ -1,20 +1,0 @@
-package geniusweb.actions;
-
-import com.fasterxml.jackson.annotation.JsonCreator;
-import com.fasterxml.jackson.annotation.JsonProperty;
-
-/**
- * The party that sends this action indicates that it's finished with the learning.
- * 
- */
-public class LearningDone extends AbstractAction { 
-	@JsonCreator
-	public LearningDone(@JsonProperty("actor") PartyId id) {
-		super(id);
-	}
-
-	@Override
-	public String toString() {
-		return "LearningDone[" + getActor() + "]";
-	}
-}
Index: /events/src/main/java/geniusweb/actions/Offer.java
===================================================================
--- /events/src/main/java/geniusweb/actions/Offer.java	(revision 53)
+++ /events/src/main/java/geniusweb/actions/Offer.java	(revision 1)
@@ -3,4 +3,5 @@
 import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonTypeName;
 
 import geniusweb.issuevalue.Bid;
@@ -11,4 +12,5 @@
  * accepts the offer himself.
  */
+@JsonTypeName("offer")
 public class Offer extends ActionWithBid {
 
Index: /events/src/main/java/geniusweb/actions/PartyId.java
===================================================================
--- /events/src/main/java/geniusweb/actions/PartyId.java	(revision 53)
+++ /events/src/main/java/geniusweb/actions/PartyId.java	(revision 1)
@@ -4,12 +4,9 @@
 
 /**
- * Unique ID of a party in a negotiation. The name should start with a short
- * string indicating the party (eg, the party name plus some machine
- * identifier), optionally followed by an "_", and more characters to make the
- * partyid unique. We require the name and "-" so that the string up to the
- * first "-" can be used to determine between sessions which opponents are
- * instances of the same class.
- * <h2>Note</h2> Normally, negotiation parties should not create new Party IDs
- * as all needed IDs should be provided by the protocol.
+ * Globally (that is, worldwide) unique ID of a party in a negotiation.
+ * Normally, negotiation parties should not create new Party IDs as all needed
+ * IDs should be provided by the protocol. Serializes only as part of a bigger
+ * object. This ID may contain parts of an ip address but that address should
+ * not be used to make contact.
  */
 public final class PartyId {
Index: ents/src/main/java/geniusweb/actions/Vote.java
===================================================================
--- /events/src/main/java/geniusweb/actions/Vote.java	(revision 53)
+++ 	(revision )
@@ -1,100 +1,0 @@
-package geniusweb.actions;
-
-import com.fasterxml.jackson.annotation.JsonCreator;
-import com.fasterxml.jackson.annotation.JsonProperty;
-
-import geniusweb.issuevalue.Bid;
-
-/**
- * A vote is an indication by a party that it conditionally accepts a bid. It's
- * then up to the protocol to determine the outcome.
- */
-public class Vote extends ActionWithBid {
-	private final Integer minPower;
-	private final Integer maxPower;
-
-	/**
-	 * @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
-	 *                 to be valid. Power is the sum of the powers of the
-	 *                 parties that are in the deal. If power=1 for all
-	 *                 participants (usually the default) power can be
-	 *                 interpreted as number of votes
-	 * @param maxPower the maximum power this bid must get in order for the vote
-	 *                 to be valid. See {@link #minPower}
-	 */
-	@JsonCreator
-	public Vote(@JsonProperty("actor") PartyId actor,
-			@JsonProperty("bid") Bid bid,
-			@JsonProperty("minPower") Integer minPower,
-			@JsonProperty("maxPower") Integer maxPower) {
-		super(actor, bid);
-		this.minPower = minPower;
-		this.maxPower = maxPower;
-		if (bid == null || minPower == null || minPower < 1 || maxPower == null
-				|| maxPower < minPower) {
-			throw new IllegalArgumentException(
-					"Vote must have non-null bid and minVotes, and minPower must be >=1 and maxPower must be >=minPower");
-		}
-	}
-
-	/**
-	 * 
-	 * @return the minimum power this bid must get in order for the vote to be
-	 *         valid.
-	 */
-	public Integer getMinPower() {
-		return minPower;
-	}
-
-	/**
-	 * 
-	 * @return the max power this bid must get in order for the vote to be
-	 *         valid.
-	 */
-
-	public Integer getMaxPower() {
-		return maxPower;
-	}
-
-	@Override
-	public String toString() {
-		return "Vote[" + getActor() + "," + getBid() + "," + minPower + ","
-				+ maxPower + "]";
-	}
-
-	@Override
-	public int hashCode() {
-		final int prime = 31;
-		int result = super.hashCode();
-		result = prime * result
-				+ ((maxPower == null) ? 0 : maxPower.hashCode());
-		result = prime * result
-				+ ((minPower == null) ? 0 : minPower.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;
-		Vote other = (Vote) obj;
-		if (maxPower == null) {
-			if (other.maxPower != null)
-				return false;
-		} else if (!maxPower.equals(other.maxPower))
-			return false;
-		if (minPower == null) {
-			if (other.minPower != null)
-				return false;
-		} else if (!minPower.equals(other.minPower))
-			return false;
-		return true;
-	}
-
-}
Index: ents/src/main/java/geniusweb/actions/VoteWithValue.java
===================================================================
--- /events/src/main/java/geniusweb/actions/VoteWithValue.java	(revision 53)
+++ 	(revision )
@@ -1,125 +1,0 @@
-package geniusweb.actions;
-
-import com.fasterxml.jackson.annotation.JsonCreator;
-import com.fasterxml.jackson.annotation.JsonProperty;
-
-import geniusweb.issuevalue.Bid;
-
-/**
- * A vote is an indication by a party that it conditionally accepts a bid. It's
- * then up to the protocol to determine the outcome.
- */
-public class VoteWithValue extends ActionWithBid {
-	private final Integer minPower;
-	private final Integer maxPower;
-	private final Integer value;
-
-	/**
-	 * @param id       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
-	 *                 to be valid. Power is the sum of the powers of the
-	 *                 parties that are in the deal. If power=1 for all
-	 *                 participants (usually the default) power can be
-	 *                 interpreted as number of votes
-	 * @param maxPower the maximum power this bid must get in order for the vote
-	 *                 to be valid. See {@link #minPower}
-	 * @param value    the value for this vote. An integer in [1,100]. Higher
-	 *                 means that the actor likes this bid better. Note: value 0
-	 *                 is reserved for "unacceptable" and therefore can not be
-	 *                 used as a valid value.
-	 */
-	@JsonCreator
-	public VoteWithValue(@JsonProperty("actor") PartyId id,
-			@JsonProperty("bid") Bid bid,
-			@JsonProperty("minPower") Integer minPower,
-			@JsonProperty("maxPower") Integer maxPower,
-			@JsonProperty("value") Integer value) {
-		super(id, bid);
-		this.minPower = minPower;
-		this.maxPower = maxPower;
-		this.value = value;
-		if (value < 1 || value > 100)
-			throw new IllegalArgumentException(
-					"value must be in [1,100] but got " + value);
-		if (bid == null || minPower == null || minPower < 1 || maxPower == null
-				|| maxPower < minPower) {
-			throw new IllegalArgumentException(
-					"Vote must have non-null bid and minVotes, and minPower must be >=1 and maxPower must be >=minPower");
-		}
-	}
-
-	/**
-	 * 
-	 * @return the minimum power this bid must get in order for the vote to be
-	 *         valid.
-	 */
-	public Integer getMinPower() {
-		return minPower;
-	}
-
-	/**
-	 * 
-	 * @return the max power this bid must get in order for the vote to be
-	 *         valid.
-	 */
-	public Integer getMaxPower() {
-		return maxPower;
-	}
-
-	/**
-	 * 
-	 * @return the value for this vote. An integer in [1,100]. Higher means that
-	 *         the actor likes this bid better.
-	 * 
-	 */
-	public Integer getValue() {
-		return value;
-	}
-
-	@Override
-	public String toString() {
-		return "VoteWithValue[" + getActor() + "," + getBid() + "," + minPower
-				+ "," + maxPower + "," + value + "]";
-	}
-
-	@Override
-	public int hashCode() {
-		final int prime = 31;
-		int result = super.hashCode();
-		result = prime * result
-				+ ((maxPower == null) ? 0 : maxPower.hashCode());
-		result = prime * result
-				+ ((minPower == null) ? 0 : minPower.hashCode());
-		result = prime * result + ((value == null) ? 0 : value.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;
-		VoteWithValue other = (VoteWithValue) obj;
-		if (maxPower == null) {
-			if (other.maxPower != null)
-				return false;
-		} else if (!maxPower.equals(other.maxPower))
-			return false;
-		if (minPower == null) {
-			if (other.minPower != null)
-				return false;
-		} else if (!minPower.equals(other.minPower))
-			return false;
-		if (value == null) {
-			if (other.value != null)
-				return false;
-		} else if (!value.equals(other.value))
-			return false;
-		return true;
-	}
-
-}
Index: ents/src/main/java/geniusweb/actions/Votes.java
===================================================================
--- /events/src/main/java/geniusweb/actions/Votes.java	(revision 53)
+++ 	(revision )
@@ -1,118 +1,0 @@
-package geniusweb.actions;
-
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Set;
-
-import com.fasterxml.jackson.annotation.JsonCreator;
-import com.fasterxml.jackson.annotation.JsonProperty;
-
-import geniusweb.issuevalue.Bid;
-
-/**
- * Indicates that a party conditionally agrees with any of the {@link Vote}s
- * provided.
- */
-public class Votes extends AbstractAction {
-	private final Set<Vote> votes;
-
-	/**
-	 * 
-	 * @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. There may be at most 1 vote per
-	 *              {@link Bid}.
-	 */
-	@JsonCreator
-	public Votes(@JsonProperty("actor") PartyId actor,
-			@JsonProperty("votes") Set<Vote> 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(actor))
-				throw new IllegalArgumentException("All votes must come from "
-						+ 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);
-		}
-	}
-
-	/**
-	 * Test if Votes extends other votes. Extending means that for each vote on
-	 * bid B with power P in othervotes, this contains also a vote for bid B
-	 * with power at most P.
-	 * 
-	 * @param otherVotes the {@link Votes}, usually from a previous round, that
-	 *                   this should extend.
-	 * @return true iff this extends the otherVotes.
-	 */
-	public boolean isExtending(Votes otherVotes) {
-		if (!otherVotes.getActor().equals(getActor()))
-			return false;
-		for (Vote vote : otherVotes.getVotes()) {
-			Vote myvote = getVote(vote.getBid());
-			if (myvote == null || myvote.getMinPower() > vote.getMinPower()
-					|| myvote.getMaxPower() < vote.getMaxPower())
-				return false;
-		}
-		return true;
-	}
-
-	/**
-	 * 
-	 * @param bid the bid that we may have a vote for
-	 * @return myvote for bid, or null if no vote for that bid;
-	 */
-	public Vote getVote(Bid bid) {
-		for (Vote vote : votes) {
-			if (vote.getBid().equals(bid))
-				return vote;
-		}
-		return null;
-	}
-
-	public Set<Vote> getVotes() {
-		return Collections.unmodifiableSet(votes);
-	}
-
-	@Override
-	public int hashCode() {
-		final int prime = 31;
-		int result = super.hashCode();
-		result = prime * result + ((votes == null) ? 0 : votes.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;
-		Votes other = (Votes) obj;
-		if (votes == null) {
-			if (other.votes != null)
-				return false;
-		} else if (!votes.equals(other.votes))
-			return false;
-		return true;
-	}
-
-	@Override
-	public String toString() {
-		return "Votes[" + getActor() + "," + votes + "]";
-	}
-}
Index: ents/src/main/java/geniusweb/actions/VotesWithValue.java
===================================================================
--- /events/src/main/java/geniusweb/actions/VotesWithValue.java	(revision 53)
+++ 	(revision )
@@ -1,125 +1,0 @@
-package geniusweb.actions;
-
-import java.util.Collections;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Optional;
-import java.util.Set;
-import java.util.stream.Collectors;
-
-import com.fasterxml.jackson.annotation.JsonCreator;
-import com.fasterxml.jackson.annotation.JsonProperty;
-
-import geniusweb.issuevalue.Bid;
-
-/**
- * Indicates that a party conditionally agrees with any of the
- * {@link VoteWithValue}s provided.
- */
-public class VotesWithValue extends AbstractAction {
-	private final Set<VoteWithValue> votes;
-
-	/**
-	 * 
-	 * @param id    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. The sum of the values must =100.
-	 */
-	@JsonCreator
-	public VotesWithValue(@JsonProperty("actor") PartyId id,
-			@JsonProperty("votes") Set<VoteWithValue> votes) {
-		super(id);
-		this.votes = votes;
-		if (votes == null)
-			throw new NullPointerException("votes must be not null");
-		for (VoteWithValue vote : votes) {
-			if (!vote.getActor().equals(id)) {
-				throw new IllegalArgumentException("All votes must come from "
-						+ id + " but found " + vote);
-			}
-		}
-		if (votes.stream().map(v -> v.getValue()).reduce(0,
-				Integer::sum) != 100)
-			throw new IllegalArgumentException(
-					"Sum of the placed votes must be 100");
-		// 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());
-	}
-
-	/**
-	 * Test if Votes extends other votes. Extending means that for each vote on
-	 * bid B with power P in othervotes, this contains also a vote for bid B
-	 * with power at most P.
-	 * 
-	 * @param otherVotes the {@link VotesWithValue}, usually from a previous
-	 *                   round, that this should extend.
-	 * @return true iff this extends the otherVotes.
-	 */
-	public boolean isExtending(VotesWithValue otherVotes) {
-		if (!otherVotes.getActor().equals(getActor()))
-			return false;
-		for (VoteWithValue vote : otherVotes.getVotes()) {
-			VoteWithValue myvote = getVote(vote.getBid());
-			if (myvote == null || myvote.getMinPower() > vote.getMinPower()
-					|| myvote.getMaxPower() < vote.getMaxPower())
-				return false;
-		}
-		return true;
-	}
-
-	/**
-	 * 
-	 * @param bid the bid that we may have a vote for
-	 * @return myvote for bid, or null if no vote for that bid;
-	 */
-	public VoteWithValue getVote(Bid bid) {
-		for (VoteWithValue vote : votes) {
-			if (vote.getBid().equals(bid))
-				return vote;
-		}
-		return null;
-	}
-
-	public Set<VoteWithValue> getVotes() {
-		return Collections.unmodifiableSet(votes);
-	}
-
-	@Override
-	public int hashCode() {
-		final int prime = 31;
-		int result = super.hashCode();
-		result = prime * result + ((votes == null) ? 0 : votes.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;
-		VotesWithValue other = (VotesWithValue) obj;
-		if (votes == null) {
-			if (other.votes != null)
-				return false;
-		} else if (!votes.equals(other.votes))
-			return false;
-		return true;
-	}
-
-	@Override
-	public String toString() {
-		return "VotesWithValue[" + getActor() + "," + votes + "]";
-	}
-}
Index: /events/src/main/java/geniusweb/events/ActionEvent.java
===================================================================
--- /events/src/main/java/geniusweb/events/ActionEvent.java	(revision 53)
+++ /events/src/main/java/geniusweb/events/ActionEvent.java	(revision 1)
@@ -3,4 +3,5 @@
 import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonTypeName;
 
 import geniusweb.actions.Action;
@@ -10,4 +11,5 @@
  *
  */
+@JsonTypeName("actionevent")
 public class ActionEvent extends AbstractEvent {
 
@@ -16,5 +18,5 @@
 	/**
 	 * 
-	 * @param action the {@link Action} that was done
+	 * @param action
 	 * @param time   the current time to use. see
 	 *               {@link System#currentTimeMillis()}.
Index: /events/src/main/java/geniusweb/events/CurrentState.java
===================================================================
--- /events/src/main/java/geniusweb/events/CurrentState.java	(revision 53)
+++ /events/src/main/java/geniusweb/events/CurrentState.java	(revision 1)
@@ -20,9 +20,4 @@
  */
 public abstract class CurrentState extends ProtocolEvent {
-	public CurrentState() {
-	}
-
-	public CurrentState(Long now) {
-		super(now);
-	}
+	// all should implement NegoState getState();
 }
Index: /events/src/main/java/geniusweb/events/NegotiationEvent.java
===================================================================
--- /events/src/main/java/geniusweb/events/NegotiationEvent.java	(revision 53)
+++ /events/src/main/java/geniusweb/events/NegotiationEvent.java	(revision 1)
@@ -6,6 +6,4 @@
 import com.fasterxml.jackson.annotation.JsonTypeInfo;
 import com.fasterxml.jackson.annotation.JsonTypeInfo.As;
-
-import geniusweb.actions.Action;
 
 /**
Index: /events/src/main/java/geniusweb/events/SessionStarted.java
===================================================================
--- /events/src/main/java/geniusweb/events/SessionStarted.java	(revision 53)
+++ /events/src/main/java/geniusweb/events/SessionStarted.java	(revision 1)
@@ -5,7 +5,9 @@
 import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonTypeName;
 
 import geniusweb.actions.PartyId;
 
+@JsonTypeName("sessionstarted")
 public class SessionStarted extends ProtocolEvent {
 	private Long sessionNumber;
Index: /events/src/main/java/geniusweb/events/TournamentStarted.java
===================================================================
--- /events/src/main/java/geniusweb/events/TournamentStarted.java	(revision 53)
+++ /events/src/main/java/geniusweb/events/TournamentStarted.java	(revision 1)
@@ -1,4 +1,7 @@
 package geniusweb.events;
 
+import com.fasterxml.jackson.annotation.JsonTypeName;
+
+@JsonTypeName("tournamentstarted")
 public class TournamentStarted extends ProtocolEvent {
 	private Long numberOfSessions;
Index: /events/src/test/java/actions/AcceptTest.java
===================================================================
--- /events/src/test/java/actions/AcceptTest.java	(revision 1)
+++ /events/src/test/java/actions/AcceptTest.java	(revision 1)
@@ -0,0 +1,94 @@
+package actions;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.LinkedList;
+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.Accept;
+import geniusweb.actions.Action;
+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 AcceptTest extends GeneralTests<Accept> {
+	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 = "{\"accept\":{\"actor\":\"party1\",\"bid\":{\"issuevalues\":{\"issue2\":10,\"issue1\":\"value1\"}}}}";
+
+	private static Accept accept, accept1, accept2, acceptb;
+
+	static {
+		issuevalues.put(ISSUE1, VALUE1);
+		issuevalues.put(ISSUE2, VALUE2);
+		bid = new Bid(issuevalues);
+		accept = new Accept(id, bid);
+		accept1 = new Accept(id, bid);
+
+		accept2 = new Accept(id2, bid);
+
+		// values swapped, so different issuevalues.
+		issuevaluesb.put(ISSUE1, VALUE2);
+		issuevaluesb.put(ISSUE2, VALUE2);
+		bidb = new Bid(issuevaluesb);
+		acceptb = new Accept(id, bidb);
+
+	}
+
+	@Override
+	public List<List<Accept>> getGeneralTestData() {
+		List<List<Accept>> list = new LinkedList<>();
+		list.add(Arrays.asList(accept, accept1));
+		list.add(Arrays.asList(accept2));
+		list.add(Arrays.asList(acceptb));
+		return list;
+	}
+
+	@Override
+	public List<String> getGeneralTestStrings() {
+		return Arrays.asList("Accept.*" + id + ".*]", "Accept.*" + id2 + ".*]",
+				"Accept.*" + id + ".*]");
+	}
+
+	@Before
+	public void before() {
+
+	}
+
+	@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/EndNegoTest.java
===================================================================
--- /events/src/test/java/actions/EndNegoTest.java	(revision 1)
+++ /events/src/test/java/actions/EndNegoTest.java	(revision 1)
@@ -0,0 +1,53 @@
+package actions;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.List;
+
+import org.junit.Test;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import geniusweb.actions.Action;
+import geniusweb.actions.EndNegotiation;
+import geniusweb.actions.PartyId;
+import tudelft.utilities.junit.GeneralTests;
+
+public class EndNegoTest extends GeneralTests<EndNegotiation> {
+	private final ObjectMapper jackson = new ObjectMapper();
+
+	private final PartyId id = new PartyId("party1");
+	private final PartyId idb = new PartyId("party2");
+
+	private final EndNegotiation endnego = new EndNegotiation(id);
+	private final EndNegotiation endnego1 = new EndNegotiation(id);
+	private final EndNegotiation endnegob = new EndNegotiation(idb);
+
+	private final String endnegostring = "{\"endnegotiation\":{\"actor\":\"party1\"}}";
+
+	@Override
+	public List<List<EndNegotiation>> getGeneralTestData() {
+		return Arrays.asList(Arrays.asList(endnego, endnego1), Arrays.asList(endnegob));
+	}
+
+	@Override
+	public List<String> getGeneralTestStrings() {
+		return Arrays.asList("EndNegotiation\\[.*" + id + ".*\\]", "EndNegotiation\\[.*" + idb + ".*\\]");
+	}
+
+	@Test
+	public void serializeEndNegoTest() throws JsonProcessingException {
+		System.out.println(jackson.writeValueAsString(endnego));
+		assertEquals(endnegostring, jackson.writeValueAsString(endnego));
+	}
+
+	@Test
+	public void deserializeEndNegoTest() throws IOException {
+		Action act = jackson.readValue(endnegostring, Action.class);
+		assertEquals(endnego, act);
+	}
+
+}
Index: /events/src/test/java/actions/OfferTest.java
===================================================================
--- /events/src/test/java/actions/OfferTest.java	(revision 1)
+++ /events/src/test/java/actions/OfferTest.java	(revision 1)
@@ -0,0 +1,82 @@
+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.Test;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import geniusweb.actions.Action;
+import geniusweb.actions.Offer;
+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 OfferTest extends GeneralTests<Offer> {
+	private final ObjectMapper jackson = new ObjectMapper();
+
+	private static final PartyId id = new PartyId("party1");
+	private static final Map<String, Value> issuevalues = new HashMap<String, Value>();
+	private static final Map<String, Value> issuevaluesb = new HashMap<String, Value>();
+	private static Bid bid;
+	private static Bid bidb;
+	private static final String ISSUE1 = "issue1";
+	private static final Value VALUE1 = new DiscreteValue("value1");
+	private static final String ISSUE2 = "issue2";
+	private static final Value VALUE2 = new NumberValue("10");
+	private static final String acceptstring = "{\"offer\":{\"actor\":\"party1\",\"bid\":{\"issuevalues\":{\"issue2\":10,\"issue1\":\"value1\"}}}}";
+
+	private static Offer offer;
+	private static Offer offer1;
+	private static Offer offerb;
+
+	static {
+		issuevalues.put(ISSUE1, VALUE1);
+		issuevalues.put(ISSUE2, VALUE2);
+		bid = new Bid(issuevalues);
+		offer = new Offer(id, bid);
+		offer1 = new Offer(id, bid);
+
+		// values swapped, so different issuevalues.
+		issuevaluesb.put(ISSUE1, VALUE2);
+		issuevaluesb.put(ISSUE2, VALUE2);
+		bidb = new Bid(issuevaluesb);
+		offerb = new Offer(id, bidb);
+
+	}
+
+	@Override
+	public List<List<Offer>> getGeneralTestData() {
+		return Arrays.asList(Arrays.asList(offer, offer1),
+				Arrays.asList(offerb));
+	}
+
+	@Override
+	public List<String> getGeneralTestStrings() {
+		return Arrays.asList("Offer\\[.*" + id + ".*Bid.*\\]",
+				"Offer\\[.*" + id + ".*Bid.*\\]");
+	}
+
+	@Test
+	public void serializeAcceptTest() throws JsonProcessingException {
+		System.out.println(jackson.writeValueAsString(offer));
+		assertEquals(acceptstring, jackson.writeValueAsString(offer));
+	}
+
+	@Test
+	public void deserializeAcceptTest() throws IOException {
+		Action act = jackson.readValue(acceptstring, Action.class);
+		assertEquals(offer, act);
+	}
+
+}
Index: /events/src/test/java/actions/PartyIdTest.java
===================================================================
--- /events/src/test/java/actions/PartyIdTest.java	(revision 1)
+++ /events/src/test/java/actions/PartyIdTest.java	(revision 1)
@@ -0,0 +1,68 @@
+package actions;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.junit.Test;
+
+import geniusweb.actions.PartyId;
+import tudelft.utilities.junit.GeneralTests;
+
+public class PartyIdTest extends GeneralTests<PartyId> {
+	private final PartyId id = new PartyId("party1");
+	private final PartyId id1 = new PartyId("party1");
+	private final PartyId idb = new PartyId("party2");
+
+	@Override
+	public List<List<PartyId>> getGeneralTestData() {
+		return Arrays.asList(Arrays.asList(id, id1), Arrays.asList(idb));
+	}
+
+	@Override
+	public List<String> getGeneralTestStrings() {
+		return Arrays.asList("party1", "party2");
+	}
+
+	@Test(expected = IllegalArgumentException.class)
+	public void testRestrictions() {
+		new PartyId("");
+	}
+
+	@Test(expected = IllegalArgumentException.class)
+	public void testRestrictions2() {
+		new PartyId("@2");
+	}
+
+	@Test(expected = IllegalArgumentException.class)
+	public void testRestrictions3() {
+		new PartyId("_12");
+	}
+
+	@Test(expected = IllegalArgumentException.class)
+	public void testRestrictions4() {
+		new PartyId("12A");
+	}
+
+	@Test(expected = IllegalArgumentException.class)
+	public void testRestrictions5() {
+		new PartyId(" fds ");
+	}
+
+	@Test
+	public void testGetName() {
+		assertEquals("party1", id.getName());
+	}
+
+	@Test
+	public void testRestrictions6() {
+		new PartyId("A_1_23_ok");
+	}
+
+	@Test
+	public void testRestrictions7() {
+		new PartyId("a_1_23_ok");
+	}
+
+}
Index: /events/src/test/java/actions/PartyIdTest1.java
===================================================================
--- /events/src/test/java/actions/PartyIdTest1.java	(revision 1)
+++ /events/src/test/java/actions/PartyIdTest1.java	(revision 1)
@@ -0,0 +1,73 @@
+package actions;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.IOException;
+import java.net.URISyntaxException;
+import java.util.Arrays;
+import java.util.List;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import com.fasterxml.jackson.core.JsonParseException;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.JsonMappingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import geniusweb.actions.PartyId;
+import tudelft.utilities.junit.GeneralTests;
+
+public class PartyIdTest1 extends GeneralTests<PartyId> {
+
+	private PartyId party1, party1a, party2, party3;
+	private String asJson = "\"party1\"";
+
+	@Before
+	public void before() throws URISyntaxException {
+		party1 = new PartyId("party1");
+		party1a = new PartyId("party1");
+		party2 = new PartyId("party2");
+		party3 = new PartyId("party3");
+	}
+
+	@Override
+	public List<List<PartyId>> getGeneralTestData() {
+		return Arrays.asList(Arrays.asList(party1, party1a),
+				Arrays.asList(party2), Arrays.asList(party3));
+	}
+
+	@Override
+	public List<String> getGeneralTestStrings() {
+		return Arrays.asList("party1", "party2", "party3");
+	}
+
+	@Test(expected = IllegalArgumentException.class)
+	public void smokeTest() throws URISyntaxException {
+		new PartyId("*Csh789&@#^!^@^&");
+	}
+
+	@Test(expected = IllegalArgumentException.class)
+	public void nullTest() throws URISyntaxException {
+		new PartyId(null);
+	}
+
+	@Test
+	public void testSerialize() throws JsonProcessingException {
+		ObjectMapper jackson = new ObjectMapper();
+
+		String json = jackson.writeValueAsString(party1);
+		System.out.println(json);
+		assertEquals(asJson, json);
+	}
+
+	@Test
+	public void testDeserialize()
+			throws JsonParseException, JsonMappingException, IOException {
+		ObjectMapper jackson = new ObjectMapper();
+		PartyId p = jackson.readValue(asJson, PartyId.class);
+		System.out.println(p);
+		assertEquals(party1, p);
+	}
+
+}
Index: /events/src/test/java/events/ActionEventTest.java
===================================================================
--- /events/src/test/java/events/ActionEventTest.java	(revision 1)
+++ /events/src/test/java/events/ActionEventTest.java	(revision 1)
@@ -0,0 +1,73 @@
+package events;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Mockito.mock;
+
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.List;
+
+import org.junit.Test;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import geniusweb.actions.Action;
+import geniusweb.actions.EndNegotiation;
+import geniusweb.actions.PartyId;
+import geniusweb.events.ActionEvent;
+import geniusweb.events.NegotiationEvent;
+import tudelft.utilities.junit.GeneralTests;
+
+public class ActionEventTest extends GeneralTests<ActionEvent> {
+	private static final long NOW = 101l;
+	private final ObjectMapper jackson = new ObjectMapper();
+	private final String string = "{\"actionevent\":{\"action\":{\"endnegotiation\":{\"actor\":\"party1\"}},\"time\":101}}";
+	private final PartyId id = new PartyId("party1");
+	private final Action action = new EndNegotiation(id);
+	private final ActionEvent evt = new ActionEvent(action, NOW);
+	private final ActionEvent evt1 = new ActionEvent(action, NOW);
+	private final ActionEvent evtb = new ActionEvent(action, NOW + 1);
+
+	@Override
+	public List<List<ActionEvent>> getGeneralTestData() {
+		return Arrays.asList(Arrays.asList(evt, evt1), Arrays.asList(evtb));
+	}
+
+	@Override
+	public List<String> getGeneralTestStrings() {
+		return Arrays.asList("ActionEvent\\[.*" + NOW + ".*EndNegotiation.*\\]",
+				"ActionEvent\\[.*" + (NOW + 1) + ".*EndNegotiation.*\\]");
+	}
+
+	@Test
+	public void smoketest() {
+		Action action = mock(EndNegotiation.class);
+		ActionEvent evt = new ActionEvent(action, 0l);
+	}
+
+	@Test
+	public void serializeTest() throws JsonProcessingException {
+		System.out.println(jackson.writeValueAsString(evt));
+		assertEquals(string, jackson.writeValueAsString(evt));
+	}
+
+	@Test
+	public void deserializeTestReadActionEvent() throws IOException {
+		ActionEvent evt1 = jackson.readValue(string, ActionEvent.class);
+		// compare fields, as evt is a derived/new inner class
+		assertEquals(EndNegotiation.class, evt1.getAction().getClass());
+		assertEquals((Long) 101l, evt1.getTime());
+	}
+
+	@Test
+	public void deserializeTestReadEvent() throws IOException {
+		NegotiationEvent evt1 = jackson.readValue(string,
+				NegotiationEvent.class);
+		assertEquals(ActionEvent.class, evt1.getClass());
+		ActionEvent ev1 = (ActionEvent) evt1;
+		assertEquals(EndNegotiation.class, ev1.getAction().getClass());
+		assertEquals((Long) 101l, ev1.getTime());
+	}
+
+}
Index: /events/src/test/java/events/SessionStartedTest.java
===================================================================
--- /events/src/test/java/events/SessionStartedTest.java	(revision 1)
+++ /events/src/test/java/events/SessionStartedTest.java	(revision 1)
@@ -0,0 +1,97 @@
+package events;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.LinkedList;
+import java.util.List;
+
+import org.junit.Test;
+import org.junit.experimental.theories.DataPoint;
+import org.junit.experimental.theories.DataPoints;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import geniusweb.actions.PartyId;
+import geniusweb.events.NegotiationEvent;
+import geniusweb.events.SessionStarted;
+import tudelft.utilities.junit.GeneralTests;
+
+public class SessionStartedTest extends GeneralTests<SessionStarted> {
+
+	private final ObjectMapper jackson = new ObjectMapper();
+
+	private static final Long SESSIONNR = 1l;
+	protected static final Long NOW = (long) 101;
+	protected static final Long NOW1 = NOW + 1;
+
+	private static final PartyId PARTY1 = new PartyId("party1");
+	private static final PartyId PARTY2 = new PartyId("party2");
+
+	private static List<PartyId> parties = Arrays.asList(PARTY1, PARTY2);
+
+	private static final SessionStarted sessionStartedLater = new SessionStarted(
+			SESSIONNR, parties, NOW1);
+	private static final SessionStarted othersessionStarted = new SessionStarted(
+			SESSIONNR + 1, parties, NOW);
+
+	public static SessionStarted sessionStarted = new SessionStarted(SESSIONNR,
+			parties, NOW);
+	private static final SessionStarted sessionStarted1 = new SessionStarted(
+			SESSIONNR, parties, NOW);
+	// jackson expected format.
+	private static String sessionstartedstring = "{\"sessionstarted\":{\"sessionNumber\":1,\"parties\":[\"party1\",\"party2\"],\"time\":101}}";
+	// "{\"sessionstarted\":{\"time\":101,\"sessionNumber\":1,\"parties\":[\"party1\",\"party2\"]}}";
+	public static String expectedstring = "SessionStarted.*101.*";
+
+	@Override
+	public List<List<SessionStarted>> getGeneralTestData() {
+		List<List<SessionStarted>> list = new LinkedList<>();
+		list.add(Arrays.asList(sessionStarted, sessionStarted1));
+		list.add(Arrays.asList(sessionStartedLater));
+		list.add(Arrays.asList(othersessionStarted));
+		return list;
+	}
+
+	@Override
+	public List<String> getGeneralTestStrings() {
+		return Arrays.asList("SessionStarted.*" + SESSIONNR + ".*" + NOW + ".*",
+				"SessionStarted.*" + SESSIONNR + ".*" + NOW1 + ".*",
+				"SessionStarted.*" + (SESSIONNR + 1) + ".*" + NOW + ".*");
+	}
+
+	@DataPoints("equal")
+	public static SessionStarted[] equal() {
+		return new SessionStarted[] { sessionStarted, sessionStarted1 };
+	}
+
+	@DataPoints("notequal")
+	public static SessionStarted[] notequal() {
+		return new SessionStarted[] { sessionStartedLater,
+				sessionStartedLater };
+	}
+
+	@DataPoint("equalstring")
+
+	@Test
+	public void serializeStartedTest() throws JsonProcessingException {
+		System.out.println(jackson.writeValueAsString(sessionStarted));
+		assertEquals(sessionstartedstring,
+				jackson.writeValueAsString(sessionStarted));
+	}
+
+	@Test
+	public void deserializeStartedTest() throws IOException {
+		NegotiationEvent evt = jackson.readValue(sessionstartedstring,
+				NegotiationEvent.class);
+		assertEquals(SessionStarted.class, evt.getClass());
+		SessionStarted event = (SessionStarted) evt;
+		// compare fields, as sessionended is a derived/new inner class
+		assertEquals(NOW, event.getTime());
+		assertEquals(SESSIONNR, event.getSessionNumber());
+		assertEquals(2, event.getParties().size());
+	}
+
+}
Index: /events/src/test/java/events/TournamentStartedTest.java
===================================================================
--- /events/src/test/java/events/TournamentStartedTest.java	(revision 1)
+++ /events/src/test/java/events/TournamentStartedTest.java	(revision 1)
@@ -0,0 +1,77 @@
+package events;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.LinkedList;
+import java.util.List;
+
+import org.junit.Test;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import geniusweb.events.NegotiationEvent;
+import geniusweb.events.TournamentStarted;
+import tudelft.utilities.junit.GeneralTests;
+
+public class TournamentStartedTest extends GeneralTests<TournamentStarted> {
+
+	private final ObjectMapper jackson = new ObjectMapper();
+
+	private static final Long SESSIONNR = 1l;
+	protected static final Long NOW = (long) 101;
+	protected static final Long NOW1 = NOW + 1;
+	private static final Long NSESSIONS = 5l;
+
+	private static TournamentStarted tournamentStarted = new TournamentStarted(NSESSIONS, NOW);
+	private static TournamentStarted tournamentStarteda = new TournamentStarted(NSESSIONS, NOW);
+	private TournamentStarted otherTournamentStarted = new TournamentStarted(NSESSIONS + 1, NOW);
+	private TournamentStarted tournamentStartedLater = new TournamentStarted(NSESSIONS, NOW1);
+
+	private String tournamentstartedstring = "{\"tournamentstarted\":{\"time\":101,\"numberOfSessions\":5}}";
+
+	@Override
+	public List<List<TournamentStarted>> getGeneralTestData() {
+		List<List<TournamentStarted>> list = new LinkedList<>();
+		list.add(Arrays.asList(tournamentStarted, tournamentStarteda));
+		list.add(Arrays.asList(otherTournamentStarted));
+		list.add(Arrays.asList(tournamentStartedLater));
+		return list;
+	}
+
+	@Override
+	public List<String> getGeneralTestStrings() {
+		return Arrays.asList("TournamentStarted\\[.*" + NOW + ".*" + NSESSIONS + ".*\\]",
+				"TournamentStarted\\[.*" + NOW + ".*" + (NSESSIONS + 1) + ".*\\]",
+				"TournamentStarted\\[.*" + NOW1 + ".*" + NSESSIONS + ".*\\]");
+	}
+
+	@Test
+	public void serializeTournamentStartedTest() throws JsonProcessingException {
+		System.out.println(jackson.writeValueAsString(tournamentStarted));
+		assertEquals(tournamentstartedstring, jackson.writeValueAsString(tournamentStarted));
+	}
+
+	@Test
+	public void deserializeTournamentStartedTest() throws IOException {
+		NegotiationEvent evt = jackson.readValue(tournamentstartedstring, NegotiationEvent.class);
+		assertEquals(TournamentStarted.class, evt.getClass());
+		TournamentStarted event = (TournamentStarted) evt;
+		// compare fields, as sessionended is a derived/new inner class
+		assertEquals(NSESSIONS, event.getNumberOfSessions());
+		assertEquals(NOW, event.getTime());
+	}
+
+	@Test(expected = IllegalArgumentException.class)
+	public void testNullTime() {
+		new TournamentStarted(NSESSIONS, null);
+	}
+
+	@Test(expected = IllegalArgumentException.class)
+	public void testNegativeTime() {
+		new TournamentStarted(NSESSIONS, -1l);
+	}
+
+}
Index: /exampleparties/pom.xml
===================================================================
--- /exampleparties/pom.xml	(revision 53)
+++ /exampleparties/pom.xml	(revision 1)
@@ -12,5 +12,5 @@
 	<properties>
 		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-		<jackson-2-version>2.12.3</jackson-2-version>
+		<jackson-2-version>2.9.6</jackson-2-version>
 	</properties>
 
@@ -18,14 +18,4 @@
 		<module>randomparty</module>
 		<module>randompartypy</module>
-		<module>timedependentparty</module>
-		<module>conceder</module>
-		<module>hardliner</module>
-		<module>boulware</module>
-		<module>humangui</module>
-		<module>linear</module>
-		<module>simpleshaop</module>
-		<module>comparebids</module>
-		<module>anac2019</module>
-		<module>simpleboa</module>
 	</modules>
 </project>
Index: /exampleparties/randomparty/pom.xml
===================================================================
--- /exampleparties/randomparty/pom.xml	(revision 53)
+++ /exampleparties/randomparty/pom.xml	(revision 1)
@@ -6,5 +6,5 @@
 	<groupId>geniusweb.exampleparties</groupId>
 	<artifactId>randomparty</artifactId>
-	<version>2.2.1</version>  <!-- equals the geniusweb version -->
+	<version>1.0.0</version>
 	<packaging>jar</packaging>
 
@@ -16,6 +16,5 @@
 		<basedir>.</basedir>
 		<passwd>${env.ARTIFACTORY_PASS}</passwd>
-		<jackson-2-version>2.12.3</jackson-2-version>
-		<geniusweb.version>${project.version}</geniusweb.version>
+		<jackson-2-version>2.9.6</jackson-2-version>
 	</properties>
 
@@ -23,5 +22,5 @@
 		<repository>
 			<id>artifactory.ewi.tudelft.nl</id>
-			<url>https://artifactory.ewi.tudelft.nl/artifactory/libs-release</url>
+			<url>http://artifactory.ewi.tudelft.nl/artifactory/libs-release</url>
 		</repository>
 	</distributionManagement>
@@ -34,5 +33,5 @@
 			<groupId>geniusweb</groupId>
 			<artifactId>party</artifactId>
-			<version>${geniusweb.version}</version>
+			<version>1.0.0</version>
 		</dependency>
 
@@ -40,20 +39,20 @@
 			<groupId>geniusweb</groupId>
 			<artifactId>bidspace</artifactId>
-			<version>${geniusweb.version}</version>
+			<version>1.0.0</version>
+		</dependency>
+		<dependency>
+			<groupId>tudelft.utilities</groupId>
+			<artifactId>logging</artifactId>
+			<version>1.0.0</version>
 		</dependency>
 		<dependency>
 			<groupId>geniusweb</groupId>
 			<artifactId>profileconnection</artifactId>
-			<version>${geniusweb.version}</version>
+			<version>1.0.0</version>
 		</dependency>
 		<dependency>
 			<groupId>tudelft.utilities</groupId>
-			<artifactId>logging</artifactId>
-			<version>1.0.1</version>
-		</dependency>
-		<dependency>
-			<groupId>tudelft.utilities</groupId>
-			<artifactId>utilities</artifactId>
-			<version>1.3.1</version>
+			<artifactId>immutablelist</artifactId>
+			<version>1.0.0</version>
 		</dependency>
 
@@ -113,6 +112,6 @@
 		<dependency>
 			<groupId>org.mockito</groupId>
-			<artifactId>mockito-core</artifactId>
-			<version>3.11.2</version>
+			<artifactId>mockito-all</artifactId>
+			<version>1.9.5</version>
 			<scope>test</scope>
 		</dependency>
@@ -120,5 +119,5 @@
 			<groupId>tudelft.utilities</groupId>
 			<artifactId>junit</artifactId>
-			<version>1.0.5</version>
+			<version>1.0.1</version>
 			<scope>test</scope>
 		</dependency>
@@ -130,19 +129,16 @@
 		<repository>
 			<id>artifactory.ewi.tudelft.nl</id>
-			<url>https://artifactory.ewi.tudelft.nl/artifactory/libs-release</url>
+			<url>http://artifactory.ewi.tudelft.nl/artifactory/libs-release</url>
 			<snapshots>
 				<enabled>false</enabled>
 			</snapshots>
 		</repository>
+
 	</repositories>
 
 	<pluginRepositories>
 		<pluginRepository>
-			<id>central</id>
-			<url>https://repo1.maven.org/maven2</url>
-		</pluginRepository>
-		<pluginRepository>
-			<id>artifactory.ewi.tudelft.nl</id>
-			<url>https://artifactory.ewi.tudelft.nl/artifactory/libs-release</url>
+			<id>jcenter</id>
+			<url>http://jcenter.bintray.com</url>
 		</pluginRepository>
 	</pluginRepositories>
@@ -161,22 +157,8 @@
 				</configuration>
 			</plugin>
-			<plugin>
-				<groupId>org.apache.maven.plugins</groupId>
-				<artifactId>maven-source-plugin</artifactId>
-				<version>3.1.0</version>
-				<executions>
-					<execution>
-						<id>attach-sources</id>
-						<goals>
-							<goal>jar</goal>
-						</goals>
-					</execution>
-				</executions>
-			</plugin>
 
 			<plugin>
 				<groupId>org.apache.maven.plugins</groupId>
 				<artifactId>maven-jar-plugin</artifactId>
-				<version>3.2.0</version>
 				<configuration>
 					<archive>
@@ -191,5 +173,5 @@
 				<groupId>org.apache.maven.plugins</groupId>
 				<artifactId>maven-javadoc-plugin</artifactId>
-				<version>3.2.0</version>
+				<version>2.10.1</version>
 				<executions>
 					<execution>
@@ -198,4 +180,8 @@
 							<goal>jar</goal>
 						</goals>
+						<configuration>
+							<additionalparam>${javadoc.opts}</additionalparam>
+							<additionalparam>-Xdoclint:none</additionalparam>
+						</configuration>
 					</execution>
 				</executions>
@@ -205,5 +191,5 @@
 				<groupId>org.jfrog.buildinfo</groupId>
 				<artifactId>artifactory-maven-plugin</artifactId>
-				<version>3.2.3</version>
+				<version>2.6.1</version>
 				<executions>
 					<execution>
Index: /exampleparties/randomparty/src/main/java/geniusweb/exampleparties/randomparty/RandomParty.java
===================================================================
--- /exampleparties/randomparty/src/main/java/geniusweb/exampleparties/randomparty/RandomParty.java	(revision 53)
+++ /exampleparties/randomparty/src/main/java/geniusweb/exampleparties/randomparty/RandomParty.java	(revision 1)
@@ -3,62 +3,35 @@
 import java.io.IOException;
 import java.math.BigInteger;
+import java.net.URI;
+import java.net.URISyntaxException;
 import java.util.Arrays;
-import java.util.Collections;
 import java.util.HashSet;
-import java.util.List;
 import java.util.Random;
-import java.util.Set;
 import java.util.logging.Level;
-import java.util.stream.Collectors;
 
 import geniusweb.actions.Accept;
 import geniusweb.actions.Action;
-import geniusweb.actions.LearningDone;
 import geniusweb.actions.Offer;
 import geniusweb.actions.PartyId;
-import geniusweb.actions.Vote;
-import geniusweb.actions.VoteWithValue;
-import geniusweb.actions.Votes;
-import geniusweb.actions.VotesWithValue;
 import geniusweb.bidspace.AllPartialBidsList;
-import geniusweb.inform.ActionDone;
-import geniusweb.inform.Finished;
-import geniusweb.inform.Inform;
-import geniusweb.inform.OptIn;
-import geniusweb.inform.OptInWithValue;
-import geniusweb.inform.Settings;
-import geniusweb.inform.Voting;
-import geniusweb.inform.YourTurn;
 import geniusweb.issuevalue.Bid;
 import geniusweb.party.Capabilities;
 import geniusweb.party.DefaultParty;
-import geniusweb.profile.PartialOrdering;
-import geniusweb.profile.Profile;
-import geniusweb.profile.utilityspace.UtilitySpace;
+import geniusweb.party.inform.ActionDone;
+import geniusweb.party.inform.Finished;
+import geniusweb.party.inform.Inform;
+import geniusweb.party.inform.Settings;
+import geniusweb.party.inform.YourTurn;
+import geniusweb.profile.utilityspace.LinearAdditiveUtilitySpace;
 import geniusweb.profileconnection.ProfileConnectionFactory;
 import geniusweb.profileconnection.ProfileInterface;
 import geniusweb.progress.Progress;
 import geniusweb.progress.ProgressRounds;
+import geniusweb.references.ProtocolRef;
 import tudelft.utilities.logging.Reporter;
 
 /**
- * A party that places random bids and accepts when it receives an offer with
- * sufficient utility. This party is also a demo on how to support the various
- * protocols, which causes this party to look a bit complex.
- * 
- * <h2>parameters</h2>
- * <table >
- * <caption>parameters</caption>
- * <tr>
- * <td>minPower</td>
- * <td>This value is used as minPower for placed {@link Vote}s. Default value is
- * 2.</td>
- * </tr>
- * <tr>
- * <td>maxPower</td>
- * <td>This value is used as maxPower for placed {@link Vote}s. Default value is
- * infinity.</td>
- * </tr>
- * </table>
+ * A simple party that places random bids and accepts when it receives an offer
+ * with sufficient utility.
  */
 public class RandomParty extends DefaultParty {
@@ -67,10 +40,6 @@
 	private PartyId me;
 	private final Random random = new Random();
-	protected ProfileInterface profileint = null;
+	protected ProfileInterface profileint;
 	private Progress progress;
-	private Settings settings;
-	private Votes lastvotes;
-	private VotesWithValue lastvoteswithvalue;
-	private String protocol;
 
 	public RandomParty() {
@@ -85,15 +54,9 @@
 		try {
 			if (info instanceof Settings) {
-				Settings sett = (Settings) info;
-				this.me = sett.getID();
-				this.progress = sett.getProgress();
-				this.settings = sett;
-				this.protocol = sett.getProtocol().getURI().getPath();
-				if ("Learn".equals(protocol)) {
-					getConnection().send(new LearningDone(me));
-				} else {
-					this.profileint = ProfileConnectionFactory
-							.create(sett.getProfile().getURI(), getReporter());
-				}
+				Settings settings = (Settings) info;
+				this.profileint = ProfileConnectionFactory
+						.create(settings.getProfile().getURI(), getReporter());
+				this.me = settings.getID();
+				this.progress = settings.getProgress();
 			} else if (info instanceof ActionDone) {
 				Action otheract = ((ActionDone) info).getAction();
@@ -102,94 +65,36 @@
 				}
 			} else if (info instanceof YourTurn) {
-				makeOffer();
+				myTurn();
+				if (progress instanceof ProgressRounds) {
+					progress = ((ProgressRounds) progress).advance();
+				}
 			} else if (info instanceof Finished) {
 				getReporter().log(Level.INFO, "Final ourcome:" + info);
-				terminate(); // stop this party and free resources.
-			} else if (info instanceof Voting) {
-				switch (protocol) {
-				case "MOPAC":
-					lastvotes = vote((Voting) info);
-					getConnection().send(lastvotes);
-					break;
-				case "MOPAC2":
-					lastvoteswithvalue = voteWithValue((Voting) info);
-					getConnection().send(lastvoteswithvalue);
-				}
-			} else if (info instanceof OptIn) {
-				// just repeat our last vote.
-				getConnection().send(lastvotes);
-			} else if (info instanceof OptInWithValue) {
-				getConnection().send(lastvoteswithvalue);
 			}
 		} catch (Exception e) {
-			throw new RuntimeException("Failed to handle info", e);
+			getReporter().log(Level.SEVERE, "Failed to handle info", e);
 		}
-		updateRound(info);
 	}
 
 	@Override
 	public Capabilities getCapabilities() {
-		return new Capabilities(new HashSet<>(
-				Arrays.asList("SAOP", "AMOP", "MOPAC", "MOPAC2", "Learn")),
-				Collections.singleton(Profile.class));
+		try {
+			return new Capabilities(new HashSet<>(
+					Arrays.asList(new ProtocolRef(new URI("SAOP")))));
+		} catch (URISyntaxException e) {
+			getReporter().log(Level.SEVERE, "Failed to create capabilities URI",
+					e);
+			return null;
+		}
 	}
 
 	@Override
 	public String getDescription() {
-		return "places random bids until it can accept an offer with utility >0.6. "
-				+ "Parameters minPower and maxPower can be used to control voting behaviour.";
+		return "places random bids until it can accept an offer with utility >0.6";
 	}
 
-	@Override
-	public void terminate() {
-		super.terminate();
-		if (this.profileint != null) {
-			this.profileint.close();
-			this.profileint = null;
-		}
-	}
-
-	/******************* private support funcs ************************/
-
-	/**
-	 * Update {@link #progress}
-	 * 
-	 * @param info the received info. Used to determine if this is the last info
-	 *             of the round
-	 */
-	private void updateRound(Inform info) {
-		if (protocol == null)
-			return;
-		switch (protocol) {
-		case "SAOP":
-		case "SHAOP":
-			if (!(info instanceof YourTurn))
-				return;
-			break;
-		case "MOPAC":
-			if (!(info instanceof OptIn))
-				return;
-			break;
-		case "MOPAC2":
-			if (!(info instanceof OptInWithValue))
-				return;
-			break;
-		default:
-			return;
-		}
-		// if we get here, round must be increased.
-		if (progress instanceof ProgressRounds) {
-			progress = ((ProgressRounds) progress).advance();
-		}
-
-	}
-
-	/**
-	 * send our next offer
-	 */
-	private void makeOffer() throws IOException {
+	private void myTurn() throws IOException {
 		Action action;
-		if ((protocol.equals("SAOP") || protocol.equals("SHAOP"))
-				&& isGood(lastReceivedBid)) {
+		if (isGood(lastReceivedBid)) {
 			action = new Accept(me, lastReceivedBid);
 		} else {
@@ -208,74 +113,8 @@
 	}
 
-	/**
-	 * @param bid the bid to check
-	 * @return true iff bid is good for us.
-	 */
 	private boolean isGood(Bid bid) {
-		if (bid == null)
-			return false;
-		Profile profile;
-		try {
-			profile = profileint.getProfile();
-		} catch (IOException e) {
-			throw new IllegalStateException(e);
-		}
-		if (profile instanceof UtilitySpace)
-			return ((UtilitySpace) profile).getUtility(bid).doubleValue() > 0.6;
-		if (profile instanceof PartialOrdering) {
-			return ((PartialOrdering) profile).isPreferredOrEqual(bid,
-					profile.getReservationBid());
-		}
-		return false;
-	}
-
-	/**
-	 * @param voting the {@link Voting} object containing the options
-	 * 
-	 * @return our next Votes.
-	 */
-	private Votes vote(Voting voting) throws IOException {
-		Object val = settings.getParameters().get("minPower");
-		Integer minpower = (val instanceof Integer) ? (Integer) val : 2;
-		val = settings.getParameters().get("maxPower");
-		Integer maxpower = (val instanceof Integer) ? (Integer) val
-				: Integer.MAX_VALUE;
-
-		Set<Vote> votes = voting.getOffers().stream().distinct()
-				.filter(offer -> isGood(offer.getBid()))
-				.map(offer -> new Vote(me, offer.getBid(), minpower, maxpower))
-				.collect(Collectors.toSet());
-		return new Votes(me, votes);
-	}
-
-	/**
-	 * @param voting the {@link Voting} object containing the options
-	 * 
-	 * @return our next Votes. Returns only votes on good bids and tries to
-	 *         distribute vote values evenly over all good bids.
-	 */
-	private VotesWithValue voteWithValue(Voting voting) throws IOException {
-		Object val = settings.getParameters().get("minPower");
-		Integer minpower = (val instanceof Integer) ? (Integer) val : 2;
-		val = settings.getParameters().get("maxPower");
-		Integer maxpower = (val instanceof Integer) ? (Integer) val
-				: Integer.MAX_VALUE;
-
-		List<Bid> goodbids = voting.getOffers().stream().distinct()
-				.filter(offer -> isGood(offer.getBid()))
-				.map(offer -> offer.getBid()).collect(Collectors.toList());
-
-		if (goodbids.isEmpty()) {
-			return new VotesWithValue(me, Collections.emptySet());
-		}
-		// extra difficulty now is to have the utility sum to exactly 100
-		int mostvalues = 100 / goodbids.size();
-		int value = 100 - mostvalues * (goodbids.size() - 1);
-		Set<VoteWithValue> votes = new HashSet<>();
-		for (Bid bid : goodbids) {
-			votes.add(new VoteWithValue(me, bid, minpower, maxpower, value));
-			value = mostvalues;
-		}
-		return new VotesWithValue(me, votes);
+		return bid != null
+				&& ((LinearAdditiveUtilitySpace) profileint.getProfile())
+						.getUtility(bid).doubleValue() > 0.6;
 	}
 
Index: /exampleparties/randomparty/src/test/java/geniusweb/exampleparties/randomparty/RandomPartyTest.java
===================================================================
--- /exampleparties/randomparty/src/test/java/geniusweb/exampleparties/randomparty/RandomPartyTest.java	(revision 53)
+++ /exampleparties/randomparty/src/test/java/geniusweb/exampleparties/randomparty/RandomPartyTest.java	(revision 1)
@@ -7,7 +7,5 @@
 import static org.mockito.Matchers.eq;
 import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
 
 import java.io.IOException;
@@ -18,6 +16,4 @@
 import java.nio.file.Files;
 import java.nio.file.Paths;
-import java.util.Arrays;
-import java.util.Collections;
 import java.util.LinkedList;
 import java.util.List;
@@ -36,22 +32,16 @@
 import geniusweb.actions.Offer;
 import geniusweb.actions.PartyId;
-import geniusweb.actions.Votes;
-import geniusweb.actions.VotesWithValue;
 import geniusweb.bidspace.AllBidsList;
-import geniusweb.connection.ConnectionEnd;
-import geniusweb.inform.ActionDone;
-import geniusweb.inform.Agreements;
-import geniusweb.inform.Finished;
-import geniusweb.inform.Inform;
-import geniusweb.inform.OptIn;
-import geniusweb.inform.Settings;
-import geniusweb.inform.Voting;
-import geniusweb.inform.YourTurn;
+import geniusweb.connection.Connection;
 import geniusweb.issuevalue.Bid;
 import geniusweb.party.Capabilities;
+import geniusweb.party.inform.ActionDone;
+import geniusweb.party.inform.Finished;
+import geniusweb.party.inform.Inform;
+import geniusweb.party.inform.Settings;
+import geniusweb.party.inform.YourTurn;
 import geniusweb.profile.Profile;
-import geniusweb.profile.utilityspace.LinearAdditive;
+import geniusweb.profile.utilityspace.LinearAdditiveUtilitySpace;
 import geniusweb.progress.ProgressRounds;
-import geniusweb.references.Parameters;
 import geniusweb.references.ProfileRef;
 import geniusweb.references.ProtocolRef;
@@ -62,6 +52,5 @@
 public class RandomPartyTest {
 
-	private static final PartyId PARTY1 = new PartyId("party1");
-	private static final String SAOP = "SAOP";
+	private static final ProtocolRef SAOP = new ProtocolRef("SAOP");
 	private static final PartyId otherparty = new PartyId("other");
 	private static final String PROFILE = "src/test/resources/testprofile.json";
@@ -69,12 +58,9 @@
 
 	private RandomParty party;
-	private final TestConnection connection = new TestConnection();
-	private final ProtocolRef protocol = new ProtocolRef(SAOP);
-	private final ProtocolRef mopacProtocol = new ProtocolRef("MOPAC");
-	private final ProtocolRef mopac2Protocol = new ProtocolRef("MOPAC2");
-	private final ProgressRounds progress = mock(ProgressRounds.class);
-	private Settings settings, mopacSettings, mopac2Settings;
-	private LinearAdditive profile;
-	private final Parameters parameters = new Parameters();
+	private TestConnection connection = new TestConnection();
+	private ProtocolRef protocol = mock(ProtocolRef.class);
+	private ProgressRounds progress = mock(ProgressRounds.class);
+	private Settings settings;
+	private LinearAdditiveUtilitySpace profile;
 
 	@Before
@@ -82,17 +68,11 @@
 			IOException, URISyntaxException {
 		party = new RandomParty();
-		settings = new Settings(PARTY1,
-				new ProfileRef(new URI("file:" + PROFILE)), protocol, progress,
-				parameters);
-		mopacSettings = new Settings(PARTY1,
-				new ProfileRef(new URI("file:" + PROFILE)), mopacProtocol,
-				progress, parameters);
-		mopac2Settings = new Settings(PARTY1,
-				new ProfileRef(new URI("file:" + PROFILE)), mopac2Protocol,
-				progress, parameters);
+		settings = new Settings(new PartyId("party1"),
+				new ProfileRef(new URI("file:" + PROFILE)), protocol, progress);
 
 		String serialized = new String(Files.readAllBytes(Paths.get(PROFILE)),
 				StandardCharsets.UTF_8);
-		profile = (LinearAdditive) jackson.readValue(serialized, Profile.class);
+		profile = (LinearAdditiveUtilitySpace) jackson.readValue(serialized,
+				Profile.class);
 
 	}
@@ -111,5 +91,5 @@
 		Capabilities capabilities = party.getCapabilities();
 		assertFalse("party does not define protocols",
-				capabilities.getBehaviours().isEmpty());
+				capabilities.getProtocols().isEmpty());
 	}
 
@@ -124,5 +104,5 @@
 	public void testInformSettings() {
 		party.connect(connection);
-		connection.notifyListeners(settings);
+		connection.notifyChange(settings);
 		assertEquals(0, connection.getActions().size());
 	}
@@ -176,14 +156,12 @@
 		party.connect(connection);
 		party.notifyChange(settings);
-		Agreements agreements = mock(Agreements.class);
-		when(agreements.toString()).thenReturn("agree");
-		party.notifyChange(new Finished(agreements));
+		party.notifyChange(new Finished(null));
 
 		verify(reporter).log(eq(Level.INFO),
-				eq("Final ourcome:Finished[agree]"));
-	}
-
-	@Test
-	public void testAgentsUpdatesSAOPProgress() {
+				eq("Final ourcome:Finished[null]"));
+	}
+
+	@Test
+	public void testAgentsUpdatesProgress() {
 		party.connect(connection);
 		party.notifyChange(settings);
@@ -194,20 +172,6 @@
 
 	@Test
-	public void testAgentsUpdatesMOPACProgress() {
-		party.connect(connection);
-		party.notifyChange(mopacSettings);
-		// in mopac, progress happens only after optin phase
-		party.notifyChange(new YourTurn());
-		verify(progress, times(0)).advance();
-		party.notifyChange(
-				new Voting(Collections.emptyList(), Collections.emptyMap()));
-		verify(progress, times(0)).advance();
-		party.notifyChange(new OptIn(Collections.emptyList()));
-		verify(progress, times(1)).advance();
-	}
-
-	@Test
 	public void testGetCapabilities() {
-		assertTrue(party.getCapabilities().getBehaviours().contains(SAOP));
+		assertTrue(party.getCapabilities().getProtocols().contains(SAOP));
 	}
 
@@ -223,37 +187,4 @@
 	}
 
-	@Test
-	public void testVoting() throws URISyntaxException {
-		party.connect(connection);
-		party.notifyChange(mopacSettings);
-
-		Bid bid = findGoodBid();
-		Offer offer = new Offer(PARTY1, bid);
-		party.notifyChange(new Voting(Arrays.asList(offer),
-				Collections.singletonMap(PARTY1, 1)));
-		assertEquals(1, connection.getActions().size());
-		Action action = connection.getActions().get(0);
-		assertTrue(action instanceof Votes);
-		assertEquals(1, ((Votes) action).getVotes().size());
-		assertEquals(bid,
-				((Votes) action).getVotes().iterator().next().getBid());
-	}
-
-	@Test
-	public void testVotingWithValue() throws URISyntaxException {
-		party.connect(connection);
-		party.notifyChange(mopac2Settings);
-
-		Bid bid = findGoodBid();
-		Offer offer = new Offer(PARTY1, bid);
-		party.notifyChange(new Voting(Arrays.asList(offer),
-				Collections.singletonMap(PARTY1, 1)));
-		assertEquals(1, connection.getActions().size());
-		Action action = connection.getActions().get(0);
-		assertTrue(action instanceof VotesWithValue);
-		assertEquals(1, ((VotesWithValue) action).getVotes().size());
-		assertEquals(bid, ((VotesWithValue) action).getVotes().iterator().next()
-				.getBid());
-	}
 }
 
@@ -265,5 +196,5 @@
  */
 class TestConnection extends DefaultListenable<Inform>
-		implements ConnectionEnd<Inform, Action> {
+		implements Connection<Inform, Action> {
 	private List<Action> actions = new LinkedList<>();
 
Index: /exampleparties/randomparty/src/test/resources/testprofile.json
===================================================================
--- /exampleparties/randomparty/src/test/resources/testprofile.json	(revision 53)
+++ /exampleparties/randomparty/src/test/resources/testprofile.json	(revision 1)
@@ -3,5 +3,5 @@
 		"issueUtilities": {
 			"issue2": {
-				"NumberValueSetUtilities": {
+				"numberutils": {
 					"lowValue": 12,
 					"lowUtility": 0.3,
@@ -11,5 +11,5 @@
 			},
 			"issue1": {
-				"DiscreteValueSetUtilities": {
+				"discreteutils": {
 					"valueUtilities": {
 						"issue1value1": 0.2,
@@ -27,21 +27,19 @@
 			"issuesValues": {
 				"issue2": {
-					"range": { "low":12,"high":18,"step":1 }
+					"range": ["12", "18", "1"]
 				},
 				"issue1": {
-					"values": [
-						"issue1value1",
-						"issue1value2"
-					]
+					"values": ["issue1value1", "issue1value2"]
 				}
 			}
 		},
 		"name": "testprofile",
-		"reservationBid": {
+				"reservationBid": {
 			"issuevalues": {
-				"issue1": "issue1value1",
-				"issue2": 12
+				"issue1": "issuevalue1",
+				"issue2": "12"
 			}
 		}
+		
 	}
 }
Index: /exampleparties/randompartypy/bin/.pydevproject
===================================================================
--- /exampleparties/randompartypy/bin/.pydevproject	(revision 1)
+++ /exampleparties/randompartypy/bin/.pydevproject	(revision 1)
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<?eclipse-pydev version="1.0"?><pydev_project>
+<pydev_property name="org.python.pydev.PYTHON_PROJECT_INTERPRETER">Default</pydev_property>
+<pydev_property name="org.python.pydev.PYTHON_PROJECT_VERSION">python interpreter</pydev_property>
+</pydev_project>
Index: /exampleparties/randompartypy/bin/pom.xml
===================================================================
--- /exampleparties/randompartypy/bin/pom.xml	(revision 1)
+++ /exampleparties/randompartypy/bin/pom.xml	(revision 1)
@@ -0,0 +1,254 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+
+	<groupId>genius2.exampleparties</groupId>
+	<artifactId>randompyparty</artifactId>
+	<version>1.0.0</version>
+	<packaging>jar</packaging>
+
+
+	<properties>
+		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+		<maven.compiler.target>1.8</maven.compiler.target>
+		<maven.compiler.source>1.8</maven.compiler.source>
+		<basedir>.</basedir>
+		<passwd>${env.ARTIFACTORY_PASS}</passwd>
+		<jackson-2-version>2.9.6</jackson-2-version>
+	</properties>
+
+	<distributionManagement>
+		<repository>
+			<id>artifactory.ewi.tudelft.nl</id>
+			<url>http://artifactory.ewi.tudelft.nl/artifactory/libs-release</url>
+		</repository>
+	</distributionManagement>
+
+
+	<dependencies>
+		<dependency>
+			<groupId>genius2</groupId>
+			<artifactId>pythonadapter</artifactId>
+			<version>1.0.0</version>
+		</dependency>
+
+		<dependency>
+			<groupId>genius2</groupId>
+			<artifactId>bidspace</artifactId>
+			<version>1.0.0</version>
+		</dependency>
+		<dependency>
+			<groupId>genius2</groupId>
+			<artifactId>profileconnection</artifactId>
+			<version>1.0.0</version>
+		</dependency>
+		<dependency>
+			<groupId>tudelft.utilities</groupId>
+			<artifactId>immutablelist</artifactId>
+			<version>1.0.0</version>
+		</dependency>
+
+
+		<!-- the core, which includes Streaming API, shared low-level abstractions 
+			(but NOT data-binding) -->
+		<dependency>
+			<groupId>com.fasterxml.jackson.core</groupId>
+			<artifactId>jackson-core</artifactId>
+			<version>${jackson-2-version}</version>
+			<scope>test</scope>
+		</dependency>
+		<!-- Just the annotations; use this dependency if you want to attach annotations 
+			to classes without connecting them to the code. -->
+		<dependency>
+			<groupId>com.fasterxml.jackson.core</groupId>
+			<artifactId>jackson-annotations</artifactId>
+			<version>${jackson-2-version}</version>
+			<scope>test</scope>
+		</dependency>
+		<!-- databinding; ObjectMapper, JsonNode and related classes are here -->
+		<dependency>
+			<groupId>com.fasterxml.jackson.core</groupId>
+			<artifactId>jackson-databind</artifactId>
+			<version>${jackson-2-version}</version>
+			<scope>test</scope>
+		</dependency>
+
+		<!-- smile (binary JSON). Other artifacts in this group do other formats. -->
+		<dependency>
+			<groupId>com.fasterxml.jackson.dataformat</groupId>
+			<artifactId>jackson-dataformat-smile</artifactId>
+			<version>${jackson-2-version}</version>
+			<scope>test</scope>
+		</dependency>
+		<!-- JAX-RS provider -->
+		<dependency>
+			<groupId>com.fasterxml.jackson.jaxrs</groupId>
+			<artifactId>jackson-jaxrs-json-provider</artifactId>
+			<version>${jackson-2-version}</version>
+			<scope>test</scope>
+		</dependency>
+		<!-- Support for JAX-B annotations as additional configuration -->
+		<dependency>
+			<groupId>com.fasterxml.jackson.module</groupId>
+			<artifactId>jackson-module-jaxb-annotations</artifactId>
+			<version>${jackson-2-version}</version>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>junit</groupId>
+			<artifactId>junit</artifactId>
+			<version>4.12</version>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.mockito</groupId>
+			<artifactId>mockito-all</artifactId>
+			<version>1.9.5</version>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>tudelft.utilities</groupId>
+			<artifactId>junit</artifactId>
+			<version>1.0.1</version>
+			<scope>test</scope>
+		</dependency>
+	</dependencies>
+
+
+	<repositories>
+		<repository>
+			<id>artifactory.ewi.tudelft.nl</id>
+			<url>http://artifactory.ewi.tudelft.nl/artifactory/libs-release</url>
+			<snapshots>
+				<enabled>false</enabled>
+			</snapshots>
+		</repository>
+
+	</repositories>
+
+	<pluginRepositories>
+		<pluginRepository>
+			<id>jcenter</id>
+			<url>http://jcenter.bintray.com</url>
+		</pluginRepository>
+	</pluginRepositories>
+
+
+	<build>
+
+		<plugins>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-compiler-plugin</artifactId>
+				<version>3.8.0</version>
+				<configuration>
+					<source>1.8</source>
+					<target>1.8</target>
+				</configuration>
+			</plugin>
+
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-javadoc-plugin</artifactId>
+				<version>2.10.1</version>
+				<executions>
+					<execution>
+						<id>attach-javadocs</id>
+						<goals>
+							<goal>jar</goal>
+						</goals>
+						<configuration>
+							<additionalparam>${javadoc.opts}</additionalparam>
+							<additionalparam>-Xdoclint:none</additionalparam>
+						</configuration>
+					</execution>
+				</executions>
+			</plugin>
+
+			<plugin>
+				<groupId>org.jfrog.buildinfo</groupId>
+				<artifactId>artifactory-maven-plugin</artifactId>
+				<version>2.6.1</version>
+				<executions>
+					<execution>
+						<id>build-info</id>
+						<goals>
+							<goal>publish</goal>
+						</goals>
+						<configuration>
+							<publisher>
+								<contextUrl>http://artifactory.ewi.tudelft.nl/artifactory</contextUrl>
+								<repoKey>libs-release</repoKey>
+								<username>wouter</username>
+								<password>${passwd}</password>
+							</publisher>
+						</configuration>
+					</execution>
+				</executions>
+			</plugin>
+
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-assembly-plugin</artifactId>
+				<version>2.4.1</version>
+				<configuration>
+					<!-- get all project dependencies -->
+					<descriptorRefs>
+						<descriptorRef>jar-with-dependencies</descriptorRef>
+					</descriptorRefs>
+					<archive>
+						<manifest>
+							<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
+							<addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
+							<mainClass>geniusweb.exampleparties.randompartypy.PartyAdapter</mainClass>
+						</manifest>
+					</archive>
+				</configuration>
+				<executions>
+					<execution>
+						<id>make-assembly</id>
+						<!-- bind to the packaging phase -->
+						<phase>package</phase>
+						<goals>
+							<goal>single</goal>
+						</goals>
+					</execution>
+				</executions>
+			</plugin>
+
+
+		</plugins>
+
+		<pluginManagement>
+			<plugins>
+				<plugin>
+					<groupId>org.eclipse.m2e</groupId>
+					<artifactId>lifecycle-mapping</artifactId>
+					<version>1.0.0</version>
+					<configuration>
+						<lifecycleMappingMetadata>
+							<pluginExecutions>
+								<pluginExecution>
+									<pluginExecutionFilter>
+										<groupId>org.jfrog.buildinfo</groupId>
+										<artifactId>artifactory-maven-plugin</artifactId>
+										<versionRange>[1.0.0,)</versionRange>
+										<goals>
+											<goal>publish</goal>
+										</goals>
+									</pluginExecutionFilter>
+									<action>
+										<ignore />
+									</action>
+								</pluginExecution>
+							</pluginExecutions>
+						</lifecycleMappingMetadata>
+					</configuration>
+				</plugin>
+			</plugins>
+		</pluginManagement>
+
+
+	</build>
+</project>
Index: /exampleparties/randompartypy/bin/src/main/resources/RandomParty.py
===================================================================
--- /exampleparties/randompartypy/bin/src/main/resources/RandomParty.py	(revision 1)
+++ /exampleparties/randompartypy/bin/src/main/resources/RandomParty.py	(revision 1)
@@ -0,0 +1,94 @@
+import time
+import traceback
+
+import geniusweb.party.inform.ActionDone as ActionDone
+import geniusweb.party.inform.Inform as Inform
+import geniusweb.party.inform.Settings as Settings
+import geniusweb.party.inform.YourTurn as YourTurn
+
+
+import java.math.BigInteger as BigInteger
+import java.net.URI as URI
+import java.util.Arrays as Arrays
+import java.util.HashSet as HashSet
+import java.util.Random as Random
+ 
+import geniusweb.actions.Accept as Accept
+import geniusweb.actions.Action as Action
+import geniusweb.actions.Offer as Offer
+import geniusweb.actions.PartyId as PartyId
+import geniusweb.bidspace.AllPartialBidsList as AllPartialBidsList
+import geniusweb.issuevalue.Bid as Bid
+import geniusweb.party.Capabilities as Capabilities
+import geniusweb.party.DefaultParty as DefaultParty
+import geniusweb.profile.Profile as Profile
+import geniusweb.profile.utilityspace.LinearAdditiveUtilitySpace as LinearAdditiveUtilitySpace
+import genius2.references.ProfileRef as ProfileRef
+import genius2.references.ProtocolRef as ProtocolRef
+import geniusweb.profileconnection.ProfileConnectionFactory as ProfileConnectionFactory
+import geniusweb.profileconnection.ProfileInterface as ProfileInterface
+import genius2.progress.ProgressRounds as ProgressRounds
+
+import com.fasterxml.jackson.databind.ObjectMapper as ObjectMapper
+
+class RandomParty (DefaultParty):
+	"""
+	A simple party that places random bids and accepts when it receives an offer
+	with sufficient utility.
+	"""
+
+	jackson = ObjectMapper()
+	random = Random();
+
+	def __init__(self):
+		self.profile = None
+		self.lastReceivedBid = None
+
+	# Override
+	def notifyChange(self, info):
+		if isinstance(info, Settings) :
+			self.profile = ProfileConnectionFactory.create(info.getProfile().getURI(), self.getReporter());
+			self.me = info.getID()
+			self.progress = info.getProgress()
+		elif isinstance(info , ActionDone): 
+			self.lastActor = info.getAction().getActor()
+			otheract = info.getAction()
+			if isinstance(otheract, Offer):
+				self.lastReceivedBid = otheract.getBid()
+		elif isinstance(info , YourTurn):
+			self._myTurn()
+			if isinstance(self.progress, ProgressRounds) :
+				self.progress = self.progress.advance();
+
+	# Override
+	def getCapabilities(self): # -> Capabilities
+		try:
+			return Capabilities(HashSet([ ProtocolRef(URI("SAOP"))]))
+		except:
+			getReporter().log(Level.SEVERE, "Failed to create capabilities URI",e);
+		return None
+
+	# Override
+	def getDescription(self):
+		return "places random bids until it can accept an offer with utility >0.6. Python version"
+
+	def _myTurn(self):
+		if self.lastReceivedBid != None and self.profile.getProfile().getUtility(self.lastReceivedBid).doubleValue() > 0.6:
+			action = Accept(self.me, self.lastReceivedBid)
+		else:
+			bidspace = AllPartialBidsList(self.profile.getProfile().getDomain())
+			bid = None
+			for attempt in range(20):
+				i = self.random.nextInt(bidspace.size()) # warning: jython implicitly converts BigInteger to long.
+				bid = bidspace.get(BigInteger.valueOf(i))
+				if self._isGood(bid):
+					break
+			action = Offer(self.me, bid);
+		try:
+			self.getConnection().send(action)
+		except:
+			print 'failed to send action '+action.toString()
+			traceback.print_exc()
+
+	def _isGood(self, bid):
+		return bid != None and self.profile.getProfile().getUtility(bid).doubleValue() > 0.6;
Index: /exampleparties/randompartypy/bin/src/test/resources/testprofile.json
===================================================================
--- /exampleparties/randompartypy/bin/src/test/resources/testprofile.json	(revision 1)
+++ /exampleparties/randompartypy/bin/src/test/resources/testprofile.json	(revision 1)
@@ -0,0 +1,45 @@
+{
+	"LinearAdditiveUtilitySpace": {
+		"issueUtilities": {
+			"issue2": {
+				"numberutils": {
+					"lowValue": 12,
+					"lowUtility": 0.3,
+					"highValue": 18,
+					"highUtility": 0.9
+				}
+			},
+			"issue1": {
+				"discreteutils": {
+					"valueUtilities": {
+						"issue1value1": 0.2,
+						"issue1value2": 0.8
+					}
+				}
+			}
+		},
+		"issueWeights": {
+			"issue2": 0.4,
+			"issue1": 0.6
+		},
+		"domain": {
+			"name": "test",
+			"issuesValues": {
+				"issue2": {
+					"range": ["12", "18", "1"]
+				},
+				"issue1": {
+					"values": ["issue1value1", "issue1value2"]
+				}
+			}
+		},
+		"name": "testprofile",
+				"reservationBid": {
+			"issuevalues": {
+				"issue1": "issuevalue1",
+				"issue2": "12"
+			}
+		}
+		
+	}
+}
Index: /exampleparties/randompartypy/pom.xml
===================================================================
--- /exampleparties/randompartypy/pom.xml	(revision 53)
+++ /exampleparties/randompartypy/pom.xml	(revision 1)
@@ -6,5 +6,5 @@
 	<groupId>geniusweb.exampleparties</groupId>
 	<artifactId>randompyparty</artifactId>
-	<version>2.2.1</version>  <!-- equals the geniusweb version -->
+	<version>1.0.0</version>
 	<packaging>jar</packaging>
 
@@ -16,6 +16,5 @@
 		<basedir>.</basedir>
 		<passwd>${env.ARTIFACTORY_PASS}</passwd>
-		<jackson-2-version>2.12.3</jackson-2-version>
-		<geniusweb.version>${project.version}</geniusweb.version>
+		<jackson-2-version>2.9.6</jackson-2-version>
 	</properties>
 
@@ -23,5 +22,5 @@
 		<repository>
 			<id>artifactory.ewi.tudelft.nl</id>
-			<url>https://artifactory.ewi.tudelft.nl/artifactory/libs-release</url>
+			<url>http://artifactory.ewi.tudelft.nl/artifactory/libs-release</url>
 		</repository>
 	</distributionManagement>
@@ -32,5 +31,5 @@
 			<groupId>geniusweb</groupId>
 			<artifactId>pythonadapter</artifactId>
-			<version>${geniusweb.version}</version>
+			<version>1.0.0</version>
 		</dependency>
 
@@ -38,15 +37,15 @@
 			<groupId>geniusweb</groupId>
 			<artifactId>bidspace</artifactId>
-			<version>${geniusweb.version}</version>
+			<version>1.0.0</version>
 		</dependency>
 		<dependency>
 			<groupId>geniusweb</groupId>
 			<artifactId>profileconnection</artifactId>
-			<version>${geniusweb.version}</version>
+			<version>1.0.0</version>
 		</dependency>
 		<dependency>
 			<groupId>tudelft.utilities</groupId>
-			<artifactId>utilities</artifactId>
-			<version>1.1.1</version>
+			<artifactId>immutablelist</artifactId>
+			<version>1.0.0</version>
 		</dependency>
 
@@ -105,6 +104,6 @@
 		<dependency>
 			<groupId>org.mockito</groupId>
-			<artifactId>mockito-core</artifactId>
-			<version>3.11.2</version>
+			<artifactId>mockito-all</artifactId>
+			<version>1.9.5</version>
 			<scope>test</scope>
 		</dependency>
@@ -112,5 +111,5 @@
 			<groupId>tudelft.utilities</groupId>
 			<artifactId>junit</artifactId>
-			<version>1.0.5</version>
+			<version>1.0.1</version>
 			<scope>test</scope>
 		</dependency>
@@ -121,19 +120,16 @@
 		<repository>
 			<id>artifactory.ewi.tudelft.nl</id>
-			<url>https://artifactory.ewi.tudelft.nl/artifactory/libs-release</url>
+			<url>http://artifactory.ewi.tudelft.nl/artifactory/libs-release</url>
 			<snapshots>
 				<enabled>false</enabled>
 			</snapshots>
 		</repository>
+
 	</repositories>
 
 	<pluginRepositories>
 		<pluginRepository>
-			<id>central</id>
-			<url>https://repo1.maven.org/maven2</url>
-		</pluginRepository>
-		<pluginRepository>
-			<id>artifactory.ewi.tudelft.nl</id>
-			<url>https://artifactory.ewi.tudelft.nl/artifactory/libs-release</url>
+			<id>jcenter</id>
+			<url>http://jcenter.bintray.com</url>
 		</pluginRepository>
 	</pluginRepositories>
@@ -152,22 +148,9 @@
 				</configuration>
 			</plugin>
-			<plugin>
-				<groupId>org.apache.maven.plugins</groupId>
-				<artifactId>maven-source-plugin</artifactId>
-				<version>3.1.0</version>
-				<executions>
-					<execution>
-						<id>attach-sources</id>
-						<goals>
-							<goal>jar</goal>
-						</goals>
-					</execution>
-				</executions>
-			</plugin>
 
 			<plugin>
 				<groupId>org.apache.maven.plugins</groupId>
 				<artifactId>maven-javadoc-plugin</artifactId>
-				<version>3.2.0</version>
+				<version>2.10.1</version>
 				<executions>
 					<execution>
@@ -176,4 +159,8 @@
 							<goal>jar</goal>
 						</goals>
+						<configuration>
+							<additionalparam>${javadoc.opts}</additionalparam>
+							<additionalparam>-Xdoclint:none</additionalparam>
+						</configuration>
 					</execution>
 				</executions>
@@ -183,5 +170,5 @@
 				<groupId>org.jfrog.buildinfo</groupId>
 				<artifactId>artifactory-maven-plugin</artifactId>
-				<version>3.2.3</version>
+				<version>2.6.1</version>
 				<executions>
 					<execution>
Index: /exampleparties/randompartypy/src/main/resources/RandomParty.py
===================================================================
--- /exampleparties/randompartypy/src/main/resources/RandomParty.py	(revision 53)
+++ /exampleparties/randompartypy/src/main/resources/RandomParty.py	(revision 1)
@@ -2,9 +2,8 @@
 import traceback
 
-import geniusweb.inform.ActionDone as ActionDone
-import geniusweb.inform.Inform as Inform
-import geniusweb.inform.Settings as Settings
-import geniusweb.inform.YourTurn as YourTurn
-import geniusweb.inform.Finished as Finished
+import geniusweb.party.inform.ActionDone as ActionDone
+import geniusweb.party.inform.Inform as Inform
+import geniusweb.party.inform.Settings as Settings
+import geniusweb.party.inform.YourTurn as YourTurn
 
 
@@ -14,6 +13,4 @@
 import java.util.HashSet as HashSet
 import java.util.Random as Random
-import java.util.Collections as Collections
-import java.util.logging.Level as Level
  
 import geniusweb.actions.Accept as Accept
@@ -26,6 +23,5 @@
 import geniusweb.party.DefaultParty as DefaultParty
 import geniusweb.profile.Profile as Profile
-import geniusweb.profile.PartialOrdering as PartialOrdering
-import geniusweb.profile.utilityspace.UtilitySpace as UtilitySpace
+import geniusweb.profile.utilityspace.LinearAdditiveUtilitySpace as LinearAdditiveUtilitySpace
 import geniusweb.references.ProfileRef as ProfileRef
 import geniusweb.references.ProtocolRef as ProtocolRef
@@ -33,5 +29,4 @@
 import geniusweb.profileconnection.ProfileInterface as ProfileInterface
 import geniusweb.progress.ProgressRounds as ProgressRounds
-
 
 import com.fasterxml.jackson.databind.ObjectMapper as ObjectMapper
@@ -65,24 +60,16 @@
 			if isinstance(self.progress, ProgressRounds) :
 				self.progress = self.progress.advance();
-		elif isinstance(info,Finished) :
-			self.getReporter().log(Level.INFO, "Final ourcome:" + info.toString())
-			self.terminate()
-		
 
 	# Override
 	def getCapabilities(self): # -> Capabilities
-			return Capabilities(HashSet([ "SAOP"]), Collections.singleton(Profile));
+		try:
+			return Capabilities(HashSet([ ProtocolRef(URI("SAOP"))]))
+		except:
+			getReporter().log(Level.SEVERE, "Failed to create capabilities URI",e);
+		return None
 
 	# Override
 	def getDescription(self):
 		return "places random bids until it can accept an offer with utility >0.6. Python version"
-
-	# Override
-	def terminate(self):
-		super(RandomParty,self).terminate()
-		if self.profile != None:
-			self.profile.close()
-			self.profile = None
-
 
 	def _myTurn(self):
@@ -105,11 +92,3 @@
 
 	def _isGood(self, bid):
-		if bid == None:
-			return false
-		profile = self.profile.getProfile()
-		if isinstance(profile, UtilitySpace):
-			return profile.getUtility(bid).doubleValue() > 0.6;
-		if isinstance(profile, PartialOrdering):
-			return profile.isPreferredOrEqual(bid, profile.getReservationBid())
-		raise Exception("Can not handle this type of profile")
-
+		return bid != None and self.profile.getProfile().getUtility(bid).doubleValue() > 0.6;
Index: /exampleparties/randompartypy/src/test/java/geniusweb/exampleparties/randompartypy/RandomPartyTest.java
===================================================================
--- /exampleparties/randompartypy/src/test/java/geniusweb/exampleparties/randompartypy/RandomPartyTest.java	(revision 53)
+++ /exampleparties/randompartypy/src/test/java/geniusweb/exampleparties/randompartypy/RandomPartyTest.java	(revision 1)
@@ -31,18 +31,15 @@
 import geniusweb.actions.PartyId;
 import geniusweb.bidspace.AllBidsList;
-import geniusweb.connection.ConnectionEnd;
-import geniusweb.inform.ActionDone;
-import geniusweb.inform.Agreements;
-import geniusweb.inform.Finished;
-import geniusweb.inform.Inform;
-import geniusweb.inform.Settings;
-import geniusweb.inform.YourTurn;
+import geniusweb.connection.Connection;
 import geniusweb.issuevalue.Bid;
 import geniusweb.party.Capabilities;
+import geniusweb.party.inform.ActionDone;
+import geniusweb.party.inform.Inform;
+import geniusweb.party.inform.Settings;
+import geniusweb.party.inform.YourTurn;
 import geniusweb.profile.Profile;
-import geniusweb.profile.utilityspace.LinearAdditive;
+import geniusweb.profile.utilityspace.LinearAdditiveUtilitySpace;
 import geniusweb.progress.ProgressRounds;
 import geniusweb.pythonadapter.PythonPartyAdapter;
-import geniusweb.references.Parameters;
 import geniusweb.references.ProfileRef;
 import geniusweb.references.ProtocolRef;
@@ -53,5 +50,5 @@
 
 	private static final String PROFILE = "src/test/resources/testprofile.json";
-	private static final String SAOP = "SAOP";
+	private static final ProtocolRef SAOP = new ProtocolRef("SAOP");
 	private static final PartyId otherparty = new PartyId("other");
 	private final static ObjectMapper jackson = new ObjectMapper();
@@ -59,10 +56,9 @@
 	private PythonPartyAdapter party;
 	private TestConnection connection = new TestConnection();
-	private final ProtocolRef protocol = mock(ProtocolRef.class);
-	private final ProgressRounds progress = mock(ProgressRounds.class);
+	private ProtocolRef protocol = mock(ProtocolRef.class);
+	private ProgressRounds progress = mock(ProgressRounds.class);
 	private Settings settings;
-	private final Parameters parameters = new Parameters();
-
-	private LinearAdditive profile; // the real profile
+
+	private LinearAdditiveUtilitySpace profile; // the real profile
 
 	@Before
@@ -78,9 +74,9 @@
 		};
 		settings = new Settings(new PartyId("party1"),
-				new ProfileRef(new URI("file:" + PROFILE)), protocol, progress,
-				parameters);
+				new ProfileRef(new URI("file:" + PROFILE)), protocol, progress);
 		String serialized = new String(Files.readAllBytes(Paths.get(PROFILE)),
 				StandardCharsets.UTF_8);
-		profile = (LinearAdditive) jackson.readValue(serialized, Profile.class);
+		profile = (LinearAdditiveUtilitySpace) jackson.readValue(serialized,
+				Profile.class);
 
 	}
@@ -99,5 +95,5 @@
 		Capabilities capabilities = party.getCapabilities();
 		assertFalse("party does not define protocols",
-				capabilities.getBehaviours().isEmpty());
+				capabilities.getProtocols().isEmpty());
 	}
 
@@ -112,5 +108,5 @@
 	public void testInformSettings() {
 		party.connect(connection);
-		connection.notifyListeners(settings);
+		connection.notifyChange(settings);
 		assertEquals(0, connection.getActions().size());
 	}
@@ -129,15 +125,4 @@
 
 		party.notifyChange(new ActionDone(new EndNegotiation(otherparty)));
-
-		// party should not act at this point
-		assertEquals(0, connection.getActions().size());
-	}
-
-	@Test
-	public void testFinished() {
-		party.connect(connection);
-		party.notifyChange(settings);
-
-		party.notifyChange(new Finished(new Agreements()));
 
 		// party should not act at this point
@@ -179,5 +164,5 @@
 	@Test
 	public void testGetCapabilities() {
-		assertTrue(party.getCapabilities().getBehaviours().contains(SAOP));
+		assertTrue(party.getCapabilities().getProtocols().contains(SAOP));
 	}
 
@@ -202,5 +187,5 @@
  */
 class TestConnection extends DefaultListenable<Inform>
-		implements ConnectionEnd<Inform, Action> {
+		implements Connection<Inform, Action> {
 	private List<Action> actions = new LinkedList<>();
 
Index: /exampleparties/randompartypy/src/test/resources/testprofile.json
===================================================================
--- /exampleparties/randompartypy/src/test/resources/testprofile.json	(revision 53)
+++ /exampleparties/randompartypy/src/test/resources/testprofile.json	(revision 1)
@@ -3,5 +3,5 @@
 		"issueUtilities": {
 			"issue2": {
-				"NumberValueSetUtilities": {
+				"numberutils": {
 					"lowValue": 12,
 					"lowUtility": 0.3,
@@ -11,5 +11,5 @@
 			},
 			"issue1": {
-				"DiscreteValueSetUtilities": {
+				"discreteutils": {
 					"valueUtilities": {
 						"issue1value1": 0.2,
@@ -27,21 +27,19 @@
 			"issuesValues": {
 				"issue2": {
-					"range": { "low":12,"high":18,"step":1 }
+					"range": ["12", "18", "1"]
 				},
 				"issue1": {
-					"values": [
-						"issue1value1",
-						"issue1value2"
-					]
+					"values": ["issue1value1", "issue1value2"]
 				}
 			}
 		},
 		"name": "testprofile",
-		"reservationBid": {
+				"reservationBid": {
 			"issuevalues": {
-				"issue1": "issue1value1",
-				"issue2": 12
+				"issue1": "issuevalue1",
+				"issue2": "12"
 			}
 		}
+		
 	}
 }
Index: /issuevalue/pom.xml
===================================================================
--- /issuevalue/pom.xml	(revision 53)
+++ /issuevalue/pom.xml	(revision 1)
@@ -6,5 +6,5 @@
 	<groupId>geniusweb</groupId>
 	<artifactId>issuevalue</artifactId>
-	<version>2.2.1</version>  <!-- equals the geniusweb version -->
+	<version>1.0.0</version>
 	<packaging>jar</packaging>
 
@@ -16,6 +16,5 @@
 		<basedir>.</basedir>
 		<passwd>${env.ARTIFACTORY_PASS}</passwd>
-		<jackson-2-version>2.12.3</jackson-2-version>
-		<geniusweb.version>${project.version}</geniusweb.version>
+		<jackson-2-version>2.9.6</jackson-2-version>
 	</properties>
 
@@ -23,5 +22,5 @@
 		<repository>
 			<id>artifactory.ewi.tudelft.nl</id>
-			<url>https://artifactory.ewi.tudelft.nl/artifactory/libs-release</url>
+			<url>http://artifactory.ewi.tudelft.nl/artifactory/libs-release</url>
 		</repository>
 	</distributionManagement>
@@ -78,6 +77,6 @@
 		<dependency>
 			<groupId>org.mockito</groupId>
-			<artifactId>mockito-core</artifactId>
-			<version>3.11.2</version>
+			<artifactId>mockito-all</artifactId>
+			<version>1.9.5</version>
 			<scope>test</scope>
 		</dependency>
@@ -87,11 +86,11 @@
 			<groupId>tudelft.utilities</groupId>
 			<artifactId>junit</artifactId>
-			<version>1.0.5</version>
+			<version>1.0.2</version>
 			<scope>test</scope>
 		</dependency>
 		<dependency>
 			<groupId>tudelft.utilities</groupId>
-			<artifactId>utilities</artifactId>
-			<version>1.3.1</version>
+			<artifactId>immutablelist</artifactId>
+			<version>1.0.0</version>
 		</dependency>
 
@@ -102,19 +101,16 @@
 		<repository>
 			<id>artifactory.ewi.tudelft.nl</id>
-			<url>https://artifactory.ewi.tudelft.nl/artifactory/libs-release</url>
+			<url>http://artifactory.ewi.tudelft.nl/artifactory/libs-release</url>
 			<snapshots>
 				<enabled>false</enabled>
 			</snapshots>
 		</repository>
+
 	</repositories>
 
 	<pluginRepositories>
 		<pluginRepository>
-			<id>central</id>
-			<url>https://repo1.maven.org/maven2</url>
-		</pluginRepository>
-		<pluginRepository>
-			<id>artifactory.ewi.tudelft.nl</id>
-			<url>https://artifactory.ewi.tudelft.nl/artifactory/libs-release</url>
+			<id>jcenter</id>
+			<url>http://jcenter.bintray.com</url>
 		</pluginRepository>
 	</pluginRepositories>
@@ -136,20 +132,6 @@
 			<plugin>
 				<groupId>org.apache.maven.plugins</groupId>
-				<artifactId>maven-source-plugin</artifactId>
-				<version>3.1.0</version>
-				<executions>
-					<execution>
-						<id>attach-sources</id>
-						<goals>
-							<goal>jar</goal>
-						</goals>
-					</execution>
-				</executions>
-			</plugin>
-
-			<plugin>
-				<groupId>org.apache.maven.plugins</groupId>
 				<artifactId>maven-javadoc-plugin</artifactId>
-				<version>3.2.0</version>
+				<version>2.10.1</version>
 				<executions>
 					<execution>
@@ -158,4 +140,8 @@
 							<goal>jar</goal>
 						</goals>
+						<configuration>
+							<additionalparam>${javadoc.opts}</additionalparam>
+							<additionalparam>-Xdoclint:none</additionalparam>
+						</configuration>
 					</execution>
 				</executions>
@@ -165,5 +151,5 @@
 				<groupId>org.jfrog.buildinfo</groupId>
 				<artifactId>artifactory-maven-plugin</artifactId>
-				<version>3.2.3</version>
+				<version>2.6.1</version>
 				<executions>
 					<execution>
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");
 	}
 
Index: /issuevalue/src/test/java/geniusweb/issuevalue/BidTest.java
===================================================================
--- /issuevalue/src/test/java/geniusweb/issuevalue/BidTest.java	(revision 53)
+++ /issuevalue/src/test/java/geniusweb/issuevalue/BidTest.java	(revision 1)
@@ -8,4 +8,5 @@
 import java.util.Arrays;
 import java.util.HashMap;
+import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
@@ -16,4 +17,8 @@
 import com.fasterxml.jackson.databind.ObjectMapper;
 
+import geniusweb.issuevalue.Bid;
+import geniusweb.issuevalue.DiscreteValue;
+import geniusweb.issuevalue.NumberValue;
+import geniusweb.issuevalue.Value;
 import tudelft.utilities.junit.GeneralTests;
 
@@ -25,8 +30,7 @@
 	private final static String ISSUE2 = "issue2";
 	private final static Value VALUE2 = new NumberValue("10");
-	private final static Value VALUE3 = new NumberValue("1000");
-	private final static Value VALUE3b = new NumberValue("1e+3");
+	private final static List<List<Bid>> list = new LinkedList<>();
 
-	private final static Bid bid, bid1, bidb, bidc, bidd, bidd2;
+	private final static Bid bid, bid1, bidb, bidc;
 	static {
 		Map<String, Value> issuevalues = new HashMap<>();
@@ -56,16 +60,13 @@
 		bidc = new Bid(issuevaluesc);
 
-		Map<String, Value> issuevaluesd = new HashMap<>();
-		issuevaluesd.put(ISSUE1, VALUE3);
-		bidd = new Bid(issuevaluesd);
-		issuevaluesd.put(ISSUE1, VALUE3b);
-		bidd2 = new Bid(issuevaluesd);
-
+		list.add(Arrays.asList(bid, bid1));
+		list.add(Arrays.asList(bidb));
+		list.add(Arrays.asList(bidc));
 	}
 
 	@Override
 	public List<List<Bid>> getGeneralTestData() {
-		return Arrays.asList(Arrays.asList(bid, bid1), Arrays.asList(bidb),
-				Arrays.asList(bidc), Arrays.asList(bidd, bidd2));
+
+		return list;
 	}
 
@@ -75,6 +76,7 @@
 				"Bid\\{issue3=9012345678901234567.89, issue2=1, issue1=\"b\"\\}",
 				"Bid\\{issue2=1, issue1=\"b\"\\}",
-				"Bid\\{issue2=10, issue1=\"value1\"\\}",
-				"Bid\\{issue1=1...\\}");
+				"Bid\\{issue2=10, issue1=\"value1\"\\}"
+
+		);
 	}
 
@@ -85,5 +87,4 @@
 	}
 
-	@SuppressWarnings("unused")
 	@Test
 	public void bidTestSimple() {
@@ -92,5 +93,4 @@
 	}
 
-	@SuppressWarnings("unused")
 	@Test(expected = IllegalArgumentException.class)
 	public void bidTestNull() {
@@ -100,5 +100,4 @@
 	}
 
-	@SuppressWarnings("unused")
 	@Test
 	public void bidTestOkIssueValue() {
@@ -126,54 +125,3 @@
 	}
 
-	@Test
-	public void testMerge() {
-		Map<String, Value> issuevalues = new HashMap<>();
-		issuevalues.put(ISSUE1, VALUE1);
-		Bid partial1 = new Bid(issuevalues);
-
-		issuevalues = new HashMap<>();
-		issuevalues.put(ISSUE2, VALUE2);
-		Bid partial2 = new Bid(issuevalues);
-
-		Bid mergedbid = partial1.merge(partial2);
-		assertEquals(bidc, mergedbid);
-	}
-
-	@Test(expected = IllegalArgumentException.class)
-	public void testMergeIssuesOverlap() {
-		Map<String, Value> issuevalues = new HashMap<>();
-		issuevalues.put(ISSUE1, VALUE1);
-		Bid partial1 = new Bid(issuevalues);
-
-		issuevalues = new HashMap<>();
-		issuevalues.put(ISSUE1, VALUE2);
-		Bid partial2 = new Bid(issuevalues);
-
-		partial1.merge(partial2);
-	}
-
-	@SuppressWarnings("unused")
-	@Test
-	public void smokeTestConstructor2() {
-		new Bid("issue", new DiscreteValue("dss"));
-	}
-
-	@SuppressWarnings("unused")
-	@Test
-	public void smokeTestConstructor2b() {
-		new Bid("issue", new NumberValue("0.5"));
-	}
-
-	@SuppressWarnings("unused")
-	@Test(expected = NullPointerException.class)
-	public void smokeTestConstructor2Null1() {
-		new Bid(null, new DiscreteValue("dss"));
-	}
-
-	@SuppressWarnings("unused")
-	@Test(expected = NullPointerException.class)
-	public void smokeTestConstructor2Null2() {
-		new Bid("issue", null);
-	}
-
 }
Index: /issuevalue/src/test/java/geniusweb/issuevalue/DiscreteValueSetTest.java
===================================================================
--- /issuevalue/src/test/java/geniusweb/issuevalue/DiscreteValueSetTest.java	(revision 53)
+++ /issuevalue/src/test/java/geniusweb/issuevalue/DiscreteValueSetTest.java	(revision 1)
@@ -19,4 +19,7 @@
 import com.fasterxml.jackson.databind.ObjectMapper;
 
+import geniusweb.issuevalue.DiscreteValue;
+import geniusweb.issuevalue.DiscreteValueSet;
+
 public class DiscreteValueSetTest {
 
@@ -32,6 +35,5 @@
 			valuesReverse);
 	private static final String asString = "{\"values\":[\"a\",\"b\"]}";
-	// private static final String asString = "{\"DiscreteValueSet
-	// \":[\"a\",\"b\"]}";
+	// private static final String asString = "{\"discreteset\":[\"a\",\"b\"]}";
 	private static final String asString1 = "[\"a\",\"b\"]";
 
@@ -39,8 +41,8 @@
 	// parsed as discrete values.
 	private static final String discretenumbers = "{\"values\":[\"0\",\"1\"]}";
-	private static final ObjectMapper jackson = new ObjectMapper();
 
 	@Test
 	public void testSerialize() throws JsonProcessingException {
+		ObjectMapper jackson = new ObjectMapper();
 
 		String json = jackson.writeValueAsString(set);
@@ -52,4 +54,5 @@
 	public void testDeserialize()
 			throws JsonParseException, JsonMappingException, IOException {
+		ObjectMapper jackson = new ObjectMapper();
 		DiscreteValueSet p = jackson.readValue(asString,
 				DiscreteValueSet.class);
@@ -61,4 +64,5 @@
 	public void testDeserializeNumberValues()
 			throws JsonParseException, JsonMappingException, IOException {
+		ObjectMapper jackson = new ObjectMapper();
 		DiscreteValueSet p = jackson.readValue(discretenumbers,
 				DiscreteValueSet.class);
Index: /issuevalue/src/test/java/geniusweb/issuevalue/DiscreteValueTest.java
===================================================================
--- /issuevalue/src/test/java/geniusweb/issuevalue/DiscreteValueTest.java	(revision 53)
+++ /issuevalue/src/test/java/geniusweb/issuevalue/DiscreteValueTest.java	(revision 1)
@@ -13,15 +13,17 @@
 import com.fasterxml.jackson.databind.ObjectMapper;
 
+import geniusweb.issuevalue.DiscreteValue;
+import geniusweb.issuevalue.Value;
 import tudelft.utilities.junit.GeneralTests;
 
 public class DiscreteValueTest extends GeneralTests<DiscreteValue> {
-	private final DiscreteValue value = new DiscreteValue("a");
-	private final DiscreteValue value1 = new DiscreteValue("a");
-	private final DiscreteValue valueb = new DiscreteValue("b");
-	private final String serialized = "\"a\"";
-	private static final ObjectMapper jackson = new ObjectMapper();
+	private DiscreteValue value = new DiscreteValue("a");
+	private DiscreteValue value1 = new DiscreteValue("a");
+	private DiscreteValue valueb = new DiscreteValue("b");
+	private String serialized = "\"a\"";
 
 	@Test
 	public void testSerialize() throws JsonProcessingException {
+		ObjectMapper jackson = new ObjectMapper();
 		assertEquals(serialized, jackson.writeValueAsString(value));
 	}
@@ -29,4 +31,5 @@
 	@Test
 	public void testDeserialize() throws IOException {
+		ObjectMapper jackson = new ObjectMapper();
 		assertEquals(value, jackson.readValue(serialized, DiscreteValue.class));
 	}
@@ -34,4 +37,5 @@
 	@Test
 	public void testDeserializeFromValue() throws IOException {
+		ObjectMapper jackson = new ObjectMapper();
 		assertEquals(value, jackson.readValue(serialized, Value.class));
 	}
@@ -39,4 +43,5 @@
 	@Override
 	public List<List<DiscreteValue>> getGeneralTestData() {
+
 		List<List<DiscreteValue>> list = new LinkedList<>();
 		list.add(Arrays.asList(value, value1));
Index: /issuevalue/src/test/java/geniusweb/issuevalue/DomainTest.java
===================================================================
--- /issuevalue/src/test/java/geniusweb/issuevalue/DomainTest.java	(revision 53)
+++ /issuevalue/src/test/java/geniusweb/issuevalue/DomainTest.java	(revision 1)
@@ -2,5 +2,4 @@
 
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertThat;
 import static org.mockito.Mockito.mock;
@@ -22,13 +21,16 @@
 import com.fasterxml.jackson.databind.ObjectMapper;
 
+import geniusweb.issuevalue.Bid;
+import geniusweb.issuevalue.DiscreteValue;
+import geniusweb.issuevalue.DiscreteValueSet;
+import geniusweb.issuevalue.Domain;
+import geniusweb.issuevalue.NumberValue;
+import geniusweb.issuevalue.NumberValueSet;
+import geniusweb.issuevalue.ValueSet;
 import tudelft.utilities.junit.GeneralTests;
 
 public class DomainTest extends GeneralTests<Domain> {
-	private static final BigDecimal TWO = new BigDecimal("2");
-	private static final BigDecimal THREE = new BigDecimal("3");
-
 	private static final DiscreteValue I1V2 = new DiscreteValue("i1v2");
 	private static final DiscreteValue I1V1 = new DiscreteValue("i1v1");
-	private static final NumberValue I2V1 = new NumberValue(TWO);
 	private static final String DOMAINNAME = "testdomain";
 	private static final String ISSUE1 = "issue1";
@@ -36,5 +38,5 @@
 	private static final String ISSUE3 = "issue3";
 	private static final ObjectMapper jackson = new ObjectMapper();
-	private static final String domainstring = "{\"name\":\"testdomain\",\"issuesValues\":{\"issue2\":{\"range\":{\"low\":2,\"high\":3,\"step\":0.22}},\"issue1\":{\"values\":[\"i1v1\",\"i1v2\"]}}}";
+	private static final String domainstring = "{\"name\":\"testdomain\",\"issuesValues\":{\"issue2\":{\"range\":[\"2\",\"3\",\"0.22\"]},\"issue1\":{\"values\":[\"i1v1\",\"i1v2\"]}}}";
 
 	private static final String jobsstring = "{\"name\":\"jobs\","
@@ -50,4 +52,7 @@
 	private static final ValueSet values1;
 	private static final ValueSet values2;
+	private static final BigDecimal TWO = new BigDecimal("2");
+	private static final BigDecimal THREE = new BigDecimal("3");
+
 	private static final Domain domain, domain1, domain2, domain3;
 
@@ -150,5 +155,5 @@
 		when(bid.getValue(ISSUE2)).thenReturn(new NumberValue(THREE));
 		assertThat(domain.isComplete(bid),
-				new PatternMatch("issue 'issue2' in bid has illegal value 3"));
+				new PatternMatch("bid issue issue2 has illegal value 3"));
 	}
 
@@ -176,29 +181,3 @@
 	}
 
-	@Test
-	public void testIsFittingPartialBid() {
-		Bid bid = new Bid(ISSUE1, I1V1);
-		assertNull(domain.isFitting(bid));
-	}
-
-	@Test
-	public void testIsFittingWrongTypeBid() {
-		Bid bid = new Bid(ISSUE1, I2V1);
-		assertThat(domain.isFitting(bid),
-				new PatternMatch("issue 'issue1' in bid has illegal value 2"));
-	}
-
-	@Test
-	public void testIsFittingNonsenseValue() {
-		Bid bid = new Bid(ISSUE1, new DiscreteValue("nonsense"));
-		assertThat(domain.isFitting(bid), new PatternMatch(
-				"issue 'issue1' in bid has illegal value \"nonsense\""));
-	}
-
-	@Test
-	public void testIsFittingNonsenseIssue() {
-		Bid bid = new Bid("nonsense", I1V1);
-		assertThat(domain.isFitting(bid), new PatternMatch(
-				"bid .* refers to non-domain issue 'nonsense'"));
-	}
 }
Index: /issuevalue/src/test/java/geniusweb/issuevalue/NumberValueSetTest.java
===================================================================
--- /issuevalue/src/test/java/geniusweb/issuevalue/NumberValueSetTest.java	(revision 53)
+++ /issuevalue/src/test/java/geniusweb/issuevalue/NumberValueSetTest.java	(revision 1)
@@ -16,4 +16,7 @@
 import com.fasterxml.jackson.databind.ObjectMapper;
 
+import geniusweb.issuevalue.NumberValue;
+import geniusweb.issuevalue.NumberValueSet;
+import geniusweb.issuevalue.ValueSet;
 import tudelft.utilities.immutablelist.Range;
 
@@ -23,16 +26,14 @@
 	private static final BigDecimal TWELVE_SIX = new BigDecimal("12.6");
 	private static final BigDecimal TWELVE_TWO = new BigDecimal("12.2");
-	private final static NumberValueSet set = new NumberValueSet(TWELVE_TWO,
-			TWELVE_SIX, ZERO_THREE);
-	private final static NumberValueSet set1 = new NumberValueSet(TWELVE_TWO,
-			TWELVE_SIX, ZERO_THREE);
-	private final static NumberValueSet setb = new NumberValueSet(TWELVE_TWO,
-			new BigDecimal("12.6000000000001"), ZERO_THREE);
-	private final static NumberValueSet set10 = new NumberValueSet(
-			BigDecimal.ZERO, BigDecimal.ONE, new BigDecimal("0.1"));
+	private final static NumberValueSet set = new NumberValueSet(TWELVE_TWO, TWELVE_SIX, ZERO_THREE);
+	private final static NumberValueSet set1 = new NumberValueSet(TWELVE_TWO, TWELVE_SIX, ZERO_THREE);
+	private final static NumberValueSet setb = new NumberValueSet(TWELVE_TWO, new BigDecimal("12.6000000000001"),
+			ZERO_THREE);
+	private final static NumberValueSet set10 = new NumberValueSet(BigDecimal.ZERO, BigDecimal.ONE,
+			new BigDecimal("0.1"));
 
-	private final String asString = "{\"range\":{\"low\":12.2,\"high\":12.6,\"step\":0.3}}";
-	private final static NumberValueSet bigset = new NumberValueSet(
-			BigDecimal.ZERO, BigDecimal.TEN, new BigDecimal("0.00003"));
+	private final String asString = "{\"range\":[\"12.2\",\"12.6\",\"0.3\"]}";
+	private final static NumberValueSet bigset = new NumberValueSet(BigDecimal.ZERO, BigDecimal.TEN,
+			new BigDecimal("0.00003"));
 
 	@Test(expected = IllegalArgumentException.class)
@@ -43,12 +44,10 @@
 	@Test(expected = IllegalArgumentException.class)
 	public void testConstructor2() {
-		new NumberValueSet(BigDecimal.ZERO, BigDecimal.TEN,
-				new BigDecimal("-1"));
+		new NumberValueSet(BigDecimal.ZERO, BigDecimal.TEN, new BigDecimal("-1"));
 	}
 
 	@Test
 	public void testIterator() {
-		assertEquals(new NumberValue(BigDecimal.ZERO),
-				bigset.iterator().next());
+		assertEquals(new NumberValue(BigDecimal.ZERO), bigset.iterator().next());
 	}
 
@@ -63,6 +62,5 @@
 
 	@Test
-	public void testDeserialize()
-			throws JsonParseException, JsonMappingException, IOException {
+	public void testDeserialize() throws JsonParseException, JsonMappingException, IOException {
 		ObjectMapper jackson = new ObjectMapper();
 		ValueSet p = jackson.readValue(asString, NumberValueSet.class);
@@ -97,6 +95,5 @@
 	@Test
 	public void getRangeTest() {
-		assertEquals(new Range(TWELVE_TWO, TWELVE_SIX, ZERO_THREE),
-				set.getRange());
+		assertEquals(new Range(TWELVE_TWO, TWELVE_SIX, ZERO_THREE), set.getRange());
 	}
 
@@ -105,6 +102,5 @@
 		assertEquals(new NumberValue(TWELVE_TWO), set.get(BigInteger.ZERO));
 		assertEquals(new NumberValue(TWELVE_TWO), set.get(0));
-		assertEquals(new NumberValue(TWELVE_TWO.add(ZERO_THREE)),
-				set.get(BigInteger.ONE));
+		assertEquals(new NumberValue(TWELVE_TWO.add(ZERO_THREE)), set.get(BigInteger.ONE));
 	}
 
Index: /issuevalue/src/test/java/geniusweb/issuevalue/NumberValueTest.java
===================================================================
--- /issuevalue/src/test/java/geniusweb/issuevalue/NumberValueTest.java	(revision 53)
+++ /issuevalue/src/test/java/geniusweb/issuevalue/NumberValueTest.java	(revision 1)
@@ -7,4 +7,5 @@
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.LinkedList;
 import java.util.List;
 
@@ -16,32 +17,33 @@
 import com.fasterxml.jackson.databind.ObjectMapper;
 
+import geniusweb.issuevalue.NumberValue;
+import geniusweb.issuevalue.Value;
 import tudelft.utilities.junit.GeneralTests;
 
 public class NumberValueTest extends GeneralTests<NumberValue> {
-	private final NumberValue value = new NumberValue("12.31");
-	private final NumberValue value1 = new NumberValue("12.31");
-	private final NumberValue valueb = new NumberValue("12.3100000000001");
-	private final NumberValue valuec = new NumberValue("1000");
-	private final NumberValue valuec2 = new NumberValue("1e+3");
-	private final String serialized = "12.31";
+	private NumberValue value = new NumberValue("12.31");
+	private NumberValue value1 = new NumberValue("12.31");
+	private NumberValue valueb = new NumberValue("12.310000000000000001");
+	private String serialized = "12.31";
 
-	private final String bigserialized = "8748703924870439218876954320948372058";
-	private final NumberValue bigvalue = new NumberValue(bigserialized);
-	private static final ObjectMapper jackson = new ObjectMapper();
+	private String bigserialized = "8748703924870439218876954320948372058";
+	private NumberValue bigvalue = new NumberValue(bigserialized);
 
 	@Override
 	public List<List<NumberValue>> getGeneralTestData() {
-		return Arrays.asList(Arrays.asList(value, value1),
-				Arrays.asList(valueb), Arrays.asList(valuec, valuec2));
+		List<List<NumberValue>> list = new LinkedList<>();
+		list.add(Arrays.asList(value, value1));
+		list.add(Arrays.asList(valueb));
+		return list;
 	}
 
 	@Override
 	public List<String> getGeneralTestStrings() {
-		// 1000 and 1e+3 are bot ok
-		return Arrays.asList("12.31", "12.3100000000001", "1...");
+		return Arrays.asList("12.31", "12.310000000000000001");
 	}
 
 	@Test
 	public void testSerialize() throws JsonProcessingException {
+		ObjectMapper jackson = new ObjectMapper();
 		assertEquals(serialized, jackson.writeValueAsString(value));
 	}
@@ -49,4 +51,5 @@
 	@Test
 	public void testDeserialize() throws IOException {
+		ObjectMapper jackson = new ObjectMapper();
 		assertEquals(value, jackson.readValue(serialized, NumberValue.class));
 
@@ -55,4 +58,5 @@
 	@Test
 	public void testDeserializeFromValue() throws IOException {
+		ObjectMapper jackson = new ObjectMapper();
 		assertEquals(value, jackson.readValue(serialized, Value.class));
 
@@ -61,4 +65,5 @@
 	@Test
 	public void testBigSerialize() throws JsonProcessingException {
+		ObjectMapper jackson = new ObjectMapper();
 		assertEquals(bigserialized, jackson.writeValueAsString(bigvalue));
 	}
@@ -66,4 +71,5 @@
 	@Test
 	public void testBigDeserialize() throws IOException {
+		ObjectMapper jackson = new ObjectMapper();
 		assertEquals(bigvalue,
 				jackson.readValue(bigserialized, NumberValue.class));
@@ -73,4 +79,5 @@
 	@Test
 	public void testSerializeShorts() throws IOException {
+		ObjectMapper jackson = new ObjectMapper();
 		System.out.println(
 				jackson.writeValueAsString(new short[] { 1, 2, 3, 4, 5 }));
@@ -80,7 +87,6 @@
 	@Test
 	public void testDeserializeShorts() throws IOException {
-		@SuppressWarnings("unchecked")
-		ArrayList<Integer> list = jackson.readValue("[1,2,3,4,5]",
-				ArrayList.class);
+		ObjectMapper jackson = new ObjectMapper();
+		ArrayList list = jackson.readValue("[1,2,3,4,5]", ArrayList.class);
 		System.out.println(list);
 		System.out.println(list.get(0).getClass());
@@ -90,6 +96,6 @@
 	@Test
 	public void testDeserializeMix() throws IOException {
-		@SuppressWarnings("unchecked")
-		ArrayList<Object> list = jackson.readValue("[\"short\",1,2,3,4,5]",
+		ObjectMapper jackson = new ObjectMapper();
+		ArrayList list = jackson.readValue("[\"short\",1,2,3,4,5]",
 				ArrayList.class);
 		System.out.println(list);
@@ -105,4 +111,5 @@
 	public void testDeserializePlainNumber()
 			throws JsonParseException, JsonMappingException, IOException {
+		ObjectMapper jackson = new ObjectMapper();
 		String valstr = "483958743698732691487326987569213874694328974329874328947320984372498327493827432987231874681273648127";
 		BigDecimal val = jackson.readValue(valstr, BigDecimal.class);
@@ -112,4 +119,5 @@
 	@Test
 	public void testNumberBlab() throws IOException {
+		ObjectMapper jackson = new ObjectMapper();
 		// jackson.enable(DeserializationFeature.USE_BIG_DECIMAL_FOR_FLOATS);
 		assertEquals(value, jackson.readValue("12.31", Value.class));
@@ -117,12 +125,3 @@
 	}
 
-	@Test
-	public void testDeserializeScientificNotation()
-			throws JsonParseException, JsonMappingException, IOException {
-		String valstr = "9E+2";
-		Value val = jackson.readValue(valstr, Value.class);
-		assertEquals(valstr, val.toString());
-		assertEquals(val, new NumberValue(new BigDecimal("900")));
-	}
-
 }
Index: /party/pom.xml
===================================================================
--- /party/pom.xml	(revision 53)
+++ /party/pom.xml	(revision 1)
@@ -6,5 +6,5 @@
 	<groupId>geniusweb</groupId>
 	<artifactId>party</artifactId>
-	<version>2.2.1</version>  <!-- equals the geniusweb version -->
+	<version>1.0.0</version>
 	<packaging>jar</packaging>
 
@@ -16,6 +16,5 @@
 		<basedir>.</basedir>
 		<passwd>${env.ARTIFACTORY_PASS}</passwd>
-		<jackson-2-version>2.12.3</jackson-2-version>
-		<geniusweb.version>${project.version}</geniusweb.version>
+		<jackson-2-version>2.9.6</jackson-2-version>
 	</properties>
 
@@ -23,5 +22,5 @@
 		<repository>
 			<id>artifactory.ewi.tudelft.nl</id>
-			<url>https://artifactory.ewi.tudelft.nl/artifactory/libs-release</url>
+			<url>http://artifactory.ewi.tudelft.nl/artifactory/libs-release</url>
 		</repository>
 	</distributionManagement>
@@ -32,30 +31,30 @@
 			<groupId>geniusweb</groupId>
 			<artifactId>timeline</artifactId>
-			<version>${geniusweb.version}</version>
+			<version>1.0.0</version>
 		</dependency>
 		<dependency>
 			<groupId>geniusweb</groupId>
 			<artifactId>profile</artifactId>
-			<version>${geniusweb.version}</version>
+			<version>1.0.0</version>
 		</dependency>
 		<dependency>
 			<groupId>geniusweb</groupId>
 			<artifactId>events</artifactId>
-			<version>${geniusweb.version}</version>
+			<version>1.0.0</version>
+		</dependency>
+		<dependency>
+			<groupId>tudelft.utilities</groupId>
+			<artifactId>listener</artifactId>
+			<version>1.0.0</version>
 		</dependency>
 		<dependency>
 			<groupId>geniusweb</groupId>
 			<artifactId>references</artifactId>
-			<version>${geniusweb.version}</version>
-		</dependency>
-		<dependency>
-			<groupId>tudelft.utilities</groupId>
-			<artifactId>utilities</artifactId>
-			<version>1.3.1</version>
+			<version>1.0.0</version>
 		</dependency>
 		<dependency>
 			<groupId>tudelft.utilities</groupId>
 			<artifactId>logging</artifactId>
-			<version>1.0.1</version>
+			<version>1.0.0</version>
 		</dependency>
 
@@ -110,6 +109,6 @@
 		<dependency>
 			<groupId>org.mockito</groupId>
-			<artifactId>mockito-core</artifactId>
-			<version>3.11.2</version>
+			<artifactId>mockito-all</artifactId>
+			<version>1.9.5</version>
 			<scope>test</scope>
 		</dependency>
@@ -117,5 +116,5 @@
 			<groupId>tudelft.utilities</groupId>
 			<artifactId>junit</artifactId>
-			<version>1.0.5</version>
+			<version>1.0.2</version>
 			<scope>test</scope>
 		</dependency>
@@ -128,21 +127,19 @@
 		<repository>
 			<id>artifactory.ewi.tudelft.nl</id>
-			<url>https://artifactory.ewi.tudelft.nl/artifactory/libs-release</url>
+			<url>http://artifactory.ewi.tudelft.nl/artifactory/libs-release</url>
 			<snapshots>
 				<enabled>false</enabled>
 			</snapshots>
 		</repository>
+
 	</repositories>
 
 	<pluginRepositories>
 		<pluginRepository>
-			<id>central</id>
-			<url>https://repo1.maven.org/maven2</url>
-		</pluginRepository>
-		<pluginRepository>
-			<id>artifactory.ewi.tudelft.nl</id>
-			<url>https://artifactory.ewi.tudelft.nl/artifactory/libs-release</url>
+			<id>jcenter</id>
+			<url>http://jcenter.bintray.com</url>
 		</pluginRepository>
 	</pluginRepositories>
+
 
 	<build>
@@ -158,22 +155,9 @@
 				</configuration>
 			</plugin>
-			<plugin>
-				<groupId>org.apache.maven.plugins</groupId>
-				<artifactId>maven-source-plugin</artifactId>
-				<version>3.1.0</version>
-				<executions>
-					<execution>
-						<id>attach-sources</id>
-						<goals>
-							<goal>jar</goal>
-						</goals>
-					</execution>
-				</executions>
-			</plugin>
 
 			<plugin>
 				<groupId>org.apache.maven.plugins</groupId>
 				<artifactId>maven-javadoc-plugin</artifactId>
-				<version>3.2.0</version>
+				<version>2.10.1</version>
 				<executions>
 					<execution>
@@ -182,4 +166,8 @@
 							<goal>jar</goal>
 						</goals>
+						<configuration>
+							<additionalparam>${javadoc.opts}</additionalparam>
+							<additionalparam>-Xdoclint:none</additionalparam>
+						</configuration>
 					</execution>
 				</executions>
@@ -189,5 +177,5 @@
 				<groupId>org.jfrog.buildinfo</groupId>
 				<artifactId>artifactory-maven-plugin</artifactId>
-				<version>3.2.3</version>
+				<version>2.6.1</version>
 				<executions>
 					<execution>
Index: /party/src/main/java/geniusweb/party/Capabilities.java
===================================================================
--- /party/src/main/java/geniusweb/party/Capabilities.java	(revision 53)
+++ /party/src/main/java/geniusweb/party/Capabilities.java	(revision 1)
@@ -5,9 +5,9 @@
 import com.fasterxml.jackson.annotation.JsonAutoDetect;
 import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility;
+
+import geniusweb.references.ProtocolRef;
+
 import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonProperty;
-
-import geniusweb.profile.Profile;
-import geniusweb.references.ProtocolRef;
 
 /**
@@ -17,48 +17,22 @@
 public class Capabilities {
 	/**
-	 * List of supported protocol names
+	 * List of supported protocols
 	 */
-	private final Set<String> behaviours;
-	/**
-	 * The profile classes that are supported
-	 */
-	private final Set<Class<? extends Profile>> profiles;
+	private final Set<ProtocolRef> protocols;
 
 	/**
 	 * 
-	 * @param behaviours the {@link ProtocolRef} that a Party can handle, as
-	 *                   returned by NegoProtocol.getRef()
-	 * @param profiles   the {@link Profile} classes that Party acan handle
+	 * @param protocols the protocols that a Party can handle
 	 */
 	@JsonCreator
-	public Capabilities(@JsonProperty("behaviours") Set<String> behaviours,
-			@JsonProperty("profiles") Set<Class<? extends Profile>> profiles) {
-		if (behaviours == null) {
-			throw new IllegalArgumentException("behaviours==null");
+	public Capabilities(@JsonProperty("protocols") Set<ProtocolRef> protocols) {
+		if (protocols == null) {
+			throw new IllegalArgumentException("protocols==null");
 		}
-		for (Class<? extends Profile> prof : profiles) {
-			if (!Profile.class.isAssignableFrom(prof))
-				throw new IllegalArgumentException(
-						"profile " + prof + " must be a subclass of Profile");
-		}
-		this.behaviours = behaviours;
-		this.profiles = profiles;
+		this.protocols = protocols;
 	}
 
-	/**
-	 * 
-	 * @return the behaviours (protocols) that are supported
-	 */
-	public Set<String> getBehaviours() {
-		return behaviours;
-	}
-
-	/**
-	 * 
-	 * @return the profile classes that are supported
-	 * 
-	 */
-	public Set<Class<? extends Profile>> getProfiles() {
-		return profiles;
+	public Set<ProtocolRef> getProtocols() {
+		return protocols;
 	}
 
@@ -68,7 +42,5 @@
 		int result = 1;
 		result = prime * result
-				+ ((behaviours == null) ? 0 : behaviours.hashCode());
-		result = prime * result
-				+ ((profiles == null) ? 0 : profiles.hashCode());
+				+ ((protocols == null) ? 0 : protocols.hashCode());
 		return result;
 	}
@@ -83,13 +55,8 @@
 			return false;
 		Capabilities other = (Capabilities) obj;
-		if (behaviours == null) {
-			if (other.behaviours != null)
+		if (protocols == null) {
+			if (other.protocols != null)
 				return false;
-		} else if (!behaviours.equals(other.behaviours))
-			return false;
-		if (profiles == null) {
-			if (other.profiles != null)
-				return false;
-		} else if (!profiles.equals(other.profiles))
+		} else if (!protocols.equals(other.protocols))
 			return false;
 		return true;
@@ -98,5 +65,5 @@
 	@Override
 	public String toString() {
-		return "Capabilities[" + profiles + "," + behaviours + "]";
+		return "Capabilities[" + "Protocols=" + protocols + "]";
 	}
 
Index: /party/src/main/java/geniusweb/party/DefaultParty.java
===================================================================
--- /party/src/main/java/geniusweb/party/DefaultParty.java	(revision 53)
+++ /party/src/main/java/geniusweb/party/DefaultParty.java	(revision 1)
@@ -2,6 +2,6 @@
 
 import geniusweb.actions.Action;
-import geniusweb.connection.ConnectionEnd;
-import geniusweb.inform.Inform;
+import geniusweb.connection.Connection;
+import geniusweb.party.inform.Inform;
 import tudelft.utilities.listener.Listener;
 import tudelft.utilities.logging.ReportToLogger;
@@ -13,5 +13,5 @@
  */
 public abstract class DefaultParty implements Party, Listener<Inform> {
-	private ConnectionEnd<Inform, Action> connection = null;
+	private Connection<Inform, Action> connection = null;
 	protected Reporter reporter;
 
@@ -25,5 +25,5 @@
 
 	@Override
-	public void connect(ConnectionEnd<Inform, Action> connection) {
+	public void connect(Connection<Inform, Action> connection) {
 		this.connection = connection;
 		connection.addListener(this);
@@ -34,5 +34,4 @@
 		if (connection != null) {
 			connection.removeListener(this);
-			connection.close();
 			this.connection = null;
 		}
@@ -48,5 +47,5 @@
 	 *         connected.
 	 */
-	public ConnectionEnd<Inform, Action> getConnection() {
+	public Connection<Inform, Action> getConnection() {
 		return connection;
 	}
Index: /party/src/main/java/geniusweb/party/Party.java
===================================================================
--- /party/src/main/java/geniusweb/party/Party.java	(revision 53)
+++ /party/src/main/java/geniusweb/party/Party.java	(revision 1)
@@ -3,6 +3,5 @@
 import geniusweb.actions.Action;
 import geniusweb.connection.Connectable;
-import geniusweb.connection.ConnectionEnd;
-import geniusweb.inform.Inform;
+import geniusweb.party.inform.Inform;
 
 /**
@@ -15,24 +14,7 @@
  * your class may also be created only to call the getCapabilities function.
  * 
- * <h2>Short outline</h2> After the party is created (empty constructor) it is
- * first connected through a call to connect (from the {@link Connectable}
- * interface). The party can subscribe to receive {@link Inform} objects using
- * {@link ConnectionEnd#addListener(tudelft.utilities.listener.Listener)}. The
- * party can also send its actions using {@link ConnectionEnd#send(Object)}.
- * 
- * The {@link ConnectionEnd} allows the party to receive Inform objects and send
- * action objects.
- * 
- * Incoming Inform objects (eg "Settings" containing the profile, and
- * "yourturn") are notified to the party throught he notifyChange() call to the
- * party.
- * <p>
- * Outgoing Action objects (eg "Offer") are sent using the send() command.
- * 
- * Most parties extend {@link DefaultParty} to handle these connection details.
  * <p>
  * Technical details: normally a Party will be spawned inside a PartiesFactory,
- * and incoming/outgoing calls are routed through a websocket there. But in
- * testing the Connectable is often mocked.
+ * and incoming/outgoing calls are routed through a websocket there.
  * 
  */
@@ -52,13 +34,7 @@
 
 	/**
-	 * When this is called, the party must free up all its claimed resources
-	 * (memory, CPU, files, etc) immediately. This call can come in at any time
-	 * (when a negotiation is aborted early), even while your party is still
-	 * working on something else. Other parties for the next session may be
-	 * started within a few seconds after this request to your party. The exact
-	 * time is decided by the partyserver you use but typically 2 seconds. Not
-	 * respecting this call and continue using the system resources will
-	 * deteriorate performance of other parties running on the same machine,
-	 * which may be against the assignment/competition rules.
+	 * When this is called, the party should free up its resources and terminate
+	 * its threads. This call may come in at any time, eg when a negotiation is
+	 * aborted.
 	 */
 	void terminate();
Index: /party/src/main/java/geniusweb/party/inform/ActionDone.java
===================================================================
--- /party/src/main/java/geniusweb/party/inform/ActionDone.java	(revision 1)
+++ /party/src/main/java/geniusweb/party/inform/ActionDone.java	(revision 1)
@@ -0,0 +1,53 @@
+package geniusweb.party.inform;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+import geniusweb.actions.Action;
+
+/**
+ * Informs that someone did an action
+ */
+public class ActionDone implements Inform {
+
+	private final Action action;
+
+	@JsonCreator
+	public ActionDone(@JsonProperty("action") Action action) {
+		this.action = action;
+	}
+
+	public Action getAction() {
+		return action;
+	}
+
+	@Override
+	public String toString() {
+		return "ActionDone[" + action + "]";
+	}
+
+	@Override
+	public int hashCode() {
+		final int prime = 31;
+		int result = 1;
+		result = prime * result + ((action == null) ? 0 : action.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;
+		ActionDone other = (ActionDone) obj;
+		if (action == null) {
+			if (other.action != null)
+				return false;
+		} else if (!action.equals(other.action))
+			return false;
+		return true;
+	}
+}
Index: /party/src/main/java/geniusweb/party/inform/Finished.java
===================================================================
--- /party/src/main/java/geniusweb/party/inform/Finished.java	(revision 1)
+++ /party/src/main/java/geniusweb/party/inform/Finished.java	(revision 1)
@@ -0,0 +1,61 @@
+package geniusweb.party.inform;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+import geniusweb.issuevalue.Bid;
+
+/**
+ * Informs that the session is finished, and also contains the bid that was
+ * agreed on.
+ *
+ */
+public class Finished implements Inform {
+	private final Bid agreedBid;
+
+	/**
+	 * The session finished (can be for any reason).
+	 * 
+	 * @param agreedBid the bid that was finally agreed on; null if no
+	 *                  agreement.
+	 */
+	@JsonCreator
+	public Finished(@JsonProperty("agreedBid") Bid agreedBid) {
+		this.agreedBid = agreedBid;
+	}
+
+	public Bid getAgreement() {
+		return agreedBid;
+	}
+
+	@Override
+	public int hashCode() {
+		final int prime = 31;
+		int result = 1;
+		result = prime * result
+				+ ((agreedBid == null) ? 0 : agreedBid.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;
+		Finished other = (Finished) obj;
+		if (agreedBid == null) {
+			if (other.agreedBid != null)
+				return false;
+		} else if (!agreedBid.equals(other.agreedBid))
+			return false;
+		return true;
+	}
+
+	@Override
+	public String toString() {
+		return "Finished[" + agreedBid + "]";
+	}
+}
Index: /party/src/main/java/geniusweb/party/inform/Inform.java
===================================================================
--- /party/src/main/java/geniusweb/party/inform/Inform.java	(revision 1)
+++ /party/src/main/java/geniusweb/party/inform/Inform.java	(revision 1)
@@ -0,0 +1,23 @@
+package geniusweb.party.inform;
+
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility;
+
+import geniusweb.party.Party;
+
+import com.fasterxml.jackson.annotation.JsonSubTypes;
+import com.fasterxml.jackson.annotation.JsonTypeInfo;
+
+/**
+ * base class of all information sent to the {@link Party}
+ */
+@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.WRAPPER_OBJECT)
+@JsonSubTypes({ @JsonSubTypes.Type(value = ActionDone.class),
+		@JsonSubTypes.Type(value = Inform.class),
+		@JsonSubTypes.Type(value = Settings.class),
+		@JsonSubTypes.Type(value = Finished.class),
+		@JsonSubTypes.Type(value = YourTurn.class) })
+@JsonAutoDetect(fieldVisibility = Visibility.ANY, getterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE)
+public interface Inform {
+
+}
Index: /party/src/main/java/geniusweb/party/inform/Settings.java
===================================================================
--- /party/src/main/java/geniusweb/party/inform/Settings.java	(revision 1)
+++ /party/src/main/java/geniusweb/party/inform/Settings.java	(revision 1)
@@ -0,0 +1,104 @@
+package geniusweb.party.inform;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+import geniusweb.actions.PartyId;
+import geniusweb.progress.Progress;
+import geniusweb.references.ProfileRef;
+import geniusweb.references.ProtocolRef;
+
+/**
+ * Informs a party about all settings for the upcoming negotiation session. This
+ * should be sent to a party one time, so that the party knows the situation.
+ *
+ */
+public class Settings implements Inform {
+	private ProfileRef profile;
+	private ProtocolRef protocol;
+	private Progress progress;
+	private PartyId id;
+
+	@JsonCreator
+	public Settings(@JsonProperty("id") PartyId id,
+			@JsonProperty("profile") ProfileRef profile,
+			@JsonProperty("protocol") ProtocolRef protocol,
+			@JsonProperty("progress") Progress progress) {
+		if (profile == null || protocol == null || progress == null) {
+			throw new IllegalArgumentException(
+					"party, profile, protocol and progress must be not null.");
+		}
+		this.profile = profile;
+		this.protocol = protocol;
+		this.progress = progress;
+		this.id = id;
+	}
+
+	public ProfileRef getProfile() {
+		return profile;
+	}
+
+	public ProtocolRef getProtocol() {
+		return protocol;
+	}
+
+	public Progress getProgress() {
+		return progress;
+	}
+
+	public PartyId getID() {
+		return id;
+	}
+
+	@Override
+	public String toString() {
+		return "Settings[" + id + "," + profile + "," + protocol + ","
+				+ progress + "]";
+	}
+
+	@Override
+	public int hashCode() {
+		final int prime = 31;
+		int result = 1;
+		result = prime * result + ((id == null) ? 0 : id.hashCode());
+		result = prime * result + ((profile == null) ? 0 : profile.hashCode());
+		result = prime * result
+				+ ((progress == null) ? 0 : progress.hashCode());
+		result = prime * result
+				+ ((protocol == null) ? 0 : protocol.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;
+		Settings other = (Settings) obj;
+		if (id == null) {
+			if (other.id != null)
+				return false;
+		} else if (!id.equals(other.id))
+			return false;
+		if (profile == null) {
+			if (other.profile != null)
+				return false;
+		} else if (!profile.equals(other.profile))
+			return false;
+		if (progress == null) {
+			if (other.progress != null)
+				return false;
+		} else if (!progress.equals(other.progress))
+			return false;
+		if (protocol == null) {
+			if (other.protocol != null)
+				return false;
+		} else if (!protocol.equals(other.protocol))
+			return false;
+		return true;
+	}
+
+}
Index: /party/src/main/java/geniusweb/party/inform/YourTurn.java
===================================================================
--- /party/src/main/java/geniusweb/party/inform/YourTurn.java	(revision 1)
+++ /party/src/main/java/geniusweb/party/inform/YourTurn.java	(revision 1)
@@ -0,0 +1,28 @@
+package geniusweb.party.inform;
+
+/**
+ * Informs a party that he has the turn and can choose the next action.
+ */
+public class YourTurn implements Inform {
+
+	@Override
+	public int hashCode() {
+		return 1;
+	}
+
+	@Override
+	public boolean equals(Object obj) {
+		if (this == obj)
+			return true;
+		if (obj == null)
+			return false;
+		if (getClass() != obj.getClass())
+			return false;
+		return true;
+	}
+
+	@Override
+	public String toString() {
+		return "YourTurn";
+	}
+}
Index: /party/src/test/java/geniusweb/party/CapabilitiesTest.java
===================================================================
--- /party/src/test/java/geniusweb/party/CapabilitiesTest.java	(revision 53)
+++ /party/src/test/java/geniusweb/party/CapabilitiesTest.java	(revision 1)
@@ -4,7 +4,7 @@
 
 import java.io.IOException;
+import java.net.URI;
 import java.net.URISyntaxException;
 import java.util.Arrays;
-import java.util.Collections;
 import java.util.List;
 
@@ -18,6 +18,6 @@
 import com.fasterxml.jackson.databind.ObjectMapper;
 
-import geniusweb.profile.PartialOrdering;
-import geniusweb.profile.utilityspace.LinearAdditive;
+import geniusweb.party.Capabilities;
+import geniusweb.references.ProtocolRef;
 import tudelft.utilities.junit.GeneralTests;
 
@@ -25,20 +25,17 @@
 
 	private Capabilities capabilities1, capabilities1a, capabilities2,
-			capabilities3, capabilities4;
-	private String asJson = "{\"behaviours\":[\"SAOP\"],\"profiles\":[\"geniusweb.profile.utilityspace.LinearAdditive\"]}";
+			capabilities3;
+	private String asJson = "{\"protocols\":[\"ws:localhost/protocol1\"]}";
 
 	@Before
 	public void before() throws URISyntaxException {
-		capabilities1 = new Capabilities(Sets.newSet("SAOP"),
-				Collections.singleton(LinearAdditive.class));
-		capabilities1a = new Capabilities(Sets.newSet("SAOP"),
-				Collections.singleton(LinearAdditive.class));
-		capabilities2 = new Capabilities(Sets.newSet("SEB"),
-				Collections.singleton(LinearAdditive.class));
-		capabilities3 = new Capabilities(Sets.newSet("SEB", "SAOP"),
-				Collections.singleton(LinearAdditive.class));
-		capabilities4 = new Capabilities(Sets.newSet("SAOP"),
-				Collections.singleton(PartialOrdering.class));
-
+		capabilities1 = new Capabilities(Sets
+				.newSet(new ProtocolRef(new URI("ws:localhost/protocol1"))));
+		capabilities1a = new Capabilities(Sets
+				.newSet(new ProtocolRef(new URI("ws:localhost/protocol1"))));
+		capabilities2 = new Capabilities(Sets
+				.newSet(new ProtocolRef(new URI("ws:localhost/protocol2"))));
+		capabilities3 = new Capabilities(Sets
+				.newSet(new ProtocolRef(new URI("ws:localhost/protocol3"))));
 	}
 
@@ -46,6 +43,5 @@
 	public List<List<Capabilities>> getGeneralTestData() {
 		return Arrays.asList(Arrays.asList(capabilities1, capabilities1a),
-				Arrays.asList(capabilities2), Arrays.asList(capabilities3),
-				Arrays.asList(capabilities4));
+				Arrays.asList(capabilities2), Arrays.asList(capabilities3));
 	}
 
@@ -53,13 +49,12 @@
 	public List<String> getGeneralTestStrings() {
 		return Arrays.asList(
-				"Capabilities.*geniusweb.profile.utilityspace.LinearAdditive.*SAOP.*",
-				"Capabilities.*geniusweb.profile.utilityspace.LinearAdditive.*SEB.*",
-				"Capabilities.*geniusweb.profile.utilityspace.LinearAdditive.*SEB.*SAOP.*",
-				"Capabilities.*geniusweb.profile.PartialOrdering.*SAOP.*");
+				"Capabilities.*Protocols=.*ProtocolRef.*protocol1.*",
+				"Capabilities.*Protocols=.*ProtocolRef.*protocol2.*",
+				"Capabilities.*Protocols=.*ProtocolRef.*protocol3.*");
 	}
 
 	@Test(expected = IllegalArgumentException.class)
 	public void nullTest() throws URISyntaxException {
-		new Capabilities(null, Collections.singleton(LinearAdditive.class));
+		new Capabilities(null);
 	}
 
@@ -82,8 +77,3 @@
 	}
 
-	@Test
-	public void behaviours() {
-		assertEquals(Sets.newSet("SEB", "SAOP"), capabilities3.getBehaviours());
-	}
-
 }
Index: rty/src/test/java/geniusweb/party/DefaultPartyTest.java
===================================================================
--- /party/src/test/java/geniusweb/party/DefaultPartyTest.java	(revision 53)
+++ 	(revision )
@@ -1,103 +1,0 @@
-package geniusweb.party;
-
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.mockito.Matchers.any;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-
-import org.junit.Before;
-import org.junit.Test;
-
-import geniusweb.actions.Action;
-import geniusweb.connection.ConnectionEnd;
-import geniusweb.inform.Inform;
-import tudelft.utilities.listener.Listener;
-
-public class DefaultPartyTest {
-
-	private DefaultParty party;
-
-	@Before
-	public void before() {
-		party = new DefaultParty() {
-
-			@Override
-			public void notifyChange(Inform data) {
-				// TODO Auto-generated method stub
-
-			}
-
-			@Override
-			public String getDescription() {
-				// TODO Auto-generated method stub
-				return null;
-			}
-
-			@Override
-			public Capabilities getCapabilities() {
-				// TODO Auto-generated method stub
-				return null;
-			}
-		};
-
-	}
-
-	@Test
-	public void smoke() {
-	}
-
-	@Test
-	public void getReporter() {
-		assertNotNull(party.getReporter());
-	}
-
-	@SuppressWarnings("unchecked")
-	@Test
-	public void connect() {
-
-		ConnectionEnd<Inform, Action> connection = mock(ConnectionEnd.class);
-		party.connect(connection);
-
-		verify(connection, times(1)).addListener(any(Listener.class));
-		assertNotNull(party.getConnection());
-	}
-
-	@SuppressWarnings("unchecked")
-	@Test
-	public void disconnect() {
-
-		ConnectionEnd<Inform, Action> connection = mock(ConnectionEnd.class);
-		party.connect(connection);
-
-		party.disconnect();
-		verify(connection, times(1)).removeListener(any(Listener.class));
-		assertNull(party.getConnection());
-
-		// check second disconnect is ignored
-		party.disconnect();
-		verify(connection, times(1)).removeListener(any(Listener.class));
-		assertNull(party.getConnection());
-
-	}
-
-	@SuppressWarnings("unchecked")
-	@Test
-	public void terminate() {
-
-		ConnectionEnd<Inform, Action> connection = mock(ConnectionEnd.class);
-		party.connect(connection);
-
-		party.terminate();
-		verify(connection, times(1)).removeListener(any(Listener.class));
-		assertNull(party.getConnection());
-
-		// check second terminate is ignored
-		party.terminate();
-		verify(connection, times(1)).removeListener(any(Listener.class));
-		assertNull(party.getConnection());
-
-	}
-
-}
Index: /party/src/test/java/geniusweb/party/inform/ActionDoneTest.java
===================================================================
--- /party/src/test/java/geniusweb/party/inform/ActionDoneTest.java	(revision 1)
+++ /party/src/test/java/geniusweb/party/inform/ActionDoneTest.java	(revision 1)
@@ -0,0 +1,101 @@
+package geniusweb.party.inform;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.IOException;
+import java.math.BigDecimal;
+import java.net.URISyntaxException;
+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.JsonParseException;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.JsonMappingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import geniusweb.actions.Accept;
+import geniusweb.actions.PartyId;
+import geniusweb.issuevalue.Bid;
+import geniusweb.issuevalue.DiscreteValue;
+import geniusweb.issuevalue.NumberValue;
+import geniusweb.issuevalue.Value;
+import geniusweb.party.inform.ActionDone;
+import geniusweb.party.inform.Inform;
+import tudelft.utilities.junit.GeneralTests;
+
+public class ActionDoneTest extends GeneralTests<ActionDone> {
+
+	private ActionDone finished1, finished1a, finished2;
+
+	private String asJson = "{\"ActionDone\":{\"action\":{\"accept\":{\"actor\":\"me\",\"bid\":{\"issuevalues\":{\"issue3\":9012,\"issue2\":1,\"issue1\":\"b\"}}}}}}";
+
+	private PartyId me = new PartyId("me");
+
+	@Before
+	public void before() throws URISyntaxException {
+		final String ISSUE1 = "issue1";
+		final String ISSUE2 = "issue2";
+		final Value VALUE1 = new DiscreteValue("value1");
+		final Value VALUE2 = new NumberValue("10");
+
+		Map<String, Value> issuevalues = new HashMap<>();
+		issuevalues.put(ISSUE1, new DiscreteValue("b"));
+		issuevalues.put(ISSUE2, new NumberValue(BigDecimal.ONE));
+		issuevalues.put("issue3", new NumberValue(new BigDecimal("9012")));
+		Bid bid = new Bid(issuevalues);
+
+		Map<String, Value> issuevaluesb = new HashMap<>();
+		issuevaluesb.put(ISSUE1, new DiscreteValue("b"));
+		issuevaluesb.put(ISSUE2, new NumberValue(BigDecimal.ONE));
+		Bid bidb = new Bid(issuevaluesb);
+
+		// bidc and bidd have values swapped, so different issuevalues.
+		Map<String, Value> issuevaluesc = new HashMap<>();
+		issuevaluesc.put(ISSUE1, VALUE1);
+		issuevaluesc.put(ISSUE2, VALUE2);
+
+		finished1 = new ActionDone(new Accept(me, bid));
+		finished1a = new ActionDone(new Accept(me, bid));
+		finished2 = new ActionDone(new Accept(me, bidb));
+	}
+
+	@Override
+	public List<List<ActionDone>> getGeneralTestData() {
+		return Arrays.asList(Arrays.asList(finished1, finished1a),
+				Arrays.asList(finished2));
+	}
+
+	@Override
+	public List<String> getGeneralTestStrings() {
+		return Arrays.asList("ActionDone.*Accept.*", "ActionDone.*Accept.*");
+	}
+
+	@Test
+	public void nullTest() throws URISyntaxException {
+		new ActionDone(null);
+	}
+
+	@Test
+	public void testSerialize() throws JsonProcessingException {
+		ObjectMapper jackson = new ObjectMapper();
+
+		String json = jackson.writeValueAsString(finished1);
+		System.out.println(json);
+		assertEquals(asJson, json);
+	}
+
+	@Test
+	public void testDeserialize()
+			throws JsonParseException, JsonMappingException, IOException {
+		ObjectMapper jackson = new ObjectMapper();
+		ActionDone p = (ActionDone) jackson.readValue(asJson, Inform.class);
+		System.out.println(p);
+		assertEquals(finished1, p);
+	}
+
+}
Index: /party/src/test/java/geniusweb/party/inform/FinishedTest.java
===================================================================
--- /party/src/test/java/geniusweb/party/inform/FinishedTest.java	(revision 1)
+++ /party/src/test/java/geniusweb/party/inform/FinishedTest.java	(revision 1)
@@ -0,0 +1,101 @@
+package geniusweb.party.inform;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.IOException;
+import java.math.BigDecimal;
+import java.net.URISyntaxException;
+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.JsonParseException;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.JsonMappingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import geniusweb.issuevalue.Bid;
+import geniusweb.issuevalue.DiscreteValue;
+import geniusweb.issuevalue.NumberValue;
+import geniusweb.issuevalue.Value;
+import geniusweb.party.inform.Finished;
+import geniusweb.party.inform.Inform;
+import tudelft.utilities.junit.GeneralTests;
+
+public class FinishedTest extends GeneralTests<Finished> {
+
+	private Finished finished1, finished1a, finished2, finished3;
+
+	private String asJson = "{\"Finished\":{\"agreedBid\":{\"issuevalues\":{\"issue3\":9012,\"issue2\":1,\"issue1\":\"b\"}}}}";
+
+	@Before
+	public void before() throws URISyntaxException {
+		final String ISSUE1 = "issue1";
+		final String ISSUE2 = "issue2";
+		final Value VALUE1 = new DiscreteValue("value1");
+		final Value VALUE2 = new NumberValue("10");
+
+		Map<String, Value> issuevalues = new HashMap<>();
+		issuevalues.put(ISSUE1, new DiscreteValue("b"));
+		issuevalues.put(ISSUE2, new NumberValue(BigDecimal.ONE));
+		issuevalues.put("issue3", new NumberValue(new BigDecimal("9012")));
+		Bid bid = new Bid(issuevalues);
+
+		Map<String, Value> issuevaluesb = new HashMap<>();
+		issuevaluesb.put(ISSUE1, new DiscreteValue("b"));
+		issuevaluesb.put(ISSUE2, new NumberValue(BigDecimal.ONE));
+		Bid bidb = new Bid(issuevaluesb);
+
+		// bidc and bidd have values swapped, so different issuevalues.
+		Map<String, Value> issuevaluesc = new HashMap<>();
+		issuevaluesc.put(ISSUE1, VALUE1);
+		issuevaluesc.put(ISSUE2, VALUE2);
+		Bid bidc = new Bid(issuevaluesc);
+
+		finished1 = new Finished(bid);
+		finished1a = new Finished(bid);
+		finished2 = new Finished(bidb);
+		finished3 = new Finished(bidc);
+	}
+
+	@Override
+	public List<List<Finished>> getGeneralTestData() {
+		return Arrays.asList(Arrays.asList(finished1, finished1a),
+				Arrays.asList(finished2), Arrays.asList(finished3));
+	}
+
+	@Override
+	public List<String> getGeneralTestStrings() {
+		return Arrays.asList("Finished.*issue3=9012.*issue2=1.*issue1=\"b\".*",
+				"Finished.*issue2=1.*issue1=\"b\".*",
+				"Finished.*issue2=10.*issue1=\"value1\".*");
+	}
+
+	@Test
+	public void nullTest() throws URISyntaxException {
+		new Finished(null);
+	}
+
+	@Test
+	public void testSerialize() throws JsonProcessingException {
+		ObjectMapper jackson = new ObjectMapper();
+
+		String json = jackson.writeValueAsString(finished1);
+		System.out.println(json);
+		assertEquals(asJson, json);
+	}
+
+	@Test
+	public void testDeserialize()
+			throws JsonParseException, JsonMappingException, IOException {
+		ObjectMapper jackson = new ObjectMapper();
+		Finished p = (Finished) jackson.readValue(asJson, Inform.class);
+		System.out.println(p);
+		assertEquals(finished1, p);
+	}
+
+}
Index: /party/src/test/java/geniusweb/party/inform/NegotiationInfoTest.java
===================================================================
--- /party/src/test/java/geniusweb/party/inform/NegotiationInfoTest.java	(revision 1)
+++ /party/src/test/java/geniusweb/party/inform/NegotiationInfoTest.java	(revision 1)
@@ -0,0 +1,116 @@
+package geniusweb.party.inform;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.IOException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.List;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import com.fasterxml.jackson.core.JsonParseException;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.JsonMappingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import geniusweb.actions.PartyId;
+import geniusweb.party.inform.Inform;
+import geniusweb.party.inform.Settings;
+import geniusweb.progress.ProgressRounds;
+import geniusweb.references.PartyRef;
+import geniusweb.references.ProfileRef;
+import geniusweb.references.ProtocolRef;
+import tudelft.utilities.junit.GeneralTests;
+
+public class NegotiationInfoTest extends GeneralTests<Settings> {
+
+	private PartyId id = new PartyId("party1");
+	private PartyId id2 = new PartyId("party2");
+
+	private final String asJson = "{\"Settings\":"
+			+ "{\"id\":\"party1\",\"profile\":\"ws:profile1\","
+			+ "\"protocol\":\"ws:localhost/protocol1\","
+			+ "\"progress\":{\"rounds\":{\"duration\":10,\"currentRound\":0,\"endtime\":999}}}}";
+
+	private Settings negoinfo1;
+	private Settings negoinfo1a;
+	private Settings negoinfo2;
+	private Settings negoinfo3;
+	private Settings negoinfo4;
+	private final Date date = new Date(999);
+
+	@Before
+	public void before() throws URISyntaxException, JsonParseException,
+			JsonMappingException, IOException {
+		// we can't mock because we want to test the serializer
+		ObjectMapper jackson = new ObjectMapper();
+		ProfileRef profile1 = new ProfileRef(new URI("ws:profile1"));
+		// jackson.readValue(serialized, Profile.class);
+
+		ProtocolRef protocol1 = new ProtocolRef(
+				new URI("ws:localhost/protocol1"));
+		ProtocolRef protocol1a = new ProtocolRef(
+				new URI("ws:localhost/protocol1"));
+		ProtocolRef protocol2 = new ProtocolRef(
+				new URI("ws:localhost/protocol2"));
+		ProgressRounds progress1 = new ProgressRounds(10, 0, date);
+		ProgressRounds progress1a = new ProgressRounds(10, 0, date);
+		ProgressRounds progress2 = new ProgressRounds(12, 0, date);
+
+		negoinfo1 = new Settings(id, profile1, protocol1, progress1);
+		negoinfo1a = new Settings(id, profile1, protocol1a, progress1a);
+		negoinfo2 = new Settings(id, profile1, protocol2, progress1);
+		negoinfo3 = new Settings(id, profile1, protocol1, progress2);
+		negoinfo4 = new Settings(id2, profile1, protocol1, progress2);
+	}
+
+	@Override
+	public List<List<Settings>> getGeneralTestData() {
+		return Arrays.asList(Arrays.asList(negoinfo1, negoinfo1a),
+				Arrays.asList(negoinfo2), Arrays.asList(negoinfo3),
+				Arrays.asList(negoinfo4));
+	}
+
+	@Override
+	public List<String> getGeneralTestStrings() {
+		return Arrays.asList(
+				"Settings.*party1.*ProtocolRef.*protocol1.*ProgressRounds.*0.*10.*",
+				"Settings.*party1.*ProtocolRef.*protocol2.*ProgressRounds.*0.*10.*",
+				"Settings.*party1.*ProtocolRef.*protocol1.*ProgressRounds.*0.*12.*",
+				"Settings.*party2.*ProtocolRef.*protocol1.*ProgressRounds.*0.*12.*");
+
+	}
+
+	@Test
+	public void smokeTest() throws URISyntaxException {
+		new PartyRef(new URI("ws:localhost"));
+	}
+
+	@Test(expected = IllegalArgumentException.class)
+	public void nullTest() throws URISyntaxException {
+		new PartyRef((URI) null);
+	}
+
+	@Test
+	public void testSerialize() throws JsonProcessingException {
+		ObjectMapper jackson = new ObjectMapper();
+
+		String json = jackson.writeValueAsString(negoinfo1);
+		System.out.println(json);
+		assertEquals(asJson, json);
+	}
+
+	@Test
+	public void testDeserialize()
+			throws JsonParseException, JsonMappingException, IOException {
+		ObjectMapper jackson = new ObjectMapper();
+		Settings p = (Settings) jackson.readValue(asJson, Inform.class);
+		System.out.println(p);
+		assertEquals(negoinfo1, p);
+	}
+
+}
Index: /party/src/test/java/geniusweb/party/inform/YourTurnTest.java
===================================================================
--- /party/src/test/java/geniusweb/party/inform/YourTurnTest.java	(revision 1)
+++ /party/src/test/java/geniusweb/party/inform/YourTurnTest.java	(revision 1)
@@ -0,0 +1,72 @@
+package geniusweb.party.inform;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.IOException;
+import java.net.URISyntaxException;
+import java.util.Arrays;
+import java.util.List;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import com.fasterxml.jackson.core.JsonParseException;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.JsonMappingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import geniusweb.party.inform.Inform;
+import geniusweb.party.inform.YourTurn;
+import tudelft.utilities.junit.GeneralTests;
+
+public class YourTurnTest extends GeneralTests<YourTurn> {
+
+	private YourTurn yourturn1, yourturn1b;
+
+	private String asJson = "{\"YourTurn\":{}}";
+
+	private YourTurn yourturnb;
+
+	@Before
+	public void before() throws URISyntaxException {
+
+		yourturn1 = new YourTurn();
+		yourturn1b = new YourTurn();
+		yourturnb = new YourTurn() {
+			@Override
+			public int hashCode() {
+				return 2;
+			}
+		};
+	}
+
+	@Override
+	public List<List<YourTurn>> getGeneralTestData() {
+		return Arrays.asList(Arrays.asList(yourturn1, yourturn1b),
+				Arrays.asList(yourturnb));
+	}
+
+	@Override
+	public List<String> getGeneralTestStrings() {
+		return Arrays.asList("YourTurn*", "YourTurn*");
+	}
+
+	@Test
+	public void testSerialize() throws JsonProcessingException {
+		ObjectMapper jackson = new ObjectMapper();
+
+		String json = jackson.writeValueAsString(yourturn1);
+		System.out.println(json);
+		assertEquals(asJson, json);
+	}
+
+	@Test
+	public void testDeserialize()
+			throws JsonParseException, JsonMappingException, IOException {
+		ObjectMapper jackson = new ObjectMapper();
+		YourTurn p = (YourTurn) jackson.readValue(asJson, Inform.class);
+		System.out.println(p);
+		assertEquals(yourturn1, p);
+	}
+
+}
Index: /pom.xml
===================================================================
--- /pom.xml	(revision 53)
+++ /pom.xml	(revision 1)
@@ -5,7 +5,7 @@
 	<modelVersion>4.0.0</modelVersion>
 
-	<groupId>geniusweb</groupId>
-	<artifactId>geniusweb</artifactId>
-	<version>-</version>
+	<groupId>genius2</groupId>
+	<artifactId>genius2</artifactId>
+	<version>0.0.1</version>
 	<packaging>pom</packaging>
 
@@ -13,5 +13,5 @@
 	<properties>
 		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-		<jackson-2-version>2.9.10</jackson-2-version>
+		<jackson-2-version>2.9.6</jackson-2-version>
 	</properties>
 
@@ -22,5 +22,4 @@
 		<module>profile</module>
 		<module>events</module>
-		<module>voting</module>
 		<module>bidspace</module>
 		<module>party</module>
@@ -30,9 +29,4 @@
 		<module>exampleparties</module>
 		<module>simplerunner</module>
-		<module>opponentmodel</module>
-		<module>boa</module>
-		<module>ip</module>
-		<module>logconverter</module>
-		<module>domaineditor</module>
 	</modules>
 </project>
Index: /profile/.classpath
===================================================================
--- /profile/.classpath	(revision 1)
+++ /profile/.classpath	(revision 1)
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" output="target/classes" path="src/main/java">
+		<attributes>
+			<attribute name="optional" value="true"/>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="src" output="target/test-classes" path="src/test/java">
+		<attributes>
+			<attribute name="optional" value="true"/>
+			<attribute name="maven.pomderived" value="true"/>
+			<attribute name="test" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8">
+		<attributes>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
+		<attributes>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="output" path="target/classes"/>
+</classpath>
Index: /profile/.project
===================================================================
--- /profile/.project	(revision 1)
+++ /profile/.project	(revision 1)
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>profile</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.m2e.core.maven2Builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>org.eclipse.m2e.core.maven2Nature</nature>
+	</natures>
+</projectDescription>
Index: /profile/.settings/org.eclipse.core.resources.prefs
===================================================================
--- /profile/.settings/org.eclipse.core.resources.prefs	(revision 1)
+++ /profile/.settings/org.eclipse.core.resources.prefs	(revision 1)
@@ -0,0 +1,4 @@
+eclipse.preferences.version=1
+encoding//src/main/java=UTF-8
+encoding//src/test/java=UTF-8
+encoding/<project>=UTF-8
Index: /profile/.settings/org.eclipse.jdt.core.prefs
===================================================================
--- /profile/.settings/org.eclipse.jdt.core.prefs	(revision 1)
+++ /profile/.settings/org.eclipse.jdt.core.prefs	(revision 1)
@@ -0,0 +1,6 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
+org.eclipse.jdt.core.compiler.release=disabled
+org.eclipse.jdt.core.compiler.source=1.8
Index: /profile/.settings/org.eclipse.m2e.core.prefs
===================================================================
--- /profile/.settings/org.eclipse.m2e.core.prefs	(revision 1)
+++ /profile/.settings/org.eclipse.m2e.core.prefs	(revision 1)
@@ -0,0 +1,4 @@
+activeProfiles=
+eclipse.preferences.version=1
+resolveWorkspaceProjects=true
+version=1
Index: /profile/pom.xml
===================================================================
--- /profile/pom.xml	(revision 53)
+++ /profile/pom.xml	(revision 1)
@@ -6,5 +6,5 @@
 	<groupId>geniusweb</groupId>
 	<artifactId>profile</artifactId>
-	<version>2.2.1</version>  <!-- equals the geniusweb version -->
+	<version>1.0.0</version>
 	<packaging>jar</packaging>
 
@@ -16,6 +16,5 @@
 		<basedir>.</basedir>
 		<passwd>${env.ARTIFACTORY_PASS}</passwd>
-		<jackson-2-version>2.12.3</jackson-2-version>
-		<geniusweb.version>${project.version}</geniusweb.version>
+		<jackson-2-version>2.9.6</jackson-2-version>
 	</properties>
 
@@ -23,5 +22,5 @@
 		<repository>
 			<id>artifactory.ewi.tudelft.nl</id>
-			<url>https://artifactory.ewi.tudelft.nl/artifactory/libs-release</url>
+			<url>http://artifactory.ewi.tudelft.nl/artifactory/libs-release</url>
 		</repository>
 	</distributionManagement>
@@ -32,15 +31,10 @@
 			<groupId>geniusweb</groupId>
 			<artifactId>issuevalue</artifactId>
-			<version>${geniusweb.version}</version>
+			<version>1.0.0</version>
 		</dependency>
 		<dependency>
 			<groupId>geniusweb</groupId>
 			<artifactId>references</artifactId>
-			<version>${geniusweb.version}</version>
-		</dependency>
-		<dependency>
-			<groupId>tudelft.utilities</groupId>
-			<artifactId>utilities</artifactId>
-			<version>1.3.1</version>
+			<version>1.0.0</version>
 		</dependency>
 
@@ -90,5 +84,5 @@
 			<groupId>tudelft.utilities</groupId>
 			<artifactId>junit</artifactId>
-			<version>1.0.5</version>
+			<version>1.0.2</version>
 			<scope>test</scope>
 		</dependency>
@@ -101,6 +95,6 @@
 		<dependency>
 			<groupId>org.mockito</groupId>
-			<artifactId>mockito-core</artifactId>
-			<version>3.11.2</version>
+			<artifactId>mockito-all</artifactId>
+			<version>1.9.5</version>
 			<scope>test</scope>
 		</dependency>
@@ -113,19 +107,16 @@
 		<repository>
 			<id>artifactory.ewi.tudelft.nl</id>
-			<url>https://artifactory.ewi.tudelft.nl/artifactory/libs-release</url>
+			<url>http://artifactory.ewi.tudelft.nl/artifactory/libs-release</url>
 			<snapshots>
 				<enabled>false</enabled>
 			</snapshots>
 		</repository>
+
 	</repositories>
 
 	<pluginRepositories>
 		<pluginRepository>
-			<id>central</id>
-			<url>https://repo1.maven.org/maven2</url>
-		</pluginRepository>
-		<pluginRepository>
-			<id>artifactory.ewi.tudelft.nl</id>
-			<url>https://artifactory.ewi.tudelft.nl/artifactory/libs-release</url>
+			<id>jcenter</id>
+			<url>http://jcenter.bintray.com</url>
 		</pluginRepository>
 	</pluginRepositories>
@@ -144,22 +135,9 @@
 				</configuration>
 			</plugin>
-			<plugin>
-				<groupId>org.apache.maven.plugins</groupId>
-				<artifactId>maven-source-plugin</artifactId>
-				<version>3.1.0</version>
-				<executions>
-					<execution>
-						<id>attach-sources</id>
-						<goals>
-							<goal>jar</goal>
-						</goals>
-					</execution>
-				</executions>
-			</plugin>
 
 			<plugin>
 				<groupId>org.apache.maven.plugins</groupId>
 				<artifactId>maven-javadoc-plugin</artifactId>
-				<version>3.2.0</version>
+				<version>2.10.1</version>
 				<executions>
 					<execution>
@@ -168,4 +146,8 @@
 							<goal>jar</goal>
 						</goals>
+						<configuration>
+							<additionalparam>${javadoc.opts}</additionalparam>
+							<additionalparam>-Xdoclint:none</additionalparam>
+						</configuration>
 					</execution>
 				</executions>
@@ -175,5 +157,5 @@
 				<groupId>org.jfrog.buildinfo</groupId>
 				<artifactId>artifactory-maven-plugin</artifactId>
-				<version>3.2.3</version>
+				<version>2.6.1</version>
 				<executions>
 					<execution>
Index: ofile/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: ofile/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: ofile/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: ofile/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: ofile/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: ofile/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);
Index: ofile/src/test/java/geniusweb/profile/DefaultPartialOrderingTest.java
===================================================================
--- /profile/src/test/java/geniusweb/profile/DefaultPartialOrderingTest.java	(revision 53)
+++ 	(revision )
@@ -1,116 +1,0 @@
-package geniusweb.profile;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
-import java.io.IOException;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.junit.Before;
-import org.junit.Test;
-
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.databind.ObjectMapper;
-
-import geniusweb.issuevalue.Bid;
-import geniusweb.issuevalue.DiscreteValue;
-import geniusweb.issuevalue.DiscreteValueSet;
-import geniusweb.issuevalue.Domain;
-import geniusweb.issuevalue.ValueSet;
-import tudelft.utilities.junit.GeneralTests;
-
-public class DefaultPartialOrderingTest
-		extends GeneralTests<DefaultPartialOrdering> {
-
-	private final String serialized = "{\"DefaultPartialOrdering\":{"
-			+ "\"name\":\"ordering1\","
-			+ "\"domain\":{\"name\":\"dom1\",\"issuesValues\":{\"iss1\":{\"values\":[\"1\",\"2\",\"3\"]}}},"
-			+ "\"better\":{\"{\\\"issuevalues\\\":{\\\"iss1\\\":\\\"1\\\"}}\":[{\"issuevalues\":{\"iss1\":\"2\"}}],\"{\\\"issuevalues\\\":{\\\"iss1\\\":\\\"3\\\"}}\":[{\"issuevalues\":{\"iss1\":\"2\"}}]},"
-			+ "\"reservationbid\":{\"issuevalues\":{\"iss1\":\"1\"}}}}";
-
-	// we need real (not mock) values otherwise serializer crashes..
-	private String issue1 = "iss1";
-	private DefaultPartialOrdering ordering1, ordering1b, ordering2, ordering3,
-			ordering4, ordering5;
-
-	private Bid bid1, bid2, bid3;
-
-	@Before
-	public void before() {
-		Map<String, ValueSet> issues = new HashMap<>();
-		DiscreteValue val1 = new DiscreteValue("1");
-		DiscreteValue val2 = new DiscreteValue("2");
-		DiscreteValue val3 = new DiscreteValue("3");
-		issues.put(issue1, new DiscreteValueSet(
-				new HashSet<>(Arrays.asList(val1, val2, val3))));
-		Domain domain1 = new Domain("dom1", issues);
-		Domain domain2 = new Domain("dom2", issues);
-		bid1 = new Bid(Collections.singletonMap(issue1, val1));
-		bid2 = new Bid(Collections.singletonMap(issue1, val2));
-		bid3 = new Bid(Collections.singletonMap(issue1, val3));
-
-		Map<Bid, Set<Bid>> map1 = new HashMap<>();
-		map1.put(bid1, new HashSet<Bid>(Arrays.asList(bid2)));
-		map1.put(bid3, new HashSet<Bid>(Arrays.asList(bid2)));
-
-		Map<Bid, Set<Bid>> map2 = new HashMap<>();
-		map2.put(bid1, new HashSet<Bid>(Arrays.asList(bid2)));
-		map2.put(bid3, new HashSet<Bid>(Arrays.asList(bid1)));
-
-		ordering1 = new DefaultPartialOrdering("ordering1", domain1, bid1,
-				map1);
-		ordering1b = new DefaultPartialOrdering("ordering1", domain1, bid1,
-				map1);
-		ordering2 = new DefaultPartialOrdering("ordering2", domain1, bid1,
-				map1);
-		ordering3 = new DefaultPartialOrdering("ordering1", domain2, bid1,
-				map1);
-		ordering4 = new DefaultPartialOrdering("ordering1", domain1, bid2,
-				map1);
-		ordering5 = new DefaultPartialOrdering("ordering1", domain1, bid1,
-				map2);
-
-	}
-
-	@Override
-	public List<List<DefaultPartialOrdering>> getGeneralTestData() {
-		return Arrays.asList(Arrays.asList(ordering1, ordering1b),
-				Arrays.asList(ordering2), Arrays.asList(ordering3),
-				Arrays.asList(ordering4), Arrays.asList(ordering5));
-	}
-
-	@Override
-	public List<String> getGeneralTestStrings() {
-		return Arrays.asList("DefaultPartialOrdering.*",
-				"DefaultPartialOrdering.*", "DefaultPartialOrdering.*",
-				"DefaultPartialOrdering.*", "DefaultPartialOrdering.*");
-	}
-
-	@Test
-	public void testSerialize() throws JsonProcessingException {
-		ObjectMapper jackson = new ObjectMapper();
-		assertEquals(serialized, jackson.writeValueAsString(ordering1));
-		System.out.println(serialized);
-	}
-
-	@Test
-	public void testDeserialize() throws IOException {
-		ObjectMapper jackson = new ObjectMapper();
-		assertEquals(ordering1, jackson.readValue(serialized, Profile.class));
-	}
-
-	@Test
-	public void testIsBetter() {
-		assertTrue(ordering1.isPreferredOrEqual(bid1, bid2));
-		assertFalse(ordering1.isPreferredOrEqual(bid1, bid3));
-		assertFalse(ordering1.isPreferredOrEqual(bid2, bid3));
-	}
-
-}
Index: /profile/src/test/java/geniusweb/profile/utilityspace/DiscreteValueSetUtilitiesTest.java
===================================================================
--- /profile/src/test/java/geniusweb/profile/utilityspace/DiscreteValueSetUtilitiesTest.java	(revision 53)
+++ /profile/src/test/java/geniusweb/profile/utilityspace/DiscreteValueSetUtilitiesTest.java	(revision 1)
@@ -1,9 +1,4 @@
 package geniusweb.profile.utilityspace;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
-import java.io.IOException;
 import java.math.BigDecimal;
 import java.util.Arrays;
@@ -14,22 +9,13 @@
 import org.junit.Test;
 
-import com.fasterxml.jackson.core.JsonParseException;
-import com.fasterxml.jackson.databind.JsonMappingException;
-import com.fasterxml.jackson.databind.ObjectMapper;
-
 import geniusweb.issuevalue.DiscreteValue;
-import geniusweb.issuevalue.DiscreteValueSet;
-import geniusweb.issuevalue.NumberValue;
-import geniusweb.issuevalue.NumberValueSet;
-import geniusweb.issuevalue.ValueSet;
+import geniusweb.profile.utilityspace.DiscreteValueSetUtilities;
 import tudelft.utilities.junit.GeneralTests;
 
-public class DiscreteValueSetUtilitiesTest
-		extends GeneralTests<DiscreteValueSetUtilities> {
+public class DiscreteValueSetUtilitiesTest extends GeneralTests<DiscreteValueSetUtilities> {
 
 	private final static DiscreteValue vala = new DiscreteValue("a");
 	private final static DiscreteValue vala1 = new DiscreteValue("a");
 	private final static DiscreteValue valb = new DiscreteValue("b");
-	private final static NumberValue valn = new NumberValue("99");
 
 	private final static BigDecimal util = new BigDecimal("0.14");
@@ -37,10 +23,5 @@
 	private final static BigDecimal utilb = new BigDecimal("0.37");
 
-	private final static BigDecimal badutil = new BigDecimal("1.37");
-	private final static BigDecimal badutil2 = new BigDecimal("-0.37");
-
-	private final static DiscreteValueSetUtilities utils, utils1, utilsb,
-			utils1b, utilsc1, utilsc2;
-	private static final ObjectMapper jackson = new ObjectMapper();
+	private final static DiscreteValueSetUtilities utils, utils1, utilsb, utils1b, utilsc1, utilsc2;
 
 	static {
@@ -75,6 +56,5 @@
 	@Override
 	public List<List<DiscreteValueSetUtilities>> getGeneralTestData() {
-		return Arrays.asList(Arrays.asList(utils, utils1),
-				Arrays.asList(utilsb), Arrays.asList(utils1b),
+		return Arrays.asList(Arrays.asList(utils, utils1), Arrays.asList(utilsb), Arrays.asList(utils1b),
 				Arrays.asList(utilsc1, utilsc2));
 	}
@@ -82,11 +62,8 @@
 	@Override
 	public List<String> getGeneralTestStrings() {
-		return Arrays.asList("DiscreteValueSetUtilities\\{\"a\"=0.14\\}",
-				"DiscreteValueSetUtilities\\{\"b\"=0.37\\}",
-				"DiscreteValueSetUtilities\\{\"a\"=0.37\\}",
-				"DiscreteValueSetUtilities\\{\"a\"=0.14, \"b\"=0.37\\}");
+		return Arrays.asList("ValueSetUtilities\\{\"a\"=0.14\\}", "ValueSetUtilities\\{\"b\"=0.37\\}",
+				"ValueSetUtilities\\{\"a\"=0.37\\}", "ValueSetUtilities\\{\"a\"=0.14, \"b\"=0.37\\}");
 	}
 
-	@SuppressWarnings("unused")
 	@Test
 	public void smokeTest() {
@@ -95,129 +72,3 @@
 	}
 
-	@SuppressWarnings("unused")
-	@Test(expected = IllegalArgumentException.class)
-	public void testTooLargeUtility() {
-		Map<DiscreteValue, BigDecimal> valueUtils = new HashMap<>();
-		valueUtils.put(vala, util);
-		valueUtils.put(valb, badutil);
-		new DiscreteValueSetUtilities(valueUtils);
-	}
-
-	@SuppressWarnings("unused")
-	@Test(expected = IllegalArgumentException.class)
-	public void testNegativeUtility() {
-		Map<DiscreteValue, BigDecimal> valueUtils = new HashMap<>();
-		valueUtils.put(vala, util);
-		valueUtils.put(valb, badutil2);
-		new DiscreteValueSetUtilities(valueUtils);
-	}
-
-	@SuppressWarnings("unused")
-	@Test(expected = IllegalArgumentException.class)
-	public void testNullUtility() {
-		Map<DiscreteValue, BigDecimal> valueUtils = new HashMap<>();
-		valueUtils.put(vala, null);
-		valueUtils.put(valb, util);
-		new DiscreteValueSetUtilities(valueUtils);
-	}
-
-	@SuppressWarnings("unused")
-	@Test(expected = NullPointerException.class)
-	public void testNullValueUtils() {
-		new DiscreteValueSetUtilities(null);
-
-	}
-
-	@SuppressWarnings("unused")
-	@Test(expected = NullPointerException.class)
-	public void testNullIssue() {
-		Map<DiscreteValue, BigDecimal> valueUtils = new HashMap<>();
-		valueUtils.put(vala, util);
-		valueUtils.put(null, utilb);
-		new DiscreteValueSetUtilities(valueUtils);
-	}
-
-	@Test
-	public void testGetUtility() {
-		Map<DiscreteValue, BigDecimal> valueUtils = new HashMap<>();
-		valueUtils.put(vala, util);
-		valueUtils.put(valb, utilb);
-		DiscreteValueSetUtilities utilset = new DiscreteValueSetUtilities(
-				valueUtils);
-		assertEquals(util, utilset.getUtility(vala));
-		assertEquals(utilb, utilset.getUtility(valb));
-		assertEquals(BigDecimal.ZERO,
-				utilset.getUtility(new DiscreteValue("unknownIssue")));
-
-	}
-
-	@Test
-	public void testIsFitting() {
-		ValueSet valueset = new DiscreteValueSet(Arrays.asList(vala, valb));
-
-		Map<DiscreteValue, BigDecimal> valueUtils = new HashMap<>();
-		valueUtils.put(vala, util);
-		DiscreteValueSetUtilities utilset = new DiscreteValueSetUtilities(
-				valueUtils);
-
-		assertEquals(
-				"The values in the set DiscreteValueSet[\"a\", \"b\"] do not match the values mapped to utilities [\"a\"]",
-				utilset.isFitting(valueset));
-
-		valueUtils.put(valb, utilb);
-		utilset = new DiscreteValueSetUtilities(valueUtils);
-		assertEquals(null, utilset.isFitting(valueset));
-
-		valueUtils.put(new DiscreteValue("unknownIssue"), util1);
-		utilset = new DiscreteValueSetUtilities(valueUtils);
-		assertEquals(
-				"The values in the set DiscreteValueSet[\"a\", \"b\"] do not match the values mapped to utilities [\"a\", \"b\", \"unknownIssue\"]",
-				utilset.isFitting(valueset));
-
-	}
-
-	@Test
-	public void testIsFittingWrongType() {
-		ValueSet valueset = new NumberValueSet(BigDecimal.ZERO, BigDecimal.ONE,
-				new BigDecimal("0.3"));
-
-		Map<DiscreteValue, BigDecimal> valueUtils = new HashMap<>();
-		valueUtils.put(vala, util);
-		valueUtils.put(valb, utilb);
-		DiscreteValueSetUtilities utilset = new DiscreteValueSetUtilities(
-				valueUtils);
-
-		assertEquals(
-				"The utilities are for a discrete valueset but the given values are numberValueSet[0,1,0.3]",
-				utilset.isFitting(valueset));
-
-	}
-
-	@Test
-	public void testIsFittingWrongIssues()
-			throws JsonParseException, JsonMappingException, IOException {
-		// Notice, party tent has extra single quote in the valuesstr.
-		String valuesstr = "{\"values\": [\"Party Tent'\",\"Your Dorm\", \"Party Room\", \"Ballroom\" ]}";
-		String utilstring = "{\"DiscreteValueSetUtilities\": {\"valueUtilities\": {\"Party Tent\": 0.52,\"Your Dorm\": 0.23,\"Party Room\": 0.99,\"Ballroom\": 0.77}}}";
-		ValueSetUtilities valueutils = jackson.readValue(utilstring,
-				ValueSetUtilities.class);
-		ValueSet values = jackson.readValue(valuesstr, ValueSet.class);
-		System.out.println(valueutils.isFitting(values));
-		assertFalse(valueutils.isFitting(values).isEmpty());
-
-	}
-
-	@Test
-	public void testDeserializeAsDiscrete()
-			throws JsonParseException, JsonMappingException, IOException {
-		// Check that DiscreteValueSetUtilities properly deserializes
-		// discreteutils.
-		String utilstring = "{\"DiscreteValueSetUtilities\": {\"valueUtilities\": {\"Party Tent\": 0.52,\"Your Dorm\": 0.23,\"Party Room\": 0.99,\"Ballroom\": 0.77}}}";
-		DiscreteValueSetUtilities valueutils = jackson.readValue(utilstring,
-				DiscreteValueSetUtilities.class);
-		assertTrue(new BigDecimal("0.23").compareTo(
-				valueutils.getUtility(new DiscreteValue("Your Dorm"))) == 0);
-
-	}
-
 }
Index: /profile/src/test/java/geniusweb/profile/utilityspace/LinearAdditiveSerializationTest.java
===================================================================
--- /profile/src/test/java/geniusweb/profile/utilityspace/LinearAdditiveSerializationTest.java	(revision 53)
+++ /profile/src/test/java/geniusweb/profile/utilityspace/LinearAdditiveSerializationTest.java	(revision 1)
@@ -14,5 +14,5 @@
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.exc.ValueInstantiationException;
+import com.fasterxml.jackson.databind.exc.InvalidDefinitionException;
 
 import geniusweb.issuevalue.Bid;
@@ -20,12 +20,13 @@
 import geniusweb.issuevalue.DiscreteValueSet;
 import geniusweb.issuevalue.Domain;
-import geniusweb.issuevalue.NumberValue;
-import geniusweb.issuevalue.NumberValueSet;
 import geniusweb.issuevalue.Value;
 import geniusweb.issuevalue.ValueSet;
 import geniusweb.profile.Profile;
+import geniusweb.profile.utilityspace.DiscreteValueSetUtilities;
+import geniusweb.profile.utilityspace.LinearAdditiveUtilitySpace;
+import geniusweb.profile.utilityspace.NumberValueSetUtilities;
+import geniusweb.profile.utilityspace.ValueSetUtilities;
 
 public class LinearAdditiveSerializationTest {
-
 	private static final BigDecimal VAL2 = new BigDecimal("0.2");
 	private static final BigDecimal VAL3 = new BigDecimal("0.3");
@@ -38,6 +39,6 @@
 	private DiscreteValue i1v1 = new DiscreteValue("issue1value1");
 	private DiscreteValue i1v2 = new DiscreteValue("issue1value2");
-	private NumberValue i2v1 = new NumberValue("15");
-	private NumberValue i2v2 = new NumberValue("16");
+	private DiscreteValue i2v1 = new DiscreteValue("issue2value1");
+	private DiscreteValue i2v2 = new DiscreteValue("issue2value2");
 	private Domain domain;
 
@@ -46,17 +47,24 @@
 	private BigDecimal TWELVE = new BigDecimal("12");
 	private BigDecimal EIGHTEEN = new BigDecimal("18");
-	private static final ObjectMapper jackson = new ObjectMapper();
 
 	private LinearAdditiveUtilitySpace space;
-
-	private String serialized = "{\"LinearAdditiveUtilitySpace\":{\"domain\":{\"name\":\"test\",\"issuesValues\":{\"issue2\":{\"range\":{\"low\":12,\"high\":18,\"step\":1}},\"issue1\":{\"values\":[\"issue1value1\",\"issue1value2\"]}}},\"name\":\"testprofile\",\"issueUtilities\":{\"issue2\":{\"NumberValueSetUtilities\":{\"lowValue\":12,\"lowUtility\":0.3,\"highValue\":18,\"highUtility\":0.6}},\"issue1\":{\"DiscreteValueSetUtilities\":{\"valueUtilities\":{\"issue1value1\":0.2,\"issue1value2\":0.3}}}},\"issueWeights\":{\"issue2\":0.4,\"issue1\":0.6},\"reservationBid\":{\"issuevalues\":{\"issue2\":15,\"issue1\":\"issue1value2\"}}}}";
+	private String serialized = "{\"LinearAdditiveUtilitySpace\":{"
+			+ "\"domain\":{\"name\":\"test\","
+			+ "\"issuesValues\":{\"issue2\":{\"values\":[\"issue2value1\",\"issue2value2\"]},"
+			+ "\"issue1\":{\"values\":[\"issue1value1\",\"issue1value2\"]}}},"
+			+ "\"name\":\"testprofile\"," + "\"issueUtilities\":"
+			+ "{\"issue2\":{\"numberutils\":{\"lowValue\":12,\"lowUtility\":0.3,\"highValue\":18,\"highUtility\":0.6}},"
+			+ "\"issue1\":{\"discreteutils\":{\"valueUtilities\":{\"issue1value1\":0.2,\"issue1value2\":0.3}}}},"
+			+ "\"issueWeights\":{\"issue2\":0.4,\"issue1\":0.6},"
+			+ "\"reservationBid\":{\"issuevalues\":{\"issue2\":\"issue2value1\",\"issue1\":\"issue1value2\"}}"
+			+ "}" + "}";
 
 	private String jobsjson = "{\"LinearAdditiveUtilitySpace\":{\"issueUtilities\":{"
-			+ "\"lease car\":{\"DiscreteValueSetUtilities\":{\"valueUtilities\":{\"no\":0,\"yes\":1}}},"
-			+ "\"permanent contract\":{\"DiscreteValueSetUtilities\":{\"valueUtilities\":{\"no\":0,\"yes\":1}}},"
-			+ "\"career development opportunities\":{\"DiscreteValueSetUtilities\":{\"valueUtilities\":{\"high\":1,\"low\":0,\"medium\":0.5}}},"
-			+ "\"fte\":{\"DiscreteValueSetUtilities\":{\"valueUtilities\":{\"1.0\":0.75,\"0.6\":0.25,\"0.8\":0.5}}},"
-			+ "\"salary\":{\"DiscreteValueSetUtilities\":{\"valueUtilities\":{\"4000\":1.0,\"2500\":0.25,\"3500\":0.75,\"2000\":0,\"3000\":0.3}}},"
-			+ "\"work from home\":{\"DiscreteValueSetUtilities\":{\"valueUtilities\":{\"1\":0.5,\"2\":0.666666666666,\"0\":0.333333333}}}},"
+			+ "\"lease car\":{\"discreteutils\":{\"valueUtilities\":{\"no\":0,\"yes\":1}}},"
+			+ "\"permanent contract\":{\"discreteutils\":{\"valueUtilities\":{\"no\":0,\"yes\":1}}},"
+			+ "\"career development opportunities\":{\"discreteutils\":{\"valueUtilities\":{\"high\":1,\"low\":0,\"medium\":0.5}}},"
+			+ "\"fte\":{\"discreteutils\":{\"valueUtilities\":{\"1.0\":0.75,\"0.6\":0.25,\"0.8\":0.5}}},"
+			+ "\"salary\":{\"discreteutils\":{\"valueUtilities\":{\"4000\":1.0,\"2500\":0.25,\"3500\":0.75,\"2000\":0,\"3000\":0.3}}},"
+			+ "\"work from home\":{\"discreteutils\":{\"valueUtilities\":{\"1\":0.5,\"2\":0.666666666666,\"0\":0.333333333}}}},"
 			+ "\"issueWeights\":{\"lease car\":0.06,\"permanent contract\":0.16,"
 			+ "\"career development opportunities\":0.04,\"fte\":0.32,\"salary\":0.24,\"work from home\":0.18},"
@@ -71,6 +79,6 @@
 			+ "\"issue3\":{\"values\":[\"issue1value1\",\"issue1value2\"]}}},"
 			+ "\"name\":\"testprofile\"," + "\"issueUtilities\":"
-			+ "{\"issue2\":{\"NumberValueSetUtilities\":{\"lowValue\":12,\"lowUtility\":0.3,\"highValue\":18,\"highUtility\":0.6}},"
-			+ "\"issue1\":{\"DiscreteValueSetUtilities\":{\"valueUtilities\":{\"issue1value1\":0.2,\"issue1value2\":0.3}}}},"
+			+ "{\"issue2\":{\"numberutils\":{\"lowValue\":12,\"lowUtility\":0.3,\"highValue\":18,\"highUtility\":0.6}},"
+			+ "\"issue1\":{\"discreteutils\":{\"valueUtilities\":{\"issue1value1\":0.2,\"issue1value2\":0.3}}}},"
 			+ "\"issueWeights\":{\"issue2\":0.4,\"issue1\":0.6},"
 			+ "\"reservationBid\":{\"issuevalues\":{\"issue2\":\"issue2value1\",\"issue1\":\"issue1value2\"}}"
@@ -88,5 +96,5 @@
 		Map<String, ValueSet> values = new HashMap<>();
 		values.put(ISS1, new DiscreteValueSet(Arrays.asList(i1v1, i1v2)));
-		values.put(ISS2, new NumberValueSet(TWELVE, EIGHTEEN, BigDecimal.ONE));
+		values.put(ISS2, new DiscreteValueSet(Arrays.asList(i2v1, i2v2)));
 		domain = new Domain("test", values);
 
@@ -107,4 +115,5 @@
 	@Test
 	public void testSerialize() throws JsonProcessingException {
+		ObjectMapper jackson = new ObjectMapper();
 		String string = jackson.writeValueAsString(space);
 		System.out.println(string);
@@ -114,9 +123,11 @@
 	@Test
 	public void testDeserialize() throws IOException {
+		ObjectMapper jackson = new ObjectMapper();
 		assertEquals(space, jackson.readValue(serialized, Profile.class));
 	}
 
-	@Test(expected = ValueInstantiationException.class)
+	@Test(expected = InvalidDefinitionException.class)
 	public void testDeserializeWrongIssues() throws IOException {
+		ObjectMapper jackson = new ObjectMapper();
 		jackson.readValue(serializedWrongIssues, Profile.class);
 	}
@@ -124,4 +135,5 @@
 	@Test
 	public void testDeserializeFromValue() throws IOException {
+		ObjectMapper jackson = new ObjectMapper();
 		assertEquals(space, jackson.readValue(serialized, Profile.class));
 	}
@@ -129,4 +141,5 @@
 	@Test
 	public void testDeserializeJobs() throws IOException {
+		ObjectMapper jackson = new ObjectMapper();
 		Profile jobs = jackson.readValue(jobsjson, Profile.class);
 	}
Index: /profile/src/test/java/geniusweb/profile/utilityspace/LinearAdditiveTest.java
===================================================================
--- /profile/src/test/java/geniusweb/profile/utilityspace/LinearAdditiveTest.java	(revision 53)
+++ /profile/src/test/java/geniusweb/profile/utilityspace/LinearAdditiveTest.java	(revision 1)
@@ -2,16 +2,10 @@
 
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
-import java.io.IOException;
 import java.math.BigDecimal;
-import java.nio.charset.StandardCharsets;
-import java.nio.file.Files;
-import java.nio.file.Paths;
 import java.util.Arrays;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -21,14 +15,13 @@
 import org.junit.Test;
 
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.exc.ValueInstantiationException;
-
 import geniusweb.issuevalue.Bid;
 import geniusweb.issuevalue.DiscreteValue;
 import geniusweb.issuevalue.DiscreteValueSet;
 import geniusweb.issuevalue.Domain;
-import geniusweb.issuevalue.NumberValue;
 import geniusweb.issuevalue.Value;
 import geniusweb.issuevalue.ValueSet;
+import geniusweb.profile.utilityspace.DiscreteValueSetUtilities;
+import geniusweb.profile.utilityspace.LinearAdditiveUtilitySpace;
+import geniusweb.profile.utilityspace.ValueSetUtilities;
 import tudelft.utilities.junit.GeneralTests;
 
@@ -61,5 +54,4 @@
 
 	private static final ValueSetUtilities value1Utils;
-	private static final ObjectMapper jackson = new ObjectMapper();
 
 	static {
@@ -148,8 +140,8 @@
 	public List<String> getGeneralTestStrings() {
 		return Arrays.asList(
-				"LinearAdditive\\[\\{issue2=DiscreteValueSetUtilities\\{\"issue2value2\"=0.8, \"issue2value1\"=0.6\\}, issue1=DiscreteValueSetUtilities\\{\"issue1value1\"=0.3, \"issue1value2\"=0.2\\}\\},\\{issue2=0.6, issue1=0.4\\},Bid\\{issue2=\"issue2value1\", issue1=\"issue1value2\"\\}\\]",
-				"LinearAdditive\\[\\{issue2=DiscreteValueSetUtilities\\{\"issue2value2\"=0.8, \"issue2value1\"=0.6\\}, issue1=DiscreteValueSetUtilities\\{\"issue1value1\"=0.3, \"issue1value2\"=0.2\\}\\},\\{issue2=0.7, issue1=0.3\\},Bid\\{issue2=\"issue2value1\", issue1=\"issue1value2\"\\}\\]",
-				"LinearAdditive\\[\\{issue2=DiscreteValueSetUtilities\\{\"issue2value2\"=0.2, \"issue2value1\"=0.3\\}, issue1=DiscreteValueSetUtilities\\{\"issue1value1\"=0.6, \"issue1value2\"=0.8\\}\\},\\{issue2=0.6, issue1=0.4\\},Bid\\{issue2=\"issue2value1\", issue1=\"issue1value2\"\\}\\]",
-				"LinearAdditive\\[\\{issue2=DiscreteValueSetUtilities\\{\"issue2value2\"=0.2, \"issue2value1\"=0.3\\}, issue1=DiscreteValueSetUtilities\\{\"issue1value1\"=0.6, \"issue1value2\"=0.8\\}\\},\\{issue2=0.6, issue1=0.4\\},Bid\\{issue2=\"issue2value1\", issue1=\"issue1value1\"\\}\\]");
+				"LinearAdditive\\[\\{issue2=ValueSetUtilities\\{\"issue2value2\"=0.8, \"issue2value1\"=0.6\\}, issue1=ValueSetUtilities\\{\"issue1value1\"=0.3, \"issue1value2\"=0.2\\}\\},\\{issue2=0.6, issue1=0.4\\},Bid\\{issue2=\"issue2value1\", issue1=\"issue1value2\"\\}\\]",
+				"LinearAdditive\\[\\{issue2=ValueSetUtilities\\{\"issue2value2\"=0.8, \"issue2value1\"=0.6\\}, issue1=ValueSetUtilities\\{\"issue1value1\"=0.3, \"issue1value2\"=0.2\\}\\},\\{issue2=0.7, issue1=0.3\\},Bid\\{issue2=\"issue2value1\", issue1=\"issue1value2\"\\}\\]",
+				"LinearAdditive\\[\\{issue2=ValueSetUtilities\\{\"issue2value2\"=0.2, \"issue2value1\"=0.3\\}, issue1=ValueSetUtilities\\{\"issue1value1\"=0.6, \"issue1value2\"=0.8\\}\\},\\{issue2=0.6, issue1=0.4\\},Bid\\{issue2=\"issue2value1\", issue1=\"issue1value2\"\\}\\]",
+				"LinearAdditive\\[\\{issue2=ValueSetUtilities\\{\"issue2value2\"=0.2, \"issue2value1\"=0.3\\}, issue1=ValueSetUtilities\\{\"issue1value1\"=0.6, \"issue1value2\"=0.8\\}\\},\\{issue2=0.6, issue1=0.4\\},Bid\\{issue2=\"issue2value1\", issue1=\"issue1value1\"\\}\\]");
 	}
 
@@ -175,4 +167,7 @@
 	}
 
+	/**
+	 * Empty profile is not allowed since the weights then don't sum up to 1
+	 */
 	@Test
 	public void constructorOneIssueTest() {
@@ -182,5 +177,5 @@
 		weightset.put(ISS1, BigDecimal.ONE);
 		new LinearAdditiveUtilitySpace(smalldomain, NAME, utilset, weightset,
-				null);
+				reservationBid);
 	}
 
@@ -209,5 +204,5 @@
 		weightset.put(ISS1, BigDecimal.ONE);
 		LinearAdditiveUtilitySpace space = new LinearAdditiveUtilitySpace(
-				smalldomain, NAME, utilset, weightset, null);
+				smalldomain, NAME, utilset, weightset, reservationBid);
 	}
 
@@ -251,13 +246,11 @@
 		Bid bid1 = new Bid(issuevalues);
 		Map<String, Value> issuevalues1 = new HashMap<>();
-		issuevalues1.put(ISS1, i1v2);
-		issuevalues1.put(ISS2, i2v1);
+		issuevalues.put(ISS1, i1v2);
+		issuevalues.put(ISS2, i1v1);
 		Bid bid2 = new Bid(issuevalues1);
 		assertTrue(utilspace1.isPreferredOrEqual(bid1, bid2));
 		assertTrue(utilspace1.isPreferredOrEqual(bid1, bid1));
 		assertTrue(utilspace1.isPreferredOrEqual(bid2, bid2));
-		assertFalse(utilspace1.isPreferredOrEqual(bid2, bid1));
-		assertFalse(utilspace1
-				.isPreferredOrEqual(new Bid(Collections.emptyMap()), bid1));
+		assertTrue(!utilspace1.isPreferredOrEqual(bid2, bid1));
 	}
 
@@ -272,56 +265,3 @@
 				WEIGHT1.multiply(I1V1UTIL).compareTo(space.getUtility(bid)));
 	}
-
-	@Test
-	public void loadFullWithJson() throws IOException {
-		String profile = new String(
-				Files.readAllBytes(Paths.get("src/test/resources/party1.json")),
-				StandardCharsets.UTF_8);
-		UtilitySpace space = jackson.readValue(profile, UtilitySpace.class);
-
-	}
-
-	@Test
-	public void loadFullWithJsonNumber() throws IOException {
-		String profile = new String(
-				Files.readAllBytes(
-						Paths.get("src/test/resources/japantrip1.json")),
-				StandardCharsets.UTF_8);
-		UtilitySpace space = jackson.readValue(profile, UtilitySpace.class);
-
-	}
-
-	@Test(expected = IllegalArgumentException.class)
-	public void testResBidWithNonsenseIssue() {
-		Bid resBid = new Bid("nonsense", i1v1);
-		new LinearAdditiveUtilitySpace(domain, NAME, utils, weights, resBid);
-	}
-
-	@Test(expected = IllegalArgumentException.class)
-	public void testResBidWithWrongValueType() {
-		Bid resBid = new Bid(ISS1, new NumberValue(BigDecimal.ZERO));
-		new LinearAdditiveUtilitySpace(domain, NAME, utils, weights, resBid);
-	}
-
-	@Test(expected = IllegalArgumentException.class)
-	public void testResBidWithNonsenseValue() {
-		Bid resBid = new Bid(ISS1, new DiscreteValue("nonsense"));
-		new LinearAdditiveUtilitySpace(domain, NAME, utils, weights, resBid);
-	}
-
-	/**
-	 * This should throw because computersell-domainmismatch has a mismatch: it
-	 * has "high 32G" as graphics option, but the utilities have no value for
-	 * that. Instead it talks about "high 24G"
-	 */
-	@Test(expected = ValueInstantiationException.class)
-	public void testIsFitting() throws IOException {
-		String profile = new String(
-				Files.readAllBytes(Paths.get(
-						"src/test/resources/computersell-domainmismatch.json")),
-				StandardCharsets.UTF_8);
-		UtilitySpace space = jackson.readValue(profile, UtilitySpace.class);
-
-	}
-
 }
Index: /profile/src/test/java/geniusweb/profile/utilityspace/NumberValueSetUtilTest.java
===================================================================
--- /profile/src/test/java/geniusweb/profile/utilityspace/NumberValueSetUtilTest.java	(revision 53)
+++ /profile/src/test/java/geniusweb/profile/utilityspace/NumberValueSetUtilTest.java	(revision 1)
@@ -3,5 +3,4 @@
 import static org.junit.Assert.assertEquals;
 
-import java.io.IOException;
 import java.math.BigDecimal;
 import java.util.Arrays;
@@ -10,19 +9,9 @@
 import org.junit.Test;
 
-import com.fasterxml.jackson.core.JsonParseException;
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.databind.JsonMappingException;
-import com.fasterxml.jackson.databind.ObjectMapper;
-
-import geniusweb.issuevalue.DiscreteValue;
-import geniusweb.issuevalue.DiscreteValueSet;
 import geniusweb.issuevalue.NumberValue;
-import geniusweb.issuevalue.NumberValueSet;
-import geniusweb.issuevalue.ValueSet;
-import tudelft.utilities.immutablelist.Range;
+import geniusweb.profile.utilityspace.NumberValueSetUtilities;
 import tudelft.utilities.junit.GeneralTests;
 
-public class NumberValueSetUtilTest
-		extends GeneralTests<NumberValueSetUtilities> {
+public class NumberValueSetUtilTest extends GeneralTests<NumberValueSetUtilities> {
 
 	private static final BigDecimal lowval1 = new BigDecimal("12.5");
@@ -32,28 +21,22 @@
 	private static final BigDecimal highvalb = new BigDecimal("18.4");
 	private static final BigDecimal highutil = new BigDecimal("0.9");
-	private static final NumberValueSetUtilities valueset1 = new NumberValueSetUtilities(
-			lowval1, low1util, highval, highutil);
-	private static final NumberValueSetUtilities valueset1b = new NumberValueSetUtilities(
-			lowval1, low1util, highval, highutil);
-	private static final NumberValueSetUtilities valueset2 = new NumberValueSetUtilities(
-			lowval1, low1utilb, highval, highutil);
-	private static final NumberValueSetUtilities valueset3 = new NumberValueSetUtilities(
-			lowval1, low1util, highvalb, highutil);
-	private static final BigDecimal ZERO_1 = new BigDecimal("0.1");
-	private final String utilstring = "{\"NumberValueSetUtilities\":{\"lowValue\":12.5,\"lowUtility\":0.5,\"highValue\":18.5,\"highUtility\":0.9}}";
-
-	private static final ObjectMapper jackson = new ObjectMapper();
+	private static final NumberValueSetUtilities valueset1 = new NumberValueSetUtilities(lowval1, low1util, highval,
+			highutil);
+	private static final NumberValueSetUtilities valueset1b = new NumberValueSetUtilities(lowval1, low1util, highval,
+			highutil);
+	private static final NumberValueSetUtilities valueset2 = new NumberValueSetUtilities(lowval1, low1utilb, highval,
+			highutil);
+	private static final NumberValueSetUtilities valueset3 = new NumberValueSetUtilities(lowval1, low1util, highvalb,
+			highutil);
 
 	@Override
 	public List<List<NumberValueSetUtilities>> getGeneralTestData() {
-		return Arrays.asList(Arrays.asList(valueset1, valueset1b),
-				Arrays.asList(valueset2), Arrays.asList(valueset3));
+		return Arrays.asList(Arrays.asList(valueset1, valueset1b), Arrays.asList(valueset2), Arrays.asList(valueset3));
 	}
 
 	@Override
 	public List<String> getGeneralTestStrings() {
-		return Arrays.asList("NumberValueSetUtilities\\(12.5->0.5,18.5->0.9\\)",
-				"NumberValueSetUtilities\\(12.5->0.6,18.5->0.9\\)",
-				"NumberValueSetUtilities\\(12.5->0.5,18.4->0.9\\)");
+		return Arrays.asList("NumberValUtility\\(12.5->0.5,18.5->0.9\\)", "NumberValUtility\\(12.5->0.6,18.5->0.9\\)",
+				"NumberValUtility\\(12.5->0.5,18.4->0.9\\)");
 	}
 
@@ -66,135 +49,16 @@
 	public void utilAscentingTest() {
 		NumberValueSetUtilities utils = valueset1;
-		assertEquals(0,
-				low1util.compareTo(utils.getUtility(new NumberValue(lowval1))));
+		assertEquals(0, low1util.compareTo(utils.getUtility(new NumberValue(lowval1))));
 	}
 
 	@Test
 	public void utilDescendingTest() {
-		NumberValueSetUtilities utils = new NumberValueSetUtilities(lowval1,
-				highutil, highval, low1util);
-		assertEquals(0,
-				highutil.compareTo(utils.getUtility(new NumberValue(lowval1))));
+		NumberValueSetUtilities utils = new NumberValueSetUtilities(lowval1, highutil, highval, low1util);
+		assertEquals(0, highutil.compareTo(utils.getUtility(new NumberValue(lowval1))));
 	}
 
 	@Test(expected = IllegalArgumentException.class)
 	public void reverserangetest() {
-		NumberValueSetUtilities utils = new NumberValueSetUtilities(highval,
-				low1util, highval, highutil);
-	}
-
-	@Test(expected = NullPointerException.class)
-	public void testNullHigh() {
-		NumberValueSetUtilities utils = new NumberValueSetUtilities(lowval1,
-				low1util, null, highutil);
-	}
-
-	@Test(expected = NullPointerException.class)
-	public void testNullHighUtil() {
-		NumberValueSetUtilities utils = new NumberValueSetUtilities(lowval1,
-				low1util, highval, null);
-	}
-
-	@Test(expected = NullPointerException.class)
-	public void testNullLow() {
-		NumberValueSetUtilities utils = new NumberValueSetUtilities(null,
-				low1util, highval, highutil);
-	}
-
-	@Test(expected = NullPointerException.class)
-	public void testNullLowUtil() {
-		NumberValueSetUtilities utils = new NumberValueSetUtilities(lowval1,
-				null, highval, highutil);
-	}
-
-	@Test(expected = IllegalArgumentException.class)
-	public void testLowUtilNegative() {
-		NumberValueSetUtilities utils = new NumberValueSetUtilities(lowval1,
-				new BigDecimal("-0.2"), highval, highutil);
-	}
-
-	@Test(expected = IllegalArgumentException.class)
-	public void testHighUtilNegative() {
-		NumberValueSetUtilities utils = new NumberValueSetUtilities(lowval1,
-				low1util, highval, new BigDecimal("-0.000003"));
-	}
-
-	@Test
-	public void getUtilTest() {
-		NumberValueSetUtilities utils = new NumberValueSetUtilities(lowval1,
-				low1util, highval, highutil);
-		assertEquals(0,
-				highutil.compareTo(utils.getUtility(new NumberValue(highval))));
-		assertEquals(0,
-				low1util.compareTo(utils.getUtility(new NumberValue(lowval1))));
-		// linear interpolated , check center
-		BigDecimal middleutil = low1util.add(highutil)
-				.divide(new BigDecimal("2"));
-		NumberValue middleval = new NumberValue(
-				lowval1.add(highval).divide(new BigDecimal("2")));
-		assertEquals(0, middleutil.compareTo(utils.getUtility(middleval)));
-
-	}
-
-	@Test
-	public void testIsNotFittingRange() {
-		ValueSet valueset = new NumberValueSet(
-				new Range(low1util, highutil, new BigDecimal("0.02")));
-		ValueSetUtilities utilset = new NumberValueSetUtilities(lowval1,
-				low1util, highval, highutil);
-		assertEquals(
-				"the utilities are specified down to 12.5 but the valueset starts at 0.5",
-				utilset.isFitting(valueset));
-	}
-
-	@Test
-	public void testTopOfRangeTooLarge() {
-		ValueSet valueset = new NumberValueSet(
-				new Range(lowval1, highval.subtract(ZERO_1), ZERO_1));
-		ValueSetUtilities utilset = new NumberValueSetUtilities(lowval1,
-				low1util, highval, highutil);
-		assertEquals(
-				"the utilities are specified up to 18.5 but the valueset ends at 18.4",
-				utilset.isFitting(valueset));
-	}
-
-	@Test
-	public void testIsFitting() {
-		ValueSet valueset = new NumberValueSet(
-				new Range(lowval1, highval, BigDecimal.ONE));
-		ValueSetUtilities utilset = new NumberValueSetUtilities(lowval1,
-				low1util, highval, highutil);
-		assertEquals(null, utilset.isFitting(valueset));
-	}
-
-	@Test
-	public void testIsFittingWrongType() {
-		DiscreteValue vala = new DiscreteValue("a");
-		DiscreteValue valb = new DiscreteValue("b");
-		ValueSet valueset = new DiscreteValueSet(Arrays.asList(vala, valb));
-
-		NumberValueSetUtilities utilset = new NumberValueSetUtilities(lowval1,
-				low1util, highval, highutil);
-		assertEquals(
-				"The utilities are for a number valueset but the given values are DiscreteValueSet[\"a\", \"b\"]",
-				utilset.isFitting(valueset));
-
-	}
-
-	@Test
-	public void testSerialize() throws JsonProcessingException {
-
-		String json = jackson.writeValueAsString(valueset1);
-		System.out.println(json);
-		assertEquals(utilstring, json);
-	}
-
-	@Test
-	public void testDeserialize()
-			throws JsonParseException, JsonMappingException, IOException {
-		ValueSetUtilities valueutils = jackson.readValue(utilstring,
-				ValueSetUtilities.class);
-		assertEquals(valueset1, valueutils);
-
+		NumberValueSetUtilities utils = new NumberValueSetUtilities(highval, highutil, lowval1, low1util);
 	}
 
Index: ofile/src/test/java/geniusweb/profile/utilityspace/PartsUtilitiesTest.java
===================================================================
--- /profile/src/test/java/geniusweb/profile/utilityspace/PartsUtilitiesTest.java	(revision 53)
+++ 	(revision )
@@ -1,144 +1,0 @@
-package geniusweb.profile.utilityspace;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-
-import java.io.IOException;
-import java.math.BigDecimal;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-
-import org.junit.Before;
-import org.junit.Test;
-
-import com.fasterxml.jackson.core.JsonParseException;
-import com.fasterxml.jackson.databind.JsonMappingException;
-import com.fasterxml.jackson.databind.ObjectMapper;
-
-import geniusweb.issuevalue.DiscreteValue;
-import geniusweb.issuevalue.Value;
-import tudelft.utilities.junit.GeneralTests;
-
-public class PartsUtilitiesTest extends GeneralTests<PartsUtilities> {
-	private static final String iss2 = "issue2";
-
-	private static final String iss1 = "issue1";
-
-	private final ObjectMapper jackson = new ObjectMapper();
-
-	private static BigDecimal N01 = new BigDecimal("0.1"),
-			N02 = new BigDecimal("0.2"), N03 = new BigDecimal("0.3"),
-			N05 = new BigDecimal("0.5"), N07 = new BigDecimal("0.7"),
-			N08 = new BigDecimal("0.8"), N09 = new BigDecimal("0.9");
-	private final static DiscreteValue low = new DiscreteValue("low");
-	private final static DiscreteValue high = new DiscreteValue("high");
-
-	private final static String jsontext = "{\"PartsUtilities\":{\"issues\":[\"issue1\",\"issue2\"],\"utilslist\":[{\"values\":[\"low\",\"low\"],\"util\":0.3},{\"values\":[\"high\",\"high\"],\"util\":0.9}]}}";
-
-	private PartsUtilities parts1, parts1a, parts2, parts3;
-
-	@Before
-	public void before() {
-		List<PartUtil> vals = new LinkedList<>();
-		vals.add(new PartUtil(Arrays.asList(low, low), N03));
-		vals.add(new PartUtil(Arrays.asList(high, high), N09));
-		List<PartUtil> vals1 = new LinkedList<>();
-		vals1.add(new PartUtil(Arrays.asList(low, low), N09));
-		List<String> issues = Arrays.asList(iss1, iss2);
-		parts1 = new PartsUtilities(issues, vals);
-		parts1a = new PartsUtilities(issues, vals);
-		parts2 = new PartsUtilities(Arrays.asList(iss1), vals);
-		parts3 = new PartsUtilities(issues, vals1);
-	}
-
-	@Override
-	public List<List<PartsUtilities>> getGeneralTestData() {
-		return Arrays.asList(Arrays.asList(parts1, parts1a),
-				Arrays.asList(parts2), Arrays.asList(parts3));
-	}
-
-	@Override
-	public List<String> getGeneralTestStrings() {
-		return Arrays.asList(
-				"PartsUtilities..issue1, issue2.,\\{.\"low\", \"low\".=0.3, .\"high\", \"high\".=0.9\\}.",
-				"PartsUtilities..issue1.,\\{.\"low\", \"low\".=0.3, .\"high\", \"high\".=0.9\\}.",
-				"PartsUtilities..issue1, issue2.,\\{.\"low\", \"low\".=0.9\\}.");
-	}
-
-	@Test(expected = IllegalArgumentException.class)
-	public void testWeightsTooHigh() {
-		Map<ProductOfValue, BigDecimal> utils = new HashMap<>();
-		utils.put(new ProductOfValue(Arrays.asList(low, low)),
-				new BigDecimal("1.1"));
-		new PartsUtilities(Arrays.asList(iss1, iss2), utils);
-	}
-
-	@Test(expected = IllegalArgumentException.class)
-	public void testWeightsTooLow() {
-		Map<ProductOfValue, BigDecimal> utils = new HashMap<>();
-		utils.put(new ProductOfValue(Arrays.asList(low, low)),
-				new BigDecimal("-0.3"));
-		new PartsUtilities(Arrays.asList(iss1, iss2), utils);
-	}
-
-	@Test
-	public void testBasicSerialize()
-			throws JsonParseException, JsonMappingException, IOException {
-		System.out.println(jsontext);
-		assertEquals(jsontext, jackson.writeValueAsString(parts1));
-	}
-
-	@Test
-	public void testBasicDeserialize()
-			throws JsonParseException, JsonMappingException, IOException {
-		System.out.println(jsontext);
-		assertEquals(parts1, jackson.readValue(jsontext, PartsUtilities.class));
-	}
-
-	@Test
-	public void testGetUtility() {
-		assertEquals(N03,
-				parts1.getUtility(new ProductOfValue(Arrays.asList(low, low))));
-		assertEquals(N09, parts1
-				.getUtility(new ProductOfValue(Arrays.asList(high, high))));
-		assertEquals(BigDecimal.ZERO, parts1
-				.getUtility(new ProductOfValue(Arrays.asList(low, high))));
-	}
-
-	@Test
-	public void testGetIssues() {
-		assertEquals(Arrays.asList(iss1, iss2), parts1.getIssues());
-	}
-
-	@Test
-	public void testGetIncorrectValue() {
-		assertEquals(BigDecimal.ZERO, parts1.getUtility(low));
-	}
-
-	@Test
-	public void testGetValue() {
-		assertTrue(N03.compareTo(parts1
-				.getUtility(new ProductOfValue(Arrays.asList(low, low)))) == 0);
-	}
-
-	@Test
-	public void testMerge() {
-		Map<ProductOfValue, BigDecimal> extravals = new HashMap<>();
-		extravals.put(new ProductOfValue(Arrays.asList(low, low)),
-				N01.multiply(N05));
-		extravals.put(new ProductOfValue(Arrays.asList(high, high)),
-				N01.multiply(N07));
-		PartsUtilities extraparts = new PartsUtilities(
-				Arrays.asList("extra1", "extra2"), extravals);
-
-		PartsUtilities merged = parts1.add(extraparts);
-
-		Value pval = new ProductOfValue(Arrays.asList(low, low, high, high));
-		assertEquals(0,
-				N03.add(N01.multiply(N07)).compareTo(merged.getUtility(pval)));
-	}
-
-}
Index: ofile/src/test/java/geniusweb/profile/utilityspace/ProductOfValueTest.java
===================================================================
--- /profile/src/test/java/geniusweb/profile/utilityspace/ProductOfValueTest.java	(revision 53)
+++ 	(revision )
@@ -1,78 +1,0 @@
-package geniusweb.profile.utilityspace;
-
-import static org.junit.Assert.assertEquals;
-import static org.mockito.Mockito.mock;
-
-import java.io.IOException;
-import java.util.Arrays;
-import java.util.List;
-
-import org.junit.Test;
-
-import com.fasterxml.jackson.core.JsonParseException;
-import com.fasterxml.jackson.databind.JsonMappingException;
-import com.fasterxml.jackson.databind.ObjectMapper;
-
-import geniusweb.issuevalue.DiscreteValue;
-import geniusweb.issuevalue.Value;
-import tudelft.utilities.junit.GeneralTests;
-
-public class ProductOfValueTest extends GeneralTests<ProductOfValue> {
-	private final static ObjectMapper jackson = new ObjectMapper();
-
-	private final static Value value1 = new DiscreteValue("val1");
-	private final static Value value2 = new DiscreteValue("val2");
-	private final static ProductOfValue values1 = new ProductOfValue(
-			Arrays.asList(value1, value2));
-	private final static ProductOfValue values1a = new ProductOfValue(
-			Arrays.asList(value1, value2));
-	private final static ProductOfValue values2 = new ProductOfValue(
-			Arrays.asList(value2));
-	private final static DiscreteValue low = new DiscreteValue("low");
-	private final static DiscreteValue high = new DiscreteValue("high");
-
-	private String jsontext = "[\"val1\",\"val2\"]";
-
-	@Override
-	public List<List<ProductOfValue>> getGeneralTestData() {
-		return Arrays.asList(Arrays.asList(values1, values1a),
-				Arrays.asList(values2));
-	}
-
-	@Override
-	public List<String> getGeneralTestStrings() {
-		return Arrays.asList(".*\"val1\", \"val2\".*", ".*\"val2\".*");
-	}
-
-	@Test
-	public void testSerialize()
-			throws JsonParseException, JsonMappingException, IOException {
-
-		assertEquals(jsontext, jackson.writeValueAsString(values1));
-	}
-
-	@Test
-	public void testBasicDeserialize()
-			throws JsonParseException, JsonMappingException, IOException {
-		System.out.println(jsontext);
-		assertEquals(values1,
-				jackson.readValue(jsontext, ProductOfValue.class));
-	}
-
-	@Test
-	public void testMerge() {
-		Value val1 = mock(Value.class);
-		Value val2 = mock(Value.class);
-		Value val3 = mock(Value.class);
-		Value val4 = mock(Value.class);
-
-		ProductOfValue prodOfVal1 = new ProductOfValue(
-				Arrays.asList(val1, val2));
-		ProductOfValue prodOfVal2 = new ProductOfValue(
-				Arrays.asList(val3, val4));
-
-		ProductOfValue prodVal = prodOfVal1.merge(prodOfVal2);
-		assertEquals(4, prodVal.getValues().size());
-	}
-
-}
Index: ofile/src/test/java/geniusweb/profile/utilityspace/SumOfGroupsUtilitySpaceTest.java
===================================================================
--- /profile/src/test/java/geniusweb/profile/utilityspace/SumOfGroupsUtilitySpaceTest.java	(revision 53)
+++ 	(revision )
@@ -1,397 +1,0 @@
-package geniusweb.profile.utilityspace;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-
-import java.io.IOException;
-import java.math.BigDecimal;
-import java.math.BigInteger;
-import java.nio.charset.StandardCharsets;
-import java.nio.file.Files;
-import java.nio.file.Paths;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.stream.Collectors;
-
-import org.junit.Before;
-import org.junit.Test;
-
-import com.fasterxml.jackson.core.JsonParseException;
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.databind.JsonMappingException;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.exc.ValueInstantiationException;
-
-import geniusweb.issuevalue.Bid;
-import geniusweb.issuevalue.DiscreteValue;
-import geniusweb.issuevalue.DiscreteValueSet;
-import geniusweb.issuevalue.Domain;
-import geniusweb.issuevalue.Value;
-import geniusweb.issuevalue.ValueSet;
-import geniusweb.profile.Profile;
-import tudelft.utilities.immutablelist.AbstractImmutableList;
-import tudelft.utilities.immutablelist.ImmutableList;
-import tudelft.utilities.immutablelist.Outer;
-import tudelft.utilities.junit.GeneralTests;
-
-public class SumOfGroupsUtilitySpaceTest
-		extends GeneralTests<SumOfGroupsUtilitySpace> {
-	private final ObjectMapper jackson = new ObjectMapper();
-	private SumOfGroupsUtilitySpace pa1;
-	private final String iss1 = "issue1", iss2 = "issue2", iss3 = "issue3";
-	private static BigDecimal N01 = new BigDecimal("0.1"),
-			N02 = new BigDecimal("0.2"), N03 = new BigDecimal("0.3"),
-			N05 = new BigDecimal("0.5"), N07 = new BigDecimal("0.7"),
-			N08 = new BigDecimal("0.8"), N09 = new BigDecimal("0.9");
-
-	private final DiscreteValue lo = new DiscreteValue("low");
-	private final DiscreteValue hi = new DiscreteValue("high");
-	private final Bid resBid = new Bid(iss1, hi);
-
-	private Domain domain;
-	private PartsUtilities putils12, putils3, putils3b;
-	private String serialized = "{\"SumOfGroupsUtilitySpace\":{\"domain\":{\"name\":\"domain\",\"issuesValues\":{\"issue3\":{\"values\":[\"low\",\"high\"]},\"issue2\":{\"values\":[\"low\",\"high\"]},\"issue1\":{\"values\":[\"low\",\"high\"]}}},\"name\":\"testspace\",\"partUtilities\":{\"1and2\":{\"PartsUtilities\":{\"issues\":[\"issue1\",\"issue2\"],\"utilslist\":[{\"values\":[\"low\",\"low\"],\"util\":0.16},{\"values\":[\"high\",\"high\"],\"util\":0.72},{\"values\":[\"low\",\"high\"],\"util\":0.16},{\"values\":[\"high\",\"low\"],\"util\":0.16}]}},\"3\":{\"PartsUtilities\":{\"issues\":[\"issue3\"],\"utilslist\":[{\"values\":[\"low\"],\"util\":0.16},{\"values\":[\"high\"],\"util\":0.14}]}}},\"reservationbid\":{\"issuevalues\":{\"issue1\":\"high\"}}}}";
-	private SumOfGroupsUtilitySpace sog1, sog1a, sog2, sog3;
-
-	@Before
-	public void before() {
-		Map<String, ValueSet> issues = new HashMap<>();
-		issues.put(iss1, new DiscreteValueSet(lo, hi));
-		issues.put(iss2, new DiscreteValueSet(lo, hi));
-		issues.put(iss3, new DiscreteValueSet(lo, hi));
-		domain = new Domain("domain", issues);
-
-		Map<ProductOfValue, BigDecimal> utils12 = new HashMap<>();
-		// util12 has weight N08
-		utils12.put(new ProductOfValue(Arrays.asList(lo, lo)),
-				N02.multiply(N08));
-		utils12.put(new ProductOfValue(Arrays.asList(lo, hi)),
-				N02.multiply(N08));
-		utils12.put(new ProductOfValue(Arrays.asList(hi, lo)),
-				N02.multiply(N08));
-		utils12.put(new ProductOfValue(Arrays.asList(hi, hi)),
-				N09.multiply(N08));
-		putils12 = new PartsUtilities(Arrays.asList(iss1, iss2), utils12);
-
-		// utils3 has weight N02.
-		Map<ProductOfValue, BigDecimal> utils3 = new HashMap<>();
-		utils3.put(new ProductOfValue(Arrays.asList(lo)), N08.multiply(N02));
-		utils3.put(new ProductOfValue(Arrays.asList(hi)), N07.multiply(N02));
-		putils3 = new PartsUtilities(Arrays.asList(iss3), utils3);
-
-		Map<ProductOfValue, BigDecimal> utils3b = new HashMap<>();
-		utils3b.put(new ProductOfValue(Arrays.asList(lo)), N07.multiply(N02));
-		utils3b.put(new ProductOfValue(Arrays.asList(hi)), N08.multiply(N02));
-		putils3b = new PartsUtilities(Arrays.asList(iss3), utils3b);
-
-		HashMap<String, PartsUtilities> partutils = new HashMap<>();
-		partutils.put("1and2", putils12);
-		partutils.put("3", putils3);
-
-		sog1 = new SumOfGroupsUtilitySpace(domain, "testspace", partutils,
-				resBid);
-		sog1a = new SumOfGroupsUtilitySpace(domain, "testspace", partutils,
-				resBid);
-		sog2 = new SumOfGroupsUtilitySpace(domain, "testspace2", partutils,
-				resBid);
-
-		// reuse partutils. Also checks that the values have been copied
-		partutils = new HashMap<>();
-		partutils.put("1and2", putils12);
-		partutils.put("3", putils3b);
-		sog3 = new SumOfGroupsUtilitySpace(domain, "testspace", partutils,
-				resBid);
-
-	}
-
-	@Override
-	public List<List<SumOfGroupsUtilitySpace>> getGeneralTestData() {
-		return Arrays.asList(Arrays.asList(sog1, sog1a), Arrays.asList(sog2),
-				Arrays.asList(sog3));
-	}
-
-	@Override
-	public List<String> getGeneralTestStrings() {
-		return Arrays.asList(
-				"SumOfGroupsUtilitySpace.*testspace.*1and2.*PartsUtilities.*issue1.*issue2.*3.*PartsUtilities.*Bid.*issue1.*high.*",
-				"SumOfGroupsUtilitySpace.*testspace2.*1and2.*PartsUtilities.*issue1.*issue2.*3.*PartsUtilities.*Bid.*issue1.*high.*",
-				"SumOfGroupsUtilitySpace.*testspace.*1and2.*PartsUtilities.*issue1.*issue2.*3.*PartsUtilities.*Bid.*issue1.*high.*");
-	}
-
-	@Test(expected = IllegalArgumentException.class)
-	public void smokeTestIncompleteProfile() {
-		HashMap<String, PartsUtilities> partutils = new HashMap<>();
-		partutils.put("1and2", putils12);
-		new SumOfGroupsUtilitySpace(domain, "testspace", partutils, resBid);
-
-	}
-
-	@Test // non-normalized utils should be fine in this case
-	public void smokeTestWeightsNotNormalized() {
-		HashMap<String, PartsUtilities> partutils = new HashMap<>();
-		partutils.put("1and2", putils12);
-		partutils.put("3", putils3);
-		new SumOfGroupsUtilitySpace(domain, "testspace", partutils, resBid);
-
-	}
-
-	@Test(expected = IllegalArgumentException.class)
-	public void smokeTestExtraIssue() {
-		HashMap<String, PartsUtilities> partutils = new HashMap<>();
-		partutils.put("1and2", putils12);
-		partutils.put("3", putils3);
-		partutils.put("4", putils3);
-		new SumOfGroupsUtilitySpace(domain, "testspace", partutils, resBid);
-
-	}
-
-	@Test
-	public void smokeTest() {
-		makeBasic();
-	}
-
-	@Test
-	public void testName() {
-		SumOfGroupsUtilitySpace paus = makeBasic();
-		assertEquals("testspace", paus.getName());
-	}
-
-	@Test
-	public void testDomain() {
-		SumOfGroupsUtilitySpace paus = makeBasic();
-		assertEquals(domain, paus.getDomain());
-	}
-
-	@Test
-	public void testGetResBid() {
-		SumOfGroupsUtilitySpace paus = makeBasic();
-		assertEquals(resBid, paus.getReservationBid());
-	}
-
-	@Test
-	public void testGetUtilityEmptyBid() {
-		SumOfGroupsUtilitySpace paus = makeBasic();
-		assertTrue(BigDecimal.ZERO.compareTo(
-				paus.getUtility(new Bid(Collections.emptyMap()))) == 0);
-	}
-
-	@Test
-	public void testGetUtility() {
-		SumOfGroupsUtilitySpace paus = makeBasic();
-		Map<String, Value> map = new HashMap<>();
-		map.put(iss1, lo);
-		map.put(iss2, lo); // 1,2 combined has util 0.2
-		map.put(iss3, hi); // 3 has util 0.7
-		// weights are set to 0.8, 0.2. Gives total util 0.3
-		Bid bid = new Bid(map);
-		assertTrue(N03.compareTo(paus.getUtility(bid)) == 0);
-	}
-
-	/**
-	 * Demonstrates how to convert {@link LinearAdditiveUtilitySpace} to a
-	 * {@link SumOfGroupsUtilitySpace}
-	 * 
-	 */
-	@Test
-	public void testConvertLas() throws IOException {
-		String profile = new String(
-				Files.readAllBytes(Paths.get("src/test/resources/party1.json")),
-				StandardCharsets.UTF_8);
-		LinearAdditiveUtilitySpace las = jackson.readValue(profile,
-				LinearAdditiveUtilitySpace.class);
-		SumOfGroupsUtilitySpace pas = SumOfGroupsUtilitySpace.create(las);
-		checkUtilitiesAllEqual(las, pas);
-		System.out.println("Generated partial profile:\n" + pas);
-	}
-
-	/**
-	 * Demonstrates how to convert {@link LinearAdditiveUtilitySpace} to a
-	 * {@link SumOfGroupsUtilitySpace} and group some issues
-	 * 
-	 */
-	@Test
-	public void testConvertAndGroupParty() throws IOException {
-		String profile = new String(
-				Files.readAllBytes(Paths.get("src/test/resources/party1.json")),
-				StandardCharsets.UTF_8);
-		LinearAdditiveUtilitySpace las = jackson.readValue(profile,
-				LinearAdditiveUtilitySpace.class);
-		SumOfGroupsUtilitySpace pas = SumOfGroupsUtilitySpace.create(las);
-		pas = pas.group(Arrays.asList("Food", "Drinks"), "food&drinks");
-		checkUtilitiesAllEqual(las, pas);
-		System.out.println("Re-grouped party profile:\n");
-		System.out.println(jackson.writeValueAsString(pas));
-
-	}
-
-	@Test
-	public void testGroupe2e() {
-		Map<ProductOfValue, BigDecimal> utils1 = new HashMap<>();
-		utils1.put(new ProductOfValue(Arrays.asList(lo)), N02.multiply(N02));
-		utils1.put(new ProductOfValue(Arrays.asList(hi)), N03.multiply(N02));
-		Map<ProductOfValue, BigDecimal> utils2 = new HashMap<>();
-		utils2.put(new ProductOfValue(Arrays.asList(lo)), N07.multiply(N03));
-		utils2.put(new ProductOfValue(Arrays.asList(hi)), N02.multiply(N03));
-		Map<ProductOfValue, BigDecimal> utils3 = new HashMap<>();
-		utils3.put(new ProductOfValue(Arrays.asList(lo)), N05.multiply(N05));
-		utils3.put(new ProductOfValue(Arrays.asList(hi)), N08.multiply(N05));
-		HashMap<String, PartsUtilities> partutils = new HashMap<>();
-		partutils.put(iss1, new PartsUtilities(Arrays.asList(iss1), utils1));
-		partutils.put(iss2, new PartsUtilities(Arrays.asList(iss2), utils2));
-		partutils.put(iss3, new PartsUtilities(Arrays.asList(iss3), utils3));
-
-		Map<String, ValueSet> issvalues = new HashMap<>();
-		issvalues.put(iss1, new DiscreteValueSet(lo, hi));
-		issvalues.put(iss2, new DiscreteValueSet(lo, hi));
-		issvalues.put(iss3, new DiscreteValueSet(lo, hi));
-		Domain domain1 = new Domain("test", issvalues);
-
-		SumOfGroupsUtilitySpace pas = new SumOfGroupsUtilitySpace(domain1,
-				"testspace", partutils, resBid);
-
-		SumOfGroupsUtilitySpace pasgrouped12 = pas
-				.group(Arrays.asList(iss1, iss2), "iss12");
-
-		checkEqualUtilities(pas, pasgrouped12);
-
-	}
-
-	@Test
-	public void testSerialize() throws JsonProcessingException {
-		SumOfGroupsUtilitySpace paus = makeBasic();
-		ObjectMapper jackson = new ObjectMapper();
-		String string = jackson.writeValueAsString(paus);
-		System.out.println(string);
-		assertEquals(serialized, string);
-
-	}
-
-	@Test
-	public void testDeserialize() throws IOException {
-		ObjectMapper jackson = new ObjectMapper();
-		assertEquals(makeBasic(), jackson.readValue(serialized, Profile.class));
-
-	}
-
-	@Test
-	public void loadComputerBuy() throws IOException {
-		UtilitySpace space = jackson.readValue(
-				getClass().getResourceAsStream("/computerbuy.json"),
-				UtilitySpace.class);
-		assertTrue(space instanceof SumOfGroupsUtilitySpace);
-
-	}
-
-	@Test
-	public void loadComputerSell() throws IOException {
-		UtilitySpace space = jackson.readValue(
-				getClass().getResourceAsStream("/computersell.json"),
-				UtilitySpace.class);
-		assertTrue(space instanceof LinearAdditiveUtilitySpace);
-
-	}
-
-	@Test(expected = ValueInstantiationException.class)
-	public void loadComputerBuyIncomplete() throws IOException {
-		UtilitySpace space = jackson.readValue(
-				getClass().getResourceAsStream("/computerbuyincomplete.json"),
-				UtilitySpace.class);
-		assertTrue(space instanceof LinearAdditiveUtilitySpace);
-
-	}
-
-	@Test
-	public void loadComputerBuyNumbers() throws IOException {
-		UtilitySpace space = jackson.readValue(
-				getClass().getResourceAsStream("/computerbuynumbers.json"),
-				UtilitySpace.class);
-		assertTrue(space instanceof SumOfGroupsUtilitySpace);
-
-	}
-
-	@Test
-	public void testComputerBuyUtility()
-			throws JsonParseException, JsonMappingException, IOException {
-		SumOfGroupsUtilitySpace space = jackson.readValue(
-				getClass().getResourceAsStream("/computerbuy.json"),
-				SumOfGroupsUtilitySpace.class);
-		Bid bid = space.getReservationBid();
-		assertEquals(new BigDecimal("0.625"), space.getUtility(bid));
-	}
-
-	/************************ PRIVATE FUNCTIONS *******************/
-
-	private void checkEqualUtilities(UtilitySpace space1, UtilitySpace space2) {
-		for (Bid bid : new MyAllBidsList(space1.getDomain())) {
-			assertEquals(space1.getUtility(bid), space2.getUtility(bid));
-		}
-	}
-
-	private SumOfGroupsUtilitySpace makeBasic() {
-		HashMap<String, PartsUtilities> partutils = new HashMap<>();
-		partutils.put("1and2", putils12);
-		partutils.put("3", putils3);
-		return new SumOfGroupsUtilitySpace(domain, "testspace", partutils,
-				resBid);
-
-	}
-
-	private void checkUtilitiesAllEqual(UtilitySpace space1,
-			UtilitySpace space2) {
-		for (Bid bid : new MyAllBidsList(space1.getDomain())) {
-			assertTrue(space1.getUtility(bid)
-					.compareTo(space2.getUtility(bid)) == 0);
-		}
-	}
-
-}
-
-/**
- * Copy of AllBidsList. We can not depend on BidSpace because that would cause a
- * cyclic dependency.
- */
-class MyAllBidsList extends AbstractImmutableList<Bid> {
-
-	private final List<String> issues;
-	private final Outer<? extends Value> allValuePermutations;
-
-	/**
-	 * A list containing all bids in the space. This is an ImmutableList so it
-	 * can contain all bids without pre-computing them.
-	 * 
-	 */
-	public MyAllBidsList(Domain domain) {
-		if (domain == null)
-			throw new IllegalArgumentException("domain=null");
-		issues = new ArrayList<>(domain.getIssues());
-
-		List<ImmutableList<Value>> values = issues.stream()
-				.map(issue -> domain.getValues(issue))
-				.collect(Collectors.toList());
-
-		allValuePermutations = new Outer<Value>(values);
-	}
-
-	@Override
-	public Bid get(BigInteger index) {
-		ImmutableList<? extends Value> nextValues = allValuePermutations
-				.get(index);
-
-		Map<String, Value> issueValues = new HashMap<>();
-		for (int n = 0; n < issues.size(); n++) {
-			issueValues.put(issues.get(n),
-					nextValues.get(BigInteger.valueOf(n)));
-		}
-		return new Bid(issueValues);
-	}
-
-	@Override
-	public BigInteger size() {
-		return allValuePermutations.size();
-	}
-
-}
Index: /profileconnection/pom.xml
===================================================================
--- /profileconnection/pom.xml	(revision 53)
+++ /profileconnection/pom.xml	(revision 1)
@@ -6,5 +6,5 @@
 	<groupId>geniusweb</groupId>
 	<artifactId>profileconnection</artifactId>
-	<version>2.2.1</version>  <!-- equals the geniusweb version -->
+	<version>1.0.0</version>
 	<packaging>jar</packaging>
 
@@ -16,6 +16,5 @@
 		<basedir>.</basedir>
 		<passwd>${env.ARTIFACTORY_PASS}</passwd>
-		<jackson-2-version>2.12.3</jackson-2-version>
-		<geniusweb.version>${project.version}</geniusweb.version>
+		<jackson-2-version>2.9.6</jackson-2-version>
 	</properties>
 
@@ -23,5 +22,5 @@
 		<repository>
 			<id>artifactory.ewi.tudelft.nl</id>
-			<url>https://artifactory.ewi.tudelft.nl/artifactory/libs-release</url>
+			<url>http://artifactory.ewi.tudelft.nl/artifactory/libs-release</url>
 		</repository>
 	</distributionManagement>
@@ -32,5 +31,5 @@
 			<groupId>geniusweb</groupId>
 			<artifactId>profile</artifactId>
-			<version>${geniusweb.version}</version>
+			<version>1.0.0</version>
 		</dependency>
 
@@ -38,5 +37,5 @@
 			<groupId>tudelft.utilities</groupId>
 			<artifactId>logging</artifactId>
-			<version>1.0.1</version>
+			<version>1.0.0</version>
 		</dependency>
 
@@ -94,5 +93,5 @@
 			<groupId>tudelft.utilities</groupId>
 			<artifactId>junit</artifactId>
-			<version>1.0.5</version>
+			<version>1.0.2</version>
 			<scope>test</scope>
 		</dependency>
@@ -105,6 +104,6 @@
 		<dependency>
 			<groupId>org.mockito</groupId>
-			<artifactId>mockito-core</artifactId>
-			<version>3.11.2</version>
+			<artifactId>mockito-all</artifactId>
+			<version>1.9.5</version>
 			<scope>test</scope>
 		</dependency>
@@ -117,21 +116,19 @@
 		<repository>
 			<id>artifactory.ewi.tudelft.nl</id>
-			<url>https://artifactory.ewi.tudelft.nl/artifactory/libs-release</url>
+			<url>http://artifactory.ewi.tudelft.nl/artifactory/libs-release</url>
 			<snapshots>
 				<enabled>false</enabled>
 			</snapshots>
 		</repository>
+
 	</repositories>
 
 	<pluginRepositories>
 		<pluginRepository>
-			<id>central</id>
-			<url>https://repo1.maven.org/maven2</url>
-		</pluginRepository>
-		<pluginRepository>
-			<id>artifactory.ewi.tudelft.nl</id>
-			<url>https://artifactory.ewi.tudelft.nl/artifactory/libs-release</url>
+			<id>jcenter</id>
+			<url>http://jcenter.bintray.com</url>
 		</pluginRepository>
 	</pluginRepositories>
+
 
 	<build>
@@ -147,22 +144,9 @@
 				</configuration>
 			</plugin>
-			<plugin>
-				<groupId>org.apache.maven.plugins</groupId>
-				<artifactId>maven-source-plugin</artifactId>
-				<version>3.1.0</version>
-				<executions>
-					<execution>
-						<id>attach-sources</id>
-						<goals>
-							<goal>jar</goal>
-						</goals>
-					</execution>
-				</executions>
-			</plugin>
 
 			<plugin>
 				<groupId>org.apache.maven.plugins</groupId>
 				<artifactId>maven-javadoc-plugin</artifactId>
-				<version>3.2.0</version>
+				<version>2.10.1</version>
 				<executions>
 					<execution>
@@ -171,4 +155,8 @@
 							<goal>jar</goal>
 						</goals>
+						<configuration>
+							<additionalparam>${javadoc.opts}</additionalparam>
+							<additionalparam>-Xdoclint:none</additionalparam>
+						</configuration>
 					</execution>
 				</executions>
@@ -178,5 +166,5 @@
 				<groupId>org.jfrog.buildinfo</groupId>
 				<artifactId>artifactory-maven-plugin</artifactId>
-				<version>3.2.3</version>
+				<version>2.6.1</version>
 				<executions>
 					<execution>
Index: /profileconnection/src/main/java/geniusweb/profileconnection/FileProfileConnector.java
===================================================================
--- /profileconnection/src/main/java/geniusweb/profileconnection/FileProfileConnector.java	(revision 53)
+++ /profileconnection/src/main/java/geniusweb/profileconnection/FileProfileConnector.java	(revision 1)
@@ -10,13 +10,12 @@
 
 import geniusweb.profile.Profile;
-import tudelft.utilities.listener.DefaultListenable;
+import geniusweb.profile.utilityspace.LinearAdditiveUtilitySpace;
 
 /**
  * ProfileInterface based on a plain filesystem UTF8 file.
  */
-public class FileProfileConnector extends DefaultListenable<Profile>
-		implements ProfileInterface {
+public class FileProfileConnector implements ProfileInterface {
 	private final static ObjectMapper jackson = new ObjectMapper();
-	private final Profile profile;
+	private final LinearAdditiveUtilitySpace profile;
 
 	/**
@@ -29,15 +28,12 @@
 		String serialized = new String(Files.readAllBytes(path),
 				StandardCharsets.UTF_8);
-		profile = jackson.readValue(serialized, Profile.class);
+		profile = (LinearAdditiveUtilitySpace) jackson.readValue(serialized,
+				Profile.class);
 	}
 
 	@Override
-	public Profile getProfile() {
+	public LinearAdditiveUtilitySpace getProfile() {
 		return profile;
 	}
 
-	@Override
-	public void close() {
-	}
-
 }
Index: /profileconnection/src/main/java/geniusweb/profileconnection/ProfileConnectionFactory.java
===================================================================
--- /profileconnection/src/main/java/geniusweb/profileconnection/ProfileConnectionFactory.java	(revision 53)
+++ /profileconnection/src/main/java/geniusweb/profileconnection/ProfileConnectionFactory.java	(revision 1)
@@ -17,10 +17,7 @@
 
 	/**
-	 * @param uri      the URI that can provide the {@link Profile}. Support
-	 *                 both the ws and the file scheme for the uri.
+	 * @uri the URI that can provide the {@link Profile}. Support both the ws
+	 *      and the file scheme for the uri.
 	 * @param reporter the {@link Reporter} to log issues to
-	 * @return a {@link ProfileInterface}
-	 * @throws IOException         if connection can't be made
-	 * @throws DeploymentException if endpoint can't be published
 	 */
 	public static ProfileInterface create(URI uri, Reporter reporter)
Index: /profileconnection/src/main/java/geniusweb/profileconnection/ProfileInterface.java
===================================================================
--- /profileconnection/src/main/java/geniusweb/profileconnection/ProfileInterface.java	(revision 53)
+++ /profileconnection/src/main/java/geniusweb/profileconnection/ProfileInterface.java	(revision 1)
@@ -1,28 +1,17 @@
 package geniusweb.profileconnection;
 
-import java.io.IOException;
-
 import geniusweb.profile.Profile;
-import tudelft.utilities.listener.Listenable;
 
 /**
  * A container holding a modifyable profile. This interface allows testing.
  */
-public interface ProfileInterface extends Listenable<Profile> {
+public interface ProfileInterface {
 
 	/**
 	 * @return the latest version of the profile. May change at any time, after
 	 *         someone updates the version on the server. Call to this may block
-	 *         for limited time if the profile is not yet available.
-	 * @throws IOException if profile can not be fetched
+	 *         for limited time if the profile is not yet available. May return
+	 *         null if the profile is not available.
 	 */
-	public Profile getProfile() throws IOException;
-
-	/**
-	 * This must be called when the user is finished using the interface. The
-	 * interface can not be used after calling this. This function allows
-	 * implementors to release the streams and listeners. Not calling this after
-	 * use may cause resource leaks.
-	 */
-	public void close();
+	public Profile getProfile();
 }
Index: /profileconnection/src/main/java/geniusweb/profileconnection/WebsocketProfileConnector.java
===================================================================
--- /profileconnection/src/main/java/geniusweb/profileconnection/WebsocketProfileConnector.java	(revision 53)
+++ /profileconnection/src/main/java/geniusweb/profileconnection/WebsocketProfileConnector.java	(revision 1)
@@ -7,8 +7,6 @@
 import javax.websocket.ClientEndpoint;
 import javax.websocket.DeploymentException;
-import javax.websocket.OnClose;
 import javax.websocket.OnError;
 import javax.websocket.OnMessage;
-import javax.websocket.OnOpen;
 import javax.websocket.Session;
 import javax.websocket.WebSocketContainer;
@@ -17,5 +15,4 @@
 
 import geniusweb.profile.Profile;
-import tudelft.utilities.listener.DefaultListenable;
 import tudelft.utilities.logging.Reporter;
 
@@ -24,14 +21,9 @@
  */
 @ClientEndpoint
-public class WebsocketProfileConnector extends DefaultListenable<Profile>
-		implements ProfileInterface {
+public class WebsocketProfileConnector implements ProfileInterface {
 	private final static ObjectMapper jackson = new ObjectMapper();
 	private static final int TIMEOUT_MS = 2000;
 	private final Reporter logger;
-	private final URI uri; // to log possible errors
 	private Profile profile = null;
-	private Session session;
-
-	private StringBuffer buffer = new StringBuffer();
 
 	/**
@@ -42,10 +34,6 @@
 	 *                    websockets. Typically ContainerProvider
 	 *                    .getWebSocketContainer()
-	 * @throws DeploymentException if the annotated endpoint instance is not
-	 *                             valid
-	 * @throws IOException         if there was a network or protocol problem
-	 *                             that prevented the client endpoint being
-	 *                             connected to its server.
-	 * 
+	 * @throws DeploymentException
+	 * @throws IOException
 	 */
 	public WebsocketProfileConnector(URI uri, Reporter reporter,
@@ -56,39 +44,17 @@
 					"uri, reporter and wsconnector must be not null");
 		}
-		this.uri = uri;
 		this.logger = reporter;
-		// see #1763 expected max size of profiles. #50 why we don't want that.
-		// wscontainer.setDefaultMaxTextMessageBufferSize(200000);
 		wscontainer.connectToServer(this, uri);
 	}
 
-	@OnOpen
 	public void onOpen(Session session) {
-		this.session = session;
 		logger.log(Level.FINE, "Connected: " + session.getBasicRemote());
 	}
 
-	@OnClose
-	public void onClose() {
-		if (session != null) {
-			logger.log(Level.FINE,
-					"Closed websocket: " + session.getBasicRemote());
-			this.session = null;
-			// remove listeners seems not needed
-		}
-	}
-
 	@OnMessage
-	public void processMessage(String message, boolean islast)
-			throws IOException {
-		buffer.append(message);
-		if (islast) {
-			String msg = buffer.toString();
-			buffer = new StringBuffer();
-			// this will be called every time the profile changes.
-			logger.log(Level.FINE, "Received profile: " + msg);
-			profile = jackson.readValue(msg, Profile.class);
-			notifyListeners(profile);
-		}
+	public void processMessage(String message) throws IOException {
+		// this will be called every time the profile changes.
+		logger.log(Level.FINE, "Received profile: " + message);
+		this.profile = jackson.readValue(message, Profile.class);
 	}
 
@@ -100,5 +66,5 @@
 
 	@Override
-	public Profile getProfile() throws IOException {
+	public Profile getProfile() {
 		int remaining_wait = TIMEOUT_MS;
 		try {
@@ -111,22 +77,6 @@
 					e);
 		}
-		if (profile == null) {
-			throw new IOException("Failed to fetch profile from " + uri);
-		}
 		return profile;
 	}
 
-	@Override
-	public void close() {
-		if (session != null) {
-			try {
-				session.close();
-			} catch (IOException e) {
-				logger.log(Level.WARNING,
-						"Falled to close websocket connection: "
-								+ session.getBasicRemote());
-			}
-		}
-	}
-
 }
Index: /profileconnection/src/test/java/geniusweb/profileconnection/WebsocketProfileConnectorTest.java
===================================================================
--- /profileconnection/src/test/java/geniusweb/profileconnection/WebsocketProfileConnectorTest.java	(revision 53)
+++ /profileconnection/src/test/java/geniusweb/profileconnection/WebsocketProfileConnectorTest.java	(revision 1)
@@ -3,5 +3,6 @@
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
-import static org.mockito.ArgumentMatchers.any;
+import static org.junit.Assert.assertNull;
+import static org.mockito.Matchers.any;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
@@ -21,4 +22,5 @@
 
 import geniusweb.profile.Profile;
+import geniusweb.profileconnection.WebsocketProfileConnector;
 import tudelft.utilities.logging.Reporter;
 
@@ -28,5 +30,5 @@
 	private final WebSocketContainer wscontainer = mock(
 			WebSocketContainer.class);
-	private final static String testfilepath = "src/test/resources/jobs1_20.json";
+	private final static String testfilepath = "src/test/resources/testprofile.json";
 
 	@Test(expected = IOException.class)
@@ -40,9 +42,10 @@
 
 	@Test
-	public void onOpenSmokeTest()
+	public void testOnOpen()
 			throws IOException, DeploymentException, URISyntaxException {
 		WebsocketProfileConnector connector = new WebsocketProfileConnector(
 				new URI("ws://someprofile"), reporter, wscontainer);
 		connector.onOpen(session);
+		assertNull(connector.getProfile());
 	}
 
@@ -53,10 +56,10 @@
 				new URI("ws://someprofile"), reporter, wscontainer);
 		connector.onOpen(session);
-		connector.processMessage(readTestProfile(), true);
+		connector.processMessage(readTestProfile());
 
 		Profile profile = connector.getProfile();
 		assertNotNull(profile);
-		assertEquals("jobs1_20", connector.getProfile().getName());
-		assertEquals("jobs", connector.getProfile().getDomain().getName());
+		assertEquals("testprofile", connector.getProfile().getName());
+		assertEquals("test", connector.getProfile().getDomain().getName());
 	}
 
@@ -78,5 +81,5 @@
 				try {
 					Thread.sleep(1500);
-					connector.processMessage(readTestProfile(), true);
+					connector.processMessage(readTestProfile());
 				} catch (InterruptedException | IOException e) {
 					e.printStackTrace();
@@ -86,9 +89,9 @@
 		Profile profile = connector.getProfile();
 		assertNotNull(profile);
-		assertEquals("jobs1_20", connector.getProfile().getName());
-		assertEquals("jobs", connector.getProfile().getDomain().getName());
+		assertEquals("testprofile", connector.getProfile().getName());
+		assertEquals("test", connector.getProfile().getDomain().getName());
 	}
 
-	@Test(expected = IOException.class)
+	@Test
 	public void testGetProfileTimeout()
 			throws DeploymentException, IOException, URISyntaxException {
@@ -107,5 +110,5 @@
 				try {
 					Thread.sleep(6000);
-					connector.processMessage(readTestProfile(), true);
+					connector.processMessage(readTestProfile());
 				} catch (InterruptedException | IOException e) {
 					e.printStackTrace();
@@ -113,5 +116,6 @@
 			}
 		}).start();
-		connector.getProfile();
+		Profile profile = connector.getProfile();
+		assertNull(profile);
 	}
 
Index: ofileconnection/src/test/resources/jobs1_20.json
===================================================================
--- /profileconnection/src/test/resources/jobs1_20.json	(revision 53)
+++ 	(revision )
@@ -1,1761 +1,0 @@
-{
-  "DefaultPartialOrdering" : {
-    "name" : "jobs1_20",
-    "domain" : {
-      "name" : "jobs",
-      "issuesValues" : {
-        "lease car" : {
-          "values" : [ "yes", "no" ]
-        },
-        "permanent contract" : {
-          "values" : [ "yes", "no" ]
-        },
-        "career development opportunities" : {
-          "values" : [ "low", "medium", "high" ]
-        },
-        "fte" : {
-          "values" : [ "0.6", "0.8", "1.0" ]
-        },
-        "salary" : {
-          "values" : [ "2000", "2500", "3000", "3500", "4000" ]
-        },
-        "work from home" : {
-          "values" : [ "0", "1", "2" ]
-        }
-      }
-    },
-    "better" : {
-      "{\"issuevalues\":{\"lease car\":\"no\",\"permanent contract\":\"yes\",\"career development opportunities\":\"high\",\"fte\":\"1.0\",\"salary\":\"2000\",\"work from home\":\"2\"}}" : [ {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "no",
-          "career development opportunities" : "low",
-          "fte" : "0.6",
-          "salary" : "2000",
-          "work from home" : "0"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "yes",
-          "permanent contract" : "no",
-          "career development opportunities" : "low",
-          "fte" : "0.6",
-          "salary" : "3500",
-          "work from home" : "0"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "no",
-          "career development opportunities" : "high",
-          "fte" : "0.6",
-          "salary" : "3500",
-          "work from home" : "1"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "no",
-          "career development opportunities" : "low",
-          "fte" : "1.0",
-          "salary" : "2000",
-          "work from home" : "1"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "no",
-          "career development opportunities" : "high",
-          "fte" : "1.0",
-          "salary" : "3000",
-          "work from home" : "0"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "yes",
-          "permanent contract" : "yes",
-          "career development opportunities" : "medium",
-          "fte" : "0.8",
-          "salary" : "2500",
-          "work from home" : "1"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "no",
-          "career development opportunities" : "low",
-          "fte" : "0.6",
-          "salary" : "2000",
-          "work from home" : "1"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "yes",
-          "permanent contract" : "no",
-          "career development opportunities" : "high",
-          "fte" : "1.0",
-          "salary" : "3000",
-          "work from home" : "1"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "yes",
-          "permanent contract" : "no",
-          "career development opportunities" : "high",
-          "fte" : "0.8",
-          "salary" : "3500",
-          "work from home" : "1"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "no",
-          "career development opportunities" : "medium",
-          "fte" : "0.8",
-          "salary" : "2000",
-          "work from home" : "1"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "yes",
-          "permanent contract" : "yes",
-          "career development opportunities" : "high",
-          "fte" : "0.6",
-          "salary" : "2000",
-          "work from home" : "1"
-        }
-      } ],
-      "{\"issuevalues\":{\"lease car\":\"yes\",\"permanent contract\":\"no\",\"career development opportunities\":\"low\",\"fte\":\"0.6\",\"salary\":\"3500\",\"work from home\":\"0\"}}" : [ {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "no",
-          "career development opportunities" : "low",
-          "fte" : "0.6",
-          "salary" : "2000",
-          "work from home" : "0"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "no",
-          "career development opportunities" : "low",
-          "fte" : "1.0",
-          "salary" : "2000",
-          "work from home" : "1"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "no",
-          "career development opportunities" : "low",
-          "fte" : "0.6",
-          "salary" : "2000",
-          "work from home" : "1"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "no",
-          "career development opportunities" : "medium",
-          "fte" : "0.8",
-          "salary" : "2000",
-          "work from home" : "1"
-        }
-      } ],
-      "{\"issuevalues\":{\"lease car\":\"no\",\"permanent contract\":\"no\",\"career development opportunities\":\"low\",\"fte\":\"1.0\",\"salary\":\"2000\",\"work from home\":\"1\"}}" : [ {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "no",
-          "career development opportunities" : "low",
-          "fte" : "0.6",
-          "salary" : "2000",
-          "work from home" : "0"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "no",
-          "career development opportunities" : "low",
-          "fte" : "0.6",
-          "salary" : "2000",
-          "work from home" : "1"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "no",
-          "career development opportunities" : "medium",
-          "fte" : "0.8",
-          "salary" : "2000",
-          "work from home" : "1"
-        }
-      } ],
-      "{\"issuevalues\":{\"lease car\":\"yes\",\"permanent contract\":\"no\",\"career development opportunities\":\"medium\",\"fte\":\"1.0\",\"salary\":\"3500\",\"work from home\":\"1\"}}" : [ {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "yes",
-          "career development opportunities" : "high",
-          "fte" : "1.0",
-          "salary" : "2000",
-          "work from home" : "2"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "yes",
-          "permanent contract" : "no",
-          "career development opportunities" : "low",
-          "fte" : "0.6",
-          "salary" : "3500",
-          "work from home" : "0"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "no",
-          "career development opportunities" : "low",
-          "fte" : "1.0",
-          "salary" : "2000",
-          "work from home" : "1"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "no",
-          "career development opportunities" : "high",
-          "fte" : "1.0",
-          "salary" : "3000",
-          "work from home" : "0"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "no",
-          "career development opportunities" : "low",
-          "fte" : "0.6",
-          "salary" : "2000",
-          "work from home" : "1"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "yes",
-          "permanent contract" : "no",
-          "career development opportunities" : "high",
-          "fte" : "1.0",
-          "salary" : "3000",
-          "work from home" : "1"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "yes",
-          "permanent contract" : "no",
-          "career development opportunities" : "high",
-          "fte" : "0.8",
-          "salary" : "3500",
-          "work from home" : "1"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "no",
-          "career development opportunities" : "medium",
-          "fte" : "0.8",
-          "salary" : "2000",
-          "work from home" : "1"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "yes",
-          "permanent contract" : "yes",
-          "career development opportunities" : "high",
-          "fte" : "0.6",
-          "salary" : "2000",
-          "work from home" : "1"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "no",
-          "career development opportunities" : "low",
-          "fte" : "0.6",
-          "salary" : "2000",
-          "work from home" : "0"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "yes",
-          "permanent contract" : "no",
-          "career development opportunities" : "low",
-          "fte" : "0.8",
-          "salary" : "4000",
-          "work from home" : "2"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "no",
-          "career development opportunities" : "high",
-          "fte" : "0.6",
-          "salary" : "3500",
-          "work from home" : "1"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "yes",
-          "permanent contract" : "yes",
-          "career development opportunities" : "medium",
-          "fte" : "0.8",
-          "salary" : "2500",
-          "work from home" : "1"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "yes",
-          "permanent contract" : "yes",
-          "career development opportunities" : "medium",
-          "fte" : "0.8",
-          "salary" : "2500",
-          "work from home" : "2"
-        }
-      } ],
-      "{\"issuevalues\":{\"lease car\":\"no\",\"permanent contract\":\"no\",\"career development opportunities\":\"high\",\"fte\":\"1.0\",\"salary\":\"3000\",\"work from home\":\"0\"}}" : [ {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "no",
-          "career development opportunities" : "low",
-          "fte" : "0.6",
-          "salary" : "2000",
-          "work from home" : "0"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "yes",
-          "permanent contract" : "no",
-          "career development opportunities" : "low",
-          "fte" : "0.6",
-          "salary" : "3500",
-          "work from home" : "0"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "no",
-          "career development opportunities" : "high",
-          "fte" : "0.6",
-          "salary" : "3500",
-          "work from home" : "1"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "no",
-          "career development opportunities" : "low",
-          "fte" : "1.0",
-          "salary" : "2000",
-          "work from home" : "1"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "no",
-          "career development opportunities" : "low",
-          "fte" : "0.6",
-          "salary" : "2000",
-          "work from home" : "1"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "no",
-          "career development opportunities" : "medium",
-          "fte" : "0.8",
-          "salary" : "2000",
-          "work from home" : "1"
-        }
-      } ],
-      "{\"issuevalues\":{\"lease car\":\"yes\",\"permanent contract\":\"yes\",\"career development opportunities\":\"medium\",\"fte\":\"1.0\",\"salary\":\"2500\",\"work from home\":\"2\"}}" : [ {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "yes",
-          "career development opportunities" : "high",
-          "fte" : "1.0",
-          "salary" : "2000",
-          "work from home" : "2"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "yes",
-          "permanent contract" : "no",
-          "career development opportunities" : "low",
-          "fte" : "0.6",
-          "salary" : "3500",
-          "work from home" : "0"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "no",
-          "career development opportunities" : "low",
-          "fte" : "1.0",
-          "salary" : "2000",
-          "work from home" : "1"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "yes",
-          "permanent contract" : "no",
-          "career development opportunities" : "medium",
-          "fte" : "1.0",
-          "salary" : "3500",
-          "work from home" : "1"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "no",
-          "career development opportunities" : "high",
-          "fte" : "1.0",
-          "salary" : "3000",
-          "work from home" : "0"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "no",
-          "career development opportunities" : "low",
-          "fte" : "0.6",
-          "salary" : "2000",
-          "work from home" : "1"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "yes",
-          "permanent contract" : "no",
-          "career development opportunities" : "high",
-          "fte" : "1.0",
-          "salary" : "3000",
-          "work from home" : "1"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "yes",
-          "permanent contract" : "no",
-          "career development opportunities" : "high",
-          "fte" : "0.8",
-          "salary" : "3500",
-          "work from home" : "1"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "no",
-          "career development opportunities" : "medium",
-          "fte" : "0.8",
-          "salary" : "2000",
-          "work from home" : "1"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "yes",
-          "permanent contract" : "yes",
-          "career development opportunities" : "high",
-          "fte" : "0.6",
-          "salary" : "2000",
-          "work from home" : "1"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "no",
-          "career development opportunities" : "low",
-          "fte" : "0.6",
-          "salary" : "2000",
-          "work from home" : "0"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "yes",
-          "permanent contract" : "no",
-          "career development opportunities" : "low",
-          "fte" : "0.8",
-          "salary" : "4000",
-          "work from home" : "2"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "no",
-          "career development opportunities" : "high",
-          "fte" : "0.6",
-          "salary" : "3500",
-          "work from home" : "1"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "yes",
-          "permanent contract" : "yes",
-          "career development opportunities" : "medium",
-          "fte" : "0.8",
-          "salary" : "2500",
-          "work from home" : "1"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "yes",
-          "permanent contract" : "yes",
-          "career development opportunities" : "medium",
-          "fte" : "0.8",
-          "salary" : "2500",
-          "work from home" : "2"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "yes",
-          "career development opportunities" : "low",
-          "fte" : "1.0",
-          "salary" : "3500",
-          "work from home" : "0"
-        }
-      } ],
-      "{\"issuevalues\":{\"lease car\":\"no\",\"permanent contract\":\"no\",\"career development opportunities\":\"low\",\"fte\":\"0.6\",\"salary\":\"2000\",\"work from home\":\"1\"}}" : [ {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "no",
-          "career development opportunities" : "low",
-          "fte" : "0.6",
-          "salary" : "2000",
-          "work from home" : "0"
-        }
-      } ],
-      "{\"issuevalues\":{\"lease car\":\"yes\",\"permanent contract\":\"no\",\"career development opportunities\":\"high\",\"fte\":\"1.0\",\"salary\":\"3000\",\"work from home\":\"1\"}}" : [ {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "no",
-          "career development opportunities" : "low",
-          "fte" : "0.6",
-          "salary" : "2000",
-          "work from home" : "0"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "yes",
-          "permanent contract" : "no",
-          "career development opportunities" : "low",
-          "fte" : "0.6",
-          "salary" : "3500",
-          "work from home" : "0"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "no",
-          "career development opportunities" : "high",
-          "fte" : "0.6",
-          "salary" : "3500",
-          "work from home" : "1"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "no",
-          "career development opportunities" : "low",
-          "fte" : "1.0",
-          "salary" : "2000",
-          "work from home" : "1"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "no",
-          "career development opportunities" : "high",
-          "fte" : "1.0",
-          "salary" : "3000",
-          "work from home" : "0"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "no",
-          "career development opportunities" : "low",
-          "fte" : "0.6",
-          "salary" : "2000",
-          "work from home" : "1"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "no",
-          "career development opportunities" : "medium",
-          "fte" : "0.8",
-          "salary" : "2000",
-          "work from home" : "1"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "yes",
-          "permanent contract" : "yes",
-          "career development opportunities" : "high",
-          "fte" : "0.6",
-          "salary" : "2000",
-          "work from home" : "1"
-        }
-      } ],
-      "{\"issuevalues\":{\"lease car\":\"yes\",\"permanent contract\":\"no\",\"career development opportunities\":\"high\",\"fte\":\"0.8\",\"salary\":\"3500\",\"work from home\":\"1\"}}" : [ {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "no",
-          "career development opportunities" : "low",
-          "fte" : "0.6",
-          "salary" : "2000",
-          "work from home" : "0"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "yes",
-          "permanent contract" : "no",
-          "career development opportunities" : "low",
-          "fte" : "0.6",
-          "salary" : "3500",
-          "work from home" : "0"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "no",
-          "career development opportunities" : "high",
-          "fte" : "0.6",
-          "salary" : "3500",
-          "work from home" : "1"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "no",
-          "career development opportunities" : "low",
-          "fte" : "1.0",
-          "salary" : "2000",
-          "work from home" : "1"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "no",
-          "career development opportunities" : "high",
-          "fte" : "1.0",
-          "salary" : "3000",
-          "work from home" : "0"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "no",
-          "career development opportunities" : "low",
-          "fte" : "0.6",
-          "salary" : "2000",
-          "work from home" : "1"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "yes",
-          "permanent contract" : "no",
-          "career development opportunities" : "high",
-          "fte" : "1.0",
-          "salary" : "3000",
-          "work from home" : "1"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "no",
-          "career development opportunities" : "medium",
-          "fte" : "0.8",
-          "salary" : "2000",
-          "work from home" : "1"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "yes",
-          "permanent contract" : "yes",
-          "career development opportunities" : "high",
-          "fte" : "0.6",
-          "salary" : "2000",
-          "work from home" : "1"
-        }
-      } ],
-      "{\"issuevalues\":{\"lease car\":\"no\",\"permanent contract\":\"no\",\"career development opportunities\":\"medium\",\"fte\":\"0.8\",\"salary\":\"2000\",\"work from home\":\"1\"}}" : [ {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "no",
-          "career development opportunities" : "low",
-          "fte" : "0.6",
-          "salary" : "2000",
-          "work from home" : "0"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "no",
-          "career development opportunities" : "low",
-          "fte" : "0.6",
-          "salary" : "2000",
-          "work from home" : "1"
-        }
-      } ],
-      "{\"issuevalues\":{\"lease car\":\"yes\",\"permanent contract\":\"yes\",\"career development opportunities\":\"high\",\"fte\":\"0.6\",\"salary\":\"2000\",\"work from home\":\"1\"}}" : [ {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "no",
-          "career development opportunities" : "low",
-          "fte" : "0.6",
-          "salary" : "2000",
-          "work from home" : "0"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "yes",
-          "permanent contract" : "no",
-          "career development opportunities" : "low",
-          "fte" : "0.6",
-          "salary" : "3500",
-          "work from home" : "0"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "no",
-          "career development opportunities" : "high",
-          "fte" : "0.6",
-          "salary" : "3500",
-          "work from home" : "1"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "no",
-          "career development opportunities" : "low",
-          "fte" : "1.0",
-          "salary" : "2000",
-          "work from home" : "1"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "no",
-          "career development opportunities" : "high",
-          "fte" : "1.0",
-          "salary" : "3000",
-          "work from home" : "0"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "no",
-          "career development opportunities" : "low",
-          "fte" : "0.6",
-          "salary" : "2000",
-          "work from home" : "1"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "no",
-          "career development opportunities" : "medium",
-          "fte" : "0.8",
-          "salary" : "2000",
-          "work from home" : "1"
-        }
-      } ],
-      "{\"issuevalues\":{\"lease car\":\"no\",\"permanent contract\":\"no\",\"career development opportunities\":\"low\",\"fte\":\"0.6\",\"salary\":\"2000\",\"work from home\":\"0\"}}" : [ ],
-      "{\"issuevalues\":{\"lease car\":\"yes\",\"permanent contract\":\"yes\",\"career development opportunities\":\"low\",\"fte\":\"0.8\",\"salary\":\"4000\",\"work from home\":\"2\"}}" : [ {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "yes",
-          "career development opportunities" : "high",
-          "fte" : "1.0",
-          "salary" : "2000",
-          "work from home" : "2"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "yes",
-          "permanent contract" : "no",
-          "career development opportunities" : "low",
-          "fte" : "0.6",
-          "salary" : "3500",
-          "work from home" : "0"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "no",
-          "career development opportunities" : "low",
-          "fte" : "1.0",
-          "salary" : "2000",
-          "work from home" : "1"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "yes",
-          "permanent contract" : "no",
-          "career development opportunities" : "medium",
-          "fte" : "1.0",
-          "salary" : "3500",
-          "work from home" : "1"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "no",
-          "career development opportunities" : "high",
-          "fte" : "1.0",
-          "salary" : "3000",
-          "work from home" : "0"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "yes",
-          "permanent contract" : "yes",
-          "career development opportunities" : "medium",
-          "fte" : "1.0",
-          "salary" : "2500",
-          "work from home" : "2"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "no",
-          "career development opportunities" : "low",
-          "fte" : "0.6",
-          "salary" : "2000",
-          "work from home" : "1"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "yes",
-          "permanent contract" : "no",
-          "career development opportunities" : "high",
-          "fte" : "1.0",
-          "salary" : "3000",
-          "work from home" : "1"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "yes",
-          "permanent contract" : "no",
-          "career development opportunities" : "high",
-          "fte" : "0.8",
-          "salary" : "3500",
-          "work from home" : "1"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "no",
-          "career development opportunities" : "medium",
-          "fte" : "0.8",
-          "salary" : "2000",
-          "work from home" : "1"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "yes",
-          "permanent contract" : "yes",
-          "career development opportunities" : "high",
-          "fte" : "0.6",
-          "salary" : "2000",
-          "work from home" : "1"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "no",
-          "career development opportunities" : "low",
-          "fte" : "0.6",
-          "salary" : "2000",
-          "work from home" : "0"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "yes",
-          "permanent contract" : "no",
-          "career development opportunities" : "low",
-          "fte" : "0.8",
-          "salary" : "4000",
-          "work from home" : "2"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "no",
-          "career development opportunities" : "high",
-          "fte" : "0.6",
-          "salary" : "3500",
-          "work from home" : "1"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "yes",
-          "permanent contract" : "no",
-          "career development opportunities" : "high",
-          "fte" : "1.0",
-          "salary" : "4000",
-          "work from home" : "2"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "yes",
-          "permanent contract" : "yes",
-          "career development opportunities" : "medium",
-          "fte" : "0.8",
-          "salary" : "2500",
-          "work from home" : "1"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "yes",
-          "permanent contract" : "yes",
-          "career development opportunities" : "medium",
-          "fte" : "0.8",
-          "salary" : "2500",
-          "work from home" : "2"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "yes",
-          "career development opportunities" : "low",
-          "fte" : "1.0",
-          "salary" : "3500",
-          "work from home" : "0"
-        }
-      } ],
-      "{\"issuevalues\":{\"lease car\":\"yes\",\"permanent contract\":\"no\",\"career development opportunities\":\"low\",\"fte\":\"0.8\",\"salary\":\"4000\",\"work from home\":\"2\"}}" : [ {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "yes",
-          "career development opportunities" : "high",
-          "fte" : "1.0",
-          "salary" : "2000",
-          "work from home" : "2"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "no",
-          "career development opportunities" : "low",
-          "fte" : "0.6",
-          "salary" : "2000",
-          "work from home" : "0"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "yes",
-          "permanent contract" : "no",
-          "career development opportunities" : "low",
-          "fte" : "0.6",
-          "salary" : "3500",
-          "work from home" : "0"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "no",
-          "career development opportunities" : "high",
-          "fte" : "0.6",
-          "salary" : "3500",
-          "work from home" : "1"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "no",
-          "career development opportunities" : "low",
-          "fte" : "1.0",
-          "salary" : "2000",
-          "work from home" : "1"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "no",
-          "career development opportunities" : "high",
-          "fte" : "1.0",
-          "salary" : "3000",
-          "work from home" : "0"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "yes",
-          "permanent contract" : "yes",
-          "career development opportunities" : "medium",
-          "fte" : "0.8",
-          "salary" : "2500",
-          "work from home" : "1"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "no",
-          "career development opportunities" : "low",
-          "fte" : "0.6",
-          "salary" : "2000",
-          "work from home" : "1"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "yes",
-          "permanent contract" : "no",
-          "career development opportunities" : "high",
-          "fte" : "1.0",
-          "salary" : "3000",
-          "work from home" : "1"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "yes",
-          "permanent contract" : "no",
-          "career development opportunities" : "high",
-          "fte" : "0.8",
-          "salary" : "3500",
-          "work from home" : "1"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "no",
-          "career development opportunities" : "medium",
-          "fte" : "0.8",
-          "salary" : "2000",
-          "work from home" : "1"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "yes",
-          "permanent contract" : "yes",
-          "career development opportunities" : "high",
-          "fte" : "0.6",
-          "salary" : "2000",
-          "work from home" : "1"
-        }
-      } ],
-      "{\"issuevalues\":{\"lease car\":\"no\",\"permanent contract\":\"no\",\"career development opportunities\":\"high\",\"fte\":\"0.6\",\"salary\":\"3500\",\"work from home\":\"1\"}}" : [ {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "no",
-          "career development opportunities" : "low",
-          "fte" : "0.6",
-          "salary" : "2000",
-          "work from home" : "0"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "yes",
-          "permanent contract" : "no",
-          "career development opportunities" : "low",
-          "fte" : "0.6",
-          "salary" : "3500",
-          "work from home" : "0"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "no",
-          "career development opportunities" : "low",
-          "fte" : "1.0",
-          "salary" : "2000",
-          "work from home" : "1"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "no",
-          "career development opportunities" : "low",
-          "fte" : "0.6",
-          "salary" : "2000",
-          "work from home" : "1"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "no",
-          "career development opportunities" : "medium",
-          "fte" : "0.8",
-          "salary" : "2000",
-          "work from home" : "1"
-        }
-      } ],
-      "{\"issuevalues\":{\"lease car\":\"yes\",\"permanent contract\":\"yes\",\"career development opportunities\":\"high\",\"fte\":\"1.0\",\"salary\":\"4000\",\"work from home\":\"2\"}}" : [ {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "yes",
-          "career development opportunities" : "high",
-          "fte" : "1.0",
-          "salary" : "2000",
-          "work from home" : "2"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "yes",
-          "permanent contract" : "no",
-          "career development opportunities" : "low",
-          "fte" : "0.6",
-          "salary" : "3500",
-          "work from home" : "0"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "no",
-          "career development opportunities" : "low",
-          "fte" : "1.0",
-          "salary" : "2000",
-          "work from home" : "1"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "yes",
-          "permanent contract" : "no",
-          "career development opportunities" : "medium",
-          "fte" : "1.0",
-          "salary" : "3500",
-          "work from home" : "1"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "no",
-          "career development opportunities" : "high",
-          "fte" : "1.0",
-          "salary" : "3000",
-          "work from home" : "0"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "yes",
-          "permanent contract" : "yes",
-          "career development opportunities" : "medium",
-          "fte" : "1.0",
-          "salary" : "2500",
-          "work from home" : "2"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "no",
-          "career development opportunities" : "low",
-          "fte" : "0.6",
-          "salary" : "2000",
-          "work from home" : "1"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "yes",
-          "permanent contract" : "no",
-          "career development opportunities" : "high",
-          "fte" : "1.0",
-          "salary" : "3000",
-          "work from home" : "1"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "yes",
-          "permanent contract" : "no",
-          "career development opportunities" : "high",
-          "fte" : "0.8",
-          "salary" : "3500",
-          "work from home" : "1"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "no",
-          "career development opportunities" : "medium",
-          "fte" : "0.8",
-          "salary" : "2000",
-          "work from home" : "1"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "yes",
-          "permanent contract" : "yes",
-          "career development opportunities" : "high",
-          "fte" : "0.6",
-          "salary" : "2000",
-          "work from home" : "1"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "no",
-          "career development opportunities" : "low",
-          "fte" : "0.6",
-          "salary" : "2000",
-          "work from home" : "0"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "yes",
-          "permanent contract" : "yes",
-          "career development opportunities" : "low",
-          "fte" : "0.8",
-          "salary" : "4000",
-          "work from home" : "2"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "yes",
-          "permanent contract" : "no",
-          "career development opportunities" : "low",
-          "fte" : "0.8",
-          "salary" : "4000",
-          "work from home" : "2"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "no",
-          "career development opportunities" : "high",
-          "fte" : "0.6",
-          "salary" : "3500",
-          "work from home" : "1"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "yes",
-          "permanent contract" : "no",
-          "career development opportunities" : "high",
-          "fte" : "1.0",
-          "salary" : "4000",
-          "work from home" : "2"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "yes",
-          "permanent contract" : "yes",
-          "career development opportunities" : "medium",
-          "fte" : "0.8",
-          "salary" : "2500",
-          "work from home" : "1"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "yes",
-          "permanent contract" : "yes",
-          "career development opportunities" : "medium",
-          "fte" : "0.8",
-          "salary" : "2500",
-          "work from home" : "2"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "yes",
-          "career development opportunities" : "low",
-          "fte" : "1.0",
-          "salary" : "3500",
-          "work from home" : "0"
-        }
-      } ],
-      "{\"issuevalues\":{\"lease car\":\"yes\",\"permanent contract\":\"no\",\"career development opportunities\":\"high\",\"fte\":\"1.0\",\"salary\":\"4000\",\"work from home\":\"2\"}}" : [ {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "yes",
-          "career development opportunities" : "high",
-          "fte" : "1.0",
-          "salary" : "2000",
-          "work from home" : "2"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "yes",
-          "permanent contract" : "no",
-          "career development opportunities" : "low",
-          "fte" : "0.6",
-          "salary" : "3500",
-          "work from home" : "0"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "no",
-          "career development opportunities" : "low",
-          "fte" : "1.0",
-          "salary" : "2000",
-          "work from home" : "1"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "yes",
-          "permanent contract" : "no",
-          "career development opportunities" : "medium",
-          "fte" : "1.0",
-          "salary" : "3500",
-          "work from home" : "1"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "no",
-          "career development opportunities" : "high",
-          "fte" : "1.0",
-          "salary" : "3000",
-          "work from home" : "0"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "yes",
-          "permanent contract" : "yes",
-          "career development opportunities" : "medium",
-          "fte" : "1.0",
-          "salary" : "2500",
-          "work from home" : "2"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "no",
-          "career development opportunities" : "low",
-          "fte" : "0.6",
-          "salary" : "2000",
-          "work from home" : "1"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "yes",
-          "permanent contract" : "no",
-          "career development opportunities" : "high",
-          "fte" : "1.0",
-          "salary" : "3000",
-          "work from home" : "1"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "yes",
-          "permanent contract" : "no",
-          "career development opportunities" : "high",
-          "fte" : "0.8",
-          "salary" : "3500",
-          "work from home" : "1"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "no",
-          "career development opportunities" : "medium",
-          "fte" : "0.8",
-          "salary" : "2000",
-          "work from home" : "1"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "yes",
-          "permanent contract" : "yes",
-          "career development opportunities" : "high",
-          "fte" : "0.6",
-          "salary" : "2000",
-          "work from home" : "1"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "no",
-          "career development opportunities" : "low",
-          "fte" : "0.6",
-          "salary" : "2000",
-          "work from home" : "0"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "yes",
-          "permanent contract" : "no",
-          "career development opportunities" : "low",
-          "fte" : "0.8",
-          "salary" : "4000",
-          "work from home" : "2"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "no",
-          "career development opportunities" : "high",
-          "fte" : "0.6",
-          "salary" : "3500",
-          "work from home" : "1"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "yes",
-          "permanent contract" : "yes",
-          "career development opportunities" : "medium",
-          "fte" : "0.8",
-          "salary" : "2500",
-          "work from home" : "1"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "yes",
-          "permanent contract" : "yes",
-          "career development opportunities" : "medium",
-          "fte" : "0.8",
-          "salary" : "2500",
-          "work from home" : "2"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "yes",
-          "career development opportunities" : "low",
-          "fte" : "1.0",
-          "salary" : "3500",
-          "work from home" : "0"
-        }
-      } ],
-      "{\"issuevalues\":{\"lease car\":\"yes\",\"permanent contract\":\"yes\",\"career development opportunities\":\"medium\",\"fte\":\"0.8\",\"salary\":\"2500\",\"work from home\":\"1\"}}" : [ {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "no",
-          "career development opportunities" : "low",
-          "fte" : "0.6",
-          "salary" : "2000",
-          "work from home" : "0"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "yes",
-          "permanent contract" : "no",
-          "career development opportunities" : "low",
-          "fte" : "0.6",
-          "salary" : "3500",
-          "work from home" : "0"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "no",
-          "career development opportunities" : "high",
-          "fte" : "0.6",
-          "salary" : "3500",
-          "work from home" : "1"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "no",
-          "career development opportunities" : "low",
-          "fte" : "1.0",
-          "salary" : "2000",
-          "work from home" : "1"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "no",
-          "career development opportunities" : "high",
-          "fte" : "1.0",
-          "salary" : "3000",
-          "work from home" : "0"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "no",
-          "career development opportunities" : "low",
-          "fte" : "0.6",
-          "salary" : "2000",
-          "work from home" : "1"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "yes",
-          "permanent contract" : "no",
-          "career development opportunities" : "high",
-          "fte" : "1.0",
-          "salary" : "3000",
-          "work from home" : "1"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "yes",
-          "permanent contract" : "no",
-          "career development opportunities" : "high",
-          "fte" : "0.8",
-          "salary" : "3500",
-          "work from home" : "1"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "no",
-          "career development opportunities" : "medium",
-          "fte" : "0.8",
-          "salary" : "2000",
-          "work from home" : "1"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "yes",
-          "permanent contract" : "yes",
-          "career development opportunities" : "high",
-          "fte" : "0.6",
-          "salary" : "2000",
-          "work from home" : "1"
-        }
-      } ],
-      "{\"issuevalues\":{\"lease car\":\"yes\",\"permanent contract\":\"yes\",\"career development opportunities\":\"medium\",\"fte\":\"0.8\",\"salary\":\"2500\",\"work from home\":\"2\"}}" : [ {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "yes",
-          "career development opportunities" : "high",
-          "fte" : "1.0",
-          "salary" : "2000",
-          "work from home" : "2"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "no",
-          "career development opportunities" : "low",
-          "fte" : "0.6",
-          "salary" : "2000",
-          "work from home" : "0"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "yes",
-          "permanent contract" : "no",
-          "career development opportunities" : "low",
-          "fte" : "0.6",
-          "salary" : "3500",
-          "work from home" : "0"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "no",
-          "career development opportunities" : "high",
-          "fte" : "0.6",
-          "salary" : "3500",
-          "work from home" : "1"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "no",
-          "career development opportunities" : "low",
-          "fte" : "1.0",
-          "salary" : "2000",
-          "work from home" : "1"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "no",
-          "career development opportunities" : "high",
-          "fte" : "1.0",
-          "salary" : "3000",
-          "work from home" : "0"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "yes",
-          "permanent contract" : "yes",
-          "career development opportunities" : "medium",
-          "fte" : "0.8",
-          "salary" : "2500",
-          "work from home" : "1"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "no",
-          "career development opportunities" : "low",
-          "fte" : "0.6",
-          "salary" : "2000",
-          "work from home" : "1"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "yes",
-          "permanent contract" : "no",
-          "career development opportunities" : "high",
-          "fte" : "1.0",
-          "salary" : "3000",
-          "work from home" : "1"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "yes",
-          "permanent contract" : "no",
-          "career development opportunities" : "high",
-          "fte" : "0.8",
-          "salary" : "3500",
-          "work from home" : "1"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "no",
-          "career development opportunities" : "medium",
-          "fte" : "0.8",
-          "salary" : "2000",
-          "work from home" : "1"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "yes",
-          "permanent contract" : "yes",
-          "career development opportunities" : "high",
-          "fte" : "0.6",
-          "salary" : "2000",
-          "work from home" : "1"
-        }
-      } ],
-      "{\"issuevalues\":{\"lease car\":\"no\",\"permanent contract\":\"yes\",\"career development opportunities\":\"low\",\"fte\":\"1.0\",\"salary\":\"3500\",\"work from home\":\"0\"}}" : [ {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "yes",
-          "career development opportunities" : "high",
-          "fte" : "1.0",
-          "salary" : "2000",
-          "work from home" : "2"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "yes",
-          "permanent contract" : "no",
-          "career development opportunities" : "low",
-          "fte" : "0.6",
-          "salary" : "3500",
-          "work from home" : "0"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "no",
-          "career development opportunities" : "low",
-          "fte" : "1.0",
-          "salary" : "2000",
-          "work from home" : "1"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "yes",
-          "permanent contract" : "no",
-          "career development opportunities" : "medium",
-          "fte" : "1.0",
-          "salary" : "3500",
-          "work from home" : "1"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "no",
-          "career development opportunities" : "high",
-          "fte" : "1.0",
-          "salary" : "3000",
-          "work from home" : "0"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "no",
-          "career development opportunities" : "low",
-          "fte" : "0.6",
-          "salary" : "2000",
-          "work from home" : "1"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "yes",
-          "permanent contract" : "no",
-          "career development opportunities" : "high",
-          "fte" : "1.0",
-          "salary" : "3000",
-          "work from home" : "1"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "yes",
-          "permanent contract" : "no",
-          "career development opportunities" : "high",
-          "fte" : "0.8",
-          "salary" : "3500",
-          "work from home" : "1"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "no",
-          "career development opportunities" : "medium",
-          "fte" : "0.8",
-          "salary" : "2000",
-          "work from home" : "1"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "yes",
-          "permanent contract" : "yes",
-          "career development opportunities" : "high",
-          "fte" : "0.6",
-          "salary" : "2000",
-          "work from home" : "1"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "no",
-          "career development opportunities" : "low",
-          "fte" : "0.6",
-          "salary" : "2000",
-          "work from home" : "0"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "yes",
-          "permanent contract" : "no",
-          "career development opportunities" : "low",
-          "fte" : "0.8",
-          "salary" : "4000",
-          "work from home" : "2"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "no",
-          "permanent contract" : "no",
-          "career development opportunities" : "high",
-          "fte" : "0.6",
-          "salary" : "3500",
-          "work from home" : "1"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "yes",
-          "permanent contract" : "yes",
-          "career development opportunities" : "medium",
-          "fte" : "0.8",
-          "salary" : "2500",
-          "work from home" : "1"
-        }
-      }, {
-        "issuevalues" : {
-          "lease car" : "yes",
-          "permanent contract" : "yes",
-          "career development opportunities" : "medium",
-          "fte" : "0.8",
-          "salary" : "2500",
-          "work from home" : "2"
-        }
-      } ]
-    },
-    "reservationbid" : {
-      "issuevalues" : {
-        "lease car" : "no",
-        "permanent contract" : "yes",
-        "career development opportunities" : "medium",
-        "fte" : "0.8",
-        "salary" : "3500",
-        "work from home" : "1"
-      }
-    }
-  }
-}
Index: /profileconnection/src/test/resources/testprofile.json
===================================================================
--- /profileconnection/src/test/resources/testprofile.json	(revision 53)
+++ /profileconnection/src/test/resources/testprofile.json	(revision 1)
@@ -3,5 +3,5 @@
 		"issueUtilities": {
 			"issue2": {
-				"NumberValueSetUtilities": {
+				"numberutils": {
 					"lowValue": 12,
 					"lowUtility": 0.3,
@@ -11,5 +11,5 @@
 			},
 			"issue1": {
-				"DiscreteValueSetUtilities": {
+				"discreteutils": {
 					"valueUtilities": {
 						"issue1value1": 0.2,
@@ -27,5 +27,5 @@
 			"issuesValues": {
 				"issue2": {
-					"range": {"low":12,"high":18,"step":1} 
+					"range": ["12", "18", "1"]
 				},
 				"issue1": {
@@ -37,6 +37,6 @@
 				"reservationBid": {
 			"issuevalues": {
-				"issue1": "issue1value1",
-				"issue2": 12
+				"issue1": "issuevalue1",
+				"issue2": "12"
 			}
 		}
Index: /protocol/pom.xml
===================================================================
--- /protocol/pom.xml	(revision 53)
+++ /protocol/pom.xml	(revision 1)
@@ -6,5 +6,5 @@
 	<groupId>geniusweb</groupId>
 	<artifactId>protocol</artifactId>
-	<version>2.2.1</version>  <!-- equals the geniusweb version -->
+	<version>1.0.0</version>
 	<packaging>jar</packaging>
 
@@ -16,6 +16,5 @@
 		<basedir>.</basedir>
 		<passwd>${env.ARTIFACTORY_PASS}</passwd>
-		<jackson-2-version>2.12.3</jackson-2-version>
-		<geniusweb.version>${project.version}</geniusweb.version>
+		<jackson-2-version>2.9.6</jackson-2-version>
 	</properties>
 
@@ -23,43 +22,44 @@
 		<repository>
 			<id>artifactory.ewi.tudelft.nl</id>
-			<url>https://artifactory.ewi.tudelft.nl/artifactory/libs-release</url>
+			<url>http://artifactory.ewi.tudelft.nl/artifactory/libs-release</url>
 		</repository>
 	</distributionManagement>
 
 	<dependencies>
-		<dependency>
-			<groupId>geniusweb</groupId>
-			<artifactId>issuevalue</artifactId>
-			<version>${geniusweb.version}</version>
-		</dependency>
-		<dependency>
-			<groupId>geniusweb</groupId>
-			<artifactId>voting</artifactId>
-			<version>${geniusweb.version}</version>
-		</dependency>
+
 		<dependency>
 			<groupId>geniusweb</groupId>
 			<artifactId>profile</artifactId>
-			<version>${geniusweb.version}</version>
+			<version>1.0.0</version>
+		</dependency>
+		<dependency>
+			<groupId>geniusweb</groupId>
+			<artifactId>party</artifactId>
+			<version>1.0.0</version>
+		</dependency>
+		<dependency>
+			<groupId>tudelft.utilities</groupId>
+			<artifactId>listener</artifactId>
+			<version>1.0.0</version>
 		</dependency>
 		<dependency>
 			<groupId>geniusweb</groupId>
 			<artifactId>references</artifactId>
-			<version>${geniusweb.version}</version>
+			<version>1.0.0</version>
 		</dependency>
 		<dependency>
 			<groupId>geniusweb</groupId>
 			<artifactId>events</artifactId>
-			<version>${geniusweb.version}</version>
-		</dependency>
-		<dependency>
-			<groupId>tudelft.utilities</groupId>
-			<artifactId>utilities</artifactId>
-			<version>1.3.1</version>
+			<version>1.0.0</version>
+		</dependency>
+		<dependency>
+			<groupId>tudelft.utilities</groupId>
+			<artifactId>immutablelist</artifactId>
+			<version>1.0.0</version>
 		</dependency>
 		<dependency>
 			<groupId>tudelft.utilities</groupId>
 			<artifactId>logging</artifactId>
-			<version>1.0.1</version>
+			<version>1.0.0</version>
 		</dependency>
 
@@ -109,5 +109,5 @@
 			<groupId>tudelft.utilities</groupId>
 			<artifactId>junit</artifactId>
-			<version>1.0.5</version>
+			<version>1.0.2</version>
 			<scope>test</scope>
 		</dependency>
@@ -120,6 +120,6 @@
 		<dependency>
 			<groupId>org.mockito</groupId>
-			<artifactId>mockito-core</artifactId>
-			<version>3.11.2</version>
+			<artifactId>mockito-all</artifactId>
+			<version>1.9.5</version>
 			<scope>test</scope>
 		</dependency>
@@ -132,21 +132,19 @@
 		<repository>
 			<id>artifactory.ewi.tudelft.nl</id>
-			<url>https://artifactory.ewi.tudelft.nl/artifactory/libs-release</url>
+			<url>http://artifactory.ewi.tudelft.nl/artifactory/libs-release</url>
 			<snapshots>
 				<enabled>false</enabled>
 			</snapshots>
 		</repository>
+
 	</repositories>
 
 	<pluginRepositories>
 		<pluginRepository>
-			<id>central</id>
-			<url>https://repo1.maven.org/maven2</url>
-		</pluginRepository>
-		<pluginRepository>
-			<id>artifactory.ewi.tudelft.nl</id>
-			<url>https://artifactory.ewi.tudelft.nl/artifactory/libs-release</url>
+			<id>jcenter</id>
+			<url>http://jcenter.bintray.com</url>
 		</pluginRepository>
 	</pluginRepositories>
+
 
 	<build>
@@ -162,32 +160,19 @@
 				</configuration>
 			</plugin>
-			<plugin>
-				<groupId>org.apache.maven.plugins</groupId>
-				<artifactId>maven-enforcer-plugin</artifactId>
-				<version>3.0.0-M2</version>
-				<executions>
-					<execution>
-						<id>enforce</id>
+
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-javadoc-plugin</artifactId>
+				<version>2.10.1</version>
+				<executions>
+					<execution>
+						<id>attach-javadocs</id>
+						<goals>
+							<goal>jar</goal>
+						</goals>
 						<configuration>
-							<rules>
-								<dependencyConvergence />
-							</rules>
+							<additionalparam>${javadoc.opts}</additionalparam>
+							<additionalparam>-Xdoclint:none</additionalparam>
 						</configuration>
-						<goals>
-							<goal>enforce</goal>
-						</goals>
-					</execution>
-				</executions>
-			</plugin>
-			<plugin>
-				<groupId>org.apache.maven.plugins</groupId>
-				<artifactId>maven-javadoc-plugin</artifactId>
-				<version>3.2.0</version>
-				<executions>
-					<execution>
-						<id>attach-javadocs</id>
-						<goals>
-							<goal>jar</goal>
-						</goals>
 					</execution>
 				</executions>
@@ -197,5 +182,4 @@
 				<groupId>org.apache.maven.plugins</groupId>
 				<artifactId>maven-source-plugin</artifactId>
-				<version>3.1.0</version>
 				<executions>
 					<execution>
@@ -211,5 +195,5 @@
 				<groupId>org.jfrog.buildinfo</groupId>
 				<artifactId>artifactory-maven-plugin</artifactId>
-				<version>3.2.3</version>
+				<version>2.6.1</version>
 				<executions>
 					<execution>
Index: /protocol/src/main/java/geniusweb/protocol/CurrentNegoState.java
===================================================================
--- /protocol/src/main/java/geniusweb/protocol/CurrentNegoState.java	(revision 53)
+++ /protocol/src/main/java/geniusweb/protocol/CurrentNegoState.java	(revision 1)
@@ -14,41 +14,6 @@
 	}
 
-	public CurrentNegoState(NegoState state, Long now) {
-		super(now);
-		this.state = state;
-	}
-
 	public NegoState getState() {
 		return state;
 	}
-
-	@Override
-	public String toString() {
-		return "CurrentNegoState[" + getTime() + "," + state + "]";
-	}
-
-	@Override
-	public int hashCode() {
-		final int prime = 31;
-		int result = super.hashCode();
-		result = prime * result + ((state == null) ? 0 : state.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;
-		CurrentNegoState other = (CurrentNegoState) obj;
-		if (state == null) {
-			if (other.state != null)
-				return false;
-		} else if (!state.equals(other.state))
-			return false;
-		return true;
-	}
 }
Index: /protocol/src/main/java/geniusweb/protocol/NegoProtocol.java
===================================================================
--- /protocol/src/main/java/geniusweb/protocol/NegoProtocol.java	(revision 53)
+++ /protocol/src/main/java/geniusweb/protocol/NegoProtocol.java	(revision 1)
@@ -8,9 +8,9 @@
 
 import geniusweb.connection.ConnectionFactory;
-import geniusweb.deadline.Deadline;
 import geniusweb.events.CurrentState;
 import geniusweb.events.ProtocolEvent;
-import geniusweb.protocol.partyconnection.ProtocolToPartyConnFactory;
+import geniusweb.protocol.partyconnection.ConnectionWithPartyFactory;
 import geniusweb.protocol.session.SessionProtocol;
+import geniusweb.protocol.session.SessionSettings;
 import geniusweb.protocol.session.SessionState;
 import geniusweb.protocol.tournament.TournamentProtocol;
@@ -26,11 +26,16 @@
  * {@link #getDescription()}. A protocol reports the progress through its
  * {@link Listenable} interface. <br>
- * <h2>General information</h2>
+ * <p>
  * 
  * A protocol is mutable because the incoming connections cause state changes.
- * But it is recommended to push changing properties into the state so that the
- * complete state can be recovered and analysed.
+ * But it is recommended to push all changing properties into the state.
  * <p>
  * Because a protocol contains an internal state, it can be used only once.
+ * <p>
+ * The protocol also needs to keep an eye on the deadline and take appropriate
+ * actions when the deadline is reached. <br>
+ * <p>
+ * A protocol should emit a {@link SessionEnded} or {@link TournamentEnded}
+ * event when it is finished.
  * <p>
  * The protocol can emit a {@link CurrentState} event at any time. It should do
@@ -41,21 +46,10 @@
  * which it can resolve received {@link Reference}s. <br>
  * First call to instances <b>must be</b>
- * {@link #start(ProtocolToPartyConnFactory)}.
- * 
- * <h2>Ensure time deadline</h2>
- * 
- * The protocol also needs to keep an eye on the deadline and take appropriate
- * actions when the deadline is reached. <br>
- * <p>
- * All protocol implementations must ensure that the deadline is kept and that
- * the session ends at the agreed time {@link Deadline#getDuration()}. This is
- * to ensure that the negotiation ends and resources are freed up at or before
- * some known time.
+ * {@link #start(SessionSettings, ConnectionFactory)}.
  * 
  */
 @JsonAutoDetect(fieldVisibility = Visibility.ANY, getterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE, isGetterVisibility = Visibility.NONE)
 @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.WRAPPER_OBJECT)
-@JsonSubTypes({ @Type(value = SessionProtocol.class),
-		@Type(value = TournamentProtocol.class) })
+@JsonSubTypes({ @Type(value = SessionProtocol.class), @Type(value = TournamentProtocol.class) })
 
 public interface NegoProtocol extends Listenable<ProtocolEvent> {
@@ -70,22 +64,21 @@
 	 * <p>
 	 * 
-	 * All errors are to be handled through {@link SessionState#getResult()}
-	 * except for bugs that use {@link RuntimeException} like
-	 * {@link IllegalArgumentException}s. <br>
-	 * The protocol usually uses the incoming connections to keep running. It
-	 * does not need to run in a separate thread or so.
+	 * All errors are to be handled through {@link SessionState#getError()} except
+	 * for plain {@link IllegalArgumentException}s. <br>
+	 * The protocol usually uses the incoming connections to keep running. It does
+	 * not need to run in a separate thread or so.
 	 * 
 	 * 
-	 * @param connectionfactory the {@link ProtocolToPartyConnFactory} that
-	 *                          allows the protocol to connect with the
-	 *                          {@link Reference}s in the settings
+	 * @param connectionfactory the {@link ConnectionWithPartyFactory} that allows
+	 *                          the protocol to connect with the {@link Reference}s
+	 *                          in the settings
 	 */
-	void start(ProtocolToPartyConnFactory connectionfactory);
+	void start(ConnectionWithPartyFactory connectionfactory);
 
 	/**
 	 * 
-	 * @return a complete description of how this protocol behaves. Presented to
-	 *         the end users who should know negotiation basics but not all
-	 *         technical terms.
+	 * @return a complete description of how this protocol behaves. Presented to the
+	 *         end users who should know negotiation basics but not all technical
+	 *         terms.
 	 */
 	String getDescription();
@@ -93,6 +86,6 @@
 	/**
 	 * @return current state: the results of all sessions run so far and how to
-	 *         continue from that point. Changes over time as the session
-	 *         proceeds. Errors are also stored in the state.
+	 *         continue from that point. Changes over time as the session proceeds.
+	 *         Errors are also stored in the state.
 	 */
 	NegoState getState();
@@ -105,7 +98,6 @@
 
 	/**
-	 * Add a party after the protocol has started. Only some protocols can
-	 * handle this call. Usual protocols take the settings with their
-	 * constructor.
+	 * Add a party after the protocol has started. Only some protocols can handle
+	 * this call. Usual protocols take the settings with their constructor.
 	 * 
 	 * @param party the {@link PartyWithProfile} to be added.
Index: /protocol/src/main/java/geniusweb/protocol/NegoSettings.java
===================================================================
--- /protocol/src/main/java/geniusweb/protocol/NegoSettings.java	(revision 53)
+++ /protocol/src/main/java/geniusweb/protocol/NegoSettings.java	(revision 1)
@@ -5,8 +5,10 @@
 import com.fasterxml.jackson.annotation.JsonSubTypes;
 import com.fasterxml.jackson.annotation.JsonSubTypes.Type;
-import com.fasterxml.jackson.annotation.JsonTypeInfo;
 
 import geniusweb.protocol.session.SessionSettings;
 import geniusweb.protocol.tournament.TournamentSettings;
+
+import com.fasterxml.jackson.annotation.JsonTypeInfo;
+
 import tudelft.utilities.logging.Reporter;
 
@@ -34,5 +36,5 @@
 	/**
 	 * @param logger the logger where the protocol can log events to.
-	 * @return an initialized and ready to use {@link NegoProtocol} that can
+	 * @return the an initialized and ready to use {@link NegoProtocol} that can
 	 *         handle this Negotiation.
 	 */
Index: /protocol/src/main/java/geniusweb/protocol/NegoState.java
===================================================================
--- /protocol/src/main/java/geniusweb/protocol/NegoState.java	(revision 53)
+++ /protocol/src/main/java/geniusweb/protocol/NegoState.java	(revision 1)
@@ -1,5 +1,3 @@
 package geniusweb.protocol;
-
-import java.util.List;
 
 import com.fasterxml.jackson.annotation.JsonAutoDetect;
@@ -7,18 +5,13 @@
 import com.fasterxml.jackson.annotation.JsonSubTypes;
 import com.fasterxml.jackson.annotation.JsonSubTypes.Type;
-import com.fasterxml.jackson.annotation.JsonTypeInfo;
 
-import geniusweb.protocol.session.SessionResult;
 import geniusweb.protocol.session.SessionState;
 import geniusweb.protocol.tournament.TournamentState;
 
+import com.fasterxml.jackson.annotation.JsonTypeInfo;
+
 /**
- * The current state of the session/tournament. Must be (de)serializabl;e so
- * that it can be restarted if a crash occurs. Notice that this restart
- * functionality is not yet available.
- * <p>
- * In general the state contains all the information to control the flow of the
- * negotiation: who did what, are we finished, etc. This object may be stored to
- * record the final result as well
+ * The current state of the tournament. Must be serializabl;e so that it can be
+ * restarted if a crash occurs.
  */
 @JsonAutoDetect(fieldVisibility = Visibility.ANY, getterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE, isGetterVisibility = Visibility.NONE)
@@ -45,8 +38,7 @@
 	/**
 	 * 
-	 * @return List of the{@link SessionResult}s. Each SessionResult is a short
-	 *         report of the final outcome. Assumes {@link #isFinal(long)}.
-	 *         result may be undefined if not.
+	 * @return a fatal error occured during the tournament. returns null if no
+	 *         errors occured.
 	 */
-	List<SessionResult> getResults();
+	ProtocolException getError();
 }
Index: /protocol/src/main/java/geniusweb/protocol/ProtocolException.java
===================================================================
--- /protocol/src/main/java/geniusweb/protocol/ProtocolException.java	(revision 53)
+++ /protocol/src/main/java/geniusweb/protocol/ProtocolException.java	(revision 1)
@@ -2,40 +2,22 @@
 
 import geniusweb.actions.PartyId;
+import geniusweb.party.Party;
 import geniusweb.references.PartyRef;
 
 /**
- * thrown if a Party violates the protocols (that includes disconnecting).
+ * thrown if a {@link Party} violates the protocols (that includes
+ * disconnecting).
  */
 public class ProtocolException extends Exception {
-	private static final long serialVersionUID = 4618901784366523980L;
-	private PartyId party; // the failing party
+	private String party; // the failing party
 
 	/**
+	 * 
 	 * @param message the error message
 	 * @param party   offending party, either the {@link PartyId} or a
-	 *                {@link PartyRef}. In exceptional cases this can be null,
-	 *                eg if it can not be determined which party failed. Null
-	 *                should be avoided if possible at all.
+	 *                {@link PartyRef}
 	 */
-	public ProtocolException(String message, PartyId party) {
-		this(message, party, null);
-	}
-
-	/**
-	 * ProtocolException is special, in that it does not auto-fill the
-	 * stacktrace. This is needed because usually a ProtocolException is caused
-	 * by a party doing a bad action. Creating a stacktrace pointing to the
-	 * class reporting the protocol exception (usually, the protocol handler)
-	 * makes no sense as the protocol handler is doing the correct job there.
-	 * 
-	 * 
-	 * @param message the error message
-	 * @param party   offending {@link PartyId}. In exceptional cases this can
-	 *                be null, eg if it can not be determined which party
-	 *                failed. Null should be avoided if possible at all.
-	 * @param e       the cause of the error
-	 */
-	public ProtocolException(String message, PartyId party, Throwable e) {
-		super(party + ":" + message, e, true, false);
+	public ProtocolException(String message, String party) {
+		super(party + ":" + message);
 		this.party = party;
 	}
@@ -43,8 +25,19 @@
 	/**
 	 * 
-	 * @return offending party, either the {@link PartyId} or a
-	 *         {@link PartyRef}. In exceptional cases this can be null.
+	 * @param message the error message
+	 * @param party   offending party, either the {@link PartyId} or a
+	 *                {@link PartyRef}
+	 * @param e       the cause of the error
 	 */
-	public PartyId getParty() {
+	public ProtocolException(String message, String party, Throwable e) {
+		super(party + ":" + message, e);
+		this.party = party;
+	}
+
+	/**
+	 * 
+	 * @return offending party, either the {@link PartyId} or a {@link PartyRef}
+	 */
+	public String getParty() {
 		return party;
 	}
Index: /protocol/src/main/java/geniusweb/protocol/SessionResult.java
===================================================================
--- /protocol/src/main/java/geniusweb/protocol/SessionResult.java	(revision 1)
+++ /protocol/src/main/java/geniusweb/protocol/SessionResult.java	(revision 1)
@@ -0,0 +1,135 @@
+package geniusweb.protocol;
+
+import java.util.Collections;
+import java.util.List;
+
+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.annotation.JsonTypeInfo;
+
+import geniusweb.issuevalue.Bid;
+import geniusweb.references.PartyWithProfile;
+
+/**
+ * All results collected from running a session. Normally this does not contain
+ * all the details, only the final outcome and other global notes.
+ */
+@JsonAutoDetect(fieldVisibility = Visibility.ANY, getterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE)
+public class SessionResult {
+	private final List<PartyWithProfile> participants;
+	private final Bid agreement;
+
+	// add more type info so that jackson can deserialize the actual class
+	@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.WRAPPER_OBJECT)
+	private final Throwable error;
+
+	/**
+	 * 
+	 * @param participants the list oof {@link PartyWithProfile}, in the proper
+	 *                     order (this is relevant for the protocol etc). Should
+	 *                     never be null. Some of them may have entered later of
+	 *                     left early. This list should contain them all.
+	 * @param agreement    the final agreement {@link Bid} of the session. Null
+	 *                     if no agreement was reached.
+	 * @param error        a fatal error that terminated the session. Non-fatal
+	 *                     errors (warnings) are not to be reported. Null if no
+	 *                     fatal error occured (session ended following the
+	 *                     protocol). Normally, a fatal error results in no
+	 *                     agreement but there might be protocols that allow a
+	 *                     session to end with an error but stick with a already
+	 *                     reached agreement as well.
+	 */
+	@JsonCreator
+	public SessionResult(
+			@JsonProperty("participants") List<PartyWithProfile> participants,
+			@JsonProperty("agreement") Bid agreement,
+			@JsonProperty("error") Throwable error) {
+		this.participants = participants;
+		this.agreement = agreement;
+		this.error = error;
+	}
+
+	/**
+	 * 
+	 * @return the list oof {@link PartyWithProfile}, in the proper order (this
+	 *         is relevant for the protocol etc). Should never be null. Some of
+	 *         them may have entered later of left early. This list should
+	 *         contain them all.
+	 */
+	public List<PartyWithProfile> getParticipants() {
+		return Collections.unmodifiableList(participants);
+	}
+
+	/**
+	 * 8return the final agreement {@link Bid} of the session. Null if no
+	 * agreement was reached.
+	 */
+	public Bid getAgreement() {
+		return agreement;
+	};
+
+	/**
+	 * 
+	 * @return a fatal error that terminated the session. Non-fatal errors
+	 *         (warnings) are not to be reported. Null if no fatal error occured
+	 *         (session ended following the protocol). Normally, a fatal error
+	 *         results in no agreement but there might be protocols that allow a
+	 *         session to end with an error but stick with a already reached
+	 *         agreement as well.
+	 */
+	public Throwable getError() {
+		return error;
+	}
+
+	@Override
+	public String toString() {
+		return "SessionResult[" + participants + "," + agreement + "," + error
+				+ "]";
+	}
+
+	@Override
+	public int hashCode() {
+		final int prime = 31;
+		int result = 1;
+		result = prime * result
+				+ ((agreement == null) ? 0 : agreement.hashCode());
+		result = prime * result + ((error == null) ? 0 : error.hashCode());
+		result = prime * result
+				+ ((participants == null) ? 0 : participants.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;
+		SessionResult other = (SessionResult) obj;
+		if (agreement == null) {
+			if (other.agreement != null)
+				return false;
+		} else if (!agreement.equals(other.agreement))
+			return false;
+		if (error == null) {
+			if (other.error != null)
+				return false;
+		} else if (other.error == null)
+			return false;
+		else if (!error.toString().equals(other.error.toString()))
+			// HACK error does not have equals implemented!
+			// so we hacked in toString() here to work around it.
+			return false;
+		if (participants == null) {
+			if (other.participants != null)
+				return false;
+		} else if (!participants.equals(other.participants))
+			return false;
+		return true;
+	}
+
+}
Index: /protocol/src/main/java/geniusweb/protocol/partyconnection/ConnectionWithParties.java
===================================================================
--- /protocol/src/main/java/geniusweb/protocol/partyconnection/ConnectionWithParties.java	(revision 1)
+++ /protocol/src/main/java/geniusweb/protocol/partyconnection/ConnectionWithParties.java	(revision 1)
@@ -0,0 +1,123 @@
+package geniusweb.protocol.partyconnection;
+
+import java.io.IOException;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import geniusweb.actions.PartyId;
+import geniusweb.party.inform.Inform;
+
+/**
+ * Contains all parties with their connections. immutable
+ */
+public class ConnectionWithParties implements Iterable<ConnectionWithParty> {
+	private List<ConnectionWithParty> connections;
+
+	public ConnectionWithParties(List<ConnectionWithParty> connections) {
+		this.connections = connections;
+	}
+
+	/**
+	 * @param id the {@link PartyId} needed
+	 * @return a connection with that party, or null if no such connection.
+	 */
+	public ConnectionWithParty get(PartyId id) {
+		return connections.stream().filter(conn -> id.equals(conn.getParty()))
+				.findAny().orElse(null);
+	}
+
+	/**
+	 * 
+	 * @return true iff all parties have one connection only
+	 */
+	public boolean allunique() {
+		return getParties().size() == connections.size();
+	}
+
+	/**
+	 * 
+	 * @return list of parties currently in the connections.
+	 */
+	private List<PartyId> getParties() {
+		return connections.stream().map(conn -> conn.getParty()).distinct()
+				.collect(Collectors.toList());
+	}
+
+	/**
+	 * Broadcast info to all parties
+	 * 
+	 * @param info the {@link Inform} to broadcast
+	 */
+	public void broadcast(Inform info) throws IOException {
+		for (ConnectionWithParty conn : connections) {
+			conn.send(info);
+		}
+	}
+
+	/**
+	 * 
+	 * @return number of connections available
+	 */
+	public int size() {
+		return connections.size();
+	}
+
+	/**
+	 * @param i
+	 * @return the ith connection
+	 */
+	public ConnectionWithParty get(int i) {
+		return connections.get(i);
+	}
+
+	public Stream<ConnectionWithParty> stream() {
+		return connections.stream();
+	}
+
+	@Override
+	public Iterator<ConnectionWithParty> iterator() {
+		return connections.iterator();
+	}
+
+	public ConnectionWithParties with(ConnectionWithParty conn) {
+		List<ConnectionWithParty> newconnections = new LinkedList<>(
+				connections);
+		newconnections.add(conn);
+		return new ConnectionWithParties(newconnections);
+	}
+
+	@Override
+	public String toString() {
+		return "ConnectionWithParties" + connections;
+	}
+
+	@Override
+	public int hashCode() {
+		final int prime = 31;
+		int result = 1;
+		result = prime * result
+				+ ((connections == null) ? 0 : connections.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;
+		ConnectionWithParties other = (ConnectionWithParties) obj;
+		if (connections == null) {
+			if (other.connections != null)
+				return false;
+		} else if (!connections.equals(other.connections))
+			return false;
+		return true;
+	}
+
+}
Index: /protocol/src/main/java/geniusweb/protocol/partyconnection/ConnectionWithParty.java
===================================================================
--- /protocol/src/main/java/geniusweb/protocol/partyconnection/ConnectionWithParty.java	(revision 1)
+++ /protocol/src/main/java/geniusweb/protocol/partyconnection/ConnectionWithParty.java	(revision 1)
@@ -0,0 +1,19 @@
+package geniusweb.protocol.partyconnection;
+
+import geniusweb.actions.Action;
+import geniusweb.actions.PartyId;
+import geniusweb.connection.Connection;
+import geniusweb.party.inform.Inform;
+
+/**
+ * Connection of the protocol with a party. Note, this is the opposite direction
+ * of a connection of the party with the protocol.
+ */
+public interface ConnectionWithParty extends Connection<Action, Inform> {
+
+	/**
+	 * 
+	 * @return the partyId of the party that this connects to
+	 */
+	PartyId getParty();
+}
Index: /protocol/src/main/java/geniusweb/protocol/partyconnection/ConnectionWithPartyFactory.java
===================================================================
--- /protocol/src/main/java/geniusweb/protocol/partyconnection/ConnectionWithPartyFactory.java	(revision 1)
+++ /protocol/src/main/java/geniusweb/protocol/partyconnection/ConnectionWithPartyFactory.java	(revision 1)
@@ -0,0 +1,39 @@
+package geniusweb.protocol.partyconnection;
+
+import java.io.IOException;
+import java.util.List;
+
+import geniusweb.actions.Action;
+import geniusweb.connection.ConnectionFactory;
+import geniusweb.party.inform.Inform;
+import geniusweb.references.Reference;
+import tudelft.utilities.repository.NoResourcesNowException;
+
+/**
+ * An extended {@link ConnectionFactory} that store PartyIDs with the
+ * connections, making it possible to find back the appropriate connection given
+ * a PartyID. Also, it allows the connection factory to actually assign the
+ * PartyIDs.
+ *
+ */
+public interface ConnectionWithPartyFactory
+		extends ConnectionFactory<Action, Inform> {
+	@Override
+	public ConnectionWithParty connect(Reference reference)
+			throws IOException, NoResourcesNowException;
+
+	/**
+	 * Connects a set of References in one go, following a modified Banker's
+	 * algorthm.
+	 * 
+	 * @param references the list of references to connect with
+	 * @return a List of connections, one fore each Reference.
+	 * @throws IOException             if a connection is failing irrecoverably.
+	 * @throws NoResourcesNowException is there are insufficient resources now.
+	 *                                 This also includes a suggested moment to
+	 *                                 retry.
+	 */
+	List<ConnectionWithParty> connect(List<Reference> references)
+			throws IOException, NoResourcesNowException;
+
+}
Index: otocol/src/main/java/geniusweb/protocol/partyconnection/ProtocolToPartyConn.java
===================================================================
--- /protocol/src/main/java/geniusweb/protocol/partyconnection/ProtocolToPartyConn.java	(revision 53)
+++ 	(revision )
@@ -1,19 +1,0 @@
-package geniusweb.protocol.partyconnection;
-
-import geniusweb.actions.Action;
-import geniusweb.actions.PartyId;
-import geniusweb.connection.ConnectionEnd;
-import geniusweb.inform.Inform;
-
-/**
- * Connection of the protocol with a party. Note, this is the opposite direction
- * of a connection of the party with the protocol.
- */
-public interface ProtocolToPartyConn extends ConnectionEnd<Action, Inform> {
-
-	/**
-	 * 
-	 * @return the partyId of the party that this connects to.
-	 */
-	PartyId getParty();
-}
Index: otocol/src/main/java/geniusweb/protocol/partyconnection/ProtocolToPartyConnFactory.java
===================================================================
--- /protocol/src/main/java/geniusweb/protocol/partyconnection/ProtocolToPartyConnFactory.java	(revision 53)
+++ 	(revision )
@@ -1,52 +1,0 @@
-package geniusweb.protocol.partyconnection;
-
-import java.io.IOException;
-import java.util.List;
-
-import geniusweb.actions.Action;
-import geniusweb.connection.ConnectionFactory;
-import geniusweb.inform.Inform;
-import geniusweb.references.Reference;
-import tudelft.utilities.repository.NoResourcesNowException;
-
-/**
- * An extended {@link ConnectionFactory} that store PartyIDs with the
- * connections, making it possible to find back the appropriate connection given
- * a PartyID. Also, it allows the connection factory to actually assign the
- * PartyIDs.
- *
- */
-public interface ProtocolToPartyConnFactory
-		extends ConnectionFactory<Action, Inform> {
-	@Override
-	public ProtocolToPartyConn connect(Reference reference)
-			throws IOException, NoResourcesNowException;
-
-	/**
-	 * Connects a set of References in one go, following a modified Banker's
-	 * algorithm. Only succeeds if all requested connections can be made.
-	 * 
-	 * @param references the list of references to connect with
-	 * @return a List of connections, one fore each Reference. The URI Scheme
-	 *         deteremines how the connection to the party is created.
-	 *         Typically,
-	 *         <ul>
-	 *         <li>"classpath" assumes the file refers to an existing class on
-	 *         the classpath, directly to be instantiated.
-	 *         <li>"pythonpath" idem, but now the party is a python party.
-	 *         <li>"http" assumes the party is to be started on a partiesserver,
-	 *         where the partiesserver will convert the provided address to a
-	 *         specific party.
-	 *         </ul>
-	 *         It depends on the run system which of these protocols are
-	 *         actually supported, eg "pythonpath" is typically only supported
-	 *         for the python-based simplerunner.
-	 * @throws IOException             if a connection is failing irrecoverably.
-	 * @throws NoResourcesNowException is there are insufficient resources now.
-	 *                                 This exception includes a suggested
-	 *                                 moment to retry.
-	 */
-	List<ProtocolToPartyConn> connect(List<Reference> references)
-			throws IOException, NoResourcesNowException;
-
-}
Index: otocol/src/main/java/geniusweb/protocol/partyconnection/ProtocolToPartyConnections.java
===================================================================
--- /protocol/src/main/java/geniusweb/protocol/partyconnection/ProtocolToPartyConnections.java	(revision 53)
+++ 	(revision )
@@ -1,138 +1,0 @@
-package geniusweb.protocol.partyconnection;
-
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
-
-import geniusweb.actions.PartyId;
-import geniusweb.inform.Inform;
-
-/**
- * Contains all parties with their connections. immutable
- */
-public class ProtocolToPartyConnections
-		implements Iterable<ProtocolToPartyConn> {
-	private List<ProtocolToPartyConn> connections;
-
-	public ProtocolToPartyConnections(List<ProtocolToPartyConn> connections) {
-		this.connections = connections;
-	}
-
-	/**
-	 * @param id the {@link PartyId} needed
-	 * @return a connection with that party, or null if no such connection.
-	 */
-	public ProtocolToPartyConn get(PartyId id) {
-		return connections.stream().filter(conn -> id.equals(conn.getParty()))
-				.findAny().orElse(null);
-	}
-
-	/**
-	 * 
-	 * @return true iff all parties have one connection only
-	 */
-	public boolean allunique() {
-		return getParties().size() == connections.size();
-	}
-
-	/**
-	 * 
-	 * @return list of parties currently in the connections.
-	 */
-	private List<PartyId> getParties() {
-		return connections.stream().map(conn -> conn.getParty()).distinct()
-				.collect(Collectors.toList());
-	}
-
-	/**
-	 * Broadcast info to all parties. Notice that the broadcast immediately
-	 * aborts if an error occurs and remaining parties will not receive the
-	 * event. Therefore it is recommended to instead send to all parties
-	 * individually to ensure all parties are handled individually.
-	 * 
-	 * @param info the {@link Inform} to broadcast
-	 * @return a Map&lt;PartyId, IOException&gt; where possible exceptions for
-	 *         each party are stored. Normally a protocol would kick these
-	 *         parties.
-	 */
-	public Map<PartyId, IOException> broadcast(Inform info) {
-		Map<PartyId, IOException> exceptions = new HashMap<>();
-		for (ProtocolToPartyConn conn : connections) {
-			try {
-				conn.send(info);
-			} catch (IOException e) {
-				exceptions.put(conn.getParty(), e);
-			}
-		}
-		return exceptions;
-	}
-
-	/**
-	 * 
-	 * @return number of connections available
-	 */
-	public int size() {
-		return connections.size();
-	}
-
-	/**
-	 * @param i the connection number
-	 * @return the ith connection
-	 */
-	public ProtocolToPartyConn get(int i) {
-		return connections.get(i);
-	}
-
-	public Stream<ProtocolToPartyConn> stream() {
-		return connections.stream();
-	}
-
-	@Override
-	public Iterator<ProtocolToPartyConn> iterator() {
-		return connections.iterator();
-	}
-
-	public ProtocolToPartyConnections with(ProtocolToPartyConn conn) {
-		List<ProtocolToPartyConn> newconnections = new LinkedList<>(
-				connections);
-		newconnections.add(conn);
-		return new ProtocolToPartyConnections(newconnections);
-	}
-
-	@Override
-	public String toString() {
-		return "ConnectionWithParties" + connections;
-	}
-
-	@Override
-	public int hashCode() {
-		final int prime = 31;
-		int result = 1;
-		result = prime * result
-				+ ((connections == null) ? 0 : connections.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;
-		ProtocolToPartyConnections other = (ProtocolToPartyConnections) obj;
-		if (connections == null) {
-			if (other.connections != null)
-				return false;
-		} else if (!connections.equals(other.connections))
-			return false;
-		return true;
-	}
-
-}
Index: /protocol/src/main/java/geniusweb/protocol/session/DefaultSessionState.java
===================================================================
--- /protocol/src/main/java/geniusweb/protocol/session/DefaultSessionState.java	(revision 53)
+++ /protocol/src/main/java/geniusweb/protocol/session/DefaultSessionState.java	(revision 1)
@@ -1,8 +1,5 @@
 package geniusweb.protocol.session;
 
-import java.util.ArrayList;
 import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
 import java.util.LinkedList;
 import java.util.List;
@@ -13,29 +10,32 @@
 import geniusweb.progress.Progress;
 import geniusweb.protocol.ProtocolException;
+import geniusweb.protocol.partyconnection.ConnectionWithParties;
 import geniusweb.references.PartyWithProfile;
 
 /**
- * 
+ * The default current state of the session. immutable.
  */
-/**
- * 
- * The default current state of the session. immutable.
- * 
- * @param <P> the actual SessionState object
- * @param <S> the actual SessionSettings object
- */
-public abstract class DefaultSessionState<P extends DefaultSessionState<P, S>, S extends SessionSettings>
-		implements SessionState {
+public abstract class DefaultSessionState implements SessionState {
 	private final List<Action> actions;
 
-	private final List<PartyId> connections;
+	private final transient ConnectionWithParties connections;
 
 	private final Progress progress;
 
-	private final S settings;
+	private final SessionSettings settings;
 
 	private final ProtocolException error;
 
 	private final Map<PartyId, PartyWithProfile> partyprofiles;
+
+	// only for deserializer.
+	protected DefaultSessionState() {
+		actions = null;
+		connections = null;
+		progress = null;
+		settings = null;
+		partyprofiles = null;
+		error = null;
+	}
 
 	/**
@@ -57,66 +57,45 @@
 	 *                      {@link ProtocolException}s. All errors in our own
 	 *                      code are bugs (not ProtocolExceptions) and should
-	 *                      result in a throw and terminate the session.
-	 */
-	public DefaultSessionState(List<Action> actions, List<PartyId> conns,
-			Progress progr, S settings,
+	 *                      result in a throw.
+	 */
+	public DefaultSessionState(List<Action> actions,
+			ConnectionWithParties conns, Progress progr,
+			SessionSettings settings,
 			Map<PartyId, PartyWithProfile> partyprofiles, ProtocolException e) {
 		if (partyprofiles == null) {
-			this.partyprofiles = Collections.emptyMap();
+			partyprofiles = Collections.EMPTY_MAP;
+		}
+		if (conns == null) {
+			this.connections = new ConnectionWithParties(
+					Collections.EMPTY_LIST);
 		} else {
-			this.partyprofiles = new HashMap<>(partyprofiles);
-		}
-		if (conns == null) {
-			this.connections = Collections.emptyList();
-		} else {
-			this.connections = new LinkedList<>(conns);
+			this.connections = conns;
 		}
 		if (actions == null) {
 			this.actions = new LinkedList<>();
 		} else {
-			this.actions = new LinkedList<>(actions);
-		}
-
-		if (connections.size() != new HashSet<PartyId>(connections).size()) {
+			this.actions = actions;
+		}
+
+		if (!connections.allunique()) {
 			throw new IllegalArgumentException(
 					"There can not be multiple connections for a party:"
 							+ connections);
 		}
-		if (settings == null)
-			throw new IllegalArgumentException("Settings must be not null");
 		this.progress = progr;
 		this.settings = settings;
+		this.partyprofiles = partyprofiles;
 		this.error = e;
 	}
 
 	/**
-	 * Construct a new session state, where the DefaultSessionState changes
-	 * while the rest of the state remains unchanged. Notice the return type P.
-	 * 
-	 * @param actions1       the new {@link Action}s
-	 * @param conns          the new connected {@link PartyId}s
-	 * @param progress1      the new {@link Progress}
-	 * @param settings1      the new {@link SessionSettings}. Normally this is
-	 *                       constant during a session.
-	 * @param partyprofiles1 the new {@link PartyWithProfile}s for all parties.
-	 *                       Normally this remains constant during a session.
-	 * @param e              an error that occured that caused the session to
-	 *                       reach its terminated/final state. If an error does
-	 *                       not cause termination, only a warning should be
-	 *                       logged.
-	 * @return the new state of the derived sessionstate.
-	 */
-	abstract public P with(List<Action> actions1, List<PartyId> conns,
-			Progress progress1, S settings1,
-			Map<PartyId, PartyWithProfile> partyprofiles1, ProtocolException e);
-
-	/**
 	 * @return existing connections.
 	 */
-	public List<PartyId> getConnections() {
-		return Collections.unmodifiableList(connections);
-	}
-
-	/**
+	public ConnectionWithParties getConnections() {
+		return connections;
+	}
+
+	/**
+	 * @return
 	 * @return map with {@link PartyWithProfile} for the parties. May be an
 	 *         incomplete map, as more parties with their profiles may be set
@@ -124,5 +103,5 @@
 	 */
 	public Map<PartyId, PartyWithProfile> getPartyProfiles() {
-		return Collections.unmodifiableMap(partyprofiles);
+		return partyprofiles;
 	}
 
@@ -142,5 +121,5 @@
 
 	@Override
-	public S getSettings() {
+	public SessionSettings getSettings() {
 		return settings;
 	}
@@ -152,4 +131,5 @@
 	}
 
+	@Override
 	public ProtocolException getError() {
 		return error;
@@ -159,86 +139,6 @@
 	public String toString() {
 		return this.getClass().getSimpleName() + "[" + actions + ","
-				+ connections + "," + progress + "," + settings + "," + error;
-	}
-
-	public P withDeadlineReached() {
-		return with(actions, connections, progress, settings, partyprofiles,
-				error);
-	}
-
-	public P withoutParty(PartyId party) {
-		List<PartyId> newconn = new ArrayList<>(connections);
-		newconn.remove(party);
-		return with(actions, newconn, progress, settings, partyprofiles, error);
-	}
-
-	/**
-	 * 
-	 * @param e the error that occured
-	 * @return a new state with the error set/updated.
-	 */
-	public P with(ProtocolException e) {
-		return with(actions, connections, progress, settings, partyprofiles, e);
-	}
-
-	public P with(PartyId connection, PartyWithProfile partyprofile) {
-		List<PartyId> newconns = new ArrayList<>(getConnections());
-		newconns.add(connection);
-		Map<PartyId, PartyWithProfile> newprofiles = new HashMap<>(
-				getPartyProfiles());
-		newprofiles.put(connection, partyprofile);
-		return with(getActions(), newconns, getProgress(), getSettings(),
-				newprofiles, null);
-	}
-
-	/**
-	 * Sets the new progress for this session.
-	 * 
-	 * @param newprogress the new progress
-	 * @return new SAOPState with the progress set to new value
-	 */
-	public P with(Progress newprogress) {
-		if (newprogress == null) {
-			throw new IllegalArgumentException("newprogress must be not null");
-		}
-		return with(actions, connections, newprogress, settings, partyprofiles,
-				error);
-	}
-
-	/**
-	 * @param actor  the actor that did this action. Can be used to check if
-	 *               action is valid. NOTICE caller has to make sure the current
-	 *               state is not final.
-	 * @param action the action that was proposed by actor.
-	 * @return new SAOPState with the action added as last action.
-	 */
-
-	public P with(PartyId actor, Action action) {
-		String msg = checkAction(actor, action);
-		if (msg != null)
-			throw new IllegalArgumentException(msg);
-
-		List<Action> newactions = new LinkedList<>(getActions());
-		newactions.add(action);
-		return with(newactions, connections, progress, settings, partyprofiles,
-				error);
-	}
-
-	/**
-	 * 
-	 * @param actor  the known real actor that did this action
-	 * @param action an {@link Action}
-	 * @return null if action seems ok, or message explaining why not.
-	 */
-	public String checkAction(PartyId actor, Action action) {
-		if (actor == null) { // this is a bug
-			return "actor must not be null";
-		}
-		if (action == null) {
-			return "action is null";
-		}
-		if (!actor.equals(action.getActor()))
-			return "act contains wrong credentials: " + action;
-		return null;
+				+ connections + "," + progress + "," + settings + "," + error
+				+ "]";
 	}
 
Index: otocol/src/main/java/geniusweb/protocol/session/SessionResult.java
===================================================================
--- /protocol/src/main/java/geniusweb/protocol/session/SessionResult.java	(revision 53)
+++ 	(revision )
@@ -1,154 +1,0 @@
-package geniusweb.protocol.session;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-
-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.annotation.JsonTypeInfo;
-
-import geniusweb.actions.PartyId;
-import geniusweb.inform.Agreements;
-import geniusweb.references.PartyWithProfile;
-
-/**
- * All results collected from running a session. Normally this does not contain
- * all the details, only the final outcome and other global notes.
- */
-@JsonAutoDetect(fieldVisibility = Visibility.ANY, getterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE)
-public class SessionResult {
-	private final Map<PartyId, PartyWithProfile> participants;
-	private final Agreements agreements;
-	private final Map<PartyId, Double> penalties;
-
-	// add more type info so that jackson can deserialize the actual class
-	@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.WRAPPER_OBJECT)
-	private final Throwable error;
-
-	/**
-	 * 
-	 * @param participants the list oof {@link PartyWithProfile}. Should never
-	 *                     be null. Some of them may have entered later of left
-	 *                     early. This list should contain them all.
-	 * @param agreements   the final Agreements. The key is the party ID, value
-	 *                     is the bid that the party agreed on. Only parties
-	 *                     that reached an agreement are in this list.
-	 * @param penalties    Key is the party ID, the value is the penalties in
-	 *                     [0,1] for that participant. A penalty only applies to
-	 *                     an agreement, not to a reservation bid.
-	 * @param error        a fatal error that terminated the session. Non-fatal
-	 *                     errors (warnings) are not to be reported. Null if no
-	 *                     fatal error occured (session ended following the
-	 *                     protocol). Normally, a fatal error results in no
-	 *                     agreement but there might be protocols that allow a
-	 *                     session to end with an error but stick with a already
-	 *                     reached agreement as well.
-	 */
-	@JsonCreator
-	public SessionResult(
-			@JsonProperty("participants") Map<PartyId, PartyWithProfile> participants,
-			@JsonProperty("agreements") Agreements agreements,
-			@JsonProperty("penalties") Map<PartyId, Double> penalties,
-			@JsonProperty("error") Throwable error) {
-		this.participants = new HashMap<>(participants);
-		this.agreements = agreements;
-		this.penalties = new HashMap<>(penalties);
-		this.error = error;
-	}
-
-	/**
-	 * 
-	 * @return the map with for each {@link PartyId} the
-	 *         {@link PartyWithProfile}. Should never be null. Some of them may
-	 *         have entered later of left early. This list should contain them
-	 *         all.
-	 */
-	public Map<PartyId, PartyWithProfile> getParticipants() {
-		return Collections.unmodifiableMap(participants);
-	}
-
-	/**
-	 * @return the final {@link Agreements} of the session. May be empty, not
-	 *         null
-	 */
-	public Agreements getAgreements() {
-		return agreements;
-	};
-
-	/**
-	 * 
-	 * @return Map of penalties,
-	 */
-	public Map<PartyId, Double> getPenalties() {
-		return Collections.unmodifiableMap(penalties);
-	}
-
-	/**
-	 * 
-	 * @return a fatal error that terminated the session. Non-fatal errors
-	 *         (warnings) are not to be reported. Null if no fatal error occured
-	 *         (session ended following the protocol). Normally, a fatal error
-	 *         results in no agreement but there might be protocols that allow a
-	 *         session to end with an error but stick with a already reached
-	 *         agreement as well.
-	 */
-	public Throwable getError() {
-		return error;
-	}
-
-	@Override
-	public String toString() {
-		return "SessionResult[" + participants + "," + agreements + ","
-				+ penalties + "," + error + "]";
-	}
-
-	@Override
-	public int hashCode() {
-		final int prime = 31;
-		int result = 1;
-		result = prime * result
-				+ ((agreements == null) ? 0 : agreements.hashCode());
-		result = prime * result + ((error == null) ? 0 : error.hashCode());
-		result = prime * result
-				+ ((participants == null) ? 0 : participants.hashCode());
-		result = prime * result
-				+ ((penalties == null) ? 0 : penalties.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;
-		SessionResult other = (SessionResult) obj;
-		if (agreements == null) {
-			if (other.agreements != null)
-				return false;
-		} else if (!agreements.equals(other.agreements))
-			return false;
-		if (error == null) {
-			if (other.error != null)
-				return false;
-		} else if (!error.equals(other.error))
-			return false;
-		if (participants == null) {
-			if (other.participants != null)
-				return false;
-		} else if (!participants.equals(other.participants))
-			return false;
-		if (penalties == null) {
-			if (other.penalties != null)
-				return false;
-		} else if (!penalties.equals(other.penalties))
-			return false;
-		return true;
-	}
-
-}
Index: /protocol/src/main/java/geniusweb/protocol/session/SessionSettings.java
===================================================================
--- /protocol/src/main/java/geniusweb/protocol/session/SessionSettings.java	(revision 53)
+++ /protocol/src/main/java/geniusweb/protocol/session/SessionSettings.java	(revision 1)
@@ -6,10 +6,5 @@
 
 import geniusweb.protocol.NegoSettings;
-import geniusweb.protocol.session.amop.AMOPSettings;
-import geniusweb.protocol.session.learn.LearnSettings;
-import geniusweb.protocol.session.mopac.MOPACSettings;
-import geniusweb.protocol.session.mopac2.MOPAC2Settings;
 import geniusweb.protocol.session.saop.SAOPSettings;
-import geniusweb.protocol.session.shaop.SHAOPSettings;
 import geniusweb.references.PartyWithProfile;
 import tudelft.utilities.logging.Reporter;
@@ -18,51 +13,31 @@
  * interface for settings for session protocols. Immutable.
  */
-@JsonSubTypes({ @JsonSubTypes.Type(value = SAOPSettings.class),
-		@JsonSubTypes.Type(value = SHAOPSettings.class),
-		@JsonSubTypes.Type(value = AMOPSettings.class),
-		@JsonSubTypes.Type(value = MOPACSettings.class),
-		@JsonSubTypes.Type(value = MOPAC2Settings.class),
-		@JsonSubTypes.Type(value = LearnSettings.class) })
+@JsonSubTypes({ @JsonSubTypes.Type(value = SAOPSettings.class) })
+
 public interface SessionSettings extends NegoSettings {
 
 	/**
-	 * Get the {@link TeamInfo}s.
+	 * Get participants
 	 * 
 	 * @return list of {@link PartyWithProfile} items.
 	 */
-	List<TeamInfo> getTeams();
+	public List<PartyWithProfile> getParticipants();
 
 	/**
-	 * @return the size of each {@link TeamInfo}. Usually 1 (SAOP etc) or
-	 *         sometimes 2 (SHAOP). Used eg by tournament runner to determine
-	 *         proper team construction.
-	 */
-	Integer getTeamSize();
-
-	/**
-	 * Allows modification of SessionSettings to include a party. This is needed
-	 * for tournament auto-configuration of sessions.
+	 * Allows modification of SessionSettings to include a party. This is needed for
+	 * tournament auto-configuration of sessions.
 	 * 
-	 * @param partyprofteam the {@link TeamInfo} to be added
+	 * @param partyprof the party with profile to be added
 	 * @return new modified SessionSettings object
 	 */
-	SessionSettings with(TeamInfo partyprofteam);
-
-	/**
-	 * 
-	 * @return all parties from all teams, as a flattened ordered list. The
-	 *         order : start with all parties from team 1, then all from team 2,
-	 *         etc. The specific order of the parties from a team depends on the
-	 *         protocol.
-	 */
-	List<PartyWithProfile> getAllParties();
+	public SessionSettings with(PartyWithProfile partyprof);
 
 	/**
 	 * @param logger the logger where the protocol can log events to.
-	 * @return the an initialized and ready to use {@link SessionProtocol} that
-	 *         can handle this Negotiation.
+	 * @return the an initialized and ready to use {@link SessionProtocol} that can
+	 *         handle this Negotiation.
 	 */
 	@Override
-	SessionProtocol getProtocol(Reporter logger);
+	public SessionProtocol getProtocol(Reporter logger);
 
 }
Index: /protocol/src/main/java/geniusweb/protocol/session/SessionState.java
===================================================================
--- /protocol/src/main/java/geniusweb/protocol/session/SessionState.java	(revision 53)
+++ /protocol/src/main/java/geniusweb/protocol/session/SessionState.java	(revision 1)
@@ -6,12 +6,8 @@
 
 import geniusweb.actions.Action;
-import geniusweb.inform.Agreements;
+import geniusweb.issuevalue.Bid;
 import geniusweb.progress.Progress;
 import geniusweb.protocol.NegoState;
-import geniusweb.protocol.session.amop.AMOPState;
-import geniusweb.protocol.session.learn.LearnState;
-import geniusweb.protocol.session.mopac.MOPACState;
 import geniusweb.protocol.session.saop.SAOPState;
-import geniusweb.protocol.session.shaop.SHAOPState;
 
 /**
@@ -19,9 +15,15 @@
  * and the parties currently connected. <br>
  * The state checks if transitions (Actions from the party) are following the
- * protocol, and thus implement most of the protocol . <br>
+ * protocol, and thus implement most of the protocol . See
+ * {@link #with(geniusweb.actions.PartyId, Action)}. <br>
+ * 
+ * Use {@link #with(geniusweb.actions.PartyId, Action)} and
+ * {@link #with(geniusweb.actions.PartyId, tudelft.utilities.connection.Connection)}
+ * to create a new state <br>
+ * 
  * 
  * If protocol errors occur, these should be stored in the state and the state
- * should become {@link #isFinal(long)}. Throwing should happen only in case of
- * a bug.<br>
+ * should become {@link #isFinal()}. Throwing should happen only in case of a
+ * bug.<br>
  * 
  * Implementations should be immutable (to ensure thread safety, testability
@@ -31,9 +33,6 @@
  * the protocol. As uaual, mark non-serializable fields as transient.
  */
-@JsonSubTypes({ @JsonSubTypes.Type(value = SAOPState.class),
-		@JsonSubTypes.Type(value = SHAOPState.class),
-		@JsonSubTypes.Type(value = AMOPState.class),
-		@JsonSubTypes.Type(value = MOPACState.class),
-		@JsonSubTypes.Type(value = LearnState.class) })
+@JsonSubTypes({ @JsonSubTypes.Type(value = SAOPState.class) })
+
 public interface SessionState extends NegoState {
 
@@ -44,6 +43,5 @@
 	 * 
 	 * @return unmodifyable list of actions done so far, in the order in which
-	 *         they arrived. List of list allows implementations to add some
-	 *         extra structure to the actions, eg one list per phase
+	 *         they arrived.
 	 */
 	List<Action> getActions();
@@ -60,8 +58,8 @@
 	/**
 	 * 
-	 * @return the current standing {@link Agreements}. An agreement does not
-	 *         necessarily mean {@link #isFinal(long)}.
+	 * @return the current standing agreement, or null if there is no agreement
+	 *         at this point. An agreement does not necessarily mean
+	 *         {@link #isFinal()}.
 	 */
-	Agreements getAgreements();
-
+	Bid getAgreement();
 }
Index: otocol/src/main/java/geniusweb/protocol/session/TeamInfo.java
===================================================================
--- /protocol/src/main/java/geniusweb/protocol/session/TeamInfo.java	(revision 53)
+++ 	(revision )
@@ -1,116 +1,0 @@
-package geniusweb.protocol.session;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-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 com.fasterxml.jackson.annotation.JsonTypeInfo;
-
-import geniusweb.protocol.tournament.Team;
-import geniusweb.references.Parameters;
-import geniusweb.references.PartyWithParameters;
-import geniusweb.references.PartyWithProfile;
-import geniusweb.references.ProfileRef;
-
-/**
- * Contains a functional team, eg in SHAOP a team would be a SHAOP together with
- * his COB partner. In SAOP this is just a SAOP party.
- */
-@JsonAutoDetect(fieldVisibility = Visibility.ANY, getterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE)
-@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.WRAPPER_OBJECT)
-public class TeamInfo {
-
-	private final List<PartyWithProfile> parties;
-
-	/**
-	 * Convenient constructor if team is only 1 party and profile
-	 * 
-	 * @param party   the {@link PartyWithParameters}
-	 * @param profile the ProfileRef to be used by party
-	 */
-	public TeamInfo(PartyWithParameters party, ProfileRef profile) {
-		this(Arrays.asList(new PartyWithProfile(party, profile)));
-	}
-
-	@JsonCreator
-	public TeamInfo(@JsonProperty("teams") List<PartyWithProfile> teams) {
-		this.parties = teams;
-	}
-
-	/**
-	 * 
-	 * @return the list of all parties involved, which is the parties in all
-	 *         teams combined.
-	 */
-	public List<PartyWithProfile> getParties() {
-		return Collections.unmodifiableList(parties);
-	}
-
-	/**
-	 * 
-	 * @return the number of parties in the team.
-	 */
-	public Integer getSize() {
-		return parties.size();
-	}
-
-	@Override
-	public String toString() {
-		return "TeamInfo[" + parties + "]";
-	}
-
-	@Override
-	public int hashCode() {
-		final int prime = 31;
-		int result = 1;
-		result = prime * result + ((parties == null) ? 0 : parties.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;
-		TeamInfo other = (TeamInfo) obj;
-		if (parties == null) {
-			if (other.parties != null)
-				return false;
-		} else if (!parties.equals(other.parties))
-			return false;
-		return true;
-	}
-
-	/**
-	 * @param parameters a set of {@link Parameters} to be merged with the
-	 *                   existing parameters of the first team member.
-	 * @return updated TeamInfo
-	 */
-	public TeamInfo with(Parameters parameters) {
-		List<PartyWithProfile> updatedparties = new ArrayList<>(parties);
-		PartyWithProfile party1 = updatedparties.get(0);
-		Parameters newparams1 = party1.getParty().getParameters()
-				.with(parameters);
-		PartyWithProfile party1update = new PartyWithProfile(
-				party1.getParty().with(newparams1), party1.getProfile());
-		updatedparties.set(0, party1update);
-		return new TeamInfo(updatedparties);
-	}
-
-	/**
-	 * @return the Team, without the profiles
-	 */
-	public Team getTeam() {
-		return new Team(parties.stream().map(pwithp -> pwithp.getParty())
-				.collect(Collectors.toList()));
-	}
-}
Index: /protocol/src/main/java/geniusweb/protocol/session/saop/SAOP.java
===================================================================
--- /protocol/src/main/java/geniusweb/protocol/session/saop/SAOP.java	(revision 53)
+++ /protocol/src/main/java/geniusweb/protocol/session/saop/SAOP.java	(revision 1)
@@ -2,7 +2,4 @@
 
 import java.io.IOException;
-import java.sql.Date;
-import java.text.SimpleDateFormat;
-import java.util.Collections;
 import java.util.List;
 import java.util.Timer;
@@ -16,19 +13,17 @@
 import geniusweb.deadline.Deadline;
 import geniusweb.events.ProtocolEvent;
-import geniusweb.inform.ActionDone;
-import geniusweb.inform.Finished;
-import geniusweb.inform.Inform;
-import geniusweb.inform.Settings;
-import geniusweb.inform.YourTurn;
+import geniusweb.party.inform.ActionDone;
+import geniusweb.party.inform.Finished;
+import geniusweb.party.inform.Inform;
+import geniusweb.party.inform.Settings;
+import geniusweb.party.inform.YourTurn;
 import geniusweb.progress.ProgressFactory;
 import geniusweb.protocol.CurrentNegoState;
 import geniusweb.protocol.ProtocolException;
-import geniusweb.protocol.partyconnection.ProtocolToPartyConn;
-import geniusweb.protocol.partyconnection.ProtocolToPartyConnFactory;
-import geniusweb.protocol.partyconnection.ProtocolToPartyConnections;
+import geniusweb.protocol.partyconnection.ConnectionWithParty;
+import geniusweb.protocol.partyconnection.ConnectionWithPartyFactory;
 import geniusweb.protocol.session.SessionProtocol;
 import geniusweb.protocol.session.SessionSettings;
 import geniusweb.protocol.session.SessionState;
-import geniusweb.references.Parameters;
 import geniusweb.references.PartyWithProfile;
 import geniusweb.references.ProfileRef;
@@ -40,11 +35,11 @@
 
 /**
- * The protocol runs as follows
+ * 
+ * All parties are first sent the {@link SessionSettings}. Only parties
+ * specified initially in the settings do participate.
  * <ol>
- * <li>The protocol tries to start all parties. If not all parties start, the
+ * The protocol tries to start all parties. If not all parties start, the
  * parties are freed up and another attempt is done to start all parties some
  * time later.
- * <li>All parties are sent the {@link SessionSettings}. Only parties specified
- * initially in the settings do participate.
  * <li>The session deadline clock now starts ticking.
  * <li>All parties are sent their settings.
@@ -63,24 +58,25 @@
  * the protocol.
  * <p>
- * Thread safe: all entry points are synchronized.
+ * Threadsafe: all entrypoints are synhronized.
  */
 public class SAOP extends DefaultListenable<ProtocolEvent>
 		implements SessionProtocol {
-	public static final int TIME_MARGIN = 20;// ms extra delay after deadline
-	public static final int MINDURATION = 100;
-	public static final int MIN_SLEEP_TIME = 1000;
-	public static final int MAX_SLEEP_TIME = 60000;
+	private static final int TIME_MARGIN = 20;// ms extra delay after deadline
+	private static final int MINDURATION = 100;
+	private static final int MIN_SLEEP_TIME = 1000;
+	private static final int MAX_SLEEP_TIME = 60000;
 	private static final ProtocolRef SAOP = new ProtocolRef("SAOP");
 	private final Reporter log;
 
-	// these 4 variables are why protocols are so complex.
 	private SAOPState state = null; // mutable!
 	private volatile AtomicBoolean isFinishedInfoSent = new AtomicBoolean(
 			false);
 	private volatile Timer deadlinetimer = null;
-	private volatile ProtocolToPartyConnections conns;
-
-	public SAOP(SAOPState state, Reporter logger,
-			ProtocolToPartyConnections connects) {
+
+	/**
+	 * 
+	 * @param state normally the initial state coming from SAOPSettings
+	 */
+	public SAOP(SAOPState state, Reporter logger) {
 		if (state == null) {
 			throw new NullPointerException("state must be not null");
@@ -92,20 +88,9 @@
 		this.log = logger;
 		this.state = state;
-		this.conns = connects;
-	}
-
-	/**
-	 * 
-	 * @param state  normally the initial state coming from SAOPSettings
-	 * @param logger the Reporter to log to
-	 */
-	public SAOP(SAOPState state, Reporter logger) {
-		this(state, logger,
-				new ProtocolToPartyConnections(Collections.emptyList()));
 	}
 
 	@Override
 	public synchronized void start(
-			ProtocolToPartyConnFactory connectionfactory) {
+			ConnectionWithPartyFactory connectionfactory) {
 
 		try {
@@ -114,5 +99,5 @@
 			setupParties();
 			nextTurn();
-		} catch (Throwable e) {
+		} catch (ProtocolException | IOException | InterruptedException e) {
 			handleError("Failed to start up session", null, e);
 		}
@@ -163,12 +148,11 @@
 	 */
 	protected synchronized void connect(
-			ProtocolToPartyConnFactory connectionfactory)
+			ConnectionWithPartyFactory connectionfactory)
 			throws InterruptedException, IOException {
 		List<PartyWithProfile> participants = state.getSettings()
-				.getAllParties();
+				.getParticipants();
 		List<Reference> parties = participants.stream()
-				.map(parti -> (parti.getParty().getPartyRef()))
-				.collect(Collectors.toList());
-		List<ProtocolToPartyConn> connections = null;
+				.map(parti -> (parti.getParty())).collect(Collectors.toList());
+		List<ConnectionWithParty> connections = null;
 		log.log(Level.INFO, "SAOP connect " + parties);
 		while (connections == null) {
@@ -186,9 +170,5 @@
 		}
 		for (int i = 0; i < participants.size(); i++) {
-			// now we bookkeep the connections ourselves,
-			// and update the state to keep in sync.
-			conns = conns.with(connections.get(i));
-			setState(this.state.with(connections.get(i).getParty(),
-					participants.get(i)));
+			setState(this.state.with(connections.get(i), participants.get(i)));
 		}
 	}
@@ -210,6 +190,4 @@
 							"BUG. Deadline timer has triggered but state is not final");
 				}
-				log.log(Level.INFO,
-						"SAOP deadline reached. Terminating session.");
 				finish();
 			}
@@ -218,8 +196,4 @@
 		// early
 		deadlinetimer.schedule(task, deadline.getDuration() + TIME_MARGIN);
-		log.log(Level.INFO, "SAOP deadline set to "
-				+ new SimpleDateFormat("yyyy/MM/dd HH:mm:ss")
-						.format(new Date(System.currentTimeMillis()
-								+ deadline.getDuration() + TIME_MARGIN)));
 	}
 
@@ -234,14 +208,14 @@
 	 */
 	protected synchronized void setupParties() throws ProtocolException {
-		for (ProtocolToPartyConn conn : conns) {
+		for (ConnectionWithParty conn : state.getConnections()) {
 			conn.addListener(action -> actionRequest(conn, action));
 		}
 
-		for (ProtocolToPartyConn connection : conns) {
+		for (ConnectionWithParty connection : state.getConnections()) {
 			try {
 				sendSettings(connection);
 			} catch (IOException e) {
 				throw new ProtocolException("Failed to initialize",
-						connection.getParty(), e);
+						connection.getParty().getName(), e);
 			}
 		}
@@ -255,10 +229,8 @@
 	 * @throws IOException if party got disconnected
 	 */
-	private synchronized void sendSettings(ProtocolToPartyConn connection)
+	private synchronized void sendSettings(ConnectionWithParty connection)
 			throws IOException {
 		PartyId partyid = connection.getParty();
 		ProfileRef profile = state.getPartyProfiles().get(partyid).getProfile();
-		Parameters params = state.getPartyProfiles().get(partyid).getParty()
-				.getParameters();
 		if (profile == null) {
 			throw new IllegalArgumentException(
@@ -266,5 +238,5 @@
 		}
 		connection.send(new Settings(connection.getParty(), profile, getRef(),
-				state.getProgress(), params));
+				state.getProgress()));
 	}
 
@@ -273,17 +245,12 @@
 	 * Synchronized so that we always handle only 1 action at a time.
 	 * 
-	 * @param partyconn the connection on which the action came in.
+	 * @param partyconn the connection on which the action came in
 	 * @param action    the {@link Action} taken by some party
 	 */
 	protected synchronized void actionRequest(
-			final ProtocolToPartyConn partyconn, final Action action) {
+			final ConnectionWithParty partyconn, final Action action) {
 		if (action == null) {
-			Throwable err = partyconn.getError();
-			if (err == null) {
-				err = new ProtocolException("Party sent a null action",
-						partyconn.getParty());
-			}
-			handleError(partyconn + "Protocol error", partyconn.getParty(),
-					err);
+			handleError("Received null from " + partyconn + ". Closing session",
+					partyconn.getParty().getName(), null);
 			return;
 		}
@@ -292,16 +259,14 @@
 			if (!partyconn.getParty().equals(state.getNextActor())) {
 				// party does not have the turn.
-				throw new ProtocolException(
-						"Party acts without having the turn",
-						partyconn.getParty());
+				throw new ProtocolException(" act without having the turn",
+						partyconn.getParty().getName());
 			}
-			// FIXME? this ignores possible broadcast errors
-			conns.broadcast(new ActionDone(action));
+			state.getConnections().broadcast(new ActionDone(action));
 			setState(state.with(partyconn.getParty(), action));
 			if (!state.isFinal(System.currentTimeMillis()))
 				nextTurn();
-		} catch (Throwable e) {
+		} catch (Exception e) {
 			handleError("failed to handle action " + action,
-					partyconn.getParty(), e);
+					partyconn.getParty().getName(), e);
 		}
 
@@ -313,10 +278,10 @@
 	 * @throws IOException
 	 */
-	synchronized void nextTurn() {
+	private synchronized void nextTurn() {
 		PartyId party = state.getNextActor();
 		try {
-			conns.get(party).send(new YourTurn());
+			state.getConnections().get(party).send(new YourTurn());
 		} catch (IOException e) {
-			handleError("failed to send YourTurn", party, e);
+			handleError("failed to send YourTurn", party.getName(), e);
 		}
 	}
@@ -326,20 +291,14 @@
 	 * 
 	 * @param message The message to attach to the error
-	 * @param party   the party where the error occured. Can be null in
-	 *                exceptional cases.
+	 * @param party   the party where the error occured
 	 * @param e       the exception that occured.
 	 */
 	private synchronized void handleError(final String message,
-			final PartyId party, final Throwable e) {
+			final String party, final Exception e) {
 		if (e instanceof ProtocolException) {
 			setState(state.with((ProtocolException) e));
-
 		} else {
 			setState(state.with(new ProtocolException(message, party, e)));
 		}
-		if (party != null)
-			setState(state.withoutParty(party));
-		log.log(Level.WARNING, "SAOP protocol intercepted error due to party "
-				+ party + ":" + message, e);
 	}
 
@@ -374,12 +333,12 @@
 		if (!isFinishedInfoSent.compareAndSet(false, true))
 			return;
-		Inform finished = new Finished(state.getAgreements());
-		for (ProtocolToPartyConn conn : conns) {
+		Inform finished = new Finished(state.getAgreement());
+		for (ConnectionWithParty conn : state.getConnections()) {
 			sendFinish(conn, finished);
 		}
-		notifyListeners(new CurrentNegoState(state));
-	}
-
-	private void sendFinish(ProtocolToPartyConn connection, Inform finished) {
+		notifyChange(new CurrentNegoState(state));
+	}
+
+	private void sendFinish(ConnectionWithParty connection, Inform finished) {
 		try {
 			connection.send(finished);
Index: /protocol/src/main/java/geniusweb/protocol/session/saop/SAOPSettings.java
===================================================================
--- /protocol/src/main/java/geniusweb/protocol/session/saop/SAOPSettings.java	(revision 53)
+++ /protocol/src/main/java/geniusweb/protocol/session/saop/SAOPSettings.java	(revision 1)
@@ -4,5 +4,4 @@
 import java.util.LinkedList;
 import java.util.List;
-import java.util.stream.Collectors;
 
 import com.fasterxml.jackson.annotation.JsonCreator;
@@ -12,10 +11,9 @@
 import geniusweb.protocol.session.SessionProtocol;
 import geniusweb.protocol.session.SessionSettings;
-import geniusweb.protocol.session.TeamInfo;
 import geniusweb.references.PartyWithProfile;
 import tudelft.utilities.logging.Reporter;
 
 public class SAOPSettings implements SessionSettings {
-	private final List<TeamInfo> participants;
+	private final List<PartyWithProfile> participants;
 	private final Deadline deadline;
 
@@ -26,9 +24,9 @@
 	 *                     protocol. But SAOP can be initialized with less, for
 	 *                     use in TournamentSettings.
-	 * @param deadline     the deadline of the negotiation
+	 * @param deadline
 	 */
 	@JsonCreator
 	public SAOPSettings(
-			@JsonProperty("participants") List<TeamInfo> participants,
+			@JsonProperty("participants") List<PartyWithProfile> participants,
 			@JsonProperty("deadline") Deadline deadline) {
 		this.participants = participants;
@@ -53,5 +51,5 @@
 
 	@Override
-	public List<TeamInfo> getTeams() {
+	public List<PartyWithProfile> getParticipants() {
 		return Collections.unmodifiableList(participants);
 	}
@@ -62,16 +60,4 @@
 	public Deadline getDeadline() {
 		return deadline;
-	}
-
-	@Override
-	public List<PartyWithProfile> getAllParties() {
-		return participants.stream()
-				.map(particip -> particip.getParties().get(0))
-				.collect(Collectors.toList());
-	}
-
-	@Override
-	public Integer getTeamSize() {
-		return 1;
 	}
 
@@ -115,10 +101,7 @@
 
 	@Override
-	public SessionSettings with(TeamInfo team) {
-		if (team.getSize() != 1)
-			throw new IllegalArgumentException(
-					"Team must be size 1 but found " + team);
-		List<TeamInfo> newparts = new LinkedList<>(participants);
-		newparts.add(team);
+	public SessionSettings with(PartyWithProfile party) {
+		List<PartyWithProfile> newparts = new LinkedList<>(participants);
+		newparts.add(party);
 		return new SAOPSettings(newparts, deadline);
 	}
Index: /protocol/src/main/java/geniusweb/protocol/session/saop/SAOPState.java
===================================================================
--- /protocol/src/main/java/geniusweb/protocol/session/saop/SAOPState.java	(revision 53)
+++ /protocol/src/main/java/geniusweb/protocol/session/saop/SAOPState.java	(revision 1)
@@ -1,12 +1,9 @@
 package geniusweb.protocol.session.saop;
 
-import java.util.Arrays;
 import java.util.Collections;
-import java.util.HashSet;
+import java.util.HashMap;
+import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
-
-import com.fasterxml.jackson.annotation.JsonCreator;
-import com.fasterxml.jackson.annotation.JsonProperty;
 
 import geniusweb.actions.Accept;
@@ -15,11 +12,12 @@
 import geniusweb.actions.Offer;
 import geniusweb.actions.PartyId;
-import geniusweb.inform.Agreements;
 import geniusweb.issuevalue.Bid;
 import geniusweb.progress.Progress;
 import geniusweb.progress.ProgressRounds;
 import geniusweb.protocol.ProtocolException;
+import geniusweb.protocol.partyconnection.ConnectionWithParties;
+import geniusweb.protocol.partyconnection.ConnectionWithParty;
 import geniusweb.protocol.session.DefaultSessionState;
-import geniusweb.protocol.session.SessionResult;
+import geniusweb.protocol.session.SessionSettings;
 import geniusweb.references.PartyWithProfile;
 
@@ -27,59 +25,120 @@
  * Immutable.
  */
-public class SAOPState extends DefaultSessionState<SAOPState, SAOPSettings> {
-
-	/**
-	 * 
-	 * @param actions       the actions done by the parties
-	 * @param connections   the existing party connections. If null, default
+public class SAOPState extends DefaultSessionState {
+
+	/**
+	 * 
+	 * @param actions
+	 * @param conns         the existing party connections. we assume ownership
+	 *                      of this so it should not be modified although
+	 *                      connections may of course break. If null, default
 	 *                      empty list is used. Can be less than 2 parties in
-	 *                      the first phases of the setup or after parties
-	 *                      disconnected.
+	 *                      the first phases of the setup.
 	 * @param progress      the {@link Progress} line. can be null
 	 * @param settings      the {@link SAOPSettings}
 	 * @param partyprofiles map with the {@link PartyWithProfile} for connected
 	 *                      parties. null is equivalent to an empty map.
-	 * @param error         the {@link ProtocolException}, or null if none
+	 * @param e             the {@link ProtocolException}, or null if none
 	 *                      occurred.
 	 */
-	@JsonCreator
-	public SAOPState(@JsonProperty("actions") List<Action> actions,
-			@JsonProperty("connections") List<PartyId> connections,
-			@JsonProperty("progress") Progress progress,
-			@JsonProperty("settings") SAOPSettings settings,
-			@JsonProperty("partyprofiles") Map<PartyId, PartyWithProfile> partyprofiles,
-			@JsonProperty("error") ProtocolException error) {
-		super(actions, connections, progress, settings, partyprofiles, error);
+	public SAOPState(List<Action> actions, ConnectionWithParties conns,
+			Progress progress, SessionSettings settings,
+			Map<PartyId, PartyWithProfile> partyprofiles, ProtocolException e) {
+		super(actions, conns, progress, settings, partyprofiles, e);
+	}
+
+	/**
+	 * Creates the initial state from the given settings and progress=null
+	 * 
+	 * @param settings the {@link SAOPSettings}
+	 */
+	public SAOPState(SAOPSettings settings) {
+		this(Collections.emptyList(),
+				new ConnectionWithParties(Collections.emptyList()), null,
+				settings, null, null);
+
+	}
+
+	/**
+	 * @param actor         the actor that did this action. Can be used to check
+	 *                      if action is valid. NOTICE caller has to make sure
+	 *                      the current state is not final.
+	 * @param action        the action that was proposed by actor.
+	 * @param currentTimeMs the current time in ms since 1970, see
+	 *                      {@link System#currentTimeMillis()}
+	 * @return new SessionState with the action added as last action.
+	 */
+	public SAOPState with(PartyId actor, Action action) {
+		try {
+			return with1(actor, action);
+		} catch (ProtocolException e) {
+			List<Action> newactions = new LinkedList<>(getActions());
+			newactions.add(action);
+			return new SAOPState(newactions, getConnections(), getProgress(),
+					getSettings(), getPartyProfiles(), e);
+		}
+	}
+
+	/**
+	 * 
+	 * @param connection   the new {@link ConnectionWithParty}
+	 * @param partyprofile the {@link PartyWithProfile} that is associated with
+	 *                     this state
+	 * @return new SessionState with the new connection added. This call ignores
+	 *         the progress (does not check isFinal) because SAOP uses this
+	 *         during the setup where the deadline is not yet relevant. The
+	 *         connection should be informed about the partyprofile but the
+	 *         state currently indicate if that already happened or not.
+	 */
+	public SAOPState with(ConnectionWithParty connection,
+			PartyWithProfile partyprofile) {
+		// Only called from the SAOP initialization phase.
+		ConnectionWithParties newconns = getConnections().with(connection);
+		Map<PartyId, PartyWithProfile> newprofiles = new HashMap<>(
+				getPartyProfiles());
+		newprofiles.put(connection.getParty(), partyprofile);
+		return new SAOPState(getActions(), newconns, getProgress(),
+				getSettings(), newprofiles, null);
+	}
+
+	/**
+	 * 
+	 * @param e             the error that occured
+	 * @param currentTimeMs the current time in ms since 1970, see
+	 *                      {@link System#currentTimeMillis()}
+	 * @return a new state with the error set.
+	 */
+	public SAOPState with(ProtocolException e) {
+		return new SAOPState(getActions(), getConnections(), getProgress(),
+				getSettings(), getPartyProfiles(), e);
+	}
+
+	/**
+	 * Sets the progress for this session. Can be set only if progress=null.
+	 * 
+	 * @param newprogress the new progress
+	 * @return new SAOPState with the progress set
+	 */
+	public SAOPState with(Progress newprogress) {
+		if (newprogress == null) {
+			throw new IllegalArgumentException("newprogress must be not null");
+		}
+		if (getProgress() != null) {
+			return this;
+		}
+		return new SAOPState(getActions(), getConnections(), newprogress,
+				getSettings(), getPartyProfiles(), getError());
 	}
 
 	@Override
-	public SAOPState with(List<Action> actions, List<PartyId> conns,
-			Progress progr, SAOPSettings settings,
-			Map<PartyId, PartyWithProfile> partyprofiles, ProtocolException e) {
-		return new SAOPState(actions, conns, progr, settings, partyprofiles, e);
-	}
-
-	/**
-	 * Creates the initial state from the given settings and progress=null
-	 * 
-	 * @param settings the {@link SAOPSettings}
-	 */
-	public SAOPState(SAOPSettings settings) {
-		this(Collections.emptyList(), Collections.emptyList(), null, settings,
-				null, null);
-
-	}
-
-	@Override
-	public Agreements getAgreements() {
-		Agreements agree = new Agreements();
+	public Bid getAgreement() {
 		List<Action> acts = getActions();
 		int nparticipants = getConnections().size();
 		if (nparticipants < 2 || acts.size() < nparticipants) {
-			return agree;
+			return null;
 		}
 		Action offer = acts.get(acts.size() - nparticipants);
 		if (!(offer instanceof Offer))
-			return agree;
+			return null;
 		Bid bid = ((Offer) offer).getBid();
 
@@ -88,16 +147,5 @@
 				.allMatch(act -> act instanceof Accept
 						&& bid.equals(((Accept) act).getBid()));
-		if (allaccept)
-			agree = agree
-					.with(new Agreements(bid, new HashSet<>(getParties())));
-		return agree;
-	}
-
-	/**
-	 * 
-	 * @return all currently connected parties.
-	 */
-	public List<PartyId> getParties() {
-		return getConnections();
+		return allaccept ? bid : null;
 	}
 
@@ -105,39 +153,12 @@
 	public boolean isFinal(long currentTimeMs) {
 		List<Action> acts = getActions();
-		return super.isFinal(currentTimeMs)
-				|| !getAgreements().getMap().isEmpty() || (!acts.isEmpty()
+		return super.isFinal(currentTimeMs) || getAgreement() != null
+				|| (!acts.isEmpty()
 						&& acts.get(acts.size() - 1) instanceof EndNegotiation);
 	}
 
 	@Override
-	public SAOPState with(PartyId actor, Action action) {
-		return super.with(actor, action).with(advanceProgress());
-	}
-
-	@Override
-	public String checkAction(PartyId actor, Action action) {
-		String msg = super.checkAction(actor, action);
-		if (msg != null)
-			return msg;
-
-		if (!actor.equals(getNextActor()))
-			return "Party does not have the turn ";
-
-		// check protocol is followed for specific actions
-		if (action instanceof Accept) {
-			Bid bid = getLastBid();
-			if (bid == null)
-				return "Accept without a recent offer";
-
-			if (!bid.equals(((Accept) action).getBid()))
-				return "Party accepts a bid differing from the last offer ="
-						+ bid + ", action=" + action + ")";
-			return null;
-		} else if (action instanceof Offer) {
-			return null;
-		} else if (action instanceof EndNegotiation) {
-			return null;
-		}
-		return "Action " + action + " is not allowed in SAOP";
+	public SAOPSettings getSettings() {
+		return (SAOPSettings) super.getSettings();
 	}
 
@@ -161,19 +182,70 @@
 	}
 
+	private SAOPState with1(PartyId actor, Action action)
+			throws ProtocolException {
+
+		if (actor == null) { // this is a bug
+			throw new IllegalArgumentException("actor must not be null");
+		}
+		if (!actor.equals(getNextActor())) {
+			throw new ProtocolException("actor does not have the turn ",
+					actor.getName());
+
+		}
+		if (action == null) {
+			throw new ProtocolException("action is null", actor.getName());
+		}
+		if (!actor.equals(action.getActor())) {
+			throw new ProtocolException(
+					"act contains wrong credentials: " + action,
+					actor.getName());
+		}
+
+		// check protocol is followed for specific actions
+		if (action instanceof Accept) {
+			Bid bid = getLastBid();
+			if (bid == null) {
+				throw new ProtocolException("Accept without a recent offer",
+						actor.getName());
+			}
+			if (!bid.equals(((Accept) action).getBid())) {
+				throw new ProtocolException(
+						"Accepts a bid that was not offered (last offer =" + bid
+								+ ", action=" + action + ")",
+						actor.getName());
+			}
+		} else if (action instanceof Offer) {
+			// offer is always fine. We don't check if bid is actually in domain
+			// or complete etc. We would need domain for that
+		} else if (action instanceof EndNegotiation) {
+			// just act, we will get into the final state then.
+		} else {
+			throw new ProtocolException(
+					"Action " + action + " is not allowed in SAOP",
+					actor.getName());
+		}
+
+		List<Action> newactions = new LinkedList<>(getActions());
+		newactions.add(action);
+		return new SAOPState(newactions, getConnections(), advanceProgress(),
+				getSettings(), getPartyProfiles(), null);
+	}
+
 	/**
 	 * 
 	 * @return the next actor in the current state. Assumes 1 action per actor
-	 *         every time. NOTE if party disconnects this would jump wildly but
-	 *         nego stops then anyway
+	 *         every time.
 	 */
 	protected PartyId getNextActor() {
 		return getConnections()
-				.get(getActions().size() % getConnections().size());
-	}
-
-	/**
+				.get(getActions().size() % getConnections().size()).getParty();
+	}
+
+	/**
+	 * 
+	 * @param progress
 	 * @return new progress state
 	 */
-	public Progress advanceProgress() {
+	private Progress advanceProgress() {
 		Progress newprogress = getProgress();
 		if (newprogress instanceof ProgressRounds && isLastActor()) {
@@ -191,9 +263,3 @@
 	}
 
-	@Override
-	public List<SessionResult> getResults() {
-		return Arrays.asList(new SessionResult(getPartyProfiles(),
-				getAgreements(), Collections.emptyMap(), getError()));
-	}
-
 }
Index: otocol/src/main/java/geniusweb/protocol/tournament/ProfileList.java
===================================================================
--- /protocol/src/main/java/geniusweb/protocol/tournament/ProfileList.java	(revision 53)
+++ 	(revision )
@@ -1,68 +1,0 @@
-package geniusweb.protocol.tournament;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-import com.fasterxml.jackson.annotation.JsonAutoDetect;
-import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility;
-import com.fasterxml.jackson.annotation.JsonCreator;
-import com.fasterxml.jackson.annotation.JsonTypeInfo;
-import com.fasterxml.jackson.annotation.JsonValue;
-
-import geniusweb.references.ProfileRef;
-
-/**
- * Contains a list of profiles, one for each {@link Team} member.
- */
-@JsonAutoDetect(fieldVisibility = Visibility.ANY, getterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE, isGetterVisibility = Visibility.NONE)
-@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.WRAPPER_OBJECT)
-public class ProfileList {
-	@JsonValue
-	private final List<ProfileRef> profiles; // field to ensure immutability
-
-	/**
-	 * 
-	 * @param ps a list of {@link ProfileRef}s. The length and order is
-	 *           important as each will be matched with the {@link Team} member
-	 *           at the same index.
-	 */
-	@JsonCreator
-	public ProfileList(List<ProfileRef> ps) {
-		this.profiles = new ArrayList<>(ps);
-	}
-
-	public List<ProfileRef> getProfiles() {
-		return Collections.unmodifiableList(profiles);
-	}
-
-	@Override
-	public int hashCode() {
-		final int prime = 31;
-		int result = 1;
-		result = prime * result
-				+ ((profiles == null) ? 0 : profiles.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;
-		ProfileList other = (ProfileList) obj;
-		if (profiles == null) {
-			if (other.profiles != null)
-				return false;
-		} else if (!profiles.equals(other.profiles))
-			return false;
-		return true;
-	}
-
-	public String toString() {
-		return profiles.toString();
-	}
-}
Index: otocol/src/main/java/geniusweb/protocol/tournament/Team.java
===================================================================
--- /protocol/src/main/java/geniusweb/protocol/tournament/Team.java	(revision 53)
+++ 	(revision )
@@ -1,74 +1,0 @@
-package geniusweb.protocol.tournament;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-import com.fasterxml.jackson.annotation.JsonAutoDetect;
-import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility;
-import com.fasterxml.jackson.annotation.JsonCreator;
-import com.fasterxml.jackson.annotation.JsonTypeInfo;
-import com.fasterxml.jackson.annotation.JsonValue;
-
-import geniusweb.references.PartyWithParameters;
-
-/**
- * A team is a group of parties, each with their own parameters. Each will be
- * coupled to a {@link ProfileList} in the generation phase of the protocol
- *
- */
-@JsonAutoDetect(fieldVisibility = Visibility.ANY, getterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE, isGetterVisibility = Visibility.NONE)
-@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.WRAPPER_OBJECT)
-public class Team {
-	@JsonValue
-	private final List<PartyWithParameters> parties; // ensure immutability
-
-	/**
-	 * 
-	 * @param ps a list of {@link PartyWithParameters}. Each party is always
-	 *           associated with the given parameters. The order of them is
-	 *           important as it will be matched with the order in the
-	 *           {@link ProfileList}.
-	 */
-	@JsonCreator
-	public Team(List<PartyWithParameters> ps) {
-		this.parties = new ArrayList<PartyWithParameters>(ps);
-	}
-
-	/**
-	 * 
-	 * @return list of all team {@link PartyWithParameters}.
-	 */
-	public List<PartyWithParameters> getParties() {
-		return Collections.unmodifiableList(parties);
-	}
-
-	@Override
-	public int hashCode() {
-		final int prime = 31;
-		int result = 1;
-		result = prime * result + ((parties == null) ? 0 : parties.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;
-		Team other = (Team) obj;
-		if (parties == null) {
-			if (other.parties != null)
-				return false;
-		} else if (!parties.equals(other.parties))
-			return false;
-		return true;
-	}
-
-	public String toString() {
-		return parties.toString();
-	}
-}
Index: /protocol/src/main/java/geniusweb/protocol/tournament/TournamentSettings.java
===================================================================
--- /protocol/src/main/java/geniusweb/protocol/tournament/TournamentSettings.java	(revision 53)
+++ /protocol/src/main/java/geniusweb/protocol/tournament/TournamentSettings.java	(revision 1)
@@ -5,5 +5,4 @@
 import geniusweb.protocol.NegoSettings;
 import geniusweb.protocol.tournament.allpermutations.AllPermutationsSettings;
-import geniusweb.protocol.tournament.allpermutationslearn.AllPermutationsLearnSettings;
 import tudelft.utilities.logging.Reporter;
 
@@ -11,6 +10,5 @@
  * Interface for tournament settings
  */
-@JsonSubTypes({ @JsonSubTypes.Type(value = AllPermutationsSettings.class),
-		@JsonSubTypes.Type(value = AllPermutationsLearnSettings.class) })
+@JsonSubTypes({ @JsonSubTypes.Type(value = AllPermutationsSettings.class) })
 public interface TournamentSettings extends NegoSettings {
 	@Override
Index: /protocol/src/main/java/geniusweb/protocol/tournament/TournamentState.java
===================================================================
--- /protocol/src/main/java/geniusweb/protocol/tournament/TournamentState.java	(revision 53)
+++ /protocol/src/main/java/geniusweb/protocol/tournament/TournamentState.java	(revision 1)
@@ -3,20 +3,12 @@
 import com.fasterxml.jackson.annotation.JsonAutoDetect;
 import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility;
-import com.fasterxml.jackson.annotation.JsonSubTypes;
-import com.fasterxml.jackson.annotation.JsonSubTypes.Type;
 
 import geniusweb.protocol.NegoState;
-import geniusweb.protocol.tournament.allpermutations.AllPermutationsState;
-import geniusweb.protocol.tournament.allpermutationslearn.AllPermutationsLearnState;
 
 /**
- * The current state of the tournament. Must be implement Json serialization so
- * that it can be used to log the state. State must contain all information to
- * determine the relevant info of the negotiation. It may also be used to
- * restart the nego if a crash occurs.
+ * The current state of the tournament. Must be serializabl;e so that it can be
+ * restarted if a crash occurs.
  */
 @JsonAutoDetect(fieldVisibility = Visibility.ANY, getterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE)
-@JsonSubTypes({ @Type(value = AllPermutationsState.class),
-		@Type(value = AllPermutationsLearnState.class) })
 public interface TournamentState extends NegoState {
 
Index: /protocol/src/main/java/geniusweb/protocol/tournament/allpermutations/AllPermutationsProtocol.java
===================================================================
--- /protocol/src/main/java/geniusweb/protocol/tournament/allpermutations/AllPermutationsProtocol.java	(revision 53)
+++ /protocol/src/main/java/geniusweb/protocol/tournament/allpermutations/AllPermutationsProtocol.java	(revision 1)
@@ -1,5 +1,4 @@
 package geniusweb.protocol.tournament.allpermutations;
 
-import java.util.List;
 import java.util.logging.Level;
 
@@ -7,7 +6,7 @@
 import geniusweb.events.TournamentStarted;
 import geniusweb.protocol.CurrentNegoState;
-import geniusweb.protocol.partyconnection.ProtocolToPartyConnFactory;
+import geniusweb.protocol.SessionResult;
+import geniusweb.protocol.partyconnection.ConnectionWithPartyFactory;
 import geniusweb.protocol.session.SessionProtocol;
-import geniusweb.protocol.session.SessionResult;
 import geniusweb.protocol.session.SessionSettings;
 import geniusweb.protocol.session.SessionState;
@@ -30,10 +29,10 @@
 	private final transient Reporter log;
 
-	private ProtocolToPartyConnFactory connectionFactory; // FINAL
+	private ConnectionWithPartyFactory connectionFactory; // FINAL
 	private AllPermutationsState state; // MUTABLE
 
 	/**
 	 * 
-	 * @param state  the {@link AllPermutationsState}
+	 * @param state
 	 * @param logger used for all logging, about the tournament, and the created
 	 *               the session and protocols.
@@ -46,7 +45,7 @@
 
 	@Override
-	public void start(ProtocolToPartyConnFactory connectionfactory) {
+	public void start(ConnectionWithPartyFactory connectionfactory) {
 		this.connectionFactory = connectionfactory;
-		notifyListeners(new TournamentStarted(state.getSize().longValue()));
+		notifyChange(new TournamentStarted(state.getSize().longValue()));
 		startNextSession();
 	}
@@ -82,7 +81,9 @@
 			long now = System.currentTimeMillis();
 			if (sessionstate.isFinal(now)) {
-				List<SessionResult> results = sessionstate.getResults();
-				state = state.with(results);
-				notifyListeners(new CurrentNegoState(state));
+				SessionResult result = new SessionResult(
+						sessionstate.getSettings().getParticipants(),
+						sessionstate.getAgreement(), sessionstate.getError());
+				state = state.with(result);
+				notifyChange(new CurrentNegoState(state));
 				if (!state.isFinal(now)) {
 					startNextSession();
Index: /protocol/src/main/java/geniusweb/protocol/tournament/allpermutations/AllPermutationsSettings.java
===================================================================
--- /protocol/src/main/java/geniusweb/protocol/tournament/allpermutations/AllPermutationsSettings.java	(revision 53)
+++ /protocol/src/main/java/geniusweb/protocol/tournament/allpermutations/AllPermutationsSettings.java	(revision 1)
@@ -1,9 +1,6 @@
 package geniusweb.protocol.tournament.allpermutations;
 
-import java.math.BigInteger;
 import java.util.Collections;
-import java.util.LinkedList;
 import java.util.List;
-import java.util.function.BiFunction;
 
 import com.fasterxml.jackson.annotation.JsonCreator;
@@ -11,15 +8,11 @@
 
 import geniusweb.protocol.session.SessionSettings;
-import geniusweb.protocol.session.TeamInfo;
-import geniusweb.protocol.session.saop.SAOPSettings;
-import geniusweb.protocol.session.shaop.SHAOPSettings;
-import geniusweb.protocol.tournament.ProfileList;
-import geniusweb.protocol.tournament.Team;
 import geniusweb.protocol.tournament.TournamentProtocol;
 import geniusweb.protocol.tournament.TournamentSettings;
-import geniusweb.references.PartyWithParameters;
+import geniusweb.references.PartyRef;
 import geniusweb.references.PartyWithProfile;
 import geniusweb.references.ProfileRef;
 import tudelft.utilities.immutablelist.FixedList;
+import tudelft.utilities.immutablelist.Function2;
 import tudelft.utilities.immutablelist.ImmutableList;
 import tudelft.utilities.immutablelist.MapList;
@@ -29,5 +22,4 @@
 import tudelft.utilities.immutablelist.PermutationsWithReturn;
 import tudelft.utilities.immutablelist.PermutationsWithoutReturn;
-import tudelft.utilities.immutablelist.Repeat;
 import tudelft.utilities.immutablelist.Tuple;
 import tudelft.utilities.immutablelist.Tuples;
@@ -37,97 +29,51 @@
  * Takes a number of parties and profiles and makes all permutations of them
  * with the given number of parties and profiles. All profiles must be in the
- * same domain.
- * <p>
- * All sessions are based on the given {@link SessionSettings} (can be
- * {@link SAOPSettings} or {@link SHAOPSettings}). The parties for each
- * tournament session are added to this basic sessionsettings. sessionsettings
- * contains basically all the normal run-sessionsettings. This is used as a
- * "template" for all sessions of the tournament. You can put any use any
- * session setting here, and each session will be run according to the protocol
- * you select here.
- * 
- * The participants list usually is empty. The AllPermutationsProtocol adds the
- * the required parties to this list. So if you provide a non-empty list here,
- * then these parties would be present in every session in the tournament.
- * <p>
- * If the tournament is used with a SHAOP sessionsettings, the first member of
- * each team is assumed to be the SHAOP party, the second the COB party. To
- * match this, the first element of the ProfileList will have to be a partial
- * profile to fit the needs of the SHAOP party. The second profile will have to
- * be a normal profile, to fit the needs of the COB party. Note that you can
- * generate a partial profile using the <code>partial=N</code> option of the
- * profiles server.
+ * same domain. All sessions are based on the given sessionsettings (can be any
+ * session protocol). The parties for each tournament session are added to this
+ * basic sessionsettings.
+ *
  */
 public class AllPermutationsSettings implements TournamentSettings {
-
-	protected final List<Team> teams;
-	protected final List<ProfileList> profileslists;
-	protected final boolean reuseTeams;
-	protected final int teamsPerSession;
-	protected final SessionSettings sessionsettings;
-	protected final int numberTournaments;
-	private final transient ImmutableList<SessionSettings> perms; // cache
-
-	/**
-	 * 
-	 * @param teams           a list of {@link Team}s. Must contain at least
-	 *                        {@link #teamsPerSession} elements. The
-	 *                        {@link #teamsPerSession} must match the protocol:
-	 *                        (SAOP:1, SHAOP:2)
-	 * @param reuseTeams      if true, we use PermutationsWithReturn, if false
-	 *                        we use PermutationsWithoutReturn to create the
-	 *                        teams.
-	 * @param plists          list of available {@link ProfileList}s to be
-	 *                        permutated over the teams. Each
-	 *                        {@link ProfileList} must contain
-	 *                        {@link #teamsPerSession} elements.
-	 * @param teamsPerSession number of parties per session, must be at least 2.
-	 * @param sesettings      The generic {@link SessionSettings}.
-	 *                        {@link SessionSettings#with(TeamInfo)} will be
-	 *                        used to add the required {@link TeamInfo}s
-	 * @param nTournaments    the number of times the tournament should be run.
+	private final List<PartyRef> parties;
+	private final List<ProfileRef> profiles;
+	private final boolean reuseParties;
+	private final int partiesPerSession;
+	private final SessionSettings sessionsettings;
+
+	/**
+	 * 
+	 * @param parties           a list of {@link PartyRef}s. Must contain at
+	 *                          least <partiesPerSession> elements.
+	 * @param reuseParties      if true, we use PermutationsWithReturn, if false
+	 *                          we use PermutationsWithoutReturn to create the
+	 *                          parties.
+	 * @param profiles
+	 * @param partiesPerSession number of parties per session, must be at least
+	 *                          2.
+	 * @param sesettings        The generic {@link SessionSetting}.
+	 *                          {@link SessionSettings#with(PartyWithProfile)}
+	 *                          will be used to add the required
+	 *                          {@link PartyWithProfile}s
 	 */
 	@JsonCreator
-	public AllPermutationsSettings(@JsonProperty("teams") List<Team> teams,
-			@JsonProperty("profileslists") List<ProfileList> plists,
-			@JsonProperty("reuseTeams") boolean reuseTeams,
-			@JsonProperty("teamsPerSession") int teamsPerSession,
-			@JsonProperty("sessionsettings") SessionSettings sesettings,
-			@JsonProperty("numberTournaments") int nTournaments) {
-		if (teamsPerSession < 2)
-			throw new IllegalArgumentException("teamsPerSession must be >=2");
-		if (teams == null || teams.size() < teamsPerSession)
-			throw new IllegalArgumentException("teams must contain at least "
-					+ teamsPerSession + " teams");
-		if (plists == null || plists.size() < 2)
-			throw new IllegalArgumentException(
-					"profileslist must contain at least " + teamsPerSession
-							+ " ProfileList's");
-		if (nTournaments <= 0)
-			throw new IllegalArgumentException("nTournaments must be >0");
-		int teamsize = sesettings.getTeamSize();
-
-		for (Team team : teams) {
-			if (team.getParties().size() != teamsize) {
-				throw new IllegalArgumentException("All teams should have size "
-						+ teamsize + " but found " + team.getParties().size());
-			}
-		}
-		for (ProfileList profile : plists) {
-			if (profile.getProfiles().size() != teamsize) {
-				throw new IllegalArgumentException(
-						"All profiles should have size equal to the team size "
-								+ teamsize + " but found "
-								+ profile.getProfiles().size());
-			}
-		}
-		this.teamsPerSession = teamsPerSession;
-		this.reuseTeams = reuseTeams;
-		this.teams = teams;
-		this.profileslists = plists;
+	public AllPermutationsSettings(
+			@JsonProperty("parties") List<PartyRef> parties,
+			@JsonProperty("reuseParties") boolean reuseParties,
+			@JsonProperty("profiles") List<ProfileRef> profiles,
+			@JsonProperty("partiesPerSession") int partiesPerSession,
+			@JsonProperty("sessionsettings") SessionSettings sesettings) {
+		if (partiesPerSession < 2)
+			throw new IllegalArgumentException("partiesPerSession must be >=2");
+		if (parties == null || parties.size() < partiesPerSession)
+			throw new IllegalArgumentException("parties must contain at least "
+					+ partiesPerSession + " PartyRefs");
+		if (profiles == null || profiles.size() < 2)
+			throw new IllegalArgumentException("profiles must contain at least "
+					+ partiesPerSession + " ProfileRefs");
+		this.partiesPerSession = partiesPerSession;
+		this.reuseParties = reuseParties;
+		this.parties = parties;
+		this.profiles = profiles;
 		this.sessionsettings = sesettings;
-		this.numberTournaments = nTournaments;
-
-		this.perms = permutations1();
 	}
 
@@ -138,40 +84,22 @@
 	}
 
-	/**
-	 * 
-	 * @return number of times the entire tournament is repeated, &gt;0
-	 */
-	public int getNrTournaments() {
-		return this.numberTournaments;
-	}
-
 	@Override
 	public TournamentProtocol getProtocol(Reporter logger) {
 		AllPermutationsState state = new AllPermutationsState(this,
-				Collections.emptyList());
+				permutations(), Collections.emptyList());
 		return new AllPermutationsProtocol(state, logger);
 	}
 
 	/**
-	 * @return All {@link SessionSettings} for the tournament, in the correct
-	 *         order.
+	 * @return {@link ImmutableList} containing all {@link SessionSettings} for
+	 *         all Sessions in the correct order.
 	 */
 	public ImmutableList<SessionSettings> permutations() {
-		return perms;
-	}
-
-	/**
-	 * @return list of all {@link SessionSettings} for this tournament
-	 */
-	private ImmutableList<SessionSettings> permutations1() {
-		ImmutableList<ImmutableList<TeamInfo>> partylistlist;
-		ImmutableList<Team> partieslist = new FixedList<Team>(teams);
-		ImmutableList<ProfileList> profileslist = new FixedList<ProfileList>(
-				profileslists);
-		partylistlist = getParticipantsOneTournament(partieslist, profileslist,
-				teamsPerSession, reuseTeams);
-		partylistlist = new Repeat<ImmutableList<TeamInfo>>(partylistlist,
-				BigInteger.valueOf(numberTournaments), true);
-
+		ImmutableList<ImmutableList<PartyWithProfile>> partylistlist;
+		ImmutableList<PartyRef> partieslist = new FixedList<PartyRef>(parties);
+		ImmutableList<ProfileRef> profileslist = new FixedList<ProfileRef>(
+				profiles);
+		partylistlist = getParticipants(partieslist, profileslist,
+				partiesPerSession, reuseParties);
 		return new MapList<>(partyproflist -> createSetting(partyproflist),
 				partylistlist);
@@ -180,11 +108,7 @@
 	@Override
 	public String toString() {
-		return "AllPermutationsSettings[" + contentString() + "]";
-	}
-
-	protected String contentString() {
-		return teams + "," + reuseTeams + "," + profileslists + ","
-				+ teamsPerSession + "," + sessionsettings + ","
-				+ numberTournaments;
+		return "AllPermutationsSettings[" + parties + "," + reuseParties + ","
+				+ profiles + "," + partiesPerSession + "," + sessionsettings
+				+ "]";
 	}
 
@@ -193,12 +117,11 @@
 		final int prime = 31;
 		int result = 1;
-		result = prime * result + numberTournaments;
+		result = prime * result + ((parties == null) ? 0 : parties.hashCode());
+		result = prime * result + partiesPerSession;
 		result = prime * result
-				+ ((profileslists == null) ? 0 : profileslists.hashCode());
-		result = prime * result + (reuseTeams ? 1231 : 1237);
+				+ ((profiles == null) ? 0 : profiles.hashCode());
+		result = prime * result + (reuseParties ? 1231 : 1237);
 		result = prime * result
 				+ ((sessionsettings == null) ? 0 : sessionsettings.hashCode());
-		result = prime * result + ((teams == null) ? 0 : teams.hashCode());
-		result = prime * result + teamsPerSession;
 		return result;
 	}
@@ -213,12 +136,17 @@
 			return false;
 		AllPermutationsSettings other = (AllPermutationsSettings) obj;
-		if (numberTournaments != other.numberTournaments)
-			return false;
-		if (profileslists == null) {
-			if (other.profileslists != null)
+		if (parties == null) {
+			if (other.parties != null)
 				return false;
-		} else if (!profileslists.equals(other.profileslists))
-			return false;
-		if (reuseTeams != other.reuseTeams)
+		} else if (!parties.equals(other.parties))
+			return false;
+		if (partiesPerSession != other.partiesPerSession)
+			return false;
+		if (profiles == null) {
+			if (other.profiles != null)
+				return false;
+		} else if (!profiles.equals(other.profiles))
+			return false;
+		if (reuseParties != other.reuseParties)
 			return false;
 		if (sessionsettings == null) {
@@ -227,11 +155,4 @@
 		} else if (!sessionsettings.equals(other.sessionsettings))
 			return false;
-		if (teams == null) {
-			if (other.teams != null)
-				return false;
-		} else if (!teams.equals(other.teams))
-			return false;
-		if (teamsPerSession != other.teamsPerSession)
-			return false;
 		return true;
 	}
@@ -242,8 +163,8 @@
 	 * @return {@link SessionSettings}
 	 */
-	protected SessionSettings createSetting(
-			ImmutableList<TeamInfo> partyproflist) {
+	private SessionSettings createSetting(
+			ImmutableList<PartyWithProfile> partyproflist) {
 		SessionSettings settings = sessionsettings;
-		for (TeamInfo partyprof : partyproflist) {
+		for (PartyWithProfile partyprof : partyproflist) {
 			settings = settings.with(partyprof);
 		}
@@ -253,18 +174,18 @@
 	/**
 	 * 
-	 * @param parties              the parties in the tournament
-	 * @param profiles             the profiles in the tournament
-	 * @param n                    number of items to draw. Assumed &ge;1.
+	 * @param parties
+	 * @param profiles
+	 * @param n                    number of items to draw. Assumed >= 1.
 	 * @param drawPartyWithPutback if parties can be drawn multiple times
 	 * @return list of sessionsets where each sessionset contains settings for a
-	 *         session: a list with {@link TeamInfo}s. The sessionsets are made
-	 *         by making all combinations of parties and profiles. Profiles are
-	 *         drawn with replace.
-	 */
-	protected ImmutableList<ImmutableList<TeamInfo>> getParticipantsOneTournament(
-			ImmutableList<Team> parties, ImmutableList<ProfileList> profiles,
+	 *         session: a list with {@link PartyWithProfile}s. The sessionsets
+	 *         are made by making all combinations of parties and profiles.
+	 *         Profiles are drawn with replace.
+	 */
+	private ImmutableList<ImmutableList<PartyWithProfile>> getParticipants(
+			ImmutableList<PartyRef> parties, ImmutableList<ProfileRef> profiles,
 			int n, boolean drawPartyWithPutback) {
 
-		Permutations<Team> partiesPermutations;
+		Permutations<PartyRef> partiesPermutations;
 		if (drawPartyWithPutback) {
 			partiesPermutations = new PermutationsWithReturn<>(parties, n);
@@ -273,46 +194,34 @@
 		}
 
-		Permutations<ProfileList> profilesPermutations = new PermutationsOrderedWithoutReturn<>(
+		Permutations<ProfileRef> profilesPermutations = new PermutationsOrderedWithoutReturn<>(
 				profiles, n);
 
-		// each tuple contains session info: a list of Team and a list of
-		// ProfileList.
-		Tuples<ImmutableList<Team>, ImmutableList<ProfileList>> tuples = new Tuples<>(
+		// each tuple contains sesion info: a list of partyref and a list of
+		// profileref's.
+		Tuples<ImmutableList<PartyRef>, ImmutableList<ProfileRef>> tuples = new Tuples<>(
 				partiesPermutations, profilesPermutations);
 
-		return new MapList<Tuple<ImmutableList<Team>, ImmutableList<ProfileList>>, ImmutableList<TeamInfo>>(
-				tuple -> teamlist(tuple), tuples);
-	}
-
-	/**
-	 * 
-	 * @param tuple a tuple with (1) ImmutableList<Team> (2)
-	 *              ImmutableList<Profiles>
-	 * @return list of TeamOfPartiesAndProfiles, each picked from the two lists
-	 *         in order.
-	 */
-	private ImmutableList<TeamInfo> teamlist(
-			Tuple<ImmutableList<Team>, ImmutableList<ProfileList>> tuple) {
-		BiFunction<Team, ProfileList, TeamInfo> makeparty = new BiFunction<Team, ProfileList, TeamInfo>() {
+		return new MapList<Tuple<ImmutableList<PartyRef>, ImmutableList<ProfileRef>>, ImmutableList<PartyWithProfile>>(
+				tuple -> partyprofilelist(tuple), tuples);
+	}
+
+	/**
+	 * 
+	 * @param tuple a tuple with (1) ImmutableList<PartyRef> (2)
+	 *              ImmutableList<ProfileRef>
+	 * @return list of PartyWithProfile, each picked from the two lists in
+	 *         order.
+	 */
+	private ImmutableList<PartyWithProfile> partyprofilelist(
+			Tuple<ImmutableList<PartyRef>, ImmutableList<ProfileRef>> tuple) {
+		Function2<PartyRef, ProfileRef, PartyWithProfile> //
+		makeparty = new Function2<PartyRef, ProfileRef, PartyWithProfile>() {
 			@Override
-			public TeamInfo apply(Team team, ProfileList profilelist) {
-				List<PartyWithParameters> parties = team.getParties();
-				List<ProfileRef> profiles = profilelist.getProfiles();
-				if (parties.size() != profiles.size())
-					throw new IllegalArgumentException(
-							"Parties and profiles list must match, but found "
-									+ team + " and " + profilelist);
-
-				List<PartyWithProfile> theteams = new LinkedList<>();
-				for (int n = 0; n < parties.size(); n++) {
-					theteams.add(new PartyWithProfile(parties.get(n),
-							profiles.get(n)));
-				}
-				return new TeamInfo(theteams);
+			public PartyWithProfile apply(PartyRef party, ProfileRef profile) {
+				return new PartyWithProfile(party, profile);
 			}
-
 		};
-		return new MapThreadList<TeamInfo, Team, ProfileList>(makeparty,
-				tuple.get1(), tuple.get2());
+		return new MapThreadList<PartyWithProfile, PartyRef, ProfileRef>(
+				makeparty, tuple.get1(), tuple.get2());
 	}
 
Index: /protocol/src/main/java/geniusweb/protocol/tournament/allpermutations/AllPermutationsState.java
===================================================================
--- /protocol/src/main/java/geniusweb/protocol/tournament/allpermutations/AllPermutationsState.java	(revision 53)
+++ /protocol/src/main/java/geniusweb/protocol/tournament/allpermutations/AllPermutationsState.java	(revision 1)
@@ -5,10 +5,9 @@
 import java.util.List;
 
-import com.fasterxml.jackson.annotation.JsonCreator;
-import com.fasterxml.jackson.annotation.JsonProperty;
-
-import geniusweb.protocol.session.SessionResult;
+import geniusweb.protocol.ProtocolException;
+import geniusweb.protocol.SessionResult;
 import geniusweb.protocol.session.SessionSettings;
 import geniusweb.protocol.tournament.TournamentState;
+import tudelft.utilities.immutablelist.ImmutableList;
 
 /**
@@ -17,13 +16,14 @@
 public class AllPermutationsState implements TournamentState {
 
-	protected final AllPermutationsSettings toursettings; // original settings
+	private final AllPermutationsSettings toursettings; // original settings
+	private final ImmutableList<SessionSettings> sessionsettings;
 	// limited to MAX_INT elements. But we need to store results anyway
-	protected final List<SessionResult> results;
+	private final List<SessionResult> results;
 
-	@JsonCreator
-	public AllPermutationsState(
-			@JsonProperty("toursettings") AllPermutationsSettings toursettings,
-			@JsonProperty("results") List<SessionResult> results) {
+	public AllPermutationsState(AllPermutationsSettings toursettings,
+			ImmutableList<SessionSettings> settings,
+			List<SessionResult> results) {
 		this.toursettings = toursettings;
+		this.sessionsettings = settings;
 		this.results = results;
 	}
@@ -35,5 +35,5 @@
 	@Override
 	public boolean isFinal(long currentTimeMs) {
-		return toursettings.permutations().size().intValue() == results.size();
+		return sessionsettings.size().intValue() == results.size();
 	}
 
@@ -44,6 +44,5 @@
 		if (isFinal(0l))
 			return null;
-		return toursettings.permutations()
-				.get(BigInteger.valueOf(results.size()));
+		return sessionsettings.get(BigInteger.valueOf(results.size()));
 	}
 
@@ -55,13 +54,18 @@
 	 *                                  matching the expected participants
 	 */
-	public AllPermutationsState with(List<SessionResult> res) {
-		// FIXME do we really need this? Why is this not working?
-		// if (!new HashSet<PartyWithProfile>(getNextSettings().getAllParties())
-		// .equals(result.getParticipants().values())) {
-		// throw new IllegalArgumentException("Inconsistent session result");
-		// }
+	public AllPermutationsState with(SessionResult result) {
+		if (!getNextSettings().getParticipants()
+				.equals(result.getParticipants())) {
+			throw new IllegalArgumentException("Inconsistent session result");
+		}
 		ArrayList<SessionResult> newresults = new ArrayList<>(results);
-		newresults.addAll(res);
-		return new AllPermutationsState(toursettings, newresults);
+		newresults.add(result);
+		return new AllPermutationsState(toursettings, sessionsettings,
+				newresults);
+	}
+
+	@Override
+	public ProtocolException getError() {
+		return null;
 	}
 
@@ -71,5 +75,5 @@
 	 */
 	public BigInteger getSize() {
-		return toursettings.permutations().size();
+		return sessionsettings.size();
 	}
 
Index: otocol/src/test/java/geniusweb/protocol/CurrentNegoStateTest.java
===================================================================
--- /protocol/src/test/java/geniusweb/protocol/CurrentNegoStateTest.java	(revision 53)
+++ 	(revision )
@@ -1,50 +1,0 @@
-package geniusweb.protocol;
-
-import static org.mockito.Mockito.mock;
-
-import java.util.Arrays;
-import java.util.LinkedList;
-import java.util.List;
-
-import geniusweb.actions.Action;
-import geniusweb.actions.PartyId;
-import geniusweb.progress.Progress;
-import geniusweb.progress.ProgressTime;
-import geniusweb.protocol.session.saop.SAOPSettings;
-import geniusweb.protocol.session.saop.SAOPState;
-import tudelft.utilities.junit.GeneralTests;
-
-public class CurrentNegoStateTest extends GeneralTests<CurrentNegoState> {
-	private PartyId party1 = new PartyId("party1");
-	private PartyId party2 = new PartyId("party2");
-	private List<Action> actions1 = new LinkedList<>();
-
-	private List<PartyId> connections = Arrays.asList(party1);
-	private List<PartyId> connections2 = Arrays.asList(party1, party2);
-
-	private Progress progresstime = mock(ProgressTime.class);
-	private SAOPSettings settings = mock(SAOPSettings.class);
-
-	SAOPState saop1 = new SAOPState(actions1, connections2, progresstime,
-			settings, null, null);
-	SAOPState saop2 = new SAOPState(actions1, connections, progresstime,
-			settings, null, null);
-
-	CurrentNegoState state1 = new CurrentNegoState(saop1);
-	CurrentNegoState state1a = new CurrentNegoState(saop1);
-	CurrentNegoState state2 = new CurrentNegoState(saop2);
-
-	@Override
-	public List<List<CurrentNegoState>> getGeneralTestData() {
-		return Arrays.asList(Arrays.asList(state1, state1a),
-				Arrays.asList(state2));
-	}
-
-	@Override
-	public List<String> getGeneralTestStrings() {
-		return Arrays.asList(
-				"CurrentNegoState.*SAOPState.*party1.*party2.*ProgressTime.*SAOPSettings.*",
-				"CurrentNegoState.*SAOPState.*party1.*ProgressTime.*SAOPSettings.*");
-	}
-
-}
Index: otocol/src/test/java/geniusweb/protocol/ProtocolExceptionTest.java
===================================================================
--- /protocol/src/test/java/geniusweb/protocol/ProtocolExceptionTest.java	(revision 53)
+++ 	(revision )
@@ -1,54 +1,0 @@
-package geniusweb.protocol;
-
-import static org.junit.Assert.assertEquals;
-
-import java.io.IOException;
-
-import org.junit.Before;
-import org.junit.Ignore;
-import org.junit.Test;
-
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.util.ObjectBuffer;
-
-import geniusweb.actions.PartyId;
-
-public class ProtocolExceptionTest {
-	private ObjectBuffer jackson = new ObjectBuffer();
-	private Exception exception;
-	private String asString1 = "{\"cause\":null,\"stackTrace\":[],\"party\":\"party1\",\"message\":\"party1:test\",\"suppressed\":[],\"localizedMessage\":\"party1:test\"}";
-
-	@Before
-	public void before() {
-		try {
-			throw new ProtocolException("test", new PartyId("party1"));
-			// int x = 1 / 0;
-		} catch (Exception e) {
-			this.exception = e;
-			System.out.println(e);
-		}
-	}
-
-	@Test
-	public void testSerialize() throws JsonProcessingException {
-
-		ObjectMapper jackson = new ObjectMapper();
-		System.out.println(jackson.writeValueAsString(exception));
-		// disabled check , does not work either in Java8 or in Java16 because
-		// field order seems swapped
-//		assertEquals(asString1, jackson.writeValueAsString(exception));
-
-	}
-
-	// ProtocolExceptions can not be deserialized now
-	@Ignore
-	@Test
-	public void testDeserialize() throws IOException {
-
-		ObjectMapper jackson = new ObjectMapper();
-		Exception read = jackson.readValue(asString1, ProtocolException.class);
-		assertEquals(exception, read);
-	}
-
-}
Index: /protocol/src/test/java/geniusweb/protocol/session/ConnectionWithPartiesTest.java
===================================================================
--- /protocol/src/test/java/geniusweb/protocol/session/ConnectionWithPartiesTest.java	(revision 53)
+++ /protocol/src/test/java/geniusweb/protocol/session/ConnectionWithPartiesTest.java	(revision 1)
@@ -14,29 +14,29 @@
 
 import geniusweb.actions.PartyId;
-import geniusweb.protocol.partyconnection.ProtocolToPartyConnections;
-import geniusweb.protocol.partyconnection.ProtocolToPartyConn;
+import geniusweb.protocol.partyconnection.ConnectionWithParties;
+import geniusweb.protocol.partyconnection.ConnectionWithParty;
 import tudelft.utilities.junit.GeneralTests;
 
 public class ConnectionWithPartiesTest
-		extends GeneralTests<ProtocolToPartyConnections> {
+		extends GeneralTests<ConnectionWithParties> {
 	PartyId party1 = new PartyId("party1");
 	PartyId party2 = new PartyId("party2");
 	PartyId party3 = new PartyId("party3");
 
-	private ProtocolToPartyConn con1 = mock(ProtocolToPartyConn.class);
-	private ProtocolToPartyConn con2 = mock(ProtocolToPartyConn.class);
-	private ProtocolToPartyConn con3 = mock(ProtocolToPartyConn.class);
+	private ConnectionWithParty con1 = mock(ConnectionWithParty.class);
+	private ConnectionWithParty con2 = mock(ConnectionWithParty.class);
+	private ConnectionWithParty con3 = mock(ConnectionWithParty.class);
 
-	private ProtocolToPartyConnections conns1 = new ProtocolToPartyConnections(
+	private ConnectionWithParties conns1 = new ConnectionWithParties(
 			Arrays.asList(con1, con2));
-	private ProtocolToPartyConnections conns1a = new ProtocolToPartyConnections(
+	private ConnectionWithParties conns1a = new ConnectionWithParties(
 			Arrays.asList(con1, con2));
-	private ProtocolToPartyConnections conns2 = new ProtocolToPartyConnections(
+	private ConnectionWithParties conns2 = new ConnectionWithParties(
 			Arrays.asList(con1, con3));
-	private ProtocolToPartyConnections conns3 = new ProtocolToPartyConnections(
+	private ConnectionWithParties conns3 = new ConnectionWithParties(
 			Arrays.asList(con2, con1));
-	private ProtocolToPartyConnections conns4 = new ProtocolToPartyConnections(
+	private ConnectionWithParties conns4 = new ConnectionWithParties(
 			Arrays.asList(con2, con1, con3));
-	private ProtocolToPartyConnections conns5 = new ProtocolToPartyConnections(
+	private ConnectionWithParties conns5 = new ConnectionWithParties(
 			Arrays.asList(con2, con1, con3, con1));
 
@@ -54,5 +54,5 @@
 
 	@Override
-	public List<List<ProtocolToPartyConnections>> getGeneralTestData() {
+	public List<List<ConnectionWithParties>> getGeneralTestData() {
 		return Arrays.asList(Arrays.asList(conns1, conns1a),
 				Arrays.asList(conns2), Arrays.asList(conns3),
@@ -98,5 +98,5 @@
 	@Test
 	public void withPartyTest() {
-		ProtocolToPartyConnections conns = conns3.with(con3);
+		ConnectionWithParties conns = conns3.with(con3);
 		assertEquals(2, conns3.size());
 		assertEquals(3, conns.size());
Index: /protocol/src/test/java/geniusweb/protocol/session/DefaultSessionStateTest.java
===================================================================
--- /protocol/src/test/java/geniusweb/protocol/session/DefaultSessionStateTest.java	(revision 1)
+++ /protocol/src/test/java/geniusweb/protocol/session/DefaultSessionStateTest.java	(revision 1)
@@ -0,0 +1,137 @@
+package geniusweb.protocol.session;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.IOException;
+import java.net.URISyntaxException;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.LinkedList;
+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.EndNegotiation;
+import geniusweb.actions.PartyId;
+import geniusweb.deadline.DeadlineTime;
+import geniusweb.issuevalue.Bid;
+import geniusweb.progress.Progress;
+import geniusweb.progress.ProgressTime;
+import geniusweb.protocol.ProtocolException;
+import geniusweb.protocol.partyconnection.ConnectionWithParties;
+import geniusweb.protocol.session.DefaultSessionState;
+import geniusweb.protocol.session.SessionSettings;
+import geniusweb.protocol.session.saop.SAOPSettings;
+import geniusweb.references.PartyRef;
+import geniusweb.references.PartyWithProfile;
+import geniusweb.references.ProfileRef;
+import tudelft.utilities.junit.GeneralTests;
+
+public class DefaultSessionStateTest extends GeneralTests<DefaultSessionState> {
+	private final ObjectMapper jackson = new ObjectMapper();
+	private DefaultSessionState1 state1, state1a, stateA, stateE, stateF;
+	private String state1string = "{\"DefaultSessionState1\":{\"actions\":[],\"progress\":{\"time\":{\"duration\":1000,\"start\":1000}},\"settings\":{\"SAOPSettings\":{\"participants\":[{\"party\":\"party1\",\"profile\":\"profile1\"},{\"party\":\"party2\",\"profile\":\"profile2\"}],\"deadline\":{\"deadlinetime\":{\"durationms\":1000}}}},\"error\":null,\"partyprofiles\":{\"party1\":{\"party\":\"party1\",\"profile\":\"profile1\"}}}}";
+	private ProgressTime progr;
+	private final Date start = new Date(1000l);
+
+	@Before
+	public void before() throws URISyntaxException {
+		List<Action> actions = new LinkedList<>();
+		PartyId party1 = new PartyId("party1");
+		actions.add(new EndNegotiation(party1));
+		ConnectionWithParties conns = new ConnectionWithParties(
+				Collections.EMPTY_LIST);
+		DeadlineTime deadline = new DeadlineTime(1000);
+		progr = new ProgressTime(deadline.getDuration(), start);
+		PartyRef party1ref = new PartyRef("party1");
+		ProfileRef profile1 = new ProfileRef("profile1");
+		PartyRef party2ref = new PartyRef("party2");
+		ProfileRef profile2 = new ProfileRef("profile2");
+		List<PartyWithProfile> participants = Arrays.asList(
+				new PartyWithProfile(party1ref, profile1),
+				new PartyWithProfile(party2ref, profile2));
+		SessionSettings settings = new SAOPSettings(participants, deadline);
+		ProtocolException e = new ProtocolException("test protocol error",
+				party1.getName());
+		HashMap<PartyId, PartyWithProfile> partyprofiles = new HashMap<PartyId, PartyWithProfile>();
+		partyprofiles.put(party1, new PartyWithProfile(party1ref, profile1));
+		state1 = new DefaultSessionState1(Collections.EMPTY_LIST, null, progr,
+				settings, partyprofiles, null);
+		state1a = new DefaultSessionState1(Collections.EMPTY_LIST, null, progr,
+				settings, partyprofiles, null);
+
+		stateA = new DefaultSessionState1(actions, conns, progr, settings,
+				partyprofiles, null);
+
+		stateE = new DefaultSessionState1(Collections.EMPTY_LIST, conns, progr,
+				settings, partyprofiles, e);
+		stateF = new DefaultSessionState1(Collections.EMPTY_LIST, conns, progr,
+				settings, null, e);
+
+	}
+
+	@Override
+	public List<List<DefaultSessionState>> getGeneralTestData() {
+
+		return Arrays.asList(Arrays.asList(state1, state1a),
+				Arrays.asList(stateA), Arrays.asList(stateE),
+				Arrays.asList(stateF));
+	}
+
+	@Override
+	public List<String> getGeneralTestStrings() {
+		return Arrays.asList(
+				"DefaultSessionState1.*\\[\\].*ProgressTime.*1000ms.*SAOPSettings.*party1.*party2.*,null]",
+				"DefaultSessionState1.*\\[.*EndNegotiation.*party1.*\\].*,.*,ProgressTime.*1000ms.*SAOPSettings.*party1.*party2.*,null]",
+				"DefaultSessionState1.*\\[\\],.*,ProgressTime.*1000ms.*,SAOPSettings.*party1.*party2.*,.*ProtocolException: party1:test protocol error.*",
+				"DefaultSessionState1.*\\[\\],.*,ProgressTime.*1000ms.*,SAOPSettings.*party1.*party2.*,.*ProtocolException: party1:test protocol error.*");
+	}
+
+	@Test
+	public void serializeTest() throws JsonProcessingException {
+		System.out.println(jackson.writeValueAsString(state1));
+		assertEquals(state1string, jackson.writeValueAsString(state1));
+	}
+
+	@Test
+	public void deserializeTest() throws IOException {
+		// note, we don't use DefaultSessionState because we can't add the
+		// annotation nor tell jackson dynamically about the test class.
+		DefaultSessionState state = jackson.readValue(state1string,
+				DefaultSessionState1.class);
+		// compare fields, as sessionended is a derived/new inner class
+		assertEquals(progr, state.getProgress());
+	}
+}
+
+/**
+ * We need to implement a few things because we can not instantiate an abstract
+ * class.
+ */
+class DefaultSessionState1 extends DefaultSessionState {
+
+	private DefaultSessionState1() {
+		super();
+	}
+
+	public DefaultSessionState1(List<Action> actions,
+			ConnectionWithParties conns, Progress progr,
+			SessionSettings settings,
+			Map<PartyId, PartyWithProfile> partyprofiles, ProtocolException e) {
+		super(actions, conns, progr, settings, partyprofiles, e);
+	}
+
+	@Override
+	public Bid getAgreement() {
+		return null;
+	}
+
+}
Index: /protocol/src/test/java/geniusweb/protocol/session/SessionResultTest.java
===================================================================
--- /protocol/src/test/java/geniusweb/protocol/session/SessionResultTest.java	(revision 53)
+++ /protocol/src/test/java/geniusweb/protocol/session/SessionResultTest.java	(revision 1)
@@ -7,5 +7,4 @@
 import java.util.Arrays;
 import java.util.HashMap;
-import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
@@ -17,12 +16,9 @@
 import com.fasterxml.jackson.databind.ObjectMapper;
 
-import geniusweb.actions.PartyId;
-import geniusweb.inform.Agreements;
 import geniusweb.issuevalue.Bid;
 import geniusweb.issuevalue.DiscreteValue;
 import geniusweb.issuevalue.Value;
-import geniusweb.references.Parameters;
+import geniusweb.protocol.SessionResult;
 import geniusweb.references.PartyRef;
-import geniusweb.references.PartyWithParameters;
 import geniusweb.references.PartyWithProfile;
 import geniusweb.references.ProfileRef;
@@ -34,39 +30,27 @@
 
 	private final String ISSUE1 = "issue1";
+	// private final String errorstring =
+	// "\"error\":{\"java.lang.RuntimeException\":{\"cause\":null,\"stackTrace\":[{\"methodName\":\"<init>\",\"fileName\":\"SessionResultTest.java\",\"lineNumber\":29,\"className\":\"events.SessionResultTest\",\"nativeMethod\":false},{\"methodName\":\"newInstance0\",\"fileName\":\"NativeConstructorAccessorImpl.java\",\"lineNumber\":-2,\"className\":\"sun.reflect.NativeConstructorAccessorImpl\",\"nativeMethod\":true},{\"methodName\":\"newInstance\",\"fileName\":\"NativeConstructorAccessorImpl.java\",\"lineNumber\":62,\"className\":\"sun.reflect.NativeConstructorAccessorImpl\",\"nativeMethod\":false},{\"methodName\":\"newInstance\",\"fileName\":\"DelegatingConstructorAccessorImpl.java\",\"lineNumber\":45,\"className\":\"sun.reflect.DelegatingConstructorAccessorImpl\",\"nativeMethod\":false},{\"methodName\":\"newInstance\",\"fileName\":\"Constructor.java\",\"lineNumber\":423,\"className\":\"java.lang.reflect.Constructor\",\"nativeMethod\":false},{\"methodName\":\"createTest\",\"fileName\":\"BlockJUnit4ClassRunner.java\",\"lineNumber\":217,\"className\":\"org.junit.runners.BlockJUnit4ClassRunner\",\"nativeMethod\":false},{\"methodName\":\"runReflectiveCall\",\"fileName\":\"BlockJUnit4ClassRunner.java\",\"lineNumber\":266,\"className\":\"org.junit.runners.BlockJUnit4ClassRunner$1\",\"nativeMethod\":false},{\"methodName\":\"run\",\"fileName\":\"ReflectiveCallable.java\",\"lineNumber\":12,\"className\":\"org.junit.internal.runners.model.ReflectiveCallable\",\"nativeMethod\":false},{\"methodName\":\"methodBlock\",\"fileName\":\"BlockJUnit4ClassRunner.java\",\"lineNumber\":263,\"className\":\"org.junit.runners.BlockJUnit4ClassRunner\",\"nativeMethod\":false},{\"methodName\":\"runChild\",\"fileName\":\"BlockJUnit4ClassRunner.java\",\"lineNumber\":78,\"className\":\"org.junit.runners.BlockJUnit4ClassRunner\",\"nativeMethod\":false},{\"methodName\":\"runChild\",\"fileName\":\"BlockJUnit4ClassRunner.java\",\"lineNumber\":57,\"className\":\"org.junit.runners.BlockJUnit4ClassRunner\",\"nativeMethod\":false},{\"methodName\":\"run\",\"fileName\":\"ParentRunner.java\",\"lineNumber\":290,\"className\":\"org.junit.runners.ParentRunner$3\",\"nativeMethod\":false},{\"methodName\":\"schedule\",\"fileName\":\"ParentRunner.java\",\"lineNumber\":71,\"className\":\"org.junit.runners.ParentRunner$1\",\"nativeMethod\":false},{\"methodName\":\"runChildren\",\"fileName\":\"ParentRunner.java\",\"lineNumber\":288,\"className\":\"org.junit.runners.ParentRunner\",\"nativeMethod\":false},{\"methodName\":\"access$000\",\"fileName\":\"ParentRunner.java\",\"lineNumber\":58,\"className\":\"org.junit.runners.ParentRunner\",\"nativeMethod\":false},{\"methodName\":\"evaluate\",\"fileName\":\"ParentRunner.java\",\"lineNumber\":268,\"className\":\"org.junit.runners.ParentRunner$2\",\"nativeMethod\":false},{\"methodName\":\"run\",\"fileName\":\"ParentRunner.java\",\"lineNumber\":363,\"className\":\"org.junit.runners.ParentRunner\",\"nativeMethod\":false},{\"methodName\":\"run\",\"fileName\":\"JUnit4TestReference.java\",\"lineNumber\":86,\"className\":\"org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference\",\"nativeMethod\":false},{\"methodName\":\"run\",\"fileName\":\"TestExecution.java\",\"lineNumber\":38,\"className\":\"org.eclipse.jdt.internal.junit.runner.TestExecution\",\"nativeMethod\":false},{\"methodName\":\"runTests\",\"fileName\":\"RemoteTestRunner.java\",\"lineNumber\":538,\"className\":\"org.eclipse.jdt.internal.junit.runner.RemoteTestRunner\",\"nativeMethod\":false},{\"methodName\":\"runTests\",\"fileName\":\"RemoteTestRunner.java\",\"lineNumber\":760,\"className\":\"org.eclipse.jdt.internal.junit.runner.RemoteTestRunner\",\"nativeMethod\":false},{\"methodName\":\"run\",\"fileName\":\"RemoteTestRunner.java\",\"lineNumber\":460,\"className\":\"org.eclipse.jdt.internal.junit.runner.RemoteTestRunner\",\"nativeMethod\":false},{\"methodName\":\"main\",\"fileName\":\"RemoteTestRunner.java\",\"lineNumber\":206,\"className\":\"org.eclipse.jdt.internal.junit.runner.RemoteTestRunner\",\"nativeMethod\":false}],\"message\":\"test\",\"localizedMessage\":\"test\",\"suppressed\":[]}}";
 	private SessionResult result1, result1a, result2, result3, result4;
-	private String jsonstring = "{\"participants\":{\"party2\":{\"party\":{\"partyref\":\"party2\",\"parameters\":{}},\"profile\":\"profile2\"},\"party1\":{\"party\":{\"partyref\":\"party1\",\"parameters\":{}},\"profile\":\"profile1\"}},\"agreements\":{\"party2\":{\"issuevalues\":{\"issue1\":\"a\"}},\"party1\":{\"issuevalues\":{\"issue1\":\"a\"}}},\"penalties\":{\"party2\":0.0,\"party1\":0.0},\"error\":null}";
-	private Map<PartyId, Double> nopenalties = new HashMap<>();
-	private Map<PartyId, Double> penalties = new HashMap<>();
-
-	private PartyId PARTY1 = new PartyId("party1");
-	private PartyId PARTY2 = new PartyId("party2");
-	private PartyId PARTY3 = new PartyId("party3");
+	private String errorstring; // created dynamically: eclipse and maven
+								// generate different stacktrace.
+	private String jsonstring;
 
 	@Before
 	public void before() throws URISyntaxException, JsonProcessingException {
-		penalties.put(PARTY1, 0.1d);
-		penalties.put(PARTY2, 0.2d);
-		nopenalties.put(PARTY1, 0d);
-		nopenalties.put(PARTY2, 0d);
+		errorstring = "\"error\":{\"java.lang.RuntimeException\":"
+				+ jackson.writeValueAsString(error) + "}";
+		System.out.println(errorstring);
+		jsonstring = "{\"participants\":[{\"party\":\"party1\",\"profile\":\"profile1\"},{\"party\":\"party2\",\"profile\":\"profile2\"}],\"agreement\":{\"issuevalues\":{\"issue1\":\"a\"}},"
+				+ errorstring + "}";
 
-		String errorstring = "\"error\":{\"java.lang.RuntimeException\":"
-				+ jackson.writeValueAsString(error) + "}";
-		// System.out.println(errorstring);
-
-		PartyWithParameters party1 = new PartyWithParameters(
-				new PartyRef("party1"), new Parameters());
-		PartyWithParameters party2 = new PartyWithParameters(
-				new PartyRef("party2"), new Parameters());
-
-		PartyWithProfile partyprofile1 = new PartyWithProfile(party1,
-				new ProfileRef("profile1"));
-		PartyWithProfile partyprofile2 = new PartyWithProfile(party2,
-				new ProfileRef("profile2"));
+		PartyWithProfile partyprofile1 = new PartyWithProfile(
+				new PartyRef("party1"), new ProfileRef("profile1"));
+		PartyWithProfile partyprofile2 = new PartyWithProfile(
+				new PartyRef("party2"), new ProfileRef("profile2"));
 
 		Map<String, Value> issuevalues1 = new HashMap<>();
 		issuevalues1.put(ISSUE1, new DiscreteValue("a"));
 		Bid bid1 = new Bid(issuevalues1);
-		Agreements agreement1 = new Agreements().with(new Agreements(bid1,
-				new HashSet<>(Arrays.asList(PARTY1, PARTY2))));
 
 		// different order but that shouldn't matter
@@ -74,24 +58,15 @@
 		issuevalues2.put(ISSUE1, new DiscreteValue("b"));
 		Bid bid2 = new Bid(issuevalues2);
-		Agreements agreement2 = new Agreements().with(new Agreements(bid2,
-				new HashSet<>(Arrays.asList(PARTY1, PARTY3))));
 
-		Map<PartyId, PartyWithProfile> partiesmap = new HashMap<>();
-		partiesmap.put(PARTY1, partyprofile1);
-		partiesmap.put(PARTY2, partyprofile2);
-
-		Map<PartyId, PartyWithProfile> partiesmap2 = new HashMap<>();
-		partiesmap2.put(PARTY1, partyprofile2);
-		partiesmap2.put(PARTY3, partyprofile1);
-
-		result1 = new SessionResult(partiesmap, agreement1, nopenalties, null);
-		result1a = new SessionResult(partiesmap, agreement1, nopenalties, null);
-		result2 = new SessionResult(partiesmap, agreement2, nopenalties, null);
-		result3 = new SessionResult(partiesmap2, agreement1, nopenalties, null);
-		result4 = new SessionResult(partiesmap2, agreement1, penalties, null);
-
-		// IGNORE ERROR for now, it fails somewhere deep in maven suddenly.
-		// result4 = new SessionResult(Arrays.asList(partyprofile1,
-		// partyprofile2), bid1, error);
+		result1 = new SessionResult(Arrays.asList(partyprofile1, partyprofile2),
+				bid1, error);
+		result1a = new SessionResult(
+				Arrays.asList(partyprofile1, partyprofile2), bid1, error);
+		result2 = new SessionResult(Arrays.asList(partyprofile1, partyprofile2),
+				bid2, error);
+		result3 = new SessionResult(Arrays.asList(partyprofile2, partyprofile1),
+				bid2, error);
+		result4 = new SessionResult(Arrays.asList(partyprofile1, partyprofile2),
+				bid1, null);
 	}
 
@@ -106,10 +81,8 @@
 	public List<String> getGeneralTestStrings() {
 		return Arrays.asList(
-				"SessionResult.*party2.*profile2.*,.*party1.*profile1.*Agreements.*Bid.*issue1=\"a\".*0\\.0.*0\\.0.*null.*",
-				"SessionResult.*party2.*profile2.*,.*party1.*profile1.*Agreements.*Bid.*issue1=\"b\".*0\\.0.*0\\.0.*null.*",
-				"SessionResult.*party1.*profile2.*,.*party3.*profile1.*Agreements.*Bid.*issue1=\"a\".*0\\.0.*0\\.0.*null.*",
-				"SessionResult.*party1.*profile2.*,.*party3.*profile1.*Agreements.*Bid.*issue1=\"a\".*party2.*0\\.2.*party1.*0\\.1.*null.*"
-
-		);
+				"SessionResult.*party1.*profile1.*,.*party2.*profile2.*Bid.*issue1=\"a\".*java.lang.RuntimeException.*test.*",
+				"SessionResult.*party1.*profile1.*,.*party2.*profile2.*Bid.*issue1=\"b\".*java.lang.RuntimeException.*test.*",
+				"SessionResult.*party2.*profile2.*,.*party1.*profile1.*Bid.*issue1=\"b\".*java.lang.RuntimeException.*test.*",
+				"SessionResult.*party1.*profile1.*,.*party2.*profile2.*Bid.*issue1=\"a\".*null.*");
 	}
 
Index: otocol/src/test/java/geniusweb/protocol/session/TeamInfoTest.java
===================================================================
--- /protocol/src/test/java/geniusweb/protocol/session/TeamInfoTest.java	(revision 53)
+++ 	(revision )
@@ -1,73 +1,0 @@
-package geniusweb.protocol.session;
-
-import static org.junit.Assert.assertEquals;
-
-import java.io.IOException;
-import java.net.URISyntaxException;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-import org.junit.Before;
-import org.junit.Test;
-
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.databind.ObjectMapper;
-
-import geniusweb.references.Parameters;
-import geniusweb.references.PartyRef;
-import geniusweb.references.PartyWithParameters;
-import geniusweb.references.ProfileRef;
-import tudelft.utilities.junit.GeneralTests;
-
-public class TeamInfoTest extends GeneralTests<TeamInfo> {
-
-	private TeamInfo team1 = new TeamInfo(Collections.emptyList());
-	private TeamInfo team1a = new TeamInfo(Collections.emptyList());
-	private PartyRef partyref;
-	private Parameters parameters = new Parameters();;
-	private ProfileRef profileref;
-	private TeamInfo team2, team2a;
-	private String asString1 = "{\"TeamInfo\":{\"parties\":[{\"party\":{\"partyref\":\"party1\",\"parameters\":{}},\"profile\":\"profile1\"}]}}";
-
-	@Before
-	public void before() throws URISyntaxException {
-		partyref = new PartyRef("party1");
-		profileref = new ProfileRef("profile1");
-		team2 = new TeamInfo(new PartyWithParameters(partyref, parameters),
-				profileref);
-		team2a = new TeamInfo(new PartyWithParameters(partyref, parameters),
-				profileref);
-
-	}
-
-	@Override
-	public List<List<TeamInfo>> getGeneralTestData() {
-		return Arrays.asList(Arrays.asList(team1, team1a),
-				Arrays.asList(team2, team2a));
-	}
-
-	@Override
-	public List<String> getGeneralTestStrings() {
-		return Arrays.asList("TeamInfo.\\[\\].",
-				"TeamInfo.\\[PartyWithProfile.*party1.*profile1.*\\].*");
-	}
-
-	@Test
-	public void testSerialize() throws JsonProcessingException {
-
-		ObjectMapper jackson = new ObjectMapper();
-		System.out.println(jackson.writeValueAsString(team2));
-		assertEquals(asString1, jackson.writeValueAsString(team2));
-
-	}
-
-	@Test
-	public void testDeserialize() throws IOException {
-
-		ObjectMapper jackson = new ObjectMapper();
-		TeamInfo read = jackson.readValue(asString1, TeamInfo.class);
-		assertEquals(team2, read);
-	}
-
-}
Index: /protocol/src/test/java/geniusweb/protocol/session/saop/SAOPSettingsTest.java
===================================================================
--- /protocol/src/test/java/geniusweb/protocol/session/saop/SAOPSettingsTest.java	(revision 53)
+++ /protocol/src/test/java/geniusweb/protocol/session/saop/SAOPSettingsTest.java	(revision 1)
@@ -20,8 +20,7 @@
 import geniusweb.deadline.DeadlineTime;
 import geniusweb.protocol.session.SessionSettings;
-import geniusweb.protocol.session.TeamInfo;
-import geniusweb.references.Parameters;
+import geniusweb.protocol.session.saop.SAOPSettings;
 import geniusweb.references.PartyRef;
-import geniusweb.references.PartyWithParameters;
+import geniusweb.references.PartyWithProfile;
 import geniusweb.references.ProfileRef;
 import tudelft.utilities.junit.GeneralTests;
@@ -30,11 +29,11 @@
 public class SAOPSettingsTest extends GeneralTests<SAOPSettings> {
 
-	private TeamInfo partyprof1 = mock(TeamInfo.class);
-	private TeamInfo partyprof2 = mock(TeamInfo.class);
-	private TeamInfo partyprof3 = mock(TeamInfo.class);
-	private List<TeamInfo> participants2 = Arrays.asList(partyprof1,
+	private PartyWithProfile partyprof1 = mock(PartyWithProfile.class);
+	private PartyWithProfile partyprof2 = mock(PartyWithProfile.class);
+	private PartyWithProfile partyprof3 = mock(PartyWithProfile.class);
+	private List<PartyWithProfile> participants2 = Arrays.asList(partyprof1,
 			partyprof2);
-	private List<TeamInfo> participants3 = Arrays.asList(partyprof1, partyprof2,
-			partyprof3);
+	private List<PartyWithProfile> participants3 = Arrays.asList(partyprof1,
+			partyprof2, partyprof3);
 
 	private DeadlineTime deadline = mock(DeadlineTime.class);
@@ -47,5 +46,5 @@
 
 	private SAOPSettings sersettings;
-	private final String serialized = "{\"SAOPSettings\":{\"participants\":[{\"TeamInfo\":{\"parties\":[{\"party\":{\"partyref\":\"http://party1\",\"parameters\":{}},\"profile\":\"http://profile1\"}]}},{\"TeamInfo\":{\"parties\":[{\"party\":{\"partyref\":\"http://party2\",\"parameters\":{}},\"profile\":\"http://profile2\"}]}}],\"deadline\":{\"DeadlineTime\":{\"durationms\":100}}}}";
+	private final String serialized = "{\"SAOPSettings\":{\"participants\":[{\"party\":\"http://party1\",\"profile\":\"http://profile1\"},{\"party\":\"http://party2\",\"profile\":\"http://profile2\"}],\"deadline\":{\"deadlinetime\":{\"durationms\":100}}}}";
 
 	@Before
@@ -55,8 +54,4 @@
 		when(deadline2.toString()).thenReturn("deadline2");
 
-		when(partyprof1.getSize()).thenReturn(1);
-		when(partyprof2.getSize()).thenReturn(1);
-		when(partyprof3.getSize()).thenReturn(1);
-
 		when(partyprof1.toString()).thenReturn("party and profile 1");
 		when(partyprof2.toString()).thenReturn("party and profile 2");
@@ -65,13 +60,13 @@
 		// SERIALIZABLE version with REAL objects. Still no workaround for
 		// this...
-		PartyWithParameters party1 = new PartyWithParameters(
-				new PartyRef("http://party1"), new Parameters());
+		PartyRef party1 = new PartyRef("http://party1");
 		ProfileRef profile1 = new ProfileRef("http://profile1");
-		PartyWithParameters party2 = new PartyWithParameters(
-				new PartyRef("http://party2"), new Parameters());
+		PartyRef party2 = new PartyRef("http://party2");
 		ProfileRef profile2 = new ProfileRef("http://profile2");
-		TeamInfo partywithprof1 = new TeamInfo(party1, profile1);
-		TeamInfo partywithprof2 = new TeamInfo(party2, profile2);
-		List<TeamInfo> participants = Arrays.asList(partywithprof1,
+		PartyWithProfile partywithprof1 = new PartyWithProfile(party1,
+				profile1);
+		PartyWithProfile partywithprof2 = new PartyWithProfile(party2,
+				profile2);
+		List<PartyWithProfile> participants = Arrays.asList(partywithprof1,
 				partywithprof2);
 
@@ -143,5 +138,5 @@
 		SAOPSettings saop = new SAOPSettings(participants2, deadline);
 		SessionSettings saop2 = saop.with(partyprof3);
-		assertEquals(3, saop2.getTeams().size());
+		assertEquals(3, saop2.getParticipants().size());
 	}
 
Index: /protocol/src/test/java/geniusweb/protocol/session/saop/SAOPStateTest.java
===================================================================
--- /protocol/src/test/java/geniusweb/protocol/session/saop/SAOPStateTest.java	(revision 53)
+++ /protocol/src/test/java/geniusweb/protocol/session/saop/SAOPStateTest.java	(revision 1)
@@ -9,6 +9,4 @@
 import static org.mockito.Mockito.when;
 
-import java.io.IOException;
-import java.net.URISyntaxException;
 import java.util.Arrays;
 import java.util.Date;
@@ -18,7 +16,4 @@
 import org.junit.Before;
 import org.junit.Test;
-
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.databind.ObjectMapper;
 
 import geniusweb.actions.Accept;
@@ -27,19 +22,12 @@
 import geniusweb.actions.Offer;
 import geniusweb.actions.PartyId;
-import geniusweb.deadline.Deadline;
-import geniusweb.deadline.DeadlineTime;
 import geniusweb.issuevalue.Bid;
 import geniusweb.progress.Progress;
 import geniusweb.progress.ProgressRounds;
 import geniusweb.progress.ProgressTime;
-import geniusweb.protocol.NegoState;
 import geniusweb.protocol.ProtocolException;
-import geniusweb.protocol.partyconnection.ProtocolToPartyConn;
-import geniusweb.protocol.session.TeamInfo;
-import geniusweb.references.Parameters;
-import geniusweb.references.PartyRef;
-import geniusweb.references.PartyWithParameters;
-import geniusweb.references.PartyWithProfile;
-import geniusweb.references.ProfileRef;
+import geniusweb.protocol.partyconnection.ConnectionWithParties;
+import geniusweb.protocol.partyconnection.ConnectionWithParty;
+import geniusweb.protocol.session.SessionSettings;
 import tudelft.utilities.junit.GeneralTests;
 
@@ -50,21 +38,24 @@
 	private PartyId party2 = new PartyId("party2");
 	private PartyId party3 = new PartyId("party3");
-	private List<Action> actions1 = new LinkedList<>();
+	private List<Action> actions = new LinkedList<>();
 	private Action action = mock(Action.class);
 	private List<Action> actions2 = Arrays.asList(action);
 
-	private ProtocolToPartyConn party1conn = mock(ProtocolToPartyConn.class);
-	private ProtocolToPartyConn party2conn = mock(ProtocolToPartyConn.class);
-	private ProtocolToPartyConn party3conn = mock(ProtocolToPartyConn.class);
-
-	private List<PartyId> connections = Arrays.asList(party1, party2);
-	private List<PartyId> connections2 = Arrays.asList(party1, party3);
-	private List<PartyId> connections3 = Arrays.asList(party1, party2, party3);
+	private ConnectionWithParty party1conn = mock(ConnectionWithParty.class);
+	private ConnectionWithParty party2conn = mock(ConnectionWithParty.class);
+	private ConnectionWithParty party3conn = mock(ConnectionWithParty.class);
+
+	private ConnectionWithParties connections = new ConnectionWithParties(
+			Arrays.asList(party1conn, party2conn));
+	private ConnectionWithParties connections2 = new ConnectionWithParties(
+			Arrays.asList(party1conn, party3conn));
+	private ConnectionWithParties connections3 = new ConnectionWithParties(
+			Arrays.asList(party1conn, party2conn, party3conn));
 
 	private Progress progresstime = mock(ProgressTime.class);
 	private ProgressRounds progressrounds = mock(ProgressRounds.class);
 	private ProgressRounds progressrounds1 = mock(ProgressRounds.class);
-	private SAOPSettings settings = mock(SAOPSettings.class);
-	private SAOPState state, state1, state1a, state2, state3, state4;
+	private SessionSettings settings = mock(SAOPSettings.class);
+	private SAOPState state1, state1a, state2, state3, state4;
 
 	private Bid bid1 = mock(Bid.class);
@@ -76,10 +67,6 @@
 	private EndNegotiation endNegotiation1 = new EndNegotiation(party1);
 
-	private final ObjectMapper jackson = new ObjectMapper();
-
-	private String serialized = "{\"SAOPState\":{\"actions\":[],\"connections\":[\"party1\",\"party2\"],\"progress\":{\"ProgressTime\":{\"duration\":1000000,\"start\":2000000}},\"settings\":{\"SAOPSettings\":{\"participants\":[{\"TeamInfo\":{\"parties\":[{\"party\":{\"partyref\":\"party1ref\",\"parameters\":{}},\"profile\":\"prof1\"}]}}],\"deadline\":{\"DeadlineTime\":{\"durationms\":123000}}}},\"partyprofiles\":{},\"error\":null}}";
-
 	@Before
-	public void before() throws URISyntaxException {
+	public void before() {
 		when(party1conn.getParty()).thenReturn(party1);
 		when(party2conn.getParty()).thenReturn(party2);
@@ -96,26 +83,14 @@
 		when(progressrounds.advance()).thenReturn(progressrounds1);
 
-		state1 = new SAOPState(actions1, connections, progresstime, settings,
-				null, null);
-		state1a = new SAOPState(actions1, connections, progresstime, settings,
+		state1 = new SAOPState(actions, connections, progresstime, settings,
+				null, null);
+		state1a = new SAOPState(actions, connections, progresstime, settings,
 				null, null);
 		state2 = new SAOPState(actions2, connections, progresstime, settings,
 				null, null);
-		state3 = new SAOPState(actions1, connections2, progresstime, settings,
-				null, null);
-		state4 = new SAOPState(actions1, connections, progressrounds, settings,
-				null, null);
-
-		List<PartyId> conns = Arrays.asList(party1, party2);
-		PartyWithParameters pwithp = new PartyWithParameters(
-				new PartyRef("party1ref"), new Parameters());
-		List<PartyWithProfile> teams = Arrays
-				.asList(new PartyWithProfile(pwithp, new ProfileRef("prof1")));
-		List<TeamInfo> participants = Arrays.asList(new TeamInfo(teams));
-		Deadline deadline = new DeadlineTime(123000);
-		SAOPSettings setts = new SAOPSettings(participants, deadline);
-		state = new SAOPState(actions1, conns,
-				new ProgressTime(1000000l, new Date(2000000l)), setts, null,
-				null);
+		state3 = new SAOPState(actions, connections2, progresstime, settings,
+				null, null);
+		state4 = new SAOPState(actions, connections, progressrounds, settings,
+				null, null);
 
 	}
@@ -131,19 +106,19 @@
 	public List<String> getGeneralTestStrings() {
 		return Arrays.asList(
-				"SAOPState.*\\[\\].*party1.*party2.*ProgressTime.*",
-				"SAOPState.*\\[act1\\].*party1.*party2.*ProgressTime.*",
-				"SAOPState.*party1.*party3.*ProgressTime.*",
-				"SAOPState.*party1.*party2.*ProgressRounds.*");
+				"SAOPState.*\\[\\].*ConnectionWithParties.*conn1.*conn2.*ProgressTime.*",
+				"SAOPState.*\\[act1\\].*ConnectionWithParties.*conn1.*conn2.*ProgressTime.*",
+				"SAOPState.*ConnectionWithParties.*conn1.*conn3.*ProgressTime.*",
+				"SAOPState.*ConnectionWithParties.*conn1.*conn2.*ProgressRounds.*");
 	}
 
 	@Test
 	public void constructWith0Connection() {
-		new SAOPState(actions1, Arrays.asList(), progresstime, settings, null,
-				null);
+		new SAOPState(actions, new ConnectionWithParties(Arrays.asList()),
+				progresstime, settings, null, null);
 	}
 
 	@Test
 	public void constructWithNullConnection() {
-		SAOPState state = new SAOPState(actions1, null, progresstime, settings,
+		SAOPState state = new SAOPState(actions, null, progresstime, settings,
 				null, null);
 		assertEquals(0, state.getConnections().size());
@@ -157,6 +132,7 @@
 	@Test
 	public void testNextActor2() {
-		List<PartyId> conns = Arrays.asList(party2, party3);
-		SAOPState state = new SAOPState(actions1, conns, progresstime, settings,
+		ConnectionWithParties conns = new ConnectionWithParties(
+				Arrays.asList(party2conn, party3conn));
+		SAOPState state = new SAOPState(actions, conns, progresstime, settings,
 				null, null);
 		assertEquals(party2, state.getNextActor());
@@ -182,5 +158,5 @@
 	public void isFinalTest() {
 		assertFalse(state1.isFinal(NOW));
-		SAOPState state = new SAOPState(actions1, connections, progresstime,
+		SAOPState state = new SAOPState(actions, connections, progresstime,
 				settings, null, mock(ProtocolException.class));
 		assertTrue(state.isFinal(NOW));
@@ -200,5 +176,5 @@
 		SAOPState state = new SAOPState(actions, connections3, progressrounds,
 				settings, null, null);
-		assertTrue(state.getAgreements().getMap().isEmpty());
+		assertNull(state.getAgreement());
 	}
 
@@ -208,5 +184,5 @@
 		SAOPState state = new SAOPState(actions, connections3, progressrounds,
 				settings, null, null);
-		assertTrue(state.getAgreements().getMap().isEmpty());
+		assertNull(state.getAgreement());
 	}
 
@@ -216,5 +192,5 @@
 		SAOPState state = new SAOPState(actions, connections3, progressrounds,
 				settings, null, null);
-		assertTrue(state.getAgreements().getMap().isEmpty());
+		assertNull(state.getAgreement());
 	}
 
@@ -224,5 +200,5 @@
 		SAOPState state = new SAOPState(actions, connections3, progressrounds,
 				settings, null, null);
-		assertEquals(bid1, state.getAgreements().getMap().get(party1));
+		assertEquals(bid1, state.getAgreement());
 		assertTrue(state.isFinal(NOW));
 	}
@@ -233,5 +209,5 @@
 		SAOPState state = new SAOPState(actions, connections3, progressrounds,
 				settings, null, null);
-		assertTrue(state.getAgreements().getMap().isEmpty());
+		assertEquals(null, state.getAgreement());
 	}
 
@@ -241,16 +217,30 @@
 		SAOPState state = new SAOPState(actions, connections3, progressrounds,
 				settings, null, null);
-		assertTrue(state.getAgreements().getMap().isEmpty());
-	}
-
-	@Test(expected = IllegalArgumentException.class)
+		assertEquals(null, state.getAgreement());
+	}
+
+	@Test
+	public void withWrongActionTest() {
+		// wrong because action has actor null which does not match party1
+		SAOPState state = state1.with(party1, action);
+		assertEquals(1, state.getActions().size());
+		assertEquals(action, state.getActions().get(0));
+		assertTrue(state.isFinal(NOW));
+		assertEquals(
+				"geniusweb.protocol.ProtocolException: party1:act contains wrong credentials: act1",
+				state.getError().toString());
+	}
+
+	@Test
 	public void withActionTest() {
 		when(action.getActor()).thenReturn(party1);
-		state1.with(party1, action);
+		SAOPState state = state1.with(party1, action);
+		assertEquals(1, state.getActions().size());
+		assertEquals(action, state.getActions().get(0));
 	}
 
 	@Test
 	public void withConnectionTest() {
-		SAOPState state = state1.with(party3, (PartyWithProfile) null);
+		SAOPState state = state1.with(party3conn, null);
 		assertEquals(3, state.getConnections().size());
 	}
@@ -261,5 +251,5 @@
 		SAOPState state = new SAOPState(actions, connections3, progressrounds,
 				settings, null, null);
-		assertTrue(state.getAgreements().getMap().isEmpty());
+		assertEquals(null, state.getAgreement());
 		assertEquals(null, state.getError());
 		assertTrue(state.isFinal(NOW));
@@ -269,18 +259,21 @@
 	@Test
 	public void isProtocolErrorFinal() {
-		SAOPState state = new SAOPState(actions1, connections3, progressrounds,
-				settings, null,
-				new ProtocolException("test error", new PartyId("test")));
+		SAOPState state = new SAOPState(actions, connections3, progressrounds,
+				settings, null, new ProtocolException("test error", "test"));
 		assertTrue(state.isFinal(NOW));
 		assertNotNull(state.getError());
 	}
 
-	@Test(expected = IllegalArgumentException.class)
+	@Test
 	public void RefuseImmediateAccept() {
 		Accept nullaccept = new Accept(party1, null);
-		state1.with(party1, nullaccept);
-	}
-
-	@Test(expected = IllegalArgumentException.class)
+		SAOPState state = state1.with(party1, nullaccept);
+		assertTrue(state.isFinal(NOW));
+		assertEquals(
+				"geniusweb.protocol.ProtocolException: party1:Accept without a recent offer",
+				state.getError().toString());
+	}
+
+	@Test
 	public void RefuseNotMyTurn() {
 		List<Action> actions = Arrays.asList(offer1);
@@ -288,8 +281,12 @@
 				settings, null, null);
 
-		state.with(party1, offer1);
-	}
-
-	@Test(expected = IllegalArgumentException.class)
+		state = state.with(party1, offer1);
+		assertTrue(state.isFinal(NOW));
+		assertEquals(
+				"geniusweb.protocol.ProtocolException: party1:actor does not have the turn ",
+				state.getError().toString());
+	}
+
+	@Test
 	public void RefuseNullAccept() {
 		List<Action> actions = Arrays.asList(offer1);
@@ -300,7 +297,9 @@
 		state = state.with(party2, nullaccept);
 		assertTrue(state.isFinal(NOW));
-	}
-
-	@Test(expected = IllegalArgumentException.class)
+		assertTrue(state.getError().toString()
+				.matches(".*party2.*Accepts a bid that was not offered.*"));
+	}
+
+	@Test
 	public void RefuseNullAction() {
 		List<Action> actions = Arrays.asList(offer1);
@@ -308,5 +307,8 @@
 				settings, null, null);
 
-		state = state.with(party2, (Action) null);
+		state = state.with(party2, null);
+		assertEquals(
+				"geniusweb.protocol.ProtocolException: party2:action is null",
+				state.getError().toString());
 	}
 
@@ -321,5 +323,5 @@
 		assertTrue(state.isFinal(NOW));
 		assertNull(state.getError());
-		assertEquals(bid1, state.getAgreements().getMap().get(party1));
+		assertEquals(bid1, state.getAgreement());
 
 	}
@@ -337,23 +339,6 @@
 		assertTrue(state.isFinal(NOW));
 		assertNull(state.getError());
-		assertEquals(bid2, state.getAgreements().getMap().get(party1));
-
-	}
-
-	@Test
-	public void testDeserialize() throws IOException {
-		NegoState obj = jackson.readValue(serialized, NegoState.class);
-		System.out.println(obj);
-		assertEquals(state, obj);
-	}
-
-	@Test
-	public void testSerialize()
-			throws JsonProcessingException, URISyntaxException {
-
-		String string = jackson.writeValueAsString(state);
-		System.out.println(string);
-		assertEquals(serialized, string);
-	}
-
+		assertEquals(bid2, state.getAgreement());
+
+	}
 }
Index: /protocol/src/test/java/geniusweb/protocol/session/saop/SAOPTest.java
===================================================================
--- /protocol/src/test/java/geniusweb/protocol/session/saop/SAOPTest.java	(revision 53)
+++ /protocol/src/test/java/geniusweb/protocol/session/saop/SAOPTest.java	(revision 1)
@@ -3,8 +3,7 @@
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyLong;
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.ArgumentMatchers.isA;
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyLong;
+import static org.mockito.Matchers.eq;
 import static org.mockito.Mockito.doThrow;
 import static org.mockito.Mockito.mock;
@@ -17,5 +16,4 @@
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.Collections;
 import java.util.Date;
 import java.util.HashMap;
@@ -23,9 +21,9 @@
 import java.util.Map;
 
-import org.junit.Before;
 import org.junit.Test;
 import org.mockito.ArgumentCaptor;
 
 import geniusweb.actions.Accept;
+import geniusweb.actions.Action;
 import geniusweb.actions.EndNegotiation;
 import geniusweb.actions.Offer;
@@ -35,18 +33,17 @@
 import geniusweb.events.CurrentState;
 import geniusweb.events.ProtocolEvent;
-import geniusweb.inform.ActionDone;
-import geniusweb.inform.Agreements;
-import geniusweb.inform.Finished;
-import geniusweb.inform.Settings;
-import geniusweb.inform.YourTurn;
+import geniusweb.party.inform.Finished;
+import geniusweb.party.inform.Inform;
+import geniusweb.party.inform.Settings;
+import geniusweb.party.inform.YourTurn;
 import geniusweb.progress.Progress;
 import geniusweb.protocol.ProtocolException;
-import geniusweb.protocol.partyconnection.ProtocolToPartyConn;
-import geniusweb.protocol.partyconnection.ProtocolToPartyConnFactory;
-import geniusweb.protocol.partyconnection.ProtocolToPartyConnections;
-import geniusweb.protocol.session.TeamInfo;
-import geniusweb.references.Parameters;
+import geniusweb.protocol.partyconnection.ConnectionWithParties;
+import geniusweb.protocol.partyconnection.ConnectionWithParty;
+import geniusweb.protocol.partyconnection.ConnectionWithPartyFactory;
+import geniusweb.protocol.session.saop.SAOP;
+import geniusweb.protocol.session.saop.SAOPSettings;
+import geniusweb.protocol.session.saop.SAOPState;
 import geniusweb.references.PartyRef;
-import geniusweb.references.PartyWithParameters;
 import geniusweb.references.PartyWithProfile;
 import geniusweb.references.ProfileRef;
@@ -66,5 +63,4 @@
  */
 public class SAOPTest {
-
 	private final SAOPState state = mock(SAOPState.class),
 			connectedstate = mock(SAOPState.class),
@@ -72,6 +68,5 @@
 			finalstate = mock(SAOPState.class);
 
-	private static final long DEADLINE = 1000l;
-	private ProtocolRef SAOPPROTOCOL;
+	private final ProtocolRef SAOP;
 	private static final PartyId PARTY2ID = new PartyId("party2");
 	private static final PartyId PARTY1ID = new PartyId("party1");
@@ -79,65 +74,44 @@
 	private final PartyRef party2ref = mock(PartyRef.class);
 	private final SAOPSettings settings = mock(SAOPSettings.class);
-	private final TeamInfo team1 = mock(TeamInfo.class);
-	private final TeamInfo team2 = mock(TeamInfo.class);
+	private final PartyWithProfile party1 = mock(PartyWithProfile.class);
+	private final PartyWithProfile party2 = mock(PartyWithProfile.class);
 	private SAOP saop;
-	private ProtocolToPartyConnFactory factory;
-	private List<ProtocolToPartyConn> connections;
-	private ProtocolToPartyConn conn1 = mock(ProtocolToPartyConn.class),
-			conn2 = mock(ProtocolToPartyConn.class);
-	private Map<PartyId, TeamInfo> partyprofiles;
+	private ConnectionWithPartyFactory factory;
+	private List connections;
+	private ConnectionWithParty conn1 = mock(ConnectionWithParty.class),
+			conn2 = mock(ConnectionWithParty.class);
+	private Map<PartyId, PartyWithProfile> partyprofiles;
 	private Progress progress = mock(Progress.class);
 	private ProfileRef profile1;
 	private ProfileRef profile2;
-	private ProtocolToPartyConnections connectionswithparties;// = new
-																// ProtocolTmock(
-																// ProtocolToPartyConnections.class);;
+	private ConnectionWithParties connectionswithparties = mock(
+			ConnectionWithParties.class);;
 	@SuppressWarnings("unchecked")
 	private final Listener<ProtocolEvent> testlistener = mock(Listener.class);
-	private final Parameters parameters = new Parameters();
-
-//	private final long NOW = 1000;
-	private final PartyWithParameters partywithparam1 = new PartyWithParameters(
-			party1ref, parameters);
-	private final PartyWithParameters partywithparam2 = new PartyWithParameters(
-			party2ref, parameters);
+
+	private final long NOW = 1000;
 
 	private final Deadline deadlinetime = mock(DeadlineTime.class);
 
-	private Map<PartyId, PartyWithProfile> pwpmap;
-
-	@Before
-	public void before()
+	public SAOPTest()
 			throws URISyntaxException, IOException, NoResourcesNowException {
-		SAOPPROTOCOL = new ProtocolRef("SAOP");
-
-		profile1 = mock(ProfileRef.class);
-		profile2 = mock(ProfileRef.class);
-
-		PartyWithProfile pwp1 = new PartyWithProfile(partywithparam1, profile1);
-		PartyWithProfile pwp2 = new PartyWithProfile(partywithparam2, profile2);
-		when(team1.getParties()).thenReturn(Arrays.asList(pwp1));
-		when(team2.getParties()).thenReturn(Arrays.asList(pwp2));
+		SAOP = new ProtocolRef("SAOP");
+		when(party1.getParty()).thenReturn(party1ref);
+		when(party2.getParty()).thenReturn(party2ref);
 
 		partyprofiles = new HashMap<>();
-		partyprofiles.put(PARTY1ID, team1);
-		partyprofiles.put(PARTY2ID, team2);
-
-		pwpmap = new HashMap<>();
-		pwpmap.put(PARTY1ID, pwp1);
-		pwpmap.put(PARTY2ID, pwp2);
-
-		when(deadlinetime.getDuration()).thenReturn(DEADLINE);
-
-		List<TeamInfo> teams = new ArrayList<>();
-		teams.add(team1);
-		teams.add(team2);
-		when(settings.getTeams()).thenReturn(teams);
-		when(settings.getAllParties()).thenReturn(Arrays.asList(pwp1, pwp2));
+		partyprofiles.put(PARTY1ID, party1);
+		partyprofiles.put(PARTY2ID, party2);
+
+		when(deadlinetime.getDuration()).thenReturn(1000l);
+
+		List<PartyWithProfile> participants = new ArrayList<>();
+		participants.add(party1);
+		participants.add(party2);
+		when(settings.getParticipants()).thenReturn(participants);
 		when(settings.getDeadline()).thenReturn(deadlinetime);
 
-		factory = mock(ProtocolToPartyConnFactory.class);
-		// connections = mock(List.class);
-		connections = Arrays.asList(conn1, conn2);
+		factory = mock(ConnectionWithPartyFactory.class);
+		connections = mock(List.class);
 		when(factory.connect(any(List.class))).thenReturn(connections);
 
@@ -147,30 +121,25 @@
 		when(conn2.getParty()).thenReturn(PARTY2ID);
 
-		mockState(connectedstate, "connected state", true);
-		mockState(state, "running state", true);
-		mockState(finalstate, "final state", true);
+		profile1 = mock(ProfileRef.class);
+		when(party1.getProfile()).thenReturn(profile1);
+		profile2 = mock(ProfileRef.class);
+		when(party2.getProfile()).thenReturn(profile2);
+
+		mockState(connectedstate, "connected state");
+		mockState(state, "initial state");
+		mockState(finalstate, "final state");
 		when(finalstate.isFinal(anyLong())).thenReturn(true);
-		mockState(failstate, "fail state", true);
+		mockState(failstate, "fail state");
 		when(failstate.isFinal(anyLong())).thenReturn(true);
 
-		connectionswithparties = new ProtocolToPartyConnections(
-				Arrays.asList(conn1, conn2));
-
-//		when(connectionswithparties.get(eq(PARTY1ID))).thenReturn(conn1);
-//		when(connectionswithparties.get(eq(PARTY2ID))).thenReturn(conn2);
+		when(connectionswithparties.get(eq(PARTY1ID))).thenReturn(conn1);
+		when(connectionswithparties.get(eq(PARTY2ID))).thenReturn(conn2);
 		// HACK thenReturn twice, so that 2nd call to iterator() returns new
 		// iterator instead of the old one
-//		when(connectionswithparties.iterator())
-//				.thenReturn(Arrays.asList(conn1, conn2).iterator())
-//				.thenReturn(Arrays.asList(conn1, conn2).iterator());
-		Map<PartyId, PartyWithProfile> profilesmap = new HashMap<>();
-		profilesmap.put(PARTY1ID, pwp1);
-		profilesmap.put(PARTY2ID, pwp2);
-		when(state.getPartyProfiles()).thenReturn(profilesmap);
-
-		saop = new SAOP(state, new ReportToLogger("test"),
-				connectionswithparties);
+		when(connectionswithparties.iterator())
+				.thenReturn(Arrays.asList(conn1, conn2).iterator())
+				.thenReturn(Arrays.asList(conn1, conn2).iterator());
+		saop = new SAOP(state, new ReportToLogger("test"));
 		saop.addListener(testlistener);
-
 	}
 
@@ -179,20 +148,13 @@
 	 * 
 	 * @param state  the state to mock (must be already
-	 * @param asText short name for the state, for debugging
-	 * @param bool   true if parties are connected
+	 * @param asText
 	 */
-	private void mockState(SAOPState state, String asText,
-			boolean isConnected) {
+	private void mockState(SAOPState state, String asText) {
 		when(state.getSettings()).thenReturn(settings);
-		if (isConnected) {
-			when(state.getConnections())
-					.thenReturn(Arrays.asList(PARTY1ID, PARTY2ID));
-		} else {
-			when(state.getConnections()).thenReturn(Collections.emptyList());
-		}
-
+		when(state.getConnections()).thenReturn(connectionswithparties);
+		when(state.getPartyProfiles()).thenReturn(partyprofiles);
 		when(state.getProgress()).thenReturn(progress);
-		when(state.with(any(PartyId.class), any(PartyWithProfile.class)))
-				.thenReturn(connectedstate);
+		when(state.with(any(ConnectionWithParty.class),
+				any(PartyWithProfile.class))).thenReturn(connectedstate);
 		when(state.getNextActor()).thenReturn(PARTY1ID);
 		when(state.with(any(PartyId.class), any(EndNegotiation.class)))
@@ -203,6 +165,4 @@
 		when(state.toString()).thenReturn(asText);
 		when(state.with(any(ProtocolException.class))).thenReturn(failstate);
-		when(state.getAgreements()).thenReturn(mock(Agreements.class));
-		when(state.getPartyProfiles()).thenReturn(pwpmap);
 	}
 
@@ -215,5 +175,5 @@
 		when(set.getDeadline()).thenReturn(dl);
 		when(dl.getDuration()).thenReturn(1000l);
-		new SAOP(state1, new ReportToLogger("test"), connectionswithparties);
+		new SAOP(state1, new ReportToLogger("test"));
 		verify(state1, times(0)).with(any(ProtocolException.class));
 		verify(testlistener, times(0)).notifyChange(any(CurrentState.class));
@@ -272,11 +232,11 @@
 				.forClass(Settings.class);
 		verify(conn1).send(actualsettings.capture());
-		assertEquals(new Settings(PARTY1ID, profile1, SAOPPROTOCOL, progress,
-				parameters), actualsettings.getValue());
+		assertEquals(new Settings(PARTY1ID, profile1, SAOP, progress),
+				actualsettings.getValue());
 
 		verify(conn2, times(1)).send(any(Settings.class));
 		verify(conn2).send(actualsettings.capture());
-		assertEquals(new Settings(PARTY2ID, profile2, SAOPPROTOCOL, progress,
-				parameters), actualsettings.getValue());
+		assertEquals(new Settings(PARTY2ID, profile2, SAOP, progress),
+				actualsettings.getValue());
 		verify(state, times(0)).with(any(ProtocolException.class));
 		verify(testlistener, times(0)).notifyChange(any(CurrentState.class));
@@ -286,4 +246,5 @@
 	@Test
 	public void testActionRequestWrongActor() {
+
 		saop.actionRequest(conn2, mock(EndNegotiation.class));
 
@@ -293,7 +254,23 @@
 
 	@Test
-	public void testActionRequest() throws IOException, ProtocolException {
-		saop.nextTurn();
-
+	public void testActionRequest() throws IOException {
+		when(state.getNextActor()).thenReturn(PARTY1ID);
+		when(state.with(any(PartyId.class), any(Action.class)))
+				.thenReturn(state);
+
+		saop.actionRequest(conn1, mock(EndNegotiation.class));
+
+		verify(state, times(0)).with(any(ProtocolException.class));
+		verify(state, times(1)).with(eq(PARTY1ID), any(EndNegotiation.class));
+		verify(connectionswithparties, times(1)).broadcast(any(Inform.class));
+
+		// state.getNextActor() is frozen to PARTY1 by our mocking
+		verify(conn1, times(1)).send(any(YourTurn.class));
+		verify(conn2, times(0)).send(any(YourTurn.class));
+		verify(testlistener, times(0)).notifyChange(any(CurrentState.class));
+	}
+
+	@Test
+	public void testFinalActionRequest() throws IOException {
 		when(state.getNextActor()).thenReturn(PARTY1ID);
 		when(state.with(any(PartyId.class), any(EndNegotiation.class)))
@@ -303,35 +280,10 @@
 
 		verify(state, times(0)).with(any(ProtocolException.class));
-		verify(state, times(1)).with(eq(PARTY1ID), isA((EndNegotiation.class)));
-		// verify broadcast
-		verify(conn1, times(1)).send(isA(ActionDone.class));
-		verify(conn2, times(1)).send(isA(ActionDone.class));
-
-		// state.getNextActor() is frozen to PARTY1 by our mocking
-		verify(conn1, times(1)).send(isA(YourTurn.class));
-		verify(conn2, times(0)).send(isA(YourTurn.class));
-		// listener should be informed about final state.
+		verify(state, times(1)).with(eq(PARTY1ID), any(EndNegotiation.class));
+		verify(connectionswithparties, times(1)).broadcast(any(Finished.class));
 		verify(testlistener, times(1)).notifyChange(any(CurrentState.class));
-	}
-
-	@Test
-	public void testFinalActionRequest() throws IOException, ProtocolException {
-		when(state.getNextActor()).thenReturn(PARTY1ID);
-		when(state.with(any(PartyId.class), any(EndNegotiation.class)))
-				.thenReturn(finalstate);
-		// when(finalstate.getAgreements()).thenReturn(mock(Agreements.class));
-
-		saop.nextTurn(); // ensure we send YourTurn to party1.
-		saop.actionRequest(conn1, mock(EndNegotiation.class));
-
-		verify(state, times(0)).with(any(ProtocolException.class));
-		verify(state, times(1)).with(eq(PARTY1ID), any(EndNegotiation.class));
-		// verify broadcast
-		verify(conn1, times(1)).send(isA(Finished.class));
-		verify(conn2, times(1)).send(isA(Finished.class));
-		verify(testlistener, times(1)).notifyChange(any(CurrentState.class));
-
-		verify(conn1, times(1)).send(isA(YourTurn.class));
-		verify(conn2, times(0)).send(isA(YourTurn.class));
+
+		verify(conn1, times(1)).send(any(YourTurn.class));
+		verify(conn2, times(1)).send(any(YourTurn.class));
 	}
 
@@ -345,7 +297,5 @@
 		doThrow(new IOException("fail sending yourturn")).when(conn1)
 				.send(any(YourTurn.class));
-		// CHECK is the state really final after an exception?
-		when(state.with(any(ProtocolException.class))).thenReturn(finalstate);
-		// when(state.getAgreements()).thenReturn(mock(Agreements.class));
+
 		saop.actionRequest(conn1, mock(Accept.class));
 
@@ -358,5 +308,4 @@
 		doThrow(new IOException("fail sending yourturn")).when(conn1)
 				.send(any(YourTurn.class));
-		// when(failstate.getAgreements()).thenReturn(mock(Agreements.class));
 		// not turn of conn2.
 		saop.actionRequest(conn2, mock(EndNegotiation.class));
@@ -368,7 +317,5 @@
 	@Test
 	public void testActionInFinalState() throws IOException {
-		saop = new SAOP(finalstate, new ReportToLogger("test"),
-				connectionswithparties);
-		// when(finalstate.getAgreements()).thenReturn(mock(Agreements.class));
+		saop = new SAOP(finalstate, new ReportToLogger("test"));
 
 		saop.actionRequest(conn1, mock(Offer.class));
@@ -387,20 +334,3 @@
 		saop.addParticipant(null);
 	}
-
-	@Test
-	public void testDeadlineTimer() throws InterruptedException, IOException {
-		SAOPState unconnectedstate = mock(SAOPState.class);
-		mockState(unconnectedstate, "unconnected state", false);
-		SAOP saopempty = new SAOP(unconnectedstate, new ReportToLogger("test"),
-				new ProtocolToPartyConnections(Collections.emptyList()));
-		saopempty.addListener(testlistener);
-
-		saopempty.start(factory);
-		verify(testlistener, times(0)).notifyChange(any(CurrentState.class));
-		verify(conn1, times(1)).send(isA(YourTurn.class));
-		Thread.sleep(DEADLINE + SAOP.TIME_MARGIN + 100);
-		verify(testlistener, times(1)).notifyChange(any(CurrentState.class));
-		verify(conn1, times(1)).send(isA(Finished.class));
-	}
-
 }
Index: otocol/src/test/java/geniusweb/protocol/session/saop/SaopPartyWithProfileTest.java
===================================================================
--- /protocol/src/test/java/geniusweb/protocol/session/saop/SaopPartyWithProfileTest.java	(revision 53)
+++ 	(revision )
@@ -1,107 +1,0 @@
-package geniusweb.protocol.session.saop;
-
-import static org.junit.Assert.assertEquals;
-
-import java.io.IOException;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.util.Arrays;
-import java.util.List;
-
-import org.junit.Before;
-import org.junit.Test;
-
-import com.fasterxml.jackson.core.JsonParseException;
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.databind.JsonMappingException;
-import com.fasterxml.jackson.databind.ObjectMapper;
-
-import geniusweb.protocol.session.TeamInfo;
-import geniusweb.references.Parameters;
-import geniusweb.references.PartyRef;
-import geniusweb.references.PartyWithParameters;
-import geniusweb.references.ProfileRef;
-import tudelft.utilities.junit.GeneralTests;
-
-public class SaopPartyWithProfileTest extends GeneralTests<TeamInfo> {
-
-	private PartyRef party1, party1a, party2, party3;
-	private ProfileRef profile1, profile2;
-	private TeamInfo partyprof1, partyprof1a, partyprof2, partyprof3,
-			partyprof4;
-	private final String serialized = "{\"TeamInfo\":{\"parties\":[{\"party\":{\"partyref\":\"ws:party1\",\"parameters\":{}},\"profile\":\"ws:profile1\"}]}}";
-
-	@Before
-	public void before() throws URISyntaxException {
-		party1 = new PartyRef(new URI("ws:party1"));
-		party1a = new PartyRef(new URI("ws:party1"));
-		party2 = new PartyRef(new URI("ws:party2"));
-		party3 = new PartyRef(new URI("http:party3"));
-
-		profile1 = new ProfileRef(new URI("ws:profile1"));
-		profile2 = new ProfileRef(new URI("ws:profile2"));
-
-		Parameters settings1 = new Parameters();
-		Parameters settings2 = new Parameters().with("a", 1);
-
-		PartyWithParameters party1withparams1 = new PartyWithParameters(party1,
-				settings1);
-		PartyWithParameters party1withparams2 = new PartyWithParameters(party1,
-				settings2);
-		PartyWithParameters party2withparams1 = new PartyWithParameters(party2,
-				settings1);
-
-		partyprof1 = new TeamInfo(party1withparams1, profile1);
-		partyprof1a = new TeamInfo(party1withparams1, profile1);
-		partyprof2 = new TeamInfo(party2withparams1, profile1);
-		partyprof3 = new TeamInfo(party1withparams1, profile2);
-		partyprof4 = new TeamInfo(party1withparams2, profile1);
-
-	}
-
-	@Override
-	public List<List<TeamInfo>> getGeneralTestData() {
-		return Arrays.asList(Arrays.asList(partyprof1, partyprof1a),
-				Arrays.asList(partyprof2), Arrays.asList(partyprof3),
-				Arrays.asList(partyprof4));
-	}
-
-	@Override
-	public List<String> getGeneralTestStrings() {
-		return Arrays.asList(
-				"TeamInfo.*PartyWithProfile.PartyRef.ws:party1.,ProfileRef.ws:profile1.*",
-				"TeamInfo.*PartyWithProfile.PartyRef.ws:party2.,ProfileRef.ws:profile1.*",
-				"TeamInfo.*PartyWithProfile.PartyRef.ws:party1.,ProfileRef.ws:profile2.*",
-				"TeamInfo.*PartyWithProfile.PartyRef.ws:party1.\\{a=1\\},ProfileRef.ws:profile1.*");
-	}
-
-	@Test
-	public void smokeTest() throws URISyntaxException {
-	}
-
-	@Test(expected = IllegalArgumentException.class)
-	public void nullTest() throws URISyntaxException {
-		new TeamInfo((PartyWithParameters) null, (ProfileRef) null);
-	}
-
-	@Test
-	public void testSerialize() throws JsonProcessingException {
-		ObjectMapper jackson = new ObjectMapper();
-
-		String json = jackson.writeValueAsString(partyprof1);
-		System.out.println(json);
-		assertEquals(serialized, json);
-	}
-
-	@Test
-	public void testDeserialize()
-			throws JsonParseException, JsonMappingException, IOException {
-		ObjectMapper jackson = new ObjectMapper();
-		// always used as part of bigger class, do not include class name
-		// and therfore can not serialize as TeamOfPartiesAndProfiles
-		TeamInfo p = jackson.readValue(serialized, TeamInfo.class);
-		System.out.println(p);
-		assertEquals(partyprof1, p);
-	}
-
-}
Index: /protocol/src/test/java/geniusweb/protocol/tournament/AllPermutationsProtocolTest.java
===================================================================
--- /protocol/src/test/java/geniusweb/protocol/tournament/AllPermutationsProtocolTest.java	(revision 1)
+++ /protocol/src/test/java/geniusweb/protocol/tournament/AllPermutationsProtocolTest.java	(revision 1)
@@ -0,0 +1,181 @@
+package geniusweb.protocol.tournament;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyLong;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import java.math.BigInteger;
+import java.util.LinkedList;
+import java.util.List;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.ArgumentCaptor;
+
+import geniusweb.events.ProtocolEvent;
+import geniusweb.issuevalue.Bid;
+import geniusweb.protocol.CurrentNegoState;
+import geniusweb.protocol.NegoState;
+import geniusweb.protocol.SessionResult;
+import geniusweb.protocol.partyconnection.ConnectionWithPartyFactory;
+import geniusweb.protocol.session.SessionProtocol;
+import geniusweb.protocol.session.SessionSettings;
+import geniusweb.protocol.session.SessionState;
+import geniusweb.protocol.tournament.allpermutations.AllPermutationsProtocol;
+import geniusweb.protocol.tournament.allpermutations.AllPermutationsState;
+import geniusweb.references.PartyWithProfile;
+import geniusweb.references.ProtocolRef;
+import tudelft.utilities.listener.Listener;
+import tudelft.utilities.logging.ReportToLogger;
+
+public class AllPermutationsProtocolTest {
+
+	private final AllPermutationsState state = mock(AllPermutationsState.class),
+			newstate = mock(AllPermutationsState.class);
+	private final ReportToLogger log = new ReportToLogger("test");
+	private final AllPermutationsProtocol app = new AllPermutationsProtocol(
+			state, log);
+	private final ConnectionWithPartyFactory factory = mock(
+			ConnectionWithPartyFactory.class);
+	private final SessionSettings settings = mock(SessionSettings.class);
+	private final SessionState finalsessionstate = mock(SessionState.class);
+	private Bid agreement = mock(Bid.class);
+	private final long NOW = 1000;
+
+	@Before
+	public void before() {
+		when(state.getSize()).thenReturn(BigInteger.ZERO);
+		when(finalsessionstate.isFinal(anyLong())).thenReturn(true);
+		when(finalsessionstate.getSettings()).thenReturn(settings);
+		when(finalsessionstate.getAgreement()).thenReturn(agreement);
+		when(state.with(any())).thenReturn(newstate);
+	}
+
+	@Test
+	public void smokeTest() {
+	}
+
+	@Test
+	public void startTestNoSessions() {
+		AllPermutationsProtocol app = new AllPermutationsProtocol(state, log);
+		app.start(factory);
+
+	}
+
+	@Test
+	public void getDescrTest() {
+		assertNotNull(app.getDescription());
+	}
+
+	@Test
+	public void getStateTest() {
+		assertEquals(state, app.getState());
+	}
+
+	@Test
+	public void getRefTest() {
+		assertEquals("APP", app.getRef().getURI().toString());
+	}
+
+	@Test
+	public void runOneSessionTest() throws InterruptedException {
+		MockSessionProtocol sessionprotocol = startSession();
+		sessionprotocol.getListener();
+	}
+
+	@Test
+	public void runOneSessionAndUnhandledEvent() throws InterruptedException {
+		MockSessionProtocol sessionprotocol = startSession();
+		sessionprotocol.getListener().notifyChange(mock(ProtocolEvent.class));
+		verify(state, times(0)).with(any());
+	}
+
+	/**
+	 * Check that a started session correctly handles a session event.
+	 */
+	@Test
+	public void CurrentNegoStateEventTest() throws InterruptedException {
+		MockSessionProtocol sessionprotocol = startSession();
+
+		CurrentNegoState evt = mock(CurrentNegoState.class);
+		when(evt.getState()).thenReturn(finalsessionstate);
+		sessionprotocol.getListener().notifyChange(evt);
+
+		ArgumentCaptor<SessionResult> argument = ArgumentCaptor
+				.forClass(SessionResult.class);
+		verify(state, times(1)).with(argument.capture());
+		assertEquals(agreement, argument.getValue().getAgreement());
+		assertNull(argument.getValue().getError());
+	}
+
+	private MockSessionProtocol startSession() throws InterruptedException {
+		SessionSettings setting = mock(SessionSettings.class);
+		MockSessionProtocol sessionprotocol = new MockSessionProtocol();
+		when(setting.getProtocol(log)).thenReturn(sessionprotocol);
+		when(state.getNextSettings()).thenReturn(setting);
+
+		app.start(factory);
+		Thread.sleep(500); // allow app to start session
+		// this call should return fine, and have listener registered to our
+		// protocol. app now waits for a notification
+		return sessionprotocol;
+	}
+
+}
+
+/**
+ * 
+ * The protocol needs to record the listners, we need a listener to trigger
+ * further protocol actions. Mockito can't handle this, we mneed our own mock...
+ *
+ */
+class MockSessionProtocol implements SessionProtocol {
+	private final List<Listener<ProtocolEvent>> listeners = new LinkedList<>();
+
+	@Override
+	public void start(ConnectionWithPartyFactory connectionfactory) {
+
+	}
+
+	@Override
+	public String getDescription() {
+		return null;
+	}
+
+	@Override
+	public NegoState getState() {
+		return null;
+	}
+
+	@Override
+	public ProtocolRef getRef() {
+		return null;
+	}
+
+	@Override
+	public void addParticipant(PartyWithProfile party) {
+	}
+
+	@Override
+	public void addListener(Listener<ProtocolEvent> l) {
+		listeners.add(l);
+	}
+
+	@Override
+	public void removeListener(Listener<ProtocolEvent> l) {
+	}
+
+	public Listener<ProtocolEvent> getListener() {
+		if (listeners.size() != 1) {
+			throw new IllegalStateException("Not having exactly 1 listener");
+		}
+		return listeners.get(0);
+	}
+
+}
Index: /protocol/src/test/java/geniusweb/protocol/tournament/AllPermutationsSettingsTest.java
===================================================================
--- /protocol/src/test/java/geniusweb/protocol/tournament/AllPermutationsSettingsTest.java	(revision 1)
+++ /protocol/src/test/java/geniusweb/protocol/tournament/AllPermutationsSettingsTest.java	(revision 1)
@@ -0,0 +1,173 @@
+package geniusweb.protocol.tournament;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.IOException;
+import java.math.BigInteger;
+import java.net.URISyntaxException;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import geniusweb.deadline.DeadlineTime;
+import geniusweb.protocol.session.saop.SAOPSettings;
+import geniusweb.protocol.tournament.TournamentSettings;
+import geniusweb.protocol.tournament.allpermutations.AllPermutationsSettings;
+import geniusweb.references.PartyRef;
+import geniusweb.references.ProfileRef;
+import tudelft.utilities.junit.GeneralTests;
+import tudelft.utilities.logging.ReportToLogger;
+
+public class AllPermutationsSettingsTest
+		extends GeneralTests<AllPermutationsSettings> {
+
+	private final ObjectMapper jackson = new ObjectMapper();
+
+	private final String serialized = "{\"AllPermutationsSettings\":{"
+			+ "\"parties\":[\"party1\",\"party2\"]," + "\"reuseParties\":false,"
+			+ "\"profiles\":[\"profile1\",\"profile2\",\"profile3\"],"
+			+ "\"partiesPerSession\":2,"
+			+ "\"sessionsettings\":{\"SAOPSettings\":{\"participants\":[],\"deadline\":{\"deadlinetime\":{\"durationms\":10000}}}}}}";
+
+	private AllPermutationsSettings settings, settings1a, settings2, settings3,
+			settings4;
+
+	private SAOPSettings saopsettings;
+
+	private ProfileRef profile1, profile2, profile3;
+
+	private List<PartyRef> parties;
+
+	@Before
+	public void before() throws URISyntaxException {
+		PartyRef partyref1 = new PartyRef("party1");
+		PartyRef partyref2 = new PartyRef("party2");
+		PartyRef partyref3 = new PartyRef("party3");
+
+		parties = Arrays.asList(partyref1, partyref2);
+		DeadlineTime deadline = new DeadlineTime(10000);
+
+		saopsettings = new SAOPSettings(Collections.emptyList(), deadline);
+
+		profile1 = new ProfileRef("profile1");
+		profile2 = new ProfileRef("profile2");
+		profile3 = new ProfileRef("profile3");
+
+		List<ProfileRef> profiles = Arrays.asList(profile1, profile2, profile3);
+
+		settings = new AllPermutationsSettings(parties, false, profiles, 2,
+				saopsettings);
+
+		settings1a = new AllPermutationsSettings(parties, false, profiles, 2,
+				saopsettings);
+
+		settings2 = new AllPermutationsSettings(
+				Arrays.asList(partyref1, partyref2, partyref3), false, profiles,
+				2, saopsettings);
+
+		settings3 = new AllPermutationsSettings(parties, true, profiles, 2,
+				saopsettings);
+
+		settings4 = new AllPermutationsSettings(parties, false,
+				Arrays.asList(profile1, profile2, profile3, profile1), 2,
+				saopsettings);
+
+	}
+
+	@Override
+	public List<List<AllPermutationsSettings>> getGeneralTestData() {
+		return Arrays.asList(Arrays.asList(settings, settings1a),
+				Arrays.asList(settings2), Arrays.asList(settings3),
+				Arrays.asList(settings4));
+	}
+
+	@Override
+	public List<String> getGeneralTestStrings() {
+		return Arrays.asList(
+				"AllPermutationsSettings.*party1.*party2.*,false,.*profile1.*profile2.*profile3.*,2,SAOPSettings.*",
+				"AllPermutationsSettings.*party1.*party2.*party3.*,false,.*profile1.*profile2.*profile3.*,2,SAOPSettings.*",
+				"AllPermutationsSettings.*party1.*party2.*,true,.*profile1.*profile2.*profile3.*,2,SAOPSettings.*",
+				"AllPermutationsSettings.*party1.*party2.*,false,.*profile1.*profile2.*profile3.*profile1.*,2,SAOPSettings.*");
+	}
+
+	@Test
+	public void getProtocolTest() {
+		assertEquals("APP", settings.getProtocol(new ReportToLogger("test"))
+				.getRef().getURI().toString());
+	}
+
+	@Test
+	public void testDeserialize() throws IOException {
+		TournamentSettings obj = jackson.readValue(serialized,
+				TournamentSettings.class);
+		System.out.println(obj);
+		assertEquals(settings, obj);
+	}
+
+	@Test
+	public void testSerialize()
+			throws JsonProcessingException, URISyntaxException {
+
+		String string = jackson.writeValueAsString(settings);
+		System.out.println(string);
+		assertEquals(serialized, string);
+	}
+
+	@Test(expected = IllegalArgumentException.class)
+	public void testNullParties() {
+		new AllPermutationsSettings(null, true,
+				Arrays.asList(profile1, profile2, profile3, profile1), 2,
+				saopsettings);
+
+	}
+
+	@Test(expected = IllegalArgumentException.class)
+	public void testNoParties() {
+		new AllPermutationsSettings(Collections.emptyList(), true,
+				Arrays.asList(profile1, profile2, profile3, profile1), 2,
+				saopsettings);
+
+	}
+
+	@Test(expected = IllegalArgumentException.class)
+	public void testNullProfiles() {
+		new AllPermutationsSettings(parties, true, null, 2, saopsettings);
+
+	}
+
+	@Test(expected = IllegalArgumentException.class)
+	public void testInsufficientProfiles() {
+		new AllPermutationsSettings(parties, true,
+				Arrays.asList(profile1, profile2, profile3, profile1), 4,
+				saopsettings);
+
+	}
+
+	@Test(expected = IllegalArgumentException.class)
+	public void testNullSessionSettings() {
+		new AllPermutationsSettings(parties, true,
+				Arrays.asList(profile1, profile2, profile3, profile1), 4, null);
+
+	}
+
+	@Test(expected = IllegalArgumentException.class)
+	public void testOnePartyPerSession() {
+		new AllPermutationsSettings(parties, true,
+				Arrays.asList(profile1, profile2, profile3, profile1), 1,
+				saopsettings);
+
+	}
+
+	@Test
+	public void getMaxRuntimeTest() {
+		assertEquals(BigInteger.valueOf(6), settings.permutations().size());
+		assertEquals((Double) (6d * 12), settings.getMaxRunTime());
+	}
+
+}
Index: /protocol/src/test/java/geniusweb/protocol/tournament/AllPermutationsStateTest.java
===================================================================
--- /protocol/src/test/java/geniusweb/protocol/tournament/AllPermutationsStateTest.java	(revision 1)
+++ /protocol/src/test/java/geniusweb/protocol/tournament/AllPermutationsStateTest.java	(revision 1)
@@ -0,0 +1,96 @@
+package geniusweb.protocol.tournament;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import java.math.BigInteger;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.junit.Test;
+
+import geniusweb.protocol.SessionResult;
+import geniusweb.protocol.session.SessionSettings;
+import geniusweb.protocol.tournament.allpermutations.AllPermutationsSettings;
+import geniusweb.protocol.tournament.allpermutations.AllPermutationsState;
+import geniusweb.references.PartyWithProfile;
+import tudelft.utilities.immutablelist.ImmutableList;
+
+public class AllPermutationsStateTest {
+
+	private final AllPermutationsSettings toursettings = mock(
+			AllPermutationsSettings.class);;
+	@SuppressWarnings("unchecked")
+	private final List<SessionResult> results = mock(List.class);
+	@SuppressWarnings("unchecked")
+	private final ImmutableList<SessionSettings> settings = mock(
+			ImmutableList.class);
+	private final AllPermutationsState state = new AllPermutationsState(
+			toursettings, settings, results);
+	private final SessionSettings session7settings = mock(
+			SessionSettings.class);
+	private final long NOW = 1000;
+
+	@SuppressWarnings("unchecked")
+	private final List<PartyWithProfile> participants = mock(List.class);
+
+	@Test
+	public void getResultsTest() {
+		assertEquals(results, state.getResults());
+	}
+
+	@Test
+	public void isFinalTestFalse() {
+		when(settings.size()).thenReturn(BigInteger.TEN);
+		when(results.size()).thenReturn(11);
+		assertFalse(state.isFinal(NOW));
+	}
+
+	@Test
+	public void isFinalTestTrue() {
+		when(settings.size()).thenReturn(BigInteger.TEN);
+		when(results.size()).thenReturn(10);
+		assertTrue(state.isFinal(NOW));
+	}
+
+	@Test
+	public void getNextSetting() {
+		prepareNextSettings();
+		assertEquals(session7settings, state.getNextSettings());
+	}
+
+	private void prepareNextSettings() {
+		when(results.size()).thenReturn(7); // result 0..6
+		when(settings.size()).thenReturn(BigInteger.TEN);
+		when(session7settings.getParticipants()).thenReturn(participants);
+		when(settings.get(BigInteger.valueOf(7))).thenReturn(session7settings);
+
+	}
+
+	@Test
+	public void withTest() {
+		prepareNextSettings();
+		ArrayList<SessionResult> results1 = new ArrayList<>();
+		for (int n = 0; n < 7; n++) {
+			results1.add(mock(SessionResult.class));
+		}
+		// use state with "real" results... to allow array copy in with
+		AllPermutationsState state = new AllPermutationsState(toursettings,
+				settings, results1);
+
+		when(settings.size()).thenReturn(BigInteger.TEN);
+		when(settings.get(BigInteger.valueOf(7))).thenReturn(session7settings);
+
+		SessionResult result = mock(SessionResult.class);
+		when(result.getParticipants()).thenReturn(participants);
+		AllPermutationsState state1 = state.with(result);
+
+		assertEquals(null, state1.getError());
+		assertEquals(8, state1.getResults().size());
+		assertEquals(toursettings, state1.getSettings());
+
+	}
+}
Index: otocol/src/test/java/geniusweb/protocol/tournament/TeamTest.java
===================================================================
--- /protocol/src/test/java/geniusweb/protocol/tournament/TeamTest.java	(revision 53)
+++ 	(revision )
@@ -1,51 +1,0 @@
-package geniusweb.protocol.tournament;
-
-import static org.junit.Assert.assertEquals;
-
-import java.net.URISyntaxException;
-import java.util.Arrays;
-import java.util.List;
-
-import org.junit.Before;
-import org.junit.Test;
-
-import geniusweb.references.Parameters;
-import geniusweb.references.PartyRef;
-import geniusweb.references.PartyWithParameters;
-import tudelft.utilities.junit.GeneralTests;
-
-public class TeamTest extends GeneralTests<Team> {
-
-	private Team team1, team1a, team2;
-	private PartyWithParameters pwithp1, pwithp2;
-
-	@Before
-	public void before() throws URISyntaxException {
-		PartyRef partyref1 = new PartyRef("party1");
-		PartyRef partyref2 = new PartyRef("party2");
-		Parameters params1 = new Parameters().with("a", 1);
-		pwithp1 = new PartyWithParameters(partyref1, params1);
-		pwithp2 = new PartyWithParameters(partyref2, params1);
-		team1 = new Team(Arrays.asList(pwithp1));
-		team1a = new Team(Arrays.asList(pwithp1));
-		team2 = new Team(Arrays.asList(pwithp2));
-	}
-
-	@Override
-	public List<List<Team>> getGeneralTestData() {
-		return Arrays.asList(Arrays.asList(team1, team1a),
-				Arrays.asList(team2));
-	}
-
-	@Override
-	public List<String> getGeneralTestStrings() {
-		return Arrays.asList(".PartyRef.party1..a=1..",
-				".PartyRef.party2..a=1..");
-	}
-
-	@Test
-	public void testGet() {
-		assertEquals(Arrays.asList(pwithp1), team1.getParties());
-	}
-
-}
Index: /pythonadapter/pom.xml
===================================================================
--- /pythonadapter/pom.xml	(revision 53)
+++ /pythonadapter/pom.xml	(revision 1)
@@ -6,5 +6,5 @@
 	<groupId>geniusweb</groupId>
 	<artifactId>pythonadapter</artifactId>
-	<version>2.2.1</version>  <!-- equals the geniusweb version -->
+	<version>1.0.0</version>
 	<packaging>jar</packaging>
 
@@ -16,6 +16,5 @@
 		<basedir>.</basedir>
 		<passwd>${env.ARTIFACTORY_PASS}</passwd>
-		<jackson-2-version>2.12.3</jackson-2-version>
-		<geniusweb.version>${project.version}</geniusweb.version>
+		<jackson-2-version>2.9.6</jackson-2-version>
 	</properties>
 
@@ -23,26 +22,22 @@
 		<repository>
 			<id>artifactory.ewi.tudelft.nl</id>
-			<url>https://artifactory.ewi.tudelft.nl/artifactory/libs-release</url>
+			<url>http://artifactory.ewi.tudelft.nl/artifactory/libs-release</url>
 		</repository>
 	</distributionManagement>
 
 	<dependencies>
+
 		<dependency>
 			<groupId>geniusweb</groupId>
 			<artifactId>party</artifactId>
-			<version>${geniusweb.version}</version>
+			<version>1.0.0</version>
 		</dependency>
+
+
 
 		<dependency>
 			<groupId>org.python</groupId>
 			<artifactId>jython-standalone</artifactId>
-			<version>2.7.2</version>
-		</dependency>
-
-		<dependency>
-			<groupId>junit</groupId>
-			<artifactId>junit</artifactId>
-			<version>4.12</version>
-			<scope>test</scope>
+			<version>2.7.0</version>
 		</dependency>
 
@@ -53,21 +48,19 @@
 		<repository>
 			<id>artifactory.ewi.tudelft.nl</id>
-			<url>https://artifactory.ewi.tudelft.nl/artifactory/libs-release</url>
+			<url>http://artifactory.ewi.tudelft.nl/artifactory/libs-release</url>
 			<snapshots>
 				<enabled>false</enabled>
 			</snapshots>
 		</repository>
+
 	</repositories>
-	
+
 	<pluginRepositories>
 		<pluginRepository>
-			<id>central</id>
-			<url>https://repo1.maven.org/maven2</url>
-		</pluginRepository>
-		<pluginRepository>
-			<id>artifactory.ewi.tudelft.nl</id>
-			<url>https://artifactory.ewi.tudelft.nl/artifactory/libs-release</url>
+			<id>jcenter</id>
+			<url>http://jcenter.bintray.com</url>
 		</pluginRepository>
 	</pluginRepositories>
+
 
 	<build>
@@ -87,5 +80,5 @@
 				<groupId>org.apache.maven.plugins</groupId>
 				<artifactId>maven-javadoc-plugin</artifactId>
-				<version>3.2.0</version>
+				<version>2.10.1</version>
 				<executions>
 					<execution>
@@ -94,4 +87,8 @@
 							<goal>jar</goal>
 						</goals>
+						<configuration>
+							<additionalparam>${javadoc.opts}</additionalparam>
+							<additionalparam>-Xdoclint:none</additionalparam>
+						</configuration>
 					</execution>
 				</executions>
@@ -101,5 +98,4 @@
 				<groupId>org.apache.maven.plugins</groupId>
 				<artifactId>maven-source-plugin</artifactId>
-				<version>3.1.0</version>
 				<executions>
 					<execution>
@@ -115,5 +111,5 @@
 				<groupId>org.jfrog.buildinfo</groupId>
 				<artifactId>artifactory-maven-plugin</artifactId>
-				<version>3.2.3</version>
+				<version>2.6.1</version>
 				<executions>
 					<execution>
Index: /pythonadapter/src/main/java/geniusweb/pythonadapter/PythonPartyAdapter.java
===================================================================
--- /pythonadapter/src/main/java/geniusweb/pythonadapter/PythonPartyAdapter.java	(revision 53)
+++ /pythonadapter/src/main/java/geniusweb/pythonadapter/PythonPartyAdapter.java	(revision 1)
@@ -7,9 +7,9 @@
 
 import geniusweb.actions.Action;
-import geniusweb.connection.ConnectionEnd;
-import geniusweb.inform.Inform;
+import geniusweb.connection.Connection;
 import geniusweb.party.Capabilities;
 import geniusweb.party.DefaultParty;
 import geniusweb.party.Party;
+import geniusweb.party.inform.Inform;
 import tudelft.utilities.listener.Listener;
 
@@ -19,5 +19,5 @@
  * this adapter is needed is that you can not directly use the .py file in java,
  * we have to load a python interpreter and connect it to your file. *
- * <h2>Usage</h2>
+ * <h1>Usage</h1>
  * 
  * <ul>
@@ -36,5 +36,6 @@
  * </ul>
  * 
- * <h2>Working principle</h2>
+ * <p>
+ * <h1>Working principle</h1>
  * 
  * The created jar file contains a full python interpreter plus some glue code.
@@ -103,5 +104,5 @@
 
 	@Override
-	public void connect(ConnectionEnd<Inform, Action> connection) {
+	public void connect(Connection<Inform, Action> connection) {
 		pyparty.connect(connection);
 	}
Index: thonadapter/src/test/java/geniusweb/pythonadapter/PythonPartyAdapterTest.java
===================================================================
--- /pythonadapter/src/test/java/geniusweb/pythonadapter/PythonPartyAdapterTest.java	(revision 53)
+++ 	(revision )
@@ -1,16 +1,0 @@
-package geniusweb.pythonadapter;
-
-import org.junit.Test;
-
-public class PythonPartyAdapterTest {
-	@Test
-	public void smoke() {
-		new PythonPartyAdapter() {
-			
-			@Override
-			public String getPythonClass() {
-				return "TestParty";
-			}
-		};
-	}
-}
Index: /references/pom.xml
===================================================================
--- /references/pom.xml	(revision 53)
+++ /references/pom.xml	(revision 1)
@@ -6,5 +6,5 @@
 	<groupId>geniusweb</groupId>
 	<artifactId>references</artifactId>
-	<version>2.2.1</version>  <!-- equals the geniusweb version -->
+	<version>1.0.0</version>
 	<packaging>jar</packaging>
 
@@ -16,6 +16,5 @@
 		<basedir>.</basedir>
 		<passwd>${env.ARTIFACTORY_PASS}</passwd>
-		<jackson-2-version>2.12.3</jackson-2-version>
-		<geniusweb.version>${project.version}</geniusweb.version>
+		<jackson-2-version>2.9.6</jackson-2-version>
 	</properties>
 
@@ -23,5 +22,5 @@
 		<repository>
 			<id>artifactory.ewi.tudelft.nl</id>
-			<url>https://artifactory.ewi.tudelft.nl/artifactory/libs-release</url>
+			<url>http://artifactory.ewi.tudelft.nl/artifactory/libs-release</url>
 		</repository>
 	</distributionManagement>
@@ -31,6 +30,12 @@
 		<dependency>
 			<groupId>tudelft.utilities</groupId>
-			<artifactId>utilities</artifactId>
-			<version>1.3.1</version>
+			<artifactId>listener</artifactId>
+			<version>1.0.0</version>
+		</dependency>
+
+		<dependency>
+			<groupId>tudelft.utilities</groupId>
+			<artifactId>repository</artifactId>
+			<version>1.0.1</version>
 		</dependency>
 		<!-- the core, which includes Streaming API, shared low-level abstractions 
@@ -83,6 +88,6 @@
 		<dependency>
 			<groupId>org.mockito</groupId>
-			<artifactId>mockito-core</artifactId>
-			<version>3.11.2</version>
+			<artifactId>mockito-all</artifactId>
+			<version>1.9.5</version>
 			<scope>test</scope>
 		</dependency>
@@ -90,5 +95,5 @@
 			<groupId>tudelft.utilities</groupId>
 			<artifactId>junit</artifactId>
-			<version>1.0.5</version>
+			<version>1.0.2</version>
 			<scope>test</scope>
 		</dependency>
@@ -101,21 +106,19 @@
 		<repository>
 			<id>artifactory.ewi.tudelft.nl</id>
-			<url>https://artifactory.ewi.tudelft.nl/artifactory/libs-release</url>
+			<url>http://artifactory.ewi.tudelft.nl/artifactory/libs-release</url>
 			<snapshots>
 				<enabled>false</enabled>
 			</snapshots>
 		</repository>
+
 	</repositories>
 
 	<pluginRepositories>
 		<pluginRepository>
-			<id>central</id>
-			<url>https://repo1.maven.org/maven2</url>
-		</pluginRepository>
-		<pluginRepository>
-			<id>artifactory.ewi.tudelft.nl</id>
-			<url>https://artifactory.ewi.tudelft.nl/artifactory/libs-release</url>
+			<id>jcenter</id>
+			<url>http://jcenter.bintray.com</url>
 		</pluginRepository>
 	</pluginRepositories>
+
 
 	<build>
@@ -131,22 +134,9 @@
 				</configuration>
 			</plugin>
-			<plugin>
-				<groupId>org.apache.maven.plugins</groupId>
-				<artifactId>maven-source-plugin</artifactId>
-				<version>3.1.0</version>
-				<executions>
-					<execution>
-						<id>attach-sources</id>
-						<goals>
-							<goal>jar</goal>
-						</goals>
-					</execution>
-				</executions>
-			</plugin>
 
 			<plugin>
 				<groupId>org.apache.maven.plugins</groupId>
 				<artifactId>maven-javadoc-plugin</artifactId>
-				<version>3.2.0</version>
+				<version>2.10.1</version>
 				<executions>
 					<execution>
@@ -155,4 +145,8 @@
 							<goal>jar</goal>
 						</goals>
+						<configuration>
+							<additionalparam>${javadoc.opts}</additionalparam>
+							<additionalparam>-Xdoclint:none</additionalparam>
+						</configuration>
 					</execution>
 				</executions>
@@ -162,5 +156,5 @@
 				<groupId>org.jfrog.buildinfo</groupId>
 				<artifactId>artifactory-maven-plugin</artifactId>
-				<version>3.2.3</version>
+				<version>2.6.1</version>
 				<executions>
 					<execution>
Index: /references/src/main/java/geniusweb/connection/Connectable.java
===================================================================
--- /references/src/main/java/geniusweb/connection/Connectable.java	(revision 53)
+++ /references/src/main/java/geniusweb/connection/Connectable.java	(revision 1)
@@ -2,8 +2,7 @@
 
 /**
- * A Connectable is an object that can connect on request with a provided
- * {@link ConnectionEnd} and then respond to incoming and outgong signals.
+ * a socket for a general two-way connection
  *
- * @param <INTYPE>  the type of incoming messages
+ * @param <INTYPE> the type of incoming messages
  * @param <OUTTYPE> the type of outgoing messages
  */
@@ -14,5 +13,5 @@
 	 * @param connection the new connection
 	 */
-	void connect(ConnectionEnd<INTYPE, OUTTYPE> connection);
+	void connect(Connection<INTYPE, OUTTYPE> connection);
 
 	/**
Index: /references/src/main/java/geniusweb/connection/Connection.java
===================================================================
--- /references/src/main/java/geniusweb/connection/Connection.java	(revision 1)
+++ /references/src/main/java/geniusweb/connection/Connection.java	(revision 1)
@@ -0,0 +1,65 @@
+package geniusweb.connection;
+
+import java.io.IOException;
+import java.net.SocketException;
+import java.net.URI;
+
+import geniusweb.references.Reference;
+import tudelft.utilities.listener.Listenable;
+
+/**
+ * A general two-way connection. incoming data is reported through the
+ * {@link Listenable} channel, sending events of the INTYPE.
+ * <p>
+ * If an internal error occurs, eg a socket failure, timeout, or parser error, a
+ * null event is sent into the Listenable and {@link #getError()} can be called
+ * to find out about the error.
+ *
+ * @param <INTYPE>  the type of incoming messages. Incoming messages are
+ *                  received through Listener#not. Incoming messages are usually
+ *                  asynchronous.
+ * @param <OUTTYPE> the type of outgoing messages. Outgoing messages can be sent
+ *                  directly with #send.
+ * 
+ */
+public interface Connection<INTYPE, OUTTYPE> extends Listenable<INTYPE> {
+
+	/**
+	 * Send data out (and flush the output so that there are no excessive delays
+	 * in sending the data). This call is assumed to return immediately (never
+	 * block, eg on synchronized, Thread.sleep, IO, etc). When this is called
+	 * multiple times in sequence, the data should arrive at the receiver end in
+	 * the same order.
+	 * 
+	 * @param data the data to be sent.
+	 * @throws IOException if the data failed to be sent.
+	 */
+	void send(OUTTYPE data) throws IOException;
+
+	/**
+	 * @return Reference that was used to create this connection
+	 */
+	Reference getReference();
+
+	/**
+	 * @return the URI of the remote endpoint that makes up the connection. This
+	 *         is a URI that uniquely identifies the remote object
+	 */
+	URI getRemoteURI();
+
+	/**
+	 * Close the connection. Should return immediately (not block). Before
+	 * really closing, this should attempt to send out possibly cached messages
+	 * before closing the connection.
+	 * 
+	 */
+	void close();
+
+	/**
+	 * @return the latest internal error, or null if no error occured. If the
+	 *         channel is closed, this is set to {@link SocketException} "Socket
+	 *         closed", even if the close was a "normal" termination eg when
+	 *         {@link #close()} was called.
+	 */
+	Throwable getError();
+}
Index: ferences/src/main/java/geniusweb/connection/ConnectionEnd.java
===================================================================
--- /references/src/main/java/geniusweb/connection/ConnectionEnd.java	(revision 53)
+++ 	(revision )
@@ -1,73 +1,0 @@
-package geniusweb.connection;
-
-import java.io.IOException;
-import java.net.SocketException;
-import java.net.URI;
-
-import geniusweb.references.Reference;
-import tudelft.utilities.listener.Listenable;
-
-/**
- * One end of a general two-way connection. incoming data is reported through
- * the {@link Listenable} channel, sending events of the INTYPE.
- * <p>
- * 
- * The connection mechanism assumed here is fundamentally asymmetric. One side
- * is "Connectable", the other side is a ConnectionEnd created (usually from a
- * {@link Reference}. This matches the typical client-server system (web
- * architecture).
- * 
- * <p>
- * If an internal error occurs, eg a socket failure, timeout, or parser error, a
- * null event is sent into the Listenable. {@link #getError()} can be called to
- * find out about the error.
- *
- * @param <INTYPE>  the type of incoming messages (incoming for the user of this
- *                  connection end). Incoming messages are received through
- *                  Listener#not. Incoming messages are usually asynchronous.
- * @param <OUTTYPE> the type of outgoing messages (outgoing for the user of this
- *                  connection end). Outgoing messages can be sent directly with
- *                  #send.
- * 
- */
-public interface ConnectionEnd<INTYPE, OUTTYPE> extends Listenable<INTYPE> {
-
-	/**
-	 * Send data out (and flush the output so that there are no excessive delays
-	 * in sending the data). This call is assumed to return immediately (never
-	 * block, eg on synchronized, Thread.sleep, IO, etc). When this is called
-	 * multiple times in sequence, the data should arrive at the receiver end in
-	 * the same order.
-	 * 
-	 * @param data the data to be sent.
-	 * @throws IOException if the data failed to be sent.
-	 */
-	void send(OUTTYPE data) throws IOException;
-
-	/**
-	 * @return Reference that was used to create this connection
-	 */
-	Reference getReference();
-
-	/**
-	 * @return the URI of the remote endpoint that makes up the connection. This
-	 *         is a URI that uniquely identifies the remote object
-	 */
-	URI getRemoteURI();
-
-	/**
-	 * Close the connection. Should return immediately (not block). Before
-	 * really closing, this should attempt to send out possibly cached messages
-	 * before closing the connection.
-	 * 
-	 */
-	void close();
-
-	/**
-	 * @return the latest internal error, or null if no error occured. If the
-	 *         channel is closed, this is set to {@link SocketException} "Socket
-	 *         closed", even if the close was a "normal" termination eg when
-	 *         {@link #close()} was called.
-	 */
-	Throwable getError();
-}
Index: /references/src/main/java/geniusweb/connection/ConnectionFactory.java
===================================================================
--- /references/src/main/java/geniusweb/connection/ConnectionFactory.java	(revision 53)
+++ /references/src/main/java/geniusweb/connection/ConnectionFactory.java	(revision 1)
@@ -9,5 +9,4 @@
  * factory that can turn a {@link Reference} into a connection to that
  * reference.
- * 
  * 
  * @param <INTYPE>  the type of incoming messages. Incoming messages are
@@ -31,5 +30,5 @@
 	 *                                 the server. This suggest to retry later.
 	 */
-	ConnectionEnd<INTYPE, OUTTYPE> connect(Reference reference)
+	Connection<INTYPE, OUTTYPE> connect(Reference reference)
 			throws IOException, NoResourcesNowException;
 
Index: /references/src/main/java/geniusweb/connection/DefaultConnection.java
===================================================================
--- /references/src/main/java/geniusweb/connection/DefaultConnection.java	(revision 53)
+++ /references/src/main/java/geniusweb/connection/DefaultConnection.java	(revision 1)
@@ -6,12 +6,12 @@
  * Default implementation of connection. Connection implementors only need to
  * implement the send (which moves the data sent into the connection to the
- * other side) and they can call
- * {@link DefaultListenable#notifyListeners(Object)} to inform the users of the
- * connection that something came in from the other side.
+ * other side) and they can call {@link DefaultListenable#notifyChange(Object)}
+ * to inform the users of the connection that something came in from the other
+ * side.
  *
- * @param <INTYPE>  the datatype of objects received from the other side
+ * @param <INTYPE> the datatype of objects received from the other side
  * @param <OUTTYPE> the datatype of objects sent to the other side.
  */
 public abstract class DefaultConnection<INTYPE, OUTTYPE> extends
-		DefaultListenable<INTYPE> implements ConnectionEnd<INTYPE, OUTTYPE> {
+		DefaultListenable<INTYPE> implements Connection<INTYPE, OUTTYPE> {
 }
Index: ferences/src/main/java/geniusweb/references/Parameters.java
===================================================================
--- /references/src/main/java/geniusweb/references/Parameters.java	(revision 53)
+++ 	(revision )
@@ -1,149 +1,0 @@
-package geniusweb.references;
-
-import java.util.HashMap;
-
-import com.fasterxml.jackson.annotation.JsonCreator;
-import com.fasterxml.jackson.annotation.JsonValue;
-
-/**
- * init parameters for a party. Object must be either a HashMap, List, String or
- * Number. Other objects may not deserialize properly. We never use blanket
- * Object deserializers (enableDefaultTyping) because of security reasons.
- *
- */
-public class Parameters {
-
-	@JsonValue
-	private final HashMap<String, Object> params = new HashMap<>();
-
-	public Parameters() {
-	}
-
-	@JsonCreator
-	public Parameters(HashMap<String, Object> vals) {
-		params.putAll(vals);
-	}
-
-	/**
-	 * 
-	 * @param key the key to get the value for.
-	 * @return the raw value
-	 */
-	public Object get(String key) {
-		return params.get(key);
-	}
-
-	/**
-	 * 
-	 * @return true iff params is empty
-	 */
-	public boolean isEmpty() {
-		return params.isEmpty();
-	}
-
-	/**
-	 * 
-	 * @param key the key to be checked
-	 * @return true iff params contains the given key
-	 */
-	public boolean containsKey(String key) {
-		return params.containsKey(key);
-	}
-
-	/**
-	 * 
-	 * @param key the key. Key may already in params.
-	 * @param val the new value for the key
-	 * @return new Parameters , which is copy of this but with key-value pair
-	 *         added/overridden
-	 */
-	public Parameters with(String key, Object val) {
-		HashMap<String, Object> newparams = new HashMap<String, Object>(params);
-		newparams.put(key, val);
-		return new Parameters(newparams);
-	}
-
-	/**
-	 * Getter with type-check
-	 * 
-	 * @param <T>       the expected type
-	 * @param paramname the parameter name that must be in the map
-	 * @param classType the expected value type for this parameter
-	 * @return object of requested type.
-	 * @throws IllegalArgumentException if the object is not available.
-	 */
-	@SuppressWarnings("unchecked")
-	public <T> T get(String paramname, Class<T> classType) {
-		if (!params.containsKey(paramname)
-				|| !(classType.isInstance(params.get(paramname))))
-			throw new IllegalArgumentException(" Missing a parameter "
-					+ paramname + " with a " + classType.getName() + " value");
-		return (T) params.get(paramname);
-	}
-
-	/**
-	 * 
-	 * @param parameters the parameters to be added/overridden
-	 * @return new Parameters, with new parameters ADDED to existing. The new
-	 *         parameters override existing ones.
-	 */
-	public Parameters with(Parameters parameters) {
-		HashMap<String, Object> newparams = new HashMap<String, Object>(params);
-		newparams.putAll(parameters.params);
-		return new Parameters(newparams);
-	}
-
-	/**
-	 * 
-	 * @param name       the parameter name
-	 * @param defaultval the default value to return if parameter is not
-	 *                   available or not inside the given range. Can be null
-	 * @param min        the minimum value, or null if not applicable
-	 * @param max        the maximum value, or null if not applicable
-	 * @return the double value contained inside the parameter with the given
-	 *         name, or defaultval if the parameter does not exist, does not
-	 *         contain a double, or is outside [min, max].
-	 */
-	public Double getDouble(String name, Double defaultval, Double min,
-			Double max) {
-		if (!params.containsKey(name) || !(params.get(name) instanceof Number))
-			return defaultval;
-		Double val = ((Number) params.get(name)).doubleValue();
-		if (min != null && val < min)
-			return defaultval;
-		if (max != null && val > max)
-			return defaultval;
-		return val;
-	}
-
-	@Override
-	public int hashCode() {
-		final int prime = 31;
-		int result = 1;
-		result = prime * result + ((params == null) ? 0 : params.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;
-		Parameters other = (Parameters) obj;
-		if (params == null) {
-			if (other.params != null)
-				return false;
-		} else if (!params.equals(other.params))
-			return false;
-		return true;
-	}
-
-	@Override
-	public String toString() {
-		return params.toString();
-	}
-
-}
Index: ferences/src/main/java/geniusweb/references/PartyWithParameters.java
===================================================================
--- /references/src/main/java/geniusweb/references/PartyWithParameters.java	(revision 53)
+++ 	(revision )
@@ -1,81 +1,0 @@
-package geniusweb.references;
-
-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;
-
-/**
- * Container holding a partyref with parameters
- */
-@JsonAutoDetect(fieldVisibility = Visibility.ANY, getterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE)
-public class PartyWithParameters {
-
-	private final PartyRef partyref;
-	private final Parameters parameters;
-
-	@JsonCreator
-	public PartyWithParameters(@JsonProperty("partyref") PartyRef partyref,
-			@JsonProperty("parameters") Parameters parameters) {
-		this.partyref = partyref;
-		this.parameters = parameters;
-	}
-
-	public PartyRef getPartyRef() {
-		return partyref;
-	}
-
-	public Parameters getParameters() {
-		return parameters;
-	}
-
-	@Override
-	public String toString() {
-		if (parameters.isEmpty())
-			return partyref.toString();
-		return partyref.toString() + parameters.toString();
-	}
-
-	@Override
-	public int hashCode() {
-		final int prime = 31;
-		int result = 1;
-		result = prime * result
-				+ ((parameters == null) ? 0 : parameters.hashCode());
-		result = prime * result
-				+ ((partyref == null) ? 0 : partyref.hashCode());
-		return result;
-	}
-
-	/**
-	 * 
-	 * @param parameters2 the additional parameters
-	 * @return this party but with the given parameters added to our parameters
-	 */
-	public PartyWithParameters with(Parameters parameters2) {
-		return new PartyWithParameters(partyref, parameters.with(parameters2));
-	}
-
-	@Override
-	public boolean equals(Object obj) {
-		if (this == obj)
-			return true;
-		if (obj == null)
-			return false;
-		if (getClass() != obj.getClass())
-			return false;
-		PartyWithParameters other = (PartyWithParameters) obj;
-		if (parameters == null) {
-			if (other.parameters != null)
-				return false;
-		} else if (!parameters.equals(other.parameters))
-			return false;
-		if (partyref == null) {
-			if (other.partyref != null)
-				return false;
-		} else if (!partyref.equals(other.partyref))
-			return false;
-		return true;
-	}
-
-}
Index: /references/src/main/java/geniusweb/references/PartyWithProfile.java
===================================================================
--- /references/src/main/java/geniusweb/references/PartyWithProfile.java	(revision 53)
+++ /references/src/main/java/geniusweb/references/PartyWithProfile.java	(revision 1)
@@ -8,9 +8,9 @@
 @JsonAutoDetect(fieldVisibility = Visibility.ANY, getterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE)
 public class PartyWithProfile {
-	private final PartyWithParameters party;
+	private final PartyRef party;
 	private final ProfileRef profile;
 
 	@JsonCreator
-	public PartyWithProfile(@JsonProperty("party") PartyWithParameters party,
+	public PartyWithProfile(@JsonProperty("party") PartyRef party,
 			@JsonProperty("profile") ProfileRef profile) {
 		if (party == null || profile == null) {
@@ -22,16 +22,9 @@
 	}
 
-	/**
-	 * 
-	 * @return the {@link PartyWithParameters}. never null.
-	 */
-	public PartyWithParameters getParty() {
+	public PartyRef getParty() {
 		return party;
 
 	}
 
-	/**
-	 * @return the profile setting for this party. Never null.
-	 */
 	public ProfileRef getProfile() {
 		return profile;
Index: ferences/src/test/java/geniusweb/references/ParametersTest.java
===================================================================
--- /references/src/test/java/geniusweb/references/ParametersTest.java	(revision 53)
+++ 	(revision )
@@ -1,103 +1,0 @@
-package geniusweb.references;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
-import java.util.Arrays;
-import java.util.List;
-
-import org.junit.Test;
-
-import tudelft.utilities.junit.GeneralTests;
-
-public class ParametersTest extends GeneralTests<Parameters> {
-
-	private final Parameters params1 = new Parameters();
-	private final Parameters params1a = new Parameters();
-	private final Parameters params2 = new Parameters().with("a", 1).with("b",
-			2d);
-
-	@Override
-	public List<List<Parameters>> getGeneralTestData() {
-		return Arrays.asList(Arrays.asList(params1, params1a),
-				Arrays.asList(params2));
-	}
-
-	@Override
-	public List<String> getGeneralTestStrings() {
-		return Arrays.asList("\\{\\}", "\\{a=1, b=2.0\\}");
-	}
-
-	@Test(expected = IllegalArgumentException.class)
-	public void getWrongClass() {
-		params2.get("a", String.class);
-	}
-
-	@Test
-	public void getInteger() {
-		assertEquals((Integer) 1, params2.get("a", Integer.class));
-		assertEquals((Double) 2d, params2.get("b", Double.class));
-	}
-
-	@Test
-	public void getDouble() {
-		assertEquals((Double) 2d, params2.getDouble("b", 7d, null, null));
-		assertEquals((Double) 2d, params2.getDouble("b", 7d, 0d, 4d));
-
-		// test outside range
-		assertEquals((Double) 7d, params2.getDouble("b", 7d, 4d, 6d));
-		assertEquals((Double) 7d, params2.getDouble("b", 7d, -2d, 1d));
-
-		// test fallback null
-		assertEquals(null, params2.getDouble("b", null, 4d, 6d));
-
-		// a is integer!
-		assertEquals((Double) 1d, params2.getDouble("a", 0d, -0d, 2d));
-
-	}
-
-	@Test
-	public void getDoubleWithErrors() {
-		// a does not contain a double
-		assertEquals((Double) 7d, params2.getDouble("a", 7d, 4d, 6d));
-		// c does not exist
-		assertEquals((Double) 7d, params2.getDouble("c", 7d, 4d, 6d));
-
-		// a=1, which is outside [min, max]. Therefore default value should be
-		// returned.
-		assertEquals(null, params2.getDouble("a", null, 2d, 3d));
-
-	}
-
-	@Test
-	public void withTest() {
-		Parameters p = params2.with("a", 2);
-		assertEquals(1, params2.get("a"));
-		assertEquals(2d, params2.get("b"));
-		assertEquals(2, p.get("a"));
-		assertEquals(2d, p.get("b"));
-	}
-
-	@Test
-	public void withParamsTest() {
-		Parameters upd = new Parameters().with("a", 2);
-		Parameters p = params2.with(upd);
-		assertEquals(1, params2.get("a"));
-		assertEquals(2d, params2.get("b"));
-		assertEquals(2, p.get("a"));
-		assertEquals(2d, p.get("b"));
-	}
-
-	@Test
-	public void isEmptyTest() {
-		assertTrue(params1.isEmpty());
-		assertFalse(params2.isEmpty());
-	}
-
-	@Test
-	public void containsKeyTest() {
-		assertTrue(params2.containsKey("a"));
-		assertFalse(params2.containsKey("c"));
-	}
-}
Index: ferences/src/test/java/geniusweb/references/PartiWithParamsTest.java
===================================================================
--- /references/src/test/java/geniusweb/references/PartiWithParamsTest.java	(revision 53)
+++ 	(revision )
@@ -1,72 +1,0 @@
-package geniusweb.references;
-
-import static org.junit.Assert.assertEquals;
-
-import java.io.IOException;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.util.Arrays;
-import java.util.List;
-
-import org.junit.Before;
-import org.junit.Test;
-
-import com.fasterxml.jackson.core.JsonParseException;
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.databind.JsonMappingException;
-import com.fasterxml.jackson.databind.ObjectMapper;
-
-import tudelft.utilities.junit.GeneralTests;
-
-public class PartiWithParamsTest extends GeneralTests<PartyWithParameters> {
-
-	private PartyRef party1, party2;
-	private Parameters param1, param2;
-	private PartyWithParameters party1param1, party1param1a;
-	private PartyWithParameters party1param2;
-	private final String serialized = "{\"partyref\":\"ws:party1\",\"parameters\":{\"a\":1}}";
-
-	@Before
-	public void before() throws URISyntaxException {
-		party1 = new PartyRef(new URI("ws:party1"));
-		party2 = new PartyRef(new URI("ws:party2"));
-		param1 = new Parameters();
-		param2 = new Parameters().with("a", 1);
-		party1param1 = new PartyWithParameters(party1, param1);
-		party1param1a = new PartyWithParameters(party1, param1);
-		party1param2 = new PartyWithParameters(party1, param2);
-	}
-
-	@Override
-	public List<List<PartyWithParameters>> getGeneralTestData() {
-		return Arrays.asList(
-				Arrays.asList(party1param1, party1param1a, party1param1a),
-				Arrays.asList(party1param2));
-	}
-
-	@Override
-	public List<String> getGeneralTestStrings() {
-		return Arrays.asList("PartyRef.ws:party1.",
-				"PartyRef.ws:party1.\\{a=1\\}");
-	}
-
-	@Test
-	public void testSerialize() throws JsonProcessingException {
-		ObjectMapper jackson = new ObjectMapper();
-
-		String json = jackson.writeValueAsString(party1param2);
-		System.out.println(json);
-		assertEquals(serialized, json);
-	}
-
-	@Test
-	public void testDeserialize()
-			throws JsonParseException, JsonMappingException, IOException {
-		ObjectMapper jackson = new ObjectMapper();
-		PartyWithParameters p = jackson.readValue(serialized,
-				PartyWithParameters.class);
-		System.out.println(p);
-		assertEquals(party1param2, p);
-	}
-
-}
Index: /references/src/test/java/geniusweb/references/PartyWithProfileTest.java
===================================================================
--- /references/src/test/java/geniusweb/references/PartyWithProfileTest.java	(revision 53)
+++ /references/src/test/java/geniusweb/references/PartyWithProfileTest.java	(revision 1)
@@ -17,4 +17,7 @@
 import com.fasterxml.jackson.databind.ObjectMapper;
 
+import geniusweb.references.PartyRef;
+import geniusweb.references.PartyWithProfile;
+import geniusweb.references.ProfileRef;
 import tudelft.utilities.junit.GeneralTests;
 
@@ -23,7 +26,6 @@
 	private PartyRef party1, party1a, party2, party3;
 	private ProfileRef profile1, profile2;
-	private PartyWithProfile partyprof1, partyprof1a, partyprof2, partyprof3,
-			partyprof4;
-	private final String serialized = "{\"party\":{\"partyref\":\"ws:party1\",\"parameters\":{}},\"profile\":\"ws:profile1\"}";
+	private PartyWithProfile partyprof1, partyprof1a, partyprof2, partyprof3;
+	private final String serialized = "{\"party\":\"ws:party1\",\"profile\":\"ws:profile1\"}";
 
 	@Before
@@ -37,19 +39,8 @@
 		profile2 = new ProfileRef(new URI("ws:profile2"));
 
-		Parameters settings1 = new Parameters();
-		Parameters settings2 = new Parameters().with("a", 1);
-
-		PartyWithParameters party1withparams1 = new PartyWithParameters(party1,
-				settings1);
-		PartyWithParameters party1withparams2 = new PartyWithParameters(party1,
-				settings2);
-		PartyWithParameters party2withparams1 = new PartyWithParameters(party2,
-				settings1);
-
-		partyprof1 = new PartyWithProfile(party1withparams1, profile1);
-		partyprof1a = new PartyWithProfile(party1withparams1, profile1);
-		partyprof2 = new PartyWithProfile(party2withparams1, profile1);
-		partyprof3 = new PartyWithProfile(party1withparams1, profile2);
-		partyprof4 = new PartyWithProfile(party1withparams2, profile1);
+		partyprof1 = new PartyWithProfile(party1, profile1);
+		partyprof1a = new PartyWithProfile(party1, profile1);
+		partyprof2 = new PartyWithProfile(party2, profile1);
+		partyprof3 = new PartyWithProfile(party1, profile2);
 
 	}
@@ -58,6 +49,5 @@
 	public List<List<PartyWithProfile>> getGeneralTestData() {
 		return Arrays.asList(Arrays.asList(partyprof1, partyprof1a),
-				Arrays.asList(partyprof2), Arrays.asList(partyprof3),
-				Arrays.asList(partyprof4));
+				Arrays.asList(partyprof2), Arrays.asList(partyprof3));
 	}
 
@@ -65,8 +55,7 @@
 	public List<String> getGeneralTestStrings() {
 		return Arrays.asList(
-				"PartyWithProfile.PartyRef.ws:party1.,ProfileRef.ws:profile1.*",
-				"PartyWithProfile.PartyRef.ws:party2.,ProfileRef.ws:profile1.*",
-				"PartyWithProfile.PartyRef.ws:party1.,ProfileRef.ws:profile2.*",
-				"PartyWithProfile.PartyRef.ws:party1.\\{a=1\\},ProfileRef.ws:profile1.*");
+				"PartyWithProfile.PartyRef.ws:party1.,ProfileRef.ws:profile1..",
+				"PartyWithProfile.PartyRef.ws:party2.,ProfileRef.ws:profile1..",
+				"PartyWithProfile.PartyRef.ws:party1.,ProfileRef.ws:profile2..");
 	}
 
@@ -77,5 +66,5 @@
 	@Test(expected = IllegalArgumentException.class)
 	public void nullTest() throws URISyntaxException {
-		new PartyWithProfile((PartyWithParameters) null, (ProfileRef) null);
+		new PartyWithProfile((PartyRef) null, (ProfileRef) null);
 	}
 
Index: /references/src/test/java/geniusweb/references/ProtocolRefTest.java
===================================================================
--- /references/src/test/java/geniusweb/references/ProtocolRefTest.java	(revision 53)
+++ /references/src/test/java/geniusweb/references/ProtocolRefTest.java	(revision 1)
@@ -17,4 +17,5 @@
 import com.fasterxml.jackson.databind.ObjectMapper;
 
+import geniusweb.references.ProtocolRef;
 import tudelft.utilities.junit.GeneralTests;
 
@@ -57,11 +58,4 @@
 
 	@Test
-	public void testSaop() {
-		ProtocolRef saop = new ProtocolRef("SAOP");
-		System.out.println(saop.getURI());
-		assertEquals("SAOP", saop.getURI().getPath());
-	}
-
-	@Test
 	public void testSerialize() throws JsonProcessingException {
 		ObjectMapper jackson = new ObjectMapper();
Index: /simplerunner/pom.xml
===================================================================
--- /simplerunner/pom.xml	(revision 53)
+++ /simplerunner/pom.xml	(revision 1)
@@ -6,5 +6,5 @@
 	<groupId>geniusweb</groupId>
 	<artifactId>simplerunner</artifactId>
-	<version>2.2.1</version>  <!-- equals the geniusweb version -->
+	<version>1.0.0</version>
 	<packaging>jar</packaging>
 
@@ -16,6 +16,5 @@
 		<basedir>.</basedir>
 		<passwd>${env.ARTIFACTORY_PASS}</passwd>
-		<jackson-2-version>2.12.3</jackson-2-version>
-		<geniusweb.version>${project.version}</geniusweb.version>
+		<jackson-2-version>2.9.6</jackson-2-version>
 	</properties>
 
@@ -23,5 +22,5 @@
 		<repository>
 			<id>artifactory.ewi.tudelft.nl</id>
-			<url>https://artifactory.ewi.tudelft.nl/artifactory/libs-release</url>
+			<url>http://artifactory.ewi.tudelft.nl/artifactory/libs-release</url>
 		</repository>
 	</distributionManagement>
@@ -32,31 +31,15 @@
 			<groupId>geniusweb</groupId>
 			<artifactId>protocol</artifactId>
-			<version>${geniusweb.version}</version>
+			<version>1.0.0</version>
 		</dependency>
 		<dependency>
 			<groupId>geniusweb</groupId>
 			<artifactId>party</artifactId>
-			<version>${geniusweb.version}</version>
+			<version>1.0.0</version>
 		</dependency>
 		<dependency>
 			<groupId>geniusweb.exampleparties</groupId>
 			<artifactId>randomparty</artifactId>
-			<version>${geniusweb.version}</version>
-		</dependency>
-		<dependency>
-			<groupId>geniusweb.exampleparties</groupId>
-			<artifactId>comparebids</artifactId>
-			<version>${geniusweb.version}</version>
-			<scope>
-				test
-			</scope>
-		</dependency>
-		<dependency>
-			<groupId>geniusweb.exampleparties</groupId>
-			<artifactId>simpleshaop</artifactId>
-			<version>${geniusweb.version}</version>
-			<scope>
-				test
-			</scope>
+			<version>1.0.0</version>
 		</dependency>
 
@@ -64,5 +47,5 @@
 			<groupId>tudelft.utilities</groupId>
 			<artifactId>junit</artifactId>
-			<version>1.0.5</version>
+			<version>1.0.2</version>
 			<scope>test</scope>
 		</dependency>
@@ -75,6 +58,6 @@
 		<dependency>
 			<groupId>org.mockito</groupId>
-			<artifactId>mockito-core</artifactId>
-			<version>3.11.2</version>
+			<artifactId>mockito-all</artifactId>
+			<version>1.9.5</version>
 			<scope>test</scope>
 		</dependency>
@@ -87,19 +70,16 @@
 		<repository>
 			<id>artifactory.ewi.tudelft.nl</id>
-			<url>https://artifactory.ewi.tudelft.nl/artifactory/libs-release</url>
+			<url>http://artifactory.ewi.tudelft.nl/artifactory/libs-release</url>
 			<snapshots>
 				<enabled>false</enabled>
 			</snapshots>
 		</repository>
+
 	</repositories>
 
 	<pluginRepositories>
 		<pluginRepository>
-			<id>central</id>
-			<url>https://repo1.maven.org/maven2</url>
-		</pluginRepository>
-		<pluginRepository>
-			<id>artifactory.ewi.tudelft.nl</id>
-			<url>https://artifactory.ewi.tudelft.nl/artifactory/libs-release</url>
+			<id>jcenter</id>
+			<url>http://jcenter.bintray.com</url>
 		</pluginRepository>
 	</pluginRepositories>
@@ -118,32 +98,19 @@
 				</configuration>
 			</plugin>
-			<plugin>
-				<groupId>org.apache.maven.plugins</groupId>
-				<artifactId>maven-enforcer-plugin</artifactId>
-				<version>3.0.0-M2</version>
-				<executions>
-					<execution>
-						<id>enforce</id>
+
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-javadoc-plugin</artifactId>
+				<version>2.10.1</version>
+				<executions>
+					<execution>
+						<id>attach-javadocs</id>
+						<goals>
+							<goal>jar</goal>
+						</goals>
 						<configuration>
-							<rules>
-								<dependencyConvergence />
-							</rules>
+							<additionalparam>${javadoc.opts}</additionalparam>
+							<additionalparam>-Xdoclint:none</additionalparam>
 						</configuration>
-						<goals>
-							<goal>enforce</goal>
-						</goals>
-					</execution>
-				</executions>
-			</plugin>
-			<plugin>
-				<groupId>org.apache.maven.plugins</groupId>
-				<artifactId>maven-javadoc-plugin</artifactId>
-				<version>3.2.0</version>
-				<executions>
-					<execution>
-						<id>attach-javadocs</id>
-						<goals>
-							<goal>jar</goal>
-						</goals>
 					</execution>
 				</executions>
@@ -153,5 +120,4 @@
 				<groupId>org.apache.maven.plugins</groupId>
 				<artifactId>maven-source-plugin</artifactId>
-				<version>3.1.0</version>
 				<executions>
 					<execution>
@@ -167,5 +133,5 @@
 				<groupId>org.jfrog.buildinfo</groupId>
 				<artifactId>artifactory-maven-plugin</artifactId>
-				<version>3.2.3</version>
+				<version>2.6.1</version>
 				<executions>
 					<execution>
Index: /simplerunner/src/main/java/geniusweb/simplerunner/BasicConnection.java
===================================================================
--- /simplerunner/src/main/java/geniusweb/simplerunner/BasicConnection.java	(revision 53)
+++ /simplerunner/src/main/java/geniusweb/simplerunner/BasicConnection.java	(revision 1)
@@ -3,10 +3,8 @@
 import java.io.IOException;
 import java.net.URI;
-import java.util.List;
-import java.util.concurrent.ArrayBlockingQueue;
-import java.util.concurrent.CopyOnWriteArrayList;
 
-import geniusweb.connection.ConnectionEnd;
+import geniusweb.connection.Connection;
 import geniusweb.references.Reference;
+import tudelft.utilities.listener.DefaultListenable;
 import tudelft.utilities.listener.Listener;
 
@@ -18,15 +16,10 @@
  * @param <OUT> the type of outgoing data
  */
-public class BasicConnection<IN, OUT> implements ConnectionEnd<IN, OUT> {
-	private List<Listener<IN>> listeners = new CopyOnWriteArrayList<Listener<IN>>();
-
-	private final Info<OUT> EOS = new EOS<OUT>();
+public class BasicConnection<IN, OUT> extends DefaultListenable<IN>
+		implements Connection<IN, OUT> {
 	private final Reference reference;
 	private final URI uri;
 	// to be initialized
 	private Listener<OUT> handler = null;
-	private ArrayBlockingQueue<Info<OUT>> messages = new ArrayBlockingQueue<>(
-			4);
-	private Throwable error;
 
 	/**
@@ -46,5 +39,5 @@
 	 * from us. Must be called first.
 	 * 
-	 * @param newhandler a Listener&lt;OUT&gt; that can handle send actions.
+	 * @param handler a Listener<OUT> that can handle send actions.
 	 * 
 	 */
@@ -54,38 +47,4 @@
 		}
 		this.handler = newhandler;
-
-		Thread handlerThread = new Thread(new Runnable() {
-
-			@Override
-			public void run() {
-				try {
-					while (true) {
-						Info<OUT> mess = messages.take();
-						if (mess instanceof EOS)
-							break;
-						handler.notifyChange(((Data<OUT>) mess).get());
-					}
-				} catch (Exception e) {
-					setError(e);
-				}
-				handler = null;
-				System.out.println("BasicConnection closed");
-			}
-		});
-		handlerThread.start();
-	}
-
-	/**
-	 * Error condition occurs. Record error and close connection
-	 * 
-	 * @param e
-	 */
-	protected synchronized void setError(Throwable e) {
-		if (error == null) {
-			// maybe log instead?
-			e.printStackTrace();
-			error = e;
-			close();
-		}
 	}
 
@@ -94,11 +53,7 @@
 		if (handler == null) {
 			throw new IllegalStateException(
-					"BasicConnection has not been initialized or was closed");
+					"BasicConnection has not been initialized");
 		}
-		try {
-			messages.put(new Data<OUT>(data));
-		} catch (InterruptedException e) {
-			setError(e);
-		}
+		handler.notifyChange(data);
 	}
 
@@ -115,82 +70,11 @@
 	@Override
 	public void close() {
-		System.out.println("flushing and terminating " + this);
-		if (handler == null || messages.contains(EOS))
-			return;
-		try {
-			messages.put(EOS);
-		} catch (InterruptedException e) {
-			setError(e);
-		}
+
 	}
 
 	@Override
-	public String toString() {
-		return "BasicConnection[" + reference + "]";
-	}
-
-	@Override
-	public Throwable getError() {
-		return error;
-	}
-
-	/**
-	 * 
-	 * @return true iff this connection is open. Returns false also when then
-	 *         handler is in the close-down process
-	 */
-	public boolean isOpen() {
-		return handler != null && !messages.contains(EOS);
-	}
-
-	/****************** implements listenable ****************/
-	// override because notifyListeners should throw exceptions.
-	@Override
-	public void addListener(Listener<IN> l) {
-		listeners.add(l);
-	}
-
-	@Override
-	public void removeListener(Listener<IN> l) {
-		listeners.remove(l);
-	}
-
-	public void notifyListeners(IN data) {
-		for (Listener<IN> l : listeners) {
-			l.notifyChange(data);
-		}
+	public Error getError() {
+		return null;
 	}
 
 }
-
-/**
- * Wrapper around data so that we can put Null end EOS in a
- * {@link ArrayBlockingQueue}
- *
- * @param <S> the type of contained data.
- */
-
-interface Info<S> {
-
-}
-
-class Data<S> implements Info<S> {
-	private final S data;
-
-	public Data(S data) {
-		this.data = data;
-	}
-
-	public S get() {
-		return data;
-	}
-}
-
-/**
- * End of stream.
- * 
- * @author wouter
- *
- */
-class EOS<S> implements Info<S> {
-}
Index: /simplerunner/src/main/java/geniusweb/simplerunner/ClassPathConnectionFactory.java
===================================================================
--- /simplerunner/src/main/java/geniusweb/simplerunner/ClassPathConnectionFactory.java	(revision 53)
+++ /simplerunner/src/main/java/geniusweb/simplerunner/ClassPathConnectionFactory.java	(revision 1)
@@ -11,8 +11,8 @@
 import geniusweb.actions.Action;
 import geniusweb.actions.PartyId;
-import geniusweb.inform.Inform;
 import geniusweb.party.Party;
-import geniusweb.protocol.partyconnection.ProtocolToPartyConn;
-import geniusweb.protocol.partyconnection.ProtocolToPartyConnFactory;
+import geniusweb.party.inform.Inform;
+import geniusweb.protocol.partyconnection.ConnectionWithParty;
+import geniusweb.protocol.partyconnection.ConnectionWithPartyFactory;
 import geniusweb.references.Reference;
 import tudelft.utilities.repository.NoResourcesNowException;
@@ -22,147 +22,38 @@
  * <code>classpath:org/my/package/class</code>
  * 
+ * 
+ *
  */
-public class ClassPathConnectionFactory implements ProtocolToPartyConnFactory {
-	private List<ConnectionPair> allConnections = new LinkedList<>();
-
-	/**
-	 * @param reference the party class path reference4
-	 */
-	@Override
-	public ProtocolToPartyConn connect(Reference reference) {
-		ConnectionPair connpair = new ConnectionPair(reference);
-		allConnections.add(connpair);
-		return connpair.getProtocolToPartyConn();
-	}
+public class ClassPathConnectionFactory implements ConnectionWithPartyFactory {
+	private static final String SCHEME = "classpath";
+	private static int serialcounter = 1;
+	private final static URI PROTOCOLURI = uri("protocol:protocol");
 
 	@Override
-	public List<ProtocolToPartyConn> connect(List<Reference> references)
-			throws IOException, NoResourcesNowException {
-		List<ProtocolToPartyConn> connections = new LinkedList<>();
-		for (Reference partyref : references) {
-			connections.add(connect(partyref));
-		}
-		return connections;
-	}
-
-	/**
-	 * @return list of connections that are still open.
-	 */
-	public List<BasicConnection> getOpenConnections() {
-		List<BasicConnection> open = new LinkedList<>();
-		for (ConnectionPair connpair : allConnections) {
-			open.addAll(connpair.getOpenConnections());
-		}
-		return open;
-	}
-
-}
-
-class BasicConnectionWithParty extends BasicConnection<Action, Inform>
-		implements ProtocolToPartyConn {
-
-	private PartyId id;
-
-	public BasicConnectionWithParty(Reference reference, URI uri) {
-		super(reference, uri);
-		this.id = new PartyId(uri.toString().replace("classpath:", "")
-				.replaceAll("\\.", "_"));
-	}
-
-	@Override
-	public PartyId getParty() {
-		return id;
-	}
-
-	@Override
-	public String toString() {
-		return "WP" + super.toString();
-	}
-
-}
-
-/**
- * Contains the connection from protocol to party and from party to protocol.
- * These two are dependent on each other, and must close together.
- *
- */
-class ConnectionPair {
-	private static int serialcounter = 1;
-	private static final String SCHEME = "classpath";
-	private final static URI PROTOCOLURI = uri("protocol:protocol");
-
-	private final BasicConnection<Inform, Action> party2protocol;
-	private final BasicConnectionWithParty protocol2party;
-
-	/**
-	 * 
-	 * @param reference the party class path reference4
-	 * 
-	 */
-	public ConnectionPair(Reference reference) {
+	public ConnectionWithParty connect(Reference reference) {
 		// set up the whole other party including the connection to it.
 		String classpath = getClassPath(reference.getURI());
 		Party party = instantiate(classpath);
 
-		// if call to protocol would fail, we should also close the
-		// protocol2party connection. But we assume that will work fine.
-		party2protocol = new BasicConnection<Inform, Action>(reference,
-				PROTOCOLURI) {
-
-			@Override
-			public void close() {
-				if (isOpen()) {
-					super.close();
-					protocol2party.close();
-				}
-			}
-
-		};
-
-		// if callback from protocol to party fails, then also close the
-		// other direction.
-		protocol2party = new BasicConnectionWithParty(reference,
+		BasicConnection<Inform, Action> party2protocol = new BasicConnection<Inform, Action>(
+				reference, PROTOCOLURI);
+		BasicConnectionWithParty protocol2party = new BasicConnectionWithParty(
+				reference,
 				uri("classpath:" + reference.getURI().getSchemeSpecificPart()
-						+ "." + (serialcounter++))) {
-			@Override
-			public void close() {
-				if (isOpen()) {
-					super.close();
-					party2protocol.close();
-				}
-			}
-
-		};
-
-		party2protocol.init(action -> protocol2party.notifyListeners(action));
-
-		protocol2party.init(info -> party2protocol.notifyListeners(info));
+						+ "." + (serialcounter++)));
+		party2protocol.init(action -> protocol2party.notifyChange(action));
+		protocol2party.init(info -> party2protocol.notifyChange(info));
 
 		party.connect(party2protocol);
 
-	}
-
-	/**
-	 * 
-	 * @return the open connections
-	 */
-	public List<BasicConnection> getOpenConnections() {
-		List<BasicConnection> open = new LinkedList<>();
-		if (party2protocol.isOpen())
-			open.add(party2protocol);
-		if (protocol2party.isOpen())
-			open.add(protocol2party);
-		return open;
-	}
-
-	public BasicConnectionWithParty getProtocolToPartyConn() {
 		return protocol2party;
 	}
 
-	/**
-	 * Internal use for testing
-	 */
-	protected BasicConnection getPartyToProtocolConn() {
-		return party2protocol;
+	private static URI uri(String ref) {
+		try {
+			return new URI(ref);
+		} catch (URISyntaxException e) {
+			throw new IllegalStateException("failed to create basic URI", e);
+		}
 	}
 
@@ -192,15 +83,7 @@
 				| InvocationTargetException e) {
 			throw new IllegalArgumentException(
-					"Failed to create connection to party " + classpath, e);
+					"Failed to create party connection", e);
 		}
 
-	}
-
-	private static URI uri(String ref) {
-		try {
-			return new URI(ref);
-		} catch (URISyntaxException e) {
-			throw new IllegalStateException("failed to create basic URI", e);
-		}
 	}
 
@@ -218,3 +101,31 @@
 	}
 
+	@Override
+	public List<ConnectionWithParty> connect(List<Reference> references)
+			throws IOException, NoResourcesNowException {
+		List<ConnectionWithParty> connections = new LinkedList<>();
+		for (Reference partyref : references) {
+			connections.add(connect(partyref));
+		}
+		return connections;
+	}
+
 }
+
+class BasicConnectionWithParty extends BasicConnection<Action, Inform>
+		implements ConnectionWithParty {
+
+	private PartyId id;
+
+	public BasicConnectionWithParty(Reference reference, URI uri) {
+		super(reference, uri);
+		this.id = new PartyId(uri.toString().replace("classpath:", "")
+				.replaceAll("\\.", "_"));
+	}
+
+	@Override
+	public PartyId getParty() {
+		return id;
+	}
+
+}
Index: /simplerunner/src/main/java/geniusweb/simplerunner/NegoRunner.java
===================================================================
--- /simplerunner/src/main/java/geniusweb/simplerunner/NegoRunner.java	(revision 53)
+++ /simplerunner/src/main/java/geniusweb/simplerunner/NegoRunner.java	(revision 1)
@@ -9,6 +9,11 @@
 import com.fasterxml.jackson.databind.ObjectMapper;
 
+import geniusweb.events.ProtocolEvent;
+import geniusweb.protocol.CurrentNegoState;
+import geniusweb.protocol.NegoProtocol;
 import geniusweb.protocol.NegoSettings;
-import geniusweb.simplerunner.gui.GUI;
+import geniusweb.protocol.partyconnection.ConnectionWithPartyFactory;
+import geniusweb.protocol.session.SessionSettings;
+import tudelft.utilities.logging.ReportToLogger;
 import tudelft.utilities.logging.Reporter;
 
@@ -17,32 +22,48 @@
  * All referred files and classes need to be stored locally (or be in the
  * dependency list if you use maven).
- * <p>
- * <em>IMPORTANT</em> SimpleRunner has a number of restrictions, compared to a
- * run using a runserver and partyserver
- * <ul>
- * <li>With stand-alone runner, your parties are run together in a single
- * classloader. The main implication is that there may arise version conflicts
- * between parties.
- * <li>Stand-alone runner does NOT enforce the time deadline. Parties may
- * continue running indefinitely and thus bog down the JVM and stalling
- * tournaments.
- * </ul>
+ * 
  */
-public class NegoRunner {
+public class NegoRunner implements Runnable {
+	private final NegoSettings settings;
+	private final NegoProtocol protocol;
+	private final ConnectionWithPartyFactory connectionfactory;
+	private final Reporter log;
 	private final static ObjectMapper jackson = new ObjectMapper();
 
-	/**
-	 * The main runner
-	 * 
-	 * @param args should have 0 or 1 argument. If 0 arguments, the {@link GUI}
-	 *             is started. If one argoment, it should be a filename
-	 *             containing a settings.json file. That session is then run.
-	 * @throws IOException if problem occurs
-	 */
+	public NegoRunner(NegoSettings settings,
+			ConnectionWithPartyFactory connectionfactory, Reporter logger) {
+		if (settings == null || connectionfactory == null) {
+			throw new NullPointerException("Arguments must be not null");
+		}
+		this.settings = settings;
+		this.log = logger;
+		this.protocol = settings.getProtocol(log);
+		this.connectionfactory = connectionfactory;
+	}
+
+	@Override
+	public void run() {
+		protocol.addListener(evt -> handle(evt));
+		protocol.start(connectionfactory);
+	}
+
+	private void handle(ProtocolEvent evt) {
+		if (evt instanceof CurrentNegoState && ((CurrentNegoState) evt)
+				.getState().isFinal(System.currentTimeMillis())) {
+			stop();
+		}
+	}
+
+	protected void stop() {
+		if (protocol.getState().getError() != null) {
+			log.log(Level.WARNING, "protocol terminated abnormally",
+					protocol.getState().getError());
+		} else {
+			log.log(Level.INFO,
+					"protocol ended normally: " + protocol.getState());
+		}
+	}
+
 	public static void main(String[] args) throws IOException {
-		if (args.length == 0) {
-			GUI.main(args);
-			return;
-		}
 		if (args.length != 1) {
 			showusage();
@@ -51,14 +72,15 @@
 		String serialized = new String(Files.readAllBytes(Paths.get(args[0])),
 				StandardCharsets.UTF_8);
-		NegoSettings settings = jackson.readValue(serialized,
-				NegoSettings.class);
+		SessionSettings settings = jackson.readValue(serialized,
+				SessionSettings.class);
 
-		Runner runner = new Runner(settings, new ClassPathConnectionFactory(),
-				new StdOutReporter(), 0);
+		NegoRunner runner = new NegoRunner(settings,
+				new ClassPathConnectionFactory(),
+				new ReportToLogger("sessionrunner"));
 		runner.run();
 	}
 
 	private static void showusage() {
-		System.err.println("GeniusWeb stand-alone runner.");
+		System.err.println("GeniusWeb stand-alone runner. ");
 		System.err.println("first argument should be <settings.json>.");
 		System.err.println(
@@ -68,20 +90,3 @@
 
 	}
-
 }
-
-class StdOutReporter implements Reporter {
-	@Override
-	public void log(Level level, String msg) {
-		if (level == Level.WARNING || level == Level.SEVERE)
-			System.err.println(level + ":" + msg);
-		else
-			System.out.println(level + ":" + msg);
-	}
-
-	@Override
-	public void log(Level arg0, String msg, Throwable arg2) {
-		log(arg0, msg);
-	}
-
-}
Index: mplerunner/src/main/java/geniusweb/simplerunner/Runner.java
===================================================================
--- /simplerunner/src/main/java/geniusweb/simplerunner/Runner.java	(revision 53)
+++ 	(revision )
@@ -1,139 +1,0 @@
-package geniusweb.simplerunner;
-
-import java.util.List;
-import java.util.logging.Level;
-
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.databind.ObjectMapper;
-
-import geniusweb.events.ProtocolEvent;
-import geniusweb.protocol.CurrentNegoState;
-import geniusweb.protocol.NegoProtocol;
-import geniusweb.protocol.NegoSettings;
-import geniusweb.protocol.NegoState;
-import geniusweb.protocol.partyconnection.ProtocolToPartyConnFactory;
-import tudelft.utilities.logging.Reporter;
-
-/**
- * A simple tool to run a negotiation stand-alone, without starting the servers.
- * All referred files and classes need to be stored locally (or be in the
- * dependency list if you use maven).
- * <p>
- * <em>IMPORTANT</em> SimpleRunner has a number of restrictions, compared to a
- * run using a runserver and partyserver
- * <ul>
- * <li>With stand-alone runner, your parties are run together in a single
- * classloader. The main implication is that there may arise version conflicts
- * between parties.
- * <li>Stand-alone runner does NOT enforce the time deadline. Parties may
- * continue running indefinitely and thus bog down the JVM and stalling
- * tournaments.
- * </ul>
- */
-public class Runner implements Runnable {
-	private final static ObjectMapper jackson = new ObjectMapper();
-
-	private final NegoSettings settings;
-	private final NegoProtocol protocol;
-	private final ClassPathConnectionFactory connectionfactory;
-	protected final Reporter log;
-	private boolean properlyStopped = false;
-	private final int LOOPTIME = 200;// ms
-	private final int FINALWAITTIME = 5000;// ms
-	private long maxruntime;
-
-	/**
-	 * 
-	 * @param settings          the {@link NegoSettings}
-	 * @param connectionfactory the {@link ProtocolToPartyConnFactory}
-	 * @param logger            the {@link Reporter} to log problems
-	 * @param maxruntime        limit in millisecs. Ignored if 0
-	 */
-	public Runner(NegoSettings settings,
-			ClassPathConnectionFactory connectionfactory, Reporter logger,
-			long maxruntime) {
-		if (settings == null || connectionfactory == null) {
-			throw new NullPointerException("Arguments must be not null");
-		}
-		this.settings = settings;
-		this.log = logger;
-		this.protocol = settings.getProtocol(log);
-		this.connectionfactory = connectionfactory;
-		this.maxruntime = maxruntime;
-	}
-
-	/**
-	 * 
-	 * @return true if the runner has finished
-	 */
-	public boolean isProperlyStopped() {
-		return properlyStopped;
-	}
-
-	@Override
-	public void run() {
-		protocol.addListener(evt -> handle(evt));
-		protocol.start(connectionfactory);
-		long remainingtime = maxruntime;
-		while (!properlyStopped && (maxruntime == 0 || remainingtime > 0)) {
-			try {
-				Thread.sleep(LOOPTIME);
-				remainingtime -= LOOPTIME;
-			} catch (InterruptedException e) {
-				e.printStackTrace();
-			}
-		}
-		log.log(Level.INFO, "Waiting for connection closure");
-
-		remainingtime = FINALWAITTIME;
-		while (remainingtime > 0
-				&& !connectionfactory.getOpenConnections().isEmpty()) {
-			try {
-				Thread.sleep(LOOPTIME);
-				remainingtime -= LOOPTIME;
-			} catch (InterruptedException e) {
-				e.printStackTrace();
-			}
-		}
-		List<BasicConnection> openconn = connectionfactory.getOpenConnections();
-		if (!openconn.isEmpty())
-			log.log(Level.WARNING, "Connections " + openconn
-					+ " did not close properly at end of run");
-		log.log(Level.INFO, "end run");
-	}
-
-	private void handle(ProtocolEvent evt) {
-		if (evt instanceof CurrentNegoState && ((CurrentNegoState) evt)
-				.getState().isFinal(System.currentTimeMillis())) {
-			stop();
-		}
-	}
-
-	protected void stop() {
-		logFinal(Level.INFO, protocol.getState());
-		properlyStopped = true;
-	}
-
-	/**
-	 * Separate so that we can intercept this when mocking, as this will crash
-	 * on mocks because {@link #jackson} can not handle mocks.
-	 * 
-	 * @param level the log {@link Level}
-	 * @param state the {@link NegoState} to log
-	 */
-	protected void logFinal(Level level, NegoState state) {
-		try {
-			log.log(level, "protocol ended normally: "
-					+ jackson.writeValueAsString(protocol.getState()));
-		} catch (JsonProcessingException e) {
-			e.printStackTrace();
-		}
-	}
-
-	/**
-	 * @return protocol that runs/ran the session.
-	 */
-	public NegoProtocol getProtocol() {
-		return protocol;
-	}
-}
Index: /simplerunner/src/test/java/geniusweb/simplerunner/ClassPathConnectionFactoryTest.java
===================================================================
--- /simplerunner/src/test/java/geniusweb/simplerunner/ClassPathConnectionFactoryTest.java	(revision 53)
+++ /simplerunner/src/test/java/geniusweb/simplerunner/ClassPathConnectionFactoryTest.java	(revision 1)
@@ -1,5 +1,4 @@
 package geniusweb.simplerunner;
 
-import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 
@@ -11,17 +10,15 @@
 
 import geniusweb.actions.Action;
-import geniusweb.connection.ConnectionEnd;
-import geniusweb.inform.Inform;
+import geniusweb.connection.Connection;
+import geniusweb.party.inform.Inform;
 import geniusweb.references.PartyRef;
+import geniusweb.simplerunner.ClassPathConnectionFactory;
 
 public class ClassPathConnectionFactoryTest {
 	private ClassPathConnectionFactory factory;
-	private PartyRef PARTYREF;
 
 	@Before
-	public void before() throws URISyntaxException {
+	public void before() {
 		factory = new ClassPathConnectionFactory();
-		PARTYREF = new PartyRef(
-				"classpath:geniusweb.exampleparties.randomparty.RandomParty");
 
 	}
@@ -45,51 +42,8 @@
 	@Test
 	public void testRandomParty() throws IOException, URISyntaxException {
-		ConnectionEnd<Action, Inform> party = factory.connect(PARTYREF);
+		Connection<Action, Inform> party = factory.connect(new PartyRef(
+				"classpath:geniusweb.exampleparties.randomparty.RandomParty"));
 		assertNotNull(party);
 	}
 
-	@Test
-	public void testConnectionPairProtocolClosesNormally()
-			throws InterruptedException {
-		ConnectionPair cpair = new ConnectionPair(PARTYREF);
-		assertEquals(2, cpair.getOpenConnections().size());
-		cpair.getProtocolToPartyConn().close();
-		Thread.sleep(100);
-
-		assertEquals(0, cpair.getOpenConnections().size());
-
-	}
-
-	@Test
-	public void testConnectionPairProtocolClosesWithExc()
-			throws InterruptedException {
-		ConnectionPair cpair = new ConnectionPair(PARTYREF);
-		assertEquals(2, cpair.getOpenConnections().size());
-		cpair.getProtocolToPartyConn().setError(new Error("test"));
-		Thread.sleep(100);
-		assertEquals(0, cpair.getOpenConnections().size());
-	}
-
-	@Test
-	public void testConnectionPairPartyClosesNormally()
-			throws InterruptedException {
-		ConnectionPair cpair = new ConnectionPair(PARTYREF);
-		assertEquals(2, cpair.getOpenConnections().size());
-		cpair.getPartyToProtocolConn().close();
-		Thread.sleep(100);
-
-		assertEquals(0, cpair.getOpenConnections().size());
-
-	}
-
-	@Test
-	public void testConnectionPairPartyClosesWithExc()
-			throws InterruptedException {
-		ConnectionPair cpair = new ConnectionPair(PARTYREF);
-		assertEquals(2, cpair.getOpenConnections().size());
-		cpair.getPartyToProtocolConn().setError(new Error("test"));
-		Thread.sleep(100);
-		assertEquals(0, cpair.getOpenConnections().size());
-	}
-
 }
Index: /simplerunner/src/test/java/geniusweb/simplerunner/SessionRunnerE2ETest.java
===================================================================
--- /simplerunner/src/test/java/geniusweb/simplerunner/SessionRunnerE2ETest.java	(revision 53)
+++ /simplerunner/src/test/java/geniusweb/simplerunner/SessionRunnerE2ETest.java	(revision 1)
@@ -1,10 +1,3 @@
 package geniusweb.simplerunner;
-
-import static org.junit.Assert.assertTrue;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
 
 import java.io.IOException;
@@ -12,17 +5,13 @@
 import java.nio.file.Files;
 import java.nio.file.Paths;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.logging.Level;
 
 import org.junit.Before;
 import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-import org.junit.runners.Parameterized.Parameters;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
 
-import geniusweb.protocol.NegoSettings;
+import geniusweb.protocol.session.SessionSettings;
+import geniusweb.simplerunner.ClassPathConnectionFactory;
+import geniusweb.simplerunner.NegoRunner;
 import tudelft.utilities.logging.ReportToLogger;
 import tudelft.utilities.logging.Reporter;
@@ -33,38 +22,20 @@
  * this module.
  */
-@RunWith(Parameterized.class)
 public class SessionRunnerE2ETest {
-	private static final int TEST_RUNTIME = 5000;
+	private static final String SESSION_SETTINGS = "src/test/resources/settings.json";
 	private final ObjectMapper jackson = new ObjectMapper();
-	private Runner runner;
-	private Reporter logger = spy(new ReportToLogger("test"));
-	private String filename;
-
-	@Parameters
-	public static Collection<Object[]> data() {
-		return Arrays
-				.asList(new Object[][] { { "src/test/resources/settings.json" },
-						{ "src/test/resources/settings2.json" },
-						{ "src/test/resources/settingsbadprofile.json" },
-						{ "src/test/resources/shaoptoursettings.json" },
-						{ "src/test/resources/mopac.json" },
-						{ "src/test/resources/tournament.json" },
-						{ "src/test/resources/tournamentlearn.json" } });
-	}
-
-	public SessionRunnerE2ETest(String file) {
-		this.filename = file;
-	}
+	private NegoRunner runner;
+	private Reporter logger = new ReportToLogger("test");
 
 	@Before
 	public void before() throws IOException {
-		System.out.println("Running from file " + filename);
-		String serialized = new String(Files.readAllBytes(Paths.get(filename)),
+		String serialized = new String(
+				Files.readAllBytes(Paths.get(SESSION_SETTINGS)),
 				StandardCharsets.UTF_8);
-		NegoSettings settings = jackson.readValue(serialized,
-				NegoSettings.class);
+		SessionSettings settings = jackson.readValue(serialized,
+				SessionSettings.class);
 
-		runner = new Runner(settings, new ClassPathConnectionFactory(), logger,
-				TEST_RUNTIME);
+		runner = new NegoRunner(settings, new ClassPathConnectionFactory(),
+				logger);
 
 	}
@@ -77,13 +48,9 @@
 	public void runTest() throws IOException {
 		runner.run();
-		System.out.println("Final state:\n" + runner.getProtocol().getState());
-		assertTrue(runner.isProperlyStopped());
-		verify(logger, times(0)).log(eq(Level.WARNING), any());
-		verify(logger, times(0)).log(eq(Level.SEVERE), any());
 	}
 
 	@Test
 	public void runTestMainFunction() throws IOException {
-		NegoRunner.main(new String[] { filename });
+		NegoRunner.main(new String[] { SESSION_SETTINGS });
 	}
 }
Index: /simplerunner/src/test/java/geniusweb/simplerunner/SessionRunnerTest.java
===================================================================
--- /simplerunner/src/test/java/geniusweb/simplerunner/SessionRunnerTest.java	(revision 53)
+++ /simplerunner/src/test/java/geniusweb/simplerunner/SessionRunnerTest.java	(revision 1)
@@ -1,7 +1,7 @@
 package geniusweb.simplerunner;
 
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyLong;
-import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyLong;
+import static org.mockito.Matchers.eq;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.spy;
@@ -16,11 +16,11 @@
 import org.mockito.ArgumentCaptor;
 
-import geniusweb.actions.PartyId;
 import geniusweb.protocol.CurrentNegoState;
-import geniusweb.protocol.NegoState;
 import geniusweb.protocol.ProtocolException;
+import geniusweb.protocol.partyconnection.ConnectionWithPartyFactory;
 import geniusweb.protocol.session.SessionProtocol;
 import geniusweb.protocol.session.SessionSettings;
 import geniusweb.protocol.session.SessionState;
+import geniusweb.simplerunner.NegoRunner;
 import tudelft.utilities.listener.Listener;
 import tudelft.utilities.logging.ReportToLogger;
@@ -29,5 +29,5 @@
 public class SessionRunnerTest {
 	private static final ProtocolException PROTOCOL_EXC = new ProtocolException(
-			"fake protocol exception", new PartyId("test"));
+			"fake protocol exception", "test");
 	private CurrentNegoState finishedEvent;
 	private final long NOW = 1000;
@@ -46,6 +46,6 @@
 	@Test
 	public void smokeTest() {
-		new Runner(mock(SessionSettings.class),
-				mock(ClassPathConnectionFactory.class), logger, 5000);
+		new NegoRunner(mock(SessionSettings.class),
+				mock(ConnectionWithPartyFactory.class), logger);
 	}
 
@@ -56,8 +56,9 @@
 		when(settings.getProtocol(logger)).thenReturn(protocol);
 		@SuppressWarnings("unchecked")
-		ClassPathConnectionFactory factory = mock(
-				ClassPathConnectionFactory.class);
+		ConnectionWithPartyFactory factory = mock(
+				ConnectionWithPartyFactory.class);
 
-		Runner runner = spy(new Runner(settings, factory, logger, 5000));
+		NegoRunner runner = spy(
+				new NegoRunner(settings, factory, logger));
 		runner.run();
 
@@ -75,15 +76,12 @@
 		when(settings.getProtocol(any())).thenReturn(protocol);
 		SessionState state = mock(SessionState.class);
+		when(state.getError()).thenReturn(null);
 		when(protocol.getState()).thenReturn(state);
 		Reporter logger = mock(Reporter.class);
 		@SuppressWarnings("unchecked")
-		ClassPathConnectionFactory factory = mock(
-				ClassPathConnectionFactory.class);
-		Runner runner = spy(new Runner(settings, factory, logger, 5000) {
-			@Override
-			protected void logFinal(Level level, NegoState state) {
-				log.log(level, state.toString());
-			}
-		});
+		ConnectionWithPartyFactory factory = mock(
+				ConnectionWithPartyFactory.class);
+		NegoRunner runner = spy(
+				new NegoRunner(settings, factory, logger));
 		ArgumentCaptor<Listener> listener = ArgumentCaptor
 				.forClass(Listener.class);
@@ -95,5 +93,5 @@
 		listener.getValue().notifyChange(finishedEvent);
 		verify(runner, times(1)).stop();
-		verify(logger, times(0)).log(eq(Level.WARNING), any(String.class));
+		verify(logger, times(1)).log(eq(Level.INFO), any(String.class));
 
 	}
@@ -106,14 +104,11 @@
 		when(settings.getProtocol(any())).thenReturn(protocol);
 		SessionState state = mock(SessionState.class);
+		when(state.getError()).thenReturn(PROTOCOL_EXC);
 		when(protocol.getState()).thenReturn(state);
 		@SuppressWarnings("unchecked")
-		ClassPathConnectionFactory factory = mock(
-				ClassPathConnectionFactory.class);
-		Runner runner = spy(new Runner(settings, factory, logger, 5000) {
-			@Override
-			protected void logFinal(Level level, NegoState state) {
-				log.log(level, state.toString());
-			}
-		});
+		ConnectionWithPartyFactory factory = mock(
+				ConnectionWithPartyFactory.class);
+		NegoRunner runner = spy(
+				new NegoRunner(settings, factory, logger));
 		ArgumentCaptor<Listener> listener = ArgumentCaptor
 				.forClass(Listener.class);
@@ -124,8 +119,7 @@
 		listener.getValue().notifyChange(finishedEvent);
 		verify(runner, times(1)).stop();
-		// check final state is logged
-		String statestr = state.toString();
-		verify(logger, times(1)).log(any(), eq(statestr));
-
+		// check that the protocol error is logged properly
+		verify(logger, times(1)).log(eq(Level.WARNING), any(String.class),
+				eq(PROTOCOL_EXC));
 	}
 
Index: /simplerunner/src/test/resources/jobs/jobs1.json
===================================================================
--- /simplerunner/src/test/resources/jobs/jobs1.json	(revision 53)
+++ /simplerunner/src/test/resources/jobs/jobs1.json	(revision 1)
@@ -3,5 +3,5 @@
 		"issueUtilities": {
 			"salary": {
-				"DiscreteValueSetUtilities": {
+				"discreteutils": {
 					"valueUtilities": {
 						"2000": 0,
@@ -14,5 +14,5 @@
 			},
 			"fte": {
-				"DiscreteValueSetUtilities": {
+				"discreteutils": {
 					"valueUtilities": {
 						"0.6": 0.25,
@@ -23,5 +23,5 @@
 			},
 			"work from home": {
-				"DiscreteValueSetUtilities": {
+				"discreteutils": {
 					"valueUtilities": {
 						"0": 0.333333333,
@@ -32,25 +32,25 @@
 			},
 			"lease car": {
-				"DiscreteValueSetUtilities": {
+				"discreteutils": {
 					"valueUtilities": {
-						"yes": 1,
-						"no": 0
+						"yes":1,
+						"no":0
 					}
 				}
 			},
 			"permanent contract": {
-				"DiscreteValueSetUtilities": {
+				"discreteutils": {
 					"valueUtilities": {
-						"yes": 1,
-						"no": 0
+						"yes":1,
+						"no":0
 					}
 				}
 			},
 			"career development opportunities": {
-				"DiscreteValueSetUtilities": {
+				"discreteutils": {
 					"valueUtilities": {
-						"low": 0,
-						"medium": 0.5,
-						"high": 1
+						"low":0,
+						"medium":0.5,
+						"high":1
 					}
 				}
@@ -112,15 +112,5 @@
 			}
 		},
-		"name": "jobs1",
-		"reservationBid": {
-			"issuevalues": {
-				"salary": "3500",
-				"fte": "0.8",
-				"work from home": "1",
-				"lease car": "no",
-				"permanent contract": "yes",
-				"career development opportunities": "medium"
-			}
-		}
+		"name": "jobs1"
 	}
 }
Index: mplerunner/src/test/resources/jobs/jobs1partial.json
===================================================================
--- /simplerunner/src/test/resources/jobs/jobs1partial.json	(revision 53)
+++ 	(revision )
@@ -1,403 +1,0 @@
-{
-	"DefaultPartialOrdering": {
-		"name": "jobs1_20",
-		"domain": {
-			"name": "jobs",
-			"issuesValues": {
-				"lease car": {
-					"values": ["yes", "no"]
-				},
-				"permanent contract": {
-					"values": ["yes", "no"]
-				},
-				"career development opportunities": {
-					"values": ["low", "medium", "high"]
-				},
-				"fte": {
-					"values": ["0.6", "0.8", "1.0"]
-				},
-				"salary": {
-					"values": ["2000", "2500", "3000", "3500", "4000"]
-				},
-				"work from home": {
-					"values": ["0", "1", "2"]
-				}
-			}
-		},
-		"better": [
-			[0, 34],
-			[2, 9],
-			[3, 5],
-			[6, 23],
-			[12, 18],
-			[13, 27],
-			[14, 28],
-			[15, 37],
-			[17, 28],
-			[19, 1],
-			[20, 29],
-			[21, 24],
-			[22, 8],
-			[25, 10],
-			[26, 16],
-			[30, 24],
-			[31, 32],
-			[33, 7],
-			[35, 4],
-			[36, 11]
-		],
-		"bids": [{
-			"issuevalues": {
-				"lease car": "yes",
-				"permanent contract": "yes",
-				"career development opportunities": "low",
-				"fte": "0.8",
-				"salary": "4000",
-				"work from home": "0"
-			}
-		}, {
-			"issuevalues": {
-				"lease car": "no",
-				"permanent contract": "no",
-				"career development opportunities": "high",
-				"fte": "0.6",
-				"salary": "2000",
-				"work from home": "1"
-			}
-		}, {
-			"issuevalues": {
-				"lease car": "yes",
-				"permanent contract": "no",
-				"career development opportunities": "low",
-				"fte": "0.8",
-				"salary": "2000",
-				"work from home": "0"
-			}
-		}, {
-			"issuevalues": {
-				"lease car": "no",
-				"permanent contract": "yes",
-				"career development opportunities": "high",
-				"fte": "0.8",
-				"salary": "2500",
-				"work from home": "2"
-			}
-		}, {
-			"issuevalues": {
-				"lease car": "no",
-				"permanent contract": "yes",
-				"career development opportunities": "low",
-				"fte": "0.6",
-				"salary": "2000",
-				"work from home": "2"
-			}
-		}, {
-			"issuevalues": {
-				"lease car": "no",
-				"permanent contract": "no",
-				"career development opportunities": "high",
-				"fte": "0.6",
-				"salary": "2500",
-				"work from home": "2"
-			}
-		}, {
-			"issuevalues": {
-				"lease car": "no",
-				"permanent contract": "yes",
-				"career development opportunities": "low",
-				"fte": "1.0",
-				"salary": "3500",
-				"work from home": "2"
-			}
-		}, {
-			"issuevalues": {
-				"lease car": "no",
-				"permanent contract": "yes",
-				"career development opportunities": "medium",
-				"fte": "1.0",
-				"salary": "3000",
-				"work from home": "0"
-			}
-		}, {
-			"issuevalues": {
-				"lease car": "no",
-				"permanent contract": "yes",
-				"career development opportunities": "high",
-				"fte": "0.6",
-				"salary": "3500",
-				"work from home": "1"
-			}
-		}, {
-			"issuevalues": {
-				"lease car": "no",
-				"permanent contract": "no",
-				"career development opportunities": "medium",
-				"fte": "0.6",
-				"salary": "2000",
-				"work from home": "1"
-			}
-		}, {
-			"issuevalues": {
-				"lease car": "yes",
-				"permanent contract": "no",
-				"career development opportunities": "high",
-				"fte": "0.6",
-				"salary": "2000",
-				"work from home": "0"
-			}
-		}, {
-			"issuevalues": {
-				"lease car": "no",
-				"permanent contract": "no",
-				"career development opportunities": "medium",
-				"fte": "0.8",
-				"salary": "3500",
-				"work from home": "2"
-			}
-		}, {
-			"issuevalues": {
-				"lease car": "yes",
-				"permanent contract": "yes",
-				"career development opportunities": "high",
-				"fte": "0.6",
-				"salary": "2500",
-				"work from home": "2"
-			}
-		}, {
-			"issuevalues": {
-				"lease car": "no",
-				"permanent contract": "yes",
-				"career development opportunities": "low",
-				"fte": "0.8",
-				"salary": "3000",
-				"work from home": "1"
-			}
-		}, {
-			"issuevalues": {
-				"lease car": "yes",
-				"permanent contract": "yes",
-				"career development opportunities": "high",
-				"fte": "0.8",
-				"salary": "2000",
-				"work from home": "2"
-			}
-		}, {
-			"issuevalues": {
-				"lease car": "no",
-				"permanent contract": "yes",
-				"career development opportunities": "high",
-				"fte": "1.0",
-				"salary": "3500",
-				"work from home": "0"
-			}
-		}, {
-			"issuevalues": {
-				"lease car": "no",
-				"permanent contract": "yes",
-				"career development opportunities": "medium",
-				"fte": "0.8",
-				"salary": "4000",
-				"work from home": "0"
-			}
-		}, {
-			"issuevalues": {
-				"lease car": "yes",
-				"permanent contract": "no",
-				"career development opportunities": "medium",
-				"fte": "0.8",
-				"salary": "3000",
-				"work from home": "1"
-			}
-		}, {
-			"issuevalues": {
-				"lease car": "no",
-				"permanent contract": "yes",
-				"career development opportunities": "high",
-				"fte": "0.8",
-				"salary": "2000",
-				"work from home": "0"
-			}
-		}, {
-			"issuevalues": {
-				"lease car": "no",
-				"permanent contract": "yes",
-				"career development opportunities": "low",
-				"fte": "1.0",
-				"salary": "3000",
-				"work from home": "2"
-			}
-		}, {
-			"issuevalues": {
-				"lease car": "yes",
-				"permanent contract": "no",
-				"career development opportunities": "medium",
-				"fte": "1.0",
-				"salary": "4000",
-				"work from home": "1"
-			}
-		}, {
-			"issuevalues": {
-				"lease car": "no",
-				"permanent contract": "no",
-				"career development opportunities": "low",
-				"fte": "1.0",
-				"salary": "3500",
-				"work from home": "2"
-			}
-		}, {
-			"issuevalues": {
-				"lease car": "yes",
-				"permanent contract": "yes",
-				"career development opportunities": "medium",
-				"fte": "1.0",
-				"salary": "2500",
-				"work from home": "2"
-			}
-		}, {
-			"issuevalues": {
-				"lease car": "yes",
-				"permanent contract": "no",
-				"career development opportunities": "low",
-				"fte": "1.0",
-				"salary": "3000",
-				"work from home": "2"
-			}
-		}, {
-			"issuevalues": {
-				"lease car": "no",
-				"permanent contract": "yes",
-				"career development opportunities": "medium",
-				"fte": "0.8",
-				"salary": "3000",
-				"work from home": "2"
-			}
-		}, {
-			"issuevalues": {
-				"lease car": "no",
-				"permanent contract": "no",
-				"career development opportunities": "medium",
-				"fte": "0.8",
-				"salary": "2000",
-				"work from home": "1"
-			}
-		}, {
-			"issuevalues": {
-				"lease car": "yes",
-				"permanent contract": "yes",
-				"career development opportunities": "low",
-				"fte": "0.8",
-				"salary": "3500",
-				"work from home": "2"
-			}
-		}, {
-			"issuevalues": {
-				"lease car": "yes",
-				"permanent contract": "no",
-				"career development opportunities": "medium",
-				"fte": "0.6",
-				"salary": "4000",
-				"work from home": "0"
-			}
-		}, {
-			"issuevalues": {
-				"lease car": "no",
-				"permanent contract": "no",
-				"career development opportunities": "low",
-				"fte": "0.6",
-				"salary": "2000",
-				"work from home": "0"
-			}
-		}, {
-			"issuevalues": {
-				"lease car": "no",
-				"permanent contract": "no",
-				"career development opportunities": "low",
-				"fte": "0.6",
-				"salary": "3500",
-				"work from home": "1"
-			}
-		}, {
-			"issuevalues": {
-				"lease car": "yes",
-				"permanent contract": "no",
-				"career development opportunities": "high",
-				"fte": "0.8",
-				"salary": "4000",
-				"work from home": "1"
-			}
-		}, {
-			"issuevalues": {
-				"lease car": "no",
-				"permanent contract": "yes",
-				"career development opportunities": "low",
-				"fte": "0.8",
-				"salary": "4000",
-				"work from home": "1"
-			}
-		}, {
-			"issuevalues": {
-				"lease car": "no",
-				"permanent contract": "yes",
-				"career development opportunities": "high",
-				"fte": "0.8",
-				"salary": "2500",
-				"work from home": "0"
-			}
-		}, {
-			"issuevalues": {
-				"lease car": "no",
-				"permanent contract": "yes",
-				"career development opportunities": "medium",
-				"fte": "1.0",
-				"salary": "4000",
-				"work from home": "0"
-			}
-		}, {
-			"issuevalues": {
-				"lease car": "yes",
-				"permanent contract": "no",
-				"career development opportunities": "high",
-				"fte": "0.6",
-				"salary": "2500",
-				"work from home": "2"
-			}
-		}, {
-			"issuevalues": {
-				"lease car": "yes",
-				"permanent contract": "yes",
-				"career development opportunities": "low",
-				"fte": "0.8",
-				"salary": "3500",
-				"work from home": "0"
-			}
-		}, {
-			"issuevalues": {
-				"lease car": "yes",
-				"permanent contract": "no",
-				"career development opportunities": "high",
-				"fte": "1.0",
-				"salary": "4000",
-				"work from home": "1"
-			}
-		}, {
-			"issuevalues": {
-				"lease car": "yes",
-				"permanent contract": "no",
-				"career development opportunities": "medium",
-				"fte": "0.8",
-				"salary": "3500",
-				"work from home": "2"
-			}
-		}],
-		"reservationBid": {
-			"issuevalues": {
-				"lease car": "no",
-				"permanent contract": "no",
-				"career development opportunities": "low",
-				"fte": "0.6",
-				"salary": "3500",
-				"work from home": "1"
-			}
-		}
-	}
-}
Index: /simplerunner/src/test/resources/jobs/jobs2.json
===================================================================
--- /simplerunner/src/test/resources/jobs/jobs2.json	(revision 53)
+++ /simplerunner/src/test/resources/jobs/jobs2.json	(revision 1)
@@ -3,5 +3,5 @@
 		"issueUtilities": {
 			"salary": {
-				"DiscreteValueSetUtilities": {
+				"discreteutils": {
 					"valueUtilities": {
 						"2000": 1.0,
@@ -14,5 +14,5 @@
 			},
 			"fte": {
-				"DiscreteValueSetUtilities": {
+				"discreteutils": {
 					"valueUtilities": {
 						"0.6": 0.363636363636363636,
@@ -23,5 +23,5 @@
 			},
 			"work from home": {
-				"DiscreteValueSetUtilities": {
+				"discreteutils": {
 					"valueUtilities": {
 						"0": 1.0,
@@ -32,25 +32,25 @@
 			},
 			"lease car": {
-				"DiscreteValueSetUtilities": {
+				"discreteutils": {
 					"valueUtilities": {
-						"yes": 0,
-						"no": 1
+						"yes":0,
+						"no":1
 					}
 				}
 			},
 			"permanent contract": {
-				"DiscreteValueSetUtilities": {
+				"discreteutils": {
 					"valueUtilities": {
-						"yes": 0.23809523809523808,
-						"no": 0.761904761904762
+						"yes":0.23809523809523808,
+						"no":0.761904761904762
 					}
 				}
 			},
 			"career development opportunities": {
-				"DiscreteValueSetUtilities": {
+				"discreteutils": {
 					"valueUtilities": {
-						"low": 1.0,
-						"medium": 0.5,
-						"high": 0
+						"low":1.0,
+						"medium":0.5,
+						"high":0
 					}
 				}
@@ -112,15 +112,5 @@
 			}
 		},
-		"name": "jobs2",
-		"reservationBid": {
-			"issuevalues": {
-				"salary": "3000",
-				"fte": "0.8",
-				"work from home": "0",
-				"lease car": "no",
-				"permanent contract": "no",
-				"career development opportunities": "medium"
-			}
-		}
+		"name": "jobs2"
 	}
 }
Index: mplerunner/src/test/resources/mopac.json
===================================================================
--- /simplerunner/src/test/resources/mopac.json	(revision 53)
+++ 	(revision )
@@ -1,22 +1,0 @@
-{
-	"MOPACSettings": {
-		"participants": [
-		{"TeamInfo":{"parties":[
-		{
-			"party": {"partyref":"classpath:geniusweb.exampleparties.randomparty.RandomParty", "parameters":{"power":1}},
-			"profile": "file:src/test/resources/jobs/jobs1.json"
-		} ]}}, 
-		
-		{"TeamInfo":{"parties":[
-		{
-			"party": {"partyref":"classpath:geniusweb.exampleparties.randomparty.RandomParty", "parameters":{"power":1}},
-			"profile": "file:src/test/resources/jobs/jobs2.json"
-		} ]}} ],
-		"deadline": {
-			"DeadlineTime": {
-				"durationms": 2000000
-			}
-		},
-		"votingevaluator":{"LargestAgreementsLoop":{}}
-	}
-}
Index: /simplerunner/src/test/resources/settings.json
===================================================================
--- /simplerunner/src/test/resources/settings.json	(revision 53)
+++ /simplerunner/src/test/resources/settings.json	(revision 1)
@@ -1,18 +1,13 @@
 {
 	"SAOPSettings": {
-		"participants": [
-		{"TeamInfo":{"parties":[
-		{
-			"party": {"partyref":"classpath:geniusweb.exampleparties.randomparty.RandomParty", "parameters":{}},
+		"participants": [{
+			"party": "classpath:geniusweb.exampleparties.randomparty.RandomParty",
 			"profile": "file:src/test/resources/jobs/jobs1.json"
-		} ]}}, 
-		{"TeamInfo":{"parties":[
-		{
-			"party": {"partyref":"classpath:geniusweb.exampleparties.randomparty.RandomParty", "parameters":{}},
+		}, {
+			"party": "classpath:geniusweb.exampleparties.randomparty.RandomParty",
 			"profile": "file:src/test/resources/jobs/jobs2.json"
-		} ]}}
-		],
+		}],
 		"deadline": {
-			"DeadlineTime": {
+			"deadlinetime": {
 				"durationms": 100
 			}
Index: mplerunner/src/test/resources/settings2.json
===================================================================
--- /simplerunner/src/test/resources/settings2.json	(revision 53)
+++ 	(revision )
@@ -1,23 +1,0 @@
-{
-	"SAOPSettings": {
-		"participants": [
-		{"TeamInfo":{"parties":[
-		{
-			"party": {"partyref":"classpath:geniusweb.exampleparties.randomparty.RandomParty", "parameters":{}},
-			"profile": "file:src/test/resources/jobs/jobs1partial.json"
-		} ]}}
-		, 
-		{"TeamInfo":{"parties":[
-		{
-			"party": {"partyref":"classpath:geniusweb.exampleparties.randomparty.RandomParty","parameters":{}},
-			"profile": "file:src/test/resources/jobs/jobs2.json"
-		} ]}}
-		],
-		"deadline": {
-			"DeadlineTime": {
-				"durationms": 100
-			}
-		}
-		
-	}
-}
Index: mplerunner/src/test/resources/settingsbadprofile.json
===================================================================
--- /simplerunner/src/test/resources/settingsbadprofile.json	(revision 53)
+++ 	(revision )
@@ -1,23 +1,0 @@
-{
-	"SAOPSettings": {
-		"participants": [
-		{"TeamInfo":{"parties":[
-		{
-			"party": {"partyref":"classpath:geniusweb.exampleparties.randomparty.RandomParty", "parameters":{}},
-			"profile": "file:src/test/resources/jobs/jobs1.json"
-		} ]}}
-		, 
-		{"TeamInfo":{"parties":[
-		{
-			"party": {"partyref":"classpath:geniusweb.exampleparties.randomparty.RandomParty","parameters":{}},
-			"profile": "file:src/test/resources/jobs/nosuchprofile.json"
-		} ]}}
-		],
-		"deadline": {
-			"DeadlineTime": {
-				"durationms": 100
-			}
-		}
-		
-	}
-}
Index: mplerunner/src/test/resources/shaoptoursettings.json
===================================================================
--- /simplerunner/src/test/resources/shaoptoursettings.json	(revision 53)
+++ 	(revision )
@@ -1,64 +1,0 @@
-{
-	"AllPermutationsSettings": {
-		"teams": [
-			{
-				"Team": [
-					{
-						"partyref": "classpath:geniusweb.exampleparties.simpleshaop.ShaopParty",
-						"parameters": {
-						}
-					},{
-						"partyref": "classpath:geniusweb.exampleparties.comparebids.CompareBids",
-						"parameters": {
-						}
-					}
-					
-				]
-			},
-			{
-				"Team": [
-					{
-						"partyref": "classpath:geniusweb.exampleparties.randomparty.RandomParty",
-						"parameters": {
-						}
-					},{
-						"partyref": "classpath:geniusweb.exampleparties.comparebids.CompareBids",
-						"parameters": {
-						}
-					}
-				]
-			}
-		],
-		"reuseTeams": false,
-		"profileslists": [
-			{
-				"ProfileList": [
-					"file:src/test/resources/jobs/jobs1partial.json",
-					"file:src/test/resources/jobs/jobs1partial.json"
-					
-				]
-			},
-			{
-				"ProfileList": [
-					"file:src/test/resources/jobs/jobs2.json",
-					"file:src/test/resources/jobs/jobs2.json"
-					
-				]
-			}
-		],
-		"teamsPerSession": 2,
-		"sessionsettings": {
-			"SHAOPSettings": {
-				"participants": [
-				],
-				"deadline": {
-					"DeadlineRounds": {
-						"rounds": 10,
-						"durationms": 1000
-					}
-				}
-			}
-		},
-		"numberTournaments":1
-	}
-}
Index: mplerunner/src/test/resources/tournament.json
===================================================================
--- /simplerunner/src/test/resources/tournament.json	(revision 53)
+++ 	(revision )
@@ -1,65 +1,0 @@
-{
-	"AllPermutationsSettings": {
-		"teams": [
-			{
-				"Team": [
-					{
-						"partyref": "classpath:geniusweb.exampleparties.randomparty.RandomParty",
-						"parameters": {
-						}
-					}
-				]
-			},
-			{
-				"Team": [
-					{
-						"partyref": "classpath:geniusweb.exampleparties.randomparty.RandomParty",
-						"parameters": {
-						}
-					}
-				]
-			},
-			{
-				"Team": [
-					{
-						"partyref": "classpath:geniusweb.exampleparties.randomparty.RandomParty",
-						"parameters": {
-						}
-					}
-				]
-			}
-		],
-		"reuseTeams": false,
-		"profileslists": [
-			{
-				"ProfileList": [
-					"file:src/test/resources/party/party1.json"
-				]
-			},
-			{
-				"ProfileList": [
-					"file:src/test/resources/party/party2.json"				
-				]
-			},
-			{
-				"ProfileList": [
-					"file:src/test/resources/party/party3.json"					
-				]
-			}
-		],
-		"teamsPerSession": 2,
-		"sessionsettings": {
-			"SAOPSettings": {
-				"participants": [
-				],
-				"deadline": {
-					"DeadlineRounds": {
-						"rounds": 10,
-						"durationms": 1000
-					}
-				}
-			}
-		},
-		"numberTournaments":1
-	}
-}
Index: mplerunner/src/test/resources/tournamentlearn.json
===================================================================
--- /simplerunner/src/test/resources/tournamentlearn.json	(revision 53)
+++ 	(revision )
@@ -1,90 +1,0 @@
-{
-	"AllPermutationsLearnSettings": {
-		"teams": [
-			{
-				"Team": [
-					{
-						"partyref": "classpath:geniusweb.exampleparties.randomparty.RandomParty",
-						"parameters": {
-							"persistentstate": "a48b8bc9-4275-4a4e-bee9-6c0a734dc99a",
-							"negotiationdata": [
-
-							]
-						}
-					}
-				]
-			},
-			{
-				"Team": [
-					{
-						"partyref": "classpath:geniusweb.exampleparties.randomparty.RandomParty",
-						"parameters": {
-							"persistentstate": "12b6af6c-b8a0-4731-8b37-0454cafeb7f4",
-							"negotiationdata": [
-
-							]
-						}
-					}
-				]
-			},
-			{
-				"Team": [
-					{
-						"partyref": "classpath:geniusweb.exampleparties.randomparty.RandomParty",
-						"parameters": {
-							"persistentstate": "f392eb22-0ad9-459f-ac56-032973f1a6e1",
-							"negotiationdata": [
-
-							]
-						}
-					}
-				]
-			}
-		],
-		"reuseTeams": false,
-		"profileslists": [
-			{
-				"ProfileList": [
-					"file:src/test/resources/party/party1.json"
-				]
-			},
-			{
-				"ProfileList": [
-					"file:src/test/resources/party/party2.json"				
-				]
-			},
-			{
-				"ProfileList": [
-					"file:src/test/resources/party/party3.json"					
-				]
-			}
-		],
-		"teamsPerSession": 2,
-		"sessionsettings": {
-			"SAOPSettings": {
-				"participants": [
-				],
-				"deadline": {
-					"DeadlineRounds": {
-						"rounds": 10,
-						"durationms": 1000
-					}
-				}
-			}
-		},
-		"numberTournaments":1,
-		"learnSettings": {
-			"LearnSettings": {
-				"participants": [
-
-				],
-				"deadline": {
-					"DeadlineTime": {
-						"durationms": 2000
-					}
-				}
-			}
-		}
-		
-	}
-}
Index: /timeline/pom.xml
===================================================================
--- /timeline/pom.xml	(revision 53)
+++ /timeline/pom.xml	(revision 1)
@@ -6,5 +6,5 @@
 	<groupId>geniusweb</groupId>
 	<artifactId>timeline</artifactId>
-	<version>2.2.1</version>  <!-- equals the geniusweb version -->
+	<version>1.0.0</version>
 	<packaging>jar</packaging>
 
@@ -15,6 +15,5 @@
 		<basedir>.</basedir>
 		<passwd>${env.ARTIFACTORY_PASS}</passwd>
-		<jackson-2-version>2.12.3</jackson-2-version>
-		<geniusweb.version>${project.version}</geniusweb.version>
+		<jackson-2-version>2.9.6</jackson-2-version>
 	</properties>
 
@@ -22,5 +21,5 @@
 		<repository>
 			<id>artifactory.ewi.tudelft.nl</id>
-			<url>https://artifactory.ewi.tudelft.nl/artifactory/libs-release</url>
+			<url>http://artifactory.ewi.tudelft.nl/artifactory/libs-release</url>
 		</repository>
 	</distributionManagement>
@@ -77,6 +76,6 @@
 		<dependency>
 			<groupId>org.mockito</groupId>
-			<artifactId>mockito-core</artifactId>
-			<version>3.11.2</version>
+			<artifactId>mockito-all</artifactId>
+			<version>1.9.5</version>
 			<scope>test</scope>
 		</dependency>
@@ -85,5 +84,5 @@
 			<groupId>tudelft.utilities</groupId>
 			<artifactId>junit</artifactId>
-			<version>1.0.5</version>
+			<version>1.0.1</version>
 			<scope>test</scope>
 		</dependency>
@@ -95,21 +94,19 @@
 		<repository>
 			<id>artifactory.ewi.tudelft.nl</id>
-			<url>https://artifactory.ewi.tudelft.nl/artifactory/libs-release</url>
+			<url>http://artifactory.ewi.tudelft.nl/artifactory/libs-release</url>
 			<snapshots>
 				<enabled>false</enabled>
 			</snapshots>
 		</repository>
+
 	</repositories>
 
 	<pluginRepositories>
 		<pluginRepository>
-			<id>central</id>
-			<url>https://repo1.maven.org/maven2</url>
-		</pluginRepository>
-		<pluginRepository>
-			<id>artifactory.ewi.tudelft.nl</id>
-			<url>https://artifactory.ewi.tudelft.nl/artifactory/libs-release</url>
+			<id>jcenter</id>
+			<url>http://jcenter.bintray.com</url>
 		</pluginRepository>
 	</pluginRepositories>
+
 
 	<build>
@@ -125,22 +122,9 @@
 				</configuration>
 			</plugin>
-			<plugin>
-				<groupId>org.apache.maven.plugins</groupId>
-				<artifactId>maven-source-plugin</artifactId>
-				<version>3.1.0</version>
-				<executions>
-					<execution>
-						<id>attach-sources</id>
-						<goals>
-							<goal>jar</goal>
-						</goals>
-					</execution>
-				</executions>
-			</plugin>
 
 			<plugin>
 				<groupId>org.apache.maven.plugins</groupId>
 				<artifactId>maven-javadoc-plugin</artifactId>
-				<version>3.2.0</version>
+				<version>2.10.1</version>
 				<executions>
 					<execution>
@@ -149,4 +133,8 @@
 							<goal>jar</goal>
 						</goals>
+						<configuration>
+							<additionalparam>${javadoc.opts}</additionalparam>
+							<additionalparam>-Xdoclint:none</additionalparam>
+						</configuration>
 					</execution>
 				</executions>
@@ -156,5 +144,5 @@
 				<groupId>org.jfrog.buildinfo</groupId>
 				<artifactId>artifactory-maven-plugin</artifactId>
-				<version>3.2.3</version>
+				<version>2.6.1</version>
 				<executions>
 					<execution>
Index: /timeline/src/main/java/geniusweb/deadline/DeadlineRounds.java
===================================================================
--- /timeline/src/main/java/geniusweb/deadline/DeadlineRounds.java	(revision 53)
+++ /timeline/src/main/java/geniusweb/deadline/DeadlineRounds.java	(revision 1)
@@ -3,4 +3,5 @@
 import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonTypeName;
 
 /**
@@ -10,4 +11,5 @@
  * the protocol.
  */
+@JsonTypeName("deadlinerounds")
 public class DeadlineRounds extends DeadlineTime {
 	private final Integer rounds;
Index: /timeline/src/main/java/geniusweb/deadline/DeadlineTime.java
===================================================================
--- /timeline/src/main/java/geniusweb/deadline/DeadlineTime.java	(revision 53)
+++ /timeline/src/main/java/geniusweb/deadline/DeadlineTime.java	(revision 1)
@@ -3,8 +3,10 @@
 import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonTypeName;
 
 /**
  * How long a session will be allowed to run
  */
+@JsonTypeName("deadlinetime")
 public class DeadlineTime implements Deadline {
 
Index: /timeline/src/main/java/geniusweb/progress/Progress.java
===================================================================
--- /timeline/src/main/java/geniusweb/progress/Progress.java	(revision 53)
+++ /timeline/src/main/java/geniusweb/progress/Progress.java	(revision 1)
@@ -34,5 +34,5 @@
 	 *         eye on {@link #getTerminationTime()}.
 	 */
-	Double get(Long currentTimeMs);
+	Double get(long currentTimeMs);
 
 	/**
@@ -51,4 +51,4 @@
 	 * @return true iff the progress has passed the deadline.
 	 */
-	boolean isPastDeadline(Long currentTimeMs);
+	boolean isPastDeadline(long currentTimeMs);
 }
Index: /timeline/src/main/java/geniusweb/progress/ProgressRounds.java
===================================================================
--- /timeline/src/main/java/geniusweb/progress/ProgressRounds.java	(revision 53)
+++ /timeline/src/main/java/geniusweb/progress/ProgressRounds.java	(revision 1)
@@ -5,9 +5,11 @@
 import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonTypeName;
 
 /**
  * progress in terms of number of rounds. The round has to be updated by the
- * user of this class, calling {@link #advance()}. immutable.
+ * user of this class, calling {@link #advance()}.
  */
+@JsonTypeName("rounds")
 public class ProgressRounds implements Progress {
 
@@ -45,28 +47,6 @@
 	}
 
-	/**
-	 * 
-	 * @return the current round. First round is 0. It is recommended that you
-	 *         use the functions in {@link Progress} instead of this, to ensure
-	 *         your code works with all implementations of Progress including
-	 *         future developments.
-	 */
-	public Integer getCurrentRound() {
-		return currentRound;
-	}
-
-	/**
-	 * 
-	 * @return total number of rounds. It is recommended that you use the
-	 *         functions in {@link Progress} instead of this, to ensure your
-	 *         code works with all implementations of Progress including future
-	 *         developments.
-	 */
-	public Integer getTotalRounds() {
-		return duration;
-	}
-
 	@Override
-	public Double get(Long currentTimeMs) {
+	public Double get(long currentTimeMs) {
 		// deadline and current both are limited to MAXINT is 32 bits; double
 		// fits 52
@@ -81,5 +61,5 @@
 
 	@Override
-	public boolean isPastDeadline(Long currentTimeMs) {
+	public boolean isPastDeadline(long currentTimeMs) {
 		return currentRound >= duration || currentTimeMs > endtime.getTime();
 	}
Index: /timeline/src/main/java/geniusweb/progress/ProgressTime.java
===================================================================
--- /timeline/src/main/java/geniusweb/progress/ProgressTime.java	(revision 53)
+++ /timeline/src/main/java/geniusweb/progress/ProgressTime.java	(revision 1)
@@ -5,4 +5,5 @@
 import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonTypeName;
 
 import geniusweb.deadline.DeadlineTime;
@@ -14,4 +15,5 @@
  *
  */
+@JsonTypeName("time")
 public class ProgressTime implements Progress {
 
@@ -28,10 +30,16 @@
 	private final Long duration;
 
+	@SuppressWarnings("unused") // for deserializer
+	private ProgressTime() {
+		start = null;
+		duration = null;
+	}
+
 	/**
 	 * 
-	 * @param d     the duration, eg {@link DeadlineTime#getDuration()}. Must be
-	 *              &gt; 0.
-	 * @param start the start Date (unix time in millisecs since 1970). See
-	 *              {@link System#currentTimeMillis()}.
+	 * @param duration the duration, eg {@link DeadlineTime#getDuration()}. Must
+	 *                 be >0.
+	 * @param start    the start Date (unix time in millisecs since 1970). See
+	 *                 {@link System#currentTimeMillis()}.
 	 */
 	@JsonCreator
@@ -43,5 +51,5 @@
 
 	@Override
-	public Double get(Long currentTimeMs) {
+	public Double get(long currentTimeMs) {
 		long delta = currentTimeMs - start.getTime();
 		// double should have ~53 digits of precision, and we're computing
@@ -58,5 +66,5 @@
 
 	@Override
-	public boolean isPastDeadline(Long currentTimeMs) {
+	public boolean isPastDeadline(long currentTimeMs) {
 		return currentTimeMs > start.getTime() + duration;
 	}
Index: /timeline/src/test/java/geniusweb/deadline/DeadlineTest.java
===================================================================
--- /timeline/src/test/java/geniusweb/deadline/DeadlineTest.java	(revision 53)
+++ /timeline/src/test/java/geniusweb/deadline/DeadlineTest.java	(revision 1)
@@ -14,14 +14,17 @@
 import com.fasterxml.jackson.databind.ObjectMapper;
 
+import geniusweb.deadline.Deadline;
+import geniusweb.deadline.DeadlineRounds;
+import geniusweb.deadline.DeadlineTime;
 import tudelft.utilities.junit.GeneralTests;
 
 public class DeadlineTest extends GeneralTests<Deadline> {
 	private final ObjectMapper jackson = new ObjectMapper();
-	private final String deadlinestring = "{\"DeadlineRounds\":{\"rounds\":100,\"durationms\":999}}";
+	private final String deadlinestring = "{\"deadlinerounds\":{\"rounds\":100,\"durationms\":999}}";
 	private final DeadlineRounds deadlineRounds = new DeadlineRounds(100, 999);
 	private final DeadlineRounds deadlineRounds1 = new DeadlineRounds(100, 999);
 	private final DeadlineRounds deadlineRounds2 = new DeadlineRounds(100,
 			9999);
-	private final String deadlinetimestring = "{\"DeadlineTime\":{\"durationms\":2000}}";
+	private final String deadlinetimestring = "{\"deadlinetime\":{\"durationms\":2000}}";
 	private final DeadlineTime deadlineTime = new DeadlineTime(2000);
 
@@ -68,5 +71,4 @@
 	}
 
-	@SuppressWarnings("unused")
 	@Test(expected = IllegalArgumentException.class)
 	public void testIllegalArg() {
@@ -74,5 +76,4 @@
 	}
 
-	@SuppressWarnings("unused")
 	@Test(expected = IllegalArgumentException.class)
 	public void testIllegalArg2() {
@@ -80,8 +81,3 @@
 	}
 
-	@Test
-	public void getRounds() {
-		assertEquals((Integer) 11, new DeadlineRounds(11, 20).getRounds());
-	}
-
 }
Index: /timeline/src/test/java/geniusweb/progress/ProgressRoundsTest.java
===================================================================
--- /timeline/src/test/java/geniusweb/progress/ProgressRoundsTest.java	(revision 53)
+++ /timeline/src/test/java/geniusweb/progress/ProgressRoundsTest.java	(revision 1)
@@ -2,6 +2,4 @@
 
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
@@ -22,13 +20,14 @@
 
 import geniusweb.deadline.DeadlineRounds;
+import geniusweb.progress.Progress;
+import geniusweb.progress.ProgressRounds;
+import geniusweb.progress.ProgressTime;
 import tudelft.utilities.junit.GeneralTests;
 
 public class ProgressRoundsTest extends GeneralTests<Progress> {
 	private DeadlineRounds deadline = mock(DeadlineRounds.class);
-	private final static Integer TESTROUNDS = 10;
-	private final static long TESTTIME = 10; // milliseconds!
 
-	private final Date date = new Date(98765l);
-	private final Date date0 = new Date(100000l);
+	private final Date date = new Date(999l);
+	private final Date date0 = new Date(0l);
 
 	private final Progress deadline1 = new ProgressRounds(20, 0, date);
@@ -38,10 +37,7 @@
 	private final Progress deadline5 = new ProgressTime(20l, date);
 	private ProgressRounds progress;
+	private final static Integer TESTROUNDS = 10;
 	private final ObjectMapper jackson = new ObjectMapper();
-	private final String progressstring = "{\"ProgressRounds\":{\"duration\":10,\"currentRound\":0,\"endtime\":98765}}";
-
-	private final long start = 1234;
-	private final Date end = new Date(start + TESTTIME);
-	private final ProgressRounds pr = new ProgressRounds(TESTROUNDS, 4, end);
+	private final String progressstring = "{\"rounds\":{\"duration\":10,\"currentRound\":0,\"endtime\":999}}";
 
 	@Before
@@ -65,6 +61,6 @@
 	public List<String> getGeneralTestStrings() {
 		return Arrays.asList("ProgressRounds\\[0.*20\\]",
-				"ProgressRounds\\[0.*30\\]", "ProgressTime\\[100000.*20ms\\]",
-				"ProgressTime\\[98765.*20ms\\]");
+				"ProgressRounds\\[0.*30\\]", "ProgressTime\\[0.*20ms\\]",
+				"ProgressTime\\[999.*20ms\\]");
 	}
 
@@ -72,9 +68,4 @@
 	public void testInit() {
 		assertEquals((Double) 0d, progress.get(1l));
-	}
-
-	@Test
-	public void testCurrentRound() {
-		assertEquals((Integer) 0, progress.getCurrentRound());
 	}
 
@@ -112,5 +103,4 @@
 	}
 
-	@SuppressWarnings("unused")
 	@Test(expected = IllegalArgumentException.class)
 	public void testIllegalArg1() {
@@ -118,5 +108,4 @@
 	}
 
-	@SuppressWarnings("unused")
 	@Test(expected = IllegalArgumentException.class)
 	public void testIllegalArg2() {
@@ -124,37 +113,3 @@
 	}
 
-	@Test
-	public void pastDeadline() {
-		assertFalse(pr.isPastDeadline(start));
-		assertTrue(pr.isPastDeadline(start + TESTTIME + 1));
-		assertFalse(pr.isPastDeadline(start + TESTTIME - 1));
-		assertTrue(new ProgressRounds(TESTROUNDS, TESTROUNDS, end)
-				.isPastDeadline(start + TESTTIME + 1));
-	}
-
-	@Test
-	public void terminationTime() {
-		assertEquals(start + TESTTIME, pr.getTerminationTime().getTime());
-	}
-
-	@Test
-	public void get() {
-		// time does not matter for rounds-based deadline
-		assertEquals((Double) 0.4d, pr.get(start));
-		assertEquals((Double) 0.4d, pr.get(start + TESTTIME + 1));
-		assertEquals((Double) 0.4d, pr.get(start + TESTTIME));
-		assertEquals((Double) 0.4d, pr.get(start + TESTTIME / 2));
-		assertEquals((Double) 0.4d, pr.get(start - 10));
-		assertEquals((Double) 0.4d, pr.get(start + TESTTIME + 10));
-
-		assertEquals((Double) 0.1d,
-				new ProgressRounds(TESTROUNDS, 1, end).get(start));
-		assertEquals((Double) 1d,
-				new ProgressRounds(TESTROUNDS, TESTROUNDS, end).get(start));
-	}
-
-	@Test
-	public void totalRounds() {
-		assertEquals((Integer) 10, pr.getTotalRounds());
-	}
 }
Index: /timeline/src/test/java/geniusweb/progress/ProgressTimeTest.java
===================================================================
--- /timeline/src/test/java/geniusweb/progress/ProgressTimeTest.java	(revision 53)
+++ /timeline/src/test/java/geniusweb/progress/ProgressTimeTest.java	(revision 1)
@@ -2,6 +2,4 @@
 
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
 
 import java.io.IOException;
@@ -18,10 +16,10 @@
 import com.fasterxml.jackson.databind.ObjectMapper;
 
+import geniusweb.progress.Progress;
+import geniusweb.progress.ProgressTime;
 import tudelft.utilities.junit.GeneralTests;
 
 public class ProgressTimeTest extends GeneralTests<Progress> {
-	// we set T0 quite high because Python has trouble handling small datetime
-	private static final long T0 = 100000l;
-	private static final Date TIMEZERO = new Date(T0);
+	private static final Date TIMEZERO = new Date(0l);
 	private final static long TESTTIME = 10; // milliseconds!
 	private final ProgressTime progress1 = new ProgressTime(TESTTIME, TIMEZERO);
@@ -31,8 +29,5 @@
 
 	private final ObjectMapper jackson = new ObjectMapper();
-	private final String progressstring = "{\"ProgressTime\":{\"duration\":10,\"start\":100000}}";
-
-	private final long start = 1234;
-	private final ProgressTime pr = new ProgressTime(TESTTIME, new Date(start));
+	private final String progressstring = "{\"time\":{\"duration\":10,\"start\":0}}";
 
 	@Override
@@ -46,6 +41,6 @@
 	@Override
 	public List<String> getGeneralTestStrings() {
-		return Arrays.asList("ProgressTime\\[100000.*10ms\\]",
-				"ProgressTime\\[100000.*200ms\\]");
+		return Arrays.asList("ProgressTime\\[0.*10ms\\]",
+				"ProgressTime\\[0.*200ms\\]");
 	}
 
@@ -58,6 +53,5 @@
 	public void testAdvancingTime() throws InterruptedException {
 		for (long n = 0; n <= TESTTIME; n++) {
-			assertEquals((Double) ((double) n / TESTTIME),
-					progress1.get(T0 + n));
+			assertEquals((Double) ((double) n / TESTTIME), progress1.get(n));
 		}
 	}
@@ -66,5 +60,5 @@
 	public void testAdvanceWhenDeadlineReached() throws InterruptedException {
 		ProgressTime progress = new ProgressTime(TESTTIME, TIMEZERO);
-		assertEquals((Double) 1d, progress1.get(T0 + TESTTIME));
+		assertEquals((Double) 1d, progress1.get(TESTTIME));
 	}
 
@@ -85,27 +79,5 @@
 		// object...
 		assertEquals(TESTTIME, newprog.getDuration().intValue());
-		assertEquals(T0, newprog.getStart().getTime());
-
-	}
-
-	@Test
-	public void pastDeadline() {
-		assertTrue(pr.isPastDeadline(start + TESTTIME + 1));
-		assertFalse(pr.isPastDeadline(start + TESTTIME - 1));
-
-	}
-
-	@Test
-	public void terminationTime() {
-		assertEquals(start + TESTTIME, pr.getTerminationTime().getTime());
-	}
-
-	@Test
-	public void get() {
-		assertEquals((Double) 0d, pr.get(start));
-		assertEquals((Double) 1d, pr.get(start + TESTTIME));
-		assertEquals((Double) 0.5d, pr.get(start + TESTTIME / 2));
-		assertEquals((Double) 0d, pr.get(start - 10));
-		assertEquals((Double) 1d, pr.get(start + TESTTIME + 10));
+		assertEquals(0, newprog.getStart().getTime());
 
 	}
