Index: /bidspace/pom.xml
===================================================================
--- /bidspace/pom.xml	(revision 13)
+++ /bidspace/pom.xml	(revision 14)
@@ -6,5 +6,5 @@
 	<groupId>geniusweb</groupId>
 	<artifactId>bidspace</artifactId>
-			<version>1.3.1</version>
+			<version>1.4.0</version>
 	<packaging>jar</packaging>
 
@@ -36,5 +36,5 @@
 			<groupId>geniusweb</groupId>
 			<artifactId>profile</artifactId>
-			<version>1.3.1</version>
+			<version>1.4.0</version>
 		</dependency>
 
Index: /boa/pom.xml
===================================================================
--- /boa/pom.xml	(revision 14)
+++ /boa/pom.xml	(revision 14)
@@ -0,0 +1,229 @@
+<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>geniusweb</groupId>
+	<artifactId>boa</artifactId>
+	<version>1.4.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.10</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>geniusweb</groupId>
+			<artifactId>party</artifactId>
+			<version>1.4.0</version>
+		</dependency>
+		<dependency>
+			<groupId>geniusweb</groupId>
+			<artifactId>profile</artifactId>
+			<version>1.4.0</version>
+		</dependency>
+		<dependency>
+			<groupId>geniusweb</groupId>
+			<artifactId>events</artifactId>
+			<version>1.4.0</version>
+		</dependency>
+		<dependency>
+			<groupId>geniusweb</groupId>
+			<artifactId>timeline</artifactId>
+			<version>1.4.0</version>
+		</dependency>
+		<dependency>
+			<groupId>geniusweb</groupId>
+			<artifactId>profileconnection</artifactId>
+			<version>1.4.0</version>
+		</dependency>
+		<dependency>
+			<groupId>geniusweb</groupId>
+			<artifactId>bidspace</artifactId>
+			<version>1.4.0</version>
+		</dependency>
+
+		<dependency>
+			<groupId>tudelft.utilities</groupId>
+			<artifactId>logging</artifactId>
+			<version>1.0.0</version>
+		</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>https://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-source-plugin</artifactId>
+				<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>
+				<configuration>
+					<archive>
+						<manifest>
+							<mainClass>geniusweb.exampleparties.linear.Linear</mainClass>
+						</manifest>
+					</archive>
+				</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.linear.Linear</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: /boa/src/main/java/geniusweb/boa/BoaParty.java
===================================================================
--- /boa/src/main/java/geniusweb/boa/BoaParty.java	(revision 14)
+++ /boa/src/main/java/geniusweb/boa/BoaParty.java	(revision 14)
@@ -0,0 +1,130 @@
+package geniusweb.boa;
+
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.Timer;
+import java.util.TimerTask;
+import java.util.logging.Level;
+
+import javax.websocket.DeploymentException;
+
+import geniusweb.actions.Action;
+import geniusweb.boa.acceptancestrategy.AcceptanceStrategy;
+import geniusweb.boa.biddingstrategy.BiddingStrategy;
+import geniusweb.party.Capabilities;
+import geniusweb.party.DefaultParty;
+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.profileconnection.ProfileConnectionFactory;
+import geniusweb.profileconnection.ProfileInterface;
+
+/**
+ * Determines the next {@link Action} given our profile, the opponent model and
+ * the acceptance strategy Could also be called OfferingStrategy, but we use
+ * BiddingStrategy because of the name "BOA".
+ * <p>
+ * The BiddingStrategy must handle the connection, so it has to connect with the
+ * profile when the {@link Settings} come in , and create the subcomponents.
+ * 
+ * The settings are assumed to contain also parameters "as" containing the
+ * full.class.path to the {@link AcceptanceStrategy} clas, and "os" containing
+ * the full.class.path to the   {@link OpponentModel} class and "bs" containing
+ * the full.class.path to the   {@link BiddingStrategy} class.
+ * 
+ */
+public class BoaParty extends DefaultParty {
+	/**
+	 * This only supports SAOP protocol because it is not clear how the
+	 * BiddingStrategy could be made more general without basically becoming a
+	 * full Party.
+	 * 
+	 */
+	private ProfileInterface profileint;
+	private NegoState negoState = new NegoState();
+	private BiddingStrategy biddingStrategy;
+
+	@Override
+	public Capabilities getCapabilities() {
+		return new Capabilities(new HashSet<>(Arrays.asList("SAOP")));
+	}
+
+	@Override
+	public String getDescription() {
+		return "Takes parameters om=OpponentModel full.class.path,  as=AcceptanceStrategy full.class.path "
+				+ "and bs=BiddingStrategy full.class.path. "
+				+ "Builds a BOA party running on SAOP.";
+	}
+
+	@SuppressWarnings("unchecked")
+	@Override
+	public void notifyChange(Inform info) {
+		try {
+			if (info instanceof Settings) {
+				Settings settings = (Settings) info;
+				this.profileint = ProfileConnectionFactory
+						.create(settings.getProfile().getURI(), getReporter());
+				Class<BiddingStrategy> bsClass = (Class<BiddingStrategy>) Class
+						.forName((String) settings.getParemeters().get("bs"));
+				Class<AcceptanceStrategy> asClass = (Class<AcceptanceStrategy>) Class
+						.forName((String) settings.getParemeters().get("as"));
+				Class<OpponentModel> omClass = (Class<OpponentModel>) Class
+						.forName((String) settings.getParemeters().get("om"));
+				;
+				biddingStrategy = bsClass.newInstance();
+				negoState = negoState.with(settings.getProgress(),
+						settings.getID(), asClass, omClass, reporter);
+				return;
+			}
+
+			// Beyond this point the biddingStrategy should contain profile
+			if (negoState.getProfile() == null) {
+				negoState = negoState.with(profileint.getProfile());
+			}
+
+			if (info instanceof ActionDone) {
+				negoState = negoState.with(((ActionDone) info).getAction());
+			} else if (info instanceof YourTurn) {
+				waitAndAct();
+			} else if (info instanceof Finished) {
+				getReporter().log(Level.INFO, "Final ourcome:" + info);
+			}
+		} catch (DeploymentException | IOException | ClassNotFoundException
+				| InstantiationFailedException | InstantiationException
+				| IllegalAccessException e) {
+			throw new RuntimeException("Failed to handle info", e);
+		}
+
+	}
+
+	/**
+	 * If current time > {@link BiddingStrategy#getActionTime()} then execute
+	 * the action of the biddingStrategy. Otherwise, wait the specified time and
+	 * retry.
+	 */
+	private void waitAndAct() {
+		Long actionTime = biddingStrategy.getActionTime(negoState);
+		if (System.currentTimeMillis() > actionTime) {
+			try {
+				getConnection().send(biddingStrategy.getAction(negoState));
+			} catch (IOException e) {
+				getReporter().log(Level.SEVERE,
+						"Failed to execute action, connection may be broken?");
+				e.printStackTrace();
+			}
+		} else {
+			// wait specified time and retry
+			new Timer().schedule(new TimerTask() {
+				@Override
+				public void run() {
+					waitAndAct();
+				}
+			}, new Date(actionTime));
+		}
+	}
+
+}
Index: /boa/src/main/java/geniusweb/boa/InstantiationFailedException.java
===================================================================
--- /boa/src/main/java/geniusweb/boa/InstantiationFailedException.java	(revision 14)
+++ /boa/src/main/java/geniusweb/boa/InstantiationFailedException.java	(revision 14)
@@ -0,0 +1,15 @@
+package geniusweb.boa;
+
+/**
+ * Failed to create instance of some class
+ *
+ */
+public class InstantiationFailedException extends Exception {
+
+	private static final long serialVersionUID = -3368583000286378339L;
+
+	public InstantiationFailedException(String string, Throwable e) {
+		super(string, e);
+	}
+
+}
Index: /boa/src/main/java/geniusweb/boa/NegoState.java
===================================================================
--- /boa/src/main/java/geniusweb/boa/NegoState.java	(revision 14)
+++ /boa/src/main/java/geniusweb/boa/NegoState.java	(revision 14)
@@ -0,0 +1,185 @@
+package geniusweb.boa;
+
+import java.lang.reflect.Parameter;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.logging.Level;
+
+import geniusweb.actions.Action;
+import geniusweb.actions.ActionWithBid;
+import geniusweb.actions.PartyId;
+import geniusweb.boa.acceptancestrategy.AcceptanceStrategy;
+import geniusweb.boa.biddingstrategy.BiddingStrategy;
+import geniusweb.issuevalue.Bid;
+import geniusweb.party.inform.Settings;
+import geniusweb.profile.Profile;
+import geniusweb.progress.Progress;
+import tudelft.utilities.logging.Reporter;
+
+/**
+ * Stores the current state of the negotiation for a {@link BoaParty}, including
+ * the state of the opponent models
+ *
+ */
+public class NegoState {
+	private final Settings settings;
+	private final Profile profile;
+	private final Progress progress;
+	private final Class<OpponentModel> opponentModelClass;
+	private final AcceptanceStrategy acceptanceStrat;
+	private final Bid lastReceivedBid;
+	private final Map<PartyId, OpponentModel> opponentModels;
+	private final Reporter reporter;
+
+	public NegoState() {
+		this(null, null, null, null, null, null, new HashMap<>(), null);
+	}
+
+	public NegoState(Settings settings, Profile profile, Progress progr,
+			Class<OpponentModel> omClass, AcceptanceStrategy as, Bid lastRcBid,
+			Map<PartyId, OpponentModel> oppMods, Reporter reporter) {
+		this.settings = settings;
+		this.profile = profile;
+		this.progress = progr;
+		this.opponentModelClass = omClass;
+		this.acceptanceStrat = as;
+		this.lastReceivedBid = lastRcBid;
+		this.opponentModels = oppMods;
+		this.reporter = reporter;
+	}
+
+	/**
+	 * Initialize the component. Must be called first.
+	 * 
+	 * @param progress the progress to use
+	 * @param myId     the Id of this party
+	 * @param as       the acceptance strategy class
+	 * @param om       the Class of the OpponentModels
+	 * @param reporter a {@link Reporter} to log messages and errors to
+	 * @return initialized {@link BiddingStrategy}
+	 * @throws InstantiationFailedException if one of provided classes can not
+	 *                                      be instantiated.
+	 */
+
+	public NegoState with(Progress progr, PartyId myId,
+			Class<AcceptanceStrategy> asClass, Class<OpponentModel> omClass,
+			Reporter reporter) throws InstantiationFailedException {
+		AcceptanceStrategy as;
+		try {
+			as = asClass.newInstance();
+		} catch (InstantiationException | IllegalAccessException e) {
+			throw new InstantiationFailedException(
+					"Failed to create " + asClass, e);
+		}
+		return new NegoState(settings, profile, progr, omClass, as,
+				lastReceivedBid, opponentModels, reporter);
+	}
+
+	/**
+	 * 
+	 * @param profile the profile that we use. Must be called second (after the
+	 *                init call above). Can be called multiple times, if a
+	 *                profile changes
+	 * @throws InstantiationFailedException if one of provided classes can not
+	 *                                      be instantiated.
+	 */
+	public NegoState with(Profile prof) {
+		if (profile != null)
+			reporter.log(Level.WARNING,
+					"DefaultBiddingStrategy does not support profile changes. Ignored the change.");
+		return new NegoState(settings, prof, progress, opponentModelClass,
+				acceptanceStrat, lastReceivedBid, opponentModels, reporter);
+	}
+
+	/**
+	 * 
+	 * @return the settings for this negotiation, includes my {@link PartyId},
+	 *         {@link Parameter}, {@link Profile} etc.
+	 */
+	public Settings getSettings() {
+		return settings;
+	}
+
+	/**
+	 * 
+	 * @return the {@link Profile} as fetched from the profiles server, or null
+	 *         if no profile was received yet.
+	 */
+	public Profile getProfile() {
+		return profile;
+	}
+
+	/**
+	 * 
+	 * @param action the action that was done by some participant.
+	 * @return new BoaState that includes action.getBid as last bid (if action
+	 *         contains a bid), and with updated opponentmodel of that
+	 *         participant.
+	 * @throws InstantiationFailedException if one of provided classes can not
+	 *                                      be instantiated.
+	 */
+	public NegoState with(Action action) throws InstantiationFailedException {
+		try {
+			Map<PartyId, OpponentModel> newmodels = updateModels(action);
+		} catch (InstantiationException | IllegalAccessException e) {
+			throw new InstantiationFailedException("Updating the models failed:"
+					+ e.getMessage() + ". Ignoring the action", e);
+		}
+		Bid lastbid = action instanceof ActionWithBid
+				? ((ActionWithBid) action).getBid()
+				: lastReceivedBid;
+		return new NegoState(settings, profile, progress, opponentModelClass,
+				acceptanceStrat, lastbid, opponentModels, reporter);
+	}
+
+	/**
+	 * Must be called every time a 'round' as been made and the progress needs
+	 * to be incremented.
+	 * 
+	 * @param progress the new value of the progress
+	 * @return new state
+	 * @throws InstantiationFailedException if one of provided classes can not
+	 *                                      be instantiated.
+	 */
+	public NegoState with(Progress prog) {
+		return new NegoState(settings, profile, prog, opponentModelClass,
+				acceptanceStrat, lastReceivedBid, opponentModels, reporter);
+	}
+
+	/**
+	 * @param action
+	 * @return the map with the opponentmodels, with the party that did the
+	 *         action updated.
+	 * @throws InstantiationException
+	 * @throws IllegalAccessException
+	 */
+	private Map<PartyId, OpponentModel> updateModels(Action action)
+			throws InstantiationException, IllegalAccessException {
+		PartyId actor = action.getActor();
+		Map<PartyId, OpponentModel> updated = extendedOpponentModels(actor);
+		updated.put(actor, updated.get(actor).with(action, progress));
+		return updated;
+	}
+
+	/**
+	 * Get the current opponent model, extended with newparty if there is no
+	 * model yet for newparty.
+	 * 
+	 * @param newparty a possibly new party
+	 * @return a (possibly new) opponentModels map
+	 * @throws InstantiationException
+	 * @throws IllegalAccessException
+	 */
+	private Map<PartyId, OpponentModel> extendedOpponentModels(PartyId newparty)
+			throws InstantiationException, IllegalAccessException {
+		// check if this is new party
+		if (opponentModels.containsKey(newparty))
+			return opponentModels;
+
+		Map<PartyId, OpponentModel> newmodels = new HashMap<>(opponentModels);
+		OpponentModel newmodel = opponentModelClass.newInstance();
+		newmodel = newmodel.with(profile.getDomain());
+		newmodels.put(newparty, newmodel);
+		return newmodels;
+	}
+}
Index: /boa/src/main/java/geniusweb/boa/OpponentModel.java
===================================================================
--- /boa/src/main/java/geniusweb/boa/OpponentModel.java	(revision 14)
+++ /boa/src/main/java/geniusweb/boa/OpponentModel.java	(revision 14)
@@ -0,0 +1,32 @@
+package geniusweb.boa;
+
+import geniusweb.actions.Action;
+import geniusweb.issuevalue.Domain;
+import geniusweb.profile.Profile;
+import geniusweb.progress.Progress;
+
+/**
+ * An opponent model for use in the BOA system. Implementations should be
+ * immutable
+ */
+public interface OpponentModel extends Profile {
+	/**
+	 * 
+	 * @param domain
+	 * @return sets or changes the domain.
+	 */
+	OpponentModel with(Domain domain);
+
+	/**
+	 * Update this with a new action that was done by the opponent that this
+	 * model is modeling. {@link #with(Domain)} must be called before calling
+	 * this.
+	 * 
+	 * @param action   the new incoming action.
+	 * @param progress the current progress of the negotiation. Calls to this
+	 *                 must be done with increasing progress.
+	 * @return the updated {@link OpponentModel}
+	 */
+	OpponentModel with(Action action, Progress progress);
+
+}
Index: /boa/src/main/java/geniusweb/boa/acceptancestrategy/AcceptanceStrategy.java
===================================================================
--- /boa/src/main/java/geniusweb/boa/acceptancestrategy/AcceptanceStrategy.java	(revision 14)
+++ /boa/src/main/java/geniusweb/boa/acceptancestrategy/AcceptanceStrategy.java	(revision 14)
@@ -0,0 +1,15 @@
+package geniusweb.boa.acceptancestrategy;
+
+import geniusweb.boa.NegoState;
+import geniusweb.issuevalue.Bid;
+
+public interface AcceptanceStrategy {
+
+	/**
+	 * 
+	 * @param bid       the bid to be checked
+	 * @param negoState the current {@link NegoState}
+	 * @return true iff current bid is acceptable at this moment
+	 */
+	Boolean isAcceptable(Bid bid, NegoState negoState);
+}
Index: /boa/src/main/java/geniusweb/boa/biddingstrategy/BiddingStrategy.java
===================================================================
--- /boa/src/main/java/geniusweb/boa/biddingstrategy/BiddingStrategy.java	(revision 14)
+++ /boa/src/main/java/geniusweb/boa/biddingstrategy/BiddingStrategy.java	(revision 14)
@@ -0,0 +1,55 @@
+package geniusweb.boa.biddingstrategy;
+
+import geniusweb.actions.Action;
+import geniusweb.actions.PartyId;
+import geniusweb.boa.BoaParty;
+import geniusweb.boa.NegoState;
+import geniusweb.boa.OpponentModel;
+import geniusweb.boa.acceptancestrategy.AcceptanceStrategy;
+import geniusweb.party.Party;
+import geniusweb.progress.Progress;
+import tudelft.utilities.logging.Reporter;
+
+/**
+ * Interface to objects that can determines when to bid what. Implementors are
+ * assumed to model all opponents using the provided {@link OpponentModel}, and
+ * to evaluate the offered bids using the provided {@link AcceptanceStrategy}.
+ * <p>
+ * To avoid the need for the event handling as in {@link Party}, this class
+ * interfaces through different classes than Party:
+ * <ul>
+ * <li>Incoming "Settings" events are now
+ * {@link #with(Progress, PartyId, Class, Class, Reporter)}
+ * <li>Incoming notifications now {@link #with(Action)}
+ * <li>Progress advancing is now triggered with {@link #with(Progress)}
+ * <li>Outgoing actions are replaced with {@link #getAction()} and
+ * {@link #getActionTime()}.
+ * </ul>
+ * <p>
+ * Usually part of a {@link BoaParty}.
+ * 
+ * <p>
+ * MUST * have an empty constructor. Implementations are supposed to be
+ * immutable.
+ */
+public interface BiddingStrategy {
+
+	/**
+	 * @return unix time (ms since 1970 ) at which the value from
+	 *         {@link #getAction()} becomes valid. This allows the strategy to
+	 *         delay actions after it has got the turn, or to wait for other
+	 *         events to happen. Action will be executed as soon as possible
+	 *         after the indicated time.
+	 */
+	default Long getActionTime(NegoState state) {
+		return 0l;
+	}
+
+	/**
+	 * 
+	 * @return the suggested next Action. Valid only after
+	 *         {@link #getActionTime()} > System.currentTimeMillis().
+	 */
+	Action getAction(NegoState state);
+
+}
Index: /boa/src/main/java/geniusweb/boa/biddingstrategy/TimeDepemdentBiddingStrategy.java
===================================================================
--- /boa/src/main/java/geniusweb/boa/biddingstrategy/TimeDepemdentBiddingStrategy.java	(revision 14)
+++ /boa/src/main/java/geniusweb/boa/biddingstrategy/TimeDepemdentBiddingStrategy.java	(revision 14)
@@ -0,0 +1,122 @@
+package geniusweb.boa.biddingstrategy;
+
+import java.util.HashMap;
+
+import geniusweb.actions.Action;
+import geniusweb.bidspace.BidsWithUtility;
+import geniusweb.boa.NegoState;
+import geniusweb.profile.Profile;
+import geniusweb.profile.utilityspace.LinearAdditive;
+
+/**
+ * * This is an abstract class used to implement a TimeDependentAgent Strategy
+ * adapted from S. Shaheen Fatima Michael Wooldridge Nicholas R. Jennings
+ * Optimal Negotiation Strategies for Agents with Incomplete Information
+ * http://eprints.ecs.soton.ac.uk/6151/1/atal01.pdf
+ * <p>
+ * The default strategy was extended to enable the usage of opponent models.
+ * <p>
+ * Note that this agent is not fully equivalent to the theoretical model,
+ * loading the domain may take some time, which may lead to the agent skipping
+ * the first bid. A better implementation is GeniusTimeDependent_Offering.
+ * <p>
+ * The time-dependent utility target function is u(t) = k + (1.0 - k) *
+ * Math.pow((t - startTime) / (1.0 - startTime), 1.0 / e)
+ * <p>
+ * 
+ * Parameters:
+ * <ul>
+ * <li>e: the Concession factor e in the time-dependent utility target function.
+ * Must be in [0,100]. Default is 1.
+ * <li>k: the initial utility k in the time-dependent utility target function.
+ * Must be in [0,1]. For default k = 0 the agent starts with a bid of maximum
+ * utility
+ * </ul>
+ * <p>
+ * Translation from Genius
+ * negotiator.boaframework.offeringstrategy.other.GeniusTimeDependent_Offering
+ * 
+ * 
+ */
+public class TimeDepemdentBiddingStrategy implements BiddingStrategy {
+	private boolean initialized = false;
+	private Float e = 1f;
+	private Float k = 0f;
+	private BidsWithUtility bidSpace;
+	private Float min;
+	private float max;
+
+	@Override
+	public Action getAction(NegoState state) {
+		if (!initialized) {
+			init(state);
+			initialized = true;
+		}
+
+		double time = state.getProgress();
+		double utilityGoal;
+		utilityGoal = p(time);
+
+		// if there is no opponent model available
+		if (opponentModel instanceof NoModel) {
+			nextBid = negotiationSession.getOutcomeSpace()
+					.getBidNearUtility(utilityGoal);
+		} else {
+			nextBid = omStrategy.getBid(outcomespace, utilityGoal);
+		}
+		return nextBid;
+
+	}
+
+	private void init(NegoState state) {
+		HashMap<String, Object> params = state.getSettings().getParemeters();
+		Profile profile = state.getProfile();
+		if (!(profile instanceof LinearAdditive))
+			throw new IllegalArgumentException(
+					"Requires a LinearAdditive space but got "
+							+ profile.getClass());
+
+		this.bidSpace = new BidsWithUtility((LinearAdditive) profile);
+		if (params.containsKey("e")) {
+			this.e = (Float) params.get("e");
+			if (this.e < 0 || this.k > 1)
+				throw new IllegalArgumentException(
+						"e must be in [0,100] but got " + this.e);
+		}
+		if (params.containsKey("k")) {
+			this.k = (Float) params.get("k");
+			if (this.k < 0 || this.k > 1)
+				throw new IllegalArgumentException(
+						"K must be in [0,1] but got " + this.k);
+
+		}
+		this.min = bidSpace.getRange().getMin().floatValue();
+		this.max = bidSpace.getRange().getMax().floatValue();
+		if (params.containsKey("min")) {
+			this.min = (Float) params.get("min");
+			// FIXME this value might be illegal
+		}
+		if (params.containsKey("max")) {
+			this.max = (Float) params.get("max");
+			// FIXME this value might be illegal
+		}
+	}
+
+	/**
+	 * From the paper:
+	 * 
+	 * A wide range of time dependent functions can be defined by varying the
+	 * way in which f(t) is computed. However, functions must ensure that 0 <=
+	 * f(t) <= 1, f(0) = k, and f(1) = 1.
+	 * 
+	 * That is, the offer will always be between the value range, at the
+	 * beginning it will give the initial constant and when the deadline is
+	 * reached, it will offer the reservation value.
+	 */
+	public double f(double t) {
+		double ft = k + (1.0 - k)
+				* Math.pow((t - startTime) / (1.0 - startTime), 1.0 / e);
+		return ft;
+	}
+
+}
Index: /events/pom.xml
===================================================================
--- /events/pom.xml	(revision 13)
+++ /events/pom.xml	(revision 14)
@@ -6,5 +6,5 @@
 	<groupId>geniusweb</groupId>
 	<artifactId>events</artifactId>
