Index: opponentmodel/bin/pom.xml
===================================================================
--- opponentmodel/bin/pom.xml	(revision 20)
+++ opponentmodel/bin/pom.xml	(revision 20)
@@ -0,0 +1,268 @@
+<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.3</version> <!-- must equal ${geniusweb.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>
+		<geniusweb.version>1.4.3</geniusweb.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>${geniusweb.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>geniusweb</groupId>
+			<artifactId>profile</artifactId>
+			<version>${geniusweb.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>geniusweb</groupId>
+			<artifactId>references</artifactId>
+			<version>${geniusweb.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>geniusweb</groupId>
+			<artifactId>events</artifactId>
+			<version>${geniusweb.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>geniusweb</groupId>
+			<artifactId>timeline</artifactId>
+			<version>${geniusweb.version}</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/pom.xml
===================================================================
--- opponentmodel/pom.xml	(revision 19)
+++ opponentmodel/pom.xml	(revision 20)
@@ -6,5 +6,5 @@
 	<groupId>geniusweb</groupId>
 	<artifactId>opponentmodel</artifactId>
-	<version>1.4.2</version> <!-- must equal ${geniusweb.version} -->
+	<version>1.4.4</version> <!-- must equal ${geniusweb.version} -->
 	<packaging>jar</packaging>
 
@@ -17,5 +17,5 @@
 		<passwd>${env.ARTIFACTORY_PASS}</passwd>
 		<jackson-2-version>2.9.10</jackson-2-version>
-		<geniusweb.version>1.4.2</geniusweb.version>
+		<geniusweb.version>1.4.4</geniusweb.version>
 	</properties>
 
Index: opponentmodel/src/main/java/geniusweb/opponentmodel/FrequencyOpponentModel.java
===================================================================
--- opponentmodel/src/main/java/geniusweb/opponentmodel/FrequencyOpponentModel.java	(revision 19)
+++ opponentmodel/src/main/java/geniusweb/opponentmodel/FrequencyOpponentModel.java	(revision 20)
@@ -24,21 +24,26 @@
  * (as you might expect as {@link NumberValueSetUtilities} is only affected by
  * the endpoints).
- *
+ * <p>
+ * immutable.
  */
 public class FrequencyOpponentModel implements UtilitySpace, OpponentModel {
 
 	private static final int DECIMALS = 4; // accuracy of our computations.
+	private static int serial = 1; // counter for auto name generation
+
 	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) {
-		/*
-		 * simply reset the whole model and make a new one... maybe this can be
-		 * done smarter for minor changes? map with empth hashmap for each
-		 * issue.
-		 */
-		this(domain,
+
+	public FrequencyOpponentModel() {
+		this.domain = null;
+		this.bidFrequencies = null;
+		this.totalBids = BigDecimal.ZERO;
+	}
+
+	@Override
+	public FrequencyOpponentModel with(Domain domain, Bid resBid) {
+		// FIXME merge already available frequencies?
+		return new FrequencyOpponentModel(domain,
 				domain.getIssues().stream().collect(
 						Collectors.toMap(iss -> iss, iss -> new HashMap<>())),
@@ -115,10 +120,4 @@
 	}
 
-	/**
-	 * {@inheritDoc}
-	 * 
-	 * <h1>change info</h1> This replaces update(Bid). Now you pass the entire
-	 * action and the progress instead of just the bid.
-	 */
 	@Override
 	public FrequencyOpponentModel with(Action action, Progress progress) {
@@ -127,17 +126,15 @@
 
 		Bid bid = ((Offer) action).getBid();
-		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;
+			if (value != null) {
+				Integer oldfreq = freqs.get(value);
+				if (oldfreq == null) {
+					oldfreq = 0;
+				}
+				freqs.put(value, oldfreq + 1);
 			}
-			freqs.put(value, oldfreq + 1);
 		}
 
Index: opponentmodel/src/main/java/geniusweb/opponentmodel/OpponentModel.java
===================================================================
--- opponentmodel/src/main/java/geniusweb/opponentmodel/OpponentModel.java	(revision 19)
+++ opponentmodel/src/main/java/geniusweb/opponentmodel/OpponentModel.java	(revision 20)
@@ -2,4 +2,5 @@
 
 import geniusweb.actions.Action;
+import geniusweb.issuevalue.Bid;
 import geniusweb.issuevalue.Domain;
 import geniusweb.profile.Profile;
@@ -13,6 +14,24 @@
  * Domain as argument. unfortunately this can not be enforced in a java
  * interface
+ * 
+ * <p>
+ * <em>MUST</em> have an empty constructor as these are also used as part of the
+ * BOA framework.
+ * 
  */
 public interface OpponentModel extends Profile {
+
+	/**
+	 * Initializes the model. This function must be called first after
+	 * constructing an instance. It can also be called later, if there is a
+	 * change in the domain or resBid.
+	 * 
+	 * @param domain the domain to work with
+	 * @param resBid the reservation bid, or null if no reservationbid is
+	 *               available.
+	 * @return OpponentModel that uses given domain and reservationbid.
+	 * 
+	 */
+	OpponentModel with(Domain domain, Bid resBid);
 
 	/**
Index: opponentmodel/src/test/java/geniusweb/profile/opponentmodel/FrequencyOppModelTest.java
===================================================================
--- opponentmodel/src/test/java/geniusweb/profile/opponentmodel/FrequencyOppModelTest.java	(revision 19)
+++ opponentmodel/src/test/java/geniusweb/profile/opponentmodel/FrequencyOppModelTest.java	(revision 20)
@@ -87,8 +87,8 @@
 		bid3 = new Bid(issuevalues);
 
-		oppModel1 = new FrequencyOpponentModel(domain);
-		oppModel1b = new FrequencyOpponentModel(domain);
-		oppModel2 = new FrequencyOpponentModel(domain2);
-		oppModel3 = new FrequencyOpponentModel(domain3);
+		oppModel1 = new FrequencyOpponentModel().with(domain, null);
+		oppModel1b = new FrequencyOpponentModel().with(domain, null);
+		oppModel2 = new FrequencyOpponentModel().with(domain2, null);
+		oppModel3 = new FrequencyOpponentModel().with(domain3, null);
 		oppModel4 = oppModel3.with(new Offer(other, bid1), progress);
 
@@ -113,15 +113,16 @@
 	@Test(expected = NullPointerException.class)
 	public void smokeTestNull() {
-		new FrequencyOpponentModel(null);
+		new FrequencyOpponentModel().with((Domain) null, null);
 	}
 
 	@Test
 	public void smokeTest() {
-		new FrequencyOpponentModel(domain);
+		new FrequencyOpponentModel().with(domain, null);
 	}
 
 	@Test
 	public void testEmptyModel() {
-		FrequencyOpponentModel oppModel = new FrequencyOpponentModel(domain);
+		FrequencyOpponentModel oppModel = new FrequencyOpponentModel()
+				.with(domain, null);
 		assertEquals(BigDecimal.ONE, oppModel.getUtility(bid1));
 		assertEquals(BigDecimal.ONE, oppModel.getUtility(bid2));
@@ -153,3 +154,11 @@
 	}
 
+	@Test
+	public void testPartialBidUpdate() {
+		FrequencyOpponentModel oppModel = oppModel1.with(new Offer(other, bid1),
+				progress);
+		Bid partialbid = new Bid(ISS1, I1V1);
+		oppModel.with(new Offer(other, partialbid), progress);
+	}
+
 }