-			<version>1.3.1</version>
+			<version>1.4.0</version>
 	<packaging>jar</packaging>
 
@@ -43,10 +43,10 @@
 			<groupId>geniusweb</groupId>
 			<artifactId>issuevalue</artifactId>
-			<version>1.3.1</version>
+			<version>1.4.0</version>
 		</dependency>
 		<dependency>
 			<groupId>geniusweb</groupId>
 			<artifactId>references</artifactId>
-			<version>1.3.1</version>
+			<version>1.4.0</version>
 		</dependency>
 
Index: /exampleparties/anac2019/agentgg/pom.xml
===================================================================
--- /exampleparties/anac2019/agentgg/pom.xml	(revision 13)
+++ /exampleparties/anac2019/agentgg/pom.xml	(revision 14)
@@ -6,5 +6,5 @@
 	<groupId>geniusweb.exampleparties.anac2019</groupId>
 	<artifactId>agentgg</artifactId>
-	<version>1.3.1</version>
+	<version>1.4,0</version>
 	<packaging>jar</packaging>
 
@@ -32,5 +32,5 @@
 			<groupId>geniusweb</groupId>
 			<artifactId>issuevalue</artifactId>
-			<version>1.3.1</version>
+			<version>1.4.0</version>
 		</dependency>
 
@@ -38,5 +38,5 @@
 			<groupId>geniusweb</groupId>
 			<artifactId>party</artifactId>
-			<version>1.3.1</version>
+			<version>1.4.0</version>
 		</dependency>
 
@@ -44,10 +44,10 @@
 			<groupId>geniusweb</groupId>
 			<artifactId>bidspace</artifactId>
-			<version>1.3.1</version>
+			<version>1.4.0</version>
 		</dependency>
 		<dependency>
 			<groupId>geniusweb</groupId>
 			<artifactId>profileconnection</artifactId>
-			<version>1.3.1</version>
+			<version>1.4.0</version>
 		</dependency>
 		<dependency>
Index: /exampleparties/anac2019/winkyagent/pom.xml
===================================================================
--- /exampleparties/anac2019/winkyagent/pom.xml	(revision 13)
+++ /exampleparties/anac2019/winkyagent/pom.xml	(revision 14)
@@ -6,5 +6,5 @@
 	<groupId>geniusweb.exampleparties.anac2019</groupId>
 	<artifactId>winkyagent</artifactId>
-	<version>1.3.1</version>
+	<version>1.4.0</version>
 	<packaging>jar</packaging>
 
@@ -32,5 +32,5 @@
 			<groupId>geniusweb</groupId>
 			<artifactId>issuevalue</artifactId>
-			<version>1.3.1</version>
+			<version>1.4.0</version>
 		</dependency>
 
@@ -38,5 +38,5 @@
 			<groupId>geniusweb</groupId>
 			<artifactId>party</artifactId>
-			<version>1.3.1</version>
+			<version>1.4.0</version>
 		</dependency>
 
@@ -44,10 +44,10 @@
 			<groupId>geniusweb</groupId>
 			<artifactId>bidspace</artifactId>
-			<version>1.3.1</version>
+			<version>1.4.0</version>
 		</dependency>
 		<dependency>
 			<groupId>geniusweb</groupId>
 			<artifactId>profileconnection</artifactId>
-			<version>1.3.1</version>
+			<version>1.4.0</version>
 		</dependency>
 		<dependency>
Index: /exampleparties/boulware/pom.xml
===================================================================
--- /exampleparties/boulware/pom.xml	(revision 13)
+++ /exampleparties/boulware/pom.xml	(revision 14)
@@ -6,5 +6,5 @@
 	<groupId>geniusweb.exampleparties</groupId>
 	<artifactId>boulware</artifactId>
-			<version>1.3.1</version>
+			<version>1.4.0</version>
 	<packaging>jar</packaging>
 
@@ -33,5 +33,5 @@
 			<groupId>geniusweb.exampleparties</groupId>
 			<artifactId>timedependentparty</artifactId>
-			<version>1.3.1</version>
+			<version>1.4.0</version>
 		</dependency>
 		<dependency>
Index: /exampleparties/comparebids/pom.xml
===================================================================
--- /exampleparties/comparebids/pom.xml	(revision 13)
+++ /exampleparties/comparebids/pom.xml	(revision 14)
@@ -6,5 +6,5 @@
 	<groupId>geniusweb.exampleparties</groupId>
 	<artifactId>comparebids</artifactId>
-			<version>1.3.1</version>
+			<version>1.4.0</version>
 	<packaging>jar</packaging>
 
@@ -33,5 +33,5 @@
 			<groupId>geniusweb</groupId>
 			<artifactId>party</artifactId>
-			<version>1.3.1</version>
+			<version>1.4.0</version>
 		</dependency>
 
@@ -39,10 +39,10 @@
 			<groupId>geniusweb</groupId>
 			<artifactId>bidspace</artifactId>
-			<version>1.3.1</version>
+			<version>1.4.0</version>
 		</dependency>
 		<dependency>
 			<groupId>geniusweb</groupId>
 			<artifactId>profileconnection</artifactId>
-			<version>1.3.1</version>
+			<version>1.4.0</version>
 		</dependency>
 		<dependency>
Index: /exampleparties/conceder/pom.xml
===================================================================
--- /exampleparties/conceder/pom.xml	(revision 13)
+++ /exampleparties/conceder/pom.xml	(revision 14)
@@ -6,5 +6,5 @@
 	<groupId>geniusweb.exampleparties</groupId>
 	<artifactId>conceder</artifactId>
-			<version>1.3.1</version>
+			<version>1.4.0</version>
 	<packaging>jar</packaging>
 
@@ -33,5 +33,5 @@
 			<groupId>geniusweb.exampleparties</groupId>
 			<artifactId>timedependentparty</artifactId>
-			<version>1.3.1</version>
+			<version>1.4.0</version>
 		</dependency>
 		<dependency>
Index: /exampleparties/hardliner/pom.xml
===================================================================
--- /exampleparties/hardliner/pom.xml	(revision 13)
+++ /exampleparties/hardliner/pom.xml	(revision 14)
@@ -6,5 +6,5 @@
 	<groupId>geniusweb.exampleparties</groupId>
 	<artifactId>hardliner</artifactId>
-			<version>1.3.1</version>
+			<version>1.4.0</version>
 	<packaging>jar</packaging>
 
@@ -33,5 +33,5 @@
 			<groupId>geniusweb.exampleparties</groupId>
 			<artifactId>timedependentparty</artifactId>
-			<version>1.3.1</version>
+			<version>1.4.0</version>
 		</dependency>
 		<dependency>
Index: /exampleparties/humangui/pom.xml
===================================================================
--- /exampleparties/humangui/pom.xml	(revision 13)
+++ /exampleparties/humangui/pom.xml	(revision 14)
@@ -6,5 +6,5 @@
 	<groupId>geniusweb.exampleparties</groupId>
 	<artifactId>humangui</artifactId>
-			<version>1.3.1</version>
+			<version>1.4.0</version>
 	<packaging>jar</packaging>
 
@@ -33,5 +33,5 @@
 			<groupId>geniusweb</groupId>
 			<artifactId>party</artifactId>
-			<version>1.3.1</version>
+			<version>1.4.0</version>
 		</dependency>
 
@@ -39,10 +39,10 @@
 			<groupId>geniusweb</groupId>
 			<artifactId>bidspace</artifactId>
-			<version>1.3.1</version>
+			<version>1.4.0</version>
 		</dependency>
 		<dependency>
 			<groupId>geniusweb</groupId>
 			<artifactId>profileconnection</artifactId>
-			<version>1.3.1</version>
+			<version>1.4.0</version>
 		</dependency>
 		<dependency>
Index: /exampleparties/linear/pom.xml
===================================================================
--- /exampleparties/linear/pom.xml	(revision 13)
+++ /exampleparties/linear/pom.xml	(revision 14)
@@ -6,5 +6,5 @@
 	<groupId>geniusweb.exampleparties</groupId>
 	<artifactId>linear</artifactId>
-			<version>1.3.1</version>
+			<version>1.4.0</version>
 	<packaging>jar</packaging>
 
@@ -33,5 +33,5 @@
 			<groupId>geniusweb.exampleparties</groupId>
 			<artifactId>timedependentparty</artifactId>
-			<version>1.3.1</version>
+			<version>1.4.0</version>
 		</dependency>
 		<dependency>
Index: /exampleparties/randomparty/pom.xml
===================================================================
--- /exampleparties/randomparty/pom.xml	(revision 13)
+++ /exampleparties/randomparty/pom.xml	(revision 14)
@@ -6,5 +6,5 @@
 	<groupId>geniusweb.exampleparties</groupId>
 	<artifactId>randomparty</artifactId>
-	<version>1.3.1</version>
+	<version>1.4.0</version>
 	<packaging>jar</packaging>
 
@@ -33,5 +33,5 @@
 			<groupId>geniusweb</groupId>
 			<artifactId>party</artifactId>
-			<version>1.3.1</version>
+			<version>1.4.0</version>
 		</dependency>
 
@@ -39,10 +39,10 @@
 			<groupId>geniusweb</groupId>
 			<artifactId>bidspace</artifactId>
-			<version>1.3.1</version>
+			<version>1.4.0</version>
 		</dependency>
 		<dependency>
 			<groupId>geniusweb</groupId>
 			<artifactId>profileconnection</artifactId>
-			<version>1.3.1</version>
+			<version>1.4.0</version>
 		</dependency>
 		<dependency>
Index: /exampleparties/randompartypy/pom.xml
===================================================================
--- /exampleparties/randompartypy/pom.xml	(revision 13)
+++ /exampleparties/randompartypy/pom.xml	(revision 14)
@@ -6,5 +6,5 @@
 	<groupId>geniusweb.exampleparties</groupId>
 	<artifactId>randompyparty</artifactId>
-	<version>1.3.1</version>
+	<version>1.4.0</version>
 	<packaging>jar</packaging>
 
@@ -31,5 +31,5 @@
 			<groupId>geniusweb</groupId>
 			<artifactId>pythonadapter</artifactId>
-			<version>1.3.1</version>
+			<version>1.4.0</version>
 		</dependency>
 
@@ -37,10 +37,10 @@
 			<groupId>geniusweb</groupId>
 			<artifactId>bidspace</artifactId>
-			<version>1.3.1</version>
+			<version>1.4.0</version>
 		</dependency>
 		<dependency>
 			<groupId>geniusweb</groupId>
 			<artifactId>profileconnection</artifactId>
-			<version>1.3.1</version>
+			<version>1.4.0</version>
 		</dependency>
 		<dependency>
Index: /exampleparties/simpleshaop/pom.xml
===================================================================
--- /exampleparties/simpleshaop/pom.xml	(revision 13)
+++ /exampleparties/simpleshaop/pom.xml	(revision 14)
@@ -6,5 +6,5 @@
 	<groupId>geniusweb.exampleparties</groupId>
 	<artifactId>simpleshaop</artifactId>
-	<version>1.3.1</version>
+	<version>1.4.0</version>
 	<packaging>jar</packaging>
 
@@ -33,5 +33,5 @@
 			<groupId>geniusweb</groupId>
 			<artifactId>party</artifactId>
-			<version>1.3.1</version>
+			<version>1.4.0</version>
 		</dependency>
 
@@ -39,10 +39,10 @@
 			<groupId>geniusweb</groupId>
 			<artifactId>bidspace</artifactId>
-			<version>1.3.1</version>
+			<version>1.4.0</version>
 		</dependency>
 		<dependency>
 			<groupId>geniusweb</groupId>
 			<artifactId>profileconnection</artifactId>
-			<version>1.3.1</version>
+			<version>1.4.0</version>
 		</dependency>
 		<dependency>
Index: /exampleparties/timedependentparty/pom.xml
===================================================================
--- /exampleparties/timedependentparty/pom.xml	(revision 13)
+++ /exampleparties/timedependentparty/pom.xml	(revision 14)
@@ -6,5 +6,5 @@
 	<groupId>geniusweb.exampleparties</groupId>
 	<artifactId>timedependentparty</artifactId>
-	<version>1.3.1</version>
+	<version>1.4.0</version>
 	<packaging>jar</packaging>
 
@@ -33,5 +33,5 @@
 			<groupId>geniusweb</groupId>
 			<artifactId>party</artifactId>
-			<version>1.3.1</version>
+			<version>1.4.0</version>
 		</dependency>
 
@@ -39,10 +39,10 @@
 			<groupId>geniusweb</groupId>
 			<artifactId>bidspace</artifactId>
-			<version>1.3.1</version>
+			<version>1.4.0</version>
 		</dependency>
 		<dependency>
 			<groupId>geniusweb</groupId>
 			<artifactId>profileconnection</artifactId>
-			<version>1.3.1</version>
+			<version>1.4.0</version>
 		</dependency>
 		<dependency>
Index: /issuevalue/pom.xml
===================================================================
--- /issuevalue/pom.xml	(revision 13)
+++ /issuevalue/pom.xml	(revision 14)
@@ -6,5 +6,5 @@
 	<groupId>geniusweb</groupId>
 	<artifactId>issuevalue</artifactId>
-			<version>1.3.1</version>
+			<version>1.4.0</version>
 	<packaging>jar</packaging>
 
Index: /opponentmodel/pom.xml
===================================================================
--- /opponentmodel/pom.xml	(revision 14)
+++ /opponentmodel/pom.xml	(revision 14)
@@ -0,0 +1,257 @@
+<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>geniusweb</groupId>
+	<artifactId>opponentmodel</artifactId>
+	<version>1.4.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.10</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>geniusweb</groupId>
+			<artifactId>issuevalue</artifactId>
+			<version>1.4.0</version>
+		</dependency>
+		<dependency>
+			<groupId>geniusweb</groupId>
+			<artifactId>profile</artifactId>
+			<version>1.4.0</version>
+		</dependency>
+		<dependency>
+			<groupId>geniusweb</groupId>
+			<artifactId>references</artifactId>
+			<version>1.4.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>
+		</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>
+		</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>
+		</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>
+		</dependency>
+		<!-- JAX-RS provider -->
+		<dependency>
+			<groupId>com.fasterxml.jackson.jaxrs</groupId>
+			<artifactId>jackson-jaxrs-json-provider</artifactId>
+			<version>${jackson-2-version}</version>
+		</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>
+		</dependency>
+
+		<dependency>
+			<groupId>tudelft.utilities</groupId>
+			<artifactId>junit</artifactId>
+			<version>1.0.2</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>
+
+
+	</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>https://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-source-plugin</artifactId>
+				<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>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>
+						</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: /opponentmodel/src/main/java/geniusweb/opponentmodel/FrequencyOpponentModel.java
===================================================================
--- /opponentmodel/src/main/java/geniusweb/opponentmodel/FrequencyOpponentModel.java	(revision 14)
+++ /opponentmodel/src/main/java/geniusweb/opponentmodel/FrequencyOpponentModel.java	(revision 14)
@@ -0,0 +1,195 @@
+package geniusweb.opponentmodel;
+
+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;
+import geniusweb.profile.utilityspace.UtilitySpace;
+
+/**
+ * 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, UtilitySpace {
+
+	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 FrequencyOpponentModel 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: /opponentmodel/src/main/java/geniusweb/opponentmodel/OpponentModel.java
===================================================================
--- /opponentmodel/src/main/java/geniusweb/opponentmodel/OpponentModel.java	(revision 14)
+++ /opponentmodel/src/main/java/geniusweb/opponentmodel/OpponentModel.java	(revision 14)
@@ -0,0 +1,19 @@
+package geniusweb.opponentmodel;
+
+import geniusweb.issuevalue.Bid;
+import geniusweb.profile.Profile;
+import geniusweb.profile.utilityspace.UtilitySpace;
+
+/**
+ * An opponentmodel estimates a {@link UtilitySpace} from received opponent
+ * bids.
+ */
+public interface OpponentModel extends Profile {
+	/**
+	 *
+	 * @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: /opponentmodel/src/test/java/geniusweb/profile/opponentmodel/FrequencyOppModelTest.java
===================================================================
--- /opponentmodel/src/test/java/geniusweb/profile/opponentmodel/FrequencyOppModelTest.java	(revision 14)
+++ /opponentmodel/src/test/java/geniusweb/profile/opponentmodel/FrequencyOppModelTest.java	(revision 14)
@@ -0,0 +1,146 @@
+package geniusweb.profile.opponentmodel;
+
+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.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 geniusweb.opponentmodel.FrequencyOpponentModel;
+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() {
+		FrequencyOpponentModel 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
+		FrequencyOpponentModel 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: /party/pom.xml
===================================================================
--- /party/pom.xml	(revision 13)
+++ /party/pom.xml	(revision 14)
@@ -6,5 +6,5 @@
 	<groupId>geniusweb</groupId>
 	<artifactId>party</artifactId>
-			<version>1.3.1</version>
+			<version>1.4.0</version>
 	<packaging>jar</packaging>
 
@@ -31,20 +31,20 @@
 			<groupId>geniusweb</groupId>
 			<artifactId>timeline</artifactId>
-			<version>1.3.1</version>
+			<version>1.4.0</version>
 		</dependency>
 		<dependency>
 			<groupId>geniusweb</groupId>
 			<artifactId>profile</artifactId>
-			<version>1.3.1</version>
+			<version>1.4.0</version>
 		</dependency>
 		<dependency>
 			<groupId>geniusweb</groupId>
 			<artifactId>events</artifactId>
-			<version>1.3.1</version>
+			<version>1.4.0</version>
 		</dependency>
 		<dependency>
 			<groupId>geniusweb</groupId>
 			<artifactId>references</artifactId>
-			<version>1.3.1</version>
+			<version>1.4.0</version>
 		</dependency>
 		<dependency>
Index: /pom.xml
===================================================================
--- /pom.xml	(revision 13)
+++ /pom.xml	(revision 14)
@@ -29,4 +29,5 @@
 		<module>exampleparties</module>
 		<module>simplerunner</module>
+		<module>opponentmodel</module>
 	</modules>
 </project>
Index: /profile/pom.xml
===================================================================
--- /profile/pom.xml	(revision 13)
+++ /profile/pom.xml	(revision 14)
@@ -6,5 +6,5 @@
 	<groupId>geniusweb</groupId>
 	<artifactId>profile</artifactId>
-	<version>1.3.1</version>
+	<version>1.4.0</version>
 	<packaging>jar</packaging>
 
@@ -31,10 +31,10 @@
 			<groupId>geniusweb</groupId>
 			<artifactId>issuevalue</artifactId>
-			<version>1.3.1</version>
+			<version>1.4.0</version>
 		</dependency>
 		<dependency>
 			<groupId>geniusweb</groupId>
 			<artifactId>references</artifactId>
-			<version>1.3.1</version>
+			<version>1.4.0</version>
 		</dependency>
 
Index: /profile/src/main/java/geniusweb/profile/utilityspace/LinearAdditiveUtilitySpace.java
===================================================================
--- /profile/src/main/java/geniusweb/profile/utilityspace/LinearAdditiveUtilitySpace.java	(revision 13)
+++ /profile/src/main/java/geniusweb/profile/utilityspace/LinearAdditiveUtilitySpace.java	(revision 14)
@@ -84,5 +84,6 @@
 		if (utils.values().contains(null)) {
 			throw new NullPointerException(
-					"One of the ValueSetUtilities is null");
+					"One of the ValueSetUtilities in issueUtilitiesis null:"
+							+ utils);
 		}
 		if (weights.values().contains(null)) {
Index: /profile/src/main/java/geniusweb/profile/utilityspace/NumberValueSetUtilities.java
===================================================================
--- /profile/src/main/java/geniusweb/profile/utilityspace/NumberValueSetUtilities.java	(revision 13)
+++ /profile/src/main/java/geniusweb/profile/utilityspace/NumberValueSetUtilities.java	(revision 14)
@@ -51,5 +51,6 @@
 		if (lowValue == null || highValue == null || lowUtility == null
 				|| highUtility == null) {
-			throw new NullPointerException("arguments must be non-null");
+			throw new NullPointerException(
+					"arguments lowValue, lowUtility, highValue and highUtility must be non-null");
 		}
 		if (!isInZeroOne(lowUtility)) {
Index: /profileconnection/pom.xml
===================================================================
--- /profileconnection/pom.xml	(revision 13)
+++ /profileconnection/pom.xml	(revision 14)
@@ -6,5 +6,5 @@
 	<groupId>geniusweb</groupId>
 	<artifactId>profileconnection</artifactId>
-	<version>1.3.1</version>
+	<version>1.4.0</version>
 	<packaging>jar</packaging>
 
@@ -31,5 +31,5 @@
 			<groupId>geniusweb</groupId>
 			<artifactId>profile</artifactId>
-			<version>1.3.1</version>
+			<version>1.4.0</version>
 		</dependency>
 
Index: /protocol/pom.xml
===================================================================
--- /protocol/pom.xml	(revision 13)
+++ /protocol/pom.xml	(revision 14)
@@ -6,5 +6,5 @@
 	<groupId>geniusweb</groupId>
 	<artifactId>protocol</artifactId>
-	<version>1.3.1</version>
+	<version>1.4.0</version>
 	<packaging>jar</packaging>
 
@@ -31,20 +31,20 @@
 			<groupId>geniusweb</groupId>
 			<artifactId>profile</artifactId>
-			<version>1.3.1</version>
+			<version>1.4.0</version>
 		</dependency>
 		<dependency>
 			<groupId>geniusweb</groupId>
 			<artifactId>party</artifactId>
-			<version>1.3.1</version>
+			<version>1.4.0</version>
 		</dependency>
 		<dependency>
 			<groupId>geniusweb</groupId>
 			<artifactId>references</artifactId>
-			<version>1.3.1</version>
+			<version>1.4.0</version>
 		</dependency>
 		<dependency>
 			<groupId>geniusweb</groupId>
 			<artifactId>events</artifactId>
-			<version>1.3.1</version>
+			<version>1.4.0</version>
 		</dependency>
 		<dependency>
Index: /protocol/src/main/java/geniusweb/protocol/tournament/TournamentState.java
===================================================================
--- /protocol/src/main/java/geniusweb/protocol/tournament/TournamentState.java	(revision 13)
+++ /protocol/src/main/java/geniusweb/protocol/tournament/TournamentState.java	(revision 14)
@@ -7,6 +7,8 @@
 
 /**
- * The current state of the tournament. Must be serializabl;e so that it can be
- * restarted if a crash occurs.
+ * 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.
  */
 @JsonAutoDetect(fieldVisibility = Visibility.ANY, getterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE)
Index: /protocol/src/main/java/geniusweb/protocol/tournament/allpermutations/AllPermutationsSettings.java
===================================================================
--- /protocol/src/main/java/geniusweb/protocol/tournament/allpermutations/AllPermutationsSettings.java	(revision 13)
+++ /protocol/src/main/java/geniusweb/protocol/tournament/allpermutations/AllPermutationsSettings.java	(revision 14)
@@ -1,6 +1,4 @@
 package geniusweb.protocol.tournament.allpermutations;
 
-import java.net.URI;
-import java.net.URISyntaxException;
 import java.util.Collections;
 import java.util.List;
@@ -9,5 +7,4 @@
 import com.fasterxml.jackson.annotation.JsonProperty;
 
-import geniusweb.profile.Profile;
 import geniusweb.protocol.session.SessionSettings;
 import geniusweb.protocol.session.TeamOfPartiesAndProfiles;
@@ -18,9 +15,5 @@
 import geniusweb.protocol.tournament.TournamentProtocol;
 import geniusweb.protocol.tournament.TournamentSettings;
-import geniusweb.references.Parameters;
-import geniusweb.references.PartyRef;
-import geniusweb.references.PartyWithParameters;
 import geniusweb.references.PartyWithProfile;
-import geniusweb.references.ProfileRef;
 import tudelft.utilities.immutablelist.FixedList;
 import tudelft.utilities.immutablelist.Function2;
@@ -68,45 +61,71 @@
 
 	public static final String COB_PARTY = "comparebids-1.2.0";
-	private final List<PartyWithParameters> parties;
-	private final List<ProfileRef> profiles;
-	private final boolean reuseParties;
-	private final int partiesPerSession;
+	private final List<Team> teams;
+	private final List<ProfileList> profileslists;
+	private final boolean reuseTeams;
+	private final int teamsPerSession;
 	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          list of available {@link Profile}s to be
-	 *                          permutated over the parties
-	 * @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
+	 * @param teams           a list of {@link Team}s. Must contain at least
+	 *                        <partiesPerSession> elements. The <teamsize> 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 <teamsize>
+	 *                        elements.
+	 * @param teamsPerSession 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("parties") List<PartyWithParameters> parties,
-			@JsonProperty("reuseParties") boolean reuseParties,
-			@JsonProperty("profiles") List<ProfileRef> profiles,
-			@JsonProperty("partiesPerSession") int partiesPerSession,
+	public AllPermutationsSettings(@JsonProperty("teams") List<Team> teams,
+			@JsonProperty("profileslists") List<ProfileList> plists,
+			@JsonProperty("reuseTeams") boolean reuseTeams,
+			@JsonProperty("teamsPerSession") int teamsPerSession,
 			@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;
+		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");
+		int teamsize;
+		if (sesettings instanceof SAOPSettings)
+			teamsize = 1;
+		else if (sesettings instanceof SHAOPSettings)
+			teamsize = 2;
+		else
+			throw new IllegalArgumentException(
+					"Unsupported protocol " + sesettings.getClass());
+
+		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;
 		this.sessionsettings = sesettings;
 	}
@@ -131,10 +150,9 @@
 	public ImmutableList<SessionSettings> permutations() {
 		ImmutableList<ImmutableList<TeamOfPartiesAndProfiles>> partylistlist;
-		ImmutableList<PartyWithParameters> partieslist = new FixedList<PartyWithParameters>(
-				parties);
-		ImmutableList<ProfileRef> profileslist = new FixedList<ProfileRef>(
-				profiles);
+		ImmutableList<Team> partieslist = new FixedList<Team>(teams);
+		ImmutableList<ProfileList> profileslist = new FixedList<ProfileList>(
+				profileslists);
 		partylistlist = getParticipants(partieslist, profileslist,
-				partiesPerSession, reuseParties);
+				teamsPerSession, reuseTeams);
 		return new MapList<>(partyproflist -> createSetting(partyproflist),
 				partylistlist);
@@ -143,6 +161,6 @@
 	@Override
 	public String toString() {
-		return "AllPermutationsSettings[" + parties + "," + reuseParties + ","
-				+ profiles + "," + partiesPerSession + "," + sessionsettings
+		return "AllPermutationsSettings[" + teams + "," + reuseTeams + ","
+				+ profileslists + "," + teamsPerSession + "," + sessionsettings
 				+ "]";
 	}
@@ -152,9 +170,9 @@
 		final int prime = 31;
 		int result = 1;
-		result = prime * result + ((parties == null) ? 0 : parties.hashCode());
-		result = prime * result + partiesPerSession;
+		result = prime * result + ((teams == null) ? 0 : teams.hashCode());
+		result = prime * result + teamsPerSession;
 		result = prime * result
-				+ ((profiles == null) ? 0 : profiles.hashCode());
-		result = prime * result + (reuseParties ? 1231 : 1237);
+				+ ((profileslists == null) ? 0 : profileslists.hashCode());
+		result = prime * result + (reuseTeams ? 1231 : 1237);
 		result = prime * result
 				+ ((sessionsettings == null) ? 0 : sessionsettings.hashCode());
@@ -171,17 +189,17 @@
 			return false;
 		AllPermutationsSettings other = (AllPermutationsSettings) obj;
-		if (parties == null) {
-			if (other.parties != null)
+		if (teams == null) {
+			if (other.teams != null)
 				return false;
-		} else if (!parties.equals(other.parties))
-			return false;
-		if (partiesPerSession != other.partiesPerSession)
-			return false;
-		if (profiles == null) {
-			if (other.profiles != null)
+		} else if (!teams.equals(other.teams))
+			return false;
+		if (teamsPerSession != other.teamsPerSession)
+			return false;
+		if (profileslists == null) {
+			if (other.profileslists != null)
 				return false;
-		} else if (!profiles.equals(other.profiles))
-			return false;
-		if (reuseParties != other.reuseParties)
+		} else if (!profileslists.equals(other.profileslists))
+			return false;
+		if (reuseTeams != other.reuseTeams)
 			return false;
 		if (sessionsettings == null) {
@@ -219,9 +237,8 @@
 	 */
 	private ImmutableList<ImmutableList<TeamOfPartiesAndProfiles>> getParticipants(
-			ImmutableList<PartyWithParameters> parties,
-			ImmutableList<ProfileRef> profiles, int n,
-			boolean drawPartyWithPutback) {
-
-		Permutations<PartyWithParameters> partiesPermutations;
+			ImmutableList<Team> parties, ImmutableList<ProfileList> profiles,
+			int n, boolean drawPartyWithPutback) {
+
+		Permutations<Team> partiesPermutations;
 		if (drawPartyWithPutback) {
 			partiesPermutations = new PermutationsWithReturn<>(parties, n);
@@ -230,13 +247,13 @@
 		}
 
-		Permutations<ProfileRef> profilesPermutations = new PermutationsOrderedWithoutReturn<>(
+		Permutations<ProfileList> profilesPermutations = new PermutationsOrderedWithoutReturn<>(
 				profiles, n);
 
-		// each tuple contains sesion info: a list of partyref and a list of
-		// profileref's.
-		Tuples<ImmutableList<PartyWithParameters>, ImmutableList<ProfileRef>> tuples = new Tuples<>(
+		// each tuple contains session info: a list of Team and a list of
+		// ProfileList.
+		Tuples<ImmutableList<Team>, ImmutableList<ProfileList>> tuples = new Tuples<>(
 				partiesPermutations, profilesPermutations);
 
-		return new MapList<Tuple<ImmutableList<PartyWithParameters>, ImmutableList<ProfileRef>>, ImmutableList<TeamOfPartiesAndProfiles>>(
+		return new MapList<Tuple<ImmutableList<Team>, ImmutableList<ProfileList>>, ImmutableList<TeamOfPartiesAndProfiles>>(
 				tuple -> teamlist(tuple), tuples);
 	}
@@ -244,21 +261,24 @@
 	/**
 	 * 
-	 * @param tuple a tuple with (1) ImmutableList<PartyRef> (2)
-	 *              ImmutableList<ProfileRef>
+	 * @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<TeamOfPartiesAndProfiles> teamlist(
-			Tuple<ImmutableList<PartyWithParameters>, ImmutableList<ProfileRef>> tuple) {
-		Function2<PartyWithParameters, ProfileRef, TeamOfPartiesAndProfiles> //
-		makeparty = new Function2<PartyWithParameters, ProfileRef, TeamOfPartiesAndProfiles>() {
+			Tuple<ImmutableList<Team>, ImmutableList<ProfileList>> tuple) {
+		Function2<Team, ProfileList, TeamOfPartiesAndProfiles> makeparty = new Function2<Team, ProfileList, TeamOfPartiesAndProfiles>() {
 			@Override
-			public TeamOfPartiesAndProfiles apply(PartyWithParameters party,
-					ProfileRef profile) {
+			public TeamOfPartiesAndProfiles apply(Team team,
+					ProfileList profilelist) {
 				if (sessionsettings instanceof SAOPSettings)
-					return new SaopPartyWithProfile(party, profile);
+					return new SaopPartyWithProfile(team.getParties().get(0),
+							profilelist.getProfiles().get(0));
 				else if (sessionsettings instanceof SHAOPSettings) {
-					return new ShaopTeam(new PartyWithProfile(party, profile),
-							makeCob(party.getPartyRef(), profile));
+					return new ShaopTeam(
+							new PartyWithProfile(team.getParties().get(0),
+									profilelist.getProfiles().get(0)),
+							new PartyWithProfile(team.getParties().get(1),
+									profilelist.getProfiles().get(1)));
 				} else
 					throw new IllegalArgumentException(
@@ -268,38 +288,38 @@
 
 		};
-		return new MapThreadList<TeamOfPartiesAndProfiles, PartyWithParameters, ProfileRef>(
+		return new MapThreadList<TeamOfPartiesAndProfiles, Team, ProfileList>(
 				makeparty, tuple.get1(), tuple.get2());
 	}
 
-	/**
-	 * Extract the raw URL, without the part after the question mark
-	 * 
-	 * @param party   a party reference (for another party)
-	 * @param profile a profile that may have a filter like "?partial=XX"
-	 * @return profile without the filter and with a cob party on the same
-	 *         machine. IT IS ASSUMED that there will the default
-	 *         "comparebids-1.0.0" party on the same machine as where the other
-	 *         party is
-	 */
-	protected static PartyWithProfile makeCob(PartyRef party,
-			ProfileRef profile) {
-		try {
-			URI profileuri = profile.getURI();
-			URI partyuri = party.getURI();
-			ProfileRef cobprof = new ProfileRef(profileuri.getScheme() + "://"
-					+ profileuri.getAuthority() + profileuri.getPath());
-			String partypath = partyuri.getPath();
-			partypath = partypath.substring(0, partypath.lastIndexOf('/'));
-			PartyWithParameters cobparty = new PartyWithParameters(new PartyRef(
-					partyuri.getScheme() + "://" + partyuri.getAuthority()
-							+ partypath + "/" + COB_PARTY),
-					new Parameters());
-			return new PartyWithProfile(cobparty, cobprof);
-
-		} catch (URISyntaxException e) {
-			throw new IllegalArgumentException(
-					"Failed making cob party with profile " + profile, e);
-		}
-	}
+//	/**
+//	 * Extract the raw URL, without the part after the question mark
+//	 * 
+//	 * @param party   a party reference (for another party)
+//	 * @param profile a profile that may have a filter like "?partial=XX"
+//	 * @return profile without the filter and with a cob party on the same
+//	 *         machine. IT IS ASSUMED that there will the default
+//	 *         "comparebids-1.0.0" party on the same machine as where the other
+//	 *         party is
+//	 */
+//	protected static PartyWithProfile makeCob(PartyRef party,
+//			ProfileRef profile) {
+//		try {
+//			URI profileuri = profile.getURI();
+//			URI partyuri = party.getURI();
+//			ProfileRef cobprof = new ProfileRef(profileuri.getScheme() + "://"
+//					+ profileuri.getAuthority() + profileuri.getPath());
+//			String partypath = partyuri.getPath();
+//			partypath = partypath.substring(0, partypath.lastIndexOf('/'));
+//			PartyWithParameters cobparty = new PartyWithParameters(new PartyRef(
+//					partyuri.getScheme() + "://" + partyuri.getAuthority()
+//							+ partypath + "/" + COB_PARTY),
+//					new Parameters());
+//			return new PartyWithProfile(cobparty, cobprof);
+//
+//		} catch (URISyntaxException e) {
+//			throw new IllegalArgumentException(
+//					"Failed making cob party with profile " + profile, e);
+//		}
+//	}
 
 }
Index: /protocol/src/main/java/geniusweb/protocol/tournament/allpermutations/ProfileList.java
===================================================================
--- /protocol/src/main/java/geniusweb/protocol/tournament/allpermutations/ProfileList.java	(revision 14)
+++ /protocol/src/main/java/geniusweb/protocol/tournament/allpermutations/ProfileList.java	(revision 14)
@@ -0,0 +1,68 @@
+package geniusweb.protocol.tournament.allpermutations;
+
+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: /protocol/src/main/java/geniusweb/protocol/tournament/allpermutations/Team.java
===================================================================
--- /protocol/src/main/java/geniusweb/protocol/tournament/allpermutations/Team.java	(revision 14)
+++ /protocol/src/main/java/geniusweb/protocol/tournament/allpermutations/Team.java	(revision 14)
@@ -0,0 +1,74 @@
+package geniusweb.protocol.tournament.allpermutations;
+
+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/test/java/geniusweb/protocol/tournament/allpermutations/AllPermutationsSettingsTest.java
===================================================================
--- /protocol/src/test/java/geniusweb/protocol/tournament/allpermutations/AllPermutationsSettingsTest.java	(revision 13)
+++ /protocol/src/test/java/geniusweb/protocol/tournament/allpermutations/AllPermutationsSettingsTest.java	(revision 14)
@@ -23,5 +23,4 @@
 import geniusweb.references.PartyRef;
 import geniusweb.references.PartyWithParameters;
-import geniusweb.references.PartyWithProfile;
 import geniusweb.references.ProfileRef;
 import tudelft.utilities.junit.GeneralTests;
@@ -33,13 +32,14 @@
 	private final ObjectMapper jackson = new ObjectMapper();
 
-	private final String serialized = "{\"AllPermutationsSettings\":{\"parties\":[{\"partyref\":\"party1\",\"parameters\":{}},{\"partyref\":\"party2\",\"parameters\":{}}],\"reuseParties\":false,\"profiles\":[\"profile1\",\"profile2\",\"profile3\"],\"partiesPerSession\":2,\"sessionsettings\":{\"SAOPSettings\":{\"participants\":[],\"deadline\":{\"deadlinetime\":{\"durationms\":10000}}}}}}";
+	private final String serialized = "{\"AllPermutationsSettings\":{\"teams\":[{\"Team\":[{\"partyref\":\"party1\",\"parameters\":{}}]},{\"Team\":[{\"partyref\":\"party2\",\"parameters\":{}}]}],\"profileslists\":[{\"ProfileList\":[\"profile1\"]},{\"ProfileList\":[\"profile2\"]},{\"ProfileList\":[\"profile3\"]}],\"reuseTeams\":false,\"teamsPerSession\":2,\"sessionsettings\":{\"SAOPSettings\":{\"participants\":[],\"deadline\":{\"deadlinetime\":{\"durationms\":10000}}}}}}";
 	private AllPermutationsSettings settings, settings1a, settings2, settings3,
 			settings4;
 
+	// use directly because there is some hard coding currently.
 	private SAOPSettings saopsettings;
 
 	private ProfileRef profile1, profile2, profile3;
-
-	private List<PartyWithParameters> parties;
+	private ProfileList profiles1, profiles2, profiles3;
+	private List<Team> parties;
 
 	@Before
@@ -53,10 +53,10 @@
 		Parameters params3 = new Parameters();
 
-		PartyWithParameters partywithparams1 = new PartyWithParameters(
-				partyref1, params1);
-		PartyWithParameters partywithparams2 = new PartyWithParameters(
-				partyref2, params2);
-		PartyWithParameters partywithparams3 = new PartyWithParameters(
-				partyref3, params3);
+		Team partywithparams1 = new Team(
+				Arrays.asList(new PartyWithParameters(partyref1, params1)));
+		Team partywithparams2 = new Team(
+				Arrays.asList(new PartyWithParameters(partyref2, params2)));
+		Team partywithparams3 = new Team(
+				Arrays.asList(new PartyWithParameters(partyref3, params3)));
 
 		parties = Arrays.asList(partywithparams1, partywithparams2);
@@ -68,23 +68,27 @@
 		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,
+		ProfileList profiles1 = new ProfileList(Arrays.asList(profile1));
+		ProfileList profiles2 = new ProfileList(Arrays.asList(profile2));
+		ProfileList profiles3 = new ProfileList(Arrays.asList(profile3));
+
+		List<ProfileList> profiles = Arrays.asList(profiles1, profiles2,
+				profiles3);
+
+		settings = new AllPermutationsSettings(parties, profiles, false, 2,
+				saopsettings);
+
+		settings1a = new AllPermutationsSettings(parties, profiles, false, 2,
 				saopsettings);
 
 		settings2 = new AllPermutationsSettings(Arrays.asList(partywithparams1,
-				partywithparams2, partywithparams3), 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);
+				partywithparams2, partywithparams3), profiles, false, 2,
+				saopsettings);
+
+		settings3 = new AllPermutationsSettings(parties, profiles, true, 2,
+				saopsettings);
+
+		settings4 = new AllPermutationsSettings(parties,
+				Arrays.asList(profiles1, profiles2, profiles3, profiles1),
+				false, 2, saopsettings);
 
 	}
@@ -131,7 +135,7 @@
 	@Test(expected = IllegalArgumentException.class)
 	public void testNullParties() {
-		new AllPermutationsSettings(null, true,
-				Arrays.asList(profile1, profile2, profile3, profile1), 2,
-				saopsettings);
+		new AllPermutationsSettings(null,
+				Arrays.asList(profiles1, profiles2, profiles3, profiles1), true,
+				2, saopsettings);
 
 	}
@@ -139,7 +143,7 @@
 	@Test(expected = IllegalArgumentException.class)
 	public void testNoParties() {
-		new AllPermutationsSettings(Collections.emptyList(), true,
-				Arrays.asList(profile1, profile2, profile3, profile1), 2,
-				saopsettings);
+		new AllPermutationsSettings(Collections.emptyList(),
+				Arrays.asList(profiles1, profiles2, profiles3, profiles1), true,
+				2, saopsettings);
 
 	}
@@ -147,5 +151,5 @@
 	@Test(expected = IllegalArgumentException.class)
 	public void testNullProfiles() {
-		new AllPermutationsSettings(parties, true, null, 2, saopsettings);
+		new AllPermutationsSettings(parties, null, true, 2, saopsettings);
 
 	}
@@ -153,7 +157,7 @@
 	@Test(expected = IllegalArgumentException.class)
 	public void testInsufficientProfiles() {
-		new AllPermutationsSettings(parties, true,
-				Arrays.asList(profile1, profile2, profile3, profile1), 4,
-				saopsettings);
+		new AllPermutationsSettings(parties,
+				Arrays.asList(profiles1, profiles2, profiles3, profiles1), true,
+				4, saopsettings);
 
 	}
@@ -161,6 +165,7 @@
 	@Test(expected = IllegalArgumentException.class)
 	public void testNullSessionSettings() {
-		new AllPermutationsSettings(parties, true,
-				Arrays.asList(profile1, profile2, profile3, profile1), 4, null);
+		new AllPermutationsSettings(parties,
+				Arrays.asList(profiles1, profiles2, profiles3, profiles1), true,
+				4, null);
 
 	}
@@ -168,7 +173,7 @@
 	@Test(expected = IllegalArgumentException.class)
 	public void testOnePartyPerSession() {
-		new AllPermutationsSettings(parties, true,
-				Arrays.asList(profile1, profile2, profile3, profile1), 1,
-				saopsettings);
+		new AllPermutationsSettings(parties,
+				Arrays.asList(profiles1, profiles2, profiles3, profiles1), true,
+				1, saopsettings);
 
 	}
@@ -180,18 +185,18 @@
 	}
 
-	@Test
-	public void makeCobTest() throws URISyntaxException {
-		// Check that the cob party gets profile without the query part
-		String profilebase = "ws://1.2.3.4:8080/profilesserver-a.b.c/websocket/get/someprofile";
-		String partybase = "http://131.180.202.213:8080/partiesserver/run/";
-		String query = "?a=2&partial=4";
-		PartyWithProfile partyprofile = AllPermutationsSettings.makeCob(
-				new PartyRef(partybase + AllPermutationsSettings.COB_PARTY),
-				new ProfileRef(profilebase + query));
-		assertEquals(profilebase,
-				partyprofile.getProfile().getURI().toString());
-		assertEquals(partybase + AllPermutationsSettings.COB_PARTY,
-				partyprofile.getParty().getPartyRef().getURI().toString());
-	}
+//	@Test
+//	public void makeCobTest() throws URISyntaxException {
+//		// Check that the cob party gets profile without the query part
+//		String profilebase = "ws://1.2.3.4:8080/profilesserver-a.b.c/websocket/get/someprofile";
+//		String partybase = "http://131.180.202.213:8080/partiesserver/run/";
+//		String query = "?a=2&partial=4";
+//		PartyWithProfile partyprofile = AllPermutationsSettings.makeCob(
+//				new PartyRef(partybase + AllPermutationsSettings.COB_PARTY),
+//				new ProfileRef(profilebase + query));
+//		assertEquals(profilebase,
+//				partyprofile.getProfile().getURI().toString());
+//		assertEquals(partybase + AllPermutationsSettings.COB_PARTY,
+//				partyprofile.getParty().getPartyRef().getURI().toString());
+//	}
 
 }
Index: /pythonadapter/pom.xml
===================================================================
--- /pythonadapter/pom.xml	(revision 13)
+++ /pythonadapter/pom.xml	(revision 14)
@@ -6,5 +6,5 @@
 	<groupId>geniusweb</groupId>
 	<artifactId>pythonadapter</artifactId>
-	<version>1.3.1</version>
+	<version>1.4.0</version>
 	<packaging>jar</packaging>
 
@@ -31,5 +31,5 @@
 			<groupId>geniusweb</groupId>
 			<artifactId>party</artifactId>
-			<version>1.3.1</version>
+			<version>1.4.0</version>
 		</dependency>
 
Index: /references/pom.xml
===================================================================
--- /references/pom.xml	(revision 13)
+++ /references/pom.xml	(revision 14)
@@ -6,5 +6,5 @@
 	<groupId>geniusweb</groupId>
 	<artifactId>references</artifactId>
-	<version>1.3.1</version>
+	<version>1.4.0</version>
 	<packaging>jar</packaging>
 
Index: /simplerunner/pom.xml
===================================================================
--- /simplerunner/pom.xml	(revision 13)
+++ /simplerunner/pom.xml	(revision 14)
@@ -6,5 +6,5 @@
 	<groupId>geniusweb</groupId>
 	<artifactId>simplerunner</artifactId>
-	<version>1.3.1</version>
+	<version>1.4.0</version>
 	<packaging>jar</packaging>
 
@@ -31,15 +31,15 @@
 			<groupId>geniusweb</groupId>
 			<artifactId>protocol</artifactId>
-			<version>1.3.1</version>
+			<version>1.4.0</version>
 		</dependency>
 		<dependency>
 			<groupId>geniusweb</groupId>
 			<artifactId>party</artifactId>
-			<version>1.3.1</version>
+			<version>1.4.0</version>
 		</dependency>
 		<dependency>
 			<groupId>geniusweb.exampleparties</groupId>
 			<artifactId>randomparty</artifactId>
-			<version>1.3.1</version>
+			<version>1.4.0</version>
 			<scope>test</scope>
 		</dependency>
@@ -47,5 +47,5 @@
 			<groupId>geniusweb.exampleparties</groupId>
 			<artifactId>comparebids</artifactId>
-			<version>1.3.1</version>
+			<version>1.4.0</version>
 			<scope>test</scope>
 		</dependency>
@@ -53,5 +53,5 @@
 			<groupId>geniusweb.exampleparties</groupId>
 			<artifactId>simpleshaop</artifactId>
-			<version>1.3.1</version>
+			<version>1.4.0</version>
 			<scope>test</scope>
 		</dependency>
Index: /simplerunner/src/test/resources/shaoptoursettings.json
===================================================================
--- /simplerunner/src/test/resources/shaoptoursettings.json	(revision 13)
+++ /simplerunner/src/test/resources/shaoptoursettings.json	(revision 14)
@@ -1,22 +1,51 @@
 {
 	"AllPermutationsSettings": {
-		"parties": [
+		"teams": [
 			{
-				"partyref": "classpath:geniusweb.exampleparties.simpleshaop.ShaopParty",
-				"parameters": {
-				}
+				"Team": [
+					{
+						"partyref": "classpath:geniusweb.exampleparties.simpleshaop.ShaopParty",
+						"parameters": {
+						}
+					},{
+						"partyref": "classpath:geniusweb.exampleparties.comparebids.CompareBids",
+						"parameters": {
+						}
+					}
+					
+				]
 			},
 			{
-				"partyref": "classpath:geniusweb.exampleparties.randomparty.RandomParty",
-				"parameters": {
-				}
+				"Team": [
+					{
+						"partyref": "classpath:geniusweb.exampleparties.randomparty.RandomParty",
+						"parameters": {
+						}
+					},{
+						"partyref": "classpath:geniusweb.exampleparties.comparebids.CompareBids",
+						"parameters": {
+						}
+					}
+				]
 			}
 		],
-		"reuseParties": false,
-		"profiles": [
-			"file:src/test/resources/jobs/jobs1partial.json?partial=10",
-			"file:src/test/resources/jobs/jobs2.json?partial=15"
+		"reuseTeams": false,
+		"profileslists": [
+			{
+				"ProfileList": [
+					"file:src/test/resources/jobs/jobs1partial.json?partial=10",
+					"file:src/test/resources/jobs/jobs1partial.json"
+					
+				]
+			},
+			{
+				"ProfileList": [
+					"file:src/test/resources/jobs/jobs2.json?partial=15",
+					"file:src/test/resources/jobs/jobs2.json"
+					
+				]
+			}
 		],
-		"partiesPerSession": 2,
+		"teamsPerSession": 2,
 		"sessionsettings": {
 			"SHAOPSettings": {
Index: /timeline/pom.xml
===================================================================
--- /timeline/pom.xml	(revision 13)
+++ /timeline/pom.xml	(revision 14)
@@ -6,5 +6,5 @@
 	<groupId>geniusweb</groupId>
 	<artifactId>timeline</artifactId>
-	<version>1.3.1</version>
+	<version>1.4.0</version>
 	<packaging>jar</packaging>
 
